@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
package/dist/sdk/test/batch.js
CHANGED
|
@@ -1,510 +1,3 @@
|
|
|
1
|
-
|
|
2
|
-
* @module sdk/test/batch
|
|
3
|
-
*
|
|
4
|
-
* Implements the pm test all 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]="5d3405c0-14e6-51f5-97a1-355438fd0199")}catch(e){}}();
|
|
8
|
-
import { assertInitializedTracker } from "../environment/tracker-preflight.js";
|
|
9
|
-
import { getActiveExtensionRegistrations } from "../../core/extensions/index.js";
|
|
10
|
-
import { resolveItemTypeRegistry } from "../../core/item/type-registry.js";
|
|
11
|
-
import { parseOptionalNumber } from "../../core/item/parse.js";
|
|
12
|
-
import { normalizeStatusInput } from "../../core/item/status.js";
|
|
13
|
-
import { resolveRuntimeStatusRegistry, } from "../../core/schema/runtime-schema.js";
|
|
14
|
-
import { EXIT_CODE } from "../../core/shared/constants.js";
|
|
15
|
-
import { PmCliError } from "../../core/shared/errors.js";
|
|
16
|
-
import { nowIso } from "../../core/shared/time.js";
|
|
17
|
-
import { listAllItemMetadataLight } from "../../core/store/item-store.js";
|
|
18
|
-
import { resolveGlobalPmRoot, resolvePmRoot } from "../../core/store/paths.js";
|
|
19
|
-
import { readSettings } from "../../core/store/settings.js";
|
|
20
|
-
import { appendTrackedTestRunSummary } from "../../core/test/item-test-run-tracking.js";
|
|
21
|
-
import { resolveAuthor } from "../../core/shared/author.js";
|
|
22
|
-
import { countFailureCategories, runLinkedTests, runTest, summarizeContextPreflight, } from "./execution.js";
|
|
23
|
-
const parseStatus = (raw, statusRegistry) => {
|
|
24
|
-
if (raw === undefined) {
|
|
25
|
-
return undefined;
|
|
26
|
-
}
|
|
27
|
-
const normalized = normalizeStatusInput(raw, statusRegistry);
|
|
28
|
-
if (!normalized) {
|
|
29
|
-
const allowedStatuses = statusRegistry.definitions.map((definition) => definition.id);
|
|
30
|
-
throw new PmCliError(`Invalid --status value "${raw}". Allowed: ${allowedStatuses.join(", ")}`, EXIT_CODE.USAGE);
|
|
31
|
-
}
|
|
32
|
-
return normalized;
|
|
33
|
-
};
|
|
34
|
-
const parseTimeout = (raw) => {
|
|
35
|
-
if (raw === undefined) {
|
|
36
|
-
return undefined;
|
|
37
|
-
}
|
|
38
|
-
const parsed = parseOptionalNumber(raw, "timeout");
|
|
39
|
-
if (parsed <= 0) {
|
|
40
|
-
throw new PmCliError("timeout must be a positive number", EXIT_CODE.USAGE);
|
|
41
|
-
}
|
|
42
|
-
return parsed;
|
|
43
|
-
};
|
|
44
|
-
const parseNonNegativeInteger = (raw, flag) => {
|
|
45
|
-
if (raw === undefined) {
|
|
46
|
-
return undefined;
|
|
47
|
-
}
|
|
48
|
-
const parsed = Number(raw);
|
|
49
|
-
if (!Number.isInteger(parsed) || parsed < 0) {
|
|
50
|
-
throw new PmCliError(`${flag} must be a non-negative integer`, EXIT_CODE.USAGE);
|
|
51
|
-
}
|
|
52
|
-
return parsed;
|
|
53
|
-
};
|
|
54
|
-
const formatTrackingError = (error) => {
|
|
55
|
-
return error instanceof Error ? error.message : String(error);
|
|
56
|
-
};
|
|
57
|
-
const resolveTrackedRunId = () => {
|
|
58
|
-
const fromEnv = process.env.PM_BACKGROUND_TEST_RUN_ID?.trim();
|
|
59
|
-
if (fromEnv && fromEnv.length > 0) {
|
|
60
|
-
return fromEnv;
|
|
61
|
-
}
|
|
62
|
-
return `test-all-local-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 8)}`;
|
|
63
|
-
};
|
|
64
|
-
const normalizeCommand = (command) => {
|
|
65
|
-
return command.trim().replaceAll(/\s+/g, " ");
|
|
66
|
-
};
|
|
67
|
-
const normalizeEnvSetSignature = (value) => {
|
|
68
|
-
if (!value || Object.keys(value).length === 0) {
|
|
69
|
-
return "{}";
|
|
70
|
-
}
|
|
71
|
-
return JSON.stringify(Object.fromEntries(Object.entries(value).sort(([left], [right]) => left.localeCompare(right))));
|
|
72
|
-
};
|
|
73
|
-
const normalizeEnvClearSignature = (value) => {
|
|
74
|
-
if (!value || value.length === 0) {
|
|
75
|
-
return "[]";
|
|
76
|
-
}
|
|
77
|
-
return JSON.stringify([...value].sort((left, right) => left.localeCompare(right)));
|
|
78
|
-
};
|
|
79
|
-
const normalizePmContextModeSignature = (value) => {
|
|
80
|
-
const normalized = value?.trim().toLowerCase();
|
|
81
|
-
return normalized && normalized.length > 0 ? normalized : "none";
|
|
82
|
-
};
|
|
83
|
-
const normalizeWorkspaceContextModeSignature = (value) => {
|
|
84
|
-
const normalized = value?.trim().toLowerCase();
|
|
85
|
-
return normalized && normalized.length > 0 ? normalized : "source";
|
|
86
|
-
};
|
|
87
|
-
/** Sorts and deduplicates optional assertion string lists. */
|
|
88
|
-
const normalizeAssertionStrings = (values) => [...new Set(values ?? [])].sort((left, right) => left.localeCompare(right));
|
|
89
|
-
/** Sorts optional assertion maps into deterministic key order. */
|
|
90
|
-
const normalizeAssertionMap = (value) => Object.fromEntries(Object.entries(value ?? {}).sort(([left], [right]) => left.localeCompare(right)));
|
|
91
|
-
/** Keeps a numeric assertion threshold while omitting other runtime shapes. */
|
|
92
|
-
const normalizeAssertionLineCount = (value) => typeof value === "number" ? value : undefined;
|
|
93
|
-
const normalizeAssertionSignature = (test) => {
|
|
94
|
-
const normalized = {
|
|
95
|
-
assert_stdout_contains: normalizeAssertionStrings(test.assert_stdout_contains),
|
|
96
|
-
assert_stdout_regex: normalizeAssertionStrings(test.assert_stdout_regex),
|
|
97
|
-
assert_stderr_contains: normalizeAssertionStrings(test.assert_stderr_contains),
|
|
98
|
-
assert_stderr_regex: normalizeAssertionStrings(test.assert_stderr_regex),
|
|
99
|
-
assert_stdout_min_lines: normalizeAssertionLineCount(test.assert_stdout_min_lines),
|
|
100
|
-
assert_json_field_equals: normalizeAssertionMap(test.assert_json_field_equals),
|
|
101
|
-
assert_json_field_gte: normalizeAssertionMap(test.assert_json_field_gte),
|
|
102
|
-
};
|
|
103
|
-
return JSON.stringify(normalized);
|
|
104
|
-
};
|
|
105
|
-
/** Resolves a linked test's command-or-path identity segment. */
|
|
106
|
-
const resolveLinkedTestTargetSignature = (test) => {
|
|
107
|
-
const command = resolveOptionalEnvironmentValue(test.command);
|
|
108
|
-
if (command !== undefined) {
|
|
109
|
-
return `command:${test.scope}:${normalizeCommand(command)}`;
|
|
110
|
-
}
|
|
111
|
-
return `path:${test.scope}:${resolveOptionalEnvironmentValue(test.path) ?? ""}`;
|
|
112
|
-
};
|
|
113
|
-
const buildLinkedTestKey = (test) => {
|
|
114
|
-
const envSet = normalizeEnvSetSignature(test.env_set);
|
|
115
|
-
const envClear = normalizeEnvClearSignature(test.env_clear);
|
|
116
|
-
const pmContextMode = normalizePmContextModeSignature(test.pm_context_mode);
|
|
117
|
-
const workspaceContextMode = normalizeWorkspaceContextModeSignature(test.workspace_context_mode);
|
|
118
|
-
const sharedHostSafe = test.shared_host_safe === true ? "true" : "false";
|
|
119
|
-
const assertions = normalizeAssertionSignature(test);
|
|
120
|
-
return `${resolveLinkedTestTargetSignature(test)}:${envSet}:${envClear}:${pmContextMode}:${workspaceContextMode}:${sharedHostSafe}:${assertions}`;
|
|
121
|
-
};
|
|
122
|
-
const maxTimeoutSeconds = (current, candidate) => {
|
|
123
|
-
if (candidate === undefined) {
|
|
124
|
-
/* c8 ignore next - exercised implicitly by duplicate timeout normalization */
|
|
125
|
-
return current;
|
|
126
|
-
}
|
|
127
|
-
if (current === undefined || candidate > current) {
|
|
128
|
-
return candidate;
|
|
129
|
-
}
|
|
130
|
-
return current;
|
|
131
|
-
};
|
|
132
|
-
const countStatuses = (runResults) => {
|
|
133
|
-
let passed = 0;
|
|
134
|
-
let failed = 0;
|
|
135
|
-
let skipped = 0;
|
|
136
|
-
for (const result of runResults) {
|
|
137
|
-
if (result.status === "passed") {
|
|
138
|
-
passed += 1;
|
|
139
|
-
continue;
|
|
140
|
-
}
|
|
141
|
-
if (result.status === "failed") {
|
|
142
|
-
failed += 1;
|
|
143
|
-
continue;
|
|
144
|
-
}
|
|
145
|
-
skipped += 1;
|
|
146
|
-
}
|
|
147
|
-
return { passed, failed, skipped };
|
|
148
|
-
};
|
|
149
|
-
const mergeFailureCategoryCounts = (target, source) => {
|
|
150
|
-
for (const [key, value] of Object.entries(source)) {
|
|
151
|
-
target[key] += value;
|
|
152
|
-
}
|
|
153
|
-
};
|
|
154
|
-
const emitTestAllProgress = (options, message) => {
|
|
155
|
-
if (options.progress !== true) {
|
|
156
|
-
return;
|
|
157
|
-
}
|
|
158
|
-
try {
|
|
159
|
-
process.stderr.write(`[pm test-all] ${message}\n`);
|
|
160
|
-
}
|
|
161
|
-
catch {
|
|
162
|
-
// Ignore transient stderr write failures.
|
|
163
|
-
}
|
|
164
|
-
};
|
|
165
|
-
const collectTestAllItemTests = async (filteredItems, global, pmRoot) => {
|
|
166
|
-
const itemTests = [];
|
|
167
|
-
let linkedTests = 0;
|
|
168
|
-
for (const item of filteredItems) {
|
|
169
|
-
const readResult = await runTest(item.id, { run: false }, {
|
|
170
|
-
...global,
|
|
171
|
-
path: pmRoot,
|
|
172
|
-
});
|
|
173
|
-
linkedTests += readResult.tests.length;
|
|
174
|
-
itemTests.push({ item, tests: readResult.tests });
|
|
175
|
-
}
|
|
176
|
-
return { itemTests, linkedTests };
|
|
177
|
-
};
|
|
178
|
-
const selectTestAllItems = async (params) => {
|
|
179
|
-
const statusRegistry = resolveRuntimeStatusRegistry(params.settings.schema);
|
|
180
|
-
const typeRegistry = resolveItemTypeRegistry(params.settings, getActiveExtensionRegistrations());
|
|
181
|
-
const statusFilter = parseStatus(params.options.status, statusRegistry);
|
|
182
|
-
const limitFilter = parseNonNegativeInteger(params.options.limit, "--limit");
|
|
183
|
-
const offsetFilter = parseNonNegativeInteger(params.options.offset, "--offset") ?? 0;
|
|
184
|
-
const allItems = await listAllItemMetadataLight(params.pmRoot, params.settings.item_format, typeRegistry.type_to_folder, undefined, params.settings.schema);
|
|
185
|
-
const statusFilteredItems = allItems
|
|
186
|
-
.filter((item) => (statusFilter ? item.status === statusFilter : true))
|
|
187
|
-
.sort((a, b) => a.id.localeCompare(b.id));
|
|
188
|
-
const filteredItems = limitFilter === undefined
|
|
189
|
-
? statusFilteredItems.slice(offsetFilter)
|
|
190
|
-
: statusFilteredItems.slice(offsetFilter, offsetFilter + limitFilter);
|
|
191
|
-
return { filteredItems, statusFilter, limitFilter, offsetFilter };
|
|
192
|
-
};
|
|
193
|
-
const buildEffectiveTimeoutByKey = (itemTests) => {
|
|
194
|
-
const effectiveTimeoutByKey = new Map();
|
|
195
|
-
for (const { tests } of itemTests) {
|
|
196
|
-
for (const test of tests) {
|
|
197
|
-
const key = buildLinkedTestKey(test);
|
|
198
|
-
if (!effectiveTimeoutByKey.has(key)) {
|
|
199
|
-
effectiveTimeoutByKey.set(key, test.timeout_seconds);
|
|
200
|
-
continue;
|
|
201
|
-
}
|
|
202
|
-
effectiveTimeoutByKey.set(key, maxTimeoutSeconds(effectiveTimeoutByKey.get(key), test.timeout_seconds));
|
|
203
|
-
}
|
|
204
|
-
}
|
|
205
|
-
return effectiveTimeoutByKey;
|
|
206
|
-
};
|
|
207
|
-
const runTestAllItem = async (entry, context) => {
|
|
208
|
-
const testsToRun = [];
|
|
209
|
-
const keyedTests = entry.tests.map((test) => {
|
|
210
|
-
const key = buildLinkedTestKey(test);
|
|
211
|
-
const duplicate = context.seenTestKeys.has(key);
|
|
212
|
-
if (!duplicate) {
|
|
213
|
-
context.seenTestKeys.add(key);
|
|
214
|
-
const effectiveTimeoutSeconds = context.effectiveTimeoutByKey.get(key);
|
|
215
|
-
testsToRun.push(effectiveTimeoutSeconds === undefined
|
|
216
|
-
? test
|
|
217
|
-
: { ...test, timeout_seconds: effectiveTimeoutSeconds });
|
|
218
|
-
}
|
|
219
|
-
return { test, key, duplicate };
|
|
220
|
-
});
|
|
221
|
-
const executedResults = testsToRun.length > 0
|
|
222
|
-
? await runLinkedTests(testsToRun, context.defaultTimeoutSeconds, {
|
|
223
|
-
progress: context.options.progress,
|
|
224
|
-
sourceRoots: context.sourceRoots,
|
|
225
|
-
envSet: context.options.envSet,
|
|
226
|
-
envClear: context.options.envClear,
|
|
227
|
-
sharedHostSafe: context.options.sharedHostSafe,
|
|
228
|
-
pmContext: context.options.pmContext,
|
|
229
|
-
overrideLinkedPmContext: context.options.overrideLinkedPmContext,
|
|
230
|
-
failOnContextMismatch: context.options.failOnContextMismatch,
|
|
231
|
-
failOnEmptyTestRun: context.options.failOnEmptyTestRun,
|
|
232
|
-
requireAssertionsForPm: context.options.requireAssertionsForPm,
|
|
233
|
-
checkContext: context.options.checkContext,
|
|
234
|
-
autoPmContext: context.options.autoPmContext,
|
|
235
|
-
workspaceContext: context.options.workspaceContext,
|
|
236
|
-
overrideLinkedWorkspaceContext: context.options.overrideLinkedWorkspaceContext,
|
|
237
|
-
pmRoot: context.pmRoot,
|
|
238
|
-
allowUntrustedLinkedTests: context.options.allowUntrustedLinkedTests,
|
|
239
|
-
untrustedLinkedTestsPolicyEnabled: context.settings.testing.allow_untrusted_linked_tests,
|
|
240
|
-
})
|
|
241
|
-
: [];
|
|
242
|
-
let executedIndex = 0;
|
|
243
|
-
const runResults = keyedTests.map(({ test, key, duplicate }) => {
|
|
244
|
-
if (!duplicate) {
|
|
245
|
-
const executed = executedResults[executedIndex];
|
|
246
|
-
executedIndex += 1;
|
|
247
|
-
return executed;
|
|
248
|
-
}
|
|
249
|
-
return {
|
|
250
|
-
command: test.command,
|
|
251
|
-
path: test.path,
|
|
252
|
-
status: "skipped",
|
|
253
|
-
error: `Duplicate linked test skipped (key=${key}).`,
|
|
254
|
-
};
|
|
255
|
-
});
|
|
256
|
-
const summary = countStatuses(runResults);
|
|
257
|
-
const failureCategories = countFailureCategories(runResults);
|
|
258
|
-
const trackingWarnings = await appendTestAllItemTracking(entry, summary, runResults, context);
|
|
259
|
-
return {
|
|
260
|
-
passed: summary.passed,
|
|
261
|
-
failed: summary.failed,
|
|
262
|
-
skipped: summary.skipped,
|
|
263
|
-
trackingWarnings,
|
|
264
|
-
failureCategories,
|
|
265
|
-
result: {
|
|
266
|
-
ok: summary.failed === 0 &&
|
|
267
|
-
!(context.options.failOnSkipped === true && summary.skipped > 0),
|
|
268
|
-
id: entry.item.id,
|
|
269
|
-
status: entry.item.status,
|
|
270
|
-
test_count: entry.tests.length,
|
|
271
|
-
passed: summary.passed,
|
|
272
|
-
failed: summary.failed,
|
|
273
|
-
skipped: summary.skipped,
|
|
274
|
-
run_results: runResults,
|
|
275
|
-
failure_categories: failureCategories,
|
|
276
|
-
},
|
|
277
|
-
};
|
|
278
|
-
};
|
|
279
|
-
/** Resolves whether skip policy makes a tracked item run fail. */
|
|
280
|
-
const trackedRunFailed = (summary, options) => [
|
|
281
|
-
summary.failed > 0,
|
|
282
|
-
options.failOnSkipped === true && summary.skipped > 0,
|
|
283
|
-
].includes(true);
|
|
284
|
-
/** Projects true flags while keeping false values absent from persisted rows. */
|
|
285
|
-
const optionalTrue = (value) => value ? true : undefined;
|
|
286
|
-
const appendTestAllItemTracking = async (entry, summary, runResults, context) => {
|
|
287
|
-
if (!context.trackingEnabled) {
|
|
288
|
-
return [];
|
|
289
|
-
}
|
|
290
|
-
try {
|
|
291
|
-
const failed = trackedRunFailed(summary, context.options);
|
|
292
|
-
await appendTrackedTestRunSummary({
|
|
293
|
-
pmRoot: context.pmRoot,
|
|
294
|
-
settings: context.settings,
|
|
295
|
-
itemId: entry.item.id,
|
|
296
|
-
author: context.trackingAuthor,
|
|
297
|
-
message: `Track test-all run summary (${context.trackingRunId})`,
|
|
298
|
-
entry: {
|
|
299
|
-
run_id: context.trackingRunId,
|
|
300
|
-
kind: "test-all",
|
|
301
|
-
status: failed ? "failed" : "passed",
|
|
302
|
-
started_at: context.runStartedAt,
|
|
303
|
-
finished_at: nowIso(),
|
|
304
|
-
recorded_at: nowIso(),
|
|
305
|
-
attempt: context.trackingAttempt,
|
|
306
|
-
resumed_from: context.trackingResumedFrom,
|
|
307
|
-
passed: summary.passed,
|
|
308
|
-
failed: summary.failed,
|
|
309
|
-
skipped: summary.skipped,
|
|
310
|
-
items: 1,
|
|
311
|
-
linked_tests: entry.tests.length,
|
|
312
|
-
fail_on_skipped_triggered: optionalTrue(context.options.failOnSkipped === true && summary.skipped > 0),
|
|
313
|
-
executions: runResults
|
|
314
|
-
.filter((result) => result.command?.trim())
|
|
315
|
-
.slice(0, 32)
|
|
316
|
-
.map((result) => ({
|
|
317
|
-
command: result.command.trim(),
|
|
318
|
-
requested_pm_context_mode: result.execution_context?.requested_pm_context_mode,
|
|
319
|
-
pm_context_mode: result.execution_context?.pm_context_mode,
|
|
320
|
-
workspace_context_mode: result.execution_context?.workspace_context_mode,
|
|
321
|
-
trust_reason: result.execution_context?.trust.reason,
|
|
322
|
-
})),
|
|
323
|
-
},
|
|
324
|
-
});
|
|
325
|
-
}
|
|
326
|
-
catch (error) {
|
|
327
|
-
return [
|
|
328
|
-
`test_result_tracking_failed:${entry.item.id}:${formatTrackingError(error)}`,
|
|
329
|
-
];
|
|
330
|
-
}
|
|
331
|
-
return [];
|
|
332
|
-
};
|
|
333
|
-
/** Parses the optional background-attempt environment contract. */
|
|
334
|
-
const resolveTrackingAttempt = () => {
|
|
335
|
-
const raw = process.env.PM_BACKGROUND_TEST_RUN_ATTEMPT?.trim();
|
|
336
|
-
const parsed = raw ? Number.parseInt(raw, 10) : Number.NaN;
|
|
337
|
-
return Number.isFinite(parsed) && parsed >= 1 ? parsed : undefined;
|
|
338
|
-
};
|
|
339
|
-
/** Normalizes an optional non-blank environment value. */
|
|
340
|
-
const resolveOptionalEnvironmentValue = (value) => {
|
|
341
|
-
const trimmed = value?.trim();
|
|
342
|
-
return trimmed && trimmed.length > 0 ? trimmed : undefined;
|
|
343
|
-
};
|
|
344
|
-
const buildTestAllItemRunContext = (params) => {
|
|
345
|
-
return {
|
|
346
|
-
pmRoot: params.pmRoot,
|
|
347
|
-
settings: params.settings,
|
|
348
|
-
options: params.options,
|
|
349
|
-
defaultTimeoutSeconds: params.defaultTimeoutSeconds,
|
|
350
|
-
sourceRoots: {
|
|
351
|
-
projectPmRoot: params.pmRoot,
|
|
352
|
-
globalPmRoot: resolveGlobalPmRoot(process.cwd()),
|
|
353
|
-
},
|
|
354
|
-
seenTestKeys: new Set(),
|
|
355
|
-
effectiveTimeoutByKey: buildEffectiveTimeoutByKey(params.itemTests),
|
|
356
|
-
trackingEnabled: params.settings.testing.record_results_to_items === true,
|
|
357
|
-
trackingAuthor: resolveAuthor(params.options.author, params.settings.author_default),
|
|
358
|
-
trackingRunId: resolveTrackedRunId(),
|
|
359
|
-
trackingAttempt: resolveTrackingAttempt(),
|
|
360
|
-
trackingResumedFrom: resolveOptionalEnvironmentValue(process.env.PM_BACKGROUND_TEST_RUN_RESUMED_FROM),
|
|
361
|
-
runStartedAt: params.runStartedAt,
|
|
362
|
-
};
|
|
363
|
-
};
|
|
364
|
-
const initializeTestAllAccumulation = (options, linkedTests, filteredItems) => {
|
|
365
|
-
const accumulation = {
|
|
366
|
-
results: [],
|
|
367
|
-
passed: 0,
|
|
368
|
-
failed: 0,
|
|
369
|
-
skipped: 0,
|
|
370
|
-
failureCategories: countFailureCategories([]),
|
|
371
|
-
trackingWarnings: [],
|
|
372
|
-
};
|
|
373
|
-
const failOnEmptyTestRunTriggered = options.failOnEmptyTestRun === true && linkedTests === 0;
|
|
374
|
-
if (failOnEmptyTestRunTriggered) {
|
|
375
|
-
accumulation.failed += 1;
|
|
376
|
-
accumulation.failureCategories.empty_run += 1;
|
|
377
|
-
accumulation.trackingWarnings.push(`empty_linked_test_selection:items=${filteredItems.length};linked_tests=0;fail_on_empty_test_run=true`);
|
|
378
|
-
}
|
|
379
|
-
return { accumulation, failOnEmptyTestRunTriggered };
|
|
380
|
-
};
|
|
381
|
-
const runTestAllItems = async (itemTests, context, accumulation) => {
|
|
382
|
-
for (const [itemIndex, entry] of itemTests.entries()) {
|
|
383
|
-
emitTestAllProgress(context.options, `item ${itemIndex + 1}/${itemTests.length} start id=${entry.item.id} linked_tests=${entry.tests.length}`);
|
|
384
|
-
const execution = await runTestAllItem(entry, context);
|
|
385
|
-
mergeFailureCategoryCounts(accumulation.failureCategories, execution.failureCategories);
|
|
386
|
-
accumulation.passed += execution.passed;
|
|
387
|
-
accumulation.failed += execution.failed;
|
|
388
|
-
accumulation.skipped += execution.skipped;
|
|
389
|
-
accumulation.trackingWarnings.push(...execution.trackingWarnings);
|
|
390
|
-
accumulation.results.push(execution.result);
|
|
391
|
-
emitTestAllProgress(context.options, `item ${itemIndex + 1}/${itemTests.length} end id=${entry.item.id}` +
|
|
392
|
-
` status=${execution.failed === 0 ? "passed" : "failed"}` +
|
|
393
|
-
` passed=${execution.passed} failed=${execution.failed} skipped=${execution.skipped}`);
|
|
394
|
-
}
|
|
395
|
-
};
|
|
396
|
-
const appendContextPreflightWarning = (options, accumulation) => {
|
|
397
|
-
if (options.checkContext !== true) {
|
|
398
|
-
return;
|
|
399
|
-
}
|
|
400
|
-
const allRunResults = accumulation.results.flatMap((entry) => entry.run_results);
|
|
401
|
-
const preflight = summarizeContextPreflight(allRunResults);
|
|
402
|
-
accumulation.trackingWarnings.push(`context_preflight:checked_pm_commands=${preflight.checked_pm_commands};` +
|
|
403
|
-
`tracker_read_commands=${preflight.tracker_read_commands};` +
|
|
404
|
-
`mismatches=${preflight.mismatches};` +
|
|
405
|
-
`auto_remediated=${preflight.auto_remediated}`);
|
|
406
|
-
};
|
|
407
|
-
const buildTestAllResult = (params) => {
|
|
408
|
-
return {
|
|
409
|
-
ok: params.ok,
|
|
410
|
-
totals: {
|
|
411
|
-
items: params.filteredItems.length,
|
|
412
|
-
linked_tests: params.linkedTests,
|
|
413
|
-
passed: params.accumulation.passed,
|
|
414
|
-
failed: params.accumulation.failed,
|
|
415
|
-
skipped: params.accumulation.skipped,
|
|
416
|
-
failure_categories: params.accumulation.failureCategories,
|
|
417
|
-
},
|
|
418
|
-
failed: params.accumulation.failed,
|
|
419
|
-
passed: params.accumulation.passed,
|
|
420
|
-
skipped: params.accumulation.skipped,
|
|
421
|
-
fail_on_skipped_triggered: params.failOnSkippedTriggered ? true : undefined,
|
|
422
|
-
fail_on_empty_test_run_triggered: params.failOnEmptyTestRunTriggered
|
|
423
|
-
? true
|
|
424
|
-
: undefined,
|
|
425
|
-
warnings: params.accumulation.trackingWarnings.length > 0
|
|
426
|
-
? params.accumulation.trackingWarnings
|
|
427
|
-
: undefined,
|
|
428
|
-
results: params.accumulation.results,
|
|
429
|
-
};
|
|
430
|
-
};
|
|
431
|
-
/** Formats the selected test-all window without branching command execution. */
|
|
432
|
-
const buildTestAllSelectionProgress = (params) => [
|
|
433
|
-
`selection items=${params.filteredItems.length}`,
|
|
434
|
-
`linked_tests=${params.linkedTests}`,
|
|
435
|
-
params.statusFilter === undefined ? "" : `status=${params.statusFilter}`,
|
|
436
|
-
params.limitFilter === undefined ? "" : `limit=${params.limitFilter}`,
|
|
437
|
-
params.offsetFilter > 0 ? `offset=${params.offsetFilter}` : "",
|
|
438
|
-
]
|
|
439
|
-
.filter((entry) => entry.length > 0)
|
|
440
|
-
.join(" ");
|
|
441
|
-
/** Loads the tracker selection and linked tests for one test-all run. */
|
|
442
|
-
const prepareTestAllRun = async (options, global) => {
|
|
443
|
-
const pmRoot = resolvePmRoot(process.cwd(), global.path);
|
|
444
|
-
await assertInitializedTracker(pmRoot);
|
|
445
|
-
const settings = await readSettings(pmRoot);
|
|
446
|
-
const selection = await selectTestAllItems({ pmRoot, settings, options });
|
|
447
|
-
const defaultTimeoutSeconds = parseTimeout(options.timeout);
|
|
448
|
-
const runStartedAt = nowIso();
|
|
449
|
-
const collected = await collectTestAllItemTests(selection.filteredItems, global, pmRoot);
|
|
450
|
-
emitTestAllProgress(options, buildTestAllSelectionProgress({
|
|
451
|
-
...selection,
|
|
452
|
-
linkedTests: collected.linkedTests,
|
|
453
|
-
}));
|
|
454
|
-
return {
|
|
455
|
-
pmRoot,
|
|
456
|
-
settings,
|
|
457
|
-
filteredItems: selection.filteredItems,
|
|
458
|
-
itemTests: collected.itemTests,
|
|
459
|
-
linkedTests: collected.linkedTests,
|
|
460
|
-
defaultTimeoutSeconds,
|
|
461
|
-
runStartedAt,
|
|
462
|
-
};
|
|
463
|
-
};
|
|
464
|
-
/** Resolves aggregate strict-policy state after every item has run. */
|
|
465
|
-
const resolveTestAllOutcome = (params) => {
|
|
466
|
-
const failOnSkippedTriggered = params.options.failOnSkipped === true && params.accumulation.skipped > 0;
|
|
467
|
-
const ok = ![
|
|
468
|
-
params.accumulation.failed > 0,
|
|
469
|
-
failOnSkippedTriggered,
|
|
470
|
-
params.failOnEmptyTestRunTriggered,
|
|
471
|
-
].includes(true);
|
|
472
|
-
return { failOnSkippedTriggered, ok };
|
|
473
|
-
};
|
|
474
|
-
/** Implements run test all for the public runtime surface of this module. */
|
|
475
|
-
export const runTestAll = async (options, global) => {
|
|
476
|
-
const prepared = await prepareTestAllRun(options, global);
|
|
477
|
-
const { accumulation, failOnEmptyTestRunTriggered } = initializeTestAllAccumulation(options, prepared.linkedTests, prepared.filteredItems);
|
|
478
|
-
const itemRunContext = buildTestAllItemRunContext({
|
|
479
|
-
pmRoot: prepared.pmRoot,
|
|
480
|
-
settings: prepared.settings,
|
|
481
|
-
options,
|
|
482
|
-
itemTests: prepared.itemTests,
|
|
483
|
-
defaultTimeoutSeconds: prepared.defaultTimeoutSeconds,
|
|
484
|
-
runStartedAt: prepared.runStartedAt,
|
|
485
|
-
});
|
|
486
|
-
await runTestAllItems(prepared.itemTests, itemRunContext, accumulation);
|
|
487
|
-
appendContextPreflightWarning(options, accumulation);
|
|
488
|
-
const outcome = resolveTestAllOutcome({
|
|
489
|
-
options,
|
|
490
|
-
accumulation,
|
|
491
|
-
failOnEmptyTestRunTriggered,
|
|
492
|
-
});
|
|
493
|
-
emitTestAllProgress(options, `end status=${outcome.ok ? "passed" : "failed"} items=${prepared.filteredItems.length} linked_tests=${prepared.linkedTests}` +
|
|
494
|
-
` passed=${accumulation.passed} failed=${accumulation.failed} skipped=${accumulation.skipped}`);
|
|
495
|
-
return buildTestAllResult({
|
|
496
|
-
ok: outcome.ok,
|
|
497
|
-
filteredItems: prepared.filteredItems,
|
|
498
|
-
linkedTests: prepared.linkedTests,
|
|
499
|
-
accumulation,
|
|
500
|
-
failOnSkippedTriggered: outcome.failOnSkippedTriggered,
|
|
501
|
-
failOnEmptyTestRunTriggered,
|
|
502
|
-
});
|
|
503
|
-
};
|
|
504
|
-
/** Public contract for test only test all, shared by SDK and presentation-layer consumers. */
|
|
505
|
-
export const _testOnlyTestAll = {
|
|
506
|
-
buildLinkedTestKey,
|
|
507
|
-
formatTrackingError,
|
|
508
|
-
};
|
|
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]="e3e3a1d4-4552-5f3c-9b02-c33ae72ea32b")}catch(e2){}})();import{assertInitializedTracker}from"../environment/tracker-preflight.js";import{getActiveExtensionRegistrations}from"../../core/extensions/index.js";import{resolveItemTypeRegistry}from"../../core/item/type-registry.js";import{parseOptionalNumber}from"../../core/item/parse.js";import{normalizeStatusInput}from"../../core/item/status.js";import{resolveRuntimeStatusRegistry}from"../../core/schema/runtime-schema.js";import{EXIT_CODE}from"../../core/shared/constants.js";import{PmCliError}from"../../core/shared/errors.js";import{nowIso}from"../../core/shared/time.js";import{listAllItemMetadataLight}from"../../core/store/item-store.js";import{resolveGlobalPmRoot,resolvePmRoot}from"../../core/store/paths.js";import{readSettings}from"../../core/store/settings.js";import{appendTrackedTestRunSummary}from"../../core/test/item-test-run-tracking.js";import{resolveAuthor}from"../../core/shared/author.js";import{countFailureCategories,runLinkedTests,runTest,summarizeContextPreflight}from"./execution.js";const parseStatus=(raw,statusRegistry)=>{if(raw===void 0){return void 0}const normalized=normalizeStatusInput(raw,statusRegistry);if(!normalized){const allowedStatuses=statusRegistry.definitions.map(definition=>definition.id);throw new PmCliError(`Invalid --status value "${raw}". Allowed: ${allowedStatuses.join(", ")}`,EXIT_CODE.USAGE)}return normalized};const parseTimeout=raw=>{if(raw===void 0){return void 0}const parsed=parseOptionalNumber(raw,"timeout");if(parsed<=0){throw new PmCliError("timeout must be a positive number",EXIT_CODE.USAGE)}return parsed};const parseNonNegativeInteger=(raw,flag)=>{if(raw===void 0){return void 0}const parsed=Number(raw);if(!Number.isInteger(parsed)||parsed<0){throw new PmCliError(`${flag} must be a non-negative integer`,EXIT_CODE.USAGE)}return parsed};const formatTrackingError=error=>{return error instanceof Error?error.message:String(error)};const resolveTrackedRunId=()=>{const fromEnv=process.env.PM_BACKGROUND_TEST_RUN_ID?.trim();if(fromEnv&&fromEnv.length>0){return fromEnv}return`test-all-local-${Date.now().toString(36)}-${Math.random().toString(36).slice(2,8)}`};const normalizeCommand=command=>{return command.trim().replaceAll(/\s+/g," ")};const normalizeEnvSetSignature=value=>{if(!value||Object.keys(value).length===0){return"{}"}return JSON.stringify(Object.fromEntries(Object.entries(value).sort(([left],[right])=>left.localeCompare(right))))};const normalizeEnvClearSignature=value=>{if(!value||value.length===0){return"[]"}return JSON.stringify([...value].sort((left,right)=>left.localeCompare(right)))};const normalizePmContextModeSignature=value=>{const normalized=value?.trim().toLowerCase();return normalized&&normalized.length>0?normalized:"none"};const normalizeWorkspaceContextModeSignature=value=>{const normalized=value?.trim().toLowerCase();return normalized&&normalized.length>0?normalized:"source"};const normalizeAssertionStrings=values=>[...new Set(values??[])].sort((left,right)=>left.localeCompare(right));const normalizeAssertionMap=value=>Object.fromEntries(Object.entries(value??{}).sort(([left],[right])=>left.localeCompare(right)));const normalizeAssertionLineCount=value=>typeof value==="number"?value:void 0;const normalizeAssertionSignature=test=>{const normalized={assert_stdout_contains:normalizeAssertionStrings(test.assert_stdout_contains),assert_stdout_regex:normalizeAssertionStrings(test.assert_stdout_regex),assert_stderr_contains:normalizeAssertionStrings(test.assert_stderr_contains),assert_stderr_regex:normalizeAssertionStrings(test.assert_stderr_regex),assert_stdout_min_lines:normalizeAssertionLineCount(test.assert_stdout_min_lines),assert_json_field_equals:normalizeAssertionMap(test.assert_json_field_equals),assert_json_field_gte:normalizeAssertionMap(test.assert_json_field_gte)};return JSON.stringify(normalized)};const resolveLinkedTestTargetSignature=test=>{const command=resolveOptionalEnvironmentValue(test.command);if(command!==void 0){return`command:${test.scope}:${normalizeCommand(command)}`}return`path:${test.scope}:${resolveOptionalEnvironmentValue(test.path)??""}`};const buildLinkedTestKey=test=>{const envSet=normalizeEnvSetSignature(test.env_set);const envClear=normalizeEnvClearSignature(test.env_clear);const pmContextMode=normalizePmContextModeSignature(test.pm_context_mode);const workspaceContextMode=normalizeWorkspaceContextModeSignature(test.workspace_context_mode);const sharedHostSafe=test.shared_host_safe===true?"true":"false";const assertions=normalizeAssertionSignature(test);return`${resolveLinkedTestTargetSignature(test)}:${envSet}:${envClear}:${pmContextMode}:${workspaceContextMode}:${sharedHostSafe}:${assertions}`};const maxTimeoutSeconds=(current,candidate)=>{if(candidate===void 0){return current}if(current===void 0||candidate>current){return candidate}return current};const countStatuses=runResults=>{let passed=0;let failed=0;let skipped=0;for(const result of runResults){if(result.status==="passed"){passed+=1;continue}if(result.status==="failed"){failed+=1;continue}skipped+=1}return{passed,failed,skipped}};const mergeFailureCategoryCounts=(target,source)=>{for(const[key,value]of Object.entries(source)){target[key]+=value}};const emitTestAllProgress=(options,message)=>{if(options.progress!==true){return}try{process.stderr.write(`[pm test-all] ${message}
|
|
2
|
+
`)}catch{}};const collectTestAllItemTests=async(filteredItems,global2,pmRoot)=>{const itemTests=[];let linkedTests=0;for(const item of filteredItems){const readResult=await runTest(item.id,{run:false},{...global2,path:pmRoot});linkedTests+=readResult.tests.length;itemTests.push({item,tests:readResult.tests})}return{itemTests,linkedTests}};const selectTestAllItems=async params=>{const statusRegistry=resolveRuntimeStatusRegistry(params.settings.schema);const typeRegistry=resolveItemTypeRegistry(params.settings,getActiveExtensionRegistrations());const statusFilter=parseStatus(params.options.status,statusRegistry);const limitFilter=parseNonNegativeInteger(params.options.limit,"--limit");const offsetFilter=parseNonNegativeInteger(params.options.offset,"--offset")??0;const allItems=await listAllItemMetadataLight(params.pmRoot,params.settings.item_format,typeRegistry.type_to_folder,void 0,params.settings.schema);const statusFilteredItems=allItems.filter(item=>statusFilter?item.status===statusFilter:true).sort((a,b)=>a.id.localeCompare(b.id));const filteredItems=limitFilter===void 0?statusFilteredItems.slice(offsetFilter):statusFilteredItems.slice(offsetFilter,offsetFilter+limitFilter);return{filteredItems,statusFilter,limitFilter,offsetFilter}};const buildEffectiveTimeoutByKey=itemTests=>{const effectiveTimeoutByKey=new Map;for(const{tests}of itemTests){for(const test of tests){const key=buildLinkedTestKey(test);if(!effectiveTimeoutByKey.has(key)){effectiveTimeoutByKey.set(key,test.timeout_seconds);continue}effectiveTimeoutByKey.set(key,maxTimeoutSeconds(effectiveTimeoutByKey.get(key),test.timeout_seconds))}}return effectiveTimeoutByKey};const runTestAllItem=async(entry,context)=>{const testsToRun=[];const keyedTests=entry.tests.map(test=>{const key=buildLinkedTestKey(test);const duplicate=context.seenTestKeys.has(key);if(!duplicate){context.seenTestKeys.add(key);const effectiveTimeoutSeconds=context.effectiveTimeoutByKey.get(key);testsToRun.push(effectiveTimeoutSeconds===void 0?test:{...test,timeout_seconds:effectiveTimeoutSeconds})}return{test,key,duplicate}});const executedResults=testsToRun.length>0?await runLinkedTests(testsToRun,context.defaultTimeoutSeconds,{progress:context.options.progress,sourceRoots:context.sourceRoots,envSet:context.options.envSet,envClear:context.options.envClear,sharedHostSafe:context.options.sharedHostSafe,pmContext:context.options.pmContext,overrideLinkedPmContext:context.options.overrideLinkedPmContext,failOnContextMismatch:context.options.failOnContextMismatch,failOnEmptyTestRun:context.options.failOnEmptyTestRun,requireAssertionsForPm:context.options.requireAssertionsForPm,checkContext:context.options.checkContext,autoPmContext:context.options.autoPmContext,workspaceContext:context.options.workspaceContext,overrideLinkedWorkspaceContext:context.options.overrideLinkedWorkspaceContext,pmRoot:context.pmRoot,allowUntrustedLinkedTests:context.options.allowUntrustedLinkedTests,untrustedLinkedTestsPolicyEnabled:context.settings.testing.allow_untrusted_linked_tests}):[];let executedIndex=0;const runResults=keyedTests.map(({test,key,duplicate})=>{if(!duplicate){const executed=executedResults[executedIndex];executedIndex+=1;return executed}return{command:test.command,path:test.path,status:"skipped",error:`Duplicate linked test skipped (key=${key}).`}});const summary=countStatuses(runResults);const failureCategories=countFailureCategories(runResults);const trackingWarnings=await appendTestAllItemTracking(entry,summary,runResults,context);return{passed:summary.passed,failed:summary.failed,skipped:summary.skipped,trackingWarnings,failureCategories,result:{ok:summary.failed===0&&!(context.options.failOnSkipped===true&&summary.skipped>0),id:entry.item.id,status:entry.item.status,test_count:entry.tests.length,passed:summary.passed,failed:summary.failed,skipped:summary.skipped,run_results:runResults,failure_categories:failureCategories}}};const trackedRunFailed=(summary,options)=>[summary.failed>0,options.failOnSkipped===true&&summary.skipped>0].includes(true);const optionalTrue=value=>value?true:void 0;const appendTestAllItemTracking=async(entry,summary,runResults,context)=>{if(!context.trackingEnabled){return[]}try{const failed=trackedRunFailed(summary,context.options);await appendTrackedTestRunSummary({pmRoot:context.pmRoot,settings:context.settings,itemId:entry.item.id,author:context.trackingAuthor,message:`Track test-all run summary (${context.trackingRunId})`,entry:{run_id:context.trackingRunId,kind:"test-all",status:failed?"failed":"passed",started_at:context.runStartedAt,finished_at:nowIso(),recorded_at:nowIso(),attempt:context.trackingAttempt,resumed_from:context.trackingResumedFrom,passed:summary.passed,failed:summary.failed,skipped:summary.skipped,items:1,linked_tests:entry.tests.length,fail_on_skipped_triggered:optionalTrue(context.options.failOnSkipped===true&&summary.skipped>0),executions:runResults.filter(result=>result.command?.trim()).slice(0,32).map(result=>({command:result.command.trim(),requested_pm_context_mode:result.execution_context?.requested_pm_context_mode,pm_context_mode:result.execution_context?.pm_context_mode,workspace_context_mode:result.execution_context?.workspace_context_mode,trust_reason:result.execution_context?.trust.reason}))}})}catch(error){return[`test_result_tracking_failed:${entry.item.id}:${formatTrackingError(error)}`]}return[]};const resolveTrackingAttempt=()=>{const raw=process.env.PM_BACKGROUND_TEST_RUN_ATTEMPT?.trim();const parsed=raw?Number.parseInt(raw,10):Number.NaN;return Number.isFinite(parsed)&&parsed>=1?parsed:void 0};const resolveOptionalEnvironmentValue=value=>{const trimmed=value?.trim();return trimmed&&trimmed.length>0?trimmed:void 0};const buildTestAllItemRunContext=params=>{return{pmRoot:params.pmRoot,settings:params.settings,options:params.options,defaultTimeoutSeconds:params.defaultTimeoutSeconds,sourceRoots:{projectPmRoot:params.pmRoot,globalPmRoot:resolveGlobalPmRoot(process.cwd())},seenTestKeys:new Set,effectiveTimeoutByKey:buildEffectiveTimeoutByKey(params.itemTests),trackingEnabled:params.settings.testing.record_results_to_items===true,trackingAuthor:resolveAuthor(params.options.author,params.settings.author_default),trackingRunId:resolveTrackedRunId(),trackingAttempt:resolveTrackingAttempt(),trackingResumedFrom:resolveOptionalEnvironmentValue(process.env.PM_BACKGROUND_TEST_RUN_RESUMED_FROM),runStartedAt:params.runStartedAt}};const initializeTestAllAccumulation=(options,linkedTests,filteredItems)=>{const accumulation={results:[],passed:0,failed:0,skipped:0,failureCategories:countFailureCategories([]),trackingWarnings:[]};const failOnEmptyTestRunTriggered=options.failOnEmptyTestRun===true&&linkedTests===0;if(failOnEmptyTestRunTriggered){accumulation.failed+=1;accumulation.failureCategories.empty_run+=1;accumulation.trackingWarnings.push(`empty_linked_test_selection:items=${filteredItems.length};linked_tests=0;fail_on_empty_test_run=true`)}return{accumulation,failOnEmptyTestRunTriggered}};const runTestAllItems=async(itemTests,context,accumulation)=>{for(const[itemIndex,entry]of itemTests.entries()){emitTestAllProgress(context.options,`item ${itemIndex+1}/${itemTests.length} start id=${entry.item.id} linked_tests=${entry.tests.length}`);const execution=await runTestAllItem(entry,context);mergeFailureCategoryCounts(accumulation.failureCategories,execution.failureCategories);accumulation.passed+=execution.passed;accumulation.failed+=execution.failed;accumulation.skipped+=execution.skipped;accumulation.trackingWarnings.push(...execution.trackingWarnings);accumulation.results.push(execution.result);emitTestAllProgress(context.options,`item ${itemIndex+1}/${itemTests.length} end id=${entry.item.id} status=${execution.failed===0?"passed":"failed"} passed=${execution.passed} failed=${execution.failed} skipped=${execution.skipped}`)}};const appendContextPreflightWarning=(options,accumulation)=>{if(options.checkContext!==true){return}const allRunResults=accumulation.results.flatMap(entry=>entry.run_results);const preflight=summarizeContextPreflight(allRunResults);accumulation.trackingWarnings.push(`context_preflight:checked_pm_commands=${preflight.checked_pm_commands};tracker_read_commands=${preflight.tracker_read_commands};mismatches=${preflight.mismatches};auto_remediated=${preflight.auto_remediated}`)};const buildTestAllResult=params=>{return{ok:params.ok,totals:{items:params.filteredItems.length,linked_tests:params.linkedTests,passed:params.accumulation.passed,failed:params.accumulation.failed,skipped:params.accumulation.skipped,failure_categories:params.accumulation.failureCategories},failed:params.accumulation.failed,passed:params.accumulation.passed,skipped:params.accumulation.skipped,fail_on_skipped_triggered:params.failOnSkippedTriggered?true:void 0,fail_on_empty_test_run_triggered:params.failOnEmptyTestRunTriggered?true:void 0,warnings:params.accumulation.trackingWarnings.length>0?params.accumulation.trackingWarnings:void 0,results:params.accumulation.results}};const buildTestAllSelectionProgress=params=>[`selection items=${params.filteredItems.length}`,`linked_tests=${params.linkedTests}`,params.statusFilter===void 0?"":`status=${params.statusFilter}`,params.limitFilter===void 0?"":`limit=${params.limitFilter}`,params.offsetFilter>0?`offset=${params.offsetFilter}`:""].filter(entry=>entry.length>0).join(" ");const prepareTestAllRun=async(options,global2)=>{const pmRoot=resolvePmRoot(process.cwd(),global2.path);await assertInitializedTracker(pmRoot);const settings=await readSettings(pmRoot);const selection=await selectTestAllItems({pmRoot,settings,options});const defaultTimeoutSeconds=parseTimeout(options.timeout);const runStartedAt=nowIso();const collected=await collectTestAllItemTests(selection.filteredItems,global2,pmRoot);emitTestAllProgress(options,buildTestAllSelectionProgress({...selection,linkedTests:collected.linkedTests}));return{pmRoot,settings,filteredItems:selection.filteredItems,itemTests:collected.itemTests,linkedTests:collected.linkedTests,defaultTimeoutSeconds,runStartedAt}};const resolveTestAllOutcome=params=>{const failOnSkippedTriggered=params.options.failOnSkipped===true&¶ms.accumulation.skipped>0;const ok=![params.accumulation.failed>0,failOnSkippedTriggered,params.failOnEmptyTestRunTriggered].includes(true);return{failOnSkippedTriggered,ok}};const runTestAll=async(options,global2)=>{const prepared=await prepareTestAllRun(options,global2);const{accumulation,failOnEmptyTestRunTriggered}=initializeTestAllAccumulation(options,prepared.linkedTests,prepared.filteredItems);const itemRunContext=buildTestAllItemRunContext({pmRoot:prepared.pmRoot,settings:prepared.settings,options,itemTests:prepared.itemTests,defaultTimeoutSeconds:prepared.defaultTimeoutSeconds,runStartedAt:prepared.runStartedAt});await runTestAllItems(prepared.itemTests,itemRunContext,accumulation);appendContextPreflightWarning(options,accumulation);const outcome=resolveTestAllOutcome({options,accumulation,failOnEmptyTestRunTriggered});emitTestAllProgress(options,`end status=${outcome.ok?"passed":"failed"} items=${prepared.filteredItems.length} linked_tests=${prepared.linkedTests} passed=${accumulation.passed} failed=${accumulation.failed} skipped=${accumulation.skipped}`);return buildTestAllResult({ok:outcome.ok,filteredItems:prepared.filteredItems,linkedTests:prepared.linkedTests,accumulation,failOnSkippedTriggered:outcome.failOnSkippedTriggered,failOnEmptyTestRunTriggered})};const _testOnlyTestAll={buildLinkedTestKey,formatTrackingError};export{_testOnlyTestAll,runTestAll};
|
|
509
3
|
//# sourceMappingURL=batch.js.map
|
|
510
|
-
//# debugId=5d3405c0-14e6-51f5-97a1-355438fd0199
|
package/dist/sdk/test/entry.js
CHANGED
|
@@ -1,71 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
* @module sdk/test/entry
|
|
3
|
-
*
|
|
4
|
-
* Implements the pm linked test entry 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]="b29e4416-82ab-585c-9456-718e4699566d")}catch(e){}}();
|
|
8
|
-
import { EXIT_CODE } from "../../core/shared/constants.js";
|
|
9
|
-
import { PmCliError } from "../../core/shared/errors.js";
|
|
10
|
-
import { looksLikeStructuredKeyValueEntry } from "../../core/item/parse.js";
|
|
11
|
-
// Keys accepted inside a structured linked-test entry. `cmd` is an alias for
|
|
12
|
-
// `command`; everything else maps 1:1 to a LinkedTest field.
|
|
13
|
-
/** Public contract for structured linked test keys, shared by SDK and presentation-layer consumers. */
|
|
14
|
-
export const STRUCTURED_LINKED_TEST_KEYS = [
|
|
15
|
-
"command",
|
|
16
|
-
"cmd",
|
|
17
|
-
"path",
|
|
18
|
-
"scope",
|
|
19
|
-
"timeout",
|
|
20
|
-
"timeout_seconds",
|
|
21
|
-
"pm_context_mode",
|
|
22
|
-
"workspace_context_mode",
|
|
23
|
-
"env_set",
|
|
24
|
-
"env_clear",
|
|
25
|
-
"shared_host_safe",
|
|
26
|
-
"assert_stdout_contains",
|
|
27
|
-
"assert_stdout_regex",
|
|
28
|
-
"assert_stderr_contains",
|
|
29
|
-
"assert_stderr_regex",
|
|
30
|
-
"assert_stdout_min_lines",
|
|
31
|
-
"assert_json_field_equals",
|
|
32
|
-
"assert_json_field_gte",
|
|
33
|
-
"note",
|
|
34
|
-
];
|
|
35
|
-
const STRUCTURED_LINKED_TEST_KEY_SET = new Set(STRUCTURED_LINKED_TEST_KEYS);
|
|
36
|
-
/** Classify linked-test plaintext through the shared structured-entry grammar. */
|
|
37
|
-
export function looksLikeStructuredLinkedTestEntry(raw) {
|
|
38
|
-
return looksLikeStructuredKeyValueEntry(raw, STRUCTURED_LINKED_TEST_KEYS);
|
|
39
|
-
}
|
|
40
|
-
/** Implements normalize structured linked test entry for the public runtime surface of this module. */
|
|
41
|
-
export function normalizeStructuredLinkedTestEntry(kv, optionName) {
|
|
42
|
-
const normalizedKv = {};
|
|
43
|
-
const unknownKeys = [];
|
|
44
|
-
for (const [key, value] of Object.entries(kv)) {
|
|
45
|
-
const normalizedKey = key.toLowerCase();
|
|
46
|
-
if (!STRUCTURED_LINKED_TEST_KEY_SET.has(normalizedKey)) {
|
|
47
|
-
unknownKeys.push(key);
|
|
48
|
-
continue;
|
|
49
|
-
}
|
|
50
|
-
if (Object.hasOwn(normalizedKv, normalizedKey)) {
|
|
51
|
-
throw new PmCliError(`${optionName} provides key "${key}" more than once after case normalization`, EXIT_CODE.USAGE);
|
|
52
|
-
}
|
|
53
|
-
normalizedKv[normalizedKey] = value;
|
|
54
|
-
}
|
|
55
|
-
if (unknownKeys.length > 0) {
|
|
56
|
-
throw new PmCliError(`${optionName} does not recognize key${unknownKeys.length > 1 ? "s" : ""} ${unknownKeys
|
|
57
|
-
.map((key) => `"${key}"`)
|
|
58
|
-
.join(", ")}. Allowed keys: ${STRUCTURED_LINKED_TEST_KEYS.join(", ")}.`, EXIT_CODE.USAGE);
|
|
59
|
-
}
|
|
60
|
-
if (normalizedKv.cmd !== undefined) {
|
|
61
|
-
if (normalizedKv.command !== undefined &&
|
|
62
|
-
normalizedKv.command.trim() !== normalizedKv.cmd.trim()) {
|
|
63
|
-
throw new PmCliError(`${optionName} command and cmd must match when both are provided`, EXIT_CODE.USAGE);
|
|
64
|
-
}
|
|
65
|
-
const { cmd, ...rest } = normalizedKv;
|
|
66
|
-
return { ...rest, command: rest.command ?? cmd };
|
|
67
|
-
}
|
|
68
|
-
return normalizedKv;
|
|
69
|
-
}
|
|
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]="70971b2a-c025-50a8-918f-871fc8adfd2a")}catch(e2){}})();import{EXIT_CODE}from"../../core/shared/constants.js";import{PmCliError}from"../../core/shared/errors.js";import{looksLikeStructuredKeyValueEntry}from"../../core/item/parse.js";const STRUCTURED_LINKED_TEST_KEYS=["command","cmd","path","scope","timeout","timeout_seconds","pm_context_mode","workspace_context_mode","env_set","env_clear","shared_host_safe","assert_stdout_contains","assert_stdout_regex","assert_stderr_contains","assert_stderr_regex","assert_stdout_min_lines","assert_json_field_equals","assert_json_field_gte","note"];const STRUCTURED_LINKED_TEST_KEY_SET=new Set(STRUCTURED_LINKED_TEST_KEYS);function looksLikeStructuredLinkedTestEntry(raw){return looksLikeStructuredKeyValueEntry(raw,STRUCTURED_LINKED_TEST_KEYS)}function normalizeStructuredLinkedTestEntry(kv,optionName){const normalizedKv={};const unknownKeys=[];for(const[key,value]of Object.entries(kv)){const normalizedKey=key.toLowerCase();if(!STRUCTURED_LINKED_TEST_KEY_SET.has(normalizedKey)){unknownKeys.push(key);continue}if(Object.hasOwn(normalizedKv,normalizedKey)){throw new PmCliError(`${optionName} provides key "${key}" more than once after case normalization`,EXIT_CODE.USAGE)}normalizedKv[normalizedKey]=value}if(unknownKeys.length>0){throw new PmCliError(`${optionName} does not recognize key${unknownKeys.length>1?"s":""} ${unknownKeys.map(key=>`"${key}"`).join(", ")}. Allowed keys: ${STRUCTURED_LINKED_TEST_KEYS.join(", ")}.`,EXIT_CODE.USAGE)}if(normalizedKv.cmd!==void 0){if(normalizedKv.command!==void 0&&normalizedKv.command.trim()!==normalizedKv.cmd.trim()){throw new PmCliError(`${optionName} command and cmd must match when both are provided`,EXIT_CODE.USAGE)}const{cmd,...rest}=normalizedKv;return{...rest,command:rest.command??cmd}}return normalizedKv}export{STRUCTURED_LINKED_TEST_KEYS,looksLikeStructuredLinkedTestEntry,normalizeStructuredLinkedTestEntry};
|
|
70
2
|
//# sourceMappingURL=entry.js.map
|
|
71
|
-
//# debugId=b29e4416-82ab-585c-9456-718e4699566d
|