diff --git a/CLAUDE.md b/CLAUDE.md index 9de24392..d07a0236 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -16,13 +16,15 @@ When user says "COM": 1. Increment version in BOTH `package.json` AND `CLAUDE.md` 2. Run: `git add -A && git commit -m "chore: bump version to X.XXXX" && git push && npm run build && systemctl --user restart claudeman-web` -**Version**: 0.1404 (must match `package.json`) +**Version**: 0.1405 (must match `package.json`) ## Project Overview Claudeman is a Claude Code session manager with web interface and autonomous Ralph Loop. Spawns Claude CLI via PTY, streams via SSE, supports respawn cycling for 24+ hour autonomous runs. -**Tech Stack**: TypeScript (ES2022/NodeNext, strict mode with `noUnusedLocals`, `noUnusedParameters`, `noImplicitReturns`), Node.js, Fastify, node-pty, xterm.js +**Tech Stack**: TypeScript (ES2022/NodeNext, strict mode), Node.js, Fastify, node-pty, xterm.js + +**TypeScript Strictness**: `noUnusedLocals`, `noUnusedParameters`, `noImplicitReturns`, `noImplicitOverride`, `noFallthroughCasesInSwitch`, `allowUnreachableCode: false` **Requirements**: Node.js 18+, Claude CLI, GNU Screen @@ -34,12 +36,13 @@ Claudeman is a Claude Code session manager with web interface and autonomous Ral # Development npx tsx src/index.ts web # Dev server (RECOMMENDED) npx tsx src/index.ts web --https # With TLS for notifications -npx tsc --noEmit # Type check +npm run typecheck # Type check # Testing npx vitest run # All tests npx vitest run test/.test.ts # Single file -npm run test:e2e # Browser E2E tests +npm run test:coverage # With coverage report +npm run test:e2e # Browser E2E (run `npx playwright install chromium` first) # Production npm run build @@ -47,6 +50,13 @@ systemctl --user restart claudeman-web journalctl --user -u claudeman-web -f ``` +## Binaries + +| Binary | Purpose | +|--------|---------| +| `claudeman` | Main CLI and web server | +| `claudeman-mcp` | MCP server for Claude Desktop integration | + ## Architecture ### Core Files @@ -101,7 +111,7 @@ journalctl --user -u claudeman-web -f **E2E tests**: Use Playwright. Run `npx playwright install chromium` first. See `test/e2e/fixtures/` for helpers. E2E config provides ports, timeouts, and helpers. -**Test config**: Vitest runs with `globals: true` (no imports needed for `describe`/`it`/`expect`) and `fileParallelism: false` (files run sequentially to respect screen limits). +**Test config**: Vitest runs with `globals: true` (no imports needed for `describe`/`it`/`expect`) and `fileParallelism: false` (files run sequentially to respect screen limits). Test timeout is 30s, teardown timeout is 60s. **Test safety**: `test/setup.ts` provides: - Screen concurrency limiter (max 10) diff --git a/package.json b/package.json index af05bbd9..58a76aae 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "claudeman", - "version": "0.1404", + "version": "0.1405", "description": "The missing control plane for Claude Code - run 20 autonomous agents with real-time monitoring and session persistence", "type": "module", "main": "dist/index.js", diff --git a/src/web/public/app.js b/src/web/public/app.js index b39d348a..eba7be67 100644 --- a/src/web/public/app.js +++ b/src/web/public/app.js @@ -8109,8 +8109,7 @@ class ClaudemanApp { // Check if Ralph wizard modal is open const wizardModal = document.getElementById('ralphWizardModal'); - const wizardOpen = wizardModal && !wizardModal.classList.contains('hidden') && - wizardModal.style.display !== 'none'; + const wizardOpen = wizardModal?.classList.contains('active'); const wizardContent = wizardOpen ? wizardModal.querySelector('.modal-content') : null; // Collect visible regular subagent windows for connection logic @@ -8360,8 +8359,7 @@ class ClaudemanApp { // Check if Ralph wizard modal is open - if so, position windows on the sides const wizardModal = document.getElementById('ralphWizardModal'); - const wizardOpen = wizardModal && !wizardModal.classList.contains('hidden') && - wizardModal.style.display !== 'none'; + const wizardOpen = wizardModal?.classList.contains('active'); let startX, startY, maxCols;