@unbrained/pm-cli 2026.5.14 → 2026.5.24
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 +71 -0
- package/CONTRIBUTING.md +1 -0
- package/README.md +8 -6
- 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 +19 -1
- package/dist/cli/commander-usage.js.map +1 -1
- package/dist/cli/commands/activity.js +4 -1
- 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/annotation-command.d.ts +49 -0
- package/dist/cli/commands/annotation-command.js +135 -0
- package/dist/cli/commands/annotation-command.js.map +1 -0
- package/dist/cli/commands/append.js +5 -6
- package/dist/cli/commands/append.js.map +1 -1
- package/dist/cli/commands/calendar.js +5 -5
- package/dist/cli/commands/calendar.js.map +1 -1
- package/dist/cli/commands/claim.d.ts +3 -0
- package/dist/cli/commands/claim.js +29 -23
- package/dist/cli/commands/claim.js.map +1 -1
- package/dist/cli/commands/close.js +63 -8
- 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.d.ts +5 -0
- package/dist/cli/commands/comments.js +29 -116
- package/dist/cli/commands/comments.js.map +1 -1
- package/dist/cli/commands/completion.js +198 -15
- 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 +21 -13
- package/dist/cli/commands/context.js.map +1 -1
- package/dist/cli/commands/contracts.d.ts +9 -0
- package/dist/cli/commands/contracts.js +314 -64
- package/dist/cli/commands/contracts.js.map +1 -1
- package/dist/cli/commands/create.js +77 -48
- package/dist/cli/commands/create.js.map +1 -1
- package/dist/cli/commands/dedupe-audit.js +9 -3
- package/dist/cli/commands/dedupe-audit.js.map +1 -1
- package/dist/cli/commands/delete.d.ts +3 -0
- package/dist/cli/commands/delete.js +11 -7
- 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.d.ts +1 -0
- package/dist/cli/commands/docs.js +6 -7
- package/dist/cli/commands/docs.js.map +1 -1
- package/dist/cli/commands/event-validation-messages.d.ts +3 -0
- package/dist/cli/commands/event-validation-messages.js +44 -0
- package/dist/cli/commands/event-validation-messages.js.map +1 -0
- package/dist/cli/commands/extension.d.ts +3 -1
- package/dist/cli/commands/extension.js +259 -52
- package/dist/cli/commands/extension.js.map +1 -1
- package/dist/cli/commands/files.js +8 -12
- package/dist/cli/commands/files.js.map +1 -1
- package/dist/cli/commands/gc.js +19 -3
- package/dist/cli/commands/gc.js.map +1 -1
- package/dist/cli/commands/get.d.ts +10 -5
- package/dist/cli/commands/get.js +135 -20
- 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 +14 -0
- package/dist/cli/commands/health.js +269 -67
- package/dist/cli/commands/health.js.map +1 -1
- package/dist/cli/commands/history-redact.d.ts +50 -0
- package/dist/cli/commands/history-redact.js +476 -0
- package/dist/cli/commands/history-redact.js.map +1 -0
- package/dist/cli/commands/history-repair.d.ts +33 -0
- package/dist/cli/commands/history-repair.js +166 -0
- package/dist/cli/commands/history-repair.js.map +1 -0
- package/dist/cli/commands/history.d.ts +4 -0
- package/dist/cli/commands/history.js +12 -79
- package/dist/cli/commands/history.js.map +1 -1
- package/dist/cli/commands/index.d.ts +5 -1
- package/dist/cli/commands/index.js +9 -2
- 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 +42 -0
- package/dist/cli/commands/init.js +96 -1
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/learnings.js +22 -118
- package/dist/cli/commands/learnings.js.map +1 -1
- package/dist/cli/commands/linked-test-entry.d.ts +3 -0
- package/dist/cli/commands/linked-test-entry.js +62 -0
- package/dist/cli/commands/linked-test-entry.js.map +1 -0
- package/dist/cli/commands/list.d.ts +1 -0
- package/dist/cli/commands/list.js +72 -38
- 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 +22 -118
- package/dist/cli/commands/notes.js.map +1 -1
- package/dist/cli/commands/plan.d.ts +121 -0
- package/dist/cli/commands/plan.js +1137 -0
- package/dist/cli/commands/plan.js.map +1 -0
- package/dist/cli/commands/reindex.js +4 -1
- package/dist/cli/commands/reindex.js.map +1 -1
- package/dist/cli/commands/restore.js +9 -49
- package/dist/cli/commands/restore.js.map +1 -1
- package/dist/cli/commands/schema.d.ts +31 -0
- package/dist/cli/commands/schema.js +98 -0
- package/dist/cli/commands/schema.js.map +1 -0
- package/dist/cli/commands/search.js +156 -40
- 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.d.ts +4 -0
- package/dist/cli/commands/templates.js +91 -16
- package/dist/cli/commands/templates.js.map +1 -1
- package/dist/cli/commands/test-all.js +6 -7
- 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.d.ts +1 -0
- package/dist/cli/commands/test.js +9 -9
- package/dist/cli/commands/test.js.map +1 -1
- package/dist/cli/commands/update-many.js +6 -7
- package/dist/cli/commands/update-many.js.map +1 -1
- package/dist/cli/commands/update.js +204 -103
- 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.d.ts +3 -1
- package/dist/cli/commands/validate.js +44 -64
- package/dist/cli/commands/validate.js.map +1 -1
- package/dist/cli/error-guidance.js +99 -6
- package/dist/cli/error-guidance.js.map +1 -1
- package/dist/cli/extension-command-help.d.ts +0 -1
- package/dist/cli/extension-command-help.js +4 -12
- package/dist/cli/extension-command-help.js.map +1 -1
- package/dist/cli/extension-command-options.d.ts +1 -0
- package/dist/cli/extension-command-options.js +108 -6
- 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.d.ts +0 -1
- package/dist/cli/help-content.js +46 -22
- package/dist/cli/help-content.js.map +1 -1
- package/dist/cli/help-json-payload.d.ts +1 -0
- package/dist/cli/help-json-payload.js +35 -2
- package/dist/cli/help-json-payload.js.map +1 -1
- package/dist/cli/main.js +214 -30
- 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.d.ts +1 -1
- package/dist/cli/register-list-query.js +75 -29
- package/dist/cli/register-list-query.js.map +1 -1
- package/dist/cli/register-mutation.d.ts +1 -1
- package/dist/cli/register-mutation.js +430 -38
- package/dist/cli/register-mutation.js.map +1 -1
- package/dist/cli/register-operations.js +47 -10
- package/dist/cli/register-operations.js.map +1 -1
- package/dist/cli/register-setup.js +47 -25
- package/dist/cli/register-setup.js.map +1 -1
- package/dist/cli/registration-helpers.d.ts +0 -2
- package/dist/cli/registration-helpers.js +21 -40
- 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 +65 -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.d.ts +0 -1
- package/dist/core/extensions/index.js +4 -13
- 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 +78 -60
- 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/fs/path-utils.d.ts +1 -0
- package/dist/core/fs/path-utils.js +12 -0
- package/dist/core/fs/path-utils.js.map +1 -0
- package/dist/core/history/drift-scan.d.ts +11 -0
- package/dist/core/history/drift-scan.js +67 -0
- package/dist/core/history/drift-scan.js.map +1 -0
- 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/history/replay.d.ts +82 -0
- package/dist/core/history/replay.js +249 -0
- package/dist/core/history/replay.js.map +1 -0
- 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 +250 -8
- package/dist/core/item/item-format.js.map +1 -1
- package/dist/core/item/item-type-definition.d.ts +52 -0
- package/dist/core/item/item-type-definition.js +123 -0
- package/dist/core/item/item-type-definition.js.map +1 -0
- 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 +34 -3
- package/dist/core/item/parse.js.map +1 -1
- package/dist/core/item/priority.d.ts +23 -0
- package/dist/core/item/priority.js +55 -0
- package/dist/core/item/priority.js.map +1 -0
- 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.d.ts +14 -1
- package/dist/core/item/status.js +24 -1
- package/dist/core/item/status.js.map +1 -1
- package/dist/core/item/toon-decode.d.ts +19 -0
- package/dist/core/item/toon-decode.js +69 -0
- package/dist/core/item/toon-decode.js.map +1 -0
- package/dist/core/item/type-registry.js +15 -83
- 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/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 +1 -0
- package/dist/core/packages/manifest.js +6 -8
- 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/item-types-file.d.ts +85 -0
- package/dist/core/schema/item-types-file.js +243 -0
- package/dist/core/schema/item-types-file.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.d.ts +2 -1
- package/dist/core/schema/runtime-schema.js +13 -8
- 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.js +21 -7
- 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 +12 -3
- 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/author.d.ts +1 -0
- package/dist/core/shared/author.js +9 -0
- package/dist/core/shared/author.js.map +1 -0
- 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/lazy-module.d.ts +1 -0
- package/dist/core/shared/lazy-module.js +11 -0
- package/dist/core/shared/lazy-module.js.map +1 -0
- package/dist/core/shared/levenshtein.js +4 -1
- package/dist/core/shared/levenshtein.js.map +1 -1
- package/dist/core/shared/option-alias-visibility.d.ts +44 -0
- package/dist/core/shared/option-alias-visibility.js +76 -0
- package/dist/core/shared/option-alias-visibility.js.map +1 -0
- 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.d.ts +0 -1
- package/dist/core/shared/text-normalization.js +4 -4
- 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.js +8 -3
- 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 +4 -0
- package/dist/core/store/item-store.js +133 -39
- 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-validator.d.ts +106 -0
- package/dist/core/store/settings-validator.js +279 -0
- package/dist/core/store/settings-validator.js.map +1 -0
- package/dist/core/store/settings.js +32 -331
- 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 +34 -6
- 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.js +182 -22
- package/dist/mcp/server.js.map +1 -1
- package/dist/sdk/cli-contracts/commander-mutation-options.js +10 -3
- package/dist/sdk/cli-contracts/commander-mutation-options.js.map +1 -1
- package/dist/sdk/cli-contracts/commander-types.js +4 -1
- package/dist/sdk/cli-contracts/commander-types.js.map +1 -1
- package/dist/sdk/cli-contracts.d.ts +13 -2
- package/dist/sdk/cli-contracts.js +410 -26
- package/dist/sdk/cli-contracts.js.map +1 -1
- package/dist/sdk/index.js +4 -1
- package/dist/sdk/index.js.map +1 -1
- package/dist/sdk/runtime.d.ts +25 -1
- package/dist/sdk/runtime.js +48 -2
- package/dist/sdk/runtime.js.map +1 -1
- package/dist/types/index.js +4 -1
- package/dist/types/index.js.map +1 -1
- package/dist/types.d.ts +92 -2
- package/dist/types.js +42 -1
- package/dist/types.js.map +1 -1
- package/docs/AGENT_GUIDE.md +23 -7
- package/docs/ARCHITECTURE.md +1 -1
- package/docs/CLAUDE_CODE_PLUGIN.md +10 -10
- package/docs/CODEX_PLUGIN.md +2 -2
- package/docs/COMMANDS.md +117 -12
- package/docs/CONFIGURATION.md +5 -2
- package/docs/EXTENSIONS.md +158 -814
- package/docs/QUICKSTART.md +11 -5
- package/docs/README.md +7 -6
- package/docs/RELEASING.md +13 -9
- package/docs/SDK.md +11 -2
- package/docs/TESTING.md +2 -2
- package/marketplace.json +3 -3
- package/package.json +15 -12
- package/packages/pm-beads/package.json +1 -1
- package/packages/pm-calendar/README.md +4 -2
- package/packages/pm-calendar/extensions/calendar/index.js +22 -3
- package/packages/pm-calendar/extensions/calendar/index.ts +22 -3
- package/packages/pm-calendar/extensions/calendar/runtime.js +26 -7
- package/packages/pm-calendar/extensions/calendar/runtime.ts +26 -7
- package/packages/pm-calendar/package.json +1 -1
- package/packages/pm-governance-audit/package.json +1 -1
- package/packages/pm-guide-shell/extensions/guide-shell/index.js +1 -1
- package/packages/pm-guide-shell/extensions/guide-shell/index.ts +1 -1
- package/packages/pm-guide-shell/package.json +1 -1
- package/packages/pm-linked-test-adapters/package.json +1 -1
- package/packages/pm-search-advanced/README.md +8 -0
- package/packages/pm-search-advanced/extensions/search-advanced/index.js +74 -0
- package/packages/pm-search-advanced/extensions/search-advanced/index.ts +75 -1
- package/packages/pm-search-advanced/extensions/search-advanced/runtime.js +67 -9
- package/packages/pm-search-advanced/extensions/search-advanced/runtime.ts +67 -9
- package/packages/pm-search-advanced/package.json +1 -1
- package/packages/pm-templates/README.md +1 -1
- package/packages/pm-templates/extensions/templates/runtime.js +11 -202
- package/packages/pm-templates/extensions/templates/runtime.ts +38 -230
- package/packages/pm-templates/package.json +1 -1
- package/packages/pm-todos/package.json +1 -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}/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-codex/skills/pm-native/SKILL.md +81 -0
- package/scripts/finalize-build.mjs +28 -0
- package/scripts/prepare-build-cache.mjs +37 -0
- package/dist/core/output/command-aware.d.ts +0 -1
- package/dist/core/output/command-aware.js +0 -394
- package/dist/core/output/command-aware.js.map +0 -1
- 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}/scripts/pm-mcp-server.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}/scripts/pm-mcp-server.mjs +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
|
@@ -0,0 +1,336 @@
|
|
|
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]="5a5676f5-f102-5fdd-9b33-04645e8971c2")}catch(e){}}();
|
|
3
|
+
import fs from "node:fs/promises";
|
|
4
|
+
import path from "node:path";
|
|
5
|
+
import readline from "node:readline/promises";
|
|
6
|
+
import { stdin as input, stdout as output } from "node:process";
|
|
7
|
+
import { runActiveOnWriteHooks } from "../../core/extensions/index.js";
|
|
8
|
+
import { pathExists } from "../../core/fs/fs-utils.js";
|
|
9
|
+
export const INIT_AGENT_GUIDANCE_MODE_VALUES = ["ask", "add", "skip", "status"];
|
|
10
|
+
const AGENT_GUIDANCE_TARGET_FILENAMES = ["AGENTS.md", "CLAUDE.md"];
|
|
11
|
+
const AGENT_GUIDANCE_REQUIRED_TOKENS = [
|
|
12
|
+
"pm init",
|
|
13
|
+
"pm context",
|
|
14
|
+
"pm search",
|
|
15
|
+
"pm create",
|
|
16
|
+
"pm claim",
|
|
17
|
+
"pm files",
|
|
18
|
+
"pm docs",
|
|
19
|
+
"pm test --run",
|
|
20
|
+
"pm close",
|
|
21
|
+
"pm release",
|
|
22
|
+
"pm_author",
|
|
23
|
+
];
|
|
24
|
+
const AGENT_GUIDANCE_REQUIRED_TOKEN_THRESHOLD = 8;
|
|
25
|
+
const AGENT_GUIDANCE_TEMPLATE_VERSION = 1;
|
|
26
|
+
const AGENT_GUIDANCE_START_MARKER_PREFIX = "<!-- pm-cli:agent-guidance:start:";
|
|
27
|
+
const AGENT_GUIDANCE_START_MARKER = `<!-- pm-cli:agent-guidance:start:v${AGENT_GUIDANCE_TEMPLATE_VERSION} -->`;
|
|
28
|
+
const AGENT_GUIDANCE_END_MARKER = "<!-- pm-cli:agent-guidance:end -->";
|
|
29
|
+
function toPortableRelativePath(projectRoot, targetPath) {
|
|
30
|
+
const relative = path.relative(projectRoot, targetPath);
|
|
31
|
+
if (relative.length === 0) {
|
|
32
|
+
return path.basename(targetPath);
|
|
33
|
+
}
|
|
34
|
+
return relative.split(path.sep).join("/");
|
|
35
|
+
}
|
|
36
|
+
function ensureTrailingNewline(value) {
|
|
37
|
+
return value.endsWith("\n") ? value : `${value}\n`;
|
|
38
|
+
}
|
|
39
|
+
function detectLineEnding(value) {
|
|
40
|
+
return value.includes("\r\n") ? "\r\n" : "\n";
|
|
41
|
+
}
|
|
42
|
+
function findGuidanceBlockRange(content) {
|
|
43
|
+
const startIndex = content.indexOf(AGENT_GUIDANCE_START_MARKER_PREFIX);
|
|
44
|
+
if (startIndex === -1) {
|
|
45
|
+
return null;
|
|
46
|
+
}
|
|
47
|
+
const endMarkerIndex = content.indexOf(AGENT_GUIDANCE_END_MARKER, startIndex);
|
|
48
|
+
if (endMarkerIndex === -1) {
|
|
49
|
+
return null;
|
|
50
|
+
}
|
|
51
|
+
return {
|
|
52
|
+
start_index: startIndex,
|
|
53
|
+
end_index: endMarkerIndex + AGENT_GUIDANCE_END_MARKER.length,
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
function hasGuidanceMarker(content) {
|
|
57
|
+
return findGuidanceBlockRange(content) !== null;
|
|
58
|
+
}
|
|
59
|
+
function buildAgentGuidanceBlock(lineEnding) {
|
|
60
|
+
const lines = [
|
|
61
|
+
AGENT_GUIDANCE_START_MARKER,
|
|
62
|
+
"## pm Workflow (Agent Quickstart)",
|
|
63
|
+
"",
|
|
64
|
+
"- Orient before mutate: `pm context --limit 10`, `pm search \"<keywords>\" --limit 10`, `pm list-open --limit 20`.",
|
|
65
|
+
"- Claim and execute: `pm claim <id>` then `pm update <id> --status in_progress`.",
|
|
66
|
+
"- Link evidence while coding: `pm files <id> --add ...`, `pm docs <id> --add ...`, `pm test <id> --add command=\"node scripts/run-tests.mjs test -- ...\"`.",
|
|
67
|
+
"- Verify and close: `pm test <id> --run --progress`, `pm close <id> \"<evidence>\" --validate-close warn`, `pm release <id>`.",
|
|
68
|
+
"- Set `PM_AUTHOR=<stable-agent-id>` before mutation commands.",
|
|
69
|
+
"",
|
|
70
|
+
AGENT_GUIDANCE_END_MARKER,
|
|
71
|
+
"",
|
|
72
|
+
];
|
|
73
|
+
return lines.join(lineEnding);
|
|
74
|
+
}
|
|
75
|
+
function upsertAgentGuidanceBlock(existingContent) {
|
|
76
|
+
const lineEnding = detectLineEnding(existingContent);
|
|
77
|
+
const nextBlock = buildAgentGuidanceBlock(lineEnding);
|
|
78
|
+
const existingRange = findGuidanceBlockRange(existingContent);
|
|
79
|
+
if (existingRange) {
|
|
80
|
+
const nextContent = ensureTrailingNewline(`${existingContent.slice(0, existingRange.start_index)}${nextBlock}${existingContent.slice(existingRange.end_index)}`);
|
|
81
|
+
return {
|
|
82
|
+
next_content: nextContent,
|
|
83
|
+
changed: nextContent !== existingContent,
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
const separator = existingContent.length === 0 ? "" : existingContent.endsWith("\n") ? "\n" : "\n\n";
|
|
87
|
+
const nextContent = ensureTrailingNewline(`${existingContent}${separator}${nextBlock}`);
|
|
88
|
+
return {
|
|
89
|
+
next_content: nextContent,
|
|
90
|
+
changed: nextContent !== existingContent,
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
function resolveProjectRoot(pmRoot, cwd) {
|
|
94
|
+
const parent = path.dirname(pmRoot);
|
|
95
|
+
if (path.basename(pmRoot) === "pm" && path.basename(parent) === ".agents") {
|
|
96
|
+
return path.dirname(parent);
|
|
97
|
+
}
|
|
98
|
+
return path.resolve(cwd, pmRoot);
|
|
99
|
+
}
|
|
100
|
+
function resolveTargetGuidancePath(scans, projectRoot) {
|
|
101
|
+
const existingAgents = scans.find((entry) => path.basename(entry.file_path) === "AGENTS.md" && entry.exists);
|
|
102
|
+
if (existingAgents) {
|
|
103
|
+
return existingAgents.file_path;
|
|
104
|
+
}
|
|
105
|
+
const existingAny = scans.find((entry) => entry.exists);
|
|
106
|
+
if (existingAny) {
|
|
107
|
+
return existingAny.file_path;
|
|
108
|
+
}
|
|
109
|
+
return path.join(projectRoot, "AGENTS.md");
|
|
110
|
+
}
|
|
111
|
+
function parsePromptChoice(answer, currentDefault) {
|
|
112
|
+
const normalized = answer.trim().toLowerCase();
|
|
113
|
+
if (normalized.length === 0) {
|
|
114
|
+
return currentDefault;
|
|
115
|
+
}
|
|
116
|
+
if (normalized === "y" || normalized === "yes") {
|
|
117
|
+
return true;
|
|
118
|
+
}
|
|
119
|
+
if (normalized === "n" || normalized === "no") {
|
|
120
|
+
return false;
|
|
121
|
+
}
|
|
122
|
+
return currentDefault;
|
|
123
|
+
}
|
|
124
|
+
async function promptForGuidanceWrite(targetRelativePath) {
|
|
125
|
+
const rl = readline.createInterface({ input, output });
|
|
126
|
+
try {
|
|
127
|
+
output.write("\nAgent guidance check\n");
|
|
128
|
+
output.write("No AGENTS.md/CLAUDE.md file currently contains compact pm workflow guidance.\n");
|
|
129
|
+
const answer = await rl.question(`Add a compact pm workflow section to ${targetRelativePath}? [Y/n] `);
|
|
130
|
+
output.write("\n");
|
|
131
|
+
return parsePromptChoice(answer, true);
|
|
132
|
+
}
|
|
133
|
+
finally {
|
|
134
|
+
rl.close();
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
function normalizeAgentGuidanceState(settings) {
|
|
138
|
+
const current = settings.agent_guidance;
|
|
139
|
+
return {
|
|
140
|
+
prompt_completed: current?.prompt_completed === true,
|
|
141
|
+
declined: current?.declined === true,
|
|
142
|
+
declined_at: typeof current?.declined_at === "string" ? current.declined_at : "",
|
|
143
|
+
template_version: typeof current?.template_version === "number" && Number.isInteger(current.template_version) && current.template_version > 0
|
|
144
|
+
? current.template_version
|
|
145
|
+
: AGENT_GUIDANCE_TEMPLATE_VERSION,
|
|
146
|
+
last_checked_files: Array.isArray(current?.last_checked_files)
|
|
147
|
+
? [...new Set(current.last_checked_files.map((value) => value.trim()).filter((value) => value.length > 0))].sort((left, right) => left.localeCompare(right))
|
|
148
|
+
: [],
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
async function scanGuidanceFiles(projectRoot) {
|
|
152
|
+
const scans = [];
|
|
153
|
+
for (const filename of AGENT_GUIDANCE_TARGET_FILENAMES) {
|
|
154
|
+
const filePath = path.join(projectRoot, filename);
|
|
155
|
+
const exists = await pathExists(filePath);
|
|
156
|
+
if (!exists) {
|
|
157
|
+
scans.push({
|
|
158
|
+
file_path: filePath,
|
|
159
|
+
exists,
|
|
160
|
+
has_guidance: false,
|
|
161
|
+
has_marker: false,
|
|
162
|
+
});
|
|
163
|
+
continue;
|
|
164
|
+
}
|
|
165
|
+
const content = await fs.readFile(filePath, "utf8");
|
|
166
|
+
const contentLower = content.toLowerCase();
|
|
167
|
+
const tokenHits = AGENT_GUIDANCE_REQUIRED_TOKENS.filter((token) => contentLower.includes(token));
|
|
168
|
+
const hasMarker = hasGuidanceMarker(content);
|
|
169
|
+
scans.push({
|
|
170
|
+
file_path: filePath,
|
|
171
|
+
exists,
|
|
172
|
+
has_guidance: hasMarker || tokenHits.length >= AGENT_GUIDANCE_REQUIRED_TOKEN_THRESHOLD,
|
|
173
|
+
has_marker: hasMarker,
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
return scans;
|
|
177
|
+
}
|
|
178
|
+
function pushUnique(target, value) {
|
|
179
|
+
if (!target.includes(value)) {
|
|
180
|
+
target.push(value);
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
function applyAgentGuidanceState(settings, currentState) {
|
|
184
|
+
const existing = normalizeAgentGuidanceState(settings);
|
|
185
|
+
const changed = JSON.stringify(existing) !== JSON.stringify(currentState);
|
|
186
|
+
if (changed) {
|
|
187
|
+
settings.agent_guidance = currentState;
|
|
188
|
+
}
|
|
189
|
+
return { changed, state: currentState };
|
|
190
|
+
}
|
|
191
|
+
async function writeGuidanceFile(filePath) {
|
|
192
|
+
const exists = await pathExists(filePath);
|
|
193
|
+
const currentContent = exists ? await fs.readFile(filePath, "utf8") : "";
|
|
194
|
+
const nextContent = upsertAgentGuidanceBlock(currentContent);
|
|
195
|
+
if (!nextContent.changed) {
|
|
196
|
+
return { changed: false, warnings: [] };
|
|
197
|
+
}
|
|
198
|
+
await fs.writeFile(filePath, nextContent.next_content, "utf8");
|
|
199
|
+
return {
|
|
200
|
+
changed: true,
|
|
201
|
+
warnings: await runActiveOnWriteHooks({
|
|
202
|
+
path: filePath,
|
|
203
|
+
scope: "project",
|
|
204
|
+
op: "init:agent_guidance_file",
|
|
205
|
+
}),
|
|
206
|
+
};
|
|
207
|
+
}
|
|
208
|
+
export async function runInitAgentGuidance(options) {
|
|
209
|
+
const warnings = [];
|
|
210
|
+
const nextSteps = [];
|
|
211
|
+
const projectRoot = resolveProjectRoot(options.pm_root, options.cwd);
|
|
212
|
+
let scans = await scanGuidanceFiles(projectRoot);
|
|
213
|
+
const targetPath = resolveTargetGuidancePath(scans, projectRoot);
|
|
214
|
+
const targetRelativePath = toPortableRelativePath(projectRoot, targetPath);
|
|
215
|
+
const addLaterHint = "Add workflow guidance later: pm init --agent-guidance add";
|
|
216
|
+
let prompted = false;
|
|
217
|
+
let applied = false;
|
|
218
|
+
let skipped = false;
|
|
219
|
+
let state = normalizeAgentGuidanceState(options.settings);
|
|
220
|
+
const checkedFiles = scans.map((entry) => toPortableRelativePath(projectRoot, entry.file_path));
|
|
221
|
+
const presentBefore = scans.some((entry) => entry.has_guidance);
|
|
222
|
+
const markState = (partial) => {
|
|
223
|
+
state = {
|
|
224
|
+
...state,
|
|
225
|
+
...partial,
|
|
226
|
+
template_version: AGENT_GUIDANCE_TEMPLATE_VERSION,
|
|
227
|
+
last_checked_files: checkedFiles,
|
|
228
|
+
};
|
|
229
|
+
};
|
|
230
|
+
if (options.mode === "status") {
|
|
231
|
+
if (!presentBefore) {
|
|
232
|
+
warnings.push("agent_guidance:missing");
|
|
233
|
+
pushUnique(nextSteps, addLaterHint);
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
else if (options.mode === "skip") {
|
|
237
|
+
skipped = true;
|
|
238
|
+
markState({
|
|
239
|
+
prompt_completed: true,
|
|
240
|
+
declined: true,
|
|
241
|
+
declined_at: state.declined_at.length > 0 ? state.declined_at : new Date().toISOString(),
|
|
242
|
+
});
|
|
243
|
+
warnings.push("agent_guidance:explicit_skip");
|
|
244
|
+
pushUnique(nextSteps, addLaterHint);
|
|
245
|
+
}
|
|
246
|
+
else if (options.mode === "add") {
|
|
247
|
+
if (!presentBefore) {
|
|
248
|
+
const writeResult = await writeGuidanceFile(targetPath);
|
|
249
|
+
warnings.push(...writeResult.warnings);
|
|
250
|
+
if (writeResult.changed) {
|
|
251
|
+
applied = true;
|
|
252
|
+
warnings.push(`agent_guidance:added:${targetRelativePath}`);
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
markState({
|
|
256
|
+
prompt_completed: true,
|
|
257
|
+
declined: false,
|
|
258
|
+
declined_at: "",
|
|
259
|
+
});
|
|
260
|
+
}
|
|
261
|
+
else if (presentBefore) {
|
|
262
|
+
if (state.declined) {
|
|
263
|
+
markState({
|
|
264
|
+
prompt_completed: true,
|
|
265
|
+
declined: false,
|
|
266
|
+
declined_at: "",
|
|
267
|
+
});
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
else if (state.prompt_completed && state.declined) {
|
|
271
|
+
skipped = true;
|
|
272
|
+
warnings.push("agent_guidance:skipped_declined");
|
|
273
|
+
pushUnique(nextSteps, addLaterHint);
|
|
274
|
+
}
|
|
275
|
+
else if (options.interactive) {
|
|
276
|
+
prompted = true;
|
|
277
|
+
const approved = await promptForGuidanceWrite(targetRelativePath);
|
|
278
|
+
if (approved) {
|
|
279
|
+
const writeResult = await writeGuidanceFile(targetPath);
|
|
280
|
+
warnings.push(...writeResult.warnings);
|
|
281
|
+
if (writeResult.changed) {
|
|
282
|
+
applied = true;
|
|
283
|
+
warnings.push(`agent_guidance:added:${targetRelativePath}`);
|
|
284
|
+
}
|
|
285
|
+
markState({
|
|
286
|
+
prompt_completed: true,
|
|
287
|
+
declined: false,
|
|
288
|
+
declined_at: "",
|
|
289
|
+
});
|
|
290
|
+
}
|
|
291
|
+
else {
|
|
292
|
+
skipped = true;
|
|
293
|
+
markState({
|
|
294
|
+
prompt_completed: true,
|
|
295
|
+
declined: true,
|
|
296
|
+
declined_at: new Date().toISOString(),
|
|
297
|
+
});
|
|
298
|
+
warnings.push("agent_guidance:declined");
|
|
299
|
+
pushUnique(nextSteps, addLaterHint);
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
else {
|
|
303
|
+
warnings.push("agent_guidance:missing_non_interactive");
|
|
304
|
+
pushUnique(nextSteps, addLaterHint);
|
|
305
|
+
}
|
|
306
|
+
const stateUpdate = applyAgentGuidanceState(options.settings, state);
|
|
307
|
+
if (applied) {
|
|
308
|
+
scans = await scanGuidanceFiles(projectRoot);
|
|
309
|
+
}
|
|
310
|
+
const summary = {
|
|
311
|
+
mode: options.mode,
|
|
312
|
+
present: scans.some((entry) => entry.has_guidance),
|
|
313
|
+
prompted,
|
|
314
|
+
applied,
|
|
315
|
+
skipped,
|
|
316
|
+
declined: state.declined,
|
|
317
|
+
prompt_completed: state.prompt_completed,
|
|
318
|
+
template_version: state.template_version,
|
|
319
|
+
target_file: targetRelativePath,
|
|
320
|
+
checked_files: scans.map((entry) => toPortableRelativePath(projectRoot, entry.file_path)),
|
|
321
|
+
files_with_guidance: scans
|
|
322
|
+
.filter((entry) => entry.has_guidance)
|
|
323
|
+
.map((entry) => toPortableRelativePath(projectRoot, entry.file_path)),
|
|
324
|
+
missing_files: scans
|
|
325
|
+
.filter((entry) => !entry.exists)
|
|
326
|
+
.map((entry) => toPortableRelativePath(projectRoot, entry.file_path)),
|
|
327
|
+
};
|
|
328
|
+
return {
|
|
329
|
+
summary,
|
|
330
|
+
warnings,
|
|
331
|
+
next_steps: nextSteps,
|
|
332
|
+
settings_changed: stateUpdate.changed,
|
|
333
|
+
};
|
|
334
|
+
}
|
|
335
|
+
//# sourceMappingURL=init-agent-guidance.js.map
|
|
336
|
+
//# debugId=5a5676f5-f102-5fdd-9b33-04645e8971c2
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init-agent-guidance.js","sources":["cli/commands/init-agent-guidance.ts"],"sourceRoot":"/","sourcesContent":["import fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport readline from \"node:readline/promises\";\nimport { stdin as input, stdout as output } from \"node:process\";\nimport { runActiveOnWriteHooks } from \"../../core/extensions/index.js\";\nimport { pathExists } from \"../../core/fs/fs-utils.js\";\nimport type { PmSettings } from \"../../types/index.js\";\n\nexport type InitAgentGuidanceMode = \"ask\" | \"add\" | \"skip\" | \"status\";\n\nexport const INIT_AGENT_GUIDANCE_MODE_VALUES: InitAgentGuidanceMode[] = [\"ask\", \"add\", \"skip\", \"status\"];\n\nconst AGENT_GUIDANCE_TARGET_FILENAMES = [\"AGENTS.md\", \"CLAUDE.md\"] as const;\nconst AGENT_GUIDANCE_REQUIRED_TOKENS = [\n \"pm init\",\n \"pm context\",\n \"pm search\",\n \"pm create\",\n \"pm claim\",\n \"pm files\",\n \"pm docs\",\n \"pm test --run\",\n \"pm close\",\n \"pm release\",\n \"pm_author\",\n] as const;\nconst AGENT_GUIDANCE_REQUIRED_TOKEN_THRESHOLD = 8;\nconst AGENT_GUIDANCE_TEMPLATE_VERSION = 1;\nconst AGENT_GUIDANCE_START_MARKER_PREFIX = \"<!-- pm-cli:agent-guidance:start:\";\nconst AGENT_GUIDANCE_START_MARKER = `<!-- pm-cli:agent-guidance:start:v${AGENT_GUIDANCE_TEMPLATE_VERSION} -->`;\nconst AGENT_GUIDANCE_END_MARKER = \"<!-- pm-cli:agent-guidance:end -->\";\n\ninterface AgentGuidanceFileScan {\n file_path: string;\n exists: boolean;\n has_guidance: boolean;\n has_marker: boolean;\n}\n\ninterface AgentGuidanceBlockRange {\n start_index: number;\n end_index: number;\n}\n\nexport interface InitAgentGuidanceSummary {\n mode: InitAgentGuidanceMode;\n present: boolean;\n prompted: boolean;\n applied: boolean;\n skipped: boolean;\n declined: boolean;\n prompt_completed: boolean;\n template_version: number;\n target_file: string;\n checked_files: string[];\n files_with_guidance: string[];\n missing_files: string[];\n}\n\nexport interface RunInitAgentGuidanceOptions {\n pm_root: string;\n cwd: string;\n mode: InitAgentGuidanceMode;\n interactive: boolean;\n settings: PmSettings;\n}\n\nexport interface RunInitAgentGuidanceResult {\n summary: InitAgentGuidanceSummary;\n warnings: string[];\n next_steps: string[];\n settings_changed: boolean;\n}\n\nfunction toPortableRelativePath(projectRoot: string, targetPath: string): string {\n const relative = path.relative(projectRoot, targetPath);\n if (relative.length === 0) {\n return path.basename(targetPath);\n }\n return relative.split(path.sep).join(\"/\");\n}\n\nfunction ensureTrailingNewline(value: string): string {\n return value.endsWith(\"\\n\") ? value : `${value}\\n`;\n}\n\nfunction detectLineEnding(value: string): \"\\n\" | \"\\r\\n\" {\n return value.includes(\"\\r\\n\") ? \"\\r\\n\" : \"\\n\";\n}\n\nfunction findGuidanceBlockRange(content: string): AgentGuidanceBlockRange | null {\n const startIndex = content.indexOf(AGENT_GUIDANCE_START_MARKER_PREFIX);\n if (startIndex === -1) {\n return null;\n }\n const endMarkerIndex = content.indexOf(AGENT_GUIDANCE_END_MARKER, startIndex);\n if (endMarkerIndex === -1) {\n return null;\n }\n return {\n start_index: startIndex,\n end_index: endMarkerIndex + AGENT_GUIDANCE_END_MARKER.length,\n };\n}\n\nfunction hasGuidanceMarker(content: string): boolean {\n return findGuidanceBlockRange(content) !== null;\n}\n\nfunction buildAgentGuidanceBlock(lineEnding: \"\\n\" | \"\\r\\n\"): string {\n const lines = [\n AGENT_GUIDANCE_START_MARKER,\n \"## pm Workflow (Agent Quickstart)\",\n \"\",\n \"- Orient before mutate: `pm context --limit 10`, `pm search \\\"<keywords>\\\" --limit 10`, `pm list-open --limit 20`.\",\n \"- Claim and execute: `pm claim <id>` then `pm update <id> --status in_progress`.\",\n \"- Link evidence while coding: `pm files <id> --add ...`, `pm docs <id> --add ...`, `pm test <id> --add command=\\\"node scripts/run-tests.mjs test -- ...\\\"`.\",\n \"- Verify and close: `pm test <id> --run --progress`, `pm close <id> \\\"<evidence>\\\" --validate-close warn`, `pm release <id>`.\",\n \"- Set `PM_AUTHOR=<stable-agent-id>` before mutation commands.\",\n \"\",\n AGENT_GUIDANCE_END_MARKER,\n \"\",\n ];\n return lines.join(lineEnding);\n}\n\nfunction upsertAgentGuidanceBlock(existingContent: string): { next_content: string; changed: boolean } {\n const lineEnding = detectLineEnding(existingContent);\n const nextBlock = buildAgentGuidanceBlock(lineEnding);\n const existingRange = findGuidanceBlockRange(existingContent);\n if (existingRange) {\n const nextContent = ensureTrailingNewline(\n `${existingContent.slice(0, existingRange.start_index)}${nextBlock}${existingContent.slice(existingRange.end_index)}`,\n );\n return {\n next_content: nextContent,\n changed: nextContent !== existingContent,\n };\n }\n const separator = existingContent.length === 0 ? \"\" : existingContent.endsWith(\"\\n\") ? \"\\n\" : \"\\n\\n\";\n const nextContent = ensureTrailingNewline(`${existingContent}${separator}${nextBlock}`);\n return {\n next_content: nextContent,\n changed: nextContent !== existingContent,\n };\n}\n\nfunction resolveProjectRoot(pmRoot: string, cwd: string): string {\n const parent = path.dirname(pmRoot);\n if (path.basename(pmRoot) === \"pm\" && path.basename(parent) === \".agents\") {\n return path.dirname(parent);\n }\n return path.resolve(cwd, pmRoot);\n}\n\nfunction resolveTargetGuidancePath(scans: AgentGuidanceFileScan[], projectRoot: string): string {\n const existingAgents = scans.find((entry) => path.basename(entry.file_path) === \"AGENTS.md\" && entry.exists);\n if (existingAgents) {\n return existingAgents.file_path;\n }\n const existingAny = scans.find((entry) => entry.exists);\n if (existingAny) {\n return existingAny.file_path;\n }\n return path.join(projectRoot, \"AGENTS.md\");\n}\n\nfunction parsePromptChoice(answer: string, currentDefault: boolean): boolean {\n const normalized = answer.trim().toLowerCase();\n if (normalized.length === 0) {\n return currentDefault;\n }\n if (normalized === \"y\" || normalized === \"yes\") {\n return true;\n }\n if (normalized === \"n\" || normalized === \"no\") {\n return false;\n }\n return currentDefault;\n}\n\nasync function promptForGuidanceWrite(targetRelativePath: string): Promise<boolean> {\n const rl = readline.createInterface({ input, output });\n try {\n output.write(\"\\nAgent guidance check\\n\");\n output.write(\"No AGENTS.md/CLAUDE.md file currently contains compact pm workflow guidance.\\n\");\n const answer = await rl.question(`Add a compact pm workflow section to ${targetRelativePath}? [Y/n] `);\n output.write(\"\\n\");\n return parsePromptChoice(answer, true);\n } finally {\n rl.close();\n }\n}\n\nfunction normalizeAgentGuidanceState(settings: PmSettings): PmSettings[\"agent_guidance\"] {\n const current = settings.agent_guidance;\n return {\n prompt_completed: current?.prompt_completed === true,\n declined: current?.declined === true,\n declined_at: typeof current?.declined_at === \"string\" ? current.declined_at : \"\",\n template_version:\n typeof current?.template_version === \"number\" && Number.isInteger(current.template_version) && current.template_version > 0\n ? current.template_version\n : AGENT_GUIDANCE_TEMPLATE_VERSION,\n last_checked_files: Array.isArray(current?.last_checked_files)\n ? [...new Set(current.last_checked_files.map((value) => value.trim()).filter((value) => value.length > 0))].sort(\n (left, right) => left.localeCompare(right),\n )\n : [],\n };\n}\n\nasync function scanGuidanceFiles(projectRoot: string): Promise<AgentGuidanceFileScan[]> {\n const scans: AgentGuidanceFileScan[] = [];\n for (const filename of AGENT_GUIDANCE_TARGET_FILENAMES) {\n const filePath = path.join(projectRoot, filename);\n const exists = await pathExists(filePath);\n if (!exists) {\n scans.push({\n file_path: filePath,\n exists,\n has_guidance: false,\n has_marker: false,\n });\n continue;\n }\n const content = await fs.readFile(filePath, \"utf8\");\n const contentLower = content.toLowerCase();\n const tokenHits = AGENT_GUIDANCE_REQUIRED_TOKENS.filter((token) => contentLower.includes(token));\n const hasMarker = hasGuidanceMarker(content);\n scans.push({\n file_path: filePath,\n exists,\n has_guidance: hasMarker || tokenHits.length >= AGENT_GUIDANCE_REQUIRED_TOKEN_THRESHOLD,\n has_marker: hasMarker,\n });\n }\n return scans;\n}\n\nfunction pushUnique(target: string[], value: string): void {\n if (!target.includes(value)) {\n target.push(value);\n }\n}\n\nfunction applyAgentGuidanceState(\n settings: PmSettings,\n currentState: PmSettings[\"agent_guidance\"],\n): { changed: boolean; state: PmSettings[\"agent_guidance\"] } {\n const existing = normalizeAgentGuidanceState(settings);\n const changed = JSON.stringify(existing) !== JSON.stringify(currentState);\n if (changed) {\n settings.agent_guidance = currentState;\n }\n return { changed, state: currentState };\n}\n\nasync function writeGuidanceFile(filePath: string): Promise<{ changed: boolean; warnings: string[] }> {\n const exists = await pathExists(filePath);\n const currentContent = exists ? await fs.readFile(filePath, \"utf8\") : \"\";\n const nextContent = upsertAgentGuidanceBlock(currentContent);\n if (!nextContent.changed) {\n return { changed: false, warnings: [] };\n }\n await fs.writeFile(filePath, nextContent.next_content, \"utf8\");\n return {\n changed: true,\n warnings: await runActiveOnWriteHooks({\n path: filePath,\n scope: \"project\",\n op: \"init:agent_guidance_file\",\n }),\n };\n}\n\nexport async function runInitAgentGuidance(options: RunInitAgentGuidanceOptions): Promise<RunInitAgentGuidanceResult> {\n const warnings: string[] = [];\n const nextSteps: string[] = [];\n const projectRoot = resolveProjectRoot(options.pm_root, options.cwd);\n let scans = await scanGuidanceFiles(projectRoot);\n const targetPath = resolveTargetGuidancePath(scans, projectRoot);\n const targetRelativePath = toPortableRelativePath(projectRoot, targetPath);\n const addLaterHint = \"Add workflow guidance later: pm init --agent-guidance add\";\n let prompted = false;\n let applied = false;\n let skipped = false;\n let state = normalizeAgentGuidanceState(options.settings);\n const checkedFiles = scans.map((entry) => toPortableRelativePath(projectRoot, entry.file_path));\n const presentBefore = scans.some((entry) => entry.has_guidance);\n\n const markState = (partial: Partial<PmSettings[\"agent_guidance\"]>): void => {\n state = {\n ...state,\n ...partial,\n template_version: AGENT_GUIDANCE_TEMPLATE_VERSION,\n last_checked_files: checkedFiles,\n };\n };\n\n if (options.mode === \"status\") {\n if (!presentBefore) {\n warnings.push(\"agent_guidance:missing\");\n pushUnique(nextSteps, addLaterHint);\n }\n } else if (options.mode === \"skip\") {\n skipped = true;\n markState({\n prompt_completed: true,\n declined: true,\n declined_at: state.declined_at.length > 0 ? state.declined_at : new Date().toISOString(),\n });\n warnings.push(\"agent_guidance:explicit_skip\");\n pushUnique(nextSteps, addLaterHint);\n } else if (options.mode === \"add\") {\n if (!presentBefore) {\n const writeResult = await writeGuidanceFile(targetPath);\n warnings.push(...writeResult.warnings);\n if (writeResult.changed) {\n applied = true;\n warnings.push(`agent_guidance:added:${targetRelativePath}`);\n }\n }\n markState({\n prompt_completed: true,\n declined: false,\n declined_at: \"\",\n });\n } else if (presentBefore) {\n if (state.declined) {\n markState({\n prompt_completed: true,\n declined: false,\n declined_at: \"\",\n });\n }\n } else if (state.prompt_completed && state.declined) {\n skipped = true;\n warnings.push(\"agent_guidance:skipped_declined\");\n pushUnique(nextSteps, addLaterHint);\n } else if (options.interactive) {\n prompted = true;\n const approved = await promptForGuidanceWrite(targetRelativePath);\n if (approved) {\n const writeResult = await writeGuidanceFile(targetPath);\n warnings.push(...writeResult.warnings);\n if (writeResult.changed) {\n applied = true;\n warnings.push(`agent_guidance:added:${targetRelativePath}`);\n }\n markState({\n prompt_completed: true,\n declined: false,\n declined_at: \"\",\n });\n } else {\n skipped = true;\n markState({\n prompt_completed: true,\n declined: true,\n declined_at: new Date().toISOString(),\n });\n warnings.push(\"agent_guidance:declined\");\n pushUnique(nextSteps, addLaterHint);\n }\n } else {\n warnings.push(\"agent_guidance:missing_non_interactive\");\n pushUnique(nextSteps, addLaterHint);\n }\n\n const stateUpdate = applyAgentGuidanceState(options.settings, state);\n if (applied) {\n scans = await scanGuidanceFiles(projectRoot);\n }\n\n const summary: InitAgentGuidanceSummary = {\n mode: options.mode,\n present: scans.some((entry) => entry.has_guidance),\n prompted,\n applied,\n skipped,\n declined: state.declined,\n prompt_completed: state.prompt_completed,\n template_version: state.template_version,\n target_file: targetRelativePath,\n checked_files: scans.map((entry) => toPortableRelativePath(projectRoot, entry.file_path)),\n files_with_guidance: scans\n .filter((entry) => entry.has_guidance)\n .map((entry) => toPortableRelativePath(projectRoot, entry.file_path)),\n missing_files: scans\n .filter((entry) => !entry.exists)\n .map((entry) => toPortableRelativePath(projectRoot, entry.file_path)),\n };\n\n return {\n summary,\n warnings,\n next_steps: nextSteps,\n settings_changed: stateUpdate.changed,\n };\n}\n"],"names":[],"mappings":"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","debugId":"5a5676f5-f102-5fdd-9b33-04645e8971c2"}
|
|
@@ -1,5 +1,14 @@
|
|
|
1
1
|
import type { GlobalOptions } from "../../core/shared/command-types.js";
|
|
2
2
|
import type { GovernancePreset, PmSettings } from "../../types/index.js";
|
|
3
|
+
import { type InitAgentGuidanceSummary } from "./init-agent-guidance.js";
|
|
4
|
+
export interface InitInstalledPackagesSummary {
|
|
5
|
+
installed_all: boolean;
|
|
6
|
+
installed_count: number;
|
|
7
|
+
packages: Array<{
|
|
8
|
+
alias: string;
|
|
9
|
+
ok: boolean;
|
|
10
|
+
}>;
|
|
11
|
+
}
|
|
3
12
|
export interface InitResult {
|
|
4
13
|
ok: boolean;
|
|
5
14
|
path: string;
|
|
@@ -8,10 +17,43 @@ export interface InitResult {
|
|
|
8
17
|
warnings: string[];
|
|
9
18
|
governance_preset: GovernancePreset;
|
|
10
19
|
wizard_used: boolean;
|
|
20
|
+
installed_packages?: InitInstalledPackagesSummary;
|
|
21
|
+
next_steps: string[];
|
|
22
|
+
agent_guidance: InitAgentGuidanceSummary;
|
|
11
23
|
}
|
|
12
24
|
export interface InitCommandOptions {
|
|
13
25
|
preset?: string;
|
|
14
26
|
defaults?: boolean;
|
|
15
27
|
author?: string;
|
|
28
|
+
withPackages?: boolean;
|
|
29
|
+
agentGuidance?: string;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Concise projection of an InitResult for the default (toon) renderer. It keeps
|
|
33
|
+
* every piece of information that only init can surface — the resolved path, id
|
|
34
|
+
* prefix, governance preset, telemetry capture level, created-directory count,
|
|
35
|
+
* the full warnings list (including `already_exists:` markers), agent-guidance
|
|
36
|
+
* summary, and next steps — but replaces the verbose full settings tree (~190
|
|
37
|
+
* lines) with a compact `settings` summary. Use --verbose for the full tree.
|
|
38
|
+
*/
|
|
39
|
+
export interface InitConciseResult {
|
|
40
|
+
ok: boolean;
|
|
41
|
+
path: string;
|
|
42
|
+
id_prefix: string;
|
|
43
|
+
governance_preset: GovernancePreset;
|
|
44
|
+
telemetry: {
|
|
45
|
+
enabled: boolean;
|
|
46
|
+
capture_level: string;
|
|
47
|
+
};
|
|
48
|
+
output_format: string;
|
|
49
|
+
created_dirs_count: number;
|
|
50
|
+
created_dirs: string[];
|
|
51
|
+
warnings: string[];
|
|
52
|
+
wizard_used: boolean;
|
|
53
|
+
installed_packages?: InitInstalledPackagesSummary;
|
|
54
|
+
next_steps: string[];
|
|
55
|
+
agent_guidance: InitAgentGuidanceSummary;
|
|
56
|
+
hint: string;
|
|
16
57
|
}
|
|
58
|
+
export declare function summarizeInitResult(result: InitResult): InitConciseResult;
|
|
17
59
|
export declare function runInit(prefixArg: string | undefined, global: GlobalOptions, options?: InitCommandOptions): Promise<InitResult>;
|
|
@@ -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]="e4370e86-cea8-5bf3-837b-de4b3c51daa1")}catch(e){}}();
|
|
1
3
|
import fs from "node:fs/promises";
|
|
2
4
|
import path from "node:path";
|
|
3
5
|
import readline from "node:readline/promises";
|
|
@@ -11,6 +13,29 @@ import { EXIT_CODE, GOVERNANCE_PRESET_DEFAULTS, PM_REQUIRED_SUBDIRS, SETTINGS_DE
|
|
|
11
13
|
import { PmCliError } from "../../core/shared/errors.js";
|
|
12
14
|
import { resolvePmRoot } from "../../core/store/paths.js";
|
|
13
15
|
import { readSettings, writeSettings } from "../../core/store/settings.js";
|
|
16
|
+
import { runExtension } from "./extension.js";
|
|
17
|
+
import { INIT_AGENT_GUIDANCE_MODE_VALUES, runInitAgentGuidance, } from "./init-agent-guidance.js";
|
|
18
|
+
export function summarizeInitResult(result) {
|
|
19
|
+
return {
|
|
20
|
+
ok: result.ok,
|
|
21
|
+
path: result.path,
|
|
22
|
+
id_prefix: result.settings.id_prefix,
|
|
23
|
+
governance_preset: result.governance_preset,
|
|
24
|
+
telemetry: {
|
|
25
|
+
enabled: result.settings.telemetry.enabled,
|
|
26
|
+
capture_level: result.settings.telemetry.capture_level,
|
|
27
|
+
},
|
|
28
|
+
output_format: result.settings.output.default_format,
|
|
29
|
+
created_dirs_count: result.created_dirs.length,
|
|
30
|
+
created_dirs: result.created_dirs,
|
|
31
|
+
warnings: result.warnings,
|
|
32
|
+
wizard_used: result.wizard_used,
|
|
33
|
+
...(result.installed_packages ? { installed_packages: result.installed_packages } : {}),
|
|
34
|
+
next_steps: result.next_steps,
|
|
35
|
+
agent_guidance: result.agent_guidance,
|
|
36
|
+
hint: "Re-run with --verbose for the full settings tree.",
|
|
37
|
+
};
|
|
38
|
+
}
|
|
14
39
|
function cloneDefaults() {
|
|
15
40
|
return structuredClone(SETTINGS_DEFAULTS);
|
|
16
41
|
}
|
|
@@ -41,6 +66,19 @@ function normalizeOptionalInitAuthor(rawValue) {
|
|
|
41
66
|
}
|
|
42
67
|
return normalized;
|
|
43
68
|
}
|
|
69
|
+
function normalizeInitAgentGuidanceMode(rawValue) {
|
|
70
|
+
if (rawValue === undefined) {
|
|
71
|
+
return "ask";
|
|
72
|
+
}
|
|
73
|
+
const normalized = rawValue.trim().toLowerCase().replaceAll("-", "_");
|
|
74
|
+
if (normalized.length === 0) {
|
|
75
|
+
throw new PmCliError("--agent-guidance must not be empty", EXIT_CODE.USAGE);
|
|
76
|
+
}
|
|
77
|
+
if (normalized === "ask" || normalized === "add" || normalized === "skip" || normalized === "status") {
|
|
78
|
+
return normalized;
|
|
79
|
+
}
|
|
80
|
+
throw new PmCliError(`Invalid --agent-guidance value "${rawValue}". Allowed: ${INIT_AGENT_GUIDANCE_MODE_VALUES.join(", ")}`, EXIT_CODE.USAGE);
|
|
81
|
+
}
|
|
44
82
|
function parseYesNoChoice(answer, currentDefault) {
|
|
45
83
|
const normalized = answer.trim().toLowerCase();
|
|
46
84
|
if (normalized.length === 0) {
|
|
@@ -63,6 +101,19 @@ function applyGovernancePreset(settings, preset) {
|
|
|
63
101
|
settings.validation.parent_reference = knobs.parent_reference;
|
|
64
102
|
settings.validation.metadata_profile = knobs.metadata_profile;
|
|
65
103
|
}
|
|
104
|
+
function summarizeInstalledPackages(result) {
|
|
105
|
+
const details = result.details;
|
|
106
|
+
return {
|
|
107
|
+
installed_all: details.installed_all === true,
|
|
108
|
+
installed_count: typeof details.installed_count === "number" ? details.installed_count : 0,
|
|
109
|
+
packages: Array.isArray(details.packages)
|
|
110
|
+
? details.packages.map((entry) => ({
|
|
111
|
+
alias: typeof entry.alias === "string" ? entry.alias : "",
|
|
112
|
+
ok: entry.ok === true,
|
|
113
|
+
}))
|
|
114
|
+
: [],
|
|
115
|
+
};
|
|
116
|
+
}
|
|
66
117
|
async function runInitWizard(initialPrefix, telemetryDefault) {
|
|
67
118
|
const rl = readline.createInterface({ input, output });
|
|
68
119
|
try {
|
|
@@ -122,6 +173,8 @@ export async function runInit(prefixArg, global, options = {}) {
|
|
|
122
173
|
const presetFromOption = normalizeInitGovernancePreset(options.preset);
|
|
123
174
|
const useDefaults = options.defaults === true;
|
|
124
175
|
const authorFromOption = normalizeOptionalInitAuthor(options.author);
|
|
176
|
+
const installBundledPackages = options.withPackages === true;
|
|
177
|
+
const agentGuidanceMode = normalizeInitAgentGuidanceMode(options.agentGuidance);
|
|
125
178
|
let chosenPreset = presetFromOption;
|
|
126
179
|
let chosenTelemetryEnabled;
|
|
127
180
|
let settings;
|
|
@@ -169,6 +222,17 @@ export async function runInit(prefixArg, global, options = {}) {
|
|
|
169
222
|
}
|
|
170
223
|
await writeSettings(pmRoot, settings);
|
|
171
224
|
}
|
|
225
|
+
const agentGuidanceResult = await runInitAgentGuidance({
|
|
226
|
+
pm_root: pmRoot,
|
|
227
|
+
cwd,
|
|
228
|
+
mode: agentGuidanceMode,
|
|
229
|
+
interactive: process.stdin.isTTY === true && process.stdout.isTTY === true,
|
|
230
|
+
settings,
|
|
231
|
+
});
|
|
232
|
+
warnings.push(...agentGuidanceResult.warnings);
|
|
233
|
+
if (agentGuidanceResult.settings_changed) {
|
|
234
|
+
await writeSettings(pmRoot, settings);
|
|
235
|
+
}
|
|
172
236
|
const runtimeSchemaScaffold = await ensureRuntimeSchemaFileScaffold(pmRoot, settings.schema);
|
|
173
237
|
for (const createdPath of runtimeSchemaScaffold.created_paths) {
|
|
174
238
|
createdDirs.push(createdPath);
|
|
@@ -198,6 +262,33 @@ export async function runInit(prefixArg, global, options = {}) {
|
|
|
198
262
|
op: "init:ensure_dir",
|
|
199
263
|
})));
|
|
200
264
|
}
|
|
265
|
+
let installedPackages;
|
|
266
|
+
if (installBundledPackages) {
|
|
267
|
+
const packageInstallResult = await runExtension("all", { install: true, project: true }, global);
|
|
268
|
+
warnings.push(...packageInstallResult.warnings);
|
|
269
|
+
installedPackages = summarizeInstalledPackages(packageInstallResult);
|
|
270
|
+
if (!installedPackages.installed_all || installedPackages.packages.some((entry) => !entry.ok)) {
|
|
271
|
+
throw new PmCliError("pm init --with-packages did not install all bundled packages successfully.", EXIT_CODE.GENERIC_FAILURE);
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
const nextSteps = [
|
|
275
|
+
'Create your first item: pm create --type Task --title "<title>"',
|
|
276
|
+
'List active items: pm list',
|
|
277
|
+
'Get agent-friendly project context: pm context',
|
|
278
|
+
];
|
|
279
|
+
if (!installBundledPackages) {
|
|
280
|
+
nextSteps.push("Add optional packages for richer workflows: pm install calendar --project, pm install templates --project, pm install guide-shell --project");
|
|
281
|
+
nextSteps.push("Or install everything bundled: pm init --with-packages (idempotent on re-run)");
|
|
282
|
+
}
|
|
283
|
+
else {
|
|
284
|
+
nextSteps.push("Explore newly-available commands: pm cal, pm templates, pm guide");
|
|
285
|
+
}
|
|
286
|
+
nextSteps.push("Set PM_AUTHOR=<your-agent-id> so mutations attribute to the right caller.");
|
|
287
|
+
for (const guidanceNextStep of agentGuidanceResult.next_steps) {
|
|
288
|
+
if (!nextSteps.includes(guidanceNextStep)) {
|
|
289
|
+
nextSteps.push(guidanceNextStep);
|
|
290
|
+
}
|
|
291
|
+
}
|
|
201
292
|
return {
|
|
202
293
|
ok: true,
|
|
203
294
|
path: pmRoot,
|
|
@@ -206,6 +297,10 @@ export async function runInit(prefixArg, global, options = {}) {
|
|
|
206
297
|
warnings,
|
|
207
298
|
governance_preset: settings.governance.preset,
|
|
208
299
|
wizard_used: wizardUsed,
|
|
300
|
+
...(installedPackages ? { installed_packages: installedPackages } : {}),
|
|
301
|
+
next_steps: nextSteps,
|
|
302
|
+
agent_guidance: agentGuidanceResult.summary,
|
|
209
303
|
};
|
|
210
304
|
}
|
|
211
|
-
//# sourceMappingURL=init.js.map
|
|
305
|
+
//# sourceMappingURL=init.js.map
|
|
306
|
+
//# debugId=e4370e86-cea8-5bf3-837b-de4b3c51daa1
|