This file is command-surface only. For workflow guidance, use docs/getting-started.md.
Run/install/agent setup guidance:
All subcommands support:
--root <path>(required)--auto-checkpoint--auto-session-save--no-auto-session-save
CLI parity notes:
- The CLI accepts MCP-style aliases in either underscore or hyphen form.
- Examples:
help->--helplist_tasks->listshow_task->showconfig_show->config showtruth_list->truth listworkstream_list->workstream listworktree_list->worktree listrender_table->render table
Global config:
~/.workmesh/config.toml(or$WORKMESH_HOME/config.toml)
Project config:
.workmesh.toml(preferred)
Keys:
tasks_root = "<path>"(repo-relative or absolute; default for new repos:tasks/)state_root = "<path>"(repo-relative or absolute; default for new repos:.workmesh/)task_require_description = true|false(default:true)task_require_acceptance_criteria = true|false(default:true)task_require_definition_of_done = true|false(default:true)task_require_outcome_based_definition_of_done = true|false(default:true)worktrees_default = true|falseworktrees_dir = "<path>"(absolute or repo-relative; used for auto-provisioned worktrees; default:<repo_parent>/<repo_name>.worktrees/)auto_session_default = true|falseroot_dir = "<path>"(deprecated single-root compatibility alias)
Precedence:
- CLI flags
- Environment variables
- Project config
- Global config
- Built-in defaults
Environment overrides:
WORKMESH_AUTO_CHECKPOINT=1|0WORKMESH_AUTO_SESSION=1|0
CLI:
config show [--json]config set --scope project|global --key tasks_root|state_root|task_require_description|task_require_acceptance_criteria|task_require_definition_of_done|task_require_outcome_based_definition_of_done|worktrees_default|worktrees_dir|auto_session_default|root_dir|do_not_migrate --value <value> [--json]config unset --scope project|global --key tasks_root|state_root|task_require_description|task_require_acceptance_criteria|task_require_definition_of_done|task_require_outcome_based_definition_of_done|worktrees_default|worktrees_dir|auto_session_default|root_dir|do_not_migrate [--json]
MCP:
config_showconfig_setconfig_unset
CLI:
readme [--json]tool-info <tool-name> [--json]skill-content [--name <skill>] [--json]project-management-skill [--name <skill>] [--json]bootstrap [--project-id <id>] [--feature "..."] [--objective "..."] [--tasks-root <path>] [--state-root <path>] [--json]quickstart <project-id> [--name "..."] [--feature "..."] [--tasks-root <path>] [--state-root <path>] [--agents-snippet]project-init <project-id> [--name "..."]doctor [--fix-storage] [--json]validate [--json]
MCP:
readmetool_infoskill_contentproject_management_skillbootstrapquickstartproject_initdoctorvalidate
tool-info note:
- CLI
tool-infomirrors the shared metadata/examples fromworkmesh-tools. - MCP
tool_inforemains the canonical source for the full MCP input schema.
Doctor storage fix behavior:
--fix-storage(CLI) /fix_storage=true(MCP) performs safe remediation only:- trim trailing malformed JSONL lines for sessions/truth event streams
- rebuild truth projection when applicable
- rebuild sessions index when applicable
- Non-trailing malformed JSONL is reported but not auto-trimmed.
- Doctor output includes storage integrity checks:
- lock-path accessibility
- malformed JSONL counts
- truth projection/event divergence
- versioned snapshot state
Conflict semantics:
- Versioned snapshot writes use compare-and-swap behavior.
- Stale writes surface explicit conflict errors; they are not silently overwritten.
- Legacy unversioned snapshots are treated as version
0and migrated on first safe write.
- MCP mutation tools return minimal acknowledgements by default to save tokens.
- Pass
verbose=truewhen you need richer post-write state in the same response. - Prefer dedicated read tools (
show_task,truth_show,session_show,workstream_show,context_show) when you need the full current object. - Typical defaults:
- single-record mutation:
{"ok": true, "id": "..."} - field/status mutation:
{"ok": true, "id": "...", "status": "Done"} - bulk mutation:
{"ok": false, "updated_count": 3, "failed_count": 1, "failed_ids": ["task-009"]}
- single-record mutation:
CLI:
render table|kv|stats|list|progress|tree|diff|logs|alerts|chart-bar|sparkline|timeline- input: one of
--data <value>,--data-file <path>, or--stdin - optional:
--format <value> - optional: one of
--configuration <json>or--config-file <path>
CLI:
list [--status "To Do"] [--kind bug] [--search "..."] [--sort id] [--all] [--json]show <task-id> [--full] [--json]next [--json]next-tasks [--limit N] [--json]ready [--limit N] [--json]board [--by status|phase|priority] [--focus] [--all] [--json]blockers [--epic-id task-123] [--all] [--json]stats [--json]
MCP:
list_tasksshow_tasknext_task,next_tasksready_tasksboardblockersstats
CLI:
add --title "..." --description "..." --acceptance-criteria "..." --definition-of-done "..." [--id task-...] [--status "..."] [--priority P2] [--phase Phase1] [--labels "..."] [--dependencies "..."] [--assignee "..."] [--draft] [--json]add-discovered --from <task-id> --title "..." --description "..." --acceptance-criteria "..." --definition-of-done "..." ... [--draft]set-status <task-id> "In Progress"|"To Do"|Doneset-field <task-id> <field> <value>label-add <task-id> <label>/label-remove <task-id> <label>dep-add <task-id> <dependency-id>/dep-remove <task-id> <dependency-id>note <task-id> "..." [--section notes|impl]set-body <task-id> [--text "..."] [--file path]set-section <task-id> <section> [--text "..."] [--file path]claim <task-id> <owner> [--minutes 60]release <task-id>
MCP:
add_taskadd_discoveredset_statusset_fieldadd_label,remove_labeladd_dependency,remove_dependencyadd_noteset_body,set_sectionclaim_task,release_task
MCP mutation response contract:
- default: minimal acknowledgement
- opt-in:
verbose=truefor richer post-write state - examples:
set_statusdefault:{"ok": true, "id": "task-001", "status": "Done"}set_statusverbose: includes the refreshedtaskadd_taskdefault:{"ok": true, "id": "task-123", "path": "..."}add_taskverbose: includestask,hints, andnext_steps
Task quality guardrails:
- Default required task-body sections:
Description,Acceptance Criteria,Definition of Done. - Default
Definition of Donepolicy: include outcome-based criteria, not only hygiene bullets. - Repos can override the required fields with:
task_require_descriptiontask_require_acceptance_criteriatask_require_definition_of_donetask_require_outcome_based_definition_of_done
- Actionable statuses are
To DoandIn Progress. - Incomplete tasks must be created explicitly as
DraftorNeeds Refinementvia the draft flag. config show/config_showreports the effective task-quality policy and where each value came from.add/add_taskand discovered-task creation require the repo’s configured task-body sections unless draft mode is requested.next_task,next_tasks, andready_tasksonly return actionable tasks that already meet the configured task-quality gate.Donetransitions are gated across all status mutation paths:set-status ... Doneset-field ... status Donebulk set-status --status Donebulk set-field --field status --value Done
- Actionable status transitions are also gated across the same mutation paths:
set-status ... "To Do"|"In Progress"set-field ... status "To Do"|"In Progress"bulk set-status --status "To Do"|"In Progress"bulk set-field --field status --value "To Do"|"In Progress"
validatebehavior:Draft/Needs Refinementtasks with missing/incomplete sections produce warnings- actionable and
Donetasks with missing/incomplete sections (or hygiene-only DoD) produce errors
CLI:
bulk set-status --tasks task-001,task-002 --status "In Progress" [--json]bulk set-field --tasks ... --field priority --value P1 [--json]bulk label-add --tasks ... --label docs [--json]bulk label-remove --tasks ... --label docs [--json]bulk dep-add --tasks ... --dependency task-123 [--json]bulk dep-remove --tasks ... --dependency task-123 [--json]bulk note --tasks ... --note "..." [--section notes|impl] [--json]
MCP:
bulk_set_statusbulk_set_fieldbulk_add_label,bulk_remove_labelbulk_add_dependency,bulk_remove_dependencybulk_add_note
MCP mutation response contract:
- default: summary only (
ok,updated_count,failed_count,failed_ids) - opt-in:
verbose=truefor full updated/missing lists
CLI:
context show [--json]context set --project <pid> [--epic task-123] [--objective "..."] [--tasks task-001,task-002]context clear
MCP:
context_showcontext_setcontext_clear
MCP mutation response contract:
context_set/context_cleardefault to compact acknowledgements- pass
verbose=trueto include richer context payloads
CLI:
truth propose --title "..." --statement "..." [--project <pid>] [--epic task-123] [--feature <name>] [--workstream-id <id>] [--current] [--session-id <id>] [--worktree-id <id>] [--worktree-path <path>] [--constraints "a,b"] [--tags "x,y"] [--json]truth accept <truth-id> [--note "..."] [--json]truth reject <truth-id> [--note "..."] [--json]truth supersede <truth-id> --by <accepted-truth-id> [--reason "..."] [--json]truth show <truth-id> [--json]truth list [--state proposed|accepted|rejected|superseded] [--project <pid>] [--epic task-123] [--feature <name>] [--workstream-id <id>] [--session-id <id>] [--worktree-id <id>] [--worktree-path <path>] [--tag <tag>] [--limit N] [--json]truth validate [--json]truth migrate audit|plan|apply [--apply] [--json]
MCP:
truth_proposetruth_accepttruth_rejecttruth_supersedetruth_showtruth_listtruth_validatetruth_migrate_audittruth_migrate_plantruth_migrate_apply
MCP mutation response contract:
- truth mutations default to compact
{ ok, truth_id, state, version }style responses - pass
verbose=truefor the full truth record or full migration result
CLI:
workstream list [--json]workstream restore [--all] [--json]workstream create --name "..." [--key <key>] [--existing] [--path <path> --branch <branch> --from <ref>] [--project <pid>] [--epic task-123] [--objective "..."] [--tasks task-001,task-002] [--json]workstream show [<id-or-key>] [--truth] [--restore] [--json]workstream switch <id-or-key> [--json]workstream pause [<id-or-key>] [--json]workstream close [<id-or-key>] [--json]workstream reopen [<id-or-key>] [--json]workstream rename [<id-or-key>] --name "..." [--json]workstream set [<id-or-key>] [--key <key>] [--notes "..."] [--project <pid>] [--epic task-123] [--objective "..."] [--tasks task-001,task-002] [--json]workstream doctor [--json]
MCP:
workstream_listworkstream_createworkstream_show(supportstruths=true,restore=true)workstream_switchworkstream_pauseworkstream_closeworkstream_reopenworkstream_renameworkstream_setworkstream_doctorworkstream_restore
MCP mutation response contract:
- workstream mutations default to compact success metadata
- pass
verbose=trueto include the refreshed workstream object or full creation details
Notes:
- Active workstream pointer is per-worktree:
workmesh/context.json.workstream_id. - When
workstream_idis set, these commands keep workstream pointers up to date: session saveupdates the active workstreamsession_idand worktree binding.worktree attachupdates the active workstreamsession_idand worktree binding.worktree detachclears the active workstreamsession_idwhen it matches the detached session.context setpreservesworkstream_idand persists the updated context snapshot into the workstream record (best-effort).workstream pauseandworkstream closeclearcontext.json.workstream_idwhen the paused/closed stream was active in this worktree.workstream createcan auto-provision a new git worktree when invoked from the canonical checkout andworktrees_default=true(requires a realHEADcommit). Override by passing--existingor explicit--path/--branch.workstream createis idempotent for a given target worktree path: if that path is already bound, it returns the existing workstream (already_exists=true) instead of creating a duplicate.
CLI:
worktree list [--json]worktree create --path <path> --branch <branch> [--from <ref>] [--project <pid>] [--epic task-123] [--objective "..."] [--tasks task-001,task-002] [--json]worktree adopt-clone --from <path> [--to <path>] [--branch <target-branch>] [--allow-dirty] [--apply] [--json]worktree attach [--session-id <id>] [--path <path>] [--json]worktree detach [--session-id <id>] [--json]worktree doctor [--json]
MCP:
worktree_listworktree_createworktree_adopt_cloneworktree_attachworktree_detachworktree_doctor
MCP mutation response contract:
- worktree mutations default to compact success metadata
- pass
verbose=trueto include the full worktree/adoption/session payload
Repo-local CLI:
checkpoint [--project <id>] [--id <checkpoint-id>] [--json]resume [--project <id>] [--id <checkpoint-id>] [--json]checkpoint-diff [--project <id>] [--id <checkpoint-id>] [--json]working-set [--project <id>] [--tasks "task-001,task-002"] [--note "..."] [--json]session-journal [--project <id>] [--task <id>] [--next "..."] [--note "..."] [--json]
Global sessions CLI:
session save --objective "..." [--project <id>] [--tasks "task-..."]session list [--limit N]session show <session-id>session resume [<session-id>]session index-rebuild|index-refresh|index-verify
MCP:
checkpointresumecheckpoint_diffworking_setsession_journalsession_savesession_listsession_showsession_resume
MCP mutation response contract:
session_savedefaults to{ ok, session_id, cwd, repo_root }- pass
verbose=trueto receive the full saved session object
migrate audit|plan|apply may produce the following action ids:
layout_to_splitfocus_to_contexttask_section_normalizationtruth_backfillsession_handoff_enrichmentconfig_cleanup
CLI:
index-rebuild [--json]index-refresh [--json]index-verify [--json]export [--pretty]issues-export [--output path] [--include-body]graph-export [--pretty]gantt,gantt-file,gantt-svg
MCP:
index_rebuildindex_refreshindex_verifyexport_tasksissues_exportgraph_exportgantt_text,gantt_file,gantt_svg
Available over MCP stdio:
render_table,render_kv,render_stats,render_list,render_progressrender_tree,render_diff,render_logs,render_alertsrender_chart_bar,render_sparkline,render_timeline
All render tools accept:
data(required JSON-encoded string)configuration(optional typed object)format(optional, only used byrender_table)
For backward compatibility, native JSON values for data are still accepted by the MCP server, but agent/tool integrations should send the explicit JSON string form.
They return rendered text content.
CLI:
archive [--before 30d|YYYY-MM-DD] [--status <state>]... [--json]- default status filter (when omitted):
Done,Cancelled,Canceled,Won't Do,Wont Do - override behavior: pass one or more
--statusvalues to archive any specific state, including non-terminal states fix list [--json]fix uid|deps|ids|filenames [--check|--apply] [--json]fix all [--only uid,deps,ids,filenames] [--exclude uid,deps,ids,filenames] [--check|--apply] [--json]
MCP:
archive_tasksarchive_tasksaccepts optionalstatus(string or list); when omitted it uses the same default terminal status filter as CLIfix_idsfix_filenames
Filename normalization notes:
fix filenamesderives the canonical filename from taskid,title, anduid.- It repairs percent-encoded or otherwise non-canonical filename slugs.
- Tasks missing
uidare skipped; runfix uid --applyfirst, then rerunfix filenames --apply.
MCP mutation response contract:
archive_tasksdefaults to summary counts and archive path metadata- pass
verbose=trueto include full archived/skipped lists
Use only when a repo still has deprecated structures.
CLI:
migrate audit [--json]migrate plan [--include ...] [--exclude ...] [--json]migrate apply [--include ...] [--exclude ...] [--apply] [--backup] [--json]
MCP:
migrate_auditmigrate_planmigrate_apply
MCP mutation response contract:
migrate_applydefaults to summary counts- pass
verbose=truefor the full applied/skipped/backup result