@unbrained/pm-cli 2026.9.7 → 2026.9.9
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 +7 -2
- package/.agents/skills/pm-user/references/ECOSYSTEM_PLANNING.md +95 -0
- package/.claude-plugin/marketplace.json +2 -2
- package/CHANGELOG.md +231 -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.d.ts +0 -5
- 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-NPN5I67J.js → chunk-3IPRM75M.js} +3 -3
- package/dist/cli-bundle/chunks/chunk-4VL5P22L.js +2 -0
- package/dist/cli-bundle/chunks/chunk-AAFBV3U3.js +29 -0
- package/dist/cli-bundle/chunks/chunk-D3YVILJJ.js +20 -0
- package/dist/cli-bundle/chunks/{chunk-WYRZZ5ZE.js → chunk-DEZPZOQ7.js} +2 -2
- package/dist/cli-bundle/chunks/chunk-ECBLPN7B.js +3 -0
- package/dist/cli-bundle/chunks/chunk-J6ERHBV2.js +235 -0
- package/dist/cli-bundle/chunks/chunk-JUNJ5EKI.js +2 -0
- package/dist/cli-bundle/chunks/chunk-L5RCDKQ2.js +2 -0
- package/dist/cli-bundle/chunks/chunk-NSAPNEYH.js +2 -0
- package/dist/cli-bundle/chunks/chunk-OHNLSGGV.js +79 -0
- package/dist/cli-bundle/chunks/chunk-WQKMSFBV.js +5 -0
- package/dist/cli-bundle/chunks/{chunk-BAX2BYUW.js → chunk-XZ6T7YPP.js} +256 -150
- package/dist/cli-bundle/chunks/{chunk-JT6XF6GE.js → chunk-Z3XVXUVF.js} +4 -4
- package/dist/cli-bundle/chunks/register-list-query-UIHRCS6D.js +11 -0
- package/dist/cli-bundle/chunks/register-mutation-WHWMGRVX.js +20 -0
- package/dist/cli-bundle/chunks/register-operations-64YZYTC5.js +2 -0
- package/dist/cli-bundle/chunks/register-setup-PERI45EM.js +2 -0
- package/dist/cli-bundle/focused-chunks/chunk-2W4XIYOB.js +2 -0
- package/dist/cli-bundle/focused-chunks/chunk-2WSBXIGF.js +12 -0
- package/dist/cli-bundle/focused-chunks/chunk-5FHTCOHS.js +3 -0
- package/dist/cli-bundle/focused-chunks/chunk-7N6DOREF.js +26 -0
- package/dist/cli-bundle/focused-chunks/{chunk-3BZEOXLT.js → chunk-7PC4R5QB.js} +2 -2
- package/dist/cli-bundle/focused-chunks/chunk-BUCJUZVG.js +6 -0
- package/dist/cli-bundle/focused-chunks/chunk-FE3BABLJ.js +2 -0
- package/dist/cli-bundle/focused-chunks/chunk-IWITF53W.js +2 -0
- package/dist/cli-bundle/focused-chunks/chunk-OQUGRHKV.js +10 -0
- package/dist/cli-bundle/focused-chunks/{chunk-M6PBRFSH.js → chunk-PNKIANFZ.js} +2 -2
- package/dist/cli-bundle/focused-chunks/{chunk-LIJIA4TY.js → chunk-QQQ4SAUO.js} +3 -3
- package/dist/cli-bundle/focused-chunks/chunk-TTYXF5YD.js +177 -0
- package/dist/cli-bundle/focused-chunks/chunk-XNR3DM6J.js +2 -0
- package/dist/cli-bundle/focused-chunks/chunk-XSS3APUF.js +9 -0
- package/dist/cli-bundle/focused-chunks/chunk-YCDQ2N23.js +8 -0
- package/dist/cli-bundle/focused-chunks/chunk-YJUXGS57.js +20 -0
- package/dist/cli-bundle/focused-chunks/chunk-ZTCE4UO6.js +58 -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 +37 -37
- 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/policy/workflow-policy-schema.d.ts +312 -0
- package/dist/core/policy/workflow-policy-schema.js +2 -0
- package/dist/core/policy/workflow-policy-store.d.ts +24 -0
- package/dist/core/policy/workflow-policy-store.js +2 -0
- package/dist/core/policy/workflow-policy.d.ts +139 -0
- package/dist/core/policy/workflow-policy.js +2 -0
- 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.d.ts +1 -0
- 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.d.ts +1 -1
- 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 +174 -839
- 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.d.ts +3 -1
- package/dist/sdk/governance/validate.js +1 -2261
- package/dist/sdk/governance/workflow-completeness.d.ts +32 -0
- package/dist/sdk/governance/workflow-completeness.js +2 -0
- package/dist/sdk/governance/workflow-policy.d.ts +47 -0
- package/dist/sdk/governance/workflow-policy.js +4 -0
- package/dist/sdk/governance/workspace-position.js +1 -163
- package/dist/sdk/governance.d.ts +2 -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 -1
- 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.d.ts +1 -1
- 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.d.ts +27 -0
- 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.d.ts +6 -4
- 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.d.ts +1 -1
- 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.d.ts +2 -1
- package/dist/sdk/runtime-public-contracts.js +1 -4
- package/dist/sdk/runtime-stats-options.js +1 -38
- package/dist/sdk/runtime.d.ts +4 -0
- 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.d.ts +2 -1
- 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.d.ts +4 -0
- package/dist/types.js +1 -245
- package/docs/AGENT_GUIDE.md +1 -1
- package/docs/COMMANDS.md +10 -0
- package/docs/CONFIGURATION.md +12 -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 +4 -0
- package/docs/READ_OUTPUT_CONTRACTS.md +5 -0
- package/docs/SCRIPTING.md +21 -0
- package/docs/TESTING.md +33 -0
- package/docs/WORKFLOW_POLICIES.md +129 -0
- package/docs/generated/FLAG_LEXICON_BUDGETS.md +7 -7
- package/docs/generated/REFUSAL_CLOSURE_CENSUS.md +11 -5
- package/marketplace.json +2 -2
- package/package.json +5 -5
- 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-CKOL5U7J.js +0 -77
- package/dist/cli-bundle/chunks/chunk-JX4DH4WC.js +0 -3
- 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-operations-I5W3KMGB.js +0 -2
- 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-PEFABF7E.js +0 -26
- 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,378 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
!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]="e04a91fa-4625-50fd-9bfd-c712126baf0d")}catch(e){}}();
|
|
3
|
-
import { RelationshipGraph, } from "../relationships.js";
|
|
4
|
-
import { isExternalDependencyReference, isExternalDependencySourceKind, } from "../dependency-provenance.js";
|
|
5
|
-
import { analyzeHierarchyIntegrity, } from "./hierarchy-integrity.js";
|
|
6
|
-
import { resolveWorkspaceRelationshipKindRegistry } from "./workspace-relationship-kind-registry.js";
|
|
7
|
-
export { resolveWorkspaceRelationshipKindRegistry } from "./workspace-relationship-kind-registry.js";
|
|
8
|
-
/** Normalize a decoded reference target and reject empty legacy placeholders. */
|
|
9
|
-
function normalizeDependencyReferenceTarget(target) {
|
|
10
|
-
if (typeof target !== "string")
|
|
11
|
-
return undefined;
|
|
12
|
-
const normalized = target.trim();
|
|
13
|
-
if (!normalized ||
|
|
14
|
-
["none", "null", "n/a", "na"].includes(normalized.toLowerCase()))
|
|
15
|
-
return undefined;
|
|
16
|
-
return normalized;
|
|
17
|
-
}
|
|
18
|
-
/** Normalize a graph target while removing the historical no-blocker marker. */
|
|
19
|
-
export function normalizeDependencyGraphTarget(target) {
|
|
20
|
-
const normalized = normalizeDependencyReferenceTarget(target);
|
|
21
|
-
return normalized?.toLowerCase() === "no-active-blocker"
|
|
22
|
-
? undefined
|
|
23
|
-
: normalized;
|
|
24
|
-
}
|
|
25
|
-
/** Return whether edge provenance assigns a normalized target to the external graph namespace. */
|
|
26
|
-
function isExternalGraphReference(target, sourceKind, externalAllowed = true) {
|
|
27
|
-
const normalized = normalizeDependencyReferenceTarget(target);
|
|
28
|
-
return (externalAllowed &&
|
|
29
|
-
(isExternalDependencySourceKind(sourceKind) ||
|
|
30
|
-
(normalized !== undefined && isExternalDependencyReference(normalized))));
|
|
31
|
-
}
|
|
32
|
-
/** Build a namespace-aware reference identity: local ids are case-folded while external locators retain case. */
|
|
33
|
-
function dependencyReferenceIdentityKey(target, sourceKind) {
|
|
34
|
-
return isExternalGraphReference(target, sourceKind)
|
|
35
|
-
? `external\u0000${target}`
|
|
36
|
-
: `local\u0000${target.toLowerCase()}`;
|
|
37
|
-
}
|
|
38
|
-
/** Resolve one normalized edge target through the namespace selected by its provenance. */
|
|
39
|
-
function resolveGraphReferenceTarget(target, sourceKind, canonicalIds, externalGraphIds) {
|
|
40
|
-
return isExternalGraphReference(target, sourceKind)
|
|
41
|
-
? externalGraphIds.get(target)
|
|
42
|
-
: canonicalIds.get(target.toLowerCase());
|
|
43
|
-
}
|
|
44
|
-
/** Compare text case-insensitively with an exact-spelling deterministic tie-breaker. */
|
|
45
|
-
function compareCaseFoldedText(left, right) {
|
|
46
|
-
const normalizedLeft = left.toLowerCase();
|
|
47
|
-
const normalizedRight = right.toLowerCase();
|
|
48
|
-
if (normalizedLeft !== normalizedRight)
|
|
49
|
-
return normalizedLeft < normalizedRight ? -1 : 1;
|
|
50
|
-
if (left !== right)
|
|
51
|
-
return left < right ? -1 : 1;
|
|
52
|
-
return 0;
|
|
53
|
-
}
|
|
54
|
-
/** Count one holder's dependency rows by their case-insensitive kind-plus-target identity. */
|
|
55
|
-
function countDependencyRowIdentities(item) {
|
|
56
|
-
const occurrences = new Map();
|
|
57
|
-
for (const dependency of item.dependencies ?? []) {
|
|
58
|
-
if (typeof dependency !== "object" || dependency === null)
|
|
59
|
-
continue;
|
|
60
|
-
const legacyDependency = dependency;
|
|
61
|
-
const target = normalizeDependencyReferenceTarget(legacyDependency.id);
|
|
62
|
-
if (!target)
|
|
63
|
-
continue;
|
|
64
|
-
const kind = typeof legacyDependency.kind === "string"
|
|
65
|
-
? legacyDependency.kind
|
|
66
|
-
: "related";
|
|
67
|
-
const key = `${kind}\u0000${dependencyReferenceIdentityKey(target, legacyDependency.source_kind)}`;
|
|
68
|
-
const existing = occurrences.get(key);
|
|
69
|
-
if (existing)
|
|
70
|
-
existing.count += 1;
|
|
71
|
-
else
|
|
72
|
-
occurrences.set(key, { target_id: target, kind, count: 1 });
|
|
73
|
-
}
|
|
74
|
-
return occurrences;
|
|
75
|
-
}
|
|
76
|
-
/**
|
|
77
|
-
* Collect raw stored dependency rows whose exact identity — holder, kind, and
|
|
78
|
-
* case-insensitive target — appears more than once on one item. Graph
|
|
79
|
-
* construction deduplicates these by edge identity, so the assembled graph and
|
|
80
|
-
* every projection built on it cannot see them; this pre-assembly scan is the
|
|
81
|
-
* only surface that reports the storage-layer defect.
|
|
82
|
-
*/
|
|
83
|
-
export function collectDuplicateDependencyRows(items, isTerminal = (status) => status === "closed" || status === "canceled") {
|
|
84
|
-
const rows = [];
|
|
85
|
-
for (const item of items) {
|
|
86
|
-
if (typeof item?.id !== "string" || item.id.trim().length === 0)
|
|
87
|
-
continue;
|
|
88
|
-
for (const entry of countDependencyRowIdentities(item).values()) {
|
|
89
|
-
if (entry.count < 2)
|
|
90
|
-
continue;
|
|
91
|
-
rows.push({
|
|
92
|
-
holder_id: item.id.trim(),
|
|
93
|
-
target_id: entry.target_id,
|
|
94
|
-
kind: entry.kind,
|
|
95
|
-
occurrences: entry.count,
|
|
96
|
-
holder_status: item.status,
|
|
97
|
-
legacy_terminal: isTerminal(item.status),
|
|
98
|
-
});
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
return rows.sort((left, right) => {
|
|
102
|
-
const holderCompare = compareCaseFoldedText(left.holder_id, right.holder_id);
|
|
103
|
-
if (holderCompare !== 0)
|
|
104
|
-
return holderCompare;
|
|
105
|
-
const targetCompare = compareCaseFoldedText(left.target_id, right.target_id);
|
|
106
|
-
if (targetCompare !== 0)
|
|
107
|
-
return targetCompare;
|
|
108
|
-
return compareCaseFoldedText(left.kind, right.kind);
|
|
109
|
-
});
|
|
110
|
-
}
|
|
111
|
-
/** Decode one dependency row only when it contradicts the holder's scalar blocker. */
|
|
112
|
-
function decodeOrderingStorageContradiction(item, blocker, dependency, isTerminal, registry) {
|
|
113
|
-
if (typeof dependency !== "object" || dependency === null)
|
|
114
|
-
return undefined;
|
|
115
|
-
const target = normalizeDependencyReferenceTarget(dependency.id);
|
|
116
|
-
if (!target ||
|
|
117
|
-
dependencyReferenceIdentityKey(target, dependency.source_kind) !==
|
|
118
|
-
dependencyReferenceIdentityKey(blocker))
|
|
119
|
-
return undefined;
|
|
120
|
-
const definition = registry.resolve(typeof dependency.kind === "string" ? dependency.kind : "related");
|
|
121
|
-
if (definition?.ordering !== true ||
|
|
122
|
-
(definition.precedence ?? "source_before_target") !== "source_before_target")
|
|
123
|
-
return undefined;
|
|
124
|
-
return {
|
|
125
|
-
holder_id: item.id.trim(),
|
|
126
|
-
target_id: target,
|
|
127
|
-
dependency_kind: definition.kind,
|
|
128
|
-
holder_status: item.status,
|
|
129
|
-
legacy_terminal: isTerminal(item.status),
|
|
130
|
-
};
|
|
131
|
-
}
|
|
132
|
-
/**
|
|
133
|
-
* Collect storage rows where `blocked_by: target` places the target before the
|
|
134
|
-
* holder while a same-target structured ordering dependency places the holder
|
|
135
|
-
* before the target. The contradictory rows form an artificial two-node cycle
|
|
136
|
-
* after graph assembly, so this pre-assembly evidence identifies the exact row
|
|
137
|
-
* to remove instead of reporting only strongly connected component members.
|
|
138
|
-
*/
|
|
139
|
-
export function collectOrderingStorageContradictions(items, isTerminal = (status) => status === "closed" || status === "canceled", registry = resolveWorkspaceRelationshipKindRegistry()) {
|
|
140
|
-
const contradictions = new Map();
|
|
141
|
-
for (const item of items) {
|
|
142
|
-
if (typeof item?.id !== "string" || item.id.trim().length === 0)
|
|
143
|
-
continue;
|
|
144
|
-
const blocker = normalizeDependencyReferenceTarget(item.blocked_by);
|
|
145
|
-
if (!blocker)
|
|
146
|
-
continue;
|
|
147
|
-
for (const dependency of item.dependencies ?? []) {
|
|
148
|
-
const row = decodeOrderingStorageContradiction(item, blocker, dependency, isTerminal, registry);
|
|
149
|
-
if (!row)
|
|
150
|
-
continue;
|
|
151
|
-
contradictions.set(`${row.holder_id.toLowerCase()}\u0000${row.target_id.toLowerCase()}\u0000${row.dependency_kind}`, row);
|
|
152
|
-
}
|
|
153
|
-
}
|
|
154
|
-
return [...contradictions.values()].sort((left, right) => {
|
|
155
|
-
const holderCompare = compareCaseFoldedText(left.holder_id, right.holder_id);
|
|
156
|
-
if (holderCompare !== 0)
|
|
157
|
-
return holderCompare;
|
|
158
|
-
const targetCompare = compareCaseFoldedText(left.target_id, right.target_id);
|
|
159
|
-
if (targetCompare !== 0)
|
|
160
|
-
return targetCompare;
|
|
161
|
-
return compareCaseFoldedText(left.dependency_kind, right.dependency_kind);
|
|
162
|
-
});
|
|
163
|
-
}
|
|
164
|
-
/**
|
|
165
|
-
* Classify missing hierarchy and dependency targets without mutating their holders.
|
|
166
|
-
*
|
|
167
|
-
* Consumers provide the workspace's terminal-status predicate so custom lifecycle
|
|
168
|
-
* schemas receive the same active-versus-historical behavior as the built-in
|
|
169
|
-
* closed/canceled statuses.
|
|
170
|
-
*/
|
|
171
|
-
export function collectDanglingDependencyReferences(items, isTerminal = (status) => status === "closed" || status === "canceled") {
|
|
172
|
-
const safeItems = items.filter((item) => typeof item?.id === "string" && item.id.trim().length > 0);
|
|
173
|
-
const knownIds = new Set(safeItems.map((item) => item.id.trim().toLowerCase()));
|
|
174
|
-
const rows = new Map();
|
|
175
|
-
const addReference = (item, target, kind, source, externalAllowed) => {
|
|
176
|
-
const normalized = normalizeDependencyReferenceTarget(target);
|
|
177
|
-
if (!normalized ||
|
|
178
|
-
knownIds.has(normalized.toLowerCase()) ||
|
|
179
|
-
isExternalGraphReference(normalized, undefined, externalAllowed)) {
|
|
180
|
-
return;
|
|
181
|
-
}
|
|
182
|
-
const row = {
|
|
183
|
-
holder_id: item.id.trim(),
|
|
184
|
-
target_id: normalized,
|
|
185
|
-
kind,
|
|
186
|
-
source,
|
|
187
|
-
holder_status: item.status,
|
|
188
|
-
legacy_terminal: isTerminal(item.status),
|
|
189
|
-
no_active_blocker_sentinel: normalized.toLowerCase() === "no-active-blocker",
|
|
190
|
-
};
|
|
191
|
-
rows.set(`${row.holder_id}::${row.target_id}::${row.kind}::${row.source}`, row);
|
|
192
|
-
};
|
|
193
|
-
for (const item of safeItems) {
|
|
194
|
-
addReference(item, item.parent, "parent", "parent", false);
|
|
195
|
-
addReference(item, item.blocked_by, "blocked_by", "blocked_by", true);
|
|
196
|
-
for (const dependency of item.dependencies ?? []) {
|
|
197
|
-
// Public SDK callers may supply legacy or JSON-decoded payloads that do
|
|
198
|
-
// not yet satisfy the current structured dependency contract.
|
|
199
|
-
if (typeof dependency !== "object" || dependency === null) {
|
|
200
|
-
continue;
|
|
201
|
-
}
|
|
202
|
-
const legacyDependency = dependency;
|
|
203
|
-
if (isExternalDependencySourceKind(legacyDependency.source_kind)) {
|
|
204
|
-
continue;
|
|
205
|
-
}
|
|
206
|
-
addReference(item, legacyDependency.id, typeof legacyDependency.kind === "string"
|
|
207
|
-
? legacyDependency.kind
|
|
208
|
-
: "related", "dependency", true);
|
|
209
|
-
}
|
|
210
|
-
}
|
|
211
|
-
const sorted = [...rows.values()].sort((left, right) => left.holder_id.localeCompare(right.holder_id) ||
|
|
212
|
-
left.target_id.localeCompare(right.target_id) ||
|
|
213
|
-
left.kind.localeCompare(right.kind) ||
|
|
214
|
-
left.source.localeCompare(right.source));
|
|
215
|
-
const legacyTerminal = sorted.filter((row) => row.legacy_terminal);
|
|
216
|
-
return {
|
|
217
|
-
active: sorted.filter((row) => !row.legacy_terminal),
|
|
218
|
-
legacy_terminal: legacyTerminal,
|
|
219
|
-
no_active_blocker_sentinels: sorted.filter((row) => row.no_active_blocker_sentinel),
|
|
220
|
-
};
|
|
221
|
-
}
|
|
222
|
-
/** Return unique real missing targets while excluding the legacy no-blocker sentinel. */
|
|
223
|
-
export function collectMissingDependencyTargetIds(dangling) {
|
|
224
|
-
const targets = new Map();
|
|
225
|
-
for (const reference of [...dangling.active, ...dangling.legacy_terminal]) {
|
|
226
|
-
if (reference.no_active_blocker_sentinel)
|
|
227
|
-
continue;
|
|
228
|
-
const target = reference.target_id.trim();
|
|
229
|
-
const key = target.toLowerCase();
|
|
230
|
-
if (!targets.has(key))
|
|
231
|
-
targets.set(key, target);
|
|
232
|
-
}
|
|
233
|
-
return [...targets.values()].sort((left, right) => left.localeCompare(right));
|
|
234
|
-
}
|
|
235
|
-
/** Return unique explicitly external dependency targets in deterministic order. */
|
|
236
|
-
export function collectExternalDependencyTargetIds(items) {
|
|
237
|
-
const targets = new Map();
|
|
238
|
-
for (const item of items) {
|
|
239
|
-
const scalarBlocker = normalizeDependencyGraphTarget(item.blocked_by);
|
|
240
|
-
if (scalarBlocker &&
|
|
241
|
-
isExternalGraphReference(scalarBlocker) &&
|
|
242
|
-
!targets.has(scalarBlocker)) {
|
|
243
|
-
targets.set(scalarBlocker, scalarBlocker);
|
|
244
|
-
}
|
|
245
|
-
for (const dependency of item.dependencies ?? []) {
|
|
246
|
-
if (typeof dependency !== "object" ||
|
|
247
|
-
dependency === null ||
|
|
248
|
-
!isExternalGraphReference(dependency.id, dependency.source_kind)) {
|
|
249
|
-
continue;
|
|
250
|
-
}
|
|
251
|
-
const id = normalizeDependencyGraphTarget(dependency.id);
|
|
252
|
-
if (id && !targets.has(id)) {
|
|
253
|
-
targets.set(id, id);
|
|
254
|
-
}
|
|
255
|
-
}
|
|
256
|
-
}
|
|
257
|
-
return [...targets.values()].sort((left, right) => left.localeCompare(right));
|
|
258
|
-
}
|
|
259
|
-
const hierarchyIntegrityByAssembly = new WeakMap();
|
|
260
|
-
/** Read the hierarchy analysis paired with an assembly created by this module. */
|
|
261
|
-
export function getWorkspaceHierarchyIntegrity(assembly) {
|
|
262
|
-
return (assembly.hierarchyIntegrity ?? hierarchyIntegrityByAssembly.get(assembly));
|
|
263
|
-
}
|
|
264
|
-
/** Count raw dependency rows that use a registered compatibility alias instead of its canonical kind. */
|
|
265
|
-
export function collectLegacyDependencyAliasCounts(items, registry = resolveWorkspaceRelationshipKindRegistry()) {
|
|
266
|
-
const counts = {};
|
|
267
|
-
for (const item of items) {
|
|
268
|
-
for (const dependency of item.dependencies ?? []) {
|
|
269
|
-
if (typeof dependency !== "object" || dependency === null)
|
|
270
|
-
continue;
|
|
271
|
-
const rawKind = dependency.kind;
|
|
272
|
-
if (typeof rawKind !== "string")
|
|
273
|
-
continue;
|
|
274
|
-
const normalized = rawKind.trim().toLowerCase().replaceAll("-", "_");
|
|
275
|
-
const definition = registry.resolve(rawKind);
|
|
276
|
-
if (definition && normalized !== definition.kind) {
|
|
277
|
-
counts[normalized] = (counts[normalized] ?? 0) + 1;
|
|
278
|
-
}
|
|
279
|
-
}
|
|
280
|
-
}
|
|
281
|
-
return Object.fromEntries(Object.entries(counts).sort(([left], [right]) => left.localeCompare(right)));
|
|
282
|
-
}
|
|
283
|
-
/**
|
|
284
|
-
* Build the shared workspace relationship graph including missing placeholder
|
|
285
|
-
* nodes. One assembly serves every bounded query in an invocation — dependency
|
|
286
|
-
* trees, context packets, impact analysis, path enumeration, and governance
|
|
287
|
-
* audits — so the full-workspace normalization cost is paid once instead of
|
|
288
|
-
* once per query surface.
|
|
289
|
-
*/
|
|
290
|
-
export function assembleWorkspaceRelationshipGraph(items, isTerminal, registry) {
|
|
291
|
-
const relationshipRegistry = registry ?? resolveWorkspaceRelationshipKindRegistry();
|
|
292
|
-
const safeItems = items.filter((item) => typeof item?.id === "string" && item.id.trim().length > 0);
|
|
293
|
-
const canonicalIds = new Map(safeItems.map((item) => [item.id.trim().toLowerCase(), item.id.trim()]));
|
|
294
|
-
const dangling = collectDanglingDependencyReferences(safeItems, isTerminal);
|
|
295
|
-
const missingIds = collectMissingDependencyTargetIds(dangling);
|
|
296
|
-
for (const id of missingIds)
|
|
297
|
-
canonicalIds.set(id.toLowerCase(), id);
|
|
298
|
-
const externalIds = collectExternalDependencyTargetIds(safeItems);
|
|
299
|
-
const usedGraphIds = new Set(canonicalIds.keys());
|
|
300
|
-
const externalGraphIds = new Map();
|
|
301
|
-
for (const id of externalIds) {
|
|
302
|
-
let graphId = id;
|
|
303
|
-
while (usedGraphIds.has(graphId.toLowerCase())) {
|
|
304
|
-
graphId = `external:${graphId}`;
|
|
305
|
-
}
|
|
306
|
-
externalGraphIds.set(id, graphId);
|
|
307
|
-
usedGraphIds.add(graphId.toLowerCase());
|
|
308
|
-
}
|
|
309
|
-
const graphItems = safeItems.map((item) => {
|
|
310
|
-
const parent = normalizeDependencyGraphTarget(item.parent);
|
|
311
|
-
const blocker = normalizeDependencyGraphTarget(item.blocked_by);
|
|
312
|
-
const dependencies = (item.dependencies ?? []).flatMap((rawDependency) => {
|
|
313
|
-
if (typeof rawDependency !== "object" || rawDependency === null)
|
|
314
|
-
return [];
|
|
315
|
-
const dependency = rawDependency;
|
|
316
|
-
const target = normalizeDependencyGraphTarget(dependency.id);
|
|
317
|
-
if (!target)
|
|
318
|
-
return [];
|
|
319
|
-
const targetId = resolveGraphReferenceTarget(target, dependency.source_kind, canonicalIds, externalGraphIds);
|
|
320
|
-
return [
|
|
321
|
-
{
|
|
322
|
-
id: targetId,
|
|
323
|
-
kind: typeof dependency.kind === "string" ? dependency.kind : "related",
|
|
324
|
-
},
|
|
325
|
-
];
|
|
326
|
-
});
|
|
327
|
-
return {
|
|
328
|
-
id: item.id.trim(),
|
|
329
|
-
...(parent ? { parent: canonicalIds.get(parent.toLowerCase()) } : {}),
|
|
330
|
-
...(blocker
|
|
331
|
-
? {
|
|
332
|
-
blocked_by: resolveGraphReferenceTarget(blocker, undefined, canonicalIds, externalGraphIds),
|
|
333
|
-
}
|
|
334
|
-
: {}),
|
|
335
|
-
dependencies,
|
|
336
|
-
};
|
|
337
|
-
});
|
|
338
|
-
const hierarchyIntegrity = analyzeHierarchyIntegrity(safeItems, isTerminal, relationshipRegistry);
|
|
339
|
-
const assembly = {
|
|
340
|
-
graph: RelationshipGraph.fromItems([
|
|
341
|
-
...graphItems,
|
|
342
|
-
...missingIds.map((id) => ({ id })),
|
|
343
|
-
...externalIds.map((id) => ({
|
|
344
|
-
id: externalGraphIds.get(id),
|
|
345
|
-
})),
|
|
346
|
-
], relationshipRegistry),
|
|
347
|
-
details: [
|
|
348
|
-
...safeItems.map((item) => ({
|
|
349
|
-
id: item.id.trim(),
|
|
350
|
-
title: item.title,
|
|
351
|
-
status: item.status,
|
|
352
|
-
...(typeof item.type === "string" && item.type.trim().length > 0
|
|
353
|
-
? { type: item.type.trim() }
|
|
354
|
-
: {}),
|
|
355
|
-
})),
|
|
356
|
-
...missingIds.map((id) => ({
|
|
357
|
-
id,
|
|
358
|
-
title: `[missing] ${id}`,
|
|
359
|
-
status: "missing",
|
|
360
|
-
})),
|
|
361
|
-
...externalIds.map((id) => ({
|
|
362
|
-
id: externalGraphIds.get(id),
|
|
363
|
-
title: `[external] ${id}`,
|
|
364
|
-
status: "external",
|
|
365
|
-
})),
|
|
366
|
-
],
|
|
367
|
-
missingIdSet: new Set(missingIds.map((id) => id.toLowerCase())),
|
|
368
|
-
dangling,
|
|
369
|
-
duplicateRows: collectDuplicateDependencyRows(safeItems, isTerminal),
|
|
370
|
-
orderingContradictions: collectOrderingStorageContradictions(safeItems, isTerminal, relationshipRegistry),
|
|
371
|
-
legacyAliasCounts: collectLegacyDependencyAliasCounts(safeItems, relationshipRegistry),
|
|
372
|
-
hierarchyIntegrity,
|
|
373
|
-
};
|
|
374
|
-
hierarchyIntegrityByAssembly.set(assembly, hierarchyIntegrity);
|
|
375
|
-
return assembly;
|
|
376
|
-
}
|
|
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]="06ecc7a4-c593-5d99-89f5-714a4590d0a5")}catch(e2){}})();import{RelationshipGraph}from"../relationships.js";import{isExternalDependencyReference,isExternalDependencySourceKind}from"../dependency-provenance.js";import{analyzeHierarchyIntegrity}from"./hierarchy-integrity.js";import{resolveWorkspaceRelationshipKindRegistry}from"./workspace-relationship-kind-registry.js";import{resolveWorkspaceRelationshipKindRegistry as resolveWorkspaceRelationshipKindRegistry2}from"./workspace-relationship-kind-registry.js";function normalizeDependencyReferenceTarget(target){if(typeof target!=="string")return void 0;const normalized=target.trim();if(!normalized||["none","null","n/a","na"].includes(normalized.toLowerCase()))return void 0;return normalized}function normalizeDependencyGraphTarget(target){const normalized=normalizeDependencyReferenceTarget(target);return normalized?.toLowerCase()==="no-active-blocker"?void 0:normalized}function isExternalGraphReference(target,sourceKind,externalAllowed=true){const normalized=normalizeDependencyReferenceTarget(target);return externalAllowed&&(isExternalDependencySourceKind(sourceKind)||normalized!==void 0&&isExternalDependencyReference(normalized))}function dependencyReferenceIdentityKey(target,sourceKind){return isExternalGraphReference(target,sourceKind)?`external\0${target}`:`local\0${target.toLowerCase()}`}function resolveGraphReferenceTarget(target,sourceKind,canonicalIds,externalGraphIds){return isExternalGraphReference(target,sourceKind)?externalGraphIds.get(target):canonicalIds.get(target.toLowerCase())}function compareCaseFoldedText(left,right){const normalizedLeft=left.toLowerCase();const normalizedRight=right.toLowerCase();if(normalizedLeft!==normalizedRight)return normalizedLeft<normalizedRight?-1:1;if(left!==right)return left<right?-1:1;return 0}function countDependencyRowIdentities(item){const occurrences=new Map;for(const dependency of item.dependencies??[]){if(typeof dependency!=="object"||dependency===null)continue;const legacyDependency=dependency;const target=normalizeDependencyReferenceTarget(legacyDependency.id);if(!target)continue;const kind=typeof legacyDependency.kind==="string"?legacyDependency.kind:"related";const key=`${kind}\0${dependencyReferenceIdentityKey(target,legacyDependency.source_kind)}`;const existing=occurrences.get(key);if(existing)existing.count+=1;else occurrences.set(key,{target_id:target,kind,count:1})}return occurrences}function collectDuplicateDependencyRows(items,isTerminal=status=>status==="closed"||status==="canceled"){const rows=[];for(const item of items){if(typeof item?.id!=="string"||item.id.trim().length===0)continue;for(const entry of countDependencyRowIdentities(item).values()){if(entry.count<2)continue;rows.push({holder_id:item.id.trim(),target_id:entry.target_id,kind:entry.kind,occurrences:entry.count,holder_status:item.status,legacy_terminal:isTerminal(item.status)})}}return rows.sort((left,right)=>{const holderCompare=compareCaseFoldedText(left.holder_id,right.holder_id);if(holderCompare!==0)return holderCompare;const targetCompare=compareCaseFoldedText(left.target_id,right.target_id);if(targetCompare!==0)return targetCompare;return compareCaseFoldedText(left.kind,right.kind)})}function decodeOrderingStorageContradiction(item,blocker,dependency,isTerminal,registry){if(typeof dependency!=="object"||dependency===null)return void 0;const target=normalizeDependencyReferenceTarget(dependency.id);if(!target||dependencyReferenceIdentityKey(target,dependency.source_kind)!==dependencyReferenceIdentityKey(blocker))return void 0;const definition=registry.resolve(typeof dependency.kind==="string"?dependency.kind:"related");if(definition?.ordering!==true||(definition.precedence??"source_before_target")!=="source_before_target")return void 0;return{holder_id:item.id.trim(),target_id:target,dependency_kind:definition.kind,holder_status:item.status,legacy_terminal:isTerminal(item.status)}}function collectOrderingStorageContradictions(items,isTerminal=status=>status==="closed"||status==="canceled",registry=resolveWorkspaceRelationshipKindRegistry()){const contradictions=new Map;for(const item of items){if(typeof item?.id!=="string"||item.id.trim().length===0)continue;const blocker=normalizeDependencyReferenceTarget(item.blocked_by);if(!blocker)continue;for(const dependency of item.dependencies??[]){const row=decodeOrderingStorageContradiction(item,blocker,dependency,isTerminal,registry);if(!row)continue;contradictions.set(`${row.holder_id.toLowerCase()}\0${row.target_id.toLowerCase()}\0${row.dependency_kind}`,row)}}return[...contradictions.values()].sort((left,right)=>{const holderCompare=compareCaseFoldedText(left.holder_id,right.holder_id);if(holderCompare!==0)return holderCompare;const targetCompare=compareCaseFoldedText(left.target_id,right.target_id);if(targetCompare!==0)return targetCompare;return compareCaseFoldedText(left.dependency_kind,right.dependency_kind)})}function collectDanglingDependencyReferences(items,isTerminal=status=>status==="closed"||status==="canceled"){const safeItems=items.filter(item=>typeof item?.id==="string"&&item.id.trim().length>0);const knownIds=new Set(safeItems.map(item=>item.id.trim().toLowerCase()));const rows=new Map;const addReference=(item,target,kind,source,externalAllowed)=>{const normalized=normalizeDependencyReferenceTarget(target);if(!normalized||knownIds.has(normalized.toLowerCase())||isExternalGraphReference(normalized,void 0,externalAllowed)){return}const row={holder_id:item.id.trim(),target_id:normalized,kind,source,holder_status:item.status,legacy_terminal:isTerminal(item.status),no_active_blocker_sentinel:normalized.toLowerCase()==="no-active-blocker"};rows.set(`${row.holder_id}::${row.target_id}::${row.kind}::${row.source}`,row)};for(const item of safeItems){addReference(item,item.parent,"parent","parent",false);addReference(item,item.blocked_by,"blocked_by","blocked_by",true);for(const dependency of item.dependencies??[]){if(typeof dependency!=="object"||dependency===null){continue}const legacyDependency=dependency;if(isExternalDependencySourceKind(legacyDependency.source_kind)){continue}addReference(item,legacyDependency.id,typeof legacyDependency.kind==="string"?legacyDependency.kind:"related","dependency",true)}}const sorted=[...rows.values()].sort((left,right)=>left.holder_id.localeCompare(right.holder_id)||left.target_id.localeCompare(right.target_id)||left.kind.localeCompare(right.kind)||left.source.localeCompare(right.source));const legacyTerminal=sorted.filter(row=>row.legacy_terminal);return{active:sorted.filter(row=>!row.legacy_terminal),legacy_terminal:legacyTerminal,no_active_blocker_sentinels:sorted.filter(row=>row.no_active_blocker_sentinel)}}function collectMissingDependencyTargetIds(dangling){const targets=new Map;for(const reference of[...dangling.active,...dangling.legacy_terminal]){if(reference.no_active_blocker_sentinel)continue;const target=reference.target_id.trim();const key=target.toLowerCase();if(!targets.has(key))targets.set(key,target)}return[...targets.values()].sort((left,right)=>left.localeCompare(right))}function collectExternalDependencyTargetIds(items){const targets=new Map;for(const item of items){const scalarBlocker=normalizeDependencyGraphTarget(item.blocked_by);if(scalarBlocker&&isExternalGraphReference(scalarBlocker)&&!targets.has(scalarBlocker)){targets.set(scalarBlocker,scalarBlocker)}for(const dependency of item.dependencies??[]){if(typeof dependency!=="object"||dependency===null||!isExternalGraphReference(dependency.id,dependency.source_kind)){continue}const id=normalizeDependencyGraphTarget(dependency.id);if(id&&!targets.has(id)){targets.set(id,id)}}}return[...targets.values()].sort((left,right)=>left.localeCompare(right))}const hierarchyIntegrityByAssembly=new WeakMap;function getWorkspaceHierarchyIntegrity(assembly){return assembly.hierarchyIntegrity??hierarchyIntegrityByAssembly.get(assembly)}function collectLegacyDependencyAliasCounts(items,registry=resolveWorkspaceRelationshipKindRegistry()){const counts={};for(const item of items){for(const dependency of item.dependencies??[]){if(typeof dependency!=="object"||dependency===null)continue;const rawKind=dependency.kind;if(typeof rawKind!=="string")continue;const normalized=rawKind.trim().toLowerCase().replaceAll("-","_");const definition=registry.resolve(rawKind);if(definition&&normalized!==definition.kind){counts[normalized]=(counts[normalized]??0)+1}}}return Object.fromEntries(Object.entries(counts).sort(([left],[right])=>left.localeCompare(right)))}function assembleWorkspaceRelationshipGraph(items,isTerminal,registry){const relationshipRegistry=registry??resolveWorkspaceRelationshipKindRegistry();const safeItems=items.filter(item=>typeof item?.id==="string"&&item.id.trim().length>0);const canonicalIds=new Map(safeItems.map(item=>[item.id.trim().toLowerCase(),item.id.trim()]));const dangling=collectDanglingDependencyReferences(safeItems,isTerminal);const missingIds=collectMissingDependencyTargetIds(dangling);for(const id of missingIds)canonicalIds.set(id.toLowerCase(),id);const externalIds=collectExternalDependencyTargetIds(safeItems);const usedGraphIds=new Set(canonicalIds.keys());const externalGraphIds=new Map;for(const id of externalIds){let graphId=id;while(usedGraphIds.has(graphId.toLowerCase())){graphId=`external:${graphId}`}externalGraphIds.set(id,graphId);usedGraphIds.add(graphId.toLowerCase())}const graphItems=safeItems.map(item=>{const parent=normalizeDependencyGraphTarget(item.parent);const blocker=normalizeDependencyGraphTarget(item.blocked_by);const dependencies=(item.dependencies??[]).flatMap(rawDependency=>{if(typeof rawDependency!=="object"||rawDependency===null)return[];const dependency=rawDependency;const target=normalizeDependencyGraphTarget(dependency.id);if(!target)return[];const targetId=resolveGraphReferenceTarget(target,dependency.source_kind,canonicalIds,externalGraphIds);return[{id:targetId,kind:typeof dependency.kind==="string"?dependency.kind:"related"}]});return{id:item.id.trim(),...parent?{parent:canonicalIds.get(parent.toLowerCase())}:{},...blocker?{blocked_by:resolveGraphReferenceTarget(blocker,void 0,canonicalIds,externalGraphIds)}:{},dependencies}});const hierarchyIntegrity=analyzeHierarchyIntegrity(safeItems,isTerminal,relationshipRegistry);const assembly={graph:RelationshipGraph.fromItems([...graphItems,...missingIds.map(id=>({id})),...externalIds.map(id=>({id:externalGraphIds.get(id)}))],relationshipRegistry),details:[...safeItems.map(item=>({id:item.id.trim(),title:item.title,status:item.status,...typeof item.type==="string"&&item.type.trim().length>0?{type:item.type.trim()}:{}})),...missingIds.map(id=>({id,title:`[missing] ${id}`,status:"missing"})),...externalIds.map(id=>({id:externalGraphIds.get(id),title:`[external] ${id}`,status:"external"}))],missingIdSet:new Set(missingIds.map(id=>id.toLowerCase())),dangling,duplicateRows:collectDuplicateDependencyRows(safeItems,isTerminal),orderingContradictions:collectOrderingStorageContradictions(safeItems,isTerminal,relationshipRegistry),legacyAliasCounts:collectLegacyDependencyAliasCounts(safeItems,relationshipRegistry),hierarchyIntegrity};hierarchyIntegrityByAssembly.set(assembly,hierarchyIntegrity);return assembly}export{assembleWorkspaceRelationshipGraph,collectDanglingDependencyReferences,collectDuplicateDependencyRows,collectExternalDependencyTargetIds,collectLegacyDependencyAliasCounts,collectMissingDependencyTargetIds,collectOrderingStorageContradictions,getWorkspaceHierarchyIntegrity,normalizeDependencyGraphTarget,resolveWorkspaceRelationshipKindRegistry2 as resolveWorkspaceRelationshipKindRegistry};
|
|
377
2
|
//# sourceMappingURL=assembly.js.map
|
|
378
|
-
//# debugId=e04a91fa-4625-50fd-9bfd-c712126baf0d
|
package/dist/sdk/graph/cache.js
CHANGED
|
@@ -1,161 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
* @module sdk/graph/cache
|
|
3
|
-
*
|
|
4
|
-
* Incremental workspace graph cache: fingerprint-keyed reuse of the assembled
|
|
5
|
-
* relationship graph plus memoized analytics results, so long-lived processes
|
|
6
|
-
* (the MCP server, SDK consumers, packages) stop paying the full-workspace
|
|
7
|
-
* assembly and analysis cost on every bounded query. The fingerprint is a
|
|
8
|
-
* deterministic digest of every relationship-relevant item field — id, title,
|
|
9
|
-
* lifecycle status and its terminal classification, hierarchy parent, legacy
|
|
10
|
-
* blocker, and structured dependency edges — so any mutation that could change
|
|
11
|
-
* the graph or its projections invalidates the entry, while unrelated payload
|
|
12
|
-
* churn (bodies, comments) does not enter the digest at all. Every lookup
|
|
13
|
-
* reports hit/miss observability so envelopes can explain their freshness.
|
|
14
|
-
*/
|
|
15
|
-
|
|
16
|
-
!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]="dea35fb9-9f9f-56ce-afc0-f4dc993012c3")}catch(e){}}();
|
|
17
|
-
import { createHash } from "node:crypto";
|
|
18
|
-
import { stableStringify } from "../../core/shared/serialization.js";
|
|
19
|
-
import { createRelationshipKindRegistry, } from "../relationships.js";
|
|
20
|
-
/** Default memoized query results retained per workspace entry. */
|
|
21
|
-
const DEFAULT_MAX_RESULTS_PER_WORKSPACE = 64;
|
|
22
|
-
/** Default workspace entries retained by one cache instance. */
|
|
23
|
-
const DEFAULT_MAX_WORKSPACES = 8;
|
|
24
|
-
/** Digest one item's relationship-relevant fields into a deterministic line. */
|
|
25
|
-
function fingerprintLine(item, isTerminal) {
|
|
26
|
-
const dependencies = (item.dependencies ?? [])
|
|
27
|
-
.map((rawDependency) => {
|
|
28
|
-
// Public SDK callers may supply legacy or JSON-decoded payloads; mirror
|
|
29
|
-
// assembly's defensive normalization so the digest tracks what assembly
|
|
30
|
-
// would actually index.
|
|
31
|
-
if (typeof rawDependency !== "object" || rawDependency === null)
|
|
32
|
-
return "";
|
|
33
|
-
const dependency = rawDependency;
|
|
34
|
-
return `${typeof dependency.kind === "string" ? dependency.kind : "related"}:${typeof dependency.id === "string" ? dependency.id : ""}`;
|
|
35
|
-
})
|
|
36
|
-
.sort()
|
|
37
|
-
.join(",");
|
|
38
|
-
return [
|
|
39
|
-
item.id,
|
|
40
|
-
item.title,
|
|
41
|
-
item.status,
|
|
42
|
-
isTerminal(item.status) ? "1" : "0",
|
|
43
|
-
// Per-type coverage profiles make the item type a projection input, so a
|
|
44
|
-
// retype must invalidate cached assemblies and memoized audit results.
|
|
45
|
-
typeof item.type === "string" ? item.type.trim() : "",
|
|
46
|
-
item.parent ?? "",
|
|
47
|
-
item.blocked_by ?? "",
|
|
48
|
-
dependencies,
|
|
49
|
-
].join("\u0000");
|
|
50
|
-
}
|
|
51
|
-
/**
|
|
52
|
-
* Compute the deterministic workspace graph fingerprint for one item snapshot.
|
|
53
|
-
* Items are digested in sorted order so storage enumeration order never
|
|
54
|
-
* changes the fingerprint, and the terminal classification of each status is
|
|
55
|
-
* folded in so schema changes to lifecycle semantics invalidate cached
|
|
56
|
-
* assemblies even when raw statuses are unchanged.
|
|
57
|
-
*/
|
|
58
|
-
export function computeWorkspaceGraphFingerprint(items, isTerminal = (status) => status === "closed" || status === "canceled", registry = createRelationshipKindRegistry()) {
|
|
59
|
-
const lines = items
|
|
60
|
-
.filter((item) => typeof item?.id === "string" && item.id.trim().length > 0)
|
|
61
|
-
.map((item) => fingerprintLine(item, isTerminal))
|
|
62
|
-
.sort();
|
|
63
|
-
const relationshipSemantics = registry
|
|
64
|
-
.list()
|
|
65
|
-
.map((definition) => stableStringify(definition))
|
|
66
|
-
.sort();
|
|
67
|
-
// Separate fields and records with control characters no stored field can
|
|
68
|
-
// contain unescaped, so adjacent free-text fields can never collide.
|
|
69
|
-
return createHash("sha256")
|
|
70
|
-
.update(lines.join("\u0001"))
|
|
71
|
-
.update("\u0002")
|
|
72
|
-
.update(relationshipSemantics.join("\u0001"))
|
|
73
|
-
.digest("hex");
|
|
74
|
-
}
|
|
75
|
-
/** Validate one optional positive-integer cache bound, applying its default. */
|
|
76
|
-
function requirePositiveCacheBound(name, value, fallback) {
|
|
77
|
-
const bound = value ?? fallback;
|
|
78
|
-
if (!Number.isInteger(bound) || bound < 1)
|
|
79
|
-
throw new TypeError(`Invalid ${name} bound: ${String(value)}`);
|
|
80
|
-
return bound;
|
|
81
|
-
}
|
|
82
|
-
/**
|
|
83
|
-
* Fingerprint-keyed cache of workspace relationship assemblies and memoized
|
|
84
|
-
* deterministic query results. One entry is retained per workspace key; a
|
|
85
|
-
* changed fingerprint atomically replaces the entry and drops its memoized
|
|
86
|
-
* results. Memoized values are structured-cloned on store and on read so
|
|
87
|
-
* neither the producer nor any consumer can mutate cached state.
|
|
88
|
-
*/
|
|
89
|
-
export class WorkspaceGraphCache {
|
|
90
|
-
#entries = new Map();
|
|
91
|
-
#maxResultsPerWorkspace;
|
|
92
|
-
#maxWorkspaces;
|
|
93
|
-
/** Create a cache, optionally bounding workspaces and memoized results. */
|
|
94
|
-
constructor(options = {}) {
|
|
95
|
-
this.#maxResultsPerWorkspace = requirePositiveCacheBound("maxResultsPerWorkspace", options.maxResultsPerWorkspace, DEFAULT_MAX_RESULTS_PER_WORKSPACE);
|
|
96
|
-
this.#maxWorkspaces = requirePositiveCacheBound("maxWorkspaces", options.maxWorkspaces, DEFAULT_MAX_WORKSPACES);
|
|
97
|
-
}
|
|
98
|
-
/**
|
|
99
|
-
* Resolve the cached assembly for one workspace key and fingerprint,
|
|
100
|
-
* building and storing it on miss. The returned lookup exposes snapshot-
|
|
101
|
-
* scoped memoization for query results derived from the same assembly.
|
|
102
|
-
*/
|
|
103
|
-
lookup(key, fingerprint, build) {
|
|
104
|
-
let entry = this.#entries.get(key);
|
|
105
|
-
let assemblyReused = true;
|
|
106
|
-
if (entry === undefined || entry.fingerprint !== fingerprint) {
|
|
107
|
-
entry = { fingerprint, assembly: build(), results: new Map() };
|
|
108
|
-
assemblyReused = false;
|
|
109
|
-
if (!this.#entries.has(key) &&
|
|
110
|
-
this.#entries.size >= this.#maxWorkspaces) {
|
|
111
|
-
// Evict the least recently used workspace; every lookup refreshes
|
|
112
|
-
// recency below, so insertion order tracks use order.
|
|
113
|
-
this.#entries.delete(this.#entries.keys().next().value);
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
// Delete-and-reinsert keeps Map insertion order equal to recency order,
|
|
117
|
-
// making workspace eviction genuinely least-recently-used.
|
|
118
|
-
this.#entries.delete(key);
|
|
119
|
-
this.#entries.set(key, entry);
|
|
120
|
-
const resolved = entry;
|
|
121
|
-
const maxResults = this.#maxResultsPerWorkspace;
|
|
122
|
-
return {
|
|
123
|
-
assembly: resolved.assembly,
|
|
124
|
-
assemblyReused,
|
|
125
|
-
fingerprint,
|
|
126
|
-
memoize(queryKey, compute) {
|
|
127
|
-
const cached = resolved.results.get(queryKey);
|
|
128
|
-
if (cached !== undefined || resolved.results.has(queryKey)) {
|
|
129
|
-
// Refresh recency so eviction below is least-recently-used rather
|
|
130
|
-
// than first-inserted.
|
|
131
|
-
resolved.results.delete(queryKey);
|
|
132
|
-
resolved.results.set(queryKey, cached);
|
|
133
|
-
return { value: structuredClone(cached), reused: true };
|
|
134
|
-
}
|
|
135
|
-
const value = compute();
|
|
136
|
-
if (resolved.results.size >= maxResults) {
|
|
137
|
-
// Evict the oldest memoized result; Map preserves insertion order.
|
|
138
|
-
resolved.results.delete(resolved.results.keys().next().value);
|
|
139
|
-
}
|
|
140
|
-
resolved.results.set(queryKey, structuredClone(value));
|
|
141
|
-
return { value, reused: false };
|
|
142
|
-
},
|
|
143
|
-
};
|
|
144
|
-
}
|
|
145
|
-
/** Drop every cached workspace entry and memoized result. */
|
|
146
|
-
clear() {
|
|
147
|
-
this.#entries.clear();
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
/** Process-wide shared cache used by the CLI/MCP graph and deps adapters. */
|
|
151
|
-
const sharedCache = new WorkspaceGraphCache();
|
|
152
|
-
/** Return the process-wide shared workspace graph cache. */
|
|
153
|
-
export function workspaceGraphCache() {
|
|
154
|
-
return sharedCache;
|
|
155
|
-
}
|
|
156
|
-
/** Reset the process-wide shared workspace graph cache (tests and long-lived hosts). */
|
|
157
|
-
export function resetWorkspaceGraphCache() {
|
|
158
|
-
sharedCache.clear();
|
|
159
|
-
}
|
|
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]="10f534cf-ee82-54a2-9807-390eca5fb0b8")}catch(e2){}})();import{createHash}from"node:crypto";import{stableStringify}from"../../core/shared/serialization.js";import{createRelationshipKindRegistry}from"../relationships.js";const DEFAULT_MAX_RESULTS_PER_WORKSPACE=64;const DEFAULT_MAX_WORKSPACES=8;function fingerprintLine(item,isTerminal){const dependencies=(item.dependencies??[]).map(rawDependency=>{if(typeof rawDependency!=="object"||rawDependency===null)return"";const dependency=rawDependency;return`${typeof dependency.kind==="string"?dependency.kind:"related"}:${typeof dependency.id==="string"?dependency.id:""}`}).sort().join(",");return[item.id,item.title,item.status,isTerminal(item.status)?"1":"0",typeof item.type==="string"?item.type.trim():"",item.parent??"",item.blocked_by??"",dependencies].join("\0")}function computeWorkspaceGraphFingerprint(items,isTerminal=status=>status==="closed"||status==="canceled",registry=createRelationshipKindRegistry()){const lines=items.filter(item=>typeof item?.id==="string"&&item.id.trim().length>0).map(item=>fingerprintLine(item,isTerminal)).sort();const relationshipSemantics=registry.list().map(definition=>stableStringify(definition)).sort();return createHash("sha256").update(lines.join("")).update("").update(relationshipSemantics.join("")).digest("hex")}function requirePositiveCacheBound(name,value,fallback){const bound=value??fallback;if(!Number.isInteger(bound)||bound<1)throw new TypeError(`Invalid ${name} bound: ${String(value)}`);return bound}class WorkspaceGraphCache{#entries=new Map;#maxResultsPerWorkspace;#maxWorkspaces;constructor(options={}){this.#maxResultsPerWorkspace=requirePositiveCacheBound("maxResultsPerWorkspace",options.maxResultsPerWorkspace,DEFAULT_MAX_RESULTS_PER_WORKSPACE);this.#maxWorkspaces=requirePositiveCacheBound("maxWorkspaces",options.maxWorkspaces,DEFAULT_MAX_WORKSPACES)}lookup(key,fingerprint,build){let entry=this.#entries.get(key);let assemblyReused=true;if(entry===void 0||entry.fingerprint!==fingerprint){entry={fingerprint,assembly:build(),results:new Map};assemblyReused=false;if(!this.#entries.has(key)&&this.#entries.size>=this.#maxWorkspaces){this.#entries.delete(this.#entries.keys().next().value)}}this.#entries.delete(key);this.#entries.set(key,entry);const resolved=entry;const maxResults=this.#maxResultsPerWorkspace;return{assembly:resolved.assembly,assemblyReused,fingerprint,memoize(queryKey,compute){const cached=resolved.results.get(queryKey);if(cached!==void 0||resolved.results.has(queryKey)){resolved.results.delete(queryKey);resolved.results.set(queryKey,cached);return{value:structuredClone(cached),reused:true}}const value=compute();if(resolved.results.size>=maxResults){resolved.results.delete(resolved.results.keys().next().value)}resolved.results.set(queryKey,structuredClone(value));return{value,reused:false}}}}clear(){this.#entries.clear()}}const sharedCache=new WorkspaceGraphCache;function workspaceGraphCache(){return sharedCache}function resetWorkspaceGraphCache(){sharedCache.clear()}export{WorkspaceGraphCache,computeWorkspaceGraphFingerprint,resetWorkspaceGraphCache,workspaceGraphCache};
|
|
160
2
|
//# sourceMappingURL=cache.js.map
|
|
161
|
-
//# debugId=dea35fb9-9f9f-56ce-afc0-f4dc993012c3
|