moondesk 0.5.4 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -119,10 +119,12 @@ one ngrok domain
119
119
 
120
120
  Each workspace keeps its own file boundary, command jobs, retained output, history, and secret connector URL.
121
121
 
122
- Use `[w] Workspaces` to add, rename, inspect, copy, rotate, or remove projects. Launching `moondesk` from another project while a host is already running can attach that directory to the existing host instead of starting another server.
122
+ Use `[w] Workspaces` to add, rename, inspect, copy, rotate, or remove projects. On Windows, `[b] Explorer` opens the native Explorer folder picker for adding a workspace; `[a] Path` remains available for manual path entry. Launching `moondesk` from another project while a host is already running can attach that directory to the existing host instead of starting another server.
123
123
 
124
124
  Browser control is shared by the host, so workspaces using browser mode control the same selected browser/DevTools bridge.
125
125
 
126
+ Because every workspace shares this host and public tunnel, stopping MoonDesk disconnects all active workspace connectors. Pressing `q` or `Ctrl+C` in the live dashboard therefore opens a shutdown confirmation instead of stopping the host immediately; `Enter` confirms and `Esc` keeps MoonDesk running.
127
+
126
128
  ## Tools
127
129
 
128
130
  In `multi-tools` mode MoonDesk exposes 12 local tools:
package/npm/moondesk.js CHANGED
@@ -39,14 +39,31 @@ function cleanupEphemeralUpdateFiles(statePath, requestPath) {
39
39
 
40
40
  function runNative(binaryPath, args, options = {}) {
41
41
  const spawnImpl = options.spawnImpl ?? spawn;
42
+ const signalTarget = options.signalTarget ?? process;
42
43
  return new Promise((resolve, reject) => {
43
44
  const child = spawnImpl(binaryPath, args, {
44
45
  cwd: options.cwd ?? process.cwd(),
45
46
  env: options.env ?? process.env,
46
47
  stdio: "inherit",
47
48
  });
48
- child.once("error", reject);
49
- child.once("exit", (code, signal) => resolve({ code: code ?? 1, signal }));
49
+
50
+ // The native TUI owns Ctrl+C confirmation once the shared host is running.
51
+ // Without a listener, Node's default SIGINT behavior can terminate the npm
52
+ // wrapper before the native child restores the terminal and closes ngrok.
53
+ const ignoreParentSigint = () => {};
54
+ signalTarget.on?.("SIGINT", ignoreParentSigint);
55
+ const cleanupSignalHandler = () => {
56
+ signalTarget.off?.("SIGINT", ignoreParentSigint);
57
+ };
58
+
59
+ child.once("error", (error) => {
60
+ cleanupSignalHandler();
61
+ reject(error);
62
+ });
63
+ child.once("exit", (code, signal) => {
64
+ cleanupSignalHandler();
65
+ resolve({ code: code ?? 1, signal });
66
+ });
50
67
  });
51
68
  }
52
69
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "moondesk",
3
- "version": "0.5.4",
3
+ "version": "0.6.0",
4
4
  "description": "MoonDesk — use ChatGPT Chat as a local coding agent, by Shattermoon.",
5
5
  "author": "Shattermoon",
6
6
  "license": "MIT",