@unbrained/pm-cli 2026.9.7 → 2026.9.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.agents/skills/pm-developer/SKILL.md +12 -4
- package/.agents/skills/pm-developer/references/MULTI_AGENT_MERGE.md +19 -10
- package/.agents/skills/pm-extensions/SKILL.md +6 -0
- package/.agents/skills/pm-sdk/SKILL.md +11 -2
- package/.agents/skills/pm-user/SKILL.md +7 -2
- package/.agents/skills/pm-user/references/ECOSYSTEM_PLANNING.md +95 -0
- package/.claude-plugin/marketplace.json +2 -2
- package/CHANGELOG.md +231 -182
- package/dist/cli/after-command-context-usage.js +1 -48
- package/dist/cli/argv-utils.js +1 -40
- package/dist/cli/bootstrap-args.js +1 -9
- package/dist/cli/bundle-integrity.js +2 -110
- package/dist/cli/commander-usage.js +11 -771
- package/dist/cli/commands/activity.js +1 -9
- package/dist/cli/commands/aggregate.js +1 -5
- package/dist/cli/commands/append.js +1 -5
- package/dist/cli/commands/claim.js +1 -5
- package/dist/cli/commands/close-many.js +1 -5
- package/dist/cli/commands/close.js +1 -9
- package/dist/cli/commands/comments.js +1 -5
- package/dist/cli/commands/config.js +1 -9
- package/dist/cli/commands/context.js +1 -9
- package/dist/cli/commands/contracts.js +1 -5
- package/dist/cli/commands/copy.js +1 -9
- package/dist/cli/commands/create.js +1 -9
- package/dist/cli/commands/delete.js +1 -9
- package/dist/cli/commands/deps.js +1 -9
- package/dist/cli/commands/docs.js +1 -9
- package/dist/cli/commands/duplicates.js +1 -9
- package/dist/cli/commands/eval.js +1 -9
- package/dist/cli/commands/extension/describe.js +1 -5
- package/dist/cli/commands/extension/scaffold.js +1 -5
- package/dist/cli/commands/extension/shared.js +1 -5
- package/dist/cli/commands/extension.js +1 -9
- package/dist/cli/commands/files.js +1 -9
- package/dist/cli/commands/focus.js +1 -9
- package/dist/cli/commands/gc.js +1 -9
- package/dist/cli/commands/get.js +1 -9
- package/dist/cli/commands/graph.js +1 -10
- package/dist/cli/commands/health.js +1 -9
- package/dist/cli/commands/history-compact.js +1 -10
- package/dist/cli/commands/history-redact.js +1 -11
- package/dist/cli/commands/history-repair.js +1 -10
- package/dist/cli/commands/history.js +1 -5
- package/dist/cli/commands/index.js +1 -58
- package/dist/cli/commands/init-agent-guidance.js +1 -9
- package/dist/cli/commands/init.js +1 -9
- package/dist/cli/commands/learnings.js +1 -5
- package/dist/cli/commands/lifecycle-transitions.js +1 -5
- package/dist/cli/commands/list.js +1 -9
- package/dist/cli/commands/merge.js +1 -11
- package/dist/cli/commands/next.js +1 -9
- package/dist/cli/commands/notes.js +1 -5
- package/dist/cli/commands/plan.js +1 -9
- package/dist/cli/commands/profile.js +1 -9
- package/dist/cli/commands/restore.js +1 -9
- package/dist/cli/commands/scheduling-shortcuts.js +1 -9
- package/dist/cli/commands/schema.js +1 -10
- package/dist/cli/commands/search.js +1 -9
- package/dist/cli/commands/stats.js +1 -9
- package/dist/cli/commands/telemetry.js +1 -9
- package/dist/cli/commands/test-all.js +1 -9
- package/dist/cli/commands/test-runs.js +1 -9
- package/dist/cli/commands/test.js +1 -9
- package/dist/cli/commands/update-many.js +1 -5
- package/dist/cli/commands/update.js +1 -9
- package/dist/cli/commands/upgrade.js +1 -5
- package/dist/cli/commands/validate.js +1 -15
- package/dist/cli/context-intent-invocation.js +1 -20
- package/dist/cli/description-stdin.js +1 -17
- package/dist/cli/error-guidance.js +1 -1353
- package/dist/cli/extension-command-help.js +5 -636
- package/dist/cli/extension-command-options.js +1 -427
- package/dist/cli/extension-recovery.js +1 -126
- package/dist/cli/help-content.js +2 -1001
- package/dist/cli/help-json-payload.js +4 -570
- package/dist/cli/main.d.ts +4 -0
- package/dist/cli/main.js +5 -2573
- package/dist/cli/migration-gates.js +1 -289
- package/dist/cli/public.js +1 -20
- package/dist/cli/register-annotations.js +1 -270
- package/dist/cli/register-assurance.js +1 -62
- package/dist/cli/register-files-lookup.js +1 -56
- package/dist/cli/register-history-activity.d.ts +8 -0
- package/dist/cli/register-history-activity.js +2 -0
- package/dist/cli/register-history-author.js +1 -38
- package/dist/cli/register-history-maintenance.d.ts +9 -0
- package/dist/cli/register-history-maintenance.js +2 -0
- package/dist/cli/register-list-query.js +10 -943
- package/dist/cli/register-mutation-options.js +1 -9
- package/dist/cli/register-mutation.d.ts +0 -5
- package/dist/cli/register-mutation.js +19 -1893
- package/dist/cli/register-operations.js +1 -920
- package/dist/cli/register-setup.js +1 -716
- package/dist/cli/register-structured-mutation.js +1 -196
- package/dist/cli/registration-helpers.js +1 -5
- package/dist/cli/runtime-compatibility-boundary.js +4 -42
- package/dist/cli/schema-registration-helpers.js +1 -73
- package/dist/cli/search-refresh.js +1 -13
- package/dist/cli/stats-analytics-json.js +1 -68
- package/dist/cli/telemetry-flush.js +1 -10
- package/dist/cli-bundle/bundle-manifest.json +164 -156
- package/dist/cli-bundle/chunks/{chunk-NPN5I67J.js → chunk-3IPRM75M.js} +3 -3
- package/dist/cli-bundle/chunks/chunk-4VL5P22L.js +2 -0
- package/dist/cli-bundle/chunks/chunk-AAFBV3U3.js +29 -0
- package/dist/cli-bundle/chunks/chunk-D3YVILJJ.js +20 -0
- package/dist/cli-bundle/chunks/{chunk-WYRZZ5ZE.js → chunk-DEZPZOQ7.js} +2 -2
- package/dist/cli-bundle/chunks/chunk-ECBLPN7B.js +3 -0
- package/dist/cli-bundle/chunks/chunk-J6ERHBV2.js +235 -0
- package/dist/cli-bundle/chunks/chunk-JUNJ5EKI.js +2 -0
- package/dist/cli-bundle/chunks/chunk-L5RCDKQ2.js +2 -0
- package/dist/cli-bundle/chunks/chunk-NSAPNEYH.js +2 -0
- package/dist/cli-bundle/chunks/chunk-OHNLSGGV.js +79 -0
- package/dist/cli-bundle/chunks/chunk-WQKMSFBV.js +5 -0
- package/dist/cli-bundle/chunks/{chunk-BAX2BYUW.js → chunk-XZ6T7YPP.js} +256 -150
- package/dist/cli-bundle/chunks/{chunk-JT6XF6GE.js → chunk-Z3XVXUVF.js} +4 -4
- package/dist/cli-bundle/chunks/register-list-query-UIHRCS6D.js +11 -0
- package/dist/cli-bundle/chunks/register-mutation-WHWMGRVX.js +20 -0
- package/dist/cli-bundle/chunks/register-operations-64YZYTC5.js +2 -0
- package/dist/cli-bundle/chunks/register-setup-PERI45EM.js +2 -0
- package/dist/cli-bundle/focused-chunks/chunk-2W4XIYOB.js +2 -0
- package/dist/cli-bundle/focused-chunks/chunk-2WSBXIGF.js +12 -0
- package/dist/cli-bundle/focused-chunks/chunk-5FHTCOHS.js +3 -0
- package/dist/cli-bundle/focused-chunks/chunk-7N6DOREF.js +26 -0
- package/dist/cli-bundle/focused-chunks/{chunk-3BZEOXLT.js → chunk-7PC4R5QB.js} +2 -2
- package/dist/cli-bundle/focused-chunks/chunk-BUCJUZVG.js +6 -0
- package/dist/cli-bundle/focused-chunks/chunk-FE3BABLJ.js +2 -0
- package/dist/cli-bundle/focused-chunks/chunk-IWITF53W.js +2 -0
- package/dist/cli-bundle/focused-chunks/chunk-OQUGRHKV.js +10 -0
- package/dist/cli-bundle/focused-chunks/{chunk-M6PBRFSH.js → chunk-PNKIANFZ.js} +2 -2
- package/dist/cli-bundle/focused-chunks/{chunk-LIJIA4TY.js → chunk-QQQ4SAUO.js} +3 -3
- package/dist/cli-bundle/focused-chunks/chunk-TTYXF5YD.js +177 -0
- package/dist/cli-bundle/focused-chunks/chunk-XNR3DM6J.js +2 -0
- package/dist/cli-bundle/focused-chunks/chunk-XSS3APUF.js +9 -0
- package/dist/cli-bundle/focused-chunks/chunk-YCDQ2N23.js +8 -0
- package/dist/cli-bundle/focused-chunks/chunk-YJUXGS57.js +20 -0
- package/dist/cli-bundle/focused-chunks/chunk-ZTCE4UO6.js +58 -0
- package/dist/cli-bundle/main.js +20 -20
- package/dist/cli-bundle/sdk-authoring.js +1 -1
- package/dist/cli-bundle/sdk-contracts.js +2 -2
- package/dist/cli-bundle/sdk-core.js +37 -37
- package/dist/cli-bundle/sdk-governance.js +1 -1
- package/dist/cli-bundle/sdk-graph.js +1 -1
- package/dist/cli-bundle/sdk-merge.js +42 -42
- package/dist/cli-bundle/sdk-query.js +1 -1
- package/dist/cli-bundle/sdk-runtime.js +1 -1
- package/dist/cli-bundle/sdk-testing.js +1 -1
- package/dist/cli-bundle/sdk.js +11 -11
- package/dist/cli.js +1 -104
- package/dist/core/checkpoint/checkpoint-gc.js +1 -169
- package/dist/core/checkpoint/mutation-checkpoint.js +2 -133
- package/dist/core/config/nested-settings.js +1 -534
- package/dist/core/config/positional-value.js +1 -109
- package/dist/core/diagnostics/remediation.js +1 -506
- package/dist/core/extensions/activation-summary-markdown.js +2 -145
- package/dist/core/extensions/activation-summary.js +1 -92
- package/dist/core/extensions/activation-transaction.js +1 -46
- package/dist/core/extensions/capability-usage.js +1 -173
- package/dist/core/extensions/command-hook-context.js +1 -13
- package/dist/core/extensions/command-metadata-contract.js +1 -22
- package/dist/core/extensions/command-visibility-tier.js +1 -29
- package/dist/core/extensions/contribution-inventory.js +1 -173
- package/dist/core/extensions/exporter-output-contract.js +1 -66
- package/dist/core/extensions/extension-candidate.js +1 -18
- package/dist/core/extensions/extension-capability-aliases.js +1 -158
- package/dist/core/extensions/extension-hook-runtime.js +1 -699
- package/dist/core/extensions/extension-policy.js +1 -599
- package/dist/core/extensions/extension-registries.js +1 -62
- package/dist/core/extensions/extension-runtime-helpers.js +1 -33
- package/dist/core/extensions/extension-types.js +1 -102
- package/dist/core/extensions/flag-definition-validation.js +1 -52
- package/dist/core/extensions/flag-value-types.js +1 -64
- package/dist/core/extensions/index.js +1 -526
- package/dist/core/extensions/item-field-types.js +1 -39
- package/dist/core/extensions/item-fields.js +1 -261
- package/dist/core/extensions/loader.js +1 -2223
- package/dist/core/extensions/manifest-schema.js +1 -69
- package/dist/core/extensions/module-graph-snapshot.js +1 -33
- package/dist/core/extensions/preflight-ownership.js +1 -41
- package/dist/core/extensions/registration-validation.js +1 -82
- package/dist/core/extensions/registration-values.js +1 -209
- package/dist/core/extensions/reserved-host-flags.js +1 -36
- package/dist/core/extensions/runtime-registrations.js +1 -67
- package/dist/core/extensions/service-ownership.js +1 -19
- package/dist/core/extensions/version-compat.js +1 -216
- package/dist/core/fs/fs-utils.js +2 -158
- package/dist/core/fs/host-environment-errors.js +1 -141
- package/dist/core/fs/index.js +1 -9
- package/dist/core/fs/path-utils.js +1 -17
- package/dist/core/governance/content-fields.js +1 -160
- package/dist/core/governance/issue-codes.js +1 -151
- package/dist/core/governance/metadata-coverage.js +1 -358
- package/dist/core/history/drift-cache.js +3 -72
- package/dist/core/history/drift-scan.js +1 -342
- package/dist/core/history/event-classification.js +1 -109
- package/dist/core/history/event-index.js +8 -784
- package/dist/core/history/history-compact-bulk.js +1 -104
- package/dist/core/history/history-diff.js +1 -158
- package/dist/core/history/history-rewrite.d.ts +6 -1
- package/dist/core/history/history-rewrite.js +1 -107
- package/dist/core/history/history-storage-stats.js +1 -102
- package/dist/core/history/history-stream-policy.js +1 -62
- package/dist/core/history/history.js +2 -617
- package/dist/core/history/identity.js +1 -30
- package/dist/core/history/index.js +1 -9
- package/dist/core/history/projection.js +1 -196
- package/dist/core/history/read.d.ts +9 -0
- package/dist/core/history/read.js +1 -57
- package/dist/core/history/replay.js +2 -439
- package/dist/core/history/version-address.js +1 -32
- package/dist/core/history/workspace-history.js +2 -433
- package/dist/core/io/body-file.js +1 -62
- package/dist/core/io/bulk-ids-input.js +1 -112
- package/dist/core/item/actionability.js +1 -327
- package/dist/core/item/dependency-reference.js +1 -20
- package/dist/core/item/id.js +1 -112
- package/dist/core/item/index.js +1 -12
- package/dist/core/item/item-format-version.js +1 -78
- package/dist/core/item/item-format.js +5 -1473
- package/dist/core/item/item-record.js +1 -23
- package/dist/core/item/item-type-definition.js +1 -133
- package/dist/core/item/parent-reference-policy.js +1 -57
- package/dist/core/item/parse.js +2 -603
- package/dist/core/item/plan-lifecycle.js +1 -19
- package/dist/core/item/priority.js +1 -61
- package/dist/core/item/sprint-release-format.js +1 -38
- package/dist/core/item/status-filter.js +1 -115
- package/dist/core/item/status.js +1 -43
- package/dist/core/item/toon-decode.js +1 -29
- package/dist/core/item/type-registry.js +1 -715
- package/dist/core/item/type-synonyms.js +1 -38
- package/dist/core/lock/index.js +1 -9
- package/dist/core/lock/lock-gc.js +1 -240
- package/dist/core/lock/lock.js +3 -590
- package/dist/core/output/mutation-projection.js +1 -217
- package/dist/core/output/output-control.js +1 -25
- package/dist/core/output/output.js +11 -494
- package/dist/core/output/query-summary.js +1 -58
- package/dist/core/output/tabular.js +1 -77
- package/dist/core/packages/manifest.js +1 -244
- package/dist/core/packages/root.js +1 -84
- package/dist/core/policy/workflow-policy-schema.d.ts +312 -0
- package/dist/core/policy/workflow-policy-schema.js +2 -0
- package/dist/core/policy/workflow-policy-store.d.ts +24 -0
- package/dist/core/policy/workflow-policy-store.js +2 -0
- package/dist/core/policy/workflow-policy.d.ts +139 -0
- package/dist/core/policy/workflow-policy.js +2 -0
- package/dist/core/profile/profile-describe.js +1 -83
- package/dist/core/profile/profile-lint.js +1 -415
- package/dist/core/profile/profile-plan.js +0 -0
- package/dist/core/profile/profile-presets.js +1 -370
- package/dist/core/reproducibility/context.js +1 -82
- package/dist/core/schema/fields-file.js +2 -288
- package/dist/core/schema/item-types-file.js +2 -296
- package/dist/core/schema/runtime-field-filters.js +1 -49
- package/dist/core/schema/runtime-field-values.js +1 -313
- package/dist/core/schema/runtime-schema.js +2 -826
- package/dist/core/schema/status-defs-file.js +2 -227
- package/dist/core/schema/status-token.js +1 -31
- package/dist/core/schema/type-inference.js +1 -95
- package/dist/core/schema/type-presets.js +1 -87
- package/dist/core/schema/type-workflows.js +1 -104
- package/dist/core/search/background-refresh.js +2 -286
- package/dist/core/search/bm25.js +1 -146
- package/dist/core/search/cache.js +2 -534
- package/dist/core/search/corpus.js +1 -311
- package/dist/core/search/embedding-batches.js +1 -163
- package/dist/core/search/eval.js +1 -225
- package/dist/core/search/http-client.js +1 -75
- package/dist/core/search/providers.js +1 -242
- package/dist/core/search/relevance.js +1 -244
- package/dist/core/search/semantic-defaults.js +1 -199
- package/dist/core/search/staleness.js +1 -30
- package/dist/core/search/vector-stores.js +2 -664
- package/dist/core/search/vectorization-metadata.js +1 -81
- package/dist/core/sentry/helpers.js +1 -272
- package/dist/core/sentry/instrument.js +1 -387
- package/dist/core/session/session-state.js +1 -260
- package/dist/core/shared/agent-session-context.js +1 -133
- package/dist/core/shared/author.js +1 -1172
- package/dist/core/shared/command-types.js +1 -4
- package/dist/core/shared/conflict-markers.js +1 -31
- package/dist/core/shared/constants.js +1 -405
- package/dist/core/shared/errors.js +1 -20
- package/dist/core/shared/html-entity-decode.js +1 -131
- package/dist/core/shared/index.js +1 -12
- package/dist/core/shared/item-metadata-contract.js +1 -89
- package/dist/core/shared/lazy-module.js +1 -16
- package/dist/core/shared/levenshtein.js +1 -61
- package/dist/core/shared/memo.js +1 -19
- package/dist/core/shared/numeric-parsers.js +1 -20
- package/dist/core/shared/option-alias-visibility.js +1 -67
- package/dist/core/shared/primitives.js +1 -127
- package/dist/core/shared/serial-queue.js +1 -79
- package/dist/core/shared/serialization.js +1 -210
- package/dist/core/shared/split-comma-list.js +1 -30
- package/dist/core/shared/text-normalization.js +1 -38
- package/dist/core/shared/time.js +1 -306
- package/dist/core/store/index.js +1 -12
- package/dist/core/store/item-format-migration.js +1 -125
- package/dist/core/store/item-metadata-cache.js +1 -1116
- package/dist/core/store/item-metadata-query-index.js +9 -394
- package/dist/core/store/item-metadata-read-work.js +1 -43
- package/dist/core/store/item-store.js +1 -693
- package/dist/core/store/paths.d.ts +1 -1
- package/dist/core/store/paths.js +1 -214
- package/dist/core/store/settings-read-cache.js +1 -85
- package/dist/core/store/settings-validator.d.ts +1 -0
- package/dist/core/store/settings-validator.js +1 -421
- package/dist/core/store/settings.js +3 -1309
- package/dist/core/store/tracker-preflight.js +1 -141
- package/dist/core/telemetry/consent.js +5 -108
- package/dist/core/telemetry/observability.js +1 -246
- package/dist/core/telemetry/runtime.js +4 -1988
- package/dist/core/test/background-runs.js +4 -945
- package/dist/core/test/item-test-run-tracking.js +1 -63
- package/dist/core/test/run-selectors.js +1 -120
- package/dist/core/validate/estimate-defaults.js +1 -89
- package/dist/core/validate/fix-planning.js +1 -189
- package/dist/core/validate/linked-artifact-reference.js +1 -36
- package/dist/core/validate/missing-by-type.js +1 -34
- package/dist/core/validate/missing-link-owners.js +1 -95
- package/dist/core/validate/stale-file-classification.js +1 -82
- package/dist/mcp/http-server.js +5 -448
- package/dist/mcp/legacy-adapter.js +1 -77
- package/dist/mcp/runtime-capabilities.js +1 -200
- package/dist/mcp/server.js +4 -1233
- package/dist/mcp/tool-definitions.js +1 -804
- package/dist/sdk/actionability.js +1 -13
- package/dist/sdk/agent/closed-domain-contracts.js +1 -161
- package/dist/sdk/agent/command-recovery.js +1 -59
- package/dist/sdk/agent/command-suggestions.js +1 -66
- package/dist/sdk/agent/create-option-policy.js +1 -31
- package/dist/sdk/agent/identity-config.js +1 -106
- package/dist/sdk/agent/item-addressing.js +1 -207
- package/dist/sdk/agent/refusal-closure-census.js +1 -151
- package/dist/sdk/agent/refusal-closure.js +1 -133
- package/dist/sdk/agent/refusal-corpus-contracts.js +1 -193
- package/dist/sdk/agent/refusal-reachability.js +1 -593
- package/dist/sdk/agent/subcommand-recovery.js +1 -83
- package/dist/sdk/agent/task-transcript-contracts.js +1 -197
- package/dist/sdk/agent/tracker-preflight-contracts.js +1 -126
- package/dist/sdk/agent-capability-contracts.js +1 -428
- package/dist/sdk/agent-session-context.js +1 -9
- package/dist/sdk/annotations.js +1 -448
- package/dist/sdk/author-attribution.js +1 -468
- package/dist/sdk/authoring.js +1 -20
- package/dist/sdk/cli-bootstrap.js +1 -838
- package/dist/sdk/cli-contracts/agent-output-contracts.d.ts +1 -1
- package/dist/sdk/cli-contracts/agent-output-contracts.js +4 -476
- package/dist/sdk/cli-contracts/bootstrap-command-scanner.js +1 -79
- package/dist/sdk/cli-contracts/command-aliases.d.ts +4 -0
- package/dist/sdk/cli-contracts/command-aliases.js +1 -107
- package/dist/sdk/cli-contracts/command-exit-contracts.js +1 -151
- package/dist/sdk/cli-contracts/commander-mutation-options.js +1 -1081
- package/dist/sdk/cli-contracts/commander-types.js +1 -159
- package/dist/sdk/cli-contracts/completeness.js +1 -393
- package/dist/sdk/cli-contracts/enum-contracts.d.ts +1 -1
- package/dist/sdk/cli-contracts/enum-contracts.js +1 -222
- package/dist/sdk/cli-contracts/flag-contracts.js +1 -1947
- package/dist/sdk/cli-contracts/flag-lexicon-contracts.js +1 -347
- package/dist/sdk/cli-contracts/grammar-contracts.js +1 -986
- package/dist/sdk/cli-contracts/registration-helpers.js +7 -990
- package/dist/sdk/cli-contracts/runtime-contracts.d.ts +5 -0
- package/dist/sdk/cli-contracts/runtime-contracts.js +1 -2090
- package/dist/sdk/cli-contracts/schemas/assurance-definition.js +1 -324
- package/dist/sdk/cli-contracts/string-lists.js +1 -16
- package/dist/sdk/cli-contracts/tool-option-contracts.js +1 -461
- package/dist/sdk/cli-contracts/tool-parameter-tables.js +1 -2167
- package/dist/sdk/cli-contracts/tool-schema.d.ts +3 -1
- package/dist/sdk/cli-contracts/tool-schema.js +1 -1664
- package/dist/sdk/cli-contracts/typed-action-inputs.js +1 -4
- package/dist/sdk/cli-contracts.d.ts +1 -1
- package/dist/sdk/cli-contracts.js +1 -17
- package/dist/sdk/cli-program.js +1 -49
- package/dist/sdk/command-line.d.ts +2 -5
- package/dist/sdk/command-line.js +1 -78
- package/dist/sdk/comments.js +1 -133
- package/dist/sdk/compile-cache.js +1 -73
- package/dist/sdk/completion.js +174 -839
- package/dist/sdk/compose.js +1 -1090
- package/dist/sdk/config.js +1 -1204
- package/dist/sdk/context/recency.js +1 -33
- package/dist/sdk/context/semantic-session-attribution.js +1 -82
- package/dist/sdk/context/usage-egress.js +1 -29
- package/dist/sdk/context/usage-ledger.js +3 -185
- package/dist/sdk/context-intent-contracts.js +1 -709
- package/dist/sdk/context-intent-runtime.js +1 -115
- package/dist/sdk/context-packing.js +1 -218
- package/dist/sdk/context-relevance.js +1 -503
- package/dist/sdk/context-signal-store.js +2 -426
- package/dist/sdk/context-usage.js +1 -367
- package/dist/sdk/contracts.js +1 -23
- package/dist/sdk/core-governance.js +1 -14
- package/dist/sdk/core.js +1 -14
- package/dist/sdk/corpus-shape.js +1 -401
- package/dist/sdk/define.js +1 -220
- package/dist/sdk/dependencies.js +1 -718
- package/dist/sdk/dependency-flag-validation.js +1 -156
- package/dist/sdk/dependency-provenance.js +1 -135
- package/dist/sdk/docs.js +1 -14
- package/dist/sdk/duplicates.js +1 -40
- package/dist/sdk/environment/agent-environment.js +1 -466
- package/dist/sdk/environment/host-environment-errors.js +1 -8
- package/dist/sdk/environment/project-runtime-compatibility.js +1 -481
- package/dist/sdk/environment/source-context.js +1 -28
- package/dist/sdk/environment/tracker-preflight.js +1 -9
- package/dist/sdk/error-code-catalog.js +1 -153
- package/dist/sdk/error-runtime.js +1 -58
- package/dist/sdk/errors.js +1 -58
- package/dist/sdk/eval.js +1 -190
- package/dist/sdk/extension/author-manifest.js +1 -92
- package/dist/sdk/extension/bundled-catalog.js +1 -332
- package/dist/sdk/extension/concurrency.js +1 -25
- package/dist/sdk/extension/copy-scope.d.ts +2 -0
- package/dist/sdk/extension/copy-scope.js +2 -0
- package/dist/sdk/extension/custom-field-collisions.js +1 -30
- package/dist/sdk/extension/describe.js +3 -189
- package/dist/sdk/extension/doctor.js +1 -606
- package/dist/sdk/extension/install-plan.d.ts +69 -0
- package/dist/sdk/extension/install-plan.js +2 -0
- package/dist/sdk/extension/install-receipts.d.ts +7 -0
- package/dist/sdk/extension/install-receipts.js +2 -0
- package/dist/sdk/extension/install-runtime.js +3 -313
- package/dist/sdk/extension/install-snapshot.js +1 -66
- package/dist/sdk/extension/install-sources.js +5 -1057
- package/dist/sdk/extension/managed-state.js +2 -252
- package/dist/sdk/extension/migrations.js +2 -174
- package/dist/sdk/extension/output-ownership.js +1 -25
- package/dist/sdk/extension/runtime-summary.js +1 -18
- package/dist/sdk/extension/scaffold.js +4 -2308
- package/dist/sdk/extension/shared.js +1 -147
- package/dist/sdk/extension/source-resolution.js +1 -65
- package/dist/sdk/extension/update-check.js +1 -67
- package/dist/sdk/extension-command-context.js +1 -44
- package/dist/sdk/extension-contracts.js +1 -73
- package/dist/sdk/extension.d.ts +7 -2
- package/dist/sdk/extension.js +1 -2196
- package/dist/sdk/files.js +1 -535
- package/dist/sdk/flag-invocation-contracts.d.ts +0 -5
- package/dist/sdk/flag-invocation-contracts.js +1 -344
- package/dist/sdk/generated/generated-error-code-catalog-part-1.js +1 -2224
- package/dist/sdk/generated/generated-error-code-catalog-part-2.js +1 -2236
- package/dist/sdk/generated-error-code-catalog.js +1 -16
- package/dist/sdk/governance/assurance-action-contracts.js +1 -4
- package/dist/sdk/governance/assurance-action.js +1 -411
- package/dist/sdk/governance/assurance-limits.js +1 -10
- package/dist/sdk/governance/assurance-mutation-error.js +1 -81
- package/dist/sdk/governance/assurance-presets.js +1 -135
- package/dist/sdk/governance/assurance-runtime.js +1 -238
- package/dist/sdk/governance/assurance.js +4 -1182
- package/dist/sdk/governance/boundary-fixtures.js +1 -200
- package/dist/sdk/governance/coverage-assurance.js +1 -60
- package/dist/sdk/governance/defect-recurrence-coverage.js +1 -188
- package/dist/sdk/governance/defect-recurrence-graph.js +1 -120
- package/dist/sdk/governance/defect-recurrence-signals.js +1 -24
- package/dist/sdk/governance/defect-recurrence.js +1 -623
- package/dist/sdk/governance/extension-host-version.js +1 -115
- package/dist/sdk/governance/gc.js +1 -368
- package/dist/sdk/governance/health.js +1 -2367
- package/dist/sdk/governance/hierarchy-validation.js +1 -108
- package/dist/sdk/governance/linked-file-report.js +1 -71
- package/dist/sdk/governance/merge-receipt-history.js +1 -206
- package/dist/sdk/governance/provenance-health.js +1 -282
- package/dist/sdk/governance/reindex.js +4 -761
- package/dist/sdk/governance/stale-work.js +1 -82
- package/dist/sdk/governance/status-role-diagnostics.js +1 -35
- package/dist/sdk/governance/storage-integrity.js +1 -280
- package/dist/sdk/governance/tracked-runtime-cache.js +1 -106
- package/dist/sdk/governance/upgrade.js +2 -327
- package/dist/sdk/governance/validate-history-drift.js +1 -81
- package/dist/sdk/governance/validate-item-reader.js +1 -17
- package/dist/sdk/governance/validate-normalization.js +1 -36
- package/dist/sdk/governance/validate.d.ts +3 -1
- package/dist/sdk/governance/validate.js +1 -2261
- package/dist/sdk/governance/workflow-completeness.d.ts +32 -0
- package/dist/sdk/governance/workflow-completeness.js +2 -0
- package/dist/sdk/governance/workflow-policy.d.ts +47 -0
- package/dist/sdk/governance/workflow-policy.js +4 -0
- package/dist/sdk/governance/workspace-position.js +1 -163
- package/dist/sdk/governance.d.ts +2 -0
- package/dist/sdk/governance.js +1 -31
- package/dist/sdk/graph/adapter.js +1 -181
- package/dist/sdk/graph/analytics.js +1 -474
- package/dist/sdk/graph/assembly.js +1 -377
- package/dist/sdk/graph/cache.js +1 -160
- package/dist/sdk/graph/centrality.js +1 -258
- package/dist/sdk/graph/conformance.js +1 -130
- package/dist/sdk/graph/deadline-scheduling.d.ts +90 -0
- package/dist/sdk/graph/deadline-scheduling.js +2 -0
- package/dist/sdk/graph/durable-cache.d.ts +1 -1
- package/dist/sdk/graph/durable-cache.js +1 -361
- package/dist/sdk/graph/governance-contracts.js +1 -34
- package/dist/sdk/graph/governance.d.ts +13 -1
- package/dist/sdk/graph/governance.js +1 -735
- package/dist/sdk/graph/hierarchy-integrity.js +1 -310
- package/dist/sdk/graph/index.d.ts +3 -2
- package/dist/sdk/graph/index.js +1 -26
- package/dist/sdk/graph/lifecycle-coverage.d.ts +32 -0
- package/dist/sdk/graph/lifecycle-coverage.js +2 -0
- package/dist/sdk/graph/mutation-advisory.js +1 -176
- package/dist/sdk/graph/remediation.js +1 -197
- package/dist/sdk/graph/run.d.ts +15 -1
- package/dist/sdk/graph/run.js +1 -768
- package/dist/sdk/graph/scheduling.js +1 -124
- package/dist/sdk/graph/traversal.js +1 -284
- package/dist/sdk/graph/workspace-relationship-kind-registry.js +1 -27
- package/dist/sdk/graph.js +1 -15
- package/dist/sdk/guide-topics.js +1 -707
- package/dist/sdk/guide.js +1 -279
- package/dist/sdk/history/maintenance.d.ts +71 -0
- package/dist/sdk/history/maintenance.js +2 -0
- package/dist/sdk/history/salvage.js +2 -247
- package/dist/sdk/history/subject.d.ts +19 -0
- package/dist/sdk/history/subject.js +2 -0
- package/dist/sdk/history-analytics.js +1 -282
- package/dist/sdk/history-compact.js +1 -527
- package/dist/sdk/history-mcp.js +1 -68
- package/dist/sdk/history-provenance.js +1 -182
- package/dist/sdk/history-read.js +1 -96
- package/dist/sdk/history-redact.d.ts +1 -14
- package/dist/sdk/history-redact.js +1 -643
- package/dist/sdk/history-repair.d.ts +5 -0
- package/dist/sdk/history-repair.js +1 -657
- package/dist/sdk/improvement-ledger-validation.js +1 -62
- package/dist/sdk/improvement-ledger.js +2 -257
- package/dist/sdk/index.d.ts +4 -1
- package/dist/sdk/index.js +1 -183
- package/dist/sdk/init-agent-guidance.js +2 -496
- package/dist/sdk/init.js +2 -820
- package/dist/sdk/invocation-author.js +1 -39
- package/dist/sdk/item-children.js +1 -90
- package/dist/sdk/item-metadata-index.js +1 -15
- package/dist/sdk/item-schedule.js +1 -27
- package/dist/sdk/item-transaction.js +1 -396
- package/dist/sdk/learnings.js +1 -29
- package/dist/sdk/lifecycle/append.js +2 -53
- package/dist/sdk/lifecycle/claim.d.ts +2 -0
- package/dist/sdk/lifecycle/claim.js +1 -242
- package/dist/sdk/lifecycle/close-many.js +1 -438
- package/dist/sdk/lifecycle/close.js +1 -468
- package/dist/sdk/lifecycle/copy.js +1 -212
- package/dist/sdk/lifecycle/create.js +1 -1949
- package/dist/sdk/lifecycle/delete.js +1 -45
- package/dist/sdk/lifecycle/event-validation-messages.js +1 -91
- package/dist/sdk/lifecycle/focus.js +1 -91
- package/dist/sdk/lifecycle/hierarchy-mutation-lock.js +1 -24
- package/dist/sdk/lifecycle/legacy-none-tokens.js +1 -149
- package/dist/sdk/lifecycle/lifecycle-transitions.js +1 -40
- package/dist/sdk/lifecycle/mcp-actions.d.ts +2 -0
- package/dist/sdk/lifecycle/mcp-actions.js +1 -51
- package/dist/sdk/lifecycle/metadata-normalizers.js +1 -46
- package/dist/sdk/lifecycle/mutation-command-options.js +1 -9
- package/dist/sdk/lifecycle/plan.js +1 -1606
- package/dist/sdk/lifecycle/recurrence-parsers.d.ts +1 -1
- package/dist/sdk/lifecycle/recurrence-parsers.js +1 -147
- package/dist/sdk/lifecycle/reopen.js +1 -68
- package/dist/sdk/lifecycle/repeatable-metadata-parsers.js +1 -143
- package/dist/sdk/lifecycle/restore.d.ts +1 -0
- package/dist/sdk/lifecycle/restore.js +1 -330
- package/dist/sdk/lifecycle/shared-unset-fields.js +1 -295
- package/dist/sdk/lifecycle/update-many.js +1 -861
- package/dist/sdk/lifecycle/update.js +1 -2136
- package/dist/sdk/lifecycle-completion.js +1 -92
- package/dist/sdk/lifecycle-policy.js +1 -120
- package/dist/sdk/linked-artifacts.js +1 -530
- package/dist/sdk/mcp/apps.js +4 -133
- package/dist/sdk/mcp/authorization.js +1 -404
- package/dist/sdk/mcp/discovery.js +1 -494
- package/dist/sdk/mcp/interactions.js +1 -336
- package/dist/sdk/mcp/protocol.d.ts +7 -0
- package/dist/sdk/mcp/protocol.js +1 -184
- package/dist/sdk/mcp/skills.js +1 -389
- package/dist/sdk/mcp/subscriptions.js +1 -211
- package/dist/sdk/mcp/tasks.js +2 -430
- package/dist/sdk/mcp/transport.js +1 -260
- package/dist/sdk/merge/abandoned-receipts.js +1 -46
- package/dist/sdk/merge/driver.js +1 -212
- package/dist/sdk/merge/index.js +1 -16
- package/dist/sdk/merge/install.js +3 -561
- package/dist/sdk/merge/receipt-file-boundary.js +1 -46
- package/dist/sdk/merge/receipt-operation.js +1 -96
- package/dist/sdk/merge/receipt-schema.js +1 -397
- package/dist/sdk/merge/receipts.js +4 -525
- package/dist/sdk/merge/reconcile.js +1 -352
- package/dist/sdk/merge/three-way.js +3 -775
- package/dist/sdk/merge.js +1 -10
- package/dist/sdk/mutation-events.js +1 -292
- package/dist/sdk/mutation-guard.js +1 -216
- package/dist/sdk/notes.js +1 -139
- package/dist/sdk/output-contracts.js +1 -172
- package/dist/sdk/output-projection.js +1 -430
- package/dist/sdk/output-token-accounting.js +1 -140
- package/dist/sdk/output.js +1 -64
- package/dist/sdk/ownership-source.js +1 -21
- package/dist/sdk/package-import-adapters.js +1 -442
- package/dist/sdk/package-migrations.js +1 -20
- package/dist/sdk/package-runtime-options.js +1 -80
- package/dist/sdk/pagination.js +1 -162
- package/dist/sdk/profile.js +1 -454
- package/dist/sdk/provenance.js +1 -258
- package/dist/sdk/public-surface.json +1 -1
- package/dist/sdk/query/activity.js +1 -401
- package/dist/sdk/query/aggregate.d.ts +16 -0
- package/dist/sdk/query/aggregate.js +1 -390
- package/dist/sdk/query/calendar.js +1 -964
- package/dist/sdk/query/complete-list.js +1 -215
- package/dist/sdk/query/context.js +1 -1702
- package/dist/sdk/query/duplicate-candidates.js +1 -70
- package/dist/sdk/query/get.js +1 -450
- package/dist/sdk/query/history.js +1 -186
- package/dist/sdk/query/item-filter-options.js +1 -9
- package/dist/sdk/query/light-metadata.js +1 -18
- package/dist/sdk/query/list-filter-shared.js +1 -81
- package/dist/sdk/query/list.js +1 -1304
- package/dist/sdk/query/multi-value-filters.js +1 -78
- package/dist/sdk/query/next.js +1 -513
- package/dist/sdk/query/parsers.js +1 -44
- package/dist/sdk/query/projection-contracts.js +1 -184
- package/dist/sdk/query/search-contracts.d.ts +27 -0
- package/dist/sdk/query/search-contracts.js +1 -230
- package/dist/sdk/query/search-pagination.js +1 -35
- package/dist/sdk/query/search-rendering.js +1 -105
- package/dist/sdk/query/search.d.ts +6 -4
- package/dist/sdk/query/search.js +2 -1987
- package/dist/sdk/query.js +1 -35
- package/dist/sdk/read-output/continuation.js +1 -194
- package/dist/sdk/read-output-budget.js +1 -135
- package/dist/sdk/read-output-contracts.d.ts +1 -1
- package/dist/sdk/read-output-contracts.js +1 -1225
- package/dist/sdk/read-output-rows.js +1 -186
- package/dist/sdk/read-output-session.js +1 -208
- package/dist/sdk/relationship-analytics.js +1 -410
- package/dist/sdk/relationship-context.js +1 -284
- package/dist/sdk/relationship-history.js +4 -519
- package/dist/sdk/relationship-kinds/contract.js +1 -22
- package/dist/sdk/relationship-migration.js +1 -77
- package/dist/sdk/relationships.js +1 -579
- package/dist/sdk/reproducibility/process.js +1 -87
- package/dist/sdk/runtime-action-aliases.js +1 -59
- package/dist/sdk/runtime-extended-actions.js +1 -177
- package/dist/sdk/runtime-input.js +1 -614
- package/dist/sdk/runtime-primitives.js +1 -84
- package/dist/sdk/runtime-public-contracts.d.ts +2 -1
- package/dist/sdk/runtime-public-contracts.js +1 -4
- package/dist/sdk/runtime-stats-options.js +1 -38
- package/dist/sdk/runtime.d.ts +4 -0
- package/dist/sdk/runtime.js +1 -1928
- package/dist/sdk/scheduling-shortcuts.js +1 -63
- package/dist/sdk/schema-migration.js +3 -856
- package/dist/sdk/schema.d.ts +2 -1
- package/dist/sdk/schema.js +1 -1376
- package/dist/sdk/search-refresh-worker.js +1 -18
- package/dist/sdk/similarity-scoring.js +1 -53
- package/dist/sdk/similarity.js +1 -326
- package/dist/sdk/start-task-status.js +1 -14
- package/dist/sdk/stats.js +1 -270
- package/dist/sdk/structured-mutations.js +1 -580
- package/dist/sdk/telemetry-flush.js +1 -13
- package/dist/sdk/telemetry.js +1 -405
- package/dist/sdk/templates.js +2 -292
- package/dist/sdk/test/batch.js +2 -509
- package/dist/sdk/test/entry.js +1 -70
- package/dist/sdk/test/execution.js +6 -2211
- package/dist/sdk/test/linked-command-detection.js +1 -546
- package/dist/sdk/test/measurements.js +1 -91
- package/dist/sdk/test/parsers.js +1 -545
- package/dist/sdk/test/runs.js +1 -193
- package/dist/sdk/test/trust.js +2 -206
- package/dist/sdk/testing.js +4 -1391
- package/dist/sdk/traceability/runtime-files-lookup.js +1 -32
- package/dist/sdk/traceability/source-traceability.js +1 -292
- package/dist/sdk/tracker-root-discovery.js +1 -9
- package/dist/sdk/workspace-contracts-cache.js +1 -28
- package/dist/sdk/workspace-contracts.js +1 -33
- package/dist/sdk/workspace-memory.js +2 -318
- package/dist/sdk/workspace-recipe.js +1 -71
- package/dist/sdk/workspace-snapshot.js +4 -613
- package/dist/sdk/workspace-transaction-gc.js +1 -149
- package/dist/sdk/workspace-transaction.js +2 -363
- package/dist/sdk/workspace.js +3 -127
- package/dist/types/index.js +1 -9
- package/dist/types.d.ts +4 -0
- package/dist/types.js +1 -245
- package/docs/AGENT_GUIDE.md +1 -1
- package/docs/COMMANDS.md +10 -0
- package/docs/CONFIGURATION.md +12 -1
- package/docs/CONTEXT_ALGORITHM_PORTFOLIO.md +167 -0
- package/docs/DIAGNOSTIC_OUTPUT_CONTRACTS.md +9 -3
- package/docs/EXTENSIONS.md +1 -0
- package/docs/HISTORY_MAINTENANCE.md +125 -0
- package/docs/MCP_2026_07_28_CONFORMANCE.md +20 -10
- package/docs/PACKAGE_EVIDENCE.md +92 -0
- package/docs/PLANNING_MEASUREMENTS.md +183 -0
- package/docs/README.md +4 -0
- package/docs/READ_OUTPUT_CONTRACTS.md +5 -0
- package/docs/SCRIPTING.md +21 -0
- package/docs/TESTING.md +33 -0
- package/docs/WORKFLOW_POLICIES.md +129 -0
- package/docs/generated/FLAG_LEXICON_BUDGETS.md +7 -7
- package/docs/generated/REFUSAL_CLOSURE_CENSUS.md +11 -5
- package/marketplace.json +2 -2
- package/package.json +5 -5
- package/packages/pm-beads/package.json +1 -1
- package/packages/pm-calendar/package.json +1 -1
- package/packages/pm-command-kit/package.json +1 -1
- package/packages/pm-digital-twin/package.json +1 -1
- package/packages/pm-governance-audit/package.json +1 -1
- package/packages/pm-guide-shell/package.json +1 -1
- package/packages/pm-kanban/package.json +1 -1
- package/packages/pm-lifecycle-hooks/package.json +1 -1
- package/packages/pm-linked-test-adapters/package.json +1 -1
- package/packages/pm-search-advanced/package.json +1 -1
- package/packages/pm-templates/package.json +1 -1
- package/packages/pm-todos/package.json +1 -1
- package/packages/pm-vcs/package.json +1 -1
- package/plugins/pm-claude/.claude-plugin/plugin.json +1 -1
- package/plugins/pm-codex/.codex-plugin/plugin.json +1 -1
- package/scripts/finalize-build.mjs +45 -3
- package/dist/cli-bundle/chunks/chunk-AZDFJGH6.js +0 -9
- package/dist/cli-bundle/chunks/chunk-CKOL5U7J.js +0 -77
- package/dist/cli-bundle/chunks/chunk-JX4DH4WC.js +0 -3
- package/dist/cli-bundle/chunks/chunk-OF76PSDQ.js +0 -5
- package/dist/cli-bundle/chunks/chunk-QUWFABDM.js +0 -232
- package/dist/cli-bundle/chunks/chunk-QWRRFYK3.js +0 -2
- package/dist/cli-bundle/chunks/chunk-RWWBOWJ5.js +0 -2
- package/dist/cli-bundle/chunks/chunk-WGAOYSYH.js +0 -40
- package/dist/cli-bundle/chunks/chunk-WI2AYPA7.js +0 -2
- package/dist/cli-bundle/chunks/register-list-query-5JL52D33.js +0 -11
- package/dist/cli-bundle/chunks/register-mutation-ZPG7KMVP.js +0 -20
- package/dist/cli-bundle/chunks/register-operations-I5W3KMGB.js +0 -2
- package/dist/cli-bundle/chunks/register-setup-H4SVAVX7.js +0 -2
- package/dist/cli-bundle/focused-chunks/chunk-AL5ON6K6.js +0 -2
- package/dist/cli-bundle/focused-chunks/chunk-CHC2IDXA.js +0 -6
- package/dist/cli-bundle/focused-chunks/chunk-CK6QFAPZ.js +0 -20
- package/dist/cli-bundle/focused-chunks/chunk-EZR3GHFE.js +0 -2
- package/dist/cli-bundle/focused-chunks/chunk-H2WJWK7L.js +0 -56
- package/dist/cli-bundle/focused-chunks/chunk-NTPY5GSO.js +0 -3
- package/dist/cli-bundle/focused-chunks/chunk-P5O7MP5Y.js +0 -2
- package/dist/cli-bundle/focused-chunks/chunk-PDMW2E36.js +0 -177
- package/dist/cli-bundle/focused-chunks/chunk-PEFABF7E.js +0 -26
- package/dist/cli-bundle/focused-chunks/chunk-QTVCLMSZ.js +0 -6
- package/dist/cli-bundle/focused-chunks/chunk-QTZRBUYA.js +0 -8
- package/dist/cli-bundle/focused-chunks/chunk-SGQST3PQ.js +0 -12
- package/dist/cli-bundle/focused-chunks/chunk-UKHASMMP.js +0 -10
- package/dist/cli-bundle/focused-chunks/chunk-ZPEKQHOC.js +0 -2
|
@@ -1,497 +1,3 @@
|
|
|
1
|
-
|
|
2
|
-
* @module sdk/init-agent-guidance
|
|
3
|
-
*
|
|
4
|
-
* Implements the pm init agent guidance command surface and its agent-facing runtime behavior.
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="542cd5ac-e4a7-51fe-8521-d0bacd9e6a07")}catch(e){}}();
|
|
8
|
-
import fs from "node:fs/promises";
|
|
9
|
-
import path from "node:path";
|
|
10
|
-
import readline from "node:readline/promises";
|
|
11
|
-
import { stdin as input, stdout as output } from "node:process";
|
|
12
|
-
import { runActiveOnWriteHooks } from "../core/extensions/index.js";
|
|
13
|
-
import { pathExists, writeFileAtomic } from "../core/fs/fs-utils.js";
|
|
14
|
-
/** Supported values accepted by the init agent guidance mode contract. */
|
|
15
|
-
export const INIT_AGENT_GUIDANCE_MODE_VALUES = [
|
|
16
|
-
"ask",
|
|
17
|
-
"add",
|
|
18
|
-
"skip",
|
|
19
|
-
"status",
|
|
20
|
-
];
|
|
21
|
-
const AGENT_GUIDANCE_TARGET_FILENAMES = ["AGENTS.md", "CLAUDE.md"];
|
|
22
|
-
const AGENT_GUIDANCE_REQUIRED_TOKENS = [
|
|
23
|
-
"pm init",
|
|
24
|
-
"pm context",
|
|
25
|
-
"pm search",
|
|
26
|
-
"pm create",
|
|
27
|
-
"pm claim",
|
|
28
|
-
"pm files",
|
|
29
|
-
"pm docs",
|
|
30
|
-
"pm test --run",
|
|
31
|
-
"pm close",
|
|
32
|
-
"pm release",
|
|
33
|
-
"pm_author",
|
|
34
|
-
];
|
|
35
|
-
const AGENT_GUIDANCE_REQUIRED_TOKEN_THRESHOLD = 8;
|
|
36
|
-
const AGENT_GUIDANCE_TEMPLATE_VERSION = 1;
|
|
37
|
-
const AGENT_GUIDANCE_START_MARKER_PREFIX = "<!-- pm-cli:agent-guidance:start:";
|
|
38
|
-
const AGENT_GUIDANCE_START_MARKER = `<!-- pm-cli:agent-guidance:start:v${AGENT_GUIDANCE_TEMPLATE_VERSION} -->`;
|
|
39
|
-
const AGENT_GUIDANCE_END_MARKER = "<!-- pm-cli:agent-guidance:end -->";
|
|
40
|
-
const AGENT_GUIDANCE_ADD_LATER_HINT = "Add workflow guidance later: pm init --agent-guidance add";
|
|
41
|
-
/** Public contract for test only, shared by SDK and presentation-layer consumers. */
|
|
42
|
-
export const _testOnly = {
|
|
43
|
-
toPortableRelativePath,
|
|
44
|
-
ensureTrailingNewline,
|
|
45
|
-
detectLineEnding,
|
|
46
|
-
findGuidanceBlockRange,
|
|
47
|
-
buildAgentGuidanceBlock,
|
|
48
|
-
upsertAgentGuidanceBlock,
|
|
49
|
-
resolveProjectRoot,
|
|
50
|
-
resolveTargetGuidancePath,
|
|
51
|
-
parsePromptChoice,
|
|
52
|
-
pushUnique,
|
|
53
|
-
promptForGuidanceWrite,
|
|
54
|
-
normalizeAgentGuidanceState,
|
|
55
|
-
applyAgentGuidanceState,
|
|
56
|
-
writeGuidanceFile,
|
|
57
|
-
setAgentGuidanceReadlineFactoryForTests,
|
|
58
|
-
};
|
|
59
|
-
let createAgentGuidanceReadlineInterface = () => readline.createInterface({ input, output });
|
|
60
|
-
function setAgentGuidanceReadlineFactoryForTests(factory) {
|
|
61
|
-
createAgentGuidanceReadlineInterface =
|
|
62
|
-
factory ?? (() => readline.createInterface({ input, output }));
|
|
63
|
-
}
|
|
64
|
-
function toPortableRelativePath(projectRoot, targetPath) {
|
|
65
|
-
const relative = path.relative(projectRoot, targetPath);
|
|
66
|
-
if (relative.length === 0) {
|
|
67
|
-
return path.basename(targetPath);
|
|
68
|
-
}
|
|
69
|
-
return relative.split(path.sep).join("/");
|
|
70
|
-
}
|
|
71
|
-
function ensureTrailingNewline(value) {
|
|
72
|
-
return value.endsWith("\n") ? value : `${value}\n`;
|
|
73
|
-
}
|
|
74
|
-
function detectLineEnding(value) {
|
|
75
|
-
return value.includes("\r\n") ? "\r\n" : "\n";
|
|
76
|
-
}
|
|
77
|
-
function findGuidanceBlockRange(content) {
|
|
78
|
-
const startIndex = content.indexOf(AGENT_GUIDANCE_START_MARKER_PREFIX);
|
|
79
|
-
if (startIndex === -1) {
|
|
80
|
-
return null;
|
|
81
|
-
}
|
|
82
|
-
const endMarkerIndex = content.indexOf(AGENT_GUIDANCE_END_MARKER, startIndex);
|
|
83
|
-
if (endMarkerIndex === -1) {
|
|
84
|
-
return null;
|
|
85
|
-
}
|
|
86
|
-
return {
|
|
87
|
-
start_index: startIndex,
|
|
88
|
-
end_index: endMarkerIndex + AGENT_GUIDANCE_END_MARKER.length,
|
|
89
|
-
};
|
|
90
|
-
}
|
|
91
|
-
function hasGuidanceMarker(content) {
|
|
92
|
-
return findGuidanceBlockRange(content) !== null;
|
|
93
|
-
}
|
|
94
|
-
function buildAgentGuidanceBlock(lineEnding, projectTestCommand = "<your project test command>") {
|
|
95
|
-
const lines = [
|
|
96
|
-
AGENT_GUIDANCE_START_MARKER,
|
|
97
|
-
"## pm Workflow (Agent Quickstart)",
|
|
98
|
-
"",
|
|
99
|
-
'- Cold start with the measured canonical orientation: `pm context --limit 10 --for orient`; before item mutation, also run `pm search "<keywords>" --limit 10`, `pm list --status open --limit 20`, and `pm list --status in_progress --limit 20`.',
|
|
100
|
-
"- Claim and execute: `pm claim <id>` then `pm update <id> --status in_progress`.",
|
|
101
|
-
`- Link evidence while coding: \`pm files <id> --add ...\`, \`pm docs <id> --add ...\`, \`pm test <id> --add command="${projectTestCommand}"\`.`,
|
|
102
|
-
'- Verify and close: `pm test <id> --run --progress`, then atomically record closure evidence with `pm close <id> "<reason>" --resolution "<what changed>" --expected "<expected outcome>" --actual "<observed outcome>" --validate-close warn`, then `pm release <id>`.',
|
|
103
|
-
"- Author identity is automatic for supported agent harnesses; use `--author` only for an explicit override.",
|
|
104
|
-
"",
|
|
105
|
-
AGENT_GUIDANCE_END_MARKER,
|
|
106
|
-
"",
|
|
107
|
-
];
|
|
108
|
-
return lines.join(lineEnding);
|
|
109
|
-
}
|
|
110
|
-
function upsertAgentGuidanceBlock(existingContent, projectTestCommand = "<your project test command>") {
|
|
111
|
-
const lineEnding = detectLineEnding(existingContent);
|
|
112
|
-
const nextBlock = buildAgentGuidanceBlock(lineEnding, projectTestCommand);
|
|
113
|
-
const existingRange = findGuidanceBlockRange(existingContent);
|
|
114
|
-
if (existingRange) {
|
|
115
|
-
const trailingContent = existingContent.slice(existingRange.end_index);
|
|
116
|
-
const normalizedTrailingContent = trailingContent.startsWith("\r\n")
|
|
117
|
-
? trailingContent.slice(2)
|
|
118
|
-
: trailingContent.startsWith("\n")
|
|
119
|
-
? trailingContent.slice(1)
|
|
120
|
-
: trailingContent;
|
|
121
|
-
const nextContent = ensureTrailingNewline(`${existingContent.slice(0, existingRange.start_index)}${nextBlock}${normalizedTrailingContent}`);
|
|
122
|
-
return {
|
|
123
|
-
next_content: nextContent,
|
|
124
|
-
changed: nextContent !== existingContent,
|
|
125
|
-
};
|
|
126
|
-
}
|
|
127
|
-
const separator = existingContent.length === 0
|
|
128
|
-
? ""
|
|
129
|
-
: existingContent.endsWith("\n")
|
|
130
|
-
? "\n"
|
|
131
|
-
: "\n\n";
|
|
132
|
-
const nextContent = ensureTrailingNewline(`${existingContent}${separator}${nextBlock}`);
|
|
133
|
-
return {
|
|
134
|
-
next_content: nextContent,
|
|
135
|
-
changed: nextContent !== existingContent,
|
|
136
|
-
};
|
|
137
|
-
}
|
|
138
|
-
/** Resolve an executable linked-test command from a target repository's own files. */
|
|
139
|
-
export async function resolveProjectTestCommand(projectRoot) {
|
|
140
|
-
if (await pathExists(path.join(projectRoot, "scripts", "run-tests.mjs"))) {
|
|
141
|
-
return "node scripts/run-tests.mjs test";
|
|
142
|
-
}
|
|
143
|
-
let packageDocument;
|
|
144
|
-
try {
|
|
145
|
-
packageDocument = JSON.parse(await fs.readFile(path.join(projectRoot, "package.json"), "utf8"));
|
|
146
|
-
}
|
|
147
|
-
catch {
|
|
148
|
-
return "<your project test command>";
|
|
149
|
-
}
|
|
150
|
-
const manifest = normalizeProjectPackageManifest(packageDocument);
|
|
151
|
-
if (manifest === undefined) {
|
|
152
|
-
return "<your project test command>";
|
|
153
|
-
}
|
|
154
|
-
const packageManager = manifest.packageManager?.split("@")[0];
|
|
155
|
-
if (packageManager === "pnpm") {
|
|
156
|
-
return "pnpm test";
|
|
157
|
-
}
|
|
158
|
-
if (packageManager === "bun") {
|
|
159
|
-
return "bun run test";
|
|
160
|
-
}
|
|
161
|
-
if (packageManager === "yarn") {
|
|
162
|
-
return "yarn test";
|
|
163
|
-
}
|
|
164
|
-
if (packageManager === "npm")
|
|
165
|
-
return "npm test";
|
|
166
|
-
if (await pathExists(path.join(projectRoot, "pnpm-lock.yaml"))) {
|
|
167
|
-
return "pnpm test";
|
|
168
|
-
}
|
|
169
|
-
if ((await pathExists(path.join(projectRoot, "bun.lock"))) ||
|
|
170
|
-
(await pathExists(path.join(projectRoot, "bun.lockb")))) {
|
|
171
|
-
return "bun run test";
|
|
172
|
-
}
|
|
173
|
-
if (await pathExists(path.join(projectRoot, "yarn.lock")))
|
|
174
|
-
return "yarn test";
|
|
175
|
-
return "npm test";
|
|
176
|
-
}
|
|
177
|
-
/** Validate the minimal package manifest shape needed for executable test guidance. */
|
|
178
|
-
function normalizeProjectPackageManifest(value) {
|
|
179
|
-
if (typeof value !== "object" || value === null || !("scripts" in value)) {
|
|
180
|
-
return undefined;
|
|
181
|
-
}
|
|
182
|
-
const scripts = value.scripts;
|
|
183
|
-
if (typeof scripts !== "object" ||
|
|
184
|
-
scripts === null ||
|
|
185
|
-
!("test" in scripts) ||
|
|
186
|
-
typeof scripts.test !== "string" ||
|
|
187
|
-
scripts.test.trim().length === 0) {
|
|
188
|
-
return undefined;
|
|
189
|
-
}
|
|
190
|
-
return {
|
|
191
|
-
scripts: { test: scripts.test },
|
|
192
|
-
...("packageManager" in value && typeof value.packageManager === "string"
|
|
193
|
-
? { packageManager: value.packageManager }
|
|
194
|
-
: {}),
|
|
195
|
-
};
|
|
196
|
-
}
|
|
197
|
-
function resolveProjectRoot(pmRoot, cwd) {
|
|
198
|
-
const parent = path.dirname(pmRoot);
|
|
199
|
-
if (path.basename(pmRoot) === "pm" && path.basename(parent) === ".agents") {
|
|
200
|
-
return path.dirname(parent);
|
|
201
|
-
}
|
|
202
|
-
return path.resolve(cwd, pmRoot);
|
|
203
|
-
}
|
|
204
|
-
function resolveTargetGuidancePath(scans, projectRoot) {
|
|
205
|
-
const existingAgents = scans.find((entry) => path.basename(entry.file_path) === "AGENTS.md" && entry.exists);
|
|
206
|
-
if (existingAgents) {
|
|
207
|
-
return existingAgents.file_path;
|
|
208
|
-
}
|
|
209
|
-
const existingAny = scans.find((entry) => entry.exists);
|
|
210
|
-
if (existingAny) {
|
|
211
|
-
return existingAny.file_path;
|
|
212
|
-
}
|
|
213
|
-
return path.join(projectRoot, "AGENTS.md");
|
|
214
|
-
}
|
|
215
|
-
function parsePromptChoice(answer, currentDefault) {
|
|
216
|
-
const normalized = answer.trim().toLowerCase();
|
|
217
|
-
if (normalized.length === 0) {
|
|
218
|
-
return currentDefault;
|
|
219
|
-
}
|
|
220
|
-
if (normalized === "y" || normalized === "yes") {
|
|
221
|
-
return true;
|
|
222
|
-
}
|
|
223
|
-
if (normalized === "n" || normalized === "no") {
|
|
224
|
-
return false;
|
|
225
|
-
}
|
|
226
|
-
return currentDefault;
|
|
227
|
-
}
|
|
228
|
-
async function promptForGuidanceWrite(targetRelativePath) {
|
|
229
|
-
const rl = createAgentGuidanceReadlineInterface();
|
|
230
|
-
try {
|
|
231
|
-
output.write("\nAgent guidance check\n");
|
|
232
|
-
output.write("No AGENTS.md/CLAUDE.md file currently contains compact pm workflow guidance.\n");
|
|
233
|
-
const answer = await rl.question(`Add a compact pm workflow section to ${targetRelativePath}? [Y/n] `);
|
|
234
|
-
output.write("\n");
|
|
235
|
-
return parsePromptChoice(answer, true);
|
|
236
|
-
}
|
|
237
|
-
finally {
|
|
238
|
-
rl.close();
|
|
239
|
-
}
|
|
240
|
-
}
|
|
241
|
-
function normalizeAgentGuidanceState(settings) {
|
|
242
|
-
const current = settings.agent_guidance;
|
|
243
|
-
return {
|
|
244
|
-
prompt_completed: current?.prompt_completed === true,
|
|
245
|
-
declined: current?.declined === true,
|
|
246
|
-
declined_at: typeof current?.declined_at === "string" ? current.declined_at : "",
|
|
247
|
-
template_version: typeof current?.template_version === "number" &&
|
|
248
|
-
Number.isInteger(current.template_version) &&
|
|
249
|
-
current.template_version > 0
|
|
250
|
-
? current.template_version
|
|
251
|
-
: AGENT_GUIDANCE_TEMPLATE_VERSION,
|
|
252
|
-
last_checked_files: Array.isArray(current?.last_checked_files)
|
|
253
|
-
? [
|
|
254
|
-
...new Set(current.last_checked_files
|
|
255
|
-
.map((value) => value.trim())
|
|
256
|
-
.filter((value) => value.length > 0)),
|
|
257
|
-
].sort((left, right) => left.localeCompare(right))
|
|
258
|
-
: [],
|
|
259
|
-
};
|
|
260
|
-
}
|
|
261
|
-
async function scanGuidanceFiles(projectRoot) {
|
|
262
|
-
const scans = [];
|
|
263
|
-
for (const filename of AGENT_GUIDANCE_TARGET_FILENAMES) {
|
|
264
|
-
const filePath = path.join(projectRoot, filename);
|
|
265
|
-
const exists = await pathExists(filePath);
|
|
266
|
-
if (!exists) {
|
|
267
|
-
scans.push({
|
|
268
|
-
file_path: filePath,
|
|
269
|
-
exists,
|
|
270
|
-
has_guidance: false,
|
|
271
|
-
has_marker: false,
|
|
272
|
-
});
|
|
273
|
-
continue;
|
|
274
|
-
}
|
|
275
|
-
const content = await fs.readFile(filePath, "utf8");
|
|
276
|
-
const contentLower = content.toLowerCase();
|
|
277
|
-
const tokenHits = AGENT_GUIDANCE_REQUIRED_TOKENS.filter((token) => contentLower.includes(token));
|
|
278
|
-
const hasMarker = hasGuidanceMarker(content);
|
|
279
|
-
scans.push({
|
|
280
|
-
file_path: filePath,
|
|
281
|
-
exists,
|
|
282
|
-
has_guidance: hasMarker ||
|
|
283
|
-
tokenHits.length >= AGENT_GUIDANCE_REQUIRED_TOKEN_THRESHOLD,
|
|
284
|
-
has_marker: hasMarker,
|
|
285
|
-
});
|
|
286
|
-
}
|
|
287
|
-
return scans;
|
|
288
|
-
}
|
|
289
|
-
function pushUnique(target, value) {
|
|
290
|
-
if (!target.includes(value)) {
|
|
291
|
-
target.push(value);
|
|
292
|
-
}
|
|
293
|
-
}
|
|
294
|
-
function applyAgentGuidanceState(settings, currentState) {
|
|
295
|
-
const existing = normalizeAgentGuidanceState(settings);
|
|
296
|
-
const changed = JSON.stringify(existing) !== JSON.stringify(currentState);
|
|
297
|
-
if (changed) {
|
|
298
|
-
settings.agent_guidance = currentState;
|
|
299
|
-
}
|
|
300
|
-
return { changed, state: currentState };
|
|
301
|
-
}
|
|
302
|
-
async function writeGuidanceFile(filePath, projectRoot = path.dirname(filePath)) {
|
|
303
|
-
const exists = await pathExists(filePath);
|
|
304
|
-
const currentContent = exists ? await fs.readFile(filePath, "utf8") : "";
|
|
305
|
-
const nextContent = upsertAgentGuidanceBlock(currentContent, await resolveProjectTestCommand(projectRoot));
|
|
306
|
-
if (!nextContent.changed) {
|
|
307
|
-
return { changed: false, warnings: [] };
|
|
308
|
-
}
|
|
309
|
-
await writeFileAtomic(filePath, nextContent.next_content);
|
|
310
|
-
return {
|
|
311
|
-
changed: true,
|
|
312
|
-
warnings: await runActiveOnWriteHooks({
|
|
313
|
-
path: filePath,
|
|
314
|
-
scope: "project",
|
|
315
|
-
op: "init:agent_guidance_file",
|
|
316
|
-
}),
|
|
317
|
-
};
|
|
318
|
-
}
|
|
319
|
-
function buildInitAgentGuidanceSummary(params) {
|
|
320
|
-
return {
|
|
321
|
-
mode: params.mode,
|
|
322
|
-
present: params.scans.some((entry) => entry.has_guidance),
|
|
323
|
-
prompted: params.prompted,
|
|
324
|
-
applied: params.applied,
|
|
325
|
-
skipped: params.skipped,
|
|
326
|
-
declined: params.state.declined,
|
|
327
|
-
prompt_completed: params.state.prompt_completed,
|
|
328
|
-
template_version: params.state.template_version,
|
|
329
|
-
target_file: params.targetRelativePath,
|
|
330
|
-
checked_files: params.scans.map((entry) => toPortableRelativePath(params.projectRoot, entry.file_path)),
|
|
331
|
-
files_with_guidance: params.scans
|
|
332
|
-
.filter((entry) => entry.has_guidance)
|
|
333
|
-
.map((entry) => toPortableRelativePath(params.projectRoot, entry.file_path)),
|
|
334
|
-
missing_files: params.scans
|
|
335
|
-
.filter((entry) => !entry.exists)
|
|
336
|
-
.map((entry) => toPortableRelativePath(params.projectRoot, entry.file_path)),
|
|
337
|
-
};
|
|
338
|
-
}
|
|
339
|
-
async function refreshGuidanceScansAfterApply(applied, scans, projectRoot) {
|
|
340
|
-
return applied ? await scanGuidanceFiles(projectRoot) : scans;
|
|
341
|
-
}
|
|
342
|
-
function markAgentGuidanceRunState(flow, checkedFiles, partial) {
|
|
343
|
-
flow.state = {
|
|
344
|
-
...flow.state,
|
|
345
|
-
...partial,
|
|
346
|
-
template_version: AGENT_GUIDANCE_TEMPLATE_VERSION,
|
|
347
|
-
last_checked_files: checkedFiles,
|
|
348
|
-
};
|
|
349
|
-
}
|
|
350
|
-
async function addAgentGuidanceBlockIfMissing(flow, context) {
|
|
351
|
-
if (context.presentBefore) {
|
|
352
|
-
return;
|
|
353
|
-
}
|
|
354
|
-
const writeResult = await writeGuidanceFile(context.targetPath, context.projectRoot);
|
|
355
|
-
flow.warnings.push(...writeResult.warnings);
|
|
356
|
-
if (writeResult.changed) {
|
|
357
|
-
flow.applied = true;
|
|
358
|
-
flow.warnings.push(`agent_guidance:added:${context.targetRelativePath}`);
|
|
359
|
-
}
|
|
360
|
-
}
|
|
361
|
-
function handleAgentGuidanceStatusMode(flow, presentBefore) {
|
|
362
|
-
if (!presentBefore) {
|
|
363
|
-
flow.warnings.push("agent_guidance:missing");
|
|
364
|
-
pushUnique(flow.nextSteps, AGENT_GUIDANCE_ADD_LATER_HINT);
|
|
365
|
-
}
|
|
366
|
-
}
|
|
367
|
-
function handleAgentGuidanceSkipMode(flow, checkedFiles) {
|
|
368
|
-
flow.skipped = true;
|
|
369
|
-
markAgentGuidanceRunState(flow, checkedFiles, {
|
|
370
|
-
prompt_completed: true,
|
|
371
|
-
declined: true,
|
|
372
|
-
declined_at: flow.state.declined_at || new Date().toISOString(),
|
|
373
|
-
});
|
|
374
|
-
flow.warnings.push("agent_guidance:explicit_skip");
|
|
375
|
-
pushUnique(flow.nextSteps, AGENT_GUIDANCE_ADD_LATER_HINT);
|
|
376
|
-
}
|
|
377
|
-
async function handleAgentGuidanceAddMode(flow, context) {
|
|
378
|
-
await addAgentGuidanceBlockIfMissing(flow, context);
|
|
379
|
-
markAgentGuidanceRunState(flow, context.checkedFiles, {
|
|
380
|
-
prompt_completed: true,
|
|
381
|
-
declined: false,
|
|
382
|
-
declined_at: "",
|
|
383
|
-
});
|
|
384
|
-
}
|
|
385
|
-
function handlePresentAgentGuidance(flow, checkedFiles) {
|
|
386
|
-
if (flow.state.declined) {
|
|
387
|
-
markAgentGuidanceRunState(flow, checkedFiles, {
|
|
388
|
-
prompt_completed: true,
|
|
389
|
-
declined: false,
|
|
390
|
-
declined_at: "",
|
|
391
|
-
});
|
|
392
|
-
}
|
|
393
|
-
}
|
|
394
|
-
function handleDeclinedAgentGuidance(flow) {
|
|
395
|
-
flow.skipped = true;
|
|
396
|
-
flow.warnings.push("agent_guidance:skipped_declined");
|
|
397
|
-
pushUnique(flow.nextSteps, AGENT_GUIDANCE_ADD_LATER_HINT);
|
|
398
|
-
}
|
|
399
|
-
async function handleInteractiveAgentGuidancePrompt(flow, context) {
|
|
400
|
-
flow.prompted = true;
|
|
401
|
-
const approved = await promptForGuidanceWrite(context.targetRelativePath);
|
|
402
|
-
if (approved) {
|
|
403
|
-
await addAgentGuidanceBlockIfMissing(flow, context);
|
|
404
|
-
markAgentGuidanceRunState(flow, context.checkedFiles, {
|
|
405
|
-
prompt_completed: true,
|
|
406
|
-
declined: false,
|
|
407
|
-
declined_at: "",
|
|
408
|
-
});
|
|
409
|
-
return;
|
|
410
|
-
}
|
|
411
|
-
flow.skipped = true;
|
|
412
|
-
markAgentGuidanceRunState(flow, context.checkedFiles, {
|
|
413
|
-
prompt_completed: true,
|
|
414
|
-
declined: true,
|
|
415
|
-
declined_at: new Date().toISOString(),
|
|
416
|
-
});
|
|
417
|
-
flow.warnings.push("agent_guidance:declined");
|
|
418
|
-
pushUnique(flow.nextSteps, AGENT_GUIDANCE_ADD_LATER_HINT);
|
|
419
|
-
}
|
|
420
|
-
function handleNonInteractiveMissingAgentGuidance(flow) {
|
|
421
|
-
flow.warnings.push("agent_guidance:missing_non_interactive");
|
|
422
|
-
pushUnique(flow.nextSteps, AGENT_GUIDANCE_ADD_LATER_HINT);
|
|
423
|
-
}
|
|
424
|
-
async function applyAgentGuidanceMode(initialState, context) {
|
|
425
|
-
const flow = {
|
|
426
|
-
warnings: [],
|
|
427
|
-
nextSteps: [],
|
|
428
|
-
prompted: false,
|
|
429
|
-
applied: false,
|
|
430
|
-
skipped: false,
|
|
431
|
-
state: initialState,
|
|
432
|
-
};
|
|
433
|
-
if (context.mode === "status") {
|
|
434
|
-
handleAgentGuidanceStatusMode(flow, context.presentBefore);
|
|
435
|
-
return flow;
|
|
436
|
-
}
|
|
437
|
-
if (context.mode === "skip") {
|
|
438
|
-
handleAgentGuidanceSkipMode(flow, context.checkedFiles);
|
|
439
|
-
return flow;
|
|
440
|
-
}
|
|
441
|
-
if (context.mode === "add") {
|
|
442
|
-
await handleAgentGuidanceAddMode(flow, context);
|
|
443
|
-
return flow;
|
|
444
|
-
}
|
|
445
|
-
if (context.presentBefore) {
|
|
446
|
-
handlePresentAgentGuidance(flow, context.checkedFiles);
|
|
447
|
-
return flow;
|
|
448
|
-
}
|
|
449
|
-
if (flow.state.prompt_completed && flow.state.declined) {
|
|
450
|
-
handleDeclinedAgentGuidance(flow);
|
|
451
|
-
return flow;
|
|
452
|
-
}
|
|
453
|
-
if (context.interactive) {
|
|
454
|
-
await handleInteractiveAgentGuidancePrompt(flow, context);
|
|
455
|
-
return flow;
|
|
456
|
-
}
|
|
457
|
-
handleNonInteractiveMissingAgentGuidance(flow);
|
|
458
|
-
return flow;
|
|
459
|
-
}
|
|
460
|
-
/** Implements run init agent guidance for the public runtime surface of this module. */
|
|
461
|
-
export async function runInitAgentGuidance(options) {
|
|
462
|
-
const projectRoot = resolveProjectRoot(options.pm_root, options.cwd);
|
|
463
|
-
let scans = await scanGuidanceFiles(projectRoot);
|
|
464
|
-
const targetPath = resolveTargetGuidancePath(scans, projectRoot);
|
|
465
|
-
const targetRelativePath = toPortableRelativePath(projectRoot, targetPath);
|
|
466
|
-
const checkedFiles = scans.map((entry) => toPortableRelativePath(projectRoot, entry.file_path));
|
|
467
|
-
const presentBefore = scans.some((entry) => entry.has_guidance);
|
|
468
|
-
const flow = await applyAgentGuidanceMode(normalizeAgentGuidanceState(options.settings), {
|
|
469
|
-
mode: options.mode,
|
|
470
|
-
interactive: options.interactive,
|
|
471
|
-
targetPath,
|
|
472
|
-
targetRelativePath,
|
|
473
|
-
checkedFiles,
|
|
474
|
-
presentBefore,
|
|
475
|
-
projectRoot,
|
|
476
|
-
});
|
|
477
|
-
const stateUpdate = applyAgentGuidanceState(options.settings, flow.state);
|
|
478
|
-
scans = await refreshGuidanceScansAfterApply(flow.applied, scans, projectRoot);
|
|
479
|
-
const summary = buildInitAgentGuidanceSummary({
|
|
480
|
-
mode: options.mode,
|
|
481
|
-
scans,
|
|
482
|
-
projectRoot,
|
|
483
|
-
targetRelativePath,
|
|
484
|
-
prompted: flow.prompted,
|
|
485
|
-
applied: flow.applied,
|
|
486
|
-
skipped: flow.skipped,
|
|
487
|
-
state: flow.state,
|
|
488
|
-
});
|
|
489
|
-
return {
|
|
490
|
-
summary,
|
|
491
|
-
warnings: flow.warnings,
|
|
492
|
-
next_steps: flow.nextSteps,
|
|
493
|
-
settings_changed: stateUpdate.changed,
|
|
494
|
-
};
|
|
495
|
-
}
|
|
1
|
+
!(function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=new e.Error().stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="e5ae3e66-4a45-5c62-9144-46f8f5bff7cf")}catch(e2){}})();import fs from"node:fs/promises";import path from"node:path";import readline from"node:readline/promises";import{stdin as input,stdout as output}from"node:process";import{runActiveOnWriteHooks}from"../core/extensions/index.js";import{pathExists,writeFileAtomic}from"../core/fs/fs-utils.js";const INIT_AGENT_GUIDANCE_MODE_VALUES=["ask","add","skip","status"];const AGENT_GUIDANCE_TARGET_FILENAMES=["AGENTS.md","CLAUDE.md"];const AGENT_GUIDANCE_REQUIRED_TOKENS=["pm init","pm context","pm search","pm create","pm claim","pm files","pm docs","pm test --run","pm close","pm release","pm_author"];const AGENT_GUIDANCE_REQUIRED_TOKEN_THRESHOLD=8;const AGENT_GUIDANCE_TEMPLATE_VERSION=1;const AGENT_GUIDANCE_START_MARKER_PREFIX="<!-- pm-cli:agent-guidance:start:";const AGENT_GUIDANCE_START_MARKER=`<!-- pm-cli:agent-guidance:start:v${AGENT_GUIDANCE_TEMPLATE_VERSION} -->`;const AGENT_GUIDANCE_END_MARKER="<!-- pm-cli:agent-guidance:end -->";const AGENT_GUIDANCE_ADD_LATER_HINT="Add workflow guidance later: pm init --agent-guidance add";const _testOnly={toPortableRelativePath,ensureTrailingNewline,detectLineEnding,findGuidanceBlockRange,buildAgentGuidanceBlock,upsertAgentGuidanceBlock,resolveProjectRoot,resolveTargetGuidancePath,parsePromptChoice,pushUnique,promptForGuidanceWrite,normalizeAgentGuidanceState,applyAgentGuidanceState,writeGuidanceFile,setAgentGuidanceReadlineFactoryForTests};let createAgentGuidanceReadlineInterface=()=>readline.createInterface({input,output});function setAgentGuidanceReadlineFactoryForTests(factory){createAgentGuidanceReadlineInterface=factory??(()=>readline.createInterface({input,output}))}function toPortableRelativePath(projectRoot,targetPath){const relative=path.relative(projectRoot,targetPath);if(relative.length===0){return path.basename(targetPath)}return relative.split(path.sep).join("/")}function ensureTrailingNewline(value){return value.endsWith("\n")?value:`${value}
|
|
2
|
+
`}function detectLineEnding(value){return value.includes("\r\n")?"\r\n":"\n"}function findGuidanceBlockRange(content){const startIndex=content.indexOf(AGENT_GUIDANCE_START_MARKER_PREFIX);if(startIndex===-1){return null}const endMarkerIndex=content.indexOf(AGENT_GUIDANCE_END_MARKER,startIndex);if(endMarkerIndex===-1){return null}return{start_index:startIndex,end_index:endMarkerIndex+AGENT_GUIDANCE_END_MARKER.length}}function hasGuidanceMarker(content){return findGuidanceBlockRange(content)!==null}function buildAgentGuidanceBlock(lineEnding,projectTestCommand="<your project test command>"){const lines=[AGENT_GUIDANCE_START_MARKER,"## pm Workflow (Agent Quickstart)","",'- Cold start with the measured canonical orientation: `pm context --limit 10 --for orient`; before item mutation, also run `pm search "<keywords>" --limit 10`, `pm list --status open --limit 20`, and `pm list --status in_progress --limit 20`.',"- Claim and execute: `pm claim <id>` then `pm update <id> --status in_progress`.",`- Link evidence while coding: \`pm files <id> --add ...\`, \`pm docs <id> --add ...\`, \`pm test <id> --add command="${projectTestCommand}"\`.`,'- Verify and close: `pm test <id> --run --progress`, then atomically record closure evidence with `pm close <id> "<reason>" --resolution "<what changed>" --expected "<expected outcome>" --actual "<observed outcome>" --validate-close warn`, then `pm release <id>`.',"- Author identity is automatic for supported agent harnesses; use `--author` only for an explicit override.","",AGENT_GUIDANCE_END_MARKER,""];return lines.join(lineEnding)}function upsertAgentGuidanceBlock(existingContent,projectTestCommand="<your project test command>"){const lineEnding=detectLineEnding(existingContent);const nextBlock=buildAgentGuidanceBlock(lineEnding,projectTestCommand);const existingRange=findGuidanceBlockRange(existingContent);if(existingRange){const trailingContent=existingContent.slice(existingRange.end_index);const normalizedTrailingContent=trailingContent.startsWith("\r\n")?trailingContent.slice(2):trailingContent.startsWith("\n")?trailingContent.slice(1):trailingContent;const nextContent2=ensureTrailingNewline(`${existingContent.slice(0,existingRange.start_index)}${nextBlock}${normalizedTrailingContent}`);return{next_content:nextContent2,changed:nextContent2!==existingContent}}const separator=existingContent.length===0?"":existingContent.endsWith("\n")?"\n":"\n\n";const nextContent=ensureTrailingNewline(`${existingContent}${separator}${nextBlock}`);return{next_content:nextContent,changed:nextContent!==existingContent}}async function resolveProjectTestCommand(projectRoot){if(await pathExists(path.join(projectRoot,"scripts","run-tests.mjs"))){return"node scripts/run-tests.mjs test"}let packageDocument;try{packageDocument=JSON.parse(await fs.readFile(path.join(projectRoot,"package.json"),"utf8"))}catch{return"<your project test command>"}const manifest=normalizeProjectPackageManifest(packageDocument);if(manifest===void 0){return"<your project test command>"}const packageManager=manifest.packageManager?.split("@")[0];if(packageManager==="pnpm"){return"pnpm test"}if(packageManager==="bun"){return"bun run test"}if(packageManager==="yarn"){return"yarn test"}if(packageManager==="npm")return"npm test";if(await pathExists(path.join(projectRoot,"pnpm-lock.yaml"))){return"pnpm test"}if(await pathExists(path.join(projectRoot,"bun.lock"))||await pathExists(path.join(projectRoot,"bun.lockb"))){return"bun run test"}if(await pathExists(path.join(projectRoot,"yarn.lock")))return"yarn test";return"npm test"}function normalizeProjectPackageManifest(value){if(typeof value!=="object"||value===null||!("scripts"in value)){return void 0}const scripts=value.scripts;if(typeof scripts!=="object"||scripts===null||!("test"in scripts)||typeof scripts.test!=="string"||scripts.test.trim().length===0){return void 0}return{scripts:{test:scripts.test},..."packageManager"in value&&typeof value.packageManager==="string"?{packageManager:value.packageManager}:{}}}function resolveProjectRoot(pmRoot,cwd){const parent=path.dirname(pmRoot);if(path.basename(pmRoot)==="pm"&&path.basename(parent)===".agents"){return path.dirname(parent)}return path.resolve(cwd,pmRoot)}function resolveTargetGuidancePath(scans,projectRoot){const existingAgents=scans.find(entry=>path.basename(entry.file_path)==="AGENTS.md"&&entry.exists);if(existingAgents){return existingAgents.file_path}const existingAny=scans.find(entry=>entry.exists);if(existingAny){return existingAny.file_path}return path.join(projectRoot,"AGENTS.md")}function parsePromptChoice(answer,currentDefault){const normalized=answer.trim().toLowerCase();if(normalized.length===0){return currentDefault}if(normalized==="y"||normalized==="yes"){return true}if(normalized==="n"||normalized==="no"){return false}return currentDefault}async function promptForGuidanceWrite(targetRelativePath){const rl=createAgentGuidanceReadlineInterface();try{output.write("\nAgent guidance check\n");output.write("No AGENTS.md/CLAUDE.md file currently contains compact pm workflow guidance.\n");const answer=await rl.question(`Add a compact pm workflow section to ${targetRelativePath}? [Y/n] `);output.write("\n");return parsePromptChoice(answer,true)}finally{rl.close()}}function normalizeAgentGuidanceState(settings){const current=settings.agent_guidance;return{prompt_completed:current?.prompt_completed===true,declined:current?.declined===true,declined_at:typeof current?.declined_at==="string"?current.declined_at:"",template_version:typeof current?.template_version==="number"&&Number.isInteger(current.template_version)&¤t.template_version>0?current.template_version:AGENT_GUIDANCE_TEMPLATE_VERSION,last_checked_files:Array.isArray(current?.last_checked_files)?[...new Set(current.last_checked_files.map(value=>value.trim()).filter(value=>value.length>0))].sort((left,right)=>left.localeCompare(right)):[]}}async function scanGuidanceFiles(projectRoot){const scans=[];for(const filename of AGENT_GUIDANCE_TARGET_FILENAMES){const filePath=path.join(projectRoot,filename);const exists=await pathExists(filePath);if(!exists){scans.push({file_path:filePath,exists,has_guidance:false,has_marker:false});continue}const content=await fs.readFile(filePath,"utf8");const contentLower=content.toLowerCase();const tokenHits=AGENT_GUIDANCE_REQUIRED_TOKENS.filter(token=>contentLower.includes(token));const hasMarker=hasGuidanceMarker(content);scans.push({file_path:filePath,exists,has_guidance:hasMarker||tokenHits.length>=AGENT_GUIDANCE_REQUIRED_TOKEN_THRESHOLD,has_marker:hasMarker})}return scans}function pushUnique(target,value){if(!target.includes(value)){target.push(value)}}function applyAgentGuidanceState(settings,currentState){const existing=normalizeAgentGuidanceState(settings);const changed=JSON.stringify(existing)!==JSON.stringify(currentState);if(changed){settings.agent_guidance=currentState}return{changed,state:currentState}}async function writeGuidanceFile(filePath,projectRoot=path.dirname(filePath)){const exists=await pathExists(filePath);const currentContent=exists?await fs.readFile(filePath,"utf8"):"";const nextContent=upsertAgentGuidanceBlock(currentContent,await resolveProjectTestCommand(projectRoot));if(!nextContent.changed){return{changed:false,warnings:[]}}await writeFileAtomic(filePath,nextContent.next_content);return{changed:true,warnings:await runActiveOnWriteHooks({path:filePath,scope:"project",op:"init:agent_guidance_file"})}}function buildInitAgentGuidanceSummary(params){return{mode:params.mode,present:params.scans.some(entry=>entry.has_guidance),prompted:params.prompted,applied:params.applied,skipped:params.skipped,declined:params.state.declined,prompt_completed:params.state.prompt_completed,template_version:params.state.template_version,target_file:params.targetRelativePath,checked_files:params.scans.map(entry=>toPortableRelativePath(params.projectRoot,entry.file_path)),files_with_guidance:params.scans.filter(entry=>entry.has_guidance).map(entry=>toPortableRelativePath(params.projectRoot,entry.file_path)),missing_files:params.scans.filter(entry=>!entry.exists).map(entry=>toPortableRelativePath(params.projectRoot,entry.file_path))}}async function refreshGuidanceScansAfterApply(applied,scans,projectRoot){return applied?await scanGuidanceFiles(projectRoot):scans}function markAgentGuidanceRunState(flow,checkedFiles,partial){flow.state={...flow.state,...partial,template_version:AGENT_GUIDANCE_TEMPLATE_VERSION,last_checked_files:checkedFiles}}async function addAgentGuidanceBlockIfMissing(flow,context){if(context.presentBefore){return}const writeResult=await writeGuidanceFile(context.targetPath,context.projectRoot);flow.warnings.push(...writeResult.warnings);if(writeResult.changed){flow.applied=true;flow.warnings.push(`agent_guidance:added:${context.targetRelativePath}`)}}function handleAgentGuidanceStatusMode(flow,presentBefore){if(!presentBefore){flow.warnings.push("agent_guidance:missing");pushUnique(flow.nextSteps,AGENT_GUIDANCE_ADD_LATER_HINT)}}function handleAgentGuidanceSkipMode(flow,checkedFiles){flow.skipped=true;markAgentGuidanceRunState(flow,checkedFiles,{prompt_completed:true,declined:true,declined_at:flow.state.declined_at||new Date().toISOString()});flow.warnings.push("agent_guidance:explicit_skip");pushUnique(flow.nextSteps,AGENT_GUIDANCE_ADD_LATER_HINT)}async function handleAgentGuidanceAddMode(flow,context){await addAgentGuidanceBlockIfMissing(flow,context);markAgentGuidanceRunState(flow,context.checkedFiles,{prompt_completed:true,declined:false,declined_at:""})}function handlePresentAgentGuidance(flow,checkedFiles){if(flow.state.declined){markAgentGuidanceRunState(flow,checkedFiles,{prompt_completed:true,declined:false,declined_at:""})}}function handleDeclinedAgentGuidance(flow){flow.skipped=true;flow.warnings.push("agent_guidance:skipped_declined");pushUnique(flow.nextSteps,AGENT_GUIDANCE_ADD_LATER_HINT)}async function handleInteractiveAgentGuidancePrompt(flow,context){flow.prompted=true;const approved=await promptForGuidanceWrite(context.targetRelativePath);if(approved){await addAgentGuidanceBlockIfMissing(flow,context);markAgentGuidanceRunState(flow,context.checkedFiles,{prompt_completed:true,declined:false,declined_at:""});return}flow.skipped=true;markAgentGuidanceRunState(flow,context.checkedFiles,{prompt_completed:true,declined:true,declined_at:new Date().toISOString()});flow.warnings.push("agent_guidance:declined");pushUnique(flow.nextSteps,AGENT_GUIDANCE_ADD_LATER_HINT)}function handleNonInteractiveMissingAgentGuidance(flow){flow.warnings.push("agent_guidance:missing_non_interactive");pushUnique(flow.nextSteps,AGENT_GUIDANCE_ADD_LATER_HINT)}async function applyAgentGuidanceMode(initialState,context){const flow={warnings:[],nextSteps:[],prompted:false,applied:false,skipped:false,state:initialState};if(context.mode==="status"){handleAgentGuidanceStatusMode(flow,context.presentBefore);return flow}if(context.mode==="skip"){handleAgentGuidanceSkipMode(flow,context.checkedFiles);return flow}if(context.mode==="add"){await handleAgentGuidanceAddMode(flow,context);return flow}if(context.presentBefore){handlePresentAgentGuidance(flow,context.checkedFiles);return flow}if(flow.state.prompt_completed&&flow.state.declined){handleDeclinedAgentGuidance(flow);return flow}if(context.interactive){await handleInteractiveAgentGuidancePrompt(flow,context);return flow}handleNonInteractiveMissingAgentGuidance(flow);return flow}async function runInitAgentGuidance(options){const projectRoot=resolveProjectRoot(options.pm_root,options.cwd);let scans=await scanGuidanceFiles(projectRoot);const targetPath=resolveTargetGuidancePath(scans,projectRoot);const targetRelativePath=toPortableRelativePath(projectRoot,targetPath);const checkedFiles=scans.map(entry=>toPortableRelativePath(projectRoot,entry.file_path));const presentBefore=scans.some(entry=>entry.has_guidance);const flow=await applyAgentGuidanceMode(normalizeAgentGuidanceState(options.settings),{mode:options.mode,interactive:options.interactive,targetPath,targetRelativePath,checkedFiles,presentBefore,projectRoot});const stateUpdate=applyAgentGuidanceState(options.settings,flow.state);scans=await refreshGuidanceScansAfterApply(flow.applied,scans,projectRoot);const summary=buildInitAgentGuidanceSummary({mode:options.mode,scans,projectRoot,targetRelativePath,prompted:flow.prompted,applied:flow.applied,skipped:flow.skipped,state:flow.state});return{summary,warnings:flow.warnings,next_steps:flow.nextSteps,settings_changed:stateUpdate.changed}}export{INIT_AGENT_GUIDANCE_MODE_VALUES,_testOnly,resolveProjectTestCommand,runInitAgentGuidance};
|
|
496
3
|
//# sourceMappingURL=init-agent-guidance.js.map
|
|
497
|
-
//# debugId=542cd5ac-e4a7-51fe-8521-d0bacd9e6a07
|