@unbrained/pm-cli 2026.9.7 → 2026.9.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.agents/skills/pm-developer/SKILL.md +12 -4
- package/.agents/skills/pm-developer/references/MULTI_AGENT_MERGE.md +19 -10
- package/.agents/skills/pm-extensions/SKILL.md +6 -0
- package/.agents/skills/pm-sdk/SKILL.md +11 -2
- package/.agents/skills/pm-user/SKILL.md +5 -0
- package/.agents/skills/pm-user/references/ECOSYSTEM_PLANNING.md +95 -0
- package/.claude-plugin/marketplace.json +2 -2
- package/CHANGELOG.md +211 -181
- package/dist/cli/after-command-context-usage.js +1 -48
- package/dist/cli/argv-utils.js +1 -40
- package/dist/cli/bootstrap-args.js +1 -9
- package/dist/cli/bundle-integrity.js +2 -110
- package/dist/cli/commander-usage.js +11 -771
- package/dist/cli/commands/activity.js +1 -9
- package/dist/cli/commands/aggregate.js +1 -5
- package/dist/cli/commands/append.js +1 -5
- package/dist/cli/commands/claim.js +1 -5
- package/dist/cli/commands/close-many.js +1 -5
- package/dist/cli/commands/close.js +1 -9
- package/dist/cli/commands/comments.js +1 -5
- package/dist/cli/commands/config.js +1 -9
- package/dist/cli/commands/context.js +1 -9
- package/dist/cli/commands/contracts.js +1 -5
- package/dist/cli/commands/copy.js +1 -9
- package/dist/cli/commands/create.js +1 -9
- package/dist/cli/commands/delete.js +1 -9
- package/dist/cli/commands/deps.js +1 -9
- package/dist/cli/commands/docs.js +1 -9
- package/dist/cli/commands/duplicates.js +1 -9
- package/dist/cli/commands/eval.js +1 -9
- package/dist/cli/commands/extension/describe.js +1 -5
- package/dist/cli/commands/extension/scaffold.js +1 -5
- package/dist/cli/commands/extension/shared.js +1 -5
- package/dist/cli/commands/extension.js +1 -9
- package/dist/cli/commands/files.js +1 -9
- package/dist/cli/commands/focus.js +1 -9
- package/dist/cli/commands/gc.js +1 -9
- package/dist/cli/commands/get.js +1 -9
- package/dist/cli/commands/graph.js +1 -10
- package/dist/cli/commands/health.js +1 -9
- package/dist/cli/commands/history-compact.js +1 -10
- package/dist/cli/commands/history-redact.js +1 -11
- package/dist/cli/commands/history-repair.js +1 -10
- package/dist/cli/commands/history.js +1 -5
- package/dist/cli/commands/index.js +1 -58
- package/dist/cli/commands/init-agent-guidance.js +1 -9
- package/dist/cli/commands/init.js +1 -9
- package/dist/cli/commands/learnings.js +1 -5
- package/dist/cli/commands/lifecycle-transitions.js +1 -5
- package/dist/cli/commands/list.js +1 -9
- package/dist/cli/commands/merge.js +1 -11
- package/dist/cli/commands/next.js +1 -9
- package/dist/cli/commands/notes.js +1 -5
- package/dist/cli/commands/plan.js +1 -9
- package/dist/cli/commands/profile.js +1 -9
- package/dist/cli/commands/restore.js +1 -9
- package/dist/cli/commands/scheduling-shortcuts.js +1 -9
- package/dist/cli/commands/schema.js +1 -10
- package/dist/cli/commands/search.js +1 -9
- package/dist/cli/commands/stats.js +1 -9
- package/dist/cli/commands/telemetry.js +1 -9
- package/dist/cli/commands/test-all.js +1 -9
- package/dist/cli/commands/test-runs.js +1 -9
- package/dist/cli/commands/test.js +1 -9
- package/dist/cli/commands/update-many.js +1 -5
- package/dist/cli/commands/update.js +1 -9
- package/dist/cli/commands/upgrade.js +1 -5
- package/dist/cli/commands/validate.js +1 -15
- package/dist/cli/context-intent-invocation.js +1 -20
- package/dist/cli/description-stdin.js +1 -17
- package/dist/cli/error-guidance.js +1 -1353
- package/dist/cli/extension-command-help.js +5 -636
- package/dist/cli/extension-command-options.js +1 -427
- package/dist/cli/extension-recovery.js +1 -126
- package/dist/cli/help-content.js +2 -1001
- package/dist/cli/help-json-payload.js +4 -570
- package/dist/cli/main.d.ts +4 -0
- package/dist/cli/main.js +5 -2573
- package/dist/cli/migration-gates.js +1 -289
- package/dist/cli/public.js +1 -20
- package/dist/cli/register-annotations.js +1 -270
- package/dist/cli/register-assurance.js +1 -62
- package/dist/cli/register-files-lookup.js +1 -56
- package/dist/cli/register-history-activity.d.ts +8 -0
- package/dist/cli/register-history-activity.js +2 -0
- package/dist/cli/register-history-author.js +1 -38
- package/dist/cli/register-history-maintenance.d.ts +9 -0
- package/dist/cli/register-history-maintenance.js +2 -0
- package/dist/cli/register-list-query.js +10 -943
- package/dist/cli/register-mutation-options.js +1 -9
- package/dist/cli/register-mutation.js +19 -1893
- package/dist/cli/register-operations.js +1 -920
- package/dist/cli/register-setup.js +1 -716
- package/dist/cli/register-structured-mutation.js +1 -196
- package/dist/cli/registration-helpers.js +1 -5
- package/dist/cli/runtime-compatibility-boundary.js +4 -42
- package/dist/cli/schema-registration-helpers.js +1 -73
- package/dist/cli/search-refresh.js +1 -13
- package/dist/cli/stats-analytics-json.js +1 -68
- package/dist/cli/telemetry-flush.js +1 -10
- package/dist/cli-bundle/bundle-manifest.json +164 -156
- package/dist/cli-bundle/chunks/chunk-3BZZA6A3.js +5 -0
- package/dist/cli-bundle/chunks/chunk-AMRDVX36.js +235 -0
- package/dist/cli-bundle/chunks/chunk-DAM4CBBR.js +2202 -0
- package/dist/cli-bundle/chunks/{chunk-WYRZZ5ZE.js → chunk-DEZPZOQ7.js} +2 -2
- package/dist/cli-bundle/chunks/chunk-FLDWYEND.js +77 -0
- package/dist/cli-bundle/chunks/{chunk-NPN5I67J.js → chunk-G5ADGQ2D.js} +3 -3
- package/dist/cli-bundle/chunks/chunk-JAAEYHUA.js +2 -0
- package/dist/cli-bundle/chunks/{chunk-JX4DH4WC.js → chunk-KR3RP4FH.js} +3 -3
- package/dist/cli-bundle/chunks/chunk-LEZOUXG6.js +2 -0
- package/dist/cli-bundle/chunks/chunk-NSAPNEYH.js +2 -0
- package/dist/cli-bundle/chunks/chunk-QOEKOECV.js +29 -0
- package/dist/cli-bundle/chunks/chunk-RHSFOMHU.js +2 -0
- package/dist/cli-bundle/chunks/chunk-XOD2PCB6.js +20 -0
- package/dist/cli-bundle/chunks/{chunk-JT6XF6GE.js → chunk-YVEQ2AMO.js} +4 -4
- package/dist/cli-bundle/chunks/register-list-query-KSK3R63M.js +11 -0
- package/dist/cli-bundle/chunks/register-mutation-IQ5C7U6O.js +20 -0
- package/dist/cli-bundle/chunks/{register-operations-I5W3KMGB.js → register-operations-DWVHR2NC.js} +2 -2
- package/dist/cli-bundle/chunks/register-setup-BQ5SVD4B.js +2 -0
- package/dist/cli-bundle/focused-chunks/chunk-3WRPWLA7.js +3 -0
- package/dist/cli-bundle/focused-chunks/chunk-7MBUII7U.js +2 -0
- package/dist/cli-bundle/focused-chunks/chunk-COPBO5HW.js +8 -0
- package/dist/cli-bundle/focused-chunks/chunk-DUN4IXYN.js +20 -0
- package/dist/cli-bundle/focused-chunks/{chunk-LIJIA4TY.js → chunk-EE5QSM4Z.js} +3 -3
- package/dist/cli-bundle/focused-chunks/chunk-HJVARYM3.js +6 -0
- package/dist/cli-bundle/focused-chunks/chunk-IAUOUGVR.js +177 -0
- package/dist/cli-bundle/focused-chunks/chunk-KOOMJ54F.js +2 -0
- package/dist/cli-bundle/focused-chunks/chunk-MZDXX7JY.js +56 -0
- package/dist/cli-bundle/focused-chunks/{chunk-M6PBRFSH.js → chunk-OPFHFGDD.js} +2 -2
- package/dist/cli-bundle/focused-chunks/chunk-QHNETP77.js +9 -0
- package/dist/cli-bundle/focused-chunks/{chunk-3BZEOXLT.js → chunk-RMWES4M6.js} +2 -2
- package/dist/cli-bundle/focused-chunks/chunk-RXT4P5QH.js +10 -0
- package/dist/cli-bundle/focused-chunks/chunk-SDOL6FM2.js +12 -0
- package/dist/cli-bundle/focused-chunks/chunk-SQV4AAUC.js +2 -0
- package/dist/cli-bundle/focused-chunks/{chunk-PEFABF7E.js → chunk-WE3IUNIW.js} +3 -3
- package/dist/cli-bundle/focused-chunks/chunk-YALOUBWJ.js +2 -0
- package/dist/cli-bundle/main.js +20 -20
- package/dist/cli-bundle/sdk-authoring.js +1 -1
- package/dist/cli-bundle/sdk-contracts.js +2 -2
- package/dist/cli-bundle/sdk-core.js +29 -29
- package/dist/cli-bundle/sdk-governance.js +1 -1
- package/dist/cli-bundle/sdk-graph.js +1 -1
- package/dist/cli-bundle/sdk-merge.js +42 -42
- package/dist/cli-bundle/sdk-query.js +1 -1
- package/dist/cli-bundle/sdk-runtime.js +1 -1
- package/dist/cli-bundle/sdk-testing.js +1 -1
- package/dist/cli-bundle/sdk.js +11 -11
- package/dist/cli.js +1 -104
- package/dist/core/checkpoint/checkpoint-gc.js +1 -169
- package/dist/core/checkpoint/mutation-checkpoint.js +2 -133
- package/dist/core/config/nested-settings.js +1 -534
- package/dist/core/config/positional-value.js +1 -109
- package/dist/core/diagnostics/remediation.js +1 -506
- package/dist/core/extensions/activation-summary-markdown.js +2 -145
- package/dist/core/extensions/activation-summary.js +1 -92
- package/dist/core/extensions/activation-transaction.js +1 -46
- package/dist/core/extensions/capability-usage.js +1 -173
- package/dist/core/extensions/command-hook-context.js +1 -13
- package/dist/core/extensions/command-metadata-contract.js +1 -22
- package/dist/core/extensions/command-visibility-tier.js +1 -29
- package/dist/core/extensions/contribution-inventory.js +1 -173
- package/dist/core/extensions/exporter-output-contract.js +1 -66
- package/dist/core/extensions/extension-candidate.js +1 -18
- package/dist/core/extensions/extension-capability-aliases.js +1 -158
- package/dist/core/extensions/extension-hook-runtime.js +1 -699
- package/dist/core/extensions/extension-policy.js +1 -599
- package/dist/core/extensions/extension-registries.js +1 -62
- package/dist/core/extensions/extension-runtime-helpers.js +1 -33
- package/dist/core/extensions/extension-types.js +1 -102
- package/dist/core/extensions/flag-definition-validation.js +1 -52
- package/dist/core/extensions/flag-value-types.js +1 -64
- package/dist/core/extensions/index.js +1 -526
- package/dist/core/extensions/item-field-types.js +1 -39
- package/dist/core/extensions/item-fields.js +1 -261
- package/dist/core/extensions/loader.js +1 -2223
- package/dist/core/extensions/manifest-schema.js +1 -69
- package/dist/core/extensions/module-graph-snapshot.js +1 -33
- package/dist/core/extensions/preflight-ownership.js +1 -41
- package/dist/core/extensions/registration-validation.js +1 -82
- package/dist/core/extensions/registration-values.js +1 -209
- package/dist/core/extensions/reserved-host-flags.js +1 -36
- package/dist/core/extensions/runtime-registrations.js +1 -67
- package/dist/core/extensions/service-ownership.js +1 -19
- package/dist/core/extensions/version-compat.js +1 -216
- package/dist/core/fs/fs-utils.js +2 -158
- package/dist/core/fs/host-environment-errors.js +1 -141
- package/dist/core/fs/index.js +1 -9
- package/dist/core/fs/path-utils.js +1 -17
- package/dist/core/governance/content-fields.js +1 -160
- package/dist/core/governance/issue-codes.js +1 -151
- package/dist/core/governance/metadata-coverage.js +1 -358
- package/dist/core/history/drift-cache.js +3 -72
- package/dist/core/history/drift-scan.js +1 -342
- package/dist/core/history/event-classification.js +1 -109
- package/dist/core/history/event-index.js +8 -784
- package/dist/core/history/history-compact-bulk.js +1 -104
- package/dist/core/history/history-diff.js +1 -158
- package/dist/core/history/history-rewrite.d.ts +6 -1
- package/dist/core/history/history-rewrite.js +1 -107
- package/dist/core/history/history-storage-stats.js +1 -102
- package/dist/core/history/history-stream-policy.js +1 -62
- package/dist/core/history/history.js +2 -617
- package/dist/core/history/identity.js +1 -30
- package/dist/core/history/index.js +1 -9
- package/dist/core/history/projection.js +1 -196
- package/dist/core/history/read.d.ts +9 -0
- package/dist/core/history/read.js +1 -57
- package/dist/core/history/replay.js +2 -439
- package/dist/core/history/version-address.js +1 -32
- package/dist/core/history/workspace-history.js +2 -433
- package/dist/core/io/body-file.js +1 -62
- package/dist/core/io/bulk-ids-input.js +1 -112
- package/dist/core/item/actionability.js +1 -327
- package/dist/core/item/dependency-reference.js +1 -20
- package/dist/core/item/id.js +1 -112
- package/dist/core/item/index.js +1 -12
- package/dist/core/item/item-format-version.js +1 -78
- package/dist/core/item/item-format.js +5 -1473
- package/dist/core/item/item-record.js +1 -23
- package/dist/core/item/item-type-definition.js +1 -133
- package/dist/core/item/parent-reference-policy.js +1 -57
- package/dist/core/item/parse.js +2 -603
- package/dist/core/item/plan-lifecycle.js +1 -19
- package/dist/core/item/priority.js +1 -61
- package/dist/core/item/sprint-release-format.js +1 -38
- package/dist/core/item/status-filter.js +1 -115
- package/dist/core/item/status.js +1 -43
- package/dist/core/item/toon-decode.js +1 -29
- package/dist/core/item/type-registry.js +1 -715
- package/dist/core/item/type-synonyms.js +1 -38
- package/dist/core/lock/index.js +1 -9
- package/dist/core/lock/lock-gc.js +1 -240
- package/dist/core/lock/lock.js +3 -590
- package/dist/core/output/mutation-projection.js +1 -217
- package/dist/core/output/output-control.js +1 -25
- package/dist/core/output/output.js +11 -494
- package/dist/core/output/query-summary.js +1 -58
- package/dist/core/output/tabular.js +1 -77
- package/dist/core/packages/manifest.js +1 -244
- package/dist/core/packages/root.js +1 -84
- package/dist/core/profile/profile-describe.js +1 -83
- package/dist/core/profile/profile-lint.js +1 -415
- package/dist/core/profile/profile-plan.js +0 -0
- package/dist/core/profile/profile-presets.js +1 -370
- package/dist/core/reproducibility/context.js +1 -82
- package/dist/core/schema/fields-file.js +2 -288
- package/dist/core/schema/item-types-file.js +2 -296
- package/dist/core/schema/runtime-field-filters.js +1 -49
- package/dist/core/schema/runtime-field-values.js +1 -313
- package/dist/core/schema/runtime-schema.js +2 -826
- package/dist/core/schema/status-defs-file.js +2 -227
- package/dist/core/schema/status-token.js +1 -31
- package/dist/core/schema/type-inference.js +1 -95
- package/dist/core/schema/type-presets.js +1 -87
- package/dist/core/schema/type-workflows.js +1 -104
- package/dist/core/search/background-refresh.js +2 -286
- package/dist/core/search/bm25.js +1 -146
- package/dist/core/search/cache.js +2 -534
- package/dist/core/search/corpus.js +1 -311
- package/dist/core/search/embedding-batches.js +1 -163
- package/dist/core/search/eval.js +1 -225
- package/dist/core/search/http-client.js +1 -75
- package/dist/core/search/providers.js +1 -242
- package/dist/core/search/relevance.js +1 -244
- package/dist/core/search/semantic-defaults.js +1 -199
- package/dist/core/search/staleness.js +1 -30
- package/dist/core/search/vector-stores.js +2 -664
- package/dist/core/search/vectorization-metadata.js +1 -81
- package/dist/core/sentry/helpers.js +1 -272
- package/dist/core/sentry/instrument.js +1 -387
- package/dist/core/session/session-state.js +1 -260
- package/dist/core/shared/agent-session-context.js +1 -133
- package/dist/core/shared/author.js +1 -1172
- package/dist/core/shared/command-types.js +1 -4
- package/dist/core/shared/conflict-markers.js +1 -31
- package/dist/core/shared/constants.js +1 -405
- package/dist/core/shared/errors.js +1 -20
- package/dist/core/shared/html-entity-decode.js +1 -131
- package/dist/core/shared/index.js +1 -12
- package/dist/core/shared/item-metadata-contract.js +1 -89
- package/dist/core/shared/lazy-module.js +1 -16
- package/dist/core/shared/levenshtein.js +1 -61
- package/dist/core/shared/memo.js +1 -19
- package/dist/core/shared/numeric-parsers.js +1 -20
- package/dist/core/shared/option-alias-visibility.js +1 -67
- package/dist/core/shared/primitives.js +1 -127
- package/dist/core/shared/serial-queue.js +1 -79
- package/dist/core/shared/serialization.js +1 -210
- package/dist/core/shared/split-comma-list.js +1 -30
- package/dist/core/shared/text-normalization.js +1 -38
- package/dist/core/shared/time.js +1 -306
- package/dist/core/store/index.js +1 -12
- package/dist/core/store/item-format-migration.js +1 -125
- package/dist/core/store/item-metadata-cache.js +1 -1116
- package/dist/core/store/item-metadata-query-index.js +9 -394
- package/dist/core/store/item-metadata-read-work.js +1 -43
- package/dist/core/store/item-store.js +1 -693
- package/dist/core/store/paths.d.ts +1 -1
- package/dist/core/store/paths.js +1 -214
- package/dist/core/store/settings-read-cache.js +1 -85
- package/dist/core/store/settings-validator.js +1 -421
- package/dist/core/store/settings.js +3 -1309
- package/dist/core/store/tracker-preflight.js +1 -141
- package/dist/core/telemetry/consent.js +5 -108
- package/dist/core/telemetry/observability.js +1 -246
- package/dist/core/telemetry/runtime.js +4 -1988
- package/dist/core/test/background-runs.js +4 -945
- package/dist/core/test/item-test-run-tracking.js +1 -63
- package/dist/core/test/run-selectors.js +1 -120
- package/dist/core/validate/estimate-defaults.js +1 -89
- package/dist/core/validate/fix-planning.js +1 -189
- package/dist/core/validate/linked-artifact-reference.js +1 -36
- package/dist/core/validate/missing-by-type.js +1 -34
- package/dist/core/validate/missing-link-owners.js +1 -95
- package/dist/core/validate/stale-file-classification.js +1 -82
- package/dist/mcp/http-server.js +5 -448
- package/dist/mcp/legacy-adapter.js +1 -77
- package/dist/mcp/runtime-capabilities.js +1 -200
- package/dist/mcp/server.js +4 -1233
- package/dist/mcp/tool-definitions.js +1 -804
- package/dist/sdk/actionability.js +1 -13
- package/dist/sdk/agent/closed-domain-contracts.js +1 -161
- package/dist/sdk/agent/command-recovery.js +1 -59
- package/dist/sdk/agent/command-suggestions.js +1 -66
- package/dist/sdk/agent/create-option-policy.js +1 -31
- package/dist/sdk/agent/identity-config.js +1 -106
- package/dist/sdk/agent/item-addressing.js +1 -207
- package/dist/sdk/agent/refusal-closure-census.js +1 -151
- package/dist/sdk/agent/refusal-closure.js +1 -133
- package/dist/sdk/agent/refusal-corpus-contracts.js +1 -193
- package/dist/sdk/agent/refusal-reachability.js +1 -593
- package/dist/sdk/agent/subcommand-recovery.js +1 -83
- package/dist/sdk/agent/task-transcript-contracts.js +1 -197
- package/dist/sdk/agent/tracker-preflight-contracts.js +1 -126
- package/dist/sdk/agent-capability-contracts.js +1 -428
- package/dist/sdk/agent-session-context.js +1 -9
- package/dist/sdk/annotations.js +1 -448
- package/dist/sdk/author-attribution.js +1 -468
- package/dist/sdk/authoring.js +1 -20
- package/dist/sdk/cli-bootstrap.js +1 -838
- package/dist/sdk/cli-contracts/agent-output-contracts.d.ts +1 -1
- package/dist/sdk/cli-contracts/agent-output-contracts.js +4 -476
- package/dist/sdk/cli-contracts/bootstrap-command-scanner.js +1 -79
- package/dist/sdk/cli-contracts/command-aliases.d.ts +4 -0
- package/dist/sdk/cli-contracts/command-aliases.js +1 -107
- package/dist/sdk/cli-contracts/command-exit-contracts.js +1 -151
- package/dist/sdk/cli-contracts/commander-mutation-options.js +1 -1081
- package/dist/sdk/cli-contracts/commander-types.js +1 -159
- package/dist/sdk/cli-contracts/completeness.js +1 -393
- package/dist/sdk/cli-contracts/enum-contracts.js +1 -222
- package/dist/sdk/cli-contracts/flag-contracts.js +1 -1947
- package/dist/sdk/cli-contracts/flag-lexicon-contracts.js +1 -347
- package/dist/sdk/cli-contracts/grammar-contracts.js +1 -986
- package/dist/sdk/cli-contracts/registration-helpers.js +7 -990
- package/dist/sdk/cli-contracts/runtime-contracts.d.ts +5 -0
- package/dist/sdk/cli-contracts/runtime-contracts.js +1 -2090
- package/dist/sdk/cli-contracts/schemas/assurance-definition.js +1 -324
- package/dist/sdk/cli-contracts/string-lists.js +1 -16
- package/dist/sdk/cli-contracts/tool-option-contracts.js +1 -461
- package/dist/sdk/cli-contracts/tool-parameter-tables.js +1 -2167
- package/dist/sdk/cli-contracts/tool-schema.d.ts +3 -1
- package/dist/sdk/cli-contracts/tool-schema.js +1 -1664
- package/dist/sdk/cli-contracts/typed-action-inputs.js +1 -4
- package/dist/sdk/cli-contracts.d.ts +1 -1
- package/dist/sdk/cli-contracts.js +1 -17
- package/dist/sdk/cli-program.js +1 -49
- package/dist/sdk/command-line.d.ts +2 -5
- package/dist/sdk/command-line.js +1 -78
- package/dist/sdk/comments.js +1 -133
- package/dist/sdk/compile-cache.js +1 -73
- package/dist/sdk/completion.js +157 -837
- package/dist/sdk/compose.js +1 -1090
- package/dist/sdk/config.js +1 -1204
- package/dist/sdk/context/recency.js +1 -33
- package/dist/sdk/context/semantic-session-attribution.js +1 -82
- package/dist/sdk/context/usage-egress.js +1 -29
- package/dist/sdk/context/usage-ledger.js +3 -185
- package/dist/sdk/context-intent-contracts.js +1 -709
- package/dist/sdk/context-intent-runtime.js +1 -115
- package/dist/sdk/context-packing.js +1 -218
- package/dist/sdk/context-relevance.js +1 -503
- package/dist/sdk/context-signal-store.js +2 -426
- package/dist/sdk/context-usage.js +1 -367
- package/dist/sdk/contracts.js +1 -23
- package/dist/sdk/core-governance.js +1 -14
- package/dist/sdk/core.js +1 -14
- package/dist/sdk/corpus-shape.js +1 -401
- package/dist/sdk/define.js +1 -220
- package/dist/sdk/dependencies.js +1 -718
- package/dist/sdk/dependency-flag-validation.js +1 -156
- package/dist/sdk/dependency-provenance.js +1 -135
- package/dist/sdk/docs.js +1 -14
- package/dist/sdk/duplicates.js +1 -40
- package/dist/sdk/environment/agent-environment.js +1 -466
- package/dist/sdk/environment/host-environment-errors.js +1 -8
- package/dist/sdk/environment/project-runtime-compatibility.js +1 -481
- package/dist/sdk/environment/source-context.js +1 -28
- package/dist/sdk/environment/tracker-preflight.js +1 -9
- package/dist/sdk/error-code-catalog.js +1 -153
- package/dist/sdk/error-runtime.js +1 -58
- package/dist/sdk/errors.js +1 -58
- package/dist/sdk/eval.js +1 -190
- package/dist/sdk/extension/author-manifest.js +1 -92
- package/dist/sdk/extension/bundled-catalog.js +1 -332
- package/dist/sdk/extension/concurrency.js +1 -25
- package/dist/sdk/extension/copy-scope.d.ts +2 -0
- package/dist/sdk/extension/copy-scope.js +2 -0
- package/dist/sdk/extension/custom-field-collisions.js +1 -30
- package/dist/sdk/extension/describe.js +3 -189
- package/dist/sdk/extension/doctor.js +1 -606
- package/dist/sdk/extension/install-plan.d.ts +69 -0
- package/dist/sdk/extension/install-plan.js +2 -0
- package/dist/sdk/extension/install-receipts.d.ts +7 -0
- package/dist/sdk/extension/install-receipts.js +2 -0
- package/dist/sdk/extension/install-runtime.js +3 -313
- package/dist/sdk/extension/install-snapshot.js +1 -66
- package/dist/sdk/extension/install-sources.js +5 -1057
- package/dist/sdk/extension/managed-state.js +2 -252
- package/dist/sdk/extension/migrations.js +2 -174
- package/dist/sdk/extension/output-ownership.js +1 -25
- package/dist/sdk/extension/runtime-summary.js +1 -18
- package/dist/sdk/extension/scaffold.js +4 -2308
- package/dist/sdk/extension/shared.js +1 -147
- package/dist/sdk/extension/source-resolution.js +1 -65
- package/dist/sdk/extension/update-check.js +1 -67
- package/dist/sdk/extension-command-context.js +1 -44
- package/dist/sdk/extension-contracts.js +1 -73
- package/dist/sdk/extension.d.ts +7 -2
- package/dist/sdk/extension.js +1 -2196
- package/dist/sdk/files.js +1 -535
- package/dist/sdk/flag-invocation-contracts.d.ts +0 -5
- package/dist/sdk/flag-invocation-contracts.js +1 -344
- package/dist/sdk/generated/generated-error-code-catalog-part-1.js +1 -2224
- package/dist/sdk/generated/generated-error-code-catalog-part-2.js +1 -2236
- package/dist/sdk/generated-error-code-catalog.js +1 -16
- package/dist/sdk/governance/assurance-action-contracts.js +1 -4
- package/dist/sdk/governance/assurance-action.js +1 -411
- package/dist/sdk/governance/assurance-limits.js +1 -10
- package/dist/sdk/governance/assurance-mutation-error.js +1 -81
- package/dist/sdk/governance/assurance-presets.js +1 -135
- package/dist/sdk/governance/assurance-runtime.js +1 -238
- package/dist/sdk/governance/assurance.js +4 -1182
- package/dist/sdk/governance/boundary-fixtures.js +1 -200
- package/dist/sdk/governance/coverage-assurance.js +1 -60
- package/dist/sdk/governance/defect-recurrence-coverage.js +1 -188
- package/dist/sdk/governance/defect-recurrence-graph.js +1 -120
- package/dist/sdk/governance/defect-recurrence-signals.js +1 -24
- package/dist/sdk/governance/defect-recurrence.js +1 -623
- package/dist/sdk/governance/extension-host-version.js +1 -115
- package/dist/sdk/governance/gc.js +1 -368
- package/dist/sdk/governance/health.js +1 -2367
- package/dist/sdk/governance/hierarchy-validation.js +1 -108
- package/dist/sdk/governance/linked-file-report.js +1 -71
- package/dist/sdk/governance/merge-receipt-history.js +1 -206
- package/dist/sdk/governance/provenance-health.js +1 -282
- package/dist/sdk/governance/reindex.js +4 -761
- package/dist/sdk/governance/stale-work.js +1 -82
- package/dist/sdk/governance/status-role-diagnostics.js +1 -35
- package/dist/sdk/governance/storage-integrity.js +1 -280
- package/dist/sdk/governance/tracked-runtime-cache.js +1 -106
- package/dist/sdk/governance/upgrade.js +2 -327
- package/dist/sdk/governance/validate-history-drift.js +1 -81
- package/dist/sdk/governance/validate-item-reader.js +1 -17
- package/dist/sdk/governance/validate-normalization.js +1 -36
- package/dist/sdk/governance/validate.js +1 -2261
- package/dist/sdk/governance/workspace-position.js +1 -163
- package/dist/sdk/governance.d.ts +1 -0
- package/dist/sdk/governance.js +1 -31
- package/dist/sdk/graph/adapter.js +1 -181
- package/dist/sdk/graph/analytics.js +1 -474
- package/dist/sdk/graph/assembly.js +1 -377
- package/dist/sdk/graph/cache.js +1 -160
- package/dist/sdk/graph/centrality.js +1 -258
- package/dist/sdk/graph/conformance.js +1 -130
- package/dist/sdk/graph/deadline-scheduling.d.ts +90 -0
- package/dist/sdk/graph/deadline-scheduling.js +2 -0
- package/dist/sdk/graph/durable-cache.d.ts +1 -1
- package/dist/sdk/graph/durable-cache.js +1 -361
- package/dist/sdk/graph/governance-contracts.js +1 -34
- package/dist/sdk/graph/governance.d.ts +13 -1
- package/dist/sdk/graph/governance.js +1 -735
- package/dist/sdk/graph/hierarchy-integrity.js +1 -310
- package/dist/sdk/graph/index.d.ts +3 -2
- package/dist/sdk/graph/index.js +1 -26
- package/dist/sdk/graph/lifecycle-coverage.d.ts +32 -0
- package/dist/sdk/graph/lifecycle-coverage.js +2 -0
- package/dist/sdk/graph/mutation-advisory.js +1 -176
- package/dist/sdk/graph/remediation.js +1 -197
- package/dist/sdk/graph/run.d.ts +15 -1
- package/dist/sdk/graph/run.js +1 -768
- package/dist/sdk/graph/scheduling.js +1 -124
- package/dist/sdk/graph/traversal.js +1 -284
- package/dist/sdk/graph/workspace-relationship-kind-registry.js +1 -27
- package/dist/sdk/graph.js +1 -15
- package/dist/sdk/guide-topics.js +1 -707
- package/dist/sdk/guide.js +1 -279
- package/dist/sdk/history/maintenance.d.ts +71 -0
- package/dist/sdk/history/maintenance.js +2 -0
- package/dist/sdk/history/salvage.js +2 -247
- package/dist/sdk/history/subject.d.ts +19 -0
- package/dist/sdk/history/subject.js +2 -0
- package/dist/sdk/history-analytics.js +1 -282
- package/dist/sdk/history-compact.js +1 -527
- package/dist/sdk/history-mcp.js +1 -68
- package/dist/sdk/history-provenance.js +1 -182
- package/dist/sdk/history-read.js +1 -96
- package/dist/sdk/history-redact.d.ts +1 -14
- package/dist/sdk/history-redact.js +1 -643
- package/dist/sdk/history-repair.d.ts +5 -0
- package/dist/sdk/history-repair.js +1 -657
- package/dist/sdk/improvement-ledger-validation.js +1 -62
- package/dist/sdk/improvement-ledger.js +2 -257
- package/dist/sdk/index.d.ts +4 -0
- package/dist/sdk/index.js +1 -183
- package/dist/sdk/init-agent-guidance.js +2 -496
- package/dist/sdk/init.js +2 -820
- package/dist/sdk/invocation-author.js +1 -39
- package/dist/sdk/item-children.js +1 -90
- package/dist/sdk/item-metadata-index.js +1 -15
- package/dist/sdk/item-schedule.js +1 -27
- package/dist/sdk/item-transaction.js +1 -396
- package/dist/sdk/learnings.js +1 -29
- package/dist/sdk/lifecycle/append.js +2 -53
- package/dist/sdk/lifecycle/claim.d.ts +2 -0
- package/dist/sdk/lifecycle/claim.js +1 -242
- package/dist/sdk/lifecycle/close-many.js +1 -438
- package/dist/sdk/lifecycle/close.js +1 -468
- package/dist/sdk/lifecycle/copy.js +1 -212
- package/dist/sdk/lifecycle/create.js +1 -1949
- package/dist/sdk/lifecycle/delete.js +1 -45
- package/dist/sdk/lifecycle/event-validation-messages.js +1 -91
- package/dist/sdk/lifecycle/focus.js +1 -91
- package/dist/sdk/lifecycle/hierarchy-mutation-lock.js +1 -24
- package/dist/sdk/lifecycle/legacy-none-tokens.js +1 -149
- package/dist/sdk/lifecycle/lifecycle-transitions.js +1 -40
- package/dist/sdk/lifecycle/mcp-actions.d.ts +2 -0
- package/dist/sdk/lifecycle/mcp-actions.js +1 -51
- package/dist/sdk/lifecycle/metadata-normalizers.js +1 -46
- package/dist/sdk/lifecycle/mutation-command-options.js +1 -9
- package/dist/sdk/lifecycle/plan.js +1 -1606
- package/dist/sdk/lifecycle/recurrence-parsers.js +1 -147
- package/dist/sdk/lifecycle/reopen.js +1 -68
- package/dist/sdk/lifecycle/repeatable-metadata-parsers.js +1 -143
- package/dist/sdk/lifecycle/restore.d.ts +1 -0
- package/dist/sdk/lifecycle/restore.js +1 -330
- package/dist/sdk/lifecycle/shared-unset-fields.js +1 -295
- package/dist/sdk/lifecycle/update-many.js +1 -861
- package/dist/sdk/lifecycle/update.js +1 -2136
- package/dist/sdk/lifecycle-completion.js +1 -92
- package/dist/sdk/lifecycle-policy.js +1 -120
- package/dist/sdk/linked-artifacts.js +1 -530
- package/dist/sdk/mcp/apps.js +4 -133
- package/dist/sdk/mcp/authorization.js +1 -404
- package/dist/sdk/mcp/discovery.js +1 -494
- package/dist/sdk/mcp/interactions.js +1 -336
- package/dist/sdk/mcp/protocol.d.ts +7 -0
- package/dist/sdk/mcp/protocol.js +1 -184
- package/dist/sdk/mcp/skills.js +1 -389
- package/dist/sdk/mcp/subscriptions.js +1 -211
- package/dist/sdk/mcp/tasks.js +2 -430
- package/dist/sdk/mcp/transport.js +1 -260
- package/dist/sdk/merge/abandoned-receipts.js +1 -46
- package/dist/sdk/merge/driver.js +1 -212
- package/dist/sdk/merge/index.js +1 -16
- package/dist/sdk/merge/install.js +3 -561
- package/dist/sdk/merge/receipt-file-boundary.js +1 -46
- package/dist/sdk/merge/receipt-operation.js +1 -96
- package/dist/sdk/merge/receipt-schema.js +1 -397
- package/dist/sdk/merge/receipts.js +4 -525
- package/dist/sdk/merge/reconcile.js +1 -352
- package/dist/sdk/merge/three-way.js +3 -775
- package/dist/sdk/merge.js +1 -10
- package/dist/sdk/mutation-events.js +1 -292
- package/dist/sdk/mutation-guard.js +1 -216
- package/dist/sdk/notes.js +1 -139
- package/dist/sdk/output-contracts.js +1 -172
- package/dist/sdk/output-projection.js +1 -430
- package/dist/sdk/output-token-accounting.js +1 -140
- package/dist/sdk/output.js +1 -64
- package/dist/sdk/ownership-source.js +1 -21
- package/dist/sdk/package-import-adapters.js +1 -442
- package/dist/sdk/package-migrations.js +1 -20
- package/dist/sdk/package-runtime-options.js +1 -80
- package/dist/sdk/pagination.js +1 -162
- package/dist/sdk/profile.js +1 -454
- package/dist/sdk/provenance.js +1 -258
- package/dist/sdk/public-surface.json +1 -1
- package/dist/sdk/query/activity.js +1 -401
- package/dist/sdk/query/aggregate.d.ts +16 -0
- package/dist/sdk/query/aggregate.js +1 -390
- package/dist/sdk/query/calendar.js +1 -964
- package/dist/sdk/query/complete-list.js +1 -215
- package/dist/sdk/query/context.js +1 -1702
- package/dist/sdk/query/duplicate-candidates.js +1 -70
- package/dist/sdk/query/get.js +1 -450
- package/dist/sdk/query/history.js +1 -186
- package/dist/sdk/query/item-filter-options.js +1 -9
- package/dist/sdk/query/light-metadata.js +1 -18
- package/dist/sdk/query/list-filter-shared.js +1 -81
- package/dist/sdk/query/list.js +1 -1304
- package/dist/sdk/query/multi-value-filters.js +1 -78
- package/dist/sdk/query/next.js +1 -513
- package/dist/sdk/query/parsers.js +1 -44
- package/dist/sdk/query/projection-contracts.js +1 -184
- package/dist/sdk/query/search-contracts.js +1 -230
- package/dist/sdk/query/search-pagination.js +1 -35
- package/dist/sdk/query/search-rendering.js +1 -105
- package/dist/sdk/query/search.js +2 -1987
- package/dist/sdk/query.js +1 -35
- package/dist/sdk/read-output/continuation.js +1 -194
- package/dist/sdk/read-output-budget.js +1 -135
- package/dist/sdk/read-output-contracts.js +1 -1225
- package/dist/sdk/read-output-rows.js +1 -186
- package/dist/sdk/read-output-session.js +1 -208
- package/dist/sdk/relationship-analytics.js +1 -410
- package/dist/sdk/relationship-context.js +1 -284
- package/dist/sdk/relationship-history.js +4 -519
- package/dist/sdk/relationship-kinds/contract.js +1 -22
- package/dist/sdk/relationship-migration.js +1 -77
- package/dist/sdk/relationships.js +1 -579
- package/dist/sdk/reproducibility/process.js +1 -87
- package/dist/sdk/runtime-action-aliases.js +1 -59
- package/dist/sdk/runtime-extended-actions.js +1 -177
- package/dist/sdk/runtime-input.js +1 -614
- package/dist/sdk/runtime-primitives.js +1 -84
- package/dist/sdk/runtime-public-contracts.js +1 -4
- package/dist/sdk/runtime-stats-options.js +1 -38
- package/dist/sdk/runtime.js +1 -1928
- package/dist/sdk/scheduling-shortcuts.js +1 -63
- package/dist/sdk/schema-migration.js +3 -856
- package/dist/sdk/schema.js +1 -1376
- package/dist/sdk/search-refresh-worker.js +1 -18
- package/dist/sdk/similarity-scoring.js +1 -53
- package/dist/sdk/similarity.js +1 -326
- package/dist/sdk/start-task-status.js +1 -14
- package/dist/sdk/stats.js +1 -270
- package/dist/sdk/structured-mutations.js +1 -580
- package/dist/sdk/telemetry-flush.js +1 -13
- package/dist/sdk/telemetry.js +1 -405
- package/dist/sdk/templates.js +2 -292
- package/dist/sdk/test/batch.js +2 -509
- package/dist/sdk/test/entry.js +1 -70
- package/dist/sdk/test/execution.js +6 -2211
- package/dist/sdk/test/linked-command-detection.js +1 -546
- package/dist/sdk/test/measurements.js +1 -91
- package/dist/sdk/test/parsers.js +1 -545
- package/dist/sdk/test/runs.js +1 -193
- package/dist/sdk/test/trust.js +2 -206
- package/dist/sdk/testing.js +4 -1391
- package/dist/sdk/traceability/runtime-files-lookup.js +1 -32
- package/dist/sdk/traceability/source-traceability.js +1 -292
- package/dist/sdk/tracker-root-discovery.js +1 -9
- package/dist/sdk/workspace-contracts-cache.js +1 -28
- package/dist/sdk/workspace-contracts.js +1 -33
- package/dist/sdk/workspace-memory.js +2 -318
- package/dist/sdk/workspace-recipe.js +1 -71
- package/dist/sdk/workspace-snapshot.js +4 -613
- package/dist/sdk/workspace-transaction-gc.js +1 -149
- package/dist/sdk/workspace-transaction.js +2 -363
- package/dist/sdk/workspace.js +3 -127
- package/dist/types/index.js +1 -9
- package/dist/types.js +1 -245
- package/docs/AGENT_GUIDE.md +1 -1
- package/docs/CONTEXT_ALGORITHM_PORTFOLIO.md +167 -0
- package/docs/DIAGNOSTIC_OUTPUT_CONTRACTS.md +9 -3
- package/docs/EXTENSIONS.md +1 -0
- package/docs/HISTORY_MAINTENANCE.md +125 -0
- package/docs/MCP_2026_07_28_CONFORMANCE.md +20 -10
- package/docs/PACKAGE_EVIDENCE.md +92 -0
- package/docs/PLANNING_MEASUREMENTS.md +183 -0
- package/docs/README.md +3 -0
- package/docs/SCRIPTING.md +21 -0
- package/docs/TESTING.md +23 -0
- package/docs/generated/FLAG_LEXICON_BUDGETS.md +5 -5
- package/docs/generated/REFUSAL_CLOSURE_CENSUS.md +2 -2
- package/marketplace.json +2 -2
- package/package.json +1 -1
- package/packages/pm-beads/package.json +1 -1
- package/packages/pm-calendar/package.json +1 -1
- package/packages/pm-command-kit/package.json +1 -1
- package/packages/pm-digital-twin/package.json +1 -1
- package/packages/pm-governance-audit/package.json +1 -1
- package/packages/pm-guide-shell/package.json +1 -1
- package/packages/pm-kanban/package.json +1 -1
- package/packages/pm-lifecycle-hooks/package.json +1 -1
- package/packages/pm-linked-test-adapters/package.json +1 -1
- package/packages/pm-search-advanced/package.json +1 -1
- package/packages/pm-templates/package.json +1 -1
- package/packages/pm-todos/package.json +1 -1
- package/packages/pm-vcs/package.json +1 -1
- package/plugins/pm-claude/.claude-plugin/plugin.json +1 -1
- package/plugins/pm-codex/.codex-plugin/plugin.json +1 -1
- package/scripts/finalize-build.mjs +45 -3
- package/dist/cli-bundle/chunks/chunk-AZDFJGH6.js +0 -9
- package/dist/cli-bundle/chunks/chunk-BAX2BYUW.js +0 -2111
- package/dist/cli-bundle/chunks/chunk-CKOL5U7J.js +0 -77
- package/dist/cli-bundle/chunks/chunk-OF76PSDQ.js +0 -5
- package/dist/cli-bundle/chunks/chunk-QUWFABDM.js +0 -232
- package/dist/cli-bundle/chunks/chunk-QWRRFYK3.js +0 -2
- package/dist/cli-bundle/chunks/chunk-RWWBOWJ5.js +0 -2
- package/dist/cli-bundle/chunks/chunk-WGAOYSYH.js +0 -40
- package/dist/cli-bundle/chunks/chunk-WI2AYPA7.js +0 -2
- package/dist/cli-bundle/chunks/register-list-query-5JL52D33.js +0 -11
- package/dist/cli-bundle/chunks/register-mutation-ZPG7KMVP.js +0 -20
- package/dist/cli-bundle/chunks/register-setup-H4SVAVX7.js +0 -2
- package/dist/cli-bundle/focused-chunks/chunk-AL5ON6K6.js +0 -2
- package/dist/cli-bundle/focused-chunks/chunk-CHC2IDXA.js +0 -6
- package/dist/cli-bundle/focused-chunks/chunk-CK6QFAPZ.js +0 -20
- package/dist/cli-bundle/focused-chunks/chunk-EZR3GHFE.js +0 -2
- package/dist/cli-bundle/focused-chunks/chunk-H2WJWK7L.js +0 -56
- package/dist/cli-bundle/focused-chunks/chunk-NTPY5GSO.js +0 -3
- package/dist/cli-bundle/focused-chunks/chunk-P5O7MP5Y.js +0 -2
- package/dist/cli-bundle/focused-chunks/chunk-PDMW2E36.js +0 -177
- package/dist/cli-bundle/focused-chunks/chunk-QTVCLMSZ.js +0 -6
- package/dist/cli-bundle/focused-chunks/chunk-QTZRBUYA.js +0 -8
- package/dist/cli-bundle/focused-chunks/chunk-SGQST3PQ.js +0 -12
- package/dist/cli-bundle/focused-chunks/chunk-UKHASMMP.js +0 -10
- package/dist/cli-bundle/focused-chunks/chunk-ZPEKQHOC.js +0 -2
|
@@ -1,716 +1,2 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @module core/item/type-registry
|
|
3
|
-
*
|
|
4
|
-
* Defines item parsing, formatting, and lifecycle helpers for Type Registry.
|
|
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]="506efdc7-b04e-5023-ab59-57ede87558f9")}catch(e){}}();
|
|
8
|
-
import path from "node:path";
|
|
9
|
-
import { TYPE_TO_FOLDER } from "../shared/constants.js";
|
|
10
|
-
import { ITEM_TYPE_VALUES } from "../../types/index.js";
|
|
11
|
-
import { normalizeItemTypeDefinition as normalizeSharedItemTypeDefinition, normalizeItemTypeStringList, strictPolicyCommand, parseItemExecutionRole, } from "./item-type-definition.js";
|
|
12
|
-
/** Default dispatch roles for built-in types whose work requires human input or outcome verification. Custom definitions can override these through the same registry. */
|
|
13
|
-
export const BUILTIN_ITEM_EXECUTION_ROLES = Object.freeze({ decision: "human", milestone: "gate" });
|
|
14
|
-
/** Fallback required create fields used when callers do not provide an override. */
|
|
15
|
-
export const DEFAULT_REQUIRED_CREATE_FIELDS = [
|
|
16
|
-
"title",
|
|
17
|
-
"description",
|
|
18
|
-
"status",
|
|
19
|
-
"priority",
|
|
20
|
-
"tags",
|
|
21
|
-
"body",
|
|
22
|
-
"deadline",
|
|
23
|
-
"estimatedMinutes",
|
|
24
|
-
"acceptanceCriteria",
|
|
25
|
-
"author",
|
|
26
|
-
"message",
|
|
27
|
-
"assignee",
|
|
28
|
-
];
|
|
29
|
-
/** Fallback required create repeatables used when callers do not provide an override. */
|
|
30
|
-
export const DEFAULT_REQUIRED_CREATE_REPEATABLES = [
|
|
31
|
-
"dep",
|
|
32
|
-
"comment",
|
|
33
|
-
"note",
|
|
34
|
-
"learning",
|
|
35
|
-
"file",
|
|
36
|
-
"test",
|
|
37
|
-
"doc",
|
|
38
|
-
];
|
|
39
|
-
// Keep aligned with cli/commands/shared-unset-fields.ts. This core registry
|
|
40
|
-
// cannot import CLI unset metadata without creating a core -> CLI dependency.
|
|
41
|
-
/** Public contract for common mutation command option keys, shared by SDK and presentation-layer consumers. */
|
|
42
|
-
export const COMMON_MUTATION_COMMAND_OPTION_KEYS = [
|
|
43
|
-
"deadline",
|
|
44
|
-
"estimatedMinutes",
|
|
45
|
-
"acceptanceCriteria",
|
|
46
|
-
"definitionOfReady",
|
|
47
|
-
"order",
|
|
48
|
-
"goal",
|
|
49
|
-
"objective",
|
|
50
|
-
"value",
|
|
51
|
-
"impact",
|
|
52
|
-
"outcome",
|
|
53
|
-
"whyNow",
|
|
54
|
-
"assignee",
|
|
55
|
-
"parent",
|
|
56
|
-
"reviewer",
|
|
57
|
-
"risk",
|
|
58
|
-
"confidence",
|
|
59
|
-
"sprint",
|
|
60
|
-
"release",
|
|
61
|
-
"blockedBy",
|
|
62
|
-
"blockedReason",
|
|
63
|
-
"unblockNote",
|
|
64
|
-
"reporter",
|
|
65
|
-
"severity",
|
|
66
|
-
"environment",
|
|
67
|
-
"reproSteps",
|
|
68
|
-
"resolution",
|
|
69
|
-
"expectedResult",
|
|
70
|
-
"actualResult",
|
|
71
|
-
"affectedVersion",
|
|
72
|
-
"fixedVersion",
|
|
73
|
-
"component",
|
|
74
|
-
"regression",
|
|
75
|
-
"customerImpact",
|
|
76
|
-
];
|
|
77
|
-
const CREATE_COMMAND_OPTION_KEYS = [
|
|
78
|
-
"title",
|
|
79
|
-
"description",
|
|
80
|
-
"type",
|
|
81
|
-
"status",
|
|
82
|
-
"priority",
|
|
83
|
-
"tags",
|
|
84
|
-
"body",
|
|
85
|
-
...COMMON_MUTATION_COMMAND_OPTION_KEYS,
|
|
86
|
-
"author",
|
|
87
|
-
"message",
|
|
88
|
-
"dep",
|
|
89
|
-
"comment",
|
|
90
|
-
"note",
|
|
91
|
-
"learning",
|
|
92
|
-
"file",
|
|
93
|
-
"test",
|
|
94
|
-
"doc",
|
|
95
|
-
"reminder",
|
|
96
|
-
"event",
|
|
97
|
-
"typeOption",
|
|
98
|
-
"field",
|
|
99
|
-
];
|
|
100
|
-
const UPDATE_COMMAND_OPTION_KEYS = [
|
|
101
|
-
"title",
|
|
102
|
-
"description",
|
|
103
|
-
"body",
|
|
104
|
-
"status",
|
|
105
|
-
"closeReason",
|
|
106
|
-
"priority",
|
|
107
|
-
"type",
|
|
108
|
-
"tags",
|
|
109
|
-
...COMMON_MUTATION_COMMAND_OPTION_KEYS,
|
|
110
|
-
"author",
|
|
111
|
-
"message",
|
|
112
|
-
"comment",
|
|
113
|
-
"note",
|
|
114
|
-
"learning",
|
|
115
|
-
"file",
|
|
116
|
-
"test",
|
|
117
|
-
"doc",
|
|
118
|
-
"reminder",
|
|
119
|
-
"event",
|
|
120
|
-
"typeOption",
|
|
121
|
-
"field",
|
|
122
|
-
"ownershipMetadataBypass",
|
|
123
|
-
"ownershipDependencyBypass",
|
|
124
|
-
"force",
|
|
125
|
-
];
|
|
126
|
-
const SHARED_COMMAND_OPTION_ALIASES = {
|
|
127
|
-
"close-reason": "closeReason",
|
|
128
|
-
close_reason: "closeReason",
|
|
129
|
-
"estimated-minutes": "estimatedMinutes",
|
|
130
|
-
estimated_minutes: "estimatedMinutes",
|
|
131
|
-
estimate: "estimatedMinutes",
|
|
132
|
-
"acceptance-criteria": "acceptanceCriteria",
|
|
133
|
-
acceptance_criteria: "acceptanceCriteria",
|
|
134
|
-
ac: "acceptanceCriteria",
|
|
135
|
-
"definition-of-ready": "definitionOfReady",
|
|
136
|
-
definition_of_ready: "definitionOfReady",
|
|
137
|
-
rank: "order",
|
|
138
|
-
"why-now": "whyNow",
|
|
139
|
-
why_now: "whyNow",
|
|
140
|
-
"blocked-by": "blockedBy",
|
|
141
|
-
blocked_by: "blockedBy",
|
|
142
|
-
"blocked-reason": "blockedReason",
|
|
143
|
-
blocked_reason: "blockedReason",
|
|
144
|
-
"unblock-note": "unblockNote",
|
|
145
|
-
unblock_note: "unblockNote",
|
|
146
|
-
"repro-steps": "reproSteps",
|
|
147
|
-
repro_steps: "reproSteps",
|
|
148
|
-
"expected-result": "expectedResult",
|
|
149
|
-
expected_result: "expectedResult",
|
|
150
|
-
"actual-result": "actualResult",
|
|
151
|
-
actual_result: "actualResult",
|
|
152
|
-
"affected-version": "affectedVersion",
|
|
153
|
-
affected_version: "affectedVersion",
|
|
154
|
-
"fixed-version": "fixedVersion",
|
|
155
|
-
fixed_version: "fixedVersion",
|
|
156
|
-
"customer-impact": "customerImpact",
|
|
157
|
-
customer_impact: "customerImpact",
|
|
158
|
-
"type-option": "typeOption",
|
|
159
|
-
type_option: "typeOption",
|
|
160
|
-
type_options: "typeOption",
|
|
161
|
-
};
|
|
162
|
-
const CREATE_COMMAND_OPTION_ALIASES = {
|
|
163
|
-
...SHARED_COMMAND_OPTION_ALIASES,
|
|
164
|
-
};
|
|
165
|
-
const UPDATE_COMMAND_OPTION_ALIASES = {
|
|
166
|
-
...SHARED_COMMAND_OPTION_ALIASES,
|
|
167
|
-
};
|
|
168
|
-
const COMMON_MUTATION_COMMAND_OPTION_FLAG_LABEL_ENTRIES = [
|
|
169
|
-
["deadline", "--deadline"],
|
|
170
|
-
["estimatedMinutes", "--estimate/--estimated-minutes"],
|
|
171
|
-
["acceptanceCriteria", "--acceptance-criteria/--ac"],
|
|
172
|
-
["definitionOfReady", "--definition-of-ready"],
|
|
173
|
-
["order", "--order/--rank"],
|
|
174
|
-
["goal", "--goal"],
|
|
175
|
-
["objective", "--objective"],
|
|
176
|
-
["value", "--value"],
|
|
177
|
-
["impact", "--impact"],
|
|
178
|
-
["outcome", "--outcome"],
|
|
179
|
-
["whyNow", "--why-now"],
|
|
180
|
-
["assignee", "--assignee"],
|
|
181
|
-
["parent", "--parent"],
|
|
182
|
-
["reviewer", "--reviewer"],
|
|
183
|
-
["risk", "--risk"],
|
|
184
|
-
["confidence", "--confidence"],
|
|
185
|
-
["sprint", "--sprint"],
|
|
186
|
-
["release", "--release"],
|
|
187
|
-
["blockedBy", "--blocked-by"],
|
|
188
|
-
["blockedReason", "--blocked-reason"],
|
|
189
|
-
["unblockNote", "--unblock-note"],
|
|
190
|
-
["reporter", "--reporter"],
|
|
191
|
-
["severity", "--severity"],
|
|
192
|
-
["environment", "--environment"],
|
|
193
|
-
["reproSteps", "--repro-steps"],
|
|
194
|
-
["resolution", "--resolution"],
|
|
195
|
-
["expectedResult", "--expected-result"],
|
|
196
|
-
["actualResult", "--actual-result"],
|
|
197
|
-
["affectedVersion", "--affected-version"],
|
|
198
|
-
["fixedVersion", "--fixed-version"],
|
|
199
|
-
["component", "--component"],
|
|
200
|
-
["regression", "--regression"],
|
|
201
|
-
["customerImpact", "--customer-impact"],
|
|
202
|
-
];
|
|
203
|
-
const LINKED_RESOURCE_COMMAND_OPTION_FLAG_LABEL_ENTRIES = [
|
|
204
|
-
["comment", "--comment"],
|
|
205
|
-
["note", "--note"],
|
|
206
|
-
["learning", "--learning"],
|
|
207
|
-
["file", "--file"],
|
|
208
|
-
["test", "--test"],
|
|
209
|
-
["doc", "--doc"],
|
|
210
|
-
["reminder", "--reminder"],
|
|
211
|
-
["event", "--event"],
|
|
212
|
-
["typeOption", "--type-option"],
|
|
213
|
-
];
|
|
214
|
-
function commandOptionLabelMap(entries) {
|
|
215
|
-
return Object.fromEntries(entries);
|
|
216
|
-
}
|
|
217
|
-
const CREATE_COMMAND_OPTION_FLAG_LABELS = commandOptionLabelMap([
|
|
218
|
-
["title", "--title"],
|
|
219
|
-
["description", "--description"],
|
|
220
|
-
["type", "--type"],
|
|
221
|
-
["status", "--status"],
|
|
222
|
-
["priority", "--priority"],
|
|
223
|
-
["tags", "--tags"],
|
|
224
|
-
["body", "--body"],
|
|
225
|
-
...COMMON_MUTATION_COMMAND_OPTION_FLAG_LABEL_ENTRIES,
|
|
226
|
-
["author", "--author"],
|
|
227
|
-
["message", "--message"],
|
|
228
|
-
["dep", "--dep"],
|
|
229
|
-
...LINKED_RESOURCE_COMMAND_OPTION_FLAG_LABEL_ENTRIES,
|
|
230
|
-
]);
|
|
231
|
-
const UPDATE_COMMAND_OPTION_FLAG_LABELS = commandOptionLabelMap([
|
|
232
|
-
["title", "--title"],
|
|
233
|
-
["description", "--description"],
|
|
234
|
-
["body", "--body"],
|
|
235
|
-
["status", "--status"],
|
|
236
|
-
["closeReason", "--close-reason"],
|
|
237
|
-
["priority", "--priority"],
|
|
238
|
-
["type", "--type"],
|
|
239
|
-
["tags", "--tags"],
|
|
240
|
-
...COMMON_MUTATION_COMMAND_OPTION_FLAG_LABEL_ENTRIES,
|
|
241
|
-
...LINKED_RESOURCE_COMMAND_OPTION_FLAG_LABEL_ENTRIES,
|
|
242
|
-
["author", "--author"],
|
|
243
|
-
["message", "--message"],
|
|
244
|
-
["force", "--force"],
|
|
245
|
-
]);
|
|
246
|
-
function normalizeCommandOptionToken(value) {
|
|
247
|
-
return value.trim().replace(/^--+/, "").toLowerCase();
|
|
248
|
-
}
|
|
249
|
-
function commandOptionKeys(command) {
|
|
250
|
-
return command === "create"
|
|
251
|
-
? CREATE_COMMAND_OPTION_KEYS
|
|
252
|
-
: UPDATE_COMMAND_OPTION_KEYS;
|
|
253
|
-
}
|
|
254
|
-
function commandOptionAliases(command) {
|
|
255
|
-
return command === "create"
|
|
256
|
-
? CREATE_COMMAND_OPTION_ALIASES
|
|
257
|
-
: UPDATE_COMMAND_OPTION_ALIASES;
|
|
258
|
-
}
|
|
259
|
-
/** Implements canonicalize command option key for the public runtime surface of this module. */
|
|
260
|
-
export function canonicalizeCommandOptionKey(command, rawOption) {
|
|
261
|
-
const normalizedToken = normalizeCommandOptionToken(rawOption);
|
|
262
|
-
if (normalizedToken.length === 0) {
|
|
263
|
-
return undefined;
|
|
264
|
-
}
|
|
265
|
-
const aliased = commandOptionAliases(command)[normalizedToken];
|
|
266
|
-
if (aliased) {
|
|
267
|
-
return aliased;
|
|
268
|
-
}
|
|
269
|
-
return commandOptionKeys(command).find((candidate) => candidate.toLowerCase() === normalizedToken);
|
|
270
|
-
}
|
|
271
|
-
/** Implements command option flag label for the public runtime surface of this module. */
|
|
272
|
-
export function commandOptionFlagLabel(command, optionKey) {
|
|
273
|
-
const labels = command === "create"
|
|
274
|
-
? CREATE_COMMAND_OPTION_FLAG_LABELS
|
|
275
|
-
: UPDATE_COMMAND_OPTION_FLAG_LABELS;
|
|
276
|
-
return (labels[optionKey] ??
|
|
277
|
-
`--${optionKey.replace(/([A-Z])/g, "-$1").toLowerCase()}`);
|
|
278
|
-
}
|
|
279
|
-
/** Implements to default folder for the public runtime surface of this module. */
|
|
280
|
-
export function toDefaultFolder(name) {
|
|
281
|
-
const normalized = toSlugToken(name);
|
|
282
|
-
if (normalized.length === 0) {
|
|
283
|
-
return "items";
|
|
284
|
-
}
|
|
285
|
-
return normalized.endsWith("s") ? normalized : `${normalized}s`;
|
|
286
|
-
}
|
|
287
|
-
/**
|
|
288
|
-
* Canonicalizes a custom item-type folder as a portable tracker-relative path.
|
|
289
|
-
*
|
|
290
|
-
* Leading separators retain the historical CLI meaning of "relative to the pm
|
|
291
|
-
* tracker", while Windows separators are normalized so definitions behave
|
|
292
|
-
* identically on every host. Traversal, drive-prefixed, empty, and NUL-bearing
|
|
293
|
-
* values fail closed before callers can resolve an item or history path.
|
|
294
|
-
*/
|
|
295
|
-
export function normalizeItemTypeFolder(folder) {
|
|
296
|
-
const trimmed = folder.trim();
|
|
297
|
-
const portable = trimmed.replaceAll("\\", "/");
|
|
298
|
-
const trackerRelative = portable.replace(/^\/+/, "");
|
|
299
|
-
const normalized = path.posix.normalize(trackerRelative);
|
|
300
|
-
if (trimmed.includes("\0") ||
|
|
301
|
-
/^[A-Za-z]:/.test(normalized) ||
|
|
302
|
-
normalized === "." ||
|
|
303
|
-
normalized === ".." ||
|
|
304
|
-
normalized.startsWith("../")) {
|
|
305
|
-
throw new Error(`Item type folder "${folder}" must stay inside the pm tracker root.`);
|
|
306
|
-
}
|
|
307
|
-
return normalized;
|
|
308
|
-
}
|
|
309
|
-
function toSlugToken(value) {
|
|
310
|
-
const trimmed = value.trim().toLowerCase();
|
|
311
|
-
let slug = "";
|
|
312
|
-
let pendingDash = false;
|
|
313
|
-
for (const character of trimmed) {
|
|
314
|
-
const code = character.charCodeAt(0);
|
|
315
|
-
const isAlpha = code >= 97 && code <= 122;
|
|
316
|
-
const isDigit = code >= 48 && code <= 57;
|
|
317
|
-
if (isAlpha || isDigit) {
|
|
318
|
-
if (pendingDash && slug.length > 0) {
|
|
319
|
-
slug += "-";
|
|
320
|
-
}
|
|
321
|
-
slug += character;
|
|
322
|
-
pendingDash = false;
|
|
323
|
-
continue;
|
|
324
|
-
}
|
|
325
|
-
if (slug.length > 0) {
|
|
326
|
-
pendingDash = true;
|
|
327
|
-
}
|
|
328
|
-
}
|
|
329
|
-
return slug;
|
|
330
|
-
}
|
|
331
|
-
// Runtime registry consumes untrusted extension/file definitions, so it uses the
|
|
332
|
-
// strict policy-command resolver (trim + lowercase, reject non-create/update). All
|
|
333
|
-
// other normalization is single-sourced from ./item-type-definition.ts (pm-v798).
|
|
334
|
-
function normalizeTypeDefinition(definition) {
|
|
335
|
-
return normalizeSharedItemTypeDefinition(definition, {
|
|
336
|
-
resolvePolicyCommand: strictPolicyCommand,
|
|
337
|
-
});
|
|
338
|
-
}
|
|
339
|
-
function readStringArray(record, key) {
|
|
340
|
-
const value = record[key];
|
|
341
|
-
return Array.isArray(value)
|
|
342
|
-
? value.filter((entry) => typeof entry === "string")
|
|
343
|
-
: undefined;
|
|
344
|
-
}
|
|
345
|
-
function coerceOptionDefinitionFromUnknown(raw) {
|
|
346
|
-
if (typeof raw !== "object" || raw === null || Array.isArray(raw)) {
|
|
347
|
-
return null;
|
|
348
|
-
}
|
|
349
|
-
const optionRecord = raw;
|
|
350
|
-
if (typeof optionRecord.key !== "string") {
|
|
351
|
-
return null;
|
|
352
|
-
}
|
|
353
|
-
return {
|
|
354
|
-
key: optionRecord.key,
|
|
355
|
-
values: readStringArray(optionRecord, "values") ?? [],
|
|
356
|
-
required: optionRecord.required === undefined
|
|
357
|
-
? undefined
|
|
358
|
-
: Boolean(optionRecord.required),
|
|
359
|
-
aliases: readStringArray(optionRecord, "aliases"),
|
|
360
|
-
description: typeof optionRecord.description === "string"
|
|
361
|
-
? optionRecord.description
|
|
362
|
-
: undefined,
|
|
363
|
-
};
|
|
364
|
-
}
|
|
365
|
-
function coerceCommandOptionPolicyFromUnknown(raw) {
|
|
366
|
-
if (typeof raw !== "object" || raw === null || Array.isArray(raw)) {
|
|
367
|
-
return null;
|
|
368
|
-
}
|
|
369
|
-
const policyRecord = raw;
|
|
370
|
-
if (typeof policyRecord.command !== "string" ||
|
|
371
|
-
typeof policyRecord.option !== "string") {
|
|
372
|
-
return null;
|
|
373
|
-
}
|
|
374
|
-
const normalizedCommand = policyRecord.command.trim().toLowerCase();
|
|
375
|
-
if (normalizedCommand !== "create" && normalizedCommand !== "update") {
|
|
376
|
-
return null;
|
|
377
|
-
}
|
|
378
|
-
return {
|
|
379
|
-
command: normalizedCommand,
|
|
380
|
-
option: policyRecord.option,
|
|
381
|
-
required: policyRecord.required === undefined
|
|
382
|
-
? undefined
|
|
383
|
-
: Boolean(policyRecord.required),
|
|
384
|
-
visible: policyRecord.visible === undefined
|
|
385
|
-
? undefined
|
|
386
|
-
: Boolean(policyRecord.visible),
|
|
387
|
-
enabled: policyRecord.enabled === undefined
|
|
388
|
-
? undefined
|
|
389
|
-
: Boolean(policyRecord.enabled),
|
|
390
|
-
};
|
|
391
|
-
}
|
|
392
|
-
function coerceOptionDefinitionsFromRecord(record) {
|
|
393
|
-
if (!Array.isArray(record.options)) {
|
|
394
|
-
return undefined;
|
|
395
|
-
}
|
|
396
|
-
return record.options
|
|
397
|
-
.map((entry) => coerceOptionDefinitionFromUnknown(entry))
|
|
398
|
-
.filter((entry) => entry !== null);
|
|
399
|
-
}
|
|
400
|
-
function coerceCommandOptionPoliciesFromRecord(record) {
|
|
401
|
-
if (!Array.isArray(record.command_option_policies)) {
|
|
402
|
-
return undefined;
|
|
403
|
-
}
|
|
404
|
-
return record.command_option_policies
|
|
405
|
-
.map((entry) => coerceCommandOptionPolicyFromUnknown(entry))
|
|
406
|
-
.filter((entry) => entry !== null);
|
|
407
|
-
}
|
|
408
|
-
function coerceTypeDefinitionFromUnknown(raw) {
|
|
409
|
-
if (typeof raw !== "object" || raw === null || Array.isArray(raw)) {
|
|
410
|
-
return null;
|
|
411
|
-
}
|
|
412
|
-
const record = raw;
|
|
413
|
-
const name = typeof record.name === "string" ? record.name : "";
|
|
414
|
-
if (name.trim().length === 0) {
|
|
415
|
-
return null;
|
|
416
|
-
}
|
|
417
|
-
const folder = typeof record.folder === "string" ? record.folder : undefined;
|
|
418
|
-
const description = typeof record.description === "string" ? record.description : undefined;
|
|
419
|
-
const defaultStatus = typeof record.default_status === "string"
|
|
420
|
-
? record.default_status
|
|
421
|
-
: undefined;
|
|
422
|
-
return {
|
|
423
|
-
name,
|
|
424
|
-
description,
|
|
425
|
-
default_status: defaultStatus,
|
|
426
|
-
execution_role: parseItemExecutionRole(record.execution_role),
|
|
427
|
-
folder,
|
|
428
|
-
aliases: readStringArray(record, "aliases"),
|
|
429
|
-
required_create_fields: readStringArray(record, "required_create_fields"),
|
|
430
|
-
required_create_repeatables: readStringArray(record, "required_create_repeatables"),
|
|
431
|
-
options: coerceOptionDefinitionsFromRecord(record),
|
|
432
|
-
command_option_policies: coerceCommandOptionPoliciesFromRecord(record),
|
|
433
|
-
};
|
|
434
|
-
}
|
|
435
|
-
function resolveDefinitionRequiredCreateFields(normalizedDefinition, existing) {
|
|
436
|
-
return normalizedDefinition.required_create_fields
|
|
437
|
-
? normalizeItemTypeStringList(normalizedDefinition.required_create_fields)
|
|
438
|
-
: (existing?.required_create_fields ?? []);
|
|
439
|
-
}
|
|
440
|
-
function resolveDefinitionRequiredCreateRepeatables(normalizedDefinition, existing) {
|
|
441
|
-
return normalizedDefinition.required_create_repeatables
|
|
442
|
-
? normalizeItemTypeStringList(normalizedDefinition.required_create_repeatables)
|
|
443
|
-
: (existing?.required_create_repeatables ?? []);
|
|
444
|
-
}
|
|
445
|
-
function resolveDefinitionOptions(normalizedDefinition, existing) {
|
|
446
|
-
return normalizedDefinition.options
|
|
447
|
-
? normalizedDefinition.options
|
|
448
|
-
: existing?.options
|
|
449
|
-
? [...existing.options]
|
|
450
|
-
: [];
|
|
451
|
-
}
|
|
452
|
-
function resolveDefinitionCommandOptionPolicies(normalizedDefinition, existing) {
|
|
453
|
-
return normalizedDefinition.command_option_policies
|
|
454
|
-
? normalizedDefinition.command_option_policies
|
|
455
|
-
: existing?.command_option_policies
|
|
456
|
-
? [...existing.command_option_policies]
|
|
457
|
-
: [];
|
|
458
|
-
}
|
|
459
|
-
function buildResolvedTypeDefinition(normalizedDefinition, existing) {
|
|
460
|
-
const keepName = existing?.name ?? normalizedDefinition.name;
|
|
461
|
-
const description = normalizedDefinition.description ?? existing?.description;
|
|
462
|
-
const defaultStatus = normalizedDefinition.default_status ?? existing?.default_status;
|
|
463
|
-
const folder = normalizeItemTypeFolder(normalizedDefinition.folder ??
|
|
464
|
-
existing?.folder ??
|
|
465
|
-
toDefaultFolder(keepName));
|
|
466
|
-
const resolvedDefinition = {
|
|
467
|
-
name: keepName,
|
|
468
|
-
execution_role: normalizedDefinition.execution_role,
|
|
469
|
-
folder,
|
|
470
|
-
aliases: normalizeItemTypeStringList([
|
|
471
|
-
...(existing?.aliases ?? []),
|
|
472
|
-
...(normalizedDefinition.aliases ?? []),
|
|
473
|
-
]),
|
|
474
|
-
required_create_fields: resolveDefinitionRequiredCreateFields(normalizedDefinition, existing),
|
|
475
|
-
required_create_repeatables: resolveDefinitionRequiredCreateRepeatables(normalizedDefinition, existing),
|
|
476
|
-
options: resolveDefinitionOptions(normalizedDefinition, existing),
|
|
477
|
-
command_option_policies: resolveDefinitionCommandOptionPolicies(normalizedDefinition, existing),
|
|
478
|
-
};
|
|
479
|
-
if (description) {
|
|
480
|
-
resolvedDefinition.description = description;
|
|
481
|
-
}
|
|
482
|
-
if (defaultStatus) {
|
|
483
|
-
resolvedDefinition.default_status = defaultStatus;
|
|
484
|
-
}
|
|
485
|
-
return resolvedDefinition;
|
|
486
|
-
}
|
|
487
|
-
function applyTypeDefinitions(source, target) {
|
|
488
|
-
for (const rawDefinition of source) {
|
|
489
|
-
const normalizedDefinition = normalizeTypeDefinition(rawDefinition);
|
|
490
|
-
if (!normalizedDefinition) {
|
|
491
|
-
continue;
|
|
492
|
-
}
|
|
493
|
-
const lowerName = normalizedDefinition.name.toLowerCase();
|
|
494
|
-
const existing = target.get(lowerName);
|
|
495
|
-
target.set(lowerName, buildResolvedTypeDefinition({ ...normalizedDefinition, execution_role: normalizedDefinition.execution_role ?? existing?.execution_role }, existing));
|
|
496
|
-
}
|
|
497
|
-
}
|
|
498
|
-
function collectExtensionTypeDefinitions(registrations) {
|
|
499
|
-
if (!registrations) {
|
|
500
|
-
return [];
|
|
501
|
-
}
|
|
502
|
-
const definitions = [];
|
|
503
|
-
for (const registration of registrations.item_types ?? []) {
|
|
504
|
-
const typeDefinitionsRaw = registration.types;
|
|
505
|
-
if (!Array.isArray(typeDefinitionsRaw)) {
|
|
506
|
-
continue;
|
|
507
|
-
}
|
|
508
|
-
for (const rawDefinition of typeDefinitionsRaw) {
|
|
509
|
-
const normalized = coerceTypeDefinitionFromUnknown(rawDefinition);
|
|
510
|
-
if (normalized) {
|
|
511
|
-
definitions.push(normalized);
|
|
512
|
-
}
|
|
513
|
-
}
|
|
514
|
-
}
|
|
515
|
-
return definitions;
|
|
516
|
-
}
|
|
517
|
-
/** Implements resolve item type registry for the public runtime surface of this module. */
|
|
518
|
-
export function resolveItemTypeRegistry(settings, extensionRegistrations = null) {
|
|
519
|
-
const byLowerName = new Map();
|
|
520
|
-
for (const builtin of ITEM_TYPE_VALUES) {
|
|
521
|
-
byLowerName.set(builtin.toLowerCase(), {
|
|
522
|
-
name: builtin,
|
|
523
|
-
execution_role: BUILTIN_ITEM_EXECUTION_ROLES[builtin.toLowerCase()] ?? "agent",
|
|
524
|
-
folder: TYPE_TO_FOLDER[builtin],
|
|
525
|
-
aliases: [],
|
|
526
|
-
required_create_fields: [...DEFAULT_REQUIRED_CREATE_FIELDS],
|
|
527
|
-
required_create_repeatables: [...DEFAULT_REQUIRED_CREATE_REPEATABLES],
|
|
528
|
-
options: [],
|
|
529
|
-
command_option_policies: [],
|
|
530
|
-
});
|
|
531
|
-
}
|
|
532
|
-
applyTypeDefinitions(settings.item_types?.definitions ?? [], byLowerName);
|
|
533
|
-
applyTypeDefinitions(collectExtensionTypeDefinitions(extensionRegistrations), byLowerName);
|
|
534
|
-
const definitions = [...byLowerName.values()].sort((left, right) => left.name.localeCompare(right.name));
|
|
535
|
-
const byType = {};
|
|
536
|
-
const aliasToType = {};
|
|
537
|
-
const typeToFolder = {};
|
|
538
|
-
for (const definition of definitions) {
|
|
539
|
-
byType[definition.name] = definition;
|
|
540
|
-
typeToFolder[definition.name] = definition.folder;
|
|
541
|
-
aliasToType[definition.name.toLowerCase()] = definition.name;
|
|
542
|
-
for (const alias of definition.aliases) {
|
|
543
|
-
aliasToType[alias.toLowerCase()] = definition.name;
|
|
544
|
-
}
|
|
545
|
-
}
|
|
546
|
-
const folders = [
|
|
547
|
-
...new Set(definitions.map((definition) => definition.folder)),
|
|
548
|
-
].sort((left, right) => left.localeCompare(right));
|
|
549
|
-
return {
|
|
550
|
-
types: definitions.map((definition) => definition.name),
|
|
551
|
-
folders,
|
|
552
|
-
type_to_folder: typeToFolder,
|
|
553
|
-
by_type: byType,
|
|
554
|
-
alias_to_type: aliasToType,
|
|
555
|
-
};
|
|
556
|
-
}
|
|
557
|
-
/** Implements resolve type name for the public runtime surface of this module. */
|
|
558
|
-
export function resolveTypeName(rawType, registry) {
|
|
559
|
-
if (rawType === undefined) {
|
|
560
|
-
return undefined;
|
|
561
|
-
}
|
|
562
|
-
return registry.alias_to_type[rawType.trim().toLowerCase()];
|
|
563
|
-
}
|
|
564
|
-
/** Implements resolve type definition for the public runtime surface of this module. */
|
|
565
|
-
export function resolveTypeDefinition(typeName, registry) {
|
|
566
|
-
const resolvedName = resolveTypeName(typeName, registry);
|
|
567
|
-
if (!resolvedName) {
|
|
568
|
-
return undefined;
|
|
569
|
-
}
|
|
570
|
-
return registry.by_type[resolvedName];
|
|
571
|
-
}
|
|
572
|
-
function applyBaseRequiredCommandOptions(state, typeDefinition, command, baseRequiredOptions) {
|
|
573
|
-
for (const rawBase of baseRequiredOptions) {
|
|
574
|
-
const canonical = canonicalizeCommandOptionKey(command, rawBase);
|
|
575
|
-
if (canonical) {
|
|
576
|
-
state.required.add(canonical);
|
|
577
|
-
continue;
|
|
578
|
-
}
|
|
579
|
-
state.errors.push(`Unsupported base required option "${rawBase}" for command "${command}" on type "${typeDefinition.name}"`);
|
|
580
|
-
}
|
|
581
|
-
}
|
|
582
|
-
function applyBooleanPolicySet(target, option, enabled) {
|
|
583
|
-
if (enabled) {
|
|
584
|
-
target.add(option);
|
|
585
|
-
return;
|
|
586
|
-
}
|
|
587
|
-
target.delete(option);
|
|
588
|
-
}
|
|
589
|
-
function applyCommandOptionPolicy(state, typeDefinition, command, policy) {
|
|
590
|
-
const canonical = canonicalizeCommandOptionKey(command, policy.option);
|
|
591
|
-
if (!canonical) {
|
|
592
|
-
state.errors.push(`Unsupported command_option_policies option "${policy.option}" for command "${command}" on type "${typeDefinition.name}"`);
|
|
593
|
-
return;
|
|
594
|
-
}
|
|
595
|
-
if (policy.required !== undefined) {
|
|
596
|
-
applyBooleanPolicySet(state.required, canonical, policy.required);
|
|
597
|
-
}
|
|
598
|
-
if (policy.visible !== undefined) {
|
|
599
|
-
applyBooleanPolicySet(state.hidden, canonical, !policy.visible);
|
|
600
|
-
}
|
|
601
|
-
if (policy.enabled !== undefined) {
|
|
602
|
-
applyBooleanPolicySet(state.disabled, canonical, !policy.enabled);
|
|
603
|
-
}
|
|
604
|
-
}
|
|
605
|
-
function applyCommandOptionPolicies(state, typeDefinition, command) {
|
|
606
|
-
for (const policy of typeDefinition.command_option_policies) {
|
|
607
|
-
if (policy.command === command) {
|
|
608
|
-
applyCommandOptionPolicy(state, typeDefinition, command, policy);
|
|
609
|
-
}
|
|
610
|
-
}
|
|
611
|
-
}
|
|
612
|
-
function appendRequiredDisabledPolicyErrors(state, typeDefinition, command) {
|
|
613
|
-
for (const option of state.required) {
|
|
614
|
-
if (state.disabled.has(option)) {
|
|
615
|
-
state.errors.push(`Option "${option}" cannot be both required and disabled for command "${command}" on type "${typeDefinition.name}"`);
|
|
616
|
-
}
|
|
617
|
-
}
|
|
618
|
-
}
|
|
619
|
-
/** Implements resolve command option policy state for the public runtime surface of this module. */
|
|
620
|
-
export function resolveCommandOptionPolicyState(typeDefinition, command, baseRequiredOptions) {
|
|
621
|
-
const errors = [];
|
|
622
|
-
const required = new Set();
|
|
623
|
-
const hidden = new Set();
|
|
624
|
-
const disabled = new Set();
|
|
625
|
-
const state = { required, hidden, disabled, errors };
|
|
626
|
-
applyBaseRequiredCommandOptions(state, typeDefinition, command, baseRequiredOptions);
|
|
627
|
-
applyCommandOptionPolicies(state, typeDefinition, command);
|
|
628
|
-
appendRequiredDisabledPolicyErrors(state, typeDefinition, command);
|
|
629
|
-
return {
|
|
630
|
-
required: [...required],
|
|
631
|
-
hidden: [...hidden].sort((left, right) => left.localeCompare(right)),
|
|
632
|
-
disabled: [...disabled].sort((left, right) => left.localeCompare(right)),
|
|
633
|
-
errors,
|
|
634
|
-
};
|
|
635
|
-
}
|
|
636
|
-
function buildTypeOptionAliasMap(typeDefinition) {
|
|
637
|
-
const optionByAlias = new Map();
|
|
638
|
-
for (const option of typeDefinition.options) {
|
|
639
|
-
optionByAlias.set(option.key.toLowerCase(), option);
|
|
640
|
-
for (const alias of option.aliases ?? []) {
|
|
641
|
-
optionByAlias.set(alias.toLowerCase(), option);
|
|
642
|
-
}
|
|
643
|
-
}
|
|
644
|
-
return optionByAlias;
|
|
645
|
-
}
|
|
646
|
-
function resolveTypeOptionValue(optionDefinition, trimmedValue, errors) {
|
|
647
|
-
const allowedValues = optionDefinition.values;
|
|
648
|
-
if (allowedValues.length === 0) {
|
|
649
|
-
return trimmedValue;
|
|
650
|
-
}
|
|
651
|
-
const valueLookup = new Map(allowedValues.map((value) => [value.toLowerCase(), value]));
|
|
652
|
-
const canonical = valueLookup.get(trimmedValue.toLowerCase());
|
|
653
|
-
if (!canonical) {
|
|
654
|
-
errors.push(`Invalid value "${trimmedValue}" for type option "${optionDefinition.key}". Allowed: ${allowedValues.join(", ")}`);
|
|
655
|
-
return undefined;
|
|
656
|
-
}
|
|
657
|
-
return canonical;
|
|
658
|
-
}
|
|
659
|
-
/** Implements validate type options for the public runtime surface of this module. */
|
|
660
|
-
export function validateTypeOptions(typeName, rawTypeOptions, registry) {
|
|
661
|
-
const typeDefinition = resolveTypeDefinition(typeName, registry);
|
|
662
|
-
if (!typeDefinition) {
|
|
663
|
-
return {
|
|
664
|
-
normalized: undefined,
|
|
665
|
-
errors: [`Unknown type "${typeName}"`],
|
|
666
|
-
};
|
|
667
|
-
}
|
|
668
|
-
const errors = [];
|
|
669
|
-
const optionByAlias = buildTypeOptionAliasMap(typeDefinition);
|
|
670
|
-
const normalized = {};
|
|
671
|
-
for (const [rawKey, rawValue] of Object.entries(rawTypeOptions ?? {})) {
|
|
672
|
-
const trimmedKey = rawKey.trim();
|
|
673
|
-
const trimmedValue = rawValue.trim();
|
|
674
|
-
if (trimmedKey.length === 0) {
|
|
675
|
-
errors.push("type option keys must not be empty");
|
|
676
|
-
continue;
|
|
677
|
-
}
|
|
678
|
-
if (trimmedValue.length === 0) {
|
|
679
|
-
errors.push(`type option "${trimmedKey}" must not be empty`);
|
|
680
|
-
continue;
|
|
681
|
-
}
|
|
682
|
-
const optionDefinition = optionByAlias.get(trimmedKey.toLowerCase());
|
|
683
|
-
if (!optionDefinition) {
|
|
684
|
-
const allowed = typeDefinition.options
|
|
685
|
-
.map((option) => option.key)
|
|
686
|
-
.join(", ");
|
|
687
|
-
errors.push(typeDefinition.options.length > 0
|
|
688
|
-
? `Unknown type option "${trimmedKey}" for type "${typeDefinition.name}". Allowed: ${allowed}`
|
|
689
|
-
: `Type "${typeDefinition.name}" does not define any configurable type options`);
|
|
690
|
-
continue;
|
|
691
|
-
}
|
|
692
|
-
const resolvedValue = resolveTypeOptionValue(optionDefinition, trimmedValue, errors);
|
|
693
|
-
if (resolvedValue === undefined) {
|
|
694
|
-
continue;
|
|
695
|
-
}
|
|
696
|
-
normalized[optionDefinition.key] = resolvedValue;
|
|
697
|
-
}
|
|
698
|
-
for (const option of typeDefinition.options) {
|
|
699
|
-
if (option.required && !(option.key in normalized)) {
|
|
700
|
-
errors.push(`Missing required type option "${option.key}" for type "${typeDefinition.name}"`);
|
|
701
|
-
}
|
|
702
|
-
}
|
|
703
|
-
const sortedKeys = Object.keys(normalized).sort((left, right) => left.localeCompare(right));
|
|
704
|
-
if (sortedKeys.length === 0) {
|
|
705
|
-
return {
|
|
706
|
-
normalized: undefined,
|
|
707
|
-
errors,
|
|
708
|
-
};
|
|
709
|
-
}
|
|
710
|
-
return {
|
|
711
|
-
normalized: Object.fromEntries(sortedKeys.map((key) => [key, normalized[key]])),
|
|
712
|
-
errors,
|
|
713
|
-
};
|
|
714
|
-
}
|
|
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]="69ea08ca-3793-51d7-a971-95abf442028f")}catch(e2){}})();import path from"node:path";import{TYPE_TO_FOLDER}from"../shared/constants.js";import{ITEM_TYPE_VALUES}from"../../types/index.js";import{normalizeItemTypeDefinition as normalizeSharedItemTypeDefinition,normalizeItemTypeStringList,strictPolicyCommand,parseItemExecutionRole}from"./item-type-definition.js";const BUILTIN_ITEM_EXECUTION_ROLES=Object.freeze({decision:"human",milestone:"gate"});const DEFAULT_REQUIRED_CREATE_FIELDS=["title","description","status","priority","tags","body","deadline","estimatedMinutes","acceptanceCriteria","author","message","assignee"];const DEFAULT_REQUIRED_CREATE_REPEATABLES=["dep","comment","note","learning","file","test","doc"];const COMMON_MUTATION_COMMAND_OPTION_KEYS=["deadline","estimatedMinutes","acceptanceCriteria","definitionOfReady","order","goal","objective","value","impact","outcome","whyNow","assignee","parent","reviewer","risk","confidence","sprint","release","blockedBy","blockedReason","unblockNote","reporter","severity","environment","reproSteps","resolution","expectedResult","actualResult","affectedVersion","fixedVersion","component","regression","customerImpact"];const CREATE_COMMAND_OPTION_KEYS=["title","description","type","status","priority","tags","body",...COMMON_MUTATION_COMMAND_OPTION_KEYS,"author","message","dep","comment","note","learning","file","test","doc","reminder","event","typeOption","field"];const UPDATE_COMMAND_OPTION_KEYS=["title","description","body","status","closeReason","priority","type","tags",...COMMON_MUTATION_COMMAND_OPTION_KEYS,"author","message","comment","note","learning","file","test","doc","reminder","event","typeOption","field","ownershipMetadataBypass","ownershipDependencyBypass","force"];const SHARED_COMMAND_OPTION_ALIASES={"close-reason":"closeReason",close_reason:"closeReason","estimated-minutes":"estimatedMinutes",estimated_minutes:"estimatedMinutes",estimate:"estimatedMinutes","acceptance-criteria":"acceptanceCriteria",acceptance_criteria:"acceptanceCriteria",ac:"acceptanceCriteria","definition-of-ready":"definitionOfReady",definition_of_ready:"definitionOfReady",rank:"order","why-now":"whyNow",why_now:"whyNow","blocked-by":"blockedBy",blocked_by:"blockedBy","blocked-reason":"blockedReason",blocked_reason:"blockedReason","unblock-note":"unblockNote",unblock_note:"unblockNote","repro-steps":"reproSteps",repro_steps:"reproSteps","expected-result":"expectedResult",expected_result:"expectedResult","actual-result":"actualResult",actual_result:"actualResult","affected-version":"affectedVersion",affected_version:"affectedVersion","fixed-version":"fixedVersion",fixed_version:"fixedVersion","customer-impact":"customerImpact",customer_impact:"customerImpact","type-option":"typeOption",type_option:"typeOption",type_options:"typeOption"};const CREATE_COMMAND_OPTION_ALIASES={...SHARED_COMMAND_OPTION_ALIASES};const UPDATE_COMMAND_OPTION_ALIASES={...SHARED_COMMAND_OPTION_ALIASES};const COMMON_MUTATION_COMMAND_OPTION_FLAG_LABEL_ENTRIES=[["deadline","--deadline"],["estimatedMinutes","--estimate/--estimated-minutes"],["acceptanceCriteria","--acceptance-criteria/--ac"],["definitionOfReady","--definition-of-ready"],["order","--order/--rank"],["goal","--goal"],["objective","--objective"],["value","--value"],["impact","--impact"],["outcome","--outcome"],["whyNow","--why-now"],["assignee","--assignee"],["parent","--parent"],["reviewer","--reviewer"],["risk","--risk"],["confidence","--confidence"],["sprint","--sprint"],["release","--release"],["blockedBy","--blocked-by"],["blockedReason","--blocked-reason"],["unblockNote","--unblock-note"],["reporter","--reporter"],["severity","--severity"],["environment","--environment"],["reproSteps","--repro-steps"],["resolution","--resolution"],["expectedResult","--expected-result"],["actualResult","--actual-result"],["affectedVersion","--affected-version"],["fixedVersion","--fixed-version"],["component","--component"],["regression","--regression"],["customerImpact","--customer-impact"]];const LINKED_RESOURCE_COMMAND_OPTION_FLAG_LABEL_ENTRIES=[["comment","--comment"],["note","--note"],["learning","--learning"],["file","--file"],["test","--test"],["doc","--doc"],["reminder","--reminder"],["event","--event"],["typeOption","--type-option"]];function commandOptionLabelMap(entries){return Object.fromEntries(entries)}const CREATE_COMMAND_OPTION_FLAG_LABELS=commandOptionLabelMap([["title","--title"],["description","--description"],["type","--type"],["status","--status"],["priority","--priority"],["tags","--tags"],["body","--body"],...COMMON_MUTATION_COMMAND_OPTION_FLAG_LABEL_ENTRIES,["author","--author"],["message","--message"],["dep","--dep"],...LINKED_RESOURCE_COMMAND_OPTION_FLAG_LABEL_ENTRIES]);const UPDATE_COMMAND_OPTION_FLAG_LABELS=commandOptionLabelMap([["title","--title"],["description","--description"],["body","--body"],["status","--status"],["closeReason","--close-reason"],["priority","--priority"],["type","--type"],["tags","--tags"],...COMMON_MUTATION_COMMAND_OPTION_FLAG_LABEL_ENTRIES,...LINKED_RESOURCE_COMMAND_OPTION_FLAG_LABEL_ENTRIES,["author","--author"],["message","--message"],["force","--force"]]);function normalizeCommandOptionToken(value){return value.trim().replace(/^--+/,"").toLowerCase()}function commandOptionKeys(command){return command==="create"?CREATE_COMMAND_OPTION_KEYS:UPDATE_COMMAND_OPTION_KEYS}function commandOptionAliases(command){return command==="create"?CREATE_COMMAND_OPTION_ALIASES:UPDATE_COMMAND_OPTION_ALIASES}function canonicalizeCommandOptionKey(command,rawOption){const normalizedToken=normalizeCommandOptionToken(rawOption);if(normalizedToken.length===0){return void 0}const aliased=commandOptionAliases(command)[normalizedToken];if(aliased){return aliased}return commandOptionKeys(command).find(candidate=>candidate.toLowerCase()===normalizedToken)}function commandOptionFlagLabel(command,optionKey){const labels=command==="create"?CREATE_COMMAND_OPTION_FLAG_LABELS:UPDATE_COMMAND_OPTION_FLAG_LABELS;return labels[optionKey]??`--${optionKey.replace(/([A-Z])/g,"-$1").toLowerCase()}`}function toDefaultFolder(name){const normalized=toSlugToken(name);if(normalized.length===0){return"items"}return normalized.endsWith("s")?normalized:`${normalized}s`}function normalizeItemTypeFolder(folder){const trimmed=folder.trim();const portable=trimmed.replaceAll("\\","/");const trackerRelative=portable.replace(/^\/+/,"");const normalized=path.posix.normalize(trackerRelative);if(trimmed.includes("\0")||/^[A-Za-z]:/.test(normalized)||normalized==="."||normalized===".."||normalized.startsWith("../")){throw new Error(`Item type folder "${folder}" must stay inside the pm tracker root.`)}return normalized}function toSlugToken(value){const trimmed=value.trim().toLowerCase();let slug="";let pendingDash=false;for(const character of trimmed){const code=character.charCodeAt(0);const isAlpha=code>=97&&code<=122;const isDigit=code>=48&&code<=57;if(isAlpha||isDigit){if(pendingDash&&slug.length>0){slug+="-"}slug+=character;pendingDash=false;continue}if(slug.length>0){pendingDash=true}}return slug}function normalizeTypeDefinition(definition){return normalizeSharedItemTypeDefinition(definition,{resolvePolicyCommand:strictPolicyCommand})}function readStringArray(record,key){const value=record[key];return Array.isArray(value)?value.filter(entry=>typeof entry==="string"):void 0}function coerceOptionDefinitionFromUnknown(raw){if(typeof raw!=="object"||raw===null||Array.isArray(raw)){return null}const optionRecord=raw;if(typeof optionRecord.key!=="string"){return null}return{key:optionRecord.key,values:readStringArray(optionRecord,"values")??[],required:optionRecord.required===void 0?void 0:Boolean(optionRecord.required),aliases:readStringArray(optionRecord,"aliases"),description:typeof optionRecord.description==="string"?optionRecord.description:void 0}}function coerceCommandOptionPolicyFromUnknown(raw){if(typeof raw!=="object"||raw===null||Array.isArray(raw)){return null}const policyRecord=raw;if(typeof policyRecord.command!=="string"||typeof policyRecord.option!=="string"){return null}const normalizedCommand=policyRecord.command.trim().toLowerCase();if(normalizedCommand!=="create"&&normalizedCommand!=="update"){return null}return{command:normalizedCommand,option:policyRecord.option,required:policyRecord.required===void 0?void 0:Boolean(policyRecord.required),visible:policyRecord.visible===void 0?void 0:Boolean(policyRecord.visible),enabled:policyRecord.enabled===void 0?void 0:Boolean(policyRecord.enabled)}}function coerceOptionDefinitionsFromRecord(record){if(!Array.isArray(record.options)){return void 0}return record.options.map(entry=>coerceOptionDefinitionFromUnknown(entry)).filter(entry=>entry!==null)}function coerceCommandOptionPoliciesFromRecord(record){if(!Array.isArray(record.command_option_policies)){return void 0}return record.command_option_policies.map(entry=>coerceCommandOptionPolicyFromUnknown(entry)).filter(entry=>entry!==null)}function coerceTypeDefinitionFromUnknown(raw){if(typeof raw!=="object"||raw===null||Array.isArray(raw)){return null}const record=raw;const name=typeof record.name==="string"?record.name:"";if(name.trim().length===0){return null}const folder=typeof record.folder==="string"?record.folder:void 0;const description=typeof record.description==="string"?record.description:void 0;const defaultStatus=typeof record.default_status==="string"?record.default_status:void 0;return{name,description,default_status:defaultStatus,execution_role:parseItemExecutionRole(record.execution_role),folder,aliases:readStringArray(record,"aliases"),required_create_fields:readStringArray(record,"required_create_fields"),required_create_repeatables:readStringArray(record,"required_create_repeatables"),options:coerceOptionDefinitionsFromRecord(record),command_option_policies:coerceCommandOptionPoliciesFromRecord(record)}}function resolveDefinitionRequiredCreateFields(normalizedDefinition,existing){return normalizedDefinition.required_create_fields?normalizeItemTypeStringList(normalizedDefinition.required_create_fields):existing?.required_create_fields??[]}function resolveDefinitionRequiredCreateRepeatables(normalizedDefinition,existing){return normalizedDefinition.required_create_repeatables?normalizeItemTypeStringList(normalizedDefinition.required_create_repeatables):existing?.required_create_repeatables??[]}function resolveDefinitionOptions(normalizedDefinition,existing){return normalizedDefinition.options?normalizedDefinition.options:existing?.options?[...existing.options]:[]}function resolveDefinitionCommandOptionPolicies(normalizedDefinition,existing){return normalizedDefinition.command_option_policies?normalizedDefinition.command_option_policies:existing?.command_option_policies?[...existing.command_option_policies]:[]}function buildResolvedTypeDefinition(normalizedDefinition,existing){const keepName=existing?.name??normalizedDefinition.name;const description=normalizedDefinition.description??existing?.description;const defaultStatus=normalizedDefinition.default_status??existing?.default_status;const folder=normalizeItemTypeFolder(normalizedDefinition.folder??existing?.folder??toDefaultFolder(keepName));const resolvedDefinition={name:keepName,execution_role:normalizedDefinition.execution_role,folder,aliases:normalizeItemTypeStringList([...existing?.aliases??[],...normalizedDefinition.aliases??[]]),required_create_fields:resolveDefinitionRequiredCreateFields(normalizedDefinition,existing),required_create_repeatables:resolveDefinitionRequiredCreateRepeatables(normalizedDefinition,existing),options:resolveDefinitionOptions(normalizedDefinition,existing),command_option_policies:resolveDefinitionCommandOptionPolicies(normalizedDefinition,existing)};if(description){resolvedDefinition.description=description}if(defaultStatus){resolvedDefinition.default_status=defaultStatus}return resolvedDefinition}function applyTypeDefinitions(source,target){for(const rawDefinition of source){const normalizedDefinition=normalizeTypeDefinition(rawDefinition);if(!normalizedDefinition){continue}const lowerName=normalizedDefinition.name.toLowerCase();const existing=target.get(lowerName);target.set(lowerName,buildResolvedTypeDefinition({...normalizedDefinition,execution_role:normalizedDefinition.execution_role??existing?.execution_role},existing))}}function collectExtensionTypeDefinitions(registrations){if(!registrations){return[]}const definitions=[];for(const registration of registrations.item_types??[]){const typeDefinitionsRaw=registration.types;if(!Array.isArray(typeDefinitionsRaw)){continue}for(const rawDefinition of typeDefinitionsRaw){const normalized=coerceTypeDefinitionFromUnknown(rawDefinition);if(normalized){definitions.push(normalized)}}}return definitions}function resolveItemTypeRegistry(settings,extensionRegistrations=null){const byLowerName=new Map;for(const builtin of ITEM_TYPE_VALUES){byLowerName.set(builtin.toLowerCase(),{name:builtin,execution_role:BUILTIN_ITEM_EXECUTION_ROLES[builtin.toLowerCase()]??"agent",folder:TYPE_TO_FOLDER[builtin],aliases:[],required_create_fields:[...DEFAULT_REQUIRED_CREATE_FIELDS],required_create_repeatables:[...DEFAULT_REQUIRED_CREATE_REPEATABLES],options:[],command_option_policies:[]})}applyTypeDefinitions(settings.item_types?.definitions??[],byLowerName);applyTypeDefinitions(collectExtensionTypeDefinitions(extensionRegistrations),byLowerName);const definitions=[...byLowerName.values()].sort((left,right)=>left.name.localeCompare(right.name));const byType={};const aliasToType={};const typeToFolder={};for(const definition of definitions){byType[definition.name]=definition;typeToFolder[definition.name]=definition.folder;aliasToType[definition.name.toLowerCase()]=definition.name;for(const alias of definition.aliases){aliasToType[alias.toLowerCase()]=definition.name}}const folders=[...new Set(definitions.map(definition=>definition.folder))].sort((left,right)=>left.localeCompare(right));return{types:definitions.map(definition=>definition.name),folders,type_to_folder:typeToFolder,by_type:byType,alias_to_type:aliasToType}}function resolveTypeName(rawType,registry){if(rawType===void 0){return void 0}return registry.alias_to_type[rawType.trim().toLowerCase()]}function resolveTypeDefinition(typeName,registry){const resolvedName=resolveTypeName(typeName,registry);if(!resolvedName){return void 0}return registry.by_type[resolvedName]}function applyBaseRequiredCommandOptions(state,typeDefinition,command,baseRequiredOptions){for(const rawBase of baseRequiredOptions){const canonical=canonicalizeCommandOptionKey(command,rawBase);if(canonical){state.required.add(canonical);continue}state.errors.push(`Unsupported base required option "${rawBase}" for command "${command}" on type "${typeDefinition.name}"`)}}function applyBooleanPolicySet(target,option,enabled){if(enabled){target.add(option);return}target.delete(option)}function applyCommandOptionPolicy(state,typeDefinition,command,policy){const canonical=canonicalizeCommandOptionKey(command,policy.option);if(!canonical){state.errors.push(`Unsupported command_option_policies option "${policy.option}" for command "${command}" on type "${typeDefinition.name}"`);return}if(policy.required!==void 0){applyBooleanPolicySet(state.required,canonical,policy.required)}if(policy.visible!==void 0){applyBooleanPolicySet(state.hidden,canonical,!policy.visible)}if(policy.enabled!==void 0){applyBooleanPolicySet(state.disabled,canonical,!policy.enabled)}}function applyCommandOptionPolicies(state,typeDefinition,command){for(const policy of typeDefinition.command_option_policies){if(policy.command===command){applyCommandOptionPolicy(state,typeDefinition,command,policy)}}}function appendRequiredDisabledPolicyErrors(state,typeDefinition,command){for(const option of state.required){if(state.disabled.has(option)){state.errors.push(`Option "${option}" cannot be both required and disabled for command "${command}" on type "${typeDefinition.name}"`)}}}function resolveCommandOptionPolicyState(typeDefinition,command,baseRequiredOptions){const errors=[];const required=new Set;const hidden=new Set;const disabled=new Set;const state={required,hidden,disabled,errors};applyBaseRequiredCommandOptions(state,typeDefinition,command,baseRequiredOptions);applyCommandOptionPolicies(state,typeDefinition,command);appendRequiredDisabledPolicyErrors(state,typeDefinition,command);return{required:[...required],hidden:[...hidden].sort((left,right)=>left.localeCompare(right)),disabled:[...disabled].sort((left,right)=>left.localeCompare(right)),errors}}function buildTypeOptionAliasMap(typeDefinition){const optionByAlias=new Map;for(const option of typeDefinition.options){optionByAlias.set(option.key.toLowerCase(),option);for(const alias of option.aliases??[]){optionByAlias.set(alias.toLowerCase(),option)}}return optionByAlias}function resolveTypeOptionValue(optionDefinition,trimmedValue,errors){const allowedValues=optionDefinition.values;if(allowedValues.length===0){return trimmedValue}const valueLookup=new Map(allowedValues.map(value=>[value.toLowerCase(),value]));const canonical=valueLookup.get(trimmedValue.toLowerCase());if(!canonical){errors.push(`Invalid value "${trimmedValue}" for type option "${optionDefinition.key}". Allowed: ${allowedValues.join(", ")}`);return void 0}return canonical}function validateTypeOptions(typeName,rawTypeOptions,registry){const typeDefinition=resolveTypeDefinition(typeName,registry);if(!typeDefinition){return{normalized:void 0,errors:[`Unknown type "${typeName}"`]}}const errors=[];const optionByAlias=buildTypeOptionAliasMap(typeDefinition);const normalized={};for(const[rawKey,rawValue]of Object.entries(rawTypeOptions??{})){const trimmedKey=rawKey.trim();const trimmedValue=rawValue.trim();if(trimmedKey.length===0){errors.push("type option keys must not be empty");continue}if(trimmedValue.length===0){errors.push(`type option "${trimmedKey}" must not be empty`);continue}const optionDefinition=optionByAlias.get(trimmedKey.toLowerCase());if(!optionDefinition){const allowed=typeDefinition.options.map(option=>option.key).join(", ");errors.push(typeDefinition.options.length>0?`Unknown type option "${trimmedKey}" for type "${typeDefinition.name}". Allowed: ${allowed}`:`Type "${typeDefinition.name}" does not define any configurable type options`);continue}const resolvedValue=resolveTypeOptionValue(optionDefinition,trimmedValue,errors);if(resolvedValue===void 0){continue}normalized[optionDefinition.key]=resolvedValue}for(const option of typeDefinition.options){if(option.required&&!(option.key in normalized)){errors.push(`Missing required type option "${option.key}" for type "${typeDefinition.name}"`)}}const sortedKeys=Object.keys(normalized).sort((left,right)=>left.localeCompare(right));if(sortedKeys.length===0){return{normalized:void 0,errors}}return{normalized:Object.fromEntries(sortedKeys.map(key=>[key,normalized[key]])),errors}}export{BUILTIN_ITEM_EXECUTION_ROLES,COMMON_MUTATION_COMMAND_OPTION_KEYS,DEFAULT_REQUIRED_CREATE_FIELDS,DEFAULT_REQUIRED_CREATE_REPEATABLES,canonicalizeCommandOptionKey,commandOptionFlagLabel,normalizeItemTypeFolder,resolveCommandOptionPolicyState,resolveItemTypeRegistry,resolveTypeDefinition,resolveTypeName,toDefaultFolder,validateTypeOptions};
|
|
715
2
|
//# sourceMappingURL=type-registry.js.map
|
|
716
|
-
//# debugId=506efdc7-b04e-5023-ab59-57ede87558f9
|