@unbrained/pm-cli 2026.5.12 → 2026.5.18
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/.claude-plugin/marketplace.json +4 -4
- package/AGENTS.md +78 -457
- package/CHANGELOG.md +22 -0
- package/CONTRIBUTING.md +1 -0
- package/PRD.md +7 -28
- package/README.md +8 -14
- package/dist/cli/argv-utils.js +4 -1
- package/dist/cli/argv-utils.js.map +1 -1
- package/dist/cli/bootstrap-args.js +4 -1
- package/dist/cli/bootstrap-args.js.map +1 -1
- package/dist/cli/commander-usage.js +32 -1
- package/dist/cli/commander-usage.js.map +1 -1
- package/dist/cli/commands/activity.js +23 -5
- package/dist/cli/commands/activity.js.map +1 -1
- package/dist/cli/commands/aggregate.js +5 -2
- package/dist/cli/commands/aggregate.js.map +1 -1
- package/dist/cli/commands/append.js +4 -1
- package/dist/cli/commands/append.js.map +1 -1
- package/dist/cli/commands/calendar.js +9 -3
- package/dist/cli/commands/calendar.js.map +1 -1
- package/dist/cli/commands/claim.d.ts +3 -0
- package/dist/cli/commands/claim.js +19 -3
- package/dist/cli/commands/claim.js.map +1 -1
- package/dist/cli/commands/close.js +4 -1
- package/dist/cli/commands/close.js.map +1 -1
- package/dist/cli/commands/comments-audit.js +4 -1
- package/dist/cli/commands/comments-audit.js.map +1 -1
- package/dist/cli/commands/comments.js +4 -1
- package/dist/cli/commands/comments.js.map +1 -1
- package/dist/cli/commands/completion.js +98 -2
- package/dist/cli/commands/completion.js.map +1 -1
- package/dist/cli/commands/config.js +4 -1
- package/dist/cli/commands/config.js.map +1 -1
- package/dist/cli/commands/context.js +19 -5
- package/dist/cli/commands/context.js.map +1 -1
- package/dist/cli/commands/contracts.d.ts +9 -0
- package/dist/cli/commands/contracts.js +205 -49
- package/dist/cli/commands/contracts.js.map +1 -1
- package/dist/cli/commands/create.js +88 -9
- package/dist/cli/commands/create.js.map +1 -1
- package/dist/cli/commands/dedupe-audit.js +4 -1
- package/dist/cli/commands/dedupe-audit.js.map +1 -1
- package/dist/cli/commands/delete.js +4 -1
- package/dist/cli/commands/delete.js.map +1 -1
- package/dist/cli/commands/deps.js +4 -1
- package/dist/cli/commands/deps.js.map +1 -1
- package/dist/cli/commands/docs.js +4 -1
- package/dist/cli/commands/docs.js.map +1 -1
- package/dist/cli/commands/extension.d.ts +7 -2
- package/dist/cli/commands/extension.js +360 -64
- package/dist/cli/commands/extension.js.map +1 -1
- package/dist/cli/commands/files.js +4 -1
- package/dist/cli/commands/files.js.map +1 -1
- package/dist/cli/commands/gc.js +4 -1
- package/dist/cli/commands/gc.js.map +1 -1
- package/dist/cli/commands/get.d.ts +7 -3
- package/dist/cli/commands/get.js +91 -18
- package/dist/cli/commands/get.js.map +1 -1
- package/dist/cli/commands/guide.js +6 -8
- package/dist/cli/commands/guide.js.map +1 -1
- package/dist/cli/commands/health.d.ts +4 -0
- package/dist/cli/commands/health.js +31 -8
- package/dist/cli/commands/health.js.map +1 -1
- package/dist/cli/commands/history-redact.d.ts +42 -0
- package/dist/cli/commands/history-redact.js +559 -0
- package/dist/cli/commands/history-redact.js.map +1 -0
- package/dist/cli/commands/history.d.ts +4 -0
- package/dist/cli/commands/history.js +14 -3
- package/dist/cli/commands/history.js.map +1 -1
- package/dist/cli/commands/index.d.ts +2 -8
- package/dist/cli/commands/index.js +6 -9
- package/dist/cli/commands/index.js.map +1 -1
- package/dist/cli/commands/init-agent-guidance.d.ts +31 -0
- package/dist/cli/commands/init-agent-guidance.js +336 -0
- package/dist/cli/commands/init-agent-guidance.js.map +1 -0
- package/dist/cli/commands/init.d.ts +14 -0
- package/dist/cli/commands/init.js +75 -1
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/learnings.js +4 -1
- package/dist/cli/commands/learnings.js.map +1 -1
- package/dist/cli/commands/list.d.ts +1 -0
- package/dist/cli/commands/list.js +42 -18
- package/dist/cli/commands/list.js.map +1 -1
- package/dist/cli/commands/metadata-normalizers.js +4 -1
- package/dist/cli/commands/metadata-normalizers.js.map +1 -1
- package/dist/cli/commands/normalize.js +4 -1
- package/dist/cli/commands/normalize.js.map +1 -1
- package/dist/cli/commands/notes.js +4 -1
- package/dist/cli/commands/notes.js.map +1 -1
- package/dist/cli/commands/plan.d.ts +118 -0
- package/dist/cli/commands/plan.js +975 -0
- package/dist/cli/commands/plan.js.map +1 -0
- package/dist/cli/commands/reindex.d.ts +8 -0
- package/dist/cli/commands/reindex.js +100 -24
- package/dist/cli/commands/reindex.js.map +1 -1
- package/dist/cli/commands/restore.js +4 -1
- package/dist/cli/commands/restore.js.map +1 -1
- package/dist/cli/commands/search.js +58 -27
- package/dist/cli/commands/search.js.map +1 -1
- package/dist/cli/commands/stats.js +4 -1
- package/dist/cli/commands/stats.js.map +1 -1
- package/dist/cli/commands/templates.js +4 -1
- package/dist/cli/commands/templates.js.map +1 -1
- package/dist/cli/commands/test-all.js +4 -1
- package/dist/cli/commands/test-all.js.map +1 -1
- package/dist/cli/commands/test-runs.js +4 -1
- package/dist/cli/commands/test-runs.js.map +1 -1
- package/dist/cli/commands/test.js +4 -1
- package/dist/cli/commands/test.js.map +1 -1
- package/dist/cli/commands/update-many.js +4 -1
- package/dist/cli/commands/update-many.js.map +1 -1
- package/dist/cli/commands/update.js +114 -71
- package/dist/cli/commands/update.js.map +1 -1
- package/dist/cli/commands/upgrade.js +6 -3
- package/dist/cli/commands/upgrade.js.map +1 -1
- package/dist/cli/commands/validate.js +32 -4
- package/dist/cli/commands/validate.js.map +1 -1
- package/dist/cli/error-guidance.js +5 -2
- package/dist/cli/error-guidance.js.map +1 -1
- package/dist/cli/extension-command-help.js +4 -1
- package/dist/cli/extension-command-help.js.map +1 -1
- package/dist/cli/extension-command-options.js +4 -1
- package/dist/cli/extension-command-options.js.map +1 -1
- package/dist/cli/guide-topics.js +4 -1
- package/dist/cli/guide-topics.js.map +1 -1
- package/dist/cli/help-content.js +52 -33
- package/dist/cli/help-content.js.map +1 -1
- package/dist/cli/help-json-payload.js +4 -1
- package/dist/cli/help-json-payload.js.map +1 -1
- package/dist/cli/main.js +276 -32
- package/dist/cli/main.js.map +1 -1
- package/dist/cli/migration-gates.js +4 -1
- package/dist/cli/migration-gates.js.map +1 -1
- package/dist/cli/register-list-query.js +55 -150
- package/dist/cli/register-list-query.js.map +1 -1
- package/dist/cli/register-mutation.js +277 -261
- package/dist/cli/register-mutation.js.map +1 -1
- package/dist/cli/register-operations.js +62 -199
- package/dist/cli/register-operations.js.map +1 -1
- package/dist/cli/register-setup.js +55 -146
- package/dist/cli/register-setup.js.map +1 -1
- package/dist/cli/registration-helpers.d.ts +2 -2
- package/dist/cli/registration-helpers.js +11 -21
- package/dist/cli/registration-helpers.js.map +1 -1
- package/dist/cli/shared-parsers.js +4 -1
- package/dist/cli/shared-parsers.js.map +1 -1
- package/dist/cli/telemetry-flush.js +4 -1
- package/dist/cli/telemetry-flush.js.map +1 -1
- package/dist/cli.js +45 -3
- package/dist/cli.js.map +1 -1
- package/dist/core/extensions/extension-types.js +4 -1
- package/dist/core/extensions/extension-types.js.map +1 -1
- package/dist/core/extensions/index.js +4 -1
- package/dist/core/extensions/index.js.map +1 -1
- package/dist/core/extensions/item-fields.js +4 -1
- package/dist/core/extensions/item-fields.js.map +1 -1
- package/dist/core/extensions/loader.js +84 -54
- package/dist/core/extensions/loader.js.map +1 -1
- package/dist/core/extensions/runtime-registrations.js +4 -1
- package/dist/core/extensions/runtime-registrations.js.map +1 -1
- package/dist/core/fs/fs-utils.js +4 -1
- package/dist/core/fs/fs-utils.js.map +1 -1
- package/dist/core/fs/index.js +4 -1
- package/dist/core/fs/index.js.map +1 -1
- package/dist/core/history/history-stream-policy.js +4 -1
- package/dist/core/history/history-stream-policy.js.map +1 -1
- package/dist/core/history/history.js +4 -1
- package/dist/core/history/history.js.map +1 -1
- package/dist/core/history/index.js +4 -1
- package/dist/core/history/index.js.map +1 -1
- package/dist/core/item/id.js +4 -1
- package/dist/core/item/id.js.map +1 -1
- package/dist/core/item/index.js +4 -1
- package/dist/core/item/index.js.map +1 -1
- package/dist/core/item/item-format.js +241 -2
- package/dist/core/item/item-format.js.map +1 -1
- package/dist/core/item/parent-reference-policy.js +4 -1
- package/dist/core/item/parent-reference-policy.js.map +1 -1
- package/dist/core/item/parse.js +33 -3
- package/dist/core/item/parse.js.map +1 -1
- package/dist/core/item/sprint-release-format.js +4 -1
- package/dist/core/item/sprint-release-format.js.map +1 -1
- package/dist/core/item/status.js +4 -1
- package/dist/core/item/status.js.map +1 -1
- package/dist/core/item/type-registry.js +4 -1
- package/dist/core/item/type-registry.js.map +1 -1
- package/dist/core/lock/index.js +4 -1
- package/dist/core/lock/index.js.map +1 -1
- package/dist/core/lock/lock.js +4 -1
- package/dist/core/lock/lock.js.map +1 -1
- package/dist/core/output/command-aware.js +4 -1
- package/dist/core/output/command-aware.js.map +1 -1
- package/dist/core/output/output.d.ts +4 -0
- package/dist/core/output/output.js +47 -6
- package/dist/core/output/output.js.map +1 -1
- package/dist/core/packages/manifest.d.ts +27 -1
- package/dist/core/packages/manifest.js +87 -1
- package/dist/core/packages/manifest.js.map +1 -1
- package/dist/core/packages/root.d.ts +3 -0
- package/dist/core/packages/root.js +51 -0
- package/dist/core/packages/root.js.map +1 -0
- package/dist/core/schema/runtime-field-filters.js +4 -1
- package/dist/core/schema/runtime-field-filters.js.map +1 -1
- package/dist/core/schema/runtime-field-values.js +4 -1
- package/dist/core/schema/runtime-field-values.js.map +1 -1
- package/dist/core/schema/runtime-schema.js +4 -1
- package/dist/core/schema/runtime-schema.js.map +1 -1
- package/dist/core/search/cache.js +7 -2
- package/dist/core/search/cache.js.map +1 -1
- package/dist/core/search/corpus.d.ts +2 -0
- package/dist/core/search/corpus.js +77 -2
- package/dist/core/search/corpus.js.map +1 -1
- package/dist/core/search/embedding-batches.d.ts +13 -1
- package/dist/core/search/embedding-batches.js +40 -8
- package/dist/core/search/embedding-batches.js.map +1 -1
- package/dist/core/search/http-client.js +4 -1
- package/dist/core/search/http-client.js.map +1 -1
- package/dist/core/search/providers.js +4 -1
- package/dist/core/search/providers.js.map +1 -1
- package/dist/core/search/semantic-defaults.js +11 -2
- package/dist/core/search/semantic-defaults.js.map +1 -1
- package/dist/core/search/vector-stores.js +4 -1
- package/dist/core/search/vector-stores.js.map +1 -1
- package/dist/core/sentry/helpers.js +4 -1
- package/dist/core/sentry/helpers.js.map +1 -1
- package/dist/core/sentry/instrument.js +10 -13
- package/dist/core/sentry/instrument.js.map +1 -1
- package/dist/core/shared/command-types.js +4 -1
- package/dist/core/shared/command-types.js.map +1 -1
- package/dist/core/shared/conflict-markers.js +4 -1
- package/dist/core/shared/conflict-markers.js.map +1 -1
- package/dist/core/shared/constants.d.ts +2 -2
- package/dist/core/shared/constants.js +24 -1
- package/dist/core/shared/constants.js.map +1 -1
- package/dist/core/shared/errors.js +4 -1
- package/dist/core/shared/errors.js.map +1 -1
- package/dist/core/shared/index.js +4 -1
- package/dist/core/shared/index.js.map +1 -1
- package/dist/core/shared/levenshtein.js +4 -1
- package/dist/core/shared/levenshtein.js.map +1 -1
- package/dist/core/shared/primitives.js +4 -1
- package/dist/core/shared/primitives.js.map +1 -1
- package/dist/core/shared/serialization.js +4 -1
- package/dist/core/shared/serialization.js.map +1 -1
- package/dist/core/shared/text-normalization.js +4 -1
- package/dist/core/shared/text-normalization.js.map +1 -1
- package/dist/core/shared/time.js +4 -1
- package/dist/core/shared/time.js.map +1 -1
- package/dist/core/store/front-matter-cache.d.ts +8 -1
- package/dist/core/store/front-matter-cache.js +28 -14
- package/dist/core/store/front-matter-cache.js.map +1 -1
- package/dist/core/store/index.js +4 -1
- package/dist/core/store/index.js.map +1 -1
- package/dist/core/store/item-format-migration.js +4 -1
- package/dist/core/store/item-format-migration.js.map +1 -1
- package/dist/core/store/item-store.d.ts +2 -0
- package/dist/core/store/item-store.js +66 -3
- package/dist/core/store/item-store.js.map +1 -1
- package/dist/core/store/paths.js +4 -1
- package/dist/core/store/paths.js.map +1 -1
- package/dist/core/store/settings.js +39 -1
- package/dist/core/store/settings.js.map +1 -1
- package/dist/core/telemetry/consent.js +4 -1
- package/dist/core/telemetry/consent.js.map +1 -1
- package/dist/core/telemetry/observability.d.ts +1 -1
- package/dist/core/telemetry/observability.js +11 -2
- package/dist/core/telemetry/observability.js.map +1 -1
- package/dist/core/telemetry/runtime.js +31 -5
- package/dist/core/telemetry/runtime.js.map +1 -1
- package/dist/core/test/background-runs.js +4 -1
- package/dist/core/test/background-runs.js.map +1 -1
- package/dist/core/test/item-test-run-tracking.js +4 -1
- package/dist/core/test/item-test-run-tracking.js.map +1 -1
- package/dist/mcp/server.d.ts +8 -0
- package/dist/mcp/server.js +212 -53
- package/dist/mcp/server.js.map +1 -1
- package/dist/sdk/cli-contracts/commander-mutation-options.d.ts +7 -0
- package/dist/sdk/cli-contracts/commander-mutation-options.js +484 -0
- package/dist/sdk/cli-contracts/commander-mutation-options.js.map +1 -0
- package/dist/sdk/cli-contracts/commander-types.d.ts +21 -0
- package/dist/sdk/cli-contracts/commander-types.js +95 -0
- package/dist/sdk/cli-contracts/commander-types.js.map +1 -0
- package/dist/sdk/cli-contracts.d.ts +10 -17
- package/dist/sdk/cli-contracts.js +232 -282
- package/dist/sdk/cli-contracts.js.map +1 -1
- package/dist/sdk/index.d.ts +2 -1
- package/dist/sdk/index.js +5 -1
- package/dist/sdk/index.js.map +1 -1
- package/dist/sdk/runtime.d.ts +29 -0
- package/dist/sdk/runtime.js +31 -0
- package/dist/sdk/runtime.js.map +1 -0
- package/dist/types/index.js +4 -1
- package/dist/types/index.js.map +1 -1
- package/dist/types.d.ts +86 -2
- package/dist/types.js +34 -1
- package/dist/types.js.map +1 -1
- package/docs/AGENT_GUIDE.md +16 -6
- package/docs/CLAUDE_CODE_PLUGIN.md +10 -10
- package/docs/CODEX_PLUGIN.md +2 -2
- package/docs/COMMANDS.md +83 -8
- package/docs/CONFIGURATION.md +4 -1
- package/docs/EXTENSIONS.md +176 -807
- package/docs/QUICKSTART.md +12 -5
- package/docs/README.md +7 -6
- package/docs/RELEASING.md +6 -4
- package/docs/SDK.md +78 -441
- package/docs/TESTING.md +2 -2
- package/marketplace.json +3 -3
- package/package.json +7 -4
- package/packages/pm-beads/extensions/beads/index.js +90 -101
- package/packages/pm-beads/extensions/beads/index.ts +2 -2
- package/packages/pm-beads/extensions/beads/runtime.js +2 -17
- package/packages/pm-beads/extensions/beads/runtime.ts +41 -18
- package/packages/pm-beads/package.json +34 -1
- package/packages/pm-calendar/README.md +13 -0
- package/packages/pm-calendar/extensions/calendar/index.js +56 -0
- package/packages/pm-calendar/extensions/calendar/index.ts +62 -0
- package/packages/pm-calendar/extensions/calendar/manifest.json +7 -0
- package/packages/pm-calendar/extensions/calendar/runtime.js +114 -0
- package/packages/pm-calendar/extensions/calendar/runtime.ts +123 -0
- package/packages/pm-calendar/package.json +51 -0
- package/packages/pm-governance-audit/README.md +23 -0
- package/packages/pm-governance-audit/extensions/governance-audit/index.js +117 -0
- package/packages/pm-governance-audit/extensions/governance-audit/index.ts +118 -0
- package/packages/pm-governance-audit/extensions/governance-audit/manifest.json +7 -0
- package/packages/pm-governance-audit/extensions/governance-audit/runtime.js +159 -0
- package/packages/pm-governance-audit/extensions/governance-audit/runtime.ts +176 -0
- package/packages/pm-governance-audit/package.json +52 -0
- package/packages/pm-guide-shell/README.md +23 -0
- package/packages/pm-guide-shell/extensions/guide-shell/index.js +76 -0
- package/packages/pm-guide-shell/extensions/guide-shell/index.ts +81 -0
- package/packages/pm-guide-shell/extensions/guide-shell/manifest.json +7 -0
- package/packages/pm-guide-shell/extensions/guide-shell/runtime.js +263 -0
- package/packages/pm-guide-shell/extensions/guide-shell/runtime.ts +327 -0
- package/packages/pm-guide-shell/package.json +52 -0
- package/packages/pm-linked-test-adapters/README.md +24 -0
- package/packages/pm-linked-test-adapters/extensions/linked-test-adapters/index.js +101 -0
- package/packages/pm-linked-test-adapters/extensions/linked-test-adapters/index.ts +102 -0
- package/packages/pm-linked-test-adapters/extensions/linked-test-adapters/manifest.json +7 -0
- package/packages/pm-linked-test-adapters/extensions/linked-test-adapters/runtime.js +142 -0
- package/packages/pm-linked-test-adapters/extensions/linked-test-adapters/runtime.ts +173 -0
- package/packages/pm-linked-test-adapters/package.json +53 -0
- package/packages/pm-search-advanced/README.md +27 -0
- package/packages/pm-search-advanced/extensions/search-advanced/index.js +93 -0
- package/packages/pm-search-advanced/extensions/search-advanced/index.ts +94 -0
- package/packages/pm-search-advanced/extensions/search-advanced/manifest.json +7 -0
- package/packages/pm-search-advanced/extensions/search-advanced/runtime.js +120 -0
- package/packages/pm-search-advanced/extensions/search-advanced/runtime.ts +144 -0
- package/packages/pm-search-advanced/package.json +54 -0
- package/packages/pm-templates/README.md +20 -0
- package/packages/pm-templates/extensions/templates/index.js +101 -0
- package/packages/pm-templates/extensions/templates/index.ts +109 -0
- package/packages/pm-templates/extensions/templates/manifest.json +7 -0
- package/packages/pm-templates/extensions/templates/runtime.js +226 -0
- package/packages/pm-templates/extensions/templates/runtime.ts +283 -0
- package/packages/pm-templates/package.json +50 -0
- package/packages/pm-todos/extensions/todos/index.js +105 -116
- package/packages/pm-todos/extensions/todos/index.ts +3 -2
- package/packages/pm-todos/extensions/todos/runtime.js +2 -17
- package/packages/pm-todos/extensions/todos/runtime.ts +40 -18
- package/packages/pm-todos/package.json +35 -1
- package/plugins/{pm-cli-claude → pm-claude}/.claude-plugin/plugin.json +2 -2
- package/plugins/{pm-cli-claude → pm-claude}/.mcp.json +1 -1
- package/plugins/{pm-cli-claude → pm-claude}/README.md +4 -4
- package/plugins/{pm-cli-claude → pm-claude}/agents/pm-coordinator.md +1 -1
- package/plugins/{pm-cli-claude → pm-claude}/commands/pm-init.md +10 -1
- package/plugins/{pm-cli-claude → pm-claude}/commands/pm-planner.md +18 -0
- package/plugins/{pm-cli-claude → pm-claude}/scripts/pm-mcp-server.mjs +4 -2
- package/plugins/{pm-cli-claude → pm-claude}/skills/pm-planner/SKILL.md +46 -1
- package/plugins/{pm-cli-codex → pm-codex}/.codex-plugin/plugin.json +3 -3
- package/plugins/{pm-cli-codex → pm-codex}/.mcp.json +1 -1
- package/plugins/{pm-cli-codex → pm-codex}/README.md +7 -4
- package/plugins/{pm-cli-codex → pm-codex}/scripts/pm-mcp-server.mjs +4 -2
- package/plugins/pm-codex/skills/pm-native/SKILL.md +81 -0
- package/scripts/finalize-build.mjs +28 -0
- package/scripts/prepare-build-cache.mjs +37 -0
- package/plugins/pm-cli-codex/skills/pm-native/SKILL.md +0 -57
- /package/plugins/{pm-cli-claude → pm-claude}/agents/pm-delivery-chain.md +0 -0
- /package/plugins/{pm-cli-claude → pm-claude}/agents/pm-triage-agent.md +0 -0
- /package/plugins/{pm-cli-claude → pm-claude}/agents/pm-verification-agent.md +0 -0
- /package/plugins/{pm-cli-claude → pm-claude}/commands/pm-audit.md +0 -0
- /package/plugins/{pm-cli-claude → pm-claude}/commands/pm-calendar.md +0 -0
- /package/plugins/{pm-cli-claude → pm-claude}/commands/pm-close-task.md +0 -0
- /package/plugins/{pm-cli-claude → pm-claude}/commands/pm-developer.md +0 -0
- /package/plugins/{pm-cli-claude → pm-claude}/commands/pm-list.md +0 -0
- /package/plugins/{pm-cli-claude → pm-claude}/commands/pm-new.md +0 -0
- /package/plugins/{pm-cli-claude → pm-claude}/commands/pm-release.md +0 -0
- /package/plugins/{pm-cli-claude → pm-claude}/commands/pm-search.md +0 -0
- /package/plugins/{pm-cli-claude → pm-claude}/commands/pm-start-task.md +0 -0
- /package/plugins/{pm-cli-claude → pm-claude}/commands/pm-status.md +0 -0
- /package/plugins/{pm-cli-claude → pm-claude}/commands/pm-triage.md +0 -0
- /package/plugins/{pm-cli-claude → pm-claude}/commands/pm-workflow.md +0 -0
- /package/plugins/{pm-cli-claude → pm-claude}/hooks/hooks.json +0 -0
- /package/plugins/{pm-cli-claude → pm-claude}/hooks/session-start.mjs +0 -0
- /package/plugins/{pm-cli-claude → pm-claude}/skills/pm-audit/SKILL.md +0 -0
- /package/plugins/{pm-cli-claude → pm-claude}/skills/pm-developer/SKILL.md +0 -0
- /package/plugins/{pm-cli-claude → pm-claude}/skills/pm-release/SKILL.md +0 -0
- /package/plugins/{pm-cli-claude → pm-claude}/skills/pm-workflow/SKILL.md +0 -0
- /package/plugins/{pm-cli-codex → pm-codex}/assets/pm-cli-small.svg +0 -0
- /package/plugins/{pm-cli-codex → pm-codex}/commands/pm-audit.md +0 -0
- /package/plugins/{pm-cli-codex → pm-codex}/commands/pm-close-task.md +0 -0
- /package/plugins/{pm-cli-codex → pm-codex}/commands/pm-start-task.md +0 -0
- /package/plugins/{pm-cli-codex → pm-codex}/skills/pm-auditor/SKILL.md +0 -0
- /package/plugins/{pm-cli-codex → pm-codex}/skills/pm-auditor/agents/openai.yaml +0 -0
- /package/plugins/{pm-cli-codex → pm-codex}/skills/pm-native/agents/openai.yaml +0 -0
- /package/plugins/{pm-cli-codex → pm-codex}/skills/pm-release/SKILL.md +0 -0
- /package/plugins/{pm-cli-codex → pm-codex}/skills/pm-release/agents/openai.yaml +0 -0
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
|
|
2
|
+
!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]="499323d3-24fc-5cd7-b97a-b27a0971ba12")}catch(e){}}();
|
|
1
3
|
import { execFile } from "node:child_process";
|
|
2
4
|
import fs from "node:fs/promises";
|
|
3
5
|
import os from "node:os";
|
|
@@ -7,7 +9,8 @@ import { promisify } from "node:util";
|
|
|
7
9
|
import { activateExtensions, loadExtensions, nextExtensionReloadToken } from "../../core/extensions/index.js";
|
|
8
10
|
import { EXTENSION_CAPABILITY_CONTRACT, KNOWN_EXTENSION_CAPABILITIES, parseLegacyExtensionCapabilityAliasWarning, parseUnknownExtensionCapabilityWarning, resolveExtensionRoots, } from "../../core/extensions/loader.js";
|
|
9
11
|
import { pathExists } from "../../core/fs/fs-utils.js";
|
|
10
|
-
import { collectPackageExtensionDirectories } from "../../core/packages/manifest.js";
|
|
12
|
+
import { PM_PACKAGE_RESOURCE_KINDS, collectPackageExtensionDirectories, readPmPackageManifest, } from "../../core/packages/manifest.js";
|
|
13
|
+
import { resolvePmPackageRootFromModule } from "../../core/packages/root.js";
|
|
11
14
|
import { EXIT_CODE } from "../../core/shared/constants.js";
|
|
12
15
|
import { PmCliError } from "../../core/shared/errors.js";
|
|
13
16
|
import { nowIso } from "../../core/shared/time.js";
|
|
@@ -18,7 +21,7 @@ const DEFAULT_EXTENSION_PRIORITY = 100;
|
|
|
18
21
|
const MANAGED_EXTENSION_STATE_FILENAME = ".managed-extensions.json";
|
|
19
22
|
const MANAGED_EXTENSION_STATE_VERSION = 1;
|
|
20
23
|
const PM_PACKAGE_ROOT_ENV = "PM_CLI_PACKAGE_ROOT";
|
|
21
|
-
const
|
|
24
|
+
const LEGACY_BUNDLED_PACKAGE_ALIASES = {
|
|
22
25
|
beads: {
|
|
23
26
|
package_directory: "pm-beads",
|
|
24
27
|
legacy_extension_directory: "beads",
|
|
@@ -35,21 +38,20 @@ function resolvePackageRootCandidates() {
|
|
|
35
38
|
if (typeof envRoot === "string" && envRoot.trim().length > 0) {
|
|
36
39
|
candidates.push(path.resolve(envRoot.trim()));
|
|
37
40
|
}
|
|
38
|
-
|
|
39
|
-
candidates.push(moduleRoot);
|
|
41
|
+
candidates.push(resolvePmPackageRootFromModule(import.meta.url, ["../../.."]));
|
|
40
42
|
return [...new Set(candidates)];
|
|
41
43
|
}
|
|
42
44
|
async function resolveBundledExtensionAliasSource(input) {
|
|
43
45
|
const normalized = input.trim().toLowerCase();
|
|
44
|
-
const
|
|
46
|
+
const packageRoot = await resolveBundledPackageRoot(normalized);
|
|
47
|
+
if (packageRoot) {
|
|
48
|
+
return packageRoot;
|
|
49
|
+
}
|
|
50
|
+
const alias = LEGACY_BUNDLED_PACKAGE_ALIASES[normalized];
|
|
45
51
|
if (!alias) {
|
|
46
52
|
return null;
|
|
47
53
|
}
|
|
48
54
|
for (const packageRoot of resolvePackageRootCandidates()) {
|
|
49
|
-
const packagePath = path.join(packageRoot, "packages", alias.package_directory);
|
|
50
|
-
if (await pathExists(path.join(packagePath, "package.json"))) {
|
|
51
|
-
return packagePath;
|
|
52
|
-
}
|
|
53
55
|
const legacyExtensionPath = path.join(packageRoot, ".agents", "pm", "extensions", alias.legacy_extension_directory);
|
|
54
56
|
if (await pathExists(path.join(legacyExtensionPath, "manifest.json"))) {
|
|
55
57
|
return legacyExtensionPath;
|
|
@@ -60,8 +62,67 @@ async function resolveBundledExtensionAliasSource(input) {
|
|
|
60
62
|
function isBundledPackageInstallAllTarget(input) {
|
|
61
63
|
return BUNDLED_PACKAGE_INSTALL_ALL_TARGETS.has(input.trim().toLowerCase());
|
|
62
64
|
}
|
|
63
|
-
function
|
|
64
|
-
return
|
|
65
|
+
function derivePackageAlias(packageDirectory) {
|
|
66
|
+
return packageDirectory.replace(/^pm-/i, "").trim().toLowerCase();
|
|
67
|
+
}
|
|
68
|
+
async function collectBundledPackageEntries() {
|
|
69
|
+
const entriesByAlias = new Map();
|
|
70
|
+
for (const packageRoot of resolvePackageRootCandidates()) {
|
|
71
|
+
const packagesRoot = path.join(packageRoot, "packages");
|
|
72
|
+
if (!(await pathExists(packagesRoot))) {
|
|
73
|
+
continue;
|
|
74
|
+
}
|
|
75
|
+
const entries = await fs.readdir(packagesRoot, { withFileTypes: true });
|
|
76
|
+
for (const entry of entries) {
|
|
77
|
+
if (!entry.isDirectory() || !entry.name.startsWith("pm-")) {
|
|
78
|
+
continue;
|
|
79
|
+
}
|
|
80
|
+
const candidateRoot = path.join(packagesRoot, entry.name);
|
|
81
|
+
if (!(await pathExists(path.join(candidateRoot, "package.json")))) {
|
|
82
|
+
continue;
|
|
83
|
+
}
|
|
84
|
+
const manifest = await readPmPackageManifest(candidateRoot);
|
|
85
|
+
const aliases = manifest.aliases && manifest.aliases.length > 0
|
|
86
|
+
? manifest.aliases
|
|
87
|
+
: [derivePackageAlias(entry.name)];
|
|
88
|
+
for (const alias of aliases) {
|
|
89
|
+
const normalizedAlias = alias.trim().toLowerCase();
|
|
90
|
+
if (normalizedAlias.length === 0 || entriesByAlias.has(normalizedAlias)) {
|
|
91
|
+
continue;
|
|
92
|
+
}
|
|
93
|
+
entriesByAlias.set(normalizedAlias, {
|
|
94
|
+
alias: normalizedAlias,
|
|
95
|
+
package_directory: entry.name,
|
|
96
|
+
package_root: candidateRoot,
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
for (const [alias, legacy] of Object.entries(LEGACY_BUNDLED_PACKAGE_ALIASES)) {
|
|
102
|
+
if (entriesByAlias.has(alias)) {
|
|
103
|
+
continue;
|
|
104
|
+
}
|
|
105
|
+
for (const packageRoot of resolvePackageRootCandidates()) {
|
|
106
|
+
const packagePath = path.join(packageRoot, "packages", legacy.package_directory);
|
|
107
|
+
if (await pathExists(path.join(packagePath, "package.json"))) {
|
|
108
|
+
entriesByAlias.set(alias, {
|
|
109
|
+
alias,
|
|
110
|
+
package_directory: legacy.package_directory,
|
|
111
|
+
package_root: packagePath,
|
|
112
|
+
});
|
|
113
|
+
break;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
return [...entriesByAlias.values()].sort((left, right) => left.alias.localeCompare(right.alias));
|
|
118
|
+
}
|
|
119
|
+
async function listBundledPackageAliases() {
|
|
120
|
+
return (await collectBundledPackageEntries()).map((entry) => entry.alias);
|
|
121
|
+
}
|
|
122
|
+
async function resolveBundledPackageRoot(alias) {
|
|
123
|
+
const normalized = alias.trim().toLowerCase();
|
|
124
|
+
const entry = (await collectBundledPackageEntries()).find((candidate) => candidate.alias === normalized);
|
|
125
|
+
return entry?.package_root ?? null;
|
|
65
126
|
}
|
|
66
127
|
function normalizeStringList(values) {
|
|
67
128
|
return [...new Set(values.map((value) => value.trim()).filter((value) => value.length > 0))].sort((left, right) => left.localeCompare(right));
|
|
@@ -291,7 +352,7 @@ function normalizeManagedState(raw) {
|
|
|
291
352
|
continue;
|
|
292
353
|
}
|
|
293
354
|
const source = entry.source;
|
|
294
|
-
if ((source.kind !== "local" && source.kind !== "github" && source.kind !== "npm") ||
|
|
355
|
+
if ((source.kind !== "local" && source.kind !== "github" && source.kind !== "npm" && source.kind !== "builtin") ||
|
|
295
356
|
typeof source.input !== "string" ||
|
|
296
357
|
typeof source.location !== "string") {
|
|
297
358
|
continue;
|
|
@@ -309,6 +370,7 @@ function normalizeManagedState(raw) {
|
|
|
309
370
|
kind: source.kind,
|
|
310
371
|
input: source.input,
|
|
311
372
|
location: source.location,
|
|
373
|
+
name: typeof source.name === "string" ? source.name : undefined,
|
|
312
374
|
package: typeof source.package === "string" ? source.package : undefined,
|
|
313
375
|
version: typeof source.version === "string" ? source.version : undefined,
|
|
314
376
|
repository: typeof source.repository === "string" ? source.repository : undefined,
|
|
@@ -477,6 +539,7 @@ function resolveAction(target, options) {
|
|
|
477
539
|
options.manage ? "manage" : null,
|
|
478
540
|
options.reload ? "reload" : null,
|
|
479
541
|
options.doctor ? "doctor" : null,
|
|
542
|
+
options.catalog ? "catalog" : null,
|
|
480
543
|
options.init ? "init" : null,
|
|
481
544
|
options.scaffold ? "init" : null,
|
|
482
545
|
options.adopt ? "adopt" : null,
|
|
@@ -491,10 +554,25 @@ function resolveAction(target, options) {
|
|
|
491
554
|
if (typeof target === "string" && target.trim().toLowerCase() === "reload") {
|
|
492
555
|
return "reload";
|
|
493
556
|
}
|
|
557
|
+
if (typeof target === "string" && target.trim().toLowerCase() === "catalog") {
|
|
558
|
+
return "catalog";
|
|
559
|
+
}
|
|
494
560
|
if (typeof target === "string" && (target.trim().toLowerCase() === "init" || target.trim().toLowerCase() === "scaffold")) {
|
|
495
561
|
return "init";
|
|
496
562
|
}
|
|
497
|
-
|
|
563
|
+
if (typeof target === "string" && target.trim().toLowerCase() === "explore") {
|
|
564
|
+
return "explore";
|
|
565
|
+
}
|
|
566
|
+
if (typeof target === "string" && target.trim().toLowerCase() === "manage") {
|
|
567
|
+
return "manage";
|
|
568
|
+
}
|
|
569
|
+
if (typeof target === "string" && (target.trim().toLowerCase() === "list" || target.trim() === "")) {
|
|
570
|
+
return "explore";
|
|
571
|
+
}
|
|
572
|
+
if (target === undefined) {
|
|
573
|
+
return "explore";
|
|
574
|
+
}
|
|
575
|
+
throw new PmCliError("One action flag is required. Use one of: --install, --uninstall, --explore, --manage, --reload, --doctor, --catalog, --init/--scaffold, --adopt, --adopt-all, --activate, --deactivate. Bare `pm package` and `pm extension` default to --explore.", EXIT_CODE.USAGE);
|
|
498
576
|
}
|
|
499
577
|
if (selected.length > 1) {
|
|
500
578
|
throw new PmCliError("Extension action flags are mutually exclusive.", EXIT_CODE.USAGE);
|
|
@@ -509,6 +587,85 @@ function resolveScope(options) {
|
|
|
509
587
|
}
|
|
510
588
|
return global ? "global" : "project";
|
|
511
589
|
}
|
|
590
|
+
async function buildBundledPackageCatalog(scope, global) {
|
|
591
|
+
const roots = resolveExtensionRoots(resolvePmRoot(process.cwd(), global.path), process.cwd());
|
|
592
|
+
const selectedRoot = scope === "global" ? roots.global : roots.project;
|
|
593
|
+
const managedStateRead = await readManagedExtensionState(selectedRoot);
|
|
594
|
+
const installedLocations = new Set(managedStateRead.state.entries
|
|
595
|
+
.filter((entry) => entry.scope === scope)
|
|
596
|
+
.filter((entry) => entry.source.kind !== "builtin")
|
|
597
|
+
.map((entry) => path.resolve(entry.source.location)));
|
|
598
|
+
const installedBuiltinAliases = new Set(managedStateRead.state.entries
|
|
599
|
+
.filter((entry) => entry.scope === scope && entry.source.kind === "builtin")
|
|
600
|
+
.flatMap((entry) => [entry.source.name, entry.source.input, entry.source.location])
|
|
601
|
+
.filter((value) => typeof value === "string" && value.trim().length > 0)
|
|
602
|
+
.map((value) => value.trim().toLowerCase()));
|
|
603
|
+
const packages = [];
|
|
604
|
+
for (const alias of await listBundledPackageAliases()) {
|
|
605
|
+
const packageRoot = await resolveBundledPackageRoot(alias);
|
|
606
|
+
const installScopeFlag = scope === "global" ? "--global" : "--project";
|
|
607
|
+
if (!packageRoot) {
|
|
608
|
+
packages.push({
|
|
609
|
+
alias,
|
|
610
|
+
bundled: true,
|
|
611
|
+
available: false,
|
|
612
|
+
installed: false,
|
|
613
|
+
install_target: alias,
|
|
614
|
+
install_command: `pm install ${alias} ${installScopeFlag}`,
|
|
615
|
+
});
|
|
616
|
+
continue;
|
|
617
|
+
}
|
|
618
|
+
const manifest = await readPmPackageManifest(packageRoot);
|
|
619
|
+
const repository = manifest.catalog?.links?.repository ?? manifest.package_repository_url;
|
|
620
|
+
const report = manifest.catalog?.links?.report ?? manifest.package_bugs_url;
|
|
621
|
+
const docs = manifest.catalog?.links?.docs ?? manifest.package_homepage;
|
|
622
|
+
const npm = manifest.catalog?.links?.npm ??
|
|
623
|
+
(manifest.package_name && manifest.package_private !== true
|
|
624
|
+
? `https://www.npmjs.com/package/${encodeURIComponent(manifest.package_name)}`
|
|
625
|
+
: undefined);
|
|
626
|
+
const metadataOnlyResources = Object.fromEntries(PM_PACKAGE_RESOURCE_KINDS
|
|
627
|
+
.filter((resourceKind) => resourceKind !== "extensions")
|
|
628
|
+
.map((resourceKind) => [resourceKind, manifest.resources[resourceKind] ?? []])
|
|
629
|
+
.filter(([, entries]) => Array.isArray(entries) && entries.length > 0));
|
|
630
|
+
packages.push({
|
|
631
|
+
alias,
|
|
632
|
+
bundled: true,
|
|
633
|
+
available: true,
|
|
634
|
+
installed: installedBuiltinAliases.has(alias) || installedLocations.has(path.resolve(packageRoot)),
|
|
635
|
+
install_target: alias,
|
|
636
|
+
install_command: `pm install ${alias} ${installScopeFlag}`,
|
|
637
|
+
package_root: packageRoot,
|
|
638
|
+
package_name: manifest.package_name,
|
|
639
|
+
package_version: manifest.package_version,
|
|
640
|
+
description: manifest.catalog?.summary ?? manifest.package_description,
|
|
641
|
+
keywords: manifest.package_keywords ?? [],
|
|
642
|
+
resources: manifest.resources,
|
|
643
|
+
installable_resources: {
|
|
644
|
+
extensions: manifest.resources.extensions ?? [],
|
|
645
|
+
},
|
|
646
|
+
metadata_only_resources: metadataOnlyResources,
|
|
647
|
+
catalog: {
|
|
648
|
+
display_name: manifest.catalog?.display_name,
|
|
649
|
+
category: manifest.catalog?.category,
|
|
650
|
+
tags: manifest.catalog?.tags ?? manifest.package_keywords ?? [],
|
|
651
|
+
links: {
|
|
652
|
+
docs,
|
|
653
|
+
npm,
|
|
654
|
+
repository,
|
|
655
|
+
report,
|
|
656
|
+
},
|
|
657
|
+
media: manifest.catalog?.media,
|
|
658
|
+
},
|
|
659
|
+
});
|
|
660
|
+
}
|
|
661
|
+
return {
|
|
662
|
+
total: packages.length,
|
|
663
|
+
scope,
|
|
664
|
+
installable_resource_kinds: ["extensions"],
|
|
665
|
+
metadata_only_resource_kinds: PM_PACKAGE_RESOURCE_KINDS.filter((resourceKind) => resourceKind !== "extensions"),
|
|
666
|
+
packages,
|
|
667
|
+
};
|
|
668
|
+
}
|
|
512
669
|
function parseGithubPathSpec(pathSpec, input, refOverride) {
|
|
513
670
|
const segments = pathSpec
|
|
514
671
|
.split("/")
|
|
@@ -735,7 +892,7 @@ async function resolvePackageExtensionDirectory(packageRoot, sourceLabel) {
|
|
|
735
892
|
.sort((left, right) => left.localeCompare(right));
|
|
736
893
|
throw new PmCliError(`Package source "${sourceLabel}" contains multiple extension manifests. Provide an explicit extension path. Candidates: ${choices.join(", ")}`, EXIT_CODE.USAGE);
|
|
737
894
|
}
|
|
738
|
-
throw new PmCliError(`Unable to locate a pm extension manifest in package source "${sourceLabel}".
|
|
895
|
+
throw new PmCliError(`Unable to locate a pm extension manifest in package source "${sourceLabel}". Package installs currently activate only extension resources, so add package.json pm.extensions or an extensions/ directory. Metadata-only resources like pm.docs/pm.examples are catalog metadata and do not activate commands.`, EXIT_CODE.USAGE);
|
|
739
896
|
}
|
|
740
897
|
async function resolveGithubSourceDirectory(cloneDirectory, source) {
|
|
741
898
|
const candidatePaths = [];
|
|
@@ -762,11 +919,14 @@ async function resolveGithubSourceDirectory(cloneDirectory, source) {
|
|
|
762
919
|
}
|
|
763
920
|
async function resolveInstallSource(source) {
|
|
764
921
|
if (source.kind === "local") {
|
|
765
|
-
|
|
922
|
+
let localStats;
|
|
923
|
+
try {
|
|
924
|
+
localStats = await fs.stat(source.absolute_path);
|
|
925
|
+
}
|
|
926
|
+
catch {
|
|
766
927
|
throw new PmCliError(`Local extension source does not exist: "${source.absolute_path}".`, EXIT_CODE.NOT_FOUND);
|
|
767
928
|
}
|
|
768
|
-
|
|
769
|
-
if (!stats.isDirectory()) {
|
|
929
|
+
if (!localStats.isDirectory()) {
|
|
770
930
|
throw new PmCliError(`Local extension source must be a directory: "${source.absolute_path}".`, EXIT_CODE.USAGE);
|
|
771
931
|
}
|
|
772
932
|
const directory = await resolvePackageExtensionDirectory(source.absolute_path, source.input);
|
|
@@ -966,20 +1126,66 @@ function applyDoctorRuntimeActivationState(extensions, loadResult, activationRes
|
|
|
966
1126
|
const loadedNames = new Set(loadResult.loaded.map((entry) => normalizeExtensionNameForMatch(entry.name)));
|
|
967
1127
|
const loadFailedNames = new Set(loadResult.failed.map((entry) => normalizeExtensionNameForMatch(entry.name)));
|
|
968
1128
|
const activationFailedNames = new Set(activationResult.failed.map((entry) => normalizeExtensionNameForMatch(entry.name)));
|
|
1129
|
+
const commandPathsByExtension = new Map();
|
|
1130
|
+
const actionPathsByExtension = new Map();
|
|
1131
|
+
const addCommandPath = (extensionName, commandPath) => {
|
|
1132
|
+
const normalizedName = normalizeExtensionNameForMatch(extensionName);
|
|
1133
|
+
const normalizedCommandPath = commandPath.trim();
|
|
1134
|
+
if (normalizedName.length === 0 || normalizedCommandPath.length === 0) {
|
|
1135
|
+
return;
|
|
1136
|
+
}
|
|
1137
|
+
const existing = commandPathsByExtension.get(normalizedName) ?? new Set();
|
|
1138
|
+
existing.add(normalizedCommandPath);
|
|
1139
|
+
commandPathsByExtension.set(normalizedName, existing);
|
|
1140
|
+
};
|
|
1141
|
+
const addActionPath = (extensionName, actionPath) => {
|
|
1142
|
+
const normalizedName = normalizeExtensionNameForMatch(extensionName);
|
|
1143
|
+
const normalizedActionPath = actionPath.trim();
|
|
1144
|
+
if (normalizedName.length === 0 || normalizedActionPath.length === 0) {
|
|
1145
|
+
return;
|
|
1146
|
+
}
|
|
1147
|
+
const existing = actionPathsByExtension.get(normalizedName) ?? new Set();
|
|
1148
|
+
existing.add(normalizedActionPath);
|
|
1149
|
+
actionPathsByExtension.set(normalizedName, existing);
|
|
1150
|
+
};
|
|
1151
|
+
for (const registration of activationResult.registrations.commands) {
|
|
1152
|
+
addCommandPath(registration.name, registration.command);
|
|
1153
|
+
addActionPath(registration.name, registration.action);
|
|
1154
|
+
}
|
|
1155
|
+
for (const handler of activationResult.commands.handlers) {
|
|
1156
|
+
addCommandPath(handler.name, handler.command);
|
|
1157
|
+
}
|
|
1158
|
+
for (const override of activationResult.commands.overrides) {
|
|
1159
|
+
addCommandPath(override.name, override.command);
|
|
1160
|
+
}
|
|
1161
|
+
const sortedPaths = (values) => {
|
|
1162
|
+
if (!values || values.size === 0) {
|
|
1163
|
+
return undefined;
|
|
1164
|
+
}
|
|
1165
|
+
return [...values].sort((left, right) => left.localeCompare(right));
|
|
1166
|
+
};
|
|
969
1167
|
return extensions.map((entry) => {
|
|
1168
|
+
const normalizedName = normalizeExtensionNameForMatch(entry.name);
|
|
1169
|
+
const commandPaths = sortedPaths(commandPathsByExtension.get(normalizedName));
|
|
1170
|
+
const actionPaths = sortedPaths(actionPathsByExtension.get(normalizedName));
|
|
1171
|
+
const runtimeMetadata = {
|
|
1172
|
+
...(commandPaths ? { command_paths: commandPaths } : {}),
|
|
1173
|
+
...(actionPaths ? { action_paths: actionPaths } : {}),
|
|
1174
|
+
};
|
|
970
1175
|
if (!entry.enabled) {
|
|
971
1176
|
return {
|
|
972
1177
|
...entry,
|
|
973
1178
|
runtime_active: false,
|
|
974
1179
|
activation_status: "not_loaded",
|
|
1180
|
+
...runtimeMetadata,
|
|
975
1181
|
};
|
|
976
1182
|
}
|
|
977
|
-
const normalizedName = normalizeExtensionNameForMatch(entry.name);
|
|
978
1183
|
if (loadFailedNames.has(normalizedName) || activationFailedNames.has(normalizedName)) {
|
|
979
1184
|
return {
|
|
980
1185
|
...entry,
|
|
981
1186
|
runtime_active: false,
|
|
982
1187
|
activation_status: "failed",
|
|
1188
|
+
...runtimeMetadata,
|
|
983
1189
|
};
|
|
984
1190
|
}
|
|
985
1191
|
if (loadedNames.has(normalizedName)) {
|
|
@@ -987,12 +1193,14 @@ function applyDoctorRuntimeActivationState(extensions, loadResult, activationRes
|
|
|
987
1193
|
...entry,
|
|
988
1194
|
runtime_active: true,
|
|
989
1195
|
activation_status: "ok",
|
|
1196
|
+
...runtimeMetadata,
|
|
990
1197
|
};
|
|
991
1198
|
}
|
|
992
1199
|
return {
|
|
993
1200
|
...entry,
|
|
994
1201
|
runtime_active: false,
|
|
995
1202
|
activation_status: "not_loaded",
|
|
1203
|
+
...runtimeMetadata,
|
|
996
1204
|
};
|
|
997
1205
|
});
|
|
998
1206
|
}
|
|
@@ -1127,13 +1335,17 @@ function requireTarget(target, action) {
|
|
|
1127
1335
|
const normalized = target?.trim();
|
|
1128
1336
|
if (!normalized) {
|
|
1129
1337
|
if (action === "init") {
|
|
1130
|
-
throw new PmCliError('Action "init" requires a scaffold target path (for example: pm
|
|
1338
|
+
throw new PmCliError('Action "init" requires a scaffold target path (for example: pm package init ./my-package or pm extension init ./my-extension).', EXIT_CODE.USAGE);
|
|
1131
1339
|
}
|
|
1132
1340
|
throw new PmCliError(`Action "${action}" requires an extension name or source target argument.`, EXIT_CODE.USAGE);
|
|
1133
1341
|
}
|
|
1134
1342
|
return normalized;
|
|
1135
1343
|
}
|
|
1136
|
-
function
|
|
1344
|
+
function lifecycleFlagCommand(options, action) {
|
|
1345
|
+
return options.vocabulary === "package" ? `pm package ${action}` : `pm extension --${action}`;
|
|
1346
|
+
}
|
|
1347
|
+
function buildStarterExtensionScaffoldFiles(extensionName, commandName, vocabulary) {
|
|
1348
|
+
const packageName = `pm-${extensionName}`;
|
|
1137
1349
|
const manifest = `${JSON.stringify({
|
|
1138
1350
|
name: extensionName,
|
|
1139
1351
|
version: "0.1.0",
|
|
@@ -1159,10 +1371,63 @@ function buildStarterExtensionScaffoldFiles(extensionName, commandName) {
|
|
|
1159
1371
|
"};",
|
|
1160
1372
|
"",
|
|
1161
1373
|
].join("\n");
|
|
1374
|
+
if (vocabulary === "package") {
|
|
1375
|
+
const packageJson = `${JSON.stringify({
|
|
1376
|
+
name: packageName,
|
|
1377
|
+
version: "0.1.0",
|
|
1378
|
+
private: true,
|
|
1379
|
+
type: "module",
|
|
1380
|
+
keywords: ["pm-package"],
|
|
1381
|
+
peerDependencies: {
|
|
1382
|
+
"@unbrained/pm-cli": "*",
|
|
1383
|
+
},
|
|
1384
|
+
pm: {
|
|
1385
|
+
aliases: [extensionName],
|
|
1386
|
+
extensions: [`extensions/${extensionName}`],
|
|
1387
|
+
docs: ["README.md"],
|
|
1388
|
+
examples: ["README.md"],
|
|
1389
|
+
catalog: {
|
|
1390
|
+
display_name: extensionName,
|
|
1391
|
+
category: "workflow",
|
|
1392
|
+
summary: "Starter pm package scaffold.",
|
|
1393
|
+
tags: ["starter"],
|
|
1394
|
+
},
|
|
1395
|
+
},
|
|
1396
|
+
}, null, 2)}\n`;
|
|
1397
|
+
const packageReadme = [
|
|
1398
|
+
`# ${packageName}`,
|
|
1399
|
+
"",
|
|
1400
|
+
"Generated by `pm package init`.",
|
|
1401
|
+
"",
|
|
1402
|
+
"## Included Files",
|
|
1403
|
+
"- `package.json`: package metadata and `pm` resource manifest.",
|
|
1404
|
+
`- \`extensions/${extensionName}/manifest.json\`: extension metadata and capabilities.`,
|
|
1405
|
+
`- \`extensions/${extensionName}/index.js\`: starter command registration using the \`commands\` capability.`,
|
|
1406
|
+
"",
|
|
1407
|
+
"## Quick Start",
|
|
1408
|
+
"```bash",
|
|
1409
|
+
"pm install --project <package-path>",
|
|
1410
|
+
`pm ${commandName}`,
|
|
1411
|
+
"pm package doctor --project --detail summary",
|
|
1412
|
+
"```",
|
|
1413
|
+
"",
|
|
1414
|
+
"## Notes",
|
|
1415
|
+
"- Keep package metadata in `package.json` and runtime behavior under `extensions/`.",
|
|
1416
|
+
"- Add capabilities to the extension manifest only when the entrypoint uses the matching SDK API.",
|
|
1417
|
+
"- Use `@unbrained/pm-cli/sdk` as the public SDK import for richer package runtimes.",
|
|
1418
|
+
"",
|
|
1419
|
+
].join("\n");
|
|
1420
|
+
return {
|
|
1421
|
+
"package.json": packageJson,
|
|
1422
|
+
[`extensions/${extensionName}/manifest.json`]: manifest,
|
|
1423
|
+
[`extensions/${extensionName}/index.js`]: entrypoint,
|
|
1424
|
+
"README.md": packageReadme,
|
|
1425
|
+
};
|
|
1426
|
+
}
|
|
1162
1427
|
const readme = [
|
|
1163
1428
|
`# ${extensionName}`,
|
|
1164
1429
|
"",
|
|
1165
|
-
"Generated by `pm extension
|
|
1430
|
+
"Generated by `pm extension init`.",
|
|
1166
1431
|
"",
|
|
1167
1432
|
"## Included Files",
|
|
1168
1433
|
"- `manifest.json`: extension metadata and capabilities.",
|
|
@@ -1186,12 +1451,12 @@ function buildStarterExtensionScaffoldFiles(extensionName, commandName) {
|
|
|
1186
1451
|
"README.md": readme,
|
|
1187
1452
|
};
|
|
1188
1453
|
}
|
|
1189
|
-
async function scaffoldExtensionProject(target) {
|
|
1454
|
+
async function scaffoldExtensionProject(target, vocabulary = "extension") {
|
|
1190
1455
|
const normalizedTarget = target.trim();
|
|
1191
1456
|
const targetPath = path.resolve(process.cwd(), normalizedTarget);
|
|
1192
1457
|
const extensionName = normalizeManagedDirectoryName(path.basename(targetPath));
|
|
1193
1458
|
const commandName = `${extensionName} ping`;
|
|
1194
|
-
const scaffoldFiles = buildStarterExtensionScaffoldFiles(extensionName, commandName);
|
|
1459
|
+
const scaffoldFiles = buildStarterExtensionScaffoldFiles(extensionName, commandName, vocabulary);
|
|
1195
1460
|
let createdDirectory = false;
|
|
1196
1461
|
if (await pathExists(targetPath)) {
|
|
1197
1462
|
const existingTargetStats = await fs.stat(targetPath);
|
|
@@ -1206,6 +1471,7 @@ async function scaffoldExtensionProject(target) {
|
|
|
1206
1471
|
const files = [];
|
|
1207
1472
|
for (const [relativePath, content] of Object.entries(scaffoldFiles)) {
|
|
1208
1473
|
const absolutePath = path.join(targetPath, relativePath);
|
|
1474
|
+
await fs.mkdir(path.dirname(absolutePath), { recursive: true });
|
|
1209
1475
|
if (await pathExists(absolutePath)) {
|
|
1210
1476
|
const existingContent = await fs.readFile(absolutePath, "utf8");
|
|
1211
1477
|
if (existingContent !== content) {
|
|
@@ -1248,7 +1514,7 @@ function classifyDoctorLoadFailureWarnings(loadFailures) {
|
|
|
1248
1514
|
}
|
|
1249
1515
|
return [...new Set(warnings)].sort((left, right) => left.localeCompare(right));
|
|
1250
1516
|
}
|
|
1251
|
-
function buildExtensionTriageSummary(scope, warnings, extensions) {
|
|
1517
|
+
function buildExtensionTriageSummary(scope, warnings, extensions, options = {}) {
|
|
1252
1518
|
const normalizedWarnings = [...new Set(warnings)].sort((left, right) => left.localeCompare(right));
|
|
1253
1519
|
const managedTotal = extensions.filter((entry) => entry.managed).length;
|
|
1254
1520
|
const enabledTotal = extensions.filter((entry) => entry.enabled).length;
|
|
@@ -1288,7 +1554,7 @@ function buildExtensionTriageSummary(scope, warnings, extensions) {
|
|
|
1288
1554
|
const remediation = [];
|
|
1289
1555
|
if (normalizedWarnings.length > 0) {
|
|
1290
1556
|
if (normalizedWarnings.some((warning) => warning.startsWith("extension_manifest_"))) {
|
|
1291
|
-
remediation.push(`Run
|
|
1557
|
+
remediation.push(`Run ${lifecycleFlagCommand(options, "explore")} ${scopeFlag} to inspect discovered manifests and directories.`);
|
|
1292
1558
|
}
|
|
1293
1559
|
if (normalizedWarnings.some((warning) => warning.startsWith("extension_capability_unknown:"))) {
|
|
1294
1560
|
remediation.push(`Unknown extension capabilities detected. Allowed capabilities: ${KNOWN_EXTENSION_CAPABILITIES.join(", ")}. ` +
|
|
@@ -1304,14 +1570,14 @@ function buildExtensionTriageSummary(scope, warnings, extensions) {
|
|
|
1304
1570
|
}
|
|
1305
1571
|
if (normalizedWarnings.some((warning) => warning.startsWith("extension_load_failed_sdk_dependency_missing:"))) {
|
|
1306
1572
|
remediation.push(`Detected extension load failures caused by missing SDK dependency resolution. ` +
|
|
1307
|
-
`Ensure extension package dependencies include "@unbrained/pm-cli" and reinstall dependencies before running
|
|
1573
|
+
`Ensure extension package dependencies include "@unbrained/pm-cli" and reinstall dependencies before running ${lifecycleFlagCommand(options, "doctor")} ${scopeFlag}.`);
|
|
1308
1574
|
}
|
|
1309
1575
|
if (normalizedWarnings.some((warning) => warning.startsWith("extension_load_failed_module_mode_mismatch:"))) {
|
|
1310
1576
|
remediation.push(`Detected extension module-mode mismatches. For ESM-based extension entries/imports, set package.json "type": "module" ` +
|
|
1311
|
-
`or use an explicit .mjs entry and rerun
|
|
1577
|
+
`or use an explicit .mjs entry and rerun ${lifecycleFlagCommand(options, "doctor")} ${scopeFlag}.`);
|
|
1312
1578
|
}
|
|
1313
1579
|
if (updateCheckFailedTotal > 0) {
|
|
1314
|
-
remediation.push(`Run
|
|
1580
|
+
remediation.push(`Run ${lifecycleFlagCommand(options, "manage")} ${scopeFlag} after validating network and repository access.`);
|
|
1315
1581
|
}
|
|
1316
1582
|
if (normalizedWarnings.some((warning) => warning.startsWith("extension_manager_state_"))) {
|
|
1317
1583
|
remediation.push(`Review and repair ${scope} managed extension state file if schema/read warnings persist.`);
|
|
@@ -1321,19 +1587,19 @@ function buildExtensionTriageSummary(scope, warnings, extensions) {
|
|
|
1321
1587
|
}
|
|
1322
1588
|
}
|
|
1323
1589
|
if (updateHealthPartial) {
|
|
1324
|
-
remediation.push(`Update-check coverage is partial because unmanaged extensions need adoption. Adopt existing installs via
|
|
1590
|
+
remediation.push(`Update-check coverage is partial because unmanaged extensions need adoption. Adopt existing installs via ${lifecycleFlagCommand(options, "manage")} ${scopeFlag} --fix-managed-state (or ${lifecycleFlagCommand(options, "adopt-all")} ${scopeFlag}, ${lifecycleFlagCommand(options, "adopt")} <name> ${scopeFlag}, or reinstall via ${lifecycleFlagCommand(options, "install")} ${scopeFlag} <source>).`);
|
|
1325
1591
|
}
|
|
1326
1592
|
else if (skippedUnmanagedTotal > 0) {
|
|
1327
|
-
remediation.push(`Loaded unmanaged extensions are currently treated as informational. Use
|
|
1593
|
+
remediation.push(`Loaded unmanaged extensions are currently treated as informational. Use ${lifecycleFlagCommand(options, "manage")} ${scopeFlag} --fix-managed-state to adopt them for update checks.`);
|
|
1328
1594
|
}
|
|
1329
1595
|
if (skippedNonGithubTotal > 0) {
|
|
1330
1596
|
remediation.push(`Non-GitHub managed extensions are skipped by update checks. Use doctor output for non-update diagnostics.`);
|
|
1331
1597
|
}
|
|
1332
1598
|
if (updateAvailableTotal > 0) {
|
|
1333
|
-
remediation.push(`Update available managed extensions via
|
|
1599
|
+
remediation.push(`Update available managed extensions via ${lifecycleFlagCommand(options, "install")} ${scopeFlag} <source>.`);
|
|
1334
1600
|
}
|
|
1335
1601
|
if (remediation.length === 0) {
|
|
1336
|
-
remediation.push(`No immediate action required. Re-run
|
|
1602
|
+
remediation.push(`No immediate action required. Re-run ${lifecycleFlagCommand(options, "manage")} ${scopeFlag} after extension changes.`);
|
|
1337
1603
|
}
|
|
1338
1604
|
return {
|
|
1339
1605
|
status: effectiveWarnings.length === 0 ? "ok" : "warn",
|
|
@@ -1485,6 +1751,9 @@ export async function runExtension(target, options, global) {
|
|
|
1485
1751
|
if (action === "reload" && normalizedInput === "reload") {
|
|
1486
1752
|
return undefined;
|
|
1487
1753
|
}
|
|
1754
|
+
if (action === "catalog" && normalizedInput === "catalog") {
|
|
1755
|
+
return undefined;
|
|
1756
|
+
}
|
|
1488
1757
|
const inferredInitAlias = action === "init" &&
|
|
1489
1758
|
options.init !== true &&
|
|
1490
1759
|
options.scaffold !== true &&
|
|
@@ -1516,7 +1785,7 @@ export async function runExtension(target, options, global) {
|
|
|
1516
1785
|
throw new PmCliError('Action "init" does not accept --gh/--github/--ref options.', EXIT_CODE.USAGE);
|
|
1517
1786
|
}
|
|
1518
1787
|
const scaffoldTarget = requireTarget(normalizedTarget, action);
|
|
1519
|
-
const scaffold = await scaffoldExtensionProject(scaffoldTarget);
|
|
1788
|
+
const scaffold = await scaffoldExtensionProject(scaffoldTarget, options.vocabulary ?? "extension");
|
|
1520
1789
|
const quotedTargetPath = JSON.stringify(scaffold.target_path);
|
|
1521
1790
|
return withResult({
|
|
1522
1791
|
scaffolded: scaffold.created_directory || scaffold.files.some((entry) => entry.status === "created"),
|
|
@@ -1528,9 +1797,9 @@ export async function runExtension(target, options, global) {
|
|
|
1528
1797
|
created_directory: scaffold.created_directory,
|
|
1529
1798
|
files: scaffold.files,
|
|
1530
1799
|
next_steps: [
|
|
1531
|
-
`Install the scaffold: pm extension --install --project ${quotedTargetPath}`,
|
|
1800
|
+
`Install the scaffold: ${options.vocabulary === "package" ? "pm install --project" : "pm extension --install --project"} ${quotedTargetPath}`,
|
|
1532
1801
|
`Smoke-test command path: pm ${scaffold.command_name}`,
|
|
1533
|
-
|
|
1802
|
+
`Run diagnostics: ${options.vocabulary === "package" ? "pm package doctor" : "pm extension --doctor"} --project --detail summary`,
|
|
1534
1803
|
],
|
|
1535
1804
|
});
|
|
1536
1805
|
}
|
|
@@ -1582,6 +1851,12 @@ export async function runExtension(target, options, global) {
|
|
|
1582
1851
|
}
|
|
1583
1852
|
return withResult(details);
|
|
1584
1853
|
}
|
|
1854
|
+
if (action === "catalog") {
|
|
1855
|
+
if (typeof normalizedTarget === "string" && normalizedTarget.length > 0 && normalizedTarget !== "catalog") {
|
|
1856
|
+
throw new PmCliError('Action "catalog" does not accept a package target.', EXIT_CODE.USAGE);
|
|
1857
|
+
}
|
|
1858
|
+
return withResult(await buildBundledPackageCatalog(scope, global));
|
|
1859
|
+
}
|
|
1585
1860
|
if (action === "install") {
|
|
1586
1861
|
const githubOption = resolveGithubOption(options);
|
|
1587
1862
|
const explicitSourceInput = githubOption ?? requireTarget(normalizedTarget, action);
|
|
@@ -1589,7 +1864,7 @@ export async function runExtension(target, options, global) {
|
|
|
1589
1864
|
if (typeof options.ref === "string" && options.ref.trim().length > 0) {
|
|
1590
1865
|
throw new PmCliError('Action "install all" does not accept --ref.', EXIT_CODE.USAGE);
|
|
1591
1866
|
}
|
|
1592
|
-
const aliases = listBundledPackageAliases();
|
|
1867
|
+
const aliases = await listBundledPackageAliases();
|
|
1593
1868
|
const packages = [];
|
|
1594
1869
|
for (const alias of aliases) {
|
|
1595
1870
|
packages.push({
|
|
@@ -1616,6 +1891,7 @@ export async function runExtension(target, options, global) {
|
|
|
1616
1891
|
});
|
|
1617
1892
|
}
|
|
1618
1893
|
const bundledAliasSource = typeof githubOption === "string" ? null : await resolveBundledExtensionAliasSource(explicitSourceInput);
|
|
1894
|
+
const bundledAliasName = bundledAliasSource === null ? null : explicitSourceInput.trim().toLowerCase();
|
|
1619
1895
|
const sourceInput = bundledAliasSource ?? explicitSourceInput;
|
|
1620
1896
|
const installSource = parseExtensionInstallSource(sourceInput, {
|
|
1621
1897
|
forceGithub: typeof githubOption === "string",
|
|
@@ -1638,31 +1914,38 @@ export async function runExtension(target, options, global) {
|
|
|
1638
1914
|
}
|
|
1639
1915
|
await fs.cp(validated.directory, destinationDirectory, { recursive: true, force: true });
|
|
1640
1916
|
}
|
|
1641
|
-
const sourceRecord =
|
|
1917
|
+
const sourceRecord = bundledAliasName
|
|
1642
1918
|
? {
|
|
1643
|
-
kind: "
|
|
1644
|
-
input:
|
|
1645
|
-
location:
|
|
1919
|
+
kind: "builtin",
|
|
1920
|
+
input: bundledAliasName,
|
|
1921
|
+
location: bundledAliasName,
|
|
1922
|
+
name: bundledAliasName,
|
|
1646
1923
|
}
|
|
1647
|
-
: installSource.kind === "
|
|
1924
|
+
: installSource.kind === "local"
|
|
1648
1925
|
? {
|
|
1649
|
-
kind: "
|
|
1926
|
+
kind: "local",
|
|
1650
1927
|
input: installSource.input,
|
|
1651
|
-
location:
|
|
1652
|
-
package: resolvedSource.npm_package,
|
|
1653
|
-
version: resolvedSource.npm_version,
|
|
1928
|
+
location: installSource.absolute_path,
|
|
1654
1929
|
}
|
|
1655
|
-
:
|
|
1656
|
-
|
|
1657
|
-
|
|
1658
|
-
|
|
1659
|
-
|
|
1660
|
-
|
|
1661
|
-
|
|
1662
|
-
|
|
1663
|
-
|
|
1664
|
-
|
|
1665
|
-
|
|
1930
|
+
: installSource.kind === "npm"
|
|
1931
|
+
? {
|
|
1932
|
+
kind: "npm",
|
|
1933
|
+
input: installSource.input,
|
|
1934
|
+
location: resolvedSource.resolved_subpath ?? ".",
|
|
1935
|
+
package: resolvedSource.npm_package,
|
|
1936
|
+
version: resolvedSource.npm_version,
|
|
1937
|
+
}
|
|
1938
|
+
: {
|
|
1939
|
+
kind: "github",
|
|
1940
|
+
input: installSource.input,
|
|
1941
|
+
location: resolvedSource.resolved_subpath ?? installSource.subpath ?? ".",
|
|
1942
|
+
repository: installSource.repository,
|
|
1943
|
+
owner: installSource.owner,
|
|
1944
|
+
repo: installSource.repo,
|
|
1945
|
+
ref: installSource.ref,
|
|
1946
|
+
subpath: resolvedSource.resolved_subpath ?? installSource.subpath,
|
|
1947
|
+
commit: resolvedSource.commit,
|
|
1948
|
+
};
|
|
1666
1949
|
const now = nowIso();
|
|
1667
1950
|
const existingManagedEntry = managedStateRead.state.entries.find((entry) => normalizeExtensionNameForMatch(entry.name) === normalizeExtensionNameForMatch(validated.manifest.name));
|
|
1668
1951
|
const managedState = upsertManagedEntry(managedStateRead.state, {
|
|
@@ -1719,7 +2002,7 @@ export async function runExtension(target, options, global) {
|
|
|
1719
2002
|
const adoption = await adoptUnmanagedExtensions(resolvedRoots.selected_root, scope, installed.extensions, managedStateRead.state);
|
|
1720
2003
|
const refreshedInstalled = await listInstalledExtensions(resolvedRoots.selected_root, scope, settings, adoption.state);
|
|
1721
2004
|
warnings.push(...refreshedInstalled.warnings);
|
|
1722
|
-
const triage = buildExtensionTriageSummary(scope, warnings, refreshedInstalled.extensions);
|
|
2005
|
+
const triage = buildExtensionTriageSummary(scope, warnings, refreshedInstalled.extensions, options);
|
|
1723
2006
|
warnings.push(...triage.warnings);
|
|
1724
2007
|
const adoptedDetails = adoption.adopted_entries.map((entry) => {
|
|
1725
2008
|
const refreshedEntry = refreshedInstalled.extensions.find((candidate) => normalizeExtensionNameForMatch(candidate.name) === normalizeExtensionNameForMatch(entry.name) &&
|
|
@@ -1926,7 +2209,7 @@ export async function runExtension(target, options, global) {
|
|
|
1926
2209
|
.filter((entry) => entry.update_check_status === "failed")
|
|
1927
2210
|
.map((entry) => `extension_update_check_failed:${entry.name}`);
|
|
1928
2211
|
warnings.push(...updateCheckWarnings);
|
|
1929
|
-
const triage = buildExtensionTriageSummary(scope, warnings, runtimeInstalledExtensions);
|
|
2212
|
+
const triage = buildExtensionTriageSummary(scope, warnings, runtimeInstalledExtensions, options);
|
|
1930
2213
|
warnings.push(...triage.warnings);
|
|
1931
2214
|
const normalizedWarnings = [...triage.warnings];
|
|
1932
2215
|
const policySummary = {
|
|
@@ -1956,10 +2239,18 @@ export async function runExtension(target, options, global) {
|
|
|
1956
2239
|
...new Set([
|
|
1957
2240
|
...triage.remediation,
|
|
1958
2241
|
...(loadResult.failed.length > 0
|
|
1959
|
-
? [
|
|
2242
|
+
? [
|
|
2243
|
+
options.vocabulary === "package"
|
|
2244
|
+
? "Run pm package explore --project and pm package explore --global to inspect load failures."
|
|
2245
|
+
: "Run pm extension --explore --project and pm extension --explore --global to inspect load failures.",
|
|
2246
|
+
]
|
|
1960
2247
|
: []),
|
|
1961
2248
|
...(activationResult.failed.length > 0
|
|
1962
|
-
? [
|
|
2249
|
+
? [
|
|
2250
|
+
options.vocabulary === "package"
|
|
2251
|
+
? "Review activation failures in pm package doctor --detail deep output."
|
|
2252
|
+
: "Review activation failures in pm extension --doctor --detail deep output.",
|
|
2253
|
+
]
|
|
1963
2254
|
: []),
|
|
1964
2255
|
...(managedStateFix && managedStateFix.adopted_entries.length > 0
|
|
1965
2256
|
? [`Managed-state fix adopted ${managedStateFix.adopted_entries.length} extension(s).`]
|
|
@@ -2136,7 +2427,7 @@ export async function runExtension(target, options, global) {
|
|
|
2136
2427
|
}
|
|
2137
2428
|
let runtimeProbeSummary;
|
|
2138
2429
|
let runtimeInstalledExtensions = refreshedInstalled.extensions;
|
|
2139
|
-
if (action === "
|
|
2430
|
+
if (action === "explore" || options.runtimeProbe === true) {
|
|
2140
2431
|
const loadResult = await loadExtensions({
|
|
2141
2432
|
pmRoot: resolvedRoots.pm_root,
|
|
2142
2433
|
settings,
|
|
@@ -2153,6 +2444,7 @@ export async function runExtension(target, options, global) {
|
|
|
2153
2444
|
runtimeProbeSummary = {
|
|
2154
2445
|
requested: true,
|
|
2155
2446
|
executed: true,
|
|
2447
|
+
reason: action === "explore" ? "explore_defaults_to_runtime_probe" : "runtime_probe_requested",
|
|
2156
2448
|
load_failure_count: loadResult.failed.length,
|
|
2157
2449
|
activation_failure_count: activationResult.failed.length,
|
|
2158
2450
|
warning_count: [...new Set([...loadResult.warnings, ...activationResult.warnings])].length,
|
|
@@ -2161,11 +2453,11 @@ export async function runExtension(target, options, global) {
|
|
|
2161
2453
|
}
|
|
2162
2454
|
else if (action === "manage") {
|
|
2163
2455
|
runtimeProbeSummary = {
|
|
2164
|
-
requested:
|
|
2456
|
+
requested: false,
|
|
2165
2457
|
executed: false,
|
|
2166
2458
|
};
|
|
2167
2459
|
}
|
|
2168
|
-
const triage = buildExtensionTriageSummary(scope, warnings, runtimeInstalledExtensions);
|
|
2460
|
+
const triage = buildExtensionTriageSummary(scope, warnings, runtimeInstalledExtensions, options);
|
|
2169
2461
|
warnings.push(...triage.warnings);
|
|
2170
2462
|
const details = {
|
|
2171
2463
|
total: runtimeInstalledExtensions.length,
|
|
@@ -2176,6 +2468,9 @@ export async function runExtension(target, options, global) {
|
|
|
2176
2468
|
triage,
|
|
2177
2469
|
policy: configuredPolicy,
|
|
2178
2470
|
};
|
|
2471
|
+
if (action === "explore") {
|
|
2472
|
+
details.runtime_probe = runtimeProbeSummary;
|
|
2473
|
+
}
|
|
2179
2474
|
if (action === "manage") {
|
|
2180
2475
|
details.runtime_probe = runtimeProbeSummary;
|
|
2181
2476
|
details.managed_state_fix =
|
|
@@ -2199,4 +2494,5 @@ export async function runExtension(target, options, global) {
|
|
|
2199
2494
|
}
|
|
2200
2495
|
throw new PmCliError(`Unsupported extension action "${action}".`, EXIT_CODE.USAGE);
|
|
2201
2496
|
}
|
|
2202
|
-
//# sourceMappingURL=extension.js.map
|
|
2497
|
+
//# sourceMappingURL=extension.js.map
|
|
2498
|
+
//# debugId=499323d3-24fc-5cd7-b97a-b27a0971ba12
|