runlist 0.99.2 → 0.100.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/GETTING_STARTED.md +249 -0
- package/README.md +414 -46
- package/bin/runlist.mjs +402 -51
- package/package.json +3 -1
- package/plugins/runlist-codex/.codex-plugin/plugin.json +1 -1
- package/plugins/runlist-codex/bin/consume-prompt.mjs +45 -0
- package/plugins/runlist-codex/bin/runlist-hook +29 -11
- package/plugins/runlist-codex/bin/session-start.mjs +16 -0
- package/plugins/runlist-codex/bin/subagent-start.mjs +16 -0
- package/plugins/runlist-codex/hooks/hooks.json +11 -0
- package/plugins/runlist-codex/skills/runlist/SKILL.md +27 -11
- package/plugins/runlist-codex/skills/runlist-setup/SKILL.md +109 -0
- package/runlist.config.example.mjs +6 -0
- package/src/agent-context.mjs +8 -2
- package/src/agent-hosts.mjs +305 -0
- package/src/app-create.mjs +11 -1
- package/src/atomic-mutation.mjs +140 -35
- package/src/baton.mjs +127 -33
- package/src/codex-integration.mjs +57 -7
- package/src/commands.mjs +92 -38
- package/src/config-command.mjs +115 -0
- package/src/config-setting.mjs +163 -0
- package/src/config.mjs +57 -12
- package/src/doctor-hosts.mjs +192 -0
- package/src/doctor.mjs +16 -6
- package/src/export.mjs +11 -0
- package/src/git.mjs +58 -2
- package/src/guard.mjs +41 -13
- package/src/handoff-record.mjs +290 -30
- package/src/handoffs-help.mjs +143 -0
- package/src/handoffs-mode.mjs +486 -0
- package/src/handoffs-scope.mjs +98 -0
- package/src/help.mjs +72 -0
- package/src/host-integration.mjs +7 -1
- package/src/hud.mjs +174 -29
- package/src/index.mjs +11 -4
- package/src/init.mjs +255 -160
- package/src/install.mjs +35 -18
- package/src/installation.mjs +110 -27
- package/src/journal.mjs +2 -2
- package/src/lifecycle.mjs +22 -11
- package/src/managed-path.mjs +68 -4
- package/src/migrate.mjs +7 -0
- package/src/naming.mjs +26 -0
- package/src/new.mjs +202 -91
- package/src/pickup-card.mjs +1 -1
- package/src/plan-changes.mjs +49 -0
- package/src/prompt-handoff.mjs +16 -0
- package/src/prompts.mjs +101 -27
- package/src/rename.mjs +13 -0
- package/src/setup-carry.mjs +291 -0
- package/src/setup-waiting.mjs +20 -0
- package/src/setup-worker.mjs +257 -0
- package/src/setup.mjs +404 -0
- package/src/statuses.mjs +5 -2
- package/src/update.mjs +239 -79
- package/src/use.mjs +4 -2
- package/src/validate.mjs +7 -0
package/README.md
CHANGED
|
@@ -12,12 +12,120 @@ safe to mutate.
|
|
|
12
12
|
- Runtime support for Linux, macOS, and Windows
|
|
13
13
|
- Type-aware lifecycle rules for plans, docs, and saved prompts
|
|
14
14
|
|
|
15
|
+
**New to Runlist? Start with the [beginner setup guide](GETTING_STARTED.md).**
|
|
16
|
+
It covers the terminal, asking an assistant to set up a project, agent plugins,
|
|
17
|
+
and the optional Runlist desktop app.
|
|
18
|
+
|
|
19
|
+
## Handoffs in 3 steps
|
|
20
|
+
|
|
21
|
+
The quickest way to get value from runlist: **save where you are, pick it up in
|
|
22
|
+
a later session.** A saved handoff (runlist calls it a *baton*) is a short
|
|
23
|
+
resume note kept in your project, so the next Claude session starts oriented
|
|
24
|
+
instead of from a blank page. There is no setup step.
|
|
25
|
+
|
|
26
|
+
1. **Install** (once, in a terminal):
|
|
27
|
+
|
|
28
|
+
```bash
|
|
29
|
+
npm install -g runlist
|
|
30
|
+
claude plugin marketplace add reowens/runlist
|
|
31
|
+
claude plugin install runlist@runlist
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
Terminal sessions, Claude Desktop's **Code** tab (local sessions) and VS Code
|
|
35
|
+
read the same plugin settings, so one install covers them all. Start a new
|
|
36
|
+
session afterwards, or run `/reload-plugins` in one that is already open.
|
|
37
|
+
|
|
38
|
+
The `claude` command comes with the Claude Code CLI
|
|
39
|
+
([install it](https://code.claude.com/docs/en/setup)). If it is missing,
|
|
40
|
+
`runlist install claude` prints these same commands and where to get it. In
|
|
41
|
+
Claude Desktop, once the marketplace is registered, the **Code** tab → **+** →
|
|
42
|
+
**Add plugins** browser lists runlist too (not available in cloud or WSL
|
|
43
|
+
sessions).
|
|
44
|
+
2. **Stop with a handoff.** In a Claude Code session in your project's Git
|
|
45
|
+
repository (terminal or Desktop's Code tab), say "baton" or "save where we
|
|
46
|
+
are", or type `/baton`. The first handoff in a project also writes a small
|
|
47
|
+
`runlist.config.mjs` and keeps handoffs in `docs/prompts/`.
|
|
48
|
+
3. **Pick it up next time.** In a new session, type `/pickup` or say "pick up
|
|
49
|
+
where we left off".
|
|
50
|
+
|
|
51
|
+
Planning is optional: when you want plans, docs and an index, run `runlist
|
|
52
|
+
setup` in the project (see the [beginner setup guide](GETTING_STARTED.md)). It
|
|
53
|
+
previews first, and your saved handoffs stay where they are.
|
|
54
|
+
|
|
55
|
+
Outside a Git repository the first handoff refuses, since there is no project
|
|
56
|
+
folder to put its config in (run `git init`, or `runlist setup` to configure
|
|
57
|
+
the folder). It also refuses in a home directory that is itself a repository.
|
|
58
|
+
A project that already has a runlist config works outside Git as before. In a
|
|
59
|
+
handoffs-only project runlist manages only the prompts in `docs/prompts/`: any
|
|
60
|
+
other Markdown there is left alone. Handoffs an older runlist saved in a root
|
|
61
|
+
`prompts/` folder move to `docs/prompts/` with the first handoff (it prints one
|
|
62
|
+
line saying so; `--dry-run` lists the moves), and anything else in `prompts/`
|
|
63
|
+
stays where it is.
|
|
64
|
+
|
|
65
|
+
### What baton-only mode does and doesn't do
|
|
66
|
+
|
|
67
|
+
Until you run `runlist setup`, a project whose config the first handoff wrote
|
|
68
|
+
uses runlist for handoffs only (its config says `mode: 'handoffs'`), and its
|
|
69
|
+
handoffs live in `docs/prompts/`.
|
|
70
|
+
|
|
71
|
+
What works:
|
|
72
|
+
|
|
73
|
+
- Saving: say "baton" or "save where we are", or type `/baton`.
|
|
74
|
+
- Picking up: `/pickup`, or `runlist use [<name>]` in a session, consumes a
|
|
75
|
+
handoff (archives it and prints it).
|
|
76
|
+
- `runlist prompts` lists the saved handoffs; `runlist prompts show <name>`
|
|
77
|
+
reads one without consuming it.
|
|
78
|
+
- `runlist check` checks the saved handoffs.
|
|
79
|
+
|
|
80
|
+
What says planning is off (`Planning is off in this project; runlist setup
|
|
81
|
+
turns it on`):
|
|
82
|
+
|
|
83
|
+
- Plan views such as `runlist plans`, `health`, `runlists`, `roadmap`,
|
|
84
|
+
`modules` and `stale` print that line and exit successfully, as an empty
|
|
85
|
+
dashboard would. With `--json` they print `{ "planning": false, … }`.
|
|
86
|
+
- Plan actions such as `runlist new plan`, `new doc`, `runlist runlist next`,
|
|
87
|
+
`roadmap next`, `sync-status` and `bulk-tag` refuse with it.
|
|
88
|
+
- So does a command filtered to a type other than prompts (`--type plan`), and
|
|
89
|
+
a file argument outside the prompt folder (`runlist show docs/plans/x.md`).
|
|
90
|
+
|
|
91
|
+
Other Markdown in the prompt folder is never listed, checked, searched or
|
|
92
|
+
changed. `runlist flag add` still accepts any file in the repository.
|
|
93
|
+
|
|
94
|
+
Plans an older runlist saved before there was a config don't stop the first
|
|
95
|
+
handoff from setting this up: they stay where they are, and the planning-off
|
|
96
|
+
line says how many `runlist setup` will bring in ("2 runlist documents saved
|
|
97
|
+
before setup are waiting for it.").
|
|
98
|
+
|
|
99
|
+
To turn planning on, run `runlist setup` in the project. It widens the
|
|
100
|
+
config's root from `docs/prompts` to `docs` and previews first: the config
|
|
101
|
+
before and after, and how many existing Markdown files under `docs/` planning
|
|
102
|
+
will start checking. Your saved handoffs stay where they are, and plans saved
|
|
103
|
+
before setup in `plans/` move to `docs/plans/`.
|
|
104
|
+
|
|
105
|
+
If a session hook says it found neither `runlist` nor `dotmd` on its PATH, either
|
|
106
|
+
runlist is not installed yet or the app is searching a different PATH than your
|
|
107
|
+
terminal. In a terminal, compare `command -v runlist` and `echo $PATH` with the
|
|
108
|
+
PATH the hook printed (on Windows, `where runlist`). If runlist is installed but
|
|
109
|
+
its folder is missing from the hook's PATH, add that folder, then
|
|
110
|
+
fully quit and reopen Claude Desktop. On macOS and Linux the folder is `npm prefix -g` plus
|
|
111
|
+
`/bin`, and it goes in your shell profile. On Windows it is the `npm prefix -g`
|
|
112
|
+
folder itself, and it goes in your user environment variables, because Claude
|
|
113
|
+
Desktop does not read PowerShell profiles (see Anthropic's
|
|
114
|
+
[Desktop troubleshooting](https://code.claude.com/docs/en/desktop#session-not-finding-installed-tools)).
|
|
115
|
+
|
|
116
|
+
This quick path uses Claude Code (the Code tab in Claude Desktop, or a terminal)
|
|
117
|
+
running on your own machine, because that is where the plugin's hooks and the
|
|
118
|
+
local `runlist` command live. For what Chat, Cowork, Codex and remote sessions
|
|
119
|
+
can run, see [Which assistant can run setup?](#which-assistant-can-run-setup).
|
|
120
|
+
The separate Runlist desktop app is optional and comes after this path:
|
|
121
|
+
`runlist desktop install` on a supported Mac.
|
|
122
|
+
|
|
15
123
|
## Install
|
|
16
124
|
|
|
17
125
|
```bash
|
|
18
|
-
npm install -g runlist # global CLI
|
|
126
|
+
npm install -g runlist # global CLI; choose agent integration separately
|
|
19
127
|
npm install -D runlist # project scripts via node_modules/.bin
|
|
20
|
-
npx runlist
|
|
128
|
+
npx runlist setup # guided project setup without a permanent CLI install
|
|
21
129
|
```
|
|
22
130
|
|
|
23
131
|
`runlist` is the canonical executable, `rl` is its short convenience alias, and
|
|
@@ -26,37 +134,8 @@ same CLI. The npm package is `runlist`; existing `dotmd-cli` installs should be
|
|
|
26
134
|
replaced with `runlist`. The Claude Code plugin is `runlist@runlist`. Legacy
|
|
27
135
|
`dotmd.config.*` files, `DOTMD_*` variables and `.dotmd/` state keep working.
|
|
28
136
|
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
```bash
|
|
32
|
-
npm link --ignore-scripts
|
|
33
|
-
npm ls -g --depth=0 runlist # shows the checkout path when linked
|
|
34
|
-
```
|
|
35
|
-
|
|
36
|
-
Now `rl`, `runlist`, and `dotmd` run directly from that checkout wherever this
|
|
37
|
-
Node installation is selected; source edits take effect immediately. npm globals
|
|
38
|
-
and links belong to each Node installation. If entering a repo switches Node
|
|
39
|
-
through NVM, link the checkout using that Node's npm too. Check
|
|
40
|
-
`command -v rl` and `npm ls -g --depth=0 runlist` inside the target repo.
|
|
41
|
-
A normal `npm install -g runlist` instead
|
|
42
|
-
installs a separate copy of the published package. Merely editing or pulling the
|
|
43
|
-
checkout does not update that copy. The version number alone cannot distinguish
|
|
44
|
-
an unreleased checkout from an installed release.
|
|
45
|
-
|
|
46
|
-
To leave local review and restore a released CLI, run
|
|
47
|
-
`npm install -g runlist@<version>` (replace `<version>` with the release wanted).
|
|
48
|
-
`rl update` also installs the published CLI, replacing the local link. Project
|
|
49
|
-
dependencies installed with `npm install -D` are separate again: project scripts
|
|
50
|
-
and `npx` can resolve those before the global CLI. Linking the CLI does not
|
|
51
|
-
rebuild the desktop app or refresh an agent plugin's installed files.
|
|
52
|
-
|
|
53
|
-
If you installed the old package globally, remove it before installing the new
|
|
54
|
-
one because both packages provide the same executable names:
|
|
55
|
-
|
|
56
|
-
```bash
|
|
57
|
-
npm uninstall -g dotmd-cli
|
|
58
|
-
npm install -g runlist
|
|
59
|
-
```
|
|
137
|
+
Running from a source checkout, or replacing an old `dotmd-cli` install? See
|
|
138
|
+
[Checkout review and migration](#checkout-review-and-migration).
|
|
60
139
|
|
|
61
140
|
The optional desktop app is a separate download with the same Markdown engine; see
|
|
62
141
|
[desktop setup and validation](desktop/README.md). The delivered app includes
|
|
@@ -71,9 +150,9 @@ controls are experimental; live retrieval depends on a compatible external
|
|
|
71
150
|
provider. Local chat and push are deferred.
|
|
72
151
|
|
|
73
152
|
<!-- runlist:release:start -->
|
|
74
|
-
CLI and desktop release version: **0.
|
|
75
|
-
[Mac installer and release notes](https://github.com/reowens/runlist/releases/tag/desktop-v0.
|
|
76
|
-
Normal product releases publish both components
|
|
153
|
+
CLI and desktop release version: **0.100.0**.
|
|
154
|
+
[Mac installer and release notes](https://github.com/reowens/runlist/releases/tag/desktop-v0.100.0).
|
|
155
|
+
Normal product releases publish both components. Local app installation is separate from release acceptance.
|
|
77
156
|
<!-- runlist:release:end -->
|
|
78
157
|
|
|
79
158
|
The desktop app bundles the matching engine and runtime. Publishing a product
|
|
@@ -117,7 +196,7 @@ for checks and evidence. Full-app dialog accessibility remains an open finding;
|
|
|
117
196
|
fresh/minimum-host and controlled whole-app performance qualification remain
|
|
118
197
|
follow-up work.
|
|
119
198
|
|
|
120
|
-
|
|
199
|
+
Optional installed-app diagnostics, separate from release acceptance:
|
|
121
200
|
|
|
122
201
|
```bash
|
|
123
202
|
node desktop/scripts/check-installed.mjs
|
|
@@ -192,10 +271,46 @@ Replacement keeps the previous app as a rollback copy. Add `--dry-run` to previe
|
|
|
192
271
|
an install or launch without network access, file changes or opening the app.
|
|
193
272
|
Use `runlist desktop --app /path/to/application` for a custom installation path.
|
|
194
273
|
|
|
274
|
+
### Checkout review and migration
|
|
275
|
+
|
|
276
|
+
For local CLI review, run this from the source checkout:
|
|
277
|
+
|
|
278
|
+
```bash
|
|
279
|
+
npm link --ignore-scripts
|
|
280
|
+
npm ls -g --depth=0 runlist # shows the checkout path when linked
|
|
281
|
+
```
|
|
282
|
+
|
|
283
|
+
Now `rl`, `runlist`, and `dotmd` run directly from that checkout wherever this
|
|
284
|
+
Node installation is selected; source edits take effect immediately. npm globals
|
|
285
|
+
and links belong to each Node installation. If entering a repo switches Node
|
|
286
|
+
through NVM, link the checkout using that Node's npm too. Check
|
|
287
|
+
`command -v rl` and `npm ls -g --depth=0 runlist` inside the target repo.
|
|
288
|
+
A normal `npm install -g runlist` instead
|
|
289
|
+
installs a separate copy of the published package. Merely editing or pulling the
|
|
290
|
+
checkout does not update that copy. The version number alone cannot distinguish
|
|
291
|
+
an unreleased checkout from an installed release.
|
|
292
|
+
|
|
293
|
+
To leave local review and restore a released CLI, run
|
|
294
|
+
`npm install -g runlist@<version>` (replace `<version>` with the release wanted).
|
|
295
|
+
`rl update` also installs the published CLI, replacing the local link. Project
|
|
296
|
+
dependencies installed with `npm install -D` are separate again: project scripts
|
|
297
|
+
and `npx` can resolve those before the global CLI. Linking the CLI does not
|
|
298
|
+
rebuild the desktop app or refresh an agent plugin's installed files.
|
|
299
|
+
|
|
300
|
+
If you installed the old package globally, remove it before installing the new
|
|
301
|
+
one because both packages provide the same executable names:
|
|
302
|
+
|
|
303
|
+
```bash
|
|
304
|
+
npm uninstall -g dotmd-cli
|
|
305
|
+
npm install -g runlist
|
|
306
|
+
```
|
|
307
|
+
|
|
195
308
|
### Agent host setup
|
|
196
309
|
|
|
197
|
-
|
|
198
|
-
|
|
310
|
+
For project onboarding, start with [`runlist setup`](#quick-start). It preserves
|
|
311
|
+
existing configuration and installs a host integration only when selected.
|
|
312
|
+
The CLI alone does not load the workflow skill or hooks into your assistant.
|
|
313
|
+
You can also inspect or install an integration separately:
|
|
199
314
|
|
|
200
315
|
```bash
|
|
201
316
|
runlist install # what's installed for each host
|
|
@@ -209,6 +324,51 @@ The integrations are one-time and global. Codex exports `CODEX_THREAD_ID` to
|
|
|
209
324
|
every tool shell, so its identity works without the plugin; the plugin adds a
|
|
210
325
|
workflow skill, session orientation, and the tool guard.
|
|
211
326
|
|
|
327
|
+
The Claude Code and Codex plugins include a discoverable **runlist-setup** skill
|
|
328
|
+
for requests such as “Claude, help me set up Runlist in this project,” including
|
|
329
|
+
projects with no Runlist config yet. The ordinary **runlist** skill handles the
|
|
330
|
+
ongoing plan/doc/prompt workflow. The setup skill is available only after its
|
|
331
|
+
plugin is installed and loaded; typing its name in an assistant without that
|
|
332
|
+
plugin does not install it. Use the terminal bootstrap below first.
|
|
333
|
+
Host hooks need a persistent `runlist` executable on that host's `PATH`; an
|
|
334
|
+
ephemeral `npx` run alone does not provide it.
|
|
335
|
+
|
|
336
|
+
### Which assistant can run setup?
|
|
337
|
+
|
|
338
|
+
Use a shell in the checkout you want to configure. These surfaces have different
|
|
339
|
+
execution environments:
|
|
340
|
+
|
|
341
|
+
- **Claude Code (the working path in Claude Desktop):** open the **Code** tab, or
|
|
342
|
+
use a terminal session, with the intended checkout selected. A local Code
|
|
343
|
+
session reads the same plugin settings as the terminal, and hooks fire there.
|
|
344
|
+
Install the plugin with the [three-step quick path](#handoffs-in-3-steps) and
|
|
345
|
+
start a new session. Desktop Code also supports cloud and SSH environments; those
|
|
346
|
+
execute elsewhere. See
|
|
347
|
+
[Claude Code desktop environments](https://code.claude.com/docs/en/desktop).
|
|
348
|
+
Install and verify the plugin in that environment; follow the host's
|
|
349
|
+
[plugin activation or reload result](https://code.claude.com/docs/en/discover-plugins).
|
|
350
|
+
- **Claude Desktop Chat:** a conversation alone does not provide Runlist's CLI
|
|
351
|
+
or the Runlist Claude Code plugin. An assistant without a suitable shell can
|
|
352
|
+
give you the terminal commands below, but cannot report them as executed.
|
|
353
|
+
Desktop extensions and connectors are separate integrations; this plugin
|
|
354
|
+
supplies no Desktop Chat execution bridge. See Anthropic's
|
|
355
|
+
[connector and desktop-extension guidance](https://support.claude.com/en/articles/11725091-when-to-use-desktop-and-web-connectors).
|
|
356
|
+
- **Claude Cowork:** verify the actual workspace and shell first. Current
|
|
357
|
+
sessions run in the cloud by default; legacy local sessions execute code in
|
|
358
|
+
an isolated VM. Connected local-folder access does not establish that shell
|
|
359
|
+
commands run on your Mac or PC. See the official
|
|
360
|
+
[Cowork architecture](https://support.claude.com/en/articles/14479288-claude-cowork-architecture-overview).
|
|
361
|
+
- **Codex:** Local and Worktree sessions use your computer; Cloud uses a remote
|
|
362
|
+
workspace. Choose the intended project and execution mode before setup. See
|
|
363
|
+
the official [Codex environments documentation](https://learn.chatgpt.com/docs/environments/modes).
|
|
364
|
+
|
|
365
|
+
A successful `npm install` in a cloud, SSH, container, or Cowork shell installs
|
|
366
|
+
into that environment's npm scope. It does not prove that your local computer's
|
|
367
|
+
CLI, host plugin, or GUI was installed. Report the paths actually changed.
|
|
368
|
+
With no shell or checkout access, run the bootstrap in a local terminal yourself.
|
|
369
|
+
The optional [Runlist desktop GUI](#optional-desktop-gui) is installed separately
|
|
370
|
+
with `runlist desktop install` on supported Macs; `setup` never downloads it.
|
|
371
|
+
|
|
212
372
|
### Codex Plugin
|
|
213
373
|
|
|
214
374
|
`runlist install codex` copies the plugin included in the npm package into the
|
|
@@ -294,17 +454,208 @@ if an installed host fails to update. Uninstalled hosts are not added.
|
|
|
294
454
|
Restart the affected host sessions to load updated integrations; Claude Code also
|
|
295
455
|
supports `/reload-plugins`.
|
|
296
456
|
|
|
457
|
+
## Host health and selected repairs
|
|
458
|
+
|
|
459
|
+
Inspect Claude, Codex and OpenCode together before choosing a repair:
|
|
460
|
+
|
|
461
|
+
```bash
|
|
462
|
+
runlist doctor --hosts
|
|
463
|
+
runlist doctor --hosts --json
|
|
464
|
+
runlist update --check --json
|
|
465
|
+
```
|
|
466
|
+
|
|
467
|
+
These reports are offline: they read executable paths, registries and managed
|
|
468
|
+
assets without running host programs or importing the project's JavaScript
|
|
469
|
+
config. They work before project initialization and with a broken project config.
|
|
470
|
+
The report includes the CLI launcher, Node/npm scope, Claude profiles and shared
|
|
471
|
+
plugin stores, installed/catalog versions, source comparisons and reload steps.
|
|
472
|
+
Newer published versions are not queried by an offline check; it compares the
|
|
473
|
+
local files and saved catalogs. An online `runlist update` refreshes catalogs.
|
|
474
|
+
|
|
475
|
+
`missing`, `stale`, `foreign`, `current` and `unknown` are distinct. `current`
|
|
476
|
+
describes the reported files or catalog comparison; installed and loaded states
|
|
477
|
+
remain separate. Cached files never establish that a running session loaded the
|
|
478
|
+
skill or trusted its hooks. A local checkout can contain unreleased assets while
|
|
479
|
+
the published Claude catalog and installed plugin still match.
|
|
480
|
+
|
|
481
|
+
Host repairs are selected explicitly and previewed by default:
|
|
482
|
+
|
|
483
|
+
```bash
|
|
484
|
+
runlist doctor --hosts --repair codex
|
|
485
|
+
runlist doctor --hosts --repair codex --apply --dry-run
|
|
486
|
+
runlist doctor --hosts --repair codex --apply
|
|
487
|
+
```
|
|
488
|
+
|
|
489
|
+
Repeat `--repair` to select several hosts. In host mode, `--apply` requires named
|
|
490
|
+
repair targets; `--dry-run` always prevents execution. A selected repair can
|
|
491
|
+
install a missing integration or refresh managed content. Foreign/unreadable
|
|
492
|
+
content is preserved, independent host failures are reported separately, and
|
|
493
|
+
remaining source/activation checks stay visible. Host application upgrades
|
|
494
|
+
remain with each host's installer.
|
|
495
|
+
Already-current Claude/OpenCode files need no repair. Codex may still require
|
|
496
|
+
an installed-copy check even when its marketplace source is current. Blocked
|
|
497
|
+
repairs offer a safe preview or manual next step instead of an apply command
|
|
498
|
+
that would repeat the refusal. Saved enablement and live activation stay separate.
|
|
499
|
+
|
|
500
|
+
When Claude has multiple binaries or profiles, use the native binary shown in
|
|
501
|
+
the inventory and explicit absolute profile paths. Replace these placeholders
|
|
502
|
+
with the paths from your report:
|
|
503
|
+
|
|
504
|
+
```bash
|
|
505
|
+
runlist doctor --hosts --repair claude \
|
|
506
|
+
--claude-config /absolute/profile --claude-bin /absolute/native/claude
|
|
507
|
+
runlist doctor --hosts --repair claude \
|
|
508
|
+
--claude-config /absolute/profile --claude-bin /absolute/native/claude --apply
|
|
509
|
+
runlist update --host claude \
|
|
510
|
+
--claude-config /absolute/profile --claude-bin /absolute/native/claude --dry-run
|
|
511
|
+
```
|
|
512
|
+
|
|
513
|
+
Repeat `--claude-config` for separate profiles. Shared physical plugin stores are
|
|
514
|
+
updated once, while each profile's enabled settings and each saved scope remain
|
|
515
|
+
visible. A wrapper can override `CLAUDE_CONFIG_DIR`; Runlist refuses ambiguous
|
|
516
|
+
targeting and asks for an explicit native binary. It does not infer an account
|
|
517
|
+
from the wrapper's filename or script contents.
|
|
518
|
+
|
|
519
|
+
`runlist update --host claude|codex|opencode` restricts the update to that installed
|
|
520
|
+
host integration and conflicts with `--cli-only`. Missing integrations remain
|
|
521
|
+
missing during update. Without a host selector, update retains its CLI and
|
|
522
|
+
installed-host workflow, refreshing official Claude catalogs before scoped
|
|
523
|
+
updates and checking managed asset contents even when versions match. The npm
|
|
524
|
+
scope and effects on local CLI links are reported; checkout sources and project
|
|
525
|
+
dependencies are preserved. Reload/restart the affected hosts and review their
|
|
526
|
+
hook trust settings after repairs or updates.
|
|
527
|
+
|
|
297
528
|
## Quick Start
|
|
298
529
|
|
|
530
|
+
From a terminal in your project, install the CLI using one of the scopes above,
|
|
531
|
+
then start guided setup:
|
|
532
|
+
|
|
533
|
+
```bash
|
|
534
|
+
cd /path/to/your/project
|
|
535
|
+
runlist setup # terminal: collect choices, preview, confirm
|
|
536
|
+
# Or bootstrap without a permanent CLI install:
|
|
537
|
+
npx runlist setup
|
|
538
|
+
```
|
|
539
|
+
|
|
540
|
+
An interactive terminal without `--yes`, `--json`, or `--dry-run` collects missing choices and asks you to
|
|
541
|
+
confirm the concrete preview. In a noninteractive shell, omitting `--yes` prints
|
|
542
|
+
a preview, writes nothing, and does not wait for input. `--dry-run` always
|
|
543
|
+
previews, even with `--yes`; `--json` requests a machine-readable report.
|
|
544
|
+
|
|
545
|
+
For deterministic setup, preview explicit options and then apply those same
|
|
546
|
+
options with `--yes`. This example chooses a relative docs root in a new project,
|
|
547
|
+
leaves prompts untracked, and installs no host integration:
|
|
548
|
+
|
|
549
|
+
```bash
|
|
550
|
+
runlist setup --docs-root docs --prompt-tracking untracked --host none --dry-run --json
|
|
551
|
+
runlist setup --docs-root docs --prompt-tracking untracked --host none --yes --json
|
|
552
|
+
```
|
|
553
|
+
|
|
554
|
+
`--yes` applies explicit options and defaults without asking more questions.
|
|
555
|
+
Fresh projects default to `docs/`, prompt tracking `untracked`, no ignore-file
|
|
556
|
+
edits, no host install, no first plan, and no document adoption. Existing config,
|
|
557
|
+
roots, JavaScript functions, and hooks are preserved; an existing prompt policy
|
|
558
|
+
is retained unless you explicitly select another. Changing an existing root
|
|
559
|
+
with `--docs-root` is refused with manual configuration guidance. Review and edit
|
|
560
|
+
that project's root export and dependent paths yourself; setup is not a generic
|
|
561
|
+
JavaScript config editor and does not move documents.
|
|
562
|
+
|
|
563
|
+
To include existing Markdown, select each file explicitly. For example, if
|
|
564
|
+
these two files exist inside your configured docs root:
|
|
565
|
+
|
|
566
|
+
```bash
|
|
567
|
+
runlist setup --adopt docs/notes/design.md --adopt docs/notes/constraints.md --dry-run
|
|
568
|
+
runlist setup --adopt docs/notes/design.md --adopt docs/notes/constraints.md --yes
|
|
569
|
+
```
|
|
570
|
+
|
|
571
|
+
Only the selected paths are considered for adoption. Review the proposed
|
|
572
|
+
frontmatter changes; setup never blanket-tags your existing docs. Other
|
|
573
|
+
untagged docs remain outstanding and may still appear in validation findings.
|
|
574
|
+
An `attention` result means setup applied the selected changes and project
|
|
575
|
+
validation still needs attention; it exits with status 1. Inspect the report's
|
|
576
|
+
completed actions and validation findings before retrying.
|
|
577
|
+
|
|
578
|
+
Optional choices can be combined in the same preview/apply pair:
|
|
579
|
+
|
|
580
|
+
- `--gitignore` explicitly requests missing ignore rules. Without it, ignore
|
|
581
|
+
files are untouched. Selecting `tracked` does not remove existing ignore rules.
|
|
582
|
+
- `--host claude`, `--host codex`, or `--host opencode` selects the existing
|
|
583
|
+
`runlist install` integration. The default is `--host none`. Host installation
|
|
584
|
+
requires apply; a preview does not install anything. Check which host executable
|
|
585
|
+
your shell resolves before applying, particularly with multiple Claude installs:
|
|
586
|
+
in Bash/Zsh use `type -a runlist rl node npm claude` (PowerShell:
|
|
587
|
+
`Get-Command runlist,rl,node,npm,claude -All`). Setup does not install or update
|
|
588
|
+
the agent host itself.
|
|
589
|
+
- `--first-plan <slug>` also requires `--current-state <text>` and
|
|
590
|
+
`--next-step <text>`. Supply your actual state and immediate action; do not use
|
|
591
|
+
invented progress or placeholders. `current_state` is capped at 1,500 characters
|
|
592
|
+
and `next_step` at 800; longer details belong in the plan body. For example,
|
|
593
|
+
after replacing these illustrative values with your own:
|
|
594
|
+
|
|
595
|
+
```bash
|
|
596
|
+
runlist setup --first-plan auth-refresh \
|
|
597
|
+
--current-state "The existing login flow has no retry path." \
|
|
598
|
+
--next-step "Reproduce a failed login and record the expected retry behavior." \
|
|
599
|
+
--dry-run
|
|
600
|
+
```
|
|
601
|
+
|
|
602
|
+
Read setup's **completed**, **outstanding**, and **failed** results separately;
|
|
603
|
+
**notes** (JSON `notes`) is information, not remaining work.
|
|
604
|
+
Configuration written successfully does not mean every document passed checks
|
|
605
|
+
or that a running host loaded its plugin. Unselected untagged documents,
|
|
606
|
+
unavailable host tools, and required host reloads must remain visible. Address
|
|
607
|
+
the named failure, inspect what already completed, then preview a retry; do not
|
|
608
|
+
silence validation to make onboarding look complete. Use the existing commands
|
|
609
|
+
for follow-up inspection:
|
|
610
|
+
|
|
299
611
|
```bash
|
|
300
|
-
runlist init # create config, docs/, and the generated index
|
|
301
|
-
runlist new plan auth-refresh # scaffold a typed document
|
|
302
612
|
runlist plans # compact live plan dashboard
|
|
303
|
-
runlist
|
|
304
|
-
runlist
|
|
305
|
-
runlist doctor
|
|
613
|
+
runlist check # schema, references, and lifecycle findings
|
|
614
|
+
runlist doctor # preview repairs; add --apply only for chosen repairs
|
|
615
|
+
runlist doctor --session # identity in this shell, not proof of host activation
|
|
306
616
|
```
|
|
307
617
|
|
|
618
|
+
After a host install, follow its activation/trust instructions and verify the
|
|
619
|
+
skill and hooks in that host. Restart the session or reload plugins where
|
|
620
|
+
required; setup cannot certify a future session. For lower-level initialization
|
|
621
|
+
without onboarding, `runlist init` remains available.
|
|
622
|
+
|
|
623
|
+
New projects recommend leaving pending prompts untracked to reduce commit churn.
|
|
624
|
+
`runlist init` leaves `.gitignore` and other ignore files untouched by default.
|
|
625
|
+
Untracked does not mean ignored: `git add -A` can include these files. Inspect or
|
|
626
|
+
explicitly choose the policy in the CLI:
|
|
627
|
+
|
|
628
|
+
```bash
|
|
629
|
+
runlist config show
|
|
630
|
+
runlist config get promptTracking --json
|
|
631
|
+
runlist config get promptDirectory --json
|
|
632
|
+
runlist config set promptTracking tracked --dry-run
|
|
633
|
+
runlist config set promptTracking tracked
|
|
634
|
+
```
|
|
635
|
+
|
|
636
|
+
`untracked` warns when agents include pending prompts in Git operations;
|
|
637
|
+
`tracked` allows them; `local` denies them. Existing configs without a choice
|
|
638
|
+
keep `local` behavior until an explicit selection. Policy changes preserve the
|
|
639
|
+
prompt location and existing files and never stage, untrack, move or delete them.
|
|
640
|
+
They never change ignore files. To explicitly add ignore rules during setup,
|
|
641
|
+
preview `runlist init --gitignore --dry-run`, then run `runlist init --gitignore`.
|
|
642
|
+
This adds missing runtime-state rules and, unless `tracked` is selected, prompt
|
|
643
|
+
rules; it preserves unrelated rules. Selecting `tracked` does not remove rules
|
|
644
|
+
that already ignore prompts.
|
|
645
|
+
|
|
646
|
+
Runtime state in `.runlist/`, such as the parse cache, also remains unignored by
|
|
647
|
+
default and can be staged by `git add -A`. Review the selected files before
|
|
648
|
+
committing. The explicit ignore option covers `.runlist/` and `.dotmd/` (the
|
|
649
|
+
legacy state directory, still readable for compatibility).
|
|
650
|
+
|
|
651
|
+
`config show` also reports `root`, resolved `docsRoots`, `index.path`,
|
|
652
|
+
`archiveDir`, and the resolved `promptDirectory`. Sources distinguish configured
|
|
653
|
+
values, defaults, the legacy `readme` index alias, and derived paths. Only
|
|
654
|
+
`promptTracking` supports CLI writes; other keys return specific manual-edit
|
|
655
|
+
guidance. These commands import the trusted project's JavaScript config but do
|
|
656
|
+
not invoke document hooks. The GUI uses the same project configuration; it is
|
|
657
|
+
not required to inspect or choose prompt policy.
|
|
658
|
+
|
|
308
659
|
`runlist plans` is the compact orientation view. `runlist briefing` lists live
|
|
309
660
|
plans with next steps and grows with the corpus. `runlist context` is the fuller
|
|
310
661
|
human/LLM briefing, while `runlist agent-context` emits bounded structured JSON for
|
|
@@ -800,7 +1151,7 @@ from `runlist.config.mjs` and return an argv array such as
|
|
|
800
1151
|
`['just', 'commit', message, ...paths]`. Baton quotes the printed command and
|
|
801
1152
|
excludes session prompts from `paths`.
|
|
802
1153
|
|
|
803
|
-
Saved prompts are
|
|
1154
|
+
Saved prompts are handoff artifacts with a project-selected Git policy (see `runlist config get promptTracking`). Consume them with `runlist use`; inspect
|
|
804
1155
|
without consuming via `runlist prompts show`. Consuming a baton prompt also claims
|
|
805
1156
|
its plan; `runlist use --no-claim` reads and archives it without starting the plan.
|
|
806
1157
|
Only an agent session consumes: Claude Code, Codex, OpenCode, or a shell with
|
|
@@ -1214,6 +1565,16 @@ runlist help statuses
|
|
|
1214
1565
|
runlist <command> --help
|
|
1215
1566
|
```
|
|
1216
1567
|
|
|
1568
|
+
For a short recipe for one task, request focused help:
|
|
1569
|
+
|
|
1570
|
+
```bash
|
|
1571
|
+
runlist new plan --help # also: new doc, new prompt
|
|
1572
|
+
runlist prompts show --help # inspect without consuming
|
|
1573
|
+
runlist baton --subagent --help
|
|
1574
|
+
```
|
|
1575
|
+
|
|
1576
|
+
The parent command's help retains the complete options and examples.
|
|
1577
|
+
|
|
1217
1578
|
Shell completion is generated from the same command registry:
|
|
1218
1579
|
|
|
1219
1580
|
```bash
|
|
@@ -1226,11 +1587,18 @@ duplicating the complete command catalog.
|
|
|
1226
1587
|
|
|
1227
1588
|
## Configuration
|
|
1228
1589
|
|
|
1229
|
-
Run `runlist
|
|
1590
|
+
Run `runlist setup` to create `runlist.config.mjs` (a legacy `dotmd.config.mjs` is still read). A minimal typed configuration:
|
|
1591
|
+
|
|
1592
|
+
`runlist config show|get|set` currently supports only `promptTracking`. It reports
|
|
1593
|
+
the effective value, source and config path. Writes accept validated values,
|
|
1594
|
+
preserve unrelated JavaScript and hooks, and refuse symlinks, computed or ambiguous exports
|
|
1595
|
+
with instructions for a manual edit. Other settings are edited in the JavaScript
|
|
1596
|
+
config; the GUI is optional.
|
|
1230
1597
|
|
|
1231
1598
|
```js
|
|
1232
1599
|
export const root = 'docs';
|
|
1233
1600
|
export const archiveDir = 'archived';
|
|
1601
|
+
export const promptTracking = 'untracked';
|
|
1234
1602
|
|
|
1235
1603
|
export const types = {
|
|
1236
1604
|
plan: {
|