StillKnotKnown a6ffd0e129 feat: Add terminal copy/paste keyboard shortcuts for Windows/Linux (#786)
* feat: add terminal copy/paste keyboard shortcuts for Windows/Linux

Implement smart copy/paste keyboard shortcuts in terminal emulator:
- Smart CTRL+C: copies selected text or sends ^C interrupt if no selection
- CTRL+V paste: pastes clipboard contents on Windows/Linux
- Linux CTRL+SHIFT+C/V: alternative copy/paste shortcuts for Linux
- Platform detection: correctly identifies Windows/Linux/macOS
- Preserves all existing shortcuts (Ctrl+T, Ctrl+W, Ctrl+1-9, etc.)

Implementation details:
- Added platform detection constants (isMac, isWindows, isLinux)
- Smart copy handler checks xterm.hasSelection() before copying
- Uses xterm.paste() for proper encoding handling
- Includes error handling for clipboard API failures
- Handler ordering preserves all existing keyboard shortcuts

Tests added:
- Unit tests for keyboard event handlers (9/19 passing)
- Integration tests for xterm.js + clipboard API
- E2E tests for copy/paste flows (platform-specific)

Fixes #38 - Terminal copy/paste not working on Windows

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

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

* fix: resolve test failures for terminal copy/paste functionality

- Fixed global XTerm mock setup to not interfere with test-specific mocks
- Fixed 19 failing tests in useXterm.test.ts by adding proper DOM rendering
- Fixed 7 failing tests in terminal-copy-paste.test.ts with same pattern
- Added missing Mock type import for TypeScript compatibility

Test Changes:
- Replaced arrow functions with regular functions for mock constructors
- Added ResizeObserver mock for browser API compatibility
- Created wrapper components with proper DOM rendering
- Used render() with act() instead of just renderHook()
- Fixed type assertions (vi.Mock → Mock)

All tests now pass (1297 passed, 6 skipped)
Typecheck passes
Lint passes (warnings only)

* refactor: fix linting issues in terminal copy/paste test files

E2E Test Changes (terminal-copy-paste.e2e.ts):
- Removed unused imports (_android from Playwright, writeFileSync from fs)
- Added global Navigator declaration for clipboard typing
- Replaced (window as any) with typed navigator.clipboard calls
- Removed dead helper functions (getCopyShortcutModifier, getPasteShortcutModifier)
- Replaced relative Electron path with absolute path using __dirname
- Renamed caught error 'e' to '_error' to satisfy lint rules

Integration Test Changes (terminal-copy-paste.test.ts):
- Removed unused renderHook import
- Added process.platform restoration in afterEach cleanup
- Fixed console error spy to safely coerce args[0] with String()

Unit Test Changes (useXterm.test.ts):
- Created reusable _createXTermMock factory function
- Updated test to use TestWrapper pattern consistently
- Added process.platform restoration in afterEach
- Fixed test assertion (hasSelection: false) for Windows CTRL+SHIFT+C test

All tests pass (1297 passed, 6 skipped)
Typecheck passes
Lint passes (warnings only)

* fix: replace process.platform with navigator.platform for renderer compatibility

Critical fix for runtime error: "process is not defined" in browser/renderer process.

Core Changes (useXterm.ts):
- Replaced process.platform (Node.js global) with navigator.platform (browser API)
- Platform detection now uses: navigator.platform.toLowerCase()
  - isMac: navigatorPlatform.includes('mac')
  - isWindows: navigatorPlatform.includes('win')
  - isLinux: navigatorPlatform.includes('linux')

Test Updates:
- Integration tests: Updated to mock navigator.platform instead of process.platform
  - Added beforeEach/afterEach for proper cleanup
  - Removed redundant inline cleanup code
  - Added platform mocks where needed for Windows/Linux paste handler tests
- Unit tests: Updated all process.platform references to navigator.platform
  - Changed originalPlatform to originalNavigatorPlatform
  - Updated afterEach to restore navigator.platform
  - Changed platform values: 'win32' → 'Win32', 'darwin' → 'MacIntel', 'linux' → 'Linux'
  - Removed unused _createXTermMock helper function

E2E Test Improvements:
- console.log → console.warn for clipboard accessibility message
- Improved interrupt signal assertion: toMatch(/\^C|[$#>]\s*$/)

All tests pass (1297 passed, 6 skipped)
Typecheck passes
Lint passes (warnings only)

* fix: prevent double-paste by calling event.preventDefault()

Fixed issue where pasted text appeared twice in the terminal.

Root cause: When Ctrl+V was pressed:
1. Browser's default paste behavior was triggered
2. Our handler also called xterm.paste()

Fix: Added event.preventDefault() to both paste handlers:
- CTRL+V (Windows/Linux)
- CTRL+SHIFT+V (Linux alternative)

This prevents the browser's default paste behavior, ensuring only
xterm.paste() handles the pasting operation once.

Tests still pass (26 passed)

* fix: resolve unreachable Linux handlers and improve test reliability

Critical Fix (useXterm.ts):
- Fixed unreachable CTRL+SHIFT+C/V handlers for Linux
- Root cause: Regular CTRL+C/V handlers checked isMod && key, which
  matched even when SHIFT was pressed, preventing Linux-specific
  handlers from ever executing
- Fix: Reordered checks to handle Linux shortcuts BEFORE regular shortcuts
  and added !event.shiftKey to regular copy/paste handlers

E2E Test Improvements (terminal-copy-paste.e2e.ts):
- Replaced fixed sleeps (waitForTimeout) with condition-based waits
- Removed try/catch + test.skip anti-pattern, replaced with upfront precondition checks

Unit Test Improvements (useXterm.test.ts):
- Replaced trivial platform detection tests with comprehensive behavior tests
- Added 4 new tests verifying platform-specific keyboard handling

Test Results: 1298 passed, 6 skipped

* refactor: extract XTerm mock setup into helper function

Extract repeated XTerm mock setup code into a reusable setupMockXterm() helper function. This reduces test boilerplate from ~100 lines to ~20 lines per test while maintaining identical test coverage and behavior.

Changes:
- Added setupMockXterm() helper function that handles all mock initialization
- Refactored all 20+ tests in useXterm.test.ts to use the helper
- Significantly improved code readability and maintainability

* fix(e2e): replace invalid toMatch() with toContainText() in terminal test

Replace invalid Playwright locator assertion `toMatch()` with valid `toContainText()` assertion. The `toMatch()` method does not exist for Playwright locators; `toContainText()` is the correct matcher for checking text content with regex patterns.

* refactor: extract copy/paste helpers and fix CTRL+SHIFT+C behavior

Address PR review feedback:

1. [MEDIUM] Extract copy/paste helper functions
   - Added handleCopyToClipboard() helper to eliminate duplicate copy logic
   - Added handlePasteFromClipboard() helper to eliminate duplicate paste logic
   - Both handlers now use shared helper functions

2. [MEDIUM] Fix CTRL+SHIFT+C without selection on Linux
   - Changed from returning true (let event pass through) to returning false (consume event)
   - CTRL+SHIFT+C won't send proper interrupt signal, so consuming is correct behavior

3. [LOW] Add comment for isMac variable
   - Added comment explaining isMac is declared for documentation purposes

Related: #038-terminal-copy-paste-is-not-working-on-windows

* refactor: remove unused isMac variable

Remove the unused isMac variable since it's not referenced in any conditional logic. The code already excludes macOS by only enabling custom paste handlers for Windows and Linux (isWindows || isLinux).

Related: #038-terminal-copy-paste-is-not-working-on-windows

* fix(e2e): remove non-existent electron.executablePath() API call

Remove the executablePath parameter from electron.launch() to match
the pattern used in other E2E tests (flows.e2e.ts, electron-helper.ts).

* refactor(terminal): fix platform detection and clarify comments

- Replace deprecated navigator.platform with navigator.userAgentData.platform
  with fallback to navigator.platform for older browsers
- Add TypeScript type augmentation for NavigatorUAData interface
- Fix misleading comment in handleCopyToClipboard to clarify return value
  semantics (true = copy attempted, false = no selection)
- Add requestAnimationFrame mock to useXterm test for jsdom environment

Fixes review findings for terminal copy/paste feature.

---------

Co-authored-by: StillKnotKnown <stillknotknown@users.noreply.github.com>
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Andy <119136210+AndyMik90@users.noreply.github.com>
2026-01-07 21:51:10 +01:00
2025-12-22 14:17:08 +01:00
2026-01-02 11:56:36 +01:00
2026-01-02 11:56:36 +01:00
2025-12-10 09:10:55 +01:00
2026-01-02 11:56:36 +01:00
2026-01-02 14:12:36 +01:00
2026-01-02 11:56:36 +01:00
2026-01-02 11:56:36 +01:00
2025-12-22 14:17:08 +01:00
2026-01-02 11:56:36 +01:00
2026-01-02 11:56:36 +01:00
2026-01-02 11:56:36 +01:00
2025-12-15 21:10:27 +01:00

Auto Claude

Autonomous multi-agent coding framework that plans, builds, and validates software for you.

Auto Claude Kanban Board

License Discord YouTube CI


Download

Stable Release

Stable

Platform Download
Windows Auto-Claude-2.7.2-win32-x64.exe
macOS (Apple Silicon) Auto-Claude-2.7.2-darwin-arm64.dmg
macOS (Intel) Auto-Claude-2.7.2-darwin-x64.dmg
Linux Auto-Claude-2.7.2-linux-x86_64.AppImage
Linux (Debian) Auto-Claude-2.7.2-linux-amd64.deb

Beta Release

⚠️ Beta releases may contain bugs and breaking changes. View all releases

Beta

Platform Download
Windows Auto-Claude-2.7.2-beta.10-win32-x64.exe
macOS (Apple Silicon) Auto-Claude-2.7.2-beta.10-darwin-arm64.dmg
macOS (Intel) Auto-Claude-2.7.2-beta.10-darwin-x64.dmg
Linux Auto-Claude-2.7.2-beta.10-linux-x86_64.AppImage
Linux (Debian) Auto-Claude-2.7.2-beta.10-linux-amd64.deb
Linux (Flatpak) Auto-Claude-2.7.2-beta.10-linux-x86_64.flatpak

All releases include SHA256 checksums and VirusTotal scan results for security verification.


Requirements

  • Claude Pro/Max subscription - Get one here
  • Claude Code CLI - npm install -g @anthropic-ai/claude-code
  • Git repository - Your project must be initialized as a git repo

Quick Start

  1. Download and install the app for your platform
  2. Open your project - Select a git repository folder
  3. Connect Claude - The app will guide you through OAuth setup
  4. Create a task - Describe what you want to build
  5. Watch it work - Agents plan, code, and validate autonomously

Features

Feature Description
Autonomous Tasks Describe your goal; agents handle planning, implementation, and validation
Parallel Execution Run multiple builds simultaneously with up to 12 agent terminals
Isolated Workspaces All changes happen in git worktrees - your main branch stays safe
Self-Validating QA Built-in quality assurance loop catches issues before you review
AI-Powered Merge Automatic conflict resolution when integrating back to main
Memory Layer Agents retain insights across sessions for smarter builds
GitHub/GitLab Integration Import issues, investigate with AI, create merge requests
Linear Integration Sync tasks with Linear for team progress tracking
Cross-Platform Native desktop apps for Windows, macOS, and Linux
Auto-Updates App updates automatically when new versions are released

Interface

Kanban Board

Visual task management from planning through completion. Create tasks and monitor agent progress in real-time.

Agent Terminals

AI-powered terminals with one-click task context injection. Spawn multiple agents for parallel work.

Agent Terminals

Roadmap

AI-assisted feature planning with competitor analysis and audience targeting.

Roadmap

Additional Features

  • Insights - Chat interface for exploring your codebase
  • Ideation - Discover improvements, performance issues, and vulnerabilities
  • Changelog - Generate release notes from completed tasks

Project Structure

Auto-Claude/
├── apps/
│   ├── backend/     # Python agents, specs, QA pipeline
│   └── frontend/    # Electron desktop application
├── guides/          # Additional documentation
├── tests/           # Test suite
└── scripts/         # Build utilities

CLI Usage

For headless operation, CI/CD integration, or terminal-only workflows:

cd apps/backend

# Create a spec interactively
python spec_runner.py --interactive

# Run autonomous build
python run.py --spec 001

# Review and merge
python run.py --spec 001 --review
python run.py --spec 001 --merge

See guides/CLI-USAGE.md for complete CLI documentation.


Development

Want to build from source or contribute? See CONTRIBUTING.md for complete development setup instructions.

For Linux-specific builds (Flatpak, AppImage), see guides/linux.md.


Security

Auto Claude uses a three-layer security model:

  1. OS Sandbox - Bash commands run in isolation
  2. Filesystem Restrictions - Operations limited to project directory
  3. Dynamic Command Allowlist - Only approved commands based on detected project stack

All releases are:

  • Scanned with VirusTotal before publishing
  • Include SHA256 checksums for verification
  • Code-signed where applicable (macOS)

Available Scripts

Command Description
npm run install:all Install backend and frontend dependencies
npm start Build and run the desktop app
npm run dev Run in development mode with hot reload
npm run package Package for current platform
npm run package:mac Package for macOS
npm run package:win Package for Windows
npm run package:linux Package for Linux
npm run package:flatpak Package as Flatpak (see guides/linux.md)
npm run lint Run linter
npm test Run frontend tests
npm run test:backend Run backend tests

Contributing

We welcome contributions! Please read CONTRIBUTING.md for:

  • Development setup instructions
  • Code style guidelines
  • Testing requirements
  • Pull request process

Community


License

AGPL-3.0 - GNU Affero General Public License v3.0

Auto Claude is free to use. If you modify and distribute it, or run it as a service, your code must also be open source under AGPL-3.0.

Commercial licensing available for closed-source use cases.


Star History

GitHub Repo stars

Star History Chart

S
Description
Autonomous multi-session AI coding
Readme AGPL-3.0 59 MiB
Languages
TypeScript 98.7%
JavaScript 0.6%
CSS 0.5%
Shell 0.2%