diff --git a/CHANGELOG.md b/CHANGELOG.md index c67c76d4..e55c97c8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,14 @@ # aicodeman +## 0.9.1 + +### Patch Changes + +- Multi-monitor & settings UX fixes. + - **Multi-monitor button (remote servers):** the "span displays" button spawns `scripts/span-codeman.sh` server-side, so on a non-macOS Codeman server it can't open a window on your machine. The non-macOS API error now explains this and points to running the script locally on your Mac with the remote server URL; the script header documents the same remote-client workflow. + - **App Settings modal:** stop the modal overflowing horizontally on narrow viewports. + - **systemd:** sync the `codeman-web.service` template with the deployed unit. + ## 0.9.0 ### Minor Changes diff --git a/CLAUDE.md b/CLAUDE.md index d68a5268..018c9c13 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -56,7 +56,7 @@ When user says "COM": CI runs `npm run check:lockfile` on every push/PR, so lockfile drift fails the build even if the `version-packages` script is bypassed. -**Version**: 0.9.0 (must match `package.json`) +**Version**: 0.9.1 (must match `package.json`) ## Project Overview diff --git a/package-lock.json b/package-lock.json index 1a318614..057b5c3b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "aicodeman", - "version": "0.9.0", + "version": "0.9.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "aicodeman", - "version": "0.9.0", + "version": "0.9.1", "hasInstallScript": true, "license": "MIT", "workspaces": [ diff --git a/package.json b/package.json index 2f163391..ce895b35 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "aicodeman", - "version": "0.9.0", + "version": "0.9.1", "description": "The missing control plane for AI coding agents - run 20 autonomous agents with real-time monitoring and session persistence", "type": "module", "main": "dist/index.js", diff --git a/scripts/span-codeman.sh b/scripts/span-codeman.sh index 06c98275..daf9fb45 100755 --- a/scripts/span-codeman.sh +++ b/scripts/span-codeman.sh @@ -16,6 +16,18 @@ # per-display and will NOT span. We size a windowed app to the union of all # displays instead. macOS only. # +# ── REMOTE CLIENT (Codeman server on another machine) ──────────────────────── +# The header "multi-monitor" button spawns this script SERVER-SIDE, so it opens +# the window on the SERVER's displays and is gated to a macOS server. If your +# Codeman runs elsewhere (e.g. a headless Linux box reached over Tailscale) and +# YOUR monitors are on a Mac, the button can't help — the server can't open a +# window on your machine. Instead, run this script LOCALLY on the Mac and pass +# the remote URL as the argument: +# ./span-codeman.sh "https://your-codeman.example.ts.net" +# The osascript/browser launch all happen on the Mac; only the page is served +# remotely, so the spanning window lands on your monitors. The "separate Spaces" +# prerequisite above still applies on the Mac. +# set -euo pipefail URL="${1:-http://localhost:5000}" diff --git a/src/web/routes/system-routes.ts b/src/web/routes/system-routes.ts index d202fbd4..2c72f63e 100644 --- a/src/web/routes/system-routes.ts +++ b/src/web/routes/system-routes.ts @@ -268,7 +268,13 @@ export function registerSystemRoutes( if (process.platform !== 'darwin') { return reply .code(400) - .send(createErrorResponse(ApiErrorCode.INVALID_INPUT, 'Multi-monitor spanning is only supported on macOS.')); + .send( + createErrorResponse( + ApiErrorCode.INVALID_INPUT, + 'Multi-monitor spanning runs on the Codeman server, which is not macOS. ' + + 'If your monitors are on a remote Mac, run scripts/span-codeman.sh locally on that Mac with this server URL — see the script header for details.' + ) + ); } // Resolve the bundled launcher relative to this module (works from src/ and dist/). const scriptPath = join(dirname(fileURLToPath(import.meta.url)), '../../../scripts/span-codeman.sh');