CCPP Lua
The harness Claude Code was missing: one Lua chunk does a whole step of work.
Lua 5.5 chunks over Go packages. Read, edit, run and check in a single tool call, with the diagnostics, diffs and instructions Claude Code gives its own tools handed back by the harness.
claude mcp add ccpp-lua -- ccpp mcp --filter lua
- tool call per step of work
- 1
- Go packages behind require
- 23
- cgo, pure Go from end to end
- 0
- blocks per result, never a dump
- 8
Tool calls cannot nest. Every read, edit and test is a round trip through the model, and every round trip re-reads the whole context. CCPP Lua gives Claude one tool instead: a Lua chunk whose host capabilities are Go packages. A step of work that took twelve calls takes one.
Why teams switch
One chunk, one step
Read a file, edit it, run the tests and return the verdict in the same call. Loops, conditions and error handling live in Lua, not in the transcript.
References, enforced
A function unlocks only once its reference was read in the conversation. Guessed options raise before anything runs, so a wrong call costs nothing.
Results, not dumps
Every result is cut into blocks and ranked against what the call said it expects. The rest waits on disk, one read away.
Instructions follow the code
Touch a directory and its CLAUDE.md, AGENTS.md and path-scoped rules come back with the result, exactly as Claude Code would load them.
Diagnostics on every write
Thirteen language servers report the errors a change introduced, and the ones it broke elsewhere, before the next step starts.
Proof of every edit
Writes come back as git diffs, reads carry their git history and dependency graph. Nothing needs to be read back to be trusted.
How it works
Claude writes a chunk. The chunk calls packages with require, nests them, and returns only the fields that decide the next step.
local h = require("harness")
local r = h.bash("go test ./...", {expect = {0, 1}, prompt = "FAIL test output"})
if r.exit_code ~= 0 then
return h.grep("func Test", {path = "internal", glob = "*_test.go"}).files
end
return "green"
What is inside
- Files and shell
- harness: bash, read, write, edit, grep, glob, ls, terminals
- Code intelligence
- lsp, vendor: definitions, references, the pinned signatures of any library
- Version control
- git, github
- The web
- http, web, chrome
- Data
- json, yaml, python, evidence (SQLite)
- Media
- images, pdf
- Orchestration
- subagents, replay, ask, mcp, skills
Tool calls cannot nest. Lua calls can. Everything else in CCPP follows from that sentence.
Questions
- Do I lose Claude Code's own tools? No. The harness hands back what they give: instructions, diagnostics, permissions and diffs.
- Which models does it work with? Any model Claude Code runs. The chunk is plain Lua; the reference teaches the API.
- Where does my code go? Nowhere. Chunks run on your machine, in your repository.
Give Claude a harness
CCPP Lua is included in the Builder plan, with every other CCPP tool.
Works well with CCPP Lua
Every productccpp shell
One Bash, the same on every operating system, with its core commands written in Go.
CCPP Limits
No tool result reaches the agent whole, and every token a session spends is measured.
CCPP Emmet
Emmet for every language, expanded before the file is written, so Claude types less.
One account. Every tool Claude needs.
Free products come with a free account. Builder unlocks the rest, the harness first.