* feat(memory): replace FalkorDB with LadybugDB embedded database Remove Docker dependency for Graphiti memory integration by switching to LadybugDB, an embedded graph database that works via monkeypatch with graphiti-core's KuzuDriver. Changes: - Remove all FalkorDB configuration and connection code - Simplify config to use GRAPHITI_DB_PATH for local storage - Update requirements to use real_ladybug + graphiti-core - Update documentation for Python 3.12+ requirement This makes the memory system much simpler to set up - no Docker needed. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * chore: remove docker-compose.yml (FalkorDB no longer used) FalkorDB has been replaced with LadybugDB embedded database, so Docker is no longer required for the memory integration. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * feat: add automated release workflow with code signing - Add release.yml workflow triggered on version tags (v*) - Support manual dry-run builds via workflow_dispatch - Build for macOS (arm64 + x64), Windows, and Linux - macOS code signing with Developer ID certificate - macOS notarization support for Gatekeeper approval - Add entitlements.mac.plist for hardened runtime - Generate SHA256 checksums for all release artifacts - Auto-generate changelog from PR labels - Add pnpm caching to CI workflow for faster builds - Add lint, typecheck, and build steps to CI - Update package.json with artifactName for consistent naming - Fix extraResources filter to exclude test venvs Artifacts will be named: Auto-Claude-{version}-{platform}-{arch}.{ext} 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * refactor: replace Docker/FalkorDB with embedded LadybugDB for memory system This major refactoring eliminates the Docker dependency for the memory system by switching from FalkorDB to LadybugDB (embedded graph database). Backend changes: - Add query_memory.py: Python CLI for memory queries via subprocess - Add kuzu_driver_patched.py: Patched Kuzu driver with FTS index support - Add ollama_model_detector.py: Auto-detect Ollama embedding models - Update client.py to use patched driver for proper FTS functionality - Fix parameter handling for LadybugDB compatibility Frontend changes: - Add memory-service.ts: Node.js service wrapping Python subprocess - Add memory-handlers.ts: IPC handlers for memory operations - Add api-validation-service.ts: Validate LLM/embedder API keys - Remove docker-service.ts and falkordb-service.ts (no longer needed) - Update MemoryBackendSection with multi-provider embedder support - Update InfrastructureStatus to show LadybugDB status - Simplify GraphitiStep onboarding (no Docker setup required) Key improvements: - Zero Docker dependency - fully embedded database - Multi-provider embedder support (OpenAI, Gemini, Voyage, Ollama, Azure) - Hybrid RAG with semantic search, FTS, and graph traversal - Automatic FTS index creation via patched driver - Python 3.12 compatibility (LadybugDB requirement) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * fix: correct model name and release workflow conditionals Bug fixes: - Fix model ID: claude-sonnet-4-5-latest → claude-sonnet-4-5-20250514 (using dated version for stability) - Fix release workflow: add github.event_name checks before accessing inputs.dry_run to prevent errors on tag push events 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * feat: add Ollama embedding model support with auto-detected dimensions - Add known model lookup table for popular Ollama embedding models: - embeddinggemma (768 dim) - Google's lightweight model - qwen3-embedding:0.6b/4b/8b (1024/2560/4096 dim) - Qwen3 series - nomic-embed-text, mxbai-embed-large, bge-large, all-minilm - Auto-detect embedding dimensions for known models (no need to set OLLAMA_EMBEDDING_DIM) - Fix config validation to not require OLLAMA_EMBEDDING_DIM for known models - Fix PatchedKuzuDriver to set _database attribute (required by Graphiti) - Fix get_status_summary to use db_path instead of deprecated falkordb_host 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * refactor: rebrand memory system UI and simplify configuration - Rename "Graphiti" to "Memory" throughout UI - Remove LLM provider selection (Claude SDK handles RAG) - Keep embedding provider selection (OpenAI, Ollama, Voyage, Google, Azure) - Add Ollama model pull/download support - Change default storage path from ~/.auto-claude/graphs to ~/.auto-claude/memories - Make embedding provider fields conditional based on selection - Add OllamaModelSelector component with auto-detection - Create simplified MemoryStep for onboarding wizard - Update SecuritySettings with provider-specific field rendering 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * fix(ui): replace Unix shell syntax with cross-platform git commands Fixes #90 Worktrees were showing "0" for all file changes on Windows because Unix shell constructs (`2>/dev/null || echo`) are invalid in cmd.exe. Changes: - Replace `2>/dev/null || echo` with TypeScript try-catch - Add `stdio: ['pipe', 'pipe', 'pipe']` to capture stderr - Fix 7 locations in worktree-handlers.ts: - git rev-list --count (2 locations) - git diff --stat - git diff --numstat - git diff --name-status - git diff --shortstat - git merge-base --is-ancestor The error "The system cannot find the path specified" was caused by cmd.exe trying to interpret `/dev/null` as a literal file path. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> * fix(cli): update graphiti status display for LadybugDB After migrating from FalkorDB (Docker-based) to LadybugDB (embedded), the validate_environment function tried to access 'host' and 'port' keys that no longer exist in the graphiti status dictionary. Changes: - Replace host:port display with db_path for embedded database - Use .get() for safe key access This fixes a KeyError crash when running auto-claude builds with Graphiti memory enabled. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> * fix: improve Ollama UX in memory settings - Replace manual Ollama config with OllamaModelSelector component - Remove Base URL field (auto-detected from Ollama) - Remove manual embedding dimension input (auto-detected from model) - Show only installed models as selectable options - Add download buttons for recommended models not yet installed - Make embeddinggemma the recommended default model - Remove qwen3-embedding from recommendations (focus on quality models) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * chore: update CI and release workflows, remove changelog config - Removed the obsolete changelog configuration file. - Updated CI workflow to use `pnpm run test` instead of `pnpm test`. - Modified release workflow to use `pnpm install --frozen-lockfile` for consistent dependency installation. - Enhanced artifact handling by validating the presence of build artifacts before proceeding. These changes streamline the workflows and improve reliability in the build process. * fix: resolve all CI failures in PR #100 Python lint fixes (ruff): - Fix import sorting in kuzu_driver_patched.py, ollama_model_detector.py, query_memory.py - Add noqa: F401 for kuzu import used only for availability check Frontend: - Update pnpm-lock.yaml to remove ioredis dependencies Test fixes: - Update test_graphiti.py to reflect new multi-provider architecture - Embedder is now optional (keyword search fallback works) - LLM provider validation removed (Claude SDK handles RAG) - Fix FalkorDB references to LadybugDB (db_path instead of host/port) Config consistency: - Fix get_graphiti_status() to be consistent with is_valid() - Embedder errors are now warnings, not blockers 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * refactor: update memory test suite for LadybugDB Replace FalkorDB-based tests with LadybugDB (embedded database) tests: - test_ladybugdb_connection() - Verify embedded DB works - test_save_episode() - Save test data to graph - test_keyword_search() - Keyword fallback (no embeddings needed) - test_semantic_search() - Vector search with embeddings - test_ollama_embeddings() - Direct Ollama embedding test - test_graphiti_memory_class() - Full wrapper class test - test_database_contents() - Debug view of DB contents Usage: python integrations/graphiti/test_graphiti_memory.py --test ollama python integrations/graphiti/test_graphiti_memory.py --test connection python integrations/graphiti/test_graphiti_memory.py # all tests 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * fix: resolve remaining CI failures Python: - Add missing blank line after imports in query_memory.py (ruff I001) TypeScript: - Fix mock getBestAvailableProfile signature to accept optional parameter 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * fix: remove f-string prefixes from strings without placeholders Fixes ruff F541 errors in test_graphiti_memory.py 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * style: apply ruff formatting to 4 files Auto-formatted kuzu_driver_patched.py and test_graphiti_memory.py 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * fix: address CodeRabbit review comments from PR #100 - release.yml: Fix changelog output property (outputs.body not outputs.changelog) - config.py: Update Anthropic model to generic claude-sonnet-4-5 identifier - api-validation-service.ts: Fix error message to include both sk- and sess- prefixes - ci.yml: Add quotes around command substitution for safety - OllamaModelSelector.tsx: Add error logging to catch block - OllamaModelSelector.tsx: Add AbortController cleanup pattern for unmount - SecuritySettings.tsx: Add useEffect to sync showOpenAIKey prop changes - SecuritySettings.tsx: Fix stale state in toggleShowApiKey - SecuritySettings.tsx: Add aria-labels to password visibility buttons Verified: nomic-embed-text uses 768 dimensions (CodeRabbit was incorrect about 1024) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * docs: add CodeRabbit review response tracking Document rejected CodeRabbit suggestions with justification: - nomic-embed-text uses 768 dims (not 1024 as claimed) - MemoryStep checkmark UX is intentional design 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * fix: sort imports in memory.py for ruff I001 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * fix: address additional CodeRabbit review comments Security fixes: - kuzu_driver_patched.py: Add try/finally blocks for connection cleanup - query_memory.py: Use parameterized queries to prevent Cypher injection - query_memory.py: Use public get_validation_errors() instead of private method - release.yml: Use ./* glob pattern to prevent option injection Code quality: - ollama_model_detector.py: Fix type annotation (str | None) - cleanup-version-branches.sh: Fix empty tag count edge case - config.py: Remove unused _validate_llm_provider method 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * fix: update test and apply ruff formatting - Remove test assertion for deleted _validate_llm_provider method - Apply ruff format to query_memory.py 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * fix: address CodeRabbit review feedback - kuzu_driver_patched.py: Simplify multi-line f-string to single line - config.py: Clarify LadybugDB requires Python 3.12+ in docstrings - ci.yml: Fix pnpm store path echo command quoting - test_graphiti.py: Use public API get_validation_errors() instead of private method 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * feat: add embedding provider change detection and fix import ordering Graphiti improvements: - Add provider change detection in GraphitiMemory.initialize() - Warn users when embedding provider changes to prevent dimension mismatches - Guide users to run migration script or reset state - Add test_provider_naming.py demo script for provider-specific database naming Code quality fixes: - Move inline `import re` to module top in query_memory.py - Alphabetically order standard library imports (PEP8 compliance) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * fix(ci): quote GITHUB_OUTPUT for shell safety Quote the $GITHUB_OUTPUT variable in the pnpm store path echo command to safely handle paths containing spaces. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * fix: add GH_TOKEN and homepage for release workflow - Add GH_TOKEN to all package steps (required for electron-builder to download native prebuilds) - Add homepage and repository fields to package.json (required for Linux builds) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * fix: add author email for Linux builds electron-builder FPM target requires author email for .deb packages 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * fix: make macOS notarization optional Notarization can fail due to certificate issues - don't block the build. Unsigned DMGs still work, users just see a security warning. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * fix: save notarization logs to private artifact instead of public logs - Captures Apple notarization failure details in downloadable artifact - Keeps sensitive paths and info out of public CI logs - Only repo collaborators can access the notarization-logs artifact 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * fix: respect user's memory enabled flag in query_memory CLI Remove the forced `config.enabled = True` override that ignored user's explicit disable choice. The CLI tool should respect the enabled flag - callers using the semantic-search command are explicitly requesting memory functionality. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * fix: improve migrate_embeddings robustness and correctness - Add proper cleanup of source client when target initialization fails - Fix database name derivation to use source provider's signature instead of incorrectly using current config's signature - Add validation to prevent no-op migration between same providers - Remove unused imports (json, Optional, GraphitiState) - Fix ruff formatting issues (line length) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * style: fix ruff linting errors in graphiti queries - Remove f-string prefix from strings without placeholders - Fix line length formatting issues 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * fix: use shell guard for notarization credentials check The step-level `if: env.APPLE_ID != ''` condition was evaluated before the step's env block was available, causing notarization to always be skipped. Replace with a runtime shell guard that checks the environment variable when the step actually runs. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * fix: allow @lydell/node-pty build scripts in pnpm v10 pnpm v10 blocks dependency lifecycle scripts by default. Add @lydell/node-pty to onlyBuiltDependencies array so its native module build scripts can run during installation. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * feat(ui): add project tab bar from PR #101 Cherry-picked from PR #101 for testing: - Add tab state management to project store - Create ProjectTabBar and SortableProjectTab components - Remove project dropdown from Sidebar - Add drag-and-drop tab reordering - Include unit tests for tab functionality 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * chore: simplify notarization step after successful setup Remove debug logging and notarization-logs artifact upload now that Developer ID Application certificate is properly configured. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * fix: check APPLE_ID in shell instead of workflow if condition secrets context cannot be used directly in if expressions. Check env var in shell script instead. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * fix(ui): change agent profile fallback from 'Balanced' to 'Auto (Optimized)' The getProfileDisplay() function in AgentProfileSelector had a defensive fallback that incorrectly displayed "Balanced" when no profile was found. Changed to display "Auto (Optimized)" to match the actual default profile configured in DEFAULT_APP_SETTINGS. This ensures consistency with the intended default behavior where fresh users should see "Auto (Optimized)" as their agent profile selection. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * refactor(ui): simplify reference files and images handling in task modal Remove separate reference files and images sections from the new task modal. Images are now displayed as small clickable thumbnails directly below the description field, and files can be referenced via @mentions in the description. - Remove "Reference Images" toggle and dedicated ImageUpload section - Remove "Referenced Files" section and ReferencedFilesSection component usage - Add inline thumbnail display (64x64px) below description with remove buttons - Update hint text to clarify drag & drop and paste functionality - Clean up unused imports and state variables 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * chore: use GitHub noreply email for author field Prevents spam while maintaining traceability for open source project. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * fix: create Python venv in userData for packaged apps On Linux AppImages, the bundled resources directory is read-only, which prevented venv creation. Now packaged apps store the venv in userData (~/.config/auto-claude-ui on Linux) which is always writable. This follows XDG conventions and fixes the Arch Linux AppImage issue. Fixes: venv creation failure on Linux AppImage 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * feat(ui): add keyboard shortcuts and tooltips for project tabs Add standard browser/editor-style keyboard shortcuts for tab navigation: - Cmd/Ctrl+1-9 to switch to specific tabs - Cmd/Ctrl+Tab/Shift+Tab to cycle through tabs - Cmd/Ctrl+W to close current tab Replace native title tooltips with Radix tooltips that: - Show after 200ms instead of ~1s native delay - Display shortcuts in styled kbd badges - Match app design with smooth animations 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * feat: improve task creation UX with @ autocomplete and better drag-drop Fixes three UX issues reported by users: 1. Add @ file autocomplete in task description - Type @ to see file suggestions - Filters files as you type - Keyboard navigation (arrows, Enter, Escape) - Shows file path for disambiguation 2. Fix file browser scroll in project explorer - Remove conflicting ScrollArea wrapper - Let virtualizer handle scrolling directly - Files now visible after expanding deep folders 3. Add auto-scroll during drag-and-drop - Scroll form container when dragging near edges - Makes it possible to drag files to textarea when scrolled out of view 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * feat(agent): enhance task restart functionality with new profile support - Updated `restartTask` method to accept an optional `newProfileId` parameter, allowing for profile swapping during task restarts. - Added logic to set the active profile if a new profile ID is provided. - Adjusted event handling for `auto-swap-restart-task` to pass the new profile ID. fix(agent): correct source type in rate limit info for spec creation - Changed source type from 'task' to 'roadmap' in `createSDKRateLimitInfo` calls for better clarity in spec creation context. 🤖 Generated with [Claude Code](https://claude.com/claude-code) * fix(ui): fix tab persistence and scope terminal shortcuts Two fixes: 1. Tab persistence on restart: Added explicit handling for when no tabs are open after app restart. Now auto-opens the first project tab instead of showing empty tab bar. 2. Keyboard shortcut scoping: Cmd/Ctrl+T now behaves contextually: - On Agent Terminals view: Opens new terminal (existing behavior) - On other views (Kanban, etc.): Opens Add Project dialog Added isActive prop to TerminalGrid to scope shortcuts to when the terminal view is active. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * fix: unify default database path to ~/.auto-claude/memories The default path was inconsistent across files: - utils.ts used 'graphs' - memory-service.ts used 'memories' - .env.example documented 'graphs' Unified all to use 'memories' to match Python backend config.py. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * auto-claude: subtask-1-1 - Add projectPath prop to PreviewPanel and implement custom img component - Added projectPath prop to PreviewPanel interface - Implemented custom img component for ReactMarkdown that converts relative paths (like .github/assets/...) to file:// URLs for Electron - Updated ChangelogDetails to get selected project and pass its path to PreviewPanel - Images now display correctly in preview mode while markdown source remains unchanged 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * fix(merge): use stored baseBranch from task metadata for merge operations Previously, merge logic hardcoded 'main' as the comparison branch when detecting what files changed in a task. This broke the workflow where: - Tasks branch FROM the configured default (main) or user-specified branch - Tasks merge INTO the user's current working branch Now the merge system: 1. Reads baseBranch from task_metadata.json (set during task creation) 2. Passes --base-branch to Python CLI for merge and merge-preview 3. Uses this for refresh_from_git() comparisons throughout the merge pipeline 4. Falls back to auto-detection (main/master/develop) if not specified Files modified across frontend (TypeScript) and backend (Python) to thread the task_source_branch parameter through the entire merge flow. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * fix(merge): increase AI merge timeout from 2 to 10 minutes Large merge operations with many conflicting files were timing out before completion. The AI merge resolution was processing files successfully but hitting the 2-minute limit when handling 17+ files. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * fix: use venv Python for terminal name generation TerminalNameGenerator was using system Python which doesn't have claude_agent_sdk installed. Now uses pythonEnvManager to get the venv Python path where dependencies are installed. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * fix: prevent task title from blocking edit/close buttons Two issues were blocking the edit/close buttons in TaskDetailModal: 1. The title element was extending beyond its visual boundaries - Added overflow-hidden to container and truncate to title 2. The Electron window's draggable region was capturing mouse events - Added electron-no-drag class to the button container to allow normal mouse interactions in that area 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * fix: address CodeRabbit review issues - memory-service.ts: Add app.getAppPath() path resolution for packaged Electron apps. This ensures query_memory.py is found in both dev and production builds, consistent with title-generator.ts pattern. - MemoryStep.tsx: Make CheckCircle2 icon conditional on kuzuAvailable state. Previously showed success checkmark even when database wasn't available, misleading users. - GitHubSetupModal.tsx: Fix incorrect API method name from getStoredGitHubToken to getGitHubToken. Also adds existing auth detection to skip already-completed authentication steps. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * Readme for installors * Project tab persistence and github org init on project creation * fix(ui): address CodeRabbit PR review issues Fix actual bugs identified in PR #100 review: - Fix race condition in memory-handlers.ts timeout handling by using single timeout with proper cleanup and resolved flag - Fix API key resolution in GraphitiStep.tsx to handle groq, azure_openai, and ollama providers - Add TabState interface and getTabState/saveTabState to ElectronAPI types - Add mock implementations for browser development Also includes: - Exclude pnpm-lock.yaml from check-yaml (uses URLs with colons as keys) - Auto-fixes from pre-commit hooks (trailing whitespace, EOF, ruff-format) Note: nomic-embed-text dimension (768) and import ordering were verified as correct - CodeRabbit suggestions were false positives. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * fix(tests): update tab management tests for IPC-based persistence The project store now uses IPC (saveTabState/getTabState) instead of localStorage for tab state persistence. Updated tests to: - Remove localStorage.setItem assertions (no longer used) - Update restoreTabState test to reflect it's now a no-op (actual loading happens via loadProjects → getTabState) - Add getTabState/saveTabState mocks to test setup This fixes the CI test failures where tests expected localStorage calls but the implementation uses IPC. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
12 KiB
Contributing to Auto Claude
Thank you for your interest in contributing to Auto Claude! This document provides guidelines and instructions for contributing to the project.
Table of Contents
- Prerequisites
- Development Setup
- Running from Source
- Pre-commit Hooks
- Code Style
- Testing
- Continuous Integration
- Git Workflow
- Pull Request Process
- Issue Reporting
- Architecture Overview
Prerequisites
Before contributing, ensure you have the following installed:
- Python 3.8+ - For the backend framework
- Node.js 18+ - For the Electron frontend
- pnpm - Package manager for the frontend (
npm install -g pnpm) - uv (recommended) or pip - Python package manager
- Git - Version control
Development Setup
The project consists of two main components:
- Python Backend (
auto-claude/) - The core autonomous coding framework - Electron Frontend (
auto-claude-ui/) - Optional desktop UI
Python Backend
# Navigate to the auto-claude directory
cd auto-claude
# Create virtual environment (using uv - recommended)
uv venv
source .venv/bin/activate # On Windows: .venv\Scripts\activate
uv pip install -r requirements.txt
# Or using standard Python
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
# Install test dependencies
pip install -r ../tests/requirements-test.txt
# Set up environment
cp .env.example .env
# Edit .env and add your CLAUDE_CODE_OAUTH_TOKEN (get it via: claude setup-token)
Electron Frontend
# Navigate to the UI directory
cd auto-claude-ui
# Install dependencies
pnpm install
# Start development server
pnpm dev
# Build for production
pnpm build
# Package for distribution
pnpm package
Running from Source
If you want to run Auto Claude from source (for development or testing unreleased features), follow these steps:
Step 1: Clone and Set Up Python Backend
git clone https://github.com/AndyMik90/Auto-Claude.git
cd Auto-Claude/auto-claude
# Using uv (recommended)
uv venv && uv pip install -r requirements.txt
# Or using standard Python
python3 -m venv .venv
source .venv/bin/activate # On Windows: .venv\Scripts\activate
pip install -r requirements.txt
# Set up environment
cp .env.example .env
# Edit .env and add your CLAUDE_CODE_OAUTH_TOKEN (get it via: claude setup-token)
Step 2: Run the Desktop UI
cd ../auto-claude-ui
# Install dependencies
pnpm install
# Development mode (hot reload)
pnpm dev
# Or production build
pnpm run build && pnpm run start
Windows users: If installation fails with node-gyp errors, click here
Auto Claude automatically downloads prebuilt binaries for Windows. If prebuilts aren't available for your Electron version yet, you'll need Visual Studio Build Tools:
- Download Visual Studio Build Tools 2022
- Select "Desktop development with C++" workload
- In "Individual Components", add "MSVC v143 - VS 2022 C++ x64/x86 Spectre-mitigated libs"
- Restart terminal and run
pnpm installagain
Note: For regular usage, we recommend downloading the pre-built releases from GitHub Releases. Running from source is primarily for contributors and those testing unreleased features.
Pre-commit Hooks
We use pre-commit to run linting and formatting checks before each commit. This ensures code quality and consistency across the project.
Setup
# Install pre-commit
pip install pre-commit
# Install the git hooks (run once after cloning)
pre-commit install
What Runs on Commit
When you commit, the following checks run automatically:
| Check | Scope | Description |
|---|---|---|
| ruff | auto-claude/ |
Python linter with auto-fix |
| ruff-format | auto-claude/ |
Python code formatter |
| eslint | auto-claude-ui/ |
TypeScript/React linter |
| typecheck | auto-claude-ui/ |
TypeScript type checking |
| trailing-whitespace | All files | Removes trailing whitespace |
| end-of-file-fixer | All files | Ensures files end with newline |
| check-yaml | All files | Validates YAML syntax |
| check-added-large-files | All files | Prevents large file commits |
Running Manually
# Run all checks on all files
pre-commit run --all-files
# Run a specific hook
pre-commit run ruff --all-files
# Skip hooks temporarily (not recommended)
git commit --no-verify -m "message"
If a Check Fails
- Ruff auto-fixes: Some issues are fixed automatically. Stage the changes and commit again.
- ESLint errors: Fix the reported issues in your code.
- Type errors: Resolve TypeScript type issues before committing.
Code Style
Python
- Follow PEP 8 style guidelines
- Use type hints for function signatures
- Use docstrings for public functions and classes
- Keep functions focused and under 50 lines when possible
- Use meaningful variable and function names
# Good
def get_next_chunk(spec_dir: Path) -> dict | None:
"""
Find the next pending chunk in the implementation plan.
Args:
spec_dir: Path to the spec directory
Returns:
The next chunk dict or None if all chunks are complete
"""
...
# Avoid
def gnc(sd):
...
TypeScript/React
- Use TypeScript strict mode
- Follow the existing component patterns in
auto-claude-ui/src/ - Use functional components with hooks
- Prefer named exports over default exports
- Use the UI components from
src/renderer/components/ui/
// Good
export function TaskCard({ task, onEdit }: TaskCardProps) {
const [isEditing, setIsEditing] = useState(false);
...
}
// Avoid
export default function(props) {
...
}
General
- No trailing whitespace
- Use 2 spaces for indentation in TypeScript/JSON, 4 spaces in Python
- End files with a newline
- Keep line length under 100 characters when practical
Testing
Python Tests
# Run all tests
pytest tests/ -v
# Run a specific test file
pytest tests/test_security.py -v
# Run a specific test
pytest tests/test_security.py::test_bash_command_validation -v
# Skip slow tests
pytest tests/ -m "not slow"
# Run with coverage
pytest tests/ --cov=auto-claude --cov-report=html
Test configuration is in tests/pytest.ini.
Frontend Tests
cd auto-claude-ui
# Run unit tests
pnpm test
# Run tests in watch mode
pnpm test:watch
# Run with coverage
pnpm test:coverage
# Run E2E tests (requires built app)
pnpm build
pnpm test:e2e
# Run linting
pnpm lint
# Run type checking
pnpm typecheck
Testing Requirements
Before submitting a PR:
- All existing tests must pass
- New features should include tests
- Bug fixes should include a regression test
- Test coverage should not decrease significantly
Continuous Integration
All pull requests and pushes to main trigger automated CI checks via GitHub Actions.
Workflows
| Workflow | Trigger | What it checks |
|---|---|---|
| CI | Push to main, PRs |
Python tests (3.11 & 3.12), Frontend tests |
| Lint | Push to main, PRs |
Ruff (Python), ESLint + TypeScript (Frontend) |
| Test on Tag | Version tags (v*) |
Full test suite before release |
PR Requirements
Before a PR can be merged:
- All CI checks must pass (green checkmarks)
- Python tests pass on both Python 3.11 and 3.12
- Frontend tests pass
- Linting passes (no ruff or eslint errors)
- TypeScript type checking passes
Running CI Checks Locally
# Python tests
cd auto-claude
source .venv/bin/activate
pytest ../tests/ -v
# Frontend tests
cd auto-claude-ui
pnpm test
pnpm lint
pnpm typecheck
Git Workflow
Branch Naming
Use descriptive branch names with a prefix indicating the type of change:
| Prefix | Purpose | Example |
|---|---|---|
feature/ |
New feature | feature/add-dark-mode |
fix/ |
Bug fix | fix/memory-leak-in-worker |
docs/ |
Documentation | docs/update-readme |
refactor/ |
Code refactoring | refactor/simplify-auth-flow |
test/ |
Test additions/fixes | test/add-integration-tests |
chore/ |
Maintenance tasks | chore/update-dependencies |
Commit Messages
Write clear, concise commit messages that explain the "why" behind changes:
# Good
git commit -m "Add retry logic for failed API calls
Implements exponential backoff for transient failures.
Fixes #123"
# Avoid
git commit -m "fix stuff"
git commit -m "WIP"
Format:
<type>: <subject>
<body>
<footer>
- type: feat, fix, docs, style, refactor, test, chore
- subject: Short description (50 chars max, imperative mood)
- body: Detailed explanation if needed (wrap at 72 chars)
- footer: Reference issues, breaking changes
Pull Request Process
-
Fork the repository and create your branch from
main -
Make your changes following the code style guidelines
-
Test thoroughly:
# Python pytest tests/ -v # Frontend cd auto-claude-ui && pnpm test && pnpm lint && pnpm typecheck -
Update documentation if your changes affect:
- Public APIs
- Configuration options
- User-facing behavior
-
Create the Pull Request:
- Use a clear, descriptive title
- Reference any related issues
- Describe what changes you made and why
- Include screenshots for UI changes
- List any breaking changes
-
PR Title Format:
<type>: <description>Examples:
feat: Add support for custom promptsfix: Resolve memory leak in worker processdocs: Update installation instructions
-
Review Process:
- Address reviewer feedback promptly
- Keep the PR focused on a single concern
- Squash commits if requested
Issue Reporting
Bug Reports
When reporting a bug, include:
- Clear title describing the issue
- Environment details:
- OS and version
- Python version
- Node.js version (for UI issues)
- Auto Claude version
- Steps to reproduce the issue
- Expected behavior vs actual behavior
- Error messages or logs (if applicable)
- Screenshots (for UI issues)
Feature Requests
When requesting a feature:
- Describe the problem you're trying to solve
- Explain your proposed solution
- Consider alternatives you've thought about
- Provide context on your use case
Architecture Overview
Auto Claude consists of two main parts:
Python Backend (auto-claude/)
The core autonomous coding framework:
- Entry Points:
run.py(build runner),spec_runner.py(spec creator) - Agent System:
agent.py,client.py,prompts/ - Execution:
coordinator.py(parallel),worktree.py(isolation) - Memory:
memory.py(file-based),graphiti_memory.py(graph-based) - QA:
qa_loop.py,prompts/qa_*.md
Electron Frontend (auto-claude-ui/)
Optional desktop interface:
- Main Process:
src/main/- Electron main process, IPC handlers - Renderer:
src/renderer/- React UI components - Shared:
src/shared/- Types and utilities
For detailed architecture information, see CLAUDE.md.
Questions?
If you have questions about contributing, feel free to:
- Open a GitHub issue with the
questionlabel - Review existing issues and discussions
Thank you for contributing to Auto Claude!