dotmd-cli 0.78.0 → 0.79.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +66 -63
- package/assets/opencode/plugin.js +7 -6
- package/bin/dotmd.mjs +272 -285
- package/package.json +2 -2
- package/scripts/postinstall.mjs +4 -4
- package/src/atomic-mutation.mjs +1 -1
- package/src/baton.mjs +7 -7
- package/src/check-collapse.mjs +5 -5
- package/src/claude-commands.mjs +6 -2
- package/src/commands.mjs +4 -4
- package/src/config.mjs +2 -2
- package/src/deps.mjs +1 -1
- package/src/doctor.mjs +17 -17
- package/src/fix-membership.mjs +1 -1
- package/src/frontmatter-fix.mjs +1 -1
- package/src/git.mjs +1 -1
- package/src/glossary.mjs +3 -3
- package/src/graph.mjs +1 -1
- package/src/guard.mjs +8 -8
- package/src/health.mjs +2 -2
- package/src/hints.mjs +7 -7
- package/src/host-integration.mjs +41 -22
- package/src/hub-membership.mjs +1 -1
- package/src/hud.mjs +14 -14
- package/src/index-file.mjs +2 -2
- package/src/init.mjs +24 -24
- package/src/install.mjs +4 -4
- package/src/journal.mjs +40 -7
- package/src/lifecycle.mjs +17 -17
- package/src/lint.mjs +1 -1
- package/src/migrate-prompts.mjs +1 -1
- package/src/migrate-template.mjs +2 -2
- package/src/migrate.mjs +1 -1
- package/src/misuse-read.mjs +4 -5
- package/src/modules.mjs +3 -3
- package/src/new.mjs +11 -11
- package/src/output-identity.mjs +7 -2
- package/src/pickup-card.mjs +2 -2
- package/src/pickup.mjs +2 -2
- package/src/prompts.mjs +12 -12
- package/src/query.mjs +9 -9
- package/src/rename.mjs +2 -2
- package/src/render.mjs +20 -20
- package/src/roadmap.mjs +5 -5
- package/src/runlist.mjs +11 -11
- package/src/ship.mjs +2 -2
- package/src/skill-drift.mjs +19 -6
- package/src/statuses.mjs +16 -16
- package/src/summary.mjs +1 -1
- package/src/surfaces.mjs +1 -1
- package/src/sync-status.mjs +4 -4
- package/src/update.mjs +11 -11
- package/src/validate.mjs +9 -9
- 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 \`
|
|
35
|
+
die(`Unknown command: ${command}\n\nDid you mean \`runlist ${matches[0].cmd}\`?`);
|
|
36
36
|
}
|
|
37
|
-
die(`Unknown command: ${command}\n\nRun \`
|
|
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
|
|
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: `
|
|
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
|
-
|
|
118
|
-
|
|
119
|
-
|
|
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: `
|
|
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":"
|
|
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 \`
|
|
133
|
-
read-prompt warn Read tool on a saved prompt (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 \`
|
|
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
|
|
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 \`
|
|
142
|
-
rule trips ≥3× in 7 days in a repo, \`
|
|
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: `
|
|
145
|
+
install: `runlist install [<host>] — install runlist's integration into an agent host
|
|
146
146
|
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
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
|
-
\`
|
|
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
|
-
|
|
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
|
-
|
|
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 \`
|
|
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 \`
|
|
183
|
-
\`
|
|
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: \`
|
|
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: `
|
|
189
|
+
update: `runlist update — update the runlist CLI and the Claude Code plugin together
|
|
190
190
|
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
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 \`
|
|
203
|
+
marketplace re-added before the update (see \`runlist install claude\`).`,
|
|
204
204
|
|
|
205
|
-
misuse: `
|
|
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
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
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 \`
|
|
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': `
|
|
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 \`
|
|
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 \`
|
|
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:
|
|
300
|
+
--help, -h Show help (per-command: runlist <cmd> --help)
|
|
300
301
|
--version, -v Show version`,
|
|
301
302
|
|
|
302
|
-
list: `
|
|
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
|
|
307
|
+
--json Output full index as JSON (same as runlist json)`,
|
|
307
308
|
|
|
308
|
-
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': `
|
|
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 \`
|
|
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
|
-
\`
|
|
327
|
+
\`runlist use <file>\` marks it in-session and prints the plan.
|
|
327
328
|
|
|
328
329
|
active Ready to be worked on.
|
|
329
|
-
\`
|
|
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 \`
|
|
354
|
-
in-session → active \`
|
|
355
|
-
in-session → partial \`
|
|
356
|
-
in-session → awaiting \`
|
|
357
|
-
any → archived \`
|
|
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
|
-
\`
|
|
376
|
-
\`
|
|
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
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
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 \`
|
|
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: `
|
|
400
|
+
completions: `runlist completions <bash|zsh> — output shell completion script
|
|
400
401
|
|
|
401
402
|
Add to your shell config:
|
|
402
|
-
bash: eval "$(
|
|
403
|
-
zsh: eval "$(
|
|
403
|
+
bash: eval "$(runlist completions bash)"
|
|
404
|
+
zsh: eval "$(runlist completions zsh)"`,
|
|
404
405
|
|
|
405
|
-
journal: `
|
|
406
|
+
journal: `runlist journal — view opt-in command-usage journal
|
|
406
407
|
|
|
407
|
-
|
|
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 .
|
|
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
|
|
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 .
|
|
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
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
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: `
|
|
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: `
|
|
467
|
+
grep: `runlist grep <term> — keyword search across frontmatter AND document bodies
|
|
467
468
|
|
|
468
|
-
Alias for \`
|
|
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
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
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: `
|
|
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,
|
|
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
|
|
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: `
|
|
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 .
|
|
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 \`
|
|
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 \`
|
|
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
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
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 \`
|
|
540
|
+
To open a plan (mark in-session AND print its body), use \`runlist use <file>\`.`,
|
|
540
541
|
|
|
541
|
-
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 \`
|
|
550
|
-
--show-files Append \`files: …\` line to stderr (see \`
|
|
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 \`
|
|
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: `
|
|
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 \`
|
|
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: `
|
|
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 \`
|
|
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 \`
|
|
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: `
|
|
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: `
|
|
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: `
|
|
636
|
+
hud: `runlist hud — actionable triage for session start
|
|
636
637
|
|
|
637
|
-
Prints the
|
|
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 \`
|
|
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
|
-
\`
|
|
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": "
|
|
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: `
|
|
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: `
|
|
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': `
|
|
678
|
+
'agent-context': `runlist agent-context — compact bounded JSON for agents
|
|
678
679
|
|
|
679
|
-
Equivalent to \`
|
|
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: `
|
|
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: `
|
|
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: `
|
|
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: `
|
|
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: `
|
|
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: `
|
|
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
|
|
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: `
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
-
\`
|
|
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': `
|
|
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
|
-
|
|
862
|
-
|
|
863
|
-
|
|
864
|
-
|
|
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). \`
|
|
870
|
-
marked drift: the marker is the author saying
|
|
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
|
-
\`
|
|
874
|
-
are not findings. Not to be confused with \`
|
|
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': `
|
|
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
|
-
|
|
888
|
-
|
|
889
|
-
|
|
890
|
-
|
|
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': `
|
|
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: `
|
|
901
|
-
|
|
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: `
|
|
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: `
|
|
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 |
|
|
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
|
-
|
|
948
|
-
|
|
949
|
-
cat /tmp/draft.md |
|
|
950
|
-
|
|
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
|
-
|
|
955
|
-
|
|
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
|
-
|
|
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 \`
|
|
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
|
-
\`
|
|
976
|
+
\`runlist roadmap\`. Wire child runlists via \`related_plans:\`.
|
|
976
977
|
(\`--runlist\`, \`--coordination\`, \`--roadmap\` are mutually exclusive.)
|
|
977
978
|
|
|
978
|
-
|
|
979
|
-
|
|
980
|
-
|
|
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
|
-
|
|
994
|
-
|
|
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 \`
|
|
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: `
|
|
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
|
-
|
|
1020
|
-
|
|
1021
|
-
|
|
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: `
|
|
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: `
|
|
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: `
|
|
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: `
|
|
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: `
|
|
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: `
|
|
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
|
-
|
|
1093
|
-
|
|
1094
|
-
|
|
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: `
|
|
1099
|
+
init: `runlist init — create starter config and docs directory
|
|
1099
1100
|
|
|
1100
|
-
Creates
|
|
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: `
|
|
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 \`
|
|
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
|
-
|
|
1118
|
-
|
|
1119
|
-
|
|
1120
|
-
|
|
1121
|
-
|
|
1122
|
-
|
|
1123
|
-
|
|
1124
|
-
|
|
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: `
|
|
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
|
-
\`
|
|
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
|
-
\`
|
|
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 \`
|
|
1154
|
-
\`next\`, or top-level \`
|
|
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
|
-
|
|
1161
|
-
|
|
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
|
-
|
|
1165
|
-
|
|
1166
|
-
|
|
1167
|
-
|
|
1168
|
-
claude "$(
|
|
1169
|
-
claude "$(
|
|
1170
|
-
claude "$(
|
|
1171
|
-
claude "$(
|
|
1172
|
-
|
|
1173
|
-
|
|
1174
|
-
|
|
1175
|
-
|
|
1176
|
-
|
|
1177
|
-
|
|
1178
|
-
|
|
1179
|
-
|
|
1180
|
-
|
|
1181
|
-
|
|
1182
|
-
baton: `
|
|
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 \`
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
1220
|
-
|
|
1221
|
-
cat /tmp/draft.md |
|
|
1222
|
-
|
|
1223
|
-
|
|
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: `
|
|
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
|
-
|
|
1235
|
+
runlist stale --group module Stale plans grouped by module (triage view)`,
|
|
1235
1236
|
|
|
1236
|
-
actionable: `
|
|
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: `
|
|
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: `
|
|
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: `
|
|
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: `
|
|
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 \`
|
|
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
|
-
|
|
1318
|
-
|
|
1319
|
-
|
|
1320
|
-
|
|
1321
|
-
|
|
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: `
|
|
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: `
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
1374
|
-
|
|
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 — \`
|
|
1398
|
+
Child plans should set \`parent_plan:\` back at the hub — \`runlist check\` warns
|
|
1398
1399
|
when they don't.
|
|
1399
1400
|
|
|
1400
|
-
In \`
|
|
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 \`
|
|
1409
|
-
and out of the active count. \`
|
|
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: `
|
|
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 \`
|
|
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
|
-
|
|
1427
|
-
|
|
1428
|
-
|
|
1429
|
-
|
|
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': `
|
|
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 \`
|
|
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(`${
|
|
1587
|
-
if (HELP[topic]) { process.stdout.write(`${
|
|
1588
|
-
process.stderr.write(`Unknown help topic: ${topic}\n\nAvailable topics: all, statuses\nPer-command help:
|
|
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(`${
|
|
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(`${
|
|
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
|
|
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(`\`
|
|
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('`
|
|
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. `
|
|
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('`
|
|
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
|
|
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:
|
|
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);
|