v0.43.2
Release v0.43.2
Previous release: v0.31.1
Another large release — twelve minor/patch versions of accumulated work landing in one tag. Headline additions are six new read-side analysis commands (module dependency graphs, error-flow tracing, env-var reads, dead-type detection) and four new Claude Code integrations built directly from real-world eval friction (dekko doctor, dekko sanity, and a dekko-review-context skill). Underneath that, several rounds of 7-repo real-world evaluation (awesome-go, claude-buddy, claude-code, cline, spring-boot, tensorflow, zed) drove a substantial correctness pass on the resolver, heritage/throws labeling, and dead-code detection.
✨ Highlights
dekko deps— module-level dependency graph. File-to-file import graph resolved from rawimport/use/#includesource text (full resolution for Python, JS/TS/TSX, Rust, Java, C/C++).--filefor one file's imports/importers/external sources,--cyclesfor circular-import detection,--topfor most-depended-on ranking,--export {mermaid,dot}.dekko query throws/catches/env/importers/peers/cohesion— a batch of new structural queries: exception/error-flow tracing (scoped pilot: full support for Python/Java/C++), static env-var read detection across all 9 Tier-1 languages, reverse shared-dependency lookups, callee-overlap peer detection, and intra-file symbol-cohesion clustering.dekko unused --kinds {callables,types,all}andworkset --type-impact— dead-type detection (classes/interfaces/enums/structs/traits, counting heritage and type-usage evidence) and combined call-graph + type-usage + heritage blast-radius reporting.dekko doctor//doctor— unified environment/install-state diagnostic. Catches PATH shadowing (a stale globally-installeddekkobinary silently producing wrong/empty answers — the single most-repeated friction point across past eval rounds), map freshness, MCP/plugin registration, hook install state, and theCLAUDE.mdpolicy block, each check degrading independently rather than aborting the rest.dekko sanity <target>//sanity— cross-checks acallers/usesresult against a scoped, word-boundedgrepsweep, classifying any grep-only miss's likely cause (qualified call, unsupported language, test-filter exclusion, generic name, or a bare-name mention in a nearby comment/docstring). Automates the manual spot checkdekko-verifyalready documented.dekko-review-contextskill — orchestratesworkset+impacted_tests+check_ambiguousto give PR-description and code-review flows a structural head start on a diff, ahead of a dedicateddekko reviewcommand (tracked as #14).
🛠 Correctness fixes
- Resolver / heritage / throws labeling:
.hheader files are now content-sniffed for C vs. C++ instead of always parsing as C (was silently mis-resolving heritage/call edges on LLVM/gRPC/Chromium/TensorFlow-style codebases); same-file TypeScript type aliases used withimplements/extendsnow resolve instead of being mislabeled(external); Javainstanceof-pattern-bound rethrow variables no longer mislabeled as a fake external type;dekko depsnow recognizes Rust crates whoseCargo.toml[lib] pathisn'tsrc/lib.rs(was undercounting resolved edges on ~90% of a real repo's crates in one eval case). - Dead-code detection:
dekko unusedno longer false-flags Java methods only reached viathis::method/Class::methodreferences, or module-levelconstvariables read as binary/ternary operands rather than called. dekko deps/query importers/query peers/query throws/query catches: fixed self-import false positives, ambiguous--filematches, env-write detection,--exactmatching, JS/TS side-effect/namespace imports, NodeNext/ESM relative-import resolution, several false positives, a truncation-footer miscount, and a leaf-function mislabeling on ambiguously-resolved calls.- MCP server robustness: every
ProcessPoolExecutorcall site now retries once at a reduced worker count onBrokenProcessPoolinstead of an opaque crash; a long-lived MCP server reading a newermap.jsonformat now gets a clear "restart the server" (or "regenerate the map," for a genuinely malformed doc) instead of a bareTypeError. - Disclosure fixes: files dropped by the 1MB size cap are now disclosed instead of silently omitted;
affected/worksetno longer overstate a cold-resolve file count;query catchesreflects the languages actually present in the scanned repo instead of a hardcoded exclusion list;throws/catchesdisclose Rust/Go/C's lack of a syntax-level exception concept in-CLI, not just in docs. --claude-md-uninstallnow deletesCLAUDE.mdwhen removing the dekko usage block leaves nothing behind, instead of leaving a 0-byte file.
⚡ Performance
.dekko/map.jsonon-disk size cut 5.6–7.9x on large repos (measured: zed 853.5MB→117.2MB, spring-boot 894.2MB→113.9MB, tensorflow 1212.4MB→217.6MB) via symbol-id interning and dropping pretty-printing, now thatmap.jsonhas no human-reader use case.- Resolver parallelism — call/ref/throws/catches resolution passes now use oversubscribed chunking plus a shared-index pool initializer, cutting run-to-run variance on heterogeneous-core machines from ~2.2–3.9x swings to a tight ~3% spread at a consistent ~3.3–3.5x speedup.
🔧 Internal
src/dekko/cli.py's repo-loading/map pipeline extracted intosrc/dekko/repo_ops.py(no behavior change); daemon auth token comparison now usessecrets.compare_digest, closing a timing side-channel.- CI now reports test coverage (
--cov=dekko, no gate yet) and runs a non-blockingpip-auditjob — which, until this release, false-failed on nearly every run because it was trying to audit dekko's own dev version against PyPI;uv export --no-emit-projectnow excludes the local package from the audited set.
Compatibility
- All new commands, hooks, and skills are opt-in — no behavior change for existing installs until you turn them on.
map.json's schema version (MAP_DOC_VERSION) advanced 4→10 across this range (id interning, then same-file type-alias tracking); existing files keep reading correctly via version-branch handling inload_map(), and a plaindekko mapre-run upgrades an already-mapped repo to the current format.- No breaking changes to existing MCP tool signatures.
Full changelog: see CHANGELOG.md for the complete per-version breakdown ([0.31.2] → [0.43.2]).