UNPKG

clangd-query

Version:

Fast C++ code intelligence CLI tool for humans and AI agents. Provides semantic search, source code reading and usage lookups.

281 lines (203 loc) 9.12 kB
# clangd-query Fast C++ code intelligence CLI tool that provides instant access to semantic code navigation features through a persistent daemon architecture. `clangd-query` leverages the clangd language server to provide IDE-quality code intelligence on the command line. Perfect for exploring large C++ codebases, integrating with scripts, or building development tools. ## Features - **Fast Startup**: Daemon architecture maintains warm clangd instance - **Semantic Search**: Find symbols by name with fuzzy matching - **Source Viewing**: View complete implementations of any symbol - **Jump to Definition**: Navigate to symbol definitions - **Find References**: Locate all usages of a symbol - **Class Hierarchy**: View complete inheritance trees with base and derived classes - **Function Signatures**: Display detailed function/method signatures with documentation - **Public Interface**: Show only public API of classes for quick reference - **Smart Output**: Human and AI-agent friendly formatting ## Installation ### From npm (coming soon) ```bash npm install -g clangd-query ``` ### From source 1. Clone this repository 2. Make sure you have Node.js v18+ installed 3. Install dependencies: ```bash npm install ``` 4. Build the TypeScript code: ```bash npm run build ``` 5. Link the command globally: ```bash npm link ``` ## Prerequisites - `clangd` must be installed on your system (or you can specify a custom path) - Your C++ project must have a `compile_commands.json` file (generated by CMake with `-DCMAKE_EXPORT_COMPILE_COMMANDS=ON`) ## Usage ### Basic Commands ```bash # Search for symbols clangd-query search Scene clangd-query search "LoadResources" --limit 10 # View complete source code clangd-query view SceneManager clangd-query view "View::SetSize" # Find all references clangd-query usages Scene::StartScene clangd-query usages include/widget.h:100:8 # Show class hierarchy clangd-query hierarchy Scene clangd-query hierarchy View # Show function signatures clangd-query signature SetTitleForState clangd-query signature View::SetSize # Show public interface of a class clangd-query interface ResourceManager clangd-query interface View # Check daemon status clangd-query status # Stop the daemon clangd-query shutdown ``` ### Options - `--limit <n>` - Limit search results (default: 20) - `--timeout <seconds>` - Set request timeout (default: 30) - `--help` - Show help for command ### How It Works 1. **First Run**: Automatically starts a background daemon for your project 2. **Daemon Process**: Maintains persistent clangd instance with warm index 3. **Fast Queries**: Subsequent queries are near-instantaneous 4. **Auto-Cleanup**: Daemon shuts down after 30 minutes of inactivity ### Architecture ``` ┌─────────────┐ JSON-RPC ┌──────────────┐ │clangd-query ├──────────────────────►│clangd-daemon │ │ (client) │◄──────────────────────┤ (server) │ └─────────────┘ Unix Socket └──────┬───────┘ │ ▼ ┌──────────┐ │ clangd │ │ LSP │ └──────────┘ ``` ### Project Detection The tool automatically detects your C++ project by looking for `CMakeLists.txt` in parent directories. Run commands from anywhere within your project tree. ### Environment Variables - `CLANGD_DAEMON_TIMEOUT` - Idle timeout in seconds (default: 1800) - `CLANGD_PATH` - Path to clangd executable (defaults to system `clangd`) ## Examples ### Finding and Viewing Code ```bash # Find all scene-related classes $ clangd-query search Scene Found 12 symbols matching "Scene": - `class Scene` at clients/flare/src/base/scene.h:45:7 - `class SceneManager` at clients/flare/src/base/scenemanager.cc:18:6 - `class ModalScene` at clients/src/phoenix2/scenes/modalscene.h:12:8 ... # View the SceneManager implementation $ clangd-query view SceneManager Found class 'SceneManager' at clients/flare/src/base/scenemanager.cc:18:6 ```cpp class SceneManager { public: SceneManager() : active_scene_(nullptr) { // ... full implementation ... } // ... complete class shown ... }; ``` ### Navigating Code ```bash # Find all usages of a class $ clangd-query usages Scene Found 23 references to 'Scene': - clients/src/phoenix2/game.cpp:15:8 - clients/src/phoenix2/scenes/menuscene.cc:34:12 ... ``` ### Viewing Class Hierarchies ```bash # Show inheritance hierarchy for a class $ clangd-query hierarchy Scene Inherits from: ├── MouseInputHandling - clients/flare/include/flare/base/ui/mouse.h:37 ├── KeyboardStateDelegate - clients/flare/include/flare/base/ui/keyboard.h:209 ├── TouchInputHandling - clients/flare/include/flare/base/ui/touch.h:59 ├── ControllerInputHandling - clients/flare/include/flare/base/ui/controller.h:48 └── KeyboardInputHandling - clients/flare/include/flare/base/ui/keyboard.h:166 Scene - clients/flare/include/flare/base/scene.h:237 ├── InterfaceScene - clients/src/phoenix2/scenes/interfacescene.h:60 │ ├── MenuScene - clients/src/phoenix2/scenes/menuscene.h:180 │ ├── SettingsScene - clients/src/phoenix2/scenes/settingsscene.h:102 │ └── LoginScene - clients/src/phoenix2/scenes/loginscene.h:100 ├── GameScene - clients/src/phoenix2/scenes/gamescene.h:264 ├── AccountScene - clients/src/phoenix2/scenes/accountscene.h:109 └── RootScene - clients/src/phoenix2/scenes/rootscene.h:140 ``` ### Function Signatures with Documentation ```bash # Show all signatures for a function/method $ clangd-query signature LoadResources LoadResources - clients/flare/include/flare/base/scene.h:273:16 public: virtual void LoadResources(ResourceManager* manager) Return Type: void Parameters: - manager: ResourceManager* - The resource manager instance Description: Load all resources that this scene will use. This method is called on the resource manager's dispatch queue before the scene starts. Override this to load your scene-specific resources. Modifiers: virtual ──────────────────────────────────────────────────────────────────────────────── LoadResources - clients/src/phoenix2/scenes/gamescene.h:287:8 protected: virtual void LoadResources(ResourceManager* manager) override Return Type: void Parameters: - manager: ResourceManager* - The resource manager for loading resources Modifiers: virtual, override ``` ## Troubleshooting ### Daemon Issues If the daemon crashes or becomes unresponsive: ```bash # Check status clangd-query status # Force shutdown and restart clangd-query shutdown clangd-query search test # Will auto-restart daemon ``` ## Debugging and logging Use the --debug flag when issuing a command to get the debug output directly before the output of the command itself. Useful for quick checks on result. To view the last logs from the daemon, use the `logs` command with the optional `--limit X` parameter. ```bash clangd-query logs ``` ### First Run Slowness The first query in a project may take longer as clangd indexes your codebase. Subsequent queries will be fast. You can check indexing status with: ```bash clangd-query status ``` ### Lock Files The daemon uses lock files at `<project-root>/.clangd-query.lock`. These are automatically cleaned up but can be manually removed if needed. ### Compilation Database The tool will build a `compile_commands.json` from the `CMakeLists.txt`, which must be in the project root. This is used by clangd to index the codebase. ## Technical Details - **Compilation Database**: Cached in `.cache/clangd-query/build/compile_commands.json` - **Index Location**: `.cache/clangd-query/build/.cache/clangd/index/` - **Socket Location**: System temp directory - **Log Files**: System temp directory ## Requirements - Node.js 18 or higher - clangd 12 or higher (15+ recommended for full feature support) - CMake-based C++ project (for automatic compile_commands.json generation) ## License MIT License - see [LICENSE](LICENSE) file for details. ## Contributing Contributions are welcome! Please feel free to submit issues and pull requests. ## Acknowledgments Built on top of the excellent [clangd](https://clangd.llvm.org/) language server.