-
Notifications
You must be signed in to change notification settings - Fork 27
Add Expo mobile app for Catnip workspace management #189
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
|
Warning Review the following alerts detected in dependencies. According to your organization's Security Policy, it is recommended to resolve "Warn" alerts. Learn more about Socket for GitHub.
|
Replace manual variable forwarding with comprehensive environment dump to ensure all user-configured tools and package managers are available to the catnip service. 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
…de extension - Implement device detection to differentiate between mobile and desktop environments - Desktop view: keep existing "Open Catnip Interface" button and add QR code for mobile access - Mobile view: replace button with cat emoji logo linking to Catnip interface - Add QR code generation using qrcode library for https://catnip.run?cs=$CODESPACE_NAME - Include styled webview panel for QR code display with VSCode theming - Update extension package with new command and dependencies 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
- Pass pending prompt from workspace creation to detail view for immediate "working" state display - Add conditional diff fetching that continues polling while Claude is active - Store and display user's prompt immediately before backend updates - Clear pending prompt after navigation completes Fixes issue where "Ask for changes" flow showed empty state instead of working state. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
Previously, handleSSEPromptInjection would wait for a SessionStart hook before injecting prompts. This worked for new workspaces but failed for "Ask for changes" on completed workspaces since Claude was already running. Now checks Claude activity state first - if Claude is active/running, inject the prompt immediately without waiting for SessionStart. This fixes the issue where prompts would timeout and never execute in active sessions. Fixes: Carriage return not sent after prompt in "Ask for changes" flow 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
Implements full-featured iOS client for Catnip with: - OAuth authentication flow with GitHub - Workspace list and detail views with real-time polling - PTY terminal viewer with SSE connection - Diff viewer with syntax highlighting - Claude session monitoring and state management - Pull request creation workflow - Glass morphism UI design matching mobile app Includes comprehensive UI tests and performance documentation. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
- Add glass morphism themed UI components (GlassButton, GlassCard, GlassInput, etc.) - Implement New Workspace drawer with repository and branch selection - Add theme system with colors, spacing, and typography - Update navigation between codespace, workspaces, and workspace detail views - Configure Expo app with custom icon and splash screen - Add TypeScript strict mode configuration - Update dependencies and lockfile 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
Adds cat emoji logging to trace workspace checkout flow and help debug timing issues with workspace directory creation. Includes logging for: - Checkout requests with repository and branch details - Worktree path and checkout success - Workspace metadata persistence 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
- Add GitHub Actions workflow to test iOS app on pull requests - Configure Watchman for React Native file watching - Update Claude Code settings for development environment 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
Documents the adaptive polling strategy for workspace updates, including: - Polling intervals based on Claude activity state - ETag-based conditional requests to reduce bandwidth - Implementation details for iOS and mobile apps 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
Codecov Report❌ Patch coverage is
📢 Thoughts on this report? Let us know! |
Resolved 13+ compiler warnings across the iOS app to improve code quality: **AuthManager.swift:** - Fixed unused try? results by explicitly discarding with _ - Fixed actor isolation in presentationAnchor with @mainactor annotation **WorkspacePoller.swift:** - Fixed actor isolation in notification observers with Task { @mainactor in } - Removed unnecessary await on non-async method call **PTYWebSocketManager.swift:** - Fixed PTYControlMessage Codable conformance actor isolation by using nonisolated extension - Made PTYControlMessage conform to Sendable for safe concurrent access - Fixed URLSessionWebSocketDelegate methods with nonisolated annotation **TerminalView.swift:** - Fixed unused result from resignFirstResponder() All changes maintain existing functionality while eliminating warnings. Build now succeeds with zero warnings in our code. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
Fixed critical bug where workspace would get stuck in "Claude is working..." state after Claude completed the task. **Root Cause:** The pendingUserPrompt state variable was preventing phase transitions. Once set, the condition `workspace.claudeActivityState == .active || pendingUserPrompt != nil` would always be true, keeping the view stuck in "working" phase indefinitely. **Fixes:** 1. Clear pendingUserPrompt early when backend confirms receipt: - When claudeActivityState becomes .active (processing started) - When latestSessionTitle is set (session created) This allows proper phase transition to "completed" 2. Improved diff fetching logic: - Inverted caching logic to always refetch final diff when work completes - Prevents diff spam during active work while ensuring final changes display - Fixes issue where diff wouldn't show after Claude finished 3. Added 16pt top margin to diff viewer for consistent spacing **Result:** - Workspace now properly transitions: input → working → completed - Diff displays correctly with final changes - Better visual spacing between tasks and diff sections 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
Optimized codespace startup and health checking logic: **Health Check Improvements:** - Reduced health check attempts for already-running codespaces (4 vs 8) - Track whether codespace was already running to optimize checks - Faster response when codespace is already available (20s vs 40s max) **Container Routing:** - Temporarily disabled container routing to avoid build/upload overhead - Added clear comments for re-enabling when needed **Configuration Updates:** - Updated wrangler.jsonc with refined deployment settings - Added jose package for JWT handling These changes reduce latency for users when their codespace is already running while maintaining reliability for cold starts. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
Updated onChange modifiers to use the newer Swift 5.9+ syntax without
explicit old/new value parameters. This eliminates compiler warnings
and makes the code cleaner.
**Changes:**
- WorkspacesView: Updated 3 onChange modifiers
- CodespaceView: Updated onChange for orientation
- WorkspaceDiffViewer: Updated 2 onChange modifiers and improved header background
**Before:**
```swift
.onChange(of: value) { oldValue, newValue in ... }
```
**After:**
```swift
.onChange(of: value) { ... }
```
All functionality remains identical, just using modern Swift syntax.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Enhanced debugging capabilities and added support for pull request features: **CatnipAPI Improvements:** - Added extensive NSLog statements throughout all API methods - Track codespace name usage in requests - Log request/response flow for easier debugging - Preview first 200 bytes of response data for troubleshooting - Better error context with specific log messages **WorkspaceInfo Model:** - Added PRSummary struct for pull request creation feature - Supports title and description fields The logging additions make it much easier to diagnose API issues in production without needing a debugger attached. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
Added new pull request creation UI and improved build workflow: **PRCreationSheet.swift:** - New SwiftUI sheet for creating pull requests from workspaces - Generates PR title and description using AI - Shows preview before creating - Handles loading states and errors gracefully - Integrates with existing workspace detail view **Build Tooling (justfile):** - Added just commands for common Xcode operations - `just build` - Full clean build with all warnings enabled - `just build-quick` - Fast incremental build - `just analyze` - Run static analyzer - `just list-simulators` - List available devices - Makes it easier to build from command line and CI **Documentation (TERMINAL_SETUP.md):** - Added terminal integration setup instructions - Documents SwiftTerm integration and WebSocket PTY connections **Xcode Project Updates:** - Added new files to project - Updated build settings and configurations 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
Ignore xcuserdata/ directory which contains user-specific Xcode workspace state that shouldn't be version controlled. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This file should never have been tracked as it contains user-specific workspace state. Now properly ignored via .gitignore. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
Summary
Added a new React Native/Expo mobile application that provides native mobile access to Catnip workspaces and Claude AI interactions. The app connects to the existing CloudFlare worker API at
catnip.run/v1/*to enable mobile users to manage their development workflows.Key Features
Implementation Notes
The mobile app mirrors the existing web Mobile components (
WorkspaceMobile.tsx,CodespaceAccess.tsx) while being optimized for native mobile experience. It uses Expo's latest features including SecureStore for encrypted credentials, AuthSession for OAuth flows, and built-in fetch for API communication. The app is ready for deployment to both iOS and Android platforms via Expo's build service.