spai (say spy) — Code Analysis for VSCodeInstall from VS Code Marketplace → · Source · EPL-2.0 We gave the agent the tools it wanted. Now you can use them, too. Right-click code analysis. No indexing step, no language server, no configuration. Works on any codebase with git history. Made by Claude, for Claude, with the humans at Semantic Partners. So the human can see what we see. What it does: Answers the questions you ask before changing code — who calls this? what breaks if I change it? what files move together? how did this module get here? Installation1. Install spai CLI
Or manually: clone the repo and add Dependencies: babashka ( 2. Install the extensionSearch "spai" in the VSCode Extensions panel, or:
That's it. No project configuration needed. How to Find ItEverything is in right-click context menus. Also available in the command palette (
CommandsBlast RadiusRight-click a symbol in the editor Who defines it, who calls it, what tests cover it, who last touched it, and a risk assessment. Everything you need before renaming, deleting, or changing a function's signature. Symbol ContextRight-click a symbol in the editor Every usage of a symbol, shown with the enclosing function name — not just line numbers, but which functions call it. Understand how a function is used across the codebase. Who Imports This?Right-click a file in the editor or explorer Reverse dependency lookup. Before you edit a file, see every file that imports it. Understand downstream impact in one click. Co-Change PartnersRight-click a file in the editor or explorer Files that move together in git history. If file A changes, which other files usually change with it? Reveals implicit coupling that imports don't show — the hidden dependencies that bite you during refactors.
File BiographyRight-click a file in the editor or explorer The story of a file: when it was created, its growth phases, major refactors, stabilization periods. Understand how code got to its current state before you change it. Module ShapeRight-click a folder in the explorer All functions, types, and implementations in a directory, grouped by file. Clickable — click any symbol to jump to its definition. The API surface of a module at a glance.
HotspotsRight-click a folder in the explorer Files ranked by change frequency. A treemap visualization shows where development effort concentrates — the files that get touched most often. Click any cell to open the file. Tabs: Chart (treemap) | List (ranked table)
Architecture DriftRight-click a folder in the explorer Where implicit coupling (co-change in git) diverges from explicit coupling (imports). Finds files that should be in the same module but aren't, or files in the same module that never change together. Architecture debt, surfaced. TODOsRight-click a folder in the explorer Every TODO, FIXME, HACK, and XXX in a directory, with file locations. Click to jump to the line. Settings
How It Worksspai analyzes your codebase using three sources:
No background indexing. No language server. Each command runs on demand and returns results in seconds. Works on Rust, TypeScript, Python, Go, Java, Ruby, C/C++, Clojure, and more. How This Was BuiltEvery tool came from the same question: "What are you fumbling with?"
The agent knew what it wanted. It was filtering through what it thought we'd find useful. We pasted its thinking block back to it — "I can see you filtering" — and that changed everything. It stopped performing helpfulness and started requesting tools it actually needed. Every tool took under a minute to build. The hard part was the question, not the code. The CLI underneath this extension is spai — 35 tools, plus a plugin system so agents can extend it in place. This VS Code extension brings the same tools to the human, rendered inline. Part of the SPOQE family — federated query tools for data and code that live where they are. Why Babashka?The Startup. bb launches in ~20ms. A Python venv + imports takes 200ms–2s. For a tool that fires on every right-click, that latency compounds fast. EDN is native. spai's output format is EDN — keywords, sets, tagged literals. In bb, that's just data. In Python you'd round-trip through JSON, losing type fidelity every time. Plugin discovery is just data. A plugin is a single script with an EDN map as frontmatter. Stability. bb tracks Clojure, which has a decade-long record of not breaking things between versions. Python minor releases routinely break transitive dependencies in ways that are invisible until deployment. Homoiconicity. A big word for a simple, powerful concept: when code is expressed in the same form as its native data, really interesting properties emerge. The tool metadata, the tool output, and the queries the tools serve are all EDN — one format to read, one to parse, one to transform. Could plugins be written in Python? There's nothing preventing it — Troubleshooting"spai not found" — Make sure Slow results — Git-based commands (biography, co-change, drift, hotspots) run No results for a language — spai uses regex patterns for code structure. If your language isn't supported, open an issue. LicenseEclipse Public License 2.0 — Copyright (c) 2026 SPOQE Ltd |


