@unbrained/pm-cli 2026.9.7 → 2026.9.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.agents/skills/pm-developer/SKILL.md +12 -4
- package/.agents/skills/pm-developer/references/MULTI_AGENT_MERGE.md +19 -10
- package/.agents/skills/pm-extensions/SKILL.md +6 -0
- package/.agents/skills/pm-sdk/SKILL.md +11 -2
- package/.agents/skills/pm-user/SKILL.md +7 -2
- package/.agents/skills/pm-user/references/ECOSYSTEM_PLANNING.md +95 -0
- package/.claude-plugin/marketplace.json +2 -2
- package/CHANGELOG.md +231 -182
- package/dist/cli/after-command-context-usage.js +1 -48
- package/dist/cli/argv-utils.js +1 -40
- package/dist/cli/bootstrap-args.js +1 -9
- package/dist/cli/bundle-integrity.js +2 -110
- package/dist/cli/commander-usage.js +11 -771
- package/dist/cli/commands/activity.js +1 -9
- package/dist/cli/commands/aggregate.js +1 -5
- package/dist/cli/commands/append.js +1 -5
- package/dist/cli/commands/claim.js +1 -5
- package/dist/cli/commands/close-many.js +1 -5
- package/dist/cli/commands/close.js +1 -9
- package/dist/cli/commands/comments.js +1 -5
- package/dist/cli/commands/config.js +1 -9
- package/dist/cli/commands/context.js +1 -9
- package/dist/cli/commands/contracts.js +1 -5
- package/dist/cli/commands/copy.js +1 -9
- package/dist/cli/commands/create.js +1 -9
- package/dist/cli/commands/delete.js +1 -9
- package/dist/cli/commands/deps.js +1 -9
- package/dist/cli/commands/docs.js +1 -9
- package/dist/cli/commands/duplicates.js +1 -9
- package/dist/cli/commands/eval.js +1 -9
- package/dist/cli/commands/extension/describe.js +1 -5
- package/dist/cli/commands/extension/scaffold.js +1 -5
- package/dist/cli/commands/extension/shared.js +1 -5
- package/dist/cli/commands/extension.js +1 -9
- package/dist/cli/commands/files.js +1 -9
- package/dist/cli/commands/focus.js +1 -9
- package/dist/cli/commands/gc.js +1 -9
- package/dist/cli/commands/get.js +1 -9
- package/dist/cli/commands/graph.js +1 -10
- package/dist/cli/commands/health.js +1 -9
- package/dist/cli/commands/history-compact.js +1 -10
- package/dist/cli/commands/history-redact.js +1 -11
- package/dist/cli/commands/history-repair.js +1 -10
- package/dist/cli/commands/history.js +1 -5
- package/dist/cli/commands/index.js +1 -58
- package/dist/cli/commands/init-agent-guidance.js +1 -9
- package/dist/cli/commands/init.js +1 -9
- package/dist/cli/commands/learnings.js +1 -5
- package/dist/cli/commands/lifecycle-transitions.js +1 -5
- package/dist/cli/commands/list.js +1 -9
- package/dist/cli/commands/merge.js +1 -11
- package/dist/cli/commands/next.js +1 -9
- package/dist/cli/commands/notes.js +1 -5
- package/dist/cli/commands/plan.js +1 -9
- package/dist/cli/commands/profile.js +1 -9
- package/dist/cli/commands/restore.js +1 -9
- package/dist/cli/commands/scheduling-shortcuts.js +1 -9
- package/dist/cli/commands/schema.js +1 -10
- package/dist/cli/commands/search.js +1 -9
- package/dist/cli/commands/stats.js +1 -9
- package/dist/cli/commands/telemetry.js +1 -9
- package/dist/cli/commands/test-all.js +1 -9
- package/dist/cli/commands/test-runs.js +1 -9
- package/dist/cli/commands/test.js +1 -9
- package/dist/cli/commands/update-many.js +1 -5
- package/dist/cli/commands/update.js +1 -9
- package/dist/cli/commands/upgrade.js +1 -5
- package/dist/cli/commands/validate.js +1 -15
- package/dist/cli/context-intent-invocation.js +1 -20
- package/dist/cli/description-stdin.js +1 -17
- package/dist/cli/error-guidance.js +1 -1353
- package/dist/cli/extension-command-help.js +5 -636
- package/dist/cli/extension-command-options.js +1 -427
- package/dist/cli/extension-recovery.js +1 -126
- package/dist/cli/help-content.js +2 -1001
- package/dist/cli/help-json-payload.js +4 -570
- package/dist/cli/main.d.ts +4 -0
- package/dist/cli/main.js +5 -2573
- package/dist/cli/migration-gates.js +1 -289
- package/dist/cli/public.js +1 -20
- package/dist/cli/register-annotations.js +1 -270
- package/dist/cli/register-assurance.js +1 -62
- package/dist/cli/register-files-lookup.js +1 -56
- package/dist/cli/register-history-activity.d.ts +8 -0
- package/dist/cli/register-history-activity.js +2 -0
- package/dist/cli/register-history-author.js +1 -38
- package/dist/cli/register-history-maintenance.d.ts +9 -0
- package/dist/cli/register-history-maintenance.js +2 -0
- package/dist/cli/register-list-query.js +10 -943
- package/dist/cli/register-mutation-options.js +1 -9
- package/dist/cli/register-mutation.d.ts +0 -5
- package/dist/cli/register-mutation.js +19 -1893
- package/dist/cli/register-operations.js +1 -920
- package/dist/cli/register-setup.js +1 -716
- package/dist/cli/register-structured-mutation.js +1 -196
- package/dist/cli/registration-helpers.js +1 -5
- package/dist/cli/runtime-compatibility-boundary.js +4 -42
- package/dist/cli/schema-registration-helpers.js +1 -73
- package/dist/cli/search-refresh.js +1 -13
- package/dist/cli/stats-analytics-json.js +1 -68
- package/dist/cli/telemetry-flush.js +1 -10
- package/dist/cli-bundle/bundle-manifest.json +164 -156
- package/dist/cli-bundle/chunks/{chunk-NPN5I67J.js → chunk-3IPRM75M.js} +3 -3
- package/dist/cli-bundle/chunks/chunk-4VL5P22L.js +2 -0
- package/dist/cli-bundle/chunks/chunk-AAFBV3U3.js +29 -0
- package/dist/cli-bundle/chunks/chunk-D3YVILJJ.js +20 -0
- package/dist/cli-bundle/chunks/{chunk-WYRZZ5ZE.js → chunk-DEZPZOQ7.js} +2 -2
- package/dist/cli-bundle/chunks/chunk-ECBLPN7B.js +3 -0
- package/dist/cli-bundle/chunks/chunk-J6ERHBV2.js +235 -0
- package/dist/cli-bundle/chunks/chunk-JUNJ5EKI.js +2 -0
- package/dist/cli-bundle/chunks/chunk-L5RCDKQ2.js +2 -0
- package/dist/cli-bundle/chunks/chunk-NSAPNEYH.js +2 -0
- package/dist/cli-bundle/chunks/chunk-OHNLSGGV.js +79 -0
- package/dist/cli-bundle/chunks/chunk-WQKMSFBV.js +5 -0
- package/dist/cli-bundle/chunks/{chunk-BAX2BYUW.js → chunk-XZ6T7YPP.js} +256 -150
- package/dist/cli-bundle/chunks/{chunk-JT6XF6GE.js → chunk-Z3XVXUVF.js} +4 -4
- package/dist/cli-bundle/chunks/register-list-query-UIHRCS6D.js +11 -0
- package/dist/cli-bundle/chunks/register-mutation-WHWMGRVX.js +20 -0
- package/dist/cli-bundle/chunks/register-operations-64YZYTC5.js +2 -0
- package/dist/cli-bundle/chunks/register-setup-PERI45EM.js +2 -0
- package/dist/cli-bundle/focused-chunks/chunk-2W4XIYOB.js +2 -0
- package/dist/cli-bundle/focused-chunks/chunk-2WSBXIGF.js +12 -0
- package/dist/cli-bundle/focused-chunks/chunk-5FHTCOHS.js +3 -0
- package/dist/cli-bundle/focused-chunks/chunk-7N6DOREF.js +26 -0
- package/dist/cli-bundle/focused-chunks/{chunk-3BZEOXLT.js → chunk-7PC4R5QB.js} +2 -2
- package/dist/cli-bundle/focused-chunks/chunk-BUCJUZVG.js +6 -0
- package/dist/cli-bundle/focused-chunks/chunk-FE3BABLJ.js +2 -0
- package/dist/cli-bundle/focused-chunks/chunk-IWITF53W.js +2 -0
- package/dist/cli-bundle/focused-chunks/chunk-OQUGRHKV.js +10 -0
- package/dist/cli-bundle/focused-chunks/{chunk-M6PBRFSH.js → chunk-PNKIANFZ.js} +2 -2
- package/dist/cli-bundle/focused-chunks/{chunk-LIJIA4TY.js → chunk-QQQ4SAUO.js} +3 -3
- package/dist/cli-bundle/focused-chunks/chunk-TTYXF5YD.js +177 -0
- package/dist/cli-bundle/focused-chunks/chunk-XNR3DM6J.js +2 -0
- package/dist/cli-bundle/focused-chunks/chunk-XSS3APUF.js +9 -0
- package/dist/cli-bundle/focused-chunks/chunk-YCDQ2N23.js +8 -0
- package/dist/cli-bundle/focused-chunks/chunk-YJUXGS57.js +20 -0
- package/dist/cli-bundle/focused-chunks/chunk-ZTCE4UO6.js +58 -0
- package/dist/cli-bundle/main.js +20 -20
- package/dist/cli-bundle/sdk-authoring.js +1 -1
- package/dist/cli-bundle/sdk-contracts.js +2 -2
- package/dist/cli-bundle/sdk-core.js +37 -37
- package/dist/cli-bundle/sdk-governance.js +1 -1
- package/dist/cli-bundle/sdk-graph.js +1 -1
- package/dist/cli-bundle/sdk-merge.js +42 -42
- package/dist/cli-bundle/sdk-query.js +1 -1
- package/dist/cli-bundle/sdk-runtime.js +1 -1
- package/dist/cli-bundle/sdk-testing.js +1 -1
- package/dist/cli-bundle/sdk.js +11 -11
- package/dist/cli.js +1 -104
- package/dist/core/checkpoint/checkpoint-gc.js +1 -169
- package/dist/core/checkpoint/mutation-checkpoint.js +2 -133
- package/dist/core/config/nested-settings.js +1 -534
- package/dist/core/config/positional-value.js +1 -109
- package/dist/core/diagnostics/remediation.js +1 -506
- package/dist/core/extensions/activation-summary-markdown.js +2 -145
- package/dist/core/extensions/activation-summary.js +1 -92
- package/dist/core/extensions/activation-transaction.js +1 -46
- package/dist/core/extensions/capability-usage.js +1 -173
- package/dist/core/extensions/command-hook-context.js +1 -13
- package/dist/core/extensions/command-metadata-contract.js +1 -22
- package/dist/core/extensions/command-visibility-tier.js +1 -29
- package/dist/core/extensions/contribution-inventory.js +1 -173
- package/dist/core/extensions/exporter-output-contract.js +1 -66
- package/dist/core/extensions/extension-candidate.js +1 -18
- package/dist/core/extensions/extension-capability-aliases.js +1 -158
- package/dist/core/extensions/extension-hook-runtime.js +1 -699
- package/dist/core/extensions/extension-policy.js +1 -599
- package/dist/core/extensions/extension-registries.js +1 -62
- package/dist/core/extensions/extension-runtime-helpers.js +1 -33
- package/dist/core/extensions/extension-types.js +1 -102
- package/dist/core/extensions/flag-definition-validation.js +1 -52
- package/dist/core/extensions/flag-value-types.js +1 -64
- package/dist/core/extensions/index.js +1 -526
- package/dist/core/extensions/item-field-types.js +1 -39
- package/dist/core/extensions/item-fields.js +1 -261
- package/dist/core/extensions/loader.js +1 -2223
- package/dist/core/extensions/manifest-schema.js +1 -69
- package/dist/core/extensions/module-graph-snapshot.js +1 -33
- package/dist/core/extensions/preflight-ownership.js +1 -41
- package/dist/core/extensions/registration-validation.js +1 -82
- package/dist/core/extensions/registration-values.js +1 -209
- package/dist/core/extensions/reserved-host-flags.js +1 -36
- package/dist/core/extensions/runtime-registrations.js +1 -67
- package/dist/core/extensions/service-ownership.js +1 -19
- package/dist/core/extensions/version-compat.js +1 -216
- package/dist/core/fs/fs-utils.js +2 -158
- package/dist/core/fs/host-environment-errors.js +1 -141
- package/dist/core/fs/index.js +1 -9
- package/dist/core/fs/path-utils.js +1 -17
- package/dist/core/governance/content-fields.js +1 -160
- package/dist/core/governance/issue-codes.js +1 -151
- package/dist/core/governance/metadata-coverage.js +1 -358
- package/dist/core/history/drift-cache.js +3 -72
- package/dist/core/history/drift-scan.js +1 -342
- package/dist/core/history/event-classification.js +1 -109
- package/dist/core/history/event-index.js +8 -784
- package/dist/core/history/history-compact-bulk.js +1 -104
- package/dist/core/history/history-diff.js +1 -158
- package/dist/core/history/history-rewrite.d.ts +6 -1
- package/dist/core/history/history-rewrite.js +1 -107
- package/dist/core/history/history-storage-stats.js +1 -102
- package/dist/core/history/history-stream-policy.js +1 -62
- package/dist/core/history/history.js +2 -617
- package/dist/core/history/identity.js +1 -30
- package/dist/core/history/index.js +1 -9
- package/dist/core/history/projection.js +1 -196
- package/dist/core/history/read.d.ts +9 -0
- package/dist/core/history/read.js +1 -57
- package/dist/core/history/replay.js +2 -439
- package/dist/core/history/version-address.js +1 -32
- package/dist/core/history/workspace-history.js +2 -433
- package/dist/core/io/body-file.js +1 -62
- package/dist/core/io/bulk-ids-input.js +1 -112
- package/dist/core/item/actionability.js +1 -327
- package/dist/core/item/dependency-reference.js +1 -20
- package/dist/core/item/id.js +1 -112
- package/dist/core/item/index.js +1 -12
- package/dist/core/item/item-format-version.js +1 -78
- package/dist/core/item/item-format.js +5 -1473
- package/dist/core/item/item-record.js +1 -23
- package/dist/core/item/item-type-definition.js +1 -133
- package/dist/core/item/parent-reference-policy.js +1 -57
- package/dist/core/item/parse.js +2 -603
- package/dist/core/item/plan-lifecycle.js +1 -19
- package/dist/core/item/priority.js +1 -61
- package/dist/core/item/sprint-release-format.js +1 -38
- package/dist/core/item/status-filter.js +1 -115
- package/dist/core/item/status.js +1 -43
- package/dist/core/item/toon-decode.js +1 -29
- package/dist/core/item/type-registry.js +1 -715
- package/dist/core/item/type-synonyms.js +1 -38
- package/dist/core/lock/index.js +1 -9
- package/dist/core/lock/lock-gc.js +1 -240
- package/dist/core/lock/lock.js +3 -590
- package/dist/core/output/mutation-projection.js +1 -217
- package/dist/core/output/output-control.js +1 -25
- package/dist/core/output/output.js +11 -494
- package/dist/core/output/query-summary.js +1 -58
- package/dist/core/output/tabular.js +1 -77
- package/dist/core/packages/manifest.js +1 -244
- package/dist/core/packages/root.js +1 -84
- package/dist/core/policy/workflow-policy-schema.d.ts +312 -0
- package/dist/core/policy/workflow-policy-schema.js +2 -0
- package/dist/core/policy/workflow-policy-store.d.ts +24 -0
- package/dist/core/policy/workflow-policy-store.js +2 -0
- package/dist/core/policy/workflow-policy.d.ts +139 -0
- package/dist/core/policy/workflow-policy.js +2 -0
- package/dist/core/profile/profile-describe.js +1 -83
- package/dist/core/profile/profile-lint.js +1 -415
- package/dist/core/profile/profile-plan.js +0 -0
- package/dist/core/profile/profile-presets.js +1 -370
- package/dist/core/reproducibility/context.js +1 -82
- package/dist/core/schema/fields-file.js +2 -288
- package/dist/core/schema/item-types-file.js +2 -296
- package/dist/core/schema/runtime-field-filters.js +1 -49
- package/dist/core/schema/runtime-field-values.js +1 -313
- package/dist/core/schema/runtime-schema.js +2 -826
- package/dist/core/schema/status-defs-file.js +2 -227
- package/dist/core/schema/status-token.js +1 -31
- package/dist/core/schema/type-inference.js +1 -95
- package/dist/core/schema/type-presets.js +1 -87
- package/dist/core/schema/type-workflows.js +1 -104
- package/dist/core/search/background-refresh.js +2 -286
- package/dist/core/search/bm25.js +1 -146
- package/dist/core/search/cache.js +2 -534
- package/dist/core/search/corpus.js +1 -311
- package/dist/core/search/embedding-batches.js +1 -163
- package/dist/core/search/eval.js +1 -225
- package/dist/core/search/http-client.js +1 -75
- package/dist/core/search/providers.js +1 -242
- package/dist/core/search/relevance.js +1 -244
- package/dist/core/search/semantic-defaults.js +1 -199
- package/dist/core/search/staleness.js +1 -30
- package/dist/core/search/vector-stores.js +2 -664
- package/dist/core/search/vectorization-metadata.js +1 -81
- package/dist/core/sentry/helpers.js +1 -272
- package/dist/core/sentry/instrument.js +1 -387
- package/dist/core/session/session-state.js +1 -260
- package/dist/core/shared/agent-session-context.js +1 -133
- package/dist/core/shared/author.js +1 -1172
- package/dist/core/shared/command-types.js +1 -4
- package/dist/core/shared/conflict-markers.js +1 -31
- package/dist/core/shared/constants.js +1 -405
- package/dist/core/shared/errors.js +1 -20
- package/dist/core/shared/html-entity-decode.js +1 -131
- package/dist/core/shared/index.js +1 -12
- package/dist/core/shared/item-metadata-contract.js +1 -89
- package/dist/core/shared/lazy-module.js +1 -16
- package/dist/core/shared/levenshtein.js +1 -61
- package/dist/core/shared/memo.js +1 -19
- package/dist/core/shared/numeric-parsers.js +1 -20
- package/dist/core/shared/option-alias-visibility.js +1 -67
- package/dist/core/shared/primitives.js +1 -127
- package/dist/core/shared/serial-queue.js +1 -79
- package/dist/core/shared/serialization.js +1 -210
- package/dist/core/shared/split-comma-list.js +1 -30
- package/dist/core/shared/text-normalization.js +1 -38
- package/dist/core/shared/time.js +1 -306
- package/dist/core/store/index.js +1 -12
- package/dist/core/store/item-format-migration.js +1 -125
- package/dist/core/store/item-metadata-cache.js +1 -1116
- package/dist/core/store/item-metadata-query-index.js +9 -394
- package/dist/core/store/item-metadata-read-work.js +1 -43
- package/dist/core/store/item-store.js +1 -693
- package/dist/core/store/paths.d.ts +1 -1
- package/dist/core/store/paths.js +1 -214
- package/dist/core/store/settings-read-cache.js +1 -85
- package/dist/core/store/settings-validator.d.ts +1 -0
- package/dist/core/store/settings-validator.js +1 -421
- package/dist/core/store/settings.js +3 -1309
- package/dist/core/store/tracker-preflight.js +1 -141
- package/dist/core/telemetry/consent.js +5 -108
- package/dist/core/telemetry/observability.js +1 -246
- package/dist/core/telemetry/runtime.js +4 -1988
- package/dist/core/test/background-runs.js +4 -945
- package/dist/core/test/item-test-run-tracking.js +1 -63
- package/dist/core/test/run-selectors.js +1 -120
- package/dist/core/validate/estimate-defaults.js +1 -89
- package/dist/core/validate/fix-planning.js +1 -189
- package/dist/core/validate/linked-artifact-reference.js +1 -36
- package/dist/core/validate/missing-by-type.js +1 -34
- package/dist/core/validate/missing-link-owners.js +1 -95
- package/dist/core/validate/stale-file-classification.js +1 -82
- package/dist/mcp/http-server.js +5 -448
- package/dist/mcp/legacy-adapter.js +1 -77
- package/dist/mcp/runtime-capabilities.js +1 -200
- package/dist/mcp/server.js +4 -1233
- package/dist/mcp/tool-definitions.js +1 -804
- package/dist/sdk/actionability.js +1 -13
- package/dist/sdk/agent/closed-domain-contracts.js +1 -161
- package/dist/sdk/agent/command-recovery.js +1 -59
- package/dist/sdk/agent/command-suggestions.js +1 -66
- package/dist/sdk/agent/create-option-policy.js +1 -31
- package/dist/sdk/agent/identity-config.js +1 -106
- package/dist/sdk/agent/item-addressing.js +1 -207
- package/dist/sdk/agent/refusal-closure-census.js +1 -151
- package/dist/sdk/agent/refusal-closure.js +1 -133
- package/dist/sdk/agent/refusal-corpus-contracts.js +1 -193
- package/dist/sdk/agent/refusal-reachability.js +1 -593
- package/dist/sdk/agent/subcommand-recovery.js +1 -83
- package/dist/sdk/agent/task-transcript-contracts.js +1 -197
- package/dist/sdk/agent/tracker-preflight-contracts.js +1 -126
- package/dist/sdk/agent-capability-contracts.js +1 -428
- package/dist/sdk/agent-session-context.js +1 -9
- package/dist/sdk/annotations.js +1 -448
- package/dist/sdk/author-attribution.js +1 -468
- package/dist/sdk/authoring.js +1 -20
- package/dist/sdk/cli-bootstrap.js +1 -838
- package/dist/sdk/cli-contracts/agent-output-contracts.d.ts +1 -1
- package/dist/sdk/cli-contracts/agent-output-contracts.js +4 -476
- package/dist/sdk/cli-contracts/bootstrap-command-scanner.js +1 -79
- package/dist/sdk/cli-contracts/command-aliases.d.ts +4 -0
- package/dist/sdk/cli-contracts/command-aliases.js +1 -107
- package/dist/sdk/cli-contracts/command-exit-contracts.js +1 -151
- package/dist/sdk/cli-contracts/commander-mutation-options.js +1 -1081
- package/dist/sdk/cli-contracts/commander-types.js +1 -159
- package/dist/sdk/cli-contracts/completeness.js +1 -393
- package/dist/sdk/cli-contracts/enum-contracts.d.ts +1 -1
- package/dist/sdk/cli-contracts/enum-contracts.js +1 -222
- package/dist/sdk/cli-contracts/flag-contracts.js +1 -1947
- package/dist/sdk/cli-contracts/flag-lexicon-contracts.js +1 -347
- package/dist/sdk/cli-contracts/grammar-contracts.js +1 -986
- package/dist/sdk/cli-contracts/registration-helpers.js +7 -990
- package/dist/sdk/cli-contracts/runtime-contracts.d.ts +5 -0
- package/dist/sdk/cli-contracts/runtime-contracts.js +1 -2090
- package/dist/sdk/cli-contracts/schemas/assurance-definition.js +1 -324
- package/dist/sdk/cli-contracts/string-lists.js +1 -16
- package/dist/sdk/cli-contracts/tool-option-contracts.js +1 -461
- package/dist/sdk/cli-contracts/tool-parameter-tables.js +1 -2167
- package/dist/sdk/cli-contracts/tool-schema.d.ts +3 -1
- package/dist/sdk/cli-contracts/tool-schema.js +1 -1664
- package/dist/sdk/cli-contracts/typed-action-inputs.js +1 -4
- package/dist/sdk/cli-contracts.d.ts +1 -1
- package/dist/sdk/cli-contracts.js +1 -17
- package/dist/sdk/cli-program.js +1 -49
- package/dist/sdk/command-line.d.ts +2 -5
- package/dist/sdk/command-line.js +1 -78
- package/dist/sdk/comments.js +1 -133
- package/dist/sdk/compile-cache.js +1 -73
- package/dist/sdk/completion.js +174 -839
- package/dist/sdk/compose.js +1 -1090
- package/dist/sdk/config.js +1 -1204
- package/dist/sdk/context/recency.js +1 -33
- package/dist/sdk/context/semantic-session-attribution.js +1 -82
- package/dist/sdk/context/usage-egress.js +1 -29
- package/dist/sdk/context/usage-ledger.js +3 -185
- package/dist/sdk/context-intent-contracts.js +1 -709
- package/dist/sdk/context-intent-runtime.js +1 -115
- package/dist/sdk/context-packing.js +1 -218
- package/dist/sdk/context-relevance.js +1 -503
- package/dist/sdk/context-signal-store.js +2 -426
- package/dist/sdk/context-usage.js +1 -367
- package/dist/sdk/contracts.js +1 -23
- package/dist/sdk/core-governance.js +1 -14
- package/dist/sdk/core.js +1 -14
- package/dist/sdk/corpus-shape.js +1 -401
- package/dist/sdk/define.js +1 -220
- package/dist/sdk/dependencies.js +1 -718
- package/dist/sdk/dependency-flag-validation.js +1 -156
- package/dist/sdk/dependency-provenance.js +1 -135
- package/dist/sdk/docs.js +1 -14
- package/dist/sdk/duplicates.js +1 -40
- package/dist/sdk/environment/agent-environment.js +1 -466
- package/dist/sdk/environment/host-environment-errors.js +1 -8
- package/dist/sdk/environment/project-runtime-compatibility.js +1 -481
- package/dist/sdk/environment/source-context.js +1 -28
- package/dist/sdk/environment/tracker-preflight.js +1 -9
- package/dist/sdk/error-code-catalog.js +1 -153
- package/dist/sdk/error-runtime.js +1 -58
- package/dist/sdk/errors.js +1 -58
- package/dist/sdk/eval.js +1 -190
- package/dist/sdk/extension/author-manifest.js +1 -92
- package/dist/sdk/extension/bundled-catalog.js +1 -332
- package/dist/sdk/extension/concurrency.js +1 -25
- package/dist/sdk/extension/copy-scope.d.ts +2 -0
- package/dist/sdk/extension/copy-scope.js +2 -0
- package/dist/sdk/extension/custom-field-collisions.js +1 -30
- package/dist/sdk/extension/describe.js +3 -189
- package/dist/sdk/extension/doctor.js +1 -606
- package/dist/sdk/extension/install-plan.d.ts +69 -0
- package/dist/sdk/extension/install-plan.js +2 -0
- package/dist/sdk/extension/install-receipts.d.ts +7 -0
- package/dist/sdk/extension/install-receipts.js +2 -0
- package/dist/sdk/extension/install-runtime.js +3 -313
- package/dist/sdk/extension/install-snapshot.js +1 -66
- package/dist/sdk/extension/install-sources.js +5 -1057
- package/dist/sdk/extension/managed-state.js +2 -252
- package/dist/sdk/extension/migrations.js +2 -174
- package/dist/sdk/extension/output-ownership.js +1 -25
- package/dist/sdk/extension/runtime-summary.js +1 -18
- package/dist/sdk/extension/scaffold.js +4 -2308
- package/dist/sdk/extension/shared.js +1 -147
- package/dist/sdk/extension/source-resolution.js +1 -65
- package/dist/sdk/extension/update-check.js +1 -67
- package/dist/sdk/extension-command-context.js +1 -44
- package/dist/sdk/extension-contracts.js +1 -73
- package/dist/sdk/extension.d.ts +7 -2
- package/dist/sdk/extension.js +1 -2196
- package/dist/sdk/files.js +1 -535
- package/dist/sdk/flag-invocation-contracts.d.ts +0 -5
- package/dist/sdk/flag-invocation-contracts.js +1 -344
- package/dist/sdk/generated/generated-error-code-catalog-part-1.js +1 -2224
- package/dist/sdk/generated/generated-error-code-catalog-part-2.js +1 -2236
- package/dist/sdk/generated-error-code-catalog.js +1 -16
- package/dist/sdk/governance/assurance-action-contracts.js +1 -4
- package/dist/sdk/governance/assurance-action.js +1 -411
- package/dist/sdk/governance/assurance-limits.js +1 -10
- package/dist/sdk/governance/assurance-mutation-error.js +1 -81
- package/dist/sdk/governance/assurance-presets.js +1 -135
- package/dist/sdk/governance/assurance-runtime.js +1 -238
- package/dist/sdk/governance/assurance.js +4 -1182
- package/dist/sdk/governance/boundary-fixtures.js +1 -200
- package/dist/sdk/governance/coverage-assurance.js +1 -60
- package/dist/sdk/governance/defect-recurrence-coverage.js +1 -188
- package/dist/sdk/governance/defect-recurrence-graph.js +1 -120
- package/dist/sdk/governance/defect-recurrence-signals.js +1 -24
- package/dist/sdk/governance/defect-recurrence.js +1 -623
- package/dist/sdk/governance/extension-host-version.js +1 -115
- package/dist/sdk/governance/gc.js +1 -368
- package/dist/sdk/governance/health.js +1 -2367
- package/dist/sdk/governance/hierarchy-validation.js +1 -108
- package/dist/sdk/governance/linked-file-report.js +1 -71
- package/dist/sdk/governance/merge-receipt-history.js +1 -206
- package/dist/sdk/governance/provenance-health.js +1 -282
- package/dist/sdk/governance/reindex.js +4 -761
- package/dist/sdk/governance/stale-work.js +1 -82
- package/dist/sdk/governance/status-role-diagnostics.js +1 -35
- package/dist/sdk/governance/storage-integrity.js +1 -280
- package/dist/sdk/governance/tracked-runtime-cache.js +1 -106
- package/dist/sdk/governance/upgrade.js +2 -327
- package/dist/sdk/governance/validate-history-drift.js +1 -81
- package/dist/sdk/governance/validate-item-reader.js +1 -17
- package/dist/sdk/governance/validate-normalization.js +1 -36
- package/dist/sdk/governance/validate.d.ts +3 -1
- package/dist/sdk/governance/validate.js +1 -2261
- package/dist/sdk/governance/workflow-completeness.d.ts +32 -0
- package/dist/sdk/governance/workflow-completeness.js +2 -0
- package/dist/sdk/governance/workflow-policy.d.ts +47 -0
- package/dist/sdk/governance/workflow-policy.js +4 -0
- package/dist/sdk/governance/workspace-position.js +1 -163
- package/dist/sdk/governance.d.ts +2 -0
- package/dist/sdk/governance.js +1 -31
- package/dist/sdk/graph/adapter.js +1 -181
- package/dist/sdk/graph/analytics.js +1 -474
- package/dist/sdk/graph/assembly.js +1 -377
- package/dist/sdk/graph/cache.js +1 -160
- package/dist/sdk/graph/centrality.js +1 -258
- package/dist/sdk/graph/conformance.js +1 -130
- package/dist/sdk/graph/deadline-scheduling.d.ts +90 -0
- package/dist/sdk/graph/deadline-scheduling.js +2 -0
- package/dist/sdk/graph/durable-cache.d.ts +1 -1
- package/dist/sdk/graph/durable-cache.js +1 -361
- package/dist/sdk/graph/governance-contracts.js +1 -34
- package/dist/sdk/graph/governance.d.ts +13 -1
- package/dist/sdk/graph/governance.js +1 -735
- package/dist/sdk/graph/hierarchy-integrity.js +1 -310
- package/dist/sdk/graph/index.d.ts +3 -2
- package/dist/sdk/graph/index.js +1 -26
- package/dist/sdk/graph/lifecycle-coverage.d.ts +32 -0
- package/dist/sdk/graph/lifecycle-coverage.js +2 -0
- package/dist/sdk/graph/mutation-advisory.js +1 -176
- package/dist/sdk/graph/remediation.js +1 -197
- package/dist/sdk/graph/run.d.ts +15 -1
- package/dist/sdk/graph/run.js +1 -768
- package/dist/sdk/graph/scheduling.js +1 -124
- package/dist/sdk/graph/traversal.js +1 -284
- package/dist/sdk/graph/workspace-relationship-kind-registry.js +1 -27
- package/dist/sdk/graph.js +1 -15
- package/dist/sdk/guide-topics.js +1 -707
- package/dist/sdk/guide.js +1 -279
- package/dist/sdk/history/maintenance.d.ts +71 -0
- package/dist/sdk/history/maintenance.js +2 -0
- package/dist/sdk/history/salvage.js +2 -247
- package/dist/sdk/history/subject.d.ts +19 -0
- package/dist/sdk/history/subject.js +2 -0
- package/dist/sdk/history-analytics.js +1 -282
- package/dist/sdk/history-compact.js +1 -527
- package/dist/sdk/history-mcp.js +1 -68
- package/dist/sdk/history-provenance.js +1 -182
- package/dist/sdk/history-read.js +1 -96
- package/dist/sdk/history-redact.d.ts +1 -14
- package/dist/sdk/history-redact.js +1 -643
- package/dist/sdk/history-repair.d.ts +5 -0
- package/dist/sdk/history-repair.js +1 -657
- package/dist/sdk/improvement-ledger-validation.js +1 -62
- package/dist/sdk/improvement-ledger.js +2 -257
- package/dist/sdk/index.d.ts +4 -1
- package/dist/sdk/index.js +1 -183
- package/dist/sdk/init-agent-guidance.js +2 -496
- package/dist/sdk/init.js +2 -820
- package/dist/sdk/invocation-author.js +1 -39
- package/dist/sdk/item-children.js +1 -90
- package/dist/sdk/item-metadata-index.js +1 -15
- package/dist/sdk/item-schedule.js +1 -27
- package/dist/sdk/item-transaction.js +1 -396
- package/dist/sdk/learnings.js +1 -29
- package/dist/sdk/lifecycle/append.js +2 -53
- package/dist/sdk/lifecycle/claim.d.ts +2 -0
- package/dist/sdk/lifecycle/claim.js +1 -242
- package/dist/sdk/lifecycle/close-many.js +1 -438
- package/dist/sdk/lifecycle/close.js +1 -468
- package/dist/sdk/lifecycle/copy.js +1 -212
- package/dist/sdk/lifecycle/create.js +1 -1949
- package/dist/sdk/lifecycle/delete.js +1 -45
- package/dist/sdk/lifecycle/event-validation-messages.js +1 -91
- package/dist/sdk/lifecycle/focus.js +1 -91
- package/dist/sdk/lifecycle/hierarchy-mutation-lock.js +1 -24
- package/dist/sdk/lifecycle/legacy-none-tokens.js +1 -149
- package/dist/sdk/lifecycle/lifecycle-transitions.js +1 -40
- package/dist/sdk/lifecycle/mcp-actions.d.ts +2 -0
- package/dist/sdk/lifecycle/mcp-actions.js +1 -51
- package/dist/sdk/lifecycle/metadata-normalizers.js +1 -46
- package/dist/sdk/lifecycle/mutation-command-options.js +1 -9
- package/dist/sdk/lifecycle/plan.js +1 -1606
- package/dist/sdk/lifecycle/recurrence-parsers.d.ts +1 -1
- package/dist/sdk/lifecycle/recurrence-parsers.js +1 -147
- package/dist/sdk/lifecycle/reopen.js +1 -68
- package/dist/sdk/lifecycle/repeatable-metadata-parsers.js +1 -143
- package/dist/sdk/lifecycle/restore.d.ts +1 -0
- package/dist/sdk/lifecycle/restore.js +1 -330
- package/dist/sdk/lifecycle/shared-unset-fields.js +1 -295
- package/dist/sdk/lifecycle/update-many.js +1 -861
- package/dist/sdk/lifecycle/update.js +1 -2136
- package/dist/sdk/lifecycle-completion.js +1 -92
- package/dist/sdk/lifecycle-policy.js +1 -120
- package/dist/sdk/linked-artifacts.js +1 -530
- package/dist/sdk/mcp/apps.js +4 -133
- package/dist/sdk/mcp/authorization.js +1 -404
- package/dist/sdk/mcp/discovery.js +1 -494
- package/dist/sdk/mcp/interactions.js +1 -336
- package/dist/sdk/mcp/protocol.d.ts +7 -0
- package/dist/sdk/mcp/protocol.js +1 -184
- package/dist/sdk/mcp/skills.js +1 -389
- package/dist/sdk/mcp/subscriptions.js +1 -211
- package/dist/sdk/mcp/tasks.js +2 -430
- package/dist/sdk/mcp/transport.js +1 -260
- package/dist/sdk/merge/abandoned-receipts.js +1 -46
- package/dist/sdk/merge/driver.js +1 -212
- package/dist/sdk/merge/index.js +1 -16
- package/dist/sdk/merge/install.js +3 -561
- package/dist/sdk/merge/receipt-file-boundary.js +1 -46
- package/dist/sdk/merge/receipt-operation.js +1 -96
- package/dist/sdk/merge/receipt-schema.js +1 -397
- package/dist/sdk/merge/receipts.js +4 -525
- package/dist/sdk/merge/reconcile.js +1 -352
- package/dist/sdk/merge/three-way.js +3 -775
- package/dist/sdk/merge.js +1 -10
- package/dist/sdk/mutation-events.js +1 -292
- package/dist/sdk/mutation-guard.js +1 -216
- package/dist/sdk/notes.js +1 -139
- package/dist/sdk/output-contracts.js +1 -172
- package/dist/sdk/output-projection.js +1 -430
- package/dist/sdk/output-token-accounting.js +1 -140
- package/dist/sdk/output.js +1 -64
- package/dist/sdk/ownership-source.js +1 -21
- package/dist/sdk/package-import-adapters.js +1 -442
- package/dist/sdk/package-migrations.js +1 -20
- package/dist/sdk/package-runtime-options.js +1 -80
- package/dist/sdk/pagination.js +1 -162
- package/dist/sdk/profile.js +1 -454
- package/dist/sdk/provenance.js +1 -258
- package/dist/sdk/public-surface.json +1 -1
- package/dist/sdk/query/activity.js +1 -401
- package/dist/sdk/query/aggregate.d.ts +16 -0
- package/dist/sdk/query/aggregate.js +1 -390
- package/dist/sdk/query/calendar.js +1 -964
- package/dist/sdk/query/complete-list.js +1 -215
- package/dist/sdk/query/context.js +1 -1702
- package/dist/sdk/query/duplicate-candidates.js +1 -70
- package/dist/sdk/query/get.js +1 -450
- package/dist/sdk/query/history.js +1 -186
- package/dist/sdk/query/item-filter-options.js +1 -9
- package/dist/sdk/query/light-metadata.js +1 -18
- package/dist/sdk/query/list-filter-shared.js +1 -81
- package/dist/sdk/query/list.js +1 -1304
- package/dist/sdk/query/multi-value-filters.js +1 -78
- package/dist/sdk/query/next.js +1 -513
- package/dist/sdk/query/parsers.js +1 -44
- package/dist/sdk/query/projection-contracts.js +1 -184
- package/dist/sdk/query/search-contracts.d.ts +27 -0
- package/dist/sdk/query/search-contracts.js +1 -230
- package/dist/sdk/query/search-pagination.js +1 -35
- package/dist/sdk/query/search-rendering.js +1 -105
- package/dist/sdk/query/search.d.ts +6 -4
- package/dist/sdk/query/search.js +2 -1987
- package/dist/sdk/query.js +1 -35
- package/dist/sdk/read-output/continuation.js +1 -194
- package/dist/sdk/read-output-budget.js +1 -135
- package/dist/sdk/read-output-contracts.d.ts +1 -1
- package/dist/sdk/read-output-contracts.js +1 -1225
- package/dist/sdk/read-output-rows.js +1 -186
- package/dist/sdk/read-output-session.js +1 -208
- package/dist/sdk/relationship-analytics.js +1 -410
- package/dist/sdk/relationship-context.js +1 -284
- package/dist/sdk/relationship-history.js +4 -519
- package/dist/sdk/relationship-kinds/contract.js +1 -22
- package/dist/sdk/relationship-migration.js +1 -77
- package/dist/sdk/relationships.js +1 -579
- package/dist/sdk/reproducibility/process.js +1 -87
- package/dist/sdk/runtime-action-aliases.js +1 -59
- package/dist/sdk/runtime-extended-actions.js +1 -177
- package/dist/sdk/runtime-input.js +1 -614
- package/dist/sdk/runtime-primitives.js +1 -84
- package/dist/sdk/runtime-public-contracts.d.ts +2 -1
- package/dist/sdk/runtime-public-contracts.js +1 -4
- package/dist/sdk/runtime-stats-options.js +1 -38
- package/dist/sdk/runtime.d.ts +4 -0
- package/dist/sdk/runtime.js +1 -1928
- package/dist/sdk/scheduling-shortcuts.js +1 -63
- package/dist/sdk/schema-migration.js +3 -856
- package/dist/sdk/schema.d.ts +2 -1
- package/dist/sdk/schema.js +1 -1376
- package/dist/sdk/search-refresh-worker.js +1 -18
- package/dist/sdk/similarity-scoring.js +1 -53
- package/dist/sdk/similarity.js +1 -326
- package/dist/sdk/start-task-status.js +1 -14
- package/dist/sdk/stats.js +1 -270
- package/dist/sdk/structured-mutations.js +1 -580
- package/dist/sdk/telemetry-flush.js +1 -13
- package/dist/sdk/telemetry.js +1 -405
- package/dist/sdk/templates.js +2 -292
- package/dist/sdk/test/batch.js +2 -509
- package/dist/sdk/test/entry.js +1 -70
- package/dist/sdk/test/execution.js +6 -2211
- package/dist/sdk/test/linked-command-detection.js +1 -546
- package/dist/sdk/test/measurements.js +1 -91
- package/dist/sdk/test/parsers.js +1 -545
- package/dist/sdk/test/runs.js +1 -193
- package/dist/sdk/test/trust.js +2 -206
- package/dist/sdk/testing.js +4 -1391
- package/dist/sdk/traceability/runtime-files-lookup.js +1 -32
- package/dist/sdk/traceability/source-traceability.js +1 -292
- package/dist/sdk/tracker-root-discovery.js +1 -9
- package/dist/sdk/workspace-contracts-cache.js +1 -28
- package/dist/sdk/workspace-contracts.js +1 -33
- package/dist/sdk/workspace-memory.js +2 -318
- package/dist/sdk/workspace-recipe.js +1 -71
- package/dist/sdk/workspace-snapshot.js +4 -613
- package/dist/sdk/workspace-transaction-gc.js +1 -149
- package/dist/sdk/workspace-transaction.js +2 -363
- package/dist/sdk/workspace.js +3 -127
- package/dist/types/index.js +1 -9
- package/dist/types.d.ts +4 -0
- package/dist/types.js +1 -245
- package/docs/AGENT_GUIDE.md +1 -1
- package/docs/COMMANDS.md +10 -0
- package/docs/CONFIGURATION.md +12 -1
- package/docs/CONTEXT_ALGORITHM_PORTFOLIO.md +167 -0
- package/docs/DIAGNOSTIC_OUTPUT_CONTRACTS.md +9 -3
- package/docs/EXTENSIONS.md +1 -0
- package/docs/HISTORY_MAINTENANCE.md +125 -0
- package/docs/MCP_2026_07_28_CONFORMANCE.md +20 -10
- package/docs/PACKAGE_EVIDENCE.md +92 -0
- package/docs/PLANNING_MEASUREMENTS.md +183 -0
- package/docs/README.md +4 -0
- package/docs/READ_OUTPUT_CONTRACTS.md +5 -0
- package/docs/SCRIPTING.md +21 -0
- package/docs/TESTING.md +33 -0
- package/docs/WORKFLOW_POLICIES.md +129 -0
- package/docs/generated/FLAG_LEXICON_BUDGETS.md +7 -7
- package/docs/generated/REFUSAL_CLOSURE_CENSUS.md +11 -5
- package/marketplace.json +2 -2
- package/package.json +5 -5
- package/packages/pm-beads/package.json +1 -1
- package/packages/pm-calendar/package.json +1 -1
- package/packages/pm-command-kit/package.json +1 -1
- package/packages/pm-digital-twin/package.json +1 -1
- package/packages/pm-governance-audit/package.json +1 -1
- package/packages/pm-guide-shell/package.json +1 -1
- package/packages/pm-kanban/package.json +1 -1
- package/packages/pm-lifecycle-hooks/package.json +1 -1
- package/packages/pm-linked-test-adapters/package.json +1 -1
- package/packages/pm-search-advanced/package.json +1 -1
- package/packages/pm-templates/package.json +1 -1
- package/packages/pm-todos/package.json +1 -1
- package/packages/pm-vcs/package.json +1 -1
- package/plugins/pm-claude/.claude-plugin/plugin.json +1 -1
- package/plugins/pm-codex/.codex-plugin/plugin.json +1 -1
- package/scripts/finalize-build.mjs +45 -3
- package/dist/cli-bundle/chunks/chunk-AZDFJGH6.js +0 -9
- package/dist/cli-bundle/chunks/chunk-CKOL5U7J.js +0 -77
- package/dist/cli-bundle/chunks/chunk-JX4DH4WC.js +0 -3
- package/dist/cli-bundle/chunks/chunk-OF76PSDQ.js +0 -5
- package/dist/cli-bundle/chunks/chunk-QUWFABDM.js +0 -232
- package/dist/cli-bundle/chunks/chunk-QWRRFYK3.js +0 -2
- package/dist/cli-bundle/chunks/chunk-RWWBOWJ5.js +0 -2
- package/dist/cli-bundle/chunks/chunk-WGAOYSYH.js +0 -40
- package/dist/cli-bundle/chunks/chunk-WI2AYPA7.js +0 -2
- package/dist/cli-bundle/chunks/register-list-query-5JL52D33.js +0 -11
- package/dist/cli-bundle/chunks/register-mutation-ZPG7KMVP.js +0 -20
- package/dist/cli-bundle/chunks/register-operations-I5W3KMGB.js +0 -2
- package/dist/cli-bundle/chunks/register-setup-H4SVAVX7.js +0 -2
- package/dist/cli-bundle/focused-chunks/chunk-AL5ON6K6.js +0 -2
- package/dist/cli-bundle/focused-chunks/chunk-CHC2IDXA.js +0 -6
- package/dist/cli-bundle/focused-chunks/chunk-CK6QFAPZ.js +0 -20
- package/dist/cli-bundle/focused-chunks/chunk-EZR3GHFE.js +0 -2
- package/dist/cli-bundle/focused-chunks/chunk-H2WJWK7L.js +0 -56
- package/dist/cli-bundle/focused-chunks/chunk-NTPY5GSO.js +0 -3
- package/dist/cli-bundle/focused-chunks/chunk-P5O7MP5Y.js +0 -2
- package/dist/cli-bundle/focused-chunks/chunk-PDMW2E36.js +0 -177
- package/dist/cli-bundle/focused-chunks/chunk-PEFABF7E.js +0 -26
- package/dist/cli-bundle/focused-chunks/chunk-QTVCLMSZ.js +0 -6
- package/dist/cli-bundle/focused-chunks/chunk-QTZRBUYA.js +0 -8
- package/dist/cli-bundle/focused-chunks/chunk-SGQST3PQ.js +0 -12
- package/dist/cli-bundle/focused-chunks/chunk-UKHASMMP.js +0 -10
- package/dist/cli-bundle/focused-chunks/chunk-ZPEKQHOC.js +0 -2
|
@@ -1,416 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
* @module core/profile/profile-lint
|
|
3
|
-
*
|
|
4
|
-
* Author-time, tracker-independent consistency linting for a
|
|
5
|
-
* {@link ProjectProfileDefinition}. This is the project-profile analogue of the
|
|
6
|
-
* extension surface's `lintExtensionBlueprint`: where `defineProjectProfile`
|
|
7
|
-
* (and `api.registerProfile`) only assert structural shape, and
|
|
8
|
-
* {@link module:core/profile/profile-plan planProfileApplication} only validates
|
|
9
|
-
* config knobs fail-fast against a live tracker at apply time, this linter
|
|
10
|
-
* inspects a profile definition in isolation and reports *every* problem at once
|
|
11
|
-
* across all eight dimensions.
|
|
12
|
-
*
|
|
13
|
-
* Findings are graded:
|
|
14
|
-
* - `error` — a condition that makes `pm profile apply` throw or silently lose
|
|
15
|
-
* data (an invalid type/status/field the upsert normalizer rejects, a
|
|
16
|
-
* duplicate key whose later entry overwrites the earlier one, an unknown or
|
|
17
|
-
* invalid config knob the planner rejects, an empty profile name resolution
|
|
18
|
-
* requires, or a malformed workflow transition pair the workflow resolver
|
|
19
|
-
* silently drops).
|
|
20
|
-
* - `warning` — authored content that is structurally valid but very likely a
|
|
21
|
-
* bug (a workflow governing a type the profile never declares, a transition
|
|
22
|
-
* referencing a status token no profile/built-in status defines — a dead,
|
|
23
|
-
* unreachable rule — a template whose `type` references an undeclared type, a
|
|
24
|
-
* profile name resolution would fold, or an empty title/summary/package spec).
|
|
25
|
-
*
|
|
26
|
-
* Cross-reference checks are warnings rather than errors because the referenced
|
|
27
|
-
* type or status MAY already exist in the target tracker independently of the
|
|
28
|
-
* profile (profiles layer onto whatever schema is present), so erroring would
|
|
29
|
-
* produce false positives against valid layered setups.
|
|
30
|
-
*
|
|
31
|
-
* Everything here is pure and side-effect-free so it is fully coverage-gated; the
|
|
32
|
-
* CLI `pm profile lint` command and the SDK `assertProjectProfile` helper are
|
|
33
|
-
* thin wrappers around {@link lintProjectProfile}.
|
|
34
|
-
*/
|
|
35
|
-
|
|
36
|
-
!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]="f9b22df0-7ec2-5d72-bc88-3eb7201a6051")}catch(e){}}();
|
|
37
|
-
import { BUILTIN_ITEM_TYPE_VALUES } from "../../types/index.js";
|
|
38
|
-
import { parseNestedSettingValue, resolveNestedSettingDescriptor, } from "../config/nested-settings.js";
|
|
39
|
-
import { normalizeAddFieldInput } from "../schema/fields-file.js";
|
|
40
|
-
import { normalizeAddStatusInput } from "../schema/status-defs-file.js";
|
|
41
|
-
import { normalizeAddTypeInput } from "../schema/item-types-file.js";
|
|
42
|
-
import { normalizeStatusToken } from "../schema/type-workflows.js";
|
|
43
|
-
import { DEFAULT_RUNTIME_STATUS_DEFINITIONS } from "../schema/runtime-schema.js";
|
|
44
|
-
import { toErrorMessage } from "../shared/primitives.js";
|
|
45
|
-
import { resolvePmToolCustomFieldCollision } from "../../sdk/cli-contracts/tool-schema.js";
|
|
46
|
-
import { normalizeProfileLookupKey, } from "./profile-presets.js";
|
|
47
|
-
/** Profile dimension a lint finding is attributed to. */
|
|
48
|
-
export const PROFILE_LINT_DIMENSIONS = [
|
|
49
|
-
"profile",
|
|
50
|
-
"types",
|
|
51
|
-
"statuses",
|
|
52
|
-
"fields",
|
|
53
|
-
"workflows",
|
|
54
|
-
"config",
|
|
55
|
-
"templates",
|
|
56
|
-
"packages",
|
|
57
|
-
];
|
|
58
|
-
/** Stable machine-readable codes every {@link ProjectProfileLintFinding} carries. */
|
|
59
|
-
export const PROFILE_LINT_CODES = [
|
|
60
|
-
"profile_name_empty",
|
|
61
|
-
"profile_name_not_normalized",
|
|
62
|
-
"profile_title_empty",
|
|
63
|
-
"profile_summary_empty",
|
|
64
|
-
"type_invalid",
|
|
65
|
-
"type_duplicate",
|
|
66
|
-
"status_invalid",
|
|
67
|
-
"status_duplicate",
|
|
68
|
-
"field_invalid",
|
|
69
|
-
"field_duplicate",
|
|
70
|
-
"field_mcp_input_collision",
|
|
71
|
-
"workflow_type_empty",
|
|
72
|
-
"workflow_type_unknown",
|
|
73
|
-
"workflow_duplicate_type",
|
|
74
|
-
"workflow_transition_malformed",
|
|
75
|
-
"workflow_status_unknown",
|
|
76
|
-
"config_key_unknown",
|
|
77
|
-
"config_value_invalid",
|
|
78
|
-
"config_duplicate",
|
|
79
|
-
"template_type_unknown",
|
|
80
|
-
"package_spec_empty",
|
|
81
|
-
];
|
|
82
|
-
/** Built-in status tokens (canonical ids and their aliases, normalized) every tracker recognizes regardless of profile. A workflow transition referencing one of these is always resolvable, so it never triggers a `workflow_status_unknown` warning. Computed once from the canonical defaults so it never drifts. */
|
|
83
|
-
const BUILTIN_STATUS_TOKENS = new Set(DEFAULT_RUNTIME_STATUS_DEFINITIONS.flatMap((definition) => [
|
|
84
|
-
normalizeStatusToken(definition.id),
|
|
85
|
-
...(definition.aliases ?? []).map((alias) => normalizeStatusToken(alias)),
|
|
86
|
-
]).filter((token) => token.length > 0));
|
|
87
|
-
/** Built-in item type names, lower-cased for case-insensitive workflow/template matching. */
|
|
88
|
-
const BUILTIN_TYPE_KEYS = new Set(BUILTIN_ITEM_TYPE_VALUES.map((name) => name.toLowerCase()));
|
|
89
|
-
/** Lint the profile-level identity fields (name, title, summary). */
|
|
90
|
-
function lintProfileIdentity(profile, findings) {
|
|
91
|
-
if (profile.name.trim().length === 0) {
|
|
92
|
-
findings.push({
|
|
93
|
-
severity: "error",
|
|
94
|
-
code: "profile_name_empty",
|
|
95
|
-
dimension: "profile",
|
|
96
|
-
message: "Profile name must not be empty; profile resolution requires a non-blank name.",
|
|
97
|
-
});
|
|
98
|
-
}
|
|
99
|
-
else if (profile.name !== normalizeProfileLookupKey(profile.name)) {
|
|
100
|
-
findings.push({
|
|
101
|
-
severity: "warning",
|
|
102
|
-
code: "profile_name_not_normalized",
|
|
103
|
-
dimension: "profile",
|
|
104
|
-
target: profile.name,
|
|
105
|
-
message: `Profile name "${profile.name}" is not in canonical form; resolution folds it to "${normalizeProfileLookupKey(profile.name)}" (lowercase, hyphens as underscores).`,
|
|
106
|
-
});
|
|
107
|
-
}
|
|
108
|
-
if (profile.title.trim().length === 0) {
|
|
109
|
-
findings.push({
|
|
110
|
-
severity: "warning",
|
|
111
|
-
code: "profile_title_empty",
|
|
112
|
-
dimension: "profile",
|
|
113
|
-
message: "Profile title is empty; list and show surfaces will render a blank title.",
|
|
114
|
-
});
|
|
115
|
-
}
|
|
116
|
-
if (profile.summary.trim().length === 0) {
|
|
117
|
-
findings.push({
|
|
118
|
-
severity: "warning",
|
|
119
|
-
code: "profile_summary_empty",
|
|
120
|
-
dimension: "profile",
|
|
121
|
-
message: "Profile summary is empty; list and show surfaces will render a blank archetype description.",
|
|
122
|
-
});
|
|
123
|
-
}
|
|
124
|
-
}
|
|
125
|
-
/** Lint the item types, returning the set of declared type keys (lower-cased) collected from entries that normalize cleanly so workflow and template checks can resolve cross-references against them. */
|
|
126
|
-
function lintTypes(profile, findings) {
|
|
127
|
-
const declared = new Set();
|
|
128
|
-
const seen = new Set();
|
|
129
|
-
for (const [index, type] of profile.types.entries()) {
|
|
130
|
-
let name;
|
|
131
|
-
try {
|
|
132
|
-
name = normalizeAddTypeInput(type).name;
|
|
133
|
-
}
|
|
134
|
-
catch (error) {
|
|
135
|
-
findings.push({
|
|
136
|
-
severity: "error",
|
|
137
|
-
code: "type_invalid",
|
|
138
|
-
dimension: "types",
|
|
139
|
-
target: typeof type.name === "string" ? type.name : `#${index}`,
|
|
140
|
-
message: toErrorMessage(error),
|
|
141
|
-
});
|
|
142
|
-
continue;
|
|
143
|
-
}
|
|
144
|
-
const key = name.toLowerCase();
|
|
145
|
-
if (seen.has(key)) {
|
|
146
|
-
findings.push({
|
|
147
|
-
severity: "error",
|
|
148
|
-
code: "type_duplicate",
|
|
149
|
-
dimension: "types",
|
|
150
|
-
target: name,
|
|
151
|
-
message: `Item type "${name}" is declared more than once; the later definition silently overwrites the earlier upsert.`,
|
|
152
|
-
});
|
|
153
|
-
continue;
|
|
154
|
-
}
|
|
155
|
-
seen.add(key);
|
|
156
|
-
declared.add(key);
|
|
157
|
-
}
|
|
158
|
-
return declared;
|
|
159
|
-
}
|
|
160
|
-
/** Lint the custom statuses, returning the set of declared status tokens (ids and aliases, normalized) collected from entries that normalize cleanly so workflow transition checks can resolve cross-references against them. */
|
|
161
|
-
function lintStatuses(profile, findings) {
|
|
162
|
-
const declared = new Set();
|
|
163
|
-
const seen = new Set();
|
|
164
|
-
for (const [index, status] of profile.statuses.entries()) {
|
|
165
|
-
let normalized;
|
|
166
|
-
try {
|
|
167
|
-
normalized = normalizeAddStatusInput(status);
|
|
168
|
-
}
|
|
169
|
-
catch (error) {
|
|
170
|
-
findings.push({
|
|
171
|
-
severity: "error",
|
|
172
|
-
code: "status_invalid",
|
|
173
|
-
dimension: "statuses",
|
|
174
|
-
target: typeof status.id === "string" ? status.id : `#${index}`,
|
|
175
|
-
message: toErrorMessage(error),
|
|
176
|
-
});
|
|
177
|
-
continue;
|
|
178
|
-
}
|
|
179
|
-
if (seen.has(normalized.id)) {
|
|
180
|
-
findings.push({
|
|
181
|
-
severity: "error",
|
|
182
|
-
code: "status_duplicate",
|
|
183
|
-
dimension: "statuses",
|
|
184
|
-
target: normalized.id,
|
|
185
|
-
message: `Status "${normalized.id}" is declared more than once; the later definition silently overwrites the earlier upsert.`,
|
|
186
|
-
});
|
|
187
|
-
continue;
|
|
188
|
-
}
|
|
189
|
-
seen.add(normalized.id);
|
|
190
|
-
declared.add(normalized.id);
|
|
191
|
-
for (const alias of normalized.aliases ?? []) {
|
|
192
|
-
declared.add(normalizeStatusToken(alias));
|
|
193
|
-
}
|
|
194
|
-
}
|
|
195
|
-
return declared;
|
|
196
|
-
}
|
|
197
|
-
/** Lint the custom fields for invalid and duplicate keys. */
|
|
198
|
-
function lintFields(profile, findings) {
|
|
199
|
-
const seen = new Set();
|
|
200
|
-
for (const [index, field] of profile.fields.entries()) {
|
|
201
|
-
let key;
|
|
202
|
-
try {
|
|
203
|
-
key = normalizeAddFieldInput(field).key;
|
|
204
|
-
}
|
|
205
|
-
catch (error) {
|
|
206
|
-
findings.push({
|
|
207
|
-
severity: "error",
|
|
208
|
-
code: "field_invalid",
|
|
209
|
-
dimension: "fields",
|
|
210
|
-
target: typeof field.key === "string" ? field.key : `#${index}`,
|
|
211
|
-
message: toErrorMessage(error),
|
|
212
|
-
});
|
|
213
|
-
continue;
|
|
214
|
-
}
|
|
215
|
-
if (seen.has(key)) {
|
|
216
|
-
findings.push({
|
|
217
|
-
severity: "error",
|
|
218
|
-
code: "field_duplicate",
|
|
219
|
-
dimension: "fields",
|
|
220
|
-
target: key,
|
|
221
|
-
message: `Field "${key}" is declared more than once; the later definition silently overwrites the earlier upsert.`,
|
|
222
|
-
});
|
|
223
|
-
continue;
|
|
224
|
-
}
|
|
225
|
-
seen.add(key);
|
|
226
|
-
const collision = resolvePmToolCustomFieldCollision(key);
|
|
227
|
-
if (collision) {
|
|
228
|
-
findings.push({
|
|
229
|
-
severity: "warning",
|
|
230
|
-
code: "field_mcp_input_collision",
|
|
231
|
-
dimension: "fields",
|
|
232
|
-
target: key,
|
|
233
|
-
message: `Field "${key}" collides with canonical MCP property "${collision.property}" owned by ${collision.owner}; callers must pass the custom value through ${collision.nested_path}.`,
|
|
234
|
-
});
|
|
235
|
-
}
|
|
236
|
-
}
|
|
237
|
-
}
|
|
238
|
-
/** Lint the per-type workflows: flag workflows that govern an undeclared type, duplicate workflows for the same type, malformed transition pairs, and transitions referencing a status token no built-in or profile status defines. */
|
|
239
|
-
function lintWorkflows(profile, declaredTypes, declaredStatuses, findings) {
|
|
240
|
-
const seenTypes = new Set();
|
|
241
|
-
for (const [index, workflow] of profile.workflows.entries()) {
|
|
242
|
-
const typeKey = workflow.type.trim().toLowerCase();
|
|
243
|
-
if (typeKey.length === 0) {
|
|
244
|
-
findings.push({
|
|
245
|
-
severity: "error",
|
|
246
|
-
code: "workflow_type_empty",
|
|
247
|
-
dimension: "workflows",
|
|
248
|
-
target: `#${index}`,
|
|
249
|
-
message: "Workflow has an empty type; the workflow resolver drops entries without a type.",
|
|
250
|
-
});
|
|
251
|
-
continue;
|
|
252
|
-
}
|
|
253
|
-
const duplicate = seenTypes.has(typeKey);
|
|
254
|
-
seenTypes.add(typeKey);
|
|
255
|
-
if (duplicate) {
|
|
256
|
-
// The unknown-type check already fired for the first occurrence, so only
|
|
257
|
-
// report the duplication here to avoid a redundant second finding.
|
|
258
|
-
findings.push({
|
|
259
|
-
severity: "warning",
|
|
260
|
-
code: "workflow_duplicate_type",
|
|
261
|
-
dimension: "workflows",
|
|
262
|
-
target: workflow.type,
|
|
263
|
-
message: `Workflow type "${workflow.type}" is declared more than once; the later transition set wins.`,
|
|
264
|
-
});
|
|
265
|
-
}
|
|
266
|
-
else if (!BUILTIN_TYPE_KEYS.has(typeKey) && !declaredTypes.has(typeKey)) {
|
|
267
|
-
findings.push({
|
|
268
|
-
severity: "warning",
|
|
269
|
-
code: "workflow_type_unknown",
|
|
270
|
-
dimension: "workflows",
|
|
271
|
-
target: workflow.type,
|
|
272
|
-
message: `Workflow governs type "${workflow.type}" which is neither a built-in type nor declared by this profile; it has no effect unless that type already exists.`,
|
|
273
|
-
});
|
|
274
|
-
}
|
|
275
|
-
// Each unknown status is reported once per workflow (not globally) so a later
|
|
276
|
-
// workflow referencing the same unresolved token is still surfaced in its own
|
|
277
|
-
// context.
|
|
278
|
-
const reportedUnknownStatuses = new Set();
|
|
279
|
-
for (const pair of workflow.allowed_transitions) {
|
|
280
|
-
const from = normalizeStatusToken(pair[0]);
|
|
281
|
-
const to = normalizeStatusToken(pair[1]);
|
|
282
|
-
if (from.length === 0 || to.length === 0) {
|
|
283
|
-
findings.push({
|
|
284
|
-
severity: "error",
|
|
285
|
-
code: "workflow_transition_malformed",
|
|
286
|
-
dimension: "workflows",
|
|
287
|
-
target: workflow.type,
|
|
288
|
-
message: `Workflow "${workflow.type}" has a transition with an empty status; the workflow resolver silently drops it.`,
|
|
289
|
-
});
|
|
290
|
-
continue;
|
|
291
|
-
}
|
|
292
|
-
for (const token of [from, to]) {
|
|
293
|
-
if (BUILTIN_STATUS_TOKENS.has(token) ||
|
|
294
|
-
declaredStatuses.has(token) ||
|
|
295
|
-
reportedUnknownStatuses.has(token)) {
|
|
296
|
-
continue;
|
|
297
|
-
}
|
|
298
|
-
reportedUnknownStatuses.add(token);
|
|
299
|
-
findings.push({
|
|
300
|
-
severity: "warning",
|
|
301
|
-
code: "workflow_status_unknown",
|
|
302
|
-
dimension: "workflows",
|
|
303
|
-
target: token,
|
|
304
|
-
message: `Workflow "${workflow.type}" references status "${token}" which is neither a built-in status nor declared by this profile; transitions to or from it are unreachable.`,
|
|
305
|
-
});
|
|
306
|
-
}
|
|
307
|
-
}
|
|
308
|
-
}
|
|
309
|
-
}
|
|
310
|
-
/** Lint the config knobs: resolve each descriptor, flag duplicates that would silently overwrite an earlier knob, and parse each value. */
|
|
311
|
-
function lintConfig(profile, findings) {
|
|
312
|
-
const seen = new Set();
|
|
313
|
-
for (const entry of profile.config) {
|
|
314
|
-
const descriptor = resolveNestedSettingDescriptor(entry.key);
|
|
315
|
-
if (descriptor === undefined) {
|
|
316
|
-
findings.push({
|
|
317
|
-
severity: "error",
|
|
318
|
-
code: "config_key_unknown",
|
|
319
|
-
dimension: "config",
|
|
320
|
-
target: entry.key,
|
|
321
|
-
message: `Config knob "${entry.key}" is not a recognized setting; apply rejects it with a usage error.`,
|
|
322
|
-
});
|
|
323
|
-
continue;
|
|
324
|
-
}
|
|
325
|
-
// Dedupe on the resolved descriptor key so two entries that differ only by
|
|
326
|
-
// alias/casing (e.g. `search-provider` and `search_provider`) are caught.
|
|
327
|
-
if (seen.has(descriptor.key)) {
|
|
328
|
-
findings.push({
|
|
329
|
-
severity: "error",
|
|
330
|
-
code: "config_duplicate",
|
|
331
|
-
dimension: "config",
|
|
332
|
-
target: descriptor.key,
|
|
333
|
-
message: `Config knob "${descriptor.key}" is set more than once; the later value silently overwrites the earlier one.`,
|
|
334
|
-
});
|
|
335
|
-
}
|
|
336
|
-
else {
|
|
337
|
-
seen.add(descriptor.key);
|
|
338
|
-
}
|
|
339
|
-
const parsed = parseNestedSettingValue(descriptor, entry.value);
|
|
340
|
-
if (!parsed.ok) {
|
|
341
|
-
findings.push({
|
|
342
|
-
severity: "error",
|
|
343
|
-
code: "config_value_invalid",
|
|
344
|
-
dimension: "config",
|
|
345
|
-
target: entry.key,
|
|
346
|
-
message: parsed.error.message,
|
|
347
|
-
});
|
|
348
|
-
}
|
|
349
|
-
}
|
|
350
|
-
}
|
|
351
|
-
/** Lint the create templates: flag a `type` option referencing an undeclared type. */
|
|
352
|
-
function lintTemplates(profile, declaredTypes, findings) {
|
|
353
|
-
for (const template of profile.templates) {
|
|
354
|
-
const typeOption = template.options.type;
|
|
355
|
-
if (typeof typeOption !== "string" || typeOption.trim().length === 0) {
|
|
356
|
-
continue;
|
|
357
|
-
}
|
|
358
|
-
const typeKey = typeOption.trim().toLowerCase();
|
|
359
|
-
if (!BUILTIN_TYPE_KEYS.has(typeKey) && !declaredTypes.has(typeKey)) {
|
|
360
|
-
findings.push({
|
|
361
|
-
severity: "warning",
|
|
362
|
-
code: "template_type_unknown",
|
|
363
|
-
dimension: "templates",
|
|
364
|
-
target: template.name,
|
|
365
|
-
message: `Template "${template.name}" creates type "${typeOption}" which is neither a built-in type nor declared by this profile.`,
|
|
366
|
-
});
|
|
367
|
-
}
|
|
368
|
-
}
|
|
369
|
-
}
|
|
370
|
-
/** Lint the advisory package recommendations for an empty spec. */
|
|
371
|
-
function lintPackages(profile, findings) {
|
|
372
|
-
for (const [index, recommendation] of profile.packages.entries()) {
|
|
373
|
-
if (recommendation.spec.trim().length === 0) {
|
|
374
|
-
findings.push({
|
|
375
|
-
severity: "warning",
|
|
376
|
-
code: "package_spec_empty",
|
|
377
|
-
dimension: "packages",
|
|
378
|
-
target: `#${index}`,
|
|
379
|
-
message: "Package recommendation has an empty spec; it cannot be surfaced as an install hint.",
|
|
380
|
-
});
|
|
381
|
-
}
|
|
382
|
-
}
|
|
383
|
-
}
|
|
384
|
-
/**
|
|
385
|
-
* Lints a project profile definition for internal consistency, returning every
|
|
386
|
-
* graded finding across all dimensions. Pure and tracker-independent: it never
|
|
387
|
-
* reads disk or settings, so authors can call it on a `defineProjectProfile`
|
|
388
|
-
* value, the CLI can call it on a resolved built-in or extension-contributed
|
|
389
|
-
* profile, and tests can gate against it.
|
|
390
|
-
*
|
|
391
|
-
* @param profile The profile definition to lint.
|
|
392
|
-
* @returns A report whose `ok` flag is true exactly when no `error` findings
|
|
393
|
-
* were produced.
|
|
394
|
-
*/
|
|
395
|
-
export function lintProjectProfile(profile) {
|
|
396
|
-
const findings = [];
|
|
397
|
-
lintProfileIdentity(profile, findings);
|
|
398
|
-
const declaredTypes = lintTypes(profile, findings);
|
|
399
|
-
const declaredStatuses = lintStatuses(profile, findings);
|
|
400
|
-
lintFields(profile, findings);
|
|
401
|
-
lintWorkflows(profile, declaredTypes, declaredStatuses, findings);
|
|
402
|
-
lintConfig(profile, findings);
|
|
403
|
-
lintTemplates(profile, declaredTypes, findings);
|
|
404
|
-
lintPackages(profile, findings);
|
|
405
|
-
const errorCount = findings.filter((finding) => finding.severity === "error").length;
|
|
406
|
-
const warningCount = findings.length - errorCount;
|
|
407
|
-
return {
|
|
408
|
-
profile: profile.name,
|
|
409
|
-
ok: errorCount === 0,
|
|
410
|
-
findings,
|
|
411
|
-
errorCount,
|
|
412
|
-
warningCount,
|
|
413
|
-
};
|
|
414
|
-
}
|
|
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]="38902c61-3d4d-52ad-a95c-fbac9102a041")}catch(e2){}})();import{BUILTIN_ITEM_TYPE_VALUES}from"../../types/index.js";import{parseNestedSettingValue,resolveNestedSettingDescriptor}from"../config/nested-settings.js";import{normalizeAddFieldInput}from"../schema/fields-file.js";import{normalizeAddStatusInput}from"../schema/status-defs-file.js";import{normalizeAddTypeInput}from"../schema/item-types-file.js";import{normalizeStatusToken}from"../schema/type-workflows.js";import{DEFAULT_RUNTIME_STATUS_DEFINITIONS}from"../schema/runtime-schema.js";import{toErrorMessage}from"../shared/primitives.js";import{resolvePmToolCustomFieldCollision}from"../../sdk/cli-contracts/tool-schema.js";import{normalizeProfileLookupKey}from"./profile-presets.js";const PROFILE_LINT_DIMENSIONS=["profile","types","statuses","fields","workflows","config","templates","packages"];const PROFILE_LINT_CODES=["profile_name_empty","profile_name_not_normalized","profile_title_empty","profile_summary_empty","type_invalid","type_duplicate","status_invalid","status_duplicate","field_invalid","field_duplicate","field_mcp_input_collision","workflow_type_empty","workflow_type_unknown","workflow_duplicate_type","workflow_transition_malformed","workflow_status_unknown","config_key_unknown","config_value_invalid","config_duplicate","template_type_unknown","package_spec_empty"];const BUILTIN_STATUS_TOKENS=new Set(DEFAULT_RUNTIME_STATUS_DEFINITIONS.flatMap(definition=>[normalizeStatusToken(definition.id),...(definition.aliases??[]).map(alias=>normalizeStatusToken(alias))]).filter(token=>token.length>0));const BUILTIN_TYPE_KEYS=new Set(BUILTIN_ITEM_TYPE_VALUES.map(name=>name.toLowerCase()));function lintProfileIdentity(profile,findings){if(profile.name.trim().length===0){findings.push({severity:"error",code:"profile_name_empty",dimension:"profile",message:"Profile name must not be empty; profile resolution requires a non-blank name."})}else if(profile.name!==normalizeProfileLookupKey(profile.name)){findings.push({severity:"warning",code:"profile_name_not_normalized",dimension:"profile",target:profile.name,message:`Profile name "${profile.name}" is not in canonical form; resolution folds it to "${normalizeProfileLookupKey(profile.name)}" (lowercase, hyphens as underscores).`})}if(profile.title.trim().length===0){findings.push({severity:"warning",code:"profile_title_empty",dimension:"profile",message:"Profile title is empty; list and show surfaces will render a blank title."})}if(profile.summary.trim().length===0){findings.push({severity:"warning",code:"profile_summary_empty",dimension:"profile",message:"Profile summary is empty; list and show surfaces will render a blank archetype description."})}}function lintTypes(profile,findings){const declared=new Set;const seen=new Set;for(const[index,type]of profile.types.entries()){let name;try{name=normalizeAddTypeInput(type).name}catch(error){findings.push({severity:"error",code:"type_invalid",dimension:"types",target:typeof type.name==="string"?type.name:`#${index}`,message:toErrorMessage(error)});continue}const key=name.toLowerCase();if(seen.has(key)){findings.push({severity:"error",code:"type_duplicate",dimension:"types",target:name,message:`Item type "${name}" is declared more than once; the later definition silently overwrites the earlier upsert.`});continue}seen.add(key);declared.add(key)}return declared}function lintStatuses(profile,findings){const declared=new Set;const seen=new Set;for(const[index,status]of profile.statuses.entries()){let normalized;try{normalized=normalizeAddStatusInput(status)}catch(error){findings.push({severity:"error",code:"status_invalid",dimension:"statuses",target:typeof status.id==="string"?status.id:`#${index}`,message:toErrorMessage(error)});continue}if(seen.has(normalized.id)){findings.push({severity:"error",code:"status_duplicate",dimension:"statuses",target:normalized.id,message:`Status "${normalized.id}" is declared more than once; the later definition silently overwrites the earlier upsert.`});continue}seen.add(normalized.id);declared.add(normalized.id);for(const alias of normalized.aliases??[]){declared.add(normalizeStatusToken(alias))}}return declared}function lintFields(profile,findings){const seen=new Set;for(const[index,field]of profile.fields.entries()){let key;try{key=normalizeAddFieldInput(field).key}catch(error){findings.push({severity:"error",code:"field_invalid",dimension:"fields",target:typeof field.key==="string"?field.key:`#${index}`,message:toErrorMessage(error)});continue}if(seen.has(key)){findings.push({severity:"error",code:"field_duplicate",dimension:"fields",target:key,message:`Field "${key}" is declared more than once; the later definition silently overwrites the earlier upsert.`});continue}seen.add(key);const collision=resolvePmToolCustomFieldCollision(key);if(collision){findings.push({severity:"warning",code:"field_mcp_input_collision",dimension:"fields",target:key,message:`Field "${key}" collides with canonical MCP property "${collision.property}" owned by ${collision.owner}; callers must pass the custom value through ${collision.nested_path}.`})}}}function lintWorkflows(profile,declaredTypes,declaredStatuses,findings){const seenTypes=new Set;for(const[index,workflow]of profile.workflows.entries()){const typeKey=workflow.type.trim().toLowerCase();if(typeKey.length===0){findings.push({severity:"error",code:"workflow_type_empty",dimension:"workflows",target:`#${index}`,message:"Workflow has an empty type; the workflow resolver drops entries without a type."});continue}const duplicate=seenTypes.has(typeKey);seenTypes.add(typeKey);if(duplicate){findings.push({severity:"warning",code:"workflow_duplicate_type",dimension:"workflows",target:workflow.type,message:`Workflow type "${workflow.type}" is declared more than once; the later transition set wins.`})}else if(!BUILTIN_TYPE_KEYS.has(typeKey)&&!declaredTypes.has(typeKey)){findings.push({severity:"warning",code:"workflow_type_unknown",dimension:"workflows",target:workflow.type,message:`Workflow governs type "${workflow.type}" which is neither a built-in type nor declared by this profile; it has no effect unless that type already exists.`})}const reportedUnknownStatuses=new Set;for(const pair of workflow.allowed_transitions){const from=normalizeStatusToken(pair[0]);const to=normalizeStatusToken(pair[1]);if(from.length===0||to.length===0){findings.push({severity:"error",code:"workflow_transition_malformed",dimension:"workflows",target:workflow.type,message:`Workflow "${workflow.type}" has a transition with an empty status; the workflow resolver silently drops it.`});continue}for(const token of[from,to]){if(BUILTIN_STATUS_TOKENS.has(token)||declaredStatuses.has(token)||reportedUnknownStatuses.has(token)){continue}reportedUnknownStatuses.add(token);findings.push({severity:"warning",code:"workflow_status_unknown",dimension:"workflows",target:token,message:`Workflow "${workflow.type}" references status "${token}" which is neither a built-in status nor declared by this profile; transitions to or from it are unreachable.`})}}}}function lintConfig(profile,findings){const seen=new Set;for(const entry of profile.config){const descriptor=resolveNestedSettingDescriptor(entry.key);if(descriptor===void 0){findings.push({severity:"error",code:"config_key_unknown",dimension:"config",target:entry.key,message:`Config knob "${entry.key}" is not a recognized setting; apply rejects it with a usage error.`});continue}if(seen.has(descriptor.key)){findings.push({severity:"error",code:"config_duplicate",dimension:"config",target:descriptor.key,message:`Config knob "${descriptor.key}" is set more than once; the later value silently overwrites the earlier one.`})}else{seen.add(descriptor.key)}const parsed=parseNestedSettingValue(descriptor,entry.value);if(!parsed.ok){findings.push({severity:"error",code:"config_value_invalid",dimension:"config",target:entry.key,message:parsed.error.message})}}}function lintTemplates(profile,declaredTypes,findings){for(const template of profile.templates){const typeOption=template.options.type;if(typeof typeOption!=="string"||typeOption.trim().length===0){continue}const typeKey=typeOption.trim().toLowerCase();if(!BUILTIN_TYPE_KEYS.has(typeKey)&&!declaredTypes.has(typeKey)){findings.push({severity:"warning",code:"template_type_unknown",dimension:"templates",target:template.name,message:`Template "${template.name}" creates type "${typeOption}" which is neither a built-in type nor declared by this profile.`})}}}function lintPackages(profile,findings){for(const[index,recommendation]of profile.packages.entries()){if(recommendation.spec.trim().length===0){findings.push({severity:"warning",code:"package_spec_empty",dimension:"packages",target:`#${index}`,message:"Package recommendation has an empty spec; it cannot be surfaced as an install hint."})}}}function lintProjectProfile(profile){const findings=[];lintProfileIdentity(profile,findings);const declaredTypes=lintTypes(profile,findings);const declaredStatuses=lintStatuses(profile,findings);lintFields(profile,findings);lintWorkflows(profile,declaredTypes,declaredStatuses,findings);lintConfig(profile,findings);lintTemplates(profile,declaredTypes,findings);lintPackages(profile,findings);const errorCount=findings.filter(finding=>finding.severity==="error").length;const warningCount=findings.length-errorCount;return{profile:profile.name,ok:errorCount===0,findings,errorCount,warningCount}}export{PROFILE_LINT_CODES,PROFILE_LINT_DIMENSIONS,lintProjectProfile};
|
|
415
2
|
//# sourceMappingURL=profile-lint.js.map
|
|
416
|
-
//# debugId=f9b22df0-7ec2-5d72-bc88-3eb7201a6051
|
|
Binary file
|