@puddle-code/cli 0.2.4 → 0.2.7

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 (132) hide show
  1. package/CHANGELOG.md +4 -14
  2. package/README.md +33 -23
  3. package/dist/host-control.mjs +7 -4
  4. package/dist/index.js +508 -315
  5. package/dist/install-cli.sh +167 -0
  6. package/dist/install.sh +7 -10
  7. package/dist/public/assets/{App-C2IQg_6K.js → App-BkCGcO4p.js} +2 -2
  8. package/dist/public/assets/{Dashboard-DUFOyL1_.js → Dashboard-BOK1fw_Q.js} +1 -1
  9. package/dist/public/assets/{EditorTabClose-C3wpMhYL.js → EditorTabClose-CzMQj4jF.js} +1 -1
  10. package/dist/public/assets/{FindWidget-Dt1gfA70.js → FindWidget-6LifDkeS.js} +1 -1
  11. package/dist/public/assets/{LazyTerminal-B9HzmRBx.js → LazyTerminal-Beep0VuJ.js} +2 -2
  12. package/dist/public/assets/{ModelRefcount-CxzQ3w05.js → ModelRefcount-F2Tf2V5f.js} +1 -1
  13. package/dist/public/assets/{NewProjectDialog-Cq_1po_h.js → NewProjectDialog-CoI17sqS.js} +1 -1
  14. package/dist/public/assets/{PaneEditorBody-zS2BI5Fn.js → PaneEditorBody-57BHgi2R.js} +4 -4
  15. package/dist/public/assets/{PdfViewer-ckjWE_TR.js → PdfViewer-T-uYvXEd.js} +2 -2
  16. package/dist/public/assets/SettingsDialog-CkBdXZyv.js +8 -0
  17. package/dist/public/assets/{Terminal-BqbjwcMi.js → Terminal-CJMmk0kO.js} +1 -1
  18. package/dist/public/assets/{Workspace-BVDgHkML.js → Workspace-0P5NTRzC.js} +6 -6
  19. package/dist/public/assets/{abnfDiagram-VCTEODGH-JZdwYDGF.js → abnfDiagram-VCTEODGH-Dl2GTGCZ.js} +1 -1
  20. package/dist/public/assets/architecture-7GRP2DOG-UXEF_VQt.js +1 -0
  21. package/dist/public/assets/{architectureDiagram-5GKGNRK7-CYoRlLvs.js → architectureDiagram-5GKGNRK7-TLkiib9Z.js} +1 -1
  22. package/dist/public/assets/{blockDiagram-I7D4REHJ-DjPQ4-5b.js → blockDiagram-I7D4REHJ-CFdDK-5H.js} +1 -1
  23. package/dist/public/assets/{buffer-store-GUPJI8Wy.js → buffer-store-Pex0dRS2.js} +2 -2
  24. package/dist/public/assets/{button-CKes3Qwq.js → button-IwQVXqQs.js} +1 -1
  25. package/dist/public/assets/{c4Diagram-7LVT6UL2-BvwPGpk0.js → c4Diagram-7LVT6UL2-9M5y_7Rr.js} +1 -1
  26. package/dist/public/assets/channel-D3NmDqec.js +1 -0
  27. package/dist/public/assets/{chunk-2E4U76K2-DcsuTdxj.js → chunk-2E4U76K2-BEq-rPTx.js} +1 -1
  28. package/dist/public/assets/{chunk-4HAMMTFA-BGEaVxkg.js → chunk-4HAMMTFA-DSsufXZj.js} +1 -1
  29. package/dist/public/assets/{chunk-75Z2AOVW-BOvbyaVc.js → chunk-75Z2AOVW-CUihRphW.js} +1 -1
  30. package/dist/public/assets/{chunk-CLGD4ZFX-8fG7spZS.js → chunk-CLGD4ZFX-8FntHoH6.js} +1 -1
  31. package/dist/public/assets/{chunk-DU6HZSFF-C94gDWXH.js → chunk-DU6HZSFF-BhI6mdvA.js} +1 -1
  32. package/dist/public/assets/{chunk-F27PBJKO-CZD-A2b3.js → chunk-F27PBJKO-CflkfzDR.js} +1 -1
  33. package/dist/public/assets/{chunk-GMAD6QVW-C7KK3kiY.js → chunk-GMAD6QVW-C6sQnCBM.js} +1 -1
  34. package/dist/public/assets/{chunk-GVQU2GXP-CDFKc0sW.js → chunk-GVQU2GXP-BTEA9yBL.js} +1 -1
  35. package/dist/public/assets/{chunk-IMKFNOWR-BWQiE1Cp.js → chunk-IMKFNOWR-BTN8pZaT.js} +1 -1
  36. package/dist/public/assets/{chunk-L3NEJ4N5-DqP3WOXV.js → chunk-L3NEJ4N5-CPMRHY2b.js} +1 -1
  37. package/dist/public/assets/{chunk-OSK3NFVY-BlmYDJRN.js → chunk-OSK3NFVY-D62Fb29m.js} +1 -1
  38. package/dist/public/assets/{chunk-P2QGCYS3-v7eQ-UQT.js → chunk-P2QGCYS3-B_AAuki5.js} +1 -1
  39. package/dist/public/assets/{chunk-POPQ4Y6H-D_gxItFL.js → chunk-POPQ4Y6H-C-wGGj3u.js} +1 -1
  40. package/dist/public/assets/{chunk-PWAF6VOD-Ds90M0Eb.js → chunk-PWAF6VOD-DElrnMgG.js} +1 -1
  41. package/dist/public/assets/{chunk-SHT3W25Y-B8oepiFw.js → chunk-SHT3W25Y-D4tV8JU2.js} +1 -1
  42. package/dist/public/assets/{chunk-SVP7TREG-DjFxplBp.js → chunk-SVP7TREG-CFj2bSX9.js} +1 -1
  43. package/dist/public/assets/{chunk-TICWLB2K-GEeYOgw4.js → chunk-TICWLB2K-B-5yvDQM.js} +1 -1
  44. package/dist/public/assets/{chunk-TLUHSLCS-CEnN9wOB.js → chunk-TLUHSLCS-CpBFfaGS.js} +2 -2
  45. package/dist/public/assets/classDiagram-ZZMXUADV-8X6mwi75.js +1 -0
  46. package/dist/public/assets/classDiagram-v2-VYDZK3BY-8X6mwi75.js +1 -0
  47. package/dist/public/assets/{context-menu-CmSSwq3B.js → context-menu-Bh2z-xpu.js} +1 -1
  48. package/dist/public/assets/{cssMode-BEaREsxj.js → cssMode-iZ32bnYe.js} +1 -1
  49. package/dist/public/assets/{cynefin-OW5HDTMX-C_sl2wZ-.js → cynefin-OW5HDTMX-D5BzXyX_.js} +1 -1
  50. package/dist/public/assets/{cynefinDiagram-5FMLGOSQ-CPpFUPl3.js → cynefinDiagram-5FMLGOSQ-CdbgNH0t.js} +1 -1
  51. package/dist/public/assets/{dagre-GXQ25YYZ-BryapOat.js → dagre-GXQ25YYZ-B7zDDwyp.js} +1 -1
  52. package/dist/public/assets/{diagram-S7CK7UJ4-dIdCar-k.js → diagram-S7CK7UJ4-WMtT-mtt.js} +1 -1
  53. package/dist/public/assets/{diagram-UQ7AKVKN-EcAWwfjf.js → diagram-UQ7AKVKN-DtvvWbC3.js} +1 -1
  54. package/dist/public/assets/{diagram-VSXAHHWV-Dpl4gvkd.js → diagram-VSXAHHWV-DBLLhbuk.js} +1 -1
  55. package/dist/public/assets/{diagram-VX7I27RA-CJtemv3e.js → diagram-VX7I27RA-6sDOwqqU.js} +1 -1
  56. package/dist/public/assets/{diagram-Z3DM3KII-CPSnQEgD.js → diagram-Z3DM3KII-giEr0RfN.js} +1 -1
  57. package/dist/public/assets/{dialog-Dam8WdmS.js → dialog-ClHoWaGa.js} +1 -1
  58. package/dist/public/assets/{disclosure-Ex-68BU4.js → disclosure-Ch2qCUT3.js} +1 -1
  59. package/dist/public/assets/{dist-ByY6lqkl.js → dist-C1IA4PaM.js} +1 -1
  60. package/dist/public/assets/{dist-CxMnSex-.js → dist-ujnACQRA.js} +1 -1
  61. package/dist/public/assets/{ebnfDiagram-PWID7BFC-uXsUC0ll.js → ebnfDiagram-PWID7BFC-CDfLo0uv.js} +1 -1
  62. package/dist/public/assets/{erDiagram-RLTQ6QDP-D5vJ6ZLT.js → erDiagram-RLTQ6QDP-z5xLMSlR.js} +1 -1
  63. package/dist/public/assets/eventmodeling-NTZA5JFV-CzmQ0jM3.js +1 -0
  64. package/dist/public/assets/flowDiagram-HODETNUW-_tJIQrw7.js +1 -0
  65. package/dist/public/assets/{ganttDiagram-EL5Y4UJY-C6yTyvpx.js → ganttDiagram-EL5Y4UJY-C2poetEB.js} +1 -1
  66. package/dist/public/assets/{gitGraph-4MIJSDKK-C7nVbcZ1.js → gitGraph-4MIJSDKK-D40KkO3l.js} +1 -1
  67. package/dist/public/assets/{gitGraphDiagram-WWUBYQGX-DByBzF_5.js → gitGraphDiagram-WWUBYQGX-B4839p8c.js} +1 -1
  68. package/dist/public/assets/{hotkeys-MSGaeY2m.js → hotkeys-CY98l7MF.js} +1 -1
  69. package/dist/public/assets/{htmlMode-DirKEo5j.js → htmlMode-XXBiFVzW.js} +1 -1
  70. package/dist/public/assets/{index-C1a3rCk2.js → index-D0Lm0Z_9.js} +2 -2
  71. package/dist/public/assets/index-uKreLbru.css +2 -0
  72. package/dist/public/assets/{info-A6RAGUB7-BCEGc_J2.js → info-A6RAGUB7-R6D6gcdH.js} +1 -1
  73. package/dist/public/assets/{infoDiagram-27XIBGKW-DDVeVGK9.js → infoDiagram-27XIBGKW-CQMe7eLM.js} +1 -1
  74. package/dist/public/assets/{input-i-kiT55N.js → input-BUZTRTzW.js} +1 -1
  75. package/dist/public/assets/{ishikawaDiagram-5VMMS53U-CTZvKcdI.js → ishikawaDiagram-5VMMS53U-hWJnyGf_.js} +1 -1
  76. package/dist/public/assets/{journeyDiagram-3NMN7TZE-CwFCP_8e.js → journeyDiagram-3NMN7TZE-DRy7w8VL.js} +1 -1
  77. package/dist/public/assets/{jsonMode-BLMO7T1W.js → jsonMode-B4KgbobV.js} +1 -1
  78. package/dist/public/assets/{kanban-definition-UXKFOSKX-BCdCN6ov.js → kanban-definition-UXKFOSKX-Dvv0eWiD.js} +1 -1
  79. package/dist/public/assets/{line-e7ifLbsv.js → line-K2RkIT6o.js} +1 -1
  80. package/dist/public/assets/{media-refresh-store-d6Ihz_Yj.js → media-refresh-store-OAgBTFYO.js} +1 -1
  81. package/dist/public/assets/{mermaid-parser.core-DfmtQ5si.js → mermaid-parser.core-B36v6vc8.js} +3 -3
  82. package/dist/public/assets/{mermaid.core-B0Ceo892.js → mermaid.core-kqdkh9ua.js} +3 -3
  83. package/dist/public/assets/{mindmap-definition-YA3MSWOX-BKWZ0hGZ.js → mindmap-definition-YA3MSWOX-CykDXfif.js} +1 -1
  84. package/dist/public/assets/{notification-permission-DThcB8rO.js → notification-permission-B9hBLJAo.js} +1 -1
  85. package/dist/public/assets/{packet-AYTQ26CC-C_WSBR7W.js → packet-AYTQ26CC-BDu33u4C.js} +1 -1
  86. package/dist/public/assets/{pdf-CW6jyF4i.js → pdf-BTD1hhPr.js} +1 -1
  87. package/dist/public/assets/{pegDiagram-XKGWAZYB-CQw-vxyv.js → pegDiagram-XKGWAZYB-DWdbGFng.js} +1 -1
  88. package/dist/public/assets/{pie-WAS4IAKB-CyAolSkk.js → pie-WAS4IAKB-CeKUt-Xf.js} +1 -1
  89. package/dist/public/assets/{pieDiagram-E7YTZNPT-fEikc7gQ.js → pieDiagram-E7YTZNPT-D94ZuRp2.js} +1 -1
  90. package/dist/public/assets/{project-abbrev-0K47Phcy.js → project-abbrev-E6FngLNw.js} +1 -1
  91. package/dist/public/assets/protocol-support-C3qZDXsO.js +1 -0
  92. package/dist/public/assets/{quadrantDiagram-AXDQQJYC-BLZF9CN6.js → quadrantDiagram-AXDQQJYC-DXkTGcPo.js} +1 -1
  93. package/dist/public/assets/{radar-RG4KPBEZ-DZj09Z3T.js → radar-RG4KPBEZ-C1wtnYrQ.js} +1 -1
  94. package/dist/public/assets/{railroad-74A4TZTK-DrrM4RhH.js → railroad-74A4TZTK-Dx_D-zM9.js} +1 -1
  95. package/dist/public/assets/railroad-abnf-HS5TGJTU-CBfnoAOv.js +1 -0
  96. package/dist/public/assets/railroad-ebnf-LZEXJU2U-0kuF9A11.js +1 -0
  97. package/dist/public/assets/railroad-peg-WCYAUIDC-DCe0oM6p.js +1 -0
  98. package/dist/public/assets/{railroadDiagram-O6MQD6OU-BjnjeLPo.js → railroadDiagram-O6MQD6OU-DVuwN3bC.js} +1 -1
  99. package/dist/public/assets/{requirementDiagram-BXWQKSXE-CJnHoVjp.js → requirementDiagram-BXWQKSXE-nX3JtB1N.js} +1 -1
  100. package/dist/public/assets/{sankeyDiagram-P5KCCOFB-BFBAycgU.js → sankeyDiagram-P5KCCOFB-DvErANKF.js} +1 -1
  101. package/dist/public/assets/{sequenceDiagram-WJ2MYXX4-IgIUmdp2.js → sequenceDiagram-WJ2MYXX4-BruH0Mma.js} +1 -1
  102. package/dist/public/assets/{stateDiagram-D77RDMKH-C8ragRoI.js → stateDiagram-D77RDMKH-BMiYrZ8Y.js} +1 -1
  103. package/dist/public/assets/stateDiagram-v2-MP3YSRHH-CF86bnO8.js +1 -0
  104. package/dist/public/assets/{swimlanes-42K2YHIH-mm0BJE0h.js → swimlanes-42K2YHIH-CK3jGfyc.js} +1 -1
  105. package/dist/public/assets/swimlanesDiagram-VR7AAH4N-COC62XcR.js +8 -0
  106. package/dist/public/assets/{switch-TfZl8YQu.js → switch-BrFrNOcn.js} +1 -1
  107. package/dist/public/assets/{timeline-definition-24CTP7MA-CLtACXsf.js → timeline-definition-24CTP7MA-DHf_pf2_.js} +1 -1
  108. package/dist/public/assets/{treeView-Q6P3EWNA-B_s8YnCD.js → treeView-Q6P3EWNA-C5uB7_Kg.js} +1 -1
  109. package/dist/public/assets/{treemap-WGGIJYW6-CiyeynoG.js → treemap-WGGIJYW6-BGzjaDxJ.js} +1 -1
  110. package/dist/public/assets/{tsMode-BJ9DHdAB.js → tsMode-C39Hmal5.js} +1 -1
  111. package/dist/public/assets/{use-ui-state-2bNBLDPU.js → use-ui-state-D5kpevK-.js} +1 -1
  112. package/dist/public/assets/{vennDiagram-4TSXK5OY-C9rcT-1u.js → vennDiagram-4TSXK5OY-9mb8KINT.js} +1 -1
  113. package/dist/public/assets/{wardley-WFR3VGLG-D_hqUvOM.js → wardley-WFR3VGLG-DW5VvBTA.js} +1 -1
  114. package/dist/public/assets/{wardleyDiagram-VM6X3IG4-Dfn7mGAc.js → wardleyDiagram-VM6X3IG4-DCM5g6RC.js} +1 -1
  115. package/dist/public/assets/{ws-CDXqi1pN.js → ws-BZ4-LssP.js} +1 -1
  116. package/dist/public/assets/{xychartDiagram-S5SC5T6Z-vwVJPUe2.js → xychartDiagram-S5SC5T6Z-Bks8gKZc.js} +1 -1
  117. package/dist/public/index.html +2 -2
  118. package/package.json +1 -1
  119. package/dist/public/assets/SettingsDialog-Cb2fdV1D.js +0 -8
  120. package/dist/public/assets/architecture-7GRP2DOG-RMEcXYv9.js +0 -1
  121. package/dist/public/assets/channel-BheYsxDc.js +0 -1
  122. package/dist/public/assets/classDiagram-ZZMXUADV-CDDLBiV5.js +0 -1
  123. package/dist/public/assets/classDiagram-v2-VYDZK3BY-CDDLBiV5.js +0 -1
  124. package/dist/public/assets/eventmodeling-NTZA5JFV-WlMCgowE.js +0 -1
  125. package/dist/public/assets/flowDiagram-HODETNUW-DJ99l88N.js +0 -1
  126. package/dist/public/assets/index-Ctw2P0rY.css +0 -2
  127. package/dist/public/assets/protocol-support-C1NCVjbV.js +0 -1
  128. package/dist/public/assets/railroad-abnf-HS5TGJTU-lXe6u3FO.js +0 -1
  129. package/dist/public/assets/railroad-ebnf-LZEXJU2U-C7R4jvUV.js +0 -1
  130. package/dist/public/assets/railroad-peg-WCYAUIDC-B24HGcGJ.js +0 -1
  131. package/dist/public/assets/stateDiagram-v2-MP3YSRHH-AU0bFC0Z.js +0 -1
  132. package/dist/public/assets/swimlanesDiagram-VR7AAH4N-cBVuNXB5.js +0 -8
package/CHANGELOG.md CHANGED
@@ -1,25 +1,15 @@
1
1
  <!--
2
- Rolling changelog for the NEXT release. Governance lives in CLAUDE.md §"Changelog discipline".
3
- On publish: retitle [Unreleased] to [X.Y.Z] — date, archive a copy to
4
- docs/changelogs/CHANGELOG-vX.Y.Z.md, then reset this file to this template.
5
- Past releases: see docs/changelogs/.
2
+ Archived release changelog. Governance lives in CLAUDE.md §"Changelog discipline".
6
3
  -->
7
4
 
8
5
  # Changelog
9
6
 
10
- ## [0.2.4] — 2026-09-22
11
-
12
- ### Added
13
-
14
- - Add Paste beside Copy in mobile terminal long-press controls, including empty inputs, preserving terminal paste handling without adding Enter.
15
- - Raise mobile terminal image uploads to 4 MiB with progress and cancellation, preserve smaller originals and recompress larger photos while retaining ordinary remote request limits (daemon/cockpit protocol 21.2; encrypted remote protocol stays 2).
16
- - Add an eye toggle for read-only mobile remote previews of Markdown, HTML with sandboxed JavaScript, images, audio, video and PDFs, including bounded local assets and custom browse roots (daemon/cockpit protocol 21.1).
7
+ ## [0.2.7] — 2026-09-23
17
8
 
18
9
  ### Changed
19
10
 
20
- - Move the mobile session sidebar and its expanded drawer to the left, with matching collapse/expand icons.
11
+ - Allow an empty project default base branch to follow the branch currently checked out at the clone location for each new agent or terminal; retain explicit branch choices (daemon/cockpit protocol 21.3; remote protocol remains 2).
21
12
 
22
13
  ### Fixed
23
14
 
24
- - Retire deleted and replaced remote registrations from the relay, retry cleanup across outages/restarts, and expose confirmed removal of legacy phantom hosts in remote settings (daemon/cockpit protocol 21.0; encrypted remote protocol stays 2).
25
- - Keep the current protocol assertion separate from schema tests and verify that older daemons require an upgrade.
15
+ - Fix CI deployment validation by creating a private temporary service environment file from the checked-in example before resolving the Compose configuration.
package/README.md CHANGED
@@ -20,7 +20,27 @@ Puddle manages parallel agents anywhere you SSH into, insulates agents in dedica
20
20
 
21
21
  ## Quick start
22
22
 
23
- **On your local machine where you will be using the GUI, run:**
23
+ **On your local machine where you will be using the GUI:**
24
+
25
+ For a standalone installation without Node.js or npm, use your deployed app's
26
+ installer (replace the example host):
27
+
28
+ ```sh
29
+ curl -fsSL https://app.example.com/install.sh | sh
30
+ ```
31
+
32
+ This installs the CLI under `~/.local/share/puddle/cli` and its launcher at
33
+ `~/.local/bin/puddle`. Add `~/.local/bin` to your `PATH` if the installer asks.
34
+ The standalone releases support Linux x64/arm64 and macOS arm64. The script and
35
+ checksum-verified archives are also attached to this repository's GitHub Releases.
36
+ An optional `--version` selects a release; `--prefix` and `--bin-dir` select the
37
+ installation and launcher directories:
38
+
39
+ ```sh
40
+ curl -fsSL https://app.example.com/install.sh | sh -s -- --version X.Y.Z
41
+ ```
42
+
43
+ Alternatively, with Node.js already installed, use npm:
24
44
 
25
45
  ```sh
26
46
  npm install -g @puddle-code/cli
@@ -56,13 +76,11 @@ detached processes, Puddle instead keeps the daemon attached to the cockpit; clo
56
76
  live processes. The next `puddle launch` restarts the daemon from the host's persistent state and,
57
77
  when auto-resume is enabled (the default), restores the interrupted sessions.
58
78
 
59
- **Daemon-only installs:**
60
-
61
- Daemon-only installs (no CLI) use the `install.sh` attached to each release — see the Releases page of this repository:
62
-
63
- ```sh
64
- curl -fsSL https://github.com/PerceptronV/puddle-code/releases/latest/download/install.sh | sh
65
- ```
79
+ The [deployed app](docs/mobile-access.md#host-the-installer) serves `/install.sh`
80
+ as the single public installer. Install daemon and desktop components through
81
+ `puddle install daemon [user@host]` and `puddle install desktop`. A first
82
+ `puddle launch user@host` still installs a missing daemon automatically from
83
+ GitHub Releases.
66
84
 
67
85
  **Managing components:**
68
86
 
@@ -76,21 +94,13 @@ puddle remove daemon # uninstall; your data stays unless yo
76
94
 
77
95
  **Desktop app (optional):**
78
96
 
79
- The same cockpit also ships as a standalone desktop app — identical UI and engine, plus a File → "Connect to SSH Host…" menu for remote hosts. Grab the dmg (macOS arm64) or AppImage (Linux x64) from the Releases page.
97
+ The same cockpit also ships as a standalone desktop app — identical UI and engine, plus a File → "Connect to SSH Host…" menu for remote hosts. Install it with `puddle install desktop` (macOS arm64 or Linux x64). Once installed, it runs independently of the CLI.
80
98
 
81
99
  An installed Puddle CLI manages the desktop app directly: quit Puddle, then `puddle install desktop`, `puddle upgrade desktop`, or `puddle remove desktop`. On macOS a fresh install goes to `/Applications` when writable, otherwise `~/Applications`; on Linux `install desktop` asks where to put the AppImage (default `~/puddle`) and opens the folder — later updates happen from inside the app.
82
100
 
83
- The macOS downloads are **not code-signed** (an open-source project without Apple Developer Program fees), so Gatekeeper will refuse the first launch. Either allow it once — open the app, let macOS block it, then System Settings → Privacy & Security → **Open Anyway** — or clear the download quarantine in a terminal:
84
-
85
- ```sh
86
- xattr -dr com.apple.quarantine /Applications/Puddle.app
87
- ```
88
-
89
- Building from source avoids the dance entirely (locally built apps are never quarantined): `pnpm build && pnpm --filter @puddle/desktop dist`.
90
-
91
101
  **Host requirements**: Linux with glibc 2.28+ (Ubuntu 20.04+, Debian 11+, RHEL/Rocky 8+;
92
102
  Alpine is not supported) or macOS, with `git` and `curl`, plus whichever agent CLIs you want on
93
- `PATH`. The client side works from any OS with a browser and `ssh` (Windows works, with repeated
103
+ `PATH`. Standalone CLI installs include Node and require no npm; npm installs require Node 22+. The client side works from any OS with a browser and `ssh` (Windows works, with repeated
94
104
  auth prompts unless you use a key).
95
105
 
96
106
  ## How it works
@@ -113,7 +123,7 @@ auth prompts unless you use a key).
113
123
  └───────────────────────────────────┘
114
124
  ```
115
125
 
116
- The CLI serves the UI at a stable local origin and reverse-proxies the API to the daemon, directly in local mode, through the tunnel in SSH mode. The daemon is headless and host-agnostic on `127.0.0.1:7434`. UI updates ship with the CLI (`npm update -g @puddle-code/cli` refreshes the cockpit for every host); the daemon only has to update when the versioned protocol breaks, and the CLI does that automatically. Short-lived host connection leases, separate browser authorisation and exact cockpit Host/Origin checks guard local access. Launch invitations are single-use; browser login survives cockpit restarts, while forwarded applications use a separate loopback origin. After upgrading from the old token flow, run `puddle launch` once to authorise existing tabs.
126
+ The CLI serves the UI at a stable local origin and reverse-proxies the API to the daemon, directly in local mode, through the tunnel in SSH mode. The daemon is headless and host-agnostic on `127.0.0.1:7434`. UI updates ship with the CLI (`puddle upgrade cli` refreshes the cockpit for every host); the daemon only has to update when the versioned protocol breaks, and the launcher asks for approval before updating it. The prompt shows the host, both protocols and how many live sessions the restart interrupts; declining leaves the daemon running. `--no-upgrade` refuses before prompting, and non-interactive launches require an explicit `puddle upgrade daemon [user@host]` first. Short-lived host connection leases, separate browser authorisation and exact cockpit Host/Origin checks guard local access. Launch invitations are single-use; browser login survives cockpit restarts, while forwarded applications use a separate loopback origin. After upgrading from the old token flow, run `puddle launch` once to authorise existing tabs.
117
127
 
118
128
  Everything lives under `~/.puddle` on the host, installed without sudo — and `puddle remove daemon` takes it apart again.
119
129
 
@@ -121,14 +131,14 @@ Everything lives under `~/.puddle` on the host, installed without sudo — and `
121
131
 
122
132
  **One daemon, many clients.** There is a single local daemon per machine, living under `~/.puddle` and run by one supervised service (launchd's `dev.puddle.puddled` on macOS, systemd's `puddled` on Linux). The global `puddle` and a repo-run `node packages/cli/dist/index.js` are **both just clients** that talk to — and, when needed, install — that same daemon. They never run side by side, and there is no separate "dev daemon" alongside a "production daemon".
123
133
 
124
- **Dev build vs. production.** `npm i -g @puddle-code/cli` is the production path — its `puddle` fetches and upgrades the daemon from this repo's GitHub Releases. To exercise uncommitted changes, build and run from the repo:
134
+ **Dev build vs. production.** The standalone installer or `npm i -g @puddle-code/cli` is the production path — its `puddle` fetches and upgrades the daemon from this repo's GitHub Releases. To exercise uncommitted changes, build and run from the repo:
125
135
 
126
136
  ```sh
127
137
  pnpm build && pnpm build:tarball
128
- node packages/cli/dist/index.js start --tarball dist-release/puddled-v*.tar.gz --foreground
138
+ node packages/cli/dist/index.js launch --tarball dist-release/puddled-v*.tar.gz --foreground
129
139
  ```
130
140
 
131
- `--tarball` sets the install _source_ only, and is consulted **only when the CLI actually installs the daemon** — when none is running, the daemon is stopped, or a protocol-major upgrade fires. If a compatible daemon (same protocol major) is already up, `start` just serves the cockpit against it and **the tarball is ignored** (even a newer app version — nothing compares app versions). So to load a fresh dev build over a running daemon you must **stop it first** (see _Kill_ below), then re-run `start --tarball …`. `--foreground` keeps the cockpit attached (`connect <user>@<host> --tarball …` is the remote form). Both clients share one `~/.puddle` daemon and cockpit registry, so `puddle list` / `puddle kill` see either — don't point both at the same host at once. (Never launch the daemon from inside a coding-agent shell: it inherits the agent's env and breaks conversation resume — use a plain terminal.)
141
+ `--tarball` sets the install _source_ only, and is consulted **only when the CLI actually installs the daemon** — when none is running, the daemon is stopped, or a protocol-major upgrade fires. If a compatible daemon (same protocol major) is already up, `launch` just serves the cockpit against it and **the tarball is ignored** (even a newer app version — nothing compares app versions). So to load a fresh dev build over a running daemon you must **stop it first** (see _Kill_ below), then re-run `launch --tarball …`. `--foreground` keeps the cockpit attached (`launch <user>@<host> --tarball …` is the remote form). Both clients share one `~/.puddle` daemon and cockpit registry, so `puddle list` / `puddle kill` see either — don't point both at the same host at once. (Never launch the daemon from inside a coding-agent shell: it inherits the agent's env and breaks conversation resume — use a plain terminal.)
132
142
 
133
143
  **Kill.** `puddle kill --all` (or Ctrl-C in a `--foreground` run) normally stops the local cockpit
134
144
  UI only; a supervised daemon and its sessions keep running. When launch reported that it is keeping
@@ -150,7 +160,7 @@ kill "$(cat ~/.puddle/puddled.pid)" # nohup fallback (no supervi
150
160
 
151
161
  ```sh
152
162
  puddle remove daemon --purge # stops the daemon, unregisters its service, deletes ~/.puddle
153
- puddle remove cli # npm uninstall -g, once the daemons you care about are gone
163
+ puddle remove cli # standalone or npm removal, using its installation channel
154
164
  ```
155
165
 
156
166
  > ⚠️ `~/.puddle` **is** your local state — the SQLite database with every profile, account, and session (plus conversation history), the daemon's worktree tracking, and the auth token. `--purge` deletes it irreversibly (the command lists dirty or unpushed worktrees and asks first); without it, `puddle remove daemon` keeps the data for a later reinstall.
@@ -14834,6 +14834,7 @@ var agentTypeSchema = external_exports.object({
14834
14834
  var repoSchema = external_exports.object({
14835
14835
  id: rowId,
14836
14836
  path: external_exports.string(),
14837
+ /** Empty follows the branch currently checked out at path, resolved for each new session. */
14837
14838
  default_base_branch: external_exports.string(),
14838
14839
  onboarding_notes: external_exports.string().nullable(),
14839
14840
  fetch_enabled: external_exports.boolean(),
@@ -14844,7 +14845,8 @@ var repoWithOrphansSchema = repoSchema.extend({
14844
14845
  });
14845
14846
  var createRepoRequestSchema = external_exports.object({
14846
14847
  path: external_exports.string().min(1),
14847
- default_base_branch: external_exports.string().min(1).optional(),
14848
+ /** Empty follows the clone's current branch; omitted snapshots it at registration. */
14849
+ default_base_branch: external_exports.string().optional(),
14848
14850
  onboarding_notes: external_exports.string().nullable().optional(),
14849
14851
  fetch_enabled: external_exports.boolean().optional()
14850
14852
  });
@@ -14885,7 +14887,8 @@ var repoWorktreesResponseSchema = external_exports.object({
14885
14887
  orphan_branches: external_exports.array(orphanBranchSchema)
14886
14888
  });
14887
14889
  var patchRepoRequestSchema = external_exports.object({
14888
- default_base_branch: external_exports.string().min(1).optional(),
14890
+ /** Empty follows the clone's current branch; omitted leaves the setting unchanged. */
14891
+ default_base_branch: external_exports.string().optional(),
14889
14892
  onboarding_notes: external_exports.string().nullable().optional(),
14890
14893
  fetch_enabled: external_exports.boolean().optional()
14891
14894
  });
@@ -16241,7 +16244,7 @@ async function inspectLegacyHost(home) {
16241
16244
  };
16242
16245
  try {
16243
16246
  const version2 = versionResponseSchema.parse(await get("/api/version"));
16244
- const sessions = sessionSchema.array().parse(await get("/api/sessions"));
16247
+ const sessions = sessionSchema.pick({ status: true }).array().parse(await get("/api/sessions"));
16245
16248
  return hostInspectionSchema.parse({
16246
16249
  t: "inspection",
16247
16250
  port,
@@ -16286,7 +16289,7 @@ async function inspectHostLocally(home) {
16286
16289
  signal: AbortSignal.timeout(3e3)
16287
16290
  });
16288
16291
  if (!response.ok) throw new Error("Host inspection rejected");
16289
- const sessions = sessionSchema.array().parse(await response.json());
16292
+ const sessions = sessionSchema.pick({ status: true }).array().parse(await response.json());
16290
16293
  return hostInspectionSchema.parse({
16291
16294
  t: "inspection",
16292
16295
  port: grant.port,