Add Poltergeist integration for automatic builds (#514)

This commit is contained in:
Peter Steinberger 2025-08-06 19:01:20 +02:00 committed by GitHub
parent d3e54e8254
commit c4da2dd7c1
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
9 changed files with 188 additions and 62 deletions

View file

@ -85,7 +85,7 @@ jobs:
continue-on-error: true
uses: anthropics/claude-code-action@beta
with:
anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}
claude_code_oauth_token: ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }}
# Use Claude Sonnet 4 (default model)
# model: "claude-opus-4-20250514"

View file

@ -38,7 +38,7 @@ jobs:
id: claude
uses: anthropics/claude-code-action@beta
with:
anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}
claude_code_oauth_token: ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }}
# Optional: Specify model (defaults to Claude Sonnet 4, uncomment for Claude Opus 4)
# model: "claude-opus-4-20250514"

23
.github/workflows/run-gemini-cli.yml vendored Normal file
View file

@ -0,0 +1,23 @@
name: Run Gemini CLI
on:
pull_request:
types: [opened, synchronize]
issue_comment:
types: [created]
workflow_dispatch:
jobs:
run-gemini:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Run Gemini CLI
uses: google-github-actions/run-gemini-cli@main
with:
gemini_api_key: ${{ secrets.GEMINI_API_KEY }}
# Optional: Specify custom prompt or configuration
# prompt: "Review this code for improvements"

View file

@ -1,54 +0,0 @@
# Android Keyboard Fix for Claude Code
## Issue #504: Android keyboard covers Claude Code text input
### Problem
When Claude Code runs inside a VibeTunnel terminal session on Android Chrome, the on-screen keyboard covers the text input area, preventing users from seeing what they're typing.
### Root Cause
While VibeTunnel handles keyboard appearance for its own UI elements, embedded applications like Claude Code running inside the terminal don't benefit from these adjustments. The terminal content remains fixed in position when the keyboard appears.
### Solution Implemented
#### 1. Modern Viewport Units
- Added `100dvh` (dynamic viewport height) units alongside existing `100vh`
- Dynamic viewport units automatically adjust when the keyboard appears/disappears
- Updated in `index.html` for better mobile browser support
#### 2. Interactive Widget Meta Tag
- Added `interactive-widget=resizes-content` to viewport meta tag
- This tells Android Chrome to resize the viewport when keyboard appears
- Provides better native handling of keyboard appearance
#### 3. CSS Improvements
- Made terminal viewport scrollable when keyboard is visible
- Added specific styles for `data-keyboard-visible="true"` state
- Ensured xterm viewport can scroll to show content behind keyboard
- Used `env(keyboard-inset-height)` for future-proof keyboard handling
#### 4. Enhanced Keyboard Detection
- Set CSS custom property `--keyboard-height` with actual keyboard height
- Added `data-keyboard-visible` attribute to body element
- Dispatch custom events `vibetunnel:keyboard-shown` and `vibetunnel:keyboard-hidden`
- These allow embedded apps to react to keyboard state changes
### Benefits
- Claude Code (and other embedded apps) can now be scrolled when keyboard appears
- No more hidden input fields on Android devices
- Better visual feedback and smoother transitions
- Future-proof solution using modern CSS and viewport APIs
### Testing
1. Open VibeTunnel on Android Chrome
2. Start a Claude Code session
3. Tap on Claude's input field
4. Verify that:
- The viewport adjusts when keyboard appears
- You can scroll to see the input field
- Text input remains visible while typing
- Keyboard dismissal restores normal view
### Compatibility
- Android Chrome: Full support
- iOS Safari: Improved support (already had better handling)
- Desktop browsers: No impact (mobile-only styles)

View file

@ -14,11 +14,28 @@ VibeTunnel is a macOS application that allows users to access their terminal ses
### Building the Project
#### macOS App
#### macOS App with Poltergeist (Recommended if installed)
If Poltergeist is installed, it will automatically rebuild the app when you make changes:
```bash
# First, ensure Poltergeist is running in the project root
poltergeist haunt
# The app will automatically rebuild on file changes
# Check Poltergeist menu bar app for build status
```
#### macOS App without Poltergeist (Fallback)
If Poltergeist is not available, use direct Xcode builds:
```bash
cd mac
# Build using xcodebuild directly
xcodebuild -project VibeTunnel.xcodeproj -scheme VibeTunnel -configuration Debug build
# Or use the build script for release builds
./scripts/build.sh # Build release version
./scripts/build.sh --configuration Debug # Build debug version
./scripts/build.sh --sign # Build with code signing
```
@ -268,6 +285,68 @@ The agent will:
- Don't add fallbacks for older versions
- If you suggest backwards compatibility in any form, you have failed to understand this project
## Poltergeist Integration
Poltergeist is an intelligent file watcher and auto-builder that can automatically rebuild VibeTunnel when you make changes. When working on VibeTunnel development, check if Poltergeist is available and use it for automatic builds.
### Checking for Poltergeist
```bash
# Check if Poltergeist is installed
which poltergeist
# Check if Poltergeist is already running for this project
ps aux | grep poltergeist | grep -v grep
```
### Using Poltergeist for Development
If Poltergeist is installed:
1. **Start Poltergeist** in the project root:
```bash
cd /path/to/vibetunnel
poltergeist haunt
```
2. **Monitor build status** via the Poltergeist menu bar app (macOS) or terminal output:
```bash
poltergeist status
```
3. **Make changes** - Poltergeist will automatically rebuild when it detects changes to:
- Swift files in `mac/`
- Xcode project files
- Configuration files
4. **Run the app** with fresh builds using `polter`:
```bash
polter vibetunnel # Waits for build to complete, then runs
```
### Fallback Without Poltergeist
If Poltergeist is not available, fall back to direct Xcode builds:
```bash
# Debug build
cd mac
xcodebuild -project VibeTunnel.xcodeproj -scheme VibeTunnel -configuration Debug build
# Release build
./scripts/build.sh
```
### Poltergeist Configuration
The project includes `poltergeist.config.json` which configures:
- **vibetunnel** target: Builds the macOS app using workspace
- **vibetunnel-ios** target: Builds the iOS app (disabled by default)
- Intelligent debouncing to prevent excessive rebuilds
- Build notifications via macOS notification center
To enable iOS builds, edit `poltergeist.config.json` and set `"enabled": true` for the vibetunnel-ios target.
## Key Files Quick Reference
- Architecture Details: `docs/ARCHITECTURE.md`

View file

@ -47,6 +47,7 @@
- [npm Package](#npm-package)
- [Building from Source](#building-from-source)
- [Development](#development)
- [Poltergeist Integration](#poltergeist-integration)
- [Documentation](#documentation)
- [macOS Permissions](#macos-permissions)
- [Contributing](#contributing)
@ -916,6 +917,44 @@ VIBETUNNEL_LOG_LEVEL=silent vt npm test
**Note**: All logs are always written to `~/.vibetunnel/log.txt` regardless of verbosity level. The verbosity settings only control what's displayed in the terminal.
## Poltergeist Integration
[Poltergeist](https://github.com/poltergeist/poltergeist) is an intelligent file watcher and auto-builder that can automatically rebuild VibeTunnel as you develop. This is particularly useful for native app development where manual rebuilds can interrupt your flow.
### Setting Up Poltergeist
1. **Install Poltergeist** (if not already installed):
```bash
npm install -g poltergeist
```
2. **Start Poltergeist** in the VibeTunnel directory:
```bash
cd /path/to/vibetunnel
poltergeist
```
3. **Make changes** - Poltergeist will automatically rebuild when it detects changes to:
- Swift files in `mac/` or `ios/`
- Xcode project files
- Configuration files
### Poltergeist Features
- **Automatic Rebuilds**: Detects file changes and rebuilds instantly
- **Smart Debouncing**: Prevents excessive rebuilds during rapid edits
- **Build Notifications**: macOS notifications for build success/failure
- **Menu Bar Integration**: Monitor build status from the macOS menu bar
- **Parallel Builds**: Can build macOS and iOS targets simultaneously
### Configuration
VibeTunnel includes a `poltergeist.config.json` that configures:
- **vibetunnel** target: Builds the macOS app in Debug configuration
- **vibetunnel-ios** target: Builds the iOS app (disabled by default)
To enable iOS builds, edit `poltergeist.config.json` and set `"enabled": true` for the vibetunnel-ios target.
## Documentation
- [Keyboard Shortcuts](docs/keyboard-shortcuts.md) - Complete keyboard shortcut reference

View file

@ -9,10 +9,17 @@ The main build orchestration happens through shell scripts in `mac/scripts/` tha
### macOS Application Build
**Development Build** - Quick build without code signing:
**Development Build with Poltergeist** (Recommended):
```bash
# Start Poltergeist for automatic rebuilds
poltergeist
# Make changes - app rebuilds automatically
```
**Development Build without Poltergeist**:
```bash
cd mac
./scripts/build.sh --configuration Debug
xcodebuild -project VibeTunnel.xcodeproj -scheme VibeTunnel -configuration Debug build
```
**Release Build** - Full build with code signing:

View file

@ -718,8 +718,11 @@ cleanupOnStartup: Bool = true
# Complete build
cd mac && ./scripts/build.sh --configuration Release --sign
# Development build
cd mac && ./scripts/build.sh --configuration Debug
# Development build (with Poltergeist if available)
poltergeist # Automatic rebuilds on file changes
# Or manual build
cd mac && xcodebuild -project VibeTunnel.xcodeproj -scheme VibeTunnel -configuration Debug build
```
**Build Phases**:

29
poltergeist.config.json Normal file
View file

@ -0,0 +1,29 @@
{
"version": "1.0",
"projectType": "swift",
"targets": [
{
"name": "vibetunnel",
"type": "app-bundle",
"buildCommand": "cd . && xcodebuild -workspace VibeTunnel.xcworkspace -scheme VibeTunnel -configuration Debug build",
"outputPath": "./mac/build/Build/Products/Debug/VibeTunnel.app",
"bundleId": "sh.vibetunnel.vibetunnel.debug",
"watchPaths": [
"./**/*.{swift,xcconfig,entitlements,plist}",
"./**/*.xcodeproj/**"
]
},
{
"name": "vibetunnel-ios",
"type": "app-bundle",
"buildCommand": "cd ios && xcodebuild -project VibeTunnel-iOS.xcodeproj -scheme VibeTunnel-iOS -configuration Debug build",
"outputPath": "./ios/build/Build/Products/Debug-iphonesimulator/VibeTunnel.app",
"bundleId": "sh.vibetunnel.ios",
"watchPaths": [
"ios/**/*.{swift,xcconfig,entitlements,plist}",
"ios/**/*.xcodeproj/**"
],
"enabled": false
}
]
}