pm is a git-native project management CLI for humans and coding agents. It stores items as TOON (.toon) by default with full first-class JSON-front-matter Markdown (.md) support, keeps append-only JSONL history, and supports safe collaboration.
- Git-native items that stay reviewable in diffs
- Safe multi-agent workflows with claims, locks, and restore
- Deterministic output with TOON by default and
--jsonwhen needed - Layered command help: compact default (
Intent+ one example) and deep explainability via--explain - Machine-readable help payloads via
pm <command> --help --json(alsopm help <command> --json) - Structured diagnostics with machine-readable JSON error envelopes when
--jsonis active - Dedicated machine contract surface via
pm contracts(--action,--command,--schema-only,--runtime-only,--active-only) - Sparse TOON default output that omits null/undefined/empty fields for token-efficient agent workflows
- Agent-friendly calendar views (
pm calendar/pm cal) with markdown default output - Agent-first context snapshot command (
pm context/pm ctx) for critical work + agenda triage - Reusable create templates (
pm templates save/list/show+pm create --template) - First-class dual item storage formats: TOON (
.toon) and JSON-front-matter Markdown (.md) - Compact TOON documents that are easier to review in terminal and GitHub web UI
- Automatic item format migration when
item-formatconfig changes - Deterministic canonical normalization and atomic writes for parallel git/worktree workflows
- Warning-first/strict validation policies for sprint/release and parent references
- Additive history diff/verify diagnostics (
pm history --diff --verify) - Linked path hygiene for files/docs (
--add-glob,--migrate,--validate-paths,--audit) - Dependency topology inspection via
pm deps --format tree|graph - Deterministic
--tagcompletion suggestions from tracked item metadata - Additive large-list controls via projection (
--compact/--fields), configurable sorting (--sort+--order), pagination (--offset), and opt-in JSON streaming (--streamwith--json) - Governance-focused corpus analysis commands:
pm aggregatedefault grouped counts andpm dedupe-auditduplicate clustering - Standalone
pm validatecommand for metadata, resolution, lifecycle, linked-file, linked-command reference, and history-drift audits - Opt-in non-interactive progress output for long-running operations (
pm test,pm test-all,pm reindexwith--progress) - Managed background linked-test orchestration (
pm test --run --background,pm test-all --background, andpm test-runslifecycle controls; barepm test-runsdefaults to list output) - Linked-test context preflight and auto-remediation controls (
pm test/pm test-allwith--check-contextand--auto-pm-context) - Safer cache cleanup controls via
pm gc --dry-runand scoped cleanup with--scope index|embeddings|runtime - Pager-safe help output in automation (help requests auto-disable paging on non-TTY stdout, with explicit global
--no-pageroverride) - Settings-gated item-level test result tracking (
pm config ... test-result-tracking --policy enabled|disabled) - Optional search and extension support for more advanced setups
pm now centralizes command/action contract metadata in src/sdk/cli-contracts.ts and uses it across:
- CLI option normalization in
src/cli/main.ts - Shell completion generation in
src/cli/commands/completion.ts - Pi wrapper tool actions, JSON Schema, and arg mapping in
.pi/extensions/pm-cli/index.ts
Compatibility policy for command contracts:
- Existing commands/flags and aliases remain valid.
- Pi tool schema now uses strict action-scoped branches (schema v4); callers should send only action-relevant fields.
--jsonremains machine-contract stable; search projection defaults are command-specific (pm searchdefaults to compact rows unless--fullis requested).pm contracts --jsonis the canonical runtime contract introspection surface for agents, including active extension command/action metadata.- Contract payloads include runtime action availability metadata (
action_availability) and optional runtime-filtered views (--runtime-only,--active-only) so automation can avoid non-invocable actions. pm contracts --command <name>now scopes output to the selected command by default (intentional breaking change for lower-noise machine payloads); omit--commandfor full contract corpus output.pm contractssupports lightweight projection modes for automation pipelines:--flags-only(command flag surface) and--availability-only(runtime invocability metadata); the projection flags are mutually exclusive.- When
--actionis provided without--command,pm contracts --flags-onlynow scopescommand_flagsto the action-mapped command surface (for exampletest-runs-listresolves totest-runs). - Contract payloads include canonical flag + alias metadata (
command_flagspluscommander_aliases) so machine clients can expose accepted hyphen/underscore variants deterministically. pm completionscripts are generated from the same normalized command-contract registry used by parser/contracts, keeping runtime, contract, and completion parity aligned.pm completionnow defaults to lazy tag expansion through runtimepm completion-tagslookup in generated scripts; pass--eager-tagsto embed static tags in the script (legacy eager mode).
- Default item format is TOON (
.toon) using root-object field storage (id,title, ...,body). - JSON front matter + markdown body (
.md) is a fully supported alternative format. front_matteris an internal TypeScript field name (ItemDocument.front_matter) for item metadata; TOON files store the same metadata as top-level keys, not YAML front matter.- History files always remain JSONL (
history/<id>.jsonl). - Set project item storage format with:
pm config project set item-format --format toon
# or
pm config project set item-format --format json_markdownChanging item-format automatically migrates item files to the configured format.
- TOON and JSON/Markdown are equally supported item formats; teams can choose either format per repository.
- Canonical normalization (stable field ordering and deterministic serialization) reduces diff churn and helps keep merges predictable.
- Item writes are atomic (temp file + rename), which prevents partial writes and corruption during concurrent local operations.
- Item history remains append-only JSONL with before/after hashes, so changes are auditable and recoverable with
pm historyandpm restore. - When both
.toonand.mdexist for one item ID, configureditem_formatis the source of truth and automatic migration removes split-format drift. - Concurrent edits to the exact same content can still require normal git conflict resolution; the storage model is designed to avoid silent data loss and make reconciliation explicit.
pm-cli requires Node.js 20 or newer.
npm install -g @unbrained/pm-cli
pm --version
pm --helpFor project-local use:
npx @unbrained/pm-cli --helppm init
pm create \
--title "Fix Windows restore failure after stale lock cleanup" \
--description "Restore can fail on Windows when a stale lock is cleaned up during retry." \
--type Issue \
--status open \
--priority 1 \
--tags "windows,locks,restore,release" \
--body "Users can reproduce this on Windows after an interrupted restore. Add retry logging and verify restore succeeds after stale lock cleanup." \
--deadline +3d \
--estimate 180 \
--acceptance-criteria "Restore succeeds after stale lock cleanup on Windows and regression coverage is added." \
--definition-of-ready "Owner, reproduction steps, and affected files are identified." \
--order 7 \
--goal "Release readiness" \
--objective "Stabilize restore under lock contention" \
--value "Reduces failed recovery workflows during real incidents" \
--impact "Fewer blocked releases and clearer operator recovery steps" \
--outcome "Restore completes reliably after stale lock cleanup" \
--why-now "The bug affects recovery flows and can block release work." \
--author "alex-maintainer" \
--message "Create restore failure issue with full metadata" \
--assignee "alex-maintainer" \
--parent "pm-release" \
--reviewer "sam-reviewer" \
--risk high \
--confidence medium \
--sprint "2026-W11" \
--release "v2026.3" \
--blocked-by "pm-locks" \
--blocked-reason "Need the lock cleanup refactor merged first" \
--unblock-note "Rebase once the lock cleanup patch lands" \
--reporter "qa-bot" \
--severity high \
--environment "windows-11 node-25 npm-global-install" \
--repro-steps "1) Interrupt restore after lock creation 2) Retry restore 3) Observe stale-lock cleanup fail on Windows" \
--resolution "Add a retry after stale-lock cleanup and log the recovery path" \
--expected-result "Restore retries cleanly and completes after stale-lock cleanup." \
--actual-result "Restore exits with a lock error after cleanup on Windows." \
--affected-version "2026.3.9" \
--fixed-version "2026.3.10" \
--component "core/locks" \
--regression true \
--customer-impact "Maintainers can be blocked from recovering work during release prep." \
--dep "id=pm-locks,kind=blocks,author=alex-maintainer,created_at=now" \
--comment "author=alex-maintainer,created_at=now,text=Initial triage confirms the Windows-only stale-lock recovery failure." \
--note "author=alex-maintainer,created_at=now,text=Investigate lock cleanup timing in the restore retry path." \
--learning "author=alex-maintainer,created_at=now,text=Windows file-handle timing needs a retry window after stale-lock cleanup." \
--file "path=src/core/lock/lock-store.ts,scope=project,note=likely stale-lock retry fix" \
--test "command=node scripts/run-tests.mjs test -- tests/integration/cli.integration.spec.ts,scope=project,timeout_seconds=900,note=restore lock regression coverage" \
--doc "path=docs/ARCHITECTURE.md,scope=project,note=lock and restore design context"
pm list-open --limit 10
pm claim <item-id>From there, use pm update, pm comments, pm notes, pm learnings, pm files, pm docs, pm test, pm search, and pm close as work progresses.
Claim behavior note:
pm claim <ID>can take over non-terminal items even when currently assigned to someone else.- Use
--forcefor claim/release only when overriding terminal-state or lock conflicts. - For non-owner release handoffs that only clear assignee metadata, prefer
pm release <ID> --allow-audit-release --author <you>before--force. - For ownership-conflict mutations,
--forceis intended for coordinated PM audits, lead-maintainer metadata corrections, or explicit ownership handoff cleanup. pm get <ID> --jsonnow includesclaim_statewith current assignee plus latest claim/release history context.pm get <ID> --jsonreturns body at top-level keybody(notitem.body) alongsideitem,linked, andclaim_state.
Create policy mode note:
pm createdefaults to strict required-option enforcement.- Use
--create-mode progressivefor staged governance triage when you need to defer non-critical metadata/linkage fields without placeholdernoneentries.
pm create --title "Triage seed" --description "Capture scope first, enrich later" --type Task --create-mode progressiveUse templates to save recurring create metadata (including repeatable seeds) and apply them with explicit override precedence:
Template names are positional arguments (pm templates save <name> / pm templates show <name>); --name is not a valid flag.
pm templates save release-issue \
--type Issue \
--status open \
--priority 1 \
--tags "release,incident" \
--dep "id=pm-release,kind=related,created_at=now" \
--file "path=src/cli/main.ts,scope=project"
pm templates list
pm templates show release-issue --json
# Explicit flags override template defaults deterministically.
pm create \
--title "Follow-up issue" \
--description "Investigate release incident follow-up." \
--type Issue \
--template release-issue \
--status blockedpm search now auto-enables semantic-capable defaults on hosts where local Ollama is installed, without requiring manual semantic provider/vector configuration in settings.json.
- Auto-defaults only apply when semantic settings are otherwise unset (no explicit
settings.search.provider,settings.vector_store.adapter,providers.*, orvector_store.*semantic config). - Resolved defaults are:
- embedding provider: Ollama (
http://localhost:11434) - embedding model:
PM_OLLAMA_MODEL(if set), otherwise first model fromollama list(preferring names containingembed/embedding), otherwiseqwen3-embedding:0.6b - vector store: local LanceDB path
.agents/pm/search/lancedb/
- embedding provider: Ollama (
- Explicit user/project configuration always takes precedence over auto-defaults.
- If implicit auto-defaulted semantic execution fails at runtime,
pm searchfalls back to keyword mode to avoid breaking existing users. - Disable this behavior with
PM_DISABLE_OLLAMA_AUTO_DEFAULTS=1.
To (re)build semantic artifacts explicitly:
pm reindex --mode hybridpm search now supports explicit projection controls and defaults to compact rows in both TOON and JSON output modes:
- default projection: compact (
id,title,status,type,priority,updated_at,score,matched_fields) --full: return full hit rows (including nesteditempayload)--fields <csv>: return only specific fields (for example--fields id,title,score,item.updated_at)- projection flags are mutually exclusive (
--compact,--full,--fields)
Unquoted multi-word queries are accepted directly:
pm search performance mobile gpu --limit 5All list-family commands now support parent-scoped filtering:
pm list-open --parent pm-epic01 --limit 20
pm list-in-progress --parent pm-feature02 --jsonList-family commands support explicit projection and deterministic sort controls:
# Compact default projection fields for list rows
pm list-open --compact --limit 20
# Custom projected fields
pm list-all --fields id,title,parent,type --limit 50
# Configurable sort field + order
pm list-open --sort deadline --order asc --limit 20
pm list-open --sort priority --order desc --limit 20Projection flags are mutually exclusive for list-family commands (--compact, --fields, --include-body remains additive for body projection).
Governance workflows now include explicit non-owner metadata mutation and bulk update planning surfaces:
pm update --allow-audit-updateallows non-owner metadata updates without broad--forcesemantics.--allow-audit-updateis intentionally scoped: lifecycle/ownership/linkage mutations remain disallowed in this mode (for example assignee/parent and other lifecycle-governing fields).pm update --allow-audit-dep-updateenables non-owner append-only dependency additions via--depwithout broad--forcesemantics.--allow-audit-updateand--allow-audit-dep-updateare mutually exclusive by design.pm update-manyprovides native bulk mutation with deterministic filter targeting, dry-run planning, optional checkpoint capture, and rollback.pm update-manysupports linked-array payload parity withpm update(repeatable--dep/--comment/--note/--learning/--file/--test/--doc/--reminder/--eventplus--clear-*,--replace-deps, and--replace-tests).pm update-many --rollback <checkpoint-id>restores every item in a prior checkpoint (ownership-safe restore path included).
# Ownership-safe metadata audit update (non-owner, metadata-only scope)
pm update pm-a1b2 --description "Clarified acceptance boundaries" --allow-audit-update --author audit-maintainer
# Ownership-safe dependency-only audit update (append-only --dep)
pm update pm-a1b2 --dep "id=pm-epic01,kind=related,author=audit-maintainer,created_at=now" --allow-audit-dep-update --author audit-maintainer
# Bulk apply mode with deterministic targeting
pm update-many --filter-status open --filter-tag governance --status in_progress --author maintainer --message "Governance sweep"
# Bulk linked-test replacement across matched items (single transaction per item)
pm update-many --filter-tag wave:7 --replace-tests --test "command=node scripts/run-tests.mjs test -- tests/core/history.spec.ts,scope=project,timeout_seconds=240" --message "Normalize linked test assertions"
# Dry-run planning mode (no mutations)
pm update-many --filter-status in_progress --priority 1 --deadline +2d --dry-run --json
# Roll back a previously captured checkpoint
pm update-many --rollback 20260406T102455Z-7xq9 --author maintainer --message "Rollback governance batch"Governance workflows now have dedicated audit commands:
# Group child counts by parent/type for decomposition checks
pm aggregate --group-by parent,type --status open --json
# Include rows that do not have a parent when grouping by parent
pm aggregate --group-by parent,type --include-unparented --json
# Group by operational triage dimensions
pm aggregate --group-by type,status --json
# Detect likely duplicates by exact title, fuzzy title, or parent-scoped title collisions
pm dedupe-audit --mode title_exact --limit 25 --json
pm dedupe-audit --mode title_fuzzy --threshold 0.75 --limit 25 --json
pm dedupe-audit --mode parent_scope --limit 25 --jsonpm aggregate --group-by supports parent,type,priority,status,assignee,tags,sprint,release.
pm gc now supports no-side-effect previews and targeted cleanup scopes:
# Preview what would be removed (no deletes)
pm gc --dry-run --json
# Clean only index + embeddings cache artifacts
pm gc --scope index,embeddings --json
# Repeatable scope flags are also supported
pm gc --scope runtime --scope embeddings --jsonpm gc output now includes dry_run, resolved scope, and guidance fields. When search artifacts are removed, guidance includes reindex recommendations.
pm health includes deterministic checks for item/history integrity and semantic vector freshness:
directories- distinguishes required tracker directories from optional built-in item-type directories
- reports
missing_requiredandmissing_optionalseparately in check details - treats missing optional built-in type directories (
events,reminders,milestones,meetings) as informational by default - supports
--strict-directoriesto treat missing optional directories as health warnings/failures - supports
--strict-exit(alias--fail-on-warn) to return non-zero exit (1) when health warnings are present (ok=false)
integrity- scans item and history files for merge-conflict markers (
<<<<<<<,=======,>>>>>>>) - reports invalid item parses and invalid JSONL lines in history streams with deterministic warning codes
- scans item and history files for merge-conflict markers (
history_drift- scans current items and compares each canonical item hash against the latest history
after_hash - reports missing history streams, unreadable/corrupt history streams, and hash mismatches
- scans current items and compares each canonical item hash against the latest history
vectorization- compares current item
updated_atvalues against a local vectorization ledger atsearch/vectorization-status.json - identifies stale/missing vector entries and (by default) performs targeted semantic refresh for stale item IDs when semantic runtime is available
- avoids forcing a full rebuild (
pm reindex) for routine health checks - supports explicit refresh policy controls:
--check-only/--no-refreshfor read-only diagnostics--refresh-vectorsto force refresh intent explicitly
- compares current item
The vectorization ledger is also refreshed during pm reindex --mode semantic|hybrid to keep health diagnostics aligned with the latest indexed corpus.
pm validate provides a dedicated audit surface for project metadata quality and integrity checks:
- Runs all validation checks by default (
metadata,resolution,lifecycle,files,command_references,history_drift). - Runs linked-command PM reference checks by default (
command_references) to catch stalepm-<id>references before execution-time failures. - Supports scoped checks with
--check-metadata,--check-resolution,--check-lifecycle,--check-stale-blockers,--check-files,--check-command-references, and--check-history-drift. --check-metadatasupports--metadata-profile core|strict|customfor deterministic required-field policy selection.--metadata-profile customreadssettings.validation.metadata_required_fields; if the configured list is empty, validation falls back to core requirements and emitsvalidate_metadata_custom_profile_missing_required_fields:0.--check-lifecycleaudits active-item governance drift for terminal-parent lineage and closure-like metadata on non-terminal items.--check-stale-blockersadds optional blocker-consistency diagnostics to lifecycle checks, surfacing staleblocked_by/blocked_reasonpatterns without enabling those heuristics by default.- Lifecycle-check details include effective closure/stale pattern lists and deterministic per-field pattern sources (
defaultvssettings). --check-filessupports--scan-mode default|tracked-all|tracked-all-strict; tracked modes use git-tracked candidates when available.tracked-allexcludes PM internals by default for higher-signal orphaned results; pass--include-pm-internalsfor full internal-audit scans.tracked-all-strictforces full tracked coverage (including PM internals) and bypasses internal exclusion filtering.tracked-all-strictemits explicit strict-coverage visibility fields in file-check details (strict_mode_forces_pm_internals,strict_mode_forces_pm_internals_notice) and warningvalidate_files_tracked_all_strict_forces_pm_internalswhen internals were force-enabled.- File-check details report filtered candidate counts (
candidate_total,candidate_scanned) plus raw pre-filter counts (candidate_total_raw,candidate_scanned_raw),pm_internal_excluded_count, and structuredexcluded_by_reasonsummaries when paths are filtered. - Command-reference details report referenced PM IDs and stale-reference rows; stale rows emit
validate_command_references_stale_pm_ids:<count>warnings. - Resolution-check details now include default remediation hint templates (
pm update <id> ...) for missingresolution/expected_result/actual_resultfields. --strict-exit(alias--fail-on-warn) returns non-zero exit (1) when validation warnings are present (ok=false).- Returns deterministic TOON/JSON output suitable for review or automation pipelines.
- Output writers treat broken pipes (
EPIPE) as expected shell behavior: stdoutEPIPEexits successfully (for pipeline-friendly reads) while stderrEPIPEremains non-zero.
settings.history.missing_stream controls behavior when an item's history/<id>.jsonl stream is missing:
auto_create(default)- missing streams for existing items are created automatically before history-touching command paths continue
strict_error- history-touching command paths fail with a deterministic error instead of creating missing streams
Configure policy with:
pm config project set history-missing-stream-policy --policy auto_create
pm config project set history-missing-stream-policy --policy strict_error
pm config project get history-missing-stream-policy --jsonPolicy enforcement applies to pm history, pm activity, pm stats, pm health, restore, and existing-item mutation paths.
settings.validation.sprint_release_format controls --sprint and --release validation behavior during pm create and pm update:
warn(default)- accepts non-conforming values and emits deterministic warnings (
validation_warning:sprint_format:<value>/validation_warning:release_format:<value>)
- accepts non-conforming values and emits deterministic warnings (
strict_error- rejects non-conforming values with a deterministic usage error
Accepted format for conforming values: 1-64 characters matching [A-Za-z0-9][A-Za-z0-9._/-]* (no spaces).
Configure policy with:
pm config project set sprint-release-format-policy --policy warn
pm config project set sprint-release-format-policy --policy strict_error
pm config project get sprint-release-format-policy --jsonsettings.validation.parent_reference controls how --parent behaves during pm create and pm update when the referenced parent item does not exist:
warn(default)- keeps backward-compatible behavior and emits
validation_warning:parent_reference_missing:<id>
- keeps backward-compatible behavior and emits
strict_error- rejects missing parent references with a deterministic usage error
Configure policy with:
pm config project set parent-reference-policy --policy warn
pm config project set parent-reference-policy --policy strict_error
pm config project get parent-reference-policy --jsonsettings.validation.metadata_profile controls default required-field behavior for pm validate --check-metadata:
core(default)- requires baseline governance fields (
author,acceptance_criteria,estimated_minutes,close_reasonfor closed items)
- requires baseline governance fields (
strict- extends core checks with additional governance fields (
reviewer,risk,confidence,sprint,release)
- extends core checks with additional governance fields (
custom- uses
settings.validation.metadata_required_fieldsas the required field set (falls back to core + warning when empty)
- uses
Configure policy with:
pm config project set metadata-validation-profile --policy core
pm config project set metadata-validation-profile --policy strict
pm config project set metadata-validation-profile --policy custom
pm config project get metadata-validation-profile --jsonConfigure custom required fields with:
pm config project set metadata-required-fields --criterion sprint --criterion release
pm config project set metadata-required-fields --clear-criteria
pm config project get metadata-required-fields --jsonsettings.validation.lifecycle_*_patterns controls default substring heuristics used by pm validate --check-lifecycle and optional stale blocker diagnostics (--check-stale-blockers):
settings.validation.lifecycle_stale_blocker_reason_patterns- stale blocker reason substrings matched when stale blocker checks are enabled
settings.validation.lifecycle_closure_like_blocked_reason_patterns- closure-like
blocked_reasonsubstrings flagged on active items
- closure-like
settings.validation.lifecycle_closure_like_resolution_patterns- closure-like
resolutionsubstrings flagged on active items
- closure-like
settings.validation.lifecycle_closure_like_actual_result_patterns- closure-like
actual_resultsubstrings flagged on active items
- closure-like
Configure lifecycle patterns with:
pm config project set lifecycle-stale-blocker-reason-patterns --criterion "no active blocker"
pm config project set lifecycle-closure-like-blocked-reason-patterns --criterion "work is closed"
pm config project set lifecycle-closure-like-resolution-patterns --criterion "closed with implementation evidence"
pm config project set lifecycle-closure-like-actual-result-patterns --criterion "work completed"
pm config project set lifecycle-closure-like-resolution-patterns --clear-criteria
pm config project get lifecycle-stale-blocker-reason-patterns --jsonsettings.testing.record_results_to_items controls whether pm test --run / pm test-all append bounded test_runs summaries to item front matter:
disabled(default)- test execution output is returned in command results only
enabled- successful/failed runs append deterministic item-level
test_runssummary entries (bounded history retention)
- successful/failed runs append deterministic item-level
Configure policy with:
pm config project set test-result-tracking --policy enabled
pm config project set test-result-tracking --policy disabled
pm config project get test-result-tracking --jsonsettings.telemetry.enabled controls whether command telemetry is exported to the configured ingestion endpoint.
- default:
enabled - opt-out:
disabled - first-run prompt:
- interactive TTY only
- skipped for non-interactive/CI and JSON-oriented automation paths
- persisted in global settings
Configure policy with:
pm config global set telemetry-tracking --policy enabled
pm config global set telemetry-tracking --policy disabled
pm config global get telemetry-tracking --jsonpm can additionally emit one OTLP trace span per command to a local (or custom) collector endpoint:
OTEL_EXPORTER_OTLP_TRACES_ENDPOINT=http://127.0.0.1:4318/v1/traces- or
OTEL_EXPORTER_OTLP_ENDPOINT=http://127.0.0.1:4318(auto-appends/v1/traces) - optional service name override:
OTEL_SERVICE_NAME=pm-cli - disable this OTEL side-channel explicitly with
PM_TELEMETRY_OTEL_DISABLED=1
Example:
OTEL_EXPORTER_OTLP_ENDPOINT=http://127.0.0.1:4318 OTEL_SERVICE_NAME=pm-cli node dist/cli.js list-openpm config also supports read-only key discovery and one-shot snapshot export for integration workflows:
pm config project list --json
pm config project export --jsonlistreturns key metadata (key, aliases, value kind, applicable set flags, summary) plus current resolved values.exportreturns the resolved config value object in one payload for deterministic machine consumption.
pm history now supports additive diagnostics:
# Include changed-field summaries derived from RFC6902 patches
pm history pm-a1b2 --diff
# Verify before/after hash replay chain and current item hash alignment
pm history pm-a1b2 --verify --jsonpm restore also supports history-only recovery when an item file is missing or deleted but its history stream still exists.
pm activity now supports deterministic timeline slicing plus JSON line streaming for downstream automation:
- Filters:
--id,--op,--author,--from,--to,--limit - Time bounds accept ISO/date/relative inputs (
--from -7d --to now, etc.) --streamis JSON-only and emits line-delimited payloads (rows,ndjson,jsonl)- boolean-style stream enablement is accepted (
--stream,--stream true,--stream 1)
pm activity --id pm-a1b2 --op update --author codex-agent --from -7d --to now --limit 100
pm activity --json --stream rows --from -1d --limit 200- Date/time inputs used by
--deadline,--deadline-before,--deadline-after, calendar--date/--from/--to, reminders, and events accept:- ISO timestamps
- Flexible date strings (for example
2026-03-31T13-59,20260331,20260331T135900Z) - Relative offsets (
+6h,+1d,+2w,+6m)
- Accepted values are normalized to canonical ISO timestamps for deterministic storage and filtering.
- Parse failures now report the precise field context (for example
event.end,reminder.at,--from,deadline-before) for faster remediation. - Compound relative expressions such as
+3d+1hare rejected; use a single relative token (+3d) or an ISO/date string.
- Canonical status values are:
draft,open,in_progress,blocked,closed,canceled. - Status input flags also accept
in-progressas an alias forin_progress(pm create,pm update,pm calendar, andpm test-all). - Persisted item data and command output remain canonical (
in_progress) for deterministic storage and filtering. pm update --close-reason <text>setsclose_reasonexplicitly;pm update --unset close-reasonclears it.- When
pm update --statusreopens an item fromclosedto a non-terminal status, staleclose_reasonis auto-cleared unless--close-reasonis explicitly provided in that update call.
Task lifecycle aliases provide discoverable one-step workflows:
pm start-task <id>: claim + move toin_progresspm pause-task <id>: move toopen+ release claimpm close-task <id> "<reason>": close + release claim metadata
These aliases preserve canonical mutation history entries and accept standard mutation controls (--author, --message, --force; close-task also accepts --validate-close).
Entry-style flags (--add, --remove, and repeatable create/update seed flags like --comment, --file, --test, --doc, --reminder, --event, --type-option) now accept three deterministic forms:
- CSV key/value:
key=value,key2=value2 - Markdown-style key/value:
key: value(single line, bullets, or multiline blocks) - Stdin token: pass
-and pipe payload into the command
Examples:
# Files/docs/tests add supports markdown-style key:value
pm files pm-a1b2 --add "path: src/cli/main.ts,scope: project,note: cli wiring"
pm docs pm-a1b2 --add $'- path: README.md\n- scope: project\n- note: docs sync'
pm test pm-a1b2 --add $'command: node scripts/run-tests.mjs test\nscope: project\ntimeout_seconds: 240'
# Linked-path hygiene for files/docs (bulk migrate + optional validation/audit)
pm files pm-a1b2 --add-glob "src/**/*.ts"
pm docs pm-a1b2 --add-glob "pattern=docs/**/*.md,scope=project,note=docs sweep"
pm files pm-a1b2 --migrate "from=src/old/,to=src/new/" --validate-paths --audit
pm docs pm-a1b2 --migrate "from=docs/legacy/,to=docs/current/" --validate-paths --audit
pm files pm-a1b2 --add "path=src/new/entry.ts,scope=project" --append-stable
# Discover file paths mentioned in item text before adding them as links
pm files discover pm-a1b2
pm files discover pm-a1b2 --apply --note "discovered from item text"
# Comments can be added positionally or with --add
pm comments pm-a1b2 "captured from shorthand positional text"
pm comments pm-a1b2 --add "text: captured from markdown formatter"
pm comments pm-a1b2 --add "handoff note from alternate author" --author "alex-maintainer" --force
pm comments pm-a1b2 --add "audit note from governance review" --author "audit-maintainer" --allow-audit-comment
# Notes and learnings support the same positional/--add shorthand
pm notes pm-a1b2 "implementation context captured from shorthand positional text"
pm notes pm-a1b2 --add "text: parser fallback rationale"
pm notes pm-a1b2 --add "audit note from governance review" --author "audit-maintainer" --allow-audit-comment
pm learnings pm-a1b2 --add "text: always run linked tests through the sandbox runner"
pm learnings pm-a1b2 --add "audit learning from governance review" --author "audit-maintainer" --allow-audit-comment
# Pipe markdown payload via stdin with "-"
printf '%s\n' 'path: docs/ARCHITECTURE.md' 'scope: project' 'note: piped update' | pm files pm-a1b2 --add -
printf '%s\n' 'text: evidence from piped stdin' | pm comments pm-a1b2 --add -
printf '%s\n' 'text: implementation note from piped stdin' | pm notes pm-a1b2 --add -
printf '%s\n' 'text: learning captured from piped stdin' | pm learnings pm-a1b2 --add -
printf '%s\n' 'at: +1d' 'text: reminder from piped stdin' | pm update pm-a1b2 --reminder -
printf '%s\n' 'Backfilled body from stdin token' | pm update pm-a1b2 --body -
pm update pm-a1b2 --dep "id=pm-b3c4,kind=blocks,author=alex-maintainer,created_at=now"
pm update pm-a1b2 --dep-remove "pm-b3c4"
pm update pm-a1b2 --replace-deps --dep "id=pm-c7d8,kind=related,author=alex-maintainer,created_at=now"
pm update pm-a1b2 --clear-deps
pm deps pm-a1b2 --format tree
pm deps pm-a1b2 --format graph --json
# Bulk governance snapshots for latest comments across matching items
pm comments-audit --status in_progress --parent pm-epic01 --tag governance --latest 1 --limit 20 --json
# Full-history export rows for NDJSON-friendly downstream processing
pm comments-audit --status in_progress --sprint sprint-12 --release v0.2 --priority 1 --full-history --limit 20 --json
# Summary-only item rows (no comment rows) for scoped inventory checks
pm comments-audit --status in_progress --latest 0 --limit-items 20 --jsonpm comments-audit --latest and --full-history are intentionally mutually exclusive. --latest 0 is valid and returns deterministic summary rows with export.row_count = 0. --limit is an alias for --limit-items (both remain supported). All modes now include additive top-level summary metrics (totals, coverage ratio/percent, and by_type breakdown) without changing existing items/filters/export payloads.
Use explicit clear flags for repeatable fields (--clear-files, --clear-comments, --clear-docs, etc.) and --unset <field> for scalar clears.
For pm create log-seed flags, --comment accepts plain-text shorthand (--comment "triage note") in addition to structured forms. Structured --comment/--note/--learning payloads accept only author, created_at, and text keys. Ambiguous unquoted payloads that introduce extra parsed keys (for example text=hello,scope:project) are rejected to prevent silent text truncation. Use quoted text (text="hello,scope:project"), markdown-style key/value input, or stdin token - for punctuation-heavy text.
- Use dedicated linked-artifact commands for file/doc mutations:
pm files <ID> --add/--add-glob/--removepm docs <ID> --add/--add-glob/--remove
- Use
pm update <ID> --body <value>to replace an item's body content (including empty-string backfills); usepm append <ID> --body <value>for additive narrative updates. - Dependency links on existing items are now mutated through
pm update(--depto add entries,--clear-depsto clear all,--replace-depsfor one-shot atomic replacement, and--dep-remove/--dep_removeto remove selectors). - Use
pm deps <ID> --format tree|graphfor deterministic read-only dependency visualization. pm updatesupports transactional linked mutations in one lock/history operation via repeatable--comment,--note,--learning,--file,--test, and--docflags.- Dedicated commands (
pm comments|notes|learnings|files|test|docs) remain available for focused single-surface edits. pm test <ID> --addintentionally enforces sandbox-safe, runnable command entries. Every new linked test must includecommand=...; optionalpath=...is metadata-only context.pm create --testfollows the same policy:command=...is required, optionalpath=...can annotate command scope.- Linked test entries also support optional per-entry runtime directives/assertions plus context override metadata:
env_set=KEY=VALUE;KEY2=VALUE2,env_clear=KEY1;KEY2,shared_host_safe=true|false,pm_context_mode=schema|tracker|auto,assert_stdout_contains=...,assert_stdout_regex=...,assert_stderr_contains=...,assert_stderr_regex=...,assert_stdout_min_lines=<int>,assert_json_field_equals=path=value,assert_json_field_gte=path=<number>. pm test <ID> --run/pm test-allexecute in temporary sandbox roots but seed project/globalsettings.jsonandextensions/directories from source roots so extension-defined type behavior matches direct workspace commands.pm test <ID> --run/pm test-allsupport additive run-level runtime controls: repeatable--env-set KEY=VALUE, repeatable--env-clear NAME,--shared-host-safe(ephemeral/shared-host-friendly defaults such asPORT=0when unset),--pm-context schema|tracker|auto,--override-linked-pm-context(force run-level context over per-testpm_context_mode),--check-context,--auto-pm-context,--fail-on-context-mismatch,--fail-on-skipped,--fail-on-empty-test-run, and--require-assertions-for-pm.pm test-allsupports blast-radius pagination with--limitand--offsetbefore linked-test execution.pm test <ID> --run --backgroundandpm test-all --backgroundstart managed background runs and return run metadata immediately.pm test-runs(no subcommand) defaults tolistoutput;pm test-runs list|status|logs|stop|resumeprovides explicit background lifecycle management, log tailing, health snapshots, and stop/resume controls.- Background run dedupe prevents parallel duplicate execution when an equivalent active run fingerprint already exists.
- Background run metadata resolves
requested_bydeterministically through: explicit author ->PM_AUTHOR-> settingsauthor_default->USER/LOGNAME/USERNAME-> OS username (whoami) ->unknown. - Linked-test
run_resultsincludeexecution_contextmetadata (context mode, PM roots, item counts, mismatch signal, extension seeding state, PM tracker-read classification,requested_pm_context_mode, andauto_pm_context_applied) so PM-command parity is explicit in machine-readable output. - With
--check-context, run warnings include acontext_preflight:...summary (checked_pm_commands,tracker_read_commands,mismatches,auto_remediated) for deterministic diagnostics before/around linked execution. - In default
--pm-context schemamode, PM tracker-read linked commands (for examplelist*,get,search,stats,test-all) fail on dataset mismatch by default; use--pm-context autofor automatic tracker-read routing or--pm-context trackerfor full tracker-mode execution. - If run-level
--pm-context trackeris set but a linked test entry pinspm_context_mode=schema, mismatch diagnostics explicitly call out per-test override precedence and recommend either changing/removing per-test metadata or passing--override-linked-pm-contextto force run-level precedence. pm test <ID> --runandpm test-allemit heartbeat/progress lines to stderr in interactive terminals during long-running linked commands, and support explicit non-interactive progress output via--progress.- Linked test timeout handling uses deterministic process termination (including force-kill fallback) and reports explicit timeout/maxBuffer diagnostics in
run_results. - Failed linked test
run_resultsnow includefailure_category(for exampleinfra_collisionvsassertion_failure) andpm test-alltotals include aggregatedfailure_categoriescounts for triage. pm test <ID> --runnow returns dependency-failed exit code (5) when any linked test run result fails (matchingpm test-allfailure gating behavior).pm list/pm list-*return front-matter rows by default; pass--compactor--fields <csv>for projection control,--sort <field> --order <asc|desc>for deterministic ordering,--include-bodywhen body projection is needed,--offset <n>for pagination, and--stream(with--json) for newline-delimited item streaming.
pm is intentionally terminal-neutral so it works in native shells, IDE-integrated terminals, and emulated PTY backends:
- Output is plain deterministic TOON/JSON/markdown text (no required terminal-specific OSC/ANSI control protocol).
- Error exits preserve deterministic exit-code mapping while using graceful
process.exitCodebehavior. - Help invocations suppress pager hangs in non-interactive contexts by auto-disabling paging when stdout is not a TTY; use global
--no-pagerfor explicit suppression in any context. - Stdin token entry (
-) requires piped stdin when invoked from an interactive TTY. pm beads import --file -follows the same stdin guard: if stdin is interactive TTY,pmreturns usage guidance instead of waiting for EOF.- Linked test execution uses shell-compatible spawn orchestration instead of buffered one-shot capture, reducing silent long-run behavior in IDE-integrated terminals.
- During interactive runs, linked tests print periodic stderr heartbeat lines (
[pm test] linked-test ... running) until completion. - Timeout paths attempt graceful termination first, then deterministic force-kill fallback for stubborn subprocess trees.
- For manual EOF in interactive sessions:
- Unix/macOS terminals:
Ctrl+D - Windows terminals:
Ctrl+ZthenEnter
- Unix/macOS terminals:
Example piped Beads import (after installing the bundled extension once per scope):
pm extension --install --project beads
cat issues.jsonl | pm beads import --file -pm supports project/global custom item types through settings.json and extension registrations. When no custom configuration exists, built-in types keep their default behavior.
Current built-ins are: Epic, Feature, Task, Chore, Issue, Event, Reminder, Milestone, and Meeting.
{
"item_types": {
"definitions": [
{
"name": "Asset",
"folder": "assets",
"aliases": ["assets", "3d-asset"],
"required_create_fields": ["title", "description", "status", "priority", "message"],
"required_create_repeatables": [],
"command_option_policies": [
{ "command": "create", "option": "severity", "enabled": false },
{ "command": "create", "option": "reporter", "enabled": false },
{ "command": "create", "option": "goal", "visible": false },
{ "command": "update", "option": "message", "required": true }
],
"options": [
{
"key": "category",
"values": ["Map", "Character", "Prop", "VFX"],
"required": true,
"aliases": ["asset_category"],
"description": "High-level asset classification"
},
{
"key": "pipeline",
"values": ["Blockout", "Modeling", "Rigging", "Texturing", "Done"]
}
]
}
]
}
}pm create \
--title "Forest world map" \
--description "Primary world navigation mesh and terrain art" \
--type Asset \
--status open \
--priority 1 \
--message "Track world map asset" \
--type-option category=Map \
--type-option pipeline=Modeling
pm update pm-a1b2 --type-option category=Character --type-option pipeline=Rigging--type-option accepts key=value, key:value, and key=<name>,value=<value> formats (including markdown-style lines), can read stdin via -, and can be cleared with --clear-type-options.
command_option_policies lets each type mark create/update options as:
required: true|false(mandatory or optional)enabled: true|false(accepted or rejected at runtime)visible: true|false(shown or hidden in policy-aware help guidance)
When --type is missing, usage output now includes:
- why
--typeis required - allowed values from the active runtime type registry
- concrete
pm createexamples (including custom-type usage) - deterministic aggregation when multiple required create flags and required
--type-optionkeys are missing for the selected type (single response, stable flag ordering) - a type-specific "next valid example" command in structured error guidance to accelerate one-shot fixes
For pm create --help and pm update --help, add --type <value> to render type-aware policy details (required/disabled/hidden option lists) and type-option schema details (required marker, allowed values, aliases, description) from active settings/extensions.
pm now treats command guidance as a first-class UX surface:
- Default help is compact and token-efficient (
Intent+ one high-signal example). - Add
--explainto any--helpinvocation to render deeper rationale, multiple examples, and tips. pm helpandpm help <command>are success paths (exit code0) for known command paths; unavailable-command help requests emit explicitunknown command '<name>'guidance and return usage exit (2).pm <command> --help --jsonandpm help <command> --jsonemit deterministic machine-readable help payloads.- Usage/runtime errors use one canonical guidance model:
- text mode: structured sections (
What happened,What is required,Why,Examples, optionalNext steps) --jsonmode: machine-readable envelope (type,code,title,detail,required,exit_code, optionalwhy/examples/next_steps)
- text mode: structured sections (
Text-mode example:
Error: Missing required option --type <value>
What happened:
Commander rejected the command because --type <value> was not provided.
What is required:
Pass --type <value> with a valid value before running the command.
JSON-mode example (--json):
{
"type": "urn:pm-cli:error:missing_required_option",
"code": "missing_required_option",
"title": "Missing required option --type <value>",
"detail": "Commander rejected the command because --type <value> was not provided.",
"required": "Pass --type <value> with a valid value before running the command.",
"exit_code": 2
}For default TOON output, command results are rendered directly from the command payload with recursive compaction:
- omit
nullandundefined - omit empty arrays and empty objects
- preserve meaningful falsy values (
0,false, non-empty strings)
JSON output remains contract-stable and command-contract driven; pm search uses compact projection by default unless overridden with --full or --fields.
pm now ships a stable SDK entrypoint at @unbrained/pm-cli/sdk for extension authors.
import { defineExtension, type ExtensionApi } from "@unbrained/pm-cli/sdk";
export default defineExtension({
activate(api: ExtensionApi) {
api.registerCommand({
name: "list-open",
run: async (context) => ({ overridden: true, command: context.command }),
});
},
});Extension runtime behavior is extension-first by default:
- Extension command handlers can replace core command execution at dispatch time.
- Parser overrides (
registerParser) can rewrite command args/options/global context before dispatch. - Preflight overrides (
registerPreflight) can intercept mutation gate decisions and migration flow. - Service overrides (
registerService) can replace output/error/help rendering and selected internal runtime services. - Command-result overrides and renderer overrides still run with deterministic precedence (last registration wins).
beforeCommandandafterCommandhooks receive command args/options/global snapshots and final command result/error state.registerItemFields(...)definitions now participate in create/update defaulting and validation.registerSearchProvider(...)+settings.search.providerandregisterVectorStoreAdapter(...)+settings.vector_store.adapterare now live runtime selectors forpm search/pm reindex.registerCommand(...)definitions can optionally declare action/intent/examples/failure hints/arguments/flags metadata, which is surfaced in dynamic--helptext,--help --jsonpayloads, andpm contracts.
Use --no-extensions to force core-only behavior for a single invocation.
Use pm extension to install, adopt, inspect, manage, activate, deactivate, and remove custom extensions in project or global scope.
Lifecycle actions (exactly one per call):
--install--uninstall--explore--manage--doctor--adopt--activate--deactivate
Scope selectors:
--project(default)--local(alias of--project)--global
Install source selectors:
- local extension directory path (for example
.agents/pm/extensions/my-ext) - GitHub URL (for example
https://github.com/owner/repo/tree/main/path/to/ext) - GitHub shorthand URL form (for example
github.com/owner/repo/path) - explicit GitHub shorthand flag form
--gh owner/repo/path(alias:--github) - optional Git ref override with
--ref <branch|tag|sha>
Requested source equivalence examples:
# Bundled managed aliases shipped with pm-cli (not auto-installed)
pm extension --install --project beads
pm extension --install --project todos
# Equivalent explicit local bundled paths
pm extension --install --project .agents/pm/extensions/beads
pm extension --install --project .agents/pm/extensions/todos
# Custom extension roots in repo
pm extension --install --project https://github.com/unbraind/pm-cli/tree/main/.custom/pm-extensions/my-ext
pm extension --install --project github.com/unbraind/pm-cli/.custom/pm-extensions/my-ext
pm extension --install --project --gh unbraind/pm-cli/.custom/pm-extensions/my-ext
# Single-extension repo or extension at repository root
pm extension --install --project https://github.com/unbraind/pm-cli
pm extension --install --project github.com/unbraind/pm-cli
pm extension --install --project --gh unbraind/pm-cliActivation and health behavior:
- Install auto-activates the extension in selected scope settings.
- Deactivate/activate toggle
extensions.disabled[]/extensions.enabled[]in settings. pm extension --explorelists discovered extensions and compatibility/runtime status fields (activecompatibility alias,enabled,runtime_active,activation_status).pm extension --adoptrecords an existing unmanaged extension into managed state (local or GitHub provenance metadata) without reinstalling extension files.pm extension --adopt-allbulk-adopts all unmanaged extensions in the selected scope without reinstalling files.pm extension --managerefreshes GitHub-managed update metadata, persists it to scope-local.managed-extensions.json, and includes explicit per-extensionupdate_check_status/update_check_reasonfields (checked,failed,skipped_unmanaged,skipped_non_github,not_checked) plus triage status totals/remediation hints and update-health coverage diagnostics (update_health_coverage,warning_codes).--runtime-probeopt-in runs doctor-equivalent runtime activation checks for manage output parity.--fix-managed-statecan adopt unmanaged extensions before update checks.pm extension --doctor(orpm extension doctor) provides consolidated extension diagnostics with normalized warning codes, canonical load roots, active-vs-loaded consistency diagnostics, update-health coverage signals, remediation hints, optional strict exit gating (--strict-exit, alias--fail-on-warn), machine-usable blocking indicators (blocking_failure_count,has_blocking_failures), and optional deep output via--detail deep.--trace(deep mode) includes actionable registration traces and expected-schema hints for activation failures.--fix-managed-statecan adopt unmanaged extensions before diagnostics.- Subcommand invocation forms (
pm extension manage ...,pm extension doctor ...) honor the same action flags (--runtime-probe,--detail,--trace, etc.) as top-level action-flag forms. pm healthincludes managed extension state diagnostics plus a condensed extension triage block for quick load/activation/migration issue triage across project/global roots, includingextension_update_health_partial_coverageonly when unmanaged loaded extensions are action-required for update-check coverage.- Unknown manifest capabilities emit
extension_capability_unknowndiagnostics with inline allowed-capability lists, nearest-match suggestions, and legacy alias guidance (migration/validation->schema). Health/doctor payloads include machine-readable capability contract metadata (details.capability_contract) and parsed guidance entries (details.capability_guidance). - Legacy extension command definitions using
handlerremain compatible and map torun, with deterministic warningextension_command_definition_legacy_handler_aliasfor migration visibility.
Use pm extension --help for compact guidance or pm extension --help --explain for expanded examples/tips.
pm supports persistent reminder metadata, one-off and recurring scheduled events, and a dedicated calendar surface for deadline/reminder/event planning.
pm createandpm updateaccept repeatable--reminderflags.- Reminder value format:
at=<iso|date|relative>,text=<text>. - Use
--clear-remindersto clear reminders on create/update.
Examples:
pm create \
--title "Prepare release notes" \
--description "Draft and review release notes for vnext." \
--create-mode progressive \
--type Task \
--status open \
--priority 1 \
--tags "release,docs" \
--body "" \
--deadline +2d \
--reminder "at=+1d,text=Start first draft" \
--reminder "at=+36h,text=Send review draft" \
--estimate 45 \
--acceptance-criteria "Release notes merged and linked." \
--author "maintainer-agent" \
--message "Create release notes task with reminders"
pm update pm-a1b2 --reminder "at=+4h,text=Follow up with reviewer"
pm update pm-a1b2 --clear-reminderspm createandpm updateaccept repeatable--eventflags.- Event value format supports:
start=<iso|date|relative>(required)end=<iso|date|relative>(optional, must be afterstart)title=<text>,description=<text>,location=<text>,timezone=<iana-or-label>,all_day=<true|false|1|0|yes|no>
- Recurrence metadata (optional, RFC-lite):
recur_freq=<daily|weekly|monthly|yearly>recur_interval=<int>=1+recur_count=<int>=1+recur_until=<iso|date|relative>recur_by_weekday=<mon|tue|wed|thu|fri|sat|sun>(pipe-delimited)recur_by_month_day=<1..31>(pipe-delimited)recur_exdates=<iso|date|relative>(pipe-delimited)
- Use
--clear-eventsto clear all events in create/update flows.
Examples:
pm create \
--title "Run release planning" \
--description "Set recurring planning sync plus a one-off launch checkpoint." \
--create-mode progressive \
--type Task \
--status open \
--priority 1 \
--tags "release,calendar" \
--body "" \
--deadline +7d \
--event "start=2026-04-03T15:00:00.000Z,title=Launch checkpoint,location=War room" \
--event "start=2026-04-01T09:00:00.000Z,title=Weekly planning,recur_freq=weekly,recur_by_weekday=wed,recur_interval=1" \
--estimate 30 \
--acceptance-criteria "Calendar schedule is captured in item metadata." \
--author "maintainer-agent" \
--message "Create calendar-rich planning task"
pm update pm-a1b2 --event "start=+2d,title=Retro,recur_freq=monthly,recur_by_month_day=15"
pm update pm-a1b2 --clear-events- Views:
agenda(default),day,week,month - Default output for calendar is markdown (command-specific override)
- Explicit output override:
--format markdown|toon|jsonor global--json - JSON summary includes deterministic aggregate breakdowns:
by_kind,by_type,by_status, andrecurring_events. - Markdown event lines include richer deterministic metadata for agent parsing (item type, event title, recurrence marker/rule, end-time, timezone, location, and description when present).
- Event source controls:
--include deadlines|reminders|events|all(comma or pipe-delimited when passing multiple values)- default source set is
all
- Recurrence expansion controls:
--recurrence-lookahead-days <n>--recurrence-lookback-days <n>--occurrence-limit <n>(per recurring event;>= 1)
- Past toggles and range controls:
--pastincludes past events in bounded views--full-periodkeeps day/week/month windows anchored to full period boundaries (without now-clipping)--from/--tosupported onagenda--dateanchors day/week/month calculations
- Shared filters:
--type,--tag,--priority,--status,--assignee,--assignee-filter assigned|unassigned,--sprint,--release,--limit
Examples:
pm calendar
pm cal --view week --date +2d --past
pm calendar --view week --date 2026-04-06 --full-period --include deadlines,events
pm calendar --view agenda --from 2026-04-01T00:00:00.000Z --to 2026-04-08T00:00:00.000Z --assignee alex
pm calendar --view agenda --include events --recurrence-lookahead-days 30 --occurrence-limit 50
pm calendar --view month --tag release --format jsonpm context provides a token-efficient project-state snapshot optimized for quickly deciding the next work item.
- Default output is TOON (sparse and agent-friendly), with explicit
--format markdown|toon|jsonand global--json. - Focus sections prioritize active work (
in_progress, thenopen) using deterministic ranking:- status
- priority (
0..4, lower is higher priority) - explicit
order(when present) - deadline proximity
- recency/id tie-breakers
- Output is split into:
- high-level focus (
Epic,Feature) - low-level focus (
Task,Issue,Chore,Event,Reminder,Milestone,Meeting, etc.)
- high-level focus (
- Agenda context is included from deadlines, reminders, and scheduled events in an agenda window.
- If there are no open or in-progress items,
pm contextautomatically includes a blocked-work fallback section. - Shared filters:
--type,--tag,--priority,--assignee,--sprint,--release,--limit. - Agenda window controls:
--date,--from,--to,--past.
Examples:
pm context
pm ctx --limit 5
pm context --assignee alex --priority 1 --limit 10
pm context --from +0d --to +7d --format markdown
pm context --date 2026-04-01T00:00:00.000Z --past --json- Architecture
- SDK Guide
- Telemetry and GDPR Operations
- Remote Telemetry Stack Runbook
- Extensions
- Contributing
- Security Policy
- Changelog
MIT. See LICENSE.