* chore: add CLAUDE.md and Chromium Upgrade claude skill * Update script/lint.js Co-authored-by: David Sanders <dsanders11@ucsbalum.com> --------- Co-authored-by: David Sanders <dsanders11@ucsbalum.com>
6.6 KiB
Electron Development Guide
Project Overview
Electron is a framework for building cross-platform desktop applications using web technologies. It embeds Chromium for rendering and Node.js for backend functionality.
Directory Structure
electron/ # This repo (run `e` commands here)
├── shell/ # Core C++ application code
│ ├── browser/ # Main process implementation (107+ API modules)
│ ├── renderer/ # Renderer process code
│ ├── common/ # Shared code between processes
│ ├── app/ # Application entry points
│ └── services/ # Node.js service integration
├── lib/ # TypeScript/JavaScript library code
│ ├── browser/ # Main process JS (47 API implementations)
│ ├── renderer/ # Renderer process JS
│ └── common/ # Shared JS modules
├── patches/ # Patches for upstream dependencies
│ ├── chromium/ # ~159 patches to Chromium
│ ├── node/ # ~48 patches to Node.js
│ └── ... # Other targets (v8, boringssl, etc.)
├── spec/ # Test suite (1189+ TypeScript test files)
├── docs/ # API documentation and guides
├── build/ # Build configuration
├── script/ # Build and automation scripts
└── chromium_src/ # Chromium source overrides
../ # Parent directory is Chromium source
Build Tools Setup
Electron uses @electron/build-tools for development. The e command is the primary CLI.
Installation:
npm i -g @electron/build-tools
Configuration location: ~/.electron_build_tools/configs/
Essential Commands
Configuration Management
| Command | Purpose |
|---|---|
e init <name> --root=<path> --bootstrap testing |
Create new build config and sync |
e use <name> |
Switch to a different build configuration |
e show current |
Display active configuration name |
e show configs |
List all available configurations |
Build & Development Loop
| Command | Purpose |
|---|---|
e sync |
Fetch/update all source code and apply patches |
e sync --3 |
Sync with 3-way merge (required for Chromium upgrades) |
e build |
Build Electron (runs GN + Ninja) |
e build -k 999 |
Build and continue on errors (up to 999) |
e build -t <target> |
Build specific target (e.g., electron:node_headers) |
e start |
Run the built Electron executable |
e start --version |
Verify Electron launches and print version |
e test |
Run the test suite |
e debug |
Run Electron in debugger (lldb on macOS, gdb on Linux) |
Patch Management
| Command | Purpose |
|---|---|
e patches <target> |
Export patches for a target (chromium, node, v8, etc.) |
e patches all |
Export all patches from all targets |
e patches --list-targets |
List available patch targets |
Typical Development Workflow
# 1. Ensure you're on the right config
e show current
# 2. Sync to get latest code
e sync
# 3. Make your changes in shell/ or lib/ or ../
# 4. Build
e build
# 5. Test your changes (Leave the user to do this, don't run these commands unless asked)
e start
e test
# 6. If you modified patched files in Chromium:
cd .. # Go to Chromium repo
git add <files>
git commit -m "description of change"
cd electron
e patches chromium # Export the patch
Patches System
Electron patches upstream dependencies (Chromium, Node.js, V8, etc.) to add features or modify behavior.
How patches work:
patches/{target}/*.patch → [e sync --3] → target repo commits
← [e patches] ←
Patch configuration: patches/config.json maps patch directories to target repos.
Key rules:
- Fix existing patches 99% of the time rather than creating new ones
- Preserve original authorship in TODO comments
- Never change TODO assignees (
TODO(name)must retain original name) - Each patch file includes commit message explaining its purpose
Creating/modifying patches:
- Make changes in the target repo (e.g.,
../for Chromium) - Create a git commit
- Run
e patches <target>to export
Testing
Test location: spec/ directory
Running tests:
e test # Run full test suite
Test frameworks: Mocha, Chai, Sinon
Build Configuration
GN build arguments: Located in build/args/:
testing.gn- Debug/testing buildsrelease.gn- Release buildsall.gn- Common arguments for all builds
Main build file: BUILD.gn
Feature flags: buildflags/buildflags.gni
Chromium Upgrade Workflow
When working on the roller/chromium/main branch to upgrade Chromium activate the "Electron Chromium Upgrade" skill.
Code Style
C++: Follows Chromium style, enforced by clang-format
TypeScript/JavaScript: ESLint configuration in .eslintrc.json
Linting:
npm run lint # Run all linters
npm run lint:clang-format # C++ formatting
Key Files
| File | Purpose |
|---|---|
BUILD.gn |
Main GN build configuration |
DEPS |
Dependency versions and checkout paths |
patches/config.json |
Patch target configuration |
filenames.gni |
Source file lists by platform |
package.json |
Node.js dependencies and scripts |
Environment Variables
| Variable | Purpose |
|---|---|
GN_EXTRA_ARGS |
Additional GN arguments (useful in CI) |
ELECTRON_RUN_AS_NODE=1 |
Run Electron as Node.js |
Useful Git Commands for Chromium
# Find CL that changed a file
cd ..
git log --oneline -10 -- {file}
git blame -L {start},{end} -- {file}
# Look for Chromium CL reference in commit
git log -1 {commit_sha} # Find "Reviewed-on:" line
# Find which patch affects a file
grep -l "filename.cc" patches/chromium/*.patch
CI/CD
GitHub Actions workflows in .github/workflows/:
build.yml- Main build workflowpipeline-electron-lint.yml- Lintingpipeline-segment-electron-test.yml- Testing
Common Issues
Patch conflict during sync:
- Use
e sync --3for 3-way merge - Check if file was renamed/moved upstream
- Verify patch is still needed
Build error in patched file:
- Find the patch:
grep -l "filename" patches/chromium/*.patch - Match existing patch style (#if 0 guards, BUILDFLAG conditionals, etc.)
Remote build issues:
- Try
e build --no-remoteto build locally - Check reclient/siso configuration in your build config