@unbrained/pm-cli 2026.9.7 → 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 +211 -181
- 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/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,259 +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]="348c9246-2fb9-529e-b627-f60c901a6cf2")}catch(e){}}();
|
|
3
|
-
import { forEachMatchedRelationshipEdge } from "./analytics.js";
|
|
4
|
-
import { orientOrderingEdge } from "./traversal.js";
|
|
5
|
-
/** Round a centrality score to six decimals to suppress floating-point noise. */
|
|
6
|
-
function roundScore(value) {
|
|
7
|
-
return Math.round(value * 1e6) / 1e6;
|
|
8
|
-
}
|
|
9
|
-
/** Add one value to a set-valued map entry, creating the set on demand. */
|
|
10
|
-
function addToSetMap(map, key, value) {
|
|
11
|
-
const set = map.get(key);
|
|
12
|
-
if (set === undefined)
|
|
13
|
-
map.set(key, new Set([value]));
|
|
14
|
-
else
|
|
15
|
-
set.add(value);
|
|
16
|
-
}
|
|
17
|
-
/** Build the deterministic simple undirected adjacency over every node. */
|
|
18
|
-
function buildSimpleUndirectedAdjacency(graph, kinds) {
|
|
19
|
-
const sets = new Map(graph.nodes().map((id) => [id, new Set()]));
|
|
20
|
-
forEachMatchedRelationshipEdge(graph, kinds, (edge) => {
|
|
21
|
-
sets.get(edge.source).add(edge.target);
|
|
22
|
-
sets.get(edge.target).add(edge.source);
|
|
23
|
-
});
|
|
24
|
-
const adjacency = new Map();
|
|
25
|
-
for (const [id, neighbors] of sets)
|
|
26
|
-
adjacency.set(id, [...neighbors].sort());
|
|
27
|
-
return adjacency;
|
|
28
|
-
}
|
|
29
|
-
/**
|
|
30
|
-
* Collect distinct ordering predecessors and successors per node, oriented by
|
|
31
|
-
* each kind's declared precedence so fan-in/fan-out match the SDK's
|
|
32
|
-
* predecessor/successor traversal semantics rather than the stored edge
|
|
33
|
-
* spelling (a `blocked_by` edge counts its target as the predecessor).
|
|
34
|
-
*/
|
|
35
|
-
function collectOrderingDegrees(graph, kinds) {
|
|
36
|
-
const incoming = new Map();
|
|
37
|
-
const outgoing = new Map();
|
|
38
|
-
forEachMatchedRelationshipEdge(graph, kinds, (edge, definition) => {
|
|
39
|
-
if (!definition.ordering)
|
|
40
|
-
return;
|
|
41
|
-
const { predecessor, successor } = orientOrderingEdge(edge, definition);
|
|
42
|
-
// The predecessor gates the successor: predecessor -> successor.
|
|
43
|
-
addToSetMap(outgoing, predecessor, successor);
|
|
44
|
-
addToSetMap(incoming, successor, predecessor);
|
|
45
|
-
});
|
|
46
|
-
return { incoming, outgoing };
|
|
47
|
-
}
|
|
48
|
-
/** Run one breadth-first single-source shortest-path sweep for Brandes accumulation. */
|
|
49
|
-
function brandesShortestPaths(source, adjacency, cost) {
|
|
50
|
-
const distance = new Map([[source, 0]]);
|
|
51
|
-
const sigma = new Map([[source, 1]]);
|
|
52
|
-
const predecessors = new Map();
|
|
53
|
-
const stack = [];
|
|
54
|
-
const queue = [source];
|
|
55
|
-
let reachableCount = 0;
|
|
56
|
-
let distanceSum = 0;
|
|
57
|
-
for (let index = 0; index < queue.length; index += 1) {
|
|
58
|
-
const node = queue[index];
|
|
59
|
-
cost.visitedNodes += 1;
|
|
60
|
-
stack.push(node);
|
|
61
|
-
const nodeDistance = distance.get(node);
|
|
62
|
-
if (node !== source) {
|
|
63
|
-
reachableCount += 1;
|
|
64
|
-
distanceSum += nodeDistance;
|
|
65
|
-
}
|
|
66
|
-
for (const neighbor of adjacency.get(node)) {
|
|
67
|
-
cost.inspectedEdges += 1;
|
|
68
|
-
if (!distance.has(neighbor)) {
|
|
69
|
-
distance.set(neighbor, nodeDistance + 1);
|
|
70
|
-
queue.push(neighbor);
|
|
71
|
-
}
|
|
72
|
-
if (distance.get(neighbor) === nodeDistance + 1) {
|
|
73
|
-
sigma.set(neighbor, (sigma.get(neighbor) ?? 0) + sigma.get(node));
|
|
74
|
-
const predecessorList = predecessors.get(neighbor);
|
|
75
|
-
if (predecessorList === undefined)
|
|
76
|
-
predecessors.set(neighbor, [node]);
|
|
77
|
-
else
|
|
78
|
-
predecessorList.push(node);
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
return { stack, sigma, predecessors, reachableCount, distanceSum };
|
|
83
|
-
}
|
|
84
|
-
/** Fold one completed sweep's dependencies back into the running betweenness totals. */
|
|
85
|
-
function accumulateBetweenness(sweep, source, betweenness) {
|
|
86
|
-
const dependency = new Map();
|
|
87
|
-
for (let index = sweep.stack.length - 1; index >= 0; index -= 1) {
|
|
88
|
-
const node = sweep.stack[index];
|
|
89
|
-
const share = (1 + (dependency.get(node) ?? 0)) / sweep.sigma.get(node);
|
|
90
|
-
for (const predecessor of sweep.predecessors.get(node) ?? []) {
|
|
91
|
-
dependency.set(predecessor, (dependency.get(predecessor) ?? 0) + sweep.sigma.get(predecessor) * share);
|
|
92
|
-
}
|
|
93
|
-
if (node !== source)
|
|
94
|
-
betweenness.set(node, (betweenness.get(node) ?? 0) + (dependency.get(node) ?? 0));
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
/**
|
|
98
|
-
* Wasserman–Faust closeness normalizes reachability so disconnected graphs
|
|
99
|
-
* compare fairly. A reachable count above zero implies a positive distance sum
|
|
100
|
-
* (every shortest distance is at least one), so those two guards suffice.
|
|
101
|
-
*/
|
|
102
|
-
function wassermanFaustCloseness(sweep, nodeCount) {
|
|
103
|
-
if (nodeCount <= 1 || sweep.reachableCount === 0)
|
|
104
|
-
return 0;
|
|
105
|
-
return ((sweep.reachableCount / (nodeCount - 1)) *
|
|
106
|
-
(sweep.reachableCount / sweep.distanceSum));
|
|
107
|
-
}
|
|
108
|
-
/** Assemble one ranked centrality row from the accumulated scores. */
|
|
109
|
-
function centralityRow(id, adjacency, directed, betweenness, closeness) {
|
|
110
|
-
return {
|
|
111
|
-
id,
|
|
112
|
-
degree: adjacency.get(id).length,
|
|
113
|
-
inDegree: directed.incoming.get(id)?.size ?? 0,
|
|
114
|
-
outDegree: directed.outgoing.get(id)?.size ?? 0,
|
|
115
|
-
// Undirected betweenness double-counts each ordered pair; halve it.
|
|
116
|
-
betweenness: roundScore((betweenness.get(id) ?? 0) / 2),
|
|
117
|
-
// Every node is a sweep source, so closeness is always populated.
|
|
118
|
-
closeness: roundScore(closeness.get(id)),
|
|
119
|
-
};
|
|
120
|
-
}
|
|
121
|
-
/**
|
|
122
|
-
* Compute exact shortest-path betweenness (Brandes), Wasserman–Faust closeness,
|
|
123
|
-
* undirected degree, and directed fan-in/fan-out for every node over the simple
|
|
124
|
-
* undirected graph induced by the selected kinds. Rows rank by betweenness, then
|
|
125
|
-
* degree, then id. The result is exact on the bounded workspace; callers bound
|
|
126
|
-
* the returned rows for token-aware projection.
|
|
127
|
-
*/
|
|
128
|
-
export function computeRelationshipCentrality(graph, options = {}) {
|
|
129
|
-
const adjacency = buildSimpleUndirectedAdjacency(graph, options.kinds);
|
|
130
|
-
const directed = collectOrderingDegrees(graph, options.kinds);
|
|
131
|
-
const nodes = graph.nodes();
|
|
132
|
-
const betweenness = new Map();
|
|
133
|
-
const closeness = new Map();
|
|
134
|
-
const cost = { visitedNodes: 0, inspectedEdges: 0 };
|
|
135
|
-
for (const source of nodes) {
|
|
136
|
-
options.signal?.throwIfAborted();
|
|
137
|
-
const sweep = brandesShortestPaths(source, adjacency, cost);
|
|
138
|
-
closeness.set(source, wassermanFaustCloseness(sweep, nodes.length));
|
|
139
|
-
accumulateBetweenness(sweep, source, betweenness);
|
|
140
|
-
}
|
|
141
|
-
let degreeSum = 0;
|
|
142
|
-
for (const neighbors of adjacency.values())
|
|
143
|
-
degreeSum += neighbors.length;
|
|
144
|
-
const rows = nodes
|
|
145
|
-
.map((id) => centralityRow(id, adjacency, directed, betweenness, closeness))
|
|
146
|
-
.sort((left, right) => right.betweenness - left.betweenness ||
|
|
147
|
-
right.degree - left.degree ||
|
|
148
|
-
left.id.localeCompare(right.id));
|
|
149
|
-
return {
|
|
150
|
-
value: { nodeCount: nodes.length, edgeCount: degreeSum / 2, rows },
|
|
151
|
-
meta: {
|
|
152
|
-
visitedNodes: cost.visitedNodes,
|
|
153
|
-
inspectedEdges: cost.inspectedEdges,
|
|
154
|
-
truncated: false,
|
|
155
|
-
},
|
|
156
|
-
};
|
|
157
|
-
}
|
|
158
|
-
/** Order one bridge endpoint pair deterministically. */
|
|
159
|
-
function orderedBridge(left, right) {
|
|
160
|
-
return left <= right
|
|
161
|
-
? { source: left, target: right }
|
|
162
|
-
: { source: right, target: left };
|
|
163
|
-
}
|
|
164
|
-
/**
|
|
165
|
-
* Advance the top frame by one neighbor: descend into an undiscovered neighbor,
|
|
166
|
-
* or relax the low-link against a back edge. Returns the discovered child frame
|
|
167
|
-
* to push, or undefined when the step consumed a back edge or the tree parent.
|
|
168
|
-
*/
|
|
169
|
-
function advanceCutFrame(frame, adjacency, state) {
|
|
170
|
-
const neighbors = adjacency.get(frame.node);
|
|
171
|
-
const neighbor = neighbors[frame.neighborIndex];
|
|
172
|
-
frame.neighborIndex += 1;
|
|
173
|
-
state.inspectedEdges += 1;
|
|
174
|
-
if (neighbor === frame.parent)
|
|
175
|
-
return undefined;
|
|
176
|
-
if (state.discovery.has(neighbor)) {
|
|
177
|
-
state.low.set(frame.node, Math.min(state.low.get(frame.node), state.discovery.get(neighbor)));
|
|
178
|
-
return undefined;
|
|
179
|
-
}
|
|
180
|
-
frame.children += 1;
|
|
181
|
-
state.discovery.set(neighbor, state.timer);
|
|
182
|
-
state.low.set(neighbor, state.timer);
|
|
183
|
-
state.timer += 1;
|
|
184
|
-
return { node: neighbor, parent: frame.node, neighborIndex: 0, children: 0 };
|
|
185
|
-
}
|
|
186
|
-
/** Retreat from a finished frame: fold its low-link into its parent and flag cuts. */
|
|
187
|
-
function retreatCutFrame(frame, root, state) {
|
|
188
|
-
if (frame.parent === null) {
|
|
189
|
-
if (frame.children > 1)
|
|
190
|
-
state.articulation.add(frame.node);
|
|
191
|
-
return;
|
|
192
|
-
}
|
|
193
|
-
const parent = frame.parent;
|
|
194
|
-
const childLow = state.low.get(frame.node);
|
|
195
|
-
state.low.set(parent, Math.min(state.low.get(parent), childLow));
|
|
196
|
-
if (parent !== root && childLow >= state.discovery.get(parent))
|
|
197
|
-
state.articulation.add(parent);
|
|
198
|
-
if (childLow > state.discovery.get(parent))
|
|
199
|
-
state.bridges.push(orderedBridge(parent, frame.node));
|
|
200
|
-
}
|
|
201
|
-
/** Walk one connected component's depth-first tree, updating low-links and cuts. */
|
|
202
|
-
function searchComponentCuts(root, adjacency, state, signal) {
|
|
203
|
-
state.discovery.set(root, state.timer);
|
|
204
|
-
state.low.set(root, state.timer);
|
|
205
|
-
state.timer += 1;
|
|
206
|
-
const stack = [
|
|
207
|
-
{ node: root, parent: null, neighborIndex: 0, children: 0 },
|
|
208
|
-
];
|
|
209
|
-
while (stack.length > 0) {
|
|
210
|
-
signal?.throwIfAborted();
|
|
211
|
-
const frame = stack.at(-1);
|
|
212
|
-
if (frame.neighborIndex < adjacency.get(frame.node).length) {
|
|
213
|
-
const child = advanceCutFrame(frame, adjacency, state);
|
|
214
|
-
if (child !== undefined)
|
|
215
|
-
stack.push(child);
|
|
216
|
-
}
|
|
217
|
-
else {
|
|
218
|
-
retreatCutFrame(frame, root, state);
|
|
219
|
-
stack.pop();
|
|
220
|
-
}
|
|
221
|
-
}
|
|
222
|
-
}
|
|
223
|
-
/**
|
|
224
|
-
* Find articulation points and bridges of the undirected knowledge graph with
|
|
225
|
-
* an iterative Tarjan low-link search over the simple adjacency. An articulation
|
|
226
|
-
* point is a node whose removal increases the connected-component count; a bridge
|
|
227
|
-
* is an edge whose removal does the same — both are single points of failure in
|
|
228
|
-
* the relationship graph. Results are deterministic and exact.
|
|
229
|
-
*/
|
|
230
|
-
export function findRelationshipCutStructure(graph, options = {}) {
|
|
231
|
-
const adjacency = buildSimpleUndirectedAdjacency(graph, options.kinds);
|
|
232
|
-
const state = {
|
|
233
|
-
discovery: new Map(),
|
|
234
|
-
low: new Map(),
|
|
235
|
-
timer: 0,
|
|
236
|
-
articulation: new Set(),
|
|
237
|
-
bridges: [],
|
|
238
|
-
inspectedEdges: 0,
|
|
239
|
-
};
|
|
240
|
-
for (const root of graph.nodes()) {
|
|
241
|
-
if (state.discovery.has(root))
|
|
242
|
-
continue;
|
|
243
|
-
searchComponentCuts(root, adjacency, state, options.signal);
|
|
244
|
-
}
|
|
245
|
-
return {
|
|
246
|
-
value: {
|
|
247
|
-
articulationPoints: [...state.articulation].sort(),
|
|
248
|
-
bridges: state.bridges.sort((left, right) => left.source.localeCompare(right.source) ||
|
|
249
|
-
left.target.localeCompare(right.target)),
|
|
250
|
-
},
|
|
251
|
-
meta: {
|
|
252
|
-
visitedNodes: state.discovery.size,
|
|
253
|
-
inspectedEdges: state.inspectedEdges,
|
|
254
|
-
truncated: false,
|
|
255
|
-
},
|
|
256
|
-
};
|
|
257
|
-
}
|
|
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]="aa8e4dc3-250e-50eb-b770-a11cbab6ebc3")}catch(e2){}})();import{forEachMatchedRelationshipEdge}from"./analytics.js";import{orientOrderingEdge}from"./traversal.js";function roundScore(value){return Math.round(value*1e6)/1e6}function addToSetMap(map,key,value){const set=map.get(key);if(set===void 0)map.set(key,new Set([value]));else set.add(value)}function buildSimpleUndirectedAdjacency(graph,kinds){const sets=new Map(graph.nodes().map(id=>[id,new Set]));forEachMatchedRelationshipEdge(graph,kinds,edge=>{sets.get(edge.source).add(edge.target);sets.get(edge.target).add(edge.source)});const adjacency=new Map;for(const[id,neighbors]of sets)adjacency.set(id,[...neighbors].sort());return adjacency}function collectOrderingDegrees(graph,kinds){const incoming=new Map;const outgoing=new Map;forEachMatchedRelationshipEdge(graph,kinds,(edge,definition)=>{if(!definition.ordering)return;const{predecessor,successor}=orientOrderingEdge(edge,definition);addToSetMap(outgoing,predecessor,successor);addToSetMap(incoming,successor,predecessor)});return{incoming,outgoing}}function brandesShortestPaths(source,adjacency,cost){const distance=new Map([[source,0]]);const sigma=new Map([[source,1]]);const predecessors=new Map;const stack=[];const queue=[source];let reachableCount=0;let distanceSum=0;for(let index=0;index<queue.length;index+=1){const node=queue[index];cost.visitedNodes+=1;stack.push(node);const nodeDistance=distance.get(node);if(node!==source){reachableCount+=1;distanceSum+=nodeDistance}for(const neighbor of adjacency.get(node)){cost.inspectedEdges+=1;if(!distance.has(neighbor)){distance.set(neighbor,nodeDistance+1);queue.push(neighbor)}if(distance.get(neighbor)===nodeDistance+1){sigma.set(neighbor,(sigma.get(neighbor)??0)+sigma.get(node));const predecessorList=predecessors.get(neighbor);if(predecessorList===void 0)predecessors.set(neighbor,[node]);else predecessorList.push(node)}}}return{stack,sigma,predecessors,reachableCount,distanceSum}}function accumulateBetweenness(sweep,source,betweenness){const dependency=new Map;for(let index=sweep.stack.length-1;index>=0;index-=1){const node=sweep.stack[index];const share=(1+(dependency.get(node)??0))/sweep.sigma.get(node);for(const predecessor of sweep.predecessors.get(node)??[]){dependency.set(predecessor,(dependency.get(predecessor)??0)+sweep.sigma.get(predecessor)*share)}if(node!==source)betweenness.set(node,(betweenness.get(node)??0)+(dependency.get(node)??0))}}function wassermanFaustCloseness(sweep,nodeCount){if(nodeCount<=1||sweep.reachableCount===0)return 0;return sweep.reachableCount/(nodeCount-1)*(sweep.reachableCount/sweep.distanceSum)}function centralityRow(id,adjacency,directed,betweenness,closeness){return{id,degree:adjacency.get(id).length,inDegree:directed.incoming.get(id)?.size??0,outDegree:directed.outgoing.get(id)?.size??0,betweenness:roundScore((betweenness.get(id)??0)/2),closeness:roundScore(closeness.get(id))}}function computeRelationshipCentrality(graph,options={}){const adjacency=buildSimpleUndirectedAdjacency(graph,options.kinds);const directed=collectOrderingDegrees(graph,options.kinds);const nodes=graph.nodes();const betweenness=new Map;const closeness=new Map;const cost={visitedNodes:0,inspectedEdges:0};for(const source of nodes){options.signal?.throwIfAborted();const sweep=brandesShortestPaths(source,adjacency,cost);closeness.set(source,wassermanFaustCloseness(sweep,nodes.length));accumulateBetweenness(sweep,source,betweenness)}let degreeSum=0;for(const neighbors of adjacency.values())degreeSum+=neighbors.length;const rows=nodes.map(id=>centralityRow(id,adjacency,directed,betweenness,closeness)).sort((left,right)=>right.betweenness-left.betweenness||right.degree-left.degree||left.id.localeCompare(right.id));return{value:{nodeCount:nodes.length,edgeCount:degreeSum/2,rows},meta:{visitedNodes:cost.visitedNodes,inspectedEdges:cost.inspectedEdges,truncated:false}}}function orderedBridge(left,right){return left<=right?{source:left,target:right}:{source:right,target:left}}function advanceCutFrame(frame,adjacency,state){const neighbors=adjacency.get(frame.node);const neighbor=neighbors[frame.neighborIndex];frame.neighborIndex+=1;state.inspectedEdges+=1;if(neighbor===frame.parent)return void 0;if(state.discovery.has(neighbor)){state.low.set(frame.node,Math.min(state.low.get(frame.node),state.discovery.get(neighbor)));return void 0}frame.children+=1;state.discovery.set(neighbor,state.timer);state.low.set(neighbor,state.timer);state.timer+=1;return{node:neighbor,parent:frame.node,neighborIndex:0,children:0}}function retreatCutFrame(frame,root,state){if(frame.parent===null){if(frame.children>1)state.articulation.add(frame.node);return}const parent=frame.parent;const childLow=state.low.get(frame.node);state.low.set(parent,Math.min(state.low.get(parent),childLow));if(parent!==root&&childLow>=state.discovery.get(parent))state.articulation.add(parent);if(childLow>state.discovery.get(parent))state.bridges.push(orderedBridge(parent,frame.node))}function searchComponentCuts(root,adjacency,state,signal){state.discovery.set(root,state.timer);state.low.set(root,state.timer);state.timer+=1;const stack=[{node:root,parent:null,neighborIndex:0,children:0}];while(stack.length>0){signal?.throwIfAborted();const frame=stack.at(-1);if(frame.neighborIndex<adjacency.get(frame.node).length){const child=advanceCutFrame(frame,adjacency,state);if(child!==void 0)stack.push(child)}else{retreatCutFrame(frame,root,state);stack.pop()}}}function findRelationshipCutStructure(graph,options={}){const adjacency=buildSimpleUndirectedAdjacency(graph,options.kinds);const state={discovery:new Map,low:new Map,timer:0,articulation:new Set,bridges:[],inspectedEdges:0};for(const root of graph.nodes()){if(state.discovery.has(root))continue;searchComponentCuts(root,adjacency,state,options.signal)}return{value:{articulationPoints:[...state.articulation].sort(),bridges:state.bridges.sort((left,right)=>left.source.localeCompare(right.source)||left.target.localeCompare(right.target))},meta:{visitedNodes:state.discovery.size,inspectedEdges:state.inspectedEdges,truncated:false}}}export{computeRelationshipCentrality,findRelationshipCutStructure};
|
|
258
2
|
//# sourceMappingURL=centrality.js.map
|
|
259
|
-
//# debugId=348c9246-2fb9-529e-b627-f60c901a6cf2
|
|
@@ -1,131 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
* @module sdk/graph/conformance
|
|
3
|
-
*
|
|
4
|
-
* Public, sandbox-neutral fixtures and adapter conformance checks. Package
|
|
5
|
-
* authors can run the same semantic contract against an in-memory adapter,
|
|
6
|
-
* Neo4j, a remote service, or another durable graph backend.
|
|
7
|
-
*/
|
|
8
|
-
|
|
9
|
-
!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]="423d6e5d-93e5-5f29-93e0-11ddca9c3156")}catch(e){}}();
|
|
10
|
-
import { MemoryRelationshipGraphAdapter, createRelationshipGraphSnapshot, loadRelationshipGraphAdapter, syncRelationshipGraphAdapter, } from "./adapter.js";
|
|
11
|
-
import { RelationshipGraph, createRelationshipKindRegistry, } from "../relationships.js";
|
|
12
|
-
/** Validate a positive integer fixture bound. */
|
|
13
|
-
function positiveInteger(value, field) {
|
|
14
|
-
if (!Number.isInteger(value) || value < 1)
|
|
15
|
-
throw new TypeError(`Relationship graph ${field} must be a positive integer`);
|
|
16
|
-
return value;
|
|
17
|
-
}
|
|
18
|
-
/** Create a lazy deterministic scale fixture without touching tracker storage. */
|
|
19
|
-
export function createRelationshipGraphScaleFixture(options) {
|
|
20
|
-
const nodeCount = positiveInteger(options.nodeCount, "nodeCount");
|
|
21
|
-
const edgeStride = positiveInteger(options.edgeStride ?? 1, "edgeStride");
|
|
22
|
-
const topology = options.topology ?? "chain";
|
|
23
|
-
if (!["chain", "star", "disconnected"].includes(topology))
|
|
24
|
-
throw new TypeError(`Unsupported relationship graph topology: ${topology}`);
|
|
25
|
-
const kind = (options.kind ?? "related").trim();
|
|
26
|
-
const idPrefix = (options.idPrefix ?? "node").trim();
|
|
27
|
-
if (!kind || !idPrefix)
|
|
28
|
-
throw new TypeError("Relationship graph kind and idPrefix must be non-empty");
|
|
29
|
-
const edgeCount = topology === "disconnected" ? 0 : Math.floor((nodeCount - 1) / edgeStride);
|
|
30
|
-
return {
|
|
31
|
-
node_count: nodeCount,
|
|
32
|
-
edge_count: edgeCount,
|
|
33
|
-
edge_basis: "fixture_generated",
|
|
34
|
-
nodes: {
|
|
35
|
-
*[Symbol.iterator]() {
|
|
36
|
-
for (let index = 0; index < nodeCount; index += 1)
|
|
37
|
-
yield `${idPrefix}-${index}`;
|
|
38
|
-
},
|
|
39
|
-
},
|
|
40
|
-
edges: {
|
|
41
|
-
*[Symbol.iterator]() {
|
|
42
|
-
if (topology === "disconnected")
|
|
43
|
-
return;
|
|
44
|
-
for (let index = edgeStride; index < nodeCount; index += edgeStride)
|
|
45
|
-
yield {
|
|
46
|
-
source: `${idPrefix}-${topology === "star" ? 0 : index - edgeStride}`,
|
|
47
|
-
target: `${idPrefix}-${index}`,
|
|
48
|
-
kind,
|
|
49
|
-
};
|
|
50
|
-
},
|
|
51
|
-
},
|
|
52
|
-
};
|
|
53
|
-
}
|
|
54
|
-
/** Throw a precise conformance failure. */
|
|
55
|
-
function assertConformance(condition, message) {
|
|
56
|
-
if (!condition)
|
|
57
|
-
throw new Error(`Relationship graph adapter conformance: ${message}`);
|
|
58
|
-
}
|
|
59
|
-
/**
|
|
60
|
-
* Exercise empty reads, atomic replacement, isolated reads, idempotent sync,
|
|
61
|
-
* compare-and-swap conflicts, replacement visibility, and optional clearing.
|
|
62
|
-
*/
|
|
63
|
-
export async function assertRelationshipGraphAdapterConformance(adapter, options = {}) {
|
|
64
|
-
const workspace = options.workspace?.trim() || "pm-graph-conformance";
|
|
65
|
-
const registry = createRelationshipKindRegistry();
|
|
66
|
-
const first = createRelationshipGraphSnapshot(new RelationshipGraph(["a", "b"], [{ source: "a", target: "b", kind: "related" }], registry), registry, { createdAt: "2026-01-01T00:00:00.000Z" });
|
|
67
|
-
const second = createRelationshipGraphSnapshot(new RelationshipGraph(["a", "b", "c"], [
|
|
68
|
-
{ source: "a", target: "b", kind: "related" },
|
|
69
|
-
{ source: "b", target: "c", kind: "blocked_by" },
|
|
70
|
-
], registry), registry, { createdAt: "2026-01-02T00:00:00.000Z" });
|
|
71
|
-
const cases = [];
|
|
72
|
-
assertConformance((await loadRelationshipGraphAdapter(adapter, { workspace })) === null, "workspace must start empty");
|
|
73
|
-
cases.push({ name: "empty-read", passed: true });
|
|
74
|
-
const written = await syncRelationshipGraphAdapter(adapter, {
|
|
75
|
-
workspace,
|
|
76
|
-
snapshot: first,
|
|
77
|
-
});
|
|
78
|
-
assertConformance(written.disposition === "written", "first sync must write");
|
|
79
|
-
cases.push({ name: "atomic-replace", passed: true });
|
|
80
|
-
const isolated = (await adapter.read({ workspace }));
|
|
81
|
-
isolated.nodes.push("mutated-reader-copy");
|
|
82
|
-
assertConformance((await loadRelationshipGraphAdapter(adapter, { workspace }))?.snapshot.nodes
|
|
83
|
-
.length === 2, "reads must not mutate stored state");
|
|
84
|
-
cases.push({ name: "read-isolation", passed: true });
|
|
85
|
-
assertConformance((await syncRelationshipGraphAdapter(adapter, {
|
|
86
|
-
workspace,
|
|
87
|
-
snapshot: first,
|
|
88
|
-
})).disposition === "current", "identical sync must be idempotent");
|
|
89
|
-
cases.push({ name: "idempotent-sync", passed: true });
|
|
90
|
-
await adapter.replace({
|
|
91
|
-
workspace,
|
|
92
|
-
snapshot: second,
|
|
93
|
-
expected_fingerprint: first.fingerprint,
|
|
94
|
-
});
|
|
95
|
-
assertConformance((await loadRelationshipGraphAdapter(adapter, { workspace }))?.snapshot
|
|
96
|
-
.fingerprint === second.fingerprint, "replacement must become visible");
|
|
97
|
-
cases.push({ name: "replacement-visibility", passed: true });
|
|
98
|
-
let conflict = false;
|
|
99
|
-
try {
|
|
100
|
-
await adapter.replace({
|
|
101
|
-
workspace,
|
|
102
|
-
snapshot: first,
|
|
103
|
-
expected_fingerprint: first.fingerprint,
|
|
104
|
-
});
|
|
105
|
-
}
|
|
106
|
-
catch {
|
|
107
|
-
conflict = true;
|
|
108
|
-
}
|
|
109
|
-
assertConformance(conflict, "stale compare-and-swap must fail");
|
|
110
|
-
cases.push({ name: "stale-cas", passed: true });
|
|
111
|
-
if (adapter.clear) {
|
|
112
|
-
await adapter.clear({
|
|
113
|
-
workspace,
|
|
114
|
-
expected_fingerprint: second.fingerprint,
|
|
115
|
-
});
|
|
116
|
-
assertConformance((await loadRelationshipGraphAdapter(adapter, { workspace })) === null, "clear must remove the workspace");
|
|
117
|
-
cases.push({ name: "clear", passed: true });
|
|
118
|
-
}
|
|
119
|
-
return {
|
|
120
|
-
adapter: adapter.name,
|
|
121
|
-
workspace,
|
|
122
|
-
cases: Object.freeze(cases),
|
|
123
|
-
clear_supported: adapter.clear !== undefined,
|
|
124
|
-
};
|
|
125
|
-
}
|
|
126
|
-
/** Run the public conformance contract against the built-in reference adapter. */
|
|
127
|
-
export function assertMemoryRelationshipGraphAdapterConformance(workspace) {
|
|
128
|
-
return assertRelationshipGraphAdapterConformance(new MemoryRelationshipGraphAdapter(), workspace ? { workspace } : {});
|
|
129
|
-
}
|
|
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]="9a60b8c0-37d1-5c04-a079-e1351caf6e09")}catch(e2){}})();import{MemoryRelationshipGraphAdapter,createRelationshipGraphSnapshot,loadRelationshipGraphAdapter,syncRelationshipGraphAdapter}from"./adapter.js";import{RelationshipGraph,createRelationshipKindRegistry}from"../relationships.js";function positiveInteger(value,field){if(!Number.isInteger(value)||value<1)throw new TypeError(`Relationship graph ${field} must be a positive integer`);return value}function createRelationshipGraphScaleFixture(options){const nodeCount=positiveInteger(options.nodeCount,"nodeCount");const edgeStride=positiveInteger(options.edgeStride??1,"edgeStride");const topology=options.topology??"chain";if(!["chain","star","disconnected"].includes(topology))throw new TypeError(`Unsupported relationship graph topology: ${topology}`);const kind=(options.kind??"related").trim();const idPrefix=(options.idPrefix??"node").trim();if(!kind||!idPrefix)throw new TypeError("Relationship graph kind and idPrefix must be non-empty");const edgeCount=topology==="disconnected"?0:Math.floor((nodeCount-1)/edgeStride);return{node_count:nodeCount,edge_count:edgeCount,edge_basis:"fixture_generated",nodes:{*[Symbol.iterator](){for(let index=0;index<nodeCount;index+=1)yield`${idPrefix}-${index}`}},edges:{*[Symbol.iterator](){if(topology==="disconnected")return;for(let index=edgeStride;index<nodeCount;index+=edgeStride)yield{source:`${idPrefix}-${topology==="star"?0:index-edgeStride}`,target:`${idPrefix}-${index}`,kind}}}}}function assertConformance(condition,message){if(!condition)throw new Error(`Relationship graph adapter conformance: ${message}`)}async function assertRelationshipGraphAdapterConformance(adapter,options={}){const workspace=options.workspace?.trim()||"pm-graph-conformance";const registry=createRelationshipKindRegistry();const first=createRelationshipGraphSnapshot(new RelationshipGraph(["a","b"],[{source:"a",target:"b",kind:"related"}],registry),registry,{createdAt:"2026-01-01T00:00:00.000Z"});const second=createRelationshipGraphSnapshot(new RelationshipGraph(["a","b","c"],[{source:"a",target:"b",kind:"related"},{source:"b",target:"c",kind:"blocked_by"}],registry),registry,{createdAt:"2026-01-02T00:00:00.000Z"});const cases=[];assertConformance(await loadRelationshipGraphAdapter(adapter,{workspace})===null,"workspace must start empty");cases.push({name:"empty-read",passed:true});const written=await syncRelationshipGraphAdapter(adapter,{workspace,snapshot:first});assertConformance(written.disposition==="written","first sync must write");cases.push({name:"atomic-replace",passed:true});const isolated=await adapter.read({workspace});isolated.nodes.push("mutated-reader-copy");assertConformance((await loadRelationshipGraphAdapter(adapter,{workspace}))?.snapshot.nodes.length===2,"reads must not mutate stored state");cases.push({name:"read-isolation",passed:true});assertConformance((await syncRelationshipGraphAdapter(adapter,{workspace,snapshot:first})).disposition==="current","identical sync must be idempotent");cases.push({name:"idempotent-sync",passed:true});await adapter.replace({workspace,snapshot:second,expected_fingerprint:first.fingerprint});assertConformance((await loadRelationshipGraphAdapter(adapter,{workspace}))?.snapshot.fingerprint===second.fingerprint,"replacement must become visible");cases.push({name:"replacement-visibility",passed:true});let conflict=false;try{await adapter.replace({workspace,snapshot:first,expected_fingerprint:first.fingerprint})}catch{conflict=true}assertConformance(conflict,"stale compare-and-swap must fail");cases.push({name:"stale-cas",passed:true});if(adapter.clear){await adapter.clear({workspace,expected_fingerprint:second.fingerprint});assertConformance(await loadRelationshipGraphAdapter(adapter,{workspace})===null,"clear must remove the workspace");cases.push({name:"clear",passed:true})}return{adapter:adapter.name,workspace,cases:Object.freeze(cases),clear_supported:adapter.clear!==void 0}}function assertMemoryRelationshipGraphAdapterConformance(workspace){return assertRelationshipGraphAdapterConformance(new MemoryRelationshipGraphAdapter,workspace?{workspace}:{})}export{assertMemoryRelationshipGraphAdapterConformance,assertRelationshipGraphAdapterConformance,createRelationshipGraphScaleFixture};
|
|
130
2
|
//# sourceMappingURL=conformance.js.map
|
|
131
|
-
//# debugId=423d6e5d-93e5-5f29-93e0-11ddca9c3156
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module sdk/graph/deadline-scheduling
|
|
3
|
+
* Read-only elapsed-minute scheduling. Independent tasks may execute in parallel;
|
|
4
|
+
* estimates are durations, not resource capacity or business-calendar promises.
|
|
5
|
+
* A bounded Kahn pass isolates cycles and propagates unknown durations explicitly.
|
|
6
|
+
*/
|
|
7
|
+
import type { RelationshipGraph } from "../relationships.js";
|
|
8
|
+
/** Recorded inputs; absent estimates never imply zero duration. */
|
|
9
|
+
export interface DeadlineScheduleItem {
|
|
10
|
+
/** Canonical graph identifier. */
|
|
11
|
+
id: string;
|
|
12
|
+
/** Recorded elapsed-minute duration. */
|
|
13
|
+
estimated_minutes?: number;
|
|
14
|
+
/** Authored ISO deadline interpreted as a finish constraint. */
|
|
15
|
+
deadline?: string;
|
|
16
|
+
}
|
|
17
|
+
/** Deterministic analysis controls and hard work/output bounds. */
|
|
18
|
+
export interface DeadlineScheduleOptions {
|
|
19
|
+
/** Explicit clock instant; defaults to the invocation time. */
|
|
20
|
+
now?: string;
|
|
21
|
+
/** Input nodes plus edges plus items ceiling; also caps total retained path identifiers. */
|
|
22
|
+
maxWork?: number;
|
|
23
|
+
/** Maximum rows, residual samples, findings, and identifiers per finding path. */
|
|
24
|
+
limit?: number;
|
|
25
|
+
/** Cooperative cancellation checked during graph passes. */
|
|
26
|
+
signal?: AbortSignal;
|
|
27
|
+
}
|
|
28
|
+
/** One derived finish constraint and its estimated temporal slack. */
|
|
29
|
+
export interface DeadlineScheduleRow {
|
|
30
|
+
/** Constrained item identifier. */
|
|
31
|
+
id: string;
|
|
32
|
+
/** Controlling authored deadline's item identifier. */
|
|
33
|
+
deadline_id: string;
|
|
34
|
+
/** Derived latest start; never written to the authored item. */
|
|
35
|
+
latest_start: string;
|
|
36
|
+
/** Latest start minus earliest possible start, or null for unknown prerequisites. */
|
|
37
|
+
slack_minutes: number | null;
|
|
38
|
+
}
|
|
39
|
+
/** Explicit evidence that this item's schedule could not be established. */
|
|
40
|
+
export interface DeadlineScheduleResidual {
|
|
41
|
+
/** Unscheduled or incompletely scheduled item. */
|
|
42
|
+
id: string;
|
|
43
|
+
/** Why no feasibility assertion is possible. */
|
|
44
|
+
reason: "unknown_estimate" | "unknown_predecessor_estimate" | "cycle_or_gated_by_cycle" | "invalid_deadline" | "date_range_exceeded";
|
|
45
|
+
}
|
|
46
|
+
/** One authored deadline that cannot accommodate its longest prerequisite chain. */
|
|
47
|
+
export interface DeadlineOvercommitment {
|
|
48
|
+
/** Item carrying the authored deadline. */
|
|
49
|
+
deadline_id: string;
|
|
50
|
+
/** Authored finish constraint. */
|
|
51
|
+
deadline: string;
|
|
52
|
+
/** Positive duration by which earliest finish exceeds the deadline. */
|
|
53
|
+
shortfall_minutes: number;
|
|
54
|
+
/** Bounded suffix of the controlling prerequisite chain, in execution order. */
|
|
55
|
+
path: string[];
|
|
56
|
+
/** Whether the chain exceeds the path output bound. */
|
|
57
|
+
path_truncated: boolean;
|
|
58
|
+
}
|
|
59
|
+
/** Bounded derived schedule, with completeness separate from output truncation. */
|
|
60
|
+
export interface DeadlineScheduleResult {
|
|
61
|
+
/** Reproducible clock used for earliest starts. */
|
|
62
|
+
as_of: string;
|
|
63
|
+
/** Explicit provenance distinguishing computed constraints from authored dates. */
|
|
64
|
+
basis: "derived_elapsed_minutes";
|
|
65
|
+
/** Whether all inputs could be scheduled within the work bound. */
|
|
66
|
+
complete: boolean;
|
|
67
|
+
/** Whether output collections omit computed entries. */
|
|
68
|
+
truncated: boolean;
|
|
69
|
+
/** True when the work bound prevented the graph pass. */
|
|
70
|
+
work_limit_exceeded: boolean;
|
|
71
|
+
/** Number of derived rows before output bounding. */
|
|
72
|
+
scheduled_count: number;
|
|
73
|
+
/** Number of explicit residuals before output bounding. */
|
|
74
|
+
residual_count: number;
|
|
75
|
+
/** Number of infeasible authored deadlines before output bounding. */
|
|
76
|
+
overcommitted_count: number;
|
|
77
|
+
/** Derived latest starts in graph identifier order. */
|
|
78
|
+
rows: DeadlineScheduleRow[];
|
|
79
|
+
/** Bounded incomplete-input and cycle samples. */
|
|
80
|
+
residuals: DeadlineScheduleResidual[];
|
|
81
|
+
/** Bounded deadline shortfall evidence. */
|
|
82
|
+
overcommitted: DeadlineOvercommitment[];
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Derive estimated latest starts and deadline shortfalls without mutating inputs.
|
|
86
|
+
* Work is O(V+E) plus at most maxWork total finding-path identifiers. Unknown predecessors
|
|
87
|
+
* invalidate earliest finish; unknown successors cannot transfer dated bounds.
|
|
88
|
+
* Date-only ISO values denote UTC midnight, consistently with Date.parse.
|
|
89
|
+
*/
|
|
90
|
+
export declare function deriveRelationshipDeadlines(graph: RelationshipGraph, items: readonly DeadlineScheduleItem[], options?: DeadlineScheduleOptions): DeadlineScheduleResult;
|
|
@@ -0,0 +1,2 @@
|
|
|
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]="6b2a7206-d480-51c1-9d46-4271bde24fa3")}catch(e2){}})();import{orientOrderingEdge}from"./traversal.js";function propagateLatest(order,states,signal){for(let index=order.length-1;index>=0;index-=1){signal?.throwIfAborted();const state=states.get(order[index]);for(const id of state.successors){signal?.throwIfAborted();const successor=states.get(id);if(successor.latest===void 0||successor.duration===void 0)continue;const finish=successor.latest-successor.duration;if(state.latest===void 0||finish<state.latest){state.latest=finish;state.anchor=successor.anchor}}}}function deadlinePath(id,states,limit,signal){const reverse=[];let current=id;while(current!==void 0&&reverse.length<limit){signal?.throwIfAborted();reverse.push(current);current=states.get(current).predecessor}reverse.reverse();return{path:reverse,path_truncated:current!==void 0}}function initializeStates(nodes,items,now,residual,signal){const inputs=new Map(items.map(item=>[item.id,item]));const states=new Map;for(const id of nodes){signal?.throwIfAborted();const item=inputs.get(id);const estimate=item?.estimated_minutes;const duration=typeof estimate==="number"&&Number.isFinite(estimate)&&estimate>=0?estimate:void 0;const state={item,duration,pending:0,successors:new Set,earliest:0};if(item?.deadline!==void 0){const date=Date.parse(item.deadline);if(Number.isFinite(date)){state.deadline=(date-now)/6e4;state.latest=state.deadline;state.anchor=id}else residual(id,"invalid_deadline")}states.set(id,state)}return states}function indexScheduleEdges(graph,states,signal){for(const edge of graph.edges()){signal?.throwIfAborted();const definition=graph.registry().require(edge.kind);if(!definition.ordering)continue;const{predecessor,successor}=orientOrderingEdge(edge,definition);const source=states.get(predecessor);if(source.successors.has(successor))continue;source.successors.add(successor);states.get(successor).pending+=1}}function propagateEarliest(nodes,states,signal){const order=nodes.filter(id=>states.get(id).pending===0);for(let index=0;index<order.length;index+=1){signal?.throwIfAborted();const id=order[index];const state=states.get(id);const finish=state.earliest===null||state.duration===void 0?null:state.earliest+state.duration;for(const next of state.successors){signal?.throwIfAborted();const target=states.get(next);if(finish===null)target.earliest=null;else if(target.earliest!==null&&(finish>target.earliest||finish===target.earliest&&(target.predecessor===void 0||id<target.predecessor))){target.earliest=finish;target.predecessor=id}target.pending-=1;if(target.pending===0)order.push(next)}}return order}function collectDatedState(id,state,states,result,now,limit,pathBudget,signal){const duration=state.duration;if(state.latest!==void 0){result.scheduled_count+=1;const latest=state.latest-duration;if(result.rows.length<limit)result.rows.push({id,deadline_id:state.anchor,latest_start:new Date(now+latest*6e4).toISOString(),slack_minutes:state.earliest===null?null:latest-state.earliest});else result.truncated=true}if(state.deadline!==void 0&&state.earliest!==null&&state.earliest+duration>state.deadline){result.overcommitted_count+=1;if(result.overcommitted.length<limit){const evidence=deadlinePath(id,states,Math.min(limit,pathBudget.remaining),signal);pathBudget.remaining-=evidence.path.length;if(evidence.path_truncated)result.truncated=true;result.overcommitted.push({deadline_id:id,deadline:state.item.deadline,shortfall_minutes:state.earliest+duration-state.deadline,...evidence})}else result.truncated=true}}function collectScheduleResult(nodes,states,result,now,limit,maxPathEntries,residual,signal){const pathBudget={remaining:maxPathEntries};for(const id of nodes){signal?.throwIfAborted();const state=states.get(id);if(state.pending>0){residual(id,"cycle_or_gated_by_cycle");continue}if(state.duration===void 0){residual(id,"unknown_estimate");continue}if(state.latest!==void 0&&!Number.isFinite(new Date(now+(state.latest-state.duration)*6e4).getTime())){residual(id,"date_range_exceeded");continue}if(state.earliest===null)residual(id,"unknown_predecessor_estimate");collectDatedState(id,state,states,result,now,limit,pathBudget,signal)}}function deriveRelationshipDeadlines(graph,items,options={}){options.signal?.throwIfAborted();const now=Date.parse(options.now??new Date().toISOString());if(!Number.isFinite(now))throw new TypeError("Invalid scheduling clock");const maxWork=options.maxWork??1e5;const limit=options.limit??10;for(const[name,value]of[["maxWork",maxWork],["limit",limit]]){if(!Number.isSafeInteger(value)||value<1)throw new TypeError(`Invalid scheduling ${name}`)}const result={as_of:new Date(now).toISOString(),basis:"derived_elapsed_minutes",complete:true,truncated:false,work_limit_exceeded:false,scheduled_count:0,residual_count:0,overcommitted_count:0,rows:[],residuals:[],overcommitted:[]};const nodes=graph.nodes();const edges=graph.edges();if(nodes.length+edges.length+items.length>maxWork){return{...result,complete:false,work_limit_exceeded:true}}const residual=(id,reason)=>{result.complete=false;result.residual_count+=1;if(result.residuals.length<limit)result.residuals.push({id,reason});else result.truncated=true};const states=initializeStates(nodes,items,now,residual,options.signal);indexScheduleEdges(graph,states,options.signal);const order=propagateEarliest(nodes,states,options.signal);propagateLatest(order,states,options.signal);collectScheduleResult(nodes,states,result,now,limit,maxWork,residual,options.signal);return result}export{deriveRelationshipDeadlines};
|
|
2
|
+
//# sourceMappingURL=deadline-scheduling.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { type RelationshipAuditSnapshot } from "./governance.js";
|
|
2
2
|
/** Envelope format version; any change invalidates persisted entries. */
|
|
3
|
-
export declare const GRAPH_DURABLE_CACHE_VERSION =
|
|
3
|
+
export declare const GRAPH_DURABLE_CACHE_VERSION = 2;
|
|
4
4
|
/** Workspaces below this item count skip implicit persistence. */
|
|
5
5
|
export declare const GRAPH_DURABLE_CACHE_MIN_ITEMS = 500;
|
|
6
6
|
/** Persisted durable graph cache envelope keyed by one workspace fingerprint. */
|