@unbrained/pm-cli 2026.9.6 → 2026.9.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.agents/skills/pm-developer/SKILL.md +12 -4
- package/.agents/skills/pm-developer/references/MULTI_AGENT_MERGE.md +19 -10
- package/.agents/skills/pm-extensions/SKILL.md +6 -0
- package/.agents/skills/pm-sdk/SKILL.md +11 -2
- package/.agents/skills/pm-user/SKILL.md +5 -0
- package/.agents/skills/pm-user/references/ECOSYSTEM_PLANNING.md +95 -0
- package/.claude-plugin/marketplace.json +2 -2
- package/CHANGELOG.md +218 -182
- package/dist/cli/after-command-context-usage.js +1 -48
- package/dist/cli/argv-utils.js +1 -40
- package/dist/cli/bootstrap-args.js +1 -9
- package/dist/cli/bundle-integrity.js +2 -110
- package/dist/cli/commander-usage.js +11 -771
- package/dist/cli/commands/activity.js +1 -9
- package/dist/cli/commands/aggregate.js +1 -5
- package/dist/cli/commands/append.js +1 -5
- package/dist/cli/commands/claim.js +1 -5
- package/dist/cli/commands/close-many.js +1 -5
- package/dist/cli/commands/close.js +1 -9
- package/dist/cli/commands/comments.js +1 -5
- package/dist/cli/commands/config.js +1 -9
- package/dist/cli/commands/context.js +1 -9
- package/dist/cli/commands/contracts.js +1 -5
- package/dist/cli/commands/copy.js +1 -9
- package/dist/cli/commands/create.js +1 -9
- package/dist/cli/commands/delete.js +1 -9
- package/dist/cli/commands/deps.js +1 -9
- package/dist/cli/commands/docs.js +1 -9
- package/dist/cli/commands/duplicates.js +1 -9
- package/dist/cli/commands/eval.js +1 -9
- package/dist/cli/commands/extension/describe.js +1 -5
- package/dist/cli/commands/extension/scaffold.js +1 -5
- package/dist/cli/commands/extension/shared.js +1 -5
- package/dist/cli/commands/extension.js +1 -9
- package/dist/cli/commands/files.js +1 -9
- package/dist/cli/commands/focus.js +1 -9
- package/dist/cli/commands/gc.js +1 -9
- package/dist/cli/commands/get.js +1 -9
- package/dist/cli/commands/graph.js +1 -10
- package/dist/cli/commands/health.js +1 -9
- package/dist/cli/commands/history-compact.js +1 -10
- package/dist/cli/commands/history-redact.js +1 -11
- package/dist/cli/commands/history-repair.js +1 -10
- package/dist/cli/commands/history.js +1 -5
- package/dist/cli/commands/index.js +1 -58
- package/dist/cli/commands/init-agent-guidance.js +1 -9
- package/dist/cli/commands/init.js +1 -9
- package/dist/cli/commands/learnings.js +1 -5
- package/dist/cli/commands/lifecycle-transitions.js +1 -5
- package/dist/cli/commands/list.js +1 -9
- package/dist/cli/commands/merge.js +1 -11
- package/dist/cli/commands/next.js +1 -9
- package/dist/cli/commands/notes.js +1 -5
- package/dist/cli/commands/plan.js +1 -9
- package/dist/cli/commands/profile.js +1 -9
- package/dist/cli/commands/restore.js +1 -9
- package/dist/cli/commands/scheduling-shortcuts.js +1 -9
- package/dist/cli/commands/schema.js +1 -10
- package/dist/cli/commands/search.js +1 -9
- package/dist/cli/commands/stats.js +1 -9
- package/dist/cli/commands/telemetry.js +1 -9
- package/dist/cli/commands/test-all.js +1 -9
- package/dist/cli/commands/test-runs.js +1 -9
- package/dist/cli/commands/test.js +1 -9
- package/dist/cli/commands/update-many.js +1 -5
- package/dist/cli/commands/update.js +1 -9
- package/dist/cli/commands/upgrade.js +1 -5
- package/dist/cli/commands/validate.js +1 -15
- package/dist/cli/context-intent-invocation.js +1 -20
- package/dist/cli/description-stdin.js +1 -17
- package/dist/cli/error-guidance.js +1 -1353
- package/dist/cli/extension-command-help.js +5 -636
- package/dist/cli/extension-command-options.js +1 -427
- package/dist/cli/extension-recovery.js +1 -126
- package/dist/cli/help-content.js +2 -1001
- package/dist/cli/help-json-payload.js +4 -570
- package/dist/cli/main.d.ts +4 -0
- package/dist/cli/main.js +5 -2573
- package/dist/cli/migration-gates.js +1 -289
- package/dist/cli/public.js +1 -20
- package/dist/cli/register-annotations.js +1 -270
- package/dist/cli/register-assurance.js +1 -62
- package/dist/cli/register-files-lookup.js +1 -56
- package/dist/cli/register-history-activity.d.ts +8 -0
- package/dist/cli/register-history-activity.js +2 -0
- package/dist/cli/register-history-author.js +1 -38
- package/dist/cli/register-history-maintenance.d.ts +9 -0
- package/dist/cli/register-history-maintenance.js +2 -0
- package/dist/cli/register-list-query.js +10 -943
- package/dist/cli/register-mutation-options.js +1 -9
- package/dist/cli/register-mutation.js +19 -1893
- package/dist/cli/register-operations.js +1 -920
- package/dist/cli/register-setup.js +1 -716
- package/dist/cli/register-structured-mutation.js +1 -196
- package/dist/cli/registration-helpers.js +1 -5
- package/dist/cli/runtime-compatibility-boundary.js +4 -42
- package/dist/cli/schema-registration-helpers.js +1 -73
- package/dist/cli/search-refresh.js +1 -13
- package/dist/cli/stats-analytics-json.js +1 -68
- package/dist/cli/telemetry-flush.js +1 -10
- package/dist/cli-bundle/bundle-manifest.json +164 -156
- package/dist/cli-bundle/chunks/chunk-3BZZA6A3.js +5 -0
- package/dist/cli-bundle/chunks/chunk-AMRDVX36.js +235 -0
- package/dist/cli-bundle/chunks/chunk-DAM4CBBR.js +2202 -0
- package/dist/cli-bundle/chunks/{chunk-WYRZZ5ZE.js → chunk-DEZPZOQ7.js} +2 -2
- package/dist/cli-bundle/chunks/chunk-FLDWYEND.js +77 -0
- package/dist/cli-bundle/chunks/{chunk-NPN5I67J.js → chunk-G5ADGQ2D.js} +3 -3
- package/dist/cli-bundle/chunks/chunk-JAAEYHUA.js +2 -0
- package/dist/cli-bundle/chunks/{chunk-JX4DH4WC.js → chunk-KR3RP4FH.js} +3 -3
- package/dist/cli-bundle/chunks/chunk-LEZOUXG6.js +2 -0
- package/dist/cli-bundle/chunks/chunk-NSAPNEYH.js +2 -0
- package/dist/cli-bundle/chunks/chunk-QOEKOECV.js +29 -0
- package/dist/cli-bundle/chunks/chunk-RHSFOMHU.js +2 -0
- package/dist/cli-bundle/chunks/chunk-XOD2PCB6.js +20 -0
- package/dist/cli-bundle/chunks/{chunk-JT6XF6GE.js → chunk-YVEQ2AMO.js} +4 -4
- package/dist/cli-bundle/chunks/register-list-query-KSK3R63M.js +11 -0
- package/dist/cli-bundle/chunks/register-mutation-IQ5C7U6O.js +20 -0
- package/dist/cli-bundle/chunks/{register-operations-I5W3KMGB.js → register-operations-DWVHR2NC.js} +2 -2
- package/dist/cli-bundle/chunks/register-setup-BQ5SVD4B.js +2 -0
- package/dist/cli-bundle/focused-chunks/chunk-3WRPWLA7.js +3 -0
- package/dist/cli-bundle/focused-chunks/chunk-7MBUII7U.js +2 -0
- package/dist/cli-bundle/focused-chunks/chunk-COPBO5HW.js +8 -0
- package/dist/cli-bundle/focused-chunks/chunk-DUN4IXYN.js +20 -0
- package/dist/cli-bundle/focused-chunks/{chunk-LIJIA4TY.js → chunk-EE5QSM4Z.js} +3 -3
- package/dist/cli-bundle/focused-chunks/chunk-HJVARYM3.js +6 -0
- package/dist/cli-bundle/focused-chunks/chunk-IAUOUGVR.js +177 -0
- package/dist/cli-bundle/focused-chunks/chunk-KOOMJ54F.js +2 -0
- package/dist/cli-bundle/focused-chunks/chunk-MZDXX7JY.js +56 -0
- package/dist/cli-bundle/focused-chunks/{chunk-M6PBRFSH.js → chunk-OPFHFGDD.js} +2 -2
- package/dist/cli-bundle/focused-chunks/chunk-QHNETP77.js +9 -0
- package/dist/cli-bundle/focused-chunks/{chunk-3BZEOXLT.js → chunk-RMWES4M6.js} +2 -2
- package/dist/cli-bundle/focused-chunks/chunk-RXT4P5QH.js +10 -0
- package/dist/cli-bundle/focused-chunks/chunk-SDOL6FM2.js +12 -0
- package/dist/cli-bundle/focused-chunks/chunk-SQV4AAUC.js +2 -0
- package/dist/cli-bundle/focused-chunks/{chunk-PEFABF7E.js → chunk-WE3IUNIW.js} +3 -3
- package/dist/cli-bundle/focused-chunks/chunk-YALOUBWJ.js +2 -0
- package/dist/cli-bundle/main.js +20 -20
- package/dist/cli-bundle/sdk-authoring.js +1 -1
- package/dist/cli-bundle/sdk-contracts.js +2 -2
- package/dist/cli-bundle/sdk-core.js +29 -29
- package/dist/cli-bundle/sdk-governance.js +1 -1
- package/dist/cli-bundle/sdk-graph.js +1 -1
- package/dist/cli-bundle/sdk-merge.js +42 -42
- package/dist/cli-bundle/sdk-query.js +1 -1
- package/dist/cli-bundle/sdk-runtime.js +1 -1
- package/dist/cli-bundle/sdk-testing.js +1 -1
- package/dist/cli-bundle/sdk.js +11 -11
- package/dist/cli.js +1 -104
- package/dist/core/checkpoint/checkpoint-gc.js +1 -169
- package/dist/core/checkpoint/mutation-checkpoint.js +2 -133
- package/dist/core/config/nested-settings.js +1 -534
- package/dist/core/config/positional-value.js +1 -109
- package/dist/core/diagnostics/remediation.js +1 -506
- package/dist/core/extensions/activation-summary-markdown.js +2 -145
- package/dist/core/extensions/activation-summary.js +1 -92
- package/dist/core/extensions/activation-transaction.js +1 -46
- package/dist/core/extensions/capability-usage.js +1 -173
- package/dist/core/extensions/command-hook-context.js +1 -13
- package/dist/core/extensions/command-metadata-contract.js +1 -22
- package/dist/core/extensions/command-visibility-tier.js +1 -29
- package/dist/core/extensions/contribution-inventory.js +1 -173
- package/dist/core/extensions/exporter-output-contract.js +1 -66
- package/dist/core/extensions/extension-candidate.js +1 -18
- package/dist/core/extensions/extension-capability-aliases.js +1 -158
- package/dist/core/extensions/extension-hook-runtime.js +1 -699
- package/dist/core/extensions/extension-policy.js +1 -599
- package/dist/core/extensions/extension-registries.js +1 -62
- package/dist/core/extensions/extension-runtime-helpers.js +1 -33
- package/dist/core/extensions/extension-types.js +1 -102
- package/dist/core/extensions/flag-definition-validation.js +1 -52
- package/dist/core/extensions/flag-value-types.js +1 -64
- package/dist/core/extensions/index.js +1 -526
- package/dist/core/extensions/item-field-types.js +1 -39
- package/dist/core/extensions/item-fields.js +1 -261
- package/dist/core/extensions/loader.js +1 -2223
- package/dist/core/extensions/manifest-schema.js +1 -69
- package/dist/core/extensions/module-graph-snapshot.js +1 -33
- package/dist/core/extensions/preflight-ownership.js +1 -41
- package/dist/core/extensions/registration-validation.js +1 -82
- package/dist/core/extensions/registration-values.js +1 -209
- package/dist/core/extensions/reserved-host-flags.js +1 -36
- package/dist/core/extensions/runtime-registrations.js +1 -67
- package/dist/core/extensions/service-ownership.js +1 -19
- package/dist/core/extensions/version-compat.js +1 -216
- package/dist/core/fs/fs-utils.js +2 -158
- package/dist/core/fs/host-environment-errors.js +1 -141
- package/dist/core/fs/index.js +1 -9
- package/dist/core/fs/path-utils.js +1 -17
- package/dist/core/governance/content-fields.js +1 -160
- package/dist/core/governance/issue-codes.js +1 -151
- package/dist/core/governance/metadata-coverage.js +1 -358
- package/dist/core/history/drift-cache.js +3 -72
- package/dist/core/history/drift-scan.js +1 -342
- package/dist/core/history/event-classification.js +1 -109
- package/dist/core/history/event-index.js +8 -784
- package/dist/core/history/history-compact-bulk.js +1 -104
- package/dist/core/history/history-diff.js +1 -158
- package/dist/core/history/history-rewrite.d.ts +6 -1
- package/dist/core/history/history-rewrite.js +1 -107
- package/dist/core/history/history-storage-stats.js +1 -102
- package/dist/core/history/history-stream-policy.js +1 -62
- package/dist/core/history/history.js +2 -617
- package/dist/core/history/identity.js +1 -30
- package/dist/core/history/index.js +1 -9
- package/dist/core/history/projection.js +1 -196
- package/dist/core/history/read.d.ts +9 -0
- package/dist/core/history/read.js +1 -57
- package/dist/core/history/replay.js +2 -439
- package/dist/core/history/version-address.js +1 -32
- package/dist/core/history/workspace-history.js +2 -433
- package/dist/core/io/body-file.js +1 -62
- package/dist/core/io/bulk-ids-input.js +1 -112
- package/dist/core/item/actionability.js +1 -327
- package/dist/core/item/dependency-reference.js +1 -20
- package/dist/core/item/id.js +1 -112
- package/dist/core/item/index.js +1 -12
- package/dist/core/item/item-format-version.js +1 -78
- package/dist/core/item/item-format.js +5 -1473
- package/dist/core/item/item-record.js +1 -23
- package/dist/core/item/item-type-definition.js +1 -133
- package/dist/core/item/parent-reference-policy.js +1 -57
- package/dist/core/item/parse.js +2 -603
- package/dist/core/item/plan-lifecycle.js +1 -19
- package/dist/core/item/priority.js +1 -61
- package/dist/core/item/sprint-release-format.js +1 -38
- package/dist/core/item/status-filter.js +1 -115
- package/dist/core/item/status.js +1 -43
- package/dist/core/item/toon-decode.js +1 -29
- package/dist/core/item/type-registry.js +1 -715
- package/dist/core/item/type-synonyms.js +1 -38
- package/dist/core/lock/index.js +1 -9
- package/dist/core/lock/lock-gc.js +1 -240
- package/dist/core/lock/lock.js +3 -590
- package/dist/core/output/mutation-projection.js +1 -217
- package/dist/core/output/output-control.js +1 -25
- package/dist/core/output/output.js +11 -494
- package/dist/core/output/query-summary.js +1 -58
- package/dist/core/output/tabular.js +1 -77
- package/dist/core/packages/manifest.js +1 -244
- package/dist/core/packages/root.js +1 -84
- package/dist/core/profile/profile-describe.js +1 -83
- package/dist/core/profile/profile-lint.js +1 -415
- package/dist/core/profile/profile-plan.js +0 -0
- package/dist/core/profile/profile-presets.js +1 -370
- package/dist/core/reproducibility/context.js +1 -82
- package/dist/core/schema/fields-file.js +2 -288
- package/dist/core/schema/item-types-file.js +2 -296
- package/dist/core/schema/runtime-field-filters.js +1 -49
- package/dist/core/schema/runtime-field-values.js +1 -313
- package/dist/core/schema/runtime-schema.js +2 -826
- package/dist/core/schema/status-defs-file.js +2 -227
- package/dist/core/schema/status-token.js +1 -31
- package/dist/core/schema/type-inference.js +1 -95
- package/dist/core/schema/type-presets.js +1 -87
- package/dist/core/schema/type-workflows.js +1 -104
- package/dist/core/search/background-refresh.js +2 -286
- package/dist/core/search/bm25.js +1 -146
- package/dist/core/search/cache.js +2 -534
- package/dist/core/search/corpus.js +1 -311
- package/dist/core/search/embedding-batches.js +1 -163
- package/dist/core/search/eval.js +1 -225
- package/dist/core/search/http-client.js +1 -75
- package/dist/core/search/providers.js +1 -242
- package/dist/core/search/relevance.js +1 -244
- package/dist/core/search/semantic-defaults.js +1 -199
- package/dist/core/search/staleness.js +1 -30
- package/dist/core/search/vector-stores.js +2 -664
- package/dist/core/search/vectorization-metadata.js +1 -81
- package/dist/core/sentry/helpers.js +1 -272
- package/dist/core/sentry/instrument.js +1 -387
- package/dist/core/session/session-state.js +1 -260
- package/dist/core/shared/agent-session-context.js +1 -133
- package/dist/core/shared/author.js +1 -1172
- package/dist/core/shared/command-types.js +1 -4
- package/dist/core/shared/conflict-markers.js +1 -31
- package/dist/core/shared/constants.js +1 -405
- package/dist/core/shared/errors.js +1 -20
- package/dist/core/shared/html-entity-decode.js +1 -131
- package/dist/core/shared/index.js +1 -12
- package/dist/core/shared/item-metadata-contract.js +1 -89
- package/dist/core/shared/lazy-module.js +1 -16
- package/dist/core/shared/levenshtein.js +1 -61
- package/dist/core/shared/memo.js +1 -19
- package/dist/core/shared/numeric-parsers.js +1 -20
- package/dist/core/shared/option-alias-visibility.js +1 -67
- package/dist/core/shared/primitives.js +1 -127
- package/dist/core/shared/serial-queue.js +1 -79
- package/dist/core/shared/serialization.js +1 -210
- package/dist/core/shared/split-comma-list.js +1 -30
- package/dist/core/shared/text-normalization.js +1 -38
- package/dist/core/shared/time.js +1 -306
- package/dist/core/store/index.js +1 -12
- package/dist/core/store/item-format-migration.js +1 -125
- package/dist/core/store/item-metadata-cache.js +1 -1116
- package/dist/core/store/item-metadata-query-index.js +9 -394
- package/dist/core/store/item-metadata-read-work.js +1 -43
- package/dist/core/store/item-store.js +1 -693
- package/dist/core/store/paths.d.ts +1 -1
- package/dist/core/store/paths.js +1 -214
- package/dist/core/store/settings-read-cache.js +1 -85
- package/dist/core/store/settings-validator.js +1 -421
- package/dist/core/store/settings.js +3 -1309
- package/dist/core/store/tracker-preflight.js +1 -141
- package/dist/core/telemetry/consent.js +5 -108
- package/dist/core/telemetry/observability.js +1 -246
- package/dist/core/telemetry/runtime.js +4 -1988
- package/dist/core/test/background-runs.js +4 -945
- package/dist/core/test/item-test-run-tracking.js +1 -63
- package/dist/core/test/run-selectors.js +1 -120
- package/dist/core/validate/estimate-defaults.js +1 -89
- package/dist/core/validate/fix-planning.js +1 -189
- package/dist/core/validate/linked-artifact-reference.js +1 -36
- package/dist/core/validate/missing-by-type.js +1 -34
- package/dist/core/validate/missing-link-owners.js +1 -95
- package/dist/core/validate/stale-file-classification.js +1 -82
- package/dist/mcp/http-server.js +5 -448
- package/dist/mcp/legacy-adapter.js +1 -77
- package/dist/mcp/runtime-capabilities.js +1 -200
- package/dist/mcp/server.js +4 -1233
- package/dist/mcp/tool-definitions.js +1 -804
- package/dist/sdk/actionability.js +1 -13
- package/dist/sdk/agent/closed-domain-contracts.js +1 -161
- package/dist/sdk/agent/command-recovery.js +1 -59
- package/dist/sdk/agent/command-suggestions.js +1 -66
- package/dist/sdk/agent/create-option-policy.js +1 -31
- package/dist/sdk/agent/identity-config.js +1 -106
- package/dist/sdk/agent/item-addressing.js +1 -207
- package/dist/sdk/agent/refusal-closure-census.js +1 -151
- package/dist/sdk/agent/refusal-closure.js +1 -133
- package/dist/sdk/agent/refusal-corpus-contracts.js +1 -193
- package/dist/sdk/agent/refusal-reachability.js +1 -593
- package/dist/sdk/agent/subcommand-recovery.js +1 -83
- package/dist/sdk/agent/task-transcript-contracts.js +1 -197
- package/dist/sdk/agent/tracker-preflight-contracts.js +1 -126
- package/dist/sdk/agent-capability-contracts.js +1 -428
- package/dist/sdk/agent-session-context.js +1 -9
- package/dist/sdk/annotations.js +1 -448
- package/dist/sdk/author-attribution.js +1 -468
- package/dist/sdk/authoring.js +1 -20
- package/dist/sdk/cli-bootstrap.js +1 -838
- package/dist/sdk/cli-contracts/agent-output-contracts.d.ts +1 -1
- package/dist/sdk/cli-contracts/agent-output-contracts.js +4 -476
- package/dist/sdk/cli-contracts/bootstrap-command-scanner.js +1 -79
- package/dist/sdk/cli-contracts/command-aliases.d.ts +4 -0
- package/dist/sdk/cli-contracts/command-aliases.js +1 -107
- package/dist/sdk/cli-contracts/command-exit-contracts.js +1 -151
- package/dist/sdk/cli-contracts/commander-mutation-options.js +1 -1081
- package/dist/sdk/cli-contracts/commander-types.js +1 -159
- package/dist/sdk/cli-contracts/completeness.js +1 -393
- package/dist/sdk/cli-contracts/enum-contracts.js +1 -222
- package/dist/sdk/cli-contracts/flag-contracts.js +1 -1947
- package/dist/sdk/cli-contracts/flag-lexicon-contracts.js +1 -347
- package/dist/sdk/cli-contracts/grammar-contracts.js +1 -986
- package/dist/sdk/cli-contracts/registration-helpers.js +7 -990
- package/dist/sdk/cli-contracts/runtime-contracts.d.ts +5 -0
- package/dist/sdk/cli-contracts/runtime-contracts.js +1 -2090
- package/dist/sdk/cli-contracts/schemas/assurance-definition.js +1 -324
- package/dist/sdk/cli-contracts/string-lists.js +1 -16
- package/dist/sdk/cli-contracts/tool-option-contracts.js +1 -461
- package/dist/sdk/cli-contracts/tool-parameter-tables.js +1 -2167
- package/dist/sdk/cli-contracts/tool-schema.d.ts +3 -1
- package/dist/sdk/cli-contracts/tool-schema.js +1 -1664
- package/dist/sdk/cli-contracts/typed-action-inputs.js +1 -4
- package/dist/sdk/cli-contracts.d.ts +1 -1
- package/dist/sdk/cli-contracts.js +1 -17
- package/dist/sdk/cli-program.js +1 -49
- package/dist/sdk/command-line.d.ts +2 -5
- package/dist/sdk/command-line.js +1 -78
- package/dist/sdk/comments.js +1 -133
- package/dist/sdk/compile-cache.js +1 -73
- package/dist/sdk/completion.js +157 -837
- package/dist/sdk/compose.js +1 -1090
- package/dist/sdk/config.js +1 -1204
- package/dist/sdk/context/recency.js +1 -33
- package/dist/sdk/context/semantic-session-attribution.js +1 -82
- package/dist/sdk/context/usage-egress.js +1 -29
- package/dist/sdk/context/usage-ledger.js +3 -185
- package/dist/sdk/context-intent-contracts.js +1 -709
- package/dist/sdk/context-intent-runtime.js +1 -115
- package/dist/sdk/context-packing.js +1 -218
- package/dist/sdk/context-relevance.js +1 -503
- package/dist/sdk/context-signal-store.js +2 -426
- package/dist/sdk/context-usage.js +1 -367
- package/dist/sdk/contracts.js +1 -23
- package/dist/sdk/core-governance.js +1 -14
- package/dist/sdk/core.js +1 -14
- package/dist/sdk/corpus-shape.js +1 -401
- package/dist/sdk/define.js +1 -220
- package/dist/sdk/dependencies.js +1 -718
- package/dist/sdk/dependency-flag-validation.js +1 -156
- package/dist/sdk/dependency-provenance.js +1 -135
- package/dist/sdk/docs.js +1 -14
- package/dist/sdk/duplicates.js +1 -40
- package/dist/sdk/environment/agent-environment.js +1 -466
- package/dist/sdk/environment/host-environment-errors.js +1 -8
- package/dist/sdk/environment/project-runtime-compatibility.js +1 -481
- package/dist/sdk/environment/source-context.js +1 -28
- package/dist/sdk/environment/tracker-preflight.js +1 -9
- package/dist/sdk/error-code-catalog.js +1 -153
- package/dist/sdk/error-runtime.js +1 -58
- package/dist/sdk/errors.js +1 -58
- package/dist/sdk/eval.js +1 -190
- package/dist/sdk/extension/author-manifest.js +1 -92
- package/dist/sdk/extension/bundled-catalog.js +1 -332
- package/dist/sdk/extension/concurrency.js +1 -25
- package/dist/sdk/extension/copy-scope.d.ts +2 -0
- package/dist/sdk/extension/copy-scope.js +2 -0
- package/dist/sdk/extension/custom-field-collisions.js +1 -30
- package/dist/sdk/extension/describe.js +3 -189
- package/dist/sdk/extension/doctor.js +1 -606
- package/dist/sdk/extension/install-plan.d.ts +69 -0
- package/dist/sdk/extension/install-plan.js +2 -0
- package/dist/sdk/extension/install-receipts.d.ts +7 -0
- package/dist/sdk/extension/install-receipts.js +2 -0
- package/dist/sdk/extension/install-runtime.js +3 -313
- package/dist/sdk/extension/install-snapshot.js +1 -66
- package/dist/sdk/extension/install-sources.js +5 -1057
- package/dist/sdk/extension/managed-state.js +2 -252
- package/dist/sdk/extension/migrations.js +2 -174
- package/dist/sdk/extension/output-ownership.js +1 -25
- package/dist/sdk/extension/runtime-summary.js +1 -18
- package/dist/sdk/extension/scaffold.js +4 -2308
- package/dist/sdk/extension/shared.js +1 -147
- package/dist/sdk/extension/source-resolution.js +1 -65
- package/dist/sdk/extension/update-check.js +1 -67
- package/dist/sdk/extension-command-context.js +1 -44
- package/dist/sdk/extension-contracts.js +1 -73
- package/dist/sdk/extension.d.ts +7 -2
- package/dist/sdk/extension.js +1 -2196
- package/dist/sdk/files.js +1 -535
- package/dist/sdk/flag-invocation-contracts.d.ts +0 -5
- package/dist/sdk/flag-invocation-contracts.js +1 -344
- package/dist/sdk/generated/generated-error-code-catalog-part-1.js +1 -2224
- package/dist/sdk/generated/generated-error-code-catalog-part-2.js +1 -2236
- package/dist/sdk/generated-error-code-catalog.js +1 -16
- package/dist/sdk/governance/assurance-action-contracts.js +1 -4
- package/dist/sdk/governance/assurance-action.js +1 -411
- package/dist/sdk/governance/assurance-limits.js +1 -10
- package/dist/sdk/governance/assurance-mutation-error.js +1 -81
- package/dist/sdk/governance/assurance-presets.js +1 -135
- package/dist/sdk/governance/assurance-runtime.js +1 -238
- package/dist/sdk/governance/assurance.js +4 -1182
- package/dist/sdk/governance/boundary-fixtures.js +1 -200
- package/dist/sdk/governance/coverage-assurance.js +1 -60
- package/dist/sdk/governance/defect-recurrence-coverage.js +1 -188
- package/dist/sdk/governance/defect-recurrence-graph.js +1 -120
- package/dist/sdk/governance/defect-recurrence-signals.js +1 -24
- package/dist/sdk/governance/defect-recurrence.js +1 -623
- package/dist/sdk/governance/extension-host-version.js +1 -115
- package/dist/sdk/governance/gc.js +1 -368
- package/dist/sdk/governance/health.js +1 -2367
- package/dist/sdk/governance/hierarchy-validation.js +1 -108
- package/dist/sdk/governance/linked-file-report.js +1 -71
- package/dist/sdk/governance/merge-receipt-history.js +1 -206
- package/dist/sdk/governance/provenance-health.js +1 -282
- package/dist/sdk/governance/reindex.js +4 -761
- package/dist/sdk/governance/stale-work.js +1 -82
- package/dist/sdk/governance/status-role-diagnostics.js +1 -35
- package/dist/sdk/governance/storage-integrity.js +1 -280
- package/dist/sdk/governance/tracked-runtime-cache.js +1 -106
- package/dist/sdk/governance/upgrade.js +2 -327
- package/dist/sdk/governance/validate-history-drift.js +1 -81
- package/dist/sdk/governance/validate-item-reader.js +1 -17
- package/dist/sdk/governance/validate-normalization.js +1 -36
- package/dist/sdk/governance/validate.js +1 -2261
- package/dist/sdk/governance/workspace-position.js +1 -163
- package/dist/sdk/governance.d.ts +1 -0
- package/dist/sdk/governance.js +1 -31
- package/dist/sdk/graph/adapter.js +1 -181
- package/dist/sdk/graph/analytics.js +1 -474
- package/dist/sdk/graph/assembly.js +1 -377
- package/dist/sdk/graph/cache.js +1 -160
- package/dist/sdk/graph/centrality.js +1 -258
- package/dist/sdk/graph/conformance.js +1 -130
- package/dist/sdk/graph/deadline-scheduling.d.ts +90 -0
- package/dist/sdk/graph/deadline-scheduling.js +2 -0
- package/dist/sdk/graph/durable-cache.d.ts +1 -1
- package/dist/sdk/graph/durable-cache.js +1 -361
- package/dist/sdk/graph/governance-contracts.js +1 -34
- package/dist/sdk/graph/governance.d.ts +13 -1
- package/dist/sdk/graph/governance.js +1 -735
- package/dist/sdk/graph/hierarchy-integrity.js +1 -310
- package/dist/sdk/graph/index.d.ts +3 -2
- package/dist/sdk/graph/index.js +1 -26
- package/dist/sdk/graph/lifecycle-coverage.d.ts +32 -0
- package/dist/sdk/graph/lifecycle-coverage.js +2 -0
- package/dist/sdk/graph/mutation-advisory.js +1 -176
- package/dist/sdk/graph/remediation.js +1 -197
- package/dist/sdk/graph/run.d.ts +15 -1
- package/dist/sdk/graph/run.js +1 -768
- package/dist/sdk/graph/scheduling.js +1 -124
- package/dist/sdk/graph/traversal.js +1 -284
- package/dist/sdk/graph/workspace-relationship-kind-registry.js +1 -27
- package/dist/sdk/graph.js +1 -15
- package/dist/sdk/guide-topics.js +1 -707
- package/dist/sdk/guide.js +1 -279
- package/dist/sdk/history/maintenance.d.ts +71 -0
- package/dist/sdk/history/maintenance.js +2 -0
- package/dist/sdk/history/salvage.js +2 -247
- package/dist/sdk/history/subject.d.ts +19 -0
- package/dist/sdk/history/subject.js +2 -0
- package/dist/sdk/history-analytics.js +1 -282
- package/dist/sdk/history-compact.js +1 -527
- package/dist/sdk/history-mcp.js +1 -68
- package/dist/sdk/history-provenance.js +1 -182
- package/dist/sdk/history-read.js +1 -96
- package/dist/sdk/history-redact.d.ts +1 -14
- package/dist/sdk/history-redact.js +1 -643
- package/dist/sdk/history-repair.d.ts +5 -0
- package/dist/sdk/history-repair.js +1 -657
- package/dist/sdk/improvement-ledger-validation.js +1 -62
- package/dist/sdk/improvement-ledger.js +2 -257
- package/dist/sdk/index.d.ts +4 -0
- package/dist/sdk/index.js +1 -183
- package/dist/sdk/init-agent-guidance.js +2 -496
- package/dist/sdk/init.js +2 -820
- package/dist/sdk/invocation-author.js +1 -39
- package/dist/sdk/item-children.js +1 -90
- package/dist/sdk/item-metadata-index.js +1 -15
- package/dist/sdk/item-schedule.js +1 -27
- package/dist/sdk/item-transaction.js +1 -396
- package/dist/sdk/learnings.js +1 -29
- package/dist/sdk/lifecycle/append.js +2 -53
- package/dist/sdk/lifecycle/claim.d.ts +2 -0
- package/dist/sdk/lifecycle/claim.js +1 -242
- package/dist/sdk/lifecycle/close-many.js +1 -438
- package/dist/sdk/lifecycle/close.js +1 -468
- package/dist/sdk/lifecycle/copy.js +1 -212
- package/dist/sdk/lifecycle/create.js +1 -1949
- package/dist/sdk/lifecycle/delete.js +1 -45
- package/dist/sdk/lifecycle/event-validation-messages.js +1 -91
- package/dist/sdk/lifecycle/focus.js +1 -91
- package/dist/sdk/lifecycle/hierarchy-mutation-lock.js +1 -24
- package/dist/sdk/lifecycle/legacy-none-tokens.js +1 -149
- package/dist/sdk/lifecycle/lifecycle-transitions.js +1 -40
- package/dist/sdk/lifecycle/mcp-actions.d.ts +2 -0
- package/dist/sdk/lifecycle/mcp-actions.js +1 -51
- package/dist/sdk/lifecycle/metadata-normalizers.js +1 -46
- package/dist/sdk/lifecycle/mutation-command-options.js +1 -9
- package/dist/sdk/lifecycle/plan.js +1 -1606
- package/dist/sdk/lifecycle/recurrence-parsers.js +1 -147
- package/dist/sdk/lifecycle/reopen.js +1 -68
- package/dist/sdk/lifecycle/repeatable-metadata-parsers.js +1 -143
- package/dist/sdk/lifecycle/restore.d.ts +1 -0
- package/dist/sdk/lifecycle/restore.js +1 -330
- package/dist/sdk/lifecycle/shared-unset-fields.js +1 -295
- package/dist/sdk/lifecycle/update-many.js +1 -861
- package/dist/sdk/lifecycle/update.js +1 -2136
- package/dist/sdk/lifecycle-completion.js +1 -92
- package/dist/sdk/lifecycle-policy.js +1 -120
- package/dist/sdk/linked-artifacts.js +1 -530
- package/dist/sdk/mcp/apps.js +4 -133
- package/dist/sdk/mcp/authorization.js +1 -404
- package/dist/sdk/mcp/discovery.js +1 -494
- package/dist/sdk/mcp/interactions.js +1 -336
- package/dist/sdk/mcp/protocol.d.ts +7 -0
- package/dist/sdk/mcp/protocol.js +1 -184
- package/dist/sdk/mcp/skills.js +1 -389
- package/dist/sdk/mcp/subscriptions.js +1 -211
- package/dist/sdk/mcp/tasks.js +2 -430
- package/dist/sdk/mcp/transport.js +1 -260
- package/dist/sdk/merge/abandoned-receipts.js +1 -46
- package/dist/sdk/merge/driver.js +1 -212
- package/dist/sdk/merge/index.js +1 -16
- package/dist/sdk/merge/install.js +3 -561
- package/dist/sdk/merge/receipt-file-boundary.js +1 -46
- package/dist/sdk/merge/receipt-operation.js +1 -96
- package/dist/sdk/merge/receipt-schema.js +1 -397
- package/dist/sdk/merge/receipts.js +4 -525
- package/dist/sdk/merge/reconcile.js +1 -352
- package/dist/sdk/merge/three-way.js +3 -775
- package/dist/sdk/merge.js +1 -10
- package/dist/sdk/mutation-events.js +1 -292
- package/dist/sdk/mutation-guard.js +1 -216
- package/dist/sdk/notes.js +1 -139
- package/dist/sdk/output-contracts.js +1 -172
- package/dist/sdk/output-projection.js +1 -430
- package/dist/sdk/output-token-accounting.js +1 -140
- package/dist/sdk/output.js +1 -64
- package/dist/sdk/ownership-source.js +1 -21
- package/dist/sdk/package-import-adapters.js +1 -442
- package/dist/sdk/package-migrations.js +1 -20
- package/dist/sdk/package-runtime-options.js +1 -80
- package/dist/sdk/pagination.js +1 -162
- package/dist/sdk/profile.js +1 -454
- package/dist/sdk/provenance.js +1 -258
- package/dist/sdk/public-surface.json +1 -1
- package/dist/sdk/query/activity.js +1 -401
- package/dist/sdk/query/aggregate.d.ts +16 -0
- package/dist/sdk/query/aggregate.js +1 -390
- package/dist/sdk/query/calendar.js +1 -964
- package/dist/sdk/query/complete-list.js +1 -215
- package/dist/sdk/query/context.js +1 -1702
- package/dist/sdk/query/duplicate-candidates.js +1 -70
- package/dist/sdk/query/get.js +1 -450
- package/dist/sdk/query/history.js +1 -186
- package/dist/sdk/query/item-filter-options.js +1 -9
- package/dist/sdk/query/light-metadata.js +1 -18
- package/dist/sdk/query/list-filter-shared.js +1 -81
- package/dist/sdk/query/list.js +1 -1304
- package/dist/sdk/query/multi-value-filters.js +1 -78
- package/dist/sdk/query/next.js +1 -513
- package/dist/sdk/query/parsers.js +1 -44
- package/dist/sdk/query/projection-contracts.js +1 -184
- package/dist/sdk/query/search-contracts.js +1 -230
- package/dist/sdk/query/search-pagination.js +1 -35
- package/dist/sdk/query/search-rendering.js +1 -105
- package/dist/sdk/query/search.js +2 -1987
- package/dist/sdk/query.js +1 -35
- package/dist/sdk/read-output/continuation.js +1 -194
- package/dist/sdk/read-output-budget.js +1 -135
- package/dist/sdk/read-output-contracts.js +1 -1225
- package/dist/sdk/read-output-rows.js +1 -186
- package/dist/sdk/read-output-session.js +1 -208
- package/dist/sdk/relationship-analytics.js +1 -410
- package/dist/sdk/relationship-context.js +1 -284
- package/dist/sdk/relationship-history.js +4 -519
- package/dist/sdk/relationship-kinds/contract.js +1 -22
- package/dist/sdk/relationship-migration.js +1 -77
- package/dist/sdk/relationships.js +1 -579
- package/dist/sdk/reproducibility/process.js +1 -87
- package/dist/sdk/runtime-action-aliases.js +1 -59
- package/dist/sdk/runtime-extended-actions.js +1 -177
- package/dist/sdk/runtime-input.js +1 -614
- package/dist/sdk/runtime-primitives.js +1 -84
- package/dist/sdk/runtime-public-contracts.js +1 -4
- package/dist/sdk/runtime-stats-options.js +1 -38
- package/dist/sdk/runtime.js +1 -1928
- package/dist/sdk/scheduling-shortcuts.js +1 -63
- package/dist/sdk/schema-migration.js +3 -856
- package/dist/sdk/schema.js +1 -1376
- package/dist/sdk/search-refresh-worker.js +1 -18
- package/dist/sdk/similarity-scoring.js +1 -53
- package/dist/sdk/similarity.js +1 -326
- package/dist/sdk/start-task-status.js +1 -14
- package/dist/sdk/stats.js +1 -270
- package/dist/sdk/structured-mutations.js +1 -580
- package/dist/sdk/telemetry-flush.js +1 -13
- package/dist/sdk/telemetry.js +1 -405
- package/dist/sdk/templates.js +2 -292
- package/dist/sdk/test/batch.js +2 -509
- package/dist/sdk/test/entry.js +1 -70
- package/dist/sdk/test/execution.js +6 -2211
- package/dist/sdk/test/linked-command-detection.js +1 -546
- package/dist/sdk/test/measurements.js +1 -91
- package/dist/sdk/test/parsers.js +1 -545
- package/dist/sdk/test/runs.js +1 -193
- package/dist/sdk/test/trust.js +2 -206
- package/dist/sdk/testing.js +4 -1391
- package/dist/sdk/traceability/runtime-files-lookup.js +1 -32
- package/dist/sdk/traceability/source-traceability.js +1 -292
- package/dist/sdk/tracker-root-discovery.js +1 -9
- package/dist/sdk/workspace-contracts-cache.js +1 -28
- package/dist/sdk/workspace-contracts.js +1 -33
- package/dist/sdk/workspace-memory.js +2 -318
- package/dist/sdk/workspace-recipe.js +1 -71
- package/dist/sdk/workspace-snapshot.js +4 -613
- package/dist/sdk/workspace-transaction-gc.js +1 -149
- package/dist/sdk/workspace-transaction.js +2 -363
- package/dist/sdk/workspace.js +3 -127
- package/dist/types/index.js +1 -9
- package/dist/types.js +1 -245
- package/docs/AGENT_GUIDE.md +1 -1
- package/docs/CONTEXT_ALGORITHM_PORTFOLIO.md +167 -0
- package/docs/DIAGNOSTIC_OUTPUT_CONTRACTS.md +9 -3
- package/docs/EXTENSIONS.md +1 -0
- package/docs/HISTORY_MAINTENANCE.md +125 -0
- package/docs/MCP_2026_07_28_CONFORMANCE.md +20 -10
- package/docs/PACKAGE_EVIDENCE.md +92 -0
- package/docs/PLANNING_MEASUREMENTS.md +183 -0
- package/docs/README.md +3 -0
- package/docs/RELEASING.md +1 -0
- package/docs/SCRIPTING.md +21 -0
- package/docs/TESTING.md +23 -0
- package/docs/generated/FLAG_LEXICON_BUDGETS.md +5 -5
- package/docs/generated/REFUSAL_CLOSURE_CENSUS.md +2 -2
- package/marketplace.json +2 -2
- package/package.json +1 -1
- package/packages/pm-beads/package.json +1 -1
- package/packages/pm-calendar/package.json +1 -1
- package/packages/pm-command-kit/package.json +1 -1
- package/packages/pm-digital-twin/package.json +1 -1
- package/packages/pm-governance-audit/package.json +1 -1
- package/packages/pm-guide-shell/package.json +1 -1
- package/packages/pm-kanban/package.json +1 -1
- package/packages/pm-lifecycle-hooks/package.json +1 -1
- package/packages/pm-linked-test-adapters/package.json +1 -1
- package/packages/pm-search-advanced/package.json +1 -1
- package/packages/pm-templates/package.json +1 -1
- package/packages/pm-todos/package.json +1 -1
- package/packages/pm-vcs/package.json +1 -1
- package/plugins/pm-claude/.claude-plugin/plugin.json +1 -1
- package/plugins/pm-codex/.codex-plugin/plugin.json +1 -1
- package/scripts/finalize-build.mjs +45 -3
- package/dist/cli-bundle/chunks/chunk-AZDFJGH6.js +0 -9
- package/dist/cli-bundle/chunks/chunk-BAX2BYUW.js +0 -2111
- package/dist/cli-bundle/chunks/chunk-CKOL5U7J.js +0 -77
- package/dist/cli-bundle/chunks/chunk-OF76PSDQ.js +0 -5
- package/dist/cli-bundle/chunks/chunk-QUWFABDM.js +0 -232
- package/dist/cli-bundle/chunks/chunk-QWRRFYK3.js +0 -2
- package/dist/cli-bundle/chunks/chunk-RWWBOWJ5.js +0 -2
- package/dist/cli-bundle/chunks/chunk-WGAOYSYH.js +0 -40
- package/dist/cli-bundle/chunks/chunk-WI2AYPA7.js +0 -2
- package/dist/cli-bundle/chunks/register-list-query-5JL52D33.js +0 -11
- package/dist/cli-bundle/chunks/register-mutation-ZPG7KMVP.js +0 -20
- package/dist/cli-bundle/chunks/register-setup-H4SVAVX7.js +0 -2
- package/dist/cli-bundle/focused-chunks/chunk-AL5ON6K6.js +0 -2
- package/dist/cli-bundle/focused-chunks/chunk-CHC2IDXA.js +0 -6
- package/dist/cli-bundle/focused-chunks/chunk-CK6QFAPZ.js +0 -20
- package/dist/cli-bundle/focused-chunks/chunk-EZR3GHFE.js +0 -2
- package/dist/cli-bundle/focused-chunks/chunk-H2WJWK7L.js +0 -56
- package/dist/cli-bundle/focused-chunks/chunk-NTPY5GSO.js +0 -3
- package/dist/cli-bundle/focused-chunks/chunk-P5O7MP5Y.js +0 -2
- package/dist/cli-bundle/focused-chunks/chunk-PDMW2E36.js +0 -177
- package/dist/cli-bundle/focused-chunks/chunk-QTVCLMSZ.js +0 -6
- package/dist/cli-bundle/focused-chunks/chunk-QTZRBUYA.js +0 -8
- package/dist/cli-bundle/focused-chunks/chunk-SGQST3PQ.js +0 -12
- package/dist/cli-bundle/focused-chunks/chunk-UKHASMMP.js +0 -10
- package/dist/cli-bundle/focused-chunks/chunk-ZPEKQHOC.js +0 -2
package/dist/sdk/guide.js
CHANGED
|
@@ -1,280 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
* @module cli/commands/guide
|
|
3
|
-
*
|
|
4
|
-
* Implements the pm guide command surface and its agent-facing runtime behavior.
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="27be0fa5-1c6a-53de-a0e8-179aab7c795a")}catch(e){}}();
|
|
8
|
-
import { isFileAbsentError } from "../core/fs/fs-utils.js";
|
|
9
|
-
import { readFile } from "node:fs/promises";
|
|
10
|
-
import path from "node:path";
|
|
11
|
-
import { resolveConfiguredPmPackageRoot, EXIT_CODE, PmCliError, } from "./runtime-primitives.js";
|
|
12
|
-
import { listGuideTopicIds, listGuideTopics, resolveGuideTopic, } from "./guide-topics.js";
|
|
13
|
-
/** Supported values accepted by the guide output contract. */
|
|
14
|
-
export const GUIDE_OUTPUT_VALUES = ["markdown", "toon", "json"];
|
|
15
|
-
/** Supported values accepted by the guide depth contract. */
|
|
16
|
-
export const GUIDE_DEPTH_VALUES = ["brief", "standard", "deep"];
|
|
17
|
-
function parseGuideOutputFormat(raw) {
|
|
18
|
-
if (!raw) {
|
|
19
|
-
return undefined;
|
|
20
|
-
}
|
|
21
|
-
const normalized = raw.trim().toLowerCase();
|
|
22
|
-
if (!GUIDE_OUTPUT_VALUES.includes(normalized)) {
|
|
23
|
-
throw new PmCliError("Guide format must be one of markdown|toon|json", EXIT_CODE.USAGE);
|
|
24
|
-
}
|
|
25
|
-
return normalized;
|
|
26
|
-
}
|
|
27
|
-
/** Implements resolve guide output format for the public runtime surface of this module. */
|
|
28
|
-
export function resolveGuideOutputFormat(options, global) {
|
|
29
|
-
const commandFormat = parseGuideOutputFormat(options.format);
|
|
30
|
-
if (global.json && commandFormat && commandFormat !== "json") {
|
|
31
|
-
throw new PmCliError("Cannot combine --json with --format markdown|toon", EXIT_CODE.USAGE);
|
|
32
|
-
}
|
|
33
|
-
if (global.json) {
|
|
34
|
-
return "json";
|
|
35
|
-
}
|
|
36
|
-
return commandFormat ?? "toon";
|
|
37
|
-
}
|
|
38
|
-
function parseGuideDepth(raw) {
|
|
39
|
-
if (!raw) {
|
|
40
|
-
return "brief";
|
|
41
|
-
}
|
|
42
|
-
const normalized = raw.trim().toLowerCase();
|
|
43
|
-
if (!GUIDE_DEPTH_VALUES.includes(normalized)) {
|
|
44
|
-
throw new PmCliError("Guide depth must be one of brief|standard|deep", EXIT_CODE.USAGE);
|
|
45
|
-
}
|
|
46
|
-
return normalized;
|
|
47
|
-
}
|
|
48
|
-
function resolvePackageRoot() {
|
|
49
|
-
return resolveConfiguredPmPackageRoot(process.env, "PM_CLI_PACKAGE_ROOT", import.meta.url, ["..", "..", ".."]);
|
|
50
|
-
}
|
|
51
|
-
function normalizeLineEndings(value) {
|
|
52
|
-
return value.replaceAll("\r\n", "\n");
|
|
53
|
-
}
|
|
54
|
-
function toExcerpt(content, maxLines, maxCharacters) {
|
|
55
|
-
const normalized = normalizeLineEndings(content);
|
|
56
|
-
const lines = normalized.split("\n");
|
|
57
|
-
const lineSlice = lines.slice(0, maxLines);
|
|
58
|
-
let excerpt = lineSlice.join("\n");
|
|
59
|
-
let truncated = lines.length > maxLines;
|
|
60
|
-
if (excerpt.length > maxCharacters) {
|
|
61
|
-
excerpt = excerpt.slice(0, maxCharacters);
|
|
62
|
-
truncated = true;
|
|
63
|
-
}
|
|
64
|
-
return {
|
|
65
|
-
excerpt: excerpt.trimEnd(),
|
|
66
|
-
truncated,
|
|
67
|
-
lineCount: lines.length,
|
|
68
|
-
};
|
|
69
|
-
}
|
|
70
|
-
async function renderGuideDocs(topic, depth, packageRoot) {
|
|
71
|
-
const includeContent = depth !== "brief";
|
|
72
|
-
const contentMode = includeContent
|
|
73
|
-
? depth === "deep"
|
|
74
|
-
? "full"
|
|
75
|
-
: "excerpt"
|
|
76
|
-
: "none";
|
|
77
|
-
const docs = [];
|
|
78
|
-
for (const doc of topic.docs) {
|
|
79
|
-
const absolutePath = path.resolve(packageRoot, doc.path);
|
|
80
|
-
if (!includeContent) {
|
|
81
|
-
docs.push({
|
|
82
|
-
path: doc.path,
|
|
83
|
-
purpose: doc.purpose,
|
|
84
|
-
optional: doc.optional === true,
|
|
85
|
-
exists: true,
|
|
86
|
-
line_count: null,
|
|
87
|
-
content_mode: "none",
|
|
88
|
-
content: null,
|
|
89
|
-
truncated: false,
|
|
90
|
-
});
|
|
91
|
-
continue;
|
|
92
|
-
}
|
|
93
|
-
try {
|
|
94
|
-
const rawContent = await readFile(absolutePath, "utf8");
|
|
95
|
-
if (depth === "deep") {
|
|
96
|
-
const normalized = normalizeLineEndings(rawContent).trimEnd();
|
|
97
|
-
docs.push({
|
|
98
|
-
path: doc.path,
|
|
99
|
-
purpose: doc.purpose,
|
|
100
|
-
optional: doc.optional === true,
|
|
101
|
-
exists: true,
|
|
102
|
-
line_count: normalized.length === 0 ? 0 : normalized.split("\n").length,
|
|
103
|
-
content_mode: "full",
|
|
104
|
-
content: normalized,
|
|
105
|
-
truncated: false,
|
|
106
|
-
});
|
|
107
|
-
}
|
|
108
|
-
else {
|
|
109
|
-
const excerpt = toExcerpt(rawContent, 120, 12_000);
|
|
110
|
-
docs.push({
|
|
111
|
-
path: doc.path,
|
|
112
|
-
purpose: doc.purpose,
|
|
113
|
-
optional: doc.optional === true,
|
|
114
|
-
exists: true,
|
|
115
|
-
line_count: excerpt.lineCount,
|
|
116
|
-
content_mode: contentMode,
|
|
117
|
-
content: excerpt.excerpt,
|
|
118
|
-
truncated: excerpt.truncated,
|
|
119
|
-
});
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
catch (error) {
|
|
123
|
-
const missing = isFileAbsentError(error);
|
|
124
|
-
docs.push({
|
|
125
|
-
path: doc.path,
|
|
126
|
-
purpose: doc.purpose,
|
|
127
|
-
optional: doc.optional === true,
|
|
128
|
-
exists: false,
|
|
129
|
-
line_count: null,
|
|
130
|
-
content_mode: "none",
|
|
131
|
-
content: null,
|
|
132
|
-
truncated: false,
|
|
133
|
-
});
|
|
134
|
-
if (!missing) {
|
|
135
|
-
throw new PmCliError(`Failed to read guide document "${doc.path}".`, EXIT_CODE.GENERIC_FAILURE);
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
return docs;
|
|
140
|
-
}
|
|
141
|
-
function buildGuideIndex(depth) {
|
|
142
|
-
const topics = listGuideTopics().map((topic) => ({
|
|
143
|
-
id: topic.id,
|
|
144
|
-
aliases: topic.aliases,
|
|
145
|
-
title: topic.title,
|
|
146
|
-
summary: topic.summary,
|
|
147
|
-
intent: topic.intent,
|
|
148
|
-
quick_commands: depth === "brief"
|
|
149
|
-
? topic.commands.slice(0, 3)
|
|
150
|
-
: topic.commands.slice(0, 6),
|
|
151
|
-
docs: topic.docs.map((doc) => ({ path: doc.path, purpose: doc.purpose })),
|
|
152
|
-
related: topic.related,
|
|
153
|
-
}));
|
|
154
|
-
return {
|
|
155
|
-
output_default: "toon",
|
|
156
|
-
mode: "index",
|
|
157
|
-
depth,
|
|
158
|
-
topics,
|
|
159
|
-
suggested_next_steps: [
|
|
160
|
-
"pm guide <topic>",
|
|
161
|
-
"pm guide <topic> --depth standard",
|
|
162
|
-
"pm guide <topic> --depth deep --format markdown",
|
|
163
|
-
"pm guide <topic> --json",
|
|
164
|
-
],
|
|
165
|
-
};
|
|
166
|
-
}
|
|
167
|
-
function ensureGuideTopic(topic) {
|
|
168
|
-
const resolved = resolveGuideTopic(topic);
|
|
169
|
-
if (resolved) {
|
|
170
|
-
return resolved;
|
|
171
|
-
}
|
|
172
|
-
const available = listGuideTopicIds().join(", ");
|
|
173
|
-
throw new PmCliError(`Unknown guide topic "${topic}". Available topics: ${available}. Use "pm guide --list" to browse.`, EXIT_CODE.USAGE);
|
|
174
|
-
}
|
|
175
|
-
/** Implements run guide for the public runtime surface of this module. */
|
|
176
|
-
export async function runGuide(options, global) {
|
|
177
|
-
const depth = parseGuideDepth(typeof options.depth === "string" ? options.depth : undefined);
|
|
178
|
-
const listRequested = options.list === true;
|
|
179
|
-
const topicRaw = typeof options.topic === "string" ? options.topic : undefined;
|
|
180
|
-
if (listRequested || !topicRaw) {
|
|
181
|
-
return buildGuideIndex(depth);
|
|
182
|
-
}
|
|
183
|
-
const topic = ensureGuideTopic(topicRaw);
|
|
184
|
-
const packageRoot = resolvePackageRoot();
|
|
185
|
-
const docs = await renderGuideDocs(topic, depth, packageRoot);
|
|
186
|
-
const warnings = docs
|
|
187
|
-
.filter((doc) => !doc.exists && !doc.optional)
|
|
188
|
-
.map((doc) => `Missing required guide document: ${doc.path}`);
|
|
189
|
-
return {
|
|
190
|
-
output_default: "toon",
|
|
191
|
-
mode: "topic",
|
|
192
|
-
depth,
|
|
193
|
-
requested_topic: topicRaw,
|
|
194
|
-
topic,
|
|
195
|
-
docs,
|
|
196
|
-
warnings,
|
|
197
|
-
};
|
|
198
|
-
}
|
|
199
|
-
/** Public contract for test only guide, shared by SDK and presentation-layer consumers. */
|
|
200
|
-
export const _testOnlyGuide = {
|
|
201
|
-
ensureGuideTopic,
|
|
202
|
-
};
|
|
203
|
-
function markdownCodeFence(content) {
|
|
204
|
-
return content.replaceAll("```", "``\\`");
|
|
205
|
-
}
|
|
206
|
-
/** Implements render guide markdown for the public runtime surface of this module. */
|
|
207
|
-
export function renderGuideMarkdown(result) {
|
|
208
|
-
if (result.mode === "index") {
|
|
209
|
-
const lines = [
|
|
210
|
-
"# pm guide",
|
|
211
|
-
"",
|
|
212
|
-
"Token-efficient local documentation index for agent and maintainer workflows.",
|
|
213
|
-
"",
|
|
214
|
-
"## Topics",
|
|
215
|
-
];
|
|
216
|
-
for (const topic of result.topics) {
|
|
217
|
-
lines.push(`- \`${topic.id}\` - ${topic.summary}`);
|
|
218
|
-
if (result.depth !== "brief") {
|
|
219
|
-
lines.push(` - intent: ${topic.intent}`);
|
|
220
|
-
lines.push(` - docs: ${topic.docs.map((doc) => `\`${doc.path}\``).join(", ")}`);
|
|
221
|
-
}
|
|
222
|
-
}
|
|
223
|
-
lines.push("", "## Next steps");
|
|
224
|
-
for (const step of result.suggested_next_steps) {
|
|
225
|
-
lines.push(`- \`${step}\``);
|
|
226
|
-
}
|
|
227
|
-
return lines.join("\n");
|
|
228
|
-
}
|
|
229
|
-
const lines = [
|
|
230
|
-
`# pm guide ${result.topic.id}`,
|
|
231
|
-
"",
|
|
232
|
-
result.topic.summary,
|
|
233
|
-
"",
|
|
234
|
-
"## Intent",
|
|
235
|
-
result.topic.intent,
|
|
236
|
-
"",
|
|
237
|
-
"## Key commands",
|
|
238
|
-
...result.topic.commands.map((command) => `- \`${command}\``),
|
|
239
|
-
"",
|
|
240
|
-
"## Workflow prompts",
|
|
241
|
-
];
|
|
242
|
-
for (const workflow of result.topic.workflows) {
|
|
243
|
-
lines.push(`### ${workflow.name}`);
|
|
244
|
-
lines.push(`goal: ${workflow.goal}`);
|
|
245
|
-
lines.push(`prompt: ${workflow.prompt}`);
|
|
246
|
-
lines.push("commands:");
|
|
247
|
-
lines.push(...workflow.commands.map((command) => `- \`${command}\``));
|
|
248
|
-
lines.push("");
|
|
249
|
-
}
|
|
250
|
-
lines.push("## Documents");
|
|
251
|
-
for (const doc of result.docs) {
|
|
252
|
-
const status = doc.exists
|
|
253
|
-
? "available"
|
|
254
|
-
: doc.optional
|
|
255
|
-
? "missing (optional)"
|
|
256
|
-
: "missing (required)";
|
|
257
|
-
lines.push(`- \`${doc.path}\` - ${doc.purpose} (${status})`);
|
|
258
|
-
if (doc.exists && doc.content_mode !== "none" && doc.content) {
|
|
259
|
-
lines.push("");
|
|
260
|
-
lines.push(`### Excerpt: \`${doc.path}\``);
|
|
261
|
-
if (doc.truncated) {
|
|
262
|
-
lines.push("_truncated for context efficiency_");
|
|
263
|
-
}
|
|
264
|
-
lines.push("```markdown");
|
|
265
|
-
lines.push(markdownCodeFence(doc.content));
|
|
266
|
-
lines.push("```");
|
|
267
|
-
}
|
|
268
|
-
}
|
|
269
|
-
if (result.topic.related.length > 0) {
|
|
270
|
-
lines.push("", "## Related topics");
|
|
271
|
-
lines.push(...result.topic.related.map((topic) => `- \`${topic}\``));
|
|
272
|
-
}
|
|
273
|
-
if (result.warnings.length > 0) {
|
|
274
|
-
lines.push("", "## Warnings");
|
|
275
|
-
lines.push(...result.warnings.map((warning) => `- ${warning}`));
|
|
276
|
-
}
|
|
277
|
-
return lines.join("\n");
|
|
278
|
-
}
|
|
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]="3a7cf539-2663-5265-90e8-c2aa9926a62a")}catch(e2){}})();import{isFileAbsentError}from"../core/fs/fs-utils.js";import{readFile}from"node:fs/promises";import path from"node:path";import{resolveConfiguredPmPackageRoot,EXIT_CODE,PmCliError}from"./runtime-primitives.js";import{listGuideTopicIds,listGuideTopics,resolveGuideTopic}from"./guide-topics.js";const GUIDE_OUTPUT_VALUES=["markdown","toon","json"];const GUIDE_DEPTH_VALUES=["brief","standard","deep"];function parseGuideOutputFormat(raw){if(!raw){return void 0}const normalized=raw.trim().toLowerCase();if(!GUIDE_OUTPUT_VALUES.includes(normalized)){throw new PmCliError("Guide format must be one of markdown|toon|json",EXIT_CODE.USAGE)}return normalized}function resolveGuideOutputFormat(options,global2){const commandFormat=parseGuideOutputFormat(options.format);if(global2.json&&commandFormat&&commandFormat!=="json"){throw new PmCliError("Cannot combine --json with --format markdown|toon",EXIT_CODE.USAGE)}if(global2.json){return"json"}return commandFormat??"toon"}function parseGuideDepth(raw){if(!raw){return"brief"}const normalized=raw.trim().toLowerCase();if(!GUIDE_DEPTH_VALUES.includes(normalized)){throw new PmCliError("Guide depth must be one of brief|standard|deep",EXIT_CODE.USAGE)}return normalized}function resolvePackageRoot(){return resolveConfiguredPmPackageRoot(process.env,"PM_CLI_PACKAGE_ROOT",import.meta.url,["..","..",".."])}function normalizeLineEndings(value){return value.replaceAll("\r\n","\n")}function toExcerpt(content,maxLines,maxCharacters){const normalized=normalizeLineEndings(content);const lines=normalized.split("\n");const lineSlice=lines.slice(0,maxLines);let excerpt=lineSlice.join("\n");let truncated=lines.length>maxLines;if(excerpt.length>maxCharacters){excerpt=excerpt.slice(0,maxCharacters);truncated=true}return{excerpt:excerpt.trimEnd(),truncated,lineCount:lines.length}}async function renderGuideDocs(topic,depth,packageRoot){const includeContent=depth!=="brief";const contentMode=includeContent?depth==="deep"?"full":"excerpt":"none";const docs=[];for(const doc of topic.docs){const absolutePath=path.resolve(packageRoot,doc.path);if(!includeContent){docs.push({path:doc.path,purpose:doc.purpose,optional:doc.optional===true,exists:true,line_count:null,content_mode:"none",content:null,truncated:false});continue}try{const rawContent=await readFile(absolutePath,"utf8");if(depth==="deep"){const normalized=normalizeLineEndings(rawContent).trimEnd();docs.push({path:doc.path,purpose:doc.purpose,optional:doc.optional===true,exists:true,line_count:normalized.length===0?0:normalized.split("\n").length,content_mode:"full",content:normalized,truncated:false})}else{const excerpt=toExcerpt(rawContent,120,12e3);docs.push({path:doc.path,purpose:doc.purpose,optional:doc.optional===true,exists:true,line_count:excerpt.lineCount,content_mode:contentMode,content:excerpt.excerpt,truncated:excerpt.truncated})}}catch(error){const missing=isFileAbsentError(error);docs.push({path:doc.path,purpose:doc.purpose,optional:doc.optional===true,exists:false,line_count:null,content_mode:"none",content:null,truncated:false});if(!missing){throw new PmCliError(`Failed to read guide document "${doc.path}".`,EXIT_CODE.GENERIC_FAILURE)}}}return docs}function buildGuideIndex(depth){const topics=listGuideTopics().map(topic=>({id:topic.id,aliases:topic.aliases,title:topic.title,summary:topic.summary,intent:topic.intent,quick_commands:depth==="brief"?topic.commands.slice(0,3):topic.commands.slice(0,6),docs:topic.docs.map(doc=>({path:doc.path,purpose:doc.purpose})),related:topic.related}));return{output_default:"toon",mode:"index",depth,topics,suggested_next_steps:["pm guide <topic>","pm guide <topic> --depth standard","pm guide <topic> --depth deep --format markdown","pm guide <topic> --json"]}}function ensureGuideTopic(topic){const resolved=resolveGuideTopic(topic);if(resolved){return resolved}const available=listGuideTopicIds().join(", ");throw new PmCliError(`Unknown guide topic "${topic}". Available topics: ${available}. Use "pm guide --list" to browse.`,EXIT_CODE.USAGE)}async function runGuide(options,global2){const depth=parseGuideDepth(typeof options.depth==="string"?options.depth:void 0);const listRequested=options.list===true;const topicRaw=typeof options.topic==="string"?options.topic:void 0;if(listRequested||!topicRaw){return buildGuideIndex(depth)}const topic=ensureGuideTopic(topicRaw);const packageRoot=resolvePackageRoot();const docs=await renderGuideDocs(topic,depth,packageRoot);const warnings=docs.filter(doc=>!doc.exists&&!doc.optional).map(doc=>`Missing required guide document: ${doc.path}`);return{output_default:"toon",mode:"topic",depth,requested_topic:topicRaw,topic,docs,warnings}}const _testOnlyGuide={ensureGuideTopic};function markdownCodeFence(content){return content.replaceAll("```","``\\`")}function renderGuideMarkdown(result){if(result.mode==="index"){const lines2=["# pm guide","","Token-efficient local documentation index for agent and maintainer workflows.","","## Topics"];for(const topic of result.topics){lines2.push(`- \`${topic.id}\` - ${topic.summary}`);if(result.depth!=="brief"){lines2.push(` - intent: ${topic.intent}`);lines2.push(` - docs: ${topic.docs.map(doc=>`\`${doc.path}\``).join(", ")}`)}}lines2.push("","## Next steps");for(const step of result.suggested_next_steps){lines2.push(`- \`${step}\``)}return lines2.join("\n")}const lines=[`# pm guide ${result.topic.id}`,"",result.topic.summary,"","## Intent",result.topic.intent,"","## Key commands",...result.topic.commands.map(command=>`- \`${command}\``),"","## Workflow prompts"];for(const workflow of result.topic.workflows){lines.push(`### ${workflow.name}`);lines.push(`goal: ${workflow.goal}`);lines.push(`prompt: ${workflow.prompt}`);lines.push("commands:");lines.push(...workflow.commands.map(command=>`- \`${command}\``));lines.push("")}lines.push("## Documents");for(const doc of result.docs){const status=doc.exists?"available":doc.optional?"missing (optional)":"missing (required)";lines.push(`- \`${doc.path}\` - ${doc.purpose} (${status})`);if(doc.exists&&doc.content_mode!=="none"&&doc.content){lines.push("");lines.push(`### Excerpt: \`${doc.path}\``);if(doc.truncated){lines.push("_truncated for context efficiency_")}lines.push("```markdown");lines.push(markdownCodeFence(doc.content));lines.push("```")}}if(result.topic.related.length>0){lines.push("","## Related topics");lines.push(...result.topic.related.map(topic=>`- \`${topic}\``))}if(result.warnings.length>0){lines.push("","## Warnings");lines.push(...result.warnings.map(warning=>`- ${warning}`))}return lines.join("\n")}export{GUIDE_DEPTH_VALUES,GUIDE_OUTPUT_VALUES,_testOnlyGuide,renderGuideMarkdown,resolveGuideOutputFormat,runGuide};
|
|
279
2
|
//# sourceMappingURL=guide.js.map
|
|
280
|
-
//# debugId=27be0fa5-1c6a-53de-a0e8-179aab7c795a
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { type VerifiedHistoryRewriteState } from "../../core/history/history-rewrite.js";
|
|
2
|
+
import { verifyHistoryChain } from "../../core/history/replay.js";
|
|
3
|
+
import type { ItemTypeRegistry } from "../../core/item/type-registry.js";
|
|
4
|
+
import { readLocatedItem } from "../../core/store/item-store.js";
|
|
5
|
+
import type { HistoryEntry, PmSettings } from "../../types/index.js";
|
|
6
|
+
import type { HistorySubject } from "./subject.js";
|
|
7
|
+
/** Built-in maintenance policies; each keeps its established diagnostics and hook names. */
|
|
8
|
+
export type HistoryMaintenanceOperation = "history-redact" | "history-repair" | "history-compact";
|
|
9
|
+
/** Shared execution controls for a preview or audited stream rewrite. */
|
|
10
|
+
export interface HistoryMaintenanceOptions {
|
|
11
|
+
/** Compute and verify the plan without acquiring a write lock or persisting it. */
|
|
12
|
+
dryRun?: boolean;
|
|
13
|
+
/** Explicit principal override; otherwise use the workspace identity policy. */
|
|
14
|
+
author?: string;
|
|
15
|
+
/** Explicit ownership or stale-lock override passed through the existing governance checks. */
|
|
16
|
+
force?: boolean;
|
|
17
|
+
}
|
|
18
|
+
/** Inputs captured before a transform, bound to the later under-lock drift checks. */
|
|
19
|
+
export interface HistoryMaintenanceSnapshot {
|
|
20
|
+
/** Original bytes used to decode `entries`, never a second independent read. */
|
|
21
|
+
raw: string;
|
|
22
|
+
/** Original stream, including historical anchors and immutable record evidence. */
|
|
23
|
+
entries: HistoryEntry[];
|
|
24
|
+
/** Chain verdict for the original entries; repair may deliberately accept drift. */
|
|
25
|
+
verification: ReturnType<typeof verifyHistoryChain>;
|
|
26
|
+
/** Current item bytes and document, or null for a deleted item's retained history. */
|
|
27
|
+
loadedItem: Awaited<ReturnType<typeof readLocatedItem>> | null;
|
|
28
|
+
/** Resolved identity shared by audit entry construction and lock ownership. */
|
|
29
|
+
author: string;
|
|
30
|
+
}
|
|
31
|
+
/** Verified outcome supplied to the operation's existing public result renderer. */
|
|
32
|
+
export interface HistoryMaintenanceOutcome {
|
|
33
|
+
/** Verification of the exact planned entries before persistence. */
|
|
34
|
+
verification: ReturnType<typeof verifyHistoryChain>;
|
|
35
|
+
/** Governance and write-hook warnings, empty for a preview or unchanged plan. */
|
|
36
|
+
warnings: string[];
|
|
37
|
+
}
|
|
38
|
+
/** Operation-owned transform with optional transactional item changes and receipt checks. */
|
|
39
|
+
export interface HistoryMaintenancePlan<Result> {
|
|
40
|
+
/** Whether the transformation warrants persistence when not previewing. */
|
|
41
|
+
changed: boolean;
|
|
42
|
+
/** Final stream including any operation-specific baseline or audit marker. */
|
|
43
|
+
rewrittenEntries: HistoryEntry[];
|
|
44
|
+
/** Additional evidence check executed under the lock before any write. */
|
|
45
|
+
beforeWrite?: () => Promise<void>;
|
|
46
|
+
/** Override only when history and item bytes must share a rollback transaction. */
|
|
47
|
+
applyRewrite?: (verified: VerifiedHistoryRewriteState) => Promise<void>;
|
|
48
|
+
/** Override when the operation must also dispatch item hooks or derived-index warnings. */
|
|
49
|
+
afterWrite?: () => Promise<string[]>;
|
|
50
|
+
/** Preserve the operation's public report shape after preview or application completes. */
|
|
51
|
+
report: (outcome: HistoryMaintenanceOutcome) => Result;
|
|
52
|
+
}
|
|
53
|
+
/** Resolved workspace and transform supplied by built-ins or SDK integrations. */
|
|
54
|
+
export interface HistoryMaintenanceParams<Result> {
|
|
55
|
+
/** Initialized tracker root whose settings and subject were resolved by the caller. */
|
|
56
|
+
pmRoot: string;
|
|
57
|
+
/** Live item or retained deleted-item history selected for maintenance. */
|
|
58
|
+
subject: HistorySubject;
|
|
59
|
+
/** Workspace policy used consistently for the snapshot and locked write. */
|
|
60
|
+
settings: PmSettings;
|
|
61
|
+
/** Active item-folder mapping, including package-provided types. */
|
|
62
|
+
typeRegistry: ItemTypeRegistry;
|
|
63
|
+
/** Maintenance policy whose diagnostic and hook compatibility must be preserved. */
|
|
64
|
+
operation: HistoryMaintenanceOperation;
|
|
65
|
+
/** Preview and ownership controls. */
|
|
66
|
+
options: HistoryMaintenanceOptions;
|
|
67
|
+
/** Pure planning or evidence reads; persistence belongs in the returned transaction callbacks. */
|
|
68
|
+
transform: (snapshot: HistoryMaintenanceSnapshot) => HistoryMaintenancePlan<Result> | Promise<HistoryMaintenancePlan<Result>>;
|
|
69
|
+
}
|
|
70
|
+
/** Verify every transform before writing and reject concurrent item or stream changes under the lock. */
|
|
71
|
+
export declare function runHistoryMaintenance<Result>(params: HistoryMaintenanceParams<Result>): Promise<Result>;
|
|
@@ -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]="7bab0f96-b67f-5523-9d1f-7426e1d58fbd")}catch(e2){}})();import{runActiveOnWriteHooks}from"../../core/extensions/index.js";import{readHistorySnapshot}from"../../core/history/read.js";import{executeHistoryRewrite,writeHistoryRawWithRollback}from"../../core/history/history-rewrite.js";import{historyEntriesToRaw,verifyHistoryChain}from"../../core/history/replay.js";import{resolveAuthor}from"../../core/shared/author.js";import{EXIT_CODE}from"../../core/shared/constants.js";import{PmCliError}from"../../core/shared/errors.js";import{readLocatedItem}from"../../core/store/item-store.js";async function runHistoryMaintenance(params){const{subject,settings,operation,options}=params;const snapshot=await readHistorySnapshot(subject.historyPath,subject.id);if(snapshot.raw===null){throw new PmCliError(`No history stream exists for ${subject.id}.`,EXIT_CODE.NOT_FOUND)}if(snapshot.entries.length===0){throw new PmCliError(`No history entries exist for ${subject.id}; nothing to ${operation.slice("history-".length)}.`,EXIT_CODE.USAGE)}const loadedItem=subject.located?await readLocatedItem(subject.located,{schema:settings.schema}):null;const author=resolveAuthor(options.author,settings.author_default);const plan=await params.transform({raw:snapshot.raw,entries:snapshot.entries,verification:verifyHistoryChain(snapshot.entries),loadedItem,author});const verification=verifyHistoryChain(plan.rewrittenEntries);if(!verification.ok){throw new PmCliError(`${operation} produced an invalid rewritten chain (${verification.errors.join(", ")}).`,EXIT_CODE.GENERIC_FAILURE)}const warnings=plan.changed&&!options.dryRun?await executeHistoryRewrite({pmRoot:params.pmRoot,subject,settings,typeRegistry:params.typeRegistry,historyRawBeforeLock:snapshot.raw,currentItemRawBeforeLock:loadedItem?.raw??null,operation,author,force:options.force,itemDocument:loadedItem?.document??null,applyRewrite:async verified=>{await plan.beforeWrite?.();if(plan.applyRewrite){await plan.applyRewrite(verified)}else{await writeHistoryRawWithRollback({historyPath:subject.historyPath,nextHistoryRaw:historyEntriesToRaw(plan.rewrittenEntries),historyRawUnderLock:verified.historyRawUnderLock})}},applyPostRewrite:plan.afterWrite??(async()=>runActiveOnWriteHooks({path:subject.historyPath,scope:"project",op:`${operation.replace("-","_")}:history`}))}):[];return plan.report({verification,warnings})}export{runHistoryMaintenance};
|
|
2
|
+
//# sourceMappingURL=maintenance.js.map
|
|
@@ -1,248 +1,3 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
* Recover an invalid JSONL suffix while preserving every verified prefix byte.
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
!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]="49af8ec4-dd6b-56ef-8833-9c776fa35c85")}catch(e){}}();
|
|
7
|
-
import { isUtf8 } from "node:buffer";
|
|
8
|
-
import { readFile } from "node:fs/promises";
|
|
9
|
-
import { isFileMissingError, readFileIfExists, } from "../../core/fs/fs-utils.js";
|
|
10
|
-
import { acquireLock } from "../../core/lock/lock.js";
|
|
11
|
-
import { createHistoryEntry, sealHistoryRecord, } from "../../core/history/history.js";
|
|
12
|
-
import { checkHistoryRewriteOwnership, writeHistoryRawWithRollback, } from "../../core/history/history-rewrite.js";
|
|
13
|
-
import { replayHistoryToTarget } from "../../core/history/projection.js";
|
|
14
|
-
import { replayToItemDocument, verifyHistoryChainWithVersion, } from "../../core/history/replay.js";
|
|
15
|
-
import { findFirstMergeConflictMarker } from "../../core/shared/conflict-markers.js";
|
|
16
|
-
import { EXIT_CODE } from "../../core/shared/constants.js";
|
|
17
|
-
import { PmCliError } from "../../core/shared/errors.js";
|
|
18
|
-
import { sha256Hex } from "../../core/shared/serialization.js";
|
|
19
|
-
import { nowIso } from "../../core/shared/time.js";
|
|
20
|
-
import { runActiveOnReadHooks, runActiveOnWriteHooks, } from "../../core/extensions/index.js";
|
|
21
|
-
import { locateItem, readLocatedItemSnapshot, } from "../../core/store/item-store.js";
|
|
22
|
-
/** Decode a whole record or identify an invalid suffix without hiding a valid record. */
|
|
23
|
-
function decodeSalvageLine(line) {
|
|
24
|
-
let parsed;
|
|
25
|
-
try {
|
|
26
|
-
parsed = JSON.parse(line);
|
|
27
|
-
}
|
|
28
|
-
catch {
|
|
29
|
-
// A complete record followed by crash padding is not a disposable line.
|
|
30
|
-
// Refuse instead of silently dropping that record along with the padding.
|
|
31
|
-
if (line.trimStart().startsWith("{") && line.includes("}")) {
|
|
32
|
-
throw new PmCliError("History salvage cannot discard a potentially complete record with trailing corruption.", EXIT_CODE.CONFLICT, { code: "history_salvage_refused" });
|
|
33
|
-
}
|
|
34
|
-
return null;
|
|
35
|
-
}
|
|
36
|
-
if (typeof parsed !== "object" || parsed === null || Array.isArray(parsed)) {
|
|
37
|
-
throw new PmCliError("History salvage would conceal interior corruption or a malformed record.", EXIT_CODE.CONFLICT, { code: "history_salvage_refused" });
|
|
38
|
-
}
|
|
39
|
-
const entry = parsed;
|
|
40
|
-
if (!Array.isArray(entry.patch) ||
|
|
41
|
-
![
|
|
42
|
-
entry.ts,
|
|
43
|
-
entry.author,
|
|
44
|
-
entry.op,
|
|
45
|
-
entry.before_hash,
|
|
46
|
-
entry.after_hash,
|
|
47
|
-
].every((field) => typeof field === "string")) {
|
|
48
|
-
throw new PmCliError("History salvage requires complete history records before the invalid tail.", EXIT_CODE.CONFLICT, { code: "history_salvage_refused" });
|
|
49
|
-
}
|
|
50
|
-
return entry;
|
|
51
|
-
}
|
|
52
|
-
/**
|
|
53
|
-
* Select a hash-verified prefix. Any parseable JSON after the first invalid
|
|
54
|
-
* line makes the corruption interior and therefore unsalvageable by truncation.
|
|
55
|
-
*/
|
|
56
|
-
export function inspectHistoryTail(raw) {
|
|
57
|
-
if (findFirstMergeConflictMarker(raw)) {
|
|
58
|
-
throw new PmCliError("Resolve history merge conflicts before salvage.", EXIT_CODE.CONFLICT, { code: "history_salvage_refused" });
|
|
59
|
-
}
|
|
60
|
-
const entries = [];
|
|
61
|
-
let offset = 0;
|
|
62
|
-
let invalidOffset;
|
|
63
|
-
let invalidLine = 0;
|
|
64
|
-
for (const [index, line] of raw.split("\n").entries()) {
|
|
65
|
-
if (!line.trim()) {
|
|
66
|
-
offset += line.length + 1;
|
|
67
|
-
continue;
|
|
68
|
-
}
|
|
69
|
-
const parsed = decodeSalvageLine(line);
|
|
70
|
-
if (parsed === null) {
|
|
71
|
-
if (invalidOffset === undefined) {
|
|
72
|
-
invalidOffset = offset;
|
|
73
|
-
invalidLine = index + 1;
|
|
74
|
-
}
|
|
75
|
-
offset += line.length + 1;
|
|
76
|
-
continue;
|
|
77
|
-
}
|
|
78
|
-
if (invalidOffset !== undefined) {
|
|
79
|
-
throw new PmCliError("History salvage would discard a record or conceal interior corruption.", EXIT_CODE.CONFLICT, {
|
|
80
|
-
code: "history_salvage_refused",
|
|
81
|
-
required: "Recover the damaged record from version control or a backup; no bytes were changed.",
|
|
82
|
-
});
|
|
83
|
-
}
|
|
84
|
-
entries.push(parsed);
|
|
85
|
-
offset += line.length + 1;
|
|
86
|
-
}
|
|
87
|
-
const verification = verifyHistoryChainWithVersion(entries);
|
|
88
|
-
if (!verification.ok || verification.item_hash_version === undefined) {
|
|
89
|
-
throw new PmCliError("History salvage requires a nonempty verified prefix.", EXIT_CODE.CONFLICT, {
|
|
90
|
-
code: "history_salvage_refused",
|
|
91
|
-
verification_errors: verification.errors,
|
|
92
|
-
required: "Recover an intact history prefix from version control or a backup.",
|
|
93
|
-
});
|
|
94
|
-
}
|
|
95
|
-
return {
|
|
96
|
-
entries,
|
|
97
|
-
itemHashVersion: verification.item_hash_version,
|
|
98
|
-
prefix: invalidOffset === undefined ? raw : raw.slice(0, invalidOffset),
|
|
99
|
-
receipt: invalidOffset === undefined
|
|
100
|
-
? null
|
|
101
|
-
: {
|
|
102
|
-
first_invalid_line: invalidLine,
|
|
103
|
-
discarded_bytes: Buffer.byteLength(raw.slice(invalidOffset)),
|
|
104
|
-
discarded_sha256: sha256Hex(raw.slice(invalidOffset)),
|
|
105
|
-
retained_entries: entries.length,
|
|
106
|
-
},
|
|
107
|
-
};
|
|
108
|
-
}
|
|
109
|
-
/** Prefer the live item's owner; history supplies ownership only when its file is unreadable. */
|
|
110
|
-
async function readSalvageOwnership(subject, settings, fallback) {
|
|
111
|
-
if (!subject.located)
|
|
112
|
-
return { itemRaw: null, document: fallback };
|
|
113
|
-
const snapshot = await readLocatedItemSnapshot(subject.located, {
|
|
114
|
-
schema: settings.schema,
|
|
115
|
-
});
|
|
116
|
-
return { itemRaw: snapshot.raw, document: snapshot.document ?? fallback };
|
|
117
|
-
}
|
|
118
|
-
/** Refuse lossy decoding so suffix receipts and rollback always describe original bytes. */
|
|
119
|
-
async function readSalvageStream(historyPath) {
|
|
120
|
-
let bytes;
|
|
121
|
-
try {
|
|
122
|
-
bytes = await readFile(historyPath);
|
|
123
|
-
}
|
|
124
|
-
catch (error) {
|
|
125
|
-
if (isFileMissingError(error))
|
|
126
|
-
return null;
|
|
127
|
-
throw error;
|
|
128
|
-
}
|
|
129
|
-
if (!isUtf8(bytes)) {
|
|
130
|
-
throw new PmCliError("History salvage requires UTF-8 input; recover binary corruption from a byte-preserving backup.", EXIT_CODE.CONFLICT, { code: "history_salvage_refused" });
|
|
131
|
-
}
|
|
132
|
-
return bytes.toString("utf8");
|
|
133
|
-
}
|
|
134
|
-
/** Salvage one explicitly selected stream under its normal ownership and lock policy. */
|
|
135
|
-
export async function salvageHistoryTail(params) {
|
|
136
|
-
const { subject, settings, options, author } = params;
|
|
137
|
-
if ([
|
|
138
|
-
options.normalizeProvenance,
|
|
139
|
-
options.auditOperation,
|
|
140
|
-
options.auditContext,
|
|
141
|
-
options.auditContextById,
|
|
142
|
-
options.forceAuditEntry,
|
|
143
|
-
options.mergeReceiptProof,
|
|
144
|
-
options.mergeReceiptProofById,
|
|
145
|
-
].some(Boolean)) {
|
|
146
|
-
throw new PmCliError("Tail salvage cannot be combined with other repair modes.", EXIT_CODE.USAGE);
|
|
147
|
-
}
|
|
148
|
-
const raw = await readSalvageStream(subject.historyPath);
|
|
149
|
-
if (raw === null)
|
|
150
|
-
throw new PmCliError(`No history stream exists for ${subject.id}.`, EXIT_CODE.NOT_FOUND);
|
|
151
|
-
await runActiveOnReadHooks({ path: subject.historyPath, scope: "project" });
|
|
152
|
-
const selected = inspectHistoryTail(raw);
|
|
153
|
-
const replay = replayHistoryToTarget(selected.entries, selected.entries.length - 1);
|
|
154
|
-
const document = replayToItemDocument(replay);
|
|
155
|
-
if (typeof replay.metadata.id === "string" &&
|
|
156
|
-
replay.metadata.id !== subject.id) {
|
|
157
|
-
throw new PmCliError("History belongs to another item; salvage refused.", EXIT_CODE.CONFLICT, { code: "history_salvage_refused" });
|
|
158
|
-
}
|
|
159
|
-
const ownership = await readSalvageOwnership(subject, settings, document);
|
|
160
|
-
const warnings = checkHistoryRewriteOwnership({
|
|
161
|
-
itemDocument: ownership.document,
|
|
162
|
-
subjectId: subject.id,
|
|
163
|
-
author,
|
|
164
|
-
force: options.force,
|
|
165
|
-
settings,
|
|
166
|
-
});
|
|
167
|
-
const version = selected.itemHashVersion;
|
|
168
|
-
const dryRun = options.dryRun === true;
|
|
169
|
-
const changed = selected.receipt !== null;
|
|
170
|
-
if (changed && !dryRun) {
|
|
171
|
-
const release = await acquireLock(params.pmRoot, subject.id, settings.locks.ttl_seconds, author, Boolean(options.force), settings.governance.force_required_for_stale_lock, settings.locks.wait_ms);
|
|
172
|
-
try {
|
|
173
|
-
const currentRaw = await readSalvageStream(subject.historyPath);
|
|
174
|
-
const located = await locateItem(params.pmRoot, subject.id, settings.id_prefix, settings.item_format, params.typeRegistry.type_to_folder);
|
|
175
|
-
const currentItem = located
|
|
176
|
-
? await readFileIfExists(located.itemPath)
|
|
177
|
-
: null;
|
|
178
|
-
if (currentRaw !== raw || currentItem !== ownership.itemRaw) {
|
|
179
|
-
throw new PmCliError("History or item changed while waiting for salvage lock; retry.", EXIT_CODE.CONFLICT);
|
|
180
|
-
}
|
|
181
|
-
const audit = sealHistoryRecord({
|
|
182
|
-
...createHistoryEntry({
|
|
183
|
-
nowIso: nowIso(),
|
|
184
|
-
author,
|
|
185
|
-
op: "history_salvage",
|
|
186
|
-
before: document,
|
|
187
|
-
after: document,
|
|
188
|
-
message: options.message,
|
|
189
|
-
context: { history_salvage: selected.receipt },
|
|
190
|
-
}),
|
|
191
|
-
before_hash: selected.entries.at(-1).after_hash,
|
|
192
|
-
after_hash: selected.entries.at(-1).after_hash,
|
|
193
|
-
item_hash_version: version,
|
|
194
|
-
});
|
|
195
|
-
await writeHistoryRawWithRollback({
|
|
196
|
-
historyPath: subject.historyPath,
|
|
197
|
-
historyRawUnderLock: raw,
|
|
198
|
-
nextHistoryRaw: `${selected.prefix}${JSON.stringify(audit)}\n`,
|
|
199
|
-
});
|
|
200
|
-
warnings.push(...(await runActiveOnWriteHooks({
|
|
201
|
-
path: subject.historyPath,
|
|
202
|
-
scope: "project",
|
|
203
|
-
op: "history_salvage:history",
|
|
204
|
-
})));
|
|
205
|
-
}
|
|
206
|
-
finally {
|
|
207
|
-
await release();
|
|
208
|
-
}
|
|
209
|
-
}
|
|
210
|
-
return {
|
|
211
|
-
id: subject.id,
|
|
212
|
-
dry_run: dryRun,
|
|
213
|
-
changed,
|
|
214
|
-
history: {
|
|
215
|
-
path: subject.historyPath,
|
|
216
|
-
entries_scanned: selected.entries.length,
|
|
217
|
-
chain_drift_before: false,
|
|
218
|
-
entries_rehashed: 0,
|
|
219
|
-
entries_patch_repaired: 0,
|
|
220
|
-
converted_replace_to_add: 0,
|
|
221
|
-
skipped_ops: 0,
|
|
222
|
-
reconciled_with_item: false,
|
|
223
|
-
audit_entry_added: changed && !dryRun,
|
|
224
|
-
verify_ok: true,
|
|
225
|
-
verify_errors: [],
|
|
226
|
-
item_hash_version_before: version,
|
|
227
|
-
item_hash_version_after: version,
|
|
228
|
-
version_disposition: "preserved",
|
|
229
|
-
},
|
|
230
|
-
item: {
|
|
231
|
-
exists: subject.located !== null,
|
|
232
|
-
path: subject.located?.itemPath ?? null,
|
|
233
|
-
matched_chain_before: null,
|
|
234
|
-
},
|
|
235
|
-
provenance_normalization: {
|
|
236
|
-
requested: false,
|
|
237
|
-
changed: false,
|
|
238
|
-
events_changed: 0,
|
|
239
|
-
observations_removed: 0,
|
|
240
|
-
invalid_values: [],
|
|
241
|
-
},
|
|
242
|
-
...(selected.receipt ? { salvage: selected.receipt } : {}),
|
|
243
|
-
warnings,
|
|
244
|
-
generated_at: nowIso(),
|
|
245
|
-
};
|
|
246
|
-
}
|
|
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]="dc2b27fd-1e6e-5651-b2b3-642ee4bd1d79")}catch(e2){}})();import{isUtf8}from"node:buffer";import{readFile}from"node:fs/promises";import{isFileMissingError,readFileIfExists}from"../../core/fs/fs-utils.js";import{acquireLock}from"../../core/lock/lock.js";import{createHistoryEntry,sealHistoryRecord}from"../../core/history/history.js";import{checkHistoryRewriteOwnership,writeHistoryRawWithRollback}from"../../core/history/history-rewrite.js";import{replayHistoryToTarget}from"../../core/history/projection.js";import{replayToItemDocument,verifyHistoryChainWithVersion}from"../../core/history/replay.js";import{findFirstMergeConflictMarker}from"../../core/shared/conflict-markers.js";import{EXIT_CODE}from"../../core/shared/constants.js";import{PmCliError}from"../../core/shared/errors.js";import{sha256Hex}from"../../core/shared/serialization.js";import{nowIso}from"../../core/shared/time.js";import{runActiveOnReadHooks,runActiveOnWriteHooks}from"../../core/extensions/index.js";import{locateItem,readLocatedItemSnapshot}from"../../core/store/item-store.js";function decodeSalvageLine(line){let parsed;try{parsed=JSON.parse(line)}catch{if(line.trimStart().startsWith("{")&&line.includes("}")){throw new PmCliError("History salvage cannot discard a potentially complete record with trailing corruption.",EXIT_CODE.CONFLICT,{code:"history_salvage_refused"})}return null}if(typeof parsed!=="object"||parsed===null||Array.isArray(parsed)){throw new PmCliError("History salvage would conceal interior corruption or a malformed record.",EXIT_CODE.CONFLICT,{code:"history_salvage_refused"})}const entry=parsed;if(!Array.isArray(entry.patch)||![entry.ts,entry.author,entry.op,entry.before_hash,entry.after_hash].every(field=>typeof field==="string")){throw new PmCliError("History salvage requires complete history records before the invalid tail.",EXIT_CODE.CONFLICT,{code:"history_salvage_refused"})}return entry}function inspectHistoryTail(raw){if(findFirstMergeConflictMarker(raw)){throw new PmCliError("Resolve history merge conflicts before salvage.",EXIT_CODE.CONFLICT,{code:"history_salvage_refused"})}const entries=[];let offset=0;let invalidOffset;let invalidLine=0;for(const[index,line]of raw.split("\n").entries()){if(!line.trim()){offset+=line.length+1;continue}const parsed=decodeSalvageLine(line);if(parsed===null){if(invalidOffset===void 0){invalidOffset=offset;invalidLine=index+1}offset+=line.length+1;continue}if(invalidOffset!==void 0){throw new PmCliError("History salvage would discard a record or conceal interior corruption.",EXIT_CODE.CONFLICT,{code:"history_salvage_refused",required:"Recover the damaged record from version control or a backup; no bytes were changed."})}entries.push(parsed);offset+=line.length+1}const verification=verifyHistoryChainWithVersion(entries);if(!verification.ok||verification.item_hash_version===void 0){throw new PmCliError("History salvage requires a nonempty verified prefix.",EXIT_CODE.CONFLICT,{code:"history_salvage_refused",verification_errors:verification.errors,required:"Recover an intact history prefix from version control or a backup."})}return{entries,itemHashVersion:verification.item_hash_version,prefix:invalidOffset===void 0?raw:raw.slice(0,invalidOffset),receipt:invalidOffset===void 0?null:{first_invalid_line:invalidLine,discarded_bytes:Buffer.byteLength(raw.slice(invalidOffset)),discarded_sha256:sha256Hex(raw.slice(invalidOffset)),retained_entries:entries.length}}}async function readSalvageOwnership(subject,settings,fallback){if(!subject.located)return{itemRaw:null,document:fallback};const snapshot=await readLocatedItemSnapshot(subject.located,{schema:settings.schema});return{itemRaw:snapshot.raw,document:snapshot.document??fallback}}async function readSalvageStream(historyPath){let bytes;try{bytes=await readFile(historyPath)}catch(error){if(isFileMissingError(error))return null;throw error}if(!isUtf8(bytes)){throw new PmCliError("History salvage requires UTF-8 input; recover binary corruption from a byte-preserving backup.",EXIT_CODE.CONFLICT,{code:"history_salvage_refused"})}return bytes.toString("utf8")}async function salvageHistoryTail(params){const{subject,settings,options,author}=params;if([options.normalizeProvenance,options.auditOperation,options.auditContext,options.auditContextById,options.forceAuditEntry,options.mergeReceiptProof,options.mergeReceiptProofById].some(Boolean)){throw new PmCliError("Tail salvage cannot be combined with other repair modes.",EXIT_CODE.USAGE)}const raw=await readSalvageStream(subject.historyPath);if(raw===null)throw new PmCliError(`No history stream exists for ${subject.id}.`,EXIT_CODE.NOT_FOUND);await runActiveOnReadHooks({path:subject.historyPath,scope:"project"});const selected=inspectHistoryTail(raw);const replay=replayHistoryToTarget(selected.entries,selected.entries.length-1);const document=replayToItemDocument(replay);if(typeof replay.metadata.id==="string"&&replay.metadata.id!==subject.id){throw new PmCliError("History belongs to another item; salvage refused.",EXIT_CODE.CONFLICT,{code:"history_salvage_refused"})}const ownership=await readSalvageOwnership(subject,settings,document);const warnings=checkHistoryRewriteOwnership({itemDocument:ownership.document,subjectId:subject.id,author,force:options.force,settings});const version=selected.itemHashVersion;const dryRun=options.dryRun===true;const changed=selected.receipt!==null;if(changed&&!dryRun){const release=await acquireLock(params.pmRoot,subject.id,settings.locks.ttl_seconds,author,Boolean(options.force),settings.governance.force_required_for_stale_lock,settings.locks.wait_ms);try{const currentRaw=await readSalvageStream(subject.historyPath);const located=await locateItem(params.pmRoot,subject.id,settings.id_prefix,settings.item_format,params.typeRegistry.type_to_folder);const currentItem=located?await readFileIfExists(located.itemPath):null;if(currentRaw!==raw||currentItem!==ownership.itemRaw){throw new PmCliError("History or item changed while waiting for salvage lock; retry.",EXIT_CODE.CONFLICT)}const audit=sealHistoryRecord({...createHistoryEntry({nowIso:nowIso(),author,op:"history_salvage",before:document,after:document,message:options.message,context:{history_salvage:selected.receipt}}),before_hash:selected.entries.at(-1).after_hash,after_hash:selected.entries.at(-1).after_hash,item_hash_version:version});await writeHistoryRawWithRollback({historyPath:subject.historyPath,historyRawUnderLock:raw,nextHistoryRaw:`${selected.prefix}${JSON.stringify(audit)}
|
|
2
|
+
`});warnings.push(...await runActiveOnWriteHooks({path:subject.historyPath,scope:"project",op:"history_salvage:history"}))}finally{await release()}}return{id:subject.id,dry_run:dryRun,changed,history:{path:subject.historyPath,entries_scanned:selected.entries.length,chain_drift_before:false,entries_rehashed:0,entries_patch_repaired:0,converted_replace_to_add:0,skipped_ops:0,reconciled_with_item:false,audit_entry_added:changed&&!dryRun,verify_ok:true,verify_errors:[],item_hash_version_before:version,item_hash_version_after:version,version_disposition:"preserved"},item:{exists:subject.located!==null,path:subject.located?.itemPath??null,matched_chain_before:null},provenance_normalization:{requested:false,changed:false,events_changed:0,observations_removed:0,invalid_values:[]},...selected.receipt?{salvage:selected.receipt}:{},warnings,generated_at:nowIso()}}export{inspectHistoryTail,salvageHistoryTail};
|
|
247
3
|
//# sourceMappingURL=salvage.js.map
|
|
248
|
-
//# debugId=49af8ec4-dd6b-56ef-8833-9c776fa35c85
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { locateItem } from "../../core/store/item-store.js";
|
|
2
|
+
import type { PmSettings } from "../../types/index.js";
|
|
3
|
+
/** Resolve initialized workspace policy once for single-stream and bulk maintenance. */
|
|
4
|
+
export declare function resolveHistoryWorkspace(pmPath: string | undefined): Promise<{
|
|
5
|
+
pmRoot: string;
|
|
6
|
+
settings: PmSettings;
|
|
7
|
+
typeRegistry: import("../../core/item/type-registry.js").ItemTypeRegistry;
|
|
8
|
+
}>;
|
|
9
|
+
/** Canonical stream address, retaining item location only when the current item exists. */
|
|
10
|
+
export interface HistorySubject {
|
|
11
|
+
/** Stable identifier used to reference this record across commands and storage. */
|
|
12
|
+
id: string;
|
|
13
|
+
/** Filesystem path used for history resolution. */
|
|
14
|
+
historyPath: string;
|
|
15
|
+
/** Current item location, or null when only a deleted item's history remains. */
|
|
16
|
+
located: Awaited<ReturnType<typeof locateItem>>;
|
|
17
|
+
}
|
|
18
|
+
/** Resolve a current item first, then retained streams under normalized and raw legacy IDs. */
|
|
19
|
+
export declare function resolveHistorySubject(pmRoot: string, id: string, settings: PmSettings, typeToFolder: Record<string, string>): Promise<HistorySubject>;
|