Commit Graph
100 Commits
Author SHA1 Message Date
arkonandClaude Opus 4.6 0a29d8d6ca docs: add Cloudflare tunnel section to README
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-27 13:47:40 +01:00
arkonandClaude Opus 4.6 2097831acf chore: untrack plan.json and skills-lock.json
Both are local state files. plan.json was already gitignored,
skills-lock.json now added to .gitignore.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-27 13:26:49 +01:00
arkonandClaude Opus 4.6 62a81a02a3 chore: remove screenshots-echo-diag/ from tracking
Already gitignored, just needed to untrack.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-27 13:23:22 +01:00
arkonandClaude Opus 4.6 864522b68d chore: remove out/codeman-demo.mp4 from tracking
Already gitignored, just needed to untrack.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-27 13:22:57 +01:00
arkonandClaude Opus 4.6 c10edce904 chore: gitignore .agents/ directory
Remove remotion-best-practices skill files from tracking.
Local files preserved, just hidden from the repo.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-27 13:19:36 +01:00
arkon 2b2829ebde chore: version packages 2026-02-27 10:58:10 +01:00
arkon b99821cd10 fix: tunnel stop respawning + fix pre-existing TS errors 2026-02-27 08:54:00 +01:00
arkon 8038145d40 chore: bump version to 0.1658 2026-02-27 08:53:30 +01:00
arkon 63d752e3cf chore: bump version to 0.1657 2026-02-27 08:45:15 +01:00
arkonandClaude Opus 4.6 c668f9bae1 chore: bump version to 0.1656
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-27 08:28:30 +01:00
arkonandClaude Opus 4.6 8fc0dc8c2e chore: bump version to 0.1655
Security hardening: timing-safe auth comparison, localhost-only hook bypass,
SSE client limit, TLS key permissions, strict settings schema, logout endpoint.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-27 01:13:58 +01:00
arkonandClaude Opus 4.6 f699002cbf chore: bump version to 0.1654
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-27 01:07:03 +01:00
arkon de494bbb55 chore: bump version to 0.1653 2026-02-27 00:49:32 +01:00
arkon 5f1f66bf60 chore: bump version to 0.1652 2026-02-27 00:34:38 +01:00
arkonandClaude Opus 4.6 c50ccbf8a8 chore: update screenshots to reflect Claudeman → Codeman rename
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-26 18:55:15 +01:00
arkon 001676ff0f chore: bump version to 0.1651 2026-02-26 16:48:00 +01:00
arkonandClaude Opus 4.6 3795c45cc1 chore: rename Claudeman to Codeman
Full product rename across 109 files (~834 occurrences):
- Env vars: CLAUDEMAN_* → CODEMAN_*
- Data dirs: ~/.claudeman/ → ~/.codeman/, ~/claudeman-cases/ → ~/codeman-cases/
- tmux prefix: claudeman- → codeman-
- localStorage: claudeman-* → codeman-*
- Package/CLI: claudeman → codeman
- GitHub repo: Ark0N/Claudeman → Ark0N/Codeman
- systemd service: claudeman-web → codeman-web
- Class: ClaudemanApp → CodemanApp

Migration infrastructure for seamless transition:
- state-store.ts: auto-migrates data directories on startup
- tmux-manager.ts: dual-prefix detection (legacy claudeman- sessions)
- app.js: localStorage key migration (preserves old keys)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-26 16:44:34 +01:00
arkon 3ccd22161c chore: bump version to 0.1650 2026-02-26 16:12:41 +01:00
arkon 7af806e0c1 chore: bump version to 0.1649 2026-02-26 16:10:13 +01:00
arkon d3d44223ec chore: bump version to 0.1648 2026-02-26 16:07:33 +01:00
arkon ce9cbc9200 chore: bump version to 0.1647 2026-02-26 16:04:00 +01:00
arkonandClaude Opus 4.6 a899a8b67a fix: address code review findings for OpenCode integration
- Add _isStopped guard to OpenCode 3s readiness timeout (session.ts)
- Block respawn for opencode sessions on interactive-respawn and
  respawn/enable routes (server.ts)
- Fail fast in direct PTY fallback for OpenCode mode (session.ts)
- Validate configContent as JSON at schema level (schemas.ts)
- Update JSDoc example for createSession options API (tmux-manager.ts)
- Un-hide Context tab for OpenCode sessions (index.html)
- Add OpenCode UI tests (opencode-resize.test.ts)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-26 15:58:26 +01:00
arkonandClaude Opus 4.6 73d9469580 fix: unset $TMUX env for nested tmux session creation
When running the dev server inside a tmux session, $TMUX is inherited
and tmux refuses to create new sessions ("sessions should be nested
with care, unset $TMUX to force"). Production (systemd) has a clean
env so this only affects dev/test. Strip $TMUX from the execSync env
when calling tmux new-session.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-26 15:41:37 +01:00
arkonandClaude Opus 4.6 33f39c91ba fix: update mobile CSS for OpenCode run button group
Replace dead .btn-claude selectors in mobile.css with proper styling
for the new split run button (.btn-run + .btn-run-gear). Add mobile
touch-friendly dropdown menu options (10px padding, 35px height).
Include mode-specific colors for both Claude (blue) and OpenCode
(green) on mobile. Also guard Claude-specific features (Ralph,
Respawn) from running on OpenCode sessions in server.ts.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-26 15:06:36 +01:00
arkonandClaude Opus 4.6 2e3a08fad2 fix: emit needsRefresh after OpenCode TUI stabilizes
After the 3s TUI stabilization timeout, emit needsRefresh so the
client fetches the full terminal buffer. Without this, the terminal
appears empty until the user manually refreshes or switches tabs.

Wire needsRefresh as a proper session listener in server.ts with
cleanup in both removal paths to prevent memory leaks.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-02-26 13:03:28 +01:00
arkonandClaude Opus 4.6 5ad0e7f9b4 feat: unified Run button with mode selector dropdown
Replace separate "Run Claude" and "Run OC" buttons with a single
split button: [Run ▾] where the chevron opens a dropdown to switch
between Claude Code and OpenCode modes.

- Run button label shows "Run" (Claude) or "Run OC" (OpenCode)
- Button color reflects selected mode (blue=Claude, green=OpenCode)
- Mode persisted in localStorage across sessions
- Ctrl+Enter uses the selected mode
- Welcome screen simplified to single "Run" button
- Removed standalone btn-claude, btn-opencode, welcome-btn-opencode CSS
- Updated welcome tagline: "Manage AI in persistent tmux sessions"

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-02-26 12:04:57 +01:00
arkonandClaude Opus 4.6 eba2fa32a3 feat: enable local echo overlay for OpenCode sessions
Use a cursor-based prompt finder for OpenCode's Bubble Tea TUI:
- Custom finder locates ┃ (U+2503) border on the cursor's row
- Offset 3 skips "┃  " to reach the text input start position
- Prompt finder is swapped dynamically when switching between
  Claude (❯ character) and OpenCode (┃ border) sessions
- Added setPrompt() method to ZerolagInputAddon for runtime updates

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-02-26 10:53:26 +01:00
arkonandClaude Opus 4.6 c6d4294dde fix: disable local echo overlay for OpenCode sessions
The local echo overlay buffers keystrokes locally and renders them
in a DOM overlay anchored to the '>' prompt character. OpenCode's
Bubble Tea TUI uses a different prompt (┃), so the overlay can't
find it — keystrokes buffer invisibly and nothing appears on screen.

Disable local echo for OpenCode sessions so keystrokes flow directly
to the PTY via the normal input path.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-02-26 10:40:50 +01:00
arkonandClaude Opus 4.6 02f3bea3c1 feat: OpenCode integration Phase 5 — API routes, frontend UI
API changes:
- GET /api/opencode/status — check if OpenCode CLI is available
- POST /api/sessions — support mode: 'opencode' with openCodeConfig
- POST /api/quick-start — support mode: 'opencode', guard writeHooksConfig
- Fix hardcoded mode: 'claude' in lifecycle logs (use session.mode)

Schema changes:
- Add 'opencode' to mode enums in CreateSessionSchema, QuickStartSchema
- Add OpenCodeConfigSchema (model, autoAllowTools, continueSession, etc.)
- Add 'OPENCODE_' to ALLOWED_ENV_PREFIXES
- Block OPENCODE_SERVER_PASSWORD in BLOCKED_ENV_KEYS (atomic with prefix addition)

Frontend UI:
- "Run OC" button in toolbar + "Run OpenCode" on welcome screen
- Green "oc" tab badge for OpenCode sessions (matching green brand)
- runOpenCode() method — checks availability, quick-starts with autoAllowTools
- Feature gating: hide Respawn/Context/Ralph tabs for OpenCode sessions
- Session options defaults to Summary tab for OpenCode
- CSS: OpenCode button styles, tab badge styles

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-02-26 10:16:20 +01:00
arkonandClaude Opus 4.6 0b60f2691f feat: OpenCode integration Phases 1-3 — types, CLI resolver, tmux spawn
Phase 1: Type system
- Add SessionMode = 'claude' | 'shell' | 'opencode' to types.ts (single source of truth)
- Add OpenCodeConfig interface (model, autoAllowTools, continueSession, etc.)
- Add openCodeConfig to SessionState
- Import SessionMode in session.ts, mux-interface.ts (remove duplicates)
- Refactor createSession/respawnPane to options objects (CreateSessionOptions, RespawnPaneOptions)

Phase 2: CLI resolver
- New opencode-cli-resolver.ts mirroring claude-cli-resolver.ts
- Searches ~/.opencode/bin, ~/.local/bin, /usr/local/bin, ~/go/bin, etc.
- Exported via utils/index.ts

Phase 3: Tmux spawn
- Extract buildSpawnCommand() shared helper (eliminates duplication)
- Add buildOpenCodeCommand() for opencode CLI flags
- Add setOpenCodeEnvVars() — API keys via tmux setenv (not visible in ps)
- Add setOpenCodeConfigContent() — JSON config via tmux setenv (prevents shell injection)
- Gate _processExpensiveParsers() for opencode mode (skip Claude-specific parsers)
- OpenCode-specific TUI ready detection (timeout-based, no ❯ prompt scanning)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-02-26 10:07:43 +01:00
arkon 1adcb7656b chore: bump version to 0.1646 2026-02-26 00:49:36 +01:00
arkonandClaude Opus 4.6 c0368fc1a9 fix: prevent iOS zoom on input focus and pinch-to-zoom
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-26 00:33:13 +01:00
arkon 209cc74514 chore: bump version to 0.1645 2026-02-25 23:53:03 +01:00
arkon 9719921c8e chore: bump version to 0.1644 2026-02-25 19:34:10 +01:00
arkon be46dfe19d chore: bump version to 0.1643 2026-02-25 18:58:34 +01:00
arkonandClaude Opus 4.6 64ad8b467b chore: bump version to 0.1641
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-25 17:14:53 +01:00
arkonandClaude Opus 4.6 fd0b75c9a5 chore: bump version to 0.1640
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-25 13:40:55 +01:00
arkon ea79d1f998 chore: bump version to 0.1639 2026-02-25 09:49:01 +01:00
arkonandClaude Opus 4.6 cf09e0e9cd chore: bump version to 0.1638
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-02-25 09:39:41 +01:00
arkonandClaude Opus 4.6 8d3ce5ef57 chore: bump version to 0.1637
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-25 09:23:18 +01:00
arkonandClaude Opus 4.6 475062f0af chore: bump version to 0.1636
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-25 09:07:16 +01:00
arkon b1672ea1fa chore: bump version to 0.1635 2026-02-25 08:19:47 +01:00
arkon 7b931a35d0 chore: bump version to 0.1634 2026-02-25 00:32:45 +01:00
arkon 57193cb1be chore: bump version to 0.1633 2026-02-25 00:21:34 +01:00
arkon a5dd4fff21 chore: bump version to 0.1632 2026-02-25 00:14:52 +01:00
arkonandClaude Opus 4.6 e4c8c7a645 chore: bump version to 0.1631
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-24 23:49:09 +01:00
arkonandClaude Opus 4.6 006f60b4a4 chore: bump version to 0.1630
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-24 20:57:58 +01:00
arkonandClaude Opus 4.6 84027cf468 chore: bump version to 0.1629
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-24 20:56:47 +01:00
arkonandClaude Opus 4.6 ce4107ef9c chore: bump version to 0.1628
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-24 20:55:36 +01:00
arkonandClaude Opus 4.6 d83bd7a992 chore: bump version to 0.1627
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-24 20:54:26 +01:00
arkonandClaude Opus 4.6 5e6f7adcb3 chore: bump version to 0.1626
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-24 20:53:18 +01:00
arkonandClaude Opus 4.6 b20f903201 chore: bump version to 0.1625
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-24 20:50:56 +01:00
arkonandClaude Opus 4.6 31b766c10f chore: bump version to 0.1624
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-24 20:49:16 +01:00
arkonandClaude Opus 4.6 4d70bc5eea chore: bump version to 0.1623
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-24 20:42:05 +01:00
arkonandClaude Opus 4.6 935bb8c268 chore: bump version to 0.1622
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-24 20:38:25 +01:00
arkonandClaude Opus 4.6 70cc2a3375 chore: bump version to 0.1621
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-24 20:37:32 +01:00
arkonandClaude Opus 4.6 9a4917bf91 chore: bump version to 0.1620
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-24 16:38:11 +01:00
arkonandClaude Opus 4.6 fcca197e81 chore: bump version to 0.1619
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-24 16:24:03 +01:00
3c29b1fa6e fix: CJK/Unicode wide character support (#13)
Set UTF-8 locale in all PTY spawn environments, add xterm-addon-unicode11
for proper double-width character measurement, and update LocalEchoOverlay
helpers to respect CJK character visual width in positioning, line wrapping,
and cursor placement.

Based on PR #13 by @TeigenZhang, adapted to current codebase structure.

Co-Authored-By: Tenggan Zhang <TeigenZhang@users.noreply.github.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-24 16:13:09 +01:00
arkonandClaude Opus 4.6 5170c188c3 fix: respect Claude CLI startup mode setting (#12)
The "Startup Mode" setting (normal/bypass/allowedTools) was saved to
settings but never read when spawning sessions. All code paths had
--dangerously-skip-permissions hardcoded. Now reads claudeMode from
~/.claudeman/settings.json and passes it through Session → TmuxManager.

Closes #12

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-24 15:52:55 +01:00
arkon 5be891a913 chore: bump version to 0.1617 2026-02-24 15:32:30 +01:00
arkonandClaude Opus 4.6 67673d6f2e fix: README mobile layout — remove float that breaks narrow viewports
The Mobile-Optimized Web UI section used align="left" on a 280px image,
leaving only ~110px for text on 390px mobile screens. This caused
single-character-per-line text wrapping on GitHub mobile view. Changed
to stacked layout: text description above, centered image, then
comparison table below.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-24 13:50:24 +01:00
arkon eda1060063 chore: bump version to 0.1616 2026-02-24 13:44:15 +01:00
arkon 0f97d1fa8d chore: bump version to 0.1615 2026-02-24 13:39:44 +01:00
arkon 37af7ead20 chore: bump version to 0.1614 2026-02-24 13:36:42 +01:00
arkon 2e816f55e4 chore: bump version to 0.1613 2026-02-24 13:34:30 +01:00
arkon 3ce3b2bede chore: bump version to 0.1612 2026-02-24 13:30:17 +01:00
arkon b8c7b8df9e chore: bump version to 0.1611 2026-02-24 13:26:27 +01:00
arkon 76e5c4f512 chore: bump version to 0.1610 2026-02-24 13:25:26 +01:00
arkon 2097fd3989 chore: bump version to 0.1609 2026-02-24 13:23:00 +01:00
arkon 406135a7dd chore: bump version to 0.1608 2026-02-24 13:20:19 +01:00
arkon 439ccbe108 chore: bump version to 0.1607 2026-02-24 13:17:08 +01:00
arkon c7967ae21e chore: bump version to 0.1606 2026-02-24 13:15:01 +01:00
arkon 06e4a882fe chore: bump version to 0.1605 2026-02-24 13:07:18 +01:00
arkon 95823cb2bd chore: bump version to 0.1604 2026-02-24 13:00:54 +01:00
arkon 675cfeaf67 chore: bump version to 0.1603 2026-02-24 12:50:27 +01:00
arkon 649958f9ae chore: bump version to 0.1602 2026-02-22 13:46:57 +01:00
arkon 47775b0610 fix: correct anchor link to Published Packages section 2026-02-22 13:21:49 +01:00
arkonandClaude Opus 4.6 c8d3ca85a6 docs: fix repo URLs, rewrite npm README, add Published Packages to Claudeman README
- Fix repository URL: nicobailon/claudeman → Ark0N/Claudeman
- Rewrite xterm-zerolag-input README with badges, origin story, architecture
  diagrams, better API docs, integration patterns, and "Why This Is Hard"
- Add Published Packages section to Claudeman README with quick start example
- Add callout in Claudeman's local echo section linking to the npm package
- Publish as xterm-zerolag-input@0.1.2

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-02-22 12:16:47 +01:00
arkon 0f43ba1b8e chore: fix npm homepage URL, bump xterm-zerolag-input to 0.1.1 2026-02-22 12:13:05 +01:00
arkonandClaude Opus 4.6 21b2a1191b feat: integrate xterm-zerolag-input library into Claudeman app.js
Replace the embedded 348-line LocalEchoOverlay class with the standalone
xterm-zerolag-input library (inlined as ZerolagInputAddon). A bridge
class `LocalEchoOverlay extends ZerolagInputAddon` preserves the
constructor API so existing `new LocalEchoOverlay(terminal)` call works.

All 43+ private property accesses (_flushedOffset, _bufferDetectDone,
_lastRenderKey, _render(), _detectBufferText(), etc.) replaced with
public library methods:

- Backspace: 60-line 3-branch handler → removeChar() returning
  'pending'|'flushed'|false + Map sync
- Tab completion: _bufferDetectDone/_detectBufferText/_flushedOffset
  → resetBufferDetection()/detectBufferText()/undoDetection()/rerender()
- Tab switch save: _flushedOffset/_flushedText reads → getFlushed()
- Tab switch restore: direct assignments → setFlushed(n, t, false)
- Buffer detection guard: _bufferDetectDone=true → suppressBufferDetection()
- Resize re-render: _lastRenderKey='';rerender() → rerender()
- Post-load render: _lastRenderKey='';_render() → rerender()

Verified with 9 Playwright integration tests + manual testing.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-02-22 11:41:44 +01:00
arkonandClaude Opus 4.6 8dfcfe8d62 fix: eliminate 3 migration pitfalls in xterm-zerolag-input
Pitfall 3 (REAL BUG): setFlushed() called _render() unconditionally.
During tab switch, rendering against a stale buffer found the old
session's prompt and locked the column position via the flushed-text
column lock. After the new buffer loaded, rerender() kept the stale
column. Fix: add render parameter (default true), pass false during
tab-switch restore to defer rendering until buffer is loaded.

Pitfall 2: Tab completion "undo" required calling clearFlushed() +
resetBufferDetection() separately — easy to get wrong. Add
undoDetection() convenience method that atomically clears flushed
state and re-enables detection.

Pitfall 1: Backspace Map sync is app-specific (can't be fixed in lib),
but removeChar() return value + getFlushed() make the pattern clean.
Updated tab-switch test to demonstrate the correct pattern.

Tests: 78 total (+4 new)
- setFlushed render=false prevents stale column lock
- setFlushed render=false keeps overlay hidden
- undoDetection clears flushed + re-enables detection
- undoDetection preserves pending text

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-02-22 11:16:12 +01:00
arkon 36f0772c2f chore: bump version to 0.1600 2026-02-22 10:47:46 +01:00
arkonandClaude Opus 4.6 ce188e6279 fix: add suppressBufferDetection, comprehensive docs and tests
Second deep audit comparing all 43 integration points in Claudeman's
app.js against the library API found one critical gap:

- Add suppressBufferDetection() — needed when switching to sessions
  with UI framework text (Ink) after the prompt that would be falsely
  detected. Claudeman sets _bufferDetectDone=true externally; this
  method provides the public equivalent.

Tests: 74 total (+13 new)
- Tab-switch save/restore pattern (flushed state roundtrip)
- suppressBufferDetection blocks explicit, implicit (addChar), and
  cascade (removeChar) detection paths
- clear() resets suppression
- Methods safe before activate() and after dispose()
- addChar implicit buffer detection on first keystroke
- refreshFont with flushed-only text

README: rewritten from 207 to 459 lines with:
- removeChar cascade explanation with return value table
- Flushed text concept explained
- Integration patterns: buffered, char-at-a-time, tab switching,
  tab completion, Ink/TUI frameworks, SSE reconnect, resize, font
- Architecture diagram (keypress → DOM overlay → PTY echo flow)
- Prompt column locking, text wrapping, render cache, scroll awareness
- All known limitations documented

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-02-22 10:44:41 +01:00
arkonandClaude Opus 4.6 53132e3a38 fix: address 7 issues found in xterm-zerolag-input audit
1. Regex global flag safety — strip `g` flag before matching to prevent
   lastIndex mutation and missing .index on match results
2. state.visible false before activate — null overlay no longer reports
   visible: true
3. removeChar() returns 'pending' | 'flushed' | false instead of boolean
   so consumers can distinguish whether to send backspace to PTY
4. removeChar() implements buffer detection cascade (step 3) — detects
   existing prompt text when both pending and flushed are empty
5. RenderKey includes text content, not just length — prevents stale
   renders when setFlushed() called with same count but different text
6. Remove dead `import type { Terminal }` from test file
7. Remove internal `FontStyle` from public exports

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-02-22 10:24:03 +01:00
arkonandClaude Opus 4.6 d14ac9de65 feat: add xterm-zerolag-input standalone library
Extract Claudeman's local echo overlay into a reusable xterm.js addon
at packages/xterm-zerolag-input/. Provides instant keystroke feedback
via a DOM overlay, eliminating perceived input latency over high-RTT
connections (SSH, mobile, cloud IDEs).

- Zero dependencies, compatible with xterm v5.x and @xterm/xterm v5.4+
- Configurable prompt detection (character, regex, or custom function)
- Flushed text tracking for tab-switch / deferred echo scenarios
- Per-character grid-aligned rendering matching xterm's canvas output
- 56 tests passing (prompt finder, overlay renderer, full addon lifecycle)
- Dual CJS/ESM build with full TypeScript declarations

Claudeman source is unchanged — migration to consume this lib is a
separate follow-up.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-02-22 10:14:37 +01:00
arkon 4aa38c1bbb chore: bump version to 0.1599 2026-02-22 09:23:26 +01:00
arkon c78bb53968 chore: bump version to 0.1598 2026-02-22 07:34:33 +01:00
arkon 90b293ab3d chore: bump version to 0.1597 2026-02-22 06:04:37 +01:00
arkon 84c454cf40 chore: bump version to 0.1596 2026-02-22 05:52:25 +01:00
arkon 1a36ae15b8 chore: bump version to 0.1595 2026-02-22 05:46:56 +01:00
arkon 3a5ab330b7 chore: bump version to 0.1594 2026-02-22 05:45:04 +01:00
arkon 67b5c71019 chore: bump version to 0.1593 2026-02-22 05:34:52 +01:00
arkon ce49cd8c46 chore: bump version to 0.1592 2026-02-22 02:49:19 +01:00
arkonandClaude Opus 4.6 c060b72757 fix: local echo overlay — 5 bugs fixed, 39-test suite, wrapping text survives tab switch
Root cause bugs fixed in local echo overlay:
1. Stored flushed text as string (_flushedText, _flushedTexts Map) to avoid reading stale terminal buffer
2. Overlay stays visible when pendingText empties but flushed > 0
3. Backspace into flushed text has immediate visual feedback
4. _flushedTexts.delete() added alongside _flushedOffsets.delete() in Enter/Ctrl+C/cleanup
5. OSC terminal responses (xterm color queries) no longer clear flushed text state —
   was triggered by _handleColorEvent → triggerDataEvent during buffer load after tab switch

Added comprehensive test suite (test/local-echo-user-test.mjs): 39 tests across 9 groups
including line wrapping, tab switch round-trips, backspace into flushed text, and more.
All 6 test suites pass (133 total assertions).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-22 02:05:49 +01:00
arkon c820acc96e fix: make localEchoEnabled per-platform so desktop/mobile settings don't overwrite each other
Strip localEchoEnabled from server PUT payload (stays in device-specific
localStorage only). Add to displayKeys as safety net for stale server values.

chore: bump version to 0.1588
2026-02-21 23:37:29 +01:00
arkonandClaude Opus 4.6 6c75432d74 chore: bump version to 0.1587
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-21 14:35:43 +01:00
arkonandClaude Opus 4.6 7fbc60db9b chore: bump version to 0.1586
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-21 14:00:16 +01:00
arkon 0fe6251424 chore: bump version to 0.1585 2026-02-21 07:12:57 +01:00
arkonandClaude Opus 4.6 85ee601b5b chore: bump version to 0.1584
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-20 16:26:11 +01:00