@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,427 +1,3 @@
|
|
|
1
|
-
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
* Rebuildable, cursor-stamped feature-store primitives for context relevance.
|
|
5
|
-
* Snapshots are derived read artifacts: callers retain authoritative items and
|
|
6
|
-
* history, while stale, absent, or corrupt snapshots rebuild transparently.
|
|
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]="9b112b71-e0b8-5502-89f6-b4da6eb85f6b")}catch(e){}}();
|
|
10
|
-
import { isFileAbsentError } from "../core/fs/fs-utils.js";
|
|
11
|
-
import fs from "node:fs/promises";
|
|
12
|
-
import path from "node:path";
|
|
13
|
-
import { createHash, randomUUID } from "node:crypto";
|
|
14
|
-
import { buildItemContextRelevanceCandidates, } from "./context-relevance.js";
|
|
15
|
-
import { readItemMetadataDerivedIndexState } from "./item-metadata-index.js";
|
|
16
|
-
import { readLatestSubstantiveHistoryEvents } from "../core/history/event-index.js";
|
|
17
|
-
import { canonicalizeContextRecencyCoordinate } from "./context/recency.js";
|
|
18
|
-
/** Current serialized feature-store envelope version. */
|
|
19
|
-
export const CONTEXT_SIGNAL_STORE_FORMAT_VERSION = 3;
|
|
20
|
-
/** Current canonical signal-vector version. */
|
|
21
|
-
export const CONTEXT_SIGNAL_SET_VERSION = 2;
|
|
22
|
-
const STORED_CONTEXT_SIGNAL_NAMES = [
|
|
23
|
-
"recency",
|
|
24
|
-
"activity_density",
|
|
25
|
-
"graph_proximity",
|
|
26
|
-
"priority_pressure",
|
|
27
|
-
"risk_pressure",
|
|
28
|
-
"knowledge_density",
|
|
29
|
-
];
|
|
30
|
-
const CONTEXT_RECENCY_SOURCES = new Set([
|
|
31
|
-
"substantive_history",
|
|
32
|
-
"release_cohort",
|
|
33
|
-
"created_at",
|
|
34
|
-
]);
|
|
35
|
-
/** Canonical actionable contracts shared by CLI, SDK, MCP, and package hosts. */
|
|
36
|
-
export const CONTEXT_SIGNAL_STORE_WARNING_DETAILS = {
|
|
37
|
-
context_signal_store_invalid: {
|
|
38
|
-
code: "context_signal_store_invalid",
|
|
39
|
-
meaning: "The persisted context-signal snapshot was unreadable or invalid and was rebuilt from authoritative items.",
|
|
40
|
-
recovery_command: "pm context",
|
|
41
|
-
recovery_effect: "Re-read context and confirm the rebuilt snapshot can be loaded without the warning.",
|
|
42
|
-
},
|
|
43
|
-
context_signal_store_stale: {
|
|
44
|
-
code: "context_signal_store_stale",
|
|
45
|
-
meaning: "The persisted context-signal snapshot did not match the authoritative cursor or item corpus and was rebuilt.",
|
|
46
|
-
recovery_command: "pm context",
|
|
47
|
-
recovery_effect: "Re-read context and confirm the rebuilt snapshot is now fresh.",
|
|
48
|
-
},
|
|
49
|
-
context_signal_store_write_failed: {
|
|
50
|
-
code: "context_signal_store_write_failed",
|
|
51
|
-
meaning: "Context signals were rebuilt in memory, but the derived snapshot could not be persisted.",
|
|
52
|
-
recovery_command: "pm context",
|
|
53
|
-
recovery_effect: "Retry the derived snapshot write and confirm the warning clears after storage access is restored.",
|
|
54
|
-
},
|
|
55
|
-
};
|
|
56
|
-
function isRecord(value) {
|
|
57
|
-
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
58
|
-
}
|
|
59
|
-
function isNormalizedSignal(value) {
|
|
60
|
-
return (typeof value === "number" &&
|
|
61
|
-
Number.isFinite(value) &&
|
|
62
|
-
value >= 0 &&
|
|
63
|
-
value <= 1);
|
|
64
|
-
}
|
|
65
|
-
function compactSignals(signals) {
|
|
66
|
-
const compact = {};
|
|
67
|
-
for (const name of STORED_CONTEXT_SIGNAL_NAMES) {
|
|
68
|
-
const value = signals[name];
|
|
69
|
-
if (value === undefined)
|
|
70
|
-
continue;
|
|
71
|
-
if (!isNormalizedSignal(value)) {
|
|
72
|
-
throw new TypeError(`Context relevance signal ${name} must be a finite number from 0 to 1`);
|
|
73
|
-
}
|
|
74
|
-
compact[name] = value;
|
|
75
|
-
}
|
|
76
|
-
return compact;
|
|
77
|
-
}
|
|
78
|
-
function normalizedCountsById(items, count) {
|
|
79
|
-
const counts = items.map((item) => [item.id, count(item)]);
|
|
80
|
-
const maximum = Math.max(0, ...counts.map(([, value]) => value));
|
|
81
|
-
return Object.fromEntries(counts.map(([id, value]) => [id, maximum === 0 ? 0 : value / maximum]));
|
|
82
|
-
}
|
|
83
|
-
function deriveGraphProximity(items) {
|
|
84
|
-
const degree = new Map(items.map((item) => [item.id, 0]));
|
|
85
|
-
const increment = (id) => {
|
|
86
|
-
degree.set(id, (degree.get(id) ?? 0) + 1);
|
|
87
|
-
};
|
|
88
|
-
for (const item of items) {
|
|
89
|
-
if (typeof item.parent === "string" && item.parent.trim()) {
|
|
90
|
-
increment(item.id);
|
|
91
|
-
increment(item.parent.trim());
|
|
92
|
-
}
|
|
93
|
-
for (const dependency of item.dependencies ?? []) {
|
|
94
|
-
if (typeof dependency.id !== "string" || !dependency.id.trim())
|
|
95
|
-
continue;
|
|
96
|
-
increment(item.id);
|
|
97
|
-
increment(dependency.id.trim());
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
const maximum = Math.max(0, ...degree.values());
|
|
101
|
-
return Object.fromEntries(items.map((item) => [
|
|
102
|
-
item.id,
|
|
103
|
-
maximum === 0 ? 0 : degree.get(item.id) / maximum,
|
|
104
|
-
]));
|
|
105
|
-
}
|
|
106
|
-
function stableSnapshotOptions(items, options) {
|
|
107
|
-
return {
|
|
108
|
-
...options,
|
|
109
|
-
activityDensity: options.activityDensity ??
|
|
110
|
-
normalizedCountsById(items, (item) => (item.comments?.length ?? 0) +
|
|
111
|
-
(item.notes?.length ?? 0) +
|
|
112
|
-
(item.learnings?.length ?? 0) +
|
|
113
|
-
(item.test_runs?.length ?? 0)),
|
|
114
|
-
graphProximity: options.graphProximity ?? deriveGraphProximity(items),
|
|
115
|
-
};
|
|
116
|
-
}
|
|
117
|
-
function recencyEvidenceFingerprint(candidates) {
|
|
118
|
-
const hash = createHash("sha256");
|
|
119
|
-
for (const { id, signal_provenance: { recency: evidence }, } of [...candidates].sort((left, right) => left.id.localeCompare(right.id))) {
|
|
120
|
-
hash.update(JSON.stringify([
|
|
121
|
-
id,
|
|
122
|
-
evidence.source,
|
|
123
|
-
evidence.coordinate,
|
|
124
|
-
evidence.history_op ?? null,
|
|
125
|
-
evidence.event_class ?? null,
|
|
126
|
-
]));
|
|
127
|
-
}
|
|
128
|
-
return `sha256:${hash.digest("hex")}`;
|
|
129
|
-
}
|
|
130
|
-
function parseSnapshotItem(value) {
|
|
131
|
-
if (!isRecord(value))
|
|
132
|
-
return null;
|
|
133
|
-
const signalProvenance = value.signal_provenance;
|
|
134
|
-
if (![
|
|
135
|
-
typeof value.id === "string",
|
|
136
|
-
isRecord(value.signals),
|
|
137
|
-
isRecord(signalProvenance),
|
|
138
|
-
].every(Boolean))
|
|
139
|
-
return null;
|
|
140
|
-
const recency = signalProvenance.recency;
|
|
141
|
-
if (!isRecord(recency))
|
|
142
|
-
return null;
|
|
143
|
-
const coordinate = canonicalizeContextRecencyCoordinate(recency.coordinate);
|
|
144
|
-
if (coordinate === null)
|
|
145
|
-
return null;
|
|
146
|
-
const supportedSignals = new Set(STORED_CONTEXT_SIGNAL_NAMES);
|
|
147
|
-
const signalEntries = Object.entries(value.signals);
|
|
148
|
-
if (!signalEntries.every(([name, signal]) => supportedSignals.has(name) && isNormalizedSignal(signal))) {
|
|
149
|
-
return null;
|
|
150
|
-
}
|
|
151
|
-
if (![
|
|
152
|
-
typeof recency.source === "string" &&
|
|
153
|
-
CONTEXT_RECENCY_SOURCES.has(recency.source),
|
|
154
|
-
["undefined", "string"].includes(typeof recency.history_op),
|
|
155
|
-
[undefined, "substantive", "maintenance"].includes(recency.event_class),
|
|
156
|
-
recency.source === "substantive_history"
|
|
157
|
-
? recency.event_class === undefined ||
|
|
158
|
-
recency.event_class === "substantive"
|
|
159
|
-
: recency.history_op === undefined && recency.event_class === undefined,
|
|
160
|
-
].every(Boolean)) {
|
|
161
|
-
return null;
|
|
162
|
-
}
|
|
163
|
-
return {
|
|
164
|
-
id: value.id,
|
|
165
|
-
signals: Object.fromEntries(signalEntries),
|
|
166
|
-
signal_provenance: {
|
|
167
|
-
recency: {
|
|
168
|
-
source: recency.source,
|
|
169
|
-
coordinate,
|
|
170
|
-
history_op: recency.history_op,
|
|
171
|
-
event_class: recency.event_class,
|
|
172
|
-
},
|
|
173
|
-
},
|
|
174
|
-
};
|
|
175
|
-
}
|
|
176
|
-
function parseSnapshotItems(values, expectedRecencyEvidenceFingerprint) {
|
|
177
|
-
const items = Array.from(values, parseSnapshotItem);
|
|
178
|
-
if (items.some((item) => item === null))
|
|
179
|
-
return null;
|
|
180
|
-
const validItems = items;
|
|
181
|
-
if (new Set(validItems.map((item) => item.id)).size !== validItems.length ||
|
|
182
|
-
validItems.some((item) => item.id.trim().length === 0) ||
|
|
183
|
-
expectedRecencyEvidenceFingerprint !==
|
|
184
|
-
recencyEvidenceFingerprint(validItems)) {
|
|
185
|
-
return null;
|
|
186
|
-
}
|
|
187
|
-
return validItems.sort((left, right) => left.id.localeCompare(right.id));
|
|
188
|
-
}
|
|
189
|
-
/** Validate an untrusted serialized snapshot without accepting partial envelopes. */
|
|
190
|
-
export function parseContextSignalSnapshot(value) {
|
|
191
|
-
if (!isRecord(value) ||
|
|
192
|
-
value.format_version !== CONTEXT_SIGNAL_STORE_FORMAT_VERSION ||
|
|
193
|
-
value.signal_set_version !== CONTEXT_SIGNAL_SET_VERSION ||
|
|
194
|
-
typeof value.source_cursor !== "string" ||
|
|
195
|
-
value.source_cursor.trim().length === 0 ||
|
|
196
|
-
typeof value.recency_evidence_fingerprint !== "string" ||
|
|
197
|
-
!/^sha256:[a-f0-9]{64}$/u.test(value.recency_evidence_fingerprint) ||
|
|
198
|
-
typeof value.generated_at !== "string" ||
|
|
199
|
-
!Number.isFinite(Date.parse(value.generated_at)) ||
|
|
200
|
-
(value.source !== "derived_index" && value.source !== "scan_fallback") ||
|
|
201
|
-
!Array.isArray(value.items)) {
|
|
202
|
-
return null;
|
|
203
|
-
}
|
|
204
|
-
const items = parseSnapshotItems(value.items, value.recency_evidence_fingerprint);
|
|
205
|
-
if (items === null)
|
|
206
|
-
return null;
|
|
207
|
-
return {
|
|
208
|
-
format_version: CONTEXT_SIGNAL_STORE_FORMAT_VERSION,
|
|
209
|
-
signal_set_version: CONTEXT_SIGNAL_SET_VERSION,
|
|
210
|
-
source_cursor: value.source_cursor,
|
|
211
|
-
recency_evidence_fingerprint: value.recency_evidence_fingerprint,
|
|
212
|
-
generated_at: value.generated_at,
|
|
213
|
-
source: value.source,
|
|
214
|
-
items,
|
|
215
|
-
};
|
|
216
|
-
}
|
|
217
|
-
function validateSnapshotOptions(options) {
|
|
218
|
-
if (typeof options.sourceCursor !== "string" ||
|
|
219
|
-
options.sourceCursor.trim().length === 0) {
|
|
220
|
-
throw new TypeError("Context signal source cursor must be non-empty");
|
|
221
|
-
}
|
|
222
|
-
if (!Number.isFinite(Date.parse(options.now))) {
|
|
223
|
-
throw new TypeError("Context signal snapshot clock must be a valid timestamp");
|
|
224
|
-
}
|
|
225
|
-
if (options.source !== "derived_index" &&
|
|
226
|
-
options.source !== "scan_fallback") {
|
|
227
|
-
throw new TypeError("Context signal snapshot source must be derived_index or scan_fallback");
|
|
228
|
-
}
|
|
229
|
-
}
|
|
230
|
-
function snapshotFromCandidates(candidates, options, fingerprint = recencyEvidenceFingerprint(candidates)) {
|
|
231
|
-
const candidateIds = candidates.map(({ id }) => id);
|
|
232
|
-
if (new Set(candidateIds).size !== candidateIds.length ||
|
|
233
|
-
candidateIds.some((id) => id.trim().length === 0)) {
|
|
234
|
-
throw new TypeError("Context signal snapshot item IDs must be unique and non-empty");
|
|
235
|
-
}
|
|
236
|
-
const rows = candidates
|
|
237
|
-
.map(({ id, signals, signal_provenance }) => ({
|
|
238
|
-
id,
|
|
239
|
-
signals: compactSignals(signals),
|
|
240
|
-
signal_provenance,
|
|
241
|
-
}))
|
|
242
|
-
.sort((left, right) => left.id.localeCompare(right.id));
|
|
243
|
-
return Object.freeze({
|
|
244
|
-
format_version: CONTEXT_SIGNAL_STORE_FORMAT_VERSION,
|
|
245
|
-
signal_set_version: CONTEXT_SIGNAL_SET_VERSION,
|
|
246
|
-
source_cursor: options.sourceCursor,
|
|
247
|
-
recency_evidence_fingerprint: fingerprint,
|
|
248
|
-
generated_at: options.now,
|
|
249
|
-
source: options.source,
|
|
250
|
-
items: Object.freeze(rows.map((row) => Object.freeze(row))),
|
|
251
|
-
});
|
|
252
|
-
}
|
|
253
|
-
/** Fold authoritative items into a deterministic, immutable signal snapshot. */
|
|
254
|
-
export function buildContextSignalSnapshot(items, options) {
|
|
255
|
-
validateSnapshotOptions(options);
|
|
256
|
-
return snapshotFromCandidates(buildItemContextRelevanceCandidates(items, stableSnapshotOptions(items, options)), options);
|
|
257
|
-
}
|
|
258
|
-
/** Filesystem adapter using same-directory atomic replacement. */
|
|
259
|
-
export class JsonFileContextSignalStoreAdapter {
|
|
260
|
-
filePath;
|
|
261
|
-
/** Create an adapter for an explicit derived-state file path. */
|
|
262
|
-
constructor(filePath) {
|
|
263
|
-
if (typeof filePath !== "string" || filePath.trim().length === 0) {
|
|
264
|
-
throw new TypeError("Context signal store path must be non-empty");
|
|
265
|
-
}
|
|
266
|
-
this.filePath = path.resolve(filePath);
|
|
267
|
-
}
|
|
268
|
-
/** Read and decode the JSON snapshot, returning null when it does not exist. */
|
|
269
|
-
async read() {
|
|
270
|
-
try {
|
|
271
|
-
return JSON.parse(await fs.readFile(this.filePath, "utf8"));
|
|
272
|
-
}
|
|
273
|
-
catch (error) {
|
|
274
|
-
if (isRecord(error) && isFileAbsentError(error)) {
|
|
275
|
-
return null;
|
|
276
|
-
}
|
|
277
|
-
throw error;
|
|
278
|
-
}
|
|
279
|
-
}
|
|
280
|
-
/** Write a complete snapshot through a unique same-directory temporary file. */
|
|
281
|
-
async write(snapshot) {
|
|
282
|
-
const directory = path.dirname(this.filePath);
|
|
283
|
-
await fs.mkdir(directory, { recursive: true });
|
|
284
|
-
const temporaryPath = path.join(directory, `.${path.basename(this.filePath)}.${randomUUID()}.tmp`);
|
|
285
|
-
try {
|
|
286
|
-
await fs.writeFile(temporaryPath, `${JSON.stringify(snapshot)}\n`, {
|
|
287
|
-
encoding: "utf8",
|
|
288
|
-
flag: "wx",
|
|
289
|
-
});
|
|
290
|
-
await fs.rename(temporaryPath, this.filePath);
|
|
291
|
-
}
|
|
292
|
-
finally {
|
|
293
|
-
try {
|
|
294
|
-
await fs.rm(temporaryPath, { force: true });
|
|
295
|
-
}
|
|
296
|
-
catch {
|
|
297
|
-
// The complete snapshot is already committed; temporary-file cleanup is best effort.
|
|
298
|
-
}
|
|
299
|
-
}
|
|
300
|
-
}
|
|
301
|
-
}
|
|
302
|
-
/** Cursor-aware feature store that self-heals from absent, stale, or corrupt state. */
|
|
303
|
-
export class ContextSignalStore {
|
|
304
|
-
adapter;
|
|
305
|
-
/** Bind the store to a caller-selected persistence adapter. */
|
|
306
|
-
constructor(adapter) {
|
|
307
|
-
this.adapter = adapter;
|
|
308
|
-
}
|
|
309
|
-
/** Read matching signals or rebuild them from authoritative items. */
|
|
310
|
-
async readOrRebuild(items, options) {
|
|
311
|
-
validateSnapshotOptions(options);
|
|
312
|
-
const warnings = [];
|
|
313
|
-
let snapshot = null;
|
|
314
|
-
try {
|
|
315
|
-
const serialized = await this.adapter.read();
|
|
316
|
-
snapshot = parseContextSignalSnapshot(serialized);
|
|
317
|
-
if (serialized !== null && snapshot === null) {
|
|
318
|
-
warnings.push("context_signal_store_invalid");
|
|
319
|
-
}
|
|
320
|
-
}
|
|
321
|
-
catch {
|
|
322
|
-
warnings.push("context_signal_store_invalid");
|
|
323
|
-
}
|
|
324
|
-
const authoritativeIds = items
|
|
325
|
-
.map((item) => item.id)
|
|
326
|
-
.sort((left, right) => left.localeCompare(right));
|
|
327
|
-
const snapshotIds = snapshot?.items.map((item) => item.id) ?? [];
|
|
328
|
-
const authoritativeCandidates = buildItemContextRelevanceCandidates(items, stableSnapshotOptions(items, options));
|
|
329
|
-
const authoritativeFingerprint = recencyEvidenceFingerprint(authoritativeCandidates);
|
|
330
|
-
const fresh = snapshot !== null &&
|
|
331
|
-
snapshot.source_cursor === options.sourceCursor &&
|
|
332
|
-
snapshot.recency_evidence_fingerprint === authoritativeFingerprint &&
|
|
333
|
-
snapshot.source === options.source &&
|
|
334
|
-
snapshotIds.length === authoritativeIds.length &&
|
|
335
|
-
snapshotIds.every((id, index) => id === authoritativeIds[index]);
|
|
336
|
-
let resolvedSnapshot;
|
|
337
|
-
if (fresh && snapshot !== null) {
|
|
338
|
-
resolvedSnapshot = snapshot;
|
|
339
|
-
}
|
|
340
|
-
else {
|
|
341
|
-
if (snapshot !== null) {
|
|
342
|
-
warnings.push("context_signal_store_stale");
|
|
343
|
-
}
|
|
344
|
-
resolvedSnapshot = snapshotFromCandidates(authoritativeCandidates, options, authoritativeFingerprint);
|
|
345
|
-
try {
|
|
346
|
-
await this.adapter.write(resolvedSnapshot);
|
|
347
|
-
}
|
|
348
|
-
catch {
|
|
349
|
-
warnings.push("context_signal_store_write_failed");
|
|
350
|
-
}
|
|
351
|
-
}
|
|
352
|
-
const snapshotItemsById = new Map(resolvedSnapshot.items.map((item) => [item.id, item]));
|
|
353
|
-
return {
|
|
354
|
-
snapshot: resolvedSnapshot,
|
|
355
|
-
candidates: authoritativeCandidates.map((candidate) => ({
|
|
356
|
-
...candidate,
|
|
357
|
-
signals: {
|
|
358
|
-
...candidate.signals,
|
|
359
|
-
...snapshotItemsById.get(candidate.id)?.signals,
|
|
360
|
-
},
|
|
361
|
-
signal_provenance: snapshotItemsById.get(candidate.id).signal_provenance,
|
|
362
|
-
})),
|
|
363
|
-
cache_status: fresh ? "fresh" : "rebuilt",
|
|
364
|
-
warnings,
|
|
365
|
-
warning_details: warnings.map((warning) => CONTEXT_SIGNAL_STORE_WARNING_DETAILS[warning]),
|
|
366
|
-
};
|
|
367
|
-
}
|
|
368
|
-
}
|
|
369
|
-
function fallbackWorkspaceCursor(items) {
|
|
370
|
-
const hash = createHash("sha256");
|
|
371
|
-
for (const item of [...items].sort((left, right) => left.id.localeCompare(right.id))) {
|
|
372
|
-
hash.update(JSON.stringify([
|
|
373
|
-
item.id,
|
|
374
|
-
item.updated_at,
|
|
375
|
-
item.status,
|
|
376
|
-
item.parent ?? null,
|
|
377
|
-
item.priority ?? null,
|
|
378
|
-
item.risk ?? null,
|
|
379
|
-
(item.dependencies ?? []).map((dependency) => dependency.id).sort(),
|
|
380
|
-
item.comments?.length ?? 0,
|
|
381
|
-
item.notes?.length ?? 0,
|
|
382
|
-
item.learnings?.length ?? 0,
|
|
383
|
-
item.test_runs?.length ?? 0,
|
|
384
|
-
]));
|
|
385
|
-
}
|
|
386
|
-
return `scan:${hash.digest("hex")}`;
|
|
387
|
-
}
|
|
388
|
-
/** Read cursor-bound workspace signals with deterministic scan fallback. */
|
|
389
|
-
export async function readWorkspaceContextSignals(items, options) {
|
|
390
|
-
const hasSourceCursor = options.sourceCursor !== undefined;
|
|
391
|
-
const hasSource = options.source !== undefined;
|
|
392
|
-
if (hasSourceCursor !== hasSource) {
|
|
393
|
-
throw new TypeError("Context signal source and source cursor must be provided together");
|
|
394
|
-
}
|
|
395
|
-
if (options.storeKey !== undefined &&
|
|
396
|
-
!/^[a-z0-9](?:[a-z0-9_-]*[a-z0-9])?$/u.test(options.storeKey)) {
|
|
397
|
-
throw new TypeError("Context signal store key must be a filesystem-safe identifier");
|
|
398
|
-
}
|
|
399
|
-
const indexState = hasSourceCursor
|
|
400
|
-
? null
|
|
401
|
-
: await readItemMetadataDerivedIndexState(options.pmRoot);
|
|
402
|
-
const sourceCursor = options.sourceCursor ??
|
|
403
|
-
indexState?.source_cursor ??
|
|
404
|
-
fallbackWorkspaceCursor(items);
|
|
405
|
-
const source = options.source ?? (indexState === null ? "scan_fallback" : "derived_index");
|
|
406
|
-
const store = new ContextSignalStore(new JsonFileContextSignalStoreAdapter(path.join(options.pmRoot, "runtime", options.storeKey
|
|
407
|
-
? `context-signals-${options.storeKey}.json`
|
|
408
|
-
: "context-signals.json")));
|
|
409
|
-
const recencyEvidence = options.recencyEvidence ??
|
|
410
|
-
Object.fromEntries(Object.entries(await readLatestSubstantiveHistoryEvents(options.pmRoot, items.map((item) => item.id))).map(([id, event]) => [
|
|
411
|
-
id,
|
|
412
|
-
{
|
|
413
|
-
source: "substantive_history",
|
|
414
|
-
coordinate: event.entry.ts,
|
|
415
|
-
history_op: event.entry.op,
|
|
416
|
-
event_class: "substantive",
|
|
417
|
-
},
|
|
418
|
-
]));
|
|
419
|
-
return store.readOrRebuild(items, {
|
|
420
|
-
...options,
|
|
421
|
-
recencyEvidence,
|
|
422
|
-
sourceCursor,
|
|
423
|
-
source,
|
|
424
|
-
});
|
|
425
|
-
}
|
|
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]="190679b7-4723-5c76-be57-2ec88b92b109")}catch(e2){}})();import{isFileAbsentError}from"../core/fs/fs-utils.js";import fs from"node:fs/promises";import path from"node:path";import{createHash,randomUUID}from"node:crypto";import{buildItemContextRelevanceCandidates}from"./context-relevance.js";import{readItemMetadataDerivedIndexState}from"./item-metadata-index.js";import{readLatestSubstantiveHistoryEvents}from"../core/history/event-index.js";import{canonicalizeContextRecencyCoordinate}from"./context/recency.js";const CONTEXT_SIGNAL_STORE_FORMAT_VERSION=3;const CONTEXT_SIGNAL_SET_VERSION=2;const STORED_CONTEXT_SIGNAL_NAMES=["recency","activity_density","graph_proximity","priority_pressure","risk_pressure","knowledge_density"];const CONTEXT_RECENCY_SOURCES=new Set(["substantive_history","release_cohort","created_at"]);const CONTEXT_SIGNAL_STORE_WARNING_DETAILS={context_signal_store_invalid:{code:"context_signal_store_invalid",meaning:"The persisted context-signal snapshot was unreadable or invalid and was rebuilt from authoritative items.",recovery_command:"pm context",recovery_effect:"Re-read context and confirm the rebuilt snapshot can be loaded without the warning."},context_signal_store_stale:{code:"context_signal_store_stale",meaning:"The persisted context-signal snapshot did not match the authoritative cursor or item corpus and was rebuilt.",recovery_command:"pm context",recovery_effect:"Re-read context and confirm the rebuilt snapshot is now fresh."},context_signal_store_write_failed:{code:"context_signal_store_write_failed",meaning:"Context signals were rebuilt in memory, but the derived snapshot could not be persisted.",recovery_command:"pm context",recovery_effect:"Retry the derived snapshot write and confirm the warning clears after storage access is restored."}};function isRecord(value){return typeof value==="object"&&value!==null&&!Array.isArray(value)}function isNormalizedSignal(value){return typeof value==="number"&&Number.isFinite(value)&&value>=0&&value<=1}function compactSignals(signals){const compact={};for(const name of STORED_CONTEXT_SIGNAL_NAMES){const value=signals[name];if(value===void 0)continue;if(!isNormalizedSignal(value)){throw new TypeError(`Context relevance signal ${name} must be a finite number from 0 to 1`)}compact[name]=value}return compact}function normalizedCountsById(items,count){const counts=items.map(item=>[item.id,count(item)]);const maximum=Math.max(0,...counts.map(([,value])=>value));return Object.fromEntries(counts.map(([id,value])=>[id,maximum===0?0:value/maximum]))}function deriveGraphProximity(items){const degree=new Map(items.map(item=>[item.id,0]));const increment=id=>{degree.set(id,(degree.get(id)??0)+1)};for(const item of items){if(typeof item.parent==="string"&&item.parent.trim()){increment(item.id);increment(item.parent.trim())}for(const dependency of item.dependencies??[]){if(typeof dependency.id!=="string"||!dependency.id.trim())continue;increment(item.id);increment(dependency.id.trim())}}const maximum=Math.max(0,...degree.values());return Object.fromEntries(items.map(item=>[item.id,maximum===0?0:degree.get(item.id)/maximum]))}function stableSnapshotOptions(items,options){return{...options,activityDensity:options.activityDensity??normalizedCountsById(items,item=>(item.comments?.length??0)+(item.notes?.length??0)+(item.learnings?.length??0)+(item.test_runs?.length??0)),graphProximity:options.graphProximity??deriveGraphProximity(items)}}function recencyEvidenceFingerprint(candidates){const hash=createHash("sha256");for(const{id,signal_provenance:{recency:evidence}}of[...candidates].sort((left,right)=>left.id.localeCompare(right.id))){hash.update(JSON.stringify([id,evidence.source,evidence.coordinate,evidence.history_op??null,evidence.event_class??null]))}return`sha256:${hash.digest("hex")}`}function parseSnapshotItem(value){if(!isRecord(value))return null;const signalProvenance=value.signal_provenance;if(![typeof value.id==="string",isRecord(value.signals),isRecord(signalProvenance)].every(Boolean))return null;const recency=signalProvenance.recency;if(!isRecord(recency))return null;const coordinate=canonicalizeContextRecencyCoordinate(recency.coordinate);if(coordinate===null)return null;const supportedSignals=new Set(STORED_CONTEXT_SIGNAL_NAMES);const signalEntries=Object.entries(value.signals);if(!signalEntries.every(([name,signal])=>supportedSignals.has(name)&&isNormalizedSignal(signal))){return null}if(![typeof recency.source==="string"&&CONTEXT_RECENCY_SOURCES.has(recency.source),["undefined","string"].includes(typeof recency.history_op),[void 0,"substantive","maintenance"].includes(recency.event_class),recency.source==="substantive_history"?recency.event_class===void 0||recency.event_class==="substantive":recency.history_op===void 0&&recency.event_class===void 0].every(Boolean)){return null}return{id:value.id,signals:Object.fromEntries(signalEntries),signal_provenance:{recency:{source:recency.source,coordinate,history_op:recency.history_op,event_class:recency.event_class}}}}function parseSnapshotItems(values,expectedRecencyEvidenceFingerprint){const items=Array.from(values,parseSnapshotItem);if(items.some(item=>item===null))return null;const validItems=items;if(new Set(validItems.map(item=>item.id)).size!==validItems.length||validItems.some(item=>item.id.trim().length===0)||expectedRecencyEvidenceFingerprint!==recencyEvidenceFingerprint(validItems)){return null}return validItems.sort((left,right)=>left.id.localeCompare(right.id))}function parseContextSignalSnapshot(value){if(!isRecord(value)||value.format_version!==CONTEXT_SIGNAL_STORE_FORMAT_VERSION||value.signal_set_version!==CONTEXT_SIGNAL_SET_VERSION||typeof value.source_cursor!=="string"||value.source_cursor.trim().length===0||typeof value.recency_evidence_fingerprint!=="string"||!/^sha256:[a-f0-9]{64}$/u.test(value.recency_evidence_fingerprint)||typeof value.generated_at!=="string"||!Number.isFinite(Date.parse(value.generated_at))||value.source!=="derived_index"&&value.source!=="scan_fallback"||!Array.isArray(value.items)){return null}const items=parseSnapshotItems(value.items,value.recency_evidence_fingerprint);if(items===null)return null;return{format_version:CONTEXT_SIGNAL_STORE_FORMAT_VERSION,signal_set_version:CONTEXT_SIGNAL_SET_VERSION,source_cursor:value.source_cursor,recency_evidence_fingerprint:value.recency_evidence_fingerprint,generated_at:value.generated_at,source:value.source,items}}function validateSnapshotOptions(options){if(typeof options.sourceCursor!=="string"||options.sourceCursor.trim().length===0){throw new TypeError("Context signal source cursor must be non-empty")}if(!Number.isFinite(Date.parse(options.now))){throw new TypeError("Context signal snapshot clock must be a valid timestamp")}if(options.source!=="derived_index"&&options.source!=="scan_fallback"){throw new TypeError("Context signal snapshot source must be derived_index or scan_fallback")}}function snapshotFromCandidates(candidates,options,fingerprint=recencyEvidenceFingerprint(candidates)){const candidateIds=candidates.map(({id})=>id);if(new Set(candidateIds).size!==candidateIds.length||candidateIds.some(id=>id.trim().length===0)){throw new TypeError("Context signal snapshot item IDs must be unique and non-empty")}const rows=candidates.map(({id,signals,signal_provenance})=>({id,signals:compactSignals(signals),signal_provenance})).sort((left,right)=>left.id.localeCompare(right.id));return Object.freeze({format_version:CONTEXT_SIGNAL_STORE_FORMAT_VERSION,signal_set_version:CONTEXT_SIGNAL_SET_VERSION,source_cursor:options.sourceCursor,recency_evidence_fingerprint:fingerprint,generated_at:options.now,source:options.source,items:Object.freeze(rows.map(row=>Object.freeze(row)))})}function buildContextSignalSnapshot(items,options){validateSnapshotOptions(options);return snapshotFromCandidates(buildItemContextRelevanceCandidates(items,stableSnapshotOptions(items,options)),options)}class JsonFileContextSignalStoreAdapter{filePath;constructor(filePath){if(typeof filePath!=="string"||filePath.trim().length===0){throw new TypeError("Context signal store path must be non-empty")}this.filePath=path.resolve(filePath)}async read(){try{return JSON.parse(await fs.readFile(this.filePath,"utf8"))}catch(error){if(isRecord(error)&&isFileAbsentError(error)){return null}throw error}}async write(snapshot){const directory=path.dirname(this.filePath);await fs.mkdir(directory,{recursive:true});const temporaryPath=path.join(directory,`.${path.basename(this.filePath)}.${randomUUID()}.tmp`);try{await fs.writeFile(temporaryPath,`${JSON.stringify(snapshot)}
|
|
2
|
+
`,{encoding:"utf8",flag:"wx"});await fs.rename(temporaryPath,this.filePath)}finally{try{await fs.rm(temporaryPath,{force:true})}catch{}}}}class ContextSignalStore{adapter;constructor(adapter){this.adapter=adapter}async readOrRebuild(items,options){validateSnapshotOptions(options);const warnings=[];let snapshot=null;try{const serialized=await this.adapter.read();snapshot=parseContextSignalSnapshot(serialized);if(serialized!==null&&snapshot===null){warnings.push("context_signal_store_invalid")}}catch{warnings.push("context_signal_store_invalid")}const authoritativeIds=items.map(item=>item.id).sort((left,right)=>left.localeCompare(right));const snapshotIds=snapshot?.items.map(item=>item.id)??[];const authoritativeCandidates=buildItemContextRelevanceCandidates(items,stableSnapshotOptions(items,options));const authoritativeFingerprint=recencyEvidenceFingerprint(authoritativeCandidates);const fresh=snapshot!==null&&snapshot.source_cursor===options.sourceCursor&&snapshot.recency_evidence_fingerprint===authoritativeFingerprint&&snapshot.source===options.source&&snapshotIds.length===authoritativeIds.length&&snapshotIds.every((id,index)=>id===authoritativeIds[index]);let resolvedSnapshot;if(fresh&&snapshot!==null){resolvedSnapshot=snapshot}else{if(snapshot!==null){warnings.push("context_signal_store_stale")}resolvedSnapshot=snapshotFromCandidates(authoritativeCandidates,options,authoritativeFingerprint);try{await this.adapter.write(resolvedSnapshot)}catch{warnings.push("context_signal_store_write_failed")}}const snapshotItemsById=new Map(resolvedSnapshot.items.map(item=>[item.id,item]));return{snapshot:resolvedSnapshot,candidates:authoritativeCandidates.map(candidate=>({...candidate,signals:{...candidate.signals,...snapshotItemsById.get(candidate.id)?.signals},signal_provenance:snapshotItemsById.get(candidate.id).signal_provenance})),cache_status:fresh?"fresh":"rebuilt",warnings,warning_details:warnings.map(warning=>CONTEXT_SIGNAL_STORE_WARNING_DETAILS[warning])}}}function fallbackWorkspaceCursor(items){const hash=createHash("sha256");for(const item of[...items].sort((left,right)=>left.id.localeCompare(right.id))){hash.update(JSON.stringify([item.id,item.updated_at,item.status,item.parent??null,item.priority??null,item.risk??null,(item.dependencies??[]).map(dependency=>dependency.id).sort(),item.comments?.length??0,item.notes?.length??0,item.learnings?.length??0,item.test_runs?.length??0]))}return`scan:${hash.digest("hex")}`}async function readWorkspaceContextSignals(items,options){const hasSourceCursor=options.sourceCursor!==void 0;const hasSource=options.source!==void 0;if(hasSourceCursor!==hasSource){throw new TypeError("Context signal source and source cursor must be provided together")}if(options.storeKey!==void 0&&!/^[a-z0-9](?:[a-z0-9_-]*[a-z0-9])?$/u.test(options.storeKey)){throw new TypeError("Context signal store key must be a filesystem-safe identifier")}const indexState=hasSourceCursor?null:await readItemMetadataDerivedIndexState(options.pmRoot);const sourceCursor=options.sourceCursor??indexState?.source_cursor??fallbackWorkspaceCursor(items);const source=options.source??(indexState===null?"scan_fallback":"derived_index");const store=new ContextSignalStore(new JsonFileContextSignalStoreAdapter(path.join(options.pmRoot,"runtime",options.storeKey?`context-signals-${options.storeKey}.json`:"context-signals.json")));const recencyEvidence=options.recencyEvidence??Object.fromEntries(Object.entries(await readLatestSubstantiveHistoryEvents(options.pmRoot,items.map(item=>item.id))).map(([id,event])=>[id,{source:"substantive_history",coordinate:event.entry.ts,history_op:event.entry.op,event_class:"substantive"}]));return store.readOrRebuild(items,{...options,recencyEvidence,sourceCursor,source})}export{CONTEXT_SIGNAL_SET_VERSION,CONTEXT_SIGNAL_STORE_FORMAT_VERSION,CONTEXT_SIGNAL_STORE_WARNING_DETAILS,ContextSignalStore,JsonFileContextSignalStoreAdapter,buildContextSignalSnapshot,parseContextSignalSnapshot,readWorkspaceContextSignals};
|
|
426
3
|
//# sourceMappingURL=context-signal-store.js.map
|
|
427
|
-
//# debugId=9b112b71-e0b8-5502-89f6-b4da6eb85f6b
|