@unbrained/pm-cli 2026.9.6 → 2026.9.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.agents/skills/pm-developer/SKILL.md +12 -4
- package/.agents/skills/pm-developer/references/MULTI_AGENT_MERGE.md +19 -10
- package/.agents/skills/pm-extensions/SKILL.md +6 -0
- package/.agents/skills/pm-sdk/SKILL.md +11 -2
- package/.agents/skills/pm-user/SKILL.md +5 -0
- package/.agents/skills/pm-user/references/ECOSYSTEM_PLANNING.md +95 -0
- package/.claude-plugin/marketplace.json +2 -2
- package/CHANGELOG.md +218 -182
- package/dist/cli/after-command-context-usage.js +1 -48
- package/dist/cli/argv-utils.js +1 -40
- package/dist/cli/bootstrap-args.js +1 -9
- package/dist/cli/bundle-integrity.js +2 -110
- package/dist/cli/commander-usage.js +11 -771
- package/dist/cli/commands/activity.js +1 -9
- package/dist/cli/commands/aggregate.js +1 -5
- package/dist/cli/commands/append.js +1 -5
- package/dist/cli/commands/claim.js +1 -5
- package/dist/cli/commands/close-many.js +1 -5
- package/dist/cli/commands/close.js +1 -9
- package/dist/cli/commands/comments.js +1 -5
- package/dist/cli/commands/config.js +1 -9
- package/dist/cli/commands/context.js +1 -9
- package/dist/cli/commands/contracts.js +1 -5
- package/dist/cli/commands/copy.js +1 -9
- package/dist/cli/commands/create.js +1 -9
- package/dist/cli/commands/delete.js +1 -9
- package/dist/cli/commands/deps.js +1 -9
- package/dist/cli/commands/docs.js +1 -9
- package/dist/cli/commands/duplicates.js +1 -9
- package/dist/cli/commands/eval.js +1 -9
- package/dist/cli/commands/extension/describe.js +1 -5
- package/dist/cli/commands/extension/scaffold.js +1 -5
- package/dist/cli/commands/extension/shared.js +1 -5
- package/dist/cli/commands/extension.js +1 -9
- package/dist/cli/commands/files.js +1 -9
- package/dist/cli/commands/focus.js +1 -9
- package/dist/cli/commands/gc.js +1 -9
- package/dist/cli/commands/get.js +1 -9
- package/dist/cli/commands/graph.js +1 -10
- package/dist/cli/commands/health.js +1 -9
- package/dist/cli/commands/history-compact.js +1 -10
- package/dist/cli/commands/history-redact.js +1 -11
- package/dist/cli/commands/history-repair.js +1 -10
- package/dist/cli/commands/history.js +1 -5
- package/dist/cli/commands/index.js +1 -58
- package/dist/cli/commands/init-agent-guidance.js +1 -9
- package/dist/cli/commands/init.js +1 -9
- package/dist/cli/commands/learnings.js +1 -5
- package/dist/cli/commands/lifecycle-transitions.js +1 -5
- package/dist/cli/commands/list.js +1 -9
- package/dist/cli/commands/merge.js +1 -11
- package/dist/cli/commands/next.js +1 -9
- package/dist/cli/commands/notes.js +1 -5
- package/dist/cli/commands/plan.js +1 -9
- package/dist/cli/commands/profile.js +1 -9
- package/dist/cli/commands/restore.js +1 -9
- package/dist/cli/commands/scheduling-shortcuts.js +1 -9
- package/dist/cli/commands/schema.js +1 -10
- package/dist/cli/commands/search.js +1 -9
- package/dist/cli/commands/stats.js +1 -9
- package/dist/cli/commands/telemetry.js +1 -9
- package/dist/cli/commands/test-all.js +1 -9
- package/dist/cli/commands/test-runs.js +1 -9
- package/dist/cli/commands/test.js +1 -9
- package/dist/cli/commands/update-many.js +1 -5
- package/dist/cli/commands/update.js +1 -9
- package/dist/cli/commands/upgrade.js +1 -5
- package/dist/cli/commands/validate.js +1 -15
- package/dist/cli/context-intent-invocation.js +1 -20
- package/dist/cli/description-stdin.js +1 -17
- package/dist/cli/error-guidance.js +1 -1353
- package/dist/cli/extension-command-help.js +5 -636
- package/dist/cli/extension-command-options.js +1 -427
- package/dist/cli/extension-recovery.js +1 -126
- package/dist/cli/help-content.js +2 -1001
- package/dist/cli/help-json-payload.js +4 -570
- package/dist/cli/main.d.ts +4 -0
- package/dist/cli/main.js +5 -2573
- package/dist/cli/migration-gates.js +1 -289
- package/dist/cli/public.js +1 -20
- package/dist/cli/register-annotations.js +1 -270
- package/dist/cli/register-assurance.js +1 -62
- package/dist/cli/register-files-lookup.js +1 -56
- package/dist/cli/register-history-activity.d.ts +8 -0
- package/dist/cli/register-history-activity.js +2 -0
- package/dist/cli/register-history-author.js +1 -38
- package/dist/cli/register-history-maintenance.d.ts +9 -0
- package/dist/cli/register-history-maintenance.js +2 -0
- package/dist/cli/register-list-query.js +10 -943
- package/dist/cli/register-mutation-options.js +1 -9
- package/dist/cli/register-mutation.js +19 -1893
- package/dist/cli/register-operations.js +1 -920
- package/dist/cli/register-setup.js +1 -716
- package/dist/cli/register-structured-mutation.js +1 -196
- package/dist/cli/registration-helpers.js +1 -5
- package/dist/cli/runtime-compatibility-boundary.js +4 -42
- package/dist/cli/schema-registration-helpers.js +1 -73
- package/dist/cli/search-refresh.js +1 -13
- package/dist/cli/stats-analytics-json.js +1 -68
- package/dist/cli/telemetry-flush.js +1 -10
- package/dist/cli-bundle/bundle-manifest.json +164 -156
- package/dist/cli-bundle/chunks/chunk-3BZZA6A3.js +5 -0
- package/dist/cli-bundle/chunks/chunk-AMRDVX36.js +235 -0
- package/dist/cli-bundle/chunks/chunk-DAM4CBBR.js +2202 -0
- package/dist/cli-bundle/chunks/{chunk-WYRZZ5ZE.js → chunk-DEZPZOQ7.js} +2 -2
- package/dist/cli-bundle/chunks/chunk-FLDWYEND.js +77 -0
- package/dist/cli-bundle/chunks/{chunk-NPN5I67J.js → chunk-G5ADGQ2D.js} +3 -3
- package/dist/cli-bundle/chunks/chunk-JAAEYHUA.js +2 -0
- package/dist/cli-bundle/chunks/{chunk-JX4DH4WC.js → chunk-KR3RP4FH.js} +3 -3
- package/dist/cli-bundle/chunks/chunk-LEZOUXG6.js +2 -0
- package/dist/cli-bundle/chunks/chunk-NSAPNEYH.js +2 -0
- package/dist/cli-bundle/chunks/chunk-QOEKOECV.js +29 -0
- package/dist/cli-bundle/chunks/chunk-RHSFOMHU.js +2 -0
- package/dist/cli-bundle/chunks/chunk-XOD2PCB6.js +20 -0
- package/dist/cli-bundle/chunks/{chunk-JT6XF6GE.js → chunk-YVEQ2AMO.js} +4 -4
- package/dist/cli-bundle/chunks/register-list-query-KSK3R63M.js +11 -0
- package/dist/cli-bundle/chunks/register-mutation-IQ5C7U6O.js +20 -0
- package/dist/cli-bundle/chunks/{register-operations-I5W3KMGB.js → register-operations-DWVHR2NC.js} +2 -2
- package/dist/cli-bundle/chunks/register-setup-BQ5SVD4B.js +2 -0
- package/dist/cli-bundle/focused-chunks/chunk-3WRPWLA7.js +3 -0
- package/dist/cli-bundle/focused-chunks/chunk-7MBUII7U.js +2 -0
- package/dist/cli-bundle/focused-chunks/chunk-COPBO5HW.js +8 -0
- package/dist/cli-bundle/focused-chunks/chunk-DUN4IXYN.js +20 -0
- package/dist/cli-bundle/focused-chunks/{chunk-LIJIA4TY.js → chunk-EE5QSM4Z.js} +3 -3
- package/dist/cli-bundle/focused-chunks/chunk-HJVARYM3.js +6 -0
- package/dist/cli-bundle/focused-chunks/chunk-IAUOUGVR.js +177 -0
- package/dist/cli-bundle/focused-chunks/chunk-KOOMJ54F.js +2 -0
- package/dist/cli-bundle/focused-chunks/chunk-MZDXX7JY.js +56 -0
- package/dist/cli-bundle/focused-chunks/{chunk-M6PBRFSH.js → chunk-OPFHFGDD.js} +2 -2
- package/dist/cli-bundle/focused-chunks/chunk-QHNETP77.js +9 -0
- package/dist/cli-bundle/focused-chunks/{chunk-3BZEOXLT.js → chunk-RMWES4M6.js} +2 -2
- package/dist/cli-bundle/focused-chunks/chunk-RXT4P5QH.js +10 -0
- package/dist/cli-bundle/focused-chunks/chunk-SDOL6FM2.js +12 -0
- package/dist/cli-bundle/focused-chunks/chunk-SQV4AAUC.js +2 -0
- package/dist/cli-bundle/focused-chunks/{chunk-PEFABF7E.js → chunk-WE3IUNIW.js} +3 -3
- package/dist/cli-bundle/focused-chunks/chunk-YALOUBWJ.js +2 -0
- package/dist/cli-bundle/main.js +20 -20
- package/dist/cli-bundle/sdk-authoring.js +1 -1
- package/dist/cli-bundle/sdk-contracts.js +2 -2
- package/dist/cli-bundle/sdk-core.js +29 -29
- package/dist/cli-bundle/sdk-governance.js +1 -1
- package/dist/cli-bundle/sdk-graph.js +1 -1
- package/dist/cli-bundle/sdk-merge.js +42 -42
- package/dist/cli-bundle/sdk-query.js +1 -1
- package/dist/cli-bundle/sdk-runtime.js +1 -1
- package/dist/cli-bundle/sdk-testing.js +1 -1
- package/dist/cli-bundle/sdk.js +11 -11
- package/dist/cli.js +1 -104
- package/dist/core/checkpoint/checkpoint-gc.js +1 -169
- package/dist/core/checkpoint/mutation-checkpoint.js +2 -133
- package/dist/core/config/nested-settings.js +1 -534
- package/dist/core/config/positional-value.js +1 -109
- package/dist/core/diagnostics/remediation.js +1 -506
- package/dist/core/extensions/activation-summary-markdown.js +2 -145
- package/dist/core/extensions/activation-summary.js +1 -92
- package/dist/core/extensions/activation-transaction.js +1 -46
- package/dist/core/extensions/capability-usage.js +1 -173
- package/dist/core/extensions/command-hook-context.js +1 -13
- package/dist/core/extensions/command-metadata-contract.js +1 -22
- package/dist/core/extensions/command-visibility-tier.js +1 -29
- package/dist/core/extensions/contribution-inventory.js +1 -173
- package/dist/core/extensions/exporter-output-contract.js +1 -66
- package/dist/core/extensions/extension-candidate.js +1 -18
- package/dist/core/extensions/extension-capability-aliases.js +1 -158
- package/dist/core/extensions/extension-hook-runtime.js +1 -699
- package/dist/core/extensions/extension-policy.js +1 -599
- package/dist/core/extensions/extension-registries.js +1 -62
- package/dist/core/extensions/extension-runtime-helpers.js +1 -33
- package/dist/core/extensions/extension-types.js +1 -102
- package/dist/core/extensions/flag-definition-validation.js +1 -52
- package/dist/core/extensions/flag-value-types.js +1 -64
- package/dist/core/extensions/index.js +1 -526
- package/dist/core/extensions/item-field-types.js +1 -39
- package/dist/core/extensions/item-fields.js +1 -261
- package/dist/core/extensions/loader.js +1 -2223
- package/dist/core/extensions/manifest-schema.js +1 -69
- package/dist/core/extensions/module-graph-snapshot.js +1 -33
- package/dist/core/extensions/preflight-ownership.js +1 -41
- package/dist/core/extensions/registration-validation.js +1 -82
- package/dist/core/extensions/registration-values.js +1 -209
- package/dist/core/extensions/reserved-host-flags.js +1 -36
- package/dist/core/extensions/runtime-registrations.js +1 -67
- package/dist/core/extensions/service-ownership.js +1 -19
- package/dist/core/extensions/version-compat.js +1 -216
- package/dist/core/fs/fs-utils.js +2 -158
- package/dist/core/fs/host-environment-errors.js +1 -141
- package/dist/core/fs/index.js +1 -9
- package/dist/core/fs/path-utils.js +1 -17
- package/dist/core/governance/content-fields.js +1 -160
- package/dist/core/governance/issue-codes.js +1 -151
- package/dist/core/governance/metadata-coverage.js +1 -358
- package/dist/core/history/drift-cache.js +3 -72
- package/dist/core/history/drift-scan.js +1 -342
- package/dist/core/history/event-classification.js +1 -109
- package/dist/core/history/event-index.js +8 -784
- package/dist/core/history/history-compact-bulk.js +1 -104
- package/dist/core/history/history-diff.js +1 -158
- package/dist/core/history/history-rewrite.d.ts +6 -1
- package/dist/core/history/history-rewrite.js +1 -107
- package/dist/core/history/history-storage-stats.js +1 -102
- package/dist/core/history/history-stream-policy.js +1 -62
- package/dist/core/history/history.js +2 -617
- package/dist/core/history/identity.js +1 -30
- package/dist/core/history/index.js +1 -9
- package/dist/core/history/projection.js +1 -196
- package/dist/core/history/read.d.ts +9 -0
- package/dist/core/history/read.js +1 -57
- package/dist/core/history/replay.js +2 -439
- package/dist/core/history/version-address.js +1 -32
- package/dist/core/history/workspace-history.js +2 -433
- package/dist/core/io/body-file.js +1 -62
- package/dist/core/io/bulk-ids-input.js +1 -112
- package/dist/core/item/actionability.js +1 -327
- package/dist/core/item/dependency-reference.js +1 -20
- package/dist/core/item/id.js +1 -112
- package/dist/core/item/index.js +1 -12
- package/dist/core/item/item-format-version.js +1 -78
- package/dist/core/item/item-format.js +5 -1473
- package/dist/core/item/item-record.js +1 -23
- package/dist/core/item/item-type-definition.js +1 -133
- package/dist/core/item/parent-reference-policy.js +1 -57
- package/dist/core/item/parse.js +2 -603
- package/dist/core/item/plan-lifecycle.js +1 -19
- package/dist/core/item/priority.js +1 -61
- package/dist/core/item/sprint-release-format.js +1 -38
- package/dist/core/item/status-filter.js +1 -115
- package/dist/core/item/status.js +1 -43
- package/dist/core/item/toon-decode.js +1 -29
- package/dist/core/item/type-registry.js +1 -715
- package/dist/core/item/type-synonyms.js +1 -38
- package/dist/core/lock/index.js +1 -9
- package/dist/core/lock/lock-gc.js +1 -240
- package/dist/core/lock/lock.js +3 -590
- package/dist/core/output/mutation-projection.js +1 -217
- package/dist/core/output/output-control.js +1 -25
- package/dist/core/output/output.js +11 -494
- package/dist/core/output/query-summary.js +1 -58
- package/dist/core/output/tabular.js +1 -77
- package/dist/core/packages/manifest.js +1 -244
- package/dist/core/packages/root.js +1 -84
- package/dist/core/profile/profile-describe.js +1 -83
- package/dist/core/profile/profile-lint.js +1 -415
- package/dist/core/profile/profile-plan.js +0 -0
- package/dist/core/profile/profile-presets.js +1 -370
- package/dist/core/reproducibility/context.js +1 -82
- package/dist/core/schema/fields-file.js +2 -288
- package/dist/core/schema/item-types-file.js +2 -296
- package/dist/core/schema/runtime-field-filters.js +1 -49
- package/dist/core/schema/runtime-field-values.js +1 -313
- package/dist/core/schema/runtime-schema.js +2 -826
- package/dist/core/schema/status-defs-file.js +2 -227
- package/dist/core/schema/status-token.js +1 -31
- package/dist/core/schema/type-inference.js +1 -95
- package/dist/core/schema/type-presets.js +1 -87
- package/dist/core/schema/type-workflows.js +1 -104
- package/dist/core/search/background-refresh.js +2 -286
- package/dist/core/search/bm25.js +1 -146
- package/dist/core/search/cache.js +2 -534
- package/dist/core/search/corpus.js +1 -311
- package/dist/core/search/embedding-batches.js +1 -163
- package/dist/core/search/eval.js +1 -225
- package/dist/core/search/http-client.js +1 -75
- package/dist/core/search/providers.js +1 -242
- package/dist/core/search/relevance.js +1 -244
- package/dist/core/search/semantic-defaults.js +1 -199
- package/dist/core/search/staleness.js +1 -30
- package/dist/core/search/vector-stores.js +2 -664
- package/dist/core/search/vectorization-metadata.js +1 -81
- package/dist/core/sentry/helpers.js +1 -272
- package/dist/core/sentry/instrument.js +1 -387
- package/dist/core/session/session-state.js +1 -260
- package/dist/core/shared/agent-session-context.js +1 -133
- package/dist/core/shared/author.js +1 -1172
- package/dist/core/shared/command-types.js +1 -4
- package/dist/core/shared/conflict-markers.js +1 -31
- package/dist/core/shared/constants.js +1 -405
- package/dist/core/shared/errors.js +1 -20
- package/dist/core/shared/html-entity-decode.js +1 -131
- package/dist/core/shared/index.js +1 -12
- package/dist/core/shared/item-metadata-contract.js +1 -89
- package/dist/core/shared/lazy-module.js +1 -16
- package/dist/core/shared/levenshtein.js +1 -61
- package/dist/core/shared/memo.js +1 -19
- package/dist/core/shared/numeric-parsers.js +1 -20
- package/dist/core/shared/option-alias-visibility.js +1 -67
- package/dist/core/shared/primitives.js +1 -127
- package/dist/core/shared/serial-queue.js +1 -79
- package/dist/core/shared/serialization.js +1 -210
- package/dist/core/shared/split-comma-list.js +1 -30
- package/dist/core/shared/text-normalization.js +1 -38
- package/dist/core/shared/time.js +1 -306
- package/dist/core/store/index.js +1 -12
- package/dist/core/store/item-format-migration.js +1 -125
- package/dist/core/store/item-metadata-cache.js +1 -1116
- package/dist/core/store/item-metadata-query-index.js +9 -394
- package/dist/core/store/item-metadata-read-work.js +1 -43
- package/dist/core/store/item-store.js +1 -693
- package/dist/core/store/paths.d.ts +1 -1
- package/dist/core/store/paths.js +1 -214
- package/dist/core/store/settings-read-cache.js +1 -85
- package/dist/core/store/settings-validator.js +1 -421
- package/dist/core/store/settings.js +3 -1309
- package/dist/core/store/tracker-preflight.js +1 -141
- package/dist/core/telemetry/consent.js +5 -108
- package/dist/core/telemetry/observability.js +1 -246
- package/dist/core/telemetry/runtime.js +4 -1988
- package/dist/core/test/background-runs.js +4 -945
- package/dist/core/test/item-test-run-tracking.js +1 -63
- package/dist/core/test/run-selectors.js +1 -120
- package/dist/core/validate/estimate-defaults.js +1 -89
- package/dist/core/validate/fix-planning.js +1 -189
- package/dist/core/validate/linked-artifact-reference.js +1 -36
- package/dist/core/validate/missing-by-type.js +1 -34
- package/dist/core/validate/missing-link-owners.js +1 -95
- package/dist/core/validate/stale-file-classification.js +1 -82
- package/dist/mcp/http-server.js +5 -448
- package/dist/mcp/legacy-adapter.js +1 -77
- package/dist/mcp/runtime-capabilities.js +1 -200
- package/dist/mcp/server.js +4 -1233
- package/dist/mcp/tool-definitions.js +1 -804
- package/dist/sdk/actionability.js +1 -13
- package/dist/sdk/agent/closed-domain-contracts.js +1 -161
- package/dist/sdk/agent/command-recovery.js +1 -59
- package/dist/sdk/agent/command-suggestions.js +1 -66
- package/dist/sdk/agent/create-option-policy.js +1 -31
- package/dist/sdk/agent/identity-config.js +1 -106
- package/dist/sdk/agent/item-addressing.js +1 -207
- package/dist/sdk/agent/refusal-closure-census.js +1 -151
- package/dist/sdk/agent/refusal-closure.js +1 -133
- package/dist/sdk/agent/refusal-corpus-contracts.js +1 -193
- package/dist/sdk/agent/refusal-reachability.js +1 -593
- package/dist/sdk/agent/subcommand-recovery.js +1 -83
- package/dist/sdk/agent/task-transcript-contracts.js +1 -197
- package/dist/sdk/agent/tracker-preflight-contracts.js +1 -126
- package/dist/sdk/agent-capability-contracts.js +1 -428
- package/dist/sdk/agent-session-context.js +1 -9
- package/dist/sdk/annotations.js +1 -448
- package/dist/sdk/author-attribution.js +1 -468
- package/dist/sdk/authoring.js +1 -20
- package/dist/sdk/cli-bootstrap.js +1 -838
- package/dist/sdk/cli-contracts/agent-output-contracts.d.ts +1 -1
- package/dist/sdk/cli-contracts/agent-output-contracts.js +4 -476
- package/dist/sdk/cli-contracts/bootstrap-command-scanner.js +1 -79
- package/dist/sdk/cli-contracts/command-aliases.d.ts +4 -0
- package/dist/sdk/cli-contracts/command-aliases.js +1 -107
- package/dist/sdk/cli-contracts/command-exit-contracts.js +1 -151
- package/dist/sdk/cli-contracts/commander-mutation-options.js +1 -1081
- package/dist/sdk/cli-contracts/commander-types.js +1 -159
- package/dist/sdk/cli-contracts/completeness.js +1 -393
- package/dist/sdk/cli-contracts/enum-contracts.js +1 -222
- package/dist/sdk/cli-contracts/flag-contracts.js +1 -1947
- package/dist/sdk/cli-contracts/flag-lexicon-contracts.js +1 -347
- package/dist/sdk/cli-contracts/grammar-contracts.js +1 -986
- package/dist/sdk/cli-contracts/registration-helpers.js +7 -990
- package/dist/sdk/cli-contracts/runtime-contracts.d.ts +5 -0
- package/dist/sdk/cli-contracts/runtime-contracts.js +1 -2090
- package/dist/sdk/cli-contracts/schemas/assurance-definition.js +1 -324
- package/dist/sdk/cli-contracts/string-lists.js +1 -16
- package/dist/sdk/cli-contracts/tool-option-contracts.js +1 -461
- package/dist/sdk/cli-contracts/tool-parameter-tables.js +1 -2167
- package/dist/sdk/cli-contracts/tool-schema.d.ts +3 -1
- package/dist/sdk/cli-contracts/tool-schema.js +1 -1664
- package/dist/sdk/cli-contracts/typed-action-inputs.js +1 -4
- package/dist/sdk/cli-contracts.d.ts +1 -1
- package/dist/sdk/cli-contracts.js +1 -17
- package/dist/sdk/cli-program.js +1 -49
- package/dist/sdk/command-line.d.ts +2 -5
- package/dist/sdk/command-line.js +1 -78
- package/dist/sdk/comments.js +1 -133
- package/dist/sdk/compile-cache.js +1 -73
- package/dist/sdk/completion.js +157 -837
- package/dist/sdk/compose.js +1 -1090
- package/dist/sdk/config.js +1 -1204
- package/dist/sdk/context/recency.js +1 -33
- package/dist/sdk/context/semantic-session-attribution.js +1 -82
- package/dist/sdk/context/usage-egress.js +1 -29
- package/dist/sdk/context/usage-ledger.js +3 -185
- package/dist/sdk/context-intent-contracts.js +1 -709
- package/dist/sdk/context-intent-runtime.js +1 -115
- package/dist/sdk/context-packing.js +1 -218
- package/dist/sdk/context-relevance.js +1 -503
- package/dist/sdk/context-signal-store.js +2 -426
- package/dist/sdk/context-usage.js +1 -367
- package/dist/sdk/contracts.js +1 -23
- package/dist/sdk/core-governance.js +1 -14
- package/dist/sdk/core.js +1 -14
- package/dist/sdk/corpus-shape.js +1 -401
- package/dist/sdk/define.js +1 -220
- package/dist/sdk/dependencies.js +1 -718
- package/dist/sdk/dependency-flag-validation.js +1 -156
- package/dist/sdk/dependency-provenance.js +1 -135
- package/dist/sdk/docs.js +1 -14
- package/dist/sdk/duplicates.js +1 -40
- package/dist/sdk/environment/agent-environment.js +1 -466
- package/dist/sdk/environment/host-environment-errors.js +1 -8
- package/dist/sdk/environment/project-runtime-compatibility.js +1 -481
- package/dist/sdk/environment/source-context.js +1 -28
- package/dist/sdk/environment/tracker-preflight.js +1 -9
- package/dist/sdk/error-code-catalog.js +1 -153
- package/dist/sdk/error-runtime.js +1 -58
- package/dist/sdk/errors.js +1 -58
- package/dist/sdk/eval.js +1 -190
- package/dist/sdk/extension/author-manifest.js +1 -92
- package/dist/sdk/extension/bundled-catalog.js +1 -332
- package/dist/sdk/extension/concurrency.js +1 -25
- package/dist/sdk/extension/copy-scope.d.ts +2 -0
- package/dist/sdk/extension/copy-scope.js +2 -0
- package/dist/sdk/extension/custom-field-collisions.js +1 -30
- package/dist/sdk/extension/describe.js +3 -189
- package/dist/sdk/extension/doctor.js +1 -606
- package/dist/sdk/extension/install-plan.d.ts +69 -0
- package/dist/sdk/extension/install-plan.js +2 -0
- package/dist/sdk/extension/install-receipts.d.ts +7 -0
- package/dist/sdk/extension/install-receipts.js +2 -0
- package/dist/sdk/extension/install-runtime.js +3 -313
- package/dist/sdk/extension/install-snapshot.js +1 -66
- package/dist/sdk/extension/install-sources.js +5 -1057
- package/dist/sdk/extension/managed-state.js +2 -252
- package/dist/sdk/extension/migrations.js +2 -174
- package/dist/sdk/extension/output-ownership.js +1 -25
- package/dist/sdk/extension/runtime-summary.js +1 -18
- package/dist/sdk/extension/scaffold.js +4 -2308
- package/dist/sdk/extension/shared.js +1 -147
- package/dist/sdk/extension/source-resolution.js +1 -65
- package/dist/sdk/extension/update-check.js +1 -67
- package/dist/sdk/extension-command-context.js +1 -44
- package/dist/sdk/extension-contracts.js +1 -73
- package/dist/sdk/extension.d.ts +7 -2
- package/dist/sdk/extension.js +1 -2196
- package/dist/sdk/files.js +1 -535
- package/dist/sdk/flag-invocation-contracts.d.ts +0 -5
- package/dist/sdk/flag-invocation-contracts.js +1 -344
- package/dist/sdk/generated/generated-error-code-catalog-part-1.js +1 -2224
- package/dist/sdk/generated/generated-error-code-catalog-part-2.js +1 -2236
- package/dist/sdk/generated-error-code-catalog.js +1 -16
- package/dist/sdk/governance/assurance-action-contracts.js +1 -4
- package/dist/sdk/governance/assurance-action.js +1 -411
- package/dist/sdk/governance/assurance-limits.js +1 -10
- package/dist/sdk/governance/assurance-mutation-error.js +1 -81
- package/dist/sdk/governance/assurance-presets.js +1 -135
- package/dist/sdk/governance/assurance-runtime.js +1 -238
- package/dist/sdk/governance/assurance.js +4 -1182
- package/dist/sdk/governance/boundary-fixtures.js +1 -200
- package/dist/sdk/governance/coverage-assurance.js +1 -60
- package/dist/sdk/governance/defect-recurrence-coverage.js +1 -188
- package/dist/sdk/governance/defect-recurrence-graph.js +1 -120
- package/dist/sdk/governance/defect-recurrence-signals.js +1 -24
- package/dist/sdk/governance/defect-recurrence.js +1 -623
- package/dist/sdk/governance/extension-host-version.js +1 -115
- package/dist/sdk/governance/gc.js +1 -368
- package/dist/sdk/governance/health.js +1 -2367
- package/dist/sdk/governance/hierarchy-validation.js +1 -108
- package/dist/sdk/governance/linked-file-report.js +1 -71
- package/dist/sdk/governance/merge-receipt-history.js +1 -206
- package/dist/sdk/governance/provenance-health.js +1 -282
- package/dist/sdk/governance/reindex.js +4 -761
- package/dist/sdk/governance/stale-work.js +1 -82
- package/dist/sdk/governance/status-role-diagnostics.js +1 -35
- package/dist/sdk/governance/storage-integrity.js +1 -280
- package/dist/sdk/governance/tracked-runtime-cache.js +1 -106
- package/dist/sdk/governance/upgrade.js +2 -327
- package/dist/sdk/governance/validate-history-drift.js +1 -81
- package/dist/sdk/governance/validate-item-reader.js +1 -17
- package/dist/sdk/governance/validate-normalization.js +1 -36
- package/dist/sdk/governance/validate.js +1 -2261
- package/dist/sdk/governance/workspace-position.js +1 -163
- package/dist/sdk/governance.d.ts +1 -0
- package/dist/sdk/governance.js +1 -31
- package/dist/sdk/graph/adapter.js +1 -181
- package/dist/sdk/graph/analytics.js +1 -474
- package/dist/sdk/graph/assembly.js +1 -377
- package/dist/sdk/graph/cache.js +1 -160
- package/dist/sdk/graph/centrality.js +1 -258
- package/dist/sdk/graph/conformance.js +1 -130
- package/dist/sdk/graph/deadline-scheduling.d.ts +90 -0
- package/dist/sdk/graph/deadline-scheduling.js +2 -0
- package/dist/sdk/graph/durable-cache.d.ts +1 -1
- package/dist/sdk/graph/durable-cache.js +1 -361
- package/dist/sdk/graph/governance-contracts.js +1 -34
- package/dist/sdk/graph/governance.d.ts +13 -1
- package/dist/sdk/graph/governance.js +1 -735
- package/dist/sdk/graph/hierarchy-integrity.js +1 -310
- package/dist/sdk/graph/index.d.ts +3 -2
- package/dist/sdk/graph/index.js +1 -26
- package/dist/sdk/graph/lifecycle-coverage.d.ts +32 -0
- package/dist/sdk/graph/lifecycle-coverage.js +2 -0
- package/dist/sdk/graph/mutation-advisory.js +1 -176
- package/dist/sdk/graph/remediation.js +1 -197
- package/dist/sdk/graph/run.d.ts +15 -1
- package/dist/sdk/graph/run.js +1 -768
- package/dist/sdk/graph/scheduling.js +1 -124
- package/dist/sdk/graph/traversal.js +1 -284
- package/dist/sdk/graph/workspace-relationship-kind-registry.js +1 -27
- package/dist/sdk/graph.js +1 -15
- package/dist/sdk/guide-topics.js +1 -707
- package/dist/sdk/guide.js +1 -279
- package/dist/sdk/history/maintenance.d.ts +71 -0
- package/dist/sdk/history/maintenance.js +2 -0
- package/dist/sdk/history/salvage.js +2 -247
- package/dist/sdk/history/subject.d.ts +19 -0
- package/dist/sdk/history/subject.js +2 -0
- package/dist/sdk/history-analytics.js +1 -282
- package/dist/sdk/history-compact.js +1 -527
- package/dist/sdk/history-mcp.js +1 -68
- package/dist/sdk/history-provenance.js +1 -182
- package/dist/sdk/history-read.js +1 -96
- package/dist/sdk/history-redact.d.ts +1 -14
- package/dist/sdk/history-redact.js +1 -643
- package/dist/sdk/history-repair.d.ts +5 -0
- package/dist/sdk/history-repair.js +1 -657
- package/dist/sdk/improvement-ledger-validation.js +1 -62
- package/dist/sdk/improvement-ledger.js +2 -257
- package/dist/sdk/index.d.ts +4 -0
- package/dist/sdk/index.js +1 -183
- package/dist/sdk/init-agent-guidance.js +2 -496
- package/dist/sdk/init.js +2 -820
- package/dist/sdk/invocation-author.js +1 -39
- package/dist/sdk/item-children.js +1 -90
- package/dist/sdk/item-metadata-index.js +1 -15
- package/dist/sdk/item-schedule.js +1 -27
- package/dist/sdk/item-transaction.js +1 -396
- package/dist/sdk/learnings.js +1 -29
- package/dist/sdk/lifecycle/append.js +2 -53
- package/dist/sdk/lifecycle/claim.d.ts +2 -0
- package/dist/sdk/lifecycle/claim.js +1 -242
- package/dist/sdk/lifecycle/close-many.js +1 -438
- package/dist/sdk/lifecycle/close.js +1 -468
- package/dist/sdk/lifecycle/copy.js +1 -212
- package/dist/sdk/lifecycle/create.js +1 -1949
- package/dist/sdk/lifecycle/delete.js +1 -45
- package/dist/sdk/lifecycle/event-validation-messages.js +1 -91
- package/dist/sdk/lifecycle/focus.js +1 -91
- package/dist/sdk/lifecycle/hierarchy-mutation-lock.js +1 -24
- package/dist/sdk/lifecycle/legacy-none-tokens.js +1 -149
- package/dist/sdk/lifecycle/lifecycle-transitions.js +1 -40
- package/dist/sdk/lifecycle/mcp-actions.d.ts +2 -0
- package/dist/sdk/lifecycle/mcp-actions.js +1 -51
- package/dist/sdk/lifecycle/metadata-normalizers.js +1 -46
- package/dist/sdk/lifecycle/mutation-command-options.js +1 -9
- package/dist/sdk/lifecycle/plan.js +1 -1606
- package/dist/sdk/lifecycle/recurrence-parsers.js +1 -147
- package/dist/sdk/lifecycle/reopen.js +1 -68
- package/dist/sdk/lifecycle/repeatable-metadata-parsers.js +1 -143
- package/dist/sdk/lifecycle/restore.d.ts +1 -0
- package/dist/sdk/lifecycle/restore.js +1 -330
- package/dist/sdk/lifecycle/shared-unset-fields.js +1 -295
- package/dist/sdk/lifecycle/update-many.js +1 -861
- package/dist/sdk/lifecycle/update.js +1 -2136
- package/dist/sdk/lifecycle-completion.js +1 -92
- package/dist/sdk/lifecycle-policy.js +1 -120
- package/dist/sdk/linked-artifacts.js +1 -530
- package/dist/sdk/mcp/apps.js +4 -133
- package/dist/sdk/mcp/authorization.js +1 -404
- package/dist/sdk/mcp/discovery.js +1 -494
- package/dist/sdk/mcp/interactions.js +1 -336
- package/dist/sdk/mcp/protocol.d.ts +7 -0
- package/dist/sdk/mcp/protocol.js +1 -184
- package/dist/sdk/mcp/skills.js +1 -389
- package/dist/sdk/mcp/subscriptions.js +1 -211
- package/dist/sdk/mcp/tasks.js +2 -430
- package/dist/sdk/mcp/transport.js +1 -260
- package/dist/sdk/merge/abandoned-receipts.js +1 -46
- package/dist/sdk/merge/driver.js +1 -212
- package/dist/sdk/merge/index.js +1 -16
- package/dist/sdk/merge/install.js +3 -561
- package/dist/sdk/merge/receipt-file-boundary.js +1 -46
- package/dist/sdk/merge/receipt-operation.js +1 -96
- package/dist/sdk/merge/receipt-schema.js +1 -397
- package/dist/sdk/merge/receipts.js +4 -525
- package/dist/sdk/merge/reconcile.js +1 -352
- package/dist/sdk/merge/three-way.js +3 -775
- package/dist/sdk/merge.js +1 -10
- package/dist/sdk/mutation-events.js +1 -292
- package/dist/sdk/mutation-guard.js +1 -216
- package/dist/sdk/notes.js +1 -139
- package/dist/sdk/output-contracts.js +1 -172
- package/dist/sdk/output-projection.js +1 -430
- package/dist/sdk/output-token-accounting.js +1 -140
- package/dist/sdk/output.js +1 -64
- package/dist/sdk/ownership-source.js +1 -21
- package/dist/sdk/package-import-adapters.js +1 -442
- package/dist/sdk/package-migrations.js +1 -20
- package/dist/sdk/package-runtime-options.js +1 -80
- package/dist/sdk/pagination.js +1 -162
- package/dist/sdk/profile.js +1 -454
- package/dist/sdk/provenance.js +1 -258
- package/dist/sdk/public-surface.json +1 -1
- package/dist/sdk/query/activity.js +1 -401
- package/dist/sdk/query/aggregate.d.ts +16 -0
- package/dist/sdk/query/aggregate.js +1 -390
- package/dist/sdk/query/calendar.js +1 -964
- package/dist/sdk/query/complete-list.js +1 -215
- package/dist/sdk/query/context.js +1 -1702
- package/dist/sdk/query/duplicate-candidates.js +1 -70
- package/dist/sdk/query/get.js +1 -450
- package/dist/sdk/query/history.js +1 -186
- package/dist/sdk/query/item-filter-options.js +1 -9
- package/dist/sdk/query/light-metadata.js +1 -18
- package/dist/sdk/query/list-filter-shared.js +1 -81
- package/dist/sdk/query/list.js +1 -1304
- package/dist/sdk/query/multi-value-filters.js +1 -78
- package/dist/sdk/query/next.js +1 -513
- package/dist/sdk/query/parsers.js +1 -44
- package/dist/sdk/query/projection-contracts.js +1 -184
- package/dist/sdk/query/search-contracts.js +1 -230
- package/dist/sdk/query/search-pagination.js +1 -35
- package/dist/sdk/query/search-rendering.js +1 -105
- package/dist/sdk/query/search.js +2 -1987
- package/dist/sdk/query.js +1 -35
- package/dist/sdk/read-output/continuation.js +1 -194
- package/dist/sdk/read-output-budget.js +1 -135
- package/dist/sdk/read-output-contracts.js +1 -1225
- package/dist/sdk/read-output-rows.js +1 -186
- package/dist/sdk/read-output-session.js +1 -208
- package/dist/sdk/relationship-analytics.js +1 -410
- package/dist/sdk/relationship-context.js +1 -284
- package/dist/sdk/relationship-history.js +4 -519
- package/dist/sdk/relationship-kinds/contract.js +1 -22
- package/dist/sdk/relationship-migration.js +1 -77
- package/dist/sdk/relationships.js +1 -579
- package/dist/sdk/reproducibility/process.js +1 -87
- package/dist/sdk/runtime-action-aliases.js +1 -59
- package/dist/sdk/runtime-extended-actions.js +1 -177
- package/dist/sdk/runtime-input.js +1 -614
- package/dist/sdk/runtime-primitives.js +1 -84
- package/dist/sdk/runtime-public-contracts.js +1 -4
- package/dist/sdk/runtime-stats-options.js +1 -38
- package/dist/sdk/runtime.js +1 -1928
- package/dist/sdk/scheduling-shortcuts.js +1 -63
- package/dist/sdk/schema-migration.js +3 -856
- package/dist/sdk/schema.js +1 -1376
- package/dist/sdk/search-refresh-worker.js +1 -18
- package/dist/sdk/similarity-scoring.js +1 -53
- package/dist/sdk/similarity.js +1 -326
- package/dist/sdk/start-task-status.js +1 -14
- package/dist/sdk/stats.js +1 -270
- package/dist/sdk/structured-mutations.js +1 -580
- package/dist/sdk/telemetry-flush.js +1 -13
- package/dist/sdk/telemetry.js +1 -405
- package/dist/sdk/templates.js +2 -292
- package/dist/sdk/test/batch.js +2 -509
- package/dist/sdk/test/entry.js +1 -70
- package/dist/sdk/test/execution.js +6 -2211
- package/dist/sdk/test/linked-command-detection.js +1 -546
- package/dist/sdk/test/measurements.js +1 -91
- package/dist/sdk/test/parsers.js +1 -545
- package/dist/sdk/test/runs.js +1 -193
- package/dist/sdk/test/trust.js +2 -206
- package/dist/sdk/testing.js +4 -1391
- package/dist/sdk/traceability/runtime-files-lookup.js +1 -32
- package/dist/sdk/traceability/source-traceability.js +1 -292
- package/dist/sdk/tracker-root-discovery.js +1 -9
- package/dist/sdk/workspace-contracts-cache.js +1 -28
- package/dist/sdk/workspace-contracts.js +1 -33
- package/dist/sdk/workspace-memory.js +2 -318
- package/dist/sdk/workspace-recipe.js +1 -71
- package/dist/sdk/workspace-snapshot.js +4 -613
- package/dist/sdk/workspace-transaction-gc.js +1 -149
- package/dist/sdk/workspace-transaction.js +2 -363
- package/dist/sdk/workspace.js +3 -127
- package/dist/types/index.js +1 -9
- package/dist/types.js +1 -245
- package/docs/AGENT_GUIDE.md +1 -1
- package/docs/CONTEXT_ALGORITHM_PORTFOLIO.md +167 -0
- package/docs/DIAGNOSTIC_OUTPUT_CONTRACTS.md +9 -3
- package/docs/EXTENSIONS.md +1 -0
- package/docs/HISTORY_MAINTENANCE.md +125 -0
- package/docs/MCP_2026_07_28_CONFORMANCE.md +20 -10
- package/docs/PACKAGE_EVIDENCE.md +92 -0
- package/docs/PLANNING_MEASUREMENTS.md +183 -0
- package/docs/README.md +3 -0
- package/docs/RELEASING.md +1 -0
- package/docs/SCRIPTING.md +21 -0
- package/docs/TESTING.md +23 -0
- package/docs/generated/FLAG_LEXICON_BUDGETS.md +5 -5
- package/docs/generated/REFUSAL_CLOSURE_CENSUS.md +2 -2
- package/marketplace.json +2 -2
- package/package.json +1 -1
- package/packages/pm-beads/package.json +1 -1
- package/packages/pm-calendar/package.json +1 -1
- package/packages/pm-command-kit/package.json +1 -1
- package/packages/pm-digital-twin/package.json +1 -1
- package/packages/pm-governance-audit/package.json +1 -1
- package/packages/pm-guide-shell/package.json +1 -1
- package/packages/pm-kanban/package.json +1 -1
- package/packages/pm-lifecycle-hooks/package.json +1 -1
- package/packages/pm-linked-test-adapters/package.json +1 -1
- package/packages/pm-search-advanced/package.json +1 -1
- package/packages/pm-templates/package.json +1 -1
- package/packages/pm-todos/package.json +1 -1
- package/packages/pm-vcs/package.json +1 -1
- package/plugins/pm-claude/.claude-plugin/plugin.json +1 -1
- package/plugins/pm-codex/.codex-plugin/plugin.json +1 -1
- package/scripts/finalize-build.mjs +45 -3
- package/dist/cli-bundle/chunks/chunk-AZDFJGH6.js +0 -9
- package/dist/cli-bundle/chunks/chunk-BAX2BYUW.js +0 -2111
- package/dist/cli-bundle/chunks/chunk-CKOL5U7J.js +0 -77
- package/dist/cli-bundle/chunks/chunk-OF76PSDQ.js +0 -5
- package/dist/cli-bundle/chunks/chunk-QUWFABDM.js +0 -232
- package/dist/cli-bundle/chunks/chunk-QWRRFYK3.js +0 -2
- package/dist/cli-bundle/chunks/chunk-RWWBOWJ5.js +0 -2
- package/dist/cli-bundle/chunks/chunk-WGAOYSYH.js +0 -40
- package/dist/cli-bundle/chunks/chunk-WI2AYPA7.js +0 -2
- package/dist/cli-bundle/chunks/register-list-query-5JL52D33.js +0 -11
- package/dist/cli-bundle/chunks/register-mutation-ZPG7KMVP.js +0 -20
- package/dist/cli-bundle/chunks/register-setup-H4SVAVX7.js +0 -2
- package/dist/cli-bundle/focused-chunks/chunk-AL5ON6K6.js +0 -2
- package/dist/cli-bundle/focused-chunks/chunk-CHC2IDXA.js +0 -6
- package/dist/cli-bundle/focused-chunks/chunk-CK6QFAPZ.js +0 -20
- package/dist/cli-bundle/focused-chunks/chunk-EZR3GHFE.js +0 -2
- package/dist/cli-bundle/focused-chunks/chunk-H2WJWK7L.js +0 -56
- package/dist/cli-bundle/focused-chunks/chunk-NTPY5GSO.js +0 -3
- package/dist/cli-bundle/focused-chunks/chunk-P5O7MP5Y.js +0 -2
- package/dist/cli-bundle/focused-chunks/chunk-PDMW2E36.js +0 -177
- package/dist/cli-bundle/focused-chunks/chunk-QTVCLMSZ.js +0 -6
- package/dist/cli-bundle/focused-chunks/chunk-QTZRBUYA.js +0 -8
- package/dist/cli-bundle/focused-chunks/chunk-SGQST3PQ.js +0 -12
- package/dist/cli-bundle/focused-chunks/chunk-UKHASMMP.js +0 -10
- package/dist/cli-bundle/focused-chunks/chunk-ZPEKQHOC.js +0 -2
|
@@ -1,64 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
* @module core/test/item-test-run-tracking
|
|
3
|
-
*
|
|
4
|
-
* Runs and records linked-test orchestration for Item Test Run Tracking.
|
|
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]="62af7c1e-c1c7-529e-ab30-117103ac4607")}catch(e){}}();
|
|
8
|
-
import { mutateItem } from "../store/item-store.js";
|
|
9
|
-
import { compareTimestampStrings } from "../shared/time.js";
|
|
10
|
-
const DEFAULT_TRACKED_TEST_RUN_HISTORY_LIMIT = 20;
|
|
11
|
-
function trackedTestRunHistoryLimit() {
|
|
12
|
-
const raw = process.env.PM_TRACKED_TEST_RUN_HISTORY_LIMIT;
|
|
13
|
-
if (!raw || raw.trim().length === 0) {
|
|
14
|
-
return DEFAULT_TRACKED_TEST_RUN_HISTORY_LIMIT;
|
|
15
|
-
}
|
|
16
|
-
const parsed = Number.parseInt(raw, 10);
|
|
17
|
-
if (!Number.isFinite(parsed) || parsed <= 0) {
|
|
18
|
-
return DEFAULT_TRACKED_TEST_RUN_HISTORY_LIMIT;
|
|
19
|
-
}
|
|
20
|
-
return parsed;
|
|
21
|
-
}
|
|
22
|
-
/** Normalize, order, and bound test-run history using the configured retention policy. */
|
|
23
|
-
export function buildTrackedTestRunHistory(entries) {
|
|
24
|
-
const normalized = [...entries]
|
|
25
|
-
.filter((entry) => entry.run_id.trim().length > 0 &&
|
|
26
|
-
entry.started_at.trim().length > 0 &&
|
|
27
|
-
entry.finished_at.trim().length > 0 &&
|
|
28
|
-
entry.recorded_at.trim().length > 0)
|
|
29
|
-
.sort((left, right) => {
|
|
30
|
-
const byRecorded = compareTimestampStrings(left.recorded_at, right.recorded_at);
|
|
31
|
-
if (byRecorded !== 0)
|
|
32
|
-
return byRecorded;
|
|
33
|
-
const byRunId = left.run_id.localeCompare(right.run_id);
|
|
34
|
-
if (byRunId !== 0)
|
|
35
|
-
return byRunId;
|
|
36
|
-
return left.kind.localeCompare(right.kind);
|
|
37
|
-
});
|
|
38
|
-
const historyLimit = trackedTestRunHistoryLimit();
|
|
39
|
-
return normalized.length > historyLimit
|
|
40
|
-
? normalized.slice(normalized.length - historyLimit)
|
|
41
|
-
: normalized;
|
|
42
|
-
}
|
|
43
|
-
/** Implements append tracked test run summary for the public runtime surface of this module. */
|
|
44
|
-
export async function appendTrackedTestRunSummary(options) {
|
|
45
|
-
await mutateItem({
|
|
46
|
-
pmRoot: options.pmRoot,
|
|
47
|
-
settings: options.settings,
|
|
48
|
-
id: options.itemId,
|
|
49
|
-
op: "test_run_track",
|
|
50
|
-
author: options.author,
|
|
51
|
-
message: options.message,
|
|
52
|
-
force: false,
|
|
53
|
-
mutate(document) {
|
|
54
|
-
const current = document.metadata.test_runs ?? [];
|
|
55
|
-
document.metadata.test_runs = buildTrackedTestRunHistory([
|
|
56
|
-
...current,
|
|
57
|
-
options.entry,
|
|
58
|
-
]);
|
|
59
|
-
return { changedFields: ["test_runs"] };
|
|
60
|
-
},
|
|
61
|
-
});
|
|
62
|
-
}
|
|
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]="ffa50b5b-d99f-5ab4-a70d-cbf12911a0f2")}catch(e2){}})();import{mutateItem}from"../store/item-store.js";import{compareTimestampStrings}from"../shared/time.js";const DEFAULT_TRACKED_TEST_RUN_HISTORY_LIMIT=20;function trackedTestRunHistoryLimit(){const raw=process.env.PM_TRACKED_TEST_RUN_HISTORY_LIMIT;if(!raw||raw.trim().length===0){return DEFAULT_TRACKED_TEST_RUN_HISTORY_LIMIT}const parsed=Number.parseInt(raw,10);if(!Number.isFinite(parsed)||parsed<=0){return DEFAULT_TRACKED_TEST_RUN_HISTORY_LIMIT}return parsed}function buildTrackedTestRunHistory(entries){const normalized=[...entries].filter(entry=>entry.run_id.trim().length>0&&entry.started_at.trim().length>0&&entry.finished_at.trim().length>0&&entry.recorded_at.trim().length>0).sort((left,right)=>{const byRecorded=compareTimestampStrings(left.recorded_at,right.recorded_at);if(byRecorded!==0)return byRecorded;const byRunId=left.run_id.localeCompare(right.run_id);if(byRunId!==0)return byRunId;return left.kind.localeCompare(right.kind)});const historyLimit=trackedTestRunHistoryLimit();return normalized.length>historyLimit?normalized.slice(normalized.length-historyLimit):normalized}async function appendTrackedTestRunSummary(options){await mutateItem({pmRoot:options.pmRoot,settings:options.settings,id:options.itemId,op:"test_run_track",author:options.author,message:options.message,force:false,mutate(document){const current=document.metadata.test_runs??[];document.metadata.test_runs=buildTrackedTestRunHistory([...current,options.entry]);return{changedFields:["test_runs"]}}})}export{appendTrackedTestRunSummary,buildTrackedTestRunHistory};
|
|
63
2
|
//# sourceMappingURL=item-test-run-tracking.js.map
|
|
64
|
-
//# debugId=62af7c1e-c1c7-529e-ab30-117103ac4607
|
|
@@ -1,121 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
* @module core/test/run-selectors
|
|
3
|
-
*
|
|
4
|
-
* Runs and records linked-test orchestration for Run Selectors.
|
|
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]="8a6a3402-dae3-56f8-b9ba-a4f6f8a47cda")}catch(e){}}();
|
|
8
|
-
import { EXIT_CODE } from "../shared/constants.js";
|
|
9
|
-
import { PmCliError } from "../shared/errors.js";
|
|
10
|
-
const MAX_SELECTOR_ENTRY_LABEL_LENGTH = 100;
|
|
11
|
-
/** Implements parse only index value for the public runtime surface of this module. */
|
|
12
|
-
export function parseOnlyIndexValue(raw, optionName = "--only-index") {
|
|
13
|
-
const value = typeof raw === "number" ? raw : Number(String(raw).trim());
|
|
14
|
-
if (!Number.isInteger(value) || value < 1) {
|
|
15
|
-
throw new PmCliError(`${optionName} requires a 1-based integer index into the linked-test list (got "${raw}"). Use pm test <id> --list to inspect positions.`, EXIT_CODE.USAGE);
|
|
16
|
-
}
|
|
17
|
-
return value;
|
|
18
|
-
}
|
|
19
|
-
function summarizeSelectorEntry(entry) {
|
|
20
|
-
const label = entry.command ?? entry.path ?? "<no command>";
|
|
21
|
-
const normalized = label.replaceAll(/\s+/g, " ").trim() || "<no command>";
|
|
22
|
-
if (normalized.length <= MAX_SELECTOR_ENTRY_LABEL_LENGTH) {
|
|
23
|
-
return normalized;
|
|
24
|
-
}
|
|
25
|
-
return `${normalized.slice(0, MAX_SELECTOR_ENTRY_LABEL_LENGTH - 3)}...`;
|
|
26
|
-
}
|
|
27
|
-
/** Implements describe linked test entries for the public runtime surface of this module. */
|
|
28
|
-
export function describeLinkedTestEntries(tests) {
|
|
29
|
-
return tests
|
|
30
|
-
.map((entry, index) => `${index + 1}. ${summarizeSelectorEntry(entry)}`)
|
|
31
|
-
.join("; ");
|
|
32
|
-
}
|
|
33
|
-
function activeSelectorKinds(selector) {
|
|
34
|
-
const kinds = [];
|
|
35
|
-
if (selector.match !== undefined) {
|
|
36
|
-
kinds.push("match");
|
|
37
|
-
}
|
|
38
|
-
if (selector.onlyIndex !== undefined) {
|
|
39
|
-
kinds.push("only-index");
|
|
40
|
-
}
|
|
41
|
-
if (selector.onlyLast === true) {
|
|
42
|
-
kinds.push("only-last");
|
|
43
|
-
}
|
|
44
|
-
return kinds;
|
|
45
|
-
}
|
|
46
|
-
function entryMatchesSubstring(entry, needle) {
|
|
47
|
-
const command = entry.command?.toLowerCase() ?? "";
|
|
48
|
-
const entryPath = entry.path?.toLowerCase() ?? "";
|
|
49
|
-
return command.includes(needle) || entryPath.includes(needle);
|
|
50
|
-
}
|
|
51
|
-
/** Implements resolve linked test run selection for the public runtime surface of this module. */
|
|
52
|
-
export function resolveLinkedTestRunSelection(tests, selector) {
|
|
53
|
-
const kinds = activeSelectorKinds(selector);
|
|
54
|
-
if (kinds.length === 0) {
|
|
55
|
-
return {
|
|
56
|
-
selector: null,
|
|
57
|
-
requested: null,
|
|
58
|
-
selected: tests,
|
|
59
|
-
selected_indexes: tests.map((_, index) => index + 1),
|
|
60
|
-
selected_count: tests.length,
|
|
61
|
-
skipped_count: 0,
|
|
62
|
-
};
|
|
63
|
-
}
|
|
64
|
-
if (kinds.length > 1) {
|
|
65
|
-
throw new PmCliError(`Combine at most one linked-test selector per run: ${kinds.map((kind) => `--${kind}`).join(" and ")} were provided. Pick one of --match, --only-index, --only-last.`, EXIT_CODE.USAGE);
|
|
66
|
-
}
|
|
67
|
-
const kind = kinds[0];
|
|
68
|
-
if (tests.length === 0) {
|
|
69
|
-
throw new PmCliError(`--${kind} matched no linked tests because this item has none. Add one first with --add, --command, or --add-json.`, EXIT_CODE.USAGE);
|
|
70
|
-
}
|
|
71
|
-
if (kind === "match") {
|
|
72
|
-
// kind is "match" only when selector.match is defined (see activeSelectorKinds).
|
|
73
|
-
const needle = selector.match.trim().toLowerCase();
|
|
74
|
-
if (needle.length === 0) {
|
|
75
|
-
throw new PmCliError("--match requires a non-empty substring to match against linked-test command/path values", EXIT_CODE.USAGE);
|
|
76
|
-
}
|
|
77
|
-
const selectedIndexes = [];
|
|
78
|
-
const selected = [];
|
|
79
|
-
for (let index = 0; index < tests.length; index += 1) {
|
|
80
|
-
if (entryMatchesSubstring(tests[index], needle)) {
|
|
81
|
-
selected.push(tests[index]);
|
|
82
|
-
selectedIndexes.push(index + 1);
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
if (selected.length === 0) {
|
|
86
|
-
throw new PmCliError(`--match "${selector.match}" matched none of the ${tests.length} linked test(s). Available entries: ${describeLinkedTestEntries(tests)}`, EXIT_CODE.USAGE);
|
|
87
|
-
}
|
|
88
|
-
return {
|
|
89
|
-
selector: "match",
|
|
90
|
-
requested: selector.match,
|
|
91
|
-
selected,
|
|
92
|
-
selected_indexes: selectedIndexes,
|
|
93
|
-
selected_count: selected.length,
|
|
94
|
-
skipped_count: tests.length - selected.length,
|
|
95
|
-
};
|
|
96
|
-
}
|
|
97
|
-
if (kind === "only-index") {
|
|
98
|
-
const index = parseOnlyIndexValue(selector.onlyIndex);
|
|
99
|
-
if (index > tests.length) {
|
|
100
|
-
throw new PmCliError(`--only-index ${index} is out of range: this item has ${tests.length} linked test(s). Available entries: ${describeLinkedTestEntries(tests)}`, EXIT_CODE.USAGE);
|
|
101
|
-
}
|
|
102
|
-
return {
|
|
103
|
-
selector: "only-index",
|
|
104
|
-
requested: String(index),
|
|
105
|
-
selected: [tests[index - 1]],
|
|
106
|
-
selected_indexes: [index],
|
|
107
|
-
selected_count: 1,
|
|
108
|
-
skipped_count: tests.length - 1,
|
|
109
|
-
};
|
|
110
|
-
}
|
|
111
|
-
return {
|
|
112
|
-
selector: "only-last",
|
|
113
|
-
requested: "last",
|
|
114
|
-
selected: [tests[tests.length - 1]],
|
|
115
|
-
selected_indexes: [tests.length],
|
|
116
|
-
selected_count: 1,
|
|
117
|
-
skipped_count: tests.length - 1,
|
|
118
|
-
};
|
|
119
|
-
}
|
|
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]="328c7577-364c-5869-aa92-199e56d2f6a7")}catch(e2){}})();import{EXIT_CODE}from"../shared/constants.js";import{PmCliError}from"../shared/errors.js";const MAX_SELECTOR_ENTRY_LABEL_LENGTH=100;function parseOnlyIndexValue(raw,optionName="--only-index"){const value=typeof raw==="number"?raw:Number(String(raw).trim());if(!Number.isInteger(value)||value<1){throw new PmCliError(`${optionName} requires a 1-based integer index into the linked-test list (got "${raw}"). Use pm test <id> --list to inspect positions.`,EXIT_CODE.USAGE)}return value}function summarizeSelectorEntry(entry){const label=entry.command??entry.path??"<no command>";const normalized=label.replaceAll(/\s+/g," ").trim()||"<no command>";if(normalized.length<=MAX_SELECTOR_ENTRY_LABEL_LENGTH){return normalized}return`${normalized.slice(0,MAX_SELECTOR_ENTRY_LABEL_LENGTH-3)}...`}function describeLinkedTestEntries(tests){return tests.map((entry,index)=>`${index+1}. ${summarizeSelectorEntry(entry)}`).join("; ")}function activeSelectorKinds(selector){const kinds=[];if(selector.match!==void 0){kinds.push("match")}if(selector.onlyIndex!==void 0){kinds.push("only-index")}if(selector.onlyLast===true){kinds.push("only-last")}return kinds}function entryMatchesSubstring(entry,needle){const command=entry.command?.toLowerCase()??"";const entryPath=entry.path?.toLowerCase()??"";return command.includes(needle)||entryPath.includes(needle)}function resolveLinkedTestRunSelection(tests,selector){const kinds=activeSelectorKinds(selector);if(kinds.length===0){return{selector:null,requested:null,selected:tests,selected_indexes:tests.map((_,index)=>index+1),selected_count:tests.length,skipped_count:0}}if(kinds.length>1){throw new PmCliError(`Combine at most one linked-test selector per run: ${kinds.map(kind2=>`--${kind2}`).join(" and ")} were provided. Pick one of --match, --only-index, --only-last.`,EXIT_CODE.USAGE)}const kind=kinds[0];if(tests.length===0){throw new PmCliError(`--${kind} matched no linked tests because this item has none. Add one first with --add, --command, or --add-json.`,EXIT_CODE.USAGE)}if(kind==="match"){const needle=selector.match.trim().toLowerCase();if(needle.length===0){throw new PmCliError("--match requires a non-empty substring to match against linked-test command/path values",EXIT_CODE.USAGE)}const selectedIndexes=[];const selected=[];for(let index=0;index<tests.length;index+=1){if(entryMatchesSubstring(tests[index],needle)){selected.push(tests[index]);selectedIndexes.push(index+1)}}if(selected.length===0){throw new PmCliError(`--match "${selector.match}" matched none of the ${tests.length} linked test(s). Available entries: ${describeLinkedTestEntries(tests)}`,EXIT_CODE.USAGE)}return{selector:"match",requested:selector.match,selected,selected_indexes:selectedIndexes,selected_count:selected.length,skipped_count:tests.length-selected.length}}if(kind==="only-index"){const index=parseOnlyIndexValue(selector.onlyIndex);if(index>tests.length){throw new PmCliError(`--only-index ${index} is out of range: this item has ${tests.length} linked test(s). Available entries: ${describeLinkedTestEntries(tests)}`,EXIT_CODE.USAGE)}return{selector:"only-index",requested:String(index),selected:[tests[index-1]],selected_indexes:[index],selected_count:1,skipped_count:tests.length-1}}return{selector:"only-last",requested:"last",selected:[tests[tests.length-1]],selected_indexes:[tests.length],selected_count:1,skipped_count:tests.length-1}}export{describeLinkedTestEntries,parseOnlyIndexValue,resolveLinkedTestRunSelection};
|
|
120
2
|
//# sourceMappingURL=run-selectors.js.map
|
|
121
|
-
//# debugId=8a6a3402-dae3-56f8-b9ba-a4f6f8a47cda
|
|
@@ -1,90 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
* Per-type default estimate resolution for `pm validate --auto-fix` (GH-212).
|
|
3
|
-
*
|
|
4
|
-
* When an item is missing `estimated_minutes`, the auto-fix path backfills a
|
|
5
|
-
* config-driven default based on the item's type. This module is the pure
|
|
6
|
-
* resolution layer: given an item type and an optional settings-derived override
|
|
7
|
-
* map, it returns the default estimate in minutes. The planning + apply path is
|
|
8
|
-
* wired separately by the validate command.
|
|
9
|
-
*
|
|
10
|
-
* Pure module: no filesystem access, no heavy imports. Bad input is never
|
|
11
|
-
* thrown on — invalid override entries are dropped, not errored (mirrors the
|
|
12
|
-
* deterministic, non-throwing style of stale-file-classification.ts).
|
|
13
|
-
*/
|
|
14
|
-
/** Built-in per-type default estimates in MINUTES used by `pm validate --auto-fix` (GH-212) to backfill missing `estimated_minutes`. Keys are canonical built-in type names. Lookups are case-insensitive (see resolveEstimateDefaultMinutes). */
|
|
15
|
-
|
|
16
|
-
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="2d377bc4-c624-561c-9856-405c82099070")}catch(e){}}();
|
|
17
|
-
export const DEFAULT_ESTIMATE_MINUTES_BY_TYPE = {
|
|
18
|
-
Epic: 2880,
|
|
19
|
-
Feature: 480,
|
|
20
|
-
Story: 480,
|
|
21
|
-
Milestone: 2880,
|
|
22
|
-
Task: 120,
|
|
23
|
-
Issue: 60,
|
|
24
|
-
Bug: 60,
|
|
25
|
-
Chore: 30,
|
|
26
|
-
Decision: 15,
|
|
27
|
-
Plan: 120,
|
|
28
|
-
};
|
|
29
|
-
/** Fallback when neither overrides nor the built-in map have the type. */
|
|
30
|
-
export const FALLBACK_ESTIMATE_MINUTES = 120;
|
|
31
|
-
/** A value is honored only when it is a finite number strictly greater than zero. */
|
|
32
|
-
function isHonoredMinutes(value) {
|
|
33
|
-
return typeof value === "number" && Number.isFinite(value) && value > 0;
|
|
34
|
-
}
|
|
35
|
-
/** Build a case-insensitive lookup keyed by lowercased type name. When two source keys collide case-insensitively, last-wins (later entries overwrite earlier ones); callers normalize overrides up front so collisions are rare. */
|
|
36
|
-
function toLowercasedLookup(source) {
|
|
37
|
-
const lookup = new Map();
|
|
38
|
-
for (const [key, value] of Object.entries(source)) {
|
|
39
|
-
lookup.set(key.toLowerCase(), value);
|
|
40
|
-
}
|
|
41
|
-
return lookup;
|
|
42
|
-
}
|
|
43
|
-
/** Built-in lookup is type-static, so build the lowercased index once. */
|
|
44
|
-
const BUILTIN_LOWERCASED_LOOKUP = toLowercasedLookup(DEFAULT_ESTIMATE_MINUTES_BY_TYPE);
|
|
45
|
-
/** Cache lowercased override lookups keyed on the override object reference so a backfill that resolves once per item does not rebuild the same Map each call. A WeakMap keeps this allocation-free for callers that reuse one normalized settings map across the whole run. */
|
|
46
|
-
const OVERRIDE_LOOKUP_CACHE = new WeakMap();
|
|
47
|
-
function lowercasedOverrideLookup(overrides) {
|
|
48
|
-
const cached = OVERRIDE_LOOKUP_CACHE.get(overrides);
|
|
49
|
-
if (cached) {
|
|
50
|
-
return cached;
|
|
51
|
-
}
|
|
52
|
-
const lookup = toLowercasedLookup(overrides);
|
|
53
|
-
OVERRIDE_LOOKUP_CACHE.set(overrides, lookup);
|
|
54
|
-
return lookup;
|
|
55
|
-
}
|
|
56
|
-
/** Resolve the default estimated-minutes for an item type. Precedence: overrides (case-insensitive key match) > DEFAULT_ESTIMATE_MINUTES_BY_TYPE (case-insensitive) > FALLBACK_ESTIMATE_MINUTES. - `type` undefined/empty -> FALLBACK. - Only finite values > 0 are honored from overrides/defaults; a non-positive or non-finite override value is ignored and resolution continues to the next tier. - Returned value is a positive integer (floor of the resolved value). */
|
|
57
|
-
export function resolveEstimateDefaultMinutes(type, overrides) {
|
|
58
|
-
const key = (type ?? "").trim().toLowerCase();
|
|
59
|
-
if (key.length === 0) {
|
|
60
|
-
return FALLBACK_ESTIMATE_MINUTES;
|
|
61
|
-
}
|
|
62
|
-
if (overrides) {
|
|
63
|
-
const overrideValue = lowercasedOverrideLookup(overrides).get(key);
|
|
64
|
-
if (isHonoredMinutes(overrideValue)) {
|
|
65
|
-
return Math.floor(overrideValue);
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
const builtinValue = BUILTIN_LOWERCASED_LOOKUP.get(key);
|
|
69
|
-
if (isHonoredMinutes(builtinValue)) {
|
|
70
|
-
return Math.floor(builtinValue);
|
|
71
|
-
}
|
|
72
|
-
return FALLBACK_ESTIMATE_MINUTES;
|
|
73
|
-
}
|
|
74
|
-
/** Validate + normalize a raw `validation.estimate_defaults_by_type` settings object into a clean Record<string, number> of positive integers, dropping invalid entries. Used so the pure resolver always receives a sane override map. Returns {} for undefined/null/non-object input. Trims keys; ignores empty keys and non-positive / non-finite / non-number values. Floors values to integers. */
|
|
75
|
-
export function normalizeEstimateDefaultOverrides(raw) {
|
|
76
|
-
const normalized = {};
|
|
77
|
-
if (raw === null || typeof raw !== "object" || Array.isArray(raw)) {
|
|
78
|
-
return normalized;
|
|
79
|
-
}
|
|
80
|
-
for (const [rawKey, rawValue] of Object.entries(raw)) {
|
|
81
|
-
const key = rawKey.trim();
|
|
82
|
-
if (key.length === 0 || !isHonoredMinutes(rawValue)) {
|
|
83
|
-
continue;
|
|
84
|
-
}
|
|
85
|
-
normalized[key] = Math.floor(rawValue);
|
|
86
|
-
}
|
|
87
|
-
return normalized;
|
|
88
|
-
}
|
|
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]="833a4f8a-7e5d-5480-a526-4e1ebaadd0a8")}catch(e2){}})();const DEFAULT_ESTIMATE_MINUTES_BY_TYPE={Epic:2880,Feature:480,Story:480,Milestone:2880,Task:120,Issue:60,Bug:60,Chore:30,Decision:15,Plan:120};const FALLBACK_ESTIMATE_MINUTES=120;function isHonoredMinutes(value){return typeof value==="number"&&Number.isFinite(value)&&value>0}function toLowercasedLookup(source){const lookup=new Map;for(const[key,value]of Object.entries(source)){lookup.set(key.toLowerCase(),value)}return lookup}const BUILTIN_LOWERCASED_LOOKUP=toLowercasedLookup(DEFAULT_ESTIMATE_MINUTES_BY_TYPE);const OVERRIDE_LOOKUP_CACHE=new WeakMap;function lowercasedOverrideLookup(overrides){const cached=OVERRIDE_LOOKUP_CACHE.get(overrides);if(cached){return cached}const lookup=toLowercasedLookup(overrides);OVERRIDE_LOOKUP_CACHE.set(overrides,lookup);return lookup}function resolveEstimateDefaultMinutes(type,overrides){const key=(type??"").trim().toLowerCase();if(key.length===0){return FALLBACK_ESTIMATE_MINUTES}if(overrides){const overrideValue=lowercasedOverrideLookup(overrides).get(key);if(isHonoredMinutes(overrideValue)){return Math.floor(overrideValue)}}const builtinValue=BUILTIN_LOWERCASED_LOOKUP.get(key);if(isHonoredMinutes(builtinValue)){return Math.floor(builtinValue)}return FALLBACK_ESTIMATE_MINUTES}function normalizeEstimateDefaultOverrides(raw){const normalized={};if(raw===null||typeof raw!=="object"||Array.isArray(raw)){return normalized}for(const[rawKey,rawValue]of Object.entries(raw)){const key=rawKey.trim();if(key.length===0||!isHonoredMinutes(rawValue)){continue}normalized[key]=Math.floor(rawValue)}return normalized}export{DEFAULT_ESTIMATE_MINUTES_BY_TYPE,FALLBACK_ESTIMATE_MINUTES,normalizeEstimateDefaultOverrides,resolveEstimateDefaultMinutes};
|
|
89
2
|
//# sourceMappingURL=estimate-defaults.js.map
|
|
90
|
-
//# debugId=2d377bc4-c624-561c-9856-405c82099070
|
|
@@ -1,190 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
* Fix planning for `pm validate --auto-fix` / `--prune-missing` (pm-c3sz,
|
|
3
|
-
* pm-8jss, pm-0v2m).
|
|
4
|
-
*
|
|
5
|
-
* Pure module: planners turn check findings into declarative
|
|
6
|
-
* {@link ValidateFixRecord}s; the validate command decides whether to apply
|
|
7
|
-
* them (apply mode), preview them (`--dry-run`), or withhold gated fixes
|
|
8
|
-
* (lifecycle structural changes require an explicit `--fix-scope lifecycle`).
|
|
9
|
-
*
|
|
10
|
-
* Safety invariants:
|
|
11
|
-
* - Every planned fix is deterministic and non-destructive: it only sets a
|
|
12
|
-
* derivable field value or removes a stale LINK (never a real file).
|
|
13
|
-
* - No fix ever closes, deletes, or cancels an item.
|
|
14
|
-
* - Lifecycle fixes (reparent / unset parent) are structural, so they are
|
|
15
|
-
* planned with `gate: "lifecycle"` and only applied when that scope was
|
|
16
|
-
* explicitly granted.
|
|
17
|
-
*/
|
|
18
|
-
|
|
19
|
-
!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]="98a73818-c4ef-5bce-8b23-6c40f7312cc3")}catch(e){}}();
|
|
20
|
-
import { EXIT_CODE } from "../shared/constants.js";
|
|
21
|
-
import { PmCliError } from "../shared/errors.js";
|
|
22
|
-
import { resolveEstimateDefaultMinutes } from "./estimate-defaults.js";
|
|
23
|
-
/** Scopes auto-applied without an explicit `--fix-scope` (safe field backfills). */
|
|
24
|
-
export const DEFAULT_GRANTED_FIX_SCOPES = [
|
|
25
|
-
"metadata",
|
|
26
|
-
"resolution",
|
|
27
|
-
];
|
|
28
|
-
/** Scopes accepted by `--fix-scope`. `estimates` and `lifecycle` are opt-in: estimate backfills are heuristic per-type guesses (not derived facts) and lifecycle changes are structural, so neither is granted by default. */
|
|
29
|
-
export const SUPPORTED_FIX_SCOPES = [
|
|
30
|
-
"metadata",
|
|
31
|
-
"resolution",
|
|
32
|
-
"estimates",
|
|
33
|
-
"lifecycle",
|
|
34
|
-
];
|
|
35
|
-
/** Default resolution backfilled onto closed items with no derivable source text. */
|
|
36
|
-
const DEFAULT_RESOLUTION_BACKFILL_VALUE = "completed";
|
|
37
|
-
function quoteForCommand(value) {
|
|
38
|
-
return `"${value.replaceAll("\\", "\\\\").replaceAll('"', '\\"')}"`;
|
|
39
|
-
}
|
|
40
|
-
function toMeaningfulValue(value) {
|
|
41
|
-
const trimmed = value?.trim();
|
|
42
|
-
return trimmed !== undefined && trimmed.length > 0 ? trimmed : undefined;
|
|
43
|
-
}
|
|
44
|
-
/** Plan resolution backfills for closed items flagged by the resolution check. Only the `resolution` field is mechanical enough to auto-fix: it derives from the item's own `close_reason` when present and falls back to the `"completed"` default. `expected_result` / `actual_result` stay hint-only — no deterministic source text exists for them. */
|
|
45
|
-
export function planResolutionBackfillFixes(rows) {
|
|
46
|
-
const fixes = [];
|
|
47
|
-
for (const row of rows) {
|
|
48
|
-
if (!row.missing_fields.includes("resolution")) {
|
|
49
|
-
continue;
|
|
50
|
-
}
|
|
51
|
-
const value = toMeaningfulValue(row.close_reason) ?? DEFAULT_RESOLUTION_BACKFILL_VALUE;
|
|
52
|
-
fixes.push({
|
|
53
|
-
item_id: row.id,
|
|
54
|
-
check: "resolution",
|
|
55
|
-
field: "resolution",
|
|
56
|
-
kind: "set_resolution",
|
|
57
|
-
value,
|
|
58
|
-
command: `pm update ${row.id} --resolution ${quoteForCommand(value)}`,
|
|
59
|
-
gate: "resolution",
|
|
60
|
-
});
|
|
61
|
-
}
|
|
62
|
-
return fixes;
|
|
63
|
-
}
|
|
64
|
-
/** Plan close_reason backfills for closed items flagged by the metadata check. Only derivable when the item already carries a resolution; items missing both stay hint-only (any synthesized reason would be fabricated, not derived). */
|
|
65
|
-
export function planCloseReasonBackfillFixes(rows) {
|
|
66
|
-
const fixes = [];
|
|
67
|
-
for (const row of rows) {
|
|
68
|
-
const value = toMeaningfulValue(row.resolution);
|
|
69
|
-
if (value === undefined) {
|
|
70
|
-
continue;
|
|
71
|
-
}
|
|
72
|
-
fixes.push({
|
|
73
|
-
item_id: row.id,
|
|
74
|
-
check: "metadata",
|
|
75
|
-
field: "close_reason",
|
|
76
|
-
kind: "set_close_reason",
|
|
77
|
-
value,
|
|
78
|
-
command: `pm update ${row.id} --close-reason ${quoteForCommand(value)}`,
|
|
79
|
-
gate: "metadata",
|
|
80
|
-
});
|
|
81
|
-
}
|
|
82
|
-
return fixes;
|
|
83
|
-
}
|
|
84
|
-
/** Plan estimate backfills for items flagged by the metadata check as missing `estimated_minutes` (GH-212). The value is a config-driven per-type default (overrides > built-in map > fallback), never a derived fact — so these fixes carry `gate: "estimates"`, an opt-in scope that is NOT granted by default. `overrides` is the already-normalized `validation.estimate_defaults_by_type` map; pass `undefined`/`{}` to use the built-in defaults. */
|
|
85
|
-
export function planEstimateBackfillFixes(rows, overrides) {
|
|
86
|
-
return rows.map((row) => {
|
|
87
|
-
const minutes = resolveEstimateDefaultMinutes(row.type, overrides);
|
|
88
|
-
return {
|
|
89
|
-
item_id: row.id,
|
|
90
|
-
check: "metadata",
|
|
91
|
-
field: "estimated_minutes",
|
|
92
|
-
kind: "set_estimate",
|
|
93
|
-
value: String(minutes),
|
|
94
|
-
command: `pm update ${row.id} --estimate ${minutes}`,
|
|
95
|
-
gate: "estimates",
|
|
96
|
-
};
|
|
97
|
-
});
|
|
98
|
-
}
|
|
99
|
-
/** Plan lifecycle fixes for active items whose parent is terminal (pm-8jss / GH-168). When the terminal parent has an active grandparent, the child is reparented one level up (it stays inside the same hierarchy); otherwise the parent link is cleared so the item surfaces as unparented active work. Either way the item itself is never closed or mutated beyond `parent` — and every fix carries `gate: "lifecycle"` so it is only applied under an explicit `--fix-scope lifecycle`. */
|
|
100
|
-
export function planTerminalParentFixes(rows) {
|
|
101
|
-
return rows.map((row) => {
|
|
102
|
-
if (row.grandparent_id !== undefined && row.grandparent_active === true) {
|
|
103
|
-
return {
|
|
104
|
-
item_id: row.id,
|
|
105
|
-
check: "lifecycle",
|
|
106
|
-
field: "parent",
|
|
107
|
-
kind: "reparent",
|
|
108
|
-
parent_id: row.grandparent_id,
|
|
109
|
-
command: `pm update ${row.id} --parent ${row.grandparent_id}`,
|
|
110
|
-
gate: "lifecycle",
|
|
111
|
-
};
|
|
112
|
-
}
|
|
113
|
-
return {
|
|
114
|
-
item_id: row.id,
|
|
115
|
-
check: "lifecycle",
|
|
116
|
-
field: "parent",
|
|
117
|
-
kind: "unset_parent",
|
|
118
|
-
command: `pm update ${row.id} --unset parent`,
|
|
119
|
-
gate: "lifecycle",
|
|
120
|
-
};
|
|
121
|
-
});
|
|
122
|
-
}
|
|
123
|
-
/** Plan link prunes for `--prune-missing` (pm-0v2m / GH-184). Only links whose stale path classified as `deleted` are pruned; `moved` links keep their relink candidates in the files-check details instead of being dropped, so recoverable link information is never destroyed. Link removal only — real files are never touched. */
|
|
124
|
-
export function planStaleLinkPruneFixes(rows) {
|
|
125
|
-
const fixes = [];
|
|
126
|
-
for (const row of rows) {
|
|
127
|
-
if (row.classification !== "deleted") {
|
|
128
|
-
continue;
|
|
129
|
-
}
|
|
130
|
-
const noun = row.link_kind === "files" ? "files" : "docs";
|
|
131
|
-
fixes.push({
|
|
132
|
-
item_id: row.item_id,
|
|
133
|
-
check: "files",
|
|
134
|
-
field: row.link_kind,
|
|
135
|
-
kind: row.link_kind === "files" ? "prune_file_link" : "prune_doc_link",
|
|
136
|
-
path: row.path,
|
|
137
|
-
command: `pm ${noun} ${row.item_id} --remove ${quoteForCommand(row.path)}`,
|
|
138
|
-
});
|
|
139
|
-
}
|
|
140
|
-
return fixes;
|
|
141
|
-
}
|
|
142
|
-
/** Resolve the granted `--fix-scope` set (repeatable and/or comma-separated). With no explicit scopes the safe field-backfill scopes (metadata, resolution) are granted; lifecycle must always be named explicitly. Unknown values fail fast with the supported list. */
|
|
143
|
-
export function resolveGrantedFixScopes(rawScopes) {
|
|
144
|
-
const tokens = (rawScopes ?? [])
|
|
145
|
-
.flatMap((raw) => raw.split(","))
|
|
146
|
-
.map((raw) => raw.trim())
|
|
147
|
-
.filter((raw) => raw.length > 0);
|
|
148
|
-
if (tokens.length === 0) {
|
|
149
|
-
if (rawScopes !== undefined && rawScopes.length > 0) {
|
|
150
|
-
throw new PmCliError(`--fix-scope values must not be empty. Supported values: ${SUPPORTED_FIX_SCOPES.join(", ")}.`, EXIT_CODE.USAGE);
|
|
151
|
-
}
|
|
152
|
-
return new Set(DEFAULT_GRANTED_FIX_SCOPES);
|
|
153
|
-
}
|
|
154
|
-
const granted = new Set();
|
|
155
|
-
for (const raw of tokens) {
|
|
156
|
-
const normalized = raw.toLowerCase().replaceAll("-", "_");
|
|
157
|
-
if (SUPPORTED_FIX_SCOPES.includes(normalized)) {
|
|
158
|
-
granted.add(normalized);
|
|
159
|
-
continue;
|
|
160
|
-
}
|
|
161
|
-
throw new PmCliError(`Unknown --fix-scope value "${raw}". Supported values: ${SUPPORTED_FIX_SCOPES.join(", ")}.`, EXIT_CODE.USAGE);
|
|
162
|
-
}
|
|
163
|
-
return granted;
|
|
164
|
-
}
|
|
165
|
-
/** Split a fix plan into the records that may be applied under the granted scopes and the gated records that were withheld. `--fix-scope` is an exact allowlist: every `--auto-fix` record requires its gate scope in `granted`. Ungated records (`--prune-missing` link prunes, governed by their own flag) are always applicable. */
|
|
166
|
-
export function partitionFixesByGrant(fixes, granted) {
|
|
167
|
-
const applicable = [];
|
|
168
|
-
const gated = [];
|
|
169
|
-
for (const fix of fixes) {
|
|
170
|
-
if (fix.gate !== undefined && !granted.has(fix.gate)) {
|
|
171
|
-
gated.push(fix);
|
|
172
|
-
}
|
|
173
|
-
else {
|
|
174
|
-
applicable.push(fix);
|
|
175
|
-
}
|
|
176
|
-
}
|
|
177
|
-
return { applicable, gated };
|
|
178
|
-
}
|
|
179
|
-
/** Compact serialization of a fix for planned/applied output rows. */
|
|
180
|
-
export function toFixOutputRow(fix) {
|
|
181
|
-
return {
|
|
182
|
-
item_id: fix.item_id,
|
|
183
|
-
check: fix.check,
|
|
184
|
-
field: fix.field,
|
|
185
|
-
command: fix.command,
|
|
186
|
-
...(fix.gate !== undefined ? { gate: fix.gate } : {}),
|
|
187
|
-
};
|
|
188
|
-
}
|
|
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]="55d5ac7a-9aa4-569e-9bb6-f504a0ac7421")}catch(e2){}})();import{EXIT_CODE}from"../shared/constants.js";import{PmCliError}from"../shared/errors.js";import{resolveEstimateDefaultMinutes}from"./estimate-defaults.js";const DEFAULT_GRANTED_FIX_SCOPES=["metadata","resolution"];const SUPPORTED_FIX_SCOPES=["metadata","resolution","estimates","lifecycle"];const DEFAULT_RESOLUTION_BACKFILL_VALUE="completed";function quoteForCommand(value){return`"${value.replaceAll("\\","\\\\").replaceAll('"','\\"')}"`}function toMeaningfulValue(value){const trimmed=value?.trim();return trimmed!==void 0&&trimmed.length>0?trimmed:void 0}function planResolutionBackfillFixes(rows){const fixes=[];for(const row of rows){if(!row.missing_fields.includes("resolution")){continue}const value=toMeaningfulValue(row.close_reason)??DEFAULT_RESOLUTION_BACKFILL_VALUE;fixes.push({item_id:row.id,check:"resolution",field:"resolution",kind:"set_resolution",value,command:`pm update ${row.id} --resolution ${quoteForCommand(value)}`,gate:"resolution"})}return fixes}function planCloseReasonBackfillFixes(rows){const fixes=[];for(const row of rows){const value=toMeaningfulValue(row.resolution);if(value===void 0){continue}fixes.push({item_id:row.id,check:"metadata",field:"close_reason",kind:"set_close_reason",value,command:`pm update ${row.id} --close-reason ${quoteForCommand(value)}`,gate:"metadata"})}return fixes}function planEstimateBackfillFixes(rows,overrides){return rows.map(row=>{const minutes=resolveEstimateDefaultMinutes(row.type,overrides);return{item_id:row.id,check:"metadata",field:"estimated_minutes",kind:"set_estimate",value:String(minutes),command:`pm update ${row.id} --estimate ${minutes}`,gate:"estimates"}})}function planTerminalParentFixes(rows){return rows.map(row=>{if(row.grandparent_id!==void 0&&row.grandparent_active===true){return{item_id:row.id,check:"lifecycle",field:"parent",kind:"reparent",parent_id:row.grandparent_id,command:`pm update ${row.id} --parent ${row.grandparent_id}`,gate:"lifecycle"}}return{item_id:row.id,check:"lifecycle",field:"parent",kind:"unset_parent",command:`pm update ${row.id} --unset parent`,gate:"lifecycle"}})}function planStaleLinkPruneFixes(rows){const fixes=[];for(const row of rows){if(row.classification!=="deleted"){continue}const noun=row.link_kind==="files"?"files":"docs";fixes.push({item_id:row.item_id,check:"files",field:row.link_kind,kind:row.link_kind==="files"?"prune_file_link":"prune_doc_link",path:row.path,command:`pm ${noun} ${row.item_id} --remove ${quoteForCommand(row.path)}`})}return fixes}function resolveGrantedFixScopes(rawScopes){const tokens=(rawScopes??[]).flatMap(raw=>raw.split(",")).map(raw=>raw.trim()).filter(raw=>raw.length>0);if(tokens.length===0){if(rawScopes!==void 0&&rawScopes.length>0){throw new PmCliError(`--fix-scope values must not be empty. Supported values: ${SUPPORTED_FIX_SCOPES.join(", ")}.`,EXIT_CODE.USAGE)}return new Set(DEFAULT_GRANTED_FIX_SCOPES)}const granted=new Set;for(const raw of tokens){const normalized=raw.toLowerCase().replaceAll("-","_");if(SUPPORTED_FIX_SCOPES.includes(normalized)){granted.add(normalized);continue}throw new PmCliError(`Unknown --fix-scope value "${raw}". Supported values: ${SUPPORTED_FIX_SCOPES.join(", ")}.`,EXIT_CODE.USAGE)}return granted}function partitionFixesByGrant(fixes,granted){const applicable=[];const gated=[];for(const fix of fixes){if(fix.gate!==void 0&&!granted.has(fix.gate)){gated.push(fix)}else{applicable.push(fix)}}return{applicable,gated}}function toFixOutputRow(fix){return{item_id:fix.item_id,check:fix.check,field:fix.field,command:fix.command,...fix.gate!==void 0?{gate:fix.gate}:{}}}export{DEFAULT_GRANTED_FIX_SCOPES,SUPPORTED_FIX_SCOPES,partitionFixesByGrant,planCloseReasonBackfillFixes,planEstimateBackfillFixes,planResolutionBackfillFixes,planStaleLinkPruneFixes,planTerminalParentFixes,resolveGrantedFixScopes,toFixOutputRow};
|
|
189
2
|
//# sourceMappingURL=fix-planning.js.map
|
|
190
|
-
//# debugId=98a73818-c4ef-5bce-8b23-6c40f7312cc3
|
|
@@ -1,37 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
* Remote-reference detection for linked artifacts (`pm files` / `pm docs`
|
|
3
|
-
* `path` values).
|
|
4
|
-
*
|
|
5
|
-
* A linked artifact path is normally a workspace-relative or absolute local
|
|
6
|
-
* filesystem path, but `pm docs --add` legitimately records *remote*
|
|
7
|
-
* references too — most commonly an `https://` URL to a pull request, issue, or
|
|
8
|
-
* external design doc. Such references are not local files, so they must never
|
|
9
|
-
* be:
|
|
10
|
-
* - probed with `fs.stat` for existence (the resolved path is meaningless),
|
|
11
|
-
* - classified as `moved`/`deleted` by the stale-path classifier,
|
|
12
|
-
* - counted among `missing_linked_paths` in `pm validate --check-files`, or
|
|
13
|
-
* - pruned by `pm validate --prune-missing` — which would silently destroy an
|
|
14
|
-
* intentionally-recorded reference (project management = context management).
|
|
15
|
-
*
|
|
16
|
-
* Pure module: no filesystem or network access — callers pass the stored path
|
|
17
|
-
* string and branch on the boolean result.
|
|
18
|
-
*/
|
|
19
|
-
/**
|
|
20
|
-
* Matches an RFC 3986 URI that carries an authority component
|
|
21
|
-
* (`scheme://…`) — e.g. `https://`, `http://`, `ftp://`, `ssh://`, `file://`.
|
|
22
|
-
*
|
|
23
|
-
* The scheme is required to be at least two characters so a Windows drive
|
|
24
|
-
* prefix (`C:/…`, which is a single letter followed by a single slash and never
|
|
25
|
-
* `://`) can never be mistaken for a remote reference. A relative or absolute
|
|
26
|
-
* POSIX path (`src/api.ts`, `/dev/null`) and a UNC path (`//server/share`) all
|
|
27
|
-
* lack the `scheme://` shape and are correctly treated as local.
|
|
28
|
-
*/
|
|
29
|
-
|
|
30
|
-
!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]="2b9ba0a4-396f-5870-bc89-e7fc789bb49d")}catch(e){}}();
|
|
31
|
-
const REMOTE_ARTIFACT_REFERENCE_PATTERN = /^[a-z][a-z0-9+.-]+:\/\//i;
|
|
32
|
-
/** Return `true` when a linked-artifact path is a remote reference (a URL with a `scheme://` authority) rather than a local filesystem path. Whitespace is trimmed before matching so a stored `" https://…"` is still recognized. */
|
|
33
|
-
export function isRemoteLinkedArtifactReference(path) {
|
|
34
|
-
return REMOTE_ARTIFACT_REFERENCE_PATTERN.test(path.trim());
|
|
35
|
-
}
|
|
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]="6f94fb3c-3d6c-5543-a2f0-e12680459e71")}catch(e2){}})();const REMOTE_ARTIFACT_REFERENCE_PATTERN=/^[a-z][a-z0-9+.-]+:\/\//i;function isRemoteLinkedArtifactReference(path){return REMOTE_ARTIFACT_REFERENCE_PATTERN.test(path.trim())}export{isRemoteLinkedArtifactReference};
|
|
36
2
|
//# sourceMappingURL=linked-artifact-reference.js.map
|
|
37
|
-
//# debugId=2b9ba0a4-396f-5870-bc89-e7fc789bb49d
|
|
@@ -1,35 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
* Per-item-type grouping of missing-required-field counts for
|
|
3
|
-
* `pm validate --check-metadata` (pm-pmyq / GH-172).
|
|
4
|
-
*
|
|
5
|
-
* Pure module: callers stream `(item_type, field)` pairs — one per missing
|
|
6
|
-
* required field occurrence — and receive a compact, deterministically sorted
|
|
7
|
-
* `missing_by_type` map of counts (never row dumps), e.g.
|
|
8
|
-
* `{ Task: { close_reason: 3, reviewer: 1 } }`.
|
|
9
|
-
*/
|
|
10
|
-
/** Aggregate missing-field occurrences into `{ type: { field: count } }` with both levels sorted lexicographically for stable, diff-friendly output. Zero counts never appear (only observed occurrences are aggregated). */
|
|
11
|
-
|
|
12
|
-
!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]="1951b0f1-11fa-5728-b516-7458a55b1e29")}catch(e){}}();
|
|
13
|
-
export function buildMissingByTypeCounts(occurrences) {
|
|
14
|
-
const countsByType = new Map();
|
|
15
|
-
for (const occurrence of occurrences) {
|
|
16
|
-
let fieldCounts = countsByType.get(occurrence.item_type);
|
|
17
|
-
if (!fieldCounts) {
|
|
18
|
-
fieldCounts = new Map();
|
|
19
|
-
countsByType.set(occurrence.item_type, fieldCounts);
|
|
20
|
-
}
|
|
21
|
-
fieldCounts.set(occurrence.field, (fieldCounts.get(occurrence.field) ?? 0) + 1);
|
|
22
|
-
}
|
|
23
|
-
const result = {};
|
|
24
|
-
for (const type of [...countsByType.keys()].sort((left, right) => left.localeCompare(right))) {
|
|
25
|
-
const fieldCounts = countsByType.get(type);
|
|
26
|
-
const fields = {};
|
|
27
|
-
for (const field of [...fieldCounts.keys()].sort((left, right) => left.localeCompare(right))) {
|
|
28
|
-
fields[field] = fieldCounts.get(field);
|
|
29
|
-
}
|
|
30
|
-
result[type] = fields;
|
|
31
|
-
}
|
|
32
|
-
return result;
|
|
33
|
-
}
|
|
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]="b51a9fba-7bbe-573b-a708-5ffea6fa040f")}catch(e2){}})();function buildMissingByTypeCounts(occurrences){const countsByType=new Map;for(const occurrence of occurrences){let fieldCounts=countsByType.get(occurrence.item_type);if(!fieldCounts){fieldCounts=new Map;countsByType.set(occurrence.item_type,fieldCounts)}fieldCounts.set(occurrence.field,(fieldCounts.get(occurrence.field)??0)+1)}const result={};for(const type of[...countsByType.keys()].sort((left,right)=>left.localeCompare(right))){const fieldCounts=countsByType.get(type);const fields={};for(const field of[...fieldCounts.keys()].sort((left,right)=>left.localeCompare(right))){fields[field]=fieldCounts.get(field)}result[type]=fields}return result}export{buildMissingByTypeCounts};
|
|
34
2
|
//# sourceMappingURL=missing-by-type.js.map
|
|
35
|
-
//# debugId=1951b0f1-11fa-5728-b516-7458a55b1e29
|