Skip to main content
Glama
Ponywen0819

Claude Code IDE for Obsidian

by Ponywen0819
README.md
# Claude Code IDE for Obsidian

Connects the Claude Code CLI to Obsidian the same way the VS Code extension does:
Claude can read your selection and open files, open files, show diffs you keep/reject,
and run inside an embedded terminal.

Protocol is the WebSocket MCP variant reverse-engineered from the VS Code extension —
compatible with `coder/claudecode.nvim`.

## Build

```bash
npm install
npm run build        # -> main.js + styles.css
npm test             # protocol self-check (no Obsidian needed)
```

Install: copy `main.js`, `styles.css`, `manifest.json` into
`<vault>/.obsidian/plugins/obsidian-claude-code-ide/`, then enable it in
Settings → Community plugins.

## Use

Enabling the plugin starts a WebSocket server on `127.0.0.1`, writes
`~/.claude/ide/<port>.lock`, and is ready. Two ways to connect Claude:

- **Embedded terminal** (auto-connect): ribbon icon → *Claude Code terminal*, or the
  command palette. Spawns `claude` with the env vars already set; it connects on its own.
- **Passive mode** (no native deps): in any terminal, `cd` into the vault and run
  `claude`, then `/ide` → pick Obsidian.

## node-pty (embedded terminal only)

The terminal needs `node-pty`, a native module that must match Obsidian's Electron ABI.
It's an **optional** dependency — if it can't load, the terminal pane prints the passive-mode
steps instead and everything else still works.

To enable it, rebuild against Obsidian's Electron:

```bash
npx electron-rebuild -v <obsidian-electron-version> -m node_modules/node-pty
```

Find the Electron version in Obsidian via *Help → Debug info*. Copy the rebuilt
`node_modules/node-pty` next to `main.js` in the plugin folder.

## Layout

| File | Concern |
|------|---------|
| `src/ide-server.ts` | WS server, JSON-RPC/MCP, auth, lock file (Obsidian-free, tested) |
| `src/tools.ts` | The 11 MCP tool handlers (Obsidian-free, tested) |
| `src/main.ts` | Plugin lifecycle + Obsidian `EditorContext` implementation + selection bridge |
| `src/diff-modal.ts` | `openDiff` keep/reject UI |
| `src/terminal-view.ts` | xterm.js + node-pty terminal |

## Not done

- `executeCode` / `getDiagnostics` — no Obsidian equivalent (`getDiagnostics` returns `[]`).
- `isDirty` is always `false` (Obsidian autosaves; real dirty state isn't exposed).