- Show app version (v0.4.0) in sidebar bottom
- Clear Electron web cache when version changes to prevent stale JS
- Exclude data/ directory from packaged app
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Replace child_process.spawn with Electron's utilityProcess.fork() for
the Next.js server subprocess. utilityProcess runs as a Chromium
service process which doesn't register as a GUI app, eliminating the
extra Dock icon bounce on macOS.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add flex flex-col min-h-0 to the skills container so overflow-y-auto
in SkillsManager can properly trigger scrolling.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Providers API now detects ANTHROPIC_API_KEY, ANTHROPIC_AUTH_TOKEN, and
ANTHROPIC_BASE_URL from environment. ProviderManager shows a banner
when env vars are detected, informing users they're used automatically
when no provider is active.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add findGitBash() to platform.ts that checks env var, common install
paths, and derives path from `where git`. Used in claude-client.ts
to set CLAUDE_CODE_GIT_BASH_PATH when not already configured.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Bump version to 0.4.0 for new release
- Fix electron-builder linux.desktop config to use entry sub-object
(required by electron-builder 26.7.0)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Fixes stale closure bug where keyboard navigation in the slash command
popover could reference an outdated filteredItems list when the filter
text changed.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Slash commands:
- Fix skills not appearing (removed non-existent `enabled` filter)
- Add badge/capsule UI for prompt-type commands (/compact, /review, etc.)
- SDK-native commands sent directly; CLI-only commands expanded to prompts
- /clear now resets SDK session and clears database messages
- /cost shows actual aggregated token usage statistics
- Keyboard: Backspace/Escape to remove badge, arrow keys auto-scroll popover
- Add /memory command for editing CLAUDE.md
Multi-provider management:
- CRUD API for API providers with SQLite storage
- ProviderManager UI with quick presets (GLM, Kimi, MiniMax, etc.)
- Dynamic model labels based on active provider
- Environment variable injection with conflict resolution
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add Linux as a supported platform with AppImage, deb, and rpm targets
for both x64 and arm64 architectures.
Changes:
- electron-builder.yml: add linux section with AppImage/deb/rpm targets,
icon, category, and desktop entry configuration
- package.json: add electron:pack:linux script
- electron/main.ts: fix getIconPath() to return .png on Linux instead
of .icns (macOS format); enable loadUserShellEnv() on Linux since GUI
apps launched from desktop also have limited env
- README.md + README_CN.md: update supported platforms section
The README previously stated 'Linux builds are planned. Contributions
welcome.' — this delivers on that.
The collectStreamResponse() function only collected text events,
discarding tool_use and tool_result events. When a conversation was
resumed, all tool call context was lost — the user only saw the
text portions of Claude's responses.
Changes:
- Collect tool_use and tool_result SSE events as MessageContentBlock
entries alongside text blocks
- Flush accumulated text into a text block before each tool_use to
preserve the interleaved ordering (text → tool_use → tool_result →
text → ...)
- Store messages with tool calls as JSON arrays of MessageContentBlock,
using the existing type definitions in types/index.ts
- Text-only messages remain as plain strings for backward compatibility
with existing message rendering (parseMessageContent handles both)
- Add 10 unit tests covering parsing, serialization, round-tripping,
edge cases, and backward compatibility (all passing)
This enables future improvements like:
- Rendering tool call history in resumed conversations
- Showing which files were read/written in previous turns
- Exporting full conversation logs with tool context
The toSdkMcpConfig() function only handled stdio transport, discarding
the type, url, and headers fields. This meant SSE and HTTP MCP servers
configured through the Extensions page were silently converted to
broken stdio configs.
Changes:
- Import McpSSEServerConfig, McpHttpServerConfig, McpServerConfig types
from the Claude Agent SDK
- Rewrite toSdkMcpConfig() to dispatch on config.type (stdio/sse/http)
- SSE configs: pass type, url, and optional headers to the SDK
- HTTP configs: pass type, url, and optional headers to the SDK
- stdio configs: pass command, args, env (unchanged behavior)
- Skip servers with missing required fields (url for SSE/HTTP, command
for stdio) with a console warning instead of passing broken configs
- Do not include empty headers objects
- Add 11 unit tests covering all transport types, mixed configs,
missing fields, and edge cases (all passing)
This aligns the implementation with the README which states:
'Supports stdio, sse, and http transport types.'
Radix ScrollArea doesn't reliably get constrained height in flex
layouts, preventing mouse wheel scrolling. Replace with a simple
div using overflow-y-auto and min-h-0 which works correctly.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Enable GitHub release, platform, and license badges
- Add emojis to feature list for better visual hierarchy
- Update download section with macOS (arm64 + x64) and Windows support
- Correct database path to ~/.codepilot/codepilot.db
- Unify badge style between English and Chinese versions
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Use artifactName template to always include architecture in DMG
filename (e.g. CodePilot-0.2.3-x64.dmg) for clarity.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add CLAUDE.md with release checklist and build notes.
Bump version for new release with ABI fix, Windows path fix,
x64 macOS support, and Extensions scroll fix.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Fix Windows Claude CLI not found when installed as .exe or without
extension in .local\bin (closes#6). Now searches all extensions
(.cmd, .exe, .bat, and bare) for every candidate directory.
- Fix Extensions/Skills list not scrollable when many items exist.
Change content container to overflow-hidden so internal ScrollArea
works correctly. Add overflow-auto to McpManager for its own scroll.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Root cause: electron-builder's @electron/rebuild only rebuilds native
modules found in the `files` config. Since better-sqlite3 enters the
app through extraResources (via .next/standalone/), it was skipped.
The afterPack hook was copying the system Node.js ABI (127) instead
of the required Electron ABI (143).
Fix:
- afterPack now explicitly calls `npx electron-rebuild` targeting the
exact Electron version and architecture from the build context
- Falls back to @electron/rebuild programmatic API if CLI fails
- Fails the build if rebuild cannot complete (no silent failures)
- Adds file size logging for verification
- Excludes `release/` from extraResources to prevent recursive nesting
- Adds startup ABI compatibility check in Electron main process with
friendly error dialog instead of cryptic crash
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The afterPack script only searched macOS-specific paths
(CodePilot.app/Contents/Resources) for better_sqlite3.node replacement.
Add Windows/Linux path (resources/standalone/) so the native module
ABI fix works on all platforms.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Add src/lib/platform.ts: cross-platform Claude CLI discovery
(candidate paths, .cmd/.bat shell handling, where/which fallback)
- Refactor claude-status route and claude-client to use shared platform utils
- Electron main: Windows process spawning (windowsHide), PATH construction
with AppData/npm dirs, titleBarOverlay, .ico icon support
- electron-builder.yml: add win/nsis build targets
- package.json: add electron:pack:win script
- FolderPicker: drive switcher dropdown for navigating between drives
- SkillsManager: fix duplicate key warning with filePath fallback
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add afterPack hook that copies the @electron/rebuild-compiled
better_sqlite3.node into the standalone resources directory.
Previously the standalone copy retained the system Node ABI from
next build, causing MODULE_VERSION mismatch at runtime.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
When navigating to a drive root on Windows (e.g. C:\), path.dirname
returns itself, disabling the "go up" button and trapping the user on
that drive. This adds a compact dropdown next to the up button that
lists all available drives (auto-detected via fs.accessSync), allowing
quick switching between drives. macOS/Linux are unaffected (empty array,
dropdown not rendered).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Previously the database path depended on app.getPath('userData') which
varies with app name changes (CodePilot vs codepilot vs Claude GUI).
Now uses a fixed ~/.codepilot/ directory for both dev and production.
Includes automatic migration: on first launch, if the DB doesn't exist
at the new path, it checks old locations (Application Support variants
and the old dev-mode data/ folder) and copies the database over.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Shows a copy icon at the bottom of each message on hover. Clicking
copies the text content to clipboard with a brief checkmark confirmation.
User messages show the button right-aligned; assistant messages show it
alongside the existing timestamp and token usage.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1. Skills API: accept optional cwd query param so project-level skills
are scanned from the session's working directory, not the standalone
server's process.cwd().
2. SDK env: explicitly set HOME so Claude Code can resolve ~/.claude/
for global skills discovery in packaged builds.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1. Change StickToBottom resize mode from "smooth" to "instant" to
prevent scroll position bouncing when new streaming content
arrives faster than the smooth animation completes.
2. Use SDK's preset append mode for system prompts instead of
replacing Claude Code's default prompt. This preserves Claude
Code's built-in awareness of skills (.claude/commands/), working
directory context, and other default behaviors.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add a new "API Configuration" section in settings for users who use
custom Anthropic-compatible APIs (e.g. via ai-claude-start). Users
can optionally set ANTHROPIC_AUTH_TOKEN and ANTHROPIC_BASE_URL in
CodePilot's settings UI. These are stored in SQLite and injected
into the Claude Code subprocess env only when configured.
Existing authentication methods (claude login, shell env vars) are
not affected - the API config is purely additive.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1. Explicitly pass process.env to the Claude Agent SDK's env option,
ensuring user shell env vars (ANTHROPIC_AUTH_TOKEN, ANTHROPIC_BASE_URL,
etc.) reach the claude subprocess in packaged builds.
2. Spawn the standalone server via /bin/sh with exec to prevent the
Electron binary from appearing as a separate Dock icon on macOS.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
When launched from Dock/Finder, Electron's process.env is very limited
and misses vars from .zshrc/.bashrc (API keys, custom PATH, etc.).
Added loadUserShellEnv() to run a login shell and capture the full
environment, then pass it to the standalone server process. This fixes
"organization does not have access" errors for users with custom API
configurations.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
electron-builder's @electron/rebuild compiles better-sqlite3 for
Electron's Node ABI. The standalone server must use Electron's
built-in Node (ELECTRON_RUN_AS_NODE=1) to match, otherwise the
native module fails with NODE_MODULE_VERSION mismatch.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Return full error stack traces from the sessions API and display
the actual server error in the frontend, instead of a generic
"Failed to create session" message.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The SDK's query() function also needs to find the claude binary.
Added findClaudePath() in claude-client.ts and pass it via
pathToClaudeCodeExecutable option, fixing "Failed to create session"
in packaged builds where PATH is limited.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The claude-status endpoint now searches common installation paths
(/usr/local/bin, /opt/homebrew/bin, ~/.npm-global/bin, ~/.local/bin,
~/.claude/bin) and uses `which` with expanded PATH as fallback,
fixing "Disconnected" status in packaged builds.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Find system Node.js binary instead of using Electron's Node
(avoids native module ABI mismatch with better-sqlite3)
- Detect server process crash and fail fast instead of waiting 30s
- Include server stdout/stderr in error dialog for debugging
- Expand PATH to include homebrew directories
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Replace fork() with spawn() + ELECTRON_RUN_AS_NODE=1 so the
standalone server runs correctly inside the packaged app
- Set cwd to standalone directory for proper dependency resolution
- Show error dialog on startup failure instead of silent quit
- Add Chinese README (README_CN.md)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Add README_CN.md with full Chinese translation
- Link between EN/CN README at the top
- Replace placeholder URLs with actual repo URLs
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Replace symlinks in .next/standalone with real copies for electron-builder
- Exclude electron/, dist-electron/, scripts/, release/ from tsconfig
- Use arm64 target instead of universal to avoid native module merge issues
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Full-featured desktop application built with Next.js + Electron:
- Streaming chat with Claude Code via Agent SDK
- Session management with SQLite persistence
- Project file tree and file preview
- MCP server and custom skills management
- Permission controls with Code/Plan/Ask modes
- Dark/light theme, token tracking
- macOS DMG packaging with electron-builder
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>