codesight
A command-line tool that reads a repository once and writes it back out as a handful of small markdown files — routes, schema, components, env vars, dependency graph — so a coding agent can start from a map instead of exploring the code itself.

What it is
codesight is a zero-dependency command-line tool that scans a project and writes what it finds into .codesight/ as structured markdown: one combined context map, plus a file each for routes, schema, components, libraries, env vars, middleware and the dependency graph, plus files for CI/CD, git hooks and Claude Code skills. The claim is about tokens, and install is npx codesight. Eight detectors run in parallel and the result is sized for one file load, so Claude Code, Cursor, Copilot, Codex, Windsurf, Cline and anything else that reads markdown starts from the project’s shape rather than discovering it with glob and grep. Around that core sit a wiki mode that splits the map into articles, a knowledge mode for a folder of notes, an MCP server with fourteen tools and per-session caching, a blast-radius query over the import graph, and --init, which writes CLAUDE.md, .cursorrules, .github/copilot-instructions.md, codex.md and AGENTS.md. Every savings figure is the project’s own, from benchmarks on three SaaS projects and a longer table covering the supported languages.
Who built itThe account that owns the repository, Houseofmvps, accounts for 93 of its 190 commits, recorded under two git names — 79 as Houseofmvps and 14 as Kailesk Khumar. The README names him as the founder of HouseofMVPs and Kailxlabs, with links to an X handle, a LinkedIn profile and both company sites, and package.json gives the same name with an address at houseofmvps.com and kailxlabs.co as his page. aguerlain-lr contributed 14 commits, Fyb3roptik six and the-wondersmith five, with thirteen further accounts appearing in the contributor list. The README also points at two earlier projects from the same account: a set of expert skills for Claude Code and an SEO plugin for it.
How it is put together
The parts · 6The shape is one core with three faces. The core is a scan: eight detectors run in parallel over a file list produced by a scanner that honours gitignore-style rules, and the result is formatted into markdown sized for a single load. The faces are a command line, an MCP server that exposes fourteen tools over the same scan with results cached per session, and generated instruction files for five tools. Two things hold it together. The first is a hard budget on dependencies: package.json has no dependencies block at all, only four development dependencies, and the AST precision the project advertises is borrowed rather than installed — it loads the TypeScript compiler out of the project being scanned, which is why the comparison table lists dependencies as “Zero (borrows TS from your project)”. The second is that precision is per language and only pays for itself in TypeScript: everything else goes through regex, which is what makes the WebAssembly plugin ABI a separate, opt-in, byte-identical-when-unset layer rather than a change to the default path.
- src/detectors/
- The centre of the repository: seventeen files and 232 KB, one per kind of thing worth extracting.
routes.tsis 66,355 bytes on its own andschema.ts41,770, followed by knowledge at 22,397, the dependency graph at 15,780, components at 15,468 and GraphQL at 11,357; openapi, config, libraries, middleware, events, contracts, blast radius, tokens, route tags and coverage fill out the rest. - src/ast/
- Fifteen files and 149 KB of extractors, one per language or concern: Python at 25,706 bytes, routes at 17,220, Go at 15,742, schemas at 11,790, BrightScript at 10,110, C# at 8,705, Android at 8,271, PHP at 8,113, then components, Dart, SceneGraph, Swift and BrighterScript.
loader.tsis the seam that reaches into the scanned project for TypeScript;native-loader.ts, 13,933 bytes, is the seam to the WebAssembly plugins. - src/ at the top level
- The spine:
scanner.tsat 53,432 bytes, the largest file in the repository;index.tsat 29,191 for the command line;mcp-server.tsat 27,351;formatter.tsat 25,548;eval.tsat 11,173;telemetry.tsat 11,132; andcore.ts,types.tsandconfig.tsunderneath them. - src/generators/ and src/monorepo/
- The output layer.
wiki.tsat 31,664 bytes is the largest generator and turns one map into a directory of articles;ai-config.tsat 17,156 writes the five instruction files and the per-tool profiles;html-report.tsat 11,074 produces the dashboard. The monorepo half — discover, orchestrator, deps and watch — is small beside it, 17 KB across four files, and exists because of what one user reported about his own repository. - src/plugins/, plugins/ast/ and reference/ast-plugin/
- Four first-party plugin trees — CI/CD, git hooks, Claude Code skills and Terraform — at 22 files and 91 KB, with the Terraform HCL parser at 14,263 bytes and the CI/CD YAML parser at 12,197. Then three native-AST plugins written in Rust and Go, whose Python parser at 20,743 bytes is the largest single source file outside the JavaScript tree, and an AssemblyScript reference plugin built to a 4,385-byte module with a checksums file beside it.
- tests/, eval/, .codesight/ and .github/workflows/
- The apparatus. One test file is 67,157 bytes of the 141 KB under tests;
eval/holds five fixtures, each a repository description paired with expected results;.codesight/is the committed self-scan. Four workflows include a 6,898-byte pipeline that builds, shrinks and smoke-tests the WebAssembly plugins and publishes them as release assets, and the 1,822-byte one that keeps the context map current.
Choices, and what they beat
Borrow the TypeScript compiler instead of depending on it over shipping TypeScript as a runtime dependency
The comparison table lists the project’s dependencies as “Zero (borrows TS from your project)”, and the README says AST detection starts automatically when TypeScript is present in the scanned project’s
node_modules, across npm, yarn and pnpm including strict mode.package.jsoncarries nodependenciesblock whatsoever. The precision that gives the tool its edge is therefore rented from the codebase being read rather than paid for by everyone who installs it, and the price is that the edge applies to one language.Regex for the other languages, with AST as an opt-in plugin layer over expanding the built-in AST extractors to every language
The pull request that introduced the machinery states the problem in its own motivation: the project’s edge is AST-precise context cheaply, but that precision is TypeScript-only because it is powered by the project’s own compiler, while every other supported language falls back to regex. The host was deliberately scope-limited, and the machinery is off unless asked for, so that without opt-in the behaviour is byte-identical to before and the zero-runtime-dependency status holds.
Ship no plugins inside the npm package over bundling the extractors with the tool
The README states it plainly: the package ships no plugins, and they are separate, opt-in artifacts. The project publishes prebuilt Rust, Python and Go plugins as checksummed release assets to be dropped into
~/.codesight/plugins/, and the pull request that added them notes that the pipeline publishes the modules and their checksums on plugin tags while the npm package neither builds nor ships them.Terraform off by default while CI/CD and git hooks are on over loading every first-party plugin automatically
The README gives the reason in a sentence: Terraform deliberately reaches outside the scanned directory into sibling repositories such as
../infrastructure, and is most useful when given an explicit service name, so it stays off until asked for. The other three plugins are described as inert until their target files exist, because they only scan the dotfile directories the main pass skips, and each can be switched off per project in the configuration file.Compile the wiki from the AST rather than with a model over asking an LLM to write the documentation
The README says the wiki is inspired by a published LLM-wiki pattern but compiled from AST instead, which is why it makes zero API calls and finishes in 200 milliseconds, and the generated index repeats that in its own header. The stated advantage is that the tool already knows the routes, the schema, the blast radius and the middleware from the AST, so no model is needed to extract code structure and the wiki is a narrative layer over data the codebase already contains.
A floor and a worst case in the evaluation, not an average over reporting the aggregate score
A user running the bundled evaluation found an aggregate of 87.0% average F1 while two of five fixtures produced route lists that were almost entirely wrong, because averaging across categories let perfect scores on models, env vars and components mask zero on routes. The fix prints the minimum F1 beside the average, adds an explicit callout for any category with no true positives and false positives above zero, and exits non-zero when any category on any fixture falls below a 50% floor.
Read fromREADME.md (51,832 bytes, fetched from the repository), docs/wasm-plugins.md (20,007 bytes), eval/README.md, package.json, .github/workflows/codesight.yml, the committed self-scan in .codesight/CODESIGHT.md (20,893 bytes) with .codesight/routes.md and .codesight/wiki/index.md, the wiki overview reproduced inside the recon report, and the complete 438-file tree with sizes.
Build log
6 stages- 01
Five months, 190 commits, and no releases at all
The repository was created on 2026-04-04, and its oldest commit, the same day, already carries a version: “v1.0.0: codesight — see your codebase clearly”. The monthly shape is steep then flat — 149 commits in April, 12 in May, 22 in June, 7 in July — and the newest commit is dated 2026-07-27, message “chore: update AI context map [skip ci]”. Between that date and October 2026 no commits land at all, though issues keep arriving: one on 2026-08-13 about FastAPI router prefixes, a pull request on 2026-09-08 about Slack’s reserved mention keywords. That gap is why this record is filed maintained rather than active. The version has to be assembled by hand, because the repository has neither releases nor tags — nothing marks one except commit messages, npm publishes and replies to issues. Versions named in the material run from that v1.0.0 to v1.19.0, which
package.jsoncarries and the maintainer cites while closing four bug reports on 2026-07-27; the README’s section headings are pinned to v1.6.2, v1.6.4, v1.6.7 and v1.9.3. Around it sit 1,410 stars, 123 forks, 6 watchers, 3 open issues, thirty issues and pull requests in total, and fifteen contributing accounts. The README banner claims 4,000+ downloads and 149 tests, and its first line states the proposition: AST precision, 30+ framework detectors, 14 ORM parsers, 14 MCP tools, onenpxcall. - 02
What the output is, and the repository that eats it
A normal scan writes
.codesight/CODESIGHT.mdplus one file per detector, three of which are built-in plugins reading the dotfile directories the main pass skips —.github/workflows,.circleci,.huskyand.claude/. The project commits its own map, so the artifact reads as shipped:CODESIGHT.mdat 20,893 bytes,libs.mdat 12,996,graph.mdat 2,936, plus files for routes, config, events, CI/CD, coverage, middleware and awiki/directory of ten more. A GitHub Actions workflow runsnpx codesight@latest --wikion every push and commits whatever changed ascodesight-botunder a fixed message,chore: update AI context map [skip ci]; that account holds 54 of the 190 commits, just over a quarter of the history. On pull requests the same workflow posts the first fifty lines ofCODESIGHT.mdas a comment. The self-scan is candid about what it cannot see: the map reports the stack asraw-http | none | unknown | typescript, 0 models and 0 components, 68 library files and 60% test coverage, and four routes a repository with no server does not have —ALL /path,ALL /api,ALL /healthandGET /api/users, every one tagged[inferred], the marker the generated wiki index itself calls regex detection that may have lower precision. The same wiki lists required env vars whose names live in the repository’s test fixtures and in its own detector pattern tables. - 03
The token numbers are the project measuring itself
Every savings figure in the README is the project’s own, and the README says how. Output tokens are measured from actual file size at four characters per token. Exploration tokens are estimated from what was extracted — routes × 400, models × 300, components × 250, hot files × 150, env vars × 30, times a 1.3 multiplier for revisiting files, minus the output size — which the README calls conservative. On three production SaaS projects: 46,020 of manual exploration against a 3,936-token map (11.7x), 26,130 against 3,629 (7.2x) and 47,450 against 4,162 (11.4x), for a self-reported average combined reduction of 91x once the wiki is read instead of the map. A second table runs the same measurement across open-source codebases in every supported language, from a 7,509-file Next.js workspace at about 9x to a 47-file Spring Boot project at about 41x, and the comparison table claims 7x to 12x for the base scan and 60x to 131x with targeted wiki queries. A footnote records a developer checking Claude Code at 40–70K tokens on the same projects. Two outside numbers sit against it. Issue #31 is a user whose monorepo produced ~221,169 tokens, which became the hierarchical monorepo mode in v1.12.4. Issue #54 is a user running the bundled evaluation, who found the aggregate reported as 87.0% average F1 while two of five fixtures emitted eleven and ten routes with almost none right.
- 04
The community rounds, and what each one changed
Most of the feature surface arrived as outside pull requests.
Fyb3roptikfiled and fixed the one that matters most outside web work: the tool reported a Go project as TypeScript, then added arepoTypefield separating single projects, monorepos, microservices and meta-repositories, then brought Roku in — BrightScript, BrighterScript and SceneGraph, anchored on the plain-textmanifestfile Roku itself uses, with three new extractors and all eight detectors taught to map screens onto routes and interface contracts onto models.aguerlain-lrreported 221,169 tokens of output and then wrote the hierarchical mode that scans each workspace package on its own, merged as v1.12.4.vakuorreported that dot-folders could not be scanned and that.codesightignoretreated negations unlike.gitignore; both were fixed — the first as v1.14.0, the second in commit0bedd0d, where a negation now matches the exact entry name or relative path only.optimalcharbadded Celery as an events framework, and the maintainer moved it out of the Routes row of the README into a new Events row before merging, because a task queue is not a routing framework.neilwasherecontributed the skills and git hooks plugins and a Terraform plugin that was closed as already superseded by them.the-wondersmithcontributed the five-pull-request stack that turned AST extraction into a plugin system. - 05
One day, four bug reports, one release
The clearest window on how the project is run is 2026-07-27, when four reports from one user,
jonathanjie, were all closed as fixed in v1.19.0 within forty seconds of each other. Each named a file, a version and a cause, and each reply went further than the report.installGitHookhardcoded.git/hooksand only checked that.gitexisted, so--hookdied with ENOTDIR in anygit worktreecheckout; the fix asks git itself,git rev-parse --git-path hooks, and falls back to.git/hooksonly when.gitis a real directory.detectTagswas called with a whole file’s contents and its pattern list began with a bare/auth/i, so a comment describing a route as public tagged it authenticated; tagging is now scoped to each route’s own slice of the file, and the TypeScript extractor to the registration call plus the bodies of the same-file handlers it names. For every environment variable found by scanning code rather than a.envfile,hasDefaultwas the literalfalse, because the pattern stopped at the variable name; it now captures the read-site fallback, except for the indexed form that raises KeyError. And--evalwas rewritten so an aggregate can no longer hide a collapse: the summary prints the minimum F1 beside the average, calls out any category with true positives at zero and false positives above it, and exits non-zero below a 50% F1 floor. - 06
The two methods the project wrote down
Two documents carry what a reader would otherwise have to reverse-engineer.
docs/wasm-plugins.md, 20,007 bytes, is the contract for the opt-in native-AST plugins: a module must be namedcodesight-<lang>-ast.wasmand exportmemory,alloc,deallocandcontractVersion, and report a contract version equal to the host’s, which is 1, or be rejected; capability is detected by export presence, so a plugin handles routes only if it exportsparseRoutes. An optionaldescribe()returns a language id and a list of extensions, and dispatch is language-driven, so a language with no built-in extractor works as long as the plugin declares its extensions. Plugins are instantiated once per scan as long-lived reactors under a minimal WASI import object — clock, random, exit and stderr only, with no filesystem or network — and the host stamps the contextual fields it knows while ignoring any it is handed. The npm package ships none; the project publishes Rust, Python and Go builds as checksummed release assets. The second is the evaluation suite: five fixtures, each a repository description paired with expected routes, models, env vars and blast radius, scored for precision, recall and F1. The boundaries are written down too: the generated wiki index lists eight classes of thing it cannot see, from routes registered in a loop to WebSocket handlers and raw SQL tables.
Adjacent records
All records →No. 067
Reticle
An MCP server and a dev-only SDK that let a coding agent read and drive a running web or desktop app from the inside, then answer with a verdict and the file and line to fix instead of a screenshot.
No. 065
GSD Core
Git. Ship. Done. — a meta-prompting, context-engineering and spec-driven development framework that runs the same five-step loop on every milestone: discuss, plan, execute, verify and ship. The heavy work is pushed into fresh-context subagents so the main session stays lean, and every decision is written into Markdown and JSON under a planning directory instead of living in the conversation.
No. 122
OKF Agent Memory
Keeps what a coding agent learns as plain Markdown inside the repository — an OKF v0.2 knowledge bundle searched in-process by BM25 — so the memory can be diffed and reviewed instead of living in a database.