@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.
- package/CHANGELOG.md +4 -14
- package/README.md +33 -23
- package/dist/host-control.mjs +7 -4
- package/dist/index.js +508 -315
- package/dist/install-cli.sh +167 -0
- package/dist/install.sh +7 -10
- package/dist/public/assets/{App-C2IQg_6K.js → App-BkCGcO4p.js} +2 -2
- package/dist/public/assets/{Dashboard-DUFOyL1_.js → Dashboard-BOK1fw_Q.js} +1 -1
- package/dist/public/assets/{EditorTabClose-C3wpMhYL.js → EditorTabClose-CzMQj4jF.js} +1 -1
- package/dist/public/assets/{FindWidget-Dt1gfA70.js → FindWidget-6LifDkeS.js} +1 -1
- package/dist/public/assets/{LazyTerminal-B9HzmRBx.js → LazyTerminal-Beep0VuJ.js} +2 -2
- package/dist/public/assets/{ModelRefcount-CxzQ3w05.js → ModelRefcount-F2Tf2V5f.js} +1 -1
- package/dist/public/assets/{NewProjectDialog-Cq_1po_h.js → NewProjectDialog-CoI17sqS.js} +1 -1
- package/dist/public/assets/{PaneEditorBody-zS2BI5Fn.js → PaneEditorBody-57BHgi2R.js} +4 -4
- package/dist/public/assets/{PdfViewer-ckjWE_TR.js → PdfViewer-T-uYvXEd.js} +2 -2
- package/dist/public/assets/SettingsDialog-CkBdXZyv.js +8 -0
- package/dist/public/assets/{Terminal-BqbjwcMi.js → Terminal-CJMmk0kO.js} +1 -1
- package/dist/public/assets/{Workspace-BVDgHkML.js → Workspace-0P5NTRzC.js} +6 -6
- package/dist/public/assets/{abnfDiagram-VCTEODGH-JZdwYDGF.js → abnfDiagram-VCTEODGH-Dl2GTGCZ.js} +1 -1
- package/dist/public/assets/architecture-7GRP2DOG-UXEF_VQt.js +1 -0
- package/dist/public/assets/{architectureDiagram-5GKGNRK7-CYoRlLvs.js → architectureDiagram-5GKGNRK7-TLkiib9Z.js} +1 -1
- package/dist/public/assets/{blockDiagram-I7D4REHJ-DjPQ4-5b.js → blockDiagram-I7D4REHJ-CFdDK-5H.js} +1 -1
- package/dist/public/assets/{buffer-store-GUPJI8Wy.js → buffer-store-Pex0dRS2.js} +2 -2
- package/dist/public/assets/{button-CKes3Qwq.js → button-IwQVXqQs.js} +1 -1
- package/dist/public/assets/{c4Diagram-7LVT6UL2-BvwPGpk0.js → c4Diagram-7LVT6UL2-9M5y_7Rr.js} +1 -1
- package/dist/public/assets/channel-D3NmDqec.js +1 -0
- package/dist/public/assets/{chunk-2E4U76K2-DcsuTdxj.js → chunk-2E4U76K2-BEq-rPTx.js} +1 -1
- package/dist/public/assets/{chunk-4HAMMTFA-BGEaVxkg.js → chunk-4HAMMTFA-DSsufXZj.js} +1 -1
- package/dist/public/assets/{chunk-75Z2AOVW-BOvbyaVc.js → chunk-75Z2AOVW-CUihRphW.js} +1 -1
- package/dist/public/assets/{chunk-CLGD4ZFX-8fG7spZS.js → chunk-CLGD4ZFX-8FntHoH6.js} +1 -1
- package/dist/public/assets/{chunk-DU6HZSFF-C94gDWXH.js → chunk-DU6HZSFF-BhI6mdvA.js} +1 -1
- package/dist/public/assets/{chunk-F27PBJKO-CZD-A2b3.js → chunk-F27PBJKO-CflkfzDR.js} +1 -1
- package/dist/public/assets/{chunk-GMAD6QVW-C7KK3kiY.js → chunk-GMAD6QVW-C6sQnCBM.js} +1 -1
- package/dist/public/assets/{chunk-GVQU2GXP-CDFKc0sW.js → chunk-GVQU2GXP-BTEA9yBL.js} +1 -1
- package/dist/public/assets/{chunk-IMKFNOWR-BWQiE1Cp.js → chunk-IMKFNOWR-BTN8pZaT.js} +1 -1
- package/dist/public/assets/{chunk-L3NEJ4N5-DqP3WOXV.js → chunk-L3NEJ4N5-CPMRHY2b.js} +1 -1
- package/dist/public/assets/{chunk-OSK3NFVY-BlmYDJRN.js → chunk-OSK3NFVY-D62Fb29m.js} +1 -1
- package/dist/public/assets/{chunk-P2QGCYS3-v7eQ-UQT.js → chunk-P2QGCYS3-B_AAuki5.js} +1 -1
- package/dist/public/assets/{chunk-POPQ4Y6H-D_gxItFL.js → chunk-POPQ4Y6H-C-wGGj3u.js} +1 -1
- package/dist/public/assets/{chunk-PWAF6VOD-Ds90M0Eb.js → chunk-PWAF6VOD-DElrnMgG.js} +1 -1
- package/dist/public/assets/{chunk-SHT3W25Y-B8oepiFw.js → chunk-SHT3W25Y-D4tV8JU2.js} +1 -1
- package/dist/public/assets/{chunk-SVP7TREG-DjFxplBp.js → chunk-SVP7TREG-CFj2bSX9.js} +1 -1
- package/dist/public/assets/{chunk-TICWLB2K-GEeYOgw4.js → chunk-TICWLB2K-B-5yvDQM.js} +1 -1
- package/dist/public/assets/{chunk-TLUHSLCS-CEnN9wOB.js → chunk-TLUHSLCS-CpBFfaGS.js} +2 -2
- package/dist/public/assets/classDiagram-ZZMXUADV-8X6mwi75.js +1 -0
- package/dist/public/assets/classDiagram-v2-VYDZK3BY-8X6mwi75.js +1 -0
- package/dist/public/assets/{context-menu-CmSSwq3B.js → context-menu-Bh2z-xpu.js} +1 -1
- package/dist/public/assets/{cssMode-BEaREsxj.js → cssMode-iZ32bnYe.js} +1 -1
- package/dist/public/assets/{cynefin-OW5HDTMX-C_sl2wZ-.js → cynefin-OW5HDTMX-D5BzXyX_.js} +1 -1
- package/dist/public/assets/{cynefinDiagram-5FMLGOSQ-CPpFUPl3.js → cynefinDiagram-5FMLGOSQ-CdbgNH0t.js} +1 -1
- package/dist/public/assets/{dagre-GXQ25YYZ-BryapOat.js → dagre-GXQ25YYZ-B7zDDwyp.js} +1 -1
- package/dist/public/assets/{diagram-S7CK7UJ4-dIdCar-k.js → diagram-S7CK7UJ4-WMtT-mtt.js} +1 -1
- package/dist/public/assets/{diagram-UQ7AKVKN-EcAWwfjf.js → diagram-UQ7AKVKN-DtvvWbC3.js} +1 -1
- package/dist/public/assets/{diagram-VSXAHHWV-Dpl4gvkd.js → diagram-VSXAHHWV-DBLLhbuk.js} +1 -1
- package/dist/public/assets/{diagram-VX7I27RA-CJtemv3e.js → diagram-VX7I27RA-6sDOwqqU.js} +1 -1
- package/dist/public/assets/{diagram-Z3DM3KII-CPSnQEgD.js → diagram-Z3DM3KII-giEr0RfN.js} +1 -1
- package/dist/public/assets/{dialog-Dam8WdmS.js → dialog-ClHoWaGa.js} +1 -1
- package/dist/public/assets/{disclosure-Ex-68BU4.js → disclosure-Ch2qCUT3.js} +1 -1
- package/dist/public/assets/{dist-ByY6lqkl.js → dist-C1IA4PaM.js} +1 -1
- package/dist/public/assets/{dist-CxMnSex-.js → dist-ujnACQRA.js} +1 -1
- package/dist/public/assets/{ebnfDiagram-PWID7BFC-uXsUC0ll.js → ebnfDiagram-PWID7BFC-CDfLo0uv.js} +1 -1
- package/dist/public/assets/{erDiagram-RLTQ6QDP-D5vJ6ZLT.js → erDiagram-RLTQ6QDP-z5xLMSlR.js} +1 -1
- package/dist/public/assets/eventmodeling-NTZA5JFV-CzmQ0jM3.js +1 -0
- package/dist/public/assets/flowDiagram-HODETNUW-_tJIQrw7.js +1 -0
- package/dist/public/assets/{ganttDiagram-EL5Y4UJY-C6yTyvpx.js → ganttDiagram-EL5Y4UJY-C2poetEB.js} +1 -1
- package/dist/public/assets/{gitGraph-4MIJSDKK-C7nVbcZ1.js → gitGraph-4MIJSDKK-D40KkO3l.js} +1 -1
- package/dist/public/assets/{gitGraphDiagram-WWUBYQGX-DByBzF_5.js → gitGraphDiagram-WWUBYQGX-B4839p8c.js} +1 -1
- package/dist/public/assets/{hotkeys-MSGaeY2m.js → hotkeys-CY98l7MF.js} +1 -1
- package/dist/public/assets/{htmlMode-DirKEo5j.js → htmlMode-XXBiFVzW.js} +1 -1
- package/dist/public/assets/{index-C1a3rCk2.js → index-D0Lm0Z_9.js} +2 -2
- package/dist/public/assets/index-uKreLbru.css +2 -0
- package/dist/public/assets/{info-A6RAGUB7-BCEGc_J2.js → info-A6RAGUB7-R6D6gcdH.js} +1 -1
- package/dist/public/assets/{infoDiagram-27XIBGKW-DDVeVGK9.js → infoDiagram-27XIBGKW-CQMe7eLM.js} +1 -1
- package/dist/public/assets/{input-i-kiT55N.js → input-BUZTRTzW.js} +1 -1
- package/dist/public/assets/{ishikawaDiagram-5VMMS53U-CTZvKcdI.js → ishikawaDiagram-5VMMS53U-hWJnyGf_.js} +1 -1
- package/dist/public/assets/{journeyDiagram-3NMN7TZE-CwFCP_8e.js → journeyDiagram-3NMN7TZE-DRy7w8VL.js} +1 -1
- package/dist/public/assets/{jsonMode-BLMO7T1W.js → jsonMode-B4KgbobV.js} +1 -1
- package/dist/public/assets/{kanban-definition-UXKFOSKX-BCdCN6ov.js → kanban-definition-UXKFOSKX-Dvv0eWiD.js} +1 -1
- package/dist/public/assets/{line-e7ifLbsv.js → line-K2RkIT6o.js} +1 -1
- package/dist/public/assets/{media-refresh-store-d6Ihz_Yj.js → media-refresh-store-OAgBTFYO.js} +1 -1
- package/dist/public/assets/{mermaid-parser.core-DfmtQ5si.js → mermaid-parser.core-B36v6vc8.js} +3 -3
- package/dist/public/assets/{mermaid.core-B0Ceo892.js → mermaid.core-kqdkh9ua.js} +3 -3
- package/dist/public/assets/{mindmap-definition-YA3MSWOX-BKWZ0hGZ.js → mindmap-definition-YA3MSWOX-CykDXfif.js} +1 -1
- package/dist/public/assets/{notification-permission-DThcB8rO.js → notification-permission-B9hBLJAo.js} +1 -1
- package/dist/public/assets/{packet-AYTQ26CC-C_WSBR7W.js → packet-AYTQ26CC-BDu33u4C.js} +1 -1
- package/dist/public/assets/{pdf-CW6jyF4i.js → pdf-BTD1hhPr.js} +1 -1
- package/dist/public/assets/{pegDiagram-XKGWAZYB-CQw-vxyv.js → pegDiagram-XKGWAZYB-DWdbGFng.js} +1 -1
- package/dist/public/assets/{pie-WAS4IAKB-CyAolSkk.js → pie-WAS4IAKB-CeKUt-Xf.js} +1 -1
- package/dist/public/assets/{pieDiagram-E7YTZNPT-fEikc7gQ.js → pieDiagram-E7YTZNPT-D94ZuRp2.js} +1 -1
- package/dist/public/assets/{project-abbrev-0K47Phcy.js → project-abbrev-E6FngLNw.js} +1 -1
- package/dist/public/assets/protocol-support-C3qZDXsO.js +1 -0
- package/dist/public/assets/{quadrantDiagram-AXDQQJYC-BLZF9CN6.js → quadrantDiagram-AXDQQJYC-DXkTGcPo.js} +1 -1
- package/dist/public/assets/{radar-RG4KPBEZ-DZj09Z3T.js → radar-RG4KPBEZ-C1wtnYrQ.js} +1 -1
- package/dist/public/assets/{railroad-74A4TZTK-DrrM4RhH.js → railroad-74A4TZTK-Dx_D-zM9.js} +1 -1
- package/dist/public/assets/railroad-abnf-HS5TGJTU-CBfnoAOv.js +1 -0
- package/dist/public/assets/railroad-ebnf-LZEXJU2U-0kuF9A11.js +1 -0
- package/dist/public/assets/railroad-peg-WCYAUIDC-DCe0oM6p.js +1 -0
- package/dist/public/assets/{railroadDiagram-O6MQD6OU-BjnjeLPo.js → railroadDiagram-O6MQD6OU-DVuwN3bC.js} +1 -1
- package/dist/public/assets/{requirementDiagram-BXWQKSXE-CJnHoVjp.js → requirementDiagram-BXWQKSXE-nX3JtB1N.js} +1 -1
- package/dist/public/assets/{sankeyDiagram-P5KCCOFB-BFBAycgU.js → sankeyDiagram-P5KCCOFB-DvErANKF.js} +1 -1
- package/dist/public/assets/{sequenceDiagram-WJ2MYXX4-IgIUmdp2.js → sequenceDiagram-WJ2MYXX4-BruH0Mma.js} +1 -1
- package/dist/public/assets/{stateDiagram-D77RDMKH-C8ragRoI.js → stateDiagram-D77RDMKH-BMiYrZ8Y.js} +1 -1
- package/dist/public/assets/stateDiagram-v2-MP3YSRHH-CF86bnO8.js +1 -0
- package/dist/public/assets/{swimlanes-42K2YHIH-mm0BJE0h.js → swimlanes-42K2YHIH-CK3jGfyc.js} +1 -1
- package/dist/public/assets/swimlanesDiagram-VR7AAH4N-COC62XcR.js +8 -0
- package/dist/public/assets/{switch-TfZl8YQu.js → switch-BrFrNOcn.js} +1 -1
- package/dist/public/assets/{timeline-definition-24CTP7MA-CLtACXsf.js → timeline-definition-24CTP7MA-DHf_pf2_.js} +1 -1
- package/dist/public/assets/{treeView-Q6P3EWNA-B_s8YnCD.js → treeView-Q6P3EWNA-C5uB7_Kg.js} +1 -1
- package/dist/public/assets/{treemap-WGGIJYW6-CiyeynoG.js → treemap-WGGIJYW6-BGzjaDxJ.js} +1 -1
- package/dist/public/assets/{tsMode-BJ9DHdAB.js → tsMode-C39Hmal5.js} +1 -1
- package/dist/public/assets/{use-ui-state-2bNBLDPU.js → use-ui-state-D5kpevK-.js} +1 -1
- package/dist/public/assets/{vennDiagram-4TSXK5OY-C9rcT-1u.js → vennDiagram-4TSXK5OY-9mb8KINT.js} +1 -1
- package/dist/public/assets/{wardley-WFR3VGLG-D_hqUvOM.js → wardley-WFR3VGLG-DW5VvBTA.js} +1 -1
- package/dist/public/assets/{wardleyDiagram-VM6X3IG4-Dfn7mGAc.js → wardleyDiagram-VM6X3IG4-DCM5g6RC.js} +1 -1
- package/dist/public/assets/{ws-CDXqi1pN.js → ws-BZ4-LssP.js} +1 -1
- package/dist/public/assets/{xychartDiagram-S5SC5T6Z-vwVJPUe2.js → xychartDiagram-S5SC5T6Z-Bks8gKZc.js} +1 -1
- package/dist/public/index.html +2 -2
- package/package.json +1 -1
- package/dist/public/assets/SettingsDialog-Cb2fdV1D.js +0 -8
- package/dist/public/assets/architecture-7GRP2DOG-RMEcXYv9.js +0 -1
- package/dist/public/assets/channel-BheYsxDc.js +0 -1
- package/dist/public/assets/classDiagram-ZZMXUADV-CDDLBiV5.js +0 -1
- package/dist/public/assets/classDiagram-v2-VYDZK3BY-CDDLBiV5.js +0 -1
- package/dist/public/assets/eventmodeling-NTZA5JFV-WlMCgowE.js +0 -1
- package/dist/public/assets/flowDiagram-HODETNUW-DJ99l88N.js +0 -1
- package/dist/public/assets/index-Ctw2P0rY.css +0 -2
- package/dist/public/assets/protocol-support-C1NCVjbV.js +0 -1
- package/dist/public/assets/railroad-abnf-HS5TGJTU-lXe6u3FO.js +0 -1
- package/dist/public/assets/railroad-ebnf-LZEXJU2U-C7R4jvUV.js +0 -1
- package/dist/public/assets/railroad-peg-WCYAUIDC-B24HGcGJ.js +0 -1
- package/dist/public/assets/stateDiagram-v2-MP3YSRHH-AU0bFC0Z.js +0 -1
- package/dist/public/assets/swimlanesDiagram-VR7AAH4N-cBVuNXB5.js +0 -8
package/CHANGELOG.md
CHANGED
|
@@ -1,25 +1,15 @@
|
|
|
1
1
|
<!--
|
|
2
|
-
|
|
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.
|
|
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
|
-
-
|
|
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
|
-
-
|
|
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
|
|
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
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
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.
|
|
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 (`
|
|
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
|
|
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, `
|
|
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
|
|
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.
|
package/dist/host-control.mjs
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
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,
|