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.
Files changed (58) hide show
  1. package/GETTING_STARTED.md +249 -0
  2. package/README.md +414 -46
  3. package/bin/runlist.mjs +402 -51
  4. package/package.json +3 -1
  5. package/plugins/runlist-codex/.codex-plugin/plugin.json +1 -1
  6. package/plugins/runlist-codex/bin/consume-prompt.mjs +45 -0
  7. package/plugins/runlist-codex/bin/runlist-hook +29 -11
  8. package/plugins/runlist-codex/bin/session-start.mjs +16 -0
  9. package/plugins/runlist-codex/bin/subagent-start.mjs +16 -0
  10. package/plugins/runlist-codex/hooks/hooks.json +11 -0
  11. package/plugins/runlist-codex/skills/runlist/SKILL.md +27 -11
  12. package/plugins/runlist-codex/skills/runlist-setup/SKILL.md +109 -0
  13. package/runlist.config.example.mjs +6 -0
  14. package/src/agent-context.mjs +8 -2
  15. package/src/agent-hosts.mjs +305 -0
  16. package/src/app-create.mjs +11 -1
  17. package/src/atomic-mutation.mjs +140 -35
  18. package/src/baton.mjs +127 -33
  19. package/src/codex-integration.mjs +57 -7
  20. package/src/commands.mjs +92 -38
  21. package/src/config-command.mjs +115 -0
  22. package/src/config-setting.mjs +163 -0
  23. package/src/config.mjs +57 -12
  24. package/src/doctor-hosts.mjs +192 -0
  25. package/src/doctor.mjs +16 -6
  26. package/src/export.mjs +11 -0
  27. package/src/git.mjs +58 -2
  28. package/src/guard.mjs +41 -13
  29. package/src/handoff-record.mjs +290 -30
  30. package/src/handoffs-help.mjs +143 -0
  31. package/src/handoffs-mode.mjs +486 -0
  32. package/src/handoffs-scope.mjs +98 -0
  33. package/src/help.mjs +72 -0
  34. package/src/host-integration.mjs +7 -1
  35. package/src/hud.mjs +174 -29
  36. package/src/index.mjs +11 -4
  37. package/src/init.mjs +255 -160
  38. package/src/install.mjs +35 -18
  39. package/src/installation.mjs +110 -27
  40. package/src/journal.mjs +2 -2
  41. package/src/lifecycle.mjs +22 -11
  42. package/src/managed-path.mjs +68 -4
  43. package/src/migrate.mjs +7 -0
  44. package/src/naming.mjs +26 -0
  45. package/src/new.mjs +202 -91
  46. package/src/pickup-card.mjs +1 -1
  47. package/src/plan-changes.mjs +49 -0
  48. package/src/prompt-handoff.mjs +16 -0
  49. package/src/prompts.mjs +101 -27
  50. package/src/rename.mjs +13 -0
  51. package/src/setup-carry.mjs +291 -0
  52. package/src/setup-waiting.mjs +20 -0
  53. package/src/setup-worker.mjs +257 -0
  54. package/src/setup.mjs +404 -0
  55. package/src/statuses.mjs +5 -2
  56. package/src/update.mjs +239 -79
  57. package/src/use.mjs +4 -2
  58. 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 and agent-host hooks
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 init # try it without installing
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
- For local CLI review, run this from the source checkout:
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.99.2**.
75
- [Mac installer and release notes](https://github.com/reowens/runlist/releases/tag/desktop-v0.99.2).
76
- Normal product releases publish both components; an installed Mac app is updated with rollback after it has quit.
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
- Verify an installed Mac app without opening it:
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
- The CLI alone gives an agent no orientation and no session identity. Install the
198
- integration for whichever host you run:
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 briefing # comprehensive active-work view
304
- runlist check # validate schema, references, and lifecycle shape
305
- runlist doctor # preview repairs; add --apply to write
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 local session state. Consume them with `runlist use`; inspect
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 init` to create `runlist.config.mjs` (a legacy `dotmd.config.mjs` is still read). A minimal typed configuration:
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: {