{"_id":"@abigmiu/codex-monitor","_rev":"7-62eb7ca91f0f0055296b7aad73ddc6f8","name":"@abigmiu/codex-monitor","dist-tags":{"latest":"0.0.5"},"versions":{"0.0.2":{"name":"@abigmiu/codex-monitor","version":"0.0.2","keywords":["codex","monitor","cli","rust","websocket"],"license":"MIT","_id":"@abigmiu/codex-monitor@0.0.2","maintainers":[{"name":"abigmiu","email":"suraelax@gmail.com"}],"bin":{"codex-monitor":"bin/codex-monitor.mjs"},"dist":{"shasum":"ede2c09fe79d77271f8bcddc55f9cb1c4729ad24","tarball":"https://registry.npmjs.org/@abigmiu/codex-monitor/-/codex-monitor-0.0.2.tgz","fileCount":1231,"integrity":"sha512-qjWZ0RzLG6Cz6P3vEUWI+jMFAlTL0Vyj4oNZ86XuAK1DV6ZGNOglxjkdfZj/UA4qOGgvLVaBNmB1I9F7yTTekw==","signatures":[{"sig":"MEQCIFZ1e5sbVymBBhEKIwhBM7LitHw8tg27MEfmcVUWfVnPAiBr+mV/vr5zOYnK0I/EvQwgMffYGhvBuiGDMGNr/AtDXw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12699156},"type":"module","engines":{"node":">=18"},"gitHead":"3dc08de85a3e6defb5ed41cd259f66f388cde81e","private":false,"scripts":{"dev":"vite","lint":"eslint . --ext .ts,.tsx","test":"vitest run","build":"tsc && vite build","tauri":"tauri","doctor":"sh scripts/doctor.sh","predev":"npm run sync:material-icons","prepack":"npm run build","preview":"vite preview","prebuild":"npm run sync:material-icons","start:web":"node ./bin/codex-monitor.mjs","tauri:dev":"npm run doctor:strict && tauri dev","typecheck":"tsc --noEmit","doctor:win":"node scripts/doctor.mjs --strict","pack:check":"npm pack --dry-run","test:watch":"vitest","postinstall":"node scripts/install-backend.mjs","tauri:build":"npm run doctor:strict && tauri build","pretauri:dev":"npm run sync:material-icons","doctor:strict":"sh scripts/doctor.sh --strict","tauri:dev:win":"npm run doctor:win && tauri dev --config src-tauri/tauri.windows.conf.json","build:appimage":"NO_STRIP=1 tauri build --bundles appimage","pretauri:build":"npm run sync:material-icons","tauri:build:win":"npm run doctor:win && tauri build --config src-tauri/tauri.windows.conf.json","pretauri:dev:win":"npm run sync:material-icons","pretauri:build:win":"npm run sync:material-icons","sync:material-icons":"node scripts/sync-material-icons.mjs"},"_npmUser":{"name":"abigmiu","email":"suraelax@gmail.com"},"repository":{"url":"https://cnb.cool/abigmiu/codexMonitor-webui","type":"git"},"_npmVersion":"10.9.4","description":"CodexMonitor web launcher (local Rust backend + browser UI)","directories":{},"_nodeVersion":"22.21.1","codexMonitor":{"backendReleaseBase":"https://github.com/abigmiu/codex-monitor-webui/releases/download"},"dependencies":{},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^7.0.4","jsdom":"^27.0.1","react":"^19.1.0","eslint":"^8.57.0","vitest":"^3.2.4","prismjs":"^1.30.0","react-dom":"^19.1.0","remark-gfm":"^4.0.1","typescript":"~5.8.3","@types/react":"^19.1.8","@xterm/xterm":"^5.5.0","lucide-react":"^0.562.0","@pierre/diffs":"^1.0.6","@types/prismjs":"^1.26.5","react-markdown":"^10.1.0","@tauri-apps/cli":"^2.9.6","@types/react-dom":"^19.1.6","@xterm/addon-fit":"^0.10.0","eslint-plugin-react":"^7.36.1","@vitejs/plugin-react":"^4.6.0","vscode-material-icons":"^0.1.1","@testing-library/react":"^16.3.2","@tanstack/react-virtual":"^3.13.18","@typescript-eslint/parser":"^7.18.0","eslint-plugin-react-hooks":"^4.6.2","@typescript-eslint/eslint-plugin":"^7.18.0"},"_npmOperationalInternal":{"tmp":"tmp/codex-monitor_0.0.2_1771937592849_0.491501718806024","host":"s3://npm-registry-packages-npm-production"}},"0.0.3":{"name":"@abigmiu/codex-monitor","version":"0.0.3","keywords":["codex","monitor","cli","rust","websocket"],"license":"MIT","_id":"@abigmiu/codex-monitor@0.0.3","maintainers":[{"name":"abigmiu","email":"suraelax@gmail.com"}],"bin":{"codex-monitor":"bin/codex-monitor.mjs"},"dist":{"shasum":"8b037df6264132a9f2dcac83d8a3efd8c9bb0425","tarball":"https://registry.npmjs.org/@abigmiu/codex-monitor/-/codex-monitor-0.0.3.tgz","fileCount":1233,"integrity":"sha512-YflQ/4/I8GOVybLz0uJ+DD37ALfda5Itt+PL+2FCCpt0XX7qkYR2WMaopYkC65CpSWKHGt352Cfth1/VAJEgRA==","signatures":[{"sig":"MEQCIDR22hDPMQm7zqvdnrbN4SY8CgA3dgHPGcoGPDfwVt1RAiB06v+gl7t8239h8yNLzdQ17vEdMGFTt53Wu+dCd2M32g==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12712881},"type":"module","engines":{"node":">=18"},"gitHead":"63ab6171b65bb1805c09eff10b97c40973da82b8","private":false,"scripts":{"dev":"vite","lint":"eslint . --ext .ts,.tsx","test":"vitest run","build":"tsc && vite build && node scripts/write-frontend-server-config.mjs","tauri":"tauri","doctor":"sh scripts/doctor.sh","predev":"npm run sync:material-icons","prepack":"npm run build","preview":"vite preview","prebuild":"npm run sync:material-icons","start:web":"node ./bin/codex-monitor.mjs","tauri:dev":"npm run doctor:strict && tauri dev","typecheck":"tsc --noEmit","doctor:win":"node scripts/doctor.mjs --strict","pack:check":"npm pack --dry-run","test:watch":"vitest","postinstall":"node scripts/install-backend.mjs","tauri:build":"npm run doctor:strict && tauri build","pretauri:dev":"npm run sync:material-icons","doctor:strict":"sh scripts/doctor.sh --strict","tauri:dev:win":"npm run doctor:win && tauri dev --config src-tauri/tauri.windows.conf.json","build:appimage":"NO_STRIP=1 tauri build --bundles appimage","pretauri:build":"npm run sync:material-icons","tauri:build:win":"npm run doctor:win && tauri build --config src-tauri/tauri.windows.conf.json","pretauri:dev:win":"npm run sync:material-icons","pretauri:build:win":"npm run sync:material-icons","sync:material-icons":"node scripts/sync-material-icons.mjs"},"_npmUser":{"name":"abigmiu","email":"suraelax@gmail.com"},"repository":{"url":"https://cnb.cool/abigmiu/codexMonitor-webui","type":"git"},"_npmVersion":"10.9.4","description":"CodexMonitor web launcher (local Rust backend + browser UI)","directories":{},"_nodeVersion":"22.21.1","codexMonitor":{"backendReleaseBase":"https://github.com/abigmiu/codex-monitor-webui/releases/download"},"dependencies":{},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^7.0.4","jsdom":"^27.0.1","react":"^19.1.0","eslint":"^8.57.0","vitest":"^3.2.4","prismjs":"^1.30.0","react-dom":"^19.1.0","remark-gfm":"^4.0.1","typescript":"~5.8.3","@types/react":"^19.1.8","@xterm/xterm":"^5.5.0","lucide-react":"^0.562.0","@pierre/diffs":"^1.0.6","@types/prismjs":"^1.26.5","react-markdown":"^10.1.0","@tauri-apps/cli":"^2.9.6","@types/react-dom":"^19.1.6","@xterm/addon-fit":"^0.10.0","eslint-plugin-react":"^7.36.1","@vitejs/plugin-react":"^4.6.0","vscode-material-icons":"^0.1.1","@testing-library/react":"^16.3.2","@tanstack/react-virtual":"^3.13.18","@typescript-eslint/parser":"^7.18.0","eslint-plugin-react-hooks":"^4.6.2","@typescript-eslint/eslint-plugin":"^7.18.0"},"_npmOperationalInternal":{"tmp":"tmp/codex-monitor_0.0.3_1772028802410_0.716269155422512","host":"s3://npm-registry-packages-npm-production"}},"0.0.4":{"name":"@abigmiu/codex-monitor","version":"0.0.4","keywords":["codex","monitor","cli","rust","websocket"],"license":"MIT","_id":"@abigmiu/codex-monitor@0.0.4","maintainers":[{"name":"abigmiu","email":"suraelax@gmail.com"}],"bin":{"codex-monitor":"bin/codex-monitor.mjs"},"dist":{"shasum":"ae257d44009a021cb9ae93c85b18506d568694c0","tarball":"https://registry.npmjs.org/@abigmiu/codex-monitor/-/codex-monitor-0.0.4.tgz","fileCount":1233,"integrity":"sha512-LmMTC1D0W5v/Ip2cc0TPaGQuqIfwA9hkU/5TpnsV1bNWcQHL5yx0ufohxzu5MHtWKDyxm+eIZuOjJX6lVmAtKQ==","signatures":[{"sig":"MEUCIQDHAFk+IyJ4rRg3sCUfV8MKF6SWrU2ui9xPoKuCDm3h2AIgcn53M3c7r5CAz/FCwL8NQRuUwt4vIwSFqMqZm0xaZsE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12720635},"type":"module","engines":{"node":">=18"},"gitHead":"29f85ef8c9e4ef7e8736960e59527c2bf287ab20","private":false,"scripts":{"dev":"vite","lint":"eslint . --ext .ts,.tsx","test":"vitest run","build":"tsc && vite build && node scripts/write-frontend-server-config.mjs","tauri":"tauri","doctor":"sh scripts/doctor.sh","predev":"npm run sync:material-icons","prepack":"npm run build","preview":"vite preview","prebuild":"npm run sync:material-icons","start:web":"node ./bin/codex-monitor.mjs","tauri:dev":"npm run doctor:strict && tauri dev","typecheck":"tsc --noEmit","doctor:win":"node scripts/doctor.mjs --strict","pack:check":"npm pack --dry-run","test:watch":"vitest","postinstall":"node scripts/install-backend.mjs","tauri:build":"npm run doctor:strict && tauri build","pretauri:dev":"npm run sync:material-icons","doctor:strict":"sh scripts/doctor.sh --strict","tauri:dev:win":"npm run doctor:win && tauri dev --config src-tauri/tauri.windows.conf.json","build:appimage":"NO_STRIP=1 tauri build --bundles appimage","pretauri:build":"npm run sync:material-icons","tauri:build:win":"npm run doctor:win && tauri build --config src-tauri/tauri.windows.conf.json","pretauri:dev:win":"npm run sync:material-icons","pretauri:build:win":"npm run sync:material-icons","sync:material-icons":"node scripts/sync-material-icons.mjs"},"_npmUser":{"name":"abigmiu","email":"suraelax@gmail.com"},"repository":{"url":"https://cnb.cool/abigmiu/codexMonitor-webui","type":"git"},"_npmVersion":"10.9.4","description":"CodexMonitor web launcher (local Rust backend + browser UI)","directories":{},"_nodeVersion":"22.21.1","codexMonitor":{"backendReleaseBase":"https://github.com/abigmiu/codex-monitor-webui/releases/download"},"dependencies":{},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^7.0.4","jsdom":"^27.0.1","react":"^19.1.0","eslint":"^8.57.0","vitest":"^3.2.4","prismjs":"^1.30.0","react-dom":"^19.1.0","remark-gfm":"^4.0.1","typescript":"~5.8.3","@types/react":"^19.1.8","@xterm/xterm":"^5.5.0","lucide-react":"^0.562.0","@pierre/diffs":"^1.0.6","@types/prismjs":"^1.26.5","react-markdown":"^10.1.0","@tauri-apps/cli":"^2.9.6","@types/react-dom":"^19.1.6","@xterm/addon-fit":"^0.10.0","eslint-plugin-react":"^7.36.1","@vitejs/plugin-react":"^4.6.0","vscode-material-icons":"^0.1.1","@testing-library/react":"^16.3.2","@tanstack/react-virtual":"^3.13.18","@typescript-eslint/parser":"^7.18.0","eslint-plugin-react-hooks":"^4.6.2","@typescript-eslint/eslint-plugin":"^7.18.0"},"_npmOperationalInternal":{"tmp":"tmp/codex-monitor_0.0.4_1772030880048_0.6378552996252997","host":"s3://npm-registry-packages-npm-production"}},"0.0.5":{"name":"@abigmiu/codex-monitor","private":false,"version":"0.0.5","description":"CodexMonitor web launcher (local Rust backend + browser UI)","type":"module","license":"MIT","repository":{"type":"git","url":"https://cnb.cool/abigmiu/codexMonitor-webui"},"codexMonitor":{"backendReleaseBase":"https://github.com/abigmiu/codex-monitor-webui/releases/download"},"publishConfig":{"access":"public"},"keywords":["codex","monitor","cli","rust","websocket"],"engines":{"node":">=18"},"scripts":{"sync:material-icons":"node scripts/sync-material-icons.mjs","postinstall":"node scripts/install-backend.mjs","predev":"npm run sync:material-icons","dev":"vite","prebuild":"npm run sync:material-icons","build":"tsc && vite build && node scripts/write-frontend-server-config.mjs","build:appimage":"NO_STRIP=1 tauri build --bundles appimage","doctor":"sh scripts/doctor.sh","doctor:strict":"sh scripts/doctor.sh --strict","doctor:win":"node scripts/doctor.mjs --strict","lint":"eslint . --ext .ts,.tsx","test":"vitest run","test:watch":"vitest","typecheck":"tsc --noEmit","preview":"vite preview","tauri":"tauri","pretauri:dev":"npm run sync:material-icons","tauri:dev":"npm run doctor:strict && tauri dev","pretauri:build":"npm run sync:material-icons","tauri:build":"npm run doctor:strict && tauri build","pretauri:dev:win":"npm run sync:material-icons","tauri:dev:win":"npm run doctor:win && tauri dev --config src-tauri/tauri.windows.conf.json","pretauri:build:win":"npm run sync:material-icons","tauri:build:win":"npm run doctor:win && tauri build --config src-tauri/tauri.windows.conf.json","start:web":"node ./bin/codex-monitor.mjs","prepack":"npm run build","pack:check":"npm pack --dry-run"},"dependencies":{},"devDependencies":{"@pierre/diffs":"^1.0.6","@tanstack/react-virtual":"^3.13.18","@tauri-apps/cli":"^2.9.6","@testing-library/react":"^16.3.2","@types/prismjs":"^1.26.5","@types/react":"^19.1.8","@types/react-dom":"^19.1.6","@typescript-eslint/eslint-plugin":"^7.18.0","@typescript-eslint/parser":"^7.18.0","@vitejs/plugin-react":"^4.6.0","@xterm/addon-fit":"^0.10.0","@xterm/xterm":"^5.5.0","eslint":"^8.57.0","eslint-plugin-react":"^7.36.1","eslint-plugin-react-hooks":"^4.6.2","jsdom":"^27.0.1","lucide-react":"^0.562.0","prismjs":"^1.30.0","react":"^19.1.0","react-dom":"^19.1.0","react-markdown":"^10.1.0","remark-gfm":"^4.0.1","typescript":"~5.8.3","vite":"^7.0.4","vitest":"^3.2.4","vscode-material-icons":"^0.1.1"},"bin":{"codex-monitor":"bin/codex-monitor.mjs"},"_id":"@abigmiu/codex-monitor@0.0.5","gitHead":"969769356a0cfc739a21365fd5237285e3b138dc","_nodeVersion":"22.21.1","_npmVersion":"10.9.4","dist":{"integrity":"sha512-W0iXaRcCaaJ1+B57EvJkqKcBZIKMV33xJYlqQHI/uRDwHZYb+BotdQl8+53y6CljW4RDTnECO1HXOpNasacylA==","shasum":"cbed9e000264943cec2bc8a93f6cae769c17eec8","tarball":"https://registry.npmjs.org/@abigmiu/codex-monitor/-/codex-monitor-0.0.5.tgz","fileCount":1233,"unpackedSize":12720732,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQDv6I8Rq4OWUD0/LRFynSE0jCv8AWX/3lY+WAIZw5JW3wIhANxNboQUMhhqxiMFiH/g/Zkfs1/SaI1ASTpEf01k360S"}]},"_npmUser":{"name":"abigmiu","email":"suraelax@gmail.com"},"directories":{},"maintainers":[{"name":"abigmiu","email":"suraelax@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/codex-monitor_0.0.5_1772093070013_0.9264044682503845"},"_hasShrinkwrap":false}},"time":{"created":"2026-02-24T12:53:12.738Z","modified":"2026-02-26T08:04:30.463Z","0.0.1":"2026-02-11T15:58:15.518Z","0.0.2":"2026-02-24T12:53:13.121Z","0.0.3":"2026-02-25T14:13:22.770Z","0.0.4":"2026-02-25T14:48:00.460Z","0.0.5":"2026-02-26T08:04:30.338Z"},"license":"MIT","keywords":["codex","monitor","cli","rust","websocket"],"repository":{"type":"git","url":"https://cnb.cool/abigmiu/codexMonitor-webui"},"description":"CodexMonitor web launcher (local Rust backend + browser UI)","maintainers":[{"name":"abigmiu","email":"suraelax@gmail.com"}],"readme":"# CodexMonitor1·\n\n![CodexMonitor](screenshot.png)\n\nCodexMonitor is a Web app for orchestrating multiple Codex agents across local workspaces, backed by a local Rust service. It provides a sidebar to manage projects, a home screen for quick actions, and a conversation view backed by the Codex app-server protocol.\n\n## Features\n\n### Workspaces & Threads\n\n- Add and persist workspaces, group/sort them, and jump into recent agent activity from the home dashboard.\n- Spawn one `codex app-server` per workspace, resume threads, and track unread/running state.\n- Worktree and clone agents for isolated work; worktrees live under the app data directory (legacy `.codex-worktrees` supported).\n- Thread management: pin/rename/archive/copy, per-thread drafts, and stop/interrupt in-flight turns.\n- Optional remote backend (daemon) mode for running Codex on another machine.\n\n### Composer & Agent Controls\n\n- Compose with queueing plus image attachments (picker, drag/drop, paste).\n- Autocomplete for skills (`$`), prompts (`/prompts:`), reviews (`/review`), and file paths (`@`).\n- Model picker, collaboration modes (when enabled), reasoning effort, access mode, and context usage ring.\n- Dictation with hold-to-talk shortcuts powered by the browser Web Speech API (with graceful fallback when unsupported).\n- Render reasoning/tool/diff items and handle approval prompts.\n\n### Git & GitHub\n\n- Diff stats, staged/unstaged file diffs, revert/stage controls, and commit log.\n- Branch list with checkout/create plus upstream ahead/behind counts.\n- GitHub Issues and Pull Requests via `gh` (lists, diffs, comments) and open commits/PRs in the browser.\n- PR composer: \"Ask PR\" to send PR context into a new agent thread.\n\n### Files & Prompts\n\n- File tree with search, file-type icons, and Reveal in Finder/Explorer.\n- Prompt library for global/workspace prompts: create/edit/delete/move and run in current or new threads.\n\n### UI & Experience\n\n- Resizable sidebar/right/plan/terminal/debug panels with persisted sizes.\n- Responsive layouts (desktop/tablet/phone) with tabbed navigation.\n- Sidebar usage and credits meter for account rate limits plus a home usage snapshot.\n- Terminal dock with multiple tabs for background commands (experimental).\n- Web update checks that guide users to GitHub Releases downloads, debug panel copy/clear, sound notifications, and a reduced transparency toggle.\n\n## Requirements\n\n- Node.js + npm\n- Codex installed on your system and available as `codex` in `PATH`\n- Git CLI (used for worktree operations)\n- GitHub CLI (`gh`) for the Issues panel (optional)\n\nLocal backend options (choose one):\n- Recommended: let `codex-monitor` download a prebuilt `codex_monitor_web` binary on first run (no Rust needed).\n- Advanced: install your own backend binary and point `codex-monitor` at it via `--backend-path` / `CODEX_MONITOR_BACKEND_PATH`.\n- Dev-only: run the backend from source via `cargo` (requires Rust toolchain).\n\nIf the `codex` binary is not in `PATH`, update the backend to pass a custom path per workspace.\nIf you build the backend from source and hit native build errors, run:\n\n```bash\nnpm run doctor\n```\n\n## Getting Started\n\n### Install from npm (recommended)\n\n```bash\nnpm install -g @abigmiu/codex-monitor\ncodex-monitor\n```\n\nRuntime requirements:\n- Codex CLI (`codex`) available in `PATH`\n\nUseful flags:\n- `--backend-only` / `--frontend-only`\n- `--listen 127.0.0.1:4732`\n- `--data-dir ~/.codexmonitor-web`\n- `--token dev-token` (or `--no-token`)\n- `--frontend-host 0.0.0.0`\n- `--frontend-port 5176`\n- `--default-workspace /workspace` (or `--no-default-workspace`)\n- `--backend-path /path/to/codex_monitor_web`\n- `--backend-cache-dir ~/.codexmonitor-web` (where the backend binary is cached)\n\nUser config (recommended for npm/global install):\n- Create `~/.miu-codex-monitor.json` to set defaults (CLI flags still override).\n- Example:\n  - `{ \"frontend\": { \"host\": \"0.0.0.0\", \"port\": 5176 }, \"backend\": { \"listen\": \"127.0.0.1:4732\" }, \"defaultWorkspacePath\": \"/workspace\" }`\n- Override config path via env: `MIU_CODEX_MONITOR_CONFIG=/path/to/config.json`\n\nDist artifact config (optional):\n- `dist/codex-monitor.server.json` can provide default `host`/`port` for the static frontend server when no CLI/user-config override is present.\n\nBackend download configuration:\n- `CODEX_MONITOR_BACKEND_URL`: direct URL to a platform-specific backend binary\n- `CODEX_MONITOR_BACKEND_RELEASE_BASE`: base URL for release downloads (by default taken from `package.json` `codexMonitor.backendReleaseBase`)\n- `CODEX_MONITOR_BACKEND_RELEASE_TAG`: defaults to `v<package-version>`\n- `CODEX_MONITOR_BACKEND_ASSET`: defaults to `codex_monitor_web-<platform>-<arch>[.exe]`\n- `CODEX_MONITOR_BACKEND_CACHE_DIR`: where to store downloaded binaries\n- `CODEX_MONITOR_SKIP_BACKEND_DOWNLOAD=1`: disable auto-download (CI/offline)\n- `CODEX_MONITOR_BACKEND_INSTALL_STRICT=1`: make install-time download failures fail the npm install\n\nBackend release asset naming (recommended):\n- macOS: `codex_monitor_web-darwin-arm64`, `codex_monitor_web-darwin-x64`\n- Linux: `codex_monitor_web-linux-arm64`, `codex_monitor_web-linux-x64`\n- Windows: `codex_monitor_web-win32-x64.exe`\n\nNote: the npm install step runs a `postinstall` hook that downloads the backend binary. If you install with `--ignore-scripts`, the download is skipped and the backend will be fetched on first run instead (unless you disable downloads).\n\n### Install from local source\n\n```bash\nnpm install\nnpm run build\nnpm install -g .\n# or: npm link\ncodex-monitor\n```\n\nIf you use `npm link`, logs can show your local repo path (symlink behavior). A published npm install will run from global `node_modules`.\n\n### Manual dev mode (backend + Vite)\n\n1) Start backend:\n\n```bash\ncd src-tauri\nTMPDIR=../.tmp cargo run --bin codex_monitor_web -- \\\n  --listen 127.0.0.1:4732 \\\n  --data-dir ~/.codexmonitor-web \\\n  --token dev-token\n```\n\n2) Start frontend:\n\n```bash\nVITE_CODEX_MONITOR_API_BASE=http://127.0.0.1:4732 \\\nVITE_CODEX_MONITOR_TOKEN=dev-token \\\nnpm run dev\n```\n\n3) Build frontend assets:\n\n```bash\nnpm run build\n```\n\n### Server deployment note (reverse proxy)\n\nIf you access the frontend from another machine via a server domain, do **not** hardcode `ws://127.0.0.1:4732` in the browser: `127.0.0.1` would point to the visitor's own machine.\n\nRecommended: run backend on the server (can bind to `127.0.0.1:4732`) and reverse-proxy `/api/*` and `/rpc` from your public web server (Nginx/Caddy) to the backend.\n\nFor a simple all-in-one static server (dev-friendly), `scripts/serve-frontend.mjs` can also proxy:\n\n```bash\nnode scripts/serve-frontend.mjs --root dist --host 0.0.0.0 --port 5176 \\\n  --proxy-backend http://127.0.0.1:4732 --token dev-token\n```\n\nNote: the `codex-monitor` launcher enables this reverse proxy by default (it passes `--proxy-backend` pointing at `--listen`).\n\n### Publish to npm\n\n```bash\nnpm login\nnpm run pack:check\nnpm publish --access public\n```\n\n## Type Checking\n\nRun the TypeScript checker (no emit):\n\n```bash\nnpm run typecheck\n```\n\nNote: `npm run build` also runs `tsc` before bundling the frontend.\n\n## Project Structure\n\n```\nsrc/\n  features/         feature-sliced UI + hooks\n  platform/         web platform adapters (rpc/dialog/opener/file src/etc.)\n  services/         RPC wrapper used by features\n  styles/           split CSS by area\n  types.ts          shared types\nsrc-tauri/\n  src/bin/codex_monitor_web.rs   web backend (WS JSON-RPC + HTTP file endpoint)\n  src/shared/                     shared backend logic reused from daemon\n```\n\n## Notes\n\n- Workspaces persist to `workspaces.json` under the app data directory.\n- App settings persist to `settings.json` under the app data directory (Codex path, default access mode, UI scale).\n- Feature settings are supported in the UI and synced to `$CODEX_HOME/config.toml` (or `~/.codex/config.toml`) on load/save. Stable: Collaboration modes (`features.collaboration_modes`), personality (`personality`), Steer mode (`features.steer`), and Background terminal (`features.unified_exec`). Experimental: Collab mode (`features.collab`) and Apps (`features.apps`).\n- On launch and on window focus, the app reconnects and refreshes thread lists for each workspace.\n- Threads are restored by filtering `thread/list` results using the workspace `cwd`.\n- Selecting a thread always calls `thread/resume` to refresh messages from disk.\n- CLI sessions appear if their `cwd` matches the workspace path; they are not live-streamed unless resumed.\n- The web backend uses `codex app-server` over stdio; see `src-tauri/src/bin/codex_monitor_web.rs`.\n- Codex sessions use the default Codex home (usually `~/.codex`); if a legacy `.codexmonitor/` exists in a workspace, it is used for that workspace.\n- Worktree agents live under the app data directory (`worktrees/<workspace-id>`); legacy `.codex-worktrees/` paths remain supported, and the app no longer edits repo `.gitignore` files.\n- UI state (panel sizes, reduced transparency toggle, recent thread activity) is stored in `localStorage`.\n- Custom prompts load from `$CODEX_HOME/prompts` (or `~/.codex/prompts`) with optional frontmatter description/argument hints.\n\n## Web RPC Surface\n\nFrontend calls live in `src/services/tauri.ts` and map to RPC methods handled by `src-tauri/src/bin/codex_monitor_web.rs`. Core commands include:\n\n- Workspace lifecycle: `list_workspaces`, `add_workspace`, `add_worktree`, `remove_workspace`, `remove_worktree`, `connect_workspace`, `update_workspace_settings`.\n- Threads: `start_thread`, `list_threads`, `resume_thread`, `archive_thread`, `send_user_message`, `turn_interrupt`, `respond_to_server_request`.\n- Reviews + models: `start_review`, `model_list`, `account_rate_limits`, `skills_list`.\n- Git + files: `get_git_status`, `get_git_diffs`, `get_git_log`, `get_git_remote`, `list_git_branches`, `checkout_git_branch`, `create_git_branch`, `list_workspace_files`.\n","readmeFilename":"README.md"}