Skip to content

Conversation

@AndyMik90
Copy link
Owner

Summary

Type of Change

  • Bug fix (non-breaking change that fixes an issue)
  • New feature (non-breaking change that adds functionality)
  • Breaking change (fix or feature that would cause existing functionality to change)
  • Documentation update
  • Refactoring (no functional changes)
  • Tests (adding or updating tests)

Related Issues

Changes Made

Screenshots

Checklist

  • I have run pre-commit run --all-files and fixed any issues
  • I have added tests for my changes (if applicable)
  • All existing tests pass locally
  • I have updated documentation (if applicable)
  • My code follows the project's code style

Testing

Additional Notes

AndyMik90 and others added 4 commits December 22, 2025 20:20
- Add comprehensive branching strategy documentation
- Explain main, develop, feature, fix, release, and hotfix branches
- Clarify that all PRs should target develop (not main)
- Add release process documentation for maintainers
- Update PR process to branch from develop
- Expand table of contents with new sections
* refactor: restructure project to Apps/frontend and Apps/backend

- Move auto-claude-ui to Apps/frontend with feature-based architecture
- Move auto-claude to Apps/backend
- Switch from pnpm to npm for frontend
- Update Node.js requirement to v24.12.0 LTS
- Add pre-commit hooks for lint, typecheck, and security audit
- Add commit-msg hook for conventional commits
- Fix CommonJS compatibility issues (postcss.config, postinstall scripts)
- Update README with comprehensive setup and contribution guidelines
- Configure ESLint to ignore .cjs files
- 0 npm vulnerabilities

Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>

* feat(refactor): clean code and move to npm

* feat(refactor): clean code and move to npm

* chore: update to v2.7.0, remove Docker deps (LadybugDB is embedded)

* feat: v2.8.0 - update workflows and configs for Apps/ structure, npm

* fix: resolve Python lint errors (F401, I001)

* fix: update test paths for Apps/backend structure

* fix: add missing facade files and update paths for Apps/backend structure

- Fix ruff lint error I001 in auto_claude_tools.py
- Create missing facade files to match upstream (agent, ci_discovery, critique, etc.)
- Update test paths from auto-claude/ to Apps/backend/
- Update .pre-commit-config.yaml paths for Apps/ structure
- Add pytest to pre-commit hooks (skip slow/integration/Windows-incompatible tests)
- Fix Unicode encoding in test_agent_architecture.py for Windows

Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>

* feat: improve readme

* fix: new path

* fix: correct release workflow and docs for Apps/ restructure

- Fix ARM64 macOS build: pnpm → npm, auto-claude-ui → Apps/frontend
- Fix artifact upload paths in release.yml
- Update Node.js version to 24 for consistency
- Update CLI-USAGE.md with Apps/backend paths
- Update RELEASE.md with Apps/frontend/package.json paths

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

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

* refactor: rename Apps/ to apps/ and fix backend path resolution

- Rename Apps/ folder to apps/ for consistency with JS/Node conventions
- Update all path references across CI/CD workflows, docs, and config files
- Fix frontend Python path resolver to look for 'backend' instead of 'auto-claude'
- Update path-resolver.ts to correctly find apps/backend in development mode

This completes the Apps restructure from PR #122 and prepares for v2.8.0 release.

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

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

* fix(electron): correct preload script path from .js to .mjs

electron-vite builds the preload script as ESM (index.mjs) but the main
process was looking for CommonJS (index.js). This caused the preload to
fail silently, making the app fall back to browser mock mode with fake
data and non-functional IPC handlers.

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

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

* - Introduced `dev:debug` script to enable debugging during development.
- Added `dev:mcp` script for running the frontend in MCP mode.

These enhancements streamline the development process for frontend developers.

* refactor(memory): make Graphiti memory mandatory and remove Docker dependency

Memory is now a core component of Auto Claude rather than optional:
- Python 3.12+ is required for the backend (not just memory layer)
- Graphiti is enabled by default in .env.example
- Removed all FalkorDB/Docker references (migrated to embedded LadybugDB)
- Deleted guides/DOCKER-SETUP.md and docker-handlers.ts
- Updated onboarding UI to remove "optional" language
- Updated all documentation to reflect LadybugDB architecture

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

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

* feat: add cross-platform Windows support for npm scripts

- Add scripts/install-backend.js for cross-platform Python venv setup
  - Auto-detects Python 3.12 (py -3.12 on Windows, python3.12 on Unix)
  - Handles platform-specific venv paths
- Add scripts/test-backend.js for cross-platform pytest execution
- Update package.json to use Node.js scripts instead of shell commands
- Update CONTRIBUTING.md with correct paths and instructions:
  - apps/backend/ and apps/frontend/ paths
  - Python 3.12 requirement (memory system now required)
  - Platform-specific install commands (winget, brew, apt)
  - npm instead of pnpm
  - Quick Start section with npm run install:all

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

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

* remove doc

* fix(frontend): correct Ollama detector script path after apps restructure

The Ollama status check was failing because memory-handlers.ts
was looking for ollama_model_detector.py at auto-claude/ but the
script is now at apps/backend/ after the directory restructure.

This caused "Ollama not running" to display even when Ollama was
actually running and accessible.

* chore: bump version to 2.7.2

Downgrade version from 2.8.0 to 2.7.2 as the Apps/ restructure
is better suited as a patch release rather than a minor release.

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

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

* chore: update package-lock.json for Windows compatibility

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

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

* docs(contributing): add hotfix workflow and update paths for apps/ structure

Add Git Flow hotfix workflow documentation with step-by-step guide
and ASCII diagram showing the branching strategy.

Update all paths from auto-claude/auto-claude-ui to apps/backend/apps/frontend
and migrate package manager references from pnpm to npm to match the
new project structure.

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

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

* fix(ci): remove duplicate ARM64 build from Intel runner

The Intel runner was building both x64 and arm64 architectures,
while a separate ARM64 runner also builds arm64 natively. This
caused duplicate ARM64 builds, wasting CI resources.

Now each runner builds only its native architecture:
- Intel runner: x64 only
- ARM64 runner: arm64 only

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

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

---------

Co-authored-by: Alex Madera <e.a_madera@hotmail.com>
Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
* feat(ollama): add real-time download progress tracking for model downloads

Implement comprehensive download progress tracking with:
- NDJSON parsing for streaming progress data from Ollama API
- Real-time speed calculation (MB/s, KB/s, B/s) with useRef for delta tracking
- Time remaining estimation based on download speed
- Animated progress bars in OllamaModelSelector component
- IPC event streaming from main process to renderer
- Proper listener management with cleanup functions

Changes:
- memory-handlers.ts: Parse NDJSON from Ollama stderr, emit progress events
- OllamaModelSelector.tsx: Display progress bars with speed and time remaining
- project-api.ts: Implement onDownloadProgress listener with cleanup
- ipc.ts types: Define onDownloadProgress listener interface
- infrastructure-mock.ts: Add mock implementation for browser testing

This allows users to see real-time feedback when downloading Ollama models,
including percentage complete, current download speed, and estimated time remaining.

* test: add focused test coverage for Ollama download progress feature

Add unit tests for the critical paths of the real-time download progress tracking:

- Progress calculation tests (52 tests): Speed/time/percentage calculations with comprehensive edge case coverage (zero speeds, NaN, Infinity, large numbers)
- NDJSON parser tests (33 tests): Streaming JSON parsing from Ollama, buffer management for incomplete lines, error handling

All 562 unit tests passing with clean dependencies. Tests focus on critical mathematical logic and data processing - the most important paths that need verification.

Test coverage:
✅ Speed calculation and formatting (B/s, KB/s, MB/s)
✅ Time remaining calculations (seconds, minutes, hours)
✅ Percentage clamping (0-100%)
✅ NDJSON streaming with partial line buffering
✅ Invalid JSON handling
✅ Real Ollama API responses
✅ Multi-chunk streaming scenarios

* docs: add comprehensive JSDoc docstrings for Ollama download progress feature

- Enhanced OllamaModelSelector component with detailed JSDoc
  * Documented component props, behavior, and usage examples
  * Added docstrings to internal functions (checkInstalledModels, handleDownload, handleSelect)
  * Explained progress tracking algorithm and useRef usage

- Improved memory-handlers.ts documentation
  * Added docstring to main registerMemoryHandlers function
  * Documented all Ollama-related IPC handlers (check-status, list-embedding-models, pull-model)
  * Added JSDoc to executeOllamaDetector helper function
  * Documented interface types (OllamaStatus, OllamaModel, OllamaEmbeddingModel, OllamaPullResult)
  * Explained NDJSON parsing and progress event structure

- Enhanced test file documentation
  * Added docstrings to NDJSON parser test utilities with algorithm explanation
  * Documented all calculation functions (speed, time, percentage)
  * Added detailed comments on formatting and bounds-checking logic

- Improved overall code maintainability
  * Docstring coverage now meets 80%+ threshold for code review
  * Clear explanation of progress tracking implementation details
  * Better context for future maintainers working with download streaming

* feat: add batch task creation and management CLI commands

- Handle batch task creation from JSON files
- Show status of all specs in project
- Cleanup tool for completed specs
- Full integration with new apps/backend structure
- Compatible with implementation_plan.json workflow

* test: add batch task test file and testing checklist

- batch_test.json: Sample tasks for testing batch creation
- TESTING_CHECKLIST.md: Comprehensive testing guide for Ollama and batch tasks
- Includes UI testing steps, CLI testing steps, and edge cases
- Ready for manual and automated testing

* chore: update package-lock.json to match v2.7.2

* test: update checklist with verification results and architecture validation

* docs: add comprehensive implementation summary for Ollama + Batch features

* docs: add comprehensive Phase 2 testing guide with checklists and procedures

* docs: add NEXT_STEPS guide for Phase 2 testing

* fix: resolve merge conflict in project-api.ts from Ollama feature cherry-pick

* fix: remove duplicate Ollama check status handler registration

* test: update checklist with Phase 2 bug findings and fixes

---------

Co-authored-by: ray <ray@rays-MacBook-Pro.local>
Implemented promise queue pattern in PythonEnvManager to handle
concurrent initialization requests. Previously, multiple simultaneous
requests (e.g., startup + merge) would fail with "Already
initializing" error.

Also fixed parsePythonCommand() to handle file paths with spaces by
checking file existence before splitting on whitespace.

Changes:
- Added initializationPromise field to queue concurrent requests
- Split initialize() into public and private _doInitialize()
- Enhanced parsePythonCommand() with existsSync() check

Co-authored-by: Joris Slagter <mail@jorisslagter.nl>
@coderabbitai
Copy link
Contributor

coderabbitai bot commented Dec 22, 2025

Important

Review skipped

Auto reviews are disabled on base/target branches other than the default branch.

🗂️ Base branches to auto review (3)
  • develop
  • release/*
  • hotfix/*

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Note

Other AI code review bot(s) detected

CodeRabbit has detected other AI code review bot(s) in this pull request and will avoid duplicating their findings in the review comments. This may lead to a less comprehensive review.


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Removes the legacy 'auto-claude' path from the possiblePaths array
in agent-process.ts. This path was from before the monorepo
restructure (v2.7.2) and is no longer needed.

The legacy path was causing spec_runner.py to be looked up at the
wrong location:
- OLD (wrong): /path/to/auto-claude/auto-claude/runners/spec_runner.py
- NEW (correct): /path/to/apps/backend/runners/spec_runner.py

This aligns with the new monorepo structure where all backend code
lives in apps/backend/.

Fixes #147

Co-authored-by: Joris Slagter <mail@jorisslagter.nl>
AndyMik90 and others added 19 commits December 23, 2025 00:01
* fix: Linear API authentication and GraphQL types

- Remove Bearer prefix from Authorization header (Linear API keys are sent directly)
- Change GraphQL variable types from String! to ID! for teamId and issue IDs
- Improve error handling to show detailed Linear API error messages

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

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

* fix: Radix Select empty value error in Linear import modal

Use '__all__' sentinel value instead of empty string for "All projects"
option, as Radix Select does not allow empty string values.

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

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

* feat: add CodeRabbit configuration file

Introduce a new .coderabbit.yaml file to configure CodeRabbit settings, including review profiles, automatic review options, path filters, and specific instructions for different file types. This enhances the code review process by providing tailored guidelines for Python, TypeScript, and test files.

* fix: correct GraphQL types for Linear team queries

Linear API uses different types for different queries:
- team(id:) expects String!
- issues(filter: { team: { id: { eq: } } }) expects ID!

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

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

* fix: refresh task list after Linear import

Call loadTasks() after successful Linear import to update the kanban
board without requiring a page reload.

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

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

* cleanup

* cleanup

* fix: address CodeRabbit review comments for Linear integration

- Fix unsafe JSON parsing: check response.ok before parsing JSON to handle
  non-JSON error responses (e.g., 503 from proxy) gracefully
- Use ID! type instead of String! for teamId in LINEAR_GET_PROJECTS query
  for GraphQL type consistency
- Remove debug console.log (ESLint config only allows warn/error)
- Refresh task list on partial import success (imported > 0) instead of
  requiring full success
- Fix pre-existing TypeScript and lint issues blocking commit

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

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

* version sync logic

* lints for develop branch

* chore: update CI workflow to include develop branch

- Modified the CI configuration to trigger on pushes and pull requests to both main and develop branches, enhancing the workflow for development and integration processes.

* fix: update project directory auto-detection for apps/backend structure

The project directory auto-detection was checking for the old `auto-claude/`
directory name but needed to check for `apps/backend/`. When running from
`apps/backend/`, the directory name is `backend` not `auto-claude`, so the
check would fail and `project_dir` would incorrectly remain as `apps/backend/`
instead of resolving to the project root (2 levels up).

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

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

* fix: use GraphQL variables instead of string interpolation in LINEAR_GET_ISSUES

Replace direct string interpolation of teamId and linearProjectId with
proper GraphQL variables. This prevents potential query syntax errors if
IDs contain special characters like double quotes, and aligns with the
variable-based approach used elsewhere in the file.

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

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

* fix(ui): correct logging level and await loadTasks on import complete

- Change console.warn to console.log for import success messages
  (warn is incorrect severity for normal completion)
- Make onImportComplete callback async and await loadTasks()
  to prevent potential unhandled promise rejections

Applies CodeRabbit review feedback across 3 LinearTaskImportModal usages.

* fix(hooks): use POSIX-compliant find instead of bash glob

The pre-commit hook uses #!/bin/sh but had bash-specific ** glob
pattern for staging ruff-formatted files. The ** pattern only works
in bash with globstar enabled - in POSIX sh it expands literally
and won't match subdirectories, causing formatted files in nested
directories to not be staged.

---------

Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
…_progress

When a user drags a running task back to Planning (or any other column),
the process was not being stopped, leaving a "ghost" process that
prevented deletion with "Cannot delete a running task" error.

Now the task process is automatically killed when status changes away
from in_progress, ensuring the process state stays in sync with the UI.
* feat: add UI scale feature

* refactor: extract UI scale bounds to shared constants

* fix: duplicated import
* fix: analyzer Python compatibility and settings integration

Fixes project index analyzer failing with TypeError on Python type hints.

Changes:
- Added 'from __future__ import annotations' to all analysis modules
- Fixed project discovery to support new analyzer JSON format
- Read Python path directly from settings.json instead of pythonEnvManager
- Added stderr/stdout logging for analyzer debugging

Resolves 'Discovered 0 files' and 'TypeError: unsupported operand type' issues.

* auto-claude: subtask-1-1 - Hide status badge when execution phase badge is showing

When a task has an active execution (planning, coding, etc.), the
execution phase badge already displays the correct state with a spinner.
The status badge was also rendering, causing duplicate/confusing badges
(e.g., both "Planning" and "Pending" showing at the same time).

This fix wraps the status badge in a conditional that only renders when
there's no active execution, eliminating the redundant badge display.

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

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

* fix(ipc): remove unused pythonEnvManager parameter and fix ES6 import

Address CodeRabbit review feedback:
- Remove unused pythonEnvManager parameter from registerProjectContextHandlers
  and registerContextHandlers (the code reads Python path directly from
  settings.json instead)
- Replace require('electron').app with proper ES6 import for consistency

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

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

* chore(lint): fix import sorting in analysis module

Run ruff --fix to resolve I001 lint errors after merging develop.
All 23 files in apps/backend/analysis/ now have properly sorted imports.

---------

Co-authored-by: Joris Slagter <mail@jorisslagter.nl>
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
* fix(core): add task persistence, terminal handling, and HTTP 300 fixes

Consolidated bug fixes from PRs #168, #170, #171:

- Task persistence (#168): Scan worktrees for tasks on app restart
  to prevent loss of in-progress work and wasted API credits. Tasks
  in .worktrees/*/specs are now loaded and deduplicated with main.

- Terminal buttons (#170): Fix "Open Terminal" buttons silently
  failing on macOS by properly awaiting createTerminal() Promise.
  Added useTerminalHandler hook with loading states and error display.

- HTTP 300 errors (#171): Handle branch/tag name collisions that
  cause update failures. Added validation script to prevent conflicts
  before releases and user-friendly error messages with manual
  download links.

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

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

* fix(platform): add path resolution, spaces handling, and XDG support

This commit consolidates multiple bug fixes from community PRs:

- PR #187: Path resolution fix - Update path detection to find apps/backend
  instead of legacy auto-claude directory after v2.7.2 restructure

- PR #182/#155: Python path spaces fix - Improve parsePythonCommand() to
  handle quoted paths and paths containing spaces without splitting

- PR #161: Ollama detection fix - Add new apps structure paths for
  ollama_model_detector.py script discovery

- PR #160: AppImage support - Add XDG Base Directory compliant paths for
  Linux sandboxed environments (AppImage, Flatpak, Snap). New files:
  - config-paths.ts: XDG path utilities
  - fs-utils.ts: Filesystem utilities with fallback support

- PR #159: gh CLI PATH fix - Add getAugmentedEnv() utility to include
  common binary locations (Homebrew, snap, local) in PATH for child
  processes. Fixes gh CLI not found when app launched from Finder/Dock.

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

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

* fix: address CodeRabbit/Cursor review comments on PR #185

Fixes from code review:
- http-client.ts: Use GITHUB_CONFIG instead of hardcoded owner in HTTP 300 error message
- validate-release.js: Fix substring matching bug in branch detection that could cause false positives (e.g., v2.7 matching v2.7.2)
- bump-version.js: Remove unnecessary try-catch wrapper (exec() already exits on failure)
- execution-handlers.ts: Capture original subtask status before mutation for accurate logging
- fs-utils.ts: Add error handling to safeWriteFile with proper logging

Dismissed as trivial/not applicable:
- config-paths.ts: Exhaustive switch check (over-engineering)
- env-utils.ts: PATH priority documentation (existing comments sufficient)

🤖 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 (round 2)

Fixes from second round of code review:
- fs-utils.ts: Wrap test file cleanup in try-catch for Windows file locking
- fs-utils.ts: Add error handling to safeReadFile for consistency with safeWriteFile
- http-client.ts: Use GITHUB_CONFIG in fetchJson (missed in first round)
- validate-release.js: Exclude symbolic refs (origin/HEAD -> origin/main) from branch check
- python-detector.ts: Return cleanPath instead of pythonPath for empty input edge case

Dismissed as trivial/not applicable:
- execution-handlers.ts: Redundant checkSubtasksCompletion call (micro-optimization)

🤖 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>
* chore: update README version to 2.7.1

Updated the version badge and download links in the README to reflect the new release version 2.7.1, ensuring users have the correct information for downloading the latest builds.

* feat(releases): add beta release system with user opt-in

Implements a complete beta release workflow that allows users to opt-in
to receiving pre-release versions. This enables testing new features
before they're included in stable releases.

Changes:
- Add beta-release.yml workflow for creating beta releases from develop
- Add betaUpdates setting with UI toggle in Settings > Updates
- Add update channel support to electron-updater (beta vs latest)
- Extract shared settings-utils.ts to reduce code duplication
- Add prepare-release.yml workflow for automated release preparation
- Document beta release process in CONTRIBUTING.md and RELEASE.md

Users can enable beta updates in Settings > Updates, and maintainers
can trigger beta releases via the GitHub Actions workflow.

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

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

* workflow update

---------

Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
* chore: update README version to 2.7.1

Updated the version badge and download links in the README to reflect the new release version 2.7.1, ensuring users have the correct information for downloading the latest builds.

* feat(releases): add beta release system with user opt-in

Implements a complete beta release workflow that allows users to opt-in
to receiving pre-release versions. This enables testing new features
before they're included in stable releases.

Changes:
- Add beta-release.yml workflow for creating beta releases from develop
- Add betaUpdates setting with UI toggle in Settings > Updates
- Add update channel support to electron-updater (beta vs latest)
- Extract shared settings-utils.ts to reduce code duplication
- Add prepare-release.yml workflow for automated release preparation
- Document beta release process in CONTRIBUTING.md and RELEASE.md

Users can enable beta updates in Settings > Updates, and maintainers
can trigger beta releases via the GitHub Actions workflow.

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

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

* workflow update

* ci(github): update Discord link and redirect feature requests to discussions

Update Discord invite link to correct URL (QhRnz9m5HE) across all GitHub
templates and workflows. Redirect feature requests from issue template
to GitHub Discussions for better community engagement.

Changes:
- config.yml: Add feature request link to Discussions, fix Discord URL
- question.yml: Update Discord link in pre-question guidance
- welcome.yml: Update Discord link in first-time contributor message

---------

Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
- Change branch reference from main to develop
- Fix contribution guide link to use full URL
- Remove hyphen from "Auto Claude" in welcome message
…tup (#180 #167) (#208)

This fixes critical bug where macOS users with default Python 3.9.6 couldn't use Auto-Claude because claude-agent-sdk requires Python 3.10+.

Root Cause:
- Auto-Claude doesn't bundle Python, relies on system Python
- python-detector.ts accepted any Python 3.x without checking minimum version
- macOS ships with Python 3.9.6 by default (incompatible)
- GitHub Actions runners didn't explicitly set Python version

Changes:
1. python-detector.ts:
   - Added getPythonVersion() to extract version from command
   - Added validatePythonVersion() to check if >= 3.10.0
   - Updated findPythonCommand() to skip Python < 3.10 with clear error messages

2. python-env-manager.ts:
   - Import and use findPythonCommand() (already has version validation)
   - Simplified findSystemPython() to use shared validation logic
   - Updated error message from "Python 3.9+" to "Python 3.10+" with download link

3. .github/workflows/release.yml:
   - Added Python 3.11 setup to all 4 build jobs (macOS Intel, macOS ARM64, Windows, Linux)
   - Ensures consistent Python version across all platforms during build

Impact:
- macOS users with Python 3.9 now see clear error with download link
- macOS users with Python 3.10+ work normally
- CI/CD builds use consistent Python 3.11
- Prevents "ModuleNotFoundError: dotenv" and dependency install failures

Fixes #180, #167

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

Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com>
* feat: Add OpenRouter as LLM/embedding provider

Add OpenRouter provider support for Graphiti memory integration,
enabling access to multiple LLM providers through a single API.

Changes:
Backend:
- Created openrouter_llm.py: OpenRouter LLM provider using OpenAI-compatible API
- Created openrouter_embedder.py: OpenRouter embedder provider
- Updated config.py: Added OpenRouter to provider enums and configuration
  - New fields: openrouter_api_key, openrouter_base_url, openrouter_llm_model, openrouter_embedding_model
  - Validation methods updated for OpenRouter
- Updated factory.py: Added OpenRouter to LLM and embedder factories
- Updated provider __init__.py files: Exported new OpenRouter functions

Frontend:
- Updated project.ts types: Added 'openrouter' to provider type unions
  - GraphitiProviderConfig extended with OpenRouter fields
- Updated GraphitiStep.tsx: Added OpenRouter to provider arrays
  - LLM_PROVIDERS: 'Multi-provider aggregator'
  - EMBEDDING_PROVIDERS: 'OpenAI-compatible embeddings'
  - Added OpenRouter API key input field with show/hide toggle
  - Link to https://openrouter.ai/keys
- Updated env-handlers.ts: OpenRouter .env generation and parsing
  - Template generation for OPENROUTER_* variables
  - Parsing from .env files with proper type casting

Documentation:
- Updated .env.example with OpenRouter section
  - Configuration examples
  - Popular model recommendations
  - Example configuration (#6)

Fixes #92

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

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

* refactor: address CodeRabbit review comments for OpenRouter

- Add globalOpenRouterApiKey to settings types and store updates
- Initialize openrouterApiKey from global settings
- Update documentation to include OpenRouter in provider lists
- Add OpenRouter handling to get_embedding_dimension() method
- Add openrouter to provider cleanup list
- Add OpenRouter to get_available_providers() function
- Clarify Legacy comment for openrouterLlmModel

These changes complete the OpenRouter integration by ensuring proper
settings persistence and provider detection across the application.

* fix: apply ruff formatting to OpenRouter code

- Break long error message across multiple lines
- Format provider list with one item per line
- Fixes lint CI failure

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

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

---------

Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com>
Implements distributed file-based locking for spec number coordination
across main project and all worktrees. Previously, parallel spec creation
could assign the same number to different specs (e.g., 042-bmad-task and
042-gitlab-integration both using number 042).

The fix adds SpecNumberLock class that:
- Acquires exclusive lock before calculating spec numbers
- Scans ALL locations (main project + worktrees) for global maximum
- Creates spec directories atomically within the lock
- Handles stale locks via PID-based detection with 30s timeout

Applied to both Python backend (spec_runner.py flow) and TypeScript
frontend (ideation conversion, GitHub/GitLab issue import).

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

Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
* fix(ideation): add missing event forwarders for status sync

- Add event forwarders in ideation-handlers.ts for progress, log,
  type-complete, type-failed, complete, error, and stopped events
- Fix ideation-type-complete to load actual ideas array from JSON files
  instead of emitting only the count

Resolves UI getting stuck at 0/3 complete during ideation generation.

* fix(ideation): fix UI not updating after actions

- Fix getIdeationSummary to count only active ideas (exclude dismissed/archived)
  This ensures header stats match the visible ideas count
- Add transformSessionFromSnakeCase to properly transform session data
  from backend snake_case to frontend camelCase on ideation-complete event
- Transform raw session before emitting ideation-complete event

Resolves header showing stale counts after dismissing/deleting ideas.

* fix(ideation): improve type safety and async handling in ideation type completion

- Replace synchronous readFileSync with async fsPromises.readFile in ideation-type-complete handler
- Wrap async file read in IIFE with proper error handling to prevent unhandled promise rejections
- Add type validation for IdeationType with VALID_IDEATION_TYPES set and isValidIdeationType guard
- Add validateEnabledTypes function to filter out invalid type values and log dropped entries
- Handle ENOENT separately

* fix(ideation): improve generation state management and error handling

- Add explicit isGenerating flag to prevent race conditions during async operations
- Implement 5-minute timeout for generation with automatic cleanup and error state
- Add ideation-stopped event emission when process is intentionally killed
- Replace console.warn/error with proper ideation-error events in agent-queue
- Add resetGeneratingTypes helper to transition all generating types to a target state
- Filter out dismissed/

* refactor(ideation): improve event listener cleanup and timeout management

- Extract event handler functions in ideation-handlers.ts to enable proper cleanup
- Return cleanup function from registerIdeationHandlers to remove all listeners
- Replace single generationTimeoutId with Map to support multiple concurrent projects
- Add clearGenerationTimeout helper to centralize timeout cleanup logic
- Extract loadIdeationType IIFE to named function for better error context
- Enhance error logging with projectId,

* refactor: use async file read for ideation and roadmap session loading

- Replace synchronous readFileSync with async fsPromises.readFile
- Prevents blocking the event loop during file operations
- Consistent with async pattern used elsewhere in the codebase
- Improved error handling with proper event emission

* fix(agent-queue): improve roadmap completion handling and error reporting

- Add transformRoadmapFromSnakeCase to convert backend snake_case to frontend camelCase
- Transform raw roadmap data before emitting roadmap-complete event
- Add roadmap-error emission for unexpected errors during completion
- Add roadmap-error emission when project path is unavailable
- Remove duplicate ideation-type-complete emission from error handler (event already emitted in loadIdeationType)
- Update error log message
Adds 'from __future__ import annotations' to spec/discovery.py for
Python 3.9+ compatibility with type hints.

This completes the Python compatibility fixes that were partially
applied in previous commits. All 26 analysis and spec Python files
now have the future annotations import.

Related: #128

Co-authored-by: Joris Slagter <mail@jorisslagter.nl>
* fix: resolve Python detection and backend packaging issues

- Fix backend packaging path (auto-claude -> backend) to match path-resolver.ts expectations
- Add future annotations import to config_parser.py for Python 3.9+ compatibility
- Use findPythonCommand() in project-context-handlers to prioritize Homebrew Python
- Improve Python detection to prefer Homebrew paths over system Python on macOS

This resolves the following issues:
- 'analyzer.py not found' error due to incorrect packaging destination
- TypeError with 'dict | None' syntax on Python < 3.10
- Wrong Python interpreter being used (system Python instead of Homebrew Python 3.10+)

Tested on macOS with packaged app - project index now loads successfully.

* refactor: address PR review feedback

- Extract findHomebrewPython() helper to eliminate code duplication between
  findPythonCommand() and getDefaultPythonCommand()
- Remove hardcoded version-specific paths (python3.12) and rely only on
  generic Homebrew symlinks for better maintainability
- Remove unnecessary 'from __future__ import annotations' from config_parser.py
  since backend requires Python 3.12+ where union types are native

These changes make the code more maintainable, less fragile to Python version
changes, and properly reflect the project's Python 3.12+ requirement.
* feat(github): add GitHub automation system for issues and PRs

Implements comprehensive GitHub automation with three major components:

1. Issue Auto-Fix: Automatically creates specs from labeled issues
   - AutoFixButton component with progress tracking
   - useAutoFix hook for config and queue management
   - Backend handlers for spec creation from issues

2. GitHub PRs Tool: AI-powered PR review sidebar
   - New sidebar tab (Cmd+Shift+P) alongside GitHub Issues
   - PRList/PRDetail components for viewing PRs
   - Review system with findings by severity
   - Post review comments to GitHub

3. Issue Triage: Duplicate/spam/feature-creep detection
   - Triage handlers with label application
   - Configurable detection thresholds

Also adds:
- Debug logging (DEBUG=true) for all GitHub handlers
- Backend runners/github module with orchestrator
- AI prompts for PR review, triage, duplicate/spam detection
- dev:debug npm script for development with logging

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

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

* fix(github-runner): resolve import errors for direct script execution

Changes runner.py and orchestrator.py to handle both:
- Package import: `from runners.github import ...`
- Direct script: `python runners/github/runner.py`

Uses try/except pattern for relative vs direct imports.

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

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

* fix(github): correct argparse argument order for runner.py

Move --project global argument before subcommand so argparse can
correctly parse it. Fixes "unrecognized arguments: --project" error.

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

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

* logs when debug mode is on

* refactor(github): extract service layer and fix linting errors

Major refactoring to improve maintainability and code quality:

Backend (Python):
- Extracted orchestrator.py (2,600 → 835 lines, 68% reduction) into 7 service modules:
  - prompt_manager.py: Prompt template management
  - response_parsers.py: AI response parsing
  - pr_review_engine.py: PR review orchestration
  - triage_engine.py: Issue triage logic
  - autofix_processor.py: Auto-fix workflow
  - batch_processor.py: Batch issue handling
- Fixed 18 ruff linting errors (F401, C405, C414, E741):
  - Removed unused imports (BatchValidationResult, AuditAction, locked_json_write)
  - Optimized collection literals (set([n]) → {n})
  - Removed unnecessary list() calls
  - Renamed ambiguous variable 'l' to 'label' throughout

Frontend (TypeScript):
- Refactored IPC handlers (19% overall reduction) with shared utilities:
  - autofix-handlers.ts: 1,042 → 818 lines
  - pr-handlers.ts: 648 → 543 lines
  - triage-handlers.ts: 437 lines (no duplication)
- Created utils layer: logger, ipc-communicator, project-middleware, subprocess-runner
- Split github-store.ts into focused stores: issues, pr-review, investigation, sync-status
- Split ReviewFindings.tsx into focused components

All imports verified, type checks passing, linting clean.

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

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

---------

Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
* Add multilingual support and i18n integration

- Implemented i18n framework using `react-i18next` for translation management.
- Added support for English and French languages with translation files.
- Integrated language selector into settings.
- Updated all text strings in UI components to use translation keys.
- Ensured smooth language switching with live updates.

* Migrate remaining hard-coded strings to i18n system

- TaskCard: status labels, review reasons, badges, action buttons
- PhaseProgressIndicator: execution phases, progress labels
- KanbanBoard: drop zone, show archived, tooltips
- CustomModelModal: dialog title, description, labels
- ProactiveSwapListener: account switch notifications
- AgentProfileSelector: phase labels, custom configuration
- GeneralSettings: agent framework option

Added translation keys for en/fr locales in tasks.json, common.json,
and settings.json for complete i18n coverage.

* Add i18n support to dialogs and settings components

- AddFeatureDialog: form labels, validation messages, buttons
- AddProjectModal: dialog steps, form fields, actions
- RateLimitIndicator: rate limit notifications
- RateLimitModal: account switching, upgrade prompts
- AdvancedSettings: updates and notifications sections
- ThemeSettings: theme selection labels
- Updated dialogs.json locales (en/fr)

* Fix truncated 'ready' message in dialogs locales

* Fix backlog terminology in i18n locales

Change "Planning"/"Planification" to standard PM term "Backlog"

* Migrate settings navigation and integration labels to i18n

- AppSettings: nav items, section titles, buttons
- IntegrationSettings: Claude accounts, auto-switch, API keys labels
- Added settings nav/projectSections/integrations translation keys
- Added buttons.saving to common translations

* Migrate AgentProfileSettings and Sidebar init dialog to i18n

- AgentProfileSettings: migrate phase config labels, section title,
  description, and all hardcoded strings to settings namespace
- Sidebar: migrate init dialog strings to dialogs namespace with
  common buttons from common namespace
- Add new translation keys for agent profile settings and update dialog

* Migrate AppSettings navigation labels to i18n

- Add useTranslation hook to AppSettings.tsx
- Replace hardcoded section labels with dynamic translations
- Add projectSections translations for project settings nav
- Add rerunWizardDescription translation key

* Add explicit typing to notificationItems array

Import NotificationSettings type and use keyof to properly type
the notification item keys, removing manual type assertion.
…#266)

* ci: implement enterprise-grade PR quality gates and security scanning

* ci: implement enterprise-grade PR quality gates and security scanning

* fix:pr comments and improve code

* fix: improve commit linting and code quality

* Removed the dependency-review job (i added it)

* fix: address CodeRabbit review comments

- Expand scope pattern to allow uppercase, underscores, slashes, dots
- Add concurrency control to cancel duplicate security scan runs
- Add explanatory comment for Bandit CLI flags
- Remove dependency-review job (requires repo settings)

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

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

* docs: update commit lint examples with expanded scope patterns

Show slashes and dots in scope examples to demonstrate
the newly allowed characters (api/users, package.json)

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

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

* chore: remove feature request issue template

Feature requests are directed to GitHub Discussions
via the issue template config.yml

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

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

* fix: address security vulnerabilities in service orchestrator

- Fix port parsing crash on malformed docker-compose entries
- Fix shell injection risk by using shlex.split() with shell=False

Prevents crashes when docker-compose.yml contains environment
variables in port mappings (e.g., '${PORT}:8080') and eliminates
shell injection vulnerabilities in subprocess execution.

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

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

---------

Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
@github-actions github-actions bot added 🔄 Checking Checking PR Status area/backend This is backend only labels Dec 25, 2025
@github-actions github-actions bot added the 🔄 Checking Checking PR Status label Jan 1, 2026
* chore: bump version to 2.7.2-beta.12

Update package.json version to match the latest beta release
so the auto-updater correctly detects the current version.

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

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

* fix(hooks): update both URL path and filename in README download links

The version sync in pre-commit only updated Auto-Claude-X.Y.Z filename
patterns but not the /download/vX.Y.Z/ URL path, resulting in broken
download links (e.g., /download/v2.7.1/Auto-Claude-2.8.0-win32.exe).

Now uses section-aware updates:
- Prerelease versions only update BETA_* sections
- Stable versions only update STABLE_* and TOP_* sections
- Both URL path and filename are updated together

* fix(hooks): run ruff only on staged Python files in pre-commit

The backend section was running ruff on ALL Python files in apps/backend/
and then staging ALL Python files, which caused unstaged changes to be
unintentionally committed. Now it mirrors the frontend's lint-staged
approach by only processing files that are actually staged for commit.

* fix(pr-review): block merge when CI checks are failing

PR reviews now check GitHub CI status and treat failing checks as
blocking issues. Previously, the review could approve a PR even when
tests were failing, leading to bad UX where contributors would fix
code issues only to discover CI failures afterward.

Changes:
- Add get_pr_checks() method to gh_client for fetching CI status
- Integrate CI status into verdict logic for initial and follow-up reviews
- Show CI failures in "Blocking Issues" section alongside code findings
- Override "Ready to Merge" verdict to "Blocked" when CI is failing

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

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

* fix(security): add tool input validation and fix qa_reviewer permissions

Addresses two issues identified in agent logs:

1. QA reviewer was missing write permissions to create qa_report.md and
   update implementation_plan.json. Changed qa_reviewer tools config from
   BASE_READ_TOOLS + ["Bash"] to include BASE_WRITE_TOOLS.

2. Malformed tool inputs (None, wrong type) caused confusing errors like
   "Command 'Category' is not in the allowed commands". Added validation
   in bash_security_hook to block malformed inputs with clear error messages.

Also created centralized tool_input_validator.py and updated all session
processors (session.py, qa/reviewer.py, qa/fixer.py, agent_runner.py) to
use get_safe_tool_input() helper for safe extraction.

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

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

* feat(pr-review): add finding-validator agent to prevent false positives

PR follow-up reviews were keeping findings as "unresolved" without
re-investigating if they were valid issues. Initial false positives
(hallucinated issues) would persist indefinitely across follow-ups.

This adds a new finding-validator specialist agent that:
- Actively reads code at finding locations with fresh eyes
- Requires concrete code evidence for any conclusion
- Can dismiss findings as false_positive OR confirm them as valid
- Integrates with the parallel follow-up review orchestrator

Changes:
- New pr_finding_validator.md prompt for the specialist agent
- FindingValidationResult Pydantic model with evidence requirements
- Validation fields on PRReviewFinding (status, evidence, confidence)
- Updated orchestrator to invoke finding-validator for unresolved findings
- Summary now shows dismissed false positives count
- 17 new tests covering validation scenarios

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

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

* fix(pr-review): keep GitHubPRs mounted to preserve background task state

When navigating away from the GitHub PRs tab during a background PR review
or follow-up, the component would unmount and lose visibility of the
running process. Applied the same pattern used by TerminalGrid: keep the
component always mounted but hidden with CSS when not active. This ensures
the Zustand store subscriptions remain active and both the PR list and
detail views update correctly during background reviews.

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

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

* fix(pr-review): fix phase status badges and list sync issues

Two issues fixed:

1. PR list not showing 'Ready for Follow-up' indicator - Changed from
   using imperative store updates to React hook subscriptions for
   setNewCommitsCheck, ensuring proper re-renders when store updates.

2. Phase status badges showing 'Complete' incorrectly during review -
   Only mark phases as completed if they were actually active (had
   entries). Save immediately when phase becomes active. Added frontend
   defensive check to show 'Pending' for completed phases with no entries
   during streaming.

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

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

* fix(release): sync versions and add PowerShell newline escaping

Address PR review findings:
- Sync root package.json and backend __init__.py to 2.7.2-beta.12
  to match frontend version (fixes atomic versioning violation)
- Add \r and \n escaping to escapePowerShellCommand() to prevent
  newline injection attacks in Windows terminal commands

🤖 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>
@github-actions github-actions bot added 🔄 Checking Checking PR Status and removed 🔄 Checking Checking PR Status labels Jan 1, 2026
Bun 1.2.0 changed the default lockfile from bun.lockb (binary) to
bun.lock (text format). Projects using newer Bun versions were being
incorrectly detected as npm because only bun.lockb was checked.

Updated 4 detection locations to check for both lockfile formats:
- project/stack_detector.py
- analysis/analyzers/framework_analyzer.py
- analysis/test_discovery.py
- core/workspace/git_utils.py (LOCK_FILES set)

Added test for bun.lock detection.
@github-actions github-actions bot added 🔄 Checking Checking PR Status and removed 🔄 Checking Checking PR Status labels Jan 1, 2026
* Enhance Python detection to find versioned Homebrew installations

Fixes issue where users with Python 3.9.6 at /usr/bin/python3 would get
"Auto Claude requires Python 3.10 or higher" error even when they had
newer Python versions installed via Homebrew.

Changes:
- Updated findHomebrewPython() to check for versioned Python installations
- Now searches for python3.13, python3.12, python3.11, python3.10 in addition to generic python3
- Validates each found Python to ensure it meets version requirements
- Checks both Apple Silicon (/opt/homebrew/bin) and Intel Mac (/usr/local/bin) locations

This ensures the app automatically finds and uses the latest compatible Python
version instead of falling back to the potentially outdated system Python.

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

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

* Update apps/frontend/src/main/python-detector.ts

Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>

* Address PR review findings for Python detection enhancement

Addresses all review findings from Auto Claude PR Review:

1. [HIGH] Align version ordering between python-detector.ts and cli-tool-manager.ts
   - Both now use consistent order: versioned first (3.13→3.10), then generic python3
   - This ensures different parts of the app use the same Python version
   - Added validation in cli-tool-manager.ts (was missing before)

2. [MEDIUM] Add try/catch around validatePythonVersion calls
   - Wrapped validation in try/catch to handle timeouts and permission errors
   - Follows same pattern as findPythonCommand()
   - Ensures graceful fallback to next candidate on validation failure

3. [LOW] Add debug logging for Python detection
   - Added console.log for successful detection with version info
   - Added console.warn for rejected candidates with reason
   - Added logging when no valid Python found
   - Improves troubleshooting of user Python detection issues

4. [LOW] Document maintenance requirement for version list
   - Added JSDoc note about updating list for new Python releases
   - Added TODO comment for Python 3.14+ updates
   - Applied to both files for consistency

Additional improvements:
- Fixed bug in cli-tool-manager.ts that returned first found Python without validation
- Both detection systems now validate Python version requirements (3.10+)
- Consistent logging format between both detection systems

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

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

* Add Python 3.14 support to version detection

Python 3.14 was released, so adding it to the detection lists:
- Updated pythonNames arrays in both python-detector.ts and cli-tool-manager.ts
- Added python3.14 to SAFE_PYTHON_COMMANDS set
- Updated JSDoc comments to reflect Python 3.14 support
- Removed TODO about Python 3.14 (now implemented)

This ensures the app can detect and use Python 3.14 installations.

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

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

* Refactor: Extract shared Homebrew Python detection logic

Eliminated code duplication by extracting shared Python detection logic
into a reusable utility module.

Changes:
- Created apps/frontend/src/main/utils/homebrew-python.ts
  - Exported findHomebrewPython() utility function
  - Accepts validation function and log prefix as parameters
  - Contains all shared detection logic (version list, validation, logging)

- Updated python-detector.ts
  - Removed duplicate findHomebrewPython() implementation (45 lines)
  - Now imports and delegates to shared utility
  - Maintains identical behavior and error semantics

- Updated cli-tool-manager.ts
  - Removed duplicate findHomebrewPython() implementation (52 lines)
  - Now imports and delegates to shared utility
  - Maintains identical behavior and error semantics

Benefits:
- Single source of truth for Homebrew Python detection
- Easier to maintain (update version list in one place)
- Consistent behavior across the application
- Reduced code duplication (~90 lines eliminated)

The refactored code maintains 100% backward compatibility with identical
return values, logging behavior, and error handling.

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

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

---------

Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com>
Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
Co-authored-by: Andy <119136210+AndyMik90@users.noreply.github.com>
@github-actions github-actions bot added 🔄 Checking Checking PR Status and removed 🔄 Checking Checking PR Status labels Jan 1, 2026
PR review agents were reading files from the current checkout branch
(e.g., develop) instead of the actual PR branch when using Read/Grep/Glob
tools. This caused incorrect review findings.

The fix creates a temporary detached worktree at the PR head commit for
each review, ensuring agents read from the correct branch state:

- Add head_sha/base_sha fields to PRContext dataclass
- Create worktree at PR commit before spawning specialist agents
- Use worktree path as project_dir for SDK client
- Cleanup worktree after review with fallback chain
- Add startup cleanup for orphaned worktrees from crashed runs

Worktrees are stored in .auto-claude/pr-review-worktrees/ (already
gitignored) to avoid /tmp filesystem boundary issues and support
concurrent reviews.

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

Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
@github-actions github-actions bot added 🔄 Checking Checking PR Status and removed 🔄 Checking Checking PR Status labels Jan 1, 2026
* fix(csp): allow external HTTPS images in Content-Security-Policy

Update img-src directive to include 'https:' allowing images from external
services like Supabase Storage to load in GitHub issue previews.

This enables automated pipelines (e.g., TestFlight feedback to GitHub issues)
that host screenshots on external storage to display correctly within Auto Claude.

Fixes image loading for:
- Supabase Storage URLs
- Any other HTTPS-hosted images in GitHub issues

Before: img-src 'self' data: blob:
After:  img-src 'self' data: blob: https:

* fix(csp): narrow img-src to specific trusted domains

Per reviewer feedback, replaced blanket https: with explicit whitelist:
- https://*.githubusercontent.com (GitHub images/avatars)
- https://*.supabase.co (Supabase Storage for TestFlight feedback)

This addresses security concerns while maintaining the use case.

Co-authored-by: adryserage <adryserage@users.noreply.github.com>

---------

Co-authored-by: adryserage <adryserage@users.noreply.github.com>
Co-authored-by: Alex <63423455+AlexMadera@users.noreply.github.com>
@github-actions github-actions bot added 🔄 Checking Checking PR Status and removed 🔄 Checking Checking PR Status labels Jan 2, 2026
AndyMik90 and others added 3 commits January 2, 2026 10:50
* perf: fix frontend lag with batched IPC events and optimized store updates

Critical performance fixes addressing 2-5s UI lag during task execution:

Frontend optimizations:
- Batch IPC log events (100+/sec → 6/sec batched updates)
- Add batchAppendLogs to task-store for efficient log appending
- Only set updatedAt on phase changes, not every progress tick
- Memoize sanitizeMarkdownForDisplay and formatRelativeTime in TaskCard
- Add React.memo with custom comparators to DroppableColumn
- Use IntersectionObserver to pause animations when cards not visible
- Reduce debug logging verbosity

Backend optimizations:
- Add project index caching with 5-minute TTL in client.py
- Batch StatusManager file writes with threading.Timer debounce

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

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

* chore(deps): update all frontend dependencies including major versions

Updates all frontend dependencies to latest versions:
- react-resizable-panels 3.0.6 → 4.2.0 (breaking API change)
- globals 16.5.0 → 17.0.0
- lucide-react 0.560.0 → 0.562.0
- zod 4.2.1 → 4.3.4
- Plus other minor/patch updates

Updates TerminalGrid.tsx for react-resizable-panels v4 API:
- PanelGroup → Group
- PanelResizeHandle → Separator
- direction → orientation
- Removed order prop
- Changed div wrappers to React.Fragment for proper resize handling

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

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

* debug: add extensive logging for PR review worktree creation

Adds debug print statements to troubleshoot worktree creation:
- _create_pr_worktree(): logs project_dir, worktree_dir, head_sha,
  fetch result, worktree add result, and final creation status
- review(): logs context.head_sha, context.head_branch, resolved
  head_sha, and worktree creation attempt/result
- _cleanup_pr_worktree(): logs cleanup calls and path existence

Also updates worktree path from .auto-claude/pr-review-worktrees/
to .auto-claude/github/pr/worktrees/ for better organization.

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

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

* refactor: make debug logging conditional on DEBUG=true env var

Wraps all [PRReview] DEBUG prints in `if DEBUG_MODE:` checks so they
only output when DEBUG=true is set in the environment. This matches
the frontend's debug mode system.

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

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

* fix: address PR review findings for thread safety and error handling

Fixes 8 issues from Auto Claude PR Review:
- Add try-catch for writeFileSync calls in execution-handlers.ts
- Add threading.Lock for debounced write timer in status.py
- Add threading.Lock for project index cache in client.py
- Clear batchTimeout on unmount in useIpc.ts
- Remove isVisible from IntersectionObserver deps in PhaseProgressIndicator.tsx
- Create stable onClick handlers via useMemo Map in KanbanBoard.tsx
- Remove unused imports (useCallback, useRef)

These changes prevent race conditions, memory leaks, and unnecessary
re-renders that were causing app lag and potential crashes.

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

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

* fix(core): address race conditions and thread safety issues

Fixes PR review findings and CodeQL security alerts:
- status.py: Move status mutation inside lock to prevent race conditions
- client.py: Add double-checked locking for project cache updates
- useIpc.ts: Fix stale closure risk with module-level storeActionsRef,
  change console.log to console.warn for ESLint compliance
- execution-handlers.ts: Add atomicWriteFileSync and safeReadFileSync
  helpers to prevent TOCTOU file system race conditions (CodeQL HIGH)

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

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

* fix(core): complete thread safety and add JSON parse error handling

Addresses remaining PR review findings:
- status.py: Add _write_lock protection to all 7 status mutation methods
  (update, set_active, set_inactive, update_subtasks, update_phase,
  update_workers, update_session) for consistent thread safety
- execution-handlers.ts: Wrap JSON.parse in try-catch after safeReadFileSync
  to handle corrupted plan files gracefully

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

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

* fix(status): capture status snapshot inside lock to prevent race condition

Move `to_dict()` call inside `_write_lock` to ensure consistent snapshot.
Previously, the lock was released before calling `to_dict()`, allowing
concurrent modifications via `update()`, `set_active()`, etc. to produce
inconsistent state where some fields reflect old values and others new.

* fix(pr-review): detect new commits after force push and fix cache race condition

Three bugs were preventing follow-up reviews from triggering after new commits:

1. Force push detection: When a force push made the old reviewed commit
   unreachable, the GitHub comparison API would fail and the error handler
   incorrectly returned hasNewCommits: false. Now returns true if SHAs differ.

2. Cache race condition: setPRReviewResult() always cleared newCommitsCheck,
   causing a race where the cache was cleared before the new commit check
   could populate it during refresh. Added preserveNewCommitsCheck option.

3. State sync: PRDetail's useEffect only synced when initialNewCommitsCheck
   was not undefined, missing updates from null to a value. Now always syncs.

🤖 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>
* perf: fix frontend lag with batched IPC events and optimized store updates

Critical performance fixes addressing 2-5s UI lag during task execution:

Frontend optimizations:
- Batch IPC log events (100+/sec → 6/sec batched updates)
- Add batchAppendLogs to task-store for efficient log appending
- Only set updatedAt on phase changes, not every progress tick
- Memoize sanitizeMarkdownForDisplay and formatRelativeTime in TaskCard
- Add React.memo with custom comparators to DroppableColumn
- Use IntersectionObserver to pause animations when cards not visible
- Reduce debug logging verbosity

Backend optimizations:
- Add project index caching with 5-minute TTL in client.py
- Batch StatusManager file writes with threading.Timer debounce

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

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

* chore(deps): update all frontend dependencies including major versions

Updates all frontend dependencies to latest versions:
- react-resizable-panels 3.0.6 → 4.2.0 (breaking API change)
- globals 16.5.0 → 17.0.0
- lucide-react 0.560.0 → 0.562.0
- zod 4.2.1 → 4.3.4
- Plus other minor/patch updates

Updates TerminalGrid.tsx for react-resizable-panels v4 API:
- PanelGroup → Group
- PanelResizeHandle → Separator
- direction → orientation
- Removed order prop
- Changed div wrappers to React.Fragment for proper resize handling

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

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

* fix(memory): fix learning loop to retrieve patterns and gotchas

The memory system was storing patterns and gotchas correctly (100% working)
but never retrieving them for agent prompts. The root cause was that
get_relevant_context() only performed generic semantic search without
filtering for specific episode types.

Changes:
- Add get_patterns_and_gotchas() method to search.py that specifically
  retrieves PATTERN and GOTCHA episodes with focused queries
- Add min_score filtering to reduce noise from low-relevance results
- Add wrapper method to graphiti.py facade class
- Update memory_manager.py to call new method and format results into
  dedicated "Learned Patterns" and "Known Gotchas" sections

This enables cross-session learning where patterns discovered in session 1
will now be available to sessions 2, 3, 4, etc.

* memory is now a app wide setting

* fix(security): address PR review findings for cache and subprocess safety

Fixes the following issues from PR review:

HIGH severity:
- Return defensive copies from _get_cached_project_data() to prevent
  cache corruption when callers modify returned dictionaries
- Validate head_sha before subprocess calls using _validate_git_ref()
  to prevent command injection attacks

MEDIUM severity:
- Add timeout=120 to worktree add subprocess call
- Add timeout=30 to worktree remove/prune subprocess calls
- Add bounds checking to worktree list parsing to prevent IndexError
- Validate head_sha fallback to head_branch (catches invalid refs early)
- Add AttributeError to exception handling in search.py JSON parsing

FALSE POSITIVES (already implemented):
- QA fixer/reviewer memory context - both files already have
  get_graphiti_context() calls at lines 106 and 92 respectively

---------

Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
* fix(ui): preserve original task description after spec creation

Task descriptions were being replaced with AI-generated content from
spec.md after spec creation completed. The description extraction in
project-store.ts prioritized spec.md Overview section over the user's
original description stored in implementation_plan.json.

Reordered priority: plan.json → requirements.json → spec.md (fallback)

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

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

* fix(pr-review): add input validation and timeouts to subprocess calls

Address CodeRabbit findings:

1. Import and use _validate_git_ref for head_sha validation before
   passing to subprocess (security)

2. Add timeout=60 to git worktree add subprocess call to prevent
   indefinite hangs on slow/corrupted repos

3. Add timeout=30 to git worktree remove, list, and prune calls
   for consistent timeout handling

4. Remove head_branch fallback - only use head_sha for worktree
   creation to ensure consistent semantics

5. Fix potential IndexError in worktree list parsing by checking
   split result length before accessing index

🤖 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>
AndyMik90 and others added 3 commits January 2, 2026 11:30
* perf: fix frontend lag with batched IPC events and optimized store updates

Critical performance fixes addressing 2-5s UI lag during task execution:

Frontend optimizations:
- Batch IPC log events (100+/sec → 6/sec batched updates)
- Add batchAppendLogs to task-store for efficient log appending
- Only set updatedAt on phase changes, not every progress tick
- Memoize sanitizeMarkdownForDisplay and formatRelativeTime in TaskCard
- Add React.memo with custom comparators to DroppableColumn
- Use IntersectionObserver to pause animations when cards not visible
- Reduce debug logging verbosity

Backend optimizations:
- Add project index caching with 5-minute TTL in client.py
- Batch StatusManager file writes with threading.Timer debounce

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

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

* chore(deps): update all frontend dependencies including major versions

Updates all frontend dependencies to latest versions:
- react-resizable-panels 3.0.6 → 4.2.0 (breaking API change)
- globals 16.5.0 → 17.0.0
- lucide-react 0.560.0 → 0.562.0
- zod 4.2.1 → 4.3.4
- Plus other minor/patch updates

Updates TerminalGrid.tsx for react-resizable-panels v4 API:
- PanelGroup → Group
- PanelResizeHandle → Separator
- direction → orientation
- Removed order prop
- Changed div wrappers to React.Fragment for proper resize handling

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

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

* fix(memory): fix learning loop to retrieve patterns and gotchas

The memory system was storing patterns and gotchas correctly (100% working)
but never retrieving them for agent prompts. The root cause was that
get_relevant_context() only performed generic semantic search without
filtering for specific episode types.

Changes:
- Add get_patterns_and_gotchas() method to search.py that specifically
  retrieves PATTERN and GOTCHA episodes with focused queries
- Add min_score filtering to reduce noise from low-relevance results
- Add wrapper method to graphiti.py facade class
- Update memory_manager.py to call new method and format results into
  dedicated "Learned Patterns" and "Known Gotchas" sections

This enables cross-session learning where patterns discovered in session 1
will now be available to sessions 2, 3, 4, etc.

* memory is now a app wide setting

* fix: detect and clear cross-platform CLI paths in settings

When settings are synced/transferred between platforms (e.g., Windows to
macOS), CLI tool paths can persist with wrong platform separators causing
"Claude Code not found" errors with Windows paths on macOS.

Changes:
- Add isWrongPlatformPath() to detect paths from different platforms
- Update all CLI tool detection methods to skip wrong-platform paths
- Add settings migration to clear cross-platform paths on load
- Export isPathFromWrongPlatform() for use in settings handlers

Fixes issue where Windows paths like C:\Users\...\claude.exe appeared
in error messages on macOS systems.

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

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

* fix(security): address CodeRabbit security findings

Security fixes:
- [CRITICAL] Fix command injection in validatePython() by using execFileSync
  instead of execSync with string interpolation (cli-tool-manager.ts)
- [HIGH] Add path validation to FILE_EXPLORER_LIST to prevent directory
  traversal attacks (file-handlers.ts)
- [HIGH] Fix xterm shell injection by using cwd option instead of embedding
  path in bash -c command (settings-handlers.ts)
- [MEDIUM] Add URL scheme validation to SHELL_OPEN_EXTERNAL to block
  dangerous protocols like file:// and javascript: (settings-handlers.ts)

Other fixes:
- [MEDIUM] Fix TaskCard memo comparison to check all subtasks, not just
  first 5 (TaskCard.tsx)
- [LOW] Fix type hint for optional BuildStatus parameter (status.py)
- [LOW] Remove unused useRef import (useIpc.ts)

Already fixed (no action needed):
- Race conditions in client.py and status.py (locks already in place)
- IntersectionObserver in PhaseProgressIndicator (dependency array already [])
- Unused imports in KanbanBoard.tsx (already removed)
- memory-env-builder.ts exists (CodeRabbit incorrectly reported missing)

🤖 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>
…ks (#565)

* fix(onboarding): default to recommended embedding model in wizard

The Memory step was defaulting to 'embeddinggemma' even though
'qwen3-embedding:4b' is marked as "Recommended" in the UI. This caused
confusion when users re-opened the wizard and saw a different model
selected than the one labeled recommended.

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

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

* fix(onboarding): default to recommended embedding model in wizard

Change default Ollama embedding model from 'embeddinggemma' to
'qwen3-embedding:4b' to match the "Recommended" badge in the UI.

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

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

* Relase 2.7.2

---------

Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
Main branch had outdated KanbanBoard code with broken references
to undefined variables (setShowArchived, archivedCount). Resolved
by keeping develop's version which has proper i18n support and
correct ViewStateContext usage.
@github-actions github-actions bot added 🔄 Checking Checking PR Status and removed 🔄 Checking Checking PR Status labels Jan 2, 2026
@AndyMik90 AndyMik90 merged commit ebe7633 into main Jan 2, 2026
20 of 21 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area/backend This is backend only 🔄 Checking Checking PR Status size/XL Extra large (1000+ lines)

Projects

None yet

Development

Successfully merging this pull request may close these issues.