From 5aaffee37bf740707091fa0d009dcdee3df29b57 Mon Sep 17 00:00:00 2001 From: sagohub Date: Sat, 14 Mar 2026 13:07:57 -0600 Subject: [PATCH] feat(vscode): update extension icon, README and package config - Add new extension icon (assets/codebook.png) - Update README with improved documentation and formatting - Simplify activationEvents to onStartupFinished - Add keywords to package.json for better discoverability --- editors/vscode/README.md | 263 +++++++++++++++++++++++++++-- editors/vscode/assets/codebook.png | Bin 0 -> 37120 bytes editors/vscode/package.json | 33 +--- 3 files changed, 254 insertions(+), 42 deletions(-) create mode 100644 editors/vscode/assets/codebook.png diff --git a/editors/vscode/README.md b/editors/vscode/README.md index a0929ec3..25300ede 100644 --- a/editors/vscode/README.md +++ b/editors/vscode/README.md @@ -1,29 +1,256 @@ -# Codebook VS Code Extension (Unreleased) +
+ +

Codebook Spell Checker

+

A fast, code-aware spell checker — built for code, not prose.

-**Note** This extension is a work in progress and is not released on the VS Code marketplace yet. However, it is functional. Follow the Development instructions to install if you'd like to provide feedback! + [![Version](https://img.shields.io/visual-studio-marketplace/v/blopker.codebook-vscode?color=blue&label=VS%20Code)](https://marketplace.visualstudio.com/items?itemName=blopker.codebook-vscode) + [![Installs](https://img.shields.io/visual-studio-marketplace/i/blopker.codebook-vscode)](https://marketplace.visualstudio.com/items?itemName=blopker.codebook-vscode) + [![Rating](https://img.shields.io/visual-studio-marketplace/r/blopker.codebook-vscode)](https://marketplace.visualstudio.com/items?itemName=blopker.codebook-vscode) + [![License](https://img.shields.io/github/license/blopker/codebook)](LICENSE) -This extension wires the Codebook language server into VS Code so code-specific -spell check diagnostics and quick fixes appear automatically. +
+ Report a Bug · + Request a Feature · + Why Codebook? +
+ +--- + +## Table of Contents + +- [Features](#features) +- [Requirements](#requirements) +- [Installation](#installation) +- [Usage](#usage) +- [Extension Settings](#extension-settings) +- [Configuration File](#configuration-file) +- [Supported Languages](#supported-languages) +- [Contributing](#contributing) + +--- ## Features -- Automatically launches `codebook-lsp` for supported languages. -- Downloads, caches, and updates the Codebook language server without requiring any manual installation. -- Supports custom binary locations and optional pre-release builds via - `codebook.*` settings. +![Codebook in action](https://github.com/blopker/codebook/blob/main/assets/example.png?raw=true) + +Codebook combines [Tree Sitter](https://tree-sitter.github.io) and [Spellbook](https://github.com/helix-editor/spellbook) into a Language Server written in Rust. It's designed to be fast and light on memory. If you need a traditional spell checker for prose, Codebook is probably not the right fit: it handles capitalization loosely by design and does not do grammar checking. + +**Code-aware checking** - Codebook only looks at the parts of your code where spelling actually matters: variable and function definitions, comments, string literals, and documentation. It knows how to split camelCase and snake_case, and suggests fixes in the same casing style. + +**Zero configuration** - install it and it works. No dictionaries to configure, no files to create. + +**Definitions only, not usages** - if a typo comes from an imported function name, Codebook won't flag it since you can't change it anyway. It only marks words at the point where you defined them, so every warning is something you can actually fix. + +**Private and offline** - everything runs locally. No file contents are ever sent anywhere. Once the dictionaries are downloaded, Codebook works without an internet connection. -## Development +**Hierarchical config** - set global defaults and override them per project. Works across workspaces. + +--- + +## Requirements + +- **VS Code** `1.80.0` or later +- **OS:** macOS (x86_64, aarch64), Linux (x86_64, aarch64), Windows (x86_64, arm64) +- No other dependencies. The `codebook-lsp` binary is downloaded and managed automatically on first activation. + +--- + +## Installation + +Install **Codebook Spell Checker** from the VS Code Marketplace: + +1. Open VS Code. +2. Open the Extensions panel (`Ctrl+Shift+X` / `Cmd+Shift+X`). +3. Search for **`Codebook Spell Checker`**. +4. Click **Install**. + +Or install from the Command Palette (`Ctrl+Shift+P` / `Cmd+Shift+P`): ``` -cd editors/vscode -bun install # or npm install / pnpm install -bun run build # or npm run build -bun run package # builds dist/ and emits a .vsix via vsce +ext install blopker.codebook-vscode ``` -The emitted JavaScript lives in `dist/` and can be loaded into VS Code via the -`Extension Tests / Run Extension` launch configuration or by using the bundled -`vsce` CLI via `bun run package`. +On first activation, Codebook downloads the `codebook-lsp` binary in the background. An internet connection is needed for this one-time step. + +--- + +## Usage + +Codebook activates automatically for all [supported languages](#supported-languages). No setup needed. + +Spelling errors are highlighted with red squiggles in: +- Variable and function names (at the point of definition) +- Comments and documentation +- String literals + +To fix an error, right-click on the highlighted word: + +| Action | Description | +|--------|-------------| +| **Add to project dictionary** | Saves the word to your project's `codebook.toml` | +| **Add to global dictionary** | Saves the word to your global Codebook config | +| **Ignore** | Dismisses the warning for this session | + +> Codebook only flags words at their *definition*. Use your language's rename/refactor tool to update all usages at once. + +--- + +## Extension Settings + +Settings can be configured in the Settings UI (`Ctrl+,`) or in `settings.json`. + +| Setting | Type | Default | Description | +|---------|------|---------|-------------| +| `codebook.binaryPath` | `string` | `""` | Path to a custom `codebook-lsp` binary. Leave empty to use the auto-managed one. | +| `codebook.enablePrerelease` | `boolean` | `false` | Use pre-release versions of `codebook-lsp`. | +| `codebook.logLevel` | `string` | `"info"` | Log verbosity: `debug`, `info`, `warn`, or `error`. | + +**Example `settings.json`:** + +```jsonc +{ + "codebook.binaryPath": "/usr/local/bin/codebook-lsp", + "codebook.enablePrerelease": false, + "codebook.logLevel": "info" +} +``` + +--- + +## Configuration File + +Codebook supports per-project and global configuration via TOML files. + +### File locations + +| Scope | Path | +|-------|------| +| **Project** | `codebook.toml` or `.codebook.toml` in the project root | +| **Global (Linux/macOS)** | `~/.config/codebook/codebook.toml` | +| **Global (Windows)** | `%APPDATA%\codebook\codebook.toml` | + +Project settings override global ones. Codebook searches up the directory tree to find the nearest project config. + +> **Tip:** If you create or rename a config file manually, reload the window (`Ctrl+Shift+P` > "Developer: Reload Window") to pick up the change. + +### All options + +```toml +# Dictionaries to use. Default: ["en_us"] +# Available: en_us, en_gb, de, de_at, de_ch, nl_nl, es, fr, it, +# pt_br, ru, sv, da, lv, vi_vn, pl, uk +dictionaries = ["en_us", "en_gb"] + +# Words to always allow (case-insensitive). Codebook adds words here +# when you select "Add to project dictionary". +words = ["codebook", "rustc"] + +# Words that should always be flagged as incorrect. +flag_words = ["todo", "fixme"] + +# Only spell-check files matching these glob patterns (allowlist). +# Default: [] (check everything) +include_paths = ["src/**/*.rs", "lib/**/*.rs"] + +# Skip files matching these glob patterns (blocklist). +# Takes precedence over include_paths. +ignore_paths = ["target/**/*", "**/*.json", ".git/**/*"] + +# Regex patterns — tokens within matches are skipped. +# Use single quotes to avoid backslash escaping. +ignore_patterns = [ + '\b[ATCG]+\b', # DNA sequences + '\d{3}-\d{2}-\d{4}', # Social Security Numbers +] + +# Minimum word length to check. Default: 3 +min_word_length = 3 + +# Set to false to ignore the global config for this project. +# Default: true +use_global = true +``` + +### Precedence + +1. Project config overrides global config +2. If `use_global = false`, the global config is ignored entirely for that project +3. If no project config exists, the global config applies +4. If neither exists, defaults are used + +### How words are saved + +- **Add to dictionary** saves to the project config +- **Add to global dictionary** saves to the global config +- Changes are written automatically and reloaded without a restart + +### User-defined regex patterns + +Use `ignore_patterns` to skip tokens that match a custom regex. Some things to know: + +**Built-in patterns** - these are already ignored by default: + +| Pattern | Matches | +|---------|---------| +| `https?://[^\s]+` | URLs | +| `#[0-9a-fA-F]{3,8}` | Hex colors (`#deadbeef`, `#fff`) | +| `[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}` | Email addresses | +| `/[^\s]*` and `[A-Za-z]:\\[^\s]*` | Unix and Windows file paths | +| `[0-9a-fA-F]{8}-...-[0-9a-fA-F]{12}` | UUIDs | +| `[A-Za-z0-9+/]{20,}={0,2}` | Base64 strings (20+ chars) | +| `\b[0-9a-fA-F]{7,40}\b` | Git commit hashes | +| `\[([^\]]+)\]\(([^)]+)\)` | Markdown link targets | + +**How matching works:** + +- Patterns run against the full source text; any token inside a match is skipped +- Multiline mode is on: `^` and `$` match line boundaries +- Use single-quoted TOML strings to avoid double-escaping backslashes + +```toml +ignore_patterns = [ + '\b[ATCG]+\b', # DNA sequences + '^vim\..*', # Lines starting with vim. + '^\s*//.*', # Full-line // comments +] +``` + +--- + +## Supported Languages + +> For the most up-to-date status, see the [main repository](https://github.com/blopker/codebook). + +| Language | Status | | Language | Status | +|----------|--------|-|----------|--------| +| C | ✅ Stable | | Markdown | ✅ Stable | +| C# | ⚠️ Needs testing | | Odin | ✅ Stable | +| C++ | ⚠️ Needs testing | | PHP | ⚠️ Needs testing | +| CSS | ⚠️ Needs testing | | Plain Text | ✅ Stable | +| Elixir | ⚠️ Needs testing | | Python | ✅ Stable | +| Erlang | ⚠️ Needs testing | | Ruby | ✅ Stable | +| Go | ✅ Stable | | Rust | ✅ Stable | +| Haskell | ⚠️ Needs testing | | Swift | ⚠️ Needs testing | +| HTML | ⚠️ Needs testing | | TOML | ✅ Stable | +| Java | ✅ Stable | | TypeScript | ✅ Stable | +| JavaScript | ✅ Stable | | Typst | ⚠️ Needs testing | +| LaTeX | ⚠️ Needs testing | | VHDL | ⚠️ Needs testing | +| Lua | ✅ Stable | | YAML | ⚠️ Needs testing | +| | | | Zig | ✅ Stable | + +**✅ Stable** - fully tested. +**⚠️ Needs testing** - works in basic cases, but needs real-world validation. If you use one of these, [open an issue](https://github.com/blopker/codebook/issues) to share what you find. + +--- + +## Contributing + +Contributions are welcome. To get started: + +1. Fork the repository on GitHub. +2. Clone your fork: `git clone https://github.com/YOUR_USER/codebook` +3. Install dependencies: `npm install` (extension) and `cargo build` (LSP server) +4. Open the project in VS Code and press `F5` to launch the Extension Development Host. +5. Submit a pull request with a description of your change. -Set `codebook.logLevel` to `debug` to see verbose logs from the language server -inside the `Codebook` output channel. +If you use a language marked ⚠️, the most useful thing you can do is test it and report what you find. diff --git a/editors/vscode/assets/codebook.png b/editors/vscode/assets/codebook.png new file mode 100644 index 0000000000000000000000000000000000000000..bc915029f59b9de435e25a6fb75b789ec1445de4 GIT binary patch literal 37120 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πHSf#l0hS=T{E(Bvyfjs%h?=Lct&;S;kh< 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 M07*qoM6N<$g2xg|ga7~l literal 0 HcmV?d00001 diff --git a/editors/vscode/package.json b/editors/vscode/package.json index f975f9d0..1d20ad7b 100644 --- a/editors/vscode/package.json +++ b/editors/vscode/package.json @@ -2,8 +2,9 @@ "name": "codebook-vscode", "displayName": "Codebook Spell Checker", "description": "A fast, code-aware spell checker.", - "version": "0.0.1", + "icon": "assets/codebook.png", "publisher": "blopker", + "version": "0.0.1", "license": "MIT", "repository": { "type": "git", @@ -20,33 +21,17 @@ "Linters", "Other" ], + "keywords": [ + "spell", + "checker", + "spelling", + "spellchecker" + ], "extensionKind": [ "workspace" ], "activationEvents": [ - "onLanguage:c", - "onLanguage:cpp", - "onLanguage:css", - "onLanguage:elixir", - "onLanguage:go", - "onLanguage:html", - "onLanguage:haskell", - "onLanguage:java", - "onLanguage:javascript", - "onLanguage:latex", - "onLanguage:lua", - "onLanguage:markdown", - "onLanguage:php", - "onLanguage:plaintext", - "onLanguage:python", - "onLanguage:ruby", - "onLanguage:rust", - "onLanguage:toml", - "onLanguage:typescript", - "onLanguage:typst", - "onLanguage:yaml", - "onLanguage:zig", - "onLanguage:csharp" + "onStartupFinished" ], "main": "./dist/extension.js", "scripts": {