@iowarp/clio-coder 0.4.5 → 0.4.6

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 (188) hide show
  1. package/CHANGELOG.md +24 -0
  2. package/CONTRIBUTING.md +14 -9
  3. package/NOTICE +16 -0
  4. package/README.md +312 -685
  5. package/dist/{acp-H3CU2HBQ.js → acp-UVEVWSDL.js} +6 -6
  6. package/dist/{agents-IXQQZ7BD.js → agents-VWY37DTK.js} +31 -30
  7. package/dist/assets/codewiki.json +1 -1
  8. package/dist/{auth-R7KYF7N3.js → auth-PCV2XQDV.js} +6 -6
  9. package/dist/{builtins-CRFDQUVP.js → builtins-PD652MTK.js} +3 -3
  10. package/dist/{chunk-SDWNDICN.js → chunk-24T2YZ7A.js} +58 -56
  11. package/dist/{chunk-FSTIBAGM.js → chunk-2AKYFREM.js} +7 -7
  12. package/dist/{chunk-SE4ZKILO.js → chunk-3BJGMT2D.js} +30 -9
  13. package/dist/{chunk-GVYWZNRK.js → chunk-3HQVBIKD.js} +2 -2
  14. package/dist/{chunk-EWD5P3GK.js → chunk-3JLFK5MW.js} +4 -4
  15. package/dist/{chunk-O2RQ7LCK.js → chunk-3O2ZAUGQ.js} +2 -2
  16. package/dist/{chunk-GXCCHKN6.js → chunk-3QKXHCGS.js} +4 -4
  17. package/dist/{chunk-YEJIG7LN.js → chunk-3WBALRQH.js} +7 -7
  18. package/dist/{chunk-I7VLWRK2.js → chunk-4DU2TVI4.js} +5 -5
  19. package/dist/{chunk-TEG3RYVZ.js → chunk-4U4TKZFR.js} +3 -3
  20. package/dist/{chunk-EHCPSZJF.js → chunk-4VMV6OS6.js} +2 -2
  21. package/dist/{chunk-T7FDXNRU.js → chunk-536HXRFE.js} +4 -4
  22. package/dist/{chunk-ZMZQEBKI.js → chunk-5QRX7SLS.js} +8 -8
  23. package/dist/{chunk-RXIOCVBZ.js → chunk-6HAO6X5B.js} +4 -4
  24. package/dist/{chunk-HGSLRG33.js → chunk-6OII3LOK.js} +2 -2
  25. package/dist/{chunk-U2JOLB7O.js → chunk-6RYDAVQT.js} +32 -32
  26. package/dist/{chunk-T53XI6I7.js → chunk-6VRRJT7L.js} +2 -2
  27. package/dist/{chunk-RLTT5GVY.js → chunk-7JSSKXG2.js} +4 -4
  28. package/dist/{chunk-633EXGZA.js → chunk-ACCKVSHU.js} +3 -3
  29. package/dist/{chunk-6SYEGZI3.js → chunk-B3MOMLJ4.js} +2 -2
  30. package/dist/{chunk-UXAC2FX4.js → chunk-BLTEAUCB.js} +3 -3
  31. package/dist/{chunk-DRD2A54W.js → chunk-BT7HGDOX.js} +15 -15
  32. package/dist/{chunk-F34AR6O3.js → chunk-DXLUVUD4.js} +5 -5
  33. package/dist/{chunk-HR3HPQ76.js → chunk-E7RF4KBO.js} +2 -2
  34. package/dist/chunk-EM2WNQS2.js +93 -0
  35. package/dist/{chunk-KYKNBD4Y.js → chunk-F5Z7EWMN.js} +953 -233
  36. package/dist/{chunk-VLPTKCKT.js → chunk-GLYBJ4RQ.js} +3 -3
  37. package/dist/{chunk-KDWLXVMN.js → chunk-HPTJF6DG.js} +16 -39
  38. package/dist/{chunk-6CDNRHWH.js → chunk-HZ2T2YED.js} +2 -2
  39. package/dist/{chunk-UTUNT5QL.js → chunk-HZFBVU5X.js} +7 -7
  40. package/dist/{chunk-KF6GFW6O.js → chunk-I2K2NCZQ.js} +7 -7
  41. package/dist/{chunk-5DDOTTG4.js → chunk-IGLVVNEG.js} +2 -2
  42. package/dist/{chunk-4SVIVOMC.js → chunk-IKRWLEDA.js} +5 -5
  43. package/dist/{chunk-R6MAYTMS.js → chunk-JMPL7NUB.js} +3 -3
  44. package/dist/{chunk-5ZMXGW7P.js → chunk-KAFMW7WM.js} +4 -85
  45. package/dist/{chunk-R6MICQYU.js → chunk-LIN2K3EL.js} +4 -4
  46. package/dist/{chunk-QEQISF75.js → chunk-LK2FN5JY.js} +1 -1
  47. package/dist/{chunk-YYB3MC65.js → chunk-N2OKBREN.js} +2 -2
  48. package/dist/{chunk-XXBQKW32.js → chunk-NNWJYUNO.js} +4 -4
  49. package/dist/{chunk-TZ7MFRG4.js → chunk-P5JMBPDJ.js} +22 -20
  50. package/dist/{chunk-WFKDPU7U.js → chunk-P6M7RKMI.js} +2 -2
  51. package/dist/{chunk-MDU3C27C.js → chunk-PZN2LQY6.js} +5 -5
  52. package/dist/{chunk-S32UQ5GL.js → chunk-Q7NNUHQV.js} +15 -15
  53. package/dist/{chunk-U7VQ4NI4.js → chunk-QCOV5DFY.js} +5 -5
  54. package/dist/{chunk-MC3JSVR6.js → chunk-QJMRYTCX.js} +7 -7
  55. package/dist/{chunk-DIMRLNIC.js → chunk-QNWRHOMF.js} +3 -3
  56. package/dist/{chunk-ILJ7DWGE.js → chunk-QXFBABFJ.js} +4 -4
  57. package/dist/chunk-R2CT5YDO.js +66 -0
  58. package/dist/{chunk-E3BQTQUP.js → chunk-RGZNQ5CT.js} +3 -3
  59. package/dist/{chunk-SBZX6ARC.js → chunk-SXQKNKRA.js} +7 -7
  60. package/dist/{chunk-WLMSOT73.js → chunk-TJFDL26W.js} +3 -3
  61. package/dist/{chunk-EQEJJ53P.js → chunk-VAHLPXPY.js} +2 -2
  62. package/dist/{chunk-7TKWWPD7.js → chunk-VANN3GDP.js} +3 -23
  63. package/dist/{chunk-GNQRWTMY.js → chunk-VHMX7SXF.js} +2 -2
  64. package/dist/{chunk-UL36QJX6.js → chunk-WKUYQBCG.js} +6 -6
  65. package/dist/{chunk-FKIOX6DS.js → chunk-WNGF5AJX.js} +9 -4
  66. package/dist/{chunk-ICO4TQ2F.js → chunk-WV6TDAPN.js} +36 -20
  67. package/dist/{chunk-K6RDB7IA.js → chunk-X3BI7HTV.js} +9 -9
  68. package/dist/{chunk-NY6IWDVU.js → chunk-XWMSPJYN.js} +2 -2
  69. package/dist/{chunk-7HBHHVCK.js → chunk-YPRSNUTC.js} +2 -2
  70. package/dist/{chunk-ONRTXOZY.js → chunk-ZS43Y2FT.js} +2 -2
  71. package/dist/cli/index.js +27 -27
  72. package/dist/{clio-5I2IBFYL.js → clio-QQCMTUZE.js} +6 -6
  73. package/dist/{code-nav-YXIAEZVS.js → code-nav-GUPM6766.js} +8 -8
  74. package/dist/{config-Y2JDJ3JJ.js → config-IIM7YOD3.js} +42 -41
  75. package/dist/{configure-SML6UBZ5.js → configure-4ZM5HWJX.js} +28 -10
  76. package/dist/{context-S2EEC3EJ.js → context-44BZLJ3J.js} +12 -12
  77. package/dist/{context-P5YSEO55.js → context-AIDVQKMW.js} +34 -33
  78. package/dist/{context-QQ53HSGJ.js → context-OL5P3HEP.js} +25 -24
  79. package/dist/{context-clear-TMEQCOTH.js → context-clear-OQV76MYP.js} +34 -33
  80. package/dist/{context-working-set-CNLSQN5K.js → context-working-set-ZUW3EGLS.js} +10 -9
  81. package/dist/{detail-5572VLBO.js → detail-UXPWRANG.js} +35 -34
  82. package/dist/{dispatch-runner-FRHD6P2O.js → dispatch-runner-P3ZW6G77.js} +38 -37
  83. package/dist/{doctor-N3LCM2LG.js → doctor-JJVGPZWT.js} +18 -17
  84. package/dist/{eval-BUU3ZOUZ.js → eval-V2RTN3UH.js} +26 -25
  85. package/dist/{evidence-DTGEN456.js → evidence-35PYWGSO.js} +34 -33
  86. package/dist/{evidence-SQ5DNFEN.js → evidence-CIGGKI6J.js} +36 -35
  87. package/dist/{evolve-IJNUFZDS.js → evolve-33SM3NJP.js} +34 -33
  88. package/dist/{fleet-ZNNVSYFO.js → fleet-LFO7SIPC.js} +62 -61
  89. package/dist/{fleet-commands-5YE7NPJL.js → fleet-commands-RLK72GU3.js} +9 -9
  90. package/dist/fleet-decisions-3SBSCTCW.js +1 -1
  91. package/dist/{fleet-graph-6HHPWF5T.js → fleet-graph-JZIBCGMW.js} +11 -11
  92. package/dist/{fleet-inspect-JEYMGCGC.js → fleet-inspect-2L5YGGZJ.js} +35 -34
  93. package/dist/{fleet-validate-4PM4GDDL.js → fleet-validate-LIAVKDUU.js} +12 -12
  94. package/dist/{fleet-verify-NJDTHTO3.js → fleet-verify-JIK3OQZR.js} +34 -33
  95. package/dist/{fleet-view-UP2BWQQY.js → fleet-view-IWHYGQKK.js} +35 -34
  96. package/dist/{init-S3GZQ5ZF.js → init-NJEDOTQW.js} +46 -45
  97. package/dist/{interop-YOTGXFJM.js → interop-RVCAYECG.js} +4 -4
  98. package/dist/{inventory-K2OZ36YJ.js → inventory-74UL7UHU.js} +35 -34
  99. package/dist/{library-GJI6W6OK.js → library-CTKZA7K3.js} +10 -10
  100. package/dist/{memory-OQOXQGYD.js → memory-I76I5VUH.js} +34 -33
  101. package/dist/{models-3IK2Y5WE.js → models-D4YDIQZQ.js} +19 -18
  102. package/dist/{monitor-FTJLTKCQ.js → monitor-NKVD55HX.js} +40 -39
  103. package/dist/{orchestrator-N47O7SFD.js → orchestrator-I6OATVPK.js} +658 -1092
  104. package/dist/{preload-65U34NG6.js → preload-EJAWJEIO.js} +34 -33
  105. package/dist/{reset-MUVQDLNL.js → reset-4XMQKDNZ.js} +5 -3
  106. package/dist/{resources-LM76COAO.js → resources-TVYVXK3Q.js} +10 -10
  107. package/dist/{run-3VFZQ33N.js → run-OWQNNSJU.js} +61 -60
  108. package/dist/{share-4JUB4BL7.js → share-NPZZMUXG.js} +11 -11
  109. package/dist/{skills-S36AAJHU.js → skills-OXFEAWMT.js} +12 -12
  110. package/dist/{skills-eval-G6T57L7M.js → skills-eval-J5TCKSJA.js} +38 -37
  111. package/dist/{skills-inventory-WLM46PJH.js → skills-inventory-7II4DM57.js} +10 -10
  112. package/dist/{slash-commands-GBARG3Y7.js → slash-commands-MDSDSWYF.js} +26 -25
  113. package/dist/{targets-N5REUETU.js → targets-KILZEOCE.js} +36 -20
  114. package/dist/{tasks-6BVY5YZF.js → tasks-R6P6OV22.js} +7 -7
  115. package/dist/{terminal-lease-57UEOJKS.js → terminal-lease-LZCG2KN3.js} +2 -2
  116. package/dist/{upgrade-4HD5HAIV.js → upgrade-D2OZH6IQ.js} +9 -9
  117. package/dist/{usage-4GWM2WWP.js → usage-PIASNUS4.js} +40 -39
  118. package/dist/{verifiers-GSKWKWVG.js → verifiers-LTHUY2PX.js} +9 -9
  119. package/dist/{verify-3AS3ULCY.js → verify-HYF7KBVE.js} +7 -7
  120. package/dist/{wiki-generate-7BV7XWIY.js → wiki-generate-RK7JQ5NP.js} +51 -50
  121. package/dist/worker/entry.js +41 -39
  122. package/docs/architecture/context-engine.md +1 -1
  123. package/docs/architecture/tui-design.md +45 -30
  124. package/docs/guide/commands-and-modes.md +26 -25
  125. package/docs/guide/configuration-and-targets.md +122 -27
  126. package/docs/guide/configuration-reference.md +9 -4
  127. package/docs/guide/fleet-dispatch.md +1 -6
  128. package/docs/guide/glossary.md +1 -1
  129. package/docs/guide/installation-and-lifecycle.md +44 -11
  130. package/docs/process/development-pipeline.md +1 -1
  131. package/docs/process/documentation-coverage.md +1 -1
  132. package/docs/process/release-cut-checklist.md +18 -6
  133. package/package.json +1 -1
  134. package/src/cli/ask.ts +10 -10
  135. package/src/cli/configure-editor.ts +51 -0
  136. package/src/cli/configure-interop.ts +1 -1
  137. package/src/cli/configure-oauth.ts +1 -1
  138. package/src/cli/configure-onboarding.ts +232 -96
  139. package/src/cli/configure-prompts.ts +76 -0
  140. package/src/cli/configure-quick.ts +274 -0
  141. package/src/cli/configure-target.ts +14 -2
  142. package/src/cli/configure.ts +413 -174
  143. package/src/cli/oauth-manual-input.ts +1 -1
  144. package/src/cli/reset.ts +2 -0
  145. package/src/cli/select.ts +35 -4
  146. package/src/cli/upgrade.ts +2 -2
  147. package/src/core/config.ts +6 -1
  148. package/src/core/defaults.ts +33 -11
  149. package/src/{interactive → core}/external-editor.ts +4 -4
  150. package/src/domains/config/classify.ts +1 -1
  151. package/src/domains/config/keybindings.ts +3 -31
  152. package/src/domains/providers/probe/fingerprint.ts +13 -6
  153. package/src/domains/providers/probe/reasoning.ts +2 -0
  154. package/src/domains/providers/runtimes/common/probe-helpers.ts +23 -7
  155. package/src/domains/providers/runtimes/protocol/anthropic-compat.ts +7 -2
  156. package/src/domains/providers/runtimes/protocol/openai-compat.ts +10 -4
  157. package/src/interactive/application-controller.ts +1 -31
  158. package/src/interactive/chat-panel.ts +163 -637
  159. package/src/interactive/chat-renderer.ts +13 -30
  160. package/src/interactive/dispatch-board.ts +1 -3
  161. package/src/interactive/editor-submit.ts +8 -31
  162. package/src/interactive/footer/dashboard.ts +8 -3
  163. package/src/interactive/footer/widgets.ts +50 -91
  164. package/src/interactive/interactive-application.ts +16 -42
  165. package/src/interactive/interactive-event-projection.ts +2 -44
  166. package/src/interactive/interactive-input-runtime.ts +3 -28
  167. package/src/interactive/interactive-presentation.ts +30 -9
  168. package/src/interactive/interactive-slash-runtime.ts +3 -40
  169. package/src/interactive/layout.ts +29 -4
  170. package/src/interactive/overlay-general-openers.ts +2 -0
  171. package/src/interactive/overlay-lifecycle.ts +1 -0
  172. package/src/interactive/overlay-session-lifecycle.ts +1 -1
  173. package/src/interactive/overlays/settings.ts +9 -8
  174. package/src/interactive/renderers/preview.ts +16 -0
  175. package/src/interactive/renderers/tool-execution.ts +67 -160
  176. package/src/interactive/renderers/worker-entry.ts +57 -41
  177. package/src/interactive/slash-autocomplete.ts +1 -6
  178. package/src/interactive/slash-commands.ts +7 -39
  179. package/src/interactive/status/controller.ts +0 -5
  180. package/src/interactive/status/state-machine.ts +44 -26
  181. package/src/interactive/status/types.ts +3 -0
  182. package/src/interactive/status/verbs.ts +13 -12
  183. package/src/interactive/transcript-detail.ts +50 -112
  184. package/src/interactive/view/artifacts.ts +4 -0
  185. package/src/interactive/view/view-overlay.ts +44 -34
  186. package/src/tools/presentation.ts +1 -1
  187. package/src/tools/registry.ts +1 -1
  188. package/src/tools/verify/numeric.ts +4 -4
@@ -15,6 +15,29 @@ consumers install the built package and do not need the repository toolchain.
15
15
  This guide describes the default directories, file purposes, permissions, and
16
16
  lifecycle operations.
17
17
 
18
+ ### Start, change settings, or recover
19
+
20
+ | Task | Command | Result |
21
+ | --- | --- | --- |
22
+ | Set up a new installation | `clio-coder configure` | Quick Connect: endpoint, key if needed, model, Connect; then start `clio-coder`. |
23
+ | Change a connection | `clio-coder configure --section targets` | Add or edit endpoints, credentials, and models; choose role defaults. |
24
+ | Change any setting or repair YAML | `clio-coder configure --edit` | Edit a draft, validate, and save with a backup. |
25
+ | Diagnose the installation | `clio-coder doctor` | Read-only diagnosis. `clio-coder doctor --fix` repairs structure and permissions. |
26
+ | Finish a package-manager update | `clio-coder upgrade --post-install` | Apply local migrations and installation checks. |
27
+ | Start configuration over | `clio-coder reset --config` | Reset settings, preserve credentials and history, then run `clio-coder configure`. |
28
+ | Emulate a fresh user | `clio-coder reset --all` | Remove all four user roots, recreate defaults, then run `clio-coder configure`. |
29
+ | Remove user state | `clio-coder uninstall` | Remove the selected user roots; remove the package with the manager that installed it. |
30
+
31
+ Reset and uninstall preview their scope and ask for confirmation. Use
32
+ `--dry-run` to inspect without changing anything. A bare `reset` clears session
33
+ state, so use `--config` when your intent is to start model setup over. Project
34
+ `.clio-coder/` directories survive these user-level operations.
35
+
36
+ The source installer prepares the launcher and directory structure, then points
37
+ you to `clio-coder configure`. It does not ask you to configure delegation peers
38
+ before your primary model is set up. Upgrading preserves settings and
39
+ credentials; reinstalling the package alone does not reset them.
40
+
18
41
  ### Optional dependency: the Claude Agent SDK
19
42
 
20
43
  `@anthropic-ai/claude-agent-sdk` is an `optionalDependencies` entry, not a hard dependency. Its platform package carries a proprietary binary of roughly 224MB per platform, and only the `claude-sdk` runtime uses it. Skip it with:
@@ -296,7 +319,7 @@ Key lifecycle and operational updates in v0.3.7:
296
319
  - Fullscreen TUI mode (`interface.mode`, `interface.fullscreenScrollbar`) is
297
320
  available through `/settings interface` and requires a restart. Adaptive
298
321
  presentation pacing is the live `interface.smoothStreaming` setting; it
299
- defaults to `off`, with conservative `auto` and explicit `on` available from
322
+ defaults to conservative `auto`, with `off` and explicit `on` available from
300
323
  the same area.
301
324
  - Interactive launch paints a measured Stage 0 shell on the same terminal and editor that Stage 1 hydrates. Typing, queued submits, resize, and Ctrl+C remain live during hydration; set `CLIO_CODER_INSTANT_SHELL=0` for the legacy fully hydrated first-frame path.
302
325
  - Turn settlement is enforced on `/new`, `/resume`, `/tree`, and `/fork` to cleanly commit in-flight streams before session writer replacement (#114).
@@ -408,18 +431,20 @@ or release the handle, then run the identical command again and it resumes from
408
431
  whatever is left. A partial delete never reports global success.
409
432
 
410
433
  ### E. Interactive Configuration (`clio-coder configure`)
411
- `clio-coder configure` provides a structured, multi-section configuration wizard
412
- for model targets, runtime defaults, fleet limits, permissions, panes, and
413
- integrations:
434
+
435
+ The interactive launcher starts with **Quick Connect**, followed by **Settings**
436
+ and **Diagnostics**. Quick Connect asks for an endpoint URL, a key when needed,
437
+ and a model when several are available. Review and **Connect**; the recommended
438
+ defaults handle the rest. An unconfigured interactive `clio-coder` opens this
439
+ same launcher and continues into chat after a successful setup.
414
440
 
415
441
  ```bash
416
- clio-coder configure [--section <name>] [--json] [--interop] [--list] [--all]
442
+ clio-coder configure
443
+ clio-coder configure --quick
444
+ clio-coder configure --settings
417
445
  ```
418
446
 
419
- When run against an unconfigured home (or when launched interactively with no
420
- model target), it routes immediately to the target category selection menu. Once
421
- targets are configured, launching `clio-coder configure` presents the 8 top-level
422
- runtime sections:
447
+ **Settings** contains the nine advanced sections:
423
448
 
424
449
  1. **Targets & Auth**: manage providers, endpoints, credentials, and models.
425
450
  2. **Models & Thinking**: default models, thinking levels, model favorites, cycle set.
@@ -429,14 +454,22 @@ runtime sections:
429
454
  6. **Panes & Layout**: terminal panes capability, dock layout, TUI display mode, notifications.
430
455
  7. **Skills & Extensions**: trust project imports, external ACP agents, plugins, library sync.
431
456
  8. **Diagnostics**: version information, resolved directories, doctor check, raw settings inspection.
457
+ 9. **All Settings**: validated file editor for the complete settings schema.
432
458
 
433
459
  Every section header indicates the exact settings file path being modified
434
460
  (`Source: ~/.config/clio-coder/settings.yaml`), prints the current active values,
435
- and provides a safe back/exit option (`b` or `q`).
461
+ and provides arrow-key navigation with Escape to go back and `q` to quit. The
462
+ parent menu remembers your selected row. Dumb terminals use numbered menus
463
+ with `b` for Back and `q` to quit.
436
464
 
437
465
  The `--section <name>` flag jumps directly into any section (e.g.,
438
466
  `clio-coder configure --section models` or `clio-coder configure --section fleet`).
439
- The `--json` flag emits the active settings in formatted JSON for scripting.
467
+ The `--json` flag emits user settings with defaults in formatted JSON for scripting.
468
+ `--edit` opens a temporary settings draft in `VISUAL`/`EDITOR`, validates it before
469
+ saving, and keeps the previous file as `settings.yaml.bak`. It can repair a file
470
+ that is too malformed to open the regular menu. See the
471
+ [configuration guide](configuration-and-targets.md#first-run-flow) for the complete
472
+ new-user, add-target, edit-target, and cancellation paths.
440
473
 
441
474
  ---
442
475
 
@@ -59,7 +59,7 @@ closed. The reusable [`branch-closeout`](../../skills/git/branch-closeout/) skil
59
59
  `refs/heads/main`; every survivor needs an owner and purpose.
60
60
 
61
61
  Maintainer release candidates are local-only and use a compact branch name
62
- that cannot collide with their tag: branch `v043`, tag `v0.4.3`. Gate the exact
62
+ that cannot collide with their tag: branch `v046`, tag `v0.4.6`. Gate the exact
63
63
  candidate, require fetched `origin/main` to be its ancestor, fast-forward local
64
64
  `main`, fetch again, and push only `refs/heads/main:refs/heads/main` with
65
65
  explicit authorization. After CI passes, push only the fully qualified
@@ -56,7 +56,7 @@ preserves that audit-time state.
56
56
  | `guide/exit-codes-and-output.md` | `src/cli/**`; `src/entry/**`; CLI smoke tests | `html/exit_codes_blueprint.html` | The JSON event table is described too broadly; full mode can pass additional `clio_coder_*` tool, permission, and plan frames. Core process exit codes are correct. |
57
57
  | `guide/extensions-and-sharing.md` | `src/domains/extensions/**`; `src/domains/resources/**`; `src/domains/share/**`; extension and share CLIs | `html/extensions_blueprint.html` | Extensions discover skills, prompts, agents, fleets, and reserved themes, not only prompts and skills. Judge eval arms are not full-auto. Share archives use `clio-coder-share-archive`, `clio-coder.share.v1`, and `clioCoderVersion`; old names are compatibility inputs. The exported settings fragment contains current v2 leaves rather than the documented old scope. |
58
58
  | `process/fleet-demo-runbook.md` | `src/domains/dispatch/**`; `src/domains/scheduling/**`; `src/cli/doctor.ts` | No; parity gap. | Current receipts use integrity v20, not v16, and older versions are retired rather than universally failing verification. |
59
- | `guide/fleet-dispatch.md` | `src/domains/dispatch/**`; `src/domains/scheduling/**`; dispatch tools | `html/fleet_dispatch_blueprint.html` | Current receipts use v20, not v19. Older receipts are retired and never read as evidence. Tool expansion provenance uses `clio-coder.tool.expand`, not `clio.tool.expand`. Agent-ledger citations point into the former dispatch monolith rather than `dispatch-runner.ts`. |
59
+ | `guide/fleet-dispatch.md` | `src/domains/dispatch/**`; `src/domains/scheduling/**`; dispatch tools | `html/fleet_dispatch_blueprint.html` | Current receipts use v20, not v19. Older receipts are retired and never read as evidence. Output styles use `clio-coder.output.cycle`; worker previews follow the same preset regardless of origin. Agent-ledger citations point into the former dispatch monolith rather than `dispatch-runner.ts`. |
60
60
  | `process/git-commit-provenance.md` | `src/core/commit-attribution.ts`; `src/core/git-commit-attribution.ts`; `src/core/defaults.ts`; dispatch attribution tests | No; parity gap. | Canonical configuration is `integrations.git.commitAttribution`; `attribution.gitCommits` is migration-only. Commit trailers recognize and emit `receipt-v20`, not v19. |
61
61
  | `guide/glossary.md` | Owning types in `src/domains/dispatch/**`, `src/domains/session/**`, `src/domains/context/**`, and `src/tools/**` | `html/glossary_blueprint.html` | Receipt integrity is v20. Dispatch run and session IDs are 12-character random base36 identifiers, while session turn and entry IDs use UUIDv7. Route candidates contain more identity and policy fields than the four-field definition. Council is a current topology. `internal` is a dispatch request origin, not a worker run origin. Context ledger buckets are incomplete. |
62
62
  | `guide/installation-and-lifecycle.md` | `src/cli/upgrade.ts`; `src/cli/doctor.ts`; `src/cli/reset.ts`; `src/cli/uninstall.ts`; `src/domains/lifecycle/**`; `src/core/xdg.ts` | `html/lifecycle_blueprint.html` | Install metadata omits `repairedAt` and overgeneralizes preexisting-home detection beyond config, data, and state. The upgrade section presents a stale 0.3.x sequence as current and claims one migration, while the current registry has five migrations and 0.4.2 emits a generic notice. |
@@ -13,18 +13,21 @@ canonical remote state or publishes immutable packages.
13
13
  ## Part 1: Candidate Preparation on a Local Compact Branch
14
14
 
15
15
  Maintainers prepare release candidates on a local-only compact branch named after
16
- the version without punctuation, such as `v044` for version `0.4.4`. Dotted branch
17
- names like `v0.4.4` are forbidden because dotted names belong exclusively to immutable
16
+ the version without punctuation, such as `v046` for version `0.4.6`. Dotted branch
17
+ names like `v0.4.6` are forbidden because dotted names belong exclusively to immutable
18
18
  tags. The canonical repository hosts only `main`, and no release candidate branch is
19
19
  ever pushed to canonical origin.
20
20
 
21
21
  1. Ensure the working tree is clean and updated from canonical origin:
22
22
 
23
23
  ```bash
24
- git checkout -b v044 origin/main
24
+ git checkout -b v046 origin/main
25
25
  ```
26
26
 
27
- 2. Update `version` in `package.json` to the release version.
27
+ 2. Update `version` in `package.json` and `assets/acp-registry/agent.json` to the
28
+ release version. Update the README's source-install tag and remove any
29
+ development-only notices. Keep historical release records, protocol schema
30
+ versions, dependency versions, and migration fixtures unchanged.
28
31
 
29
32
  3. Retitle the active changelog section in `CHANGELOG.md` from `## Unreleased` to
30
33
  `## <version> - YYYY-MM-DD`. The release gate in `scripts/check-release.mjs` requires
@@ -112,7 +115,7 @@ an immutable package. Do not execute any of them without explicit maintainer aut
112
115
 
113
116
  ```bash
114
117
  git checkout main
115
- git merge --ff-only v044
118
+ git merge --ff-only v046
116
119
  ```
117
120
 
118
121
  4. Verify that local `main` matches the reviewed candidate SHA exactly.
@@ -150,6 +153,15 @@ an immutable package. Do not execute any of them without explicit maintainer aut
150
153
 
151
154
  5. Inspect the GitHub Actions workflow run and confirm the GitHub release is published.
152
155
 
156
+ 6. Reconcile the release milestone against the tagged commits and each ticket's
157
+ acceptance evidence. `Fixes #123` or `Resolves #123` in a commit closes that
158
+ ticket when the commit reaches default-branch `main`; a bare `#123`, changelog
159
+ mention, tag, or GitHub release does not. Verify the resulting issue state.
160
+ Explicitly close completed tickets missed by automatic closure and retain
161
+ their implementing commit and validation references. Carry incomplete work
162
+ forward with its remaining criteria, then close the reconciled milestone.
163
+ Never infer completion from a release-note mention alone.
164
+
153
165
  ## Part 6: Package Publication to npm
154
166
 
155
167
  Publishing to npm is a manual maintainer step performed from the tagged commit.
@@ -195,7 +207,7 @@ Publishing to npm is a manual maintainer step performed from the tagged commit.
195
207
  3. Remove the local compact candidate branch:
196
208
 
197
209
  ```bash
198
- git branch -d v044
210
+ git branch -d v046
199
211
  ```
200
212
 
201
213
  The canonical repository remains in its steady state containing only `main` and immutable tags.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@iowarp/clio-coder",
3
- "version": "0.4.5",
3
+ "version": "0.4.6",
4
4
  "description": "The terminal coding agent for people who maintain the code that science runs on, with user-chosen models and inspectable evidence.",
5
5
  "keywords": [
6
6
  "ai",
package/src/cli/ask.ts CHANGED
@@ -1,10 +1,13 @@
1
1
  import type { createInterface } from "node:readline/promises";
2
2
 
3
- export async function ask(
4
- rl: ReturnType<typeof createInterface>,
5
- label: string,
6
- defaultValue?: string,
7
- ): Promise<string | null> {
3
+ type QuestionReader = Pick<ReturnType<typeof createInterface>, "question"> & {
4
+ interactive?: boolean;
5
+ text?: (label: string, initial?: string) => Promise<string>;
6
+ choose?: (label: string, choices: ReadonlyArray<string>, current: string) => Promise<string>;
7
+ };
8
+
9
+ export async function ask(rl: QuestionReader, label: string, defaultValue?: string): Promise<string | null> {
10
+ if (rl.text) return rl.text(label, defaultValue);
8
11
  const suffix = defaultValue && defaultValue.length > 0 ? ` [${defaultValue}]` : "";
9
12
  try {
10
13
  const answer = (await rl.question(`${label}${suffix}: `)).trim();
@@ -16,11 +19,8 @@ export async function ask(
16
19
  }
17
20
  }
18
21
 
19
- export async function askYesNo(
20
- rl: ReturnType<typeof createInterface>,
21
- label: string,
22
- defaultValue: boolean,
23
- ): Promise<boolean> {
22
+ export async function askYesNo(rl: QuestionReader, label: string, defaultValue: boolean): Promise<boolean> {
23
+ if (rl.choose && rl.interactive) return (await rl.choose(label, ["yes", "no"], defaultValue ? "yes" : "no")) === "yes";
24
24
  const marker = defaultValue ? "Y/n" : "y/N";
25
25
  for (;;) {
26
26
  const answer = await ask(rl, `${label} [${marker}]`);
@@ -0,0 +1,51 @@
1
+ import { existsSync, readFileSync } from "node:fs";
2
+ import { parse } from "yaml";
3
+ import { SettingsValidationError, settingsPath, validateSettings, withSettingsLock } from "../core/config.js";
4
+ import { DEFAULT_SETTINGS_YAML } from "../core/defaults.js";
5
+ import { editTextExternally, resolveExternalEditor } from "../core/external-editor.js";
6
+ import { safeResourceWrite } from "../core/safe-resource-write.js";
7
+ import type { ConfigurePrompts } from "./configure-prompts.js";
8
+
9
+ /** Edit a draft, validate it, then replace the file only if it has not changed meanwhile. */
10
+ export async function editSettings(prompts: ConfigurePrompts): Promise<boolean> {
11
+ const file = settingsPath();
12
+ const original = existsSync(file) ? readFileSync(file, "utf8") : null;
13
+ let draft = original ?? DEFAULT_SETTINGS_YAML;
14
+ const editor = resolveExternalEditor();
15
+ for (;;) {
16
+ const result = editTextExternally(draft, editor, ".yaml");
17
+ if (!result.ok || result.text === undefined) throw new Error(result.error ?? "Editor did not return a draft");
18
+ draft = `${result.text}\n`;
19
+ if (draft === original) {
20
+ prompts.output.write("Settings unchanged.\n");
21
+ return false;
22
+ }
23
+ try {
24
+ const validated = validateSettings(parse(draft));
25
+ if (validated.issues.length) throw new SettingsValidationError(validated.issues);
26
+ } catch (error) {
27
+ prompts.output.write(`${error instanceof Error ? error.message : String(error)}\n`);
28
+ if (
29
+ (await prompts.choose("Invalid draft", ["Return to editor", "Discard draft"], "Return to editor")) ===
30
+ "Return to editor"
31
+ )
32
+ continue;
33
+ return false;
34
+ }
35
+ const choice = await prompts.choose(
36
+ "Save validated settings?",
37
+ ["Save", "Return to editor", "Discard draft"],
38
+ "Save",
39
+ );
40
+ if (choice === "Return to editor") continue;
41
+ if (choice !== "Save") return false;
42
+ withSettingsLock(() => {
43
+ const current = existsSync(file) ? readFileSync(file, "utf8") : null;
44
+ if (current !== original)
45
+ throw new Error("Settings changed while the editor was open. Reopen the editor to keep those changes.");
46
+ safeResourceWrite(file, draft, { encoding: "utf8", mode: 0o644, backup: original !== null });
47
+ });
48
+ prompts.output.write(`Settings saved to ${file}${original === null ? "" : `; previous file: ${file}.bak`}\n`);
49
+ return true;
50
+ }
51
+ }
@@ -48,7 +48,7 @@ export interface InteropReviewStreams {
48
48
 
49
49
  export interface InteropReviewIo {
50
50
  /** Readline interface for the numbered fallback. Null means nothing can answer. */
51
- rl: ReturnType<typeof createInterface> | null;
51
+ rl: Pick<ReturnType<typeof createInterface>, "question"> | null;
52
52
  streams?: InteropReviewStreams;
53
53
  /** Rail to draw on when the caller already owns one. */
54
54
  presenter?: LifecyclePresenter;
@@ -15,7 +15,7 @@ import { promptOAuthSelection } from "./oauth-select.js";
15
15
  import { credentialWriteFailed, printError, printOk } from "./shared.js";
16
16
 
17
17
  export async function loginOAuthRuntime(
18
- rl: ReturnType<typeof createInterface>,
18
+ rl: Pick<ReturnType<typeof createInterface>, "question">,
19
19
  runtime: RuntimeDescriptor,
20
20
  ): Promise<boolean> {
21
21
  const auth = openAuthStorage();