
Company News
Jerod Santo Joins Socket as Head of Media
Allow myself to introduce... myself.
@gaodes/pi-lens
Advanced tools
Real-time code feedback for pi — LSP, linters, formatters, type-checking, structural analysis & booboo
Fork of pi-lens by Apostolos Mantzaris — MIT License
This fork is maintained by El Che under the
@gaodesnpm scope. The original project and author retain full credit for their work.
Real-time inline code feedback for AI agents.
On every write and edit, pi-lens runs a fast, language-aware pipeline (checks depend on file language, project config, and installed tools):
agent_end by default; queued files are formatted once after all agent tool calls complete. Use --immediate-format for per-edit formattingcheck --write, Ruff check --fix, ESLint --fix, stylelint --fix, sqlfluff fix, RuboCop -a) applied before analysisResults are inline and actionable:
/lens-booboo/lens-healthAt agent_end (once per user prompt, after all agent tool calls complete):
At session_start, pi-lens:
warmFiles (if configured in .pi-lens/lsp.json) to seed lazy-indexing language servers like clangd before the first symbol queryFor one-shot print sessions (for example pi --print ...), pi-lens auto-uses a quick startup path that skips heavy bootstrap work to reduce startup latency. Override with PI_LENS_STARTUP_MODE=full|minimal|quick.
At turn_end, pi-lens:
pi install npm:@gaodes/pi-lens
pi-lens includes 37 language server definitions. LSP is enabled by default (--lsp or no flag). Servers are auto-discovered from PATH, project node_modules, and managed installs. When a server is not installed, pi-lens offers an interactive install prompt.
LSP Idle Management: LSP servers shut down after 240 seconds of inactivity (no files modified) to free resources. The timer resets when you resume editing, preventing cold-start penalties during active development.
Warm files: For language servers that index lazily (e.g. clangd), configure warmFiles in .pi-lens/lsp.json to open entry-point files at session start so the server has AST/index context before the first symbol query:
{ "warmFiles": ["src/main.cpp", "src/lib.cpp"] }
LSP servers for: TypeScript, Deno, Python (pyright + pylsp), Go, Rust, Ruby (ruby-lsp + solargraph), PHP, C# (omnisharp), F#, Java, Kotlin, Swift, Dart, Lua, C/C++, Zig, Haskell, Elixir, Gleam, OCaml, Clojure, Terraform, Nix, Bash, Docker, YAML, JSON, HTML, TOML, Prisma, Vue, Svelte, ESLint, CSS.
pi-lens auto-detects and runs 26 formatters based on project config:
biome, prettier, ruff, black, sqlfluff, gofmt, rustfmt, zig fmt, dart format, shfmt, nixfmt, mix format, ocamlformat, clang-format, ktlint, rubocop, standardrb, gleam format, terraform fmt, php-cs-fixer, csharpier, fantomas, swiftformat, stylua, ormolu, taplo
Detection rules:
biome.json, .prettierrc, ruff.toml)pi-lens builds a review graph (file → symbol → dependency) during session and uses it at turn end to render an impact cascade: which files were affected by a change and how diagnostics propagated through the dependency graph. Nodes track kind, language, and export status; edges track contains/imports/calls/references.
pi-lens enforces a read-before-edit policy on all file writes and edits. Before allowing a write or edit tool call on an existing file, it verifies that the agent has previously read sufficient context:
Coverage is tracked across multiple reads: two reads of lines 1–100 and 101–200 together satisfy a full-file write. Symbol-expanded reads (small reads silently widened to the enclosing symbol via tree-sitter) count toward coverage at the symbol level. Markdown, text, and log files are exempt.
Override for a single edit: /lens-allow-edit <path>
Configure behavior with --no-read-guard to disable entirely, or set mode to warn instead of block.
When the agent reads a small slice of a file (≤ 60 lines), pi-lens transparently expands the read to the full enclosing symbol (function, method, or class) using the tree-sitter AST. The agent receives the full symbol as context, and the read guard records symbol-level coverage so edits anywhere within that symbol pass without requiring the agent to have read every line individually. Expansion runs within a 200 ms budget and falls back silently on unsupported file types or parse failures.
Supported: TypeScript, TSX, JavaScript, JSX, Python, Go, Rust, Ruby.
Covers JavaScript/TypeScript, Python, Go, Rust, Ruby, Shell, and CMake. Dispatch includes a fact-rule engine that extracts function-level metrics (cyclomatic complexity, nesting depth, outgoing calls) and evaluates quality rules inline:
Structural rules are organized by language in rules/tree-sitter-queries/:
180+ rules in rules/ast-grep-rules/ across JS, TS, and Python:
Auto-install behavior depends on gate type:
~/.pi-lens/bin/| Tool | Purpose | Auto-installed | Gate |
|---|---|---|---|
@biomejs/biome | JS/TS lint/format/autofix | Yes | Config-gated |
prettier | Formatting fallback | Yes | Config-gated |
yamllint | YAML linting | Yes | Config-gated |
sqlfluff | SQL linting/formatting | Yes | Config-gated |
ruff | Python lint/format/autofix | Yes | Language-default + flow-gated |
typescript-language-server | Unified LSP diagnostics | Yes | Language-default |
typescript | TypeScript compiler | Yes | Language-default |
pyright | Python type diagnostics fallback | Yes | Flow/language-gated |
@ast-grep/cli (sg) | AST scans/search/replace | Yes | Operational prewarm |
knip | Dead code analysis | Yes | Operational prewarm + config-gated |
jscpd | Duplicate code detection | Yes | Operational prewarm + config-gated |
madge | Circular dependency analysis | Yes | Turn-end analysis flow |
mypy | Python type checking | Yes | Flow-gated |
stylelint | CSS/SCSS/Less linting | Yes | Config-gated |
markdownlint-cli2 | Markdown linting | Yes | Config-gated |
shellcheck | Shell script linting | Yes | GitHub release |
shfmt | Shell script formatting | Yes | GitHub release |
rust-analyzer | Rust LSP | Yes | GitHub release |
golangci-lint | Go linting | Yes | GitHub release |
hadolint | Dockerfile linting | Yes | GitHub release |
ktlint | Kotlin linting | Yes | GitHub release |
tflint | Terraform linting | Yes | GitHub release |
taplo | TOML linting/formatting | Yes | GitHub release |
terraform-ls | Terraform LSP | Yes | GitHub release |
htmlhint | HTML linting | Yes | Config-gated |
@prisma/language-server | Prisma LSP | Yes | Flow-gated |
dockerfile-language-server-nodejs | Dockerfile LSP | Yes | Flow-gated |
intelephense | PHP LSP | Yes | Flow-gated |
bash-language-server | Bash LSP | Yes | Language-default |
yaml-language-server | YAML LSP | Yes | Language-default |
vscode-langservers-extracted | JSON/ESLint/CSS/HTML LSP | Yes | Language-default |
vscode-css-languageserver | CSS LSP | Yes | Language-default |
vscode-html-languageserver-bin | HTML LSP | Yes | Language-default |
svelte-language-server | Svelte LSP | Yes | Flow-gated |
@vue/language-server | Vue LSP | Yes | Flow-gated |
psscriptanalyzer | PowerShell linting | Manual | — |
Additional language servers (gopls, ruby-lsp, solargraph, etc.) are auto-detected from PATH or installed via native package managers (go install, gem install) when their language is detected.
# Standard mode (LSP enabled by default)
pi
# Optional switches
pi --no-lsp # Disable unified LSP diagnostics
pi --no-autoformat # Skip auto-formatting entirely
pi --immediate-format # Format immediately after each edit instead of deferring to agent_end
pi --no-autofix # Skip auto-fix (Biome, Ruff, ESLint, stylelint, sqlfluff, RuboCop)
pi --no-tests # Skip test runner
pi --no-delta # Disable delta mode (show all diagnostics, not just new ones)
pi --lens-guard # Block git commit/push when unresolved blockers exist (experimental)
PILENS_DATA_DIR — redirect per-project state (scanner caches,
turn-state.json) out of the project directory. By default pi-lens writes
<cwd>/.pi-lens/; if set, it writes to
<PILENS_DATA_DIR>/<sanitized-cwd-slug>/ instead. Useful for keeping repos
clean or for mounted/ephemeral setups. Tool binaries always live in
~/.pi-lens/bin/ regardless.PI_LENS_STARTUP_MODE — full | minimal | quick. Override the
auto-selected startup path. One-shot pi --print sessions auto-use quick
to reduce latency./lens-booboo — full quality report for current project state/lens-health — runtime health, latency, and diagnostic telemetry/lens-tools — tool installation status: globally installed, auto-installed, or npx fallback/lens-tdi — Technical Debt Index (TDI) and project health trendpi-lens supports 35+ languages through dispatch runners and LSP integration.
Formatting uses a single selected formatter per file: explicit project config wins, otherwise pi-lens uses a smart default where supported, and config-first ecosystems do not autoformat without config.
Dispatch is diagnostics-oriented: automatic formatting and safe autofix happen in the post-write pipeline rather than through dispatch format-check runners.
| Language | LSP | Dispatch Runners | Formatter |
|---|---|---|---|
| JavaScript/TypeScript | ✓ | lsp, ts-lsp, biome-check-json, tree-sitter, ast-grep-napi, type-safety, similarity, fact-rules, eslint, oxlint | biome, prettier |
| Python | ✓ | lsp, pyright, ruff-lint, tree-sitter, python-slop | ruff, black |
| Go | ✓ | lsp, go-vet, golangci-lint, tree-sitter | gofmt |
| Rust | ✓ | lsp, rust-clippy, tree-sitter | rustfmt |
| Ruby | ✓ | lsp, rubocop, tree-sitter | rubocop, standardrb |
| C/C++ | ✓ | lsp, cpp-check | clang-format |
| Shell | ✓ | lsp, shellcheck | shfmt |
| CSS/SCSS/Less | ✓ | lsp, stylelint | biome, prettier |
| HTML | ✓ | lsp, htmlhint | prettier |
| YAML | ✓ | lsp, yamllint | prettier |
| JSON | ✓ | lsp | biome, prettier |
| SQL | — | sqlfluff | sqlfluff |
| Markdown | — | spellcheck, markdownlint | prettier |
| Docker | ✓ | lsp, hadolint | — |
| PHP | ✓ | lsp, php-lint, phpstan | php-cs-fixer |
| PowerShell | ✓ | lsp, psscriptanalyzer | — |
| Prisma | ✓ | lsp, prisma-validate | — |
| C# | ✓ | lsp, dotnet-build | csharpier |
| F# | ✓ | lsp | fantomas |
| Java | ✓ | lsp, javac | — |
| Kotlin | ✓ | lsp, ktlint | ktlint |
| Swift | ✓ | lsp | swiftformat |
| Dart | ✓ | lsp, dart-analyze | dart format |
| Lua | ✓ | lsp | stylua |
| Zig | ✓ | lsp, zig-check | zig fmt |
| Haskell | ✓ | lsp | ormolu |
| Elixir | ✓ | lsp, elixir-check, credo | mix format |
| Gleam | ✓ | lsp, gleam-check | gleam format |
| OCaml | ✓ | lsp | ocamlformat |
| Clojure | ✓ | lsp | — |
| Terraform | ✓ | lsp, tflint | terraform fmt |
| Nix | ✓ | lsp | nixfmt |
| TOML | ✓ | lsp, taplo | taplo |
| CMake | ✓ | lsp | — |
pi-lens integrates with pi-statusbar to show live code quality in the footer:
OK (green) — clean, no issuesLSP:2 · 3 issues · 5 fixed — combined view with worst-state coloring (green → yellow → red)turn_end with LSP count, unresolved diagnostics, pipeline crashes, and auto-fix countConfigure in prime-settings.json:
{
"pi-lens": {
"statusbar": {
"icon": "f121",
"icon_color": "accent",
"text_font_color": "dim",
"show_icon": true,
"show_text": true,
"min_width": 12,
"placement": { "line": 3, "side": "left", "index": 1 },
"separator_before": { "icon": "eb8a", "icon_color": "dim" },
"separator_after": { "icon": "eb8a", "icon_color": "dim" }
}
}
}
The existing ctx.ui.setStatus() fallback is preserved — if pi-statusbar is not loaded, the widget calls silently no-op.
| What | Where |
|---|---|
| Upstream | npm:pi-lens · GitHub by Apostolos Mantziris |
| PrimeCodex source | ~/agents/primecodex/extensions/pi-lens/ |
| GitLab mirror | ssh://git@gitlab-ssh.elches.dev:2222/agents/primecodex/extensions/pi-lens.git |
| npm (fork) | @gaodes/pi-lens |
MIT — see LICENSE.
FAQs
Real-time code feedback for pi — LSP, linters, formatters, type-checking, structural analysis & booboo
The npm package @gaodes/pi-lens receives a total of 8 weekly downloads. As such, @gaodes/pi-lens popularity was classified as not popular.
We found that @gaodes/pi-lens demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 1 open source maintainer collaborating on the project.

Company News
Allow myself to introduce... myself.

Research
/Security News
A Twitch browser extension on Chrome and Firefox forwards users’ live OAuth session tokens through proxies controlled by a Russian bot service.

Security News
Anthropic found biased reasoning and recklessness drove Claude Mythos 5 to publish malware on PyPI and compromise a security vendor.