feat: louvain community detection + fix complexity build regression#134
feat: louvain community detection + fix complexity build regression#134carlos-alm merged 2 commits intomainfrom
Conversation
Add `codegraph communities` command that runs Louvain clustering on the dependency graph, compares discovered communities against directory structure, and surfaces architectural drift (split/merge candidates, drift score). Supports file-level (default) and function-level modes, configurable resolution, and drift-only output. Integrated into stats, MCP, and programmatic API. Impact: 9 functions changed, 8 affected
Cache WASM parse trees from parseFilesAuto and pass them to buildComplexityMetrics, avoiding redundant parser init, file I/O, and AST re-parsing. Native engine falls back to re-parsing as before. Trees are nulled after use to allow prompt GC. Impact: 5 functions changed, 7 affected
|
Claude finished @carlos-alm's task —— View job PR Review: Community Detection + Complexity Performance Fix ✅Comprehensive review of this 804-line PR with community detection feature and complexity performance fix completed. Review Checklist:
Phase 1: Root Cause Analysis ✅Problem Being Solved:
Why This Approach:
Risk Assessment: ✅ LOW RISK - No symptom masking or workarounds Phase 2: Configuration Change Detection ✅Analysis: ✅ NO HIGH-RISK CHANGES
Phase 3: Test Integrity Analysis ✅Test Coverage: ✅ COMPREHENSIVE AND RIGOROUS
Phase 4: Code Quality Review ✅Security: ✅ NO VULNERABILITIES
Memory Management: ✅ PROPER RESOURCE CLEANUP
Error Handling:
Performance: ✅ OPTIMIZED DESIGN
Code Quality: ✅ HIGH QUALITY
Final AssessmentCritical ConcernsNone identified. Minor Recommendations
Final Recommendation
|
Greptile SummaryThis PR adds Louvain-based community detection for module boundary analysis and eliminates a ~2x performance regression in complexity metrics by caching WASM parse trees. Community Detection (
Complexity Performance Fix (
Confidence Score: 5/5
Important Files Changed
Flowchart%%{init: {'theme': 'neutral'}}%%
flowchart TD
A[buildGraph: parseFilesAuto] --> B{Engine Type?}
B -->|Native| C[Native parser: no tree]
B -->|WASM| D[WASM parser: extract tree]
C --> E[symbols without _tree/_langId]
D --> F[symbols._tree = tree<br/>symbols._langId = langId]
E --> G[buildComplexityMetrics]
F --> G
G --> H{Has cached tree?}
H -->|Yes| I[Use cached tree directly]
H -->|No| J[Fallback: re-parse with WASM]
I --> K[Compute complexity metrics]
J --> K
K --> L[symbols._tree = null]
L --> M[Continue to next file]
M --> N[builder.js: final cleanup<br/>null all _tree/_langId]
Last reviewed commit: 62e48db |
Update README, CLAUDE.md, BACKLOG, titan-paradigm, recommended-practices, and CLI/MCP examples to reflect today's merged PRs: complexity metrics (#130/#139), Louvain community detection (#133/#134), and manifesto rule engine (#138). Updates MCP tool count from 21 to 24 (25 in multi-repo), marks backlog items 6/11/21/22 as done, and adds real CLI output examples.
Update README, CLAUDE.md, BACKLOG, titan-paradigm, recommended-practices, and CLI/MCP examples to reflect today's merged PRs: complexity metrics (#130/#139), Louvain community detection (#133/#134), and manifesto rule engine (#138). Updates MCP tool count from 21 to 24 (25 in multi-repo), marks backlog items 6/11/21/22 as done, and adds real CLI output examples.
* fix: strict type validation for threshold values in complexity queries
Replace loose `!= null` checks with `typeof === 'number' && Number.isFinite()`
to prevent `Number("")`, `Number(null)`, and `Number(true)` from silently
coercing into valid SQL values. Add integration test verifying exceeds
arrays and summary.aboveWarn are correctly computed.
Addresses Greptile review feedback on #136.
Impact: 2 functions changed, 3 affected
* docs: add complexity, communities, and manifesto to all docs
Update README, CLAUDE.md, BACKLOG, titan-paradigm, recommended-practices,
and CLI/MCP examples to reflect today's merged PRs: complexity metrics
(#130/#139), Louvain community detection (#133/#134), and manifesto rule
engine (#138). Updates MCP tool count from 21 to 24 (25 in multi-repo),
marks backlog items 6/11/21/22 as done, and adds real CLI output examples.
* fix: remove redundant condition in paginate guard clauses
When limit === undefined, limit !== 0 is always true — the && check
was dead code. Simplified to just check limit === undefined.
Impact: 2 functions changed, 18 affected
* docs: update dogfood report with fix statuses
All 4 bugs now fixed (PR #117 merged, #116 closed via reverse-dep
cascade). 3 of 4 suggestions addressed. MCP tool counts updated
18→23 / 19→24. Rating upgraded 7/10 → 9/10 post-fix.
* fix: rename misleading test to match actual behavior
Test was named "handles non-numeric thresholds gracefully" but only
validated baseline exceeds/aboveWarn with valid thresholds. Actual
non-numeric threshold tests exist separately. Renamed to "produces
correct exceeds and aboveWarn with valid thresholds".
* fix: update stale MCP tool count in dogfood skill (21→24)
---------
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
* fix: strict type validation for threshold values in complexity queries
Replace loose `!= null` checks with `typeof === 'number' && Number.isFinite()`
to prevent `Number("")`, `Number(null)`, and `Number(true)` from silently
coercing into valid SQL values. Add integration test verifying exceeds
arrays and summary.aboveWarn are correctly computed.
Addresses Greptile review feedback on #136.
Impact: 2 functions changed, 3 affected
* docs: add complexity, communities, and manifesto to all docs
Update README, CLAUDE.md, BACKLOG, titan-paradigm, recommended-practices,
and CLI/MCP examples to reflect today's merged PRs: complexity metrics
(#130/#139), Louvain community detection (#133/#134), and manifesto rule
engine (#138). Updates MCP tool count from 21 to 24 (25 in multi-repo),
marks backlog items 6/11/21/22 as done, and adds real CLI output examples.
* fix: remove redundant condition in paginate guard clauses
When limit === undefined, limit !== 0 is always true — the && check
was dead code. Simplified to just check limit === undefined.
Impact: 2 functions changed, 18 affected
* docs: update dogfood report with fix statuses
All 4 bugs now fixed (PR #117 merged, #116 closed via reverse-dep
cascade). 3 of 4 suggestions addressed. MCP tool counts updated
18→23 / 19→24. Rating upgraded 7/10 → 9/10 post-fix.
* fix: rename misleading test to match actual behavior
Test was named "handles non-numeric thresholds gracefully" but only
validated baseline exceeds/aboveWarn with valid thresholds. Actual
non-numeric threshold tests exist separately. Renamed to "produces
correct exceeds and aboveWarn with valid thresholds".
* fix: update stale MCP tool count in dogfood skill (21→24)
* feat: add complexity analysis for Python, Go, Rust, Java, C#, Ruby, PHP
Parameterize the complexity algorithm to support all 10 languages instead
of just JS/TS/TSX. Add per-language COMPLEXITY_RULES, HALSTEAD_RULES, and
COMMENT_PREFIXES with three else-if detection patterns (else-wraps-if,
explicit elif, alternative field). Guard against tree-sitter keyword leaf
tokens that share node type names with their parent constructs.
Impact: 4 functions changed, 4 affected
---------
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
Summary
codegraph communitiesCLI, MCP tool, programmatic API). Usesjlouvainto partition the function-level dependency graph into communities, revealing natural module boundaries and cross-community couplingbuildComplexityMetricsby caching WASM parse trees fromparseFilesAutoand passing them through. Addresses the ~2x build regression from PR feat: cognitive & cyclomatic complexity metrics #130 (native 2.1→4.7 ms/file, WASM 6.6→9.4 ms/file)Changes
Community detection (
cc28daa)src/communities.js— Louvain partitioning, community stats, bridge edge detectioncodegraph communitiescommand with--min-size,--json,--no-testsflagsdetect_communitiestool exposed in both single-repo and multi-repo modessrc/index.jsComplexity perf fix (
62e48db)src/parser.js:wasmExtractSymbolsreturns{ symbols, tree, langId };parseFilesAutoattaches_tree/_langIdto symbols objectssrc/complexity.js:buildComplexityMetricsuses cached trees, only initializes WASM parsers when fallback is needed (native engine path)src/builder.js: Nulls out tree references after complexity analysis for prompt GCTest plan
npx vitest run tests/integration/communities.test.js— 13 community detection testsnpx vitest run tests/unit/complexity.test.js tests/integration/complexity.test.js— 30 complexity testsnpm test— full suite (710 pass, 13 skipped)node src/cli.js build .— verify build performance regression is eliminated