dotmd-cli 0.78.0 → 0.79.1

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.
Files changed (54) hide show
  1. package/README.md +66 -63
  2. package/assets/opencode/plugin.js +11 -6
  3. package/bin/dotmd.mjs +272 -285
  4. package/package.json +2 -2
  5. package/scripts/postinstall.mjs +4 -4
  6. package/src/atomic-mutation.mjs +1 -1
  7. package/src/baton.mjs +7 -7
  8. package/src/check-collapse.mjs +5 -5
  9. package/src/claude-commands.mjs +6 -2
  10. package/src/commands.mjs +4 -4
  11. package/src/config.mjs +2 -2
  12. package/src/deps.mjs +1 -1
  13. package/src/doctor.mjs +17 -17
  14. package/src/fix-membership.mjs +4 -2
  15. package/src/frontmatter-fix.mjs +1 -1
  16. package/src/git.mjs +1 -1
  17. package/src/glossary.mjs +3 -3
  18. package/src/graph.mjs +1 -1
  19. package/src/guard.mjs +8 -8
  20. package/src/health.mjs +2 -2
  21. package/src/hints.mjs +7 -7
  22. package/src/host-integration.mjs +41 -22
  23. package/src/hub-membership.mjs +1 -1
  24. package/src/hud.mjs +14 -14
  25. package/src/index-file.mjs +2 -2
  26. package/src/init.mjs +24 -24
  27. package/src/install.mjs +4 -4
  28. package/src/journal.mjs +40 -7
  29. package/src/lifecycle.mjs +17 -17
  30. package/src/lint.mjs +1 -1
  31. package/src/migrate-prompts.mjs +1 -1
  32. package/src/migrate-template.mjs +2 -2
  33. package/src/migrate.mjs +1 -1
  34. package/src/misuse-read.mjs +4 -5
  35. package/src/modules.mjs +3 -3
  36. package/src/new.mjs +11 -11
  37. package/src/output-identity.mjs +7 -2
  38. package/src/pickup-card.mjs +2 -2
  39. package/src/pickup.mjs +2 -2
  40. package/src/prompts.mjs +12 -12
  41. package/src/query.mjs +9 -9
  42. package/src/rename.mjs +2 -2
  43. package/src/render.mjs +20 -20
  44. package/src/roadmap.mjs +5 -5
  45. package/src/runlist.mjs +11 -11
  46. package/src/ship.mjs +2 -2
  47. package/src/skill-drift.mjs +19 -6
  48. package/src/statuses.mjs +16 -16
  49. package/src/summary.mjs +1 -1
  50. package/src/surfaces.mjs +1 -1
  51. package/src/sync-status.mjs +4 -4
  52. package/src/update.mjs +11 -11
  53. package/src/validate.mjs +9 -9
  54. package/src/watch.mjs +1 -1
package/bin/dotmd.mjs CHANGED
@@ -32,9 +32,9 @@ function requireCommandPolicy(command, policy) {
32
32
  .map(cmd => ({ cmd, dist: levenshtein(command, cmd) }))
33
33
  .sort((a, b) => a.dist - b.dist);
34
34
  if (matches[0] && matches[0].dist <= 3) {
35
- die(`Unknown command: ${command}\n\nDid you mean \`dotmd ${matches[0].cmd}\`?`);
35
+ die(`Unknown command: ${command}\n\nDid you mean \`runlist ${matches[0].cmd}\`?`);
36
36
  }
37
- die(`Unknown command: ${command}\n\nRun \`dotmd --help\` for available commands.`);
37
+ die(`Unknown command: ${command}\n\nRun \`runlist --help\` for available commands.`);
38
38
  }
39
39
 
40
40
  function resolveExistingPath(input, config) {
@@ -71,7 +71,7 @@ function applyPathScopeToIndex(index, config, inputs) {
71
71
  if (abs === dir || abs.startsWith(dir + path.sep)) selected.add(doc.path);
72
72
  }
73
73
  if (selected.size === before) {
74
- die(`No dotmd documents found under check path: ${toRepoPath(dir, config.repoRoot)}`);
74
+ die(`No runlist documents found under check path: ${toRepoPath(dir, config.repoRoot)}`);
75
75
  }
76
76
  continue;
77
77
  }
@@ -99,7 +99,7 @@ function applyPathScopeToIndex(index, config, inputs) {
99
99
  }
100
100
 
101
101
  const HELP = {
102
- _main: `dotmd v${pkg.version} — frontmatter markdown document manager
102
+ _main: `runlist v${pkg.version} — frontmatter markdown document manager
103
103
 
104
104
  Common commands:
105
105
  plans Live plans (excludes archived)
@@ -114,58 +114,58 @@ Common commands:
114
114
  archive <file> Close out a plan (status → archived, move, update refs)
115
115
 
116
116
  More help:
117
- dotmd help all Full command list
118
- dotmd help statuses Status vocabulary + transitions
119
- dotmd <cmd> --help Per-command details
117
+ runlist help all Full command list
118
+ runlist help statuses Status vocabulary + transitions
119
+ runlist <cmd> --help Per-command details
120
120
 
121
121
  Global flags: --config <path> --root <name> --type <t,…> --dry-run/-n --verbose --version`,
122
122
 
123
- guard: `dotmd guard — PreToolUse hook handler (reads the tool-call JSON on stdin)
123
+ guard: `runlist guard — PreToolUse hook handler (reads the tool-call JSON on stdin)
124
124
 
125
125
  Wire it into Claude Code as a PreToolUse hook to intercept the wrong-moves
126
126
  sessions keep making, and to log every one for audit:
127
127
 
128
- {"matcher":"Bash|Read|Edit|Write","hooks":[{"type":"command","command":"dotmd guard"}]}
128
+ {"matcher":"Bash|Read|Edit|Write","hooks":[{"type":"command","command":"runlist guard"}]}
129
129
 
130
130
  Rules:
131
131
  commit-prompt deny git add/commit of a (often gitignored) saved prompt
132
- cat-prompt warn cat/less/head of a docs/prompts/*.md (use \`dotmd use\`)
133
- read-prompt warn Read tool on a saved prompt (use \`dotmd use\`)
132
+ cat-prompt warn cat/less/head of a docs/prompts/*.md (use \`runlist use\`)
133
+ read-prompt warn Read tool on a saved prompt (use \`runlist use\`)
134
134
  edit-status deny CHANGING a \`status:\` line — via Edit/Write or in-place
135
135
  stream editors (sed -i, perl -pi, awk -i inplace).
136
- Use \`dotmd set <status> <file>\`. Edits that merely
136
+ Use \`runlist set <status> <file>\`. Edits that merely
137
137
  carry an unchanged status: line as context don't fire.
138
138
 
139
- \`guard: { deny: false }\` in dotmd.config.mjs drops edit-status back to
139
+ \`guard: { deny: false }\` in runlist.config.mjs drops edit-status back to
140
140
  warn-only. Every catch is appended to the cross-repo misuse log. Disable the
141
- guard entirely with RUNLIST_GUARD=0. Read the log with \`dotmd misuse\`; when one
142
- rule trips ≥3× in 7 days in a repo, \`dotmd hud\` opens the next session there
141
+ guard entirely with RUNLIST_GUARD=0. Read the log with \`runlist misuse\`; when one
142
+ rule trips ≥3× in 7 days in a repo, \`runlist hud\` opens the next session there
143
143
  with a one-line recap naming the habit to break.`,
144
144
 
145
- install: `dotmd install [<host>] — install dotmd's integration into an agent host
145
+ install: `runlist install [<host>] — install runlist's integration into an agent host
146
146
 
147
- dotmd install report what is installed for each known host
148
- dotmd install claude install the Claude Code plugin (marketplace + plugin)
149
- dotmd install opencode install/refresh the OpenCode plugin (global config dir)
150
- dotmd install <host> --remove
151
- dotmd install opencode --path <dir> write to a specific plugin directory
152
- dotmd install opencode --force overwrite a dotmd.js dotmd did not write
147
+ runlist install report what is installed for each known host
148
+ runlist install claude install the Claude Code plugin (marketplace + plugin)
149
+ runlist install opencode install/refresh the OpenCode plugin (global config dir)
150
+ runlist install <host> --remove
151
+ runlist install opencode --path <dir> write to a specific plugin directory
152
+ runlist install opencode --force overwrite a runlist.js runlist did not write
153
153
 
154
154
  The CLI on its own gives an agent no orientation and no session identity. Each
155
155
  host gets that a different way:
156
156
 
157
157
  claude Drives \`claude plugin marketplace add ${'reowens/dotmd'}\` +
158
158
  \`claude plugin install dotmd@dotmd\`. This is the FIRST install;
159
- \`dotmd update\` only refreshes a plugin already present (it skips
159
+ \`runlist update\` only refreshes a plugin already present (it skips
160
160
  with "plugin not installed"), and the README's slash commands only
161
161
  work from inside a session. Without the \`claude\` CLI on PATH the
162
162
  two in-session commands are printed instead.
163
163
  It also repairs a plugin Claude lists as "failed to load: Marketplace
164
- dotmd not found" — an install record whose marketplace registration
164
+ runlist not found" — an install record whose marketplace registration
165
165
  is gone — by re-adding the marketplace and updating the plugin. If
166
166
  Claude refuses the marketplace, ~/.claude/settings.json declares it
167
167
  under extraKnownMarketplaces with a source that no longer matches;
168
- dotmd names the field but never edits that file.
168
+ runlist names the field but never edits that file.
169
169
 
170
170
  opencode Writes one auto-discovered plugin file. OpenCode has no plugin
171
171
  registry but globs \`{plugin,plugins}/*.{ts,js}\` under its global
@@ -175,23 +175,23 @@ host gets that a different way:
175
175
  to a tool shell, so without it every session in one OpenCode
176
176
  process shares one identity and can release the others'
177
177
  in-session plans.
178
- - The \`dotmd hud\` primer at session start, the equivalent of
178
+ - The \`runlist hud\` primer at session start, the equivalent of
179
179
  Claude Code's SessionStart hook. OpenCode's Claude Code
180
180
  compatibility covers skills and the system prompt — not hooks —
181
181
  so nothing else runs it.
182
- The file is version-stamped and refreshed by \`dotmd update\`. A
183
- \`dotmd.js\` without that stamp is treated as hand-authored and is
182
+ The file is version-stamped and refreshed by \`runlist update\`. A
183
+ \`runlist.js\` without that stamp is treated as hand-authored and is
184
184
  never overwritten or removed without --force.
185
185
 
186
- Writing outside the repo is why this is an explicit verb: \`dotmd doctor\`
186
+ Writing outside the repo is why this is an explicit verb: \`runlist doctor\`
187
187
  reports a missing integration but never installs one.`,
188
188
 
189
- update: `dotmd update — update the dotmd CLI and the Claude Code plugin together
189
+ update: `runlist update — update the runlist CLI and the Claude Code plugin together
190
190
 
191
- dotmd update npm i -g dotmd-cli + claude plugin update dotmd@dotmd
192
- dotmd update --check report CLI vs plugin versions, do nothing (network-free)
193
- dotmd update --cli-only only the npm CLI
194
- dotmd update --plugin-only only the plugin
191
+ runlist update npm i -g dotmd-cli + claude plugin update dotmd@dotmd
192
+ runlist update --check report CLI vs plugin versions, do nothing (network-free)
193
+ runlist update --cli-only only the npm CLI
194
+ runlist update --plugin-only only the plugin
195
195
 
196
196
  The plugin and CLI ship in lockstep; a release bumps both. Updating the plugin
197
197
  requires a session restart (or /reload-plugins) to apply. The plugin step needs
@@ -200,22 +200,23 @@ run from a session instead. The OpenCode file is refreshed in the same run when
200
200
  it is present and behind. The hosts are independent, so a failing step does not
201
201
  stop the others: every step runs, the failures are listed together, and the
202
202
  exit code is 1. A plugin whose marketplace registration is gone gets the
203
- marketplace re-added before the update (see \`dotmd install claude\`).`,
203
+ marketplace re-added before the update (see \`runlist install claude\`).`,
204
204
 
205
- misuse: `dotmd misuse — read the cross-repo guard log (~/.claude/logs/dotmd-misuse.log)
205
+ misuse: `runlist misuse — read the cross-repo guard log (~/.claude/logs/runlist-misuse.log,
206
+ merged by time with the legacy dotmd-misuse.log that older CLIs wrote)
206
207
 
207
- dotmd misuse last 20 intercepted wrong-moves
208
- dotmd misuse --tail 50 last N
209
- dotmd misuse --by-rule counts per rule (deny/warn split)
210
- dotmd misuse --repo <name> filter by repo
211
- dotmd misuse --json machine-readable
208
+ runlist misuse last 20 intercepted wrong-moves
209
+ runlist misuse --tail 50 last N
210
+ runlist misuse --by-rule counts per rule (deny/warn split)
211
+ runlist misuse --repo <name> filter by repo
212
+ runlist misuse --json machine-readable
212
213
 
213
- Populated by the \`dotmd guard\` PreToolUse hook — see \`dotmd help guard\`.`,
214
+ Populated by the \`runlist guard\` PreToolUse hook — see \`runlist help guard\`.`,
214
215
 
215
216
  // Full command list — opt-in via \`dotmd help all\`. Kept exhaustive so the
216
217
  // top-level \`--help\` can stay terse without losing discoverability. When you
217
218
  // add a new command, add it here too.
218
- 'help:all': `dotmd v${pkg.version} — full command list
219
+ 'help:all': `runlist v${pkg.version} — full command list
219
220
 
220
221
  View & Query:
221
222
  hud [--json] Command primer + pending-prompt triage — silent when clean
@@ -229,7 +230,7 @@ View & Query:
229
230
  plans Live plans (excludes archived; --include-archived for all)
230
231
  use [<file-or-slug>] Open a doc by type: prompt → consume, plan → start, doc → read
231
232
  baton [<plan>|<slug>] <@<file>|-> Save a resume prompt; releases the plan + prints the commit when one is in-session
232
- prompts [list|show|archive|new] Prompt admin (list / peek / archive / save). Use \`dotmd use\` to consume.
233
+ prompts [list|show|archive|new] Prompt admin (list / peek / archive / save). Use \`runlist use\` to consume.
233
234
  stale Stale docs (preset)
234
235
  actionable Docs with next steps (preset)
235
236
 
@@ -260,7 +261,7 @@ Validate & Fix:
260
261
  Lifecycle:
261
262
  use <file> Open a plan (mark in-session + print it) or consume a prompt
262
263
  set <status> <file> Change a document's status (frontmatter write; archive also moves the file)
263
- runlist <hub> [next|add|remove|reorder] Show, walk, or mutate an ordered group of plans (see \`dotmd help runlist\`)
264
+ runlist <hub> [next|add|remove|reorder] Show, walk, or mutate an ordered group of plans (see \`runlist help runlist\`)
264
265
  runlists List coordination-hub runlists (the Runlists dashboard)
265
266
  roadmap [<hub>] [next] Tier-3: show a roadmap (runlists + rolled-up progress), or pick up its next action
266
267
  roadmaps List roadmap hubs (the Roadmaps dashboard)
@@ -296,16 +297,16 @@ Global Options:
296
297
  --type <t1,t2> Filter by document type (plan, doc, prompt)
297
298
  --dry-run, -n Preview changes without writing anything
298
299
  --verbose Show config details and doc count
299
- --help, -h Show help (per-command: dotmd <cmd> --help)
300
+ --help, -h Show help (per-command: runlist <cmd> --help)
300
301
  --version, -v Show version`,
301
302
 
302
- list: `dotmd list — list docs grouped by status
303
+ list: `runlist list — list docs grouped by status
303
304
 
304
305
  Options:
305
306
  --verbose Show full details per doc
306
- --json Output full index as JSON (same as dotmd json)`,
307
+ --json Output full index as JSON (same as runlist json)`,
307
308
 
308
- json: `dotmd json — full index as JSON
309
+ json: `runlist json — full index as JSON
309
310
 
310
311
  Outputs the complete document index as JSON to stdout.`,
311
312
 
@@ -313,20 +314,20 @@ Outputs the complete document index as JSON to stdout.`,
313
314
  // below). Single-source-of-truth for the built-in status vocabulary across all
314
315
  // three doc types. User-defined types/statuses live in config; introspect them
315
316
  // with \`dotmd statuses list\`.
316
- 'help:statuses': `dotmd help statuses — status vocabulary, unstuck-actions, and transitions
317
+ 'help:statuses': `runlist help statuses — status vocabulary, unstuck-actions, and transitions
317
318
 
318
319
  Every document has a \`type:\` field; each type has its own valid statuses.
319
320
  Status validation is type-aware (type > root > global). To inspect or edit
320
- the status taxonomy in a specific project, use \`dotmd statuses list\`.
321
+ the status taxonomy in a specific project, use \`runlist statuses list\`.
321
322
 
322
323
  ────────────────────────────────────────────────────────────────────
323
324
  plan statuses (each maps to a distinct unstuck-action)
324
325
 
325
326
  in-session A Claude session is working on it now.
326
- \`dotmd use <file>\` marks it in-session and prints the plan.
327
+ \`runlist use <file>\` marks it in-session and prints the plan.
327
328
 
328
329
  active Ready to be worked on.
329
- \`dotmd use <file>\` → in-session.
330
+ \`runlist use <file>\` → in-session.
330
331
 
331
332
  planned Queued for future work, not yet ready to execute.
332
333
  Transition to active when ready to start.
@@ -350,11 +351,11 @@ plan statuses (each maps to a distinct unstuck-action)
350
351
  archived No longer relevant; auto-moved to archive directory.
351
352
 
352
353
  Canonical transitions:
353
- active → in-session \`dotmd use <file>\` (or \`dotmd set in-session <file>\`)
354
- in-session → active \`dotmd set active <file>\`
355
- in-session → partial \`dotmd set partial <file>\`
356
- in-session → awaiting \`dotmd set awaiting <file>\`
357
- any → archived \`dotmd set archived <file>\` (or \`dotmd archive\`)
354
+ active → in-session \`runlist use <file>\` (or \`runlist set in-session <file>\`)
355
+ in-session → active \`runlist set active <file>\`
356
+ in-session → partial \`runlist set partial <file>\`
357
+ in-session → awaiting \`runlist set awaiting <file>\`
358
+ any → archived \`runlist set archived <file>\` (or \`runlist archive\`)
358
359
 
359
360
  ────────────────────────────────────────────────────────────────────
360
361
  doc statuses
@@ -372,8 +373,8 @@ prompt statuses
372
373
  A prompt has two states and no third.
373
374
 
374
375
  pending Ready for the next session to consume.
375
- \`dotmd prompts use <file>\` prints body + archives atomically.
376
- \`dotmd prompts next\` does the same for the oldest pending.
376
+ \`runlist prompts use <file>\` prints body + archives atomically.
377
+ \`runlist prompts next\` does the same for the oldest pending.
377
378
 
378
379
  archived Consumed prompt; body preserved in the archive directory,
379
380
  which is the only directory a prompt ever moves into.
@@ -387,31 +388,31 @@ prompt statuses
387
388
 
388
389
  ────────────────────────────────────────────────────────────────────
389
390
  Related commands:
390
- dotmd statuses Inspect/manage per-project status taxonomy
391
- dotmd status <f> <new> Transition a document's status
392
- dotmd briefing See plans grouped by status
393
- dotmd plans --status <s> Filter live plans by status
394
- dotmd hud Command primer + pending-prompt triage
391
+ runlist statuses Inspect/manage per-project status taxonomy
392
+ runlist status <f> <new> Transition a document's status
393
+ runlist briefing See plans grouped by status
394
+ runlist plans --status <s> Filter live plans by status
395
+ runlist hud Command primer + pending-prompt triage
395
396
 
396
- Run \`dotmd statuses list --type plan\` to see the full set (including any
397
+ Run \`runlist statuses list --type plan\` to see the full set (including any
397
398
  project-specific custom statuses) with their flags.`,
398
399
 
399
- completions: `dotmd completions <bash|zsh> — output shell completion script
400
+ completions: `runlist completions <bash|zsh> — output shell completion script
400
401
 
401
402
  Add to your shell config:
402
- bash: eval "$(dotmd completions bash)"
403
- zsh: eval "$(dotmd completions zsh)"`,
403
+ bash: eval "$(runlist completions bash)"
404
+ zsh: eval "$(runlist completions zsh)"`,
404
405
 
405
- journal: `dotmd journal — view opt-in command-usage journal
406
+ journal: `runlist journal — view opt-in command-usage journal
406
407
 
407
- dotmd's primary user is an agent (per docs/audit-beyond-platform.md F17),
408
+ runlist's primary user is an agent (per docs/audit-beyond-platform.md F17),
408
409
  but the CLI gives no usage signal by default. Turn on the journal and every
409
- invocation appends one JSONL line to .dotmd/journal.jsonl with argv, exit
410
+ invocation appends one JSONL line to .runlist/journal.jsonl with argv, exit
410
411
  code, elapsed ms, session id, and (on error) a single-line err message.
411
412
 
412
413
  Enable:
413
414
  - env: RUNLIST_JOURNAL=1
414
- - config: \`export const journal = true;\` in dotmd.config.mjs
415
+ - config: \`export const journal = true;\` in runlist.config.mjs
415
416
 
416
417
  The env var beats config (RUNLIST_JOURNAL=0 forces off). The journal is
417
418
  default-off so non-agent users don't pay the size/PII cost.
@@ -425,19 +426,19 @@ Reader options:
425
426
  --json Emit selected entries as a JSON array
426
427
 
427
428
  Storage:
428
- Rotates to .dotmd/journal.jsonl.1 on dotmd version change, at >5MB,
429
+ Rotates to .runlist/journal.jsonl.1 on runlist version change, at >5MB,
429
430
  or when the oldest entry is >30 days.
430
431
  Single backup retained for up to 30 days; older history is dropped on
431
432
  rotation or pruned after the retention window.
432
433
 
433
434
  Examples:
434
- RUNLIST_JOURNAL=1 dotmd plans
435
- dotmd journal --tail 5
436
- dotmd journal --errors
437
- dotmd journal --by-command
438
- dotmd journal --since 2025-01-01 --json`,
435
+ RUNLIST_JOURNAL=1 runlist plans
436
+ runlist journal --tail 5
437
+ runlist journal --errors
438
+ runlist journal --by-command
439
+ runlist journal --since 2025-01-01 --json`,
439
440
 
440
- query: `dotmd query — filtered document search
441
+ query: `runlist query — filtered document search
441
442
 
442
443
  Filters:
443
444
  --type <t1,t2> Filter by type (plan, doc, prompt)
@@ -463,9 +464,9 @@ Filters:
463
464
  --summarize-limit <n> Max docs to summarize (default: 5)
464
465
  --model <name> Model for AI summaries`,
465
466
 
466
- grep: `dotmd grep <term> — keyword search across frontmatter AND document bodies
467
+ grep: `runlist grep <term> — keyword search across frontmatter AND document bodies
467
468
 
468
- Alias for \`dotmd query --keyword <term> --body --all\`. Answers "which doc
469
+ Alias for \`runlist query --keyword <term> --body --all\`. Answers "which doc
469
470
  discussed X?" with full doc cards (type, status, updated, path) plus 1-2
470
471
  matching-line excerpts per body hit — instead of raw-grep's bare paths.
471
472
 
@@ -473,25 +474,25 @@ Bodies are read lazily: frontmatter filters run first, only surviving
473
474
  candidates are opened. Archived docs are included but clearly labeled.
474
475
 
475
476
  Composes with the usual query flags:
476
- dotmd grep skipStale everything mentioning skipStale
477
- dotmd grep retries --type plan only plans
478
- dotmd grep retries --status active only active docs
479
- dotmd grep retries --limit 5 cap results (default: unlimited)
480
- dotmd grep retries --json machine-readable (bodyMatches per doc)`,
477
+ runlist grep skipStale everything mentioning skipStale
478
+ runlist grep retries --type plan only plans
479
+ runlist grep retries --status active only active docs
480
+ runlist grep retries --limit 5 cap results (default: unlimited)
481
+ runlist grep retries --json machine-readable (bodyMatches per doc)`,
481
482
 
482
- ship: `dotmd ship [patch|minor|major] — commit + bump in one step
483
+ ship: `runlist ship [patch|minor|major] — commit + bump in one step
483
484
 
484
485
  Bundles the release steps into a single command:
485
486
  1. Auto-stage every dirty file matching the release allowlist
486
487
  (src/, test/, bin/, docs/, plugins/, .claude-plugin/,
487
- .claude/commands/, package*.json, dotmd.config*.mjs, README.md,
488
+ .claude/commands/, package*.json, runlist.config*.mjs, README.md,
488
489
  CLAUDE.md, .gitignore). A real ship refuses while anything outside
489
490
  the allowlist is dirty; dry-run reports those files without changing them.
490
491
  2. Commit with an auto-generated \`chore: release <version>\` message.
491
492
  3. Run \`npm version <bump>\` to bump package.json, tag, push, run
492
493
  the publish workflow, and reinstall locally.
493
494
 
494
- (Per-repo \`.claude/commands\` scaffolding is retired — the dotmd plugin's
495
+ (Per-repo \`.claude/commands\` scaffolding is retired — the runlist plugin's
495
496
  SKILL.md is canonical now — so ship no longer regenerates anything.)
496
497
 
497
498
  Options:
@@ -502,15 +503,15 @@ Defaults to patch. Pass \`minor\` or \`major\` to bump those instead.
502
503
  Network failures after the version tag exists are resumed with
503
504
  \`npm run release:resume\`. Never push tags or publish manually.`,
504
505
 
505
- set: `dotmd set <status> [<file-or-slug>] — change a document's status
506
+ set: `runlist set <status> [<file-or-slug>] — change a document's status
506
507
 
507
508
  Writes the new status into the file's frontmatter. In-session plans carry a
508
- local, gitignored ownership record under .dotmd/ so one session cannot release
509
+ local, gitignored ownership record under .runlist/ so one session cannot release
509
510
  another session's work.
510
511
  - target is an archive status → archive the file (move + ref update)
511
512
  - everything else → plain frontmatter status bump
512
513
 
513
- <file-or-slug> resolves like \`dotmd use\`/\`archive\`: exact path first, then
514
+ <file-or-slug> resolves like \`runlist use\`/\`archive\`: exact path first, then
514
515
  a unique bare slug / basename across the doc roots (\`set paused auth-revamp\`).
515
516
  Ambiguous slugs error with the candidate list instead of guessing.
516
517
  When the path is omitted, exactly one plan must be owned by this session.
@@ -525,20 +526,20 @@ Options:
525
526
  --note "<text>" Append the reason to \`## Version History\` in the
526
527
  same call (creates the section if missing). Saves
527
528
  the status-change + worklog-edit round-trip.
528
- --no-index Skip index regen (see \`dotmd archive --help\`).
529
+ --no-index Skip index regen (see \`runlist archive --help\`).
529
530
  --show-files Append \`files: …\` footer.
530
531
  --force Recover another session's plan (explicit path required).
531
532
  --dry-run, -n Preview without writing.
532
533
 
533
534
  Examples:
534
- dotmd set in-session docs/plans/x # mark a plan in-session
535
- dotmd set partial docs/plans/x --note "tail tracked in y.md"
536
- dotmd set archived docs/plans/x # archive a specific plan
537
- dotmd set active # release this session's sole owned plan
535
+ runlist set in-session docs/plans/x # mark a plan in-session
536
+ runlist set partial docs/plans/x --note "tail tracked in y.md"
537
+ runlist set archived docs/plans/x # archive a specific plan
538
+ runlist set active # release this session's sole owned plan
538
539
 
539
- To open a plan (mark in-session AND print its body), use \`dotmd use <file>\`.`,
540
+ To open a plan (mark in-session AND print its body), use \`runlist use <file>\`.`,
540
541
 
541
- status: `dotmd status <file> <new-status> — transition document status
542
+ status: `runlist status <file> <new-status> — transition document status
542
543
 
543
544
  Moves the document to the new status. If transitioning to an archive
544
545
  status, automatically moves the file to the archive directory and
@@ -546,8 +547,8 @@ regenerates the index (if configured).
546
547
 
547
548
  Options:
548
549
  --no-index Skip index regen (useful in concurrent-session repos
549
- doing path-limited commits — see \`dotmd archive --help\`).
550
- --show-files Append \`files: …\` line to stderr (see \`dotmd archive --help\`).
550
+ doing path-limited commits — see \`runlist archive --help\`).
551
+ --show-files Append \`files: …\` line to stderr (see \`runlist archive --help\`).
551
552
 
552
553
  Default plan statuses (each maps to a distinct unstuck-action):
553
554
  in-session A Claude session is working on it now
@@ -560,15 +561,15 @@ Default plan statuses (each maps to a distinct unstuck-action):
560
561
  queued-after Sequenced behind another plan — check predecessor
561
562
  archived No longer relevant; auto-moved to archive directory
562
563
 
563
- Run \`dotmd help statuses\` for the full vocabulary across all doc types
564
+ Run \`runlist help statuses\` for the full vocabulary across all doc types
564
565
  (plan, doc, prompt) plus canonical transitions and related commands.
565
566
 
566
567
  Use --dry-run (-n) to preview changes without writing anything.`,
567
568
 
568
- check: `dotmd check — validate frontmatter and references
569
+ check: `runlist check — validate frontmatter and references
569
570
 
570
571
  By default the warning list is suppressed: you see counts plus a one-line
571
- pointer to \`dotmd doctor\` (auto-fix) or \`dotmd check --verbose\`
572
+ pointer to \`runlist doctor\` (auto-fix) or \`runlist check --verbose\`
572
573
  (per-doc detail). Errors are always shown in full.
573
574
 
574
575
  Options:
@@ -586,12 +587,12 @@ Options:
586
587
  skipped when checking specific paths.
587
588
  --dry-run, -n Preview fixes without writing (with --fix)`,
588
589
 
589
- archive: `dotmd archive <file-or-slug> — archive a document
590
+ archive: `runlist archive <file-or-slug> — archive a document
590
591
 
591
592
  Sets status to 'archived', moves to the archive directory, auto-updates
592
593
  references in other docs, and regenerates the index.
593
594
 
594
- <file-or-slug> resolves like \`dotmd use\`: an exact path wins, but a bare
595
+ <file-or-slug> resolves like \`runlist use\`: an exact path wins, but a bare
595
596
  slug / basename (e.g. \`archive resume-foo\`) falls back to a recursive
596
597
  basename match under the doc roots. An ambiguous basename (the same name in
597
598
  two places) errors with the candidate list instead of guessing.
@@ -602,7 +603,7 @@ Options:
602
603
  --no-index Skip index regen. Use when multiple sessions are
603
604
  working concurrently and you want a path-limited
604
605
  commit that doesn't pull other agents' uncommitted
605
- index changes into your staging area. Run \`dotmd index\`
606
+ index changes into your staging area. Run \`runlist index\`
606
607
  later (or wire it into a commit hook) to refresh.
607
608
  --show-files Append a final \`files: a b c …\` line to stderr
608
609
  listing every doc/index path the command touched
@@ -618,43 +619,43 @@ Options:
618
619
  file is still editable).
619
620
  --dry-run, -n Preview changes without writing anything.`,
620
621
 
621
- coverage: `dotmd coverage — metadata coverage report
622
+ coverage: `runlist coverage — metadata coverage report
622
623
 
623
624
  Shows which docs are missing surface, module, or audit metadata.
624
625
 
625
626
  Options:
626
627
  --json Machine-readable JSON output`,
627
628
 
628
- focus: `dotmd focus [status] — detailed view for one status group
629
+ focus: `runlist focus [status] — detailed view for one status group
629
630
 
630
631
  Shows detailed info for all docs matching the given status (default: active).
631
632
 
632
633
  Options:
633
634
  --json Output as JSON`,
634
635
 
635
- hud: `dotmd hud — actionable triage for session start
636
+ hud: `runlist hud — actionable triage for session start
636
637
 
637
- Prints the dotmd command primer (the verb cheat-sheet) plus, in --json mode,
638
+ Prints the runlist command primer (the verb cheat-sheet) plus, in --json mode,
638
639
  pending prompts and the check-error count for programmatic callers.
639
640
 
640
641
  Silent when there's nothing actionable — designed for SessionStart hooks where
641
- zero noise is the right default. Distinct from \`dotmd briefing\`, which
642
+ zero noise is the right default. Distinct from \`runlist briefing\`, which
642
643
  dumps the full plan-status pipeline and per-plan next_step bodies (kilobytes
643
644
  on large repos). Use hud for ergonomic session boot; use briefing for
644
645
  explicit "give me the full picture."
645
646
 
646
647
  The pending-prompts line tells Claude to consume them via
647
- \`dotmd prompts use <file>\` rather than reading/cat'ing — that atomically
648
+ \`runlist prompts use <file>\` rather than reading/cat'ing — that atomically
648
649
  prints the body and archives the prompt so it cannot be double-consumed.
649
650
 
650
651
  Recommended SessionStart hook (in ~/.claude/settings.json):
651
- "SessionStart": [{ "hooks": [{ "type": "command", "command": "dotmd hud", "timeout": 5 }] }]
652
+ "SessionStart": [{ "hooks": [{ "type": "command", "command": "runlist hud", "timeout": 5 }] }]
652
653
 
653
654
  Options:
654
655
  --json Output as JSON ({ owned, prompts, errors, previousSelf,
655
656
  fleet, recentRejections, misuseRecap, drift })`,
656
657
 
657
- briefing: `dotmd briefing — compact summary for session start
658
+ briefing: `runlist briefing — compact summary for session start
658
659
 
659
660
  Shows plan statuses with next steps, doc/research counts, and health
660
661
  in 5-10 lines. Designed for LLM context injection.
@@ -662,7 +663,7 @@ in 5-10 lines. Designed for LLM context injection.
662
663
  Options:
663
664
  --json Output as JSON`,
664
665
 
665
- context: `dotmd context — full briefing (LLM-oriented)
666
+ context: `runlist context — full briefing (LLM-oriented)
666
667
 
667
668
  Generates a status briefing designed for AI/LLM consumption. The default
668
669
  JSON form is the full index grouped by type/status; use --compact for bounded
@@ -674,12 +675,12 @@ Options:
674
675
  --summarize Add AI summaries for expanded docs
675
676
  --model <name> Model for AI summaries`,
676
677
 
677
- 'agent-context': `dotmd agent-context — compact bounded JSON for agents
678
+ 'agent-context': `runlist agent-context — compact bounded JSON for agents
678
679
 
679
- Equivalent to \`dotmd context --json --compact\`. Returns counts,
680
+ Equivalent to \`runlist context --json --compact\`. Returns counts,
680
681
  validation totals, pending prompt next item, and bounded plan action lists.`,
681
682
 
682
- stats: `dotmd stats — doc health dashboard
683
+ stats: `runlist stats — doc health dashboard
683
684
 
684
685
  Shows aggregated metrics: status counts, staleness, errors/warnings,
685
686
  freshness, completeness, checklist progress, and audit coverage.
@@ -687,7 +688,7 @@ freshness, completeness, checklist progress, and audit coverage.
687
688
  Options:
688
689
  --json Machine-readable JSON output`,
689
690
 
690
- graph: `dotmd graph — visualize document relationships
691
+ graph: `runlist graph — visualize document relationships
691
692
 
692
693
  Output formats:
693
694
  (default) Text adjacency list
@@ -699,7 +700,7 @@ Filters:
699
700
  --module <name> Show only docs with this module
700
701
  --surface <name> Show only docs with this surface`,
701
702
 
702
- deps: `dotmd deps [file] — dependency tree or overview
703
+ deps: `runlist deps [file] — dependency tree or overview
703
704
 
704
705
  Without a file, shows a flat overview: most blocking docs, most blocked
705
706
  docs, docs with blockers, and orphans.
@@ -711,7 +712,7 @@ Options:
711
712
  --depth <n> Max tree depth (default: 5)
712
713
  --json Machine-readable JSON output`,
713
714
 
714
- modules: `dotmd modules — module dashboard (plans grouped by module)
715
+ modules: `runlist modules — module dashboard (plans grouped by module)
715
716
 
716
717
  One row per module discovered in plan frontmatter. Dynamic status columns
717
718
  (only statuses with ≥1 plan render). Defaults to --type plan; pass --type
@@ -734,7 +735,7 @@ A plan with \`modules: [a, b]\` counts in both rows — intentional, so
734
735
  multi-module plans surface in every relevant triage view. \`(none)\` is a
735
736
  literal row for plans with no module tag.`,
736
737
 
737
- module: `dotmd module <name> — plans for one module, grouped by status
738
+ module: `runlist module <name> — plans for one module, grouped by status
738
739
 
739
740
  Status groups follow config.statusOrder. Stale plans are flagged inline.
740
741
 
@@ -748,10 +749,10 @@ Options:
748
749
 
749
750
  Unknown module name suggests close matches (or lists what's available).`,
750
751
 
751
- surfaces: `dotmd surfaces — list configured surface taxonomy
752
+ surfaces: `runlist surfaces — list configured surface taxonomy
752
753
 
753
754
  Prints the values accepted in \`surfaces:\` frontmatter, one per line.
754
- Source: \`config.taxonomy.surfaces\` in dotmd.config.mjs.
755
+ Source: \`config.taxonomy.surfaces\` in runlist.config.mjs.
755
756
 
756
757
  Options:
757
758
  --json Machine-readable shape: { surfaces: [...] }
@@ -759,7 +760,7 @@ Options:
759
760
  When the project has no taxonomy configured, any surface value is accepted —
760
761
  the command says so instead of printing an empty list.`,
761
762
 
762
- doctor: `dotmd doctor — auto-fix everything in one pass
763
+ doctor: `runlist doctor — auto-fix everything in one pass
763
764
 
764
765
  Runs in sequence: fix broken references, repair unambiguous membership
765
766
  back-references, lint --fix, move over-cap frontmatter prose into body sections,
@@ -791,19 +792,19 @@ Modes:
791
792
  the claims whose owning process is provably gone
792
793
  (their plans return to \`active\`).
793
794
  --claims --apply --older-than <24h|3d>
794
- Also release claims dotmd cannot judge — ones written
795
+ Also release claims runlist cannot judge — ones written
795
796
  before it recorded the owning process, or held on
796
797
  another machine — that are older than the duration.
797
- That threshold is your judgement, not dotmd's: it
798
+ That threshold is your judgement, not runlist's: it
798
799
  cannot tell a dead session from a slow one.
799
- --session Read-only: what session identity dotmd resolved, from
800
+ --session Read-only: what session identity runlist resolved, from
800
801
  which environment variable, and whether it names THIS
801
802
  session or something coarser that its siblings share
802
803
  (a host process, a terminal) — sessions sharing an id
803
804
  can release each other's plans. Also reports whether
804
805
  the current host's integration is installed. Run this
805
806
  when a verb says "No authoritative session identity",
806
- or on any host dotmd has never been tried on.
807
+ or on any host runlist has never been tried on.
807
808
  --session --json Machine-readable identity + host-integration state.
808
809
  --statuses Read-only diagnostic: detect overloaded status
809
810
  buckets where one status holds plans pursuing
@@ -836,7 +837,7 @@ Modes:
836
837
  in their Version History would be misleading).
837
838
  --migrate-template --json Machine-readable result.
838
839
  --frontmatter-fix Auto-fix the long-frontmatter warnings that
839
- \`dotmd check\` flags: \`current_state\` >1500 chars
840
+ \`runlist check\` flags: \`current_state\` >1500 chars
840
841
  or \`next_step\` >800 chars. Truncates the
841
842
  frontmatter field at the nearest sentence
842
843
  boundary under the target (1200 / 600) and
@@ -851,30 +852,30 @@ Modes:
851
852
  Sub-modes (--statuses, --migrate-*, --frontmatter-fix, --project) keep their
852
853
  existing contracts: they write by default and honor --dry-run.`,
853
854
 
854
- 'sync-status': `dotmd sync-status — rewrite hub rows whose printed status drifted
855
+ 'sync-status': `runlist sync-status — rewrite hub rows whose printed status drifted
855
856
 
856
857
  A runlist / coordination / roadmap hub rows its children in a table and prints
857
858
  each child's status by hand. This sweeps every hub, compares each row's status
858
859
  word against the plan it links to, and rewrites the ones that drifted. Case is
859
860
  preserved (\`Active\` stays capitalized), and nothing else in the cell is touched.
860
861
 
861
- dotmd sync-status every hub in the repo (the normal case)
862
- dotmd sync-status <hub>... narrow to named hubs
863
- dotmd sync-status --adopt also wrap managed status words in <!--s-->…<!--/s-->
864
- dotmd sync-status --dry-run --json
862
+ runlist sync-status every hub in the repo (the normal case)
863
+ runlist sync-status <hub>... narrow to named hubs
864
+ runlist sync-status --adopt also wrap managed status words in <!--s-->…<!--/s-->
865
+ runlist sync-status --dry-run --json
865
866
 
866
867
  The status word is found positionally — comments stripped, cell's leading token,
867
868
  matched against the vocabulary the CHILD's type declares — so no marker is
868
869
  needed. A marker pins the span for the rows position can't read (a status sitting
869
- behind a bolded headline). \`dotmd check\` warns on positional drift and ERRORS on
870
- marked drift: the marker is the author saying dotmd owns that word.
870
+ behind a bolded headline). \`runlist check\` warns on positional drift and ERRORS on
871
+ marked drift: the marker is the author saying runlist owns that word.
871
872
 
872
873
  Rows under a status column with no readable status word are reported by
873
- \`dotmd check\` and left alone here; rows in a table with no status column at all
874
- are not findings. Not to be confused with \`dotmd set <status>\`, which changes a
874
+ \`runlist check\` and left alone here; rows in a table with no status column at all
875
+ are not findings. Not to be confused with \`runlist set <status>\`, which changes a
875
876
  document's OWN status — this only rewrites what a hub prints about others.`,
876
877
 
877
- 'fix-membership': `dotmd fix-membership — repair unambiguous missing parent_plan back-references
878
+ 'fix-membership': `runlist fix-membership — repair unambiguous missing parent_plan back-references
878
879
 
879
880
  A repair is safe only when one live hub has already declared the relationship
880
881
  in its frontmatter runlist or body execution order and the live child plan has
@@ -884,12 +885,12 @@ updated date atomically.
884
885
  It never creates or edits hub prose, never overwrites another parent, and skips
885
886
  a parentless child ranked by multiple hubs as ambiguous.
886
887
 
887
- dotmd fix-membership every hub in the repo
888
- dotmd fix-membership <hub>... narrow to named hubs
889
- dotmd fix-membership --dry-run preview without writing
890
- dotmd fix-membership --dry-run --json`,
888
+ runlist fix-membership every hub in the repo
889
+ runlist fix-membership <hub>... narrow to named hubs
890
+ runlist fix-membership --dry-run preview without writing
891
+ runlist fix-membership --dry-run --json`,
891
892
 
892
- 'fix-refs': `dotmd fix-refs — auto-fix broken reference paths
893
+ 'fix-refs': `runlist fix-refs — auto-fix broken reference paths
893
894
 
894
895
  Scans all docs for reference fields that point to non-existent files,
895
896
  then attempts to resolve them by matching the basename against all known
@@ -897,8 +898,8 @@ docs. Fixes are applied by rewriting the frontmatter path.
897
898
 
898
899
  Use --dry-run (-n) to preview changes without writing anything.`,
899
900
 
900
- touch: `dotmd touch <file> — bump updated date
901
- dotmd touch --git [<file>...] — sync dates from git history
901
+ touch: `runlist touch <file> — bump updated date
902
+ runlist touch --git [<file>...] — sync dates from git history
902
903
 
903
904
  Without --git, updates a single file's frontmatter updated date to today.
904
905
  With --git, scans all docs (or the specified files) and syncs their updated
@@ -907,14 +908,14 @@ Commits that only changed the updated line are ignored so the fix converges.
907
908
 
908
909
  Use --dry-run (-n) to preview changes without writing anything.`,
909
910
 
910
- index: `dotmd index [--print] — generate/update docs.md index
911
+ index: `runlist index [--print] — generate/update docs.md index
911
912
 
912
913
  Updates the configured index file in place (writes by default as of 0.34.0).
913
914
  Use --print to dump the regenerated content to stdout without writing.
914
915
 
915
916
  Use --dry-run (-n) to preview without writing.`,
916
917
 
917
- new: `dotmd new <type> <name> [body] — create a new document
918
+ new: `runlist new <type> <name> [body] — create a new document
918
919
 
919
920
  Types and their default destinations:
920
921
  plan docs/plans/<slug>.md (build-up template: Problem → Phases → Closeout)
@@ -935,7 +936,7 @@ Tip for agents: prefer piped stdin or \`@path\` for multi-line bodies. Inline
935
936
  bodies put the entire content on the bash command line, which (a) breaks
936
937
  under shell quoting for backticks/dollar-signs and (b) trips PreToolUse hooks
937
938
  that scan command strings for forbidden literals (destructive-git patterns,
938
- etc.). \`cat /tmp/foo.md | dotmd new …\` and \`@/tmp/foo.md\` both sidestep both.
939
+ etc.). \`cat /tmp/foo.md | runlist new …\` and \`@/tmp/foo.md\` both sidestep both.
939
940
 
940
941
  For plan/doc, a single-section body lands under the type's first scaffolded
941
942
  section (e.g. \`## Problem\` for plans). If the body already authors
@@ -944,21 +945,21 @@ the title + your body is emitted — no duplicated empty outline below
944
945
  (since 0.36.1).
945
946
 
946
947
  Examples:
947
- dotmd new plan auth-revamp
948
- dotmd new prompt resume-foo @/tmp/draft.md
949
- cat /tmp/draft.md | dotmd new prompt resume-foo
950
- dotmd new prompt resume-foo <<'EOF'
948
+ runlist new plan auth-revamp
949
+ runlist new prompt resume-foo @/tmp/draft.md
950
+ cat /tmp/draft.md | runlist new prompt resume-foo
951
+ runlist new prompt resume-foo <<'EOF'
951
952
  multi-line
952
953
  prompt body
953
954
  EOF
954
- dotmd new prompt cleanup-tomorrow "look at remaining lint warnings"
955
- dotmd new plan full-spec <<'EOF'
955
+ runlist new prompt cleanup-tomorrow "look at remaining lint warnings"
956
+ runlist new plan full-spec <<'EOF'
956
957
  ## Problem
957
958
  …
958
959
  ## Phases
959
960
  …
960
961
  EOF
961
- dotmd new plan auth-revamp "Investigation findings before scoping…"
962
+ runlist new plan auth-revamp "Investigation findings before scoping…"
962
963
 
963
964
  Scaffolding runlists (plans only):
964
965
  --runlist <a,b,c> Create a sprint runlist hub plus one child plan per slug.
@@ -968,16 +969,16 @@ Scaffolding runlists (plans only):
968
969
  are named by the documented \`<hub>-NN-<slug>\` convention.
969
970
  --coordination Create a prose-first coordination hub: \`execution_mode:
970
971
  coordination\` + a \`## Ranked queue\` skeleton (no children).
971
- Surfaces in \`dotmd runlists\`, held out of the active count.
972
+ Surfaces in \`runlist runlists\`, held out of the active count.
972
973
  --roadmap Create a tier-3 roadmap hub: \`execution_mode: roadmap\` + a
973
974
  \`## Runlists\` skeleton. A roadmap composes *runlists* (not
974
975
  leaf plans) and rolls their done/total up — see
975
- \`dotmd roadmap\`. Wire child runlists via \`related_plans:\`.
976
+ \`runlist roadmap\`. Wire child runlists via \`related_plans:\`.
976
977
  (\`--runlist\`, \`--coordination\`, \`--roadmap\` are mutually exclusive.)
977
978
 
978
- dotmd new plan auth-revamp --runlist extract,rewrite,cleanup
979
- dotmd new plan platform --coordination
980
- dotmd new plan q3 --roadmap
979
+ runlist new plan auth-revamp --runlist extract,rewrite,cleanup
980
+ runlist new plan platform --coordination
981
+ runlist new plan q3 --roadmap
981
982
 
982
983
  Plan body variants (plans only — pick one body shape):
983
984
  --lite / --minimal Trimmed plan: Problem → Phases → Version History. Drops
@@ -990,8 +991,8 @@ Plan body variants (plans only — pick one body shape):
990
991
  (The body variants and \`--runlist\`/\`--coordination\`/\`--roadmap\` are all
991
992
  mutually exclusive — a plan has exactly one body shape.)
992
993
 
993
- dotmd new plan quick-fix --lite
994
- dotmd new plan perf-audit --audit
994
+ runlist new plan quick-fix --lite
995
+ runlist new plan perf-audit --audit
995
996
 
996
997
  Other options:
997
998
  --status <s> Set initial status (defaults to first valid status for the type)
@@ -1001,7 +1002,7 @@ Other options:
1001
1002
  docs/prospects/kim.md. Without it, a name containing a
1002
1003
  \`/\` is read relative to the repo.
1003
1004
  --show-files Append \`files: …\` line to stderr listing what was touched
1004
- (the new doc + the index file). See \`dotmd archive --help\`.
1005
+ (the new doc + the index file). See \`runlist archive --help\`.
1005
1006
  --list-types Show registered types (alias: --list-templates)
1006
1007
 
1007
1008
  For plans, the default status vocabulary is: in-session, active, planned,
@@ -1010,17 +1011,17 @@ For prompts: pending (default), archived.
1010
1011
 
1011
1012
  Use --dry-run (-n) to preview without creating the file.`,
1012
1013
 
1013
- watch: `dotmd watch [command] — re-run a command on file changes
1014
+ watch: `runlist watch [command] — re-run a command on file changes
1014
1015
 
1015
1016
  Watches the docs root for .md file changes and re-runs the specified
1016
1017
  command. Defaults to 'list' if no command given.
1017
1018
 
1018
1019
  Examples:
1019
- dotmd watch # re-run list on changes
1020
- dotmd watch check # re-run check on changes
1021
- dotmd watch context # live briefing`,
1020
+ runlist watch # re-run list on changes
1021
+ runlist watch check # re-run check on changes
1022
+ runlist watch context # live briefing`,
1022
1023
 
1023
- export: `dotmd export — export docs as markdown, HTML, or JSON
1024
+ export: `runlist export — export docs as markdown, HTML, or JSON
1024
1025
 
1025
1026
  Without a file, exports all docs (with optional filters).
1026
1027
  With a file, exports that doc plus all its dependencies.
@@ -1034,7 +1035,7 @@ Options:
1034
1035
  --root <name> Filter by root
1035
1036
  --dry-run, -n Preview without writing`,
1036
1037
 
1037
- summary: `dotmd summary <file> — AI summary of a document
1038
+ summary: `runlist summary <file> — AI summary of a document
1038
1039
 
1039
1040
  Generates an AI-powered summary using a local model.
1040
1041
 
@@ -1043,7 +1044,7 @@ Options:
1043
1044
  --max-tokens <n> Max tokens for generation (default: 200)
1044
1045
  --json Output as JSON`,
1045
1046
 
1046
- diff: `dotmd diff [file] — show changes since last updated date
1047
+ diff: `runlist diff [file] — show changes since last updated date
1047
1048
 
1048
1049
  Shows git diffs for docs that changed after their frontmatter updated date.
1049
1050
  Without a file argument, shows all drifted docs.
@@ -1054,7 +1055,7 @@ Options:
1054
1055
  --summarize Generate AI summary using local model
1055
1056
  --model <name> Model to use (default: mlx-community/Llama-3.2-3B-Instruct-4bit)`,
1056
1057
 
1057
- lint: `dotmd lint [--fix] — check and auto-fix frontmatter issues
1058
+ lint: `runlist lint [--fix] — check and auto-fix frontmatter issues
1058
1059
 
1059
1060
  Scans all docs for fixable problems:
1060
1061
  - Missing status (inferred via local AI model when available)
@@ -1068,7 +1069,7 @@ Scans all docs for fixable problems:
1068
1069
  Without --fix, reports all issues. With --fix, applies fixes in place.
1069
1070
  Use --dry-run (-n) with --fix to preview without writing anything.`,
1070
1071
 
1071
- rename: `dotmd rename <old> <new> — rename doc and update references
1072
+ rename: `runlist rename <old> <new> — rename doc and update references
1072
1073
 
1073
1074
  Renames a document using git mv and updates all frontmatter references
1074
1075
  in other docs that point to the old filename.
@@ -1076,7 +1077,7 @@ in other docs that point to the old filename.
1076
1077
  Body markdown links are warned about but not auto-fixed.
1077
1078
  Use --dry-run (-n) to preview changes without writing anything.`,
1078
1079
 
1079
- migrate: `dotmd migrate <field> <old-value> <new-value> [files...] — batch update a frontmatter field
1080
+ migrate: `runlist migrate <field> <old-value> <new-value> [files...] — batch update a frontmatter field
1080
1081
 
1081
1082
  Finds all docs where the given field equals old-value and updates it
1082
1083
  to new-value. With no file args, every matching doc in the project is
@@ -1089,47 +1090,47 @@ several distinct ones (e.g. moving some \`backlog\` plans to
1089
1090
  as \`bulk archive\`: exact path, then substring fallback.
1090
1091
 
1091
1092
  Examples:
1092
- dotmd migrate status research scoping
1093
- dotmd migrate module auth identity
1094
- dotmd migrate status backlog paused docs/plans/foo.md docs/plans/bar.md
1093
+ runlist migrate status research scoping
1094
+ runlist migrate module auth identity
1095
+ runlist migrate status backlog paused docs/plans/foo.md docs/plans/bar.md
1095
1096
 
1096
1097
  Use --dry-run (-n) to preview changes without writing anything.`,
1097
1098
 
1098
- init: `dotmd init — create starter config and docs directory
1099
+ init: `runlist init — create starter config and docs directory
1099
1100
 
1100
- Creates dotmd.config.mjs, docs/, and docs/docs.md in the current
1101
+ Creates runlist.config.mjs, docs/, and docs/docs.md in the current
1101
1102
  directory. Skips any files that already exist.
1102
1103
 
1103
1104
  If docs/ already contains .md files, auto-detects statuses, surfaces,
1104
1105
  modules, and reference fields to pre-populate the config.`,
1105
1106
 
1106
- plans: `dotmd plans — list live plans (excludes archived by default)
1107
+ plans: `runlist plans — list live plans (excludes archived by default)
1107
1108
 
1108
1109
  Shows documents with type: plan, excluding terminal/archive statuses,
1109
1110
  sorted by status. Supports all query flags (--status, --module, --json,
1110
1111
  --sort, --group, etc.).
1111
1112
 
1112
1113
  Default plan statuses: in-session, active, planned, blocked, partial,
1113
- paused, awaiting, queued-after, archived. Run \`dotmd help statuses\` for
1114
+ paused, awaiting, queued-after, archived. Run \`runlist help statuses\` for
1114
1115
  the unstuck-action behind each one and canonical transitions.
1115
1116
 
1116
1117
  Examples:
1117
- dotmd plans # live plans (default)
1118
- dotmd plans --include-archived # all plans including archived
1119
- dotmd plans --status active # active plans only
1120
- dotmd plans --status awaiting # plans waiting on a human decision
1121
- dotmd plans --status partial,paused # shipped-tail and parked plans
1122
- dotmd plans --module auth # plans for the auth module
1123
- dotmd plans --group module # plans grouped by module
1124
- dotmd plans --json # JSON output`,
1118
+ runlist plans # live plans (default)
1119
+ runlist plans --include-archived # all plans including archived
1120
+ runlist plans --status active # active plans only
1121
+ runlist plans --status awaiting # plans waiting on a human decision
1122
+ runlist plans --status partial,paused # shipped-tail and parked plans
1123
+ runlist plans --module auth # plans for the auth module
1124
+ runlist plans --group module # plans grouped by module
1125
+ runlist plans --json # JSON output`,
1125
1126
 
1126
- prompts: `dotmd prompts — manage saved prompts (subcommand namespace)
1127
+ prompts: `runlist prompts — manage saved prompts (subcommand namespace)
1127
1128
 
1128
1129
  Prompts are documents with \`type: prompt\`, typically saved under
1129
1130
  docs/prompts/. They seed future Claude sessions; consuming a prompt
1130
1131
  prints its body to stdout and atomically archives it (one-shot).
1131
1132
 
1132
- \`dotmd prompt\` (singular) is an alias for \`dotmd prompts\` — every
1133
+ \`runlist prompt\` (singular) is an alias for \`runlist prompts\` — every
1133
1134
  subcommand below works under either spelling.
1134
1135
 
1135
1136
  Subcommands:
@@ -1144,49 +1145,49 @@ Subcommands:
1144
1145
  (triage). \`peek\` is an alias.
1145
1146
  archive <file-or-slug> Archive a prompt without printing its body
1146
1147
  new <slug> [body] Create a new prompt (alias for
1147
- \`dotmd new prompt <slug> [body]\`)
1148
+ \`runlist new prompt <slug> [body]\`)
1148
1149
 
1149
1150
  \`<file-or-slug>\` accepts: an exact path (with or without .md), a bare
1150
1151
  slug matching a prompt basename, or a unique substring of a prompt
1151
1152
  path. Ambiguous substrings error with the candidate list.
1152
1153
 
1153
- A prompt saved by \`dotmd baton\` links its plan; consuming it (\`use\`,
1154
- \`next\`, or top-level \`dotmd use\`) also claims that plan for this session.
1154
+ A prompt saved by \`runlist baton\` links its plan; consuming it (\`use\`,
1155
+ \`next\`, or top-level \`runlist use\`) also claims that plan for this session.
1155
1156
  Pass \`--no-claim\` to read and archive the prompt without starting the plan.
1156
1157
 
1157
1158
  Default prompt statuses: pending, archived.
1158
1159
 
1159
1160
  Examples:
1160
- dotmd prompts # pending prompts (default)
1161
- dotmd prompts list --verbose # one row per prompt + target plan ref
1161
+ runlist prompts # pending prompts (default)
1162
+ runlist prompts list --verbose # one row per prompt + target plan ref
1162
1163
  # (from related_plans, parent_plan,
1163
1164
  # or the first body .md link)
1164
- dotmd prompts list --include-archived # all prompts including archived
1165
- dotmd prompts list --status claimed # already-consumed prompts
1166
- dotmd prompts --json # JSON output
1167
-
1168
- claude "$(dotmd prompts next)" # consume oldest pending + run claude
1169
- claude "$(dotmd prompts use resume-foo)" # by slug
1170
- claude "$(dotmd prompts use docs/prompts/foo.md)" # by path
1171
- claude "$(dotmd prompts resume resume-foo)" # \`resume\` is an alias for \`use\`
1172
- dotmd prompt list # singular alias for \`dotmd prompts list\`
1173
-
1174
- dotmd prompts show resume-foo # peek without consuming (triage)
1175
- dotmd prompts show --all # peek the WHOLE pending queue in one call
1176
- dotmd prompts show --all --limit 10 # ...capped
1177
- dotmd prompts show a b c # peek several by name
1178
- dotmd prompts next --dry-run # preview without consuming
1179
- dotmd prompts archive old-thing
1180
- dotmd prompts new my-prompt "Body text here"`,
1181
-
1182
- baton: `dotmd baton — save a resume prompt for whatever you're doing (and release the plan, if there is one)
1165
+ runlist prompts list --include-archived # all prompts including archived
1166
+ runlist prompts list --status claimed # already-consumed prompts
1167
+ runlist prompts --json # JSON output
1168
+
1169
+ claude "$(runlist prompts next)" # consume oldest pending + run claude
1170
+ claude "$(runlist prompts use resume-foo)" # by slug
1171
+ claude "$(runlist prompts use docs/prompts/foo.md)" # by path
1172
+ claude "$(runlist prompts resume resume-foo)" # \`resume\` is an alias for \`use\`
1173
+ runlist prompt list # singular alias for \`runlist prompts list\`
1174
+
1175
+ runlist prompts show resume-foo # peek without consuming (triage)
1176
+ runlist prompts show --all # peek the WHOLE pending queue in one call
1177
+ runlist prompts show --all --limit 10 # ...capped
1178
+ runlist prompts show a b c # peek several by name
1179
+ runlist prompts next --dry-run # preview without consuming
1180
+ runlist prompts archive old-thing
1181
+ runlist prompts new my-prompt "Body text here"`,
1182
+
1183
+ baton: `runlist baton — save a resume prompt for whatever you're doing (and release the plan, if there is one)
1183
1184
 
1184
1185
  The "save a resume prompt" verb. Works mid-anything:
1185
1186
 
1186
1187
  Plan mode (a plan is in-session, or you pass one):
1187
1188
  The following publish in one atomic cooperating transaction:
1188
1189
  1. A resume prompt named resume-<plan-slug> (collision-safe: -2, -3, …),
1189
- stamped with a plan: link so consuming it re-claims the plan (see \`dotmd
1190
+ stamped with a plan: link so consuming it re-claims the plan (see \`runlist
1190
1191
  use\`). The prompt is session-local — the next session's hud surfaces it;
1191
1192
  never paste resume text into chat.
1192
1193
  2. Releases the plan: one status flip, in-session → active by default
@@ -1200,12 +1201,12 @@ Plan mode (a plan is in-session, or you pass one):
1200
1201
  takeover; hooks are at-least-once and deduplicate the stable operationId.
1201
1202
 
1202
1203
  Slug mode (no plan involved — "save a resume prompt for this"):
1203
- dotmd baton <slug> @/tmp/draft.md → saves resume-<slug>, touches NOTHING
1204
+ runlist baton <slug> @/tmp/draft.md → saves resume-<slug>, touches NOTHING
1204
1205
  else: no status changes, no commit, no plan required. Reference any relevant
1205
1206
  plans/docs inside the draft body.
1206
1207
 
1207
1208
  Usage:
1208
- dotmd baton [<plan-file> | <slug>] [@<draft-file> | - | --message "..."]
1209
+ runlist baton [<plan-file> | <slug>] [@<draft-file> | - | --message "..."]
1209
1210
 
1210
1211
  Options:
1211
1212
  --status <s> Target status for the plan (default: active; plan mode only)
@@ -1216,29 +1217,29 @@ Options:
1216
1217
  --dry-run, -n Preview without writing
1217
1218
 
1218
1219
  Examples:
1219
- dotmd baton @/tmp/draft.md # owned plan, body from file
1220
- dotmd baton checkout-fixes @/tmp/draft.md # no plan: just save resume-checkout-fixes
1221
- cat /tmp/draft.md | dotmd baton # body from stdin
1222
- dotmd baton docs/plans/auth.md @/tmp/draft.md # explicit plan
1223
- dotmd baton --status paused --note "blocked on review" @/tmp/d.md
1220
+ runlist baton @/tmp/draft.md # owned plan, body from file
1221
+ runlist baton checkout-fixes @/tmp/draft.md # no plan: just save resume-checkout-fixes
1222
+ cat /tmp/draft.md | runlist baton # body from stdin
1223
+ runlist baton docs/plans/auth.md @/tmp/draft.md # explicit plan
1224
+ runlist baton --status paused --note "blocked on review" @/tmp/d.md
1224
1225
 
1225
1226
  Write the draft FIRST (10–20 lines): the next concrete decision plus any
1226
1227
  gotchas — not a recap of the plan body.`,
1227
1228
 
1228
- stale: `dotmd stale — list stale documents
1229
+ stale: `runlist stale — list stale documents
1229
1230
 
1230
1231
  Shows docs that haven't been updated within their staleness threshold.
1231
1232
  Supports all query flags (--status, --json, --sort, etc.)
1232
1233
 
1233
1234
  Examples:
1234
- dotmd stale --group module Stale plans grouped by module (triage view)`,
1235
+ runlist stale --group module Stale plans grouped by module (triage view)`,
1235
1236
 
1236
- actionable: `dotmd actionable — list docs with next steps
1237
+ actionable: `runlist actionable — list docs with next steps
1237
1238
 
1238
1239
  Shows active/ready docs that have a next_step defined.
1239
1240
  Supports all query flags (--status, --json, --sort, etc.)`,
1240
1241
 
1241
- unblocks: `dotmd unblocks <file> — show what completes when this doc ships
1242
+ unblocks: `runlist unblocks <file> — show what completes when this doc ships
1242
1243
 
1243
1244
  Shows documents that reference or depend on the given file.
1244
1245
  Useful for impact analysis before archiving or changing a plan.
@@ -1261,7 +1262,7 @@ Frontmatter shape:
1261
1262
  Options:
1262
1263
  --json Output as JSON`,
1263
1264
 
1264
- health: `dotmd health — plan velocity, aging, and pipeline health
1265
+ health: `runlist health — plan velocity, aging, and pipeline health
1265
1266
 
1266
1267
  Shows plan pipeline status, active plan aging, recently archived
1267
1268
  plans, and checklist progress. Plans-only view.
@@ -1269,7 +1270,7 @@ plans, and checklist progress. Plans-only view.
1269
1270
  Options:
1270
1271
  --json Output as JSON`,
1271
1272
 
1272
- glossary: `dotmd glossary <term> — look up domain terms and related docs
1273
+ glossary: `runlist glossary <term> — look up domain terms and related docs
1273
1274
 
1274
1275
  Searches the glossary table in your docs for matching terms.
1275
1276
  Shows definition, related docs, and see-also entries.
@@ -1278,7 +1279,7 @@ Options:
1278
1279
  --list List all glossary terms
1279
1280
  --json Output as JSON`,
1280
1281
 
1281
- statuses: `dotmd statuses — manage per-project status taxonomy
1282
+ statuses: `runlist statuses — manage per-project status taxonomy
1282
1283
 
1283
1284
  Subcommands:
1284
1285
  list [--type <t>] [--json] Default. Table view of every status × type with all flags.
@@ -1291,7 +1292,7 @@ Subcommands:
1291
1292
  set <name> --type <t> <flags...> Edit flags on an existing status. Refuses if status doesn't
1292
1293
  exist. Flags overwrite individually.
1293
1294
  remove <name> --type <t> Delete a status entry. Refuses if any docs use the status
1294
- (lists offenders, suggests \`dotmd migrate\`). Warns if an
1295
+ (lists offenders, suggests \`runlist migrate\`). Warns if an
1295
1296
  explicit lifecycle export references the name.
1296
1297
  migrate <type> One-shot conversion of array-form types.<t>.statuses to
1297
1298
  rich form, pulling in peer staleDays/context and per-status
@@ -1314,18 +1315,18 @@ Workflow flags:
1314
1315
  would silently mask the per-status flags
1315
1316
 
1316
1317
  Examples:
1317
- dotmd statuses # list everything
1318
- dotmd statuses add paused --type plan --like blocked --quiet
1319
- dotmd statuses set archived --type plan --no-quiet
1320
- dotmd statuses remove obsolete --type plan
1321
- dotmd statuses migrate plan # array → rich
1318
+ runlist statuses # list everything
1319
+ runlist statuses add paused --type plan --like blocked --quiet
1320
+ runlist statuses set archived --type plan --no-quiet
1321
+ runlist statuses remove obsolete --type plan
1322
+ runlist statuses migrate plan # array → rich
1322
1323
 
1323
1324
  Lifecycle-override gotcha: if your config has both rich-form types and an explicit
1324
1325
  \`export const lifecycle\`, the runtime ignores per-status flags. The CLI refuses
1325
1326
  to write in that case unless you pass --ignore-lifecycle-override; the recommended
1326
1327
  fix is to delete the explicit \`lifecycle\` block so flags take effect.`,
1327
1328
 
1328
- bulk: `dotmd bulk archive <f1> <f2> ... — archive multiple files at once
1329
+ bulk: `runlist bulk archive <f1> <f2> ... — archive multiple files at once
1329
1330
 
1330
1331
  Archives each file in an independent per-item transaction: sets status to
1331
1332
  archived, moves to archive directory, and updates references. This is explicitly
@@ -1334,14 +1335,14 @@ regenerated once after all item attempts.
1334
1335
 
1335
1336
  Use --dry-run (-n) to preview changes without writing anything.`,
1336
1337
 
1337
- runlist: `dotmd runlist <hub> [next|add|remove|reorder] — work with an ordered group of plans
1338
+ runlist: `runlist runlist <hub> [next|add|remove|reorder] — work with an ordered group of plans
1338
1339
 
1339
1340
  A "runlist" is just a plan with a \`runlist:\` array of child plan paths in its
1340
1341
  frontmatter — there is no separate doc type. The hub plan can have any status;
1341
1342
  the order of the children comes from the array.
1342
1343
 
1343
1344
  Usage:
1344
- dotmd runlist <hub> Show children + their statuses, in order. The
1345
+ runlist runlist <hub> Show children + their statuses, in order. The
1345
1346
  first pickup-able child (active / planned /
1346
1347
  in-session) is marked \`→\`. Archived (done) and
1347
1348
  parked children (blocked / partial / paused /
@@ -1349,12 +1350,12 @@ Usage:
1349
1350
  advances to the first child you can actually
1350
1351
  start. Parked ≠ done: they don't count toward
1351
1352
  done/total.
1352
- dotmd runlist next <hub> Open the first pickup-able child (marks it
1353
+ runlist runlist next <hub> Open the first pickup-able child (marks it
1353
1354
  in-session + prints it), advancing past archived
1354
1355
  and parked children. If every remaining child is
1355
1356
  parked, stops and lists them + the unstick verbs
1356
1357
  so you resolve a blocker first.
1357
- dotmd runlist add <hub> <child...>
1358
+ runlist runlist add <hub> <child...>
1358
1359
  Append children to the hub's \`runlist:\` array
1359
1360
  (no more hand-editing the YAML). Each child can be:
1360
1361
  • a bare slug (\`cleanup\`) → scaffolds a
@@ -1365,13 +1366,13 @@ Usage:
1365
1366
  back at the hub.
1366
1367
  A plain plan gains a \`runlist:\` (becomes a hub).
1367
1368
  Coordination hubs (body-order) aren't handled here.
1368
- dotmd runlist remove <hub> <child...>
1369
+ runlist runlist remove <hub> <child...>
1369
1370
  Drop children from the \`runlist:\` array. Children
1370
1371
  match by full path or short slug (\`cleanup\` finds
1371
1372
  \`<hub>-03-cleanup.md\`). \`--clear-parent\` also blanks
1372
1373
  each removed child's \`parent_plan:\` back-ref.
1373
- dotmd runlist reorder <hub> <child> --before|--after <other>
1374
- dotmd runlist reorder <hub> <c1> <c2> <c3...>
1374
+ runlist runlist reorder <hub> <child> --before|--after <other>
1375
+ runlist runlist reorder <hub> <c1> <c2> <c3...>
1375
1376
  Move one child relative to another, or pass every
1376
1377
  child to set a full new order.
1377
1378
  All three mutators take \`--dry-run\` / \`--json\` and
@@ -1394,10 +1395,10 @@ Common shape:
1394
1395
  - auth-revamp-03-cleanup.md
1395
1396
  ---
1396
1397
 
1397
- Child plans should set \`parent_plan:\` back at the hub — \`dotmd check\` warns
1398
+ Child plans should set \`parent_plan:\` back at the hub — \`runlist check\` warns
1398
1399
  when they don't.
1399
1400
 
1400
- In \`dotmd plans\`, a hub is tagged \`[RUNLIST]\` (not \`[ACTIVE]\`) and its
1401
+ In \`runlist plans\`, a hub is tagged \`[RUNLIST]\` (not \`[ACTIVE]\`) and its
1401
1402
  children fold underneath it — progress (\`done/total\`) and the next pickup
1402
1403
  \`→\` show on the hub row, so a sprint reads as one runlist instead of N loose
1403
1404
  plans. Children whose hub is filtered out of the view (e.g. \`--status active\`
@@ -1405,13 +1406,13 @@ when the hub is \`planned\`) still render on their own.
1405
1406
 
1406
1407
  Larger, prose-first "coordination" runlists (a domain map pointing at many
1407
1408
  plans, marked \`execution_mode: coordination\` or named \`*-runlist\`) aren't
1408
- folded — they're lifted into a separate \`Runlists\` section in \`dotmd plans\`
1409
- and out of the active count. \`dotmd runlists\` shows that dashboard on its own.
1409
+ folded — they're lifted into a separate \`Runlists\` section in \`runlist plans\`
1410
+ and out of the active count. \`runlist runlists\` shows that dashboard on its own.
1410
1411
  For these, \`runlist\`/\`runlist next\` also read order from the body when there's
1411
1412
  no \`runlist:\` array — a \`## Ranked queue\` table or \`## Order of operations\`
1412
1413
  list of markdown links (the first \`.md\` link per row/item, in order).`,
1413
1414
 
1414
- runlists: `dotmd runlists — the coordination-hub dashboard
1415
+ runlists: `runlist runlists — the coordination-hub dashboard
1415
1416
 
1416
1417
  Lists every *coordination runlist*: a prose-first plan that sits above a
1417
1418
  cluster of others (a domain map), detected by \`execution_mode: coordination\`
@@ -1420,19 +1421,19 @@ size of its \`related_plans:\` cluster, a \`next → <child>\` when the hub's bo
1420
1421
  encodes order as markdown links (\`## Ranked queue\` table / \`## Order of
1421
1422
  operations\` list), and a one-line descriptor.
1422
1423
 
1423
- This is the standalone form of the \`Runlists\` section that \`dotmd plans\`
1424
+ This is the standalone form of the \`Runlists\` section that \`runlist plans\`
1424
1425
  pins beneath the leaf-plan triage list.
1425
1426
 
1426
- dotmd runlists All runlists (a small bounded set), most stale first.
1427
- dotmd runlists --sort recent Order by recency instead (age|recent|related|title|status).
1428
- dotmd runlists --limit N Cap the list at N.
1429
- dotmd runlists --json Structured rows (path, status, childCount, nextPickup, …).`,
1427
+ runlist runlists All runlists (a small bounded set), most stale first.
1428
+ runlist runlists --sort recent Order by recency instead (age|recent|related|title|status).
1429
+ runlist runlists --limit N Cap the list at N.
1430
+ runlist runlists --json Structured rows (path, status, childCount, nextPickup, …).`,
1430
1431
 
1431
- 'bulk-tag': `dotmd bulk-tag [files...] — fill in type/status frontmatter on pre-existing markdown
1432
+ 'bulk-tag': `runlist bulk-tag [files...] — fill in type/status frontmatter on pre-existing markdown
1432
1433
 
1433
1434
  Scans the docs tree for files that are missing either \`type:\` or \`status:\`
1434
1435
  (or have no frontmatter block at all) and writes minimal frontmatter so they
1435
- appear in \`dotmd list\`, \`query\`, and \`briefing\`.
1436
+ appear in \`runlist list\`, \`query\`, and \`briefing\`.
1436
1437
 
1437
1438
  Type is inferred from the file's subdir under docsRoot:
1438
1439
  docs/plans/foo.md → type: plan, status: planned
@@ -1452,20 +1453,6 @@ Pass file paths as positional args to scope to those files only; otherwise
1452
1453
  the whole docs tree is scanned.`,
1453
1454
  };
1454
1455
 
1455
- // Help presents the new product name while the compatibility package and
1456
- // plugin still use their old registry identities. Protect those identifiers
1457
- // from the display-only command-name rewrite until the package cutover.
1458
- function canonicalHelp(text) {
1459
- return String(text)
1460
- .replaceAll('dotmd-cli', '\u0000PACKAGE\u0000')
1461
- .replaceAll('dotmd@dotmd', '\u0000PLUGIN\u0000')
1462
- .replaceAll('reowens/dotmd', '\u0000REPOSITORY\u0000')
1463
- .replace(/\bdotmd\b/g, 'runlist')
1464
- .replaceAll('\u0000PACKAGE\u0000', 'dotmd-cli')
1465
- .replaceAll('\u0000PLUGIN\u0000', 'dotmd@dotmd')
1466
- .replaceAll('\u0000REPOSITORY\u0000', 'reowens/dotmd');
1467
- }
1468
-
1469
1456
  const GLOBAL_VALUE_OPTIONS = new Set(['--config', '--root', '--type']);
1470
1457
  const GLOBAL_BOOLEAN_OPTIONS = new Set(['--dry-run', '-n', '--verbose']);
1471
1458
 
@@ -1583,12 +1570,12 @@ async function main() {
1583
1570
  const topic = restArgs[0];
1584
1571
  if (topic) {
1585
1572
  const key = `help:${topic}`;
1586
- if (HELP[key]) { process.stdout.write(`${canonicalHelp(HELP[key])}\n`); return; }
1587
- if (HELP[topic]) { process.stdout.write(`${canonicalHelp(HELP[topic])}\n`); return; }
1588
- process.stderr.write(`Unknown help topic: ${topic}\n\nAvailable topics: all, statuses\nPer-command help: dotmd <cmd> --help\n`);
1573
+ if (HELP[key]) { process.stdout.write(`${HELP[key]}\n`); return; }
1574
+ if (HELP[topic]) { process.stdout.write(`${HELP[topic]}\n`); return; }
1575
+ process.stderr.write(`Unknown help topic: ${topic}\n\nAvailable topics: all, statuses\nPer-command help: runlist <cmd> --help\n`);
1589
1576
  process.exit(1);
1590
1577
  }
1591
- process.stdout.write(`${canonicalHelp(HELP._main)}\n`);
1578
+ process.stdout.write(`${HELP._main}\n`);
1592
1579
  return;
1593
1580
  }
1594
1581
 
@@ -1612,7 +1599,7 @@ async function main() {
1612
1599
  // Per-command help
1613
1600
  if (args.includes('--help') || args.includes('-h')) {
1614
1601
  requireCommandPolicy(command, dispatchPolicy);
1615
- process.stdout.write(`${canonicalHelp(HELP[command] ?? commandUsage(command))}\n`);
1602
+ process.stdout.write(`${HELP[command] ?? commandUsage(command)}\n`);
1616
1603
  return;
1617
1604
  }
1618
1605
 
@@ -1691,7 +1678,7 @@ async function main() {
1691
1678
  // cleanly on their own). The warning is still useful for interactive commands.
1692
1679
  const HOOK_COMMANDS = new Set(['hud', 'guard']);
1693
1680
  if (!config.configFound && command !== 'init' && !HOOK_COMMANDS.has(command)) {
1694
- warn('No dotmd config found — using defaults. Run `dotmd init` to create one.');
1681
+ warn('No runlist config found — using defaults. Run `runlist init` to create one.');
1695
1682
  }
1696
1683
 
1697
1684
  if (config.configWarnings && config.configWarnings.length > 0) {
@@ -1840,10 +1827,10 @@ async function main() {
1840
1827
  if (command === 'misuse') { const { runMisuse } = await import('../src/misuse-read.mjs'); runMisuse(restArgs, config); return; }
1841
1828
  if (command === 'journal') { const { runJournal } = await import('../src/journal-read.mjs'); runJournal(restArgs, config); return; }
1842
1829
  if (command === 'pickup' || command === 'unpickup' || command === 'release' || command === 'finish') {
1843
- die(`\`dotmd ${command}\` was removed — use the ownership-aware lifecycle verbs:\n dotmd use <file> # atomically claim + mark in-session + print the plan\n dotmd set <status> <file> # transition and release ownership when leaving in-session\n dotmd archive <file> # close out atomically`);
1830
+ die(`\`runlist ${command}\` was removed — use the ownership-aware lifecycle verbs:\n runlist use <file> # atomically claim + mark in-session + print the plan\n runlist set <status> <file> # transition and release ownership when leaving in-session\n runlist archive <file> # close out atomically`);
1844
1831
  }
1845
1832
  if (command === 'runlist') { const { runRunlist } = await import('../src/runlist.mjs'); await runRunlist(restArgs, config, { dryRun }); return; }
1846
- if (command === 'handoff') { die('`dotmd handoff` was removed in 0.31.0. Use `dotmd prompts new <name>` to create a saved prompt instead. The .dotmd/handoffs/ sidecar mechanism no longer exists; see CHANGELOG.'); }
1833
+ if (command === 'handoff') { die('`runlist handoff` was removed in 0.31.0. Use `runlist prompts new <name>` to create a saved prompt instead. The .dotmd/handoffs/ sidecar mechanism no longer exists; see CHANGELOG.'); }
1847
1834
  if (command === 'status') { const { runStatus } = await import('../src/lifecycle.mjs'); await runStatus(restArgs, config, { dryRun }); return; }
1848
1835
  if (command === 'set') { const { runSet } = await import('../src/lifecycle.mjs'); await runSet(restArgs, config, { dryRun }); return; }
1849
1836
  if (command === 'ship') { const { runShip } = await import('../src/ship.mjs'); await runShip(restArgs, config, { dryRun }); return; }
@@ -1929,7 +1916,7 @@ async function main() {
1929
1916
  const minDocsFlagIdx = restArgs.indexOf('--min-docs');
1930
1917
  const minDocsRaw = minDocsFlagIdx === -1 ? null : restArgs[minDocsFlagIdx + 1];
1931
1918
  if (minDocsFlagIdx !== -1 && !/^\d+$/.test(minDocsRaw ?? '')) {
1932
- die('`--min-docs` needs a positive integer, e.g. `dotmd check --min-docs 500`.');
1919
+ die('`--min-docs` needs a positive integer, e.g. `runlist check --min-docs 500`.');
1933
1920
  }
1934
1921
  const minDocsOverride = minDocsRaw == null ? null : Number(minDocsRaw);
1935
1922
  const minDocsValueIdx = minDocsFlagIdx === -1 ? -1 : minDocsFlagIdx + 1;
@@ -1965,7 +1952,7 @@ async function main() {
1965
1952
  };
1966
1953
 
1967
1954
  if (fix && checkTargets.length > 0) {
1968
- die('`dotmd check --fix` does not support path-scoped checks yet. Run `dotmd check <path>` to validate a subset, or `dotmd check --fix` to fix the whole docs tree.');
1955
+ die('`runlist check --fix` does not support path-scoped checks yet. Run `runlist check <path>` to validate a subset, or `runlist check --fix` to fix the whole docs tree.');
1969
1956
  }
1970
1957
 
1971
1958
  if (fix) {
@@ -2042,7 +2029,7 @@ async function main() {
2042
2029
 
2043
2030
  if (command === 'index') {
2044
2031
  if (!config.indexPath) {
2045
- die('Index generation is not configured. Add an `index` section to your dotmd.config.mjs.');
2032
+ die('Index generation is not configured. Add an `index` section to your runlist.config.mjs.');
2046
2033
  }
2047
2034
  const print = args.includes('--print');
2048
2035
  const { renderIndexFile, writeRenderedIndex } = await import('../src/index-file.mjs');
@@ -2075,7 +2062,7 @@ async function main() {
2075
2062
  if (arg.startsWith('-') || term !== null) { passthrough.push(arg); continue; }
2076
2063
  term = arg;
2077
2064
  }
2078
- if (!term) die('Usage: dotmd grep <term> [query flags]\n\nSearches frontmatter fields AND document bodies; alias for `dotmd query --keyword <term> --body --all`.');
2065
+ if (!term) die('Usage: runlist grep <term> [query flags]\n\nSearches frontmatter fields AND document bodies; alias for `runlist query --keyword <term> --body --all`.');
2079
2066
  const defaults = ['--keyword', term, '--body'];
2080
2067
  if (!passthrough.includes('--limit') && !passthrough.includes('--all')) defaults.push('--all');
2081
2068
  runQuery(index, [...defaults, ...passthrough], config);