Commit graph

1366 commits

Author SHA1 Message Date
devin-ai-integration[bot]
1d9112b9d3
Add SwiftLint and SwiftFormat Husky pre-commit hooks for iOS and mac (#165)
Co-authored-by: Peter Steinberger <steipete@gmail.com>
Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2025-07-01 06:24:59 +01:00
Igor Tarasenko
68ce36828a
fix: correct CLI installation verification after title mode args update (#153)
* fix: correct CLI installation verification after title mode args update (#153)

• Verify CLI install by matching `exec "$VIBETUNNEL_BIN" fwd` (ignores extra args) — resolves #152  
• Allow custom install dir (default `/usr/local/bin`); `vtTargetPath` now dynamic  
• Added regression + flaky-test fix
2025-07-01 07:09:43 +02:00
Peter Steinberger
4bdb21da41
chore: bump version to 1.0.0-beta.6 build 152 (#161)
Co-authored-by: Peter Steinberger <steipete@gmail.com>
Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2025-07-01 05:54:43 +01:00
Peter Steinberger
31a48e7a65
Remove SEA Build Test CI workflow (#164) 2025-07-01 05:18:54 +01:00
Mario Zechner
40d2cd1998
feat: add asciinema stream pruning for clear sequences (#155)
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2025-07-01 05:01:59 +01:00
Peter Steinberger
ba8d7be280
feat: optimize Playwright tests for sequential execution (#149) 2025-07-01 04:42:38 +01:00
Peter Steinberger
92fb1dc578
docs: add Homebrew installation instructions (#158) 2025-07-01 04:01:42 +01:00
Peter Steinberger
cd4e783f32
Add husky pre-commit hooks for code quality enforcement (#157) 2025-07-01 03:49:00 +01:00
Peter Steinberger
fc6999922f fix: make web artifact download optional in Mac CI
The Mac CI was failing when only Mac files changed because it tried to
download web build artifacts that were never created (Node.js CI was skipped).

Added continue-on-error to the artifact download step, allowing the Mac build
to proceed and build the web frontend itself via the existing build-web-frontend.sh
script that's already part of the Xcode build process.

This fixes CI failures like the one in PR #153 where Mac-only changes
would fail due to missing web artifacts.
2025-07-01 03:45:43 +01:00
Helmut Januschka
f2f5f5f67d
feat: add sleep prevention option to keep Mac awake during sessions (#146)
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2025-06-30 11:13:21 +01:00
Peter Steinberger
86492c4cea
feat: optimize prompt pattern detection with unified regexes (#147) 2025-06-30 09:47:15 +01:00
Peter Steinberger
884ca48dc3 docs: add release process improvements and quick reference guide
- Document lessons learned from v1.0.0-beta.5 release
- Add quick reference guide for common release tasks
- Include troubleshooting for timeout and appcast issues
- Clarify DMG notarization behavior (DMGs aren't notarized, only apps inside)
2025-06-30 07:48:14 +01:00
Peter Steinberger
6be9578db7 Update appcast for v1.0.0-beta.5 release 2025-06-30 04:28:52 +01:00
Peter Steinberger
8bc6e81549
feat: add comprehensive terminal title management (#124) 2025-06-30 04:15:09 +01:00
Billy Irwin
9cea558da8
feat: add Tailscale integration and improve networking documentation (#144)
- Add TailscaleService for status checking and integration
- Add Tailscale section in dashboard settings with status display
- Expand README with detailed setup guides for Tailscale and ngrok
- Show Tailscale hostname and IP when connected
- Add links to download/setup resources for both services

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-authored-by: Claude <noreply@anthropic.com>
2025-06-29 20:03:44 -07:00
Peter Steinberger
f1c0554644
Add Playwright E2E test framework (#120) 2025-06-30 02:51:21 +01:00
Billy Irwin
aeaecf9882
fix: handle missing .node-builds directory in build script (#142)
Check if .node-builds directory exists before attempting to find Node.js builds
to prevent errors when the directory hasn't been created yet.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-authored-by: Claude <noreply@anthropic.com>
2025-06-29 18:02:43 -07:00
Peter Steinberger
1472b0dee5
feat(ios): add light mode support, iPad keyboard shortcuts, and extended toolbar (#141) 2025-06-30 01:00:12 +01:00
Helmut Januschka
824c9134d5
Implement ultra-low-latency WebSocket input system (#115)
* Implement ultra-low-latency WebSocket input system

This change eliminates input lag on slow networks by replacing HTTP requests
with a fire-and-forget WebSocket system for terminal input transmission.

Key optimizations:
- Raw text transmission (no JSON overhead): 1 byte vs 87+ bytes per keystroke
- Fire-and-forget input (no ACK blocking): eliminates 20-50ms roundtrip latency
- Single persistent connection per session: zero connection overhead
- Direct PTY write path: fastest possible server processing
- Graceful HTTP fallback: maintains full backward compatibility

Performance improvements:
- 99% bandwidth reduction per keystroke
- 90% latency reduction on slow networks
- Zero blocking waits for rapid typing
- Eliminates HTTP/1.1 connection overhead

Files changed:
- Add: src/client/services/websocket-input-client.ts (WebSocket client)
- Add: src/server/routes/websocket-input.ts (WebSocket input handler)
- Modify: src/client/components/session-view/input-manager.ts (WebSocket integration)
- Modify: src/server/server.ts (WebSocket routing for /ws/input endpoint)

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>

* Add socket_input URL parameter feature flag

Adds ?socket_input=true/false URL parameter to control WebSocket input behavior:
- socket_input=true (default): Enable WebSocket input with HTTP fallback
- socket_input=false: Force HTTP-only input mode (disable WebSocket)

This feature flag enables:
- A/B testing between WebSocket and HTTP input performance
- Debugging WebSocket connection issues
- Gradual rollout control
- Easy fallback mechanism for production issues

Examples:
- http://localhost:4020/?socket_input=true&session=abc123 (WebSocket enabled)
- http://localhost:4020/?socket_input=false&session=abc123 (HTTP only)

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>

* Fix WebSocket input key mapping for special keys

The server was receiving key names like "enter" and writing them literally
as text instead of interpreting them as actual key presses.

Added proper key mapping:
- "enter" → '\r' (carriage return)
- "escape" → '\x1b' (ESC key)
- "backspace" → '\x7f' (DEL)
- "tab" → '\t' (TAB)
- "arrow_up" → '\x1b[A' (VT100 up arrow)
- "arrow_down" → '\x1b[B' (VT100 down arrow)
- "arrow_left"/"arrow_right" → '\x1b[D'/'\x1b[C' (VT100 arrows)
- Function keys F1-F12 → proper VT100 sequences
- Regular text → sent as-is

Now "enter" actually triggers ENTER key instead of typing "enter" text.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>

* Reuse existing key mapping logic instead of duplicating

Instead of duplicating the key mapping logic (enter → \r, etc.), now properly
reuse the existing PtyManager.sendInput() method which already handles:

- Key mapping via convertSpecialKey() method
- SessionInput type validation
- Special key vs regular text determination
- Error handling and session management

This ensures consistency between HTTP /input and WebSocket /ws/input endpoints
and avoids maintaining duplicate key mapping tables.

Benefits:
- Single source of truth for key mappings
- Consistent behavior across input methods
- Proper type safety with SessionInput/SpecialKey types
- Reuses existing error handling and validation

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>

* Fix special key detection in pasted text using null-byte markers

Problem: Pasting text like "i am entering the world" would incorrectly
interpret "enter" as the ENTER key instead of literal text.

Solution: Use null-byte markers to distinguish special keys from literal text:
- Special keys: "\x00enter\x00" → ENTER key press
- Regular text: "enter" → literal text "enter"
- Pasted text: "i am entering the world" → literal text

This maintains the raw text protocol while solving the ambiguity:
- Single keystroke "enter" → "\x00enter\x00" → ENTER key
- Pasted word "enter" → "enter" → literal text "enter"
- Multi-word paste → always literal text

Benefits:
- Preserves ultra-minimal bandwidth (just 2 null bytes overhead)
- Maintains raw text protocol (no JSON)
- Solves paste ambiguity correctly
- Null bytes rarely appear in normal text input

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>

* Fix paste text ambiguity and control sequence handling

- Modified sendInputText to always treat pasted content as literal text
- Added sendControlSequence method for control characters like Ctrl+R
- Updated direct keyboard manager to use sendControlSequence for control chars
- This ensures pasted text containing words like "enter", "backspace" is sent as literal text
- Control sequences like Ctrl+R (\x12) are properly transmitted via WebSocket with null-byte escaping

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>

* Add debug logging for WebSocket input transmission

- Added detailed logging on client side to show what's being sent
- Added server side logging to show what's being received
- This will help debug the enter key transmission issue

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>

* Add comprehensive input logging to track key processing

- Added logging in WebSocket handler to show parsed input
- Added logging in PtyManager to show key conversion and output
- This will show the complete flow: received key -> parsed input -> converted output

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>

* Add DEBUG environment variable for enabling debug logging

- Added DEBUG=true environment variable option alongside --debug flag
- Makes it easier to enable debug logging during development

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>

* Fix WebSocket input handling for HQ mode and mobile keyboards

- Add WebSocket proxy support for remote sessions in HQ mode
- Fix mobile keyboard special key handling to use sendInput() instead of sendInputText()
- Make InputManager.sendInput() public for use by mobile components
- Update DirectKeyboardManager to correctly send special keys from custom keyboard
- Handle WebSocket data type conversion for native WebSocket API compatibility

This ensures special keys are properly wrapped with null bytes (\x00) when sent
via WebSocket, and enables low-latency input for remote sessions in HQ mode.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>

* refactor: eliminate code duplication in input-manager and fix TypeScript typing

- Extract common WebSocket/HTTP fallback logic into sendInputInternal()
- Reduce ~155 lines of duplicate code across sendInput, sendInputText, and sendControlSequence methods
- Add proper WebSocketRequest interface to replace any type usage
- Fix linting issues in server.ts WebSocket handling

* up

* Add comprehensive tests for WebSocket input handler

- Test special key handling with null-byte wrapped keys (\x00enter\x00)
- Test text containing key names ('i enter the world') treated as literal text
- Test HQ mode remote session proxying vs local PTY handling
- Test edge cases: empty messages, malformed keys, binary data, Unicode
- Test error handling and connection lifecycle
- Remove duplicate special key validation logic
- Delegate key conversion to ptyManager for consistency

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>

* Fix TypeScript linting issues in WebSocket input handler tests

- Replace all 'any' types with proper type definitions
- Add MockEventListener type for test event handlers
- Use 'unknown' instead of 'any' for type assertions
- Remove unused SessionInput import
- Fix formatting issues per Biome requirements

All 20 WebSocket input handler tests now pass with proper TypeScript types.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>

---------

Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Mario Zechner <badlogicgames@gmail.com>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2025-06-29 22:55:13 +02:00
Clay Warren
aabbd57aa2
feat: add gemini quick start button (#128) 2025-06-29 21:54:14 +01:00
Manuel Maly
b2a395fcd8
feat: add gemini and review-pr slash commands (#138) 2025-06-29 21:53:33 +01:00
Chris Reynolds
13b98308c9
fix: remove double shell-wrapping for aliases in vt script (#132) 2025-06-29 21:52:52 +01:00
Zhiqiang ZHOU
7a49ea5e46 chore: new access option with cloudflare quick tunnel
Signed-off-by: Zhiqiang ZHOU <im@strrl.dev>
2025-06-29 21:34:09 +01:00
Peter Steinberger
e04e9dd7b5 docs: Add branching workflow rule to CLAUDE.md
Clarify that new branches/PRs should not be created automatically when already on a branch. PRs can contain multiple features as part of the workflow.
2025-06-29 20:33:57 +01:00
Peter Steinberger
7f3fbe164a
feat: Add build output filtering to remove non-actionable warnings (#136) 2025-06-29 19:36:40 +01:00
Peter Steinberger
39a5933f9f
Fix frontend log streaming in no-auth mode (#130) 2025-06-29 18:41:40 +01:00
Manuel Maly
099a5fb427
fix: scrolling on web mobile (#129) 2025-06-29 17:39:16 +02:00
Peter Steinberger
38b7846605
Fix terminal width overflow causing flickering in native terminals (#123) 2025-06-29 11:43:29 +01:00
Peter Steinberger
4b74fdf89c
Fix URL detection to exclude numbered lists (#122) 2025-06-28 20:20:34 +02:00
Peter Steinberger
7f1c4ec9bb Update tests to match new behavior for Windows drive letter support
- Tests now expect all Windows drive letters (A-Z) to be replaced with ~
- This matches the updated regex pattern that supports any drive letter
- Tests verify D:, E:, Z:, and lowercase drive letters work correctly
2025-06-28 15:22:05 +02:00
Peter Steinberger
816247d8ad Fix Windows drive letter support in path formatting regex
- Update regex pattern to support all drive letters A-Z (not just C:)
- Fix linting warning about unnecessary escape in character class
- Now properly handles paths like D:\Users\, E:\Users\, etc.
2025-06-28 15:22:05 +02:00
Peter Steinberger
c8234ded90 Improve Claude comment cleanup to use GitHub's minimizeComment mutation
- Replace manual comment editing with GitHub's native minimizeComment GraphQL mutation
- Provides cleaner UI with "This comment has been minimized" instead of custom details/summary
- Keep fallback to original approach if GraphQL mutation fails
- Maintains same categorization logic for reviews, errors, and status comments
2025-06-28 15:22:05 +02:00
Peter Steinberger
dfb36f7cf8 Fix critical bug: revert path formatting in session-create-form input
The working directory input was displaying formatted paths (~/Documents) but
storing them as-is when edited, causing backend errors since it expects
absolute paths.

Reverted to showing raw paths in the input field. The file browser component
is unaffected as it correctly only formats for display, not for input.

This ensures workingDir always contains absolute paths as expected by the API.
2025-06-28 15:22:05 +02:00
Peter Steinberger
836db22a5e Apply path formatting to remaining frontend components
- Add formatPathForDisplay to session-create-form working directory input
- Add formatPathForDisplay to file-browser path display
- Users now see ~/Documents instead of /Users/username/Documents everywhere
- Maintains raw paths for editing and API calls, only formats for display
2025-06-28 15:22:05 +02:00
Peter Steinberger
039f27112e Remove unnecessary memoization from clickable-path component
- The formatPathForDisplay function is extremely cheap (single regex replace)
- LitElement already optimizes renders efficiently
- Removing memoization reduces code complexity and memory overhead
- The performance difference is negligible for such a simple operation
2025-06-28 15:22:05 +02:00
Peter Steinberger
f90478b74a Handle external contributor CI permissions gracefully
- Add continue-on-error to all comment-posting steps in lint-reporter
- Check for fork PRs and skip Claude reviews for external contributors
- Add permission checks to prevent CI failures on forks
- Create documentation explaining external contributor CI behavior
- Ensure all workflows handle permission errors without failing the build

This allows external contributors to submit PRs without CI failures due to
missing write permissions, while still running all tests and validations.
2025-06-28 15:22:05 +02:00
Peter Steinberger
520c3ea443 Update Claude cleanup script to delete error comments
- Error comments are now deleted instead of collapsed
- Only successful reviews and status comments are collapsed
- This keeps the PR comments cleaner by removing failed attempts
2025-06-28 15:22:05 +02:00
Peter Steinberger
dc646ae76e Address additional Claude review feedback
- Optimize path formatting with pre-compiled regex for better performance
- Add memoization to clickable-path component to avoid re-computations
- Add comprehensive tests for usernames with regex special characters
- Simplify clipboard tests for more reliable test execution
- Fix potential issues with special characters in usernames breaking regex patterns
2025-06-28 15:22:05 +02:00
Peter Steinberger
f7b725ff17 Fix path formatting issues identified by Claude review
- Handle Windows paths with forward slashes (C:/Users/username)
- Support case-insensitive Windows drive letters (c:\ vs C:\)
- Fix multiple home directory pattern replacement using single regex
- Add comprehensive tests for all edge cases
- Update JSDoc comments with proper formatting
2025-06-28 15:22:05 +02:00
Peter Steinberger
cb093ffd12 Add /cp and c+p as shorthands for commit and push 2025-06-28 15:22:05 +02:00
Peter Steinberger
7d7200f9a8 Update CLAUDE.md to use single command for commit and push 2025-06-28 15:22:05 +02:00
Peter Steinberger
c24749458c Fix Claude bot creating multiple PR comments
- Add automatic cleanup of old Claude comments after each review
- Create reusable cleanup script that intelligently handles different comment types
- Keep only the most recent successful review visible
- Collapse (not delete) old reviews, errors, and status messages
- Add manual cleanup workflow that can be triggered or run on schedule
- Preserve comment history while keeping PRs readable

This solves the issue where Claude creates new comments instead of updating
existing ones, since the anthropics/claude-code-action@beta doesn't support
comment updates natively.
2025-06-28 15:22:05 +02:00
Peter Steinberger
986154da7c Fix quality report formatting - remove empty line between title and status
- Changed lint-reporter action to display title and status on same line
- Before: Title on one line, empty line, then status on next line
- After: Title and status on same line for more compact display
- Affects all quality reports: Node.js linting, formatting, coverage, etc.
2025-06-28 15:22:05 +02:00
Peter Steinberger
dcfdfa62ac Add Playwright MCP as project config 2025-06-28 15:22:05 +02:00
Peter Steinberger
696b51e50c Fix iOS/macOS test coverage extraction in CI
- Add debugging steps to diagnose why coverage shows 0%
- Implement multiple fallback methods for coverage extraction:
  1. Standard xccov with --json flag
  2. Text parsing fallback without --json
  3. Test execution verification (0.1% if tests ran but coverage failed)
- Fix command order: put --json flag after xcresult path
- Add detailed logging to understand coverage extraction failures
- Check xcresult contents with xcresulttool for coverage data

This should resolve the "Failed to load coverage report" errors
and provide better visibility into what's happening in CI.
2025-06-28 15:22:05 +02:00
Peter Steinberger
8e94b644e7 Clarify that pnpm run check is the primary command for concurrent checking 2025-06-28 15:22:05 +02:00
Peter Steinberger
627599fb02 Fix race condition risks in code quality tools
- Keep parallel execution for read-only checks (format:check, lint, typecheck)
- Make check:fix run sequentially to prevent file write conflicts
- Add documentation explaining why sequential execution is needed
- Based on best practices: lint-staged and JavaScript community recommendations
2025-06-28 15:22:05 +02:00
Peter Steinberger
18e4648904 Add comprehensive tests and improve code quality workflow
- Add tests for formatPathForDisplay covering all platforms
- Create parallel code quality check script (pnpm run check)
- Add auto-fix command for format and lint issues (pnpm run check:fix)
- Document the improved workflow in DEVELOPMENT.md
- Update CLAUDE.md with the new commands
2025-06-28 15:22:05 +02:00
Peter Steinberger
d0c42107f3 Switch to client-side path formatting with regex
- Remove all server-side path formatting logic
- Implement simple regex-based client-side formatting
- Support macOS, Linux, Windows, and root user paths
- Simpler implementation with no API changes needed
- Better separation of concerns (UI formatting in UI layer)
2025-06-28 15:22:05 +02:00
Peter Steinberger
f2eb262384 Remove formatPathForDisplay function completely
- Delete formatPathForDisplay function from path-utils.ts
- Update all components to use displayWorkingDir from server
- Clean up imports in affected components
- Add refactoring philosophy note to CLAUDE.md
2025-06-28 15:22:05 +02:00