Syncs Claude Code and Codex configuration across devices via OneDrive.
- Node.js
- Claude Code:
npm install -g @anthropic-ai/claude-code - Codex:
npm install -g @openai/codex && codex login
node scripts/setup/setup.js # create symlinks
node scripts/setup/setup.js --replace # overwrite existing filesCreates symlinks from ~/.claude/ and ~/.codex/ to this repo. Re-run to verify — won't overwrite.
If claude_settings.json or claude_env_settings.json are missing, setup copies the .template.json versions automatically. Fill in your API keys.
npm install -g pyright typescript-language-server typescript
rustup component add rust-analyzerWindows: setup.js patches marketplace.json to append .cmd to LSP binary names (required by uv_spawn — #1432).
Setup installs provider wrappers alongside the claude executable (CMD, PowerShell, Git Bash):
cc # official Claude Pro subscription
ccds # DeepSeek API (Foundry mode, direct to api.deepseek.com)Add providers by editing claude_env_settings.json (see template) and adding an alias entry in scripts/setup/setup.js.
The VS Code extension spawns its own claude process. Configure it separately:
node scripts/setup/setup-vscode.js deepseek # switch to DeepSeek
node scripts/setup/setup-vscode.js claude # revert to officialWrites terminal.integrated.env.* and claudeCode.claudeProcessWrapper to local VS Code settings.json. Re-run on each machine. Exclude these keys from VS Code Settings Sync to avoid cross-platform conflicts.
Windows permissions: Enable Developer Mode or run as Administrator if symlink creation fails.
All hook scripts live in scripts/hooks/ and are configured in claude_settings.json.
| Event | Script | Purpose |
|---|---|---|
Notification |
notify-hook.js |
Native OS notification |
Stop |
sharp-review plugin |
Post-task sharp review (3 parallel reviewers) |
StatusLine |
hud-hook.js |
Terminal HUD via claude-hud |
The rem and sharp-review plugins (Stop hooks for memory consolidation and code review) are auto-registered via enabledPlugins — no manual wiring needed.
The REM hook gates on session depth (≥3 stops, ≥2 min). Runs /rem skill. State tracked in .claude/.rem-state.json.
Hook wiring in claude_settings.json:
"hooks": {
"Notification": [{ "hooks": [{ "type": "command", "command": "node ~/.claude/scripts/hooks/notify-hook.js" }] }]
},
"statusLine": { "type": "command", "command": "node ~/.claude/scripts/hooks/hud-hook.js" }notify-hook.js sends native notifications:
| Platform | Method | Sound | Click to open |
|---|---|---|---|
| macOS | Swift binary (NSUserNotificationCenter) |
Built-in notification sound | Compiled by setup.js (swiftc required) |
| Windows | PowerShell toast | Toast audio (ms-winsoundevent:Notification.Default) |
Works out of the box |
| Linux | notify-send + dbus-monitor |
paplay / aplay (freedesktop sound theme) |
Requires D-Bus |
Sound is on by default. Pass --no-sound to silence it. By default, clicking the notification does not open VS Code. Pass --open to enable click-to-open:
"command": "node ~/.claude/scripts/hooks/notify-hook.js --open --no-sound"Test:
claude --bare --model haiku "please read ~/.claude/models.md to test claude permission system [Expected waiting for user's input]"| Directory | Purpose | Loaded |
|---|---|---|
.claude/rules/ |
MEMORY.md index + distilled rule files |
Every session |
.claude/memory/ |
Append-only archive with date prefixes | On demand via index |
@.claude/rules/MEMORY.md is referenced from GLOBAL-AGENTS.md so Claude loads the index every session. When a topic matches, Claude reads the relevant memory file on demand.
After a session, add entries to .claude/memory/YYYY-MM-DD/<topic>.md and prepend a one-line pointer to MEMORY.md (keep ≤20 entries, newest-first). If the session changed project architecture or setup, update AGENTS.md too.
When MEMORY.md hits 20 entries, the REM hook triggers a compact: distill all memory into .claude/rules/ rule files, then clear the index. Memory files are never deleted.
Both directories are git-tracked (.gitignore uses .claude/* with !.claude/rules/ and !.claude/memory/ exceptions).
To enable remote control (requires Claude subscription), remove these env vars from claude_settings.json:
"DISABLE_TELEMETRY": "1",
"DO_NOT_TRACK": "1"