@fabiofiorita/porcelain 0.61.4 → 0.61.5
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/README.md +19 -91
- package/main/contracts/protocol.js +1 -1
- package/main/daemon/server.js +581 -446
- package/package.json +1 -1
- package/renderer/assets/{canvas-view-CP8ERFFo.js → canvas-view-LMZrGowf.js} +1 -1
- package/renderer/assets/{changeset-view-ChhWngSt.js → changeset-view-C9WS-xTp.js} +1 -1
- package/renderer/assets/{commit-view-BBt78MEY.js → commit-view-D2CCQRGP.js} +1 -1
- package/renderer/assets/{diff-mode-toggle-CHtDqrj8.js → diff-mode-toggle-BJH6JAbm.js} +1 -1
- package/renderer/assets/{diff-view-DVOnJ175.js → diff-view-DtjcmDEV.js} +1 -1
- package/renderer/assets/{file-content-Bvw7I8oe.js → file-content-BO3v-2Ug.js} +1 -1
- package/renderer/assets/{hunks-view-BROc5i5k.js → hunks-view-CKHJOVu-.js} +1 -1
- package/renderer/assets/index-BRjz3dhN.js +282 -0
- package/renderer/assets/{markdown-view-BGSb8H2a.js → markdown-view-DlMPbesV.js} +1 -1
- package/renderer/assets/{search-view-AY2AjflP.js → search-view-v7eI-VVZ.js} +1 -1
- package/renderer/assets/{surface-BrHGBRnQ.js → surface-Bo3qAoR6.js} +1 -1
- package/renderer/assets/{unfold-vertical-_O-8TSgi.js → unfold-vertical-CtzN45K4.js} +1 -1
- package/renderer/assets/{virtual-rows-Cki_HEoI.js → virtual-rows-CDq5ZsoH.js} +1 -1
- package/renderer/index.html +1 -1
- package/renderer/assets/index-DGzBBc-y.js +0 -282
package/README.md
CHANGED
|
@@ -1,39 +1,20 @@
|
|
|
1
|
-
# @fabiofiorita/porcelain (0.61.
|
|
1
|
+
# @fabiofiorita/porcelain (0.61.5)
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
HTTP/WS surface the Mac app and browser clients already talk to.
|
|
3
|
+
The Electron-free Porcelain daemon and browser client, packaged for plain Node. Run it on the
|
|
4
|
+
machine that owns the repositories and terminals you want to review.
|
|
6
5
|
|
|
7
|
-
##
|
|
6
|
+
## Start and pair
|
|
8
7
|
|
|
9
|
-
|
|
8
|
+
The host needs Node 22+, Git, and a C toolchain for the first `node-pty` build:
|
|
10
9
|
|
|
11
10
|
```sh
|
|
12
|
-
npx @fabiofiorita/porcelain@latest serve
|
|
11
|
+
npx @fabiofiorita/porcelain@latest serve
|
|
12
|
+
npx @fabiofiorita/porcelain@latest access issue --name "My device"
|
|
13
13
|
```
|
|
14
14
|
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
stale npx cache of an older version).
|
|
19
|
-
2. Compiles `node-pty` for this host on first install.
|
|
20
|
-
3. Starts the daemon on port **43117**, with LAN access and opt-in
|
|
21
|
-
public HTTPS through a Cloudflare tunnel.
|
|
22
|
-
4. Keeps host administration local; it never prints the administrator credential.
|
|
23
|
-
|
|
24
|
-
Leave the process in the foreground while you work (Termius / tmux / SSH session).
|
|
25
|
-
Ctrl+C stops it — **no systemd required**. Start it when you sit down; stop it
|
|
26
|
-
when you're done.
|
|
27
|
-
|
|
28
|
-
### Pair a device
|
|
29
|
-
|
|
30
|
-
```sh
|
|
31
|
-
npx @fabiofiorita/porcelain@latest access issue --name "My phone"
|
|
32
|
-
```
|
|
33
|
-
|
|
34
|
-
Open the printed connection link in a browser, or paste it into the Mac app's
|
|
35
|
-
**Settings → Remotes**. The link expires in 15 minutes, works once, and becomes
|
|
36
|
-
an individually revocable device credential. Manage access only on the host:
|
|
15
|
+
Porcelain always binds loopback and never `0.0.0.0`. Add `--lan`, `--tailnet`, or
|
|
16
|
+
`--cloudflare` only for the route you intend to expose. Every client uses its own one-time pairing
|
|
17
|
+
link; the host administrator token is never shared. Manage paired devices on the host:
|
|
37
18
|
|
|
38
19
|
```sh
|
|
39
20
|
npx @fabiofiorita/porcelain@latest access list
|
|
@@ -41,78 +22,25 @@ npx @fabiofiorita/porcelain@latest access revoke <id>
|
|
|
41
22
|
npx @fabiofiorita/porcelain@latest share status
|
|
42
23
|
```
|
|
43
24
|
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
porcelain serve [options]
|
|
48
|
-
porcelain access issue --name <device> [--base-url <url>]
|
|
49
|
-
porcelain access list | revoke <id>
|
|
50
|
-
porcelain share status
|
|
51
|
-
|
|
52
|
-
--port <n> Port (default 43117)
|
|
53
|
-
--user-data <path> Config dir (default ~/.local/share/porcelain)
|
|
54
|
-
--tailnet Bind Tailscale interface too
|
|
55
|
-
--lan Bind RFC1918 LAN addresses too
|
|
56
|
-
--cloudflare Publish loopback over Cloudflare (named or quick)
|
|
57
|
-
--allowed-origin <origin>
|
|
58
|
-
Trust a browser Hub origin (repeat for more than one)
|
|
59
|
-
--no-watchdog For systemd / supervisors (stdin is /dev/null)
|
|
60
|
-
```
|
|
25
|
+
For exposure flags, browser origins, systemd, updates, and troubleshooting, use the current
|
|
26
|
+
[remote-access guide](https://github.com/FabioFiorita/porcelain/blob/main/docs/remote-access.md) and
|
|
27
|
+
`porcelain --help` rather than copying a service file from an older package version.
|
|
61
28
|
|
|
62
|
-
|
|
63
|
-
Cloudflare is public HTTPS but still credential-gated. Tailscale and Cloudflare are
|
|
64
|
-
exclusive; LAN can combine with either.
|
|
29
|
+
## Agent connection
|
|
65
30
|
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
```ini
|
|
71
|
-
[Service]
|
|
72
|
-
Environment=PORCELAIN_USER_DATA=%h/.local/share/porcelain
|
|
73
|
-
Environment=PORCELAIN_DAEMON_PORT=43117
|
|
74
|
-
Environment=PORCELAIN_ALLOWED_ORIGIN=http://hub-host:43118
|
|
75
|
-
Environment=PORCELAIN_TAILNET_BIND=1
|
|
76
|
-
Environment=PORCELAIN_NO_STDIN_WATCHDOG=1
|
|
77
|
-
ExecStart=/usr/bin/npx --yes @fabiofiorita/porcelain@latest serve --no-watchdog --tailnet
|
|
78
|
-
Restart=on-failure
|
|
79
|
-
```
|
|
80
|
-
|
|
81
|
-
Prefer a real `node` binary over Volta/fnm/nvm shims in `ExecStart` when pinning
|
|
82
|
-
a global install instead of npx.
|
|
83
|
-
|
|
84
|
-
For a browser Hub served from another origin, set `PORCELAIN_ALLOWED_ORIGIN` to that Hub's
|
|
85
|
-
bare `http(s)` origin (repeat `--allowed-origin` for multiple Hubs; comma-separated values
|
|
86
|
-
are accepted). Paths, credentials, wildcards, and `null` are rejected. This setting only
|
|
87
|
-
controls CORS response headers; every API and WebSocket request remains token-gated.
|
|
88
|
-
|
|
89
|
-
## Agent access (MCP)
|
|
90
|
-
|
|
91
|
-
The daemon serves the Model Context Protocol at `POST /mcp` for direct loopback agent
|
|
92
|
-
clients without an admin token. LAN, Tailscale, Cloudflare, and proxied requests receive
|
|
93
|
-
404. Install the plugin through your client's native plugin manager. For an Agent Plugin client,
|
|
94
|
-
add the repository `FabioFiorita/porcelain`; for Claude Code, use:
|
|
31
|
+
Install the Porcelain plugin through the agent's plugin manager. Its bundled stdio connector
|
|
32
|
+
forwards MCP to the matching daemon's profile-scoped local OS socket; it is not exposed through the
|
|
33
|
+
daemon's LAN, Tailscale, Cloudflare, or renderer HTTP routes. Claude Code can install it with:
|
|
95
34
|
|
|
96
35
|
```text
|
|
97
36
|
/plugin marketplace add FabioFiorita/porcelain
|
|
98
37
|
/plugin install porcelain@porcelain
|
|
99
38
|
```
|
|
100
39
|
|
|
101
|
-
|
|
102
|
-
daemon ships new tools with no per-agent configuration to rewrite.
|
|
103
|
-
|
|
104
|
-
## Requirements
|
|
105
|
-
|
|
106
|
-
- **Node ≥ 22**
|
|
107
|
-
- **git** on PATH
|
|
108
|
-
- A **C toolchain** (make, g++, python3) — first install compiles `node-pty`
|
|
109
|
-
|
|
110
|
-
## Develop / ship from the monorepo
|
|
40
|
+
## Repository packaging
|
|
111
41
|
|
|
112
42
|
```sh
|
|
113
43
|
pnpm build && pnpm daemon:dist
|
|
114
|
-
cd dist-daemon && npm publish --access public
|
|
115
44
|
```
|
|
116
45
|
|
|
117
|
-
|
|
118
|
-
`dist-daemon/` by hand — regenerate.
|
|
46
|
+
`dist-daemon/` is generated from the completed product build; do not edit it by hand.
|
|
@@ -25,7 +25,7 @@ __export(protocol_exports, {
|
|
|
25
25
|
});
|
|
26
26
|
module.exports = __toCommonJS(protocol_exports);
|
|
27
27
|
var import_zod = require("zod");
|
|
28
|
-
var PROTOCOL_VERSION =
|
|
28
|
+
var PROTOCOL_VERSION = 2;
|
|
29
29
|
var PROTOCOL_VERSION_HEADER = "x-porcelain-protocol-version";
|
|
30
30
|
var protocolVersionSchema = import_zod.z.literal(PROTOCOL_VERSION);
|
|
31
31
|
// Annotate the CommonJS export names for ESM import in node:
|