diff --git a/README.md b/README.md index 6a5e73a..b11a482 100644 --- a/README.md +++ b/README.md @@ -1,167 +1,58 @@

- ide — a fast, lightweight, cross-platform code editor + ide — a fast, lightweight, cross-platform code editor

-A lean Tauri-based integrated development environment built for speed, local control, and agent-friendly editor context. - -The goal is not to recreate Visual Studio Code. The goal is a focused editor shell that opens fast, keeps background work explicit, and exposes useful context to tools like Claude Code and Codex. - -## Current State - -Implemented: - -- Tauri 2 desktop shell with a Rust backend. -- React frontend. -- File tree with package-backed coloured file icons, keyboard expansion/opening, accessible selection/expanded state, and folder fallbacks. -- Native folder picker for switching workspaces. -- Native toolbar buttons for opening files and folders in the desktop app. -- Native File menu with New File, New Folder, Open File, Open Folder, Recents, Save, Reload, Rename/Delete, Close Tab, and Close All. -- Native categorized Settings dialog for view toggles, performance limits, search limits, and OS storage locations. -- File/folder launch targets through the local runner and macOS Finder Quick Action. -- Packaged-app file associations for common text, code, web, config, and .NET project files. -- Runtime handling for native OS file-open events, including single-process window creation/focus for launched files and folders. -- Explicit workspace loading, empty, and load-failure retry states. -- Collapsible sidebar for focused editing. -- Collapsed file-name filtering and bounded text search across the current workspace, with visible capped-result notices plus searched/skipped file counts. -- Collapsed current-file search over loaded and unsaved editor contents, with Enter/Shift+Enter match navigation. -- Lightweight command palette for discoverable editor and workspace commands, including native file/folder open actions in the desktop app. -- Keyboard quick-open palette for opening editor-supported files by path, including arrow-key result selection and SQLite-backed candidates from indexed workspace metadata with bounded on-demand folder expansion. -- Settings Storage view that shows OS app-data paths plus live workspace-index coverage counts, so scan/cache limits are visible instead of hidden. -- IntelliJ-style keyboard file creation, tab navigation, and close commands. -- Native View menu Key Bindings dialog with searchable supported shortcuts. -- Native Search menu with Go to File, Go to Line, Find in File, and Find in Files actions. -- Native Navigate menu actions for LSP-backed Go to Definition and Find References. -- Dirty-file prompts before closing tabs or the native app window. -- Reload active files from disk, with confirmation before discarding unsaved edits. -- New-file creation inside the current workspace. -- New-folder creation inside the current workspace. -- File and folder rename inside the current workspace. -- Confirmed file and folder deletion inside the current workspace. -- Save active file and Save All commands. -- Stale-save protection so externally modified files are not silently overwritten. -- Guarded Rust-native workspace scanning, file/folder creation, rename, deletion, and file read/write commands. -- SQLite-backed workspace metadata index stored in OS app-local data, refreshed from initial scans, lazy folder loads, bounded quick-open expansion, and editor file mutations. -- Bounded initial tree scans surface a visible notice when the configured entry cap is reached, while folder expansion continues loading children on demand. -- User preferences and recents are stored in OS app data with paths exposed from Settings for backup; disposable workspace indexes stay in OS app-local data so they can be rebuilt. -- Common binary/media/font/archive files select in the tree without attempting text-editor reads. -- CodeMirror 6 editor. -- Syntax highlighting for common code and config files, including Rust, TypeScript, JavaScript, React/TSX/JSX, JSON, Markdown, shell scripts, HTML, CSS/SCSS/Sass, C#, C/C++, Java/Kotlin/Scala, Python, Go, Ruby, SQL, XML/YAML/TOML, Dockerfiles, PowerShell, diffs, and .NET project files. -- Lazy editor loading and lazy language loading for better startup performance. -- System light/dark mode via `prefers-color-scheme` with a high-contrast bias, including the editor surface. -- Active file, open file, and selection context stored in backend state. -- LSP process manager for Rust, TypeScript/React, and C# with status refresh after bridge events. -- LSP-backed editor keymaps from CodeMirror for definition, references, hover, rename, formatting, and signature help when the matching language server is installed. -- LSP diagnostics captured for read-only agent context, with an optional diagnostics panel for precise line/column navigation. -- Local HTTP context endpoint for terminal/browser integrations. -- Claude Code `/ide` discovery bridge with authenticated localhost WebSocket MCP and read-only editor-context tools. -- Codex-compatible read-only MCP endpoint with a persisted app-local bearer token. -- Bearer-token protection for mutating local HTTP browser API calls. - -Planned: - -- Diff review and write-capable Claude bridge tools with explicit editor UI review. -- Deeper Codex integration through `codex app-server` research once the editor has an explicit review/approval surface for rich agent workflows. -- PR-ready local polish and testing workflow. - -## Run Locally +A lean, fast code editor built for local control and agent-friendly context. Tauri shell, Rust backend, CodeMirror editor: it opens fast, stays light, and stays out of your way. -```bash -./run.sh -``` +

+ + + The ide app — file tree, editor with git attribution, and commit info + +

-The script installs Node dependencies when needed and starts Tauri dev mode. +This isn't a VS Code rebuild. It's a focused editor shell: open a folder, read and change code, commit, and give your AI tools real editor context — without extensions, background indexing surprises, or a plugin marketplace. -Open a specific folder or file: +## What you get -```bash -./run.sh /path/to/workspace -./run.sh /path/to/workspace/src/App.tsx -``` +**A shell that stays simple.** An activity rail switches between Files, Search, and Source control. Quick open and a command palette cover the keyboard paths, IntelliJ-style shortcuts work out of the box, and a searchable key-bindings dialog shows what's available. -If ide is already running, `./run.sh /path/to/file-or-folder` hands the target to the running app through the authenticated loopback API instead of starting a second dev instance. +**Search that's honest.** One panel, two scopes: file `names` or file `contents`. Results are bounded by limits you control in Settings, and the UI tells you when a cap truncated the results instead of pretending the list is complete. -Install the lowercase shell commands: +**Git without leaving the editor.** Tick the files you want and commit from the sidebar. Fetch, pull, and push with a Sync button that walks you through merge conflicts as you resolve them. See who last touched the current file inline, and click the status bar for the full commit card — message, author with avatar, and an Open in GitHub link when the repo has a remote. Both git features are on by default and can be switched off in Settings. -```bash -./build.sh -``` +**A real editor.** CodeMirror 6 with syntax highlighting for around 25 languages, from Rust and TypeScript to SQL and Dockerfiles. Install a language server (`rust-analyzer`, `typescript-language-server`, a C# LSP) and you get go-to-definition, find references, rename, hover, and a diagnostics panel — all optional, per language. -The build script creates the packaged macOS `.app` and installs the command launchers. It intentionally skips DMG creation for local command installs. If `/Applications` is writable, it also replaces `/Applications/ide.app`; otherwise use the interactive developer installer: +**Your look.** Light, dark, or follow-the-system themes with a one-click toggle on the rail. Pick the code font (IBM Plex Mono or your system mono). Right-click menus are tailored to each surface — tree, tabs, editor, search, commit panel. -```bash -./dev-install.sh -``` +**Built for agents.** This is the differentiator: the editor exposes its context to AI coding tools running next to it. -`dev-install.sh` runs the build, prompts for the `/Applications/ide.app` replacement when admin permission is needed, refreshes Spotlight/Launch Services metadata where possible, and reveals the installed app in Finder. macOS can still cache app icons briefly, so quit/reopen ide and give Spotlight a moment if the old icon is still visible. +- Claude Code discovers a running ide through `/ide` — no config needed. +- Codex (and any MCP client) can read editor context through a local, token-protected MCP endpoint. Copy the config from the app's integrations panel into `~/.codex/config.toml`: -After installation, `ide ` opens or focuses a packaged app window for that target without holding the terminal. Bare `ide` focuses an existing running app or opens the last context, and `ide-dev` runs this checkout's dev runner: + ```toml + [mcp_servers.ide] + url = "http://127.0.0.1:17877/mcp" + http_headers = { Authorization = "Bearer paste-token-from-ide" } + ``` -```bash -ide . -ide-dev . -``` - -Use `./scripts/install-cli-command.sh` only when the packaged app already exists and you just need to refresh the links. - -On macOS, install the Finder Quick Action for direct file/folder opening: - -```bash -./scripts/install-macos-finder-quick-action.sh -``` +**A native citizen.** File associations for common code and text files, a macOS Finder Quick Action (right-click → Open in ide), and one app process with per-workspace windows so the Dock stays tidy. -After installation, use Finder's right-click menu: Quick Actions > Open in ide. Recent folders and files are stored in the OS app-data location and exposed through the native File menu, not as in-app sidebar content. +## Get started -The Finder Quick Action generator is covered by `npm run finder:check`, which installs into a temporary directory and validates the generated service, file/folder UTI coverage, and loopback handoff script without touching your real Finder services. +Grab a packaged build from [Releases](https://github.com/GordonBeeming/ide/releases), or build from source with the steps in [docs/development.md](docs/development.md). -Packaged builds also declare file associations for common editor-supported file types, so macOS and other platforms can offer ide from native `Open With` flows for those files. The packaged app uses one OS process with multiple workspace windows, so Dock and app-switcher grouping stays under one ide app icon. Folder opening is still handled through the native Open Folder menu, `./run.sh /path/to/folder`, and the macOS Finder Quick Action because OS file associations are file-oriented. - -## Requirements - -- Node.js 24 or newer -- npm 11 or newer -- Rust 1.95 or newer -- macOS, Linux, or Windows with the normal Tauri platform prerequisites - -Known optional language-server tools: - -- `rust-analyzer` for Rust -- `typescript-language-server` for TypeScript and React -- OmniSharp or another standalone C# LSP for C# - -Claude Code can discover the running editor through `/ide` after the native app starts. The app writes a user-only lock file under `~/.claude/ide/` and exposes only read-only context tools in this first bridge. - -Codex can consume editor context through the MCP endpoint shown from the native integration menu. Copy the Codex MCP config from the integrations panel and add it to `~/.codex/config.toml`: - -```toml -[mcp_servers.ide] -url = "http://127.0.0.1:17877/mcp" -http_headers = { Authorization = "Bearer paste-token-from-ide" } -``` - -The public Codex docs describe `/ide` for Codex-owned IDE surfaces and `codex app-server` for rich clients, but do not currently document a Claude-style third-party lockfile protocol. The MCP endpoint remains the supported local context bridge for this app. - -The loopback browser API is read-friendly for local terminal/browser views. Mutating routes, including file writes and editor-context updates, require the same persisted app-local bearer token. - -## Verification +Once installed, the `ide` command opens or focuses a workspace without holding your terminal: ```bash -./run-tests.sh +ide . # open the current folder +ide src/App.tsx # open a file (its folder becomes the workspace) ``` -`npm audit --audit-level=moderate` currently reports no known npm vulnerabilities. - -`run-tests.sh` runs the npm audit automatically. It also validates the Finder Quick Action generator, local launch runners, native menu contract, Tauri bundle file associations, production bundle budgets for startup JavaScript, startup CSS, and the lazy editor chunk, then runs a browser smoke test against the real React/CSS app shell in light and dark mode. The smoke test uses local Chrome, Chromium, or Edge through `playwright-core`; set `IDE_SMOKE_BROWSER=/path/to/browser` if it cannot find a browser automatically. - -`run-tests.sh` also runs `cargo fmt --check`, `cargo clippy --all-targets -- -D warnings`, `cargo test`, `cargo check`, and `cargo audit --deny warnings` when `cargo-audit` is installed. Current transitive Rust advisory warnings are reviewed in `src-tauri/.cargo/audit.toml`; new advisory warnings fail the local gate until reviewed. - -## Design Constraints +On macOS you can also right-click any file or folder in Finder: Quick Actions → Open in ide. -- Avoid heavy editor/runtime dependencies. -- Keep editor and language support lazy-loaded. -- Prefer Rust-native filesystem and process work. -- Keep LSP optional and per-language. -- Do not add GitHub workflows yet. +## Learn more -More detail is in [docs/development.md](docs/development.md). -Security guardrails are tracked in [docs/security.md](docs/security.md). -Source-backed technology notes are in [docs/research.md](docs/research.md). +- [Development](docs/development.md) — running from source, building, testing, architecture, and the full capability inventory. +- [Security](docs/security.md) — the guardrails around local file access and the loopback API. +- [Research](docs/research.md) — source-backed notes on the protocols and technology choices. diff --git a/assets/README.md b/assets/README.md index 26681e4..ab3cf29 100644 --- a/assets/README.md +++ b/assets/README.md @@ -1,6 +1,7 @@ # ide — app icon assets -The **Stagger** mark. Charcoal `#1e1f24` + one blue `#0063B2` on a light "paper" squircle. +The **Leaf dot + caret** mark. A lowercase "ıde" wordmark with a teal xylem-leaf +dot and a caret bar, on a dark rounded-square tile. --- @@ -29,18 +30,15 @@ generator tune each platform. ## 📁 What's in here ``` -app-icon/ The full app icon (squircle tile + mark) - icon.svg vector master — SQUIRCLE background, macOS padding - icon-fullbleed.svg vector — squircle fills the frame (favicons, web) - icon-square.svg vector — SQUARE background to the edges (no rounding) +app-icon/ The full app icon (tile + wordmark) + icon.svg vector master — rounded-square background + icon-animated.svg README/web version — blinking caret, wordmark rasterised + (embeds icon-512.png so no font is needed in use) + icon-square.svg vector — square background to the edges (web/marketing) icon-square-*.png raster of the square version - icon-16…1024.png raster ladder (squircle) + icon-16…1024.png raster ladder (rounded-square tile) -mark/ The bare mark on transparency (no tile) - mark.svg vector, 2-colour - mark-mono.svg vector, single-colour (menu-bar / tray / stamps) - mark-32…1024.png raster, transparent - mark-mono-512.png +screenshots/ README app shots (light/dark pair for the swap) src-tauri-icons/ ← drop straight into src-tauri/icons/ 32x32.png 128x128.png 128x128@2x.png icon.png @@ -48,15 +46,19 @@ src-tauri-icons/ ← drop straight into src-tauri/icons/ Square*Logo.png StoreLogo.png (Windows Store / MSIX) ``` +There's no `mark/` pack (bare mark on transparency) in this drop. The +wordmark's ink colour (`#e8eef6`) only reads correctly on the dark tile, and +nothing in the app currently consumes a transparent or single-colour cutout +— there's no tray/menu-bar icon. Add one if a future use case needs it. + --- -## 🔺 Three background forms (SVG) +## 🔺 Two background forms (SVG) -| File | Background | -|----------------------------|------------------------------------| -| `app-icon/icon.svg` | Squircle tile (macOS app-icon look)| -| `mark/mark.svg` | Transparent — bare mark only | -| `app-icon/icon-square.svg` | Square gradient, runs to the edges | +| File | Background | +|------------------------------|----------------------------------------------------------------| +| `app-icon/icon.svg` | Rounded-square tile (macOS app-icon look) | +| `app-icon/icon-square.svg` | Same mark, square background to the edges (web/marketing use) | --- @@ -64,21 +66,16 @@ src-tauri-icons/ ← drop straight into src-tauri/icons/ | Role | Value | |-----------------|-------------| -| Ink (mark) | `#1e1f24` | -| Accent (blue) | `#0063B2` (brand primary) | -| Tile gradient | `#ffffff` → `#eceae6` | -| Corner shape | Apple superellipse (squircle), n≈5 | +| Ink (wordmark) | `#e8eef6` | +| Accent (teal) | `#22d3ee` | +| Tile | `#0b1120` | +| Corner shape | Rounded square, `rx=115` on a 512 canvas (~22.5%) | -The tile is intentionally **light** — it stands out among the colourful icons +The tile is intentionally **dark** — it stands out among the colourful icons in a dock while staying minimal. No drop-shadow is baked into the OS icons; macOS/Windows add their own. -## 🧩 Using the bare mark -The mark in `mark/` sits on full transparency and inverts cleanly: use the -charcoal version on light surfaces and recolour to off-white on dark ones. -For a macOS menu-bar (tray) **template** image, use `mark-mono.svg` — the -system tints single-colour template icons automatically. - ## ✏️ Editing -Every PNG is regenerated from the SVGs. To tweak the mark, edit the three -``s in `mark.svg` (or the glyph inside `icon.svg`) and re-export. +Every PNG is regenerated from the SVGs. To tweak the mark, edit the `` +wordmark, leaf ``, or caret `` inside `icon.svg` and +`icon-square.svg` together, then re-export. diff --git a/assets/app-icon/icon-1024.png b/assets/app-icon/icon-1024.png index 618bff5..02b69a3 100644 Binary files a/assets/app-icon/icon-1024.png and b/assets/app-icon/icon-1024.png differ diff --git a/assets/app-icon/icon-128.png b/assets/app-icon/icon-128.png index 1ba6556..53a4f59 100644 Binary files a/assets/app-icon/icon-128.png and b/assets/app-icon/icon-128.png differ diff --git a/assets/app-icon/icon-16.png b/assets/app-icon/icon-16.png index 02c8e8e..183a100 100644 Binary files a/assets/app-icon/icon-16.png and b/assets/app-icon/icon-16.png differ diff --git a/assets/app-icon/icon-256.png b/assets/app-icon/icon-256.png index 349199e..512df93 100644 Binary files a/assets/app-icon/icon-256.png and b/assets/app-icon/icon-256.png differ diff --git a/assets/app-icon/icon-32.png b/assets/app-icon/icon-32.png index 3b693b0..042f652 100644 Binary files a/assets/app-icon/icon-32.png and b/assets/app-icon/icon-32.png differ diff --git a/assets/app-icon/icon-512.png b/assets/app-icon/icon-512.png index f21fe73..cf58dd5 100644 Binary files a/assets/app-icon/icon-512.png and b/assets/app-icon/icon-512.png differ diff --git a/assets/app-icon/icon-64.png b/assets/app-icon/icon-64.png index 23bd31b..e6f9bef 100644 Binary files a/assets/app-icon/icon-64.png and b/assets/app-icon/icon-64.png differ diff --git a/assets/app-icon/icon-animated.svg b/assets/app-icon/icon-animated.svg new file mode 100644 index 0000000..3c59eb1 --- /dev/null +++ b/assets/app-icon/icon-animated.svg @@ -0,0 +1,12 @@ + + + + + diff --git a/assets/app-icon/icon-fullbleed.svg b/assets/app-icon/icon-fullbleed.svg deleted file mode 100644 index e3e5832..0000000 --- a/assets/app-icon/icon-fullbleed.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/assets/app-icon/icon-square-1024.png b/assets/app-icon/icon-square-1024.png index c0adb4b..3ef7a97 100644 Binary files a/assets/app-icon/icon-square-1024.png and b/assets/app-icon/icon-square-1024.png differ diff --git a/assets/app-icon/icon-square-256.png b/assets/app-icon/icon-square-256.png index c3c128d..aa01722 100644 Binary files a/assets/app-icon/icon-square-256.png and b/assets/app-icon/icon-square-256.png differ diff --git a/assets/app-icon/icon-square-512.png b/assets/app-icon/icon-square-512.png index 38897f8..8b0a83e 100644 Binary files a/assets/app-icon/icon-square-512.png and b/assets/app-icon/icon-square-512.png differ diff --git a/assets/app-icon/icon-square.svg b/assets/app-icon/icon-square.svg index dd3b201..fb56a39 100644 --- a/assets/app-icon/icon-square.svg +++ b/assets/app-icon/icon-square.svg @@ -1 +1 @@ - \ No newline at end of file +ıde diff --git a/assets/app-icon/icon.svg b/assets/app-icon/icon.svg index 42f4f5f..651f5fd 100644 --- a/assets/app-icon/icon.svg +++ b/assets/app-icon/icon.svg @@ -1 +1 @@ - \ No newline at end of file +ıde diff --git a/assets/mark/mark-1024.png b/assets/mark/mark-1024.png deleted file mode 100644 index fe690ac..0000000 Binary files a/assets/mark/mark-1024.png and /dev/null differ diff --git a/assets/mark/mark-128.png b/assets/mark/mark-128.png deleted file mode 100644 index 03165cc..0000000 Binary files a/assets/mark/mark-128.png and /dev/null differ diff --git a/assets/mark/mark-256.png b/assets/mark/mark-256.png deleted file mode 100644 index 57d7179..0000000 Binary files a/assets/mark/mark-256.png and /dev/null differ diff --git a/assets/mark/mark-32.png b/assets/mark/mark-32.png deleted file mode 100644 index 2930dff..0000000 Binary files a/assets/mark/mark-32.png and /dev/null differ diff --git a/assets/mark/mark-512.png b/assets/mark/mark-512.png deleted file mode 100644 index 668a17d..0000000 Binary files a/assets/mark/mark-512.png and /dev/null differ diff --git a/assets/mark/mark-64.png b/assets/mark/mark-64.png deleted file mode 100644 index 2ea40e3..0000000 Binary files a/assets/mark/mark-64.png and /dev/null differ diff --git a/assets/mark/mark-mono-512.png b/assets/mark/mark-mono-512.png deleted file mode 100644 index ff9d85d..0000000 Binary files a/assets/mark/mark-mono-512.png and /dev/null differ diff --git a/assets/mark/mark-mono.svg b/assets/mark/mark-mono.svg deleted file mode 100644 index b5cd9ce..0000000 --- a/assets/mark/mark-mono.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/assets/mark/mark.svg b/assets/mark/mark.svg deleted file mode 100644 index a3469d4..0000000 --- a/assets/mark/mark.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/assets/readme-banner.png b/assets/readme-banner.png deleted file mode 100644 index f3095dd..0000000 Binary files a/assets/readme-banner.png and /dev/null differ diff --git a/assets/screenshots/app-dark.png b/assets/screenshots/app-dark.png new file mode 100644 index 0000000..1db2813 Binary files /dev/null and b/assets/screenshots/app-dark.png differ diff --git a/assets/screenshots/app-light.png b/assets/screenshots/app-light.png new file mode 100644 index 0000000..56808c9 Binary files /dev/null and b/assets/screenshots/app-light.png differ diff --git a/assets/src-tauri-icons/128x128.png b/assets/src-tauri-icons/128x128.png index 1ba6556..e08223f 100644 Binary files a/assets/src-tauri-icons/128x128.png and b/assets/src-tauri-icons/128x128.png differ diff --git a/assets/src-tauri-icons/128x128@2x.png b/assets/src-tauri-icons/128x128@2x.png index 349199e..bd95536 100644 Binary files a/assets/src-tauri-icons/128x128@2x.png and b/assets/src-tauri-icons/128x128@2x.png differ diff --git a/assets/src-tauri-icons/32x32.png b/assets/src-tauri-icons/32x32.png index 3b693b0..4240a82 100644 Binary files a/assets/src-tauri-icons/32x32.png and b/assets/src-tauri-icons/32x32.png differ diff --git a/assets/src-tauri-icons/Square107x107Logo.png b/assets/src-tauri-icons/Square107x107Logo.png index 2df62e4..53a4e14 100644 Binary files a/assets/src-tauri-icons/Square107x107Logo.png and b/assets/src-tauri-icons/Square107x107Logo.png differ diff --git a/assets/src-tauri-icons/Square142x142Logo.png b/assets/src-tauri-icons/Square142x142Logo.png index 533dead..943c5f5 100644 Binary files a/assets/src-tauri-icons/Square142x142Logo.png and b/assets/src-tauri-icons/Square142x142Logo.png differ diff --git a/assets/src-tauri-icons/Square150x150Logo.png b/assets/src-tauri-icons/Square150x150Logo.png index 1a45695..df7523b 100644 Binary files a/assets/src-tauri-icons/Square150x150Logo.png and b/assets/src-tauri-icons/Square150x150Logo.png differ diff --git a/assets/src-tauri-icons/Square284x284Logo.png b/assets/src-tauri-icons/Square284x284Logo.png index adb43f1..5a17756 100644 Binary files a/assets/src-tauri-icons/Square284x284Logo.png and b/assets/src-tauri-icons/Square284x284Logo.png differ diff --git a/assets/src-tauri-icons/Square30x30Logo.png b/assets/src-tauri-icons/Square30x30Logo.png index 37ae368..55deff0 100644 Binary files a/assets/src-tauri-icons/Square30x30Logo.png and b/assets/src-tauri-icons/Square30x30Logo.png differ diff --git a/assets/src-tauri-icons/Square310x310Logo.png b/assets/src-tauri-icons/Square310x310Logo.png index 04df2c4..5e7d0b6 100644 Binary files a/assets/src-tauri-icons/Square310x310Logo.png and b/assets/src-tauri-icons/Square310x310Logo.png differ diff --git a/assets/src-tauri-icons/Square44x44Logo.png b/assets/src-tauri-icons/Square44x44Logo.png index 2ef9190..a404d4f 100644 Binary files a/assets/src-tauri-icons/Square44x44Logo.png and b/assets/src-tauri-icons/Square44x44Logo.png differ diff --git a/assets/src-tauri-icons/Square71x71Logo.png b/assets/src-tauri-icons/Square71x71Logo.png index c8250ba..f602d04 100644 Binary files a/assets/src-tauri-icons/Square71x71Logo.png and b/assets/src-tauri-icons/Square71x71Logo.png differ diff --git a/assets/src-tauri-icons/Square89x89Logo.png b/assets/src-tauri-icons/Square89x89Logo.png index b53ce6d..a8f0199 100644 Binary files a/assets/src-tauri-icons/Square89x89Logo.png and b/assets/src-tauri-icons/Square89x89Logo.png differ diff --git a/assets/src-tauri-icons/StoreLogo.png b/assets/src-tauri-icons/StoreLogo.png index f790d39..88585c9 100644 Binary files a/assets/src-tauri-icons/StoreLogo.png and b/assets/src-tauri-icons/StoreLogo.png differ diff --git a/assets/src-tauri-icons/icon.icns b/assets/src-tauri-icons/icon.icns index 14d69b3..4e73ab6 100644 Binary files a/assets/src-tauri-icons/icon.icns and b/assets/src-tauri-icons/icon.icns differ diff --git a/assets/src-tauri-icons/icon.ico b/assets/src-tauri-icons/icon.ico index f8db4f0..d4e9a87 100644 Binary files a/assets/src-tauri-icons/icon.ico and b/assets/src-tauri-icons/icon.ico differ diff --git a/assets/src-tauri-icons/icon.png b/assets/src-tauri-icons/icon.png index 618bff5..c29b322 100644 Binary files a/assets/src-tauri-icons/icon.png and b/assets/src-tauri-icons/icon.png differ diff --git a/design.md b/design.md index b0ed659..432bad7 100644 --- a/design.md +++ b/design.md @@ -5,39 +5,52 @@ Design notes for **ide**, a fast, lightweight, cross-platform code editor --- -## Icon — "Stagger" - -An abstract, letterless mark: **three staggered lines of code**, the top one -live in the brand blue, the rest charcoal. It reads as an editor at a glance, -stays legible down to 16px, and inverts cleanly for dark surfaces. It sits on -a light "paper" squircle so it stands out among colourful dock icons while -staying minimal. - -**Geometry** — drawn in a 100×100 box, three rounded bars: - -| Bar | x | y | w | h | radius | fill | -|--------|----|------|----|---|--------|-----------------| -| top | 27 | 32 | 46 | 9 | 4.5 | brand primary | -| middle | 27 | 48.5 | 31 | 9 | 4.5 | ink `#1e1f24` | -| bottom | 27 | 65 | 39 | 9 | 4.5 | ink `#1e1f24` | - -Tile: Apple superellipse (squircle, n≈5), white→`#eceae6` vertical gradient -with a soft top sheen and a 0.7px `rgba(20,20,25,.08)` edge. App-icon variants -inset the tile ~6% for macOS optical padding; full-bleed/web variants don't. - -### Three background forms -| File | Background | -|----------------------------|-------------------------------------| -| `app-icon/icon.svg` | Squircle tile (macOS app-icon look) | -| `mark/mark.svg` | Transparent — bare mark only | -| `app-icon/icon-square.svg` | Square gradient, runs to the edges | +## Icon — "Leaf dot + caret" + +A lowercase wordmark: **ıde**, set in Space Grotesk bold with a dotless i, +where a teal xylem-leaf shape stands in for the dot and a caret bar closes +the word. It reads as both "editor" and a nod to Gordon's personal brand in +one mark, and sits on a dark squircle tile so it holds up next to colourful +dock icons instead of competing with them. + +**Geometry** — drawn in a 512×512 box: + +| Element | Definition | fill | +|------------|-----------------------------------------------------------------------------------------------|-----------| +| tile | `rect` 512×512, `rx=115` (rounded square, ~22.5% corner radius) | `#0b1120` | +| wordmark | `text` "ıde" (U+0131 dotless i), Space Grotesk 700, size 224, x=70 y=336, letter-spacing -9 | `#e8eef6` | +| leaf dot | `path M98 106 C 124 126 124 162 98 182 C 72 162 72 126 98 106 Z` | `#22d3ee` | +| caret | `rect` 28×166, `rx=8`, x=420 y=172 | `#22d3ee` | + +The tile is a plain SVG rounded rect, not the true Apple-superellipse curve +the old mark used; that's simply what the locked design delivered. In the +live design mock the caret blinks (opacity keyframes, disabled under +`prefers-reduced-motion`). The About dialog renders the mark as inline SVG and +keeps that blink (with the same reduced-motion guard); every static asset in +this repo — favicon, app icons — uses the caret at full opacity with no +animation. + +### Two background forms +| File | Background | +|------------------------------|-----------------------------------------------------------------| +| `app-icon/icon.svg` | Rounded-square tile (macOS app-icon look) | +| `app-icon/icon-square.svg` | Same mark, square background to the edges (web/marketing use) | + +There's no bare-mark-on-transparency variant right now. The wordmark's ink +colour (`#e8eef6`) only reads correctly on the dark tile, and nothing in the +app currently needs a transparent or single-colour cutout — there's no +tray/menu-bar icon. Add one if a future use case needs it. --- ## Colour -Brand primary comes from the blog palette and is the **one accent** in the -icon. Everything else is charcoal or paper-neutral. +The table below is the blog-brand palette this file has carried since the +"Stagger" mark, and it's unrelated to the icon's own colours. Updating it is +out of scope here; the wider app-chrome token work lives in the Xylem +"Signal" design-system tokens, tracked separately. The icon itself now uses +two colours only, neither of which is a token in this table: tile `#0b1120` +and accent `#22d3ee`. | Token | Hex | Role | |-------------------------|-----------|---------------------------------------------| @@ -79,10 +92,11 @@ the app UI. ## Principles - **Austere & minimal.** One idea, one accent, no decoration. -- **Letterless.** The mark carries meaning through form, not type. +- **Legible as a wordmark.** "ıde" reads at a glance and stays legible down + to 16px; the leaf and caret carry the personality without adding noise. - **Fast & light.** It should feel weightless — same as the app. -- **Inverts cleanly.** Works on light and dark; the mono mark suits the - macOS menu-bar (tray) as a template image. +- **One tile, one accent.** The dark tile and single teal accent are meant to + hold their own in a colourful dock without extra ornamentation. ## Assets & install See `README.md` in the icon-assets pack. Quickest path: copy @@ -90,6 +104,7 @@ See `README.md` in the icon-assets pack. Quickest path: copy platform with `npm run tauri icon "app-icon/icon-1024.png"`. ## Editing -All PNGs are generated from the SVGs. To change the mark, edit the three -``s in `mark.svg` (or the glyph inside `icon.svg`) and re-export. To -change the accent, swap `#0063B2` everywhere — it appears only on the top bar. +All PNGs are generated from the SVGs in `app-icon/`. To change the mark, edit +the `` (wordmark), leaf ``, or caret `` inside `icon.svg` +and `icon-square.svg` together, then re-export. To change the accent, swap +`#22d3ee` everywhere — it appears on the leaf and the caret only. diff --git a/docs/development.md b/docs/development.md index b1094f5..6b74d76 100644 --- a/docs/development.md +++ b/docs/development.md @@ -1,5 +1,18 @@ # Development +## Requirements + +- Node.js 24 or newer +- npm 11 or newer +- Rust 1.95 or newer +- macOS, Linux, or Windows with the normal Tauri platform prerequisites + +Optional language-server tools, per language: + +- `rust-analyzer` for Rust +- `typescript-language-server` for TypeScript and React +- OmniSharp or another standalone C# LSP for C# + ## Local Run Run the desktop app from the repository root: @@ -94,6 +107,16 @@ npm run tauri:dev `run-tests.sh` runs `cargo fmt --check`, `cargo clippy --all-targets -- -D warnings`, `cargo test`, `cargo check`, and `cargo audit` when `cargo-audit` is installed. If `cargo-audit` is missing, the script prints an explicit warning so the advisory scan gap is visible. +Transitive Rust advisory warnings are reviewed and recorded in `src-tauri/.cargo/audit.toml`; a new advisory warning fails the local gate until it has been reviewed there. + +## Design Constraints + +- Avoid heavy editor/runtime dependencies. +- Keep editor and language support lazy-loaded. +- Prefer Rust-native filesystem and process work. +- Keep LSP optional and per-language. +- Do not add GitHub workflows yet. + ## Architecture The app is intentionally split into a small always-loaded shell and lazy-loaded editor pieces. @@ -146,7 +169,7 @@ The lifecycle runs in four steps: When promoting a flag to a real setting, migrate any saved override into the new setting before the flag id is pruned, so a user who opted in keeps their preference. -`gitAttribution` is the first seeded flag, a preview flag defaulting off. It reserves the id the Git attribution feature will check; no attribution behavior ships with the flag itself. +`contextMenus` is a live example: a preview flag defaulting on while its per-surface context menus round out. `gitCommit` and `gitAttribution` followed the same path and have since graduated into the Git settings category. ## Performance Notes @@ -322,3 +345,65 @@ The Codex MCP endpoint exposes equivalent read-only tools with snake_case names: Write-capable tools such as `openDiff`, `saveDocument`, or code execution should not be added until the editor has a visible review/confirmation surface for those actions. Current public Codex docs confirm Codex `/ide` consumes open files and selection context in Codex-owned IDE surfaces, that third-party tools can integrate with Codex through MCP, and that `codex app-server` is the rich-client protocol used by clients such as the Codex VS Code extension. They do not document a Claude-style third-party IDE lockfile protocol. Treat app-server support as a future integration path, not as the current editor-context bridge. + +## Capability inventory + +The running record of what's implemented, kept here as the development ledger (the README stays consumer-focused). + +Implemented: + +- Tauri 2 desktop shell with a Rust backend. +- React frontend. +- File tree with package-backed coloured file icons, keyboard expansion/opening, accessible selection/expanded state, and folder fallbacks. +- Native folder picker for switching workspaces. +- Native toolbar buttons for opening files and folders in the desktop app. +- Native File menu with New File, New Folder, Open File, Open Folder, Recents, Save, Reload, Rename/Delete, Close Tab, and Close All. +- Native categorized Settings dialog for view toggles, performance limits, search limits, and OS storage locations. +- File/folder launch targets through the local runner and macOS Finder Quick Action. +- Packaged-app file associations for common text, code, web, config, and .NET project files. +- Runtime handling for native OS file-open events, including single-process window creation/focus for launched files and folders. +- Explicit workspace loading, empty, and load-failure retry states. +- Collapsible sidebar for focused editing. +- Activity-rail navigation between Files, Search, and Source control, with a theme toggle and Settings on the rail. +- Unified workspace search with file-name and file-content scopes, visible capped-result notices, and searched/skipped file counts. +- Current-file search over loaded and unsaved editor contents, with Enter/Shift+Enter match navigation. +- Lightweight command palette for discoverable editor and workspace commands, including native file/folder open actions in the desktop app. +- Keyboard quick-open palette for opening editor-supported files by path, including arrow-key result selection and SQLite-backed candidates from indexed workspace metadata with bounded on-demand folder expansion. +- Settings Storage view that shows OS app-data paths plus live workspace-index coverage counts, so scan/cache limits are visible instead of hidden. +- IntelliJ-style keyboard file creation, tab navigation, and close commands. +- Native View menu Key Bindings dialog with searchable supported shortcuts. +- Native Search menu with Go to File, Go to Line, Find in File, and Find in Files actions. +- Native Navigate menu actions for LSP-backed Go to Definition and Find References. +- Dirty-file prompts before closing tabs or the native app window. +- Reload active files from disk, with confirmation before discarding unsaved edits. +- New-file and new-folder creation inside the current workspace. +- File and folder rename inside the current workspace. +- Confirmed file and folder deletion inside the current workspace (trash or permanent). +- Save active file and Save All commands. +- Stale-save protection so externally modified files are not silently overwritten. +- Guarded Rust-native workspace scanning, file/folder creation, rename, deletion, and file read/write commands. +- SQLite-backed workspace metadata index stored in OS app-local data, refreshed from initial scans, lazy folder loads, bounded quick-open expansion, and editor file mutations. +- Bounded initial tree scans surface a visible notice when the configured entry cap is reached, while folder expansion continues loading children on demand. +- User preferences and recents are stored in OS app data with paths exposed from Settings for backup; disposable workspace indexes stay in OS app-local data so they can be rebuilt. +- Common binary/media/font/archive files select in the tree without attempting text-editor reads. +- CodeMirror 6 editor. +- Syntax highlighting for common code and config files, including Rust, TypeScript, JavaScript, React/TSX/JSX, JSON, Markdown, shell scripts, HTML, CSS/SCSS/Sass, C#, C/C++, Java/Kotlin/Scala, Python, Go, Ruby, SQL, XML/YAML/TOML, Dockerfiles, PowerShell, diffs, and .NET project files. +- Lazy editor loading and lazy language loading for better startup performance. +- Light, dark, and follow-the-system themes with a persisted preference, a pre-paint bootstrap to avoid a wrong-theme flash, and a code-font setting for editor surfaces. +- Selective git commits from the sidebar with a tri-state changed-files tree, plus fetch/pull/push sync with live merge-conflict resolution. +- Inline git attribution in the editor and status bar, with a commit info card showing the full message, author avatar, and per-remote open actions. +- Per-surface context menus (tree, tabs, editor, search, commit panel) behind a preview flag. +- Active file, open file, and selection context stored in backend state. +- LSP process manager for Rust, TypeScript/React, and C# with status refresh after bridge events. +- LSP-backed editor keymaps from CodeMirror for definition, references, hover, rename, formatting, and signature help when the matching language server is installed. +- LSP diagnostics captured for read-only agent context, with an optional diagnostics panel for precise line/column navigation. +- Local HTTP context endpoint for terminal/browser integrations. +- Claude Code `/ide` discovery bridge with authenticated localhost WebSocket MCP and read-only editor-context tools. +- Codex-compatible read-only MCP endpoint with a persisted app-local bearer token. +- Bearer-token protection for mutating local HTTP browser API calls. + +Planned: + +- Diff review and write-capable Claude bridge tools with explicit editor UI review. +- Deeper Codex integration through `codex app-server` research once the editor has an explicit review/approval surface for rich agent workflows. +- PR-ready local polish and testing workflow. diff --git a/index.html b/index.html index a1fc55f..be681d9 100644 --- a/index.html +++ b/index.html @@ -10,9 +10,23 @@ ide