@unbrained/pm-cli 2026.9.7 → 2026.9.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.agents/skills/pm-developer/SKILL.md +12 -4
- package/.agents/skills/pm-developer/references/MULTI_AGENT_MERGE.md +19 -10
- package/.agents/skills/pm-extensions/SKILL.md +6 -0
- package/.agents/skills/pm-sdk/SKILL.md +11 -2
- package/.agents/skills/pm-user/SKILL.md +7 -2
- package/.agents/skills/pm-user/references/ECOSYSTEM_PLANNING.md +95 -0
- package/.claude-plugin/marketplace.json +2 -2
- package/CHANGELOG.md +231 -182
- package/dist/cli/after-command-context-usage.js +1 -48
- package/dist/cli/argv-utils.js +1 -40
- package/dist/cli/bootstrap-args.js +1 -9
- package/dist/cli/bundle-integrity.js +2 -110
- package/dist/cli/commander-usage.js +11 -771
- package/dist/cli/commands/activity.js +1 -9
- package/dist/cli/commands/aggregate.js +1 -5
- package/dist/cli/commands/append.js +1 -5
- package/dist/cli/commands/claim.js +1 -5
- package/dist/cli/commands/close-many.js +1 -5
- package/dist/cli/commands/close.js +1 -9
- package/dist/cli/commands/comments.js +1 -5
- package/dist/cli/commands/config.js +1 -9
- package/dist/cli/commands/context.js +1 -9
- package/dist/cli/commands/contracts.js +1 -5
- package/dist/cli/commands/copy.js +1 -9
- package/dist/cli/commands/create.js +1 -9
- package/dist/cli/commands/delete.js +1 -9
- package/dist/cli/commands/deps.js +1 -9
- package/dist/cli/commands/docs.js +1 -9
- package/dist/cli/commands/duplicates.js +1 -9
- package/dist/cli/commands/eval.js +1 -9
- package/dist/cli/commands/extension/describe.js +1 -5
- package/dist/cli/commands/extension/scaffold.js +1 -5
- package/dist/cli/commands/extension/shared.js +1 -5
- package/dist/cli/commands/extension.js +1 -9
- package/dist/cli/commands/files.js +1 -9
- package/dist/cli/commands/focus.js +1 -9
- package/dist/cli/commands/gc.js +1 -9
- package/dist/cli/commands/get.js +1 -9
- package/dist/cli/commands/graph.js +1 -10
- package/dist/cli/commands/health.js +1 -9
- package/dist/cli/commands/history-compact.js +1 -10
- package/dist/cli/commands/history-redact.js +1 -11
- package/dist/cli/commands/history-repair.js +1 -10
- package/dist/cli/commands/history.js +1 -5
- package/dist/cli/commands/index.js +1 -58
- package/dist/cli/commands/init-agent-guidance.js +1 -9
- package/dist/cli/commands/init.js +1 -9
- package/dist/cli/commands/learnings.js +1 -5
- package/dist/cli/commands/lifecycle-transitions.js +1 -5
- package/dist/cli/commands/list.js +1 -9
- package/dist/cli/commands/merge.js +1 -11
- package/dist/cli/commands/next.js +1 -9
- package/dist/cli/commands/notes.js +1 -5
- package/dist/cli/commands/plan.js +1 -9
- package/dist/cli/commands/profile.js +1 -9
- package/dist/cli/commands/restore.js +1 -9
- package/dist/cli/commands/scheduling-shortcuts.js +1 -9
- package/dist/cli/commands/schema.js +1 -10
- package/dist/cli/commands/search.js +1 -9
- package/dist/cli/commands/stats.js +1 -9
- package/dist/cli/commands/telemetry.js +1 -9
- package/dist/cli/commands/test-all.js +1 -9
- package/dist/cli/commands/test-runs.js +1 -9
- package/dist/cli/commands/test.js +1 -9
- package/dist/cli/commands/update-many.js +1 -5
- package/dist/cli/commands/update.js +1 -9
- package/dist/cli/commands/upgrade.js +1 -5
- package/dist/cli/commands/validate.js +1 -15
- package/dist/cli/context-intent-invocation.js +1 -20
- package/dist/cli/description-stdin.js +1 -17
- package/dist/cli/error-guidance.js +1 -1353
- package/dist/cli/extension-command-help.js +5 -636
- package/dist/cli/extension-command-options.js +1 -427
- package/dist/cli/extension-recovery.js +1 -126
- package/dist/cli/help-content.js +2 -1001
- package/dist/cli/help-json-payload.js +4 -570
- package/dist/cli/main.d.ts +4 -0
- package/dist/cli/main.js +5 -2573
- package/dist/cli/migration-gates.js +1 -289
- package/dist/cli/public.js +1 -20
- package/dist/cli/register-annotations.js +1 -270
- package/dist/cli/register-assurance.js +1 -62
- package/dist/cli/register-files-lookup.js +1 -56
- package/dist/cli/register-history-activity.d.ts +8 -0
- package/dist/cli/register-history-activity.js +2 -0
- package/dist/cli/register-history-author.js +1 -38
- package/dist/cli/register-history-maintenance.d.ts +9 -0
- package/dist/cli/register-history-maintenance.js +2 -0
- package/dist/cli/register-list-query.js +10 -943
- package/dist/cli/register-mutation-options.js +1 -9
- package/dist/cli/register-mutation.d.ts +0 -5
- package/dist/cli/register-mutation.js +19 -1893
- package/dist/cli/register-operations.js +1 -920
- package/dist/cli/register-setup.js +1 -716
- package/dist/cli/register-structured-mutation.js +1 -196
- package/dist/cli/registration-helpers.js +1 -5
- package/dist/cli/runtime-compatibility-boundary.js +4 -42
- package/dist/cli/schema-registration-helpers.js +1 -73
- package/dist/cli/search-refresh.js +1 -13
- package/dist/cli/stats-analytics-json.js +1 -68
- package/dist/cli/telemetry-flush.js +1 -10
- package/dist/cli-bundle/bundle-manifest.json +164 -156
- package/dist/cli-bundle/chunks/{chunk-NPN5I67J.js → chunk-3IPRM75M.js} +3 -3
- package/dist/cli-bundle/chunks/chunk-4VL5P22L.js +2 -0
- package/dist/cli-bundle/chunks/chunk-AAFBV3U3.js +29 -0
- package/dist/cli-bundle/chunks/chunk-D3YVILJJ.js +20 -0
- package/dist/cli-bundle/chunks/{chunk-WYRZZ5ZE.js → chunk-DEZPZOQ7.js} +2 -2
- package/dist/cli-bundle/chunks/chunk-ECBLPN7B.js +3 -0
- package/dist/cli-bundle/chunks/chunk-J6ERHBV2.js +235 -0
- package/dist/cli-bundle/chunks/chunk-JUNJ5EKI.js +2 -0
- package/dist/cli-bundle/chunks/chunk-L5RCDKQ2.js +2 -0
- package/dist/cli-bundle/chunks/chunk-NSAPNEYH.js +2 -0
- package/dist/cli-bundle/chunks/chunk-OHNLSGGV.js +79 -0
- package/dist/cli-bundle/chunks/chunk-WQKMSFBV.js +5 -0
- package/dist/cli-bundle/chunks/{chunk-BAX2BYUW.js → chunk-XZ6T7YPP.js} +256 -150
- package/dist/cli-bundle/chunks/{chunk-JT6XF6GE.js → chunk-Z3XVXUVF.js} +4 -4
- package/dist/cli-bundle/chunks/register-list-query-UIHRCS6D.js +11 -0
- package/dist/cli-bundle/chunks/register-mutation-WHWMGRVX.js +20 -0
- package/dist/cli-bundle/chunks/register-operations-64YZYTC5.js +2 -0
- package/dist/cli-bundle/chunks/register-setup-PERI45EM.js +2 -0
- package/dist/cli-bundle/focused-chunks/chunk-2W4XIYOB.js +2 -0
- package/dist/cli-bundle/focused-chunks/chunk-2WSBXIGF.js +12 -0
- package/dist/cli-bundle/focused-chunks/chunk-5FHTCOHS.js +3 -0
- package/dist/cli-bundle/focused-chunks/chunk-7N6DOREF.js +26 -0
- package/dist/cli-bundle/focused-chunks/{chunk-3BZEOXLT.js → chunk-7PC4R5QB.js} +2 -2
- package/dist/cli-bundle/focused-chunks/chunk-BUCJUZVG.js +6 -0
- package/dist/cli-bundle/focused-chunks/chunk-FE3BABLJ.js +2 -0
- package/dist/cli-bundle/focused-chunks/chunk-IWITF53W.js +2 -0
- package/dist/cli-bundle/focused-chunks/chunk-OQUGRHKV.js +10 -0
- package/dist/cli-bundle/focused-chunks/{chunk-M6PBRFSH.js → chunk-PNKIANFZ.js} +2 -2
- package/dist/cli-bundle/focused-chunks/{chunk-LIJIA4TY.js → chunk-QQQ4SAUO.js} +3 -3
- package/dist/cli-bundle/focused-chunks/chunk-TTYXF5YD.js +177 -0
- package/dist/cli-bundle/focused-chunks/chunk-XNR3DM6J.js +2 -0
- package/dist/cli-bundle/focused-chunks/chunk-XSS3APUF.js +9 -0
- package/dist/cli-bundle/focused-chunks/chunk-YCDQ2N23.js +8 -0
- package/dist/cli-bundle/focused-chunks/chunk-YJUXGS57.js +20 -0
- package/dist/cli-bundle/focused-chunks/chunk-ZTCE4UO6.js +58 -0
- package/dist/cli-bundle/main.js +20 -20
- package/dist/cli-bundle/sdk-authoring.js +1 -1
- package/dist/cli-bundle/sdk-contracts.js +2 -2
- package/dist/cli-bundle/sdk-core.js +37 -37
- package/dist/cli-bundle/sdk-governance.js +1 -1
- package/dist/cli-bundle/sdk-graph.js +1 -1
- package/dist/cli-bundle/sdk-merge.js +42 -42
- package/dist/cli-bundle/sdk-query.js +1 -1
- package/dist/cli-bundle/sdk-runtime.js +1 -1
- package/dist/cli-bundle/sdk-testing.js +1 -1
- package/dist/cli-bundle/sdk.js +11 -11
- package/dist/cli.js +1 -104
- package/dist/core/checkpoint/checkpoint-gc.js +1 -169
- package/dist/core/checkpoint/mutation-checkpoint.js +2 -133
- package/dist/core/config/nested-settings.js +1 -534
- package/dist/core/config/positional-value.js +1 -109
- package/dist/core/diagnostics/remediation.js +1 -506
- package/dist/core/extensions/activation-summary-markdown.js +2 -145
- package/dist/core/extensions/activation-summary.js +1 -92
- package/dist/core/extensions/activation-transaction.js +1 -46
- package/dist/core/extensions/capability-usage.js +1 -173
- package/dist/core/extensions/command-hook-context.js +1 -13
- package/dist/core/extensions/command-metadata-contract.js +1 -22
- package/dist/core/extensions/command-visibility-tier.js +1 -29
- package/dist/core/extensions/contribution-inventory.js +1 -173
- package/dist/core/extensions/exporter-output-contract.js +1 -66
- package/dist/core/extensions/extension-candidate.js +1 -18
- package/dist/core/extensions/extension-capability-aliases.js +1 -158
- package/dist/core/extensions/extension-hook-runtime.js +1 -699
- package/dist/core/extensions/extension-policy.js +1 -599
- package/dist/core/extensions/extension-registries.js +1 -62
- package/dist/core/extensions/extension-runtime-helpers.js +1 -33
- package/dist/core/extensions/extension-types.js +1 -102
- package/dist/core/extensions/flag-definition-validation.js +1 -52
- package/dist/core/extensions/flag-value-types.js +1 -64
- package/dist/core/extensions/index.js +1 -526
- package/dist/core/extensions/item-field-types.js +1 -39
- package/dist/core/extensions/item-fields.js +1 -261
- package/dist/core/extensions/loader.js +1 -2223
- package/dist/core/extensions/manifest-schema.js +1 -69
- package/dist/core/extensions/module-graph-snapshot.js +1 -33
- package/dist/core/extensions/preflight-ownership.js +1 -41
- package/dist/core/extensions/registration-validation.js +1 -82
- package/dist/core/extensions/registration-values.js +1 -209
- package/dist/core/extensions/reserved-host-flags.js +1 -36
- package/dist/core/extensions/runtime-registrations.js +1 -67
- package/dist/core/extensions/service-ownership.js +1 -19
- package/dist/core/extensions/version-compat.js +1 -216
- package/dist/core/fs/fs-utils.js +2 -158
- package/dist/core/fs/host-environment-errors.js +1 -141
- package/dist/core/fs/index.js +1 -9
- package/dist/core/fs/path-utils.js +1 -17
- package/dist/core/governance/content-fields.js +1 -160
- package/dist/core/governance/issue-codes.js +1 -151
- package/dist/core/governance/metadata-coverage.js +1 -358
- package/dist/core/history/drift-cache.js +3 -72
- package/dist/core/history/drift-scan.js +1 -342
- package/dist/core/history/event-classification.js +1 -109
- package/dist/core/history/event-index.js +8 -784
- package/dist/core/history/history-compact-bulk.js +1 -104
- package/dist/core/history/history-diff.js +1 -158
- package/dist/core/history/history-rewrite.d.ts +6 -1
- package/dist/core/history/history-rewrite.js +1 -107
- package/dist/core/history/history-storage-stats.js +1 -102
- package/dist/core/history/history-stream-policy.js +1 -62
- package/dist/core/history/history.js +2 -617
- package/dist/core/history/identity.js +1 -30
- package/dist/core/history/index.js +1 -9
- package/dist/core/history/projection.js +1 -196
- package/dist/core/history/read.d.ts +9 -0
- package/dist/core/history/read.js +1 -57
- package/dist/core/history/replay.js +2 -439
- package/dist/core/history/version-address.js +1 -32
- package/dist/core/history/workspace-history.js +2 -433
- package/dist/core/io/body-file.js +1 -62
- package/dist/core/io/bulk-ids-input.js +1 -112
- package/dist/core/item/actionability.js +1 -327
- package/dist/core/item/dependency-reference.js +1 -20
- package/dist/core/item/id.js +1 -112
- package/dist/core/item/index.js +1 -12
- package/dist/core/item/item-format-version.js +1 -78
- package/dist/core/item/item-format.js +5 -1473
- package/dist/core/item/item-record.js +1 -23
- package/dist/core/item/item-type-definition.js +1 -133
- package/dist/core/item/parent-reference-policy.js +1 -57
- package/dist/core/item/parse.js +2 -603
- package/dist/core/item/plan-lifecycle.js +1 -19
- package/dist/core/item/priority.js +1 -61
- package/dist/core/item/sprint-release-format.js +1 -38
- package/dist/core/item/status-filter.js +1 -115
- package/dist/core/item/status.js +1 -43
- package/dist/core/item/toon-decode.js +1 -29
- package/dist/core/item/type-registry.js +1 -715
- package/dist/core/item/type-synonyms.js +1 -38
- package/dist/core/lock/index.js +1 -9
- package/dist/core/lock/lock-gc.js +1 -240
- package/dist/core/lock/lock.js +3 -590
- package/dist/core/output/mutation-projection.js +1 -217
- package/dist/core/output/output-control.js +1 -25
- package/dist/core/output/output.js +11 -494
- package/dist/core/output/query-summary.js +1 -58
- package/dist/core/output/tabular.js +1 -77
- package/dist/core/packages/manifest.js +1 -244
- package/dist/core/packages/root.js +1 -84
- package/dist/core/policy/workflow-policy-schema.d.ts +312 -0
- package/dist/core/policy/workflow-policy-schema.js +2 -0
- package/dist/core/policy/workflow-policy-store.d.ts +24 -0
- package/dist/core/policy/workflow-policy-store.js +2 -0
- package/dist/core/policy/workflow-policy.d.ts +139 -0
- package/dist/core/policy/workflow-policy.js +2 -0
- package/dist/core/profile/profile-describe.js +1 -83
- package/dist/core/profile/profile-lint.js +1 -415
- package/dist/core/profile/profile-plan.js +0 -0
- package/dist/core/profile/profile-presets.js +1 -370
- package/dist/core/reproducibility/context.js +1 -82
- package/dist/core/schema/fields-file.js +2 -288
- package/dist/core/schema/item-types-file.js +2 -296
- package/dist/core/schema/runtime-field-filters.js +1 -49
- package/dist/core/schema/runtime-field-values.js +1 -313
- package/dist/core/schema/runtime-schema.js +2 -826
- package/dist/core/schema/status-defs-file.js +2 -227
- package/dist/core/schema/status-token.js +1 -31
- package/dist/core/schema/type-inference.js +1 -95
- package/dist/core/schema/type-presets.js +1 -87
- package/dist/core/schema/type-workflows.js +1 -104
- package/dist/core/search/background-refresh.js +2 -286
- package/dist/core/search/bm25.js +1 -146
- package/dist/core/search/cache.js +2 -534
- package/dist/core/search/corpus.js +1 -311
- package/dist/core/search/embedding-batches.js +1 -163
- package/dist/core/search/eval.js +1 -225
- package/dist/core/search/http-client.js +1 -75
- package/dist/core/search/providers.js +1 -242
- package/dist/core/search/relevance.js +1 -244
- package/dist/core/search/semantic-defaults.js +1 -199
- package/dist/core/search/staleness.js +1 -30
- package/dist/core/search/vector-stores.js +2 -664
- package/dist/core/search/vectorization-metadata.js +1 -81
- package/dist/core/sentry/helpers.js +1 -272
- package/dist/core/sentry/instrument.js +1 -387
- package/dist/core/session/session-state.js +1 -260
- package/dist/core/shared/agent-session-context.js +1 -133
- package/dist/core/shared/author.js +1 -1172
- package/dist/core/shared/command-types.js +1 -4
- package/dist/core/shared/conflict-markers.js +1 -31
- package/dist/core/shared/constants.js +1 -405
- package/dist/core/shared/errors.js +1 -20
- package/dist/core/shared/html-entity-decode.js +1 -131
- package/dist/core/shared/index.js +1 -12
- package/dist/core/shared/item-metadata-contract.js +1 -89
- package/dist/core/shared/lazy-module.js +1 -16
- package/dist/core/shared/levenshtein.js +1 -61
- package/dist/core/shared/memo.js +1 -19
- package/dist/core/shared/numeric-parsers.js +1 -20
- package/dist/core/shared/option-alias-visibility.js +1 -67
- package/dist/core/shared/primitives.js +1 -127
- package/dist/core/shared/serial-queue.js +1 -79
- package/dist/core/shared/serialization.js +1 -210
- package/dist/core/shared/split-comma-list.js +1 -30
- package/dist/core/shared/text-normalization.js +1 -38
- package/dist/core/shared/time.js +1 -306
- package/dist/core/store/index.js +1 -12
- package/dist/core/store/item-format-migration.js +1 -125
- package/dist/core/store/item-metadata-cache.js +1 -1116
- package/dist/core/store/item-metadata-query-index.js +9 -394
- package/dist/core/store/item-metadata-read-work.js +1 -43
- package/dist/core/store/item-store.js +1 -693
- package/dist/core/store/paths.d.ts +1 -1
- package/dist/core/store/paths.js +1 -214
- package/dist/core/store/settings-read-cache.js +1 -85
- package/dist/core/store/settings-validator.d.ts +1 -0
- package/dist/core/store/settings-validator.js +1 -421
- package/dist/core/store/settings.js +3 -1309
- package/dist/core/store/tracker-preflight.js +1 -141
- package/dist/core/telemetry/consent.js +5 -108
- package/dist/core/telemetry/observability.js +1 -246
- package/dist/core/telemetry/runtime.js +4 -1988
- package/dist/core/test/background-runs.js +4 -945
- package/dist/core/test/item-test-run-tracking.js +1 -63
- package/dist/core/test/run-selectors.js +1 -120
- package/dist/core/validate/estimate-defaults.js +1 -89
- package/dist/core/validate/fix-planning.js +1 -189
- package/dist/core/validate/linked-artifact-reference.js +1 -36
- package/dist/core/validate/missing-by-type.js +1 -34
- package/dist/core/validate/missing-link-owners.js +1 -95
- package/dist/core/validate/stale-file-classification.js +1 -82
- package/dist/mcp/http-server.js +5 -448
- package/dist/mcp/legacy-adapter.js +1 -77
- package/dist/mcp/runtime-capabilities.js +1 -200
- package/dist/mcp/server.js +4 -1233
- package/dist/mcp/tool-definitions.js +1 -804
- package/dist/sdk/actionability.js +1 -13
- package/dist/sdk/agent/closed-domain-contracts.js +1 -161
- package/dist/sdk/agent/command-recovery.js +1 -59
- package/dist/sdk/agent/command-suggestions.js +1 -66
- package/dist/sdk/agent/create-option-policy.js +1 -31
- package/dist/sdk/agent/identity-config.js +1 -106
- package/dist/sdk/agent/item-addressing.js +1 -207
- package/dist/sdk/agent/refusal-closure-census.js +1 -151
- package/dist/sdk/agent/refusal-closure.js +1 -133
- package/dist/sdk/agent/refusal-corpus-contracts.js +1 -193
- package/dist/sdk/agent/refusal-reachability.js +1 -593
- package/dist/sdk/agent/subcommand-recovery.js +1 -83
- package/dist/sdk/agent/task-transcript-contracts.js +1 -197
- package/dist/sdk/agent/tracker-preflight-contracts.js +1 -126
- package/dist/sdk/agent-capability-contracts.js +1 -428
- package/dist/sdk/agent-session-context.js +1 -9
- package/dist/sdk/annotations.js +1 -448
- package/dist/sdk/author-attribution.js +1 -468
- package/dist/sdk/authoring.js +1 -20
- package/dist/sdk/cli-bootstrap.js +1 -838
- package/dist/sdk/cli-contracts/agent-output-contracts.d.ts +1 -1
- package/dist/sdk/cli-contracts/agent-output-contracts.js +4 -476
- package/dist/sdk/cli-contracts/bootstrap-command-scanner.js +1 -79
- package/dist/sdk/cli-contracts/command-aliases.d.ts +4 -0
- package/dist/sdk/cli-contracts/command-aliases.js +1 -107
- package/dist/sdk/cli-contracts/command-exit-contracts.js +1 -151
- package/dist/sdk/cli-contracts/commander-mutation-options.js +1 -1081
- package/dist/sdk/cli-contracts/commander-types.js +1 -159
- package/dist/sdk/cli-contracts/completeness.js +1 -393
- package/dist/sdk/cli-contracts/enum-contracts.d.ts +1 -1
- package/dist/sdk/cli-contracts/enum-contracts.js +1 -222
- package/dist/sdk/cli-contracts/flag-contracts.js +1 -1947
- package/dist/sdk/cli-contracts/flag-lexicon-contracts.js +1 -347
- package/dist/sdk/cli-contracts/grammar-contracts.js +1 -986
- package/dist/sdk/cli-contracts/registration-helpers.js +7 -990
- package/dist/sdk/cli-contracts/runtime-contracts.d.ts +5 -0
- package/dist/sdk/cli-contracts/runtime-contracts.js +1 -2090
- package/dist/sdk/cli-contracts/schemas/assurance-definition.js +1 -324
- package/dist/sdk/cli-contracts/string-lists.js +1 -16
- package/dist/sdk/cli-contracts/tool-option-contracts.js +1 -461
- package/dist/sdk/cli-contracts/tool-parameter-tables.js +1 -2167
- package/dist/sdk/cli-contracts/tool-schema.d.ts +3 -1
- package/dist/sdk/cli-contracts/tool-schema.js +1 -1664
- package/dist/sdk/cli-contracts/typed-action-inputs.js +1 -4
- package/dist/sdk/cli-contracts.d.ts +1 -1
- package/dist/sdk/cli-contracts.js +1 -17
- package/dist/sdk/cli-program.js +1 -49
- package/dist/sdk/command-line.d.ts +2 -5
- package/dist/sdk/command-line.js +1 -78
- package/dist/sdk/comments.js +1 -133
- package/dist/sdk/compile-cache.js +1 -73
- package/dist/sdk/completion.js +174 -839
- package/dist/sdk/compose.js +1 -1090
- package/dist/sdk/config.js +1 -1204
- package/dist/sdk/context/recency.js +1 -33
- package/dist/sdk/context/semantic-session-attribution.js +1 -82
- package/dist/sdk/context/usage-egress.js +1 -29
- package/dist/sdk/context/usage-ledger.js +3 -185
- package/dist/sdk/context-intent-contracts.js +1 -709
- package/dist/sdk/context-intent-runtime.js +1 -115
- package/dist/sdk/context-packing.js +1 -218
- package/dist/sdk/context-relevance.js +1 -503
- package/dist/sdk/context-signal-store.js +2 -426
- package/dist/sdk/context-usage.js +1 -367
- package/dist/sdk/contracts.js +1 -23
- package/dist/sdk/core-governance.js +1 -14
- package/dist/sdk/core.js +1 -14
- package/dist/sdk/corpus-shape.js +1 -401
- package/dist/sdk/define.js +1 -220
- package/dist/sdk/dependencies.js +1 -718
- package/dist/sdk/dependency-flag-validation.js +1 -156
- package/dist/sdk/dependency-provenance.js +1 -135
- package/dist/sdk/docs.js +1 -14
- package/dist/sdk/duplicates.js +1 -40
- package/dist/sdk/environment/agent-environment.js +1 -466
- package/dist/sdk/environment/host-environment-errors.js +1 -8
- package/dist/sdk/environment/project-runtime-compatibility.js +1 -481
- package/dist/sdk/environment/source-context.js +1 -28
- package/dist/sdk/environment/tracker-preflight.js +1 -9
- package/dist/sdk/error-code-catalog.js +1 -153
- package/dist/sdk/error-runtime.js +1 -58
- package/dist/sdk/errors.js +1 -58
- package/dist/sdk/eval.js +1 -190
- package/dist/sdk/extension/author-manifest.js +1 -92
- package/dist/sdk/extension/bundled-catalog.js +1 -332
- package/dist/sdk/extension/concurrency.js +1 -25
- package/dist/sdk/extension/copy-scope.d.ts +2 -0
- package/dist/sdk/extension/copy-scope.js +2 -0
- package/dist/sdk/extension/custom-field-collisions.js +1 -30
- package/dist/sdk/extension/describe.js +3 -189
- package/dist/sdk/extension/doctor.js +1 -606
- package/dist/sdk/extension/install-plan.d.ts +69 -0
- package/dist/sdk/extension/install-plan.js +2 -0
- package/dist/sdk/extension/install-receipts.d.ts +7 -0
- package/dist/sdk/extension/install-receipts.js +2 -0
- package/dist/sdk/extension/install-runtime.js +3 -313
- package/dist/sdk/extension/install-snapshot.js +1 -66
- package/dist/sdk/extension/install-sources.js +5 -1057
- package/dist/sdk/extension/managed-state.js +2 -252
- package/dist/sdk/extension/migrations.js +2 -174
- package/dist/sdk/extension/output-ownership.js +1 -25
- package/dist/sdk/extension/runtime-summary.js +1 -18
- package/dist/sdk/extension/scaffold.js +4 -2308
- package/dist/sdk/extension/shared.js +1 -147
- package/dist/sdk/extension/source-resolution.js +1 -65
- package/dist/sdk/extension/update-check.js +1 -67
- package/dist/sdk/extension-command-context.js +1 -44
- package/dist/sdk/extension-contracts.js +1 -73
- package/dist/sdk/extension.d.ts +7 -2
- package/dist/sdk/extension.js +1 -2196
- package/dist/sdk/files.js +1 -535
- package/dist/sdk/flag-invocation-contracts.d.ts +0 -5
- package/dist/sdk/flag-invocation-contracts.js +1 -344
- package/dist/sdk/generated/generated-error-code-catalog-part-1.js +1 -2224
- package/dist/sdk/generated/generated-error-code-catalog-part-2.js +1 -2236
- package/dist/sdk/generated-error-code-catalog.js +1 -16
- package/dist/sdk/governance/assurance-action-contracts.js +1 -4
- package/dist/sdk/governance/assurance-action.js +1 -411
- package/dist/sdk/governance/assurance-limits.js +1 -10
- package/dist/sdk/governance/assurance-mutation-error.js +1 -81
- package/dist/sdk/governance/assurance-presets.js +1 -135
- package/dist/sdk/governance/assurance-runtime.js +1 -238
- package/dist/sdk/governance/assurance.js +4 -1182
- package/dist/sdk/governance/boundary-fixtures.js +1 -200
- package/dist/sdk/governance/coverage-assurance.js +1 -60
- package/dist/sdk/governance/defect-recurrence-coverage.js +1 -188
- package/dist/sdk/governance/defect-recurrence-graph.js +1 -120
- package/dist/sdk/governance/defect-recurrence-signals.js +1 -24
- package/dist/sdk/governance/defect-recurrence.js +1 -623
- package/dist/sdk/governance/extension-host-version.js +1 -115
- package/dist/sdk/governance/gc.js +1 -368
- package/dist/sdk/governance/health.js +1 -2367
- package/dist/sdk/governance/hierarchy-validation.js +1 -108
- package/dist/sdk/governance/linked-file-report.js +1 -71
- package/dist/sdk/governance/merge-receipt-history.js +1 -206
- package/dist/sdk/governance/provenance-health.js +1 -282
- package/dist/sdk/governance/reindex.js +4 -761
- package/dist/sdk/governance/stale-work.js +1 -82
- package/dist/sdk/governance/status-role-diagnostics.js +1 -35
- package/dist/sdk/governance/storage-integrity.js +1 -280
- package/dist/sdk/governance/tracked-runtime-cache.js +1 -106
- package/dist/sdk/governance/upgrade.js +2 -327
- package/dist/sdk/governance/validate-history-drift.js +1 -81
- package/dist/sdk/governance/validate-item-reader.js +1 -17
- package/dist/sdk/governance/validate-normalization.js +1 -36
- package/dist/sdk/governance/validate.d.ts +3 -1
- package/dist/sdk/governance/validate.js +1 -2261
- package/dist/sdk/governance/workflow-completeness.d.ts +32 -0
- package/dist/sdk/governance/workflow-completeness.js +2 -0
- package/dist/sdk/governance/workflow-policy.d.ts +47 -0
- package/dist/sdk/governance/workflow-policy.js +4 -0
- package/dist/sdk/governance/workspace-position.js +1 -163
- package/dist/sdk/governance.d.ts +2 -0
- package/dist/sdk/governance.js +1 -31
- package/dist/sdk/graph/adapter.js +1 -181
- package/dist/sdk/graph/analytics.js +1 -474
- package/dist/sdk/graph/assembly.js +1 -377
- package/dist/sdk/graph/cache.js +1 -160
- package/dist/sdk/graph/centrality.js +1 -258
- package/dist/sdk/graph/conformance.js +1 -130
- package/dist/sdk/graph/deadline-scheduling.d.ts +90 -0
- package/dist/sdk/graph/deadline-scheduling.js +2 -0
- package/dist/sdk/graph/durable-cache.d.ts +1 -1
- package/dist/sdk/graph/durable-cache.js +1 -361
- package/dist/sdk/graph/governance-contracts.js +1 -34
- package/dist/sdk/graph/governance.d.ts +13 -1
- package/dist/sdk/graph/governance.js +1 -735
- package/dist/sdk/graph/hierarchy-integrity.js +1 -310
- package/dist/sdk/graph/index.d.ts +3 -2
- package/dist/sdk/graph/index.js +1 -26
- package/dist/sdk/graph/lifecycle-coverage.d.ts +32 -0
- package/dist/sdk/graph/lifecycle-coverage.js +2 -0
- package/dist/sdk/graph/mutation-advisory.js +1 -176
- package/dist/sdk/graph/remediation.js +1 -197
- package/dist/sdk/graph/run.d.ts +15 -1
- package/dist/sdk/graph/run.js +1 -768
- package/dist/sdk/graph/scheduling.js +1 -124
- package/dist/sdk/graph/traversal.js +1 -284
- package/dist/sdk/graph/workspace-relationship-kind-registry.js +1 -27
- package/dist/sdk/graph.js +1 -15
- package/dist/sdk/guide-topics.js +1 -707
- package/dist/sdk/guide.js +1 -279
- package/dist/sdk/history/maintenance.d.ts +71 -0
- package/dist/sdk/history/maintenance.js +2 -0
- package/dist/sdk/history/salvage.js +2 -247
- package/dist/sdk/history/subject.d.ts +19 -0
- package/dist/sdk/history/subject.js +2 -0
- package/dist/sdk/history-analytics.js +1 -282
- package/dist/sdk/history-compact.js +1 -527
- package/dist/sdk/history-mcp.js +1 -68
- package/dist/sdk/history-provenance.js +1 -182
- package/dist/sdk/history-read.js +1 -96
- package/dist/sdk/history-redact.d.ts +1 -14
- package/dist/sdk/history-redact.js +1 -643
- package/dist/sdk/history-repair.d.ts +5 -0
- package/dist/sdk/history-repair.js +1 -657
- package/dist/sdk/improvement-ledger-validation.js +1 -62
- package/dist/sdk/improvement-ledger.js +2 -257
- package/dist/sdk/index.d.ts +4 -1
- package/dist/sdk/index.js +1 -183
- package/dist/sdk/init-agent-guidance.js +2 -496
- package/dist/sdk/init.js +2 -820
- package/dist/sdk/invocation-author.js +1 -39
- package/dist/sdk/item-children.js +1 -90
- package/dist/sdk/item-metadata-index.js +1 -15
- package/dist/sdk/item-schedule.js +1 -27
- package/dist/sdk/item-transaction.js +1 -396
- package/dist/sdk/learnings.js +1 -29
- package/dist/sdk/lifecycle/append.js +2 -53
- package/dist/sdk/lifecycle/claim.d.ts +2 -0
- package/dist/sdk/lifecycle/claim.js +1 -242
- package/dist/sdk/lifecycle/close-many.js +1 -438
- package/dist/sdk/lifecycle/close.js +1 -468
- package/dist/sdk/lifecycle/copy.js +1 -212
- package/dist/sdk/lifecycle/create.js +1 -1949
- package/dist/sdk/lifecycle/delete.js +1 -45
- package/dist/sdk/lifecycle/event-validation-messages.js +1 -91
- package/dist/sdk/lifecycle/focus.js +1 -91
- package/dist/sdk/lifecycle/hierarchy-mutation-lock.js +1 -24
- package/dist/sdk/lifecycle/legacy-none-tokens.js +1 -149
- package/dist/sdk/lifecycle/lifecycle-transitions.js +1 -40
- package/dist/sdk/lifecycle/mcp-actions.d.ts +2 -0
- package/dist/sdk/lifecycle/mcp-actions.js +1 -51
- package/dist/sdk/lifecycle/metadata-normalizers.js +1 -46
- package/dist/sdk/lifecycle/mutation-command-options.js +1 -9
- package/dist/sdk/lifecycle/plan.js +1 -1606
- package/dist/sdk/lifecycle/recurrence-parsers.d.ts +1 -1
- package/dist/sdk/lifecycle/recurrence-parsers.js +1 -147
- package/dist/sdk/lifecycle/reopen.js +1 -68
- package/dist/sdk/lifecycle/repeatable-metadata-parsers.js +1 -143
- package/dist/sdk/lifecycle/restore.d.ts +1 -0
- package/dist/sdk/lifecycle/restore.js +1 -330
- package/dist/sdk/lifecycle/shared-unset-fields.js +1 -295
- package/dist/sdk/lifecycle/update-many.js +1 -861
- package/dist/sdk/lifecycle/update.js +1 -2136
- package/dist/sdk/lifecycle-completion.js +1 -92
- package/dist/sdk/lifecycle-policy.js +1 -120
- package/dist/sdk/linked-artifacts.js +1 -530
- package/dist/sdk/mcp/apps.js +4 -133
- package/dist/sdk/mcp/authorization.js +1 -404
- package/dist/sdk/mcp/discovery.js +1 -494
- package/dist/sdk/mcp/interactions.js +1 -336
- package/dist/sdk/mcp/protocol.d.ts +7 -0
- package/dist/sdk/mcp/protocol.js +1 -184
- package/dist/sdk/mcp/skills.js +1 -389
- package/dist/sdk/mcp/subscriptions.js +1 -211
- package/dist/sdk/mcp/tasks.js +2 -430
- package/dist/sdk/mcp/transport.js +1 -260
- package/dist/sdk/merge/abandoned-receipts.js +1 -46
- package/dist/sdk/merge/driver.js +1 -212
- package/dist/sdk/merge/index.js +1 -16
- package/dist/sdk/merge/install.js +3 -561
- package/dist/sdk/merge/receipt-file-boundary.js +1 -46
- package/dist/sdk/merge/receipt-operation.js +1 -96
- package/dist/sdk/merge/receipt-schema.js +1 -397
- package/dist/sdk/merge/receipts.js +4 -525
- package/dist/sdk/merge/reconcile.js +1 -352
- package/dist/sdk/merge/three-way.js +3 -775
- package/dist/sdk/merge.js +1 -10
- package/dist/sdk/mutation-events.js +1 -292
- package/dist/sdk/mutation-guard.js +1 -216
- package/dist/sdk/notes.js +1 -139
- package/dist/sdk/output-contracts.js +1 -172
- package/dist/sdk/output-projection.js +1 -430
- package/dist/sdk/output-token-accounting.js +1 -140
- package/dist/sdk/output.js +1 -64
- package/dist/sdk/ownership-source.js +1 -21
- package/dist/sdk/package-import-adapters.js +1 -442
- package/dist/sdk/package-migrations.js +1 -20
- package/dist/sdk/package-runtime-options.js +1 -80
- package/dist/sdk/pagination.js +1 -162
- package/dist/sdk/profile.js +1 -454
- package/dist/sdk/provenance.js +1 -258
- package/dist/sdk/public-surface.json +1 -1
- package/dist/sdk/query/activity.js +1 -401
- package/dist/sdk/query/aggregate.d.ts +16 -0
- package/dist/sdk/query/aggregate.js +1 -390
- package/dist/sdk/query/calendar.js +1 -964
- package/dist/sdk/query/complete-list.js +1 -215
- package/dist/sdk/query/context.js +1 -1702
- package/dist/sdk/query/duplicate-candidates.js +1 -70
- package/dist/sdk/query/get.js +1 -450
- package/dist/sdk/query/history.js +1 -186
- package/dist/sdk/query/item-filter-options.js +1 -9
- package/dist/sdk/query/light-metadata.js +1 -18
- package/dist/sdk/query/list-filter-shared.js +1 -81
- package/dist/sdk/query/list.js +1 -1304
- package/dist/sdk/query/multi-value-filters.js +1 -78
- package/dist/sdk/query/next.js +1 -513
- package/dist/sdk/query/parsers.js +1 -44
- package/dist/sdk/query/projection-contracts.js +1 -184
- package/dist/sdk/query/search-contracts.d.ts +27 -0
- package/dist/sdk/query/search-contracts.js +1 -230
- package/dist/sdk/query/search-pagination.js +1 -35
- package/dist/sdk/query/search-rendering.js +1 -105
- package/dist/sdk/query/search.d.ts +6 -4
- package/dist/sdk/query/search.js +2 -1987
- package/dist/sdk/query.js +1 -35
- package/dist/sdk/read-output/continuation.js +1 -194
- package/dist/sdk/read-output-budget.js +1 -135
- package/dist/sdk/read-output-contracts.d.ts +1 -1
- package/dist/sdk/read-output-contracts.js +1 -1225
- package/dist/sdk/read-output-rows.js +1 -186
- package/dist/sdk/read-output-session.js +1 -208
- package/dist/sdk/relationship-analytics.js +1 -410
- package/dist/sdk/relationship-context.js +1 -284
- package/dist/sdk/relationship-history.js +4 -519
- package/dist/sdk/relationship-kinds/contract.js +1 -22
- package/dist/sdk/relationship-migration.js +1 -77
- package/dist/sdk/relationships.js +1 -579
- package/dist/sdk/reproducibility/process.js +1 -87
- package/dist/sdk/runtime-action-aliases.js +1 -59
- package/dist/sdk/runtime-extended-actions.js +1 -177
- package/dist/sdk/runtime-input.js +1 -614
- package/dist/sdk/runtime-primitives.js +1 -84
- package/dist/sdk/runtime-public-contracts.d.ts +2 -1
- package/dist/sdk/runtime-public-contracts.js +1 -4
- package/dist/sdk/runtime-stats-options.js +1 -38
- package/dist/sdk/runtime.d.ts +4 -0
- package/dist/sdk/runtime.js +1 -1928
- package/dist/sdk/scheduling-shortcuts.js +1 -63
- package/dist/sdk/schema-migration.js +3 -856
- package/dist/sdk/schema.d.ts +2 -1
- package/dist/sdk/schema.js +1 -1376
- package/dist/sdk/search-refresh-worker.js +1 -18
- package/dist/sdk/similarity-scoring.js +1 -53
- package/dist/sdk/similarity.js +1 -326
- package/dist/sdk/start-task-status.js +1 -14
- package/dist/sdk/stats.js +1 -270
- package/dist/sdk/structured-mutations.js +1 -580
- package/dist/sdk/telemetry-flush.js +1 -13
- package/dist/sdk/telemetry.js +1 -405
- package/dist/sdk/templates.js +2 -292
- package/dist/sdk/test/batch.js +2 -509
- package/dist/sdk/test/entry.js +1 -70
- package/dist/sdk/test/execution.js +6 -2211
- package/dist/sdk/test/linked-command-detection.js +1 -546
- package/dist/sdk/test/measurements.js +1 -91
- package/dist/sdk/test/parsers.js +1 -545
- package/dist/sdk/test/runs.js +1 -193
- package/dist/sdk/test/trust.js +2 -206
- package/dist/sdk/testing.js +4 -1391
- package/dist/sdk/traceability/runtime-files-lookup.js +1 -32
- package/dist/sdk/traceability/source-traceability.js +1 -292
- package/dist/sdk/tracker-root-discovery.js +1 -9
- package/dist/sdk/workspace-contracts-cache.js +1 -28
- package/dist/sdk/workspace-contracts.js +1 -33
- package/dist/sdk/workspace-memory.js +2 -318
- package/dist/sdk/workspace-recipe.js +1 -71
- package/dist/sdk/workspace-snapshot.js +4 -613
- package/dist/sdk/workspace-transaction-gc.js +1 -149
- package/dist/sdk/workspace-transaction.js +2 -363
- package/dist/sdk/workspace.js +3 -127
- package/dist/types/index.js +1 -9
- package/dist/types.d.ts +4 -0
- package/dist/types.js +1 -245
- package/docs/AGENT_GUIDE.md +1 -1
- package/docs/COMMANDS.md +10 -0
- package/docs/CONFIGURATION.md +12 -1
- package/docs/CONTEXT_ALGORITHM_PORTFOLIO.md +167 -0
- package/docs/DIAGNOSTIC_OUTPUT_CONTRACTS.md +9 -3
- package/docs/EXTENSIONS.md +1 -0
- package/docs/HISTORY_MAINTENANCE.md +125 -0
- package/docs/MCP_2026_07_28_CONFORMANCE.md +20 -10
- package/docs/PACKAGE_EVIDENCE.md +92 -0
- package/docs/PLANNING_MEASUREMENTS.md +183 -0
- package/docs/README.md +4 -0
- package/docs/READ_OUTPUT_CONTRACTS.md +5 -0
- package/docs/SCRIPTING.md +21 -0
- package/docs/TESTING.md +33 -0
- package/docs/WORKFLOW_POLICIES.md +129 -0
- package/docs/generated/FLAG_LEXICON_BUDGETS.md +7 -7
- package/docs/generated/REFUSAL_CLOSURE_CENSUS.md +11 -5
- package/marketplace.json +2 -2
- package/package.json +5 -5
- package/packages/pm-beads/package.json +1 -1
- package/packages/pm-calendar/package.json +1 -1
- package/packages/pm-command-kit/package.json +1 -1
- package/packages/pm-digital-twin/package.json +1 -1
- package/packages/pm-governance-audit/package.json +1 -1
- package/packages/pm-guide-shell/package.json +1 -1
- package/packages/pm-kanban/package.json +1 -1
- package/packages/pm-lifecycle-hooks/package.json +1 -1
- package/packages/pm-linked-test-adapters/package.json +1 -1
- package/packages/pm-search-advanced/package.json +1 -1
- package/packages/pm-templates/package.json +1 -1
- package/packages/pm-todos/package.json +1 -1
- package/packages/pm-vcs/package.json +1 -1
- package/plugins/pm-claude/.claude-plugin/plugin.json +1 -1
- package/plugins/pm-codex/.codex-plugin/plugin.json +1 -1
- package/scripts/finalize-build.mjs +45 -3
- package/dist/cli-bundle/chunks/chunk-AZDFJGH6.js +0 -9
- package/dist/cli-bundle/chunks/chunk-CKOL5U7J.js +0 -77
- package/dist/cli-bundle/chunks/chunk-JX4DH4WC.js +0 -3
- package/dist/cli-bundle/chunks/chunk-OF76PSDQ.js +0 -5
- package/dist/cli-bundle/chunks/chunk-QUWFABDM.js +0 -232
- package/dist/cli-bundle/chunks/chunk-QWRRFYK3.js +0 -2
- package/dist/cli-bundle/chunks/chunk-RWWBOWJ5.js +0 -2
- package/dist/cli-bundle/chunks/chunk-WGAOYSYH.js +0 -40
- package/dist/cli-bundle/chunks/chunk-WI2AYPA7.js +0 -2
- package/dist/cli-bundle/chunks/register-list-query-5JL52D33.js +0 -11
- package/dist/cli-bundle/chunks/register-mutation-ZPG7KMVP.js +0 -20
- package/dist/cli-bundle/chunks/register-operations-I5W3KMGB.js +0 -2
- package/dist/cli-bundle/chunks/register-setup-H4SVAVX7.js +0 -2
- package/dist/cli-bundle/focused-chunks/chunk-AL5ON6K6.js +0 -2
- package/dist/cli-bundle/focused-chunks/chunk-CHC2IDXA.js +0 -6
- package/dist/cli-bundle/focused-chunks/chunk-CK6QFAPZ.js +0 -20
- package/dist/cli-bundle/focused-chunks/chunk-EZR3GHFE.js +0 -2
- package/dist/cli-bundle/focused-chunks/chunk-H2WJWK7L.js +0 -56
- package/dist/cli-bundle/focused-chunks/chunk-NTPY5GSO.js +0 -3
- package/dist/cli-bundle/focused-chunks/chunk-P5O7MP5Y.js +0 -2
- package/dist/cli-bundle/focused-chunks/chunk-PDMW2E36.js +0 -177
- package/dist/cli-bundle/focused-chunks/chunk-PEFABF7E.js +0 -26
- package/dist/cli-bundle/focused-chunks/chunk-QTVCLMSZ.js +0 -6
- package/dist/cli-bundle/focused-chunks/chunk-QTZRBUYA.js +0 -8
- package/dist/cli-bundle/focused-chunks/chunk-SGQST3PQ.js +0 -12
- package/dist/cli-bundle/focused-chunks/chunk-UKHASMMP.js +0 -10
- package/dist/cli-bundle/focused-chunks/chunk-ZPEKQHOC.js +0 -2
|
@@ -1,439 +1,2 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @module cli/commands/close-many
|
|
3
|
-
*
|
|
4
|
-
* Implements the pm close many 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]="a97a3cf0-beef-5967-8f5b-2372a6c9f2f7")}catch(e){}}();
|
|
8
|
-
import { assertInitializedTracker } from "../environment/tracker-preflight.js";
|
|
9
|
-
import { createCheckpointId, loadMutationCheckpoint, restoreCheckpointItems, writeMutationCheckpoint, getActiveExtensionRegistrations, isTerminalStatus, resolveItemTypeRegistry, resolveRuntimeStatusRegistry, EXIT_CODE, PmCliError, toErrorMessage, resolveAuthor, nowIso, listAllItemMetadataLight, resolvePmRoot, readSettings, } from "../runtime-primitives.js";
|
|
10
|
-
import { runClose } from "./close.js";
|
|
11
|
-
import { hasListFilters } from "../query/list-filter-shared.js";
|
|
12
|
-
import { runList } from "../query/list.js";
|
|
13
|
-
import { runRestore } from "./restore.js";
|
|
14
|
-
import { derivePmBulkMutationEffect, } from "../cli-contracts/command-exit-contracts.js";
|
|
15
|
-
const CLOSE_MANY_CHECKPOINT_SCHEMA_VERSION = 1;
|
|
16
|
-
const CLOSE_MANY_CHECKPOINT_SUBDIR = "close-many";
|
|
17
|
-
const CLOSE_MANY_FILTER_GUIDANCE = [
|
|
18
|
-
"--filter-status",
|
|
19
|
-
"--filter-type",
|
|
20
|
-
"--filter-tag",
|
|
21
|
-
"--filter-priority",
|
|
22
|
-
"--filter-sprint",
|
|
23
|
-
"--filter-release",
|
|
24
|
-
"--filter-parent",
|
|
25
|
-
"--filter-assignee",
|
|
26
|
-
"--filter-updated-before",
|
|
27
|
-
"--ids",
|
|
28
|
-
].join(", ");
|
|
29
|
-
function hasCloseManyFilters(list, status) {
|
|
30
|
-
return hasListFilters(list, status, { includePagination: false });
|
|
31
|
-
}
|
|
32
|
-
function hasCloseManyRollbackConflicts(list, status) {
|
|
33
|
-
return hasListFilters(list, status);
|
|
34
|
-
}
|
|
35
|
-
function rejectBlankIdsFilter(list) {
|
|
36
|
-
if (list?.ids != null && String(list.ids).trim().length === 0) {
|
|
37
|
-
throw new PmCliError("--ids requires at least one non-empty item ID", EXIT_CODE.USAGE);
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
function activeListOptions(list) {
|
|
41
|
-
const active = {};
|
|
42
|
-
if (!list) {
|
|
43
|
-
return active;
|
|
44
|
-
}
|
|
45
|
-
for (const [key, value] of Object.entries(list)) {
|
|
46
|
-
if (value == null ||
|
|
47
|
-
(typeof value === "string" &&
|
|
48
|
-
!value.split(",").some((entry) => entry.trim().length > 0))) {
|
|
49
|
-
continue;
|
|
50
|
-
}
|
|
51
|
-
active[key] = value;
|
|
52
|
-
}
|
|
53
|
-
return active;
|
|
54
|
-
}
|
|
55
|
-
function resolveReason(reason, required) {
|
|
56
|
-
const trimmed = String(reason ?? "").trim();
|
|
57
|
-
if (trimmed.length > 0) {
|
|
58
|
-
return trimmed;
|
|
59
|
-
}
|
|
60
|
-
if (required) {
|
|
61
|
-
throw new PmCliError("pm close-many requires a shared close reason via --reason because governance.require_close_reason is enabled.", EXIT_CODE.USAGE, {
|
|
62
|
-
code: "close_reason_required",
|
|
63
|
-
required: "Provide a shared closing summary via --reason for the whole batch.",
|
|
64
|
-
why: "governance.require_close_reason is enabled, so every close must record why the items are done.",
|
|
65
|
-
examples: [
|
|
66
|
-
'pm close-many --filter-sprint S-12 --reason "Sprint S-12 acceptance criteria met"',
|
|
67
|
-
'pm close-many --ids pm-a,pm-b --reason "Superseded by redesign"',
|
|
68
|
-
],
|
|
69
|
-
nextSteps: [
|
|
70
|
-
"Re-run with --reason describing the shared outcome.",
|
|
71
|
-
"To stop requiring reasons, run: pm config set governance-require-close-reason --policy disabled",
|
|
72
|
-
],
|
|
73
|
-
});
|
|
74
|
-
}
|
|
75
|
-
return undefined;
|
|
76
|
-
}
|
|
77
|
-
// Build a parent -> non-terminal child id map in a single light scan so each
|
|
78
|
-
// matched parent can be annotated with the active children that closing it
|
|
79
|
-
// would orphan (the same signal runClose surfaces per item on apply).
|
|
80
|
-
async function buildActiveChildrenByParent(pmRoot, settings) {
|
|
81
|
-
const statusRegistry = resolveRuntimeStatusRegistry(settings.schema);
|
|
82
|
-
const typeRegistry = resolveItemTypeRegistry(settings, getActiveExtensionRegistrations());
|
|
83
|
-
const items = await listAllItemMetadataLight(pmRoot, settings.item_format, typeRegistry.type_to_folder, undefined, settings.schema);
|
|
84
|
-
const childrenByParent = new Map();
|
|
85
|
-
const parentByChild = new Map();
|
|
86
|
-
for (const item of items) {
|
|
87
|
-
if (typeof item.parent !== "string" || item.parent.length === 0) {
|
|
88
|
-
continue;
|
|
89
|
-
}
|
|
90
|
-
parentByChild.set(item.id, item.parent);
|
|
91
|
-
if (isTerminalStatus(item.status, statusRegistry)) {
|
|
92
|
-
continue;
|
|
93
|
-
}
|
|
94
|
-
const existing = childrenByParent.get(item.parent);
|
|
95
|
-
if (existing) {
|
|
96
|
-
existing.push(item.id);
|
|
97
|
-
}
|
|
98
|
-
else {
|
|
99
|
-
childrenByParent.set(item.parent, [item.id]);
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
for (const ids of childrenByParent.values()) {
|
|
103
|
-
ids.sort((left, right) => left.localeCompare(right));
|
|
104
|
-
}
|
|
105
|
-
return { childrenByParent, parentByChild };
|
|
106
|
-
}
|
|
107
|
-
function hierarchyDepth(id, parentByChild, cache) {
|
|
108
|
-
const cached = cache?.get(id);
|
|
109
|
-
if (cached !== undefined) {
|
|
110
|
-
return cached;
|
|
111
|
-
}
|
|
112
|
-
let depth = 0;
|
|
113
|
-
let current = parentByChild.get(id);
|
|
114
|
-
const path = [];
|
|
115
|
-
const visited = new Set();
|
|
116
|
-
let hasCycle = false;
|
|
117
|
-
while (current !== undefined && !visited.has(current)) {
|
|
118
|
-
const cachedCurrent = cache?.get(current);
|
|
119
|
-
if (cachedCurrent !== undefined) {
|
|
120
|
-
depth += cachedCurrent + 1;
|
|
121
|
-
break;
|
|
122
|
-
}
|
|
123
|
-
visited.add(current);
|
|
124
|
-
path.push(current);
|
|
125
|
-
depth += 1;
|
|
126
|
-
current = parentByChild.get(current);
|
|
127
|
-
}
|
|
128
|
-
if (current !== undefined && visited.has(current)) {
|
|
129
|
-
hasCycle = true;
|
|
130
|
-
}
|
|
131
|
-
if (!hasCycle) {
|
|
132
|
-
cache?.set(id, depth);
|
|
133
|
-
for (const [index, ancestorId] of path.entries()) {
|
|
134
|
-
cache?.set(ancestorId, depth - index - 1);
|
|
135
|
-
}
|
|
136
|
-
}
|
|
137
|
-
return depth;
|
|
138
|
-
}
|
|
139
|
-
async function runCloseManyRollback(params) {
|
|
140
|
-
const checkpoint = await loadMutationCheckpoint(params.pmRoot, CLOSE_MANY_CHECKPOINT_SUBDIR, params.rollbackId, CLOSE_MANY_CHECKPOINT_SCHEMA_VERSION);
|
|
141
|
-
const restoreMessage = params.options.message ?? `Rollback close-many checkpoint ${checkpoint.id}`;
|
|
142
|
-
const rollback = await restoreCheckpointItems(checkpoint.items, (id, targetUpdatedAt) => runRestore(id, targetUpdatedAt, { author: params.options.author, message: restoreMessage, force: true }, params.global));
|
|
143
|
-
return {
|
|
144
|
-
...derivePmBulkMutationEffect({
|
|
145
|
-
applied: rollback.restored_ids.length,
|
|
146
|
-
skipped: 0,
|
|
147
|
-
failed: rollback.failed_count,
|
|
148
|
-
unmatched: 0,
|
|
149
|
-
}),
|
|
150
|
-
mode: "rollback",
|
|
151
|
-
matched_count: checkpoint.items.length,
|
|
152
|
-
dry_run: false,
|
|
153
|
-
rollback_checkpoint_id: checkpoint.id,
|
|
154
|
-
checkpoint: {
|
|
155
|
-
id: checkpoint.id,
|
|
156
|
-
created_at: checkpoint.created_at,
|
|
157
|
-
path: checkpoint.path,
|
|
158
|
-
rollback_command: `pm close-many --rollback ${checkpoint.id}`,
|
|
159
|
-
},
|
|
160
|
-
restored_count: rollback.restored_ids.length,
|
|
161
|
-
failed_count: rollback.failed_count,
|
|
162
|
-
rows: rollback.rows,
|
|
163
|
-
ids: rollback.restored_ids,
|
|
164
|
-
};
|
|
165
|
-
}
|
|
166
|
-
function planCloseManyRows(matched, childrenByParent, closePlannedIds, statusRegistry, force) {
|
|
167
|
-
return matched.map((item) => {
|
|
168
|
-
const activeChildIds = (childrenByParent.get(item.id) ?? []).filter((childId) => !closePlannedIds.has(childId));
|
|
169
|
-
const willSkip = !canCloseManyItem(item, statusRegistry, force);
|
|
170
|
-
return {
|
|
171
|
-
id: item.id,
|
|
172
|
-
title: typeof item.title === "string" ? item.title : "",
|
|
173
|
-
status: item.status,
|
|
174
|
-
action: willSkip ? "skip" : "close",
|
|
175
|
-
...(willSkip ? { skip_reason: "already_terminal" } : {}),
|
|
176
|
-
...(activeChildIds.length > 0
|
|
177
|
-
? { active_child_ids: activeChildIds }
|
|
178
|
-
: {}),
|
|
179
|
-
};
|
|
180
|
-
});
|
|
181
|
-
}
|
|
182
|
-
async function writeCloseManyCheckpoint(params) {
|
|
183
|
-
const checkpointPath = await writeMutationCheckpoint(params.pmRoot, CLOSE_MANY_CHECKPOINT_SUBDIR, params.checkpointId, {
|
|
184
|
-
schema_version: CLOSE_MANY_CHECKPOINT_SCHEMA_VERSION,
|
|
185
|
-
id: params.checkpointId,
|
|
186
|
-
created_at: params.nowValue,
|
|
187
|
-
author: resolveAuthor(params.options.author, "unknown"),
|
|
188
|
-
...(params.reason !== undefined ? { reason: params.reason } : {}),
|
|
189
|
-
filters: params.filters,
|
|
190
|
-
items: params.checkpointItems,
|
|
191
|
-
});
|
|
192
|
-
return {
|
|
193
|
-
id: params.checkpointId,
|
|
194
|
-
created_at: params.nowValue,
|
|
195
|
-
path: checkpointPath,
|
|
196
|
-
rollback_command: `pm close-many --rollback ${params.checkpointId}`,
|
|
197
|
-
};
|
|
198
|
-
}
|
|
199
|
-
async function applyCloseManyRows(params) {
|
|
200
|
-
const rows = [];
|
|
201
|
-
const closedIds = [];
|
|
202
|
-
for (const item of params.matched) {
|
|
203
|
-
if (!params.closableIds.has(item.id)) {
|
|
204
|
-
rows.push({
|
|
205
|
-
id: item.id,
|
|
206
|
-
status: "skipped",
|
|
207
|
-
skip_reason: "already_terminal",
|
|
208
|
-
});
|
|
209
|
-
continue;
|
|
210
|
-
}
|
|
211
|
-
try {
|
|
212
|
-
const result = await runClose(item.id, params.reason, params.closeOptions, params.global);
|
|
213
|
-
rows.push({
|
|
214
|
-
id: item.id,
|
|
215
|
-
status: "closed",
|
|
216
|
-
changed_fields: result.changed_fields,
|
|
217
|
-
...(result.warnings && result.warnings.length > 0
|
|
218
|
-
? { warnings: result.warnings }
|
|
219
|
-
: {}),
|
|
220
|
-
});
|
|
221
|
-
closedIds.push(item.id);
|
|
222
|
-
}
|
|
223
|
-
catch (error) {
|
|
224
|
-
rows.push({
|
|
225
|
-
id: item.id,
|
|
226
|
-
status: "failed",
|
|
227
|
-
error: toErrorMessage(error),
|
|
228
|
-
});
|
|
229
|
-
}
|
|
230
|
-
}
|
|
231
|
-
return { rows, closedIds };
|
|
232
|
-
}
|
|
233
|
-
function resolveCloseManyRollbackId(options) {
|
|
234
|
-
return typeof options.rollback === "string" ? options.rollback : undefined;
|
|
235
|
-
}
|
|
236
|
-
function validateCloseManyRollbackOptions(options, rollbackId) {
|
|
237
|
-
if (rollbackId.trim().length === 0) {
|
|
238
|
-
throw new PmCliError("--rollback requires a checkpoint id", EXIT_CODE.USAGE);
|
|
239
|
-
}
|
|
240
|
-
if (options.dryRun === true) {
|
|
241
|
-
throw new PmCliError("--dry-run cannot be combined with --rollback", EXIT_CODE.USAGE);
|
|
242
|
-
}
|
|
243
|
-
if (hasCloseManyRollbackConflicts(options.list, options.status)) {
|
|
244
|
-
throw new PmCliError("Rollback mode does not accept filter options", EXIT_CODE.USAGE);
|
|
245
|
-
}
|
|
246
|
-
}
|
|
247
|
-
function assertCloseManyHasFilters(options) {
|
|
248
|
-
if (hasCloseManyFilters(options.list, options.status)) {
|
|
249
|
-
return;
|
|
250
|
-
}
|
|
251
|
-
throw new PmCliError(`close-many requires at least one filter to scope the close (for example: ${CLOSE_MANY_FILTER_GUIDANCE}). Refusing to match every item.`, EXIT_CODE.USAGE);
|
|
252
|
-
}
|
|
253
|
-
function sortCloseManyMatchedItems(matched, parentByChild) {
|
|
254
|
-
const depthCache = new Map();
|
|
255
|
-
return [...matched].sort((left, right) => {
|
|
256
|
-
const depthDelta = hierarchyDepth(right.id, parentByChild, depthCache) -
|
|
257
|
-
hierarchyDepth(left.id, parentByChild, depthCache);
|
|
258
|
-
return depthDelta !== 0 ? depthDelta : left.id.localeCompare(right.id);
|
|
259
|
-
});
|
|
260
|
-
}
|
|
261
|
-
function canCloseManyItem(item, statusRegistry, force) {
|
|
262
|
-
return force || !isTerminalStatus(item.status, statusRegistry);
|
|
263
|
-
}
|
|
264
|
-
function resolveCloseManyPlannedIds(matched, statusRegistry, force) {
|
|
265
|
-
return new Set(matched
|
|
266
|
-
.filter((item) => canCloseManyItem(item, statusRegistry, force))
|
|
267
|
-
.map((item) => item.id));
|
|
268
|
-
}
|
|
269
|
-
async function buildCloseManyPlanContext(params) {
|
|
270
|
-
assertCloseManyHasFilters(params.options);
|
|
271
|
-
const statusRegistry = resolveRuntimeStatusRegistry(params.settings.schema);
|
|
272
|
-
const reason = resolveReason(params.options.reason, params.settings.governance.require_close_reason);
|
|
273
|
-
const force = params.options.force === true;
|
|
274
|
-
const listed = await runList(params.options.status, activeListOptions(params.options.list), params.global);
|
|
275
|
-
const { childrenByParent, parentByChild } = await buildActiveChildrenByParent(params.pmRoot, params.settings);
|
|
276
|
-
const matched = sortCloseManyMatchedItems(listed.items, parentByChild);
|
|
277
|
-
const requestedIds = [
|
|
278
|
-
...new Set(String(params.options.list?.ids ?? "")
|
|
279
|
-
.split(",")
|
|
280
|
-
.map((entry) => entry.trim())
|
|
281
|
-
.filter((entry) => entry.length > 0)),
|
|
282
|
-
];
|
|
283
|
-
const existenceItems = requestedIds.length === 0
|
|
284
|
-
? []
|
|
285
|
-
: (await runList(undefined, {
|
|
286
|
-
ids: requestedIds.join(","),
|
|
287
|
-
noTruncate: true,
|
|
288
|
-
full: true,
|
|
289
|
-
}, params.global)).items;
|
|
290
|
-
const existingIds = new Set(existenceItems.map((item) => item.id));
|
|
291
|
-
const closePlannedIds = resolveCloseManyPlannedIds(matched, statusRegistry, force);
|
|
292
|
-
return {
|
|
293
|
-
pmRoot: params.pmRoot,
|
|
294
|
-
settings: params.settings,
|
|
295
|
-
statusRegistry,
|
|
296
|
-
reason,
|
|
297
|
-
validateCloseMode: params.options.validateClose,
|
|
298
|
-
force,
|
|
299
|
-
listed,
|
|
300
|
-
matched,
|
|
301
|
-
unmatchedIds: requestedIds.length === 0
|
|
302
|
-
? undefined
|
|
303
|
-
: requestedIds.filter((id) => !existingIds.has(id)),
|
|
304
|
-
planRows: planCloseManyRows(matched, childrenByParent, closePlannedIds, statusRegistry, force),
|
|
305
|
-
};
|
|
306
|
-
}
|
|
307
|
-
function buildCloseManyDryRunResult(context) {
|
|
308
|
-
return {
|
|
309
|
-
outcome: "effect",
|
|
310
|
-
exit_code: EXIT_CODE.SUCCESS,
|
|
311
|
-
mode: "dry_run",
|
|
312
|
-
matched_count: context.matched.length,
|
|
313
|
-
dry_run: true,
|
|
314
|
-
...(context.reason !== undefined ? { reason: context.reason } : {}),
|
|
315
|
-
filters: context.listed.filters,
|
|
316
|
-
...(context.validateCloseMode
|
|
317
|
-
? { validate_close: context.validateCloseMode }
|
|
318
|
-
: {}),
|
|
319
|
-
item_plans: context.planRows,
|
|
320
|
-
ids: [],
|
|
321
|
-
...(context.unmatchedIds !== undefined
|
|
322
|
-
? {
|
|
323
|
-
unmatched_ids: context.unmatchedIds,
|
|
324
|
-
unmatched_count: context.unmatchedIds.length,
|
|
325
|
-
}
|
|
326
|
-
: {}),
|
|
327
|
-
};
|
|
328
|
-
}
|
|
329
|
-
async function resolveCloseManyCheckpointInfo(params) {
|
|
330
|
-
if (params.options.checkpoint === false || params.closableIds.size === 0) {
|
|
331
|
-
return undefined;
|
|
332
|
-
}
|
|
333
|
-
const checkpointItems = params.context.matched
|
|
334
|
-
.filter((item) => params.closableIds.has(item.id))
|
|
335
|
-
.map((item) => ({ id: item.id, target_updated_at: item.updated_at }));
|
|
336
|
-
return writeCloseManyCheckpoint({
|
|
337
|
-
pmRoot: params.context.pmRoot,
|
|
338
|
-
checkpointId: params.checkpointId,
|
|
339
|
-
nowValue: params.nowValue,
|
|
340
|
-
options: params.options,
|
|
341
|
-
reason: params.context.reason,
|
|
342
|
-
filters: params.context.listed.filters,
|
|
343
|
-
checkpointItems,
|
|
344
|
-
});
|
|
345
|
-
}
|
|
346
|
-
/** Implements run close many for the public runtime surface of this module. */
|
|
347
|
-
export async function runCloseMany(options, global) {
|
|
348
|
-
const pmRoot = resolvePmRoot(process.cwd(), global.path);
|
|
349
|
-
await assertInitializedTracker(pmRoot);
|
|
350
|
-
const settings = await readSettings(pmRoot);
|
|
351
|
-
const dryRun = options.dryRun === true;
|
|
352
|
-
const rollbackId = resolveCloseManyRollbackId(options);
|
|
353
|
-
rejectBlankIdsFilter(options.list);
|
|
354
|
-
if (rollbackId !== undefined) {
|
|
355
|
-
validateCloseManyRollbackOptions(options, rollbackId);
|
|
356
|
-
return runCloseManyRollback({ pmRoot, rollbackId, options, global });
|
|
357
|
-
}
|
|
358
|
-
const context = await buildCloseManyPlanContext({
|
|
359
|
-
pmRoot,
|
|
360
|
-
settings,
|
|
361
|
-
options,
|
|
362
|
-
global,
|
|
363
|
-
});
|
|
364
|
-
if (dryRun) {
|
|
365
|
-
return buildCloseManyDryRunResult(context);
|
|
366
|
-
}
|
|
367
|
-
const closableIds = new Set(context.planRows
|
|
368
|
-
.filter((row) => row.action === "close")
|
|
369
|
-
.map((row) => row.id));
|
|
370
|
-
const nowValue = nowIso();
|
|
371
|
-
const checkpointId = createCheckpointId(CLOSE_MANY_CHECKPOINT_SUBDIR, nowValue);
|
|
372
|
-
const checkpointInfo = await resolveCloseManyCheckpointInfo({
|
|
373
|
-
context,
|
|
374
|
-
options,
|
|
375
|
-
closableIds,
|
|
376
|
-
checkpointId,
|
|
377
|
-
nowValue,
|
|
378
|
-
});
|
|
379
|
-
const closeOptions = {
|
|
380
|
-
author: options.author,
|
|
381
|
-
message: options.message ?? `close-many apply ${checkpointId}`,
|
|
382
|
-
completedAt: options.completedAt,
|
|
383
|
-
validateClose: context.validateCloseMode,
|
|
384
|
-
force: context.force,
|
|
385
|
-
resolution: options.resolution,
|
|
386
|
-
expectedResult: options.expectedResult,
|
|
387
|
-
actualResult: options.actualResult,
|
|
388
|
-
};
|
|
389
|
-
const { rows, closedIds } = await applyCloseManyRows({
|
|
390
|
-
matched: context.matched,
|
|
391
|
-
closableIds,
|
|
392
|
-
reason: context.reason,
|
|
393
|
-
closeOptions,
|
|
394
|
-
global,
|
|
395
|
-
});
|
|
396
|
-
const closedCount = rows.filter((row) => row.status === "closed").length;
|
|
397
|
-
const skippedCount = rows.filter((row) => row.status === "skipped").length;
|
|
398
|
-
const failedCount = rows.filter((row) => row.status === "failed").length;
|
|
399
|
-
return {
|
|
400
|
-
...derivePmBulkMutationEffect({
|
|
401
|
-
applied: closedCount,
|
|
402
|
-
skipped: skippedCount,
|
|
403
|
-
failed: failedCount,
|
|
404
|
-
unmatched: context.unmatchedIds?.length ?? 0,
|
|
405
|
-
}),
|
|
406
|
-
mode: "apply",
|
|
407
|
-
matched_count: context.matched.length,
|
|
408
|
-
dry_run: false,
|
|
409
|
-
...(context.reason !== undefined ? { reason: context.reason } : {}),
|
|
410
|
-
filters: context.listed.filters,
|
|
411
|
-
...(context.validateCloseMode
|
|
412
|
-
? { validate_close: context.validateCloseMode }
|
|
413
|
-
: {}),
|
|
414
|
-
...(checkpointInfo ? { checkpoint: checkpointInfo } : {}),
|
|
415
|
-
closed_count: closedCount,
|
|
416
|
-
skipped_count: skippedCount,
|
|
417
|
-
failed_count: failedCount,
|
|
418
|
-
rows,
|
|
419
|
-
ids: closedIds,
|
|
420
|
-
...(context.unmatchedIds !== undefined
|
|
421
|
-
? {
|
|
422
|
-
unmatched_ids: context.unmatchedIds,
|
|
423
|
-
unmatched_count: context.unmatchedIds.length,
|
|
424
|
-
}
|
|
425
|
-
: {}),
|
|
426
|
-
};
|
|
427
|
-
}
|
|
428
|
-
/** Public contract for test only, shared by SDK and presentation-layer consumers. */
|
|
429
|
-
export const _testOnly = {
|
|
430
|
-
activeListOptions,
|
|
431
|
-
buildActiveChildrenByParent,
|
|
432
|
-
hasCloseManyFilters,
|
|
433
|
-
hasCloseManyRollbackConflicts,
|
|
434
|
-
hierarchyDepth,
|
|
435
|
-
rejectBlankIdsFilter,
|
|
436
|
-
resolveReason,
|
|
437
|
-
};
|
|
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]="aec6f8e2-5fd0-53f3-8262-c6b49741ff96")}catch(e2){}})();import{assertInitializedTracker}from"../environment/tracker-preflight.js";import{createCheckpointId,loadMutationCheckpoint,restoreCheckpointItems,writeMutationCheckpoint,getActiveExtensionRegistrations,isTerminalStatus,resolveItemTypeRegistry,resolveRuntimeStatusRegistry,EXIT_CODE,PmCliError,toErrorMessage,resolveAuthor,nowIso,listAllItemMetadataLight,resolvePmRoot,readSettings}from"../runtime-primitives.js";import{runClose}from"./close.js";import{hasListFilters}from"../query/list-filter-shared.js";import{runList}from"../query/list.js";import{runRestore}from"./restore.js";import{derivePmBulkMutationEffect}from"../cli-contracts/command-exit-contracts.js";const CLOSE_MANY_CHECKPOINT_SCHEMA_VERSION=1;const CLOSE_MANY_CHECKPOINT_SUBDIR="close-many";const CLOSE_MANY_FILTER_GUIDANCE=["--filter-status","--filter-type","--filter-tag","--filter-priority","--filter-sprint","--filter-release","--filter-parent","--filter-assignee","--filter-updated-before","--ids"].join(", ");function hasCloseManyFilters(list,status){return hasListFilters(list,status,{includePagination:false})}function hasCloseManyRollbackConflicts(list,status){return hasListFilters(list,status)}function rejectBlankIdsFilter(list){if(list?.ids!=null&&String(list.ids).trim().length===0){throw new PmCliError("--ids requires at least one non-empty item ID",EXIT_CODE.USAGE)}}function activeListOptions(list){const active={};if(!list){return active}for(const[key,value]of Object.entries(list)){if(value==null||typeof value==="string"&&!value.split(",").some(entry=>entry.trim().length>0)){continue}active[key]=value}return active}function resolveReason(reason,required){const trimmed=String(reason??"").trim();if(trimmed.length>0){return trimmed}if(required){throw new PmCliError("pm close-many requires a shared close reason via --reason because governance.require_close_reason is enabled.",EXIT_CODE.USAGE,{code:"close_reason_required",required:"Provide a shared closing summary via --reason for the whole batch.",why:"governance.require_close_reason is enabled, so every close must record why the items are done.",examples:['pm close-many --filter-sprint S-12 --reason "Sprint S-12 acceptance criteria met"','pm close-many --ids pm-a,pm-b --reason "Superseded by redesign"'],nextSteps:["Re-run with --reason describing the shared outcome.","To stop requiring reasons, run: pm config set governance-require-close-reason --policy disabled"]})}return void 0}async function buildActiveChildrenByParent(pmRoot,settings){const statusRegistry=resolveRuntimeStatusRegistry(settings.schema);const typeRegistry=resolveItemTypeRegistry(settings,getActiveExtensionRegistrations());const items=await listAllItemMetadataLight(pmRoot,settings.item_format,typeRegistry.type_to_folder,void 0,settings.schema);const childrenByParent=new Map;const parentByChild=new Map;for(const item of items){if(typeof item.parent!=="string"||item.parent.length===0){continue}parentByChild.set(item.id,item.parent);if(isTerminalStatus(item.status,statusRegistry)){continue}const existing=childrenByParent.get(item.parent);if(existing){existing.push(item.id)}else{childrenByParent.set(item.parent,[item.id])}}for(const ids of childrenByParent.values()){ids.sort((left,right)=>left.localeCompare(right))}return{childrenByParent,parentByChild}}function hierarchyDepth(id,parentByChild,cache){const cached=cache?.get(id);if(cached!==void 0){return cached}let depth=0;let current=parentByChild.get(id);const path=[];const visited=new Set;let hasCycle=false;while(current!==void 0&&!visited.has(current)){const cachedCurrent=cache?.get(current);if(cachedCurrent!==void 0){depth+=cachedCurrent+1;break}visited.add(current);path.push(current);depth+=1;current=parentByChild.get(current)}if(current!==void 0&&visited.has(current)){hasCycle=true}if(!hasCycle){cache?.set(id,depth);for(const[index,ancestorId]of path.entries()){cache?.set(ancestorId,depth-index-1)}}return depth}async function runCloseManyRollback(params){const checkpoint=await loadMutationCheckpoint(params.pmRoot,CLOSE_MANY_CHECKPOINT_SUBDIR,params.rollbackId,CLOSE_MANY_CHECKPOINT_SCHEMA_VERSION);const restoreMessage=params.options.message??`Rollback close-many checkpoint ${checkpoint.id}`;const rollback=await restoreCheckpointItems(checkpoint.items,(id,targetUpdatedAt)=>runRestore(id,targetUpdatedAt,{author:params.options.author,message:restoreMessage,force:true},params.global));return{...derivePmBulkMutationEffect({applied:rollback.restored_ids.length,skipped:0,failed:rollback.failed_count,unmatched:0}),mode:"rollback",matched_count:checkpoint.items.length,dry_run:false,rollback_checkpoint_id:checkpoint.id,checkpoint:{id:checkpoint.id,created_at:checkpoint.created_at,path:checkpoint.path,rollback_command:`pm close-many --rollback ${checkpoint.id}`},restored_count:rollback.restored_ids.length,failed_count:rollback.failed_count,rows:rollback.rows,ids:rollback.restored_ids}}function planCloseManyRows(matched,childrenByParent,closePlannedIds,statusRegistry,force){return matched.map(item=>{const activeChildIds=(childrenByParent.get(item.id)??[]).filter(childId=>!closePlannedIds.has(childId));const willSkip=!canCloseManyItem(item,statusRegistry,force);return{id:item.id,title:typeof item.title==="string"?item.title:"",status:item.status,action:willSkip?"skip":"close",...willSkip?{skip_reason:"already_terminal"}:{},...activeChildIds.length>0?{active_child_ids:activeChildIds}:{}}})}async function writeCloseManyCheckpoint(params){const checkpointPath=await writeMutationCheckpoint(params.pmRoot,CLOSE_MANY_CHECKPOINT_SUBDIR,params.checkpointId,{schema_version:CLOSE_MANY_CHECKPOINT_SCHEMA_VERSION,id:params.checkpointId,created_at:params.nowValue,author:resolveAuthor(params.options.author,"unknown"),...params.reason!==void 0?{reason:params.reason}:{},filters:params.filters,items:params.checkpointItems});return{id:params.checkpointId,created_at:params.nowValue,path:checkpointPath,rollback_command:`pm close-many --rollback ${params.checkpointId}`}}async function applyCloseManyRows(params){const rows=[];const closedIds=[];for(const item of params.matched){if(!params.closableIds.has(item.id)){rows.push({id:item.id,status:"skipped",skip_reason:"already_terminal"});continue}try{const result=await runClose(item.id,params.reason,params.closeOptions,params.global);rows.push({id:item.id,status:"closed",changed_fields:result.changed_fields,...result.warnings&&result.warnings.length>0?{warnings:result.warnings}:{}});closedIds.push(item.id)}catch(error){rows.push({id:item.id,status:"failed",error:toErrorMessage(error)})}}return{rows,closedIds}}function resolveCloseManyRollbackId(options){return typeof options.rollback==="string"?options.rollback:void 0}function validateCloseManyRollbackOptions(options,rollbackId){if(rollbackId.trim().length===0){throw new PmCliError("--rollback requires a checkpoint id",EXIT_CODE.USAGE)}if(options.dryRun===true){throw new PmCliError("--dry-run cannot be combined with --rollback",EXIT_CODE.USAGE)}if(hasCloseManyRollbackConflicts(options.list,options.status)){throw new PmCliError("Rollback mode does not accept filter options",EXIT_CODE.USAGE)}}function assertCloseManyHasFilters(options){if(hasCloseManyFilters(options.list,options.status)){return}throw new PmCliError(`close-many requires at least one filter to scope the close (for example: ${CLOSE_MANY_FILTER_GUIDANCE}). Refusing to match every item.`,EXIT_CODE.USAGE)}function sortCloseManyMatchedItems(matched,parentByChild){const depthCache=new Map;return[...matched].sort((left,right)=>{const depthDelta=hierarchyDepth(right.id,parentByChild,depthCache)-hierarchyDepth(left.id,parentByChild,depthCache);return depthDelta!==0?depthDelta:left.id.localeCompare(right.id)})}function canCloseManyItem(item,statusRegistry,force){return force||!isTerminalStatus(item.status,statusRegistry)}function resolveCloseManyPlannedIds(matched,statusRegistry,force){return new Set(matched.filter(item=>canCloseManyItem(item,statusRegistry,force)).map(item=>item.id))}async function buildCloseManyPlanContext(params){assertCloseManyHasFilters(params.options);const statusRegistry=resolveRuntimeStatusRegistry(params.settings.schema);const reason=resolveReason(params.options.reason,params.settings.governance.require_close_reason);const force=params.options.force===true;const listed=await runList(params.options.status,activeListOptions(params.options.list),params.global);const{childrenByParent,parentByChild}=await buildActiveChildrenByParent(params.pmRoot,params.settings);const matched=sortCloseManyMatchedItems(listed.items,parentByChild);const requestedIds=[...new Set(String(params.options.list?.ids??"").split(",").map(entry=>entry.trim()).filter(entry=>entry.length>0))];const existenceItems=requestedIds.length===0?[]:(await runList(void 0,{ids:requestedIds.join(","),noTruncate:true,full:true},params.global)).items;const existingIds=new Set(existenceItems.map(item=>item.id));const closePlannedIds=resolveCloseManyPlannedIds(matched,statusRegistry,force);return{pmRoot:params.pmRoot,settings:params.settings,statusRegistry,reason,validateCloseMode:params.options.validateClose,force,listed,matched,unmatchedIds:requestedIds.length===0?void 0:requestedIds.filter(id=>!existingIds.has(id)),planRows:planCloseManyRows(matched,childrenByParent,closePlannedIds,statusRegistry,force)}}function buildCloseManyDryRunResult(context){return{outcome:"effect",exit_code:EXIT_CODE.SUCCESS,mode:"dry_run",matched_count:context.matched.length,dry_run:true,...context.reason!==void 0?{reason:context.reason}:{},filters:context.listed.filters,...context.validateCloseMode?{validate_close:context.validateCloseMode}:{},item_plans:context.planRows,ids:[],...context.unmatchedIds!==void 0?{unmatched_ids:context.unmatchedIds,unmatched_count:context.unmatchedIds.length}:{}}}async function resolveCloseManyCheckpointInfo(params){if(params.options.checkpoint===false||params.closableIds.size===0){return void 0}const checkpointItems=params.context.matched.filter(item=>params.closableIds.has(item.id)).map(item=>({id:item.id,target_updated_at:item.updated_at}));return writeCloseManyCheckpoint({pmRoot:params.context.pmRoot,checkpointId:params.checkpointId,nowValue:params.nowValue,options:params.options,reason:params.context.reason,filters:params.context.listed.filters,checkpointItems})}async function runCloseMany(options,global2){const pmRoot=resolvePmRoot(process.cwd(),global2.path);await assertInitializedTracker(pmRoot);const settings=await readSettings(pmRoot);const dryRun=options.dryRun===true;const rollbackId=resolveCloseManyRollbackId(options);rejectBlankIdsFilter(options.list);if(rollbackId!==void 0){validateCloseManyRollbackOptions(options,rollbackId);return runCloseManyRollback({pmRoot,rollbackId,options,global:global2})}const context=await buildCloseManyPlanContext({pmRoot,settings,options,global:global2});if(dryRun){return buildCloseManyDryRunResult(context)}const closableIds=new Set(context.planRows.filter(row=>row.action==="close").map(row=>row.id));const nowValue=nowIso();const checkpointId=createCheckpointId(CLOSE_MANY_CHECKPOINT_SUBDIR,nowValue);const checkpointInfo=await resolveCloseManyCheckpointInfo({context,options,closableIds,checkpointId,nowValue});const closeOptions={author:options.author,message:options.message??`close-many apply ${checkpointId}`,completedAt:options.completedAt,validateClose:context.validateCloseMode,force:context.force,resolution:options.resolution,expectedResult:options.expectedResult,actualResult:options.actualResult};const{rows,closedIds}=await applyCloseManyRows({matched:context.matched,closableIds,reason:context.reason,closeOptions,global:global2});const closedCount=rows.filter(row=>row.status==="closed").length;const skippedCount=rows.filter(row=>row.status==="skipped").length;const failedCount=rows.filter(row=>row.status==="failed").length;return{...derivePmBulkMutationEffect({applied:closedCount,skipped:skippedCount,failed:failedCount,unmatched:context.unmatchedIds?.length??0}),mode:"apply",matched_count:context.matched.length,dry_run:false,...context.reason!==void 0?{reason:context.reason}:{},filters:context.listed.filters,...context.validateCloseMode?{validate_close:context.validateCloseMode}:{},...checkpointInfo?{checkpoint:checkpointInfo}:{},closed_count:closedCount,skipped_count:skippedCount,failed_count:failedCount,rows,ids:closedIds,...context.unmatchedIds!==void 0?{unmatched_ids:context.unmatchedIds,unmatched_count:context.unmatchedIds.length}:{}}}const _testOnly={activeListOptions,buildActiveChildrenByParent,hasCloseManyFilters,hasCloseManyRollbackConflicts,hierarchyDepth,rejectBlankIdsFilter,resolveReason};export{_testOnly,runCloseMany};
|
|
438
2
|
//# sourceMappingURL=close-many.js.map
|
|
439
|
-
//# debugId=a97a3cf0-beef-5967-8f5b-2372a6c9f2f7
|