# source-map-gen LLM-friendly source map generation and documentation coverage checking for the huskies pipeline. The crate exposes two artifacts: - A **library** that extracts public-item signatures from Rust and TypeScript source files, writes them to a JSON map, and checks doc-comment coverage on a changed-file set. - Two **CLI binaries** (`source-map-check`, `source-map-regen`) used by `script/check` and by autonomous coder agents. ## Why this exists The huskies orchestrator embeds `.huskies/source-map.json` directly into the orientation prompt of every autonomous coder it spawns (see `server/src/agents/local_prompt.rs`). The map is a compact, sorted index of every public item in the project — function and method signatures, struct fields, exported TS symbols — that lets a fresh agent answer "what's already here?" without scanning the tree itself. Two properties matter: 1. **Determinism.** Running the regenerator twice on an unchanged tree must produce a byte-identical file. Sorted keys, sorted arrays, stable formatting. 2. **No stale entries.** The map cannot reference items that no longer exist, or the orientation bundle lies to agents. ## Binaries ### `source-map-check` Doc-coverage validator. Used by the pre-commit gate and by coder agents before they commit. ``` cargo run -p source-map-gen --bin source-map-check -- \ --worktree . --base master ``` Collects every file that differs from `--base` in any git state (committed, staged, unstaged, untracked), runs the per-language adapter's check, and exits non-zero with one actionable line per undocumented public item: ``` server/src/foo.rs:42: add a doc comment to fn `bar`. Example: `/// Brief description.` above the declaration ``` Coverage is *ratcheted to added lines*: only items whose declaration falls inside a hunk added since `--base` are reported. Pre-existing undocumented items in untouched lines are ignored, so the gate cannot retroactively block work on an unrelated change. ### `source-map-regen` Rebuilds `.huskies/source-map.json` from scratch. ``` cargo run -p source-map-gen --bin source-map-regen -- --project-root . ``` Enumerates every tracked file via `git ls-files`, extracts its public items via the language adapter, and writes a sorted JSON map. Wired into `script/check` so each pre-commit run captures a fresh snapshot. Cannot leave stale entries — unlike incremental update, this path always starts from the empty map. ## Library ```rust use source_map_gen::{check_files_ratcheted, regenerate_source_map, CheckResult}; ``` Key entry points: - `regenerate_source_map(worktree, source_map_path)` — full rebuild from `git ls-files`. Deterministic. - `check_files_ratcheted(files, worktree, base)` — doc-coverage check filtered to lines added since `base`. - `check_files(files)` — non-ratcheted variant; reports every undocumented public item. - `added_line_ranges(worktree, base, file)` — 1-based inclusive line ranges in `file` added since `base`, covering all git states (committed, staged, unstaged, untracked). - `update_source_map(passing_files, source_map_path, root)` — patches the map in place for the given files. Used by the incremental path; production code prefers `regenerate_source_map` to avoid stale entries. Languages plug in via the `LanguageAdapter` trait. The crate ships `RustAdapter` and `TypeScriptAdapter`. ## Map format `.huskies/source-map.json` is a JSON object keyed by repo-relative file path, each value an array of public-item signatures from that file: ```json { "server/src/foo.rs": [ "pub fn parse_config(path: &Path) -> Result", "pub struct Config" ], "frontend/src/api.ts": [ "export function fetchStories(): Promise" ] } ``` Keys are sorted alphabetically; each value array preserves the order returned by the adapter. The file is checked into git only as a generated artifact — treat it as build output, not as something to hand-edit.