moondesk 0.11.3 → 0.11.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.
Files changed (2) hide show
  1. package/README.md +116 -139
  2. package/package.json +1 -1
package/README.md CHANGED
@@ -1,87 +1,106 @@
1
+ <div align="center">
2
+
1
3
  # MoonDesk
2
4
 
3
5
  **Turn ChatGPT Chat into a local coding agent.**
4
6
 
5
- MoonDesk is an open-source local MCP server that gives ChatGPT tools to read and edit files, run commands, manage long-running jobs, and control Chromium-based browsers without using the OpenAI API.
7
+ Files, shell commands, browser automation, multiple workspaces, and session handoffsthrough one local MCP host.
8
+
9
+ **No reverse engineering. No OpenAI API key. No separate agent service.**
10
+
11
+ [Quickstart](#quickstart) · [Features](#what-you-get) · [Safety](#safety) · [Contributing](#contributing)
6
12
 
7
13
  ```bash
8
14
  npm install -g moondesk
9
15
  ```
10
16
 
17
+ </div>
18
+
11
19
  > [!IMPORTANT]
12
- > MoonDesk runs tools locally on your computer. Review commands before running them, and use an isolated environment for untrusted projects or code.
20
+ > MoonDesk can execute commands and modify files on your computer. Use it only with workspaces and instructions you trust. For untrusted code, use a VM or container.
13
21
 
14
- ## Why MoonDesk?
22
+ ## What is MoonDesk?
23
+
24
+ MoonDesk is an open-source local MCP server that connects ChatGPT to your development environment.
15
25
 
16
- MoonDesk lets you use the ChatGPT subscription you already have for local coding work. ChatGPT connects to MoonDesk through a Custom Connector, and MoonDesk exposes your project as a set of MCP tools.
26
+ Run it inside a project, connect the workspace URL to ChatGPT as a Custom Connector, and ChatGPT can work with that project using local tools.
17
27
 
18
28
  ```text
19
- ChatGPT Chat
20
-
21
- │ Custom Connector
22
-
23
- MoonDesk
24
- ├─ Files
25
- ├─ Shell jobs
26
- ├─ Workspaces
27
- └─ Browser / DevTools
29
+ ChatGPT
30
+
31
+ │ Custom Connector / MCP
32
+
33
+ MoonDesk
34
+ ├─ Files
35
+ ├─ Shell jobs
36
+ ├─ Browser / DevTools
37
+ ├─ Workspaces
38
+ └─ Session handoffs
28
39
  ```
29
40
 
30
- No reverse engineering. No API key. No separate agent service.
41
+ Your code stays on your machine unless a tool you run sends it somewhere else.
42
+
43
+ ## What you get
44
+
45
+ | Capability | What it gives ChatGPT |
46
+ | --- | --- |
47
+ | **Files** | Read, search, edit, write, and delete inside a project workspace. |
48
+ | **Shell** | Run tests, builds, package installs, dev servers, Git, and other developer commands. |
49
+ | **Browser** | Control a dedicated Chromium session, inspect the DOM/console, emulate viewports, and visually inspect pages. |
50
+ | **Workspaces** | Serve multiple projects from one host, each with its own secret MCP URL. |
51
+ | **Handoffs** | Save continuation state when moving a long task to a fresh conversation. |
52
+ | **Permissions** | Use full local tools or a reduced read-only mode. |
53
+ | **Verified installs** | Download the matching native binary on first run and verify it against the release SHA-256. |
54
+
55
+ MoonDesk runs on **Windows, macOS, and Linux**.
56
+
57
+ ## Why MoonDesk?
58
+
59
+ ChatGPT is already good at reasoning about code. MoonDesk gives it the local execution layer, so you can stop copying files into chat and pasting terminal output back and forth.
31
60
 
32
- ## Features
61
+ One MoonDesk process can serve several repositories at once:
33
62
 
34
- - **Local file tools** — read, search, write, edit, and delete inside a workspace.
35
- - **Shell commands** — run short commands or start background jobs with polling, preserved output, and cancellation.
36
- - **Multiple workspaces** serve several projects from one MoonDesk process, each with its own secret MCP URL.
37
- - **Headless agent browser by default** a small `set_browser_presentation` + `browser_command` + `view_page` surface backed by a pinned Chrome DevTools runtime. Selecting Browser/Both does not launch Chrome; the shared isolated browser starts lazily on first use without opening a desktop window unless the user or agent switches it to visible mode.
38
- - **Read-only mode** expose only safe local read tools when mutation is unnecessary.
39
- - **Cross-platform** — Windows, macOS, and Linux.
40
- - **Native binary distribution** — install with npm; MoonDesk downloads and verifies the matching release binary on first run.
41
- - **Self-update** — global npm installs can update and restart from the TUI after confirmation.
63
+ ```text
64
+ MoonDesk host
65
+ ├── Project A ── secret MCP URL ──> D:\ProjectA
66
+ ├── Project B ── secret MCP URL ──> D:\ProjectB
67
+ └── Project C ── secret MCP URL ──> D:\ProjectC
68
+ ```
42
69
 
43
70
  ## Quickstart
44
71
 
45
72
  ### 1. Install
46
73
 
47
- MoonDesk requires Node.js `^20.19.0 || ^22.12.0 || >=23`, matching the pinned browser runtime. Node 21 and Node 22.0-22.11 are not supported.
74
+ MoonDesk requires Node.js `^20.19.0 || ^22.12.0 || >=23`.
48
75
 
49
76
  ```bash
50
77
  npm install -g moondesk
51
78
  ```
52
79
 
53
- ### 2. Run
54
-
55
- Start MoonDesk inside the project you want to use:
80
+ ### 2. Start it in your project
56
81
 
57
82
  ```bash
58
83
  cd your-project
59
84
  moondesk
60
85
  ```
61
86
 
62
- Choose:
63
-
64
- - `Control Computer`
65
- - `Control Browser`
66
- - `Both`
87
+ Choose `Control Computer`, `Control Browser`, or `Both`.
67
88
 
68
- On first launch, MoonDesk asks for your **ngrok authtoken** and **static domain**. MoonDesk stores them in its config file (`%USERPROFILE%\.moondesk\config.toml` on Windows and `$HOME/.moondesk/config.toml` on macOS/Linux). You can update either value later from Settings; the authtoken editor is masked, Settings only shows whether a token is configured, and it also shows the exact active config path.
69
-
70
- When upgrading on Windows from a version that previously used a conflicting `HOME\.moondesk\config.toml`, the next MoonDesk host startup migrates that existing config once into the canonical `%USERPROFILE%` location. The migration preserves the complete workspace registry and connector identities; it does **not** clear or recreate users' workspaces. If another process creates the canonical config during that migration, the canonical file wins and the legacy source is retained instead of being overwritten or deleted. A migration marker beside the legacy location prevents a stale legacy config from being imported again later if Windows could not remove it or another old process recreates it.
89
+ On first launch, MoonDesk asks for an **ngrok authtoken** and **static domain** and stores them in its local config.
71
90
 
72
91
  ### 3. Copy the workspace URL
73
92
 
74
- Open `[w] Workspaces` in the TUI and copy the MCP URL for your project.
75
-
76
- Each workspace has its own secret URL, for example:
93
+ Open `[w] Workspaces` in the TUI and copy the MCP URL:
77
94
 
78
95
  ```text
79
96
  https://your-domain.ngrok-free.dev/<workspace-secret>/mcp
80
97
  ```
81
98
 
82
- ### 4. Create the ChatGPT connector
99
+ > Treat this URL like a credential.
100
+
101
+ ### 4. Add it to ChatGPT
83
102
 
84
- Open ChatGPT's Custom Connector settings and create a connector with:
103
+ Create a Custom Connector:
85
104
 
86
105
  ```text
87
106
  Name: MoonDesk · <project name>
@@ -89,124 +108,76 @@ MCP Server URL: <URL copied from MoonDesk>
89
108
  Authentication: None
90
109
  ```
91
110
 
92
- For full coding-agent behavior, allow write actions only when you trust the current workspace and task.
111
+ Allow write actions only when you trust the workspace and task.
93
112
 
94
113
  ### 5. Add the recommended instruction
95
114
 
96
- Add this to your ChatGPT custom instructions:
97
-
98
115
  ```text
99
116
  MoonDesk is a coding tool and a custom connector. Always use MoonDesk if the user wants to do anything related to file operations. Always call `moondesk_instruction` after `list_resources`, and follow the instructions it contains.
100
117
  ```
101
118
 
102
- That's it. Select the MoonDesk connector in a ChatGPT conversation and start working.
103
-
104
- ### Windows security software
105
-
106
- MoonDesk verifies the downloaded native binary against the SHA-256 published with the matching GitHub Release before launching it. If Windows Security or another antivirus quarantines that verified executable, update its security definitions and check Protection History, then run `moondesk` again. Do not disable antivirus protection or exclude the whole MoonDesk directory just to bypass a detection; report suspected false positives with the exact release version and SHA-256 instead.
119
+ Select the connector and start working.
107
120
 
108
- ## Multiple projects
121
+ ## Browser control
109
122
 
110
- One MoonDesk host can serve several project roots at once:
123
+ MoonDesk owns a dedicated agent browser instead of attaching to your personal browser profile. It starts lazily, runs headless by default, and can be switched to visible mode for human-assisted steps such as logins or permission prompts.
111
124
 
112
- ```text
113
- one MoonDesk process
114
- one local server :3200
115
- one ngrok domain
116
-
117
- ├── Project A -> /<secret-A>/mcp -> D:\ProjectA
118
- ├── Project B -> /<secret-B>/mcp -> D:\ProjectB
119
- └── Project C -> /<secret-C>/mcp -> D:\ProjectC
125
+ ```bash
126
+ moondesk browser navigate_page --url=http://localhost:3000
127
+ moondesk browser emulate --viewport=390x844x1,mobile,touch
128
+ moondesk browser take_snapshot
129
+ moondesk browser list_console_messages
120
130
  ```
121
131
 
122
- Each workspace keeps its own file boundary, command jobs, retained output, history, and secret connector URL.
132
+ Use `view_page` when the task depends on actual rendered pixels rather than only a text/accessibility snapshot.
123
133
 
124
- 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.
134
+ For browser-runtime invariants and implementation details, see [`docs/BROWSER_RUNTIME_ARCHITECTURE_HARDENING.md`](docs/BROWSER_RUNTIME_ARCHITECTURE_HARDENING.md).
125
135
 
126
- When no saved workspace registry exists, MoonDesk creates workspace #1 from the directory it was launched in (or `WORKSPACE_ROOT`). After deleting/resetting the config, launching again from the same project can therefore show the same workspace name and root even though it is a freshly generated registration with a new secret. Startup logs state explicitly when this bootstrap path was used.
136
+ ## Workspaces and handoffs
127
137
 
128
- ### Session handoffs
138
+ Each workspace keeps its own root, secret connector URL, command jobs, retained output, history, and handoff state. Use `[w] Workspaces` to add, rename, inspect, copy, rotate, or remove projects.
129
139
 
130
- Session handoffs are manual and explicit. When you ask ChatGPT for a handoff, say you are moving the work to another chat, or otherwise explicitly request continuation state, ChatGPT can call `create_handoff`. MoonDesk does not create handoffs silently or periodically in the background. The checkpoint is stored in MoonDesk's data directory (`%USERPROFILE%\.moondesk\handoffs\<workspace-id>\` on Windows; `$HOME/.moondesk/handoffs/<workspace-id>/` on macOS/Linux) rather than inside the project and contains the goal, completed work, decisions, validation, blockers, next steps, optional notes, the current Git branch/HEAD/status/recent commits, and currently running MoonDesk command jobs. Never put credentials, tokens, passwords, private keys, or other secrets in handoff text.
140
+ Handoffs are explicit checkpoints. `create_handoff` saves the task goal, completed work, decisions, validation, blockers, next steps, Git state, and current MoonDesk jobs. `resume_handoff` reloads the checkpoint and checks for drift; `complete_handoff` marks the continuation finished.
131
141
 
132
- On a later connection, `moondesk_instruction` automatically announces the newest active handoff for that exact persisted MoonDesk workspace UUID. Call `resume_handoff` with the reported ID before continuing. MoonDesk re-reads current Git and retained command-job state and reports drift such as a changed branch/HEAD, working-tree changes, moved workspace root, completed/missing jobs, or new running jobs. The checkpoint remains recoverable after resume; call `complete_handoff` only when the continuation is genuinely finished. Creating a newer checkpoint supersedes older active checkpoints while retaining a bounded recent history; once the per-workspace history limit is exceeded, MoonDesk prunes only the oldest inactive checkpoints and never the active checkpoint.
142
+ > [!CAUTION]
143
+ > Never put credentials, tokens, passwords, private keys, or other secrets in handoff text.
133
144
 
134
- Handoff metadata changes MoonDesk's own persistent state, so `create_handoff`, `resume_handoff`, and `complete_handoff` are available in `multi-tools` mode, not `read-only` mode. Discovery through `moondesk_instruction` remains read-only. `create_handoff` can optionally return a portable Markdown rendering for manual export, but ChatGPT Library is not required for normal recovery.
145
+ Stopping the MoonDesk host disconnects every active workspace connector, so shutdown from the live dashboard requires confirmation.
135
146
 
136
- Browser control is shared by the host. Workspaces using browser mode share one lazy **isolated agent browser** session that starts only on first use. It runs **headless by default** at a deterministic 1280×800 initial viewport, so normal agent work does not open a Chrome window, while `view_page` and screenshots still inspect the browser's rendered pixels. Agents can still resize or emulate the target viewport for responsive QA. Press `[v]` in the live dashboard to switch between hidden/headless and visible presentation; the Browser status row shows the current mode and the toggle hint. In `multi-tools` mode an agent can also call `set_browser_presentation`, primarily when a login, CAPTCHA, permission prompt, or other step needs human input. If changing presentation would close a live session, the tool refuses the change and reports `confirmation_required`; the agent must get explicit user approval before retrying with `confirm_restart=true`. Changing presentation while the browser is running closes that temporary session first, so its tabs, cookies, storage, page state, and snapshot UIDs are discarded. Switching to visible starts a fresh empty visible browser immediately; if that headful launch fails, MoonDesk reverts the setting to headless so later agent browser work remains usable. A human-assisted visible session should stay visible while its entered state is still needed; switching back to headless closes that session and returns to lazy hidden startup on the next browser action. MoonDesk never attaches to or reuses your personal browser profile, cookies, or logged-in sessions.
147
+ ## Safety
137
148
 
138
- 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.
149
+ Dedicated file tools stay inside the selected workspace and reject path traversal plus symlink/junction escapes.
139
150
 
140
- ## Tools
151
+ Shell tools are different:
141
152
 
142
- In `multi-tools` mode MoonDesk exposes 17 local computer/workspace tools:
153
+ > `run_command` and `start_command` execute your normal developer shell with the workspace as its working directory. They inherit your normal environment, credentials, `PATH`, and OS permissions.
143
154
 
144
- | Tool | Purpose |
145
- | --- | --- |
146
- | `moondesk_instruction` | MoonDesk usage guidance and active-handoff discovery |
147
- | `create_handoff` | Persist a workspace-scoped session checkpoint |
148
- | `resume_handoff` | Load a checkpoint and verify current Git/job drift |
149
- | `complete_handoff` | Mark a continuation finished |
150
- | `read` | Read workspace or explicitly addressed local files |
151
- | `view_image` | Inspect one local image with model vision |
152
- | `view_images` | Inspect several local images together |
153
- | `search` | Search workspace text |
154
- | `write` | Create or overwrite files |
155
- | `edit` | Replace exact text |
156
- | `delete` | Delete files or directories |
157
- | `run_command` | Run a short shell command |
158
- | `start_command` | Start a background command |
159
- | `list_commands` | List current and retained jobs |
160
- | `poll_command` | Read incremental job output |
161
- | `read_command_output` | Read preserved command output |
162
- | `cancel_command` | Stop a job and its process tree |
163
-
164
- Use `run_command` for short work. Use `start_command` + `poll_command` for builds, tests, package installs, dev servers, and other long-running commands. Polls long-wait by default and report elapsed, idle, and timeout timing so agents can avoid rapid blind polling.
165
-
166
- `read-only` mode removes workspace mutation/shell tools and MoonDesk metadata mutation tools such as `create_handoff`, `resume_handoff`, and `complete_handoff`. `moondesk_instruction` can still report that an active handoff exists. In Browser/Both mode, read-only also permits bounded browser inspection while state-changing browser commands and browser file-output flags remain blocked.
167
-
168
- Browser mode has a stable tool catalog instead of forwarding the full Chrome DevTools MCP schema:
169
-
170
- | Browser tool | Purpose |
171
- | --- | --- |
172
- | `set_browser_presentation` | In `multi-tools`, request headless or visible presentation; live-session changes require explicit restart confirmation |
173
- | `browser_command` | Run one browser/DevTools CLI operation in the shared lazy session |
174
- | `view_page` | Attach the current rendered page directly to the model as bounded image content |
155
+ **The workspace directory is not an OS sandbox.**
175
156
 
176
- For one-off actions, use `browser_command`. Navigate first, set the target viewport, then run `take_snapshot` before element interactions and use UIDs from the latest snapshot. Use `resize_page` for ordinary desktop window sizes. For exact tablet/mobile QA, use `emulate --viewport=390x844x1,mobile,touch` (or another target size); Chromium can clamp very narrow desktop windows, and viewport emulation can recreate the page context, so take a fresh snapshot afterward. For visual layout/rendering checks, use `view_page`; text/accessibility snapshots do not replace pixel inspection.
177
-
178
- The same `moondesk` CLI also has a `browser` subcommand for deterministic scripted flows in `Both` mode:
179
-
180
- ```bash
181
- moondesk browser skill
182
- moondesk browser navigate_page --url=http://localhost:3000
183
- moondesk browser emulate --viewport=390x844x1,mobile,touch
184
- moondesk browser take_snapshot
185
- moondesk browser list_console_messages
186
- ```
157
+ Use read-only mode when mutation is unnecessary, and use a VM or container for untrusted code.
187
158
 
188
- The `browser` subcommand is handled by MoonDesk itself and acts as a lightweight authenticated localhost client to the **running MoonDesk host**. It does not launch a separate browser runtime, so separate shell commands, MCP `browser_command`, and MCP `view_page` all operate on the same host-owned agent-browser session. MoonDesk directly owns the pinned `chrome-devtools-mcp` stdio process tree and its isolated Chromium child instead of relying on the upstream detached CLI daemon. The browser starts headless by default; visible mode changes only Chromium presentation, not the browser tool surface or isolation model. Each agent-browser session uses an isolated temporary profile, so personal cookies/logins are never inherited and browser state is discarded when that session ends. Sensitive network headers are redacted, CrUX URL lookups and usage statistics are disabled, local-file navigation is blocked, and a lost runtime is invalidated so the next browser operation starts a fresh isolated session without replaying the ambiguous failed action.
159
+ > [!CAUTION]
160
+ > Never share a workspace MCP URL. Anyone who can use it may be able to invoke the tools you exposed.
189
161
 
190
- The browser runtime is intentionally pinned to `chrome-devtools-mcp@1.7.0`. Version `1.8.0` changed required CLI argument shapes for commands MoonDesk currently invokes with the 1.7 contract, so upgrading the pin requires an explicit command-contract migration and the full browser regression matrix rather than a blind dependency bump.
162
+ ## Reference
191
163
 
192
- ## Workspace security
164
+ <details>
165
+ <summary><strong>Tools</strong></summary>
193
166
 
194
- Dedicated file tools are confined to the selected workspace. MoonDesk rejects path traversal and symlink/junction escapes outside that root.
167
+ **Guidance / handoffs:** `moondesk_instruction`, `create_handoff`, `resume_handoff`, `complete_handoff`
195
168
 
196
- Shell commands are different. `run_command` and `start_command` launch your normal developer shell with the workspace as its working directory. They inherit your normal environment, credentials, PATH, and OS permissions.
169
+ **Files:** `read`, `view_image`, `view_images`, `search`, `write`, `edit`, `delete`
197
170
 
198
- **The working directory is not an OS sandbox.** A shell command can access anything your user account can access.
171
+ **Commands:** `run_command`, `start_command`, `list_commands`, `poll_command`, `read_command_output`, `cancel_command`
199
172
 
200
- Use:
173
+ **Browser:** `set_browser_presentation`, `browser_command`, `view_page`
201
174
 
202
- - `read-only` mode when write/shell access is unnecessary;
203
- - a VM or container when you need OS-level isolation;
204
- - secret rotation from `[w] Workspaces` if a workspace MCP URL is ever exposed.
175
+ Use `run_command` for short work. Use `start_command` + `poll_command` for builds, tests, installs, dev servers, and other long-running jobs.
205
176
 
206
- > [!CAUTION]
207
- > Never share a workspace MCP URL. Treat it like a credential.
177
+ </details>
208
178
 
209
- ## Configuration
179
+ <details>
180
+ <summary><strong>Configuration</strong></summary>
210
181
 
211
182
  | Setting | Default / location |
212
183
  | --- | --- |
@@ -215,38 +186,44 @@ Use:
215
186
  | Port override | `PORT` |
216
187
  | Initial workspace override | `WORKSPACE_ROOT` |
217
188
  | Global instructions | `~/.moondesk/AGENTS.md` |
218
- | Session handoffs | `%USERPROFILE%\.moondesk\handoffs\<workspace-id>\` on Windows; `$HOME/.moondesk/handoffs/<workspace-id>/` on macOS/Linux |
189
+ | Workspace instructions | `<workspace>/AGENTS.md` |
219
190
  | Codex-compatible instructions | `~/.codex/AGENTS.md` |
191
+ | Session handoffs | `%USERPROFILE%\.moondesk\handoffs\<workspace-id>\` on Windows; `$HOME/.moondesk/handoffs/<workspace-id>/` on macOS/Linux |
192
+
193
+ Workspace `AGENTS.md` instructions take priority.
220
194
 
221
- MoonDesk also checks `AGENTS.md` in the current workspace. Workspace instructions take priority.
195
+ On macOS Terminal.app, set `MOONDESK_SKIP_MACOS_TERMINAL_PROFILE=1` to disable MoonDesk's dedicated Terminal profile behavior.
222
196
 
223
- On macOS Terminal.app, MoonDesk can manage a dedicated terminal profile. Set `MOONDESK_SKIP_MACOS_TERMINAL_PROFILE=1` to disable that behavior.
197
+ </details>
198
+
199
+ <details>
200
+ <summary><strong>Windows antivirus note</strong></summary>
201
+
202
+ MoonDesk verifies the downloaded native executable against the SHA-256 published with the matching GitHub Release before launching it.
203
+
204
+ If Windows Security or another antivirus quarantines the verified executable, update security definitions and check **Protection history**, then run `moondesk` again. Do not disable antivirus protection or exclude the entire MoonDesk directory just to bypass a detection.
205
+
206
+ </details>
224
207
 
225
208
  ## Stack
226
209
 
227
210
  | Part | Technology |
228
211
  | --- | --- |
229
212
  | Core | Rust |
230
- | Async runtime / server | Tokio + Axum |
213
+ | Server / async runtime | Axum + Tokio |
231
214
  | TUI | Ratatui |
232
215
  | Tunnel | ngrok |
233
216
  | MCP server | Custom implementation |
234
217
  | MCP protocol | `2025-11-25` |
235
- | Browser runtime | pinned `chrome-devtools-mcp@1.7.0` stdio child owned by MoonDesk, lazy + headless by default with opt-in visible presentation |
236
- | Distribution | npm + native binaries |
218
+ | Browser runtime | pinned `chrome-devtools-mcp@1.7.0` |
219
+ | Distribution | npm + verified native binaries |
237
220
 
238
221
  ## Contributing
239
222
 
240
- Contributions are welcome. See [`CONTRIBUTING.md`](CONTRIBUTING.md) for development setup, required checks, PR rules, and security-sensitive invariants.
241
-
242
- Release maintainers should also read [`docs/RELEASING.md`](docs/RELEASING.md).
243
-
244
- ## ClippyMoon
223
+ Contributions are welcome.
245
224
 
246
- <p align="center">
247
- <img src="docs/images/clippymoon.gif" alt="ClippyMoon" width="420"><br>
248
- <em>ClippyMoon!</em>
249
- </p>
225
+ - [`CONTRIBUTING.md`](CONTRIBUTING.md) — development setup, required checks, and PR rules
226
+ - [`docs/RELEASING.md`](docs/RELEASING.md) release pipeline and maintainer guidance
250
227
 
251
228
  ## Disclaimer
252
229
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "moondesk",
3
- "version": "0.11.3",
3
+ "version": "0.11.5",
4
4
  "description": "MoonDesk — use ChatGPT Chat as a local coding agent, by Shattermoon.",
5
5
  "author": "Shattermoon",
6
6
  "license": "MIT",