@unbrained/pm-cli 2026.10.3 → 2026.10.5
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 +2 -2
- package/CHANGELOG.md +28 -2
- package/dist/cli/after-command-context-usage.js +1 -1
- package/dist/cli/argv-utils.js +1 -1
- package/dist/cli/bootstrap-args.js +1 -1
- package/dist/cli/bundle-integrity.js +2 -2
- package/dist/cli/command-namespaces.js +1 -1
- package/dist/cli/commander-usage.d.ts +1 -1
- package/dist/cli/commander-usage.js +7 -4
- package/dist/cli/commands/annotations/comments.js +1 -1
- package/dist/cli/commands/annotations/docs.js +1 -1
- package/dist/cli/commands/annotations/files.js +1 -1
- package/dist/cli/commands/annotations/learnings.js +1 -1
- package/dist/cli/commands/annotations/notes.js +1 -1
- package/dist/cli/commands/extension/describe.js +1 -1
- package/dist/cli/commands/extension/extension.js +1 -1
- package/dist/cli/commands/extension/scaffold.js +1 -1
- package/dist/cli/commands/extension/shared.js +1 -1
- package/dist/cli/commands/governance/gc.js +1 -1
- package/dist/cli/commands/governance/health.js +1 -1
- package/dist/cli/commands/governance/telemetry.js +1 -1
- package/dist/cli/commands/governance/validate.js +1 -1
- package/dist/cli/commands/history/activity.js +1 -1
- package/dist/cli/commands/history/history-compact.js +1 -1
- package/dist/cli/commands/history/history-redact.js +1 -1
- package/dist/cli/commands/history/history-repair.js +1 -1
- package/dist/cli/commands/history/history.js +1 -1
- package/dist/cli/commands/history/restore.js +1 -1
- package/dist/cli/commands/lifecycle/append.js +1 -1
- package/dist/cli/commands/lifecycle/claim.js +1 -1
- package/dist/cli/commands/lifecycle/close-many.js +1 -1
- package/dist/cli/commands/lifecycle/close.js +1 -1
- package/dist/cli/commands/lifecycle/copy.js +1 -1
- package/dist/cli/commands/lifecycle/create.js +1 -1
- package/dist/cli/commands/lifecycle/delete.js +1 -1
- package/dist/cli/commands/lifecycle/focus.js +1 -1
- package/dist/cli/commands/lifecycle/plan.js +1 -1
- package/dist/cli/commands/lifecycle/update-many.js +1 -1
- package/dist/cli/commands/lifecycle/update.js +1 -1
- package/dist/cli/commands/query/aggregate.js +1 -1
- package/dist/cli/commands/query/context.js +1 -1
- package/dist/cli/commands/query/deps.js +1 -1
- package/dist/cli/commands/query/duplicates.js +1 -1
- package/dist/cli/commands/query/eval.js +1 -1
- package/dist/cli/commands/query/get.js +1 -1
- package/dist/cli/commands/query/graph.js +1 -1
- package/dist/cli/commands/query/list.js +1 -1
- package/dist/cli/commands/query/next.js +1 -1
- package/dist/cli/commands/query/search.js +1 -1
- package/dist/cli/commands/query/stats.js +1 -1
- package/dist/cli/commands/test/test-all.js +1 -1
- package/dist/cli/commands/test/test-runs.js +1 -1
- package/dist/cli/commands/test/test.js +1 -1
- package/dist/cli/commands/workspace/config.js +1 -1
- package/dist/cli/commands/workspace/contracts.js +1 -1
- package/dist/cli/commands/workspace/init.js +1 -1
- package/dist/cli/commands/workspace/merge.js +1 -1
- package/dist/cli/commands/workspace/profile.js +1 -1
- package/dist/cli/commands/workspace/schema.js +1 -1
- package/dist/cli/commands/workspace/upgrade.js +1 -1
- package/dist/cli/context-intent-invocation.js +1 -1
- package/dist/cli/description-stdin.js +1 -1
- package/dist/cli/error-guidance.js +3 -1
- package/dist/cli/extension-command-help.js +5 -3
- package/dist/cli/extension-command-options.js +1 -1
- package/dist/cli/extension-recovery.js +1 -1
- package/dist/cli/help-content.js +5 -2
- package/dist/cli/help-json-payload.js +6 -3
- package/dist/cli/invocation-profile.js +2 -2
- package/dist/cli/main.js +5 -5
- package/dist/cli/migration-gates.js +1 -1
- package/dist/cli/option-values.js +1 -1
- package/dist/cli/public.js +1 -1
- package/dist/cli/register-annotations.js +1 -1
- package/dist/cli/register-assurance.js +1 -1
- package/dist/cli/register-files-lookup.js +1 -1
- package/dist/cli/register-history-activity.js +1 -1
- package/dist/cli/register-history-author.js +1 -1
- package/dist/cli/register-history-maintenance.js +2 -2
- package/dist/cli/register-list-query.js +10 -10
- package/dist/cli/register-mutation-options.js +1 -1
- package/dist/cli/register-mutation.js +2 -2
- package/dist/cli/register-operations.js +1 -1
- package/dist/cli/register-setup.js +1 -1
- package/dist/cli/register-structured-mutation.js +1 -1
- package/dist/cli/registration-helpers.js +1 -1
- package/dist/cli/runtime/activation.js +1 -1
- package/dist/cli/runtime/invocation-options.js +1 -1
- package/dist/cli/runtime/projection-retry.js +1 -1
- package/dist/cli/runtime/selection.js +1 -1
- package/dist/cli/runtime/telemetry-outcome.js +1 -1
- package/dist/cli/runtime-compatibility-boundary.d.ts +1 -1
- package/dist/cli/runtime-compatibility-boundary.js +4 -4
- package/dist/cli/schema/registration.js +2 -2
- package/dist/cli/schema-registration-helpers.js +1 -1
- package/dist/cli/search-refresh.js +1 -1
- package/dist/cli/stats-analytics-json.js +1 -1
- package/dist/cli/telemetry-flush.js +1 -1
- package/dist/cli-bundle/bundle-manifest.json +162 -162
- package/dist/cli-bundle/chunks/chunk-3CYOBJUK.js +3 -0
- package/dist/cli-bundle/chunks/chunk-5MNOWZPN.js +3 -0
- package/dist/cli-bundle/chunks/chunk-AJ7H6XUF.js +20 -0
- package/dist/cli-bundle/chunks/chunk-D332RXZ7.js +80 -0
- package/dist/cli-bundle/chunks/chunk-HRJ6G6ZG.js +31 -0
- package/dist/cli-bundle/chunks/chunk-KRVI56QE.js +6 -0
- package/dist/cli-bundle/chunks/chunk-N4YGSG6F.js +238 -0
- package/dist/cli-bundle/chunks/chunk-OOLYASYJ.js +2 -0
- package/dist/cli-bundle/chunks/chunk-R7CG2DB7.js +2 -0
- package/dist/cli-bundle/chunks/chunk-TGMONGWX.js +2 -0
- package/dist/cli-bundle/chunks/chunk-UZ7BIUCI.js +2 -0
- package/dist/cli-bundle/chunks/{chunk-44UGMMQ6.js → chunk-VZ63DEVJ.js} +3 -3
- package/dist/cli-bundle/chunks/chunk-WFZ4UEOB.js +2 -0
- package/dist/cli-bundle/chunks/chunk-YVBRASXO.js +8 -0
- package/dist/cli-bundle/chunks/{chunk-5XKF5SQV.js → chunk-Z66DWDAU.js} +91 -91
- package/dist/cli-bundle/chunks/{register-list-query-DYCGUQEW.js → register-list-query-75QXHIFH.js} +11 -11
- package/dist/cli-bundle/chunks/register-mutation-YS54SCHG.js +20 -0
- package/dist/cli-bundle/chunks/register-operations-6KHZQSYJ.js +2 -0
- package/dist/cli-bundle/chunks/register-setup-RTATEN2M.js +2 -0
- package/dist/cli-bundle/focused-chunks/{chunk-3BIYG72P.js → chunk-2CVX3KR3.js} +2 -2
- package/dist/cli-bundle/focused-chunks/chunk-5C3IDDW7.js +2 -0
- package/dist/cli-bundle/focused-chunks/{chunk-DBD4W4QP.js → chunk-ABV67XCC.js} +3 -3
- package/dist/cli-bundle/focused-chunks/chunk-B5RSLVE6.js +3 -0
- package/dist/cli-bundle/focused-chunks/chunk-C224METM.js +20 -0
- package/dist/cli-bundle/focused-chunks/chunk-CLDPTMQY.js +6 -0
- package/dist/cli-bundle/focused-chunks/chunk-DDRN42PB.js +8 -0
- package/dist/cli-bundle/focused-chunks/{chunk-EJN7DY3B.js → chunk-DOVTUKJQ.js} +2 -2
- package/dist/cli-bundle/focused-chunks/chunk-ECBOPEJE.js +75 -0
- package/dist/cli-bundle/focused-chunks/chunk-GITOYRUW.js +165 -0
- package/dist/cli-bundle/focused-chunks/chunk-GUIF3WVC.js +30 -0
- package/dist/cli-bundle/focused-chunks/chunk-LE4JUCRR.js +3 -0
- package/dist/cli-bundle/focused-chunks/{chunk-HFAW3FJQ.js → chunk-PSXFFQFT.js} +2 -2
- package/dist/cli-bundle/focused-chunks/chunk-RHIH6XIW.js +12 -0
- package/dist/cli-bundle/focused-chunks/chunk-UDYRVBOZ.js +2 -0
- package/dist/cli-bundle/focused-chunks/chunk-XV5RV4ZT.js +2 -0
- package/dist/cli-bundle/focused-chunks/{chunk-XRSCIYHR.js → chunk-YMU42COG.js} +2 -2
- package/dist/cli-bundle/main.js +28 -28
- 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 +32 -32
- 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 +55 -55
- 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 +10 -10
- package/dist/cli.js +1 -1
- package/dist/core/checkpoint/checkpoint-gc.js +1 -1
- package/dist/core/checkpoint/mutation-checkpoint.js +2 -2
- package/dist/core/config/nested-settings.js +1 -1
- package/dist/core/config/positional-value.js +1 -1
- package/dist/core/diagnostics/remediation.js +1 -1
- package/dist/core/extensions/activation-summary-markdown.js +2 -1
- package/dist/core/extensions/activation-summary.js +1 -1
- package/dist/core/extensions/activation-transaction.js +1 -1
- package/dist/core/extensions/capability-usage.js +1 -1
- package/dist/core/extensions/command-hook-context.js +1 -1
- package/dist/core/extensions/command-metadata-contract.js +1 -1
- package/dist/core/extensions/command-visibility-tier.js +1 -1
- package/dist/core/extensions/contribution-inventory.js +1 -1
- package/dist/core/extensions/exporter-output-contract.js +1 -1
- package/dist/core/extensions/extension-candidate.js +1 -1
- package/dist/core/extensions/extension-capability-aliases.js +1 -1
- package/dist/core/extensions/extension-hook-runtime.js +1 -1
- package/dist/core/extensions/extension-policy.js +1 -1
- package/dist/core/extensions/extension-registries.js +1 -1
- package/dist/core/extensions/extension-runtime-helpers.js +1 -1
- package/dist/core/extensions/extension-types.d.ts +8 -1
- package/dist/core/extensions/extension-types.js +1 -1
- package/dist/core/extensions/flag-definition-validation.js +1 -1
- package/dist/core/extensions/flag-value-types.js +1 -1
- package/dist/core/extensions/index.js +1 -1
- package/dist/core/extensions/item-field-types.js +1 -1
- package/dist/core/extensions/item-fields.js +1 -1
- package/dist/core/extensions/loader.js +1 -1
- package/dist/core/extensions/manifest-parser.js +1 -1
- package/dist/core/extensions/manifest-schema.js +1 -1
- package/dist/core/extensions/module-graph-snapshot.js +1 -1
- package/dist/core/extensions/preflight-ownership.js +1 -1
- package/dist/core/extensions/registration-contracts.js +1 -1
- package/dist/core/extensions/registration-validation.js +1 -1
- package/dist/core/extensions/registration-values.js +1 -1
- package/dist/core/extensions/reserved-host-flags.js +1 -1
- package/dist/core/extensions/runtime-registrations.js +1 -1
- package/dist/core/extensions/service-ownership.js +1 -1
- package/dist/core/extensions/version-compat.js +1 -1
- package/dist/core/fs/atomic-create.js +1 -1
- package/dist/core/fs/fs-utils.js +2 -2
- package/dist/core/fs/host-environment-errors.js +1 -1
- package/dist/core/fs/index.js +1 -1
- package/dist/core/fs/path-utils.js +1 -1
- package/dist/core/governance/content-fields.js +1 -1
- package/dist/core/governance/issue-codes.js +1 -1
- package/dist/core/governance/metadata-coverage.js +1 -1
- package/dist/core/history/digest.js +1 -1
- package/dist/core/history/drift-cache.js +3 -3
- package/dist/core/history/drift-scan.d.ts +4 -0
- package/dist/core/history/drift-scan.js +1 -1
- package/dist/core/history/event-classification.js +1 -1
- package/dist/core/history/event-index.js +8 -7
- package/dist/core/history/history-compact-bulk.js +1 -1
- package/dist/core/history/history-diff.js +1 -1
- package/dist/core/history/history-rewrite.js +1 -1
- package/dist/core/history/history-storage-stats.js +1 -1
- package/dist/core/history/history-stream-policy.js +1 -1
- package/dist/core/history/history.js +2 -2
- package/dist/core/history/identity.js +1 -1
- package/dist/core/history/index.js +1 -1
- package/dist/core/history/operation-contract.js +1 -1
- package/dist/core/history/projection.js +1 -1
- package/dist/core/history/read.js +1 -1
- package/dist/core/history/replay.js +2 -1
- package/dist/core/history/tombstone.js +1 -1
- package/dist/core/history/version-address.js +1 -1
- package/dist/core/history/workspace-history.js +2 -2
- package/dist/core/io/body-file.js +1 -1
- package/dist/core/io/bulk-ids-input.js +2 -1
- package/dist/core/item/actionability.js +1 -1
- package/dist/core/item/dependency-reference.js +1 -1
- package/dist/core/item/id.js +1 -1
- package/dist/core/item/index.js +1 -1
- package/dist/core/item/item-format-version.js +1 -1
- package/dist/core/item/item-format.js +6 -4
- package/dist/core/item/item-record.js +1 -1
- package/dist/core/item/item-type-definition.js +1 -1
- package/dist/core/item/parent-reference-policy.js +1 -1
- package/dist/core/item/parse.js +8 -2
- package/dist/core/item/plan-lifecycle.js +1 -1
- package/dist/core/item/priority.js +1 -1
- package/dist/core/item/sprint-release-format.js +1 -1
- package/dist/core/item/status-filter.js +1 -1
- package/dist/core/item/status.js +1 -1
- package/dist/core/item/toon-decode.js +1 -1
- package/dist/core/item/type-registry.js +1 -1
- package/dist/core/item/type-synonyms.js +1 -1
- package/dist/core/lock/index.js +1 -1
- package/dist/core/lock/lock-gc.js +1 -1
- package/dist/core/lock/lock.js +3 -3
- package/dist/core/output/mutation-projection.js +1 -1
- package/dist/core/output/output-control.js +1 -1
- package/dist/core/output/output.js +22 -10
- package/dist/core/output/query-summary.js +1 -1
- package/dist/core/output/tabular.js +3 -1
- package/dist/core/packages/manifest.js +1 -1
- package/dist/core/packages/root.js +1 -1
- package/dist/core/policy/workflow-policy-schema.js +1 -1
- package/dist/core/policy/workflow-policy-store.js +1 -1
- package/dist/core/policy/workflow-policy.js +1 -1
- package/dist/core/profile/profile-describe.js +1 -1
- package/dist/core/profile/profile-lint.js +1 -1
- package/dist/core/profile/profile-plan.js +1 -1
- package/dist/core/profile/profile-presets.js +25 -1
- package/dist/core/reproducibility/context.js +1 -1
- package/dist/core/schema/fields-file.js +2 -2
- package/dist/core/schema/item-types-file.js +2 -2
- package/dist/core/schema/runtime-field-filters.js +1 -1
- package/dist/core/schema/runtime-field-values.js +1 -1
- package/dist/core/schema/runtime-schema.js +2 -2
- package/dist/core/schema/status-defs-file.js +2 -2
- package/dist/core/schema/status-token.js +1 -1
- package/dist/core/schema/type-inference.js +1 -1
- package/dist/core/schema/type-presets.js +1 -1
- package/dist/core/schema/type-workflows.js +1 -1
- package/dist/core/search/background-refresh.js +2 -2
- package/dist/core/search/bm25.js +1 -1
- package/dist/core/search/cache.js +2 -2
- package/dist/core/search/corpus.js +1 -1
- package/dist/core/search/embedding-batches.js +1 -1
- package/dist/core/search/eval-thresholds.js +1 -1
- package/dist/core/search/eval.js +1 -1
- package/dist/core/search/http-client.js +1 -1
- package/dist/core/search/providers.js +1 -1
- package/dist/core/search/relevance.js +1 -1
- package/dist/core/search/semantic-defaults.js +1 -1
- package/dist/core/search/staleness.js +1 -1
- package/dist/core/search/vector-stores.js +2 -2
- package/dist/core/search/vectorization-metadata.js +1 -1
- package/dist/core/sentry/helpers.js +1 -1
- package/dist/core/sentry/instrument.js +1 -1
- package/dist/core/session/session-state.js +1 -1
- package/dist/core/shared/agent-session-context.js +1 -1
- package/dist/core/shared/author.js +5 -1
- package/dist/core/shared/command-line.js +1 -1
- package/dist/core/shared/command-types.js +1 -1
- package/dist/core/shared/conflict-markers.js +1 -1
- package/dist/core/shared/constants.js +1 -1
- package/dist/core/shared/errors.js +1 -1
- package/dist/core/shared/html-entity-decode.js +1 -1
- package/dist/core/shared/index.js +1 -1
- package/dist/core/shared/item-metadata-contract.js +1 -1
- package/dist/core/shared/lazy-module.js +1 -1
- package/dist/core/shared/levenshtein.js +1 -1
- package/dist/core/shared/memo.js +1 -1
- package/dist/core/shared/numeric-parsers.js +1 -1
- package/dist/core/shared/option-alias-visibility.js +1 -1
- package/dist/core/shared/primitives.js +1 -1
- package/dist/core/shared/secret-rules.js +1 -1
- package/dist/core/shared/serial-queue.js +1 -1
- package/dist/core/shared/serialization.js +1 -1
- package/dist/core/shared/split-comma-list.js +1 -1
- package/dist/core/shared/text-normalization.js +1 -1
- package/dist/core/shared/time.js +2 -1
- package/dist/core/store/index.js +1 -1
- package/dist/core/store/item-format-migration.js +1 -1
- package/dist/core/store/item-metadata-cache.js +1 -1
- package/dist/core/store/item-metadata-query-index.js +7 -7
- package/dist/core/store/item-metadata-read-work.js +1 -1
- package/dist/core/store/item-store.js +1 -1
- package/dist/core/store/paths.js +1 -1
- package/dist/core/store/settings-concurrency.js +1 -1
- package/dist/core/store/settings-read-cache.js +1 -1
- package/dist/core/store/settings-validator.js +1 -1
- package/dist/core/store/settings.d.ts +11 -2
- package/dist/core/store/settings.js +3 -3
- package/dist/core/store/tracker-preflight.js +1 -1
- package/dist/core/telemetry/consent.js +2 -2
- package/dist/core/telemetry/observability.js +1 -1
- package/dist/core/telemetry/policy.js +1 -1
- package/dist/core/telemetry/read-sampling.js +2 -2
- package/dist/core/telemetry/runtime.js +9 -5
- package/dist/core/test/background-runs.js +3 -3
- package/dist/core/test/item-test-run-tracking.js +1 -1
- package/dist/core/test/run-selectors.js +1 -1
- package/dist/core/validate/estimate-defaults.js +1 -1
- package/dist/core/validate/fix-planning.js +1 -1
- package/dist/core/validate/linked-artifact-reference.js +1 -1
- package/dist/core/validate/missing-by-type.js +1 -1
- package/dist/core/validate/missing-link-owners.js +1 -1
- package/dist/core/validate/stale-file-classification.js +1 -1
- package/dist/mcp/http-server.js +6 -4
- package/dist/mcp/legacy-adapter.js +1 -1
- package/dist/mcp/runtime-capabilities.js +1 -1
- package/dist/mcp/server.js +4 -4
- package/dist/mcp/tool-definitions.js +1 -1
- package/dist/sdk/actionability.js +1 -1
- package/dist/sdk/agent/closed-domain-contracts.js +1 -1
- package/dist/sdk/agent/command-recovery.js +1 -1
- package/dist/sdk/agent/command-suggestions.js +1 -1
- package/dist/sdk/agent/create-option-policy.js +1 -1
- package/dist/sdk/agent/identity-config.js +1 -1
- package/dist/sdk/agent/item-addressing.js +1 -1
- package/dist/sdk/agent/refusal-closure-census.js +2 -1
- package/dist/sdk/agent/refusal-closure.js +1 -1
- package/dist/sdk/agent/refusal-corpus-contracts.js +1 -1
- package/dist/sdk/agent/refusal-reachability.js +3 -1
- package/dist/sdk/agent/subcommand-recovery.js +1 -1
- package/dist/sdk/agent/task-transcript-contracts.js +1 -1
- package/dist/sdk/agent/tracker-preflight-contracts.js +1 -1
- package/dist/sdk/agent-capability-contracts.js +3 -1
- package/dist/sdk/agent-session-context.js +1 -1
- package/dist/sdk/annotations.js +1 -1
- package/dist/sdk/author-attribution.js +1 -1
- package/dist/sdk/authoring.js +1 -1
- package/dist/sdk/cli-bootstrap.js +1 -1
- package/dist/sdk/cli-contracts/agent-output-contracts.js +5 -3
- package/dist/sdk/cli-contracts/bootstrap-command-scanner.js +1 -1
- package/dist/sdk/cli-contracts/command-aliases.js +1 -1
- package/dist/sdk/cli-contracts/command-exit-contracts.js +1 -1
- package/dist/sdk/cli-contracts/commander-mutation-options.js +1 -1
- package/dist/sdk/cli-contracts/commander-types.js +1 -1
- package/dist/sdk/cli-contracts/completeness.js +1 -1
- package/dist/sdk/cli-contracts/enum-contracts.js +1 -1
- package/dist/sdk/cli-contracts/flag-contracts.js +1 -1
- package/dist/sdk/cli-contracts/flag-lexicon-contracts.js +2 -1
- package/dist/sdk/cli-contracts/grammar-contracts.js +1 -1
- package/dist/sdk/cli-contracts/registration-helpers.js +7 -7
- package/dist/sdk/cli-contracts/runtime-contracts.js +1 -1
- package/dist/sdk/cli-contracts/schemas/assurance-definition.js +1 -1
- package/dist/sdk/cli-contracts/string-lists.js +1 -1
- package/dist/sdk/cli-contracts/tool-option-contracts.js +1 -1
- package/dist/sdk/cli-contracts/tool-parameter-tables.js +1 -1
- package/dist/sdk/cli-contracts/tool-schema.js +1 -1
- package/dist/sdk/cli-contracts/typed-action-inputs.js +1 -1
- package/dist/sdk/cli-contracts.js +1 -1
- package/dist/sdk/cli-program.js +1 -1
- package/dist/sdk/command-line.js +1 -1
- package/dist/sdk/comments.js +1 -1
- package/dist/sdk/compile-cache.js +1 -1
- package/dist/sdk/completion/bash.js +2 -1
- package/dist/sdk/completion/fish.js +13 -7
- package/dist/sdk/completion/shared.js +1 -1
- package/dist/sdk/completion/zsh.js +14 -8
- package/dist/sdk/completion.js +1 -1
- package/dist/sdk/compose.js +1 -1
- package/dist/sdk/config.js +1 -1
- package/dist/sdk/context/recency.js +1 -1
- package/dist/sdk/context/semantic-session-attribution.js +1 -1
- package/dist/sdk/context/usage-egress.js +1 -1
- package/dist/sdk/context/usage-ledger.js +6 -3
- package/dist/sdk/context-intent-contracts.js +1 -1
- package/dist/sdk/context-intent-runtime.js +1 -1
- package/dist/sdk/context-packing.js +1 -1
- package/dist/sdk/context-relevance.js +1 -1
- package/dist/sdk/context-signal-store.js +2 -2
- package/dist/sdk/context-usage.js +1 -1
- package/dist/sdk/contracts.js +1 -1
- package/dist/sdk/core-governance.js +1 -1
- package/dist/sdk/core.js +1 -1
- package/dist/sdk/corpus-shape.js +1 -1
- package/dist/sdk/define.js +1 -1
- package/dist/sdk/dependencies.js +1 -1
- package/dist/sdk/dependency-flag-validation.js +1 -1
- package/dist/sdk/dependency-provenance.js +1 -1
- package/dist/sdk/docs.js +1 -1
- package/dist/sdk/duplicates.js +1 -1
- package/dist/sdk/environment/agent-environment.js +1 -1
- package/dist/sdk/environment/host-environment-errors.js +1 -1
- package/dist/sdk/environment/project-runtime-compatibility.js +2 -1
- package/dist/sdk/environment/source-context.js +1 -1
- package/dist/sdk/environment/tracker-preflight.js +1 -1
- package/dist/sdk/error-code-catalog.js +1 -1
- package/dist/sdk/error-runtime.js +1 -1
- package/dist/sdk/errors.js +1 -1
- package/dist/sdk/eval.js +1 -1
- package/dist/sdk/extension/author-manifest.js +1 -1
- package/dist/sdk/extension/bundled-catalog.js +1 -1
- package/dist/sdk/extension/concurrency.js +1 -1
- package/dist/sdk/extension/copy-scope.js +1 -1
- package/dist/sdk/extension/custom-field-collisions.js +1 -1
- package/dist/sdk/extension/describe.js +4 -2
- package/dist/sdk/extension/doctor.js +1 -1
- package/dist/sdk/extension/install-plan.js +1 -1
- package/dist/sdk/extension/install-receipts.js +1 -1
- package/dist/sdk/extension/install-runtime.js +3 -3
- package/dist/sdk/extension/install-snapshot.js +1 -1
- package/dist/sdk/extension/install-sources.js +5 -5
- package/dist/sdk/extension/managed-state.js +2 -2
- package/dist/sdk/extension/migrations.js +2 -2
- package/dist/sdk/extension/output-ownership.js +1 -1
- package/dist/sdk/extension/runtime-summary.js +1 -1
- package/dist/sdk/extension/scaffold.js +11 -4
- package/dist/sdk/extension/shared.js +1 -1
- package/dist/sdk/extension/source-resolution.js +1 -1
- package/dist/sdk/extension/static-inventory.js +1 -1
- package/dist/sdk/extension/update-check.js +1 -1
- package/dist/sdk/extension-command-context.js +1 -1
- package/dist/sdk/extension-contracts.js +1 -1
- package/dist/sdk/extension.js +1 -1
- package/dist/sdk/files.js +1 -1
- package/dist/sdk/flag-invocation-contracts.js +1 -1
- package/dist/sdk/generated/generated-error-code-catalog-part-1.js +1 -1
- package/dist/sdk/generated/generated-error-code-catalog-part-2.js +1 -1
- package/dist/sdk/generated-error-code-catalog.js +1 -1
- package/dist/sdk/governance/assurance-action-contracts.js +1 -1
- package/dist/sdk/governance/assurance-action.js +1 -1
- package/dist/sdk/governance/assurance-limits.js +1 -1
- package/dist/sdk/governance/assurance-mutation-error.js +1 -1
- package/dist/sdk/governance/assurance-presets.js +1 -1
- package/dist/sdk/governance/assurance-runtime.js +1 -1
- package/dist/sdk/governance/assurance.js +4 -4
- package/dist/sdk/governance/boundary-fixtures.js +1 -1
- package/dist/sdk/governance/closure-timestamps.js +1 -1
- package/dist/sdk/governance/coverage-assurance.js +1 -1
- package/dist/sdk/governance/defect-recurrence-coverage.js +1 -1
- package/dist/sdk/governance/defect-recurrence-graph.js +1 -1
- package/dist/sdk/governance/defect-recurrence-signals.js +1 -1
- package/dist/sdk/governance/defect-recurrence.js +1 -1
- package/dist/sdk/governance/extension-host-version.js +1 -1
- package/dist/sdk/governance/gc.js +1 -1
- package/dist/sdk/governance/health-merge-evidence.js +1 -1
- package/dist/sdk/governance/health.js +2 -1
- package/dist/sdk/governance/hierarchy-validation.js +1 -1
- package/dist/sdk/governance/linked-file-report.js +1 -1
- package/dist/sdk/governance/merge-receipt-history.js +1 -1
- package/dist/sdk/governance/provenance-health.js +4 -1
- package/dist/sdk/governance/reindex.js +5 -4
- package/dist/sdk/governance/stale-work.js +1 -1
- package/dist/sdk/governance/status-role-diagnostics.js +1 -1
- package/dist/sdk/governance/storage-integrity.js +1 -1
- package/dist/sdk/governance/tracked-runtime-cache.js +1 -1
- package/dist/sdk/governance/upgrade.js +2 -2
- package/dist/sdk/governance/validate-history-drift.js +1 -1
- package/dist/sdk/governance/validate-item-reader.js +1 -1
- package/dist/sdk/governance/validate-normalization.js +1 -1
- package/dist/sdk/governance/validate.js +1 -1
- package/dist/sdk/governance/workflow-completeness.js +1 -1
- package/dist/sdk/governance/workflow-policy.js +3 -3
- package/dist/sdk/governance/workspace-position.js +2 -1
- package/dist/sdk/governance.js +1 -1
- package/dist/sdk/graph/adapter.js +1 -1
- package/dist/sdk/graph/analytics.js +1 -1
- package/dist/sdk/graph/assembly.js +1 -1
- package/dist/sdk/graph/cache.js +1 -1
- package/dist/sdk/graph/centrality.js +1 -1
- package/dist/sdk/graph/conformance.js +1 -1
- package/dist/sdk/graph/deadline-scheduling.js +1 -1
- package/dist/sdk/graph/durable-cache.js +1 -1
- package/dist/sdk/graph/governance-contracts.js +1 -1
- package/dist/sdk/graph/governance.js +1 -1
- package/dist/sdk/graph/hierarchy-integrity.js +1 -1
- package/dist/sdk/graph/index.js +1 -1
- package/dist/sdk/graph/lifecycle-coverage.js +1 -1
- package/dist/sdk/graph/mutation-advisory.js +1 -1
- package/dist/sdk/graph/query-contracts.js +1 -1
- package/dist/sdk/graph/remediation.js +1 -1
- package/dist/sdk/graph/run.js +1 -1
- package/dist/sdk/graph/scheduling.js +1 -1
- package/dist/sdk/graph/traversal.js +1 -1
- package/dist/sdk/graph/workspace-relationship-kind-registry.js +1 -1
- package/dist/sdk/graph.js +1 -1
- package/dist/sdk/guide-topics.js +1 -1
- package/dist/sdk/guide.js +8 -1
- package/dist/sdk/history/attestation-command.js +1 -1
- package/dist/sdk/history/attestation-contract.js +1 -1
- package/dist/sdk/history/attestation-scan.js +1 -1
- package/dist/sdk/history/attestation.js +1 -1
- package/dist/sdk/history/maintenance.js +1 -1
- package/dist/sdk/history/salvage.js +3 -2
- package/dist/sdk/history/subject.js +1 -1
- package/dist/sdk/history-analytics.js +1 -1
- package/dist/sdk/history-compact.js +1 -1
- package/dist/sdk/history-mcp.js +1 -1
- package/dist/sdk/history-provenance.js +1 -1
- package/dist/sdk/history-read.js +1 -1
- package/dist/sdk/history-redact.js +1 -1
- package/dist/sdk/history-repair.js +1 -1
- package/dist/sdk/improvement-ledger-validation.js +1 -1
- package/dist/sdk/improvement-ledger.js +2 -2
- package/dist/sdk/index.js +1 -1
- package/dist/sdk/init-agent-guidance.js +16 -2
- package/dist/sdk/init.js +16 -2
- package/dist/sdk/invocation-author.js +1 -1
- package/dist/sdk/item-children.js +1 -1
- package/dist/sdk/item-metadata-index.js +1 -1
- package/dist/sdk/item-schedule.js +1 -1
- package/dist/sdk/item-transaction.js +1 -1
- package/dist/sdk/learnings.js +1 -1
- package/dist/sdk/lifecycle/append.js +4 -2
- package/dist/sdk/lifecycle/claim.js +1 -1
- package/dist/sdk/lifecycle/close-many.js +1 -1
- package/dist/sdk/lifecycle/close.js +1 -1
- package/dist/sdk/lifecycle/copy.js +1 -1
- package/dist/sdk/lifecycle/create.js +1 -1
- package/dist/sdk/lifecycle/delete.js +1 -1
- package/dist/sdk/lifecycle/event-validation-messages.js +1 -1
- package/dist/sdk/lifecycle/focus.js +1 -1
- package/dist/sdk/lifecycle/hierarchy-mutation-lock.js +1 -1
- package/dist/sdk/lifecycle/legacy-none-tokens.js +1 -1
- package/dist/sdk/lifecycle/lifecycle-transitions.js +1 -1
- package/dist/sdk/lifecycle/mcp-actions.js +1 -1
- package/dist/sdk/lifecycle/metadata-normalizers.js +1 -1
- package/dist/sdk/lifecycle/mutation-command-options.js +1 -1
- package/dist/sdk/lifecycle/plan-mutation-receipt.js +1 -1
- package/dist/sdk/lifecycle/plan.js +1 -1
- package/dist/sdk/lifecycle/recurrence-parsers.js +1 -1
- package/dist/sdk/lifecycle/reopen.js +1 -1
- package/dist/sdk/lifecycle/repeatable-metadata-parsers.js +2 -1
- package/dist/sdk/lifecycle/restore.js +1 -1
- package/dist/sdk/lifecycle/shared-unset-fields.js +1 -1
- package/dist/sdk/lifecycle/task-composition.js +1 -1
- package/dist/sdk/lifecycle/update-many.js +1 -1
- package/dist/sdk/lifecycle/update.js +2 -1
- package/dist/sdk/lifecycle-completion.js +1 -1
- package/dist/sdk/lifecycle-policy.js +1 -1
- package/dist/sdk/linked-artifacts.js +2 -1
- package/dist/sdk/mcp/apps.js +1 -1
- package/dist/sdk/mcp/authorization.js +1 -1
- package/dist/sdk/mcp/discovery.js +1 -1
- package/dist/sdk/mcp/interactions.js +1 -1
- package/dist/sdk/mcp/protocol.js +1 -1
- package/dist/sdk/mcp/skills.js +3 -1
- package/dist/sdk/mcp/subscriptions.js +1 -1
- package/dist/sdk/mcp/tasks.js +2 -2
- package/dist/sdk/mcp/transport.js +1 -1
- package/dist/sdk/merge/abandoned-receipts.js +1 -1
- package/dist/sdk/merge/driver.js +1 -1
- package/dist/sdk/merge/index.js +1 -1
- package/dist/sdk/merge/install.js +4 -2
- package/dist/sdk/merge/receipt-file-boundary.js +1 -1
- package/dist/sdk/merge/receipt-operation.js +1 -1
- package/dist/sdk/merge/receipt-schema.js +1 -1
- package/dist/sdk/merge/receipts.js +4 -4
- package/dist/sdk/merge/reconcile.js +1 -1
- package/dist/sdk/merge/three-way.js +3 -2
- package/dist/sdk/merge/worktree-config.js +1 -1
- package/dist/sdk/merge.js +1 -1
- package/dist/sdk/mutation-events.js +1 -1
- package/dist/sdk/mutation-guard.js +1 -1
- package/dist/sdk/notes.js +1 -1
- package/dist/sdk/output-contracts.js +1 -1
- package/dist/sdk/output-projection.js +1 -1
- package/dist/sdk/output-token-accounting.js +1 -1
- package/dist/sdk/output.js +2 -1
- package/dist/sdk/ownership-source.js +1 -1
- package/dist/sdk/package-import-adapters.js +1 -1
- package/dist/sdk/package-migrations.js +1 -1
- package/dist/sdk/package-runtime-options.js +1 -1
- package/dist/sdk/pagination.js +1 -1
- package/dist/sdk/profile.js +5 -1
- package/dist/sdk/provenance.js +1 -1
- package/dist/sdk/public-surface.json +1 -1
- package/dist/sdk/query/activity.js +1 -1
- package/dist/sdk/query/aggregate.js +1 -1
- package/dist/sdk/query/calendar.js +4 -1
- package/dist/sdk/query/complete-list.js +1 -1
- package/dist/sdk/query/context.js +2 -1
- package/dist/sdk/query/duplicate-candidates.js +1 -1
- package/dist/sdk/query/get.d.ts +14 -2
- package/dist/sdk/query/get.js +1 -1
- package/dist/sdk/query/history.js +1 -1
- package/dist/sdk/query/item-filter-options.js +1 -1
- package/dist/sdk/query/light-metadata.js +1 -1
- package/dist/sdk/query/list-filter-shared.js +1 -1
- package/dist/sdk/query/list.js +1 -1
- package/dist/sdk/query/multi-value-filters.js +1 -1
- package/dist/sdk/query/next-ready-budget.js +1 -1
- package/dist/sdk/query/next.js +2 -1
- package/dist/sdk/query/parsers.js +1 -1
- package/dist/sdk/query/projection-contracts.js +1 -1
- package/dist/sdk/query/search/corpus.js +2 -1
- package/dist/sdk/query/search/filters.js +1 -1
- package/dist/sdk/query/search/input.js +1 -1
- package/dist/sdk/query/search/lexical.js +1 -1
- package/dist/sdk/query/search/response.js +1 -1
- package/dist/sdk/query/search/semantic.js +3 -2
- package/dist/sdk/query/search/types.js +1 -1
- package/dist/sdk/query/search-contracts.js +1 -1
- package/dist/sdk/query/search-pagination.d.ts +1 -1
- package/dist/sdk/query/search-pagination.js +1 -1
- package/dist/sdk/query/search-rendering.js +1 -1
- package/dist/sdk/query/search.js +1 -1
- package/dist/sdk/query/workspace-contracts.js +1 -1
- package/dist/sdk/query.js +1 -1
- package/dist/sdk/read-output/continuation.js +1 -1
- package/dist/sdk/read-output/options.js +1 -1
- package/dist/sdk/read-output/provenance.js +1 -1
- package/dist/sdk/read-output-budget.js +1 -1
- package/dist/sdk/read-output-contracts.js +1 -1
- package/dist/sdk/read-output-rows.js +1 -1
- package/dist/sdk/read-output-session.js +1 -1
- package/dist/sdk/relationship-analytics.js +1 -1
- package/dist/sdk/relationship-context.js +1 -1
- package/dist/sdk/relationship-history.js +7 -4
- package/dist/sdk/relationship-kinds/contract.js +1 -1
- package/dist/sdk/relationship-migration.js +1 -1
- package/dist/sdk/relationships.js +1 -1
- package/dist/sdk/reproducibility/process.js +1 -1
- package/dist/sdk/runtime/actions.js +1 -1
- package/dist/sdk/runtime/context.js +1 -1
- package/dist/sdk/runtime/schema-preview.js +1 -1
- package/dist/sdk/runtime/schema.js +1 -1
- package/dist/sdk/runtime-action-aliases.js +1 -1
- package/dist/sdk/runtime-extended-actions.js +1 -1
- package/dist/sdk/runtime-input.js +1 -1
- package/dist/sdk/runtime-primitives.js +1 -1
- package/dist/sdk/runtime-public-contracts.js +1 -1
- package/dist/sdk/runtime-stats-options.js +1 -1
- package/dist/sdk/runtime.js +1 -1
- package/dist/sdk/scheduling-shortcuts.js +1 -1
- package/dist/sdk/schema-migration.js +4 -3
- package/dist/sdk/schema.js +7 -1
- package/dist/sdk/search-refresh-worker.js +1 -1
- package/dist/sdk/similarity-scoring.js +1 -1
- package/dist/sdk/similarity.js +1 -1
- package/dist/sdk/start-task-status.js +1 -1
- package/dist/sdk/stats.js +1 -1
- package/dist/sdk/structured-mutations.js +1 -1
- package/dist/sdk/telemetry-flush.js +1 -1
- package/dist/sdk/telemetry.js +4 -3
- package/dist/sdk/templates.js +26 -2
- package/dist/sdk/test/batch.js +2 -2
- package/dist/sdk/test/entry.js +1 -1
- package/dist/sdk/test/execution.js +6 -5
- package/dist/sdk/test/json-path.js +1 -1
- package/dist/sdk/test/linked-command-detection.js +1 -1
- package/dist/sdk/test/measurements.js +1 -1
- package/dist/sdk/test/parsers.js +1 -1
- package/dist/sdk/test/runs.js +1 -1
- package/dist/sdk/test/trust.js +2 -2
- package/dist/sdk/test/workspace-snapshot.js +1 -1
- package/dist/sdk/testing.js +7 -4
- package/dist/sdk/traceability/runtime-files-lookup.js +1 -1
- package/dist/sdk/traceability/source-traceability.js +2 -1
- package/dist/sdk/tracker-root-discovery.js +1 -1
- package/dist/sdk/workspace-contracts-cache.js +1 -1
- package/dist/sdk/workspace-contracts.js +1 -1
- package/dist/sdk/workspace-memory.js +2 -2
- package/dist/sdk/workspace-recipe.js +1 -1
- package/dist/sdk/workspace-snapshot.js +5 -4
- package/dist/sdk/workspace-transaction-gc.js +1 -1
- package/dist/sdk/workspace-transaction.js +2 -2
- package/dist/sdk/workspace.js +3 -2
- package/dist/types/index.js +1 -1
- package/dist/types.js +1 -1
- package/docs/AGENT_EVIDENCE_CONSISTENCY.md +88 -0
- package/docs/DIAGNOSTIC_OUTPUT_CONTRACTS.md +25 -0
- package/docs/GET_READ_EVIDENCE.md +68 -0
- package/docs/OUTPUT_PROJECTION_CONTRACTS.md +23 -0
- package/docs/README.md +2 -0
- package/docs/SDK_AUDITED_MUTATIONS.md +35 -0
- package/docs/TESTING.md +8 -0
- package/docs/ecosystem-review-2026-09-28.json +2864 -3157
- package/marketplace.json +2 -2
- package/package.json +1 -1
- package/packages/pm-beads/package.json +1 -1
- package/packages/pm-calendar/package.json +1 -1
- package/packages/pm-command-kit/package.json +1 -1
- package/packages/pm-digital-twin/package.json +1 -1
- package/packages/pm-governance-audit/package.json +1 -1
- package/packages/pm-guide-shell/package.json +1 -1
- package/packages/pm-kanban/package.json +1 -1
- package/packages/pm-lifecycle-hooks/package.json +1 -1
- package/packages/pm-linked-test-adapters/package.json +1 -1
- package/packages/pm-search-advanced/package.json +1 -1
- package/packages/pm-templates/package.json +1 -1
- package/packages/pm-todos/package.json +1 -1
- package/packages/pm-vcs/extensions/vcs/index.ts +4 -2
- package/packages/pm-vcs/package.json +1 -1
- package/plugins/pm-claude/.claude-plugin/plugin.json +1 -1
- package/plugins/pm-claude/package.json +2 -2
- package/plugins/pm-codex/.codex-plugin/plugin.json +1 -1
- package/plugins/pm-codex/package.json +2 -2
- package/plugins/pm-codex/plugin.json +1 -1
- package/scripts/finalize-build.mjs +3 -2
- package/dist/cli-bundle/chunks/chunk-3AF2R3Y6.js +0 -6
- package/dist/cli-bundle/chunks/chunk-6ST3SCQ6.js +0 -2
- package/dist/cli-bundle/chunks/chunk-6Z4IV2MC.js +0 -8
- package/dist/cli-bundle/chunks/chunk-DEZPZOQ7.js +0 -2
- package/dist/cli-bundle/chunks/chunk-FW5LJXQY.js +0 -31
- package/dist/cli-bundle/chunks/chunk-H2DZW6I6.js +0 -3
- package/dist/cli-bundle/chunks/chunk-H7CXQBGQ.js +0 -2
- package/dist/cli-bundle/chunks/chunk-KP7NBQK3.js +0 -80
- package/dist/cli-bundle/chunks/chunk-MKXBCBAN.js +0 -20
- package/dist/cli-bundle/chunks/chunk-QPKQKSQU.js +0 -238
- package/dist/cli-bundle/chunks/chunk-SGFQQXFD.js +0 -2
- package/dist/cli-bundle/chunks/chunk-YCBGZF3T.js +0 -2
- package/dist/cli-bundle/chunks/chunk-YDWKGUQU.js +0 -3
- package/dist/cli-bundle/chunks/register-mutation-5PT3NW3A.js +0 -20
- package/dist/cli-bundle/chunks/register-operations-QDDQOAAV.js +0 -2
- package/dist/cli-bundle/chunks/register-setup-BBX67YMA.js +0 -2
- package/dist/cli-bundle/focused-chunks/chunk-4FFPGNCJ.js +0 -6
- package/dist/cli-bundle/focused-chunks/chunk-73DA7ISY.js +0 -75
- package/dist/cli-bundle/focused-chunks/chunk-E754JDLY.js +0 -2
- package/dist/cli-bundle/focused-chunks/chunk-FKK2HI3S.js +0 -2
- package/dist/cli-bundle/focused-chunks/chunk-GMYUNHST.js +0 -3
- package/dist/cli-bundle/focused-chunks/chunk-HIA2ZF64.js +0 -12
- package/dist/cli-bundle/focused-chunks/chunk-UTRSM3ZK.js +0 -8
- package/dist/cli-bundle/focused-chunks/chunk-VVWYI2X7.js +0 -2
- package/dist/cli-bundle/focused-chunks/chunk-WAJNX4RN.js +0 -20
- package/dist/cli-bundle/focused-chunks/chunk-WCY6HRZO.js +0 -30
- package/dist/cli-bundle/focused-chunks/chunk-YC32ZSLS.js +0 -165
- package/dist/cli-bundle/focused-chunks/chunk-ZIXFMIUL.js +0 -3
|
@@ -1,2 +1,2 @@
|
|
|
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]="03488490-bc4a-5988-9ceb-46800c6d7833")}catch(e2){}})();import{assertInitializedTracker}from"../environment/tracker-preflight.js";import{isFileMissingError}from"../../core/fs/fs-utils.js";import fs from"node:fs/promises";import path from"node:path";import{getActiveExtensionRegistrations,runActiveOnReadHooks,enforceHistoryStreamPolicyForItems,resolveItemTypeRegistry,EXIT_CODE,PmCliError,compareTimestampStrings,nowIso,resolveIsoOrRelative,listAllItemMetadataLight,resolvePmRoot,readSettings}from"../runtime-primitives.js";import{readHistoryEntries}from"../history-read.js";import{parseLimit}from"./parsers.js";import{resolveModePairedOutputOmissionReceipt}from"../output-projection.js";import{compileHistoryProvenanceMatcher,projectHistoryProvenance,resolveHistoryProvenanceDimensions,summarizeHistoryProvenance}from"../history-provenance.js";const DEFAULT_COMPACT_ACTIVITY_LIMIT=20;const DEFAULT_FULL_ACTIVITY_LIMIT=5;const DEFAULT_DIGEST_ACTIVITY_LIMIT=15;const DEFAULT_DIGEST_WINDOW="-24h";function normalizeActivityProjectionOptions(options){const normalized={...options};if(normalized.full===true){normalized.raw=true;normalized.compact=false}else if(normalized.raw===true&&normalized.compact===void 0){normalized.compact=true}delete normalized.full;return normalized}const ACTIVITY_ROW_KEY_BY_MODE={digest:"activity_digest",compact:"compact_activity",provenance:"provenance_activity",full:"activity"};function parseNonEmptyFilter(raw,flagLabel){if(raw===void 0)return void 0;const normalized=raw.trim();if(normalized.length===0){throw new PmCliError(`${flagLabel} must not be empty`,EXIT_CODE.USAGE)}return normalized}function parseRangeBound(raw,nowValue,fieldLabel){if(raw===void 0)return void 0;const normalized=raw.trim();if(normalized.length===0){throw new PmCliError("Activity time bounds must not be empty",EXIT_CODE.USAGE)}const relativeInput=fieldLabel==="--from"&&/^\d+[hdwm]$/iu.test(normalized)?`-${normalized}`:normalized;return resolveIsoOrRelative(relativeInput,new Date(nowValue),fieldLabel)}function includeByTimeWindow(entry,from,to){if(entry.ts.length===0&&(from||to)){return false}if(from&&compareTimestampStrings(entry.ts,from)<0){return false}if(to&&compareTimestampStrings(entry.ts,to)>=0){return false}return true}function limitEntries(values,limit){if(limit===void 0)return values;return values.slice(0,limit)}function readActivityString(value,fallback=""){return typeof value==="string"?value:fallback}function normalizeActivityEntry(id,entry){return{...entry,id,ts:readActivityString(entry.ts),author:readActivityString(entry.author,"unknown"),op:readActivityString(entry.op,"unknown"),patch:Array.isArray(entry.patch)?entry.patch:[],before_hash:readActivityString(entry.before_hash),after_hash:readActivityString(entry.after_hash)}}function sortActivity(entries){return[...entries].sort((a,b)=>{const byTimestamp=b.ts.localeCompare(a.ts);if(byTimestamp!==0)return byTimestamp;const byId=a.id.localeCompare(b.id);if(byId!==0)return byId;return a.op.localeCompare(b.op)})}async function listHistoryFiles(historyDir){try{return(await fs.readdir(historyDir)).filter(entry=>entry.endsWith(".jsonl")).sort((a,b)=>a.localeCompare(b))}catch(error){if(isFileMissingError(error)){return[]}throw error}}function resolveActivityProjectionMode(options){if(options.raw!==true&&options.compact!==true&&options.provenance!==true){return"digest"}if(options.provenance===true)return"provenance";if(options.compact===true||options.raw===true&&options.compact!==false){return"compact"}return"full"}function resolveActivityLimit(options,explicitLimit,projectionMode){if(options.unbounded===true)return void 0;if(explicitLimit!==void 0)return explicitLimit;if(projectionMode==="digest")return DEFAULT_DIGEST_ACTIVITY_LIMIT;if(projectionMode==="compact")return DEFAULT_COMPACT_ACTIVITY_LIMIT;return DEFAULT_FULL_ACTIVITY_LIMIT}function resolveActivityFilters(options,projectionMode){const nowValue=nowIso();const digest=projectionMode==="digest";const to=parseRangeBound(options.to??(digest?nowValue:void 0),nowValue,"--to");const from=parseRangeBound(options.from??(digest?DEFAULT_DIGEST_WINDOW:void 0),options.from===void 0&&digest?to:nowValue,"--from");if(from&&to&&compareTimestampStrings(from,to)>=0){throw new PmCliError("Activity --from must be before --to",EXIT_CODE.USAGE)}const explicitLimit=parseLimit(options.limit);if(options.unbounded===true&&explicitLimit!==void 0){throw new PmCliError("Activity --unbounded cannot be combined with --limit",EXIT_CODE.USAGE)}return{id:parseNonEmptyFilter(options.id,"Activity --id"),op:parseNonEmptyFilter(options.op,"Activity --op"),author:parseNonEmptyFilter(options.author,"Activity --author"),from,to,limit:resolveActivityLimit(options,explicitLimit,projectionMode),limitSource:options.unbounded===true||explicitLimit!==void 0?"explicit":"default",harness:options.harness,agentInstance:options.agentInstance,provenance:options.provenanceFilter}}async function resolveActivityRuntimeContext(global2){const pmRoot=resolvePmRoot(process.cwd(),global2.path);await assertInitializedTracker(pmRoot);return{pmRoot,settings:await readSettings(pmRoot)}}async function prepareActivityHistoryRead(context){const typeRegistry=resolveItemTypeRegistry(context.settings,getActiveExtensionRegistrations());const items=await listAllItemMetadataLight(context.pmRoot,context.settings.item_format,typeRegistry.type_to_folder,void 0,context.settings.schema);await enforceHistoryStreamPolicyForItems({pmRoot:context.pmRoot,settings:context.settings,itemIds:items.map(item=>item.id),commandLabel:"activity"});const historyDir=path.join(context.pmRoot,"history");await runActiveOnReadHooks({path:historyDir,scope:"project"});return{historyDir,itemsById:new Map(items.map(item=>[item.id,{title:item.title,type:item.type,status:item.status}]))}}function includeActivityEntry(entry,candidate,filters){if(filters.op&&entry.op!==filters.op){return false}if(filters.author&&entry.author!==filters.author){return false}return includeByTimeWindow(candidate,filters.from,filters.to)}async function collectActivityEntries(historyDir,filters){const combined=[];for(const file of await listHistoryFiles(historyDir)){const id=file.slice(0,-".jsonl".length);if(filters.id&&id!==filters.id){continue}const entries=await readHistoryEntries(path.join(historyDir,file),id);for(const entry of entries){const candidate=normalizeActivityEntry(id,entry);if(includeActivityEntry(entry,candidate,filters)){combined.push(candidate)}}}return combined}function formatCompactActivity(activity){return activity.map(entry=>({id:entry.id,op:entry.op,ts:entry.ts,author:entry.author,...entry.message?{msg:entry.message}:{}}))}function boundedOperationSummary(counts){const ordered=[...counts.entries()].sort(([leftOp,leftCount],[rightOp,rightCount])=>rightCount-leftCount||leftOp.localeCompare(rightOp));const visible=ordered.slice(0,4).map(([op,count])=>`${op}:${count}`);if(ordered.length>visible.length){visible.push(`+${ordered.length-visible.length}`)}return visible.join(",")}function buildActivityDigest(activity,itemsById){const grouped=new Map;for(const entry of activity){const current=grouped.get(entry.id);if(current===void 0){grouped.set(entry.id,{firstTs:entry.ts,lastTs:entry.ts,eventCount:1,operations:new Map([[entry.op,1]])});continue}current.eventCount+=1;if(compareTimestampStrings(entry.ts,current.firstTs)<0){current.firstTs=entry.ts}if(compareTimestampStrings(entry.ts,current.lastTs)>0){current.lastTs=entry.ts}current.operations.set(entry.op,(current.operations.get(entry.op)??0)+1)}return[...grouped.entries()].map(([id,summary])=>{const item=itemsById.get(id);return{id,type:item?.type??"unknown",status:item?.status??"unknown",title:(item?.title??"(item metadata unavailable)").slice(0,160),event_count:summary.eventCount,first_ts:summary.firstTs,last_ts:summary.lastTs,operations:boundedOperationSummary(summary.operations)}}).sort((left,right)=>compareTimestampStrings(right.last_ts,left.last_ts)||left.id.localeCompare(right.id))}function activityOperationCounts(activity){const counts=new Map;for(const entry of activity){counts.set(entry.op,(counts.get(entry.op)??0)+1)}const ordered=[...counts.entries()].sort((left,right)=>right[1]-left[1]||left[0].localeCompare(right[0]));const visible=ordered.slice(0,8);if(visible.length<ordered.length){visible.push([`+${String(ordered.length-visible.length)}`,ordered.slice(visible.length).reduce((total,[,count])=>total+count,0)])}return Object.fromEntries(visible)}function projectActivityRows(projectionMode,matchingActivity,limit,itemsById,projectProvenance){if(projectionMode==="digest"){const matchingDigest=buildActivityDigest(matchingActivity,itemsById);const activityDigest=limitEntries(matchingDigest,limit);return{rows:{activity_digest:activityDigest},compact:false,totalRows:matchingDigest.length,returnedRows:activityDigest.length}}const activity=limitEntries(matchingActivity,limit);if(projectionMode==="compact"){return{rows:{compact_activity:formatCompactActivity(activity)},compact:true,totalRows:matchingActivity.length,returnedRows:activity.length}}if(projectionMode==="provenance"){return{rows:{provenance_activity:activity.map(projectProvenance)},compact:false,totalRows:matchingActivity.length,returnedRows:activity.length}}return{rows:{activity},compact:false,totalRows:matchingActivity.length,returnedRows:activity.length}}const _testOnly={parseNonEmptyFilter,parseRangeBound,includeByTimeWindow,limitEntries,readActivityString,normalizeActivityEntry,sortActivity,listHistoryFiles,buildActivityDigest,activityOperationCounts};async function runActivity(options,global2){const context=await resolveActivityRuntimeContext(global2);const projectionMode=resolveActivityProjectionMode(options);const filters=resolveActivityFilters(options,projectionMode);const prepared=await prepareActivityHistoryRead(context);const provenanceDimensions=resolveHistoryProvenanceDimensions(context.settings.agent_identity.harness_signals);const vocabulary=context.settings.agent_identity.identity_vocabulary;const matchesProvenance=compileHistoryProvenanceMatcher({harness:filters.harness,agentInstance:filters.agentInstance,provenance:filters.provenance},vocabulary,provenanceDimensions);const matchingActivity=sortActivity(await collectActivityEntries(prepared.historyDir,filters)).filter(matchesProvenance);const projected=projectActivityRows(projectionMode,matchingActivity,filters.limit,prepared.itemsById,entry=>projectHistoryProvenance(entry,vocabulary,{itemId:entry.id}));const omittedCount=projected.totalRows-projected.returnedRows;return{...projected.rows,compact:projected.compact,projection:{mode:projectionMode,row_key:ACTIVITY_ROW_KEY_BY_MODE[projectionMode]},omission_receipt:resolveModePairedOutputOmissionReceipt("activity",projectionMode),count:projected.returnedRows,total_count:projected.totalRows,limit:filters.limit??null,omitted_count:omittedCount,has_more:omittedCount>0,...projectionMode==="digest"?{activity_summary:{window:{from:filters.from,to:filters.to},event_count:matchingActivity.length,item_count:projected.totalRows,author_count:new Set(matchingActivity.map(entry=>entry.author)).size,operation_counts:activityOperationCounts(matchingActivity)}}:{},...options.provenanceSummary===true?{provenance_summary:summarizeHistoryProvenance(matchingActivity,vocabulary,provenanceDimensions)}:{},applied_bound:{kind:filters.limit===void 0?"unbounded":"limit",source:filters.limitSource,value:filters.limit??null}}}export{_testOnly,normalizeActivityProjectionOptions,runActivity};
|
|
1
|
+
(function(){try{var e=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},n=new e.Error().stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="a4394793-55d4-5049-ab20-707c1c3d9f2c")}catch{}})();import{assertInitializedTracker}from"../environment/tracker-preflight.js";import{isFileMissingError}from"../../core/fs/fs-utils.js";import fs from"node:fs/promises";import path from"node:path";import{getActiveExtensionRegistrations,runActiveOnReadHooks,enforceHistoryStreamPolicyForItems,resolveItemTypeRegistry,EXIT_CODE,PmCliError,compareTimestampStrings,nowIso,resolveIsoOrRelative,listAllItemMetadataLight,resolvePmRoot,readSettings}from"../runtime-primitives.js";import{readHistoryEntries}from"../history-read.js";import{parseLimit}from"./parsers.js";import{resolveModePairedOutputOmissionReceipt}from"../output-projection.js";import{compileHistoryProvenanceMatcher,projectHistoryProvenance,resolveHistoryProvenanceDimensions,summarizeHistoryProvenance}from"../history-provenance.js";const DEFAULT_COMPACT_ACTIVITY_LIMIT=20,DEFAULT_FULL_ACTIVITY_LIMIT=5,DEFAULT_DIGEST_ACTIVITY_LIMIT=15,DEFAULT_DIGEST_WINDOW="-24h";function normalizeActivityProjectionOptions(options){const normalized={...options};return normalized.full===!0?(normalized.raw=!0,normalized.compact=!1):normalized.raw===!0&&normalized.compact===void 0&&(normalized.compact=!0),delete normalized.full,normalized}const ACTIVITY_ROW_KEY_BY_MODE={digest:"activity_digest",compact:"compact_activity",provenance:"provenance_activity",full:"activity"};function parseNonEmptyFilter(raw,flagLabel){if(raw===void 0)return;const normalized=raw.trim();if(normalized.length===0)throw new PmCliError(`${flagLabel} must not be empty`,EXIT_CODE.USAGE);return normalized}function parseRangeBound(raw,nowValue,fieldLabel){if(raw===void 0)return;const normalized=raw.trim();if(normalized.length===0)throw new PmCliError("Activity time bounds must not be empty",EXIT_CODE.USAGE);const relativeInput=fieldLabel==="--from"&&/^\d+[hdwm]$/iu.test(normalized)?`-${normalized}`:normalized;return resolveIsoOrRelative(relativeInput,new Date(nowValue),fieldLabel)}function includeByTimeWindow(entry,from,to){return!(entry.ts.length===0&&(from||to)||from&&compareTimestampStrings(entry.ts,from)<0||to&&compareTimestampStrings(entry.ts,to)>=0)}function limitEntries(values,limit){return limit===void 0?values:values.slice(0,limit)}function readActivityString(value,fallback=""){return typeof value=="string"?value:fallback}function normalizeActivityEntry(id,entry){return{...entry,id,ts:readActivityString(entry.ts),author:readActivityString(entry.author,"unknown"),op:readActivityString(entry.op,"unknown"),patch:Array.isArray(entry.patch)?entry.patch:[],before_hash:readActivityString(entry.before_hash),after_hash:readActivityString(entry.after_hash)}}function sortActivity(entries){return[...entries].sort((a,b)=>{const byTimestamp=b.ts.localeCompare(a.ts);if(byTimestamp!==0)return byTimestamp;const byId=a.id.localeCompare(b.id);return byId!==0?byId:a.op.localeCompare(b.op)})}async function listHistoryFiles(historyDir){try{return(await fs.readdir(historyDir)).filter(entry=>entry.endsWith(".jsonl")).sort((a,b)=>a.localeCompare(b))}catch(error){if(isFileMissingError(error))return[];throw error}}function resolveActivityProjectionMode(options){return options.raw!==!0&&options.compact!==!0&&options.provenance!==!0?"digest":options.provenance===!0?"provenance":options.compact===!0||options.raw===!0&&options.compact!==!1?"compact":"full"}function resolveActivityLimit(options,explicitLimit,projectionMode){if(options.unbounded!==!0)return explicitLimit!==void 0?explicitLimit:projectionMode==="digest"?DEFAULT_DIGEST_ACTIVITY_LIMIT:projectionMode==="compact"?DEFAULT_COMPACT_ACTIVITY_LIMIT:DEFAULT_FULL_ACTIVITY_LIMIT}function resolveActivityFilters(options,projectionMode){const nowValue=nowIso(),digest=projectionMode==="digest",to=parseRangeBound(options.to??(digest?nowValue:void 0),nowValue,"--to"),from=parseRangeBound(options.from??(digest?DEFAULT_DIGEST_WINDOW:void 0),options.from===void 0&&digest?to:nowValue,"--from");if(from&&to&&compareTimestampStrings(from,to)>=0)throw new PmCliError("Activity --from must be before --to",EXIT_CODE.USAGE);const explicitLimit=parseLimit(options.limit);if(options.unbounded===!0&&explicitLimit!==void 0)throw new PmCliError("Activity --unbounded cannot be combined with --limit",EXIT_CODE.USAGE);return{id:parseNonEmptyFilter(options.id,"Activity --id"),op:parseNonEmptyFilter(options.op,"Activity --op"),author:parseNonEmptyFilter(options.author,"Activity --author"),from,to,limit:resolveActivityLimit(options,explicitLimit,projectionMode),limitSource:options.unbounded===!0||explicitLimit!==void 0?"explicit":"default",harness:options.harness,agentInstance:options.agentInstance,provenance:options.provenanceFilter}}async function resolveActivityRuntimeContext(global2){const pmRoot=resolvePmRoot(process.cwd(),global2.path);return await assertInitializedTracker(pmRoot),{pmRoot,settings:await readSettings(pmRoot)}}async function prepareActivityHistoryRead(context){const typeRegistry=resolveItemTypeRegistry(context.settings,getActiveExtensionRegistrations()),items=await listAllItemMetadataLight(context.pmRoot,context.settings.item_format,typeRegistry.type_to_folder,void 0,context.settings.schema);await enforceHistoryStreamPolicyForItems({pmRoot:context.pmRoot,settings:context.settings,itemIds:items.map(item=>item.id),commandLabel:"activity"});const historyDir=path.join(context.pmRoot,"history");return await runActiveOnReadHooks({path:historyDir,scope:"project"}),{historyDir,itemsById:new Map(items.map(item=>[item.id,{title:item.title,type:item.type,status:item.status}]))}}function includeActivityEntry(entry,candidate,filters){return filters.op&&entry.op!==filters.op||filters.author&&entry.author!==filters.author?!1:includeByTimeWindow(candidate,filters.from,filters.to)}async function collectActivityEntries(historyDir,filters){const combined=[];for(const file of await listHistoryFiles(historyDir)){const id=file.slice(0,-6);if(filters.id&&id!==filters.id)continue;const entries=await readHistoryEntries(path.join(historyDir,file),id);for(const entry of entries){const candidate=normalizeActivityEntry(id,entry);includeActivityEntry(entry,candidate,filters)&&combined.push(candidate)}}return combined}function formatCompactActivity(activity){return activity.map(entry=>({id:entry.id,op:entry.op,ts:entry.ts,author:entry.author,...entry.message?{msg:entry.message}:{}}))}function boundedOperationSummary(counts){const ordered=[...counts.entries()].sort(([leftOp,leftCount],[rightOp,rightCount])=>rightCount-leftCount||leftOp.localeCompare(rightOp)),visible=ordered.slice(0,4).map(([op,count])=>`${op}:${count}`);return ordered.length>visible.length&&visible.push(`+${ordered.length-visible.length}`),visible.join(",")}function buildActivityDigest(activity,itemsById){const grouped=new Map;for(const entry of activity){const current=grouped.get(entry.id);if(current===void 0){grouped.set(entry.id,{firstTs:entry.ts,lastTs:entry.ts,eventCount:1,operations:new Map([[entry.op,1]])});continue}current.eventCount+=1,compareTimestampStrings(entry.ts,current.firstTs)<0&&(current.firstTs=entry.ts),compareTimestampStrings(entry.ts,current.lastTs)>0&&(current.lastTs=entry.ts),current.operations.set(entry.op,(current.operations.get(entry.op)??0)+1)}return[...grouped.entries()].map(([id,summary])=>{const item=itemsById.get(id);return{id,type:item?.type??"unknown",status:item?.status??"unknown",title:(item?.title??"(item metadata unavailable)").slice(0,160),event_count:summary.eventCount,first_ts:summary.firstTs,last_ts:summary.lastTs,operations:boundedOperationSummary(summary.operations)}}).sort((left,right)=>compareTimestampStrings(right.last_ts,left.last_ts)||left.id.localeCompare(right.id))}function activityOperationCounts(activity){const counts=new Map;for(const entry of activity)counts.set(entry.op,(counts.get(entry.op)??0)+1);const ordered=[...counts.entries()].sort((left,right)=>right[1]-left[1]||left[0].localeCompare(right[0])),visible=ordered.slice(0,8);return visible.length<ordered.length&&visible.push([`+${String(ordered.length-visible.length)}`,ordered.slice(visible.length).reduce((total,[,count])=>total+count,0)]),Object.fromEntries(visible)}function projectActivityRows(projectionMode,matchingActivity,limit,itemsById,projectProvenance){if(projectionMode==="digest"){const matchingDigest=buildActivityDigest(matchingActivity,itemsById),activityDigest=limitEntries(matchingDigest,limit);return{rows:{activity_digest:activityDigest},compact:!1,totalRows:matchingDigest.length,returnedRows:activityDigest.length}}const activity=limitEntries(matchingActivity,limit);return projectionMode==="compact"?{rows:{compact_activity:formatCompactActivity(activity)},compact:!0,totalRows:matchingActivity.length,returnedRows:activity.length}:projectionMode==="provenance"?{rows:{provenance_activity:activity.map(projectProvenance)},compact:!1,totalRows:matchingActivity.length,returnedRows:activity.length}:{rows:{activity},compact:!1,totalRows:matchingActivity.length,returnedRows:activity.length}}const _testOnly={parseNonEmptyFilter,parseRangeBound,includeByTimeWindow,limitEntries,readActivityString,normalizeActivityEntry,sortActivity,listHistoryFiles,buildActivityDigest,activityOperationCounts};async function runActivity(options,global2){const context=await resolveActivityRuntimeContext(global2),projectionMode=resolveActivityProjectionMode(options),filters=resolveActivityFilters(options,projectionMode),prepared=await prepareActivityHistoryRead(context),provenanceDimensions=resolveHistoryProvenanceDimensions(context.settings.agent_identity.harness_signals),vocabulary=context.settings.agent_identity.identity_vocabulary,matchesProvenance=compileHistoryProvenanceMatcher({harness:filters.harness,agentInstance:filters.agentInstance,provenance:filters.provenance},vocabulary,provenanceDimensions),matchingActivity=sortActivity(await collectActivityEntries(prepared.historyDir,filters)).filter(matchesProvenance),projected=projectActivityRows(projectionMode,matchingActivity,filters.limit,prepared.itemsById,entry=>projectHistoryProvenance(entry,vocabulary,{itemId:entry.id})),omittedCount=projected.totalRows-projected.returnedRows;return{...projected.rows,compact:projected.compact,projection:{mode:projectionMode,row_key:ACTIVITY_ROW_KEY_BY_MODE[projectionMode]},omission_receipt:resolveModePairedOutputOmissionReceipt("activity",projectionMode),count:projected.returnedRows,total_count:projected.totalRows,limit:filters.limit??null,omitted_count:omittedCount,has_more:omittedCount>0,...projectionMode==="digest"?{activity_summary:{window:{from:filters.from,to:filters.to},event_count:matchingActivity.length,item_count:projected.totalRows,author_count:new Set(matchingActivity.map(entry=>entry.author)).size,operation_counts:activityOperationCounts(matchingActivity)}}:{},...options.provenanceSummary===!0?{provenance_summary:summarizeHistoryProvenance(matchingActivity,vocabulary,provenanceDimensions)}:{},applied_bound:{kind:filters.limit===void 0?"unbounded":"limit",source:filters.limitSource,value:filters.limit??null}}}export{_testOnly,normalizeActivityProjectionOptions,runActivity};
|
|
2
2
|
//# sourceMappingURL=activity.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
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]="7a4a98b2-3872-506d-b88d-877b0033dd2d")}catch(e2){}})();import{EXIT_CODE,PmCliError,splitCommaList,nowIso,normalizeStatusInput,parseStatusFilterCsv,resolveRuntimeFieldRegistry,resolveRuntimeStatusRegistry,resolvePmRoot,readSettings}from"../runtime-primitives.js";import{buildListQueryFilters}from"./list-filter-shared.js";import{runList}from"./list.js";import{parsePositiveInteger}from"../dependencies.js";const AGGREGATE_GROUP_FIELDS=["parent","type","priority","status","assignee","tags","sprint","release"];function parseStatus(raw,statusRegistry){const statuses=parseStatusFilterCsv(raw,statusRegistry,{strict:true,flagLabel:"--status"});if(!statuses||statuses.length===0){return void 0}return statuses}function parseNumericAggregation(options,allowedFields=["estimate","estimated_minutes","priority"]){const sumField=options.sum?.trim();const avgField=options.avg?.trim();const normalizedSum=sumField&&sumField.length>0?sumField:void 0;const normalizedAvg=avgField&&avgField.length>0?avgField:void 0;if(!normalizedSum&&!normalizedAvg){return null}if(normalizedSum&&normalizedAvg&&normalizedSum!==normalizedAvg){throw new PmCliError("Aggregate --sum and --avg must target the same numeric field",EXIT_CODE.USAGE)}const field=normalizedSum??normalizedAvg;if(!allowedFields.includes(field)){throw new PmCliError(`Aggregate numeric field "${field}" is not registered. Allowed: ${allowedFields.join(", ")}`,EXIT_CODE.USAGE)}return{field,sum:normalizedSum!==void 0,avg:normalizedAvg!==void 0}}function parseGroupBy(raw){const value=raw?.trim()??"status";if(value.length===0){throw new PmCliError("--group-by requires at least one field name",EXIT_CODE.USAGE)}const requested=splitCommaList(value);if(requested.length===0){throw new PmCliError("--group-by requires a comma-separated list of fields",EXIT_CODE.USAGE)}for(const field of requested){if(!AGGREGATE_GROUP_FIELDS.includes(field)){throw new PmCliError(`Aggregate group fields must be one of ${AGGREGATE_GROUP_FIELDS.join("|")}; received "${field}"`,EXIT_CODE.USAGE)}}return requested}function normalizeTagGroupValue(tags){const normalized=[...new Set(tags.map(tag=>tag.trim().toLowerCase()).filter(tag=>tag.length>0))].sort((left,right)=>left.localeCompare(right));if(normalized.length===0){return null}return normalized.join(",")}function resolveGroupValue(field,item){switch(field){case"parent":return item.parent??null;case"type":return item.type;case"priority":return item.priority;case"status":return item.status;case"assignee":return item.assignee??null;case"tags":return normalizeTagGroupValue(item.tags);case"sprint":return item.sprint??null;case"release":return item.release??null;default:return null}}function compareNullableGroupValue(left,right){const leftValue=left??null;const rightValue=right??null;if(leftValue===rightValue){return 0}if(leftValue===null){return 1}if(rightValue===null){return-1}if(typeof leftValue==="number"&&typeof rightValue==="number"){return leftValue-rightValue}return String(leftValue).localeCompare(String(rightValue))}function buildGroupKey(groupBy,group){return groupBy.map(field=>`${field}:${JSON.stringify(group[field]??null)}`).join("|")}const EMPTY_AGGREGATE_GROUP_LABELS={parent:"(unparented)",type:"(untyped)",priority:"(no priority)",status:"(no status)",assignee:"(unassigned)",tags:"(untagged)",sprint:"(no sprint)",release:"(no release)"};function formatGroupFieldLabel(field,value){if(value===null||value===void 0||value===""){return EMPTY_AGGREGATE_GROUP_LABELS[field]}return String(value)}function buildGroupLabel(groupBy,group){if(groupBy.length===1){return formatGroupFieldLabel(groupBy[0],group[groupBy[0]])}return groupBy.map(field=>`${field}=${formatGroupFieldLabel(field,group[field])}`).join(" | ")}function compareAggregateRows(left,right,groupBy){for(const field of groupBy){const byField=compareNullableGroupValue(left.group[field],right.group[field]);if(byField!==0){return byField}}return 0}function readNumericAggregateValue(item,field){const source=item;const raw=source[field];if(typeof raw==="number"&&Number.isFinite(raw)){return raw}if(typeof raw==="string"){const trimmed=raw.trim();if(trimmed.length===0){return null}const parsed=Number(trimmed);if(Number.isFinite(parsed)){return parsed}}return null}function completionPct(closed,total){if(total<=0){return 0}return Math.round(closed/total*1e4)/100}function updateCompletionCounts(accumulator,status,statusRegistry){const normalizedStatus=normalizeStatusInput(String(status),statusRegistry)??status;if(normalizedStatus===statusRegistry.open_status){accumulator.open_count+=1;return}if(normalizedStatus==="in_progress"||statusRegistry.active_statuses.has(normalizedStatus)&&normalizedStatus!==statusRegistry.open_status){accumulator.in_progress_count+=1;return}if(statusRegistry.terminal_done_statuses.has(normalizedStatus)||normalizedStatus===statusRegistry.close_status){accumulator.closed_count+=1;return}accumulator.other_count+=1}function createAggregateAccumulator(group,numericValue){return{row:{group,count:1},numeric_count:numericValue===null?0:1,numeric_sum:numericValue??0,null_count:numericValue===null?1:0,open_count:0,in_progress_count:0,closed_count:0,other_count:0}}function updateNumericAggregation(accumulator,numericValue){if(numericValue===null){accumulator.null_count+=1;return}accumulator.numeric_count+=1;accumulator.numeric_sum+=numericValue}function updateAggregateAccumulator(params){params.accumulator.row.count+=1;if(params.includeCompletion){updateCompletionCounts(params.accumulator,params.item.status,params.statusRegistry)}if(params.numericAggregation!==null){updateNumericAggregation(params.accumulator,params.numericValue)}}function accumulateItemGroups(grouped,groups,groupBy,context){for(const group of groups){const key=buildGroupKey(groupBy,group);const existing=grouped.get(key);if(existing){updateAggregateAccumulator({...context,accumulator:existing});continue}const accumulator=createAggregateAccumulator(group,context.numericValue);if(context.includeCompletion){updateCompletionCounts(accumulator,context.item.status,context.statusRegistry)}grouped.set(key,accumulator)}}function buildAggregateGroup(groupBy,item){const group={};for(const field of groupBy){group[field]=resolveGroupValue(field,item)}return group}function buildAggregateGroups(groupBy,item,setMode){let groups=[buildAggregateGroup(groupBy,item)];if(setMode==="tuple")return groups;for(const field of groupBy){const raw=item[field];if(!Array.isArray(raw))continue;const members=[...new Set(raw.map(value=>value.trim().toLowerCase()).filter(Boolean))].sort();if(members.length===0)continue;groups=groups.flatMap(group=>members.map(member=>({...group,[field]:member})))}return groups}function finalizeAggregateRow(entry,groupBy,includeCompletion,numericAggregation){const row={...entry.row,group_label:buildGroupLabel(groupBy,entry.row.group)};if(includeCompletion){row.open=entry.open_count;row.in_progress=entry.in_progress_count;row.closed=entry.closed_count;row.other=entry.other_count;row.completion_pct=completionPct(entry.closed_count,entry.row.count)}if(numericAggregation!==null){row.null_count=entry.null_count;if(numericAggregation.sum){row.sum=entry.numeric_sum}if(numericAggregation.avg){row.avg=entry.numeric_count===0?null:entry.numeric_sum/entry.numeric_count}}return row}function buildAggregateFilters(params){return{group_by:params.groupBy,set_mode:params.setMode,count:true,completion:params.includeCompletion,include_unparented:params.includeUnparented,status:params.status?.[0]??null,status_values:params.status,type:params.options.type??null,tag:params.options.tag??null,priority:params.options.priority??null,deadline_before:params.options.deadlineBefore??null,deadline_after:params.options.deadlineAfter??null,assignee:params.options.assignee??null,assignee_filter:params.options.assigneeFilter??null,parent:params.options.parent??null,sprint:params.options.sprint??null,release:params.options.release??null,...params.numericAggregation!==null?{sum:params.options.sum??null,avg:params.options.avg??null,numeric_field:params.numericAggregation.field}:{}}}async function runAggregate(options,global2){if(options.count===false){throw new PmCliError("Aggregate grouped counts are always enabled; omit count=false.",EXIT_CODE.USAGE)}const pmRoot=resolvePmRoot(process.cwd(),global2.path);const settings=await readSettings(pmRoot);const statusRegistry=resolveRuntimeStatusRegistry(settings.schema);const numericFields=["estimate","estimated_minutes","priority",...resolveRuntimeFieldRegistry(settings.schema).definitions.filter(definition=>definition.type==="number").map(definition=>definition.metadata_key)];const groupBy=parseGroupBy(options.groupBy);const setMode=options.setMode??"element";if(setMode!=="element"&&setMode!=="tuple"){throw new PmCliError("Aggregate --set-mode must be element or tuple",EXIT_CODE.USAGE)}const status=parseStatus(options.status,statusRegistry);const numericAggregation=parseNumericAggregation(options,[...new Set(numericFields)].sort((left,right)=>left.localeCompare(right)));const includeCompletion=options.completion===true;const includeUnparented=options.includeUnparented===true;const listed=await runList(void 0,{...buildListQueryFilters(options),status:options.status,noTruncate:true,strictRead:true},global2);const grouped=new Map;let skippedUnparented=0;let groupedItemCount=0;let groupMemberships=0;for(const listedItem of listed.items){const item=listedItem;if(groupBy.includes("parent")&&item.parent===void 0&&!includeUnparented){skippedUnparented+=1;continue}const numericValue=numericAggregation===null?null:readNumericAggregateValue(item,numericAggregation.field);const itemGroups=buildAggregateGroups(groupBy,item,setMode);accumulateItemGroups(grouped,itemGroups,groupBy,{item,statusRegistry,includeCompletion,numericAggregation,numericValue});groupMemberships+=itemGroups.length;groupedItemCount+=1}const groups=[...grouped.values()].map(entry=>finalizeAggregateRow(entry,groupBy,includeCompletion,numericAggregation)).sort((left,right)=>compareAggregateRows(left,right,groupBy));const warnings=listed.warnings&&listed.warnings.length>0?listed.warnings:void 0;return{...pageAggregateGroups(groups,groupBy,options),count:groups.length,totals:{items_considered:listed.items.length,items_grouped:groupedItemCount,items_skipped_unparented:skippedUnparented,group_memberships:groupMemberships},filters:buildAggregateFilters({groupBy,setMode,includeCompletion,includeUnparented,status,options,numericAggregation}),now:nowIso(),...warnings?{warnings}:{}}}function pageAggregateGroups(groups,groupBy,options){const limit=parsePositiveInteger(options.limit,"limit")??50;const previous=options.after===void 0?-1:groups.findIndex(row=>buildGroupKey(groupBy,row.group)===options.after);if(options.after!==void 0&&previous<0)throw new PmCliError("Aggregate --after cursor is absent from the current grouping; restart without --after.",EXIT_CODE.USAGE);const page=groups.slice(previous+1,previous+1+limit);const truncated=previous+1+page.length<groups.length;return{groups:page,returned_count:page.length,truncated,next_after:truncated?buildGroupKey(groupBy,page.at(-1).group):null}}const _testOnlyAggregateCommand={buildGroupKey,compareAggregateRows,compareNullableGroupValue,completionPct,normalizeTagGroupValue,parseGroupBy,parseNumericAggregation,parseStatus,readNumericAggregateValue,resolveGroupValue,updateCompletionCounts};export{_testOnlyAggregateCommand,runAggregate};
|
|
1
|
+
(function(){try{var e=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},n=new e.Error().stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="59f55926-8d04-52f8-a7fc-d32edd32b760")}catch{}})();import{EXIT_CODE,PmCliError,splitCommaList,nowIso,normalizeStatusInput,parseStatusFilterCsv,resolveRuntimeFieldRegistry,resolveRuntimeStatusRegistry,resolvePmRoot,readSettings}from"../runtime-primitives.js";import{buildListQueryFilters}from"./list-filter-shared.js";import{runList}from"./list.js";import{parsePositiveInteger}from"../dependencies.js";const AGGREGATE_GROUP_FIELDS=["parent","type","priority","status","assignee","tags","sprint","release"];function parseStatus(raw,statusRegistry){const statuses=parseStatusFilterCsv(raw,statusRegistry,{strict:!0,flagLabel:"--status"});if(!(!statuses||statuses.length===0))return statuses}function parseNumericAggregation(options,allowedFields=["estimate","estimated_minutes","priority"]){const sumField=options.sum?.trim(),avgField=options.avg?.trim(),normalizedSum=sumField&&sumField.length>0?sumField:void 0,normalizedAvg=avgField&&avgField.length>0?avgField:void 0;if(!normalizedSum&&!normalizedAvg)return null;if(normalizedSum&&normalizedAvg&&normalizedSum!==normalizedAvg)throw new PmCliError("Aggregate --sum and --avg must target the same numeric field",EXIT_CODE.USAGE);const field=normalizedSum??normalizedAvg;if(!allowedFields.includes(field))throw new PmCliError(`Aggregate numeric field "${field}" is not registered. Allowed: ${allowedFields.join(", ")}`,EXIT_CODE.USAGE);return{field,sum:normalizedSum!==void 0,avg:normalizedAvg!==void 0}}function parseGroupBy(raw){const value=raw?.trim()??"status";if(value.length===0)throw new PmCliError("--group-by requires at least one field name",EXIT_CODE.USAGE);const requested=splitCommaList(value);if(requested.length===0)throw new PmCliError("--group-by requires a comma-separated list of fields",EXIT_CODE.USAGE);for(const field of requested)if(!AGGREGATE_GROUP_FIELDS.includes(field))throw new PmCliError(`Aggregate group fields must be one of ${AGGREGATE_GROUP_FIELDS.join("|")}; received "${field}"`,EXIT_CODE.USAGE);return requested}function normalizeTagGroupValue(tags){const normalized=[...new Set(tags.map(tag=>tag.trim().toLowerCase()).filter(tag=>tag.length>0))].sort((left,right)=>left.localeCompare(right));return normalized.length===0?null:normalized.join(",")}function resolveGroupValue(field,item){switch(field){case"parent":return item.parent??null;case"type":return item.type;case"priority":return item.priority;case"status":return item.status;case"assignee":return item.assignee??null;case"tags":return normalizeTagGroupValue(item.tags);case"sprint":return item.sprint??null;case"release":return item.release??null;default:return null}}function compareNullableGroupValue(left,right){const leftValue=left??null,rightValue=right??null;return leftValue===rightValue?0:leftValue===null?1:rightValue===null?-1:typeof leftValue=="number"&&typeof rightValue=="number"?leftValue-rightValue:String(leftValue).localeCompare(String(rightValue))}function buildGroupKey(groupBy,group){return groupBy.map(field=>`${field}:${JSON.stringify(group[field]??null)}`).join("|")}const EMPTY_AGGREGATE_GROUP_LABELS={parent:"(unparented)",type:"(untyped)",priority:"(no priority)",status:"(no status)",assignee:"(unassigned)",tags:"(untagged)",sprint:"(no sprint)",release:"(no release)"};function formatGroupFieldLabel(field,value){return value==null||value===""?EMPTY_AGGREGATE_GROUP_LABELS[field]:String(value)}function buildGroupLabel(groupBy,group){return groupBy.length===1?formatGroupFieldLabel(groupBy[0],group[groupBy[0]]):groupBy.map(field=>`${field}=${formatGroupFieldLabel(field,group[field])}`).join(" | ")}function compareAggregateRows(left,right,groupBy){for(const field of groupBy){const byField=compareNullableGroupValue(left.group[field],right.group[field]);if(byField!==0)return byField}return 0}function readNumericAggregateValue(item,field){const raw=item[field];if(typeof raw=="number"&&Number.isFinite(raw))return raw;if(typeof raw=="string"){const trimmed=raw.trim();if(trimmed.length===0)return null;const parsed=Number(trimmed);if(Number.isFinite(parsed))return parsed}return null}function completionPct(closed,total){return total<=0?0:Math.round(closed/total*1e4)/100}function updateCompletionCounts(accumulator,status,statusRegistry){const normalizedStatus=normalizeStatusInput(String(status),statusRegistry)??status;if(normalizedStatus===statusRegistry.open_status){accumulator.open_count+=1;return}if(normalizedStatus==="in_progress"||statusRegistry.active_statuses.has(normalizedStatus)&&normalizedStatus!==statusRegistry.open_status){accumulator.in_progress_count+=1;return}if(statusRegistry.terminal_done_statuses.has(normalizedStatus)||normalizedStatus===statusRegistry.close_status){accumulator.closed_count+=1;return}accumulator.other_count+=1}function createAggregateAccumulator(group,numericValue){return{row:{group,count:1},numeric_count:numericValue===null?0:1,numeric_sum:numericValue??0,null_count:numericValue===null?1:0,open_count:0,in_progress_count:0,closed_count:0,other_count:0}}function updateNumericAggregation(accumulator,numericValue){if(numericValue===null){accumulator.null_count+=1;return}accumulator.numeric_count+=1,accumulator.numeric_sum+=numericValue}function updateAggregateAccumulator(params){params.accumulator.row.count+=1,params.includeCompletion&&updateCompletionCounts(params.accumulator,params.item.status,params.statusRegistry),params.numericAggregation!==null&&updateNumericAggregation(params.accumulator,params.numericValue)}function accumulateItemGroups(grouped,groups,groupBy,context){for(const group of groups){const key=buildGroupKey(groupBy,group),existing=grouped.get(key);if(existing){updateAggregateAccumulator({...context,accumulator:existing});continue}const accumulator=createAggregateAccumulator(group,context.numericValue);context.includeCompletion&&updateCompletionCounts(accumulator,context.item.status,context.statusRegistry),grouped.set(key,accumulator)}}function buildAggregateGroup(groupBy,item){const group={};for(const field of groupBy)group[field]=resolveGroupValue(field,item);return group}function buildAggregateGroups(groupBy,item,setMode){let groups=[buildAggregateGroup(groupBy,item)];if(setMode==="tuple")return groups;for(const field of groupBy){const raw=item[field];if(!Array.isArray(raw))continue;const members=[...new Set(raw.map(value=>value.trim().toLowerCase()).filter(Boolean))].sort();members.length!==0&&(groups=groups.flatMap(group=>members.map(member=>({...group,[field]:member}))))}return groups}function finalizeAggregateRow(entry,groupBy,includeCompletion,numericAggregation){const row={...entry.row,group_label:buildGroupLabel(groupBy,entry.row.group)};return includeCompletion&&(row.open=entry.open_count,row.in_progress=entry.in_progress_count,row.closed=entry.closed_count,row.other=entry.other_count,row.completion_pct=completionPct(entry.closed_count,entry.row.count)),numericAggregation!==null&&(row.null_count=entry.null_count,numericAggregation.sum&&(row.sum=entry.numeric_sum),numericAggregation.avg&&(row.avg=entry.numeric_count===0?null:entry.numeric_sum/entry.numeric_count)),row}function buildAggregateFilters(params){return{group_by:params.groupBy,set_mode:params.setMode,count:!0,completion:params.includeCompletion,include_unparented:params.includeUnparented,status:params.status?.[0]??null,status_values:params.status,type:params.options.type??null,tag:params.options.tag??null,priority:params.options.priority??null,deadline_before:params.options.deadlineBefore??null,deadline_after:params.options.deadlineAfter??null,assignee:params.options.assignee??null,assignee_filter:params.options.assigneeFilter??null,parent:params.options.parent??null,sprint:params.options.sprint??null,release:params.options.release??null,...params.numericAggregation!==null?{sum:params.options.sum??null,avg:params.options.avg??null,numeric_field:params.numericAggregation.field}:{}}}async function runAggregate(options,global2){if(options.count===!1)throw new PmCliError("Aggregate grouped counts are always enabled; omit count=false.",EXIT_CODE.USAGE);const pmRoot=resolvePmRoot(process.cwd(),global2.path),settings=await readSettings(pmRoot),statusRegistry=resolveRuntimeStatusRegistry(settings.schema),numericFields=["estimate","estimated_minutes","priority",...resolveRuntimeFieldRegistry(settings.schema).definitions.filter(definition=>definition.type==="number").map(definition=>definition.metadata_key)],groupBy=parseGroupBy(options.groupBy),setMode=options.setMode??"element";if(setMode!=="element"&&setMode!=="tuple")throw new PmCliError("Aggregate --set-mode must be element or tuple",EXIT_CODE.USAGE);const status=parseStatus(options.status,statusRegistry),numericAggregation=parseNumericAggregation(options,[...new Set(numericFields)].sort((left,right)=>left.localeCompare(right))),includeCompletion=options.completion===!0,includeUnparented=options.includeUnparented===!0,listed=await runList(void 0,{...buildListQueryFilters(options),status:options.status,noTruncate:!0,strictRead:!0},global2),grouped=new Map;let skippedUnparented=0,groupedItemCount=0,groupMemberships=0;for(const listedItem of listed.items){const item=listedItem;if(groupBy.includes("parent")&&item.parent===void 0&&!includeUnparented){skippedUnparented+=1;continue}const numericValue=numericAggregation===null?null:readNumericAggregateValue(item,numericAggregation.field),itemGroups=buildAggregateGroups(groupBy,item,setMode);accumulateItemGroups(grouped,itemGroups,groupBy,{item,statusRegistry,includeCompletion,numericAggregation,numericValue}),groupMemberships+=itemGroups.length,groupedItemCount+=1}const groups=[...grouped.values()].map(entry=>finalizeAggregateRow(entry,groupBy,includeCompletion,numericAggregation)).sort((left,right)=>compareAggregateRows(left,right,groupBy)),warnings=listed.warnings&&listed.warnings.length>0?listed.warnings:void 0;return{...pageAggregateGroups(groups,groupBy,options),count:groups.length,totals:{items_considered:listed.items.length,items_grouped:groupedItemCount,items_skipped_unparented:skippedUnparented,group_memberships:groupMemberships},filters:buildAggregateFilters({groupBy,setMode,includeCompletion,includeUnparented,status,options,numericAggregation}),now:nowIso(),...warnings?{warnings}:{}}}function pageAggregateGroups(groups,groupBy,options){const limit=parsePositiveInteger(options.limit,"limit")??50,previous=options.after===void 0?-1:groups.findIndex(row=>buildGroupKey(groupBy,row.group)===options.after);if(options.after!==void 0&&previous<0)throw new PmCliError("Aggregate --after cursor is absent from the current grouping; restart without --after.",EXIT_CODE.USAGE);const page=groups.slice(previous+1,previous+1+limit),truncated=previous+1+page.length<groups.length;return{groups:page,returned_count:page.length,truncated,next_after:truncated?buildGroupKey(groupBy,page.at(-1).group):null}}const _testOnlyAggregateCommand={buildGroupKey,compareAggregateRows,compareNullableGroupValue,completionPct,normalizeTagGroupValue,parseGroupBy,parseNumericAggregation,parseStatus,readNumericAggregateValue,resolveGroupValue,updateCompletionCounts};export{_testOnlyAggregateCommand,runAggregate};
|
|
2
2
|
//# sourceMappingURL=aggregate.js.map
|
|
@@ -1,2 +1,5 @@
|
|
|
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]="77dd912c-158f-5280-8112-dd971be4df3b")}catch(e2){}})();import{assertInitializedTracker}from"../environment/tracker-preflight.js";import{encode as encodeToon}from"@toon-format/toon";import{getActiveExtensionRegistrations,resolveItemTypeRegistry,normalizeStatusInput,collectRuntimeFilterValues,matchesRuntimeFilters,resolveRuntimeFieldRegistry,resolveRuntimeStatusRegistry,EXIT_CODE,PmCliError,levenshteinDistanceWithinLimit,compareTimestampStrings,nowIso,resolveIsoOrRelative,listAllItemMetadataLight,resolvePmRoot,readSettings}from"../runtime-primitives.js";import{parseIntegerLimit,parsePriority,parseType}from"./parsers.js";import{weekdayOrderIndex}from"../../types/index.js";const CALENDAR_VIEW_VALUES=["agenda","day","week","month"];const CALENDAR_OUTPUT_VALUES=["markdown","toon","json"];const UTC_DAY_TO_WEEKDAY=["sun","mon","tue","wed","thu","fri","sat"];const DEFAULT_RECURRENCE_LOOKAHEAD_DAYS=365;const DEFAULT_RECURRENCE_LOOKBACK_DAYS=365;const DEFAULT_EVENTS_ONLY_LOOKAHEAD_DAYS=28;const MAX_RECURRENCE_OCCURRENCES=1e3;function parseNonNegativeInteger(raw,label){if(raw===void 0)return void 0;const parsed=Number(raw);if(!Number.isInteger(parsed)||parsed<0){throw new PmCliError(`${label} must be a non-negative integer`,EXIT_CODE.USAGE)}return parsed}function parseIncludeSources(raw){if(!raw){return new Set(["deadlines","reminders","events"])}const normalized=raw.trim().toLowerCase();if(normalized==="all"){return new Set(["deadlines","reminders","events"])}const values=normalized.split(/[|,]/).map(value=>value.trim()).filter(value=>value.length>0);if(values.length===0){throw new PmCliError("Calendar include filter must not be empty",EXIT_CODE.USAGE)}const include=new Set;for(const value of values){if(value==="deadlines"||value==="deadline"){include.add("deadlines");continue}if(value==="reminders"||value==="reminder"){include.add("reminders");continue}if(value==="events"||value==="event"||value==="scheduled"){include.add("events");continue}throw new PmCliError("Calendar include filter must be deadlines|reminders|events|scheduled|all",EXIT_CODE.USAGE)}return include}function suggestClosestChoice(value,choices){let best;for(const choice of choices){const distance=levenshteinDistanceWithinLimit(value,choice,2);if(distance!==null&&(best===void 0||distance<best.distance)){best={choice,distance}}}return best?.choice}function parseView(raw){if(!raw)return"agenda";const normalized=raw.trim().toLowerCase();if(!CALENDAR_VIEW_VALUES.includes(normalized)){const suggestion=suggestClosestChoice(normalized,CALENDAR_VIEW_VALUES);throw new PmCliError(`Calendar view must be one of ${CALENDAR_VIEW_VALUES.join("|")}${suggestion?`. Did you mean "${suggestion}"?`:"."}`,EXIT_CODE.USAGE)}return normalized}function parseOutputFormat(raw){if(!raw)return void 0;const normalized=raw.trim().toLowerCase();if(!CALENDAR_OUTPUT_VALUES.includes(normalized)){const suggestion=suggestClosestChoice(normalized,CALENDAR_OUTPUT_VALUES);throw new PmCliError(`Calendar format must be one of ${CALENDAR_OUTPUT_VALUES.join("|")}${suggestion?`. Did you mean "${suggestion}"?`:"."}`,EXIT_CODE.USAGE)}return normalized}function resolveCalendarOutputFormat(options,global2){const commandFormat=parseOutputFormat(options.format);if(global2.json&&commandFormat&&commandFormat!=="json"){throw new PmCliError("Cannot combine --json with --format markdown|toon",EXIT_CODE.USAGE)}if(global2.json){return"json"}return commandFormat??"markdown"}function parseStatus(raw,statusRegistry){if(raw===void 0)return void 0;const normalized=normalizeStatusInput(raw,statusRegistry);if(!normalized){const allowedStatuses=statusRegistry.definitions.map(definition=>definition.id);throw new PmCliError(`Calendar status filter must be one of ${allowedStatuses.join("|")}`,EXIT_CODE.USAGE)}return normalized}function parseAssigneeFilter(raw){if(raw===void 0){return void 0}const normalized=raw.trim().toLowerCase();if(!normalized){throw new PmCliError("Calendar assignee filter must be one of assigned|unassigned",EXIT_CODE.USAGE)}if(normalized!=="assigned"&&normalized!=="unassigned"){throw new PmCliError(`Invalid calendar assignee filter "${raw}". Allowed: assigned|unassigned`,EXIT_CODE.USAGE)}return normalized}function toUtcDayKey(timestamp){return new Date(timestamp).toISOString().slice(0,10)}function toLocalDayKey(timestamp,timezone){if(!timezone||timezone==="UTC"){return toUtcDayKey(timestamp)}try{const parts=new Intl.DateTimeFormat("en-CA",{timeZone:timezone,year:"numeric",month:"2-digit",day:"2-digit"}).formatToParts(new Date(timestamp));const year=parts.find(part=>part.type==="year")?.value;const month=parts.find(part=>part.type==="month")?.value;const day=parts.find(part=>part.type==="day")?.value;if(year&&month&&day){return`${year}-${month}-${day}`}}catch{}return toUtcDayKey(timestamp)}function startOfUtcDay(timestamp){const date=new Date(timestamp);return new Date(Date.UTC(date.getUTCFullYear(),date.getUTCMonth(),date.getUTCDate(),0,0,0,0)).toISOString()}function addUtcDays(timestamp,days){const date=new Date(timestamp);return new Date(date.getTime()+days*24*60*60*1e3).toISOString()}function startOfUtcWeekMonday(timestamp){const base=new Date(startOfUtcDay(timestamp));const day=base.getUTCDay();const delta=day===0?-6:1-day;return addUtcDays(base.toISOString(),delta)}function startOfUtcMonth(timestamp){const date=new Date(timestamp);return new Date(Date.UTC(date.getUTCFullYear(),date.getUTCMonth(),1,0,0,0,0)).toISOString()}function startOfNextUtcMonth(timestamp){const date=new Date(timestamp);return new Date(Date.UTC(date.getUTCFullYear(),date.getUTCMonth()+1,1,0,0,0,0)).toISOString()}function maxTimestamp(left,right){return compareTimestampStrings(left,right)>=0?left:right}function toSortedCountRecord(values){return Object.fromEntries([...values.entries()].sort(([left],[right])=>left.localeCompare(right)))}function incrementCount(values,key){values.set(key,(values.get(key)??0)+1)}function formatRecurrenceRuleForSummary(rule){if(!rule){return null}const parts=[`freq=${rule.freq}`];if(rule.interval!==void 0){parts.push(`interval=${rule.interval}`)}if(rule.count!==void 0){parts.push(`count=${rule.count}`)}if(rule.until){parts.push(`until=${rule.until}`)}if(rule.by_weekday&&rule.by_weekday.length>0){const weekdays=[...rule.by_weekday].sort((left,right)=>weekdayOrderIndex(left)-weekdayOrderIndex(right));parts.push(`by_weekday=${weekdays.join("|")}`)}if(rule.by_month_day&&rule.by_month_day.length>0){const monthDays=[...rule.by_month_day].sort((left,right)=>left-right);parts.push(`by_month_day=${monthDays.join("|")}`)}if(rule.exdates&&rule.exdates.length>0){const exdates=[...rule.exdates].sort((left,right)=>left.localeCompare(right));parts.push(`exdates=${exdates.join("|")}`)}return parts.join(",")}function buildUtcTimestamp(year,month,day,timeSource){const candidate=new Date(Date.UTC(year,month,day,timeSource.getUTCHours(),timeSource.getUTCMinutes(),timeSource.getUTCSeconds(),timeSource.getUTCMilliseconds()));if(candidate.getUTCFullYear()!==year||candidate.getUTCMonth()!==month||candidate.getUTCDate()!==day){return void 0}return candidate.toISOString()}function weekdayToken(timestamp){return UTC_DAY_TO_WEEKDAY[new Date(timestamp).getUTCDay()]}function normalizeInstantKey(timestamp){const parsed=Date.parse(timestamp);return Number.isFinite(parsed)?new Date(parsed).toISOString():null}function buildExcludedInstantSet(exdates){const excluded=new Set;for(const exdate of exdates??[]){const instantKey=normalizeInstantKey(exdate);if(instantKey){excluded.add(instantKey)}}return excluded}function buildRecurringEventWindow(start,end,nowValue,lookbackDays,lookaheadDays){const windowStart=start??addUtcDays(nowValue,-(lookbackDays??DEFAULT_RECURRENCE_LOOKBACK_DAYS));const windowEnd=end??addUtcDays(start??nowValue,lookaheadDays??DEFAULT_RECURRENCE_LOOKAHEAD_DAYS);return{start:windowStart,end:compareTimestampStrings(windowEnd,windowStart)>0?windowEnd:addUtcDays(windowStart,1)}}function buildRecurrenceExpansionContext(startAt,recurrence,window2,occurrenceLimit){const recurrenceWeekdays=recurrence.by_weekday!==void 0?[...recurrence.by_weekday]:[weekdayToken(startAt)];const recurrenceMonthDays=recurrence.by_month_day!==void 0?[...recurrence.by_month_day]:[new Date(startAt).getUTCDate()];return{startAt,startDate:new Date(startAt),window:window2,maxOccurrences:occurrenceLimit??MAX_RECURRENCE_OCCURRENCES,interval:recurrence.interval??1,countLimit:recurrence.count??Number.POSITIVE_INFINITY,until:recurrence.until,excluded:buildExcludedInstantSet(recurrence.exdates),weekdayFilter:recurrence.by_weekday!==void 0?new Set(recurrence.by_weekday):void 0,monthDayFilter:recurrence.by_month_day!==void 0?new Set(recurrence.by_month_day):void 0,sortedWeekdays:[...new Set(recurrenceWeekdays)].sort((left,right)=>weekdayOrderIndex(left)-weekdayOrderIndex(right)),sortedMonthDays:[...new Set(recurrenceMonthDays)].sort((left,right)=>left-right),occurrences:[],produced:0}}function consumeRecurrenceCandidate(context,candidateAt){if(compareTimestampStrings(candidateAt,context.startAt)<0){return"continue"}if(context.until&&compareTimestampStrings(candidateAt,context.until)>0){return"stop"}if(compareTimestampStrings(candidateAt,context.window.end)>=0){return"stop"}if(context.excluded.has(candidateAt)){return"continue"}context.produced+=1;if(compareTimestampStrings(candidateAt,context.window.start)>=0){context.occurrences.push(candidateAt)}return context.produced>=context.countLimit||context.occurrences.length>=context.maxOccurrences?"stop":"continue"}function recurrenceDayMatchesFilters(context,candidateAt){const candidateWeekday=weekdayToken(candidateAt);const candidateMonthDay=new Date(candidateAt).getUTCDate();const weekdayMatches=!context.weekdayFilter||context.weekdayFilter.has(candidateWeekday);const monthDayMatches=!context.monthDayFilter||context.monthDayFilter.has(candidateMonthDay);return weekdayMatches&&monthDayMatches}function expandDailyOccurrences(context){let candidateAt=context.startAt;for(let iteration=0;iteration<context.maxOccurrences;iteration+=1){if(recurrenceDayMatchesFilters(context,candidateAt)&&consumeRecurrenceCandidate(context,candidateAt)==="stop"){break}candidateAt=addUtcDays(candidateAt,context.interval)}return context.occurrences}function buildWeeklyCandidateAt(context,candidateWeekStart,weekday){const dayOffset=weekdayOrderIndex(weekday);const candidateDay=addUtcDays(candidateWeekStart,dayOffset);const dayDate=new Date(candidateDay);return new Date(Date.UTC(dayDate.getUTCFullYear(),dayDate.getUTCMonth(),dayDate.getUTCDate(),context.startDate.getUTCHours(),context.startDate.getUTCMinutes(),context.startDate.getUTCSeconds(),context.startDate.getUTCMilliseconds())).toISOString()}function expandWeeklyOccurrences(context){const weekStart=startOfUtcWeekMonday(context.startAt);for(let step=0;step<context.maxOccurrences;step+=1){const candidateWeekStart=addUtcDays(weekStart,step*context.interval*7);for(const weekday of context.sortedWeekdays){const candidateAt=buildWeeklyCandidateAt(context,candidateWeekStart,weekday);if(!recurrenceDayMatchesFilters(context,candidateAt)){continue}if(consumeRecurrenceCandidate(context,candidateAt)==="stop"){return context.occurrences}}}return context.occurrences}function expandMonthlyOccurrences(context){const startYear=context.startDate.getUTCFullYear();const startMonth=context.startDate.getUTCMonth();for(let step=0;step<context.maxOccurrences;step+=1){const monthAnchor=new Date(Date.UTC(startYear,startMonth+step*context.interval,1,0,0,0,0));for(const monthDay of context.sortedMonthDays){const candidateAt=buildUtcTimestamp(monthAnchor.getUTCFullYear(),monthAnchor.getUTCMonth(),monthDay,context.startDate);if(!candidateAt||!recurrenceDayMatchesFilters(context,candidateAt)){continue}if(consumeRecurrenceCandidate(context,candidateAt)==="stop"){return context.occurrences}}}return context.occurrences}function expandYearlyOccurrences(context){const year=context.startDate.getUTCFullYear();const month=context.startDate.getUTCMonth();for(let step=0;step<context.maxOccurrences;step+=1){const candidateYear=year+step*context.interval;for(const monthDay of context.sortedMonthDays){const candidateAt=buildUtcTimestamp(candidateYear,month,monthDay,context.startDate);if(!candidateAt||!recurrenceDayMatchesFilters(context,candidateAt)){continue}if(consumeRecurrenceCandidate(context,candidateAt)==="stop"){return context.occurrences}}}return context.occurrences}function expandRecurringOccurrences(startAt,recurrence,window2,occurrenceLimit){const context=buildRecurrenceExpansionContext(startAt,recurrence,window2,occurrenceLimit);if(recurrence.freq==="daily"){return expandDailyOccurrences(context)}if(recurrence.freq==="weekly"){return expandWeeklyOccurrences(context)}if(recurrence.freq==="monthly"){return expandMonthlyOccurrences(context)}return expandYearlyOccurrences(context)}function sortEvents(values){return[...values].sort((a,b)=>{const byAt=compareTimestampStrings(a.at,b.at);if(byAt!==0)return byAt;const byPriority=a.item_priority-b.item_priority;if(byPriority!==0)return byPriority;const byId=a.item_id.localeCompare(b.item_id);if(byId!==0)return byId;const byKind=a.kind.localeCompare(b.kind);if(byKind!==0)return byKind;const byEventTitle=String(a.event_title).localeCompare(String(b.event_title));if(byEventTitle!==0)return byEventTitle;return String(a.reminder_text).localeCompare(String(b.reminder_text))})}function buildItemCalendarRowBase(item){return{item_id:item.id,item_title:item.title,item_type:item.type,item_status:item.status,item_priority:item.priority,item_assignee:item.assignee??null,item_deadline:item.deadline??null,item_tags:item.tags}}function buildDeadlineRow(item){if(!item.deadline){return null}return{at:item.deadline,date:toUtcDayKey(item.deadline),kind:"deadline",reminder_text:null,event_title:null,event_end:null,event_location:null,event_all_day:null,event_timezone:null,event_recurring:null,event_recurrence_rule:null,...buildItemCalendarRowBase(item),item_deadline:item.deadline}}function buildReminderRows(item){return(item.reminders??[]).map(reminder=>({at:reminder.at,date:toUtcDayKey(reminder.at),kind:"reminder",reminder_text:reminder.text,event_title:null,event_end:null,event_location:null,event_all_day:null,event_timezone:null,event_recurring:null,event_recurrence_rule:null,...buildItemCalendarRowBase(item)}))}function recurringDurationMs(startAt,endAt){if(!endAt){return null}const duration=Date.parse(endAt)-Date.parse(startAt);return Number.isFinite(duration)&&duration>0?duration:null}function eventOccurrenceEnd(occurrenceAt,event,durationMs){return event.recurrence&&durationMs!==null?new Date(new Date(occurrenceAt).getTime()+durationMs).toISOString():event.end_at??null}function buildScheduledEventRows(item,event,recurringWindow,occurrenceLimit){const recurrenceRuleSummary=formatRecurrenceRuleForSummary(event.recurrence);const durationMs=recurringDurationMs(event.start_at,event.end_at);const occurrences=event.recurrence?expandRecurringOccurrences(event.start_at,event.recurrence,recurringWindow,occurrenceLimit):[event.start_at];return occurrences.map(occurrenceAt=>({at:occurrenceAt,date:event.all_day===true?occurrenceAt.slice(0,10):toLocalDayKey(occurrenceAt,event.timezone),kind:"event",reminder_text:event.description??null,event_title:event.title??item.title,event_end:eventOccurrenceEnd(occurrenceAt,event,durationMs),event_location:event.location??null,event_all_day:event.all_day??null,event_timezone:event.timezone??null,event_recurring:event.recurrence?true:false,event_recurrence_rule:recurrenceRuleSummary,...buildItemCalendarRowBase(item)}))}function buildEventSeed(items,recurringWindow,includeSources,occurrenceLimit){const events=[];for(const item of items){const deadlineRow=includeSources.has("deadlines")?buildDeadlineRow(item):null;if(deadlineRow){events.push(deadlineRow)}if(includeSources.has("reminders")){events.push(...buildReminderRows(item))}for(const event of includeSources.has("events")?item.events??[]:[]){events.push(...buildScheduledEventRows(item,event,recurringWindow,occurrenceLimit))}}return sortEvents(events)}function filterItems(items,options,typeRegistry,statusRegistry,runtimeFieldFilters){const typeFilter=parseType(options.type,typeRegistry);const tagFilter=options.tag?.trim().toLowerCase();const priorityFilter=parsePriority(options.priority);const statusFilter=parseStatus(options.status,statusRegistry);const assigneeFilter=options.assignee?.trim();const assigneeModeFilter=parseAssigneeFilter(options.assigneeFilter);const sprintFilter=options.sprint?.trim();const releaseFilter=options.release?.trim();if(assigneeFilter&&(assigneeFilter.toLowerCase()==="none"||assigneeFilter.toLowerCase()==="null")){throw new PmCliError('--assignee no longer accepts "none" or "null". Use --assignee-filter unassigned.',EXIT_CODE.USAGE)}if(assigneeFilter!==void 0&&assigneeModeFilter==="unassigned"){throw new PmCliError("Cannot combine --assignee with --assignee-filter unassigned",EXIT_CODE.USAGE)}return items.filter(item=>itemMatchesCalendarFilters(item,{typeFilter,tagFilter,priorityFilter,statusFilter,assigneeFilter,assigneeModeFilter,sprintFilter,releaseFilter,runtimeFieldFilters}))}function itemMatchesCalendarFilters(item,filters){return itemMatchesCalendarIdentityFilters(item,filters)&&itemMatchesCalendarOwnerFilters(item,filters)&&matchesRuntimeFilters(item,filters.runtimeFieldFilters)}function itemMatchesCalendarIdentityFilters(item,filters){if(filters.typeFilter&&item.type!==filters.typeFilter)return false;if(filters.tagFilter&&!item.tags.some(tag=>tag.trim().toLowerCase()===filters.tagFilter))return false;if(filters.priorityFilter!==void 0&&item.priority!==filters.priorityFilter)return false;if(filters.statusFilter&&item.status!==filters.statusFilter)return false;return true}function itemMatchesCalendarOwnerFilters(item,filters){if(filters.assigneeModeFilter==="assigned"&&!item.assignee)return false;if(filters.assigneeModeFilter==="unassigned"&&item.assignee)return false;if(filters.assigneeFilter!==void 0&&item.assignee!==filters.assigneeFilter)return false;if(filters.sprintFilter!==void 0&&item.sprint!==filters.sprintFilter)return false;if(filters.releaseFilter!==void 0&&item.release!==filters.releaseFilter)return false;return true}function includeEventInWindow(event,start,end){if(start&&compareTimestampStrings(event.at,start)<0){return false}if(end&&compareTimestampStrings(event.at,end)>=0){return false}return true}function resolveCalendarBoundaryInput(raw,nowValue,fieldLabel){if(raw.trim().toLowerCase()==="today"){return startOfUtcDay(nowValue)}return resolveIsoOrRelative(raw,new Date(nowValue),fieldLabel)}function buildRange(view,options,nowValue){const anchor=options.date?resolveCalendarBoundaryInput(options.date,nowValue,"--date"):nowValue;const includePast=options.past===true;const fullPeriodRequested=options.fullPeriod===true;const from=options.from?resolveCalendarBoundaryInput(options.from,nowValue,"--from"):void 0;const to=options.to?resolveCalendarBoundaryInput(options.to,nowValue,"--to"):void 0;if(from&&to&&compareTimestampStrings(from,to)>=0){throw new PmCliError("Calendar --from must be before --to",EXIT_CODE.USAGE)}if(view!=="agenda"&&(options.from!==void 0||options.to!==void 0)){throw new PmCliError("--from and --to are only supported for --view agenda",EXIT_CODE.USAGE)}if(view==="agenda"){return buildAgendaRange(anchor,options,nowValue,includePast,fullPeriodRequested,from,to)}if(view==="day"){const dayStart=startOfUtcDay(anchor);return buildFixedPeriodRange(anchor,nowValue,includePast,fullPeriodRequested,dayStart,addUtcDays(dayStart,1))}if(view==="week"){const weekStart=startOfUtcWeekMonday(anchor);return buildFixedPeriodRange(anchor,nowValue,includePast,fullPeriodRequested,weekStart,addUtcDays(weekStart,7))}const monthStart=startOfUtcMonth(anchor);return buildFixedPeriodRange(anchor,nowValue,includePast,fullPeriodRequested,monthStart,startOfNextUtcMonth(anchor))}function buildAgendaRange(anchor,options,nowValue,includePast,fullPeriodRequested,from,to){if(fullPeriodRequested){throw new PmCliError("--full-period is only supported for --view day|week|month. For agenda windows, use --from and --to.",EXIT_CODE.USAGE)}return{anchor,start:from??(options.date?anchor:includePast?void 0:nowValue),end:to,fullPeriod:false}}function buildFixedPeriodRange(anchor,nowValue,includePast,fullPeriodRequested,periodStart,periodEnd){const fullPeriod=includePast||fullPeriodRequested;return{anchor,start:fullPeriod?periodStart:maxTimestamp(periodStart,nowValue),end:periodEnd,periodStart,periodEnd,fullPeriod}}function bucketEventsByDay(events){const dayMap=new Map;for(const event of events){const list=dayMap.get(event.date)??[];list.push(event);dayMap.set(event.date,list)}return[...dayMap.entries()].sort(([left],[right])=>left.localeCompare(right)).map(([date,dayEvents])=>({date,count:dayEvents.length,events:sortEvents(dayEvents)}))}function summarize(events){const itemIds=new Set;const byType=new Map;const byStatus=new Map;let deadlines=0;let reminders=0;let scheduled=0;let recurringEvents=0;for(const event of events){itemIds.add(event.item_id);incrementCount(byType,event.item_type);incrementCount(byStatus,event.item_status);if(event.kind==="deadline"){deadlines+=1}else if(event.kind==="reminder"){reminders+=1}else{scheduled+=1;if(event.event_recurring===true){recurringEvents+=1}}}return{events:events.length,items:itemIds.size,deadlines,reminders,scheduled,by_kind:{deadline:deadlines,reminder:reminders,event:scheduled},by_type:toSortedCountRecord(byType),by_status:toSortedCountRecord(byStatus),recurring_events:recurringEvents}}function formatWindow(range){const start=range.start??"unbounded";const end=range.end??"unbounded";return`${start} -> ${end}`}function formatClock(timestamp,timezone){if(timezone&&timezone!=="UTC"){try{const parts=new Intl.DateTimeFormat("en-GB",{timeZone:timezone,hour:"2-digit",minute:"2-digit",hourCycle:"h23"}).formatToParts(new Date(timestamp));const hour=parts.find(part=>part.type==="hour")?.value;const minute=parts.find(part=>part.type==="minute")?.value;if(hour&&minute){return`${hour}:${minute}`}}catch{}}return`${new Date(timestamp).toISOString().slice(11,16)}Z`}function formatSummaryCountRecord(values){const entries=Object.entries(values);if(entries.length===0){return"empty"}return entries.map(([key,value])=>`${key}=${value}`).join(", ")}function formatEventEnd(event){if(!event.event_end){return null}if(event.event_all_day===true){return event.event_end.slice(0,10)}if(event.date===toLocalDayKey(event.event_end,event.event_timezone)){return formatClock(event.event_end,event.event_timezone)}return event.event_end}function formatEventLine(event){const core=`${formatClock(event.at,event.event_timezone)} [${event.kind}] ${event.item_id} type=${event.item_type} p${event.item_priority} ${event.item_status} ${event.item_title}`;if(event.kind==="reminder"){const reminderText=event.reminder_text??"";return`${core} \u2014 ${reminderText} reminder=${JSON.stringify(reminderText)}`}if(event.kind==="event"){const details=[];const title=event.event_title??event.item_title;const titleDiffers=event.event_title!==null&&event.event_title!==event.item_title;if(titleDiffers){details.push(title);details.push(`title=${JSON.stringify(title)}`)}if(event.event_recurring){details.push("(recurring)");details.push("recurring=true")}const end=formatEventEnd(event);if(end){details.push(`end=${end}`)}if(event.event_all_day!==null){details.push(`all_day=${event.event_all_day?"true":"false"}`)}if(event.event_timezone){details.push(`timezone=${event.event_timezone}`)}if(event.event_location){details.push(`@ ${event.event_location}`);details.push(`location=${JSON.stringify(event.event_location)}`)}if(event.event_recurrence_rule){details.push(`recurrence=${event.event_recurrence_rule}`)}if(event.reminder_text){details.push(`description=${JSON.stringify(event.reminder_text)}`)}return`${core} \u2014 ${details.join(" ")}`}return core}function renderCalendarMarkdown(result){const lines=[];lines.push(`# pm calendar (${result.view})`);lines.push("");lines.push(`- now: ${result.now}`);lines.push(`- window: ${formatWindow(result.range)}`);if(result.range.period_start&&result.range.period_end){lines.push(`- period: ${result.range.period_start} -> ${result.range.period_end}`);lines.push(`- period-mode: ${result.range.full_period?"full-period":"active-window"}`)}lines.push(`- events: ${result.summary.events} (deadlines: ${result.summary.deadlines}, reminders: ${result.summary.reminders}, scheduled: ${result.summary.scheduled})`);lines.push(`- items: ${result.summary.items}`);lines.push(`- by-kind: ${formatSummaryCountRecord(result.summary.by_kind)}`);lines.push(`- by-type: ${formatSummaryCountRecord(result.summary.by_type)}`);lines.push(`- by-status: ${formatSummaryCountRecord(result.summary.by_status)}`);lines.push(`- recurring-events: ${result.summary.recurring_events}`);lines.push("");if(result.events.length===0){lines.push("No calendar events matched the selected filters.");return lines.join("\n")}for(const day of result.days){lines.push(`## ${day.date} (${day.count})`);for(const event of day.events){lines.push(`- ${formatEventLine(event)}`)}lines.push("")}if(result.warnings&&result.warnings.length>0){lines.push("### warnings");for(const warning of result.warnings){lines.push(`- ${warning}`)}lines.push("")}return trimTrailingNewlines(lines.join("\n"))}function renderCalendarToon(result){return encodeToon(result)}function trimTrailingNewlines(value){let end=value.length;while(end>0&&value[end-1]==="\n"){end-=1}return value.slice(0,end)}function resolveCalendarExecutionInputs(options){const nowValue=nowIso();const view=parseView(options.view);const rangeBounds=buildRange(view,options,nowValue);const limit=parseIntegerLimit(options.limit);const includeSources=parseIncludeSources(options.include);const explicitLookahead=parseNonNegativeInteger(options.recurrenceLookaheadDays,"Calendar recurrence lookahead days");const recurrenceLookbackDays=parseNonNegativeInteger(options.recurrenceLookbackDays,"Calendar recurrence lookback days");const occurrenceLimit=parseNonNegativeInteger(options.occurrenceLimit,"Calendar occurrence limit");if(occurrenceLimit!==void 0&&occurrenceLimit<1){throw new PmCliError("Calendar occurrence limit must be >= 1",EXIT_CODE.USAGE)}const eventsOnly=includeSources.has("events")&&!includeSources.has("deadlines")&&!includeSources.has("reminders");const hasExplicitBounds=options.to!==void 0||explicitLookahead!==void 0||recurrenceLookbackDays!==void 0||occurrenceLimit!==void 0;const eventsOnlyCapApplied=eventsOnly&&!hasExplicitBounds;return{nowValue,view,rangeBounds,limit,includeSources,occurrenceLimit,recurrenceLookaheadDays:eventsOnlyCapApplied?DEFAULT_EVENTS_ONLY_LOOKAHEAD_DAYS:explicitLookahead,recurrenceLookbackWindowDays:eventsOnlyCapApplied&&recurrenceLookbackDays===void 0?0:recurrenceLookbackDays,eventsOnlyCapApplied}}function appendCalendarCapWarning(warnings,capApplied){if(!capApplied){return}warnings.push(`recurring_events_default_cap_applied:lookback=0d,lookahead=${DEFAULT_EVENTS_ONLY_LOOKAHEAD_DAYS}d -- use --recurrence-lookback-days/--recurrence-lookahead-days or --to for wider range`)}function buildCalendarFiltersResult(options,runtimeFieldFilters){return{type:options.type??null,tag:options.tag??null,priority:options.priority??null,status:options.status??null,assignee:options.assignee??null,assignee_filter:options.assigneeFilter??null,sprint:options.sprint??null,release:options.release??null,runtime_filters:runtimeFieldFilters,limit:options.limit??null,include:options.include??null,full_period:options.fullPeriod===true?"true":null,recurrence_lookahead_days:options.recurrenceLookaheadDays??null,recurrence_lookback_days:options.recurrenceLookbackDays??null,occurrence_limit:options.occurrenceLimit??null}}function buildCalendarRangeResult(options,rangeBounds){return{start:rangeBounds.start??null,end:rangeBounds.end??null,period_start:rangeBounds.periodStart??null,period_end:rangeBounds.periodEnd??null,full_period:rangeBounds.fullPeriod,past:options.past===true,from:options.from??null,to:options.to??null}}async function runCalendar(options,global2){const pmRoot=resolvePmRoot(process.cwd(),global2.path);await assertInitializedTracker(pmRoot);const inputs=resolveCalendarExecutionInputs(options);const settings=await readSettings(pmRoot);const statusRegistry=resolveRuntimeStatusRegistry(settings.schema);const runtimeFieldRegistry=resolveRuntimeFieldRegistry(settings.schema);const runtimeFieldFilters=collectRuntimeFilterValues(options,runtimeFieldRegistry,"calendar");const typeRegistry=resolveItemTypeRegistry(settings,getActiveExtensionRegistrations());const listWarnings=[];appendCalendarCapWarning(listWarnings,inputs.eventsOnlyCapApplied);const items=await listAllItemMetadataLight(pmRoot,settings.item_format,typeRegistry.type_to_folder,listWarnings,settings.schema);const filteredItems=filterItems(items,options,typeRegistry,statusRegistry,runtimeFieldFilters);const recurringWindow=buildRecurringEventWindow(inputs.rangeBounds.start,inputs.rangeBounds.end,inputs.nowValue,inputs.recurrenceLookbackWindowDays,inputs.recurrenceLookaheadDays);const seededEvents=buildEventSeed(filteredItems,recurringWindow,inputs.includeSources,inputs.occurrenceLimit);const rangedEvents=seededEvents.filter(event=>includeEventInWindow(event,inputs.rangeBounds.start,inputs.rangeBounds.end));const limitedEvents=inputs.limit===void 0?rangedEvents:rangedEvents.slice(0,inputs.limit);const days=bucketEventsByDay(limitedEvents);const warnings=[...new Set(listWarnings)].sort((left,right)=>left.localeCompare(right));return{view:inputs.view,output_default:"markdown",now:inputs.nowValue,anchor:inputs.rangeBounds.anchor,range:buildCalendarRangeResult(options,inputs.rangeBounds),filters:buildCalendarFiltersResult(options,runtimeFieldFilters),summary:summarize(limitedEvents),events:limitedEvents,days,...warnings.length>0?{warnings}:{}}}export{renderCalendarMarkdown,renderCalendarToon,resolveCalendarOutputFormat,runCalendar};
|
|
1
|
+
(function(){try{var e=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},n=new e.Error().stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="809a4d75-4915-585d-9fc8-ad3e9ef15b1f")}catch{}})();import{assertInitializedTracker}from"../environment/tracker-preflight.js";import{encode as encodeToon}from"@toon-format/toon";import{getActiveExtensionRegistrations,resolveItemTypeRegistry,normalizeStatusInput,collectRuntimeFilterValues,matchesRuntimeFilters,resolveRuntimeFieldRegistry,resolveRuntimeStatusRegistry,EXIT_CODE,PmCliError,levenshteinDistanceWithinLimit,compareTimestampStrings,nowIso,resolveIsoOrRelative,listAllItemMetadataLight,resolvePmRoot,readSettings}from"../runtime-primitives.js";import{parseIntegerLimit,parsePriority,parseType}from"./parsers.js";import{weekdayOrderIndex}from"../../types/index.js";const CALENDAR_VIEW_VALUES=["agenda","day","week","month"],CALENDAR_OUTPUT_VALUES=["markdown","toon","json"],UTC_DAY_TO_WEEKDAY=["sun","mon","tue","wed","thu","fri","sat"],DEFAULT_RECURRENCE_LOOKAHEAD_DAYS=365,DEFAULT_RECURRENCE_LOOKBACK_DAYS=365,DEFAULT_EVENTS_ONLY_LOOKAHEAD_DAYS=28,MAX_RECURRENCE_OCCURRENCES=1e3;function parseNonNegativeInteger(raw,label){if(raw===void 0)return;const parsed=Number(raw);if(!Number.isInteger(parsed)||parsed<0)throw new PmCliError(`${label} must be a non-negative integer`,EXIT_CODE.USAGE);return parsed}function parseIncludeSources(raw){if(!raw)return new Set(["deadlines","reminders","events"]);const normalized=raw.trim().toLowerCase();if(normalized==="all")return new Set(["deadlines","reminders","events"]);const values=normalized.split(/[|,]/).map(value=>value.trim()).filter(value=>value.length>0);if(values.length===0)throw new PmCliError("Calendar include filter must not be empty",EXIT_CODE.USAGE);const include=new Set;for(const value of values){if(value==="deadlines"||value==="deadline"){include.add("deadlines");continue}if(value==="reminders"||value==="reminder"){include.add("reminders");continue}if(value==="events"||value==="event"||value==="scheduled"){include.add("events");continue}throw new PmCliError("Calendar include filter must be deadlines|reminders|events|scheduled|all",EXIT_CODE.USAGE)}return include}function suggestClosestChoice(value,choices){let best;for(const choice of choices){const distance=levenshteinDistanceWithinLimit(value,choice,2);distance!==null&&(best===void 0||distance<best.distance)&&(best={choice,distance})}return best?.choice}function parseView(raw){if(!raw)return"agenda";const normalized=raw.trim().toLowerCase();if(!CALENDAR_VIEW_VALUES.includes(normalized)){const suggestion=suggestClosestChoice(normalized,CALENDAR_VIEW_VALUES);throw new PmCliError(`Calendar view must be one of ${CALENDAR_VIEW_VALUES.join("|")}${suggestion?`. Did you mean "${suggestion}"?`:"."}`,EXIT_CODE.USAGE)}return normalized}function parseOutputFormat(raw){if(!raw)return;const normalized=raw.trim().toLowerCase();if(!CALENDAR_OUTPUT_VALUES.includes(normalized)){const suggestion=suggestClosestChoice(normalized,CALENDAR_OUTPUT_VALUES);throw new PmCliError(`Calendar format must be one of ${CALENDAR_OUTPUT_VALUES.join("|")}${suggestion?`. Did you mean "${suggestion}"?`:"."}`,EXIT_CODE.USAGE)}return normalized}function resolveCalendarOutputFormat(options,global2){const commandFormat=parseOutputFormat(options.format);if(global2.json&&commandFormat&&commandFormat!=="json")throw new PmCliError("Cannot combine --json with --format markdown|toon",EXIT_CODE.USAGE);return global2.json?"json":commandFormat??"markdown"}function parseStatus(raw,statusRegistry){if(raw===void 0)return;const normalized=normalizeStatusInput(raw,statusRegistry);if(!normalized){const allowedStatuses=statusRegistry.definitions.map(definition=>definition.id);throw new PmCliError(`Calendar status filter must be one of ${allowedStatuses.join("|")}`,EXIT_CODE.USAGE)}return normalized}function parseAssigneeFilter(raw){if(raw===void 0)return;const normalized=raw.trim().toLowerCase();if(!normalized)throw new PmCliError("Calendar assignee filter must be one of assigned|unassigned",EXIT_CODE.USAGE);if(normalized!=="assigned"&&normalized!=="unassigned")throw new PmCliError(`Invalid calendar assignee filter "${raw}". Allowed: assigned|unassigned`,EXIT_CODE.USAGE);return normalized}function toUtcDayKey(timestamp){return new Date(timestamp).toISOString().slice(0,10)}function toLocalDayKey(timestamp,timezone){if(!timezone||timezone==="UTC")return toUtcDayKey(timestamp);try{const parts=new Intl.DateTimeFormat("en-CA",{timeZone:timezone,year:"numeric",month:"2-digit",day:"2-digit"}).formatToParts(new Date(timestamp)),year=parts.find(part=>part.type==="year")?.value,month=parts.find(part=>part.type==="month")?.value,day=parts.find(part=>part.type==="day")?.value;if(year&&month&&day)return`${year}-${month}-${day}`}catch{}return toUtcDayKey(timestamp)}function startOfUtcDay(timestamp){const date=new Date(timestamp);return new Date(Date.UTC(date.getUTCFullYear(),date.getUTCMonth(),date.getUTCDate(),0,0,0,0)).toISOString()}function addUtcDays(timestamp,days){const date=new Date(timestamp);return new Date(date.getTime()+days*24*60*60*1e3).toISOString()}function startOfUtcWeekMonday(timestamp){const base=new Date(startOfUtcDay(timestamp)),day=base.getUTCDay(),delta=day===0?-6:1-day;return addUtcDays(base.toISOString(),delta)}function startOfUtcMonth(timestamp){const date=new Date(timestamp);return new Date(Date.UTC(date.getUTCFullYear(),date.getUTCMonth(),1,0,0,0,0)).toISOString()}function startOfNextUtcMonth(timestamp){const date=new Date(timestamp);return new Date(Date.UTC(date.getUTCFullYear(),date.getUTCMonth()+1,1,0,0,0,0)).toISOString()}function maxTimestamp(left,right){return compareTimestampStrings(left,right)>=0?left:right}function toSortedCountRecord(values){return Object.fromEntries([...values.entries()].sort(([left],[right])=>left.localeCompare(right)))}function incrementCount(values,key){values.set(key,(values.get(key)??0)+1)}function formatRecurrenceRuleForSummary(rule){if(!rule)return null;const parts=[`freq=${rule.freq}`];if(rule.interval!==void 0&&parts.push(`interval=${rule.interval}`),rule.count!==void 0&&parts.push(`count=${rule.count}`),rule.until&&parts.push(`until=${rule.until}`),rule.by_weekday&&rule.by_weekday.length>0){const weekdays=[...rule.by_weekday].sort((left,right)=>weekdayOrderIndex(left)-weekdayOrderIndex(right));parts.push(`by_weekday=${weekdays.join("|")}`)}if(rule.by_month_day&&rule.by_month_day.length>0){const monthDays=[...rule.by_month_day].sort((left,right)=>left-right);parts.push(`by_month_day=${monthDays.join("|")}`)}if(rule.exdates&&rule.exdates.length>0){const exdates=[...rule.exdates].sort((left,right)=>left.localeCompare(right));parts.push(`exdates=${exdates.join("|")}`)}return parts.join(",")}function buildUtcTimestamp(year,month,day,timeSource){const candidate=new Date(Date.UTC(year,month,day,timeSource.getUTCHours(),timeSource.getUTCMinutes(),timeSource.getUTCSeconds(),timeSource.getUTCMilliseconds()));if(!(candidate.getUTCFullYear()!==year||candidate.getUTCMonth()!==month||candidate.getUTCDate()!==day))return candidate.toISOString()}function weekdayToken(timestamp){return UTC_DAY_TO_WEEKDAY[new Date(timestamp).getUTCDay()]}function normalizeInstantKey(timestamp){const parsed=Date.parse(timestamp);return Number.isFinite(parsed)?new Date(parsed).toISOString():null}function buildExcludedInstantSet(exdates){const excluded=new Set;for(const exdate of exdates??[]){const instantKey=normalizeInstantKey(exdate);instantKey&&excluded.add(instantKey)}return excluded}function buildRecurringEventWindow(start,end,nowValue,lookbackDays,lookaheadDays){const windowStart=start??addUtcDays(nowValue,-(lookbackDays??DEFAULT_RECURRENCE_LOOKBACK_DAYS)),windowEnd=end??addUtcDays(start??nowValue,lookaheadDays??DEFAULT_RECURRENCE_LOOKAHEAD_DAYS);return{start:windowStart,end:compareTimestampStrings(windowEnd,windowStart)>0?windowEnd:addUtcDays(windowStart,1)}}function buildRecurrenceExpansionContext(startAt,recurrence,window2,occurrenceLimit){const recurrenceWeekdays=recurrence.by_weekday!==void 0?[...recurrence.by_weekday]:[weekdayToken(startAt)],recurrenceMonthDays=recurrence.by_month_day!==void 0?[...recurrence.by_month_day]:[new Date(startAt).getUTCDate()];return{startAt,startDate:new Date(startAt),window:window2,maxOccurrences:occurrenceLimit??MAX_RECURRENCE_OCCURRENCES,interval:recurrence.interval??1,countLimit:recurrence.count??Number.POSITIVE_INFINITY,until:recurrence.until,excluded:buildExcludedInstantSet(recurrence.exdates),weekdayFilter:recurrence.by_weekday!==void 0?new Set(recurrence.by_weekday):void 0,monthDayFilter:recurrence.by_month_day!==void 0?new Set(recurrence.by_month_day):void 0,sortedWeekdays:[...new Set(recurrenceWeekdays)].sort((left,right)=>weekdayOrderIndex(left)-weekdayOrderIndex(right)),sortedMonthDays:[...new Set(recurrenceMonthDays)].sort((left,right)=>left-right),occurrences:[],produced:0}}function consumeRecurrenceCandidate(context,candidateAt){return compareTimestampStrings(candidateAt,context.startAt)<0?"continue":context.until&&compareTimestampStrings(candidateAt,context.until)>0||compareTimestampStrings(candidateAt,context.window.end)>=0?"stop":context.excluded.has(candidateAt)?"continue":(context.produced+=1,compareTimestampStrings(candidateAt,context.window.start)>=0&&context.occurrences.push(candidateAt),context.produced>=context.countLimit||context.occurrences.length>=context.maxOccurrences?"stop":"continue")}function recurrenceDayMatchesFilters(context,candidateAt){const candidateWeekday=weekdayToken(candidateAt),candidateMonthDay=new Date(candidateAt).getUTCDate(),weekdayMatches=!context.weekdayFilter||context.weekdayFilter.has(candidateWeekday),monthDayMatches=!context.monthDayFilter||context.monthDayFilter.has(candidateMonthDay);return weekdayMatches&&monthDayMatches}function expandDailyOccurrences(context){let candidateAt=context.startAt;for(let iteration=0;iteration<context.maxOccurrences&&!(recurrenceDayMatchesFilters(context,candidateAt)&&consumeRecurrenceCandidate(context,candidateAt)==="stop");iteration+=1)candidateAt=addUtcDays(candidateAt,context.interval);return context.occurrences}function buildWeeklyCandidateAt(context,candidateWeekStart,weekday){const dayOffset=weekdayOrderIndex(weekday),candidateDay=addUtcDays(candidateWeekStart,dayOffset),dayDate=new Date(candidateDay);return new Date(Date.UTC(dayDate.getUTCFullYear(),dayDate.getUTCMonth(),dayDate.getUTCDate(),context.startDate.getUTCHours(),context.startDate.getUTCMinutes(),context.startDate.getUTCSeconds(),context.startDate.getUTCMilliseconds())).toISOString()}function expandWeeklyOccurrences(context){const weekStart=startOfUtcWeekMonday(context.startAt);for(let step=0;step<context.maxOccurrences;step+=1){const candidateWeekStart=addUtcDays(weekStart,step*context.interval*7);for(const weekday of context.sortedWeekdays){const candidateAt=buildWeeklyCandidateAt(context,candidateWeekStart,weekday);if(recurrenceDayMatchesFilters(context,candidateAt)&&consumeRecurrenceCandidate(context,candidateAt)==="stop")return context.occurrences}}return context.occurrences}function expandMonthlyOccurrences(context){const startYear=context.startDate.getUTCFullYear(),startMonth=context.startDate.getUTCMonth();for(let step=0;step<context.maxOccurrences;step+=1){const monthAnchor=new Date(Date.UTC(startYear,startMonth+step*context.interval,1,0,0,0,0));for(const monthDay of context.sortedMonthDays){const candidateAt=buildUtcTimestamp(monthAnchor.getUTCFullYear(),monthAnchor.getUTCMonth(),monthDay,context.startDate);if(!(!candidateAt||!recurrenceDayMatchesFilters(context,candidateAt))&&consumeRecurrenceCandidate(context,candidateAt)==="stop")return context.occurrences}}return context.occurrences}function expandYearlyOccurrences(context){const year=context.startDate.getUTCFullYear(),month=context.startDate.getUTCMonth();for(let step=0;step<context.maxOccurrences;step+=1){const candidateYear=year+step*context.interval;for(const monthDay of context.sortedMonthDays){const candidateAt=buildUtcTimestamp(candidateYear,month,monthDay,context.startDate);if(!(!candidateAt||!recurrenceDayMatchesFilters(context,candidateAt))&&consumeRecurrenceCandidate(context,candidateAt)==="stop")return context.occurrences}}return context.occurrences}function expandRecurringOccurrences(startAt,recurrence,window2,occurrenceLimit){const context=buildRecurrenceExpansionContext(startAt,recurrence,window2,occurrenceLimit);return recurrence.freq==="daily"?expandDailyOccurrences(context):recurrence.freq==="weekly"?expandWeeklyOccurrences(context):recurrence.freq==="monthly"?expandMonthlyOccurrences(context):expandYearlyOccurrences(context)}function sortEvents(values){return[...values].sort((a,b)=>{const byAt=compareTimestampStrings(a.at,b.at);if(byAt!==0)return byAt;const byPriority=a.item_priority-b.item_priority;if(byPriority!==0)return byPriority;const byId=a.item_id.localeCompare(b.item_id);if(byId!==0)return byId;const byKind=a.kind.localeCompare(b.kind);if(byKind!==0)return byKind;const byEventTitle=String(a.event_title).localeCompare(String(b.event_title));return byEventTitle!==0?byEventTitle:String(a.reminder_text).localeCompare(String(b.reminder_text))})}function buildItemCalendarRowBase(item){return{item_id:item.id,item_title:item.title,item_type:item.type,item_status:item.status,item_priority:item.priority,item_assignee:item.assignee??null,item_deadline:item.deadline??null,item_tags:item.tags}}function buildDeadlineRow(item){return item.deadline?{at:item.deadline,date:toUtcDayKey(item.deadline),kind:"deadline",reminder_text:null,event_title:null,event_end:null,event_location:null,event_all_day:null,event_timezone:null,event_recurring:null,event_recurrence_rule:null,...buildItemCalendarRowBase(item),item_deadline:item.deadline}:null}function buildReminderRows(item){return(item.reminders??[]).map(reminder=>({at:reminder.at,date:toUtcDayKey(reminder.at),kind:"reminder",reminder_text:reminder.text,event_title:null,event_end:null,event_location:null,event_all_day:null,event_timezone:null,event_recurring:null,event_recurrence_rule:null,...buildItemCalendarRowBase(item)}))}function recurringDurationMs(startAt,endAt){if(!endAt)return null;const duration=Date.parse(endAt)-Date.parse(startAt);return Number.isFinite(duration)&&duration>0?duration:null}function eventOccurrenceEnd(occurrenceAt,event,durationMs){return event.recurrence&&durationMs!==null?new Date(new Date(occurrenceAt).getTime()+durationMs).toISOString():event.end_at??null}function buildScheduledEventRows(item,event,recurringWindow,occurrenceLimit){const recurrenceRuleSummary=formatRecurrenceRuleForSummary(event.recurrence),durationMs=recurringDurationMs(event.start_at,event.end_at);return(event.recurrence?expandRecurringOccurrences(event.start_at,event.recurrence,recurringWindow,occurrenceLimit):[event.start_at]).map(occurrenceAt=>({at:occurrenceAt,date:event.all_day===!0?occurrenceAt.slice(0,10):toLocalDayKey(occurrenceAt,event.timezone),kind:"event",reminder_text:event.description??null,event_title:event.title??item.title,event_end:eventOccurrenceEnd(occurrenceAt,event,durationMs),event_location:event.location??null,event_all_day:event.all_day??null,event_timezone:event.timezone??null,event_recurring:!!event.recurrence,event_recurrence_rule:recurrenceRuleSummary,...buildItemCalendarRowBase(item)}))}function buildEventSeed(items,recurringWindow,includeSources,occurrenceLimit){const events=[];for(const item of items){const deadlineRow=includeSources.has("deadlines")?buildDeadlineRow(item):null;deadlineRow&&events.push(deadlineRow),includeSources.has("reminders")&&events.push(...buildReminderRows(item));for(const event of includeSources.has("events")?item.events??[]:[])events.push(...buildScheduledEventRows(item,event,recurringWindow,occurrenceLimit))}return sortEvents(events)}function filterItems(items,options,typeRegistry,statusRegistry,runtimeFieldFilters){const typeFilter=parseType(options.type,typeRegistry),tagFilter=options.tag?.trim().toLowerCase(),priorityFilter=parsePriority(options.priority),statusFilter=parseStatus(options.status,statusRegistry),assigneeFilter=options.assignee?.trim(),assigneeModeFilter=parseAssigneeFilter(options.assigneeFilter),sprintFilter=options.sprint?.trim(),releaseFilter=options.release?.trim();if(assigneeFilter&&(assigneeFilter.toLowerCase()==="none"||assigneeFilter.toLowerCase()==="null"))throw new PmCliError('--assignee no longer accepts "none" or "null". Use --assignee-filter unassigned.',EXIT_CODE.USAGE);if(assigneeFilter!==void 0&&assigneeModeFilter==="unassigned")throw new PmCliError("Cannot combine --assignee with --assignee-filter unassigned",EXIT_CODE.USAGE);return items.filter(item=>itemMatchesCalendarFilters(item,{typeFilter,tagFilter,priorityFilter,statusFilter,assigneeFilter,assigneeModeFilter,sprintFilter,releaseFilter,runtimeFieldFilters}))}function itemMatchesCalendarFilters(item,filters){return itemMatchesCalendarIdentityFilters(item,filters)&&itemMatchesCalendarOwnerFilters(item,filters)&&matchesRuntimeFilters(item,filters.runtimeFieldFilters)}function itemMatchesCalendarIdentityFilters(item,filters){return!(filters.typeFilter&&item.type!==filters.typeFilter||filters.tagFilter&&!item.tags.some(tag=>tag.trim().toLowerCase()===filters.tagFilter)||filters.priorityFilter!==void 0&&item.priority!==filters.priorityFilter||filters.statusFilter&&item.status!==filters.statusFilter)}function itemMatchesCalendarOwnerFilters(item,filters){return!(filters.assigneeModeFilter==="assigned"&&!item.assignee||filters.assigneeModeFilter==="unassigned"&&item.assignee||filters.assigneeFilter!==void 0&&item.assignee!==filters.assigneeFilter||filters.sprintFilter!==void 0&&item.sprint!==filters.sprintFilter||filters.releaseFilter!==void 0&&item.release!==filters.releaseFilter)}function includeEventInWindow(event,start,end){return!(start&&compareTimestampStrings(event.at,start)<0||end&&compareTimestampStrings(event.at,end)>=0)}function resolveCalendarBoundaryInput(raw,nowValue,fieldLabel){return raw.trim().toLowerCase()==="today"?startOfUtcDay(nowValue):resolveIsoOrRelative(raw,new Date(nowValue),fieldLabel)}function buildRange(view,options,nowValue){const anchor=options.date?resolveCalendarBoundaryInput(options.date,nowValue,"--date"):nowValue,includePast=options.past===!0,fullPeriodRequested=options.fullPeriod===!0,from=options.from?resolveCalendarBoundaryInput(options.from,nowValue,"--from"):void 0,to=options.to?resolveCalendarBoundaryInput(options.to,nowValue,"--to"):void 0;if(from&&to&&compareTimestampStrings(from,to)>=0)throw new PmCliError("Calendar --from must be before --to",EXIT_CODE.USAGE);if(view!=="agenda"&&(options.from!==void 0||options.to!==void 0))throw new PmCliError("--from and --to are only supported for --view agenda",EXIT_CODE.USAGE);if(view==="agenda")return buildAgendaRange(anchor,options,nowValue,includePast,fullPeriodRequested,from,to);if(view==="day"){const dayStart=startOfUtcDay(anchor);return buildFixedPeriodRange(anchor,nowValue,includePast,fullPeriodRequested,dayStart,addUtcDays(dayStart,1))}if(view==="week"){const weekStart=startOfUtcWeekMonday(anchor);return buildFixedPeriodRange(anchor,nowValue,includePast,fullPeriodRequested,weekStart,addUtcDays(weekStart,7))}const monthStart=startOfUtcMonth(anchor);return buildFixedPeriodRange(anchor,nowValue,includePast,fullPeriodRequested,monthStart,startOfNextUtcMonth(anchor))}function buildAgendaRange(anchor,options,nowValue,includePast,fullPeriodRequested,from,to){if(fullPeriodRequested)throw new PmCliError("--full-period is only supported for --view day|week|month. For agenda windows, use --from and --to.",EXIT_CODE.USAGE);return{anchor,start:from??(options.date?anchor:includePast?void 0:nowValue),end:to,fullPeriod:!1}}function buildFixedPeriodRange(anchor,nowValue,includePast,fullPeriodRequested,periodStart,periodEnd){const fullPeriod=includePast||fullPeriodRequested;return{anchor,start:fullPeriod?periodStart:maxTimestamp(periodStart,nowValue),end:periodEnd,periodStart,periodEnd,fullPeriod}}function bucketEventsByDay(events){const dayMap=new Map;for(const event of events){const list=dayMap.get(event.date)??[];list.push(event),dayMap.set(event.date,list)}return[...dayMap.entries()].sort(([left],[right])=>left.localeCompare(right)).map(([date,dayEvents])=>({date,count:dayEvents.length,events:sortEvents(dayEvents)}))}function summarize(events){const itemIds=new Set,byType=new Map,byStatus=new Map;let deadlines=0,reminders=0,scheduled=0,recurringEvents=0;for(const event of events)itemIds.add(event.item_id),incrementCount(byType,event.item_type),incrementCount(byStatus,event.item_status),event.kind==="deadline"?deadlines+=1:event.kind==="reminder"?reminders+=1:(scheduled+=1,event.event_recurring===!0&&(recurringEvents+=1));return{events:events.length,items:itemIds.size,deadlines,reminders,scheduled,by_kind:{deadline:deadlines,reminder:reminders,event:scheduled},by_type:toSortedCountRecord(byType),by_status:toSortedCountRecord(byStatus),recurring_events:recurringEvents}}function formatWindow(range){const start=range.start??"unbounded",end=range.end??"unbounded";return`${start} -> ${end}`}function formatClock(timestamp,timezone){if(timezone&&timezone!=="UTC")try{const parts=new Intl.DateTimeFormat("en-GB",{timeZone:timezone,hour:"2-digit",minute:"2-digit",hourCycle:"h23"}).formatToParts(new Date(timestamp)),hour=parts.find(part=>part.type==="hour")?.value,minute=parts.find(part=>part.type==="minute")?.value;if(hour&&minute)return`${hour}:${minute}`}catch{}return`${new Date(timestamp).toISOString().slice(11,16)}Z`}function formatSummaryCountRecord(values){const entries=Object.entries(values);return entries.length===0?"empty":entries.map(([key,value])=>`${key}=${value}`).join(", ")}function formatEventEnd(event){return event.event_end?event.event_all_day===!0?event.event_end.slice(0,10):event.date===toLocalDayKey(event.event_end,event.event_timezone)?formatClock(event.event_end,event.event_timezone):event.event_end:null}function formatEventLine(event){const core=`${formatClock(event.at,event.event_timezone)} [${event.kind}] ${event.item_id} type=${event.item_type} p${event.item_priority} ${event.item_status} ${event.item_title}`;if(event.kind==="reminder"){const reminderText=event.reminder_text??"";return`${core} \u2014 ${reminderText} reminder=${JSON.stringify(reminderText)}`}if(event.kind==="event"){const details=[],title=event.event_title??event.item_title;event.event_title!==null&&event.event_title!==event.item_title&&(details.push(title),details.push(`title=${JSON.stringify(title)}`)),event.event_recurring&&(details.push("(recurring)"),details.push("recurring=true"));const end=formatEventEnd(event);return end&&details.push(`end=${end}`),event.event_all_day!==null&&details.push(`all_day=${event.event_all_day?"true":"false"}`),event.event_timezone&&details.push(`timezone=${event.event_timezone}`),event.event_location&&(details.push(`@ ${event.event_location}`),details.push(`location=${JSON.stringify(event.event_location)}`)),event.event_recurrence_rule&&details.push(`recurrence=${event.event_recurrence_rule}`),event.reminder_text&&details.push(`description=${JSON.stringify(event.reminder_text)}`),`${core} \u2014 ${details.join(" ")}`}return core}function renderCalendarMarkdown(result){const lines=[];if(lines.push(`# pm calendar (${result.view})`),lines.push(""),lines.push(`- now: ${result.now}`),lines.push(`- window: ${formatWindow(result.range)}`),result.range.period_start&&result.range.period_end&&(lines.push(`- period: ${result.range.period_start} -> ${result.range.period_end}`),lines.push(`- period-mode: ${result.range.full_period?"full-period":"active-window"}`)),lines.push(`- events: ${result.summary.events} (deadlines: ${result.summary.deadlines}, reminders: ${result.summary.reminders}, scheduled: ${result.summary.scheduled})`),lines.push(`- items: ${result.summary.items}`),lines.push(`- by-kind: ${formatSummaryCountRecord(result.summary.by_kind)}`),lines.push(`- by-type: ${formatSummaryCountRecord(result.summary.by_type)}`),lines.push(`- by-status: ${formatSummaryCountRecord(result.summary.by_status)}`),lines.push(`- recurring-events: ${result.summary.recurring_events}`),lines.push(""),result.events.length===0)return lines.push("No calendar events matched the selected filters."),lines.join(`
|
|
2
|
+
`);for(const day of result.days){lines.push(`## ${day.date} (${day.count})`);for(const event of day.events)lines.push(`- ${formatEventLine(event)}`);lines.push("")}if(result.warnings&&result.warnings.length>0){lines.push("### warnings");for(const warning of result.warnings)lines.push(`- ${warning}`);lines.push("")}return trimTrailingNewlines(lines.join(`
|
|
3
|
+
`))}function renderCalendarToon(result){return encodeToon(result)}function trimTrailingNewlines(value){let end=value.length;for(;end>0&&value[end-1]===`
|
|
4
|
+
`;)end-=1;return value.slice(0,end)}function resolveCalendarExecutionInputs(options){const nowValue=nowIso(),view=parseView(options.view),rangeBounds=buildRange(view,options,nowValue),limit=parseIntegerLimit(options.limit),includeSources=parseIncludeSources(options.include),explicitLookahead=parseNonNegativeInteger(options.recurrenceLookaheadDays,"Calendar recurrence lookahead days"),recurrenceLookbackDays=parseNonNegativeInteger(options.recurrenceLookbackDays,"Calendar recurrence lookback days"),occurrenceLimit=parseNonNegativeInteger(options.occurrenceLimit,"Calendar occurrence limit");if(occurrenceLimit!==void 0&&occurrenceLimit<1)throw new PmCliError("Calendar occurrence limit must be >= 1",EXIT_CODE.USAGE);const eventsOnly=includeSources.has("events")&&!includeSources.has("deadlines")&&!includeSources.has("reminders"),hasExplicitBounds=options.to!==void 0||explicitLookahead!==void 0||recurrenceLookbackDays!==void 0||occurrenceLimit!==void 0,eventsOnlyCapApplied=eventsOnly&&!hasExplicitBounds;return{nowValue,view,rangeBounds,limit,includeSources,occurrenceLimit,recurrenceLookaheadDays:eventsOnlyCapApplied?DEFAULT_EVENTS_ONLY_LOOKAHEAD_DAYS:explicitLookahead,recurrenceLookbackWindowDays:eventsOnlyCapApplied&&recurrenceLookbackDays===void 0?0:recurrenceLookbackDays,eventsOnlyCapApplied}}function appendCalendarCapWarning(warnings,capApplied){capApplied&&warnings.push(`recurring_events_default_cap_applied:lookback=0d,lookahead=${DEFAULT_EVENTS_ONLY_LOOKAHEAD_DAYS}d -- use --recurrence-lookback-days/--recurrence-lookahead-days or --to for wider range`)}function buildCalendarFiltersResult(options,runtimeFieldFilters){return{type:options.type??null,tag:options.tag??null,priority:options.priority??null,status:options.status??null,assignee:options.assignee??null,assignee_filter:options.assigneeFilter??null,sprint:options.sprint??null,release:options.release??null,runtime_filters:runtimeFieldFilters,limit:options.limit??null,include:options.include??null,full_period:options.fullPeriod===!0?"true":null,recurrence_lookahead_days:options.recurrenceLookaheadDays??null,recurrence_lookback_days:options.recurrenceLookbackDays??null,occurrence_limit:options.occurrenceLimit??null}}function buildCalendarRangeResult(options,rangeBounds){return{start:rangeBounds.start??null,end:rangeBounds.end??null,period_start:rangeBounds.periodStart??null,period_end:rangeBounds.periodEnd??null,full_period:rangeBounds.fullPeriod,past:options.past===!0,from:options.from??null,to:options.to??null}}async function runCalendar(options,global2){const pmRoot=resolvePmRoot(process.cwd(),global2.path);await assertInitializedTracker(pmRoot);const inputs=resolveCalendarExecutionInputs(options),settings=await readSettings(pmRoot),statusRegistry=resolveRuntimeStatusRegistry(settings.schema),runtimeFieldRegistry=resolveRuntimeFieldRegistry(settings.schema),runtimeFieldFilters=collectRuntimeFilterValues(options,runtimeFieldRegistry,"calendar"),typeRegistry=resolveItemTypeRegistry(settings,getActiveExtensionRegistrations()),listWarnings=[];appendCalendarCapWarning(listWarnings,inputs.eventsOnlyCapApplied);const items=await listAllItemMetadataLight(pmRoot,settings.item_format,typeRegistry.type_to_folder,listWarnings,settings.schema),filteredItems=filterItems(items,options,typeRegistry,statusRegistry,runtimeFieldFilters),recurringWindow=buildRecurringEventWindow(inputs.rangeBounds.start,inputs.rangeBounds.end,inputs.nowValue,inputs.recurrenceLookbackWindowDays,inputs.recurrenceLookaheadDays),rangedEvents=buildEventSeed(filteredItems,recurringWindow,inputs.includeSources,inputs.occurrenceLimit).filter(event=>includeEventInWindow(event,inputs.rangeBounds.start,inputs.rangeBounds.end)),limitedEvents=inputs.limit===void 0?rangedEvents:rangedEvents.slice(0,inputs.limit),days=bucketEventsByDay(limitedEvents),warnings=[...new Set(listWarnings)].sort((left,right)=>left.localeCompare(right));return{view:inputs.view,output_default:"markdown",now:inputs.nowValue,anchor:inputs.rangeBounds.anchor,range:buildCalendarRangeResult(options,inputs.rangeBounds),filters:buildCalendarFiltersResult(options,runtimeFieldFilters),summary:summarize(limitedEvents),events:limitedEvents,days,...warnings.length>0?{warnings}:{}}}export{renderCalendarMarkdown,renderCalendarToon,resolveCalendarOutputFormat,runCalendar};
|
|
2
5
|
//# sourceMappingURL=calendar.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
|
|
1
|
+
(function(){try{var e=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},n=new e.Error().stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="b70f6764-9f83-5371-8ebc-1d0d5703bc1f")}catch{}})();import{markCanonicalSdkReadOutputOptions}from"../read-output/provenance.js";const PM_COMPLETE_LIST_FINDING_CODES=["invalid_envelope","source_incomplete","source_unchecked","filtered_corpus","terminal_items_excluded","strict_read_unproven","page_incomplete","count_mismatch","projection_incomplete","field_omission","omission_receipt_missing","omission_receipt_invalid","read_output_missing","read_output_invalid","read_output_dimensions_incomplete","budget_compaction","budget_omission","session_projection","invalid_item_id","duplicate_item_id"];class PmCompleteListValidationError extends Error{receipt;constructor(findings){super(`Complete-list certification failed: ${findings.map(finding=>finding.code).join(", ")}.`),this.name="PmCompleteListValidationError",this.receipt={contract_version:1,contract:"complete_list",findings,recovery:{suggested_retry:"pm list --all --output-include full --strict-read --no-truncate --output-budget unbounded --output-limit unbounded --json",sdk:"await client.listAllComplete()"}}}}function createCompleteListOptions(options={}){return markCanonicalSdkReadOutputOptions({excludeTerminal:!1,full:!0,...options.includeBody===void 0?{}:{includeBody:options.includeBody},noTruncate:!0,outputBudget:"unbounded",outputLimit:"unbounded",strictRead:!0},["full"])}function isRecord(value){return typeof value=="object"&&value!==null&&!Array.isArray(value)}function addFinding(findings,condition,code,message){condition&&findings.push({code,message})}function inspectSourceScope(candidate,findings){const completeness=isRecord(candidate.completeness)?candidate.completeness:{};addFinding(findings,completeness.status==="partial","source_incomplete","The source scan reported unreadable tracker artifacts."),addFinding(findings,completeness.status!=="complete"&&completeness.status!=="partial","source_unchecked","The source scan did not prove completeness.");const unreadableItemCount=completeness.unreadable_item_count,unreadableDirectoryCount=completeness.unreadable_directory_count;addFinding(findings,completeness.status==="complete"&&(unreadableItemCount!==0||unreadableDirectoryCount!==0)&&Number.isSafeInteger(unreadableItemCount)&&Number.isSafeInteger(unreadableDirectoryCount),"source_incomplete","The source scan reports unreadable tracker artifacts despite a complete status."),addFinding(findings,completeness.status==="complete"&&(!Number.isSafeInteger(unreadableItemCount)||!Number.isSafeInteger(unreadableDirectoryCount)||Number(unreadableItemCount)<0||Number(unreadableDirectoryCount)<0),"source_unchecked","The source scan did not report safe non-negative unreadable counts.");const filters=isRecord(candidate.filters)?candidate.filters:{},runtimeFilters=isRecord(filters.runtime_filters)?filters.runtime_filters:{},filterEchoKeys=new Set(["exclude_terminal","include_body","no_truncate","runtime_filters","status","strict_read"]);return addFinding(findings,filters.status!=="all"||Object.keys(runtimeFilters).length>0||Object.keys(filters).some(key=>!filterEchoKeys.has(key)),"filtered_corpus","The list did not explicitly select every lifecycle status."),addFinding(findings,filters.exclude_terminal===!0,"terminal_items_excluded","Terminal lifecycle states were explicitly excluded."),addFinding(findings,filters.strict_read!==!0,"strict_read_unproven","The result does not echo strict source-read enforcement."),filters}function inspectEnvelopeShape(candidate,filters,findings){addFinding(findings,candidate.has_more!==!1||candidate.next_cursor!==null||candidate.truncated!==!1||candidate.applied_limit!==void 0||filters.no_truncate!==!0,"page_incomplete","Pagination or a row ceiling may have withheld items."),addFinding(findings,candidate.count!==candidate.items.length||candidate.total!==candidate.items.length,"count_mismatch","Envelope counts do not equal the returned item count.");const projection=isRecord(candidate.projection)?candidate.projection:{};addFinding(findings,projection.mode!=="full"||projection.fields!==null,"projection_incomplete","The result is not the full metadata projection.");const omissionReceipt=isRecord(candidate.omission_receipt)?candidate.omission_receipt:void 0;addFinding(findings,omissionReceipt===void 0,"omission_receipt_missing","The result carries no field-omission receipt."),addFinding(findings,omissionReceipt!==void 0&&(omissionReceipt.has_omissions!==!1||omissionReceipt.omitted_field_group_count!==0||!Number.isSafeInteger(omissionReceipt.omitted_field_group_count)||!Array.isArray(omissionReceipt.omitted_field_groups)||omissionReceipt.omitted_field_groups.length!==0),"omission_receipt_invalid","The field-omission receipt is malformed or contradicts its no-omission claim."),addFinding(findings,omissionReceipt?.has_omissions===!0,"field_omission","The omission receipt reports withheld field groups.")}function isInvalidCompleteListReadOutput(readOutput){return readOutput.contract_version!==1||readOutput.command!=="list"||readOutput.within_budget!==!0||readOutput.strings_compacted!==!1||readOutput.rows_compacted!==!1||readOutput.result_omitted!==!1}function hasCompleteListReadOutputDimensions(readOutput){if(!Array.isArray(readOutput.requested_dimensions))return!1;const requestedDimensions=new Set(readOutput.requested_dimensions);return["include","amount","cost"].every(dimension=>requestedDimensions.has(dimension))}function inspectOutputScope(candidate,findings){const readOutput=isRecord(candidate.read_output)?candidate.read_output:void 0;addFinding(findings,readOutput===void 0,"read_output_missing","The result carries no universal read-output receipt."),addFinding(findings,readOutput!==void 0&&isInvalidCompleteListReadOutput(readOutput),"read_output_invalid","The universal read-output receipt does not prove an intact list result."),addFinding(findings,readOutput!==void 0&&!hasCompleteListReadOutputDimensions(readOutput),"read_output_dimensions_incomplete","The universal read-output receipt does not prove full, unbounded include, amount, and cost dimensions."),addFinding(findings,readOutput?.strings_compacted===!0||readOutput?.rows_compacted===!0||candidate.output_budget_truncation!==void 0,"budget_compaction","Universal output shaping compacted the result.");const budgetExceeded=isRecord(candidate.output_budget_exceeded)?candidate.output_budget_exceeded:void 0;addFinding(findings,readOutput?.result_omitted===!0||budgetExceeded?.omitted_result===!0,"budget_omission","Universal output shaping omitted the useful result."),addFinding(findings,candidate.read_session!==void 0,"session_projection","A cross-call read session can suppress previously served facts.")}function inspectItemIds(items,findings){const ids=items.map(item=>isRecord(item)&&typeof item.id=="string"?item.id.trim():"");addFinding(findings,ids.some(id=>id.length===0),"invalid_item_id","Every full item row must carry a non-empty string id."),addFinding(findings,new Set(ids).size!==ids.length,"duplicate_item_id","Every item id must occur exactly once.")}function inspectCompleteListResult(candidate){if(!isRecord(candidate)||!Array.isArray(candidate.items))return{ok:!1,findings:[{code:PM_COMPLETE_LIST_FINDING_CODES[0],message:"The result must be an object with an items array."}]};const envelope=candidate,findings=[],filters=inspectSourceScope(envelope,findings);return inspectEnvelopeShape(envelope,filters,findings),inspectOutputScope(envelope,findings),inspectItemIds(envelope.items,findings),{ok:findings.length===0,findings}}function certifyCompleteListResult(candidate){const inspection=inspectCompleteListResult(candidate);if(!inspection.ok)throw new PmCompleteListValidationError(inspection.findings);const result=candidate;return{...result,complete_list:{contract_version:1,item_count:result.items.length,unique_item_id_count:new Set(result.items.map(item=>item.id)).size,terminal_items_included:!0,source_complete:!0,full_projection:!0,no_omissions:!0,unbounded:!0}}}function assertCompleteListResult(candidate){certifyCompleteListResult(candidate)}export{PM_COMPLETE_LIST_FINDING_CODES,PmCompleteListValidationError,assertCompleteListResult,certifyCompleteListResult,createCompleteListOptions,inspectCompleteListResult};
|
|
2
2
|
//# sourceMappingURL=complete-list.js.map
|
|
@@ -1,2 +1,3 @@
|
|
|
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]="a37f9e4a-750c-53e0-b8f3-7f92e9538f3d")}catch(e2){}})();import{SETTINGS_DEFAULTS,EXIT_CODE,PmCliError,compareTimestampStrings,nowIso,isTerminalStatus,normalizeStatusForRegistry,normalizeStatusInput,resolveRuntimeStatusRegistry,resolvePmRoot,readSettings,resolveAuthor,discoverExtensions,resolveItemTypeRegistry}from"../runtime-primitives.js";import{getActiveExtensionRegistrations}from"../../core/extensions/index.js";import{collectDependencyBlockedIds,resolveItemBlockers,resolveItemExecutionRole,computeActionabilityReport}from"../actionability.js";import{CONTEXT_DEPTH_VALUES,CONTEXT_SECTION_VALUES}from"../../types/index.js";import{parseIntegerLimit}from"./parsers.js";import{runCalendar}from"./calendar.js";import{runList}from"./list.js";import{runActivity}from"./activity.js";import{scoreContextCandidatesWithActiveExtensions}from"../context-relevance.js";import{buildItemContextRelevanceCandidates}from"../context-relevance.js";import{createQueryFingerprint,encodeQueryCursor,resolveQueryCursorStart,selectCursorSemanticOptions}from"../pagination.js";import{rememberReadOutputFocusRows,refreshReadOutputDeliveredCounts}from"../read-output-rows.js";import{CONTEXT_FLAG_CONTRACTS}from"../cli-contracts/flag-contracts.js";import{packContextCandidates}from"../context-packing.js";import{attachContextUsageServingReceipt,collectContextUsageDeliveredItemIds,readContextUsageAffinity,recordContextUsageServing}from"../context-usage.js";import{readWorkspaceContextSignals}from"../context-signal-store.js";import{readWorkspaceMemory,selectWorkspaceMemory}from"../workspace-memory.js";import{detectAgentIdentity}from"../../core/shared/author.js";import{readSessionState,semanticAttributionKey}from"../../core/session/session-state.js";import{semanticAttributionAffinity}from"../context/semantic-session-attribution.js";const CONTEXT_OUTPUT_VALUES=["markdown","toon","json","ndjson"];const HIGH_LEVEL_TYPES=new Set(["Epic","Feature"]);const DEFAULT_CONTEXT_LIMIT=10;const CONTEXT_SCALE_THRESHOLD=1e4;const STANDARD_SECTIONS=["hierarchy","activity","progress","recently_created","unparented","workload"];const DEEP_SECTIONS=[...STANDARD_SECTIONS,"blockers","files","staleness","tests"];const LEADING_HYPHEN_DATE=/^(\d{4})-(\d{2})-(\d{2})/;const LEADING_COMPACT_DATE=/^(\d{4})(\d{2})(\d{2})(?:[T ]?\d{2}|$)/;const COMPACT_DATE=/^(\d{4})(\d{2})(\d{2})$/;const COMPACT_DATETIME=/^(\d{4})(\d{2})(\d{2})(?:[T\s]?)(\d{2})(\d{2})(\d{2})?(Z|[+-]\d{2}:?\d{2})?$/i;function parseOutputFormat(raw){if(!raw)return void 0;const normalized=raw.trim().toLowerCase();if(!CONTEXT_OUTPUT_VALUES.includes(normalized)){throw new PmCliError("Context format must be one of markdown|toon|json|ndjson",EXIT_CODE.USAGE)}return normalized}const FOCUS_PROJECTION_FIELDS=new Set(["id","title","type","status","priority","order","deadline","assignee","tags","tags_inherited","updated_at","parent","children_total","children_closed","completion_pct","blocked","blocker_ids","created_at"]);function parseContextFocusFields(raw){if(raw===void 0)return void 0;const fields=[];for(const token of raw.split(",")){const normalized=token.trim().toLowerCase();if(normalized.length===0)continue;if(!FOCUS_PROJECTION_FIELDS.has(normalized)){throw new PmCliError(`Context --fields value not projectable: ${normalized} (valid: ${[...FOCUS_PROJECTION_FIELDS].join(", ")})`,EXIT_CODE.USAGE)}if(!fields.includes(normalized))fields.push(normalized)}if(fields.length===0){throw new PmCliError("Context --fields requires at least one field name",EXIT_CODE.USAGE)}return fields}function projectContextFocusRows(rows,fields){return rows.map(row=>{const projected={};const source=row;for(const field of fields){projected[field]=source[field]??null}return projected})}function resolveContextOutputFormat(options,global2){const commandFormat=parseOutputFormat(options.format);if(global2.json&&commandFormat&&commandFormat!=="json"&&commandFormat!=="ndjson"){throw new PmCliError("Cannot combine --json with --format markdown|toon",EXIT_CODE.USAGE)}if(global2.json){return commandFormat==="ndjson"?"ndjson":"json"}return commandFormat??"toon"}function parseContextLimit(raw,depth){return parseIntegerLimit(raw,"--limit")??(depth==="full"?Number.MAX_SAFE_INTEGER:DEFAULT_CONTEXT_LIMIT)}function resolveContextTokenBudget(raw,fallback){if(raw===void 0)return fallback;const parsed=typeof raw==="number"?raw:Number(raw);if(!Number.isInteger(parsed)||parsed<1){throw new PmCliError("--token-budget must be a positive integer",EXIT_CODE.USAGE)}return parsed}function resolveContextLimitAtScale(limit,itemCount){return itemCount>=CONTEXT_SCALE_THRESHOLD&&limit===Number.MAX_SAFE_INTEGER?DEFAULT_CONTEXT_LIMIT:limit}function parseContextDepth(raw,settings){if(!raw)return settings.default_depth;const normalized=raw.trim().toLowerCase();if(!CONTEXT_DEPTH_VALUES.includes(normalized)){throw new PmCliError(`Context --depth must be one of ${CONTEXT_DEPTH_VALUES.join("|")}`,EXIT_CODE.USAGE)}return normalized}function parseContextSections(raw,depth,settings){if(raw&&raw.length>0){const sections=[];for(const value of raw){const normalized=value.trim().toLowerCase();if(!CONTEXT_SECTION_VALUES.includes(normalized)){throw new PmCliError(`Context --section must be one of ${CONTEXT_SECTION_VALUES.join("|")}`,EXIT_CODE.USAGE)}if(!sections.includes(normalized)){sections.push(normalized)}}return sections}if(depth==="brief")return[];if(depth==="full")return[...CONTEXT_SECTION_VALUES];const pool=depth==="deep"?DEEP_SECTIONS:STANDARD_SECTIONS;return pool.filter(section=>settings.sections[section])}function parseActivityLimit(raw,settings){if(!raw)return settings.activity_limit;const parsed=parseIntegerLimit(raw,"--activity-limit");return parsed??settings.activity_limit}function parseStaleThresholdDays(raw,settings){if(!raw)return settings.stale_threshold_days;const trimmed=raw.trim().toLowerCase();const match=/^(\d+)d?$/.exec(trimmed);if(!match){throw new PmCliError("--stale-threshold must be a number of days (e.g. 7 or 7d)",EXIT_CODE.USAGE)}const days=parseInt(match[1],10);if(days<=0){throw new PmCliError("--stale-threshold must be positive",EXIT_CODE.USAGE)}return days}function statusRank(status,statusRegistry){const normalizedStatus=normalizeStatusForRegistry(status,statusRegistry);const blockedStatus=normalizeStatusInput("blocked",statusRegistry);const draftStatus=normalizeStatusInput("draft",statusRegistry);if(normalizedStatus===statusRegistry.in_progress_status)return 0;if(statusRegistry.active_statuses.has(normalizedStatus))return 1;if(blockedStatus&&normalizedStatus===blockedStatus)return 2;if(draftStatus&&normalizedStatus===draftStatus)return 3;if(statusRegistry.blocked_statuses.has(normalizedStatus))return 5;if(statusRegistry.terminal_statuses.has(normalizedStatus))return 7;return 6}function isClosedStatus(status,statusRegistry){const closeStatus=normalizeStatusInput("closed",statusRegistry);return normalizeStatusForRegistry(status,statusRegistry)===closeStatus}function isInProgressStatus(status,statusRegistry){return normalizeStatusForRegistry(status,statusRegistry)===statusRegistry.in_progress_status}function isOpenStatus(status,statusRegistry){const normalizedStatus=normalizeStatusForRegistry(status,statusRegistry);return normalizedStatus!==statusRegistry.in_progress_status&&statusRegistry.active_statuses.has(normalizedStatus)}function isBlockedStatus(status,statusRegistry){return statusRegistry.blocked_statuses.has(normalizeStatusForRegistry(status,statusRegistry))}const LIST_PROJECTION_FLAGS=["compact","brief","fields","includeBody","include_body","parent"];function stripListProjectionFlags(options){const copy={...options};for(const key of LIST_PROJECTION_FLAGS){delete copy[key]}return copy}function collectSubtreeIds(corpus,parentId){const target=parentId.trim().toLowerCase();const anchor=corpus.find(item=>item.id.trim().toLowerCase()===target);if(!anchor){return{ids:new Set,found:false}}const childrenByParent=buildChildrenByParent(corpus);const descendants=collectDescendants(anchor.id,childrenByParent);const ids=new Set([anchor.id,...descendants.map(item=>item.id)].map(id=>id.trim().toLowerCase()));return{ids,found:true}}function parseContextParent(raw){if(raw===void 0)return void 0;const trimmed=raw.trim();if(trimmed.length===0){throw new PmCliError("Context --parent requires an item id",EXIT_CODE.USAGE)}return trimmed}function compareOptionalOrder(left,right){const leftValue=left??null;const rightValue=right??null;if(leftValue===null&&rightValue===null)return 0;if(leftValue===null)return 1;if(rightValue===null)return-1;return leftValue-rightValue}function compareOptionalDeadline(left,right){const leftValue=left??null;const rightValue=right??null;if(leftValue===null&&rightValue===null)return 0;if(leftValue===null)return 1;if(rightValue===null)return-1;return compareTimestampStrings(leftValue,rightValue)}function daysInUtcMonth(year,monthIndex){return new Date(Date.UTC(year,monthIndex+1,0)).getUTCDate()}function hasNoInvalidDatePrefix(value){const match=LEADING_HYPHEN_DATE.exec(value)??LEADING_COMPACT_DATE.exec(value);if(!match){return true}const year=Number.parseInt(match[1],10);const month=Number.parseInt(match[2],10);const day=Number.parseInt(match[3],10);return month>=1&&month<=12&&day>=1&&day<=daysInUtcMonth(year,month-1)}function normalizeTimestampCandidate(value){const compactDate=COMPACT_DATE.exec(value);if(compactDate){return`${compactDate[1]}-${compactDate[2]}-${compactDate[3]}`}const compactDateTime=COMPACT_DATETIME.exec(value);if(compactDateTime){const[,year,month,day,hour,minute,secondRaw,offsetRaw]=compactDateTime;const second=secondRaw?`:${secondRaw}`:"";const offset=offsetRaw&&offsetRaw.length===5&&offsetRaw!=="Z"?`${offsetRaw.slice(0,3)}:${offsetRaw.slice(3)}`:offsetRaw??"";return`${year}-${month}-${day}T${hour}:${minute}${second}${offset}`}return value}function parseContextTimestampMs(value){if(typeof value!=="string"){return Number.NaN}const trimmed=value.trim();if(trimmed.length===0||!hasNoInvalidDatePrefix(trimmed)){return Number.NaN}const parsed=Date.parse(normalizeTimestampCandidate(trimmed));return Number.isFinite(parsed)?parsed:Number.NaN}function sortableTimestamp(value){const parsed=parseContextTimestampMs(value);return Number.isFinite(parsed)?new Date(parsed).toISOString():""}function dateTokenForTimestamp(value){const parsed=parseContextTimestampMs(value);return Number.isFinite(parsed)?new Date(parsed).toISOString().slice(0,10):"unknown"}function normalizedParentId(value){if(typeof value!=="string"){return null}const trimmed=value.trim();return trimmed.length>0?trimmed:null}function compareCriticalItems(left,right,statusRegistry){const byStatus=statusRank(left.status,statusRegistry)-statusRank(right.status,statusRegistry);if(byStatus!==0)return byStatus;const byPriority=left.priority-right.priority;if(byPriority!==0)return byPriority;const byOrder=compareOptionalOrder(left.order,right.order);if(byOrder!==0)return byOrder;const byDeadline=compareOptionalDeadline(left.deadline,right.deadline);if(byDeadline!==0)return byDeadline;const byUpdated=compareTimestampStrings(sortableTimestamp(right.updated_at),sortableTimestamp(left.updated_at));const byId=left.id.localeCompare(right.id);return byUpdated!==0?byUpdated:byId}function estimateJsonTokens(value){return Math.max(1,Math.ceil(Buffer.byteLength(JSON.stringify(value),"utf8")/4))}function packRankedContextItems(report,tokenBudget,requiredIds=new Set,profile="context"){return packContextCandidates(report.ranked.map(entry=>({id:entry.id,item:entry.item,rank:entry.rank,score:entry.score,required:requiredIds.has(entry.id),cluster:entry.item.parent?.trim()||entry.item.type,token_costs:{identity:estimateJsonTokens({id:entry.id,title:entry.item.title}),summary:estimateJsonTokens({id:entry.id,title:entry.item.title,type:entry.item.type,status:entry.item.status,priority:entry.item.priority,parent:entry.item.parent}),full:estimateJsonTokens(entry.item)}})),{tokenBudget,profile,latencyBudgetMs:25})}function toContextPackingSummary(report){return{...report,included:report.included.map(entry=>({id:entry.id,projection:entry.projection,tokens:entry.tokens}))}}function toContextRankingSummary(report,featureStore,servedItemIds){const ranked=servedItemIds===void 0?report.ranked:report.ranked.filter(entry=>servedItemIds.has(entry.id));return{model:report.model,available_signals:report.available_signals,items:ranked.map(entry=>({id:entry.id,rank:entry.rank,baseline_rank:entry.baseline_rank,score:entry.score,contributions:entry.contributions,...entry.signal_provenance===void 0?{}:{recency:entry.signal_provenance.recency}})),candidate_count:report.ranked.length,omitted_count:report.ranked.length-ranked.length,...featureStore?{feature_store:{source:featureStore.snapshot.source,cache_status:featureStore.cache_status,source_cursor:featureStore.snapshot.source_cursor,generated_at:featureStore.snapshot.generated_at}}:{}}}function completionPct(closed,total){return total>0?Math.round(closed/total*100):0}function buildChildrenByParent(allItems){const childrenByParent=new Map;for(const item of allItems){const parent=normalizedParentId(item.parent);if(!parent)continue;const children=childrenByParent.get(parent)??[];children.push(item);childrenByParent.set(parent,children)}return childrenByParent}function toContextFocusItem(item,statusRegistry,childrenByParent){const focus={id:item.id,title:item.title,type:item.type,status:item.status,priority:item.priority,order:item.order??null,deadline:item.deadline??null,assignee:item.assignee??null,tags:Array.isArray(item.tags)?[...item.tags]:[],updated_at:item.updated_at,parent:normalizedParentId(item.parent)};if(statusRegistry&&childrenByParent){const descendants=collectDescendants(item.id,childrenByParent);const total=descendants.length;if(total>0){const closed=descendants.filter(desc=>isClosedStatus(desc.status,statusRegistry)).length;focus.children_total=total;focus.children_closed=closed;focus.completion_pct=completionPct(closed,total)}}return focus}function summarizeAgenda(events){let deadlines=0;let reminders=0;let scheduled=0;const itemIds=new Set;for(const event of events){itemIds.add(event.item_id);if(event.kind==="deadline"){deadlines+=1;continue}if(event.kind==="reminder"){reminders+=1;continue}scheduled+=1}return{events:events.length,items:itemIds.size,deadlines,reminders,scheduled}}function mergeSortedWarnings(...warningGroups){return[...new Set(warningGroups.flatMap(group=>group??[]))].sort((left,right)=>left.localeCompare(right))}function filterTerminalCalendarEvents(events,statusRegistry){return events.filter(event=>!statusRegistry.terminal_statuses.has(normalizeStatusForRegistry(event.item_status,statusRegistry)))}function buildHierarchy(allItems,activeItems,statusRegistry,limit){const itemMap=new Map;for(const item of allItems){itemMap.set(item.id,item)}const childrenByParent=buildChildrenByParent(allItems);const activeHighLevelIds=new Set(activeItems.filter(item=>HIGH_LEVEL_TYPES.has(item.type)).map(item=>item.id));const nodes=[];for(const parentId of activeHighLevelIds){const parent=itemMap.get(parentId);if(!parent)continue;const allDescendants=collectDescendants(parentId,childrenByParent);const childItems=childrenByParent.get(parentId)??[];let closedCount=0;let openCount=0;let inProgressCount=0;let blockedCount=0;for(const desc of allDescendants){if(isClosedStatus(desc.status,statusRegistry))closedCount++;else if(isInProgressStatus(desc.status,statusRegistry))inProgressCount++;else if(isBlockedStatus(desc.status,statusRegistry))blockedCount++;else if(isOpenStatus(desc.status,statusRegistry))openCount++}const children=childItems.sort((a,b)=>compareCriticalItems(a,b,statusRegistry)).slice(0,limit).map(child=>{const grandchildren=collectDescendants(child.id,childrenByParent);const gcClosed=grandchildren.filter(gc=>isClosedStatus(gc.status,statusRegistry)).length;return{id:child.id,title:child.title,type:child.type,status:child.status,children_total:grandchildren.length,children_closed:gcClosed}});nodes.push({id:parent.id,title:parent.title,type:parent.type,status:parent.status,children_total:allDescendants.length,children_closed:closedCount,children_open:openCount,children_in_progress:inProgressCount,children_blocked:blockedCount,children})}return nodes.sort((a,b)=>{const aParent=itemMap.get(a.id);const bParent=itemMap.get(b.id);return compareCriticalItems(aParent,bParent,statusRegistry)}).slice(0,limit)}function collectDescendants(parentId,childrenByParent){const result=[];const stack=[parentId];const visited=new Set;while(stack.length>0){const current=stack.pop();if(visited.has(current))continue;visited.add(current);const children=childrenByParent.get(current)??[];for(const child of children){result.push(child);stack.push(child.id)}}return result}const _testOnly={buildActivity,buildBlockers,buildChildrenByParent,buildHierarchy,buildHotFiles,buildProgress,buildRecentlyCreated,buildStaleness,buildTestHealth,buildUnparented,buildWorkload,collectDescendants,collectSubtreeIds,compareCriticalItems,compareOptionalDeadline,compareOptionalOrder,completionPct,dateTokenForTimestamp,filterTerminalCalendarEvents,formatAgendaLine,isBlockedStatus,isClosedStatus,isInProgressStatus,isOpenStatus,mergeSortedWarnings,normalizedParentId,parseActivityLimit,parseContextLimit,resolveContextLimitAtScale,parseContextParent,parseContextTimestampMs,parseStaleThresholdDays,sortableTimestamp,statusRank,stripListProjectionFlags,summarizeAgenda,toContextFocusItem};async function buildActivity(activityLimit,global2){const result=await runActivity({compact:true,limit:String(activityLimit)},global2);return result.compact_activity??[]}function buildProgress(allItems,activeItems,blockedIds,statusRegistry,limit){const childrenByParent=new Map;for(const item of allItems){if(!item.parent)continue;const children=childrenByParent.get(item.parent)??[];children.push(item);childrenByParent.set(item.parent,children)}const activeHighLevel=activeItems.filter(item=>HIGH_LEVEL_TYPES.has(item.type));const entries=[];for(const parent of activeHighLevel){const descendants=collectDescendants(parent.id,childrenByParent);const total=descendants.length;if(total===0)continue;let closed=0;let open=0;let inProgress=0;let blocked=0;for(const desc of descendants){if(isClosedStatus(desc.status,statusRegistry))closed++;else if(blockedIds.has(desc.id.trim().toLowerCase()))blocked++;else if(isInProgressStatus(desc.status,statusRegistry))inProgress++;else if(isOpenStatus(desc.status,statusRegistry))open++}entries.push({id:parent.id,title:parent.title,type:parent.type,total,closed,open,in_progress:inProgress,blocked,completion_pct:completionPct(closed,total)})}return entries.sort((a,b)=>a.completion_pct-b.completion_pct).slice(0,limit)}function buildBlockers(blockedItems,fullCorpus,statusRegistry,limit){const itemsById=new Map(fullCorpus.map(item=>[item.id.trim().toLowerCase(),item]));return blockedItems.slice(0,limit).map(item=>{const blockers=resolveItemBlockers(item,itemsById,statusRegistry);const blockedBy=blockers.find(blocker=>!blocker.resolved)?.id??blockers[0]?.id??null;const blockerItem=blockedBy?itemsById.get(blockedBy.trim().toLowerCase()):void 0;return{id:item.id,title:item.title,blocked_by:blockedBy,blocked_by_title:blockerItem?.title??null,blocked_by_status:blockerItem?.status??null,blocked_reason:item.blocked_reason??null,unblock_note:item.unblock_note??null}})}function buildHotFiles(activeItems,limit){const fileMap=new Map;for(const item of activeItems){for(const file of item.files??[]){const existing=fileMap.get(file.path)??new Set;existing.add(item.id);fileMap.set(file.path,existing)}}return[...fileMap.entries()].map(([filePath,itemIds])=>({path:filePath,references:itemIds.size,items:[...itemIds].sort()})).sort((a,b)=>b.references-a.references).slice(0,limit)}function buildWorkload(activeItems,statusRegistry,limit){const groups=new Map;for(const item of activeItems){const key=item.assignee??null;const existing=groups.get(key)??[];existing.push(item);groups.set(key,existing)}return[...groups.entries()].map(([assignee,items])=>({assignee,active:items.length,in_progress:items.filter(item=>isInProgressStatus(item.status,statusRegistry)).length,items:items.map(item=>item.id).sort()})).sort((a,b)=>b.active-a.active).slice(0,limit)}function buildStaleness(allNonTerminal,staleThresholdDays,now,limit){const cutoffMs=new Date(now).getTime()-staleThresholdDays*24*60*60*1e3;return allNonTerminal.filter(item=>new Date(item.updated_at).getTime()<cutoffMs).map(item=>({id:item.id,title:item.title,status:item.status,updated_at:item.updated_at,stale_days:Math.floor((new Date(now).getTime()-new Date(item.updated_at).getTime())/(24*60*60*1e3))})).sort((a,b)=>b.stale_days-a.stale_days).slice(0,limit)}function buildRecentlyCreated(allNonTerminal,statusRegistry,childrenByParent,limit){return allNonTerminal.map(item=>({item,sortKey:sortableTimestamp(item.created_at)})).sort((left,right)=>{const byCreated=compareTimestampStrings(right.sortKey,left.sortKey);return byCreated!==0?byCreated:left.item.id.localeCompare(right.item.id)}).slice(0,limit).map(({item})=>({...toContextFocusItem(item,statusRegistry,childrenByParent),created_at:item.created_at}))}function buildUnparented(allNonTerminal,statusRegistry,childrenByParent,limit){return allNonTerminal.filter(item=>!normalizedParentId(item.parent)&&!HIGH_LEVEL_TYPES.has(item.type)).sort((left,right)=>compareCriticalItems(left,right,statusRegistry)).slice(0,limit).map(item=>toContextFocusItem(item,statusRegistry,childrenByParent))}function buildTestHealth(activeItems){let itemsWithTests=0;let itemsWithRecentRuns=0;let passed=0;let failed=0;let skipped=0;const itemsFailing=[];for(const item of activeItems){if((item.tests??[]).length>0){itemsWithTests++}const runs=item.test_runs??[];if(runs.length>0){itemsWithRecentRuns++;let itemHasFailure=false;for(const run of runs){passed+=run.passed??0;failed+=run.failed??0;skipped+=run.skipped??0;if((run.failed??0)>0){itemHasFailure=true}}if(itemHasFailure){itemsFailing.push(item.id)}}}return{items_with_tests:itemsWithTests,items_with_recent_runs:itemsWithRecentRuns,recent_runs:{passed,failed,skipped},items_failing:itemsFailing.sort()}}function formatClock(timestamp){return`${new Date(timestamp).toISOString().slice(11,16)}Z`}function formatFocusLine(item){const orderToken=item.order===null?"-":String(item.order);const deadlineToken=item.deadline??"-";const parentToken=item.parent?` parent:${item.parent}`:"";const progressToken=item.children_total!==void 0&&item.children_closed!==void 0&&item.completion_pct!==void 0?` children:${item.children_closed}/${item.children_total} done:${item.completion_pct}%`:"";const blockedToken=item.blocked===true?` blocked:${item.blocker_ids?.join(",")||"lifecycle"}`:"";return`${item.id} p${item.priority} ${item.status} ${item.type} order:${orderToken} deadline:${deadlineToken}${parentToken}${progressToken}${blockedToken} ${item.title}`}function formatProjectedFocusLine(item,fields){const source=item;return fields.map(field=>{const value=source[field];if(Array.isArray(value))return`${field}:${value.join(",")}`;return`${field}:${value??"-"}`}).join(" ")}function formatAgendaLine(event){if("reference_only"in event){const suffix=event.kind==="reminder"?` \u2014 ${event.reminder_text??"reminder"}`:event.kind==="event"?` \u2014 ${event.event_title??"event"}${event.event_recurring?" (recurring)":""}`:"";return`${formatClock(event.at)} [${event.kind}] ${event.item_id} (see focus item)${suffix}`}const base=`${formatClock(event.at)} [${event.kind}] ${event.item_id} p${event.item_priority} ${event.item_status} ${event.item_title}`;if(event.kind==="reminder"){return`${base} \u2014 ${event.reminder_text}`}if(event.kind==="event"){const recurringSuffix=event.event_recurring?" (recurring)":"";const title=event.event_title??event.item_title;return`${base} \u2014 ${title}${recurringSuffix}`}return base}function pushContextFocusSection(lines,title,rows,emptyText,renderFocus){lines.push(`## ${title}`);if(rows.length===0){lines.push(emptyText)}else{for(const item of rows){lines.push(`- ${renderFocus(item)}`)}}lines.push("")}function pushBlockedFallbackSection(lines,result,renderFocus){if(result.blocked_fallback.length===0){return}lines.push("## Blocked fallback");for(const item of result.blocked_fallback){lines.push(`- ${renderFocus(item)}`)}lines.push("")}function pushAgendaSection(lines,result){lines.push("## Agenda");lines.push(`- events: ${result.agenda.summary.events} (deadlines: ${result.agenda.summary.deadlines}, reminders: ${result.agenda.summary.reminders}, scheduled: ${result.agenda.summary.scheduled})`);if(result.agenda.events.length===0){lines.push("No agenda events matched the selected filters.")}else{for(const event of result.agenda.events){lines.push(`- ${formatAgendaLine(event)}`)}}lines.push("")}function pushHierarchySection(lines,result){if(!result.hierarchy||result.hierarchy.length===0){return}lines.push("## Hierarchy");for(const node of result.hierarchy){const pct=node.children_total>0?Math.round(node.children_closed/node.children_total*100):0;lines.push(`- ${node.id} ${node.type} ${node.status} "${node.title}" [${node.children_closed}/${node.children_total} done ${pct}%]`);for(const child of node.children){const cpct=child.children_total>0?Math.round(child.children_closed/child.children_total*100):0;lines.push(` - ${child.id} ${child.type} ${child.status} "${child.title}" [${child.children_closed}/${child.children_total} done ${cpct}%]`)}}lines.push("")}function pushProgressSection(lines,result){if(!result.progress||result.progress.length===0){return}lines.push("## Progress");for(const entry of result.progress){lines.push(`- ${entry.id} "${entry.title}" ${entry.completion_pct}% (${entry.closed}/${entry.total} closed, ${entry.in_progress} wip, ${entry.open} open, ${entry.blocked} blocked)`)}lines.push("")}function pushRecentlyCreatedSection(lines,result,focusFields,renderFocus){if(!result.recently_created||result.recently_created.length===0){return}lines.push("## Recently created");for(const item of result.recently_created){lines.push(focusFields?`- ${renderFocus(item)}`:`- ${dateTokenForTimestamp(item.created_at)} ${formatFocusLine(item)}`)}lines.push("")}function pushUnparentedSection(lines,result,renderFocus){if(!result.unparented||result.unparented.length===0){return}lines.push("## Unparented");for(const item of result.unparented){lines.push(`- ${renderFocus(item)}`)}lines.push("")}function pushActivitySection(lines,result){if(!result.activity||result.activity.length===0){return}lines.push("## Recent activity");for(const entry of result.activity){const msg=entry.msg?` ${entry.msg}`:"";lines.push(`- ${entry.ts.slice(0,16)}Z ${entry.id} ${entry.op} by:${entry.author}${msg}`)}lines.push("")}function pushBlockersSection(lines,result){if(!result.blockers||result.blockers.length===0){return}lines.push("## Blockers");for(const entry of result.blockers){const by=entry.blocked_by?`blocked_by:${entry.blocked_by}(${entry.blocked_by_status??"?"})`:"blocked_by:-";const reason=entry.blocked_reason?` reason:"${entry.blocked_reason}"`:"";const note=entry.unblock_note?` unblock:"${entry.unblock_note}"`:"";lines.push(`- ${entry.id} "${entry.title}" ${by}${reason}${note}`)}lines.push("")}function pushFilesSection(lines,result){if(!result.files||result.files.length===0){return}lines.push("## Hot files");for(const file of result.files){lines.push(`- ${file.path} refs:${file.references} items:[${file.items.join(",")}]`)}lines.push("")}function pushWorkloadSection(lines,result){if(!result.workload||result.workload.length===0){return}lines.push("## Workload");for(const entry of result.workload){const who=entry.assignee??"(unassigned)";lines.push(`- ${who} active:${entry.active} wip:${entry.in_progress} items:[${entry.items.join(",")}]`)}lines.push("")}function pushStalenessSection(lines,result){if(!result.staleness||result.staleness.length===0){return}lines.push("## Stale items");for(const entry of result.staleness){lines.push(`- ${entry.id} ${entry.status} stale:${entry.stale_days}d last:${entry.updated_at.slice(0,10)} "${entry.title}"`)}lines.push("")}function pushTestHealthSection(lines,result){if(!result.tests){return}lines.push("## Test health");lines.push(`- items_with_tests: ${result.tests.items_with_tests}`);lines.push(`- items_with_recent_runs: ${result.tests.items_with_recent_runs}`);lines.push(`- passed: ${result.tests.recent_runs.passed}, failed: ${result.tests.recent_runs.failed}, skipped: ${result.tests.recent_runs.skipped}`);if(result.tests.items_failing.length>0){lines.push(`- items_failing: [${result.tests.items_failing.join(",")}]`)}lines.push("")}function pushEmptyContextSuggestions(lines,result){const isEmpty=result.summary.active_items===0&&result.summary.blocked===0&&result.agenda.summary.events===0;if(!isEmpty){return}lines.push("## Suggestions");lines.push("No active work items or upcoming events. Consider:");lines.push('- `pm create --type Task --title "..."` to add a new work item');lines.push("- `pm list --status closed --limit 5` to review recent completions");lines.push("- `pm search <keywords>` to find related past work");lines.push("- `pm aggregate` for a full project status overview")}function renderContextMarkdown(result){const lines=[];const focusFields=result.focus_fields;const renderFocus=item=>focusFields?formatProjectedFocusLine(item,focusFields):formatFocusLine(item);lines.push("# pm context");lines.push("");lines.push(`- now: ${result.now}`);lines.push(`- depth: ${result.depth}`);if(result.filters.parent){lines.push(`- scope: subtree of ${result.filters.parent}`)}lines.push(`- active_items: ${result.summary.active_items} (in_progress: ${result.summary.in_progress}, open: ${result.summary.open})`);if(result.summary.total_items!==void 0){lines.push(`- total_items: ${result.summary.total_items} (closed: ${result.summary.closed??0}, canceled: ${result.summary.canceled??0})`)}lines.push(`- agenda_events: ${result.summary.agenda_events}`);lines.push(`- blocked_fallback_used: ${result.summary.blocked_fallback_used}`);if(result.extension_health){const degradedNames=result.extension_health.packages.filter(entry=>entry.status==="degraded").map(entry=>entry.name);lines.push(`- extensions: ${result.extension_health.ok} ok, ${result.extension_health.degraded} degraded${degradedNames.length>0?` (${degradedNames.join(", ")})`:""}`)}const renderedSections=result.sections_included.filter(section=>section!=="blockers"||(result.blockers?.length??0)>0);if(renderedSections.length>0){lines.push(`- sections: ${renderedSections.join(", ")}`)}lines.push("");pushContextFocusSection(lines,"High-level focus",result.high_level,"No high-level active items.",renderFocus);pushContextFocusSection(lines,"Low-level focus",result.low_level,"No low-level active items.",renderFocus);pushBlockedFallbackSection(lines,result,renderFocus);pushAgendaSection(lines,result);if(result.workspace_memory){lines.push("## Workspace memory");for(const rollup of result.workspace_memory.rollups){lines.push(`- ${rollup.kind}:${rollup.key} \u2014 ${rollup.label} (${rollup.item_count} completed, latest ${rollup.last_closed_at})`)}lines.push("")}pushHierarchySection(lines,result);pushProgressSection(lines,result);pushRecentlyCreatedSection(lines,result,focusFields,renderFocus);pushUnparentedSection(lines,result,renderFocus);pushActivitySection(lines,result);pushBlockersSection(lines,result);pushFilesSection(lines,result);pushWorkloadSection(lines,result);pushStalenessSection(lines,result);pushTestHealthSection(lines,result);pushEmptyContextSuggestions(lines,result);return lines.join("\n")}async function resolveContextRuntime(options,global2){const pmRoot=resolvePmRoot(process.cwd(),global2.path);const settings=await readSettings(pmRoot);const contextSettings=settings.context??SETTINGS_DEFAULTS.context;const statusRegistry=resolveRuntimeStatusRegistry(settings.schema);const depth=parseContextDepth(options.depth,contextSettings);const limit=parseContextLimit(options.limit??options.maxItems,depth);return{settings,contextSettings,statusRegistry,depth,limit,sectionsIncluded:parseContextSections(options.section,depth,contextSettings),activityLimit:parseActivityLimit(options.activityLimit,contextSettings),staleThresholdDays:parseStaleThresholdDays(options.staleThreshold,contextSettings),parentScope:parseContextParent(options.parent),focusFields:parseContextFocusFields(options.fields),baseListOptions:stripListProjectionFlags(options)}}function contextNeedsAllItems(sectionsIncluded){return sectionsIncluded.some(section=>["hierarchy","progress","blockers","staleness","recently_created","unparented"].includes(section))}function buildUnpaginatedContextListOptions(baseListOptions,extra){return{...baseListOptions,...extra,noTruncate:true,limit:void 0,offset:void 0,after:void 0}}async function loadContextCorpus(global2,runtime){const listed=await runList(void 0,buildUnpaginatedContextListOptions(runtime.baseListOptions,{excludeTerminal:false}),global2);const fullCorpus=listed.items;let listedItemMetadata=fullCorpus.filter(item=>!isTerminalStatus(item.status,runtime.statusRegistry));let allItems=fullCorpus;const subtreeIds=resolveContextSubtreeIds(runtime.parentScope,fullCorpus);if(subtreeIds){listedItemMetadata=listedItemMetadata.filter(item=>subtreeIds.has(item.id.trim().toLowerCase()));allItems=allItems.filter(item=>subtreeIds.has(item.id.trim().toLowerCase()))}return{listed,listedItemMetadata,allItems,fullCorpus,subtreeIds}}function resolveContextSubtreeIds(parentScope,fullCorpus){if(parentScope===void 0){return void 0}const subtree=collectSubtreeIds(fullCorpus,parentScope);if(!subtree.found){throw new PmCliError(`Context --parent item not found: ${parentScope}`,EXIT_CODE.NOT_FOUND)}return subtree.ids}function collectHighLevelContextIds(activeItems,fullCorpus,statusRegistry,typeRegistry){const containers=new Set(computeActionabilityReport(activeItems,fullCorpus,statusRegistry,typeRegistry).containers.map(entry=>entry.item.id));return new Set(activeItems.filter(item=>HIGH_LEVEL_TYPES.has(item.type)||containers.has(item.id)||resolveItemExecutionRole(item.type,typeRegistry)!=="agent").map(item=>item.id))}async function resolveContextFocusGroups(listedItemMetadata,allItems,fullCorpus,blockedIds,statusRegistry,sectionsIncluded,limit,now,author,cursor,cursorFingerprint,useBoundedPage,pmRoot,tokenBudget,claimFocus,typeRegistry){const structural=[...listedItemMetadata].sort((left,right)=>compareCriticalItems(left,right,statusRegistry));const usage=await readContextUsageAffinity({pmRoot,author,enabled:process.env.PM_CONTEXT_USAGE_DISABLED!=="1"});const featureStore=await readWorkspaceContextSignals(structural,{pmRoot,storeKey:"context",statusRegistry,now,author,usageAffinity:usage.affinity,claimFocus});const ranking=await scoreContextCandidatesWithActiveExtensions("context",featureStore.candidates);const ranked=ranking.ranked.map(entry=>entry.item);const activeStatuses=statusRegistry.active_statuses;const rankedActiveItems=ranked.filter(item=>activeStatuses.has(normalizeStatusForRegistry(item.status,statusRegistry)));const pageStart=useBoundedPage?resolveQueryCursorStart(rankedActiveItems,cursor,cursorFingerprint,item=>item.id):0;const focusPage=useBoundedPage?rankedActiveItems.slice(pageStart,pageStart+limit):rankedActiveItems;const hasMore=useBoundedPage&&focusPage.length>0&&pageStart+focusPage.length<rankedActiveItems.length;const nextCursor=hasMore&&focusPage.length>0?encodeQueryCursor(cursorFingerprint,focusPage[focusPage.length-1].id,pageStart+focusPage.length-1):void 0;const rankedBlockedItems=ranked.filter(item=>blockedIds.has(item.id.trim().toLowerCase()));const packingIds=new Set([...focusPage.map(item=>item.id),...rankedBlockedItems.slice(0,limit).map(item=>item.id)]);const packing=packRankedContextItems({...ranking,ranked:ranking.ranked.filter(entry=>packingIds.has(entry.id))},tokenBudget,new Set(Object.entries(claimFocus??{}).filter(([,affinity])=>affinity>=1).map(([id])=>id)));const packedItems=packing.included.map(entry=>entry.item);const activeItems=packedItems.filter(item=>activeStatuses.has(normalizeStatusForRegistry(item.status,statusRegistry)));const blockedItems=packedItems.filter(item=>blockedIds.has(item.id.trim().toLowerCase()));const childrenByParent=buildChildrenByParent(allItems);const focusChildrenByParent=contextNeedsAllItems(sectionsIncluded)?childrenByParent:void 0;const fullCorpusById=new Map(fullCorpus.map(item=>[item.id.trim().toLowerCase(),item]));const projectFocusItem=item=>{const focus=toContextFocusItem(item,statusRegistry,focusChildrenByParent);if(!blockedIds.has(item.id.trim().toLowerCase())){return focus}focus.blocked=true;focus.blocker_ids=resolveItemBlockers(item,fullCorpusById,statusRegistry).filter(blocker=>!blocker.resolved).map(blocker=>blocker.id);return focus};const highLevelIds=collectHighLevelContextIds(activeItems,fullCorpus,statusRegistry,typeRegistry);const highLevel=activeItems.filter(item=>highLevelIds.has(item.id)).slice(0,useBoundedPage?focusPage.length:limit).map(projectFocusItem);const lowLevel=activeItems.filter(item=>!highLevelIds.has(item.id)).slice(0,useBoundedPage?focusPage.length:limit).map(projectFocusItem);const blockedFallbackUsed=rankedActiveItems.length===0;return{activeItems,blockedItems,highLevel,lowLevel,blockedFallback:blockedFallbackUsed?blockedItems.slice(0,limit).map(projectFocusItem):[],blockedFallbackUsed,ranking,packing,featureStore,pageExtras:{...useBoundedPage?{applied_limit:limit}:{},...hasMore?{has_more:true,truncated:true}:{},...nextCursor?{next_cursor:nextCursor}:{}}}}function buildContextCursorFingerprint(options,pmRoot){return createQueryFingerprint("context",{pmRoot,options:selectCursorSemanticOptions(options,CONTEXT_FLAG_CONTRACTS)})}function shouldPageContextFocus(options,corpusItemCount){return options.limit!==void 0||options.maxItems!==void 0||options.after!==void 0||corpusItemCount>=CONTEXT_SCALE_THRESHOLD}async function buildContextAgenda(global2,runtime,subtreeIds,listedFocusIds){const calendarOptions={...runtime.baseListOptions,view:"agenda",include:"all",limit:runtime.parentScope===void 0?String(runtime.limit):void 0};const agenda=await runCalendar(calendarOptions,global2);const scopedAgenda=subtreeIds===void 0?agenda.events:agenda.events.filter(event=>subtreeIds.has(event.item_id.trim().toLowerCase()));const fullAgendaEvents=filterTerminalCalendarEvents(scopedAgenda,runtime.statusRegistry).slice(0,runtime.limit);const agendaEvents=fullAgendaEvents.map(event=>{if(!listedFocusIds.has(event.item_id)){return event}return{at:event.at,date:event.date,kind:event.kind,item_id:event.item_id,reference_only:true,...event.kind==="reminder"?{reminder_text:event.reminder_text}:{},...event.kind==="event"?{event_title:event.event_title,event_recurring:event.event_recurring}:{}}});return{agenda,agendaEvents,agendaSummary:summarizeAgenda(fullAgendaEvents)}}function countContextStatus(items,status,statusRegistry){const targetStatus=String(status);return items.filter(item=>normalizeStatusForRegistry(item.status,statusRegistry)===targetStatus).length}async function buildOptionalContextSections(params){const{runtime,allItems,fullCorpus,blockedIds,focusGroups,now,global:global2}=params;const childrenByParent=buildChildrenByParent(allItems);const allNonTerminal=allItems.filter(item=>!isTerminalStatus(item.status,runtime.statusRegistry));const has=section=>runtime.sectionsIncluded.includes(section);return{hierarchy:has("hierarchy")?buildHierarchy(allItems,focusGroups.activeItems,runtime.statusRegistry,runtime.limit):void 0,activity:has("activity")?await buildActivity(runtime.activityLimit,global2):void 0,progress:has("progress")?buildProgress(allItems,focusGroups.activeItems,blockedIds,runtime.statusRegistry,runtime.limit):void 0,blockersSection:has("blockers")?buildBlockers(focusGroups.blockedItems,fullCorpus,runtime.statusRegistry,runtime.limit):void 0,recentlyCreated:has("recently_created")?buildRecentlyCreated(allNonTerminal,runtime.statusRegistry,childrenByParent,runtime.limit):void 0,unparented:has("unparented")?buildUnparented(allNonTerminal,runtime.statusRegistry,childrenByParent,runtime.limit):void 0,filesSection:has("files")?buildHotFiles(focusGroups.activeItems,runtime.limit):void 0,workload:has("workload")?buildWorkload(focusGroups.activeItems,runtime.statusRegistry,runtime.limit):void 0,staleness:has("staleness")?buildStaleness(allNonTerminal,runtime.staleThresholdDays,now,runtime.limit):void 0,tests:has("tests")?buildTestHealth(focusGroups.activeItems):void 0}}function buildContextSummaryExtras(allItems,statusRegistry,blockedIds){const canceledStatus=normalizeStatusInput("canceled",statusRegistry);const activeItems=allItems.filter(item=>statusRegistry.active_statuses.has(normalizeStatusForRegistry(item.status,statusRegistry)));const inProgress=countContextStatus(activeItems,statusRegistry.in_progress_status,statusRegistry);return{scope:"matching_items",active_items:activeItems.length,open:activeItems.length-inProgress,in_progress:inProgress,blocked:allItems.filter(item=>blockedIds.has(item.id.trim().toLowerCase())).length,total_items:allItems.length,closed:allItems.filter(item=>isClosedStatus(item.status,statusRegistry)).length,canceled:allItems.filter(item=>normalizeStatusForRegistry(item.status,statusRegistry)===canceledStatus).length}}function attachOptionalContextSections(result,sections,warningDetails){if(sections.hierarchy)result.hierarchy=sections.hierarchy;if(sections.activity)result.activity=sections.activity;if(sections.progress)result.progress=sections.progress;if(sections.blockersSection)result.blockers=sections.blockersSection;if(sections.recentlyCreated)result.recently_created=sections.recentlyCreated;if(sections.unparented)result.unparented=sections.unparented;if(sections.filesSection)result.files=sections.filesSection;if(sections.workload)result.workload=sections.workload;if(sections.staleness)result.staleness=sections.staleness;if(sections.tests)result.tests=sections.tests;if(warningDetails!==void 0&&warningDetails.length>0){result.warning_details=warningDetails}}function applyContextFocusProjection(result,focusFields){if(!focusFields){return}result.focus_fields=focusFields;result.high_level=projectContextFocusRows(result.high_level,focusFields);result.low_level=projectContextFocusRows(result.low_level,focusFields);result.blocked_fallback=projectContextFocusRows(result.blocked_fallback,focusFields);if(result.recently_created){result.recently_created=projectContextFocusRows(result.recently_created,focusFields)}if(result.unparented){result.unparented=projectContextFocusRows(result.unparented,focusFields)}}function applyContextTagProjection(result,noTags){const rows=[result.high_level,result.low_level,result.blocked_fallback,result.recently_created??[],result.unparented??[]].flat();if(noTags){for(const row of rows){delete row.tags;delete row.tags_inherited}return}const rowsById=new Map(rows.map(row=>[row.id,row]));const originalTagSignatures=new Map(rows.map(row=>[row.id,row.tags?[...row.tags].sort().join("\0"):void 0]));for(const row of rows){if(!row.parent||!row.tags){continue}const parent=rowsById.get(row.parent);if(parent&&originalTagSignatures.get(row.id)===originalTagSignatures.get(parent.id)){delete row.tags;row.tags_inherited=parent.id}}}function maybeAttachEmptyContextSuggestions(result,activeItems,blockedItems){if(activeItems.length>0||blockedItems.length>0||result.agenda.events.length>0){return}result.suggestions=['pm create --type Task --title "..." to add a new work item',"pm list --status closed --limit 5 to review recent completions","pm search <keywords> to find related past work","pm aggregate for a full project status overview"]}async function attachContextUsageFeedback(result,focusGroups,pmRoot,author){try{const included=new Set(focusGroups.packing.included.map(entry=>entry.id));const rows=focusGroups.ranking.ranked.map(entry=>({id:entry.id,rank:entry.rank,included:included.has(entry.id)}));const rankedIds=new Set(rows.map(row=>row.id));for(const id of collectContextUsageDeliveredItemIds(result,"context")){if(!rankedIds.has(id)){rows.push({id,rank:rows.length+1,included:false});rankedIds.add(id)}}const receipt=await recordContextUsageServing({pmRoot,author,surface:"context",profile:focusGroups.packing.profile,rows,enabled:process.env.PM_CONTEXT_USAGE_DISABLED!=="1"});attachContextUsageServingReceipt(result,receipt)}catch{result.warnings=mergeSortedWarnings(result.warnings,["context_usage_feedback_write_failed"])}}async function resolveContextExtensionHealthProjection(omitted,pmRoot,settings){if(omitted)return{};const discovery=await discoverExtensions({pmRoot,settings,cwd:process.cwd(),noExtensions:false});const packages=discovery.discovered.map(diagnostic=>({name:diagnostic.name??diagnostic.directory,status:diagnostic.status==="ok"?"ok":"degraded"})).sort((left,right)=>left.name.localeCompare(right.name));const degraded=packages.filter(entry=>entry.status==="degraded").length;if(packages.length===0)return{};return{extension_health:{total:packages.length,ok:packages.length-degraded,degraded,packages:packages.slice(0,20),...packages.length>20?{truncated:true}:{}}}}async function resolveContextSemanticAffinity(pmRoot,author){const identity=detectAgentIdentity();const semanticState=await readSessionState(pmRoot);const attributionKey=identity.instance||semanticAttributionKey(author);return semanticAttributionAffinity(semanticState.semantic_attribution?.[attributionKey])}async function runContext(options,global2){const pmRoot=resolvePmRoot(process.cwd(),global2.path);const resolvedRuntime=await resolveContextRuntime(options,global2);const corpus=await loadContextCorpus(global2,resolvedRuntime);const scaledLimit=resolveContextLimitAtScale(resolvedRuntime.limit,corpus.fullCorpus.length);const runtime={...resolvedRuntime,limit:scaledLimit,tokenBudget:resolveContextTokenBudget(options.tokenBudget,Math.max(256,scaledLimit*160))};const author=resolveAuthor(void 0,runtime.settings.author_default);const claimFocus=await resolveContextSemanticAffinity(pmRoot,author);const extensionHealthPromise=resolveContextExtensionHealthProjection(options.noExtensionHealth===true,pmRoot,runtime.settings);const blockedIds=collectDependencyBlockedIds(corpus.fullCorpus,runtime.statusRegistry);const focusGroups=await resolveContextFocusGroups(corpus.listedItemMetadata,corpus.allItems,corpus.fullCorpus,blockedIds,runtime.statusRegistry,runtime.sectionsIncluded,runtime.limit,nowIso(),author,options.after,buildContextCursorFingerprint(options,pmRoot),shouldPageContextFocus(options,corpus.fullCorpus.length),pmRoot,runtime.tokenBudget,claimFocus,resolveItemTypeRegistry(runtime.settings,getActiveExtensionRegistrations()));const agendaContext=await buildContextAgenda(global2,runtime,corpus.subtreeIds,new Set([...focusGroups.highLevel,...focusGroups.lowLevel,...focusGroups.blockedFallback].map(item=>item.id)));const workspaceMemory=await readWorkspaceMemory(corpus.fullCorpus,{pmRoot,statusRegistry:runtime.statusRegistry,now:agendaContext.agenda.now});const warnings=mergeSortedWarnings(corpus.listed.warnings,agendaContext.agenda.warnings,focusGroups.ranking.warnings,[...focusGroups.featureStore.warnings],workspaceMemory.warnings);const inProgressCount=countContextStatus(focusGroups.activeItems,runtime.statusRegistry.in_progress_status,runtime.statusRegistry);const openCount=focusGroups.activeItems.length-inProgressCount;const sections=await buildOptionalContextSections({runtime,allItems:corpus.allItems,fullCorpus:corpus.fullCorpus,blockedIds,focusGroups,now:agendaContext.agenda.now,global:global2});const summaryExtras=buildContextSummaryExtras(corpus.allItems,runtime.statusRegistry,blockedIds);const result={output_default:"toon",now:agendaContext.agenda.now,depth:runtime.depth,sections_included:runtime.sectionsIncluded,window:{anchor:agendaContext.agenda.anchor,start:agendaContext.agenda.range.start,end:agendaContext.agenda.range.end,past:agendaContext.agenda.range.past,from:agendaContext.agenda.range.from,to:agendaContext.agenda.range.to},filters:{type:options.type??null,tag:options.tag??null,priority:options.priority??null,assignee:options.assignee??null,assignee_filter:options.assigneeFilter??null,sprint:options.sprint??null,release:options.release??null,limit:options.limit??options.maxItems??null,parent:runtime.parentScope??null,token_budget:runtime.tokenBudget,runtime_filters:corpus.listed.filters.runtime_filters??agendaContext.agenda.filters.runtime_filters??{}},summary:{returned_focus:{active_items:focusGroups.activeItems.length,in_progress:inProgressCount,open:openCount,blocked:focusGroups.blockedItems.length},blocked_fallback_used:focusGroups.blockedFallbackUsed,high_level:focusGroups.highLevel.length,low_level:focusGroups.lowLevel.length,agenda_events:agendaContext.agendaSummary.events,...summaryExtras},high_level:focusGroups.highLevel,low_level:focusGroups.lowLevel,blocked_fallback:focusGroups.blockedFallback,agenda:{summary:agendaContext.agendaSummary,events:agendaContext.agendaEvents},...focusGroups.pageExtras};result.workspace_memory=selectWorkspaceMemory(workspaceMemory,Math.min(800,Math.floor(runtime.tokenBudget*.2)));Object.assign(result,await extensionHealthPromise);attachOptionalContextSections(result,sections,focusGroups.featureStore.warning_details);applyContextTagProjection(result,options.noTags===true);if(options.explainRanking===true){result.ranking=toContextRankingSummary(focusGroups.ranking,focusGroups.featureStore,new Set([...focusGroups.highLevel,...focusGroups.lowLevel,...focusGroups.blockedFallback].map(entry=>entry.id)));result.packing=toContextPackingSummary(focusGroups.packing)}rememberReadOutputFocusRows(result,[...focusGroups.highLevel,...focusGroups.lowLevel,...focusGroups.blockedFallback].map(row=>({id:row.id,status:normalizeStatusForRegistry(row.status,runtime.statusRegistry)===runtime.statusRegistry.in_progress_status?"in_progress":"open",blocked:row.blocked})));applyContextFocusProjection(result,runtime.focusFields);refreshReadOutputDeliveredCounts(result);if(warnings.length>0)result.warnings=warnings;maybeAttachEmptyContextSuggestions(result,focusGroups.activeItems,focusGroups.blockedItems);await attachContextUsageFeedback(result,focusGroups,pmRoot,author);return result}export{CONTEXT_OUTPUT_VALUES,_testOnly,applyContextTagProjection,buildChildrenByParent,buildItemContextRelevanceCandidates,collectSubtreeIds,compareCriticalItems,mergeSortedWarnings,packRankedContextItems,parseContextDepth,parseContextFocusFields,parseContextSections,projectContextFocusRows,renderContextMarkdown,resolveContextExtensionHealthProjection,resolveContextOutputFormat,resolveContextTokenBudget,runContext,toContextFocusItem,toContextPackingSummary,toContextRankingSummary};
|
|
1
|
+
(function(){try{var e=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},n=new e.Error().stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="599ebac9-d3e8-561d-a971-8164179f1adf")}catch{}})();import{SETTINGS_DEFAULTS,EXIT_CODE,PmCliError,compareTimestampStrings,nowIso,isTerminalStatus,normalizeStatusForRegistry,normalizeStatusInput,resolveRuntimeStatusRegistry,resolvePmRoot,readSettings,resolveAuthor,discoverExtensions,resolveItemTypeRegistry}from"../runtime-primitives.js";import{getActiveExtensionRegistrations}from"../../core/extensions/index.js";import{collectDependencyBlockedIds,resolveItemBlockers,resolveItemExecutionRole,computeActionabilityReport}from"../actionability.js";import{CONTEXT_DEPTH_VALUES,CONTEXT_SECTION_VALUES}from"../../types/index.js";import{parseIntegerLimit}from"./parsers.js";import{runCalendar}from"./calendar.js";import{runList}from"./list.js";import{runActivity}from"./activity.js";import{scoreContextCandidatesWithActiveExtensions}from"../context-relevance.js";import{buildItemContextRelevanceCandidates}from"../context-relevance.js";import{createQueryFingerprint,encodeQueryCursor,resolveQueryCursorStart,selectCursorSemanticOptions}from"../pagination.js";import{rememberReadOutputFocusRows,refreshReadOutputDeliveredCounts}from"../read-output-rows.js";import{CONTEXT_FLAG_CONTRACTS}from"../cli-contracts/flag-contracts.js";import{packContextCandidates}from"../context-packing.js";import{attachContextUsageServingReceipt,collectContextUsageDeliveredItemIds,readContextUsageAffinity,recordContextUsageServing}from"../context-usage.js";import{readWorkspaceContextSignals}from"../context-signal-store.js";import{readWorkspaceMemory,selectWorkspaceMemory}from"../workspace-memory.js";import{detectAgentIdentity}from"../../core/shared/author.js";import{readSessionState,semanticAttributionKey}from"../../core/session/session-state.js";import{semanticAttributionAffinity}from"../context/semantic-session-attribution.js";const CONTEXT_OUTPUT_VALUES=["markdown","toon","json","ndjson"],HIGH_LEVEL_TYPES=new Set(["Epic","Feature"]),DEFAULT_CONTEXT_LIMIT=10,CONTEXT_SCALE_THRESHOLD=1e4,STANDARD_SECTIONS=["hierarchy","activity","progress","recently_created","unparented","workload"],DEEP_SECTIONS=[...STANDARD_SECTIONS,"blockers","files","staleness","tests"],LEADING_HYPHEN_DATE=/^(\d{4})-(\d{2})-(\d{2})/,LEADING_COMPACT_DATE=/^(\d{4})(\d{2})(\d{2})(?:[T ]?\d{2}|$)/,COMPACT_DATE=/^(\d{4})(\d{2})(\d{2})$/,COMPACT_DATETIME=/^(\d{4})(\d{2})(\d{2})(?:[T\s]?)(\d{2})(\d{2})(\d{2})?(Z|[+-]\d{2}:?\d{2})?$/i;function parseOutputFormat(raw){if(!raw)return;const normalized=raw.trim().toLowerCase();if(!CONTEXT_OUTPUT_VALUES.includes(normalized))throw new PmCliError("Context format must be one of markdown|toon|json|ndjson",EXIT_CODE.USAGE);return normalized}const FOCUS_PROJECTION_FIELDS=new Set(["id","title","type","status","priority","order","deadline","assignee","tags","tags_inherited","updated_at","parent","children_total","children_closed","completion_pct","blocked","blocker_ids","created_at"]);function parseContextFocusFields(raw){if(raw===void 0)return;const fields=[];for(const token of raw.split(",")){const normalized=token.trim().toLowerCase();if(normalized.length!==0){if(!FOCUS_PROJECTION_FIELDS.has(normalized))throw new PmCliError(`Context --fields value not projectable: ${normalized} (valid: ${[...FOCUS_PROJECTION_FIELDS].join(", ")})`,EXIT_CODE.USAGE);fields.includes(normalized)||fields.push(normalized)}}if(fields.length===0)throw new PmCliError("Context --fields requires at least one field name",EXIT_CODE.USAGE);return fields}function projectContextFocusRows(rows,fields){return rows.map(row=>{const projected={},source=row;for(const field of fields)projected[field]=source[field]??null;return projected})}function resolveContextOutputFormat(options,global2){const commandFormat=parseOutputFormat(options.format);if(global2.json&&commandFormat&&commandFormat!=="json"&&commandFormat!=="ndjson")throw new PmCliError("Cannot combine --json with --format markdown|toon",EXIT_CODE.USAGE);return global2.json?commandFormat==="ndjson"?"ndjson":"json":commandFormat??"toon"}function parseContextLimit(raw,depth){return parseIntegerLimit(raw,"--limit")??(depth==="full"?Number.MAX_SAFE_INTEGER:DEFAULT_CONTEXT_LIMIT)}function resolveContextTokenBudget(raw,fallback){if(raw===void 0)return fallback;const parsed=typeof raw=="number"?raw:Number(raw);if(!Number.isInteger(parsed)||parsed<1)throw new PmCliError("--token-budget must be a positive integer",EXIT_CODE.USAGE);return parsed}function resolveContextLimitAtScale(limit,itemCount){return itemCount>=CONTEXT_SCALE_THRESHOLD&&limit===Number.MAX_SAFE_INTEGER?DEFAULT_CONTEXT_LIMIT:limit}function parseContextDepth(raw,settings){if(!raw)return settings.default_depth;const normalized=raw.trim().toLowerCase();if(!CONTEXT_DEPTH_VALUES.includes(normalized))throw new PmCliError(`Context --depth must be one of ${CONTEXT_DEPTH_VALUES.join("|")}`,EXIT_CODE.USAGE);return normalized}function parseContextSections(raw,depth,settings){if(raw&&raw.length>0){const sections=[];for(const value of raw){const normalized=value.trim().toLowerCase();if(!CONTEXT_SECTION_VALUES.includes(normalized))throw new PmCliError(`Context --section must be one of ${CONTEXT_SECTION_VALUES.join("|")}`,EXIT_CODE.USAGE);sections.includes(normalized)||sections.push(normalized)}return sections}return depth==="brief"?[]:depth==="full"?[...CONTEXT_SECTION_VALUES]:(depth==="deep"?DEEP_SECTIONS:STANDARD_SECTIONS).filter(section=>settings.sections[section])}function parseActivityLimit(raw,settings){return raw?parseIntegerLimit(raw,"--activity-limit")??settings.activity_limit:settings.activity_limit}function parseStaleThresholdDays(raw,settings){if(!raw)return settings.stale_threshold_days;const trimmed=raw.trim().toLowerCase(),match=/^(\d+)d?$/.exec(trimmed);if(!match)throw new PmCliError("--stale-threshold must be a number of days (e.g. 7 or 7d)",EXIT_CODE.USAGE);const days=parseInt(match[1],10);if(days<=0)throw new PmCliError("--stale-threshold must be positive",EXIT_CODE.USAGE);return days}function statusRank(status,statusRegistry){const normalizedStatus=normalizeStatusForRegistry(status,statusRegistry),blockedStatus=normalizeStatusInput("blocked",statusRegistry),draftStatus=normalizeStatusInput("draft",statusRegistry);return normalizedStatus===statusRegistry.in_progress_status?0:statusRegistry.active_statuses.has(normalizedStatus)?1:blockedStatus&&normalizedStatus===blockedStatus?2:draftStatus&&normalizedStatus===draftStatus?3:statusRegistry.blocked_statuses.has(normalizedStatus)?5:statusRegistry.terminal_statuses.has(normalizedStatus)?7:6}function isClosedStatus(status,statusRegistry){const closeStatus=normalizeStatusInput("closed",statusRegistry);return normalizeStatusForRegistry(status,statusRegistry)===closeStatus}function isInProgressStatus(status,statusRegistry){return normalizeStatusForRegistry(status,statusRegistry)===statusRegistry.in_progress_status}function isOpenStatus(status,statusRegistry){const normalizedStatus=normalizeStatusForRegistry(status,statusRegistry);return normalizedStatus!==statusRegistry.in_progress_status&&statusRegistry.active_statuses.has(normalizedStatus)}function isBlockedStatus(status,statusRegistry){return statusRegistry.blocked_statuses.has(normalizeStatusForRegistry(status,statusRegistry))}const LIST_PROJECTION_FLAGS=["compact","brief","fields","includeBody","include_body","parent"];function stripListProjectionFlags(options){const copy={...options};for(const key of LIST_PROJECTION_FLAGS)delete copy[key];return copy}function collectSubtreeIds(corpus,parentId){const target=parentId.trim().toLowerCase(),anchor=corpus.find(item=>item.id.trim().toLowerCase()===target);if(!anchor)return{ids:new Set,found:!1};const childrenByParent=buildChildrenByParent(corpus),descendants=collectDescendants(anchor.id,childrenByParent);return{ids:new Set([anchor.id,...descendants.map(item=>item.id)].map(id=>id.trim().toLowerCase())),found:!0}}function parseContextParent(raw){if(raw===void 0)return;const trimmed=raw.trim();if(trimmed.length===0)throw new PmCliError("Context --parent requires an item id",EXIT_CODE.USAGE);return trimmed}function compareOptionalOrder(left,right){const leftValue=left??null,rightValue=right??null;return leftValue===null&&rightValue===null?0:leftValue===null?1:rightValue===null?-1:leftValue-rightValue}function compareOptionalDeadline(left,right){const leftValue=left??null,rightValue=right??null;return leftValue===null&&rightValue===null?0:leftValue===null?1:rightValue===null?-1:compareTimestampStrings(leftValue,rightValue)}function daysInUtcMonth(year,monthIndex){return new Date(Date.UTC(year,monthIndex+1,0)).getUTCDate()}function hasNoInvalidDatePrefix(value){const match=LEADING_HYPHEN_DATE.exec(value)??LEADING_COMPACT_DATE.exec(value);if(!match)return!0;const year=Number.parseInt(match[1],10),month=Number.parseInt(match[2],10),day=Number.parseInt(match[3],10);return month>=1&&month<=12&&day>=1&&day<=daysInUtcMonth(year,month-1)}function normalizeTimestampCandidate(value){const compactDate=COMPACT_DATE.exec(value);if(compactDate)return`${compactDate[1]}-${compactDate[2]}-${compactDate[3]}`;const compactDateTime=COMPACT_DATETIME.exec(value);if(compactDateTime){const[,year,month,day,hour,minute,secondRaw,offsetRaw]=compactDateTime,second=secondRaw?`:${secondRaw}`:"",offset=offsetRaw&&offsetRaw.length===5&&offsetRaw!=="Z"?`${offsetRaw.slice(0,3)}:${offsetRaw.slice(3)}`:offsetRaw??"";return`${year}-${month}-${day}T${hour}:${minute}${second}${offset}`}return value}function parseContextTimestampMs(value){if(typeof value!="string")return Number.NaN;const trimmed=value.trim();if(trimmed.length===0||!hasNoInvalidDatePrefix(trimmed))return Number.NaN;const parsed=Date.parse(normalizeTimestampCandidate(trimmed));return Number.isFinite(parsed)?parsed:Number.NaN}function sortableTimestamp(value){const parsed=parseContextTimestampMs(value);return Number.isFinite(parsed)?new Date(parsed).toISOString():""}function dateTokenForTimestamp(value){const parsed=parseContextTimestampMs(value);return Number.isFinite(parsed)?new Date(parsed).toISOString().slice(0,10):"unknown"}function normalizedParentId(value){if(typeof value!="string")return null;const trimmed=value.trim();return trimmed.length>0?trimmed:null}function compareCriticalItems(left,right,statusRegistry){const byStatus=statusRank(left.status,statusRegistry)-statusRank(right.status,statusRegistry);if(byStatus!==0)return byStatus;const byPriority=left.priority-right.priority;if(byPriority!==0)return byPriority;const byOrder=compareOptionalOrder(left.order,right.order);if(byOrder!==0)return byOrder;const byDeadline=compareOptionalDeadline(left.deadline,right.deadline);if(byDeadline!==0)return byDeadline;const byUpdated=compareTimestampStrings(sortableTimestamp(right.updated_at),sortableTimestamp(left.updated_at)),byId=left.id.localeCompare(right.id);return byUpdated!==0?byUpdated:byId}function estimateJsonTokens(value){return Math.max(1,Math.ceil(Buffer.byteLength(JSON.stringify(value),"utf8")/4))}function packRankedContextItems(report,tokenBudget,requiredIds=new Set,profile="context"){return packContextCandidates(report.ranked.map(entry=>({id:entry.id,item:entry.item,rank:entry.rank,score:entry.score,required:requiredIds.has(entry.id),cluster:entry.item.parent?.trim()||entry.item.type,token_costs:{identity:estimateJsonTokens({id:entry.id,title:entry.item.title}),summary:estimateJsonTokens({id:entry.id,title:entry.item.title,type:entry.item.type,status:entry.item.status,priority:entry.item.priority,parent:entry.item.parent}),full:estimateJsonTokens(entry.item)}})),{tokenBudget,profile,latencyBudgetMs:25})}function toContextPackingSummary(report){return{...report,included:report.included.map(entry=>({id:entry.id,projection:entry.projection,tokens:entry.tokens}))}}function toContextRankingSummary(report,featureStore,servedItemIds){const ranked=servedItemIds===void 0?report.ranked:report.ranked.filter(entry=>servedItemIds.has(entry.id));return{model:report.model,available_signals:report.available_signals,items:ranked.map(entry=>({id:entry.id,rank:entry.rank,baseline_rank:entry.baseline_rank,score:entry.score,contributions:entry.contributions,...entry.signal_provenance===void 0?{}:{recency:entry.signal_provenance.recency}})),candidate_count:report.ranked.length,omitted_count:report.ranked.length-ranked.length,...featureStore?{feature_store:{source:featureStore.snapshot.source,cache_status:featureStore.cache_status,source_cursor:featureStore.snapshot.source_cursor,generated_at:featureStore.snapshot.generated_at}}:{}}}function completionPct(closed,total){return total>0?Math.round(closed/total*100):0}function buildChildrenByParent(allItems){const childrenByParent=new Map;for(const item of allItems){const parent=normalizedParentId(item.parent);if(!parent)continue;const children=childrenByParent.get(parent)??[];children.push(item),childrenByParent.set(parent,children)}return childrenByParent}function toContextFocusItem(item,statusRegistry,childrenByParent){const focus={id:item.id,title:item.title,type:item.type,status:item.status,priority:item.priority,order:item.order??null,deadline:item.deadline??null,assignee:item.assignee??null,tags:Array.isArray(item.tags)?[...item.tags]:[],updated_at:item.updated_at,parent:normalizedParentId(item.parent)};if(statusRegistry&&childrenByParent){const descendants=collectDescendants(item.id,childrenByParent),total=descendants.length;if(total>0){const closed=descendants.filter(desc=>isClosedStatus(desc.status,statusRegistry)).length;focus.children_total=total,focus.children_closed=closed,focus.completion_pct=completionPct(closed,total)}}return focus}function summarizeAgenda(events){let deadlines=0,reminders=0,scheduled=0;const itemIds=new Set;for(const event of events){if(itemIds.add(event.item_id),event.kind==="deadline"){deadlines+=1;continue}if(event.kind==="reminder"){reminders+=1;continue}scheduled+=1}return{events:events.length,items:itemIds.size,deadlines,reminders,scheduled}}function mergeSortedWarnings(...warningGroups){return[...new Set(warningGroups.flatMap(group=>group??[]))].sort((left,right)=>left.localeCompare(right))}function filterTerminalCalendarEvents(events,statusRegistry){return events.filter(event=>!statusRegistry.terminal_statuses.has(normalizeStatusForRegistry(event.item_status,statusRegistry)))}function buildHierarchy(allItems,activeItems,statusRegistry,limit){const itemMap=new Map;for(const item of allItems)itemMap.set(item.id,item);const childrenByParent=buildChildrenByParent(allItems),activeHighLevelIds=new Set(activeItems.filter(item=>HIGH_LEVEL_TYPES.has(item.type)).map(item=>item.id)),nodes=[];for(const parentId of activeHighLevelIds){const parent=itemMap.get(parentId);if(!parent)continue;const allDescendants=collectDescendants(parentId,childrenByParent),childItems=childrenByParent.get(parentId)??[];let closedCount=0,openCount=0,inProgressCount=0,blockedCount=0;for(const desc of allDescendants)isClosedStatus(desc.status,statusRegistry)?closedCount++:isInProgressStatus(desc.status,statusRegistry)?inProgressCount++:isBlockedStatus(desc.status,statusRegistry)?blockedCount++:isOpenStatus(desc.status,statusRegistry)&&openCount++;const children=childItems.sort((a,b)=>compareCriticalItems(a,b,statusRegistry)).slice(0,limit).map(child=>{const grandchildren=collectDescendants(child.id,childrenByParent),gcClosed=grandchildren.filter(gc=>isClosedStatus(gc.status,statusRegistry)).length;return{id:child.id,title:child.title,type:child.type,status:child.status,children_total:grandchildren.length,children_closed:gcClosed}});nodes.push({id:parent.id,title:parent.title,type:parent.type,status:parent.status,children_total:allDescendants.length,children_closed:closedCount,children_open:openCount,children_in_progress:inProgressCount,children_blocked:blockedCount,children})}return nodes.sort((a,b)=>{const aParent=itemMap.get(a.id),bParent=itemMap.get(b.id);return compareCriticalItems(aParent,bParent,statusRegistry)}).slice(0,limit)}function collectDescendants(parentId,childrenByParent){const result=[],stack=[parentId],visited=new Set;for(;stack.length>0;){const current=stack.pop();if(visited.has(current))continue;visited.add(current);const children=childrenByParent.get(current)??[];for(const child of children)result.push(child),stack.push(child.id)}return result}const _testOnly={buildActivity,buildBlockers,buildChildrenByParent,buildHierarchy,buildHotFiles,buildProgress,buildRecentlyCreated,buildStaleness,buildTestHealth,buildUnparented,buildWorkload,collectDescendants,collectSubtreeIds,compareCriticalItems,compareOptionalDeadline,compareOptionalOrder,completionPct,dateTokenForTimestamp,filterTerminalCalendarEvents,formatAgendaLine,isBlockedStatus,isClosedStatus,isInProgressStatus,isOpenStatus,mergeSortedWarnings,normalizedParentId,parseActivityLimit,parseContextLimit,resolveContextLimitAtScale,parseContextParent,parseContextTimestampMs,parseStaleThresholdDays,sortableTimestamp,statusRank,stripListProjectionFlags,summarizeAgenda,toContextFocusItem};async function buildActivity(activityLimit,global2){return(await runActivity({compact:!0,limit:String(activityLimit)},global2)).compact_activity??[]}function buildProgress(allItems,activeItems,blockedIds,statusRegistry,limit){const childrenByParent=new Map;for(const item of allItems){if(!item.parent)continue;const children=childrenByParent.get(item.parent)??[];children.push(item),childrenByParent.set(item.parent,children)}const activeHighLevel=activeItems.filter(item=>HIGH_LEVEL_TYPES.has(item.type)),entries=[];for(const parent of activeHighLevel){const descendants=collectDescendants(parent.id,childrenByParent),total=descendants.length;if(total===0)continue;let closed=0,open=0,inProgress=0,blocked=0;for(const desc of descendants)isClosedStatus(desc.status,statusRegistry)?closed++:blockedIds.has(desc.id.trim().toLowerCase())?blocked++:isInProgressStatus(desc.status,statusRegistry)?inProgress++:isOpenStatus(desc.status,statusRegistry)&&open++;entries.push({id:parent.id,title:parent.title,type:parent.type,total,closed,open,in_progress:inProgress,blocked,completion_pct:completionPct(closed,total)})}return entries.sort((a,b)=>a.completion_pct-b.completion_pct).slice(0,limit)}function buildBlockers(blockedItems,fullCorpus,statusRegistry,limit){const itemsById=new Map(fullCorpus.map(item=>[item.id.trim().toLowerCase(),item]));return blockedItems.slice(0,limit).map(item=>{const blockers=resolveItemBlockers(item,itemsById,statusRegistry),blockedBy=blockers.find(blocker=>!blocker.resolved)?.id??blockers[0]?.id??null,blockerItem=blockedBy?itemsById.get(blockedBy.trim().toLowerCase()):void 0;return{id:item.id,title:item.title,blocked_by:blockedBy,blocked_by_title:blockerItem?.title??null,blocked_by_status:blockerItem?.status??null,blocked_reason:item.blocked_reason??null,unblock_note:item.unblock_note??null}})}function buildHotFiles(activeItems,limit){const fileMap=new Map;for(const item of activeItems)for(const file of item.files??[]){const existing=fileMap.get(file.path)??new Set;existing.add(item.id),fileMap.set(file.path,existing)}return[...fileMap.entries()].map(([filePath,itemIds])=>({path:filePath,references:itemIds.size,items:[...itemIds].sort()})).sort((a,b)=>b.references-a.references).slice(0,limit)}function buildWorkload(activeItems,statusRegistry,limit){const groups=new Map;for(const item of activeItems){const key=item.assignee??null,existing=groups.get(key)??[];existing.push(item),groups.set(key,existing)}return[...groups.entries()].map(([assignee,items])=>({assignee,active:items.length,in_progress:items.filter(item=>isInProgressStatus(item.status,statusRegistry)).length,items:items.map(item=>item.id).sort()})).sort((a,b)=>b.active-a.active).slice(0,limit)}function buildStaleness(allNonTerminal,staleThresholdDays,now,limit){const cutoffMs=new Date(now).getTime()-staleThresholdDays*24*60*60*1e3;return allNonTerminal.filter(item=>new Date(item.updated_at).getTime()<cutoffMs).map(item=>({id:item.id,title:item.title,status:item.status,updated_at:item.updated_at,stale_days:Math.floor((new Date(now).getTime()-new Date(item.updated_at).getTime())/(1440*60*1e3))})).sort((a,b)=>b.stale_days-a.stale_days).slice(0,limit)}function buildRecentlyCreated(allNonTerminal,statusRegistry,childrenByParent,limit){return allNonTerminal.map(item=>({item,sortKey:sortableTimestamp(item.created_at)})).sort((left,right)=>{const byCreated=compareTimestampStrings(right.sortKey,left.sortKey);return byCreated!==0?byCreated:left.item.id.localeCompare(right.item.id)}).slice(0,limit).map(({item})=>({...toContextFocusItem(item,statusRegistry,childrenByParent),created_at:item.created_at}))}function buildUnparented(allNonTerminal,statusRegistry,childrenByParent,limit){return allNonTerminal.filter(item=>!normalizedParentId(item.parent)&&!HIGH_LEVEL_TYPES.has(item.type)).sort((left,right)=>compareCriticalItems(left,right,statusRegistry)).slice(0,limit).map(item=>toContextFocusItem(item,statusRegistry,childrenByParent))}function buildTestHealth(activeItems){let itemsWithTests=0,itemsWithRecentRuns=0,passed=0,failed=0,skipped=0;const itemsFailing=[];for(const item of activeItems){(item.tests??[]).length>0&&itemsWithTests++;const runs=item.test_runs??[];if(runs.length>0){itemsWithRecentRuns++;let itemHasFailure=!1;for(const run of runs)passed+=run.passed??0,failed+=run.failed??0,skipped+=run.skipped??0,(run.failed??0)>0&&(itemHasFailure=!0);itemHasFailure&&itemsFailing.push(item.id)}}return{items_with_tests:itemsWithTests,items_with_recent_runs:itemsWithRecentRuns,recent_runs:{passed,failed,skipped},items_failing:itemsFailing.sort()}}function formatClock(timestamp){return`${new Date(timestamp).toISOString().slice(11,16)}Z`}function formatFocusLine(item){const orderToken=item.order===null?"-":String(item.order),deadlineToken=item.deadline??"-",parentToken=item.parent?` parent:${item.parent}`:"",progressToken=item.children_total!==void 0&&item.children_closed!==void 0&&item.completion_pct!==void 0?` children:${item.children_closed}/${item.children_total} done:${item.completion_pct}%`:"",blockedToken=item.blocked===!0?` blocked:${item.blocker_ids?.join(",")||"lifecycle"}`:"";return`${item.id} p${item.priority} ${item.status} ${item.type} order:${orderToken} deadline:${deadlineToken}${parentToken}${progressToken}${blockedToken} ${item.title}`}function formatProjectedFocusLine(item,fields){const source=item;return fields.map(field=>{const value=source[field];return Array.isArray(value)?`${field}:${value.join(",")}`:`${field}:${value??"-"}`}).join(" ")}function formatAgendaLine(event){if("reference_only"in event){const suffix=event.kind==="reminder"?` \u2014 ${event.reminder_text??"reminder"}`:event.kind==="event"?` \u2014 ${event.event_title??"event"}${event.event_recurring?" (recurring)":""}`:"";return`${formatClock(event.at)} [${event.kind}] ${event.item_id} (see focus item)${suffix}`}const base=`${formatClock(event.at)} [${event.kind}] ${event.item_id} p${event.item_priority} ${event.item_status} ${event.item_title}`;if(event.kind==="reminder")return`${base} \u2014 ${event.reminder_text}`;if(event.kind==="event"){const recurringSuffix=event.event_recurring?" (recurring)":"",title=event.event_title??event.item_title;return`${base} \u2014 ${title}${recurringSuffix}`}return base}function pushContextFocusSection(lines,title,rows,emptyText,renderFocus){if(lines.push(`## ${title}`),rows.length===0)lines.push(emptyText);else for(const item of rows)lines.push(`- ${renderFocus(item)}`);lines.push("")}function pushBlockedFallbackSection(lines,result,renderFocus){if(result.blocked_fallback.length!==0){lines.push("## Blocked fallback");for(const item of result.blocked_fallback)lines.push(`- ${renderFocus(item)}`);lines.push("")}}function pushAgendaSection(lines,result){if(lines.push("## Agenda"),lines.push(`- events: ${result.agenda.summary.events} (deadlines: ${result.agenda.summary.deadlines}, reminders: ${result.agenda.summary.reminders}, scheduled: ${result.agenda.summary.scheduled})`),result.agenda.events.length===0)lines.push("No agenda events matched the selected filters.");else for(const event of result.agenda.events)lines.push(`- ${formatAgendaLine(event)}`);lines.push("")}function pushHierarchySection(lines,result){if(!(!result.hierarchy||result.hierarchy.length===0)){lines.push("## Hierarchy");for(const node of result.hierarchy){const pct=node.children_total>0?Math.round(node.children_closed/node.children_total*100):0;lines.push(`- ${node.id} ${node.type} ${node.status} "${node.title}" [${node.children_closed}/${node.children_total} done ${pct}%]`);for(const child of node.children){const cpct=child.children_total>0?Math.round(child.children_closed/child.children_total*100):0;lines.push(` - ${child.id} ${child.type} ${child.status} "${child.title}" [${child.children_closed}/${child.children_total} done ${cpct}%]`)}}lines.push("")}}function pushProgressSection(lines,result){if(!(!result.progress||result.progress.length===0)){lines.push("## Progress");for(const entry of result.progress)lines.push(`- ${entry.id} "${entry.title}" ${entry.completion_pct}% (${entry.closed}/${entry.total} closed, ${entry.in_progress} wip, ${entry.open} open, ${entry.blocked} blocked)`);lines.push("")}}function pushRecentlyCreatedSection(lines,result,focusFields,renderFocus){if(!(!result.recently_created||result.recently_created.length===0)){lines.push("## Recently created");for(const item of result.recently_created)lines.push(focusFields?`- ${renderFocus(item)}`:`- ${dateTokenForTimestamp(item.created_at)} ${formatFocusLine(item)}`);lines.push("")}}function pushUnparentedSection(lines,result,renderFocus){if(!(!result.unparented||result.unparented.length===0)){lines.push("## Unparented");for(const item of result.unparented)lines.push(`- ${renderFocus(item)}`);lines.push("")}}function pushActivitySection(lines,result){if(!(!result.activity||result.activity.length===0)){lines.push("## Recent activity");for(const entry of result.activity){const msg=entry.msg?` ${entry.msg}`:"";lines.push(`- ${entry.ts.slice(0,16)}Z ${entry.id} ${entry.op} by:${entry.author}${msg}`)}lines.push("")}}function pushBlockersSection(lines,result){if(!(!result.blockers||result.blockers.length===0)){lines.push("## Blockers");for(const entry of result.blockers){const by=entry.blocked_by?`blocked_by:${entry.blocked_by}(${entry.blocked_by_status??"?"})`:"blocked_by:-",reason=entry.blocked_reason?` reason:"${entry.blocked_reason}"`:"",note=entry.unblock_note?` unblock:"${entry.unblock_note}"`:"";lines.push(`- ${entry.id} "${entry.title}" ${by}${reason}${note}`)}lines.push("")}}function pushFilesSection(lines,result){if(!(!result.files||result.files.length===0)){lines.push("## Hot files");for(const file of result.files)lines.push(`- ${file.path} refs:${file.references} items:[${file.items.join(",")}]`);lines.push("")}}function pushWorkloadSection(lines,result){if(!(!result.workload||result.workload.length===0)){lines.push("## Workload");for(const entry of result.workload){const who=entry.assignee??"(unassigned)";lines.push(`- ${who} active:${entry.active} wip:${entry.in_progress} items:[${entry.items.join(",")}]`)}lines.push("")}}function pushStalenessSection(lines,result){if(!(!result.staleness||result.staleness.length===0)){lines.push("## Stale items");for(const entry of result.staleness)lines.push(`- ${entry.id} ${entry.status} stale:${entry.stale_days}d last:${entry.updated_at.slice(0,10)} "${entry.title}"`);lines.push("")}}function pushTestHealthSection(lines,result){result.tests&&(lines.push("## Test health"),lines.push(`- items_with_tests: ${result.tests.items_with_tests}`),lines.push(`- items_with_recent_runs: ${result.tests.items_with_recent_runs}`),lines.push(`- passed: ${result.tests.recent_runs.passed}, failed: ${result.tests.recent_runs.failed}, skipped: ${result.tests.recent_runs.skipped}`),result.tests.items_failing.length>0&&lines.push(`- items_failing: [${result.tests.items_failing.join(",")}]`),lines.push(""))}function pushEmptyContextSuggestions(lines,result){result.summary.active_items===0&&result.summary.blocked===0&&result.agenda.summary.events===0&&(lines.push("## Suggestions"),lines.push("No active work items or upcoming events. Consider:"),lines.push('- `pm create --type Task --title "..."` to add a new work item'),lines.push("- `pm list --status closed --limit 5` to review recent completions"),lines.push("- `pm search <keywords>` to find related past work"),lines.push("- `pm aggregate` for a full project status overview"))}function renderContextMarkdown(result){const lines=[],focusFields=result.focus_fields,renderFocus=item=>focusFields?formatProjectedFocusLine(item,focusFields):formatFocusLine(item);if(lines.push("# pm context"),lines.push(""),lines.push(`- now: ${result.now}`),lines.push(`- depth: ${result.depth}`),result.filters.parent&&lines.push(`- scope: subtree of ${result.filters.parent}`),lines.push(`- active_items: ${result.summary.active_items} (in_progress: ${result.summary.in_progress}, open: ${result.summary.open})`),result.summary.total_items!==void 0&&lines.push(`- total_items: ${result.summary.total_items} (closed: ${result.summary.closed??0}, canceled: ${result.summary.canceled??0})`),lines.push(`- agenda_events: ${result.summary.agenda_events}`),lines.push(`- blocked_fallback_used: ${result.summary.blocked_fallback_used}`),result.extension_health){const degradedNames=result.extension_health.packages.filter(entry=>entry.status==="degraded").map(entry=>entry.name);lines.push(`- extensions: ${result.extension_health.ok} ok, ${result.extension_health.degraded} degraded${degradedNames.length>0?` (${degradedNames.join(", ")})`:""}`)}const renderedSections=result.sections_included.filter(section=>section!=="blockers"||(result.blockers?.length??0)>0);if(renderedSections.length>0&&lines.push(`- sections: ${renderedSections.join(", ")}`),lines.push(""),pushContextFocusSection(lines,"High-level focus",result.high_level,"No high-level active items.",renderFocus),pushContextFocusSection(lines,"Low-level focus",result.low_level,"No low-level active items.",renderFocus),pushBlockedFallbackSection(lines,result,renderFocus),pushAgendaSection(lines,result),result.workspace_memory){lines.push("## Workspace memory");for(const rollup of result.workspace_memory.rollups)lines.push(`- ${rollup.kind}:${rollup.key} \u2014 ${rollup.label} (${rollup.item_count} completed, latest ${rollup.last_closed_at})`);lines.push("")}return pushHierarchySection(lines,result),pushProgressSection(lines,result),pushRecentlyCreatedSection(lines,result,focusFields,renderFocus),pushUnparentedSection(lines,result,renderFocus),pushActivitySection(lines,result),pushBlockersSection(lines,result),pushFilesSection(lines,result),pushWorkloadSection(lines,result),pushStalenessSection(lines,result),pushTestHealthSection(lines,result),pushEmptyContextSuggestions(lines,result),lines.join(`
|
|
2
|
+
`)}async function resolveContextRuntime(options,global2){const pmRoot=resolvePmRoot(process.cwd(),global2.path),settings=await readSettings(pmRoot),contextSettings=settings.context??SETTINGS_DEFAULTS.context,statusRegistry=resolveRuntimeStatusRegistry(settings.schema),depth=parseContextDepth(options.depth,contextSettings),limit=parseContextLimit(options.limit??options.maxItems,depth);return{settings,contextSettings,statusRegistry,depth,limit,sectionsIncluded:parseContextSections(options.section,depth,contextSettings),activityLimit:parseActivityLimit(options.activityLimit,contextSettings),staleThresholdDays:parseStaleThresholdDays(options.staleThreshold,contextSettings),parentScope:parseContextParent(options.parent),focusFields:parseContextFocusFields(options.fields),baseListOptions:stripListProjectionFlags(options)}}function contextNeedsAllItems(sectionsIncluded){return sectionsIncluded.some(section=>["hierarchy","progress","blockers","staleness","recently_created","unparented"].includes(section))}function buildUnpaginatedContextListOptions(baseListOptions,extra){return{...baseListOptions,...extra,noTruncate:!0,limit:void 0,offset:void 0,after:void 0}}async function loadContextCorpus(global2,runtime){const listed=await runList(void 0,buildUnpaginatedContextListOptions(runtime.baseListOptions,{excludeTerminal:!1}),global2),fullCorpus=listed.items;let listedItemMetadata=fullCorpus.filter(item=>!isTerminalStatus(item.status,runtime.statusRegistry)),allItems=fullCorpus;const subtreeIds=resolveContextSubtreeIds(runtime.parentScope,fullCorpus);return subtreeIds&&(listedItemMetadata=listedItemMetadata.filter(item=>subtreeIds.has(item.id.trim().toLowerCase())),allItems=allItems.filter(item=>subtreeIds.has(item.id.trim().toLowerCase()))),{listed,listedItemMetadata,allItems,fullCorpus,subtreeIds}}function resolveContextSubtreeIds(parentScope,fullCorpus){if(parentScope===void 0)return;const subtree=collectSubtreeIds(fullCorpus,parentScope);if(!subtree.found)throw new PmCliError(`Context --parent item not found: ${parentScope}`,EXIT_CODE.NOT_FOUND);return subtree.ids}function collectHighLevelContextIds(activeItems,fullCorpus,statusRegistry,typeRegistry){const containers=new Set(computeActionabilityReport(activeItems,fullCorpus,statusRegistry,typeRegistry).containers.map(entry=>entry.item.id));return new Set(activeItems.filter(item=>HIGH_LEVEL_TYPES.has(item.type)||containers.has(item.id)||resolveItemExecutionRole(item.type,typeRegistry)!=="agent").map(item=>item.id))}async function resolveContextFocusGroups(listedItemMetadata,allItems,fullCorpus,blockedIds,statusRegistry,sectionsIncluded,limit,now,author,cursor,cursorFingerprint,useBoundedPage,pmRoot,tokenBudget,claimFocus,typeRegistry){const structural=[...listedItemMetadata].sort((left,right)=>compareCriticalItems(left,right,statusRegistry)),usage=await readContextUsageAffinity({pmRoot,author,enabled:process.env.PM_CONTEXT_USAGE_DISABLED!=="1"}),featureStore=await readWorkspaceContextSignals(structural,{pmRoot,storeKey:"context",statusRegistry,now,author,usageAffinity:usage.affinity,claimFocus}),ranking=await scoreContextCandidatesWithActiveExtensions("context",featureStore.candidates),ranked=ranking.ranked.map(entry=>entry.item),activeStatuses=statusRegistry.active_statuses,rankedActiveItems=ranked.filter(item=>activeStatuses.has(normalizeStatusForRegistry(item.status,statusRegistry))),pageStart=useBoundedPage?resolveQueryCursorStart(rankedActiveItems,cursor,cursorFingerprint,item=>item.id):0,focusPage=useBoundedPage?rankedActiveItems.slice(pageStart,pageStart+limit):rankedActiveItems,hasMore=useBoundedPage&&focusPage.length>0&&pageStart+focusPage.length<rankedActiveItems.length,nextCursor=hasMore&&focusPage.length>0?encodeQueryCursor(cursorFingerprint,focusPage[focusPage.length-1].id,pageStart+focusPage.length-1):void 0,rankedBlockedItems=ranked.filter(item=>blockedIds.has(item.id.trim().toLowerCase())),packingIds=new Set([...focusPage.map(item=>item.id),...rankedBlockedItems.slice(0,limit).map(item=>item.id)]),packing=packRankedContextItems({...ranking,ranked:ranking.ranked.filter(entry=>packingIds.has(entry.id))},tokenBudget,new Set(Object.entries(claimFocus??{}).filter(([,affinity])=>affinity>=1).map(([id])=>id))),packedItems=packing.included.map(entry=>entry.item),activeItems=packedItems.filter(item=>activeStatuses.has(normalizeStatusForRegistry(item.status,statusRegistry))),blockedItems=packedItems.filter(item=>blockedIds.has(item.id.trim().toLowerCase())),childrenByParent=buildChildrenByParent(allItems),focusChildrenByParent=contextNeedsAllItems(sectionsIncluded)?childrenByParent:void 0,fullCorpusById=new Map(fullCorpus.map(item=>[item.id.trim().toLowerCase(),item])),projectFocusItem=item=>{const focus=toContextFocusItem(item,statusRegistry,focusChildrenByParent);return blockedIds.has(item.id.trim().toLowerCase())&&(focus.blocked=!0,focus.blocker_ids=resolveItemBlockers(item,fullCorpusById,statusRegistry).filter(blocker=>!blocker.resolved).map(blocker=>blocker.id)),focus},highLevelIds=collectHighLevelContextIds(activeItems,fullCorpus,statusRegistry,typeRegistry),highLevel=activeItems.filter(item=>highLevelIds.has(item.id)).slice(0,useBoundedPage?focusPage.length:limit).map(projectFocusItem),lowLevel=activeItems.filter(item=>!highLevelIds.has(item.id)).slice(0,useBoundedPage?focusPage.length:limit).map(projectFocusItem),blockedFallbackUsed=rankedActiveItems.length===0;return{activeItems,blockedItems,highLevel,lowLevel,blockedFallback:blockedFallbackUsed?blockedItems.slice(0,limit).map(projectFocusItem):[],blockedFallbackUsed,ranking,packing,featureStore,pageExtras:{...useBoundedPage?{applied_limit:limit}:{},...hasMore?{has_more:!0,truncated:!0}:{},...nextCursor?{next_cursor:nextCursor}:{}}}}function buildContextCursorFingerprint(options,pmRoot){return createQueryFingerprint("context",{pmRoot,options:selectCursorSemanticOptions(options,CONTEXT_FLAG_CONTRACTS)})}function shouldPageContextFocus(options,corpusItemCount){return options.limit!==void 0||options.maxItems!==void 0||options.after!==void 0||corpusItemCount>=CONTEXT_SCALE_THRESHOLD}async function buildContextAgenda(global2,runtime,subtreeIds,listedFocusIds){const calendarOptions={...runtime.baseListOptions,view:"agenda",include:"all",limit:runtime.parentScope===void 0?String(runtime.limit):void 0},agenda=await runCalendar(calendarOptions,global2),scopedAgenda=subtreeIds===void 0?agenda.events:agenda.events.filter(event=>subtreeIds.has(event.item_id.trim().toLowerCase())),fullAgendaEvents=filterTerminalCalendarEvents(scopedAgenda,runtime.statusRegistry).slice(0,runtime.limit),agendaEvents=fullAgendaEvents.map(event=>listedFocusIds.has(event.item_id)?{at:event.at,date:event.date,kind:event.kind,item_id:event.item_id,reference_only:!0,...event.kind==="reminder"?{reminder_text:event.reminder_text}:{},...event.kind==="event"?{event_title:event.event_title,event_recurring:event.event_recurring}:{}}:event);return{agenda,agendaEvents,agendaSummary:summarizeAgenda(fullAgendaEvents)}}function countContextStatus(items,status,statusRegistry){const targetStatus=String(status);return items.filter(item=>normalizeStatusForRegistry(item.status,statusRegistry)===targetStatus).length}async function buildOptionalContextSections(params){const{runtime,allItems,fullCorpus,blockedIds,focusGroups,now,global:global2}=params,childrenByParent=buildChildrenByParent(allItems),allNonTerminal=allItems.filter(item=>!isTerminalStatus(item.status,runtime.statusRegistry)),has=section=>runtime.sectionsIncluded.includes(section);return{hierarchy:has("hierarchy")?buildHierarchy(allItems,focusGroups.activeItems,runtime.statusRegistry,runtime.limit):void 0,activity:has("activity")?await buildActivity(runtime.activityLimit,global2):void 0,progress:has("progress")?buildProgress(allItems,focusGroups.activeItems,blockedIds,runtime.statusRegistry,runtime.limit):void 0,blockersSection:has("blockers")?buildBlockers(focusGroups.blockedItems,fullCorpus,runtime.statusRegistry,runtime.limit):void 0,recentlyCreated:has("recently_created")?buildRecentlyCreated(allNonTerminal,runtime.statusRegistry,childrenByParent,runtime.limit):void 0,unparented:has("unparented")?buildUnparented(allNonTerminal,runtime.statusRegistry,childrenByParent,runtime.limit):void 0,filesSection:has("files")?buildHotFiles(focusGroups.activeItems,runtime.limit):void 0,workload:has("workload")?buildWorkload(focusGroups.activeItems,runtime.statusRegistry,runtime.limit):void 0,staleness:has("staleness")?buildStaleness(allNonTerminal,runtime.staleThresholdDays,now,runtime.limit):void 0,tests:has("tests")?buildTestHealth(focusGroups.activeItems):void 0}}function buildContextSummaryExtras(allItems,statusRegistry,blockedIds){const canceledStatus=normalizeStatusInput("canceled",statusRegistry),activeItems=allItems.filter(item=>statusRegistry.active_statuses.has(normalizeStatusForRegistry(item.status,statusRegistry))),inProgress=countContextStatus(activeItems,statusRegistry.in_progress_status,statusRegistry);return{scope:"matching_items",active_items:activeItems.length,open:activeItems.length-inProgress,in_progress:inProgress,blocked:allItems.filter(item=>blockedIds.has(item.id.trim().toLowerCase())).length,total_items:allItems.length,closed:allItems.filter(item=>isClosedStatus(item.status,statusRegistry)).length,canceled:allItems.filter(item=>normalizeStatusForRegistry(item.status,statusRegistry)===canceledStatus).length}}function attachOptionalContextSections(result,sections,warningDetails){sections.hierarchy&&(result.hierarchy=sections.hierarchy),sections.activity&&(result.activity=sections.activity),sections.progress&&(result.progress=sections.progress),sections.blockersSection&&(result.blockers=sections.blockersSection),sections.recentlyCreated&&(result.recently_created=sections.recentlyCreated),sections.unparented&&(result.unparented=sections.unparented),sections.filesSection&&(result.files=sections.filesSection),sections.workload&&(result.workload=sections.workload),sections.staleness&&(result.staleness=sections.staleness),sections.tests&&(result.tests=sections.tests),warningDetails!==void 0&&warningDetails.length>0&&(result.warning_details=warningDetails)}function applyContextFocusProjection(result,focusFields){focusFields&&(result.focus_fields=focusFields,result.high_level=projectContextFocusRows(result.high_level,focusFields),result.low_level=projectContextFocusRows(result.low_level,focusFields),result.blocked_fallback=projectContextFocusRows(result.blocked_fallback,focusFields),result.recently_created&&(result.recently_created=projectContextFocusRows(result.recently_created,focusFields)),result.unparented&&(result.unparented=projectContextFocusRows(result.unparented,focusFields)))}function applyContextTagProjection(result,noTags){const rows=[result.high_level,result.low_level,result.blocked_fallback,result.recently_created??[],result.unparented??[]].flat();if(noTags){for(const row of rows)delete row.tags,delete row.tags_inherited;return}const rowsById=new Map(rows.map(row=>[row.id,row])),originalTagSignatures=new Map(rows.map(row=>[row.id,row.tags?[...row.tags].sort().join("\0"):void 0]));for(const row of rows){if(!row.parent||!row.tags)continue;const parent=rowsById.get(row.parent);parent&&originalTagSignatures.get(row.id)===originalTagSignatures.get(parent.id)&&(delete row.tags,row.tags_inherited=parent.id)}}function maybeAttachEmptyContextSuggestions(result,activeItems,blockedItems){activeItems.length>0||blockedItems.length>0||result.agenda.events.length>0||(result.suggestions=['pm create --type Task --title "..." to add a new work item',"pm list --status closed --limit 5 to review recent completions","pm search <keywords> to find related past work","pm aggregate for a full project status overview"])}async function attachContextUsageFeedback(result,focusGroups,pmRoot,author){try{const included=new Set(focusGroups.packing.included.map(entry=>entry.id)),rows=focusGroups.ranking.ranked.map(entry=>({id:entry.id,rank:entry.rank,included:included.has(entry.id)})),rankedIds=new Set(rows.map(row=>row.id));for(const id of collectContextUsageDeliveredItemIds(result,"context"))rankedIds.has(id)||(rows.push({id,rank:rows.length+1,included:!1}),rankedIds.add(id));const receipt=await recordContextUsageServing({pmRoot,author,surface:"context",profile:focusGroups.packing.profile,rows,enabled:process.env.PM_CONTEXT_USAGE_DISABLED!=="1"});attachContextUsageServingReceipt(result,receipt)}catch{result.warnings=mergeSortedWarnings(result.warnings,["context_usage_feedback_write_failed"])}}async function resolveContextExtensionHealthProjection(omitted,pmRoot,settings){if(omitted)return{};const packages=(await discoverExtensions({pmRoot,settings,cwd:process.cwd(),noExtensions:!1})).discovered.map(diagnostic=>({name:diagnostic.name??diagnostic.directory,status:diagnostic.status==="ok"?"ok":"degraded"})).sort((left,right)=>left.name.localeCompare(right.name)),degraded=packages.filter(entry=>entry.status==="degraded").length;return packages.length===0?{}:{extension_health:{total:packages.length,ok:packages.length-degraded,degraded,packages:packages.slice(0,20),...packages.length>20?{truncated:!0}:{}}}}async function resolveContextSemanticAffinity(pmRoot,author){const identity=detectAgentIdentity(),semanticState=await readSessionState(pmRoot),attributionKey=identity.instance||semanticAttributionKey(author);return semanticAttributionAffinity(semanticState.semantic_attribution?.[attributionKey])}async function runContext(options,global2){const pmRoot=resolvePmRoot(process.cwd(),global2.path),resolvedRuntime=await resolveContextRuntime(options,global2),corpus=await loadContextCorpus(global2,resolvedRuntime),scaledLimit=resolveContextLimitAtScale(resolvedRuntime.limit,corpus.fullCorpus.length),runtime={...resolvedRuntime,limit:scaledLimit,tokenBudget:resolveContextTokenBudget(options.tokenBudget,Math.max(256,scaledLimit*160))},author=resolveAuthor(void 0,runtime.settings.author_default),claimFocus=await resolveContextSemanticAffinity(pmRoot,author),extensionHealthPromise=resolveContextExtensionHealthProjection(options.noExtensionHealth===!0,pmRoot,runtime.settings),blockedIds=collectDependencyBlockedIds(corpus.fullCorpus,runtime.statusRegistry),focusGroups=await resolveContextFocusGroups(corpus.listedItemMetadata,corpus.allItems,corpus.fullCorpus,blockedIds,runtime.statusRegistry,runtime.sectionsIncluded,runtime.limit,nowIso(),author,options.after,buildContextCursorFingerprint(options,pmRoot),shouldPageContextFocus(options,corpus.fullCorpus.length),pmRoot,runtime.tokenBudget,claimFocus,resolveItemTypeRegistry(runtime.settings,getActiveExtensionRegistrations())),agendaContext=await buildContextAgenda(global2,runtime,corpus.subtreeIds,new Set([...focusGroups.highLevel,...focusGroups.lowLevel,...focusGroups.blockedFallback].map(item=>item.id))),workspaceMemory=await readWorkspaceMemory(corpus.fullCorpus,{pmRoot,statusRegistry:runtime.statusRegistry,now:agendaContext.agenda.now}),warnings=mergeSortedWarnings(corpus.listed.warnings,agendaContext.agenda.warnings,focusGroups.ranking.warnings,[...focusGroups.featureStore.warnings],workspaceMemory.warnings),inProgressCount=countContextStatus(focusGroups.activeItems,runtime.statusRegistry.in_progress_status,runtime.statusRegistry),openCount=focusGroups.activeItems.length-inProgressCount,sections=await buildOptionalContextSections({runtime,allItems:corpus.allItems,fullCorpus:corpus.fullCorpus,blockedIds,focusGroups,now:agendaContext.agenda.now,global:global2}),summaryExtras=buildContextSummaryExtras(corpus.allItems,runtime.statusRegistry,blockedIds),result={output_default:"toon",now:agendaContext.agenda.now,depth:runtime.depth,sections_included:runtime.sectionsIncluded,window:{anchor:agendaContext.agenda.anchor,start:agendaContext.agenda.range.start,end:agendaContext.agenda.range.end,past:agendaContext.agenda.range.past,from:agendaContext.agenda.range.from,to:agendaContext.agenda.range.to},filters:{type:options.type??null,tag:options.tag??null,priority:options.priority??null,assignee:options.assignee??null,assignee_filter:options.assigneeFilter??null,sprint:options.sprint??null,release:options.release??null,limit:options.limit??options.maxItems??null,parent:runtime.parentScope??null,token_budget:runtime.tokenBudget,runtime_filters:corpus.listed.filters.runtime_filters??agendaContext.agenda.filters.runtime_filters??{}},summary:{returned_focus:{active_items:focusGroups.activeItems.length,in_progress:inProgressCount,open:openCount,blocked:focusGroups.blockedItems.length},blocked_fallback_used:focusGroups.blockedFallbackUsed,high_level:focusGroups.highLevel.length,low_level:focusGroups.lowLevel.length,agenda_events:agendaContext.agendaSummary.events,...summaryExtras},high_level:focusGroups.highLevel,low_level:focusGroups.lowLevel,blocked_fallback:focusGroups.blockedFallback,agenda:{summary:agendaContext.agendaSummary,events:agendaContext.agendaEvents},...focusGroups.pageExtras};return result.workspace_memory=selectWorkspaceMemory(workspaceMemory,Math.min(800,Math.floor(runtime.tokenBudget*.2))),Object.assign(result,await extensionHealthPromise),attachOptionalContextSections(result,sections,focusGroups.featureStore.warning_details),applyContextTagProjection(result,options.noTags===!0),options.explainRanking===!0&&(result.ranking=toContextRankingSummary(focusGroups.ranking,focusGroups.featureStore,new Set([...focusGroups.highLevel,...focusGroups.lowLevel,...focusGroups.blockedFallback].map(entry=>entry.id))),result.packing=toContextPackingSummary(focusGroups.packing)),rememberReadOutputFocusRows(result,[...focusGroups.highLevel,...focusGroups.lowLevel,...focusGroups.blockedFallback].map(row=>({id:row.id,status:normalizeStatusForRegistry(row.status,runtime.statusRegistry)===runtime.statusRegistry.in_progress_status?"in_progress":"open",blocked:row.blocked}))),applyContextFocusProjection(result,runtime.focusFields),refreshReadOutputDeliveredCounts(result),warnings.length>0&&(result.warnings=warnings),maybeAttachEmptyContextSuggestions(result,focusGroups.activeItems,focusGroups.blockedItems),await attachContextUsageFeedback(result,focusGroups,pmRoot,author),result}export{CONTEXT_OUTPUT_VALUES,_testOnly,applyContextTagProjection,buildChildrenByParent,buildItemContextRelevanceCandidates,collectSubtreeIds,compareCriticalItems,mergeSortedWarnings,packRankedContextItems,parseContextDepth,parseContextFocusFields,parseContextSections,projectContextFocusRows,renderContextMarkdown,resolveContextExtensionHealthProjection,resolveContextOutputFormat,resolveContextTokenBudget,runContext,toContextFocusItem,toContextPackingSummary,toContextRankingSummary};
|
|
2
3
|
//# sourceMappingURL=context.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
|
|
1
|
+
(function(){try{var e=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},n=new e.Error().stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="67d97df8-6551-52ed-9307-8b573a087831")}catch{}})();import{EXIT_CODE}from"../../core/shared/constants.js";import{PmCliError}from"../../core/shared/errors.js";const MAX_DUPLICATE_CANDIDATE_PAIRS=1e6;function collectDuplicateCandidatePairs(items,maxPairs=MAX_DUPLICATE_CANDIDATE_PAIRS,threshold=.8,exhaustive=!1){const candidates=new Set,add=(left,right)=>{if(candidates.add(`${left}:${right}`),candidates.size>maxPairs)throw new PmCliError(`Duplicate sweep exceeded ${maxPairs} candidate pairs; narrow it with statuses or since.`,EXIT_CODE.CONFLICT,{code:"duplicate_sweep_cost_limit",required:"Narrow the duplicate query or increase its similarity threshold. No partial result was returned."})};if(exhaustive||threshold===0){for(let right=0;right<items.length;right+=1)for(let left=0;left<right;left+=1)add(left,right);return candidates}const frequencies=new Map;for(const{prepared}of items)for(const token of prepared.tokens)frequencies.set(token,(frequencies.get(token)??0)+1);const exact=new Map,codes=new Map,prefixes=new Map;for(const[right,{prepared}]of items.entries()){const tokens=[...prepared.tokens].sort((left,other)=>frequencies.get(left)-frequencies.get(other)||left.localeCompare(other)),prefixLength=tokens.length-Math.ceil(threshold*tokens.length-1e-12)+1,signals=[{index:exact,keys:[prepared.normalized],lengthFilter:!1},{index:codes,keys:threshold<=.99?prepared.issueCodes:[],lengthFilter:!1},{index:prefixes,keys:tokens.length===0?[""]:tokens.slice(0,prefixLength),lengthFilter:!0}];for(const signal of signals)appendPostingCandidates(items,right,signal,threshold,add)}return candidates}function appendPostingCandidates(items,right,signal,threshold,add){const rightLength=items[right].prepared.tokens.length;for(const key of signal.keys){const posting=signal.index.get(key)??[];for(const left of posting){const leftLength=items[left].prepared.tokens.length;signal.lengthFilter&&Math.min(leftLength,rightLength)/Math.max(leftLength,rightLength)+1e-12<threshold||add(left,right)}posting.push(right),signal.index.set(key,posting)}}export{MAX_DUPLICATE_CANDIDATE_PAIRS,collectDuplicateCandidatePairs};
|
|
2
2
|
//# sourceMappingURL=duplicate-candidates.js.map
|