Original Reddit post

Hi all, The failure mode I kept hitting with Claude Code on a large polyglot repo is that the agent’s idea of “the code is clean” depends entirely on which linters happen to be installed in that sandbox. Same repo, different machine, different verdict. And when a lint command errored on three files, those files just vanished from the output, so Claude read a partial run as a pass and moved on. So I stopped letting it shell out and wired the checker in as a plugin instead. /plugin marketplace add Goldziher/poly /plugin install poly@poly That registers poly mcp as a stdio MCP server, plus five skills and two slash commands, /poly-check and /poly-fix. The plugin does not bundle the binary, it expects poly on PATH. Here is the server listing its tools, a real recording rather than a mockup: https://raw.githubusercontent.com/Goldziher/poly/main/docs/media/agent.gif What actually changed in my sessions: Claude can no longer report a clean run it did not do. Results carry three per-file outcomes, checked, skipped and error, plus a run-level errors array. A file the linter choked on is visibly an error rather than silently missing, so “no findings” means something. Big lint reports stopped eating the context window. Every tool takes format: “toon”, which is compact enough to hand back a full report over a large directory. JSON is still there when you want to parse it. Whole-project checks do not block the turn. workspace_lint and workspace_lint_fix drive cargo clippy and friends as async Tasks that Claude polls, so a three-minute workspace pass is not three minutes of dead turn. The results say which binary answered. Every response carries version, build id and executable. If you upgrade the binary under a running session, every tool but version starts failing rather than quietly answering with the old behaviour. That one saved me a confusing hour. The two slash commands are the boring but useful part. /poly-check before I let it hand work back, /poly-fix when I want it to actually clean up. Underneath, it is a linter and formatter I wrote in Rust that covers about 30 languages in-process, so it does not matter what is installed in the sandbox. Free and MIT: https://github.com/Goldziher/poly This post is human written. AI was used to typecheck and enrich with precise data only. submitted by /u/Goldziher

Originally posted by u/Goldziher on r/ClaudeCode