Skip to content

v1.5.0

Choose a tag to compare

@Ansh-dhanani Ansh-dhanani released this 03 Mar 07:02
· 76 commits to main since this release

v1.5.0 — Improved Parsing, Smart Ignore & Monorepo Clustering

What was wrong with the previous version

Analysis was broken or useless for:

  1. Monorepos — running on Mikk's own codebase produced 12,235 lines of lock file, 1 module called "Testing", and a main diagram with a single useless node
  2. Test files polluting results — no .mikkignore was ever generated, so test fixtures, helpers, and test directories were analyzed as production code
  3. Projects with tsconfig.base.json — detected as JavaScript instead of TypeScript
  4. Single-file clusters never created — orphan files silently disappeared from analysis due to a premature assignment bug
  5. Duplicate module names — multiple clusters named "Search" or "Providers" with no disambiguation
  6. Massive unreadable diagrams — module diagrams dumped every internal function (88+ lines of noise)

Bug Fixes (19 total)

Critical Bugs

  1. C# detection used fs.access('*.csproj') which always fails — glob patterns don't work with fs.access. Switched to fast-glob for .csproj/.sln detection.
  2. Cluster detector orphan bug — files were marked as assigned during greedy expansion even when they didn't join any cluster. The orphan fallback (confidence: 0.3 single-file clusters) never fired, causing 0 modules for projects with weak cross-file coupling. Fixed by deferring assignment until a cluster reaches minClusterSize.
  3. parseMikkIgnore trailing-slash handling  dist/ stayed as dist/ (no match in fast-glob). Now correctly expands: bare dist/  **/dist/**, path packages/*/tests/  packages/*/tests/**.
  4. detectProjectLanguage missed tsconfig.base.json — monorepos using tsconfig.base.json (no tsconfig.json at root) were detected as JavaScript. Now checks tsconfig.*.json glob.
  5. TS parser crashed on .js/.jsx/.mjs/.cjs files  ScriptKind was always set to TS, causing parse failures on plain JS. Now maps extension → correct ScriptKind (JS, JSX, TSX).

Analysis Quality Bugs

  1. Only 1 module detected on monorepos — all 71 files lumped into "Testing" because the cluster detector's greedy phase consumed every file as a seed, leaving nothing for orphan/merge logic.
  2. No .mikkignore auto-generated  mikk init never created one. Test files, fixtures (packages/core/tests/fixtures/**), and build artifacts all included in analysis.
  3. Main diagram showed single useless node — with 1 module, the main diagram was literally 📦 Testing, 14 files, 51 functions and nothing else.
  4. Module diagrams listed every internal function — no size limits. A module with 50+ functions produced 88+ line diagrams that were unreadable.
  5. Duplicate module names not disambiguated — "Search" appeared 4 times, "Providers" appeared 2 times with no way to tell them apart.
  6. "React hook" label in lock compiler — framework-specific. Changed to "Hook" (framework-neutral).
  7. shadcn false positive in tech stack detection — pattern ui matched any path containing "ui" (e.g. src/ui/button.tsx). Tightened to check for components.json + ui directory.
  8. Hardcoded TypeScript fallback entry point  index.ts used when no entry point found. Changed to detect from language (src/main.py, cmd/main.go, src/main.rs, etc.).
  9. Duplicate "Step 7" comment in init.ts — two steps both labeled "// 7." causing confusion.

Generality Bugs (hardcoded assumptions)

  1. Contract generator hardcoded index.ts as entry — now auto-detects per language.
  2. Contract generator hardcoded typescript as language — now uses detectProjectLanguage().
  3. extToLang only had 12 extensions — expanded to 40 (Python, Go, Rust, Java, Ruby, PHP, C#, Svelte, Vue, etc.).
  4. Tech stack detection only ~30 items — expanded to 70+ (Django, Flask, FastAPI, Rails, Spring, Laravel, Phoenix, etc.).
  5. Package manager hardcoded to npm — now auto-detects pnpm/yarn/bun from lock files.

New Features

  • Auto-generated .mikkignore  mikk init creates a .mikkignore with smart defaults per detected language. Monorepo-aware: reads package.json workspaces and pnpm-workspace.yaml to generate patterns like packages/*/tests/**.

  • Multi-language file discovery  detectProjectLanguage() + getDiscoveryPatterns() support 10 languages: TypeScript, JavaScript, Python, Go, Rust, Java, Ruby, PHP, C#, and unknown fallback.

  • Diagram size limits — Module diagrams cap at 40 functions (exported/entry/cross-module only) and 15 file subgraphs. Smart single-module main diagram renders file-level view instead of one node.

  • Duplicate module name disambiguation — appends distinctive directory: "Search (Diagram Generator)", "Search (Intent Engine)", etc.

  • 40 domain keyword categories for semantic module naming (up from 24).

  • Multi-language context file patterns — discovers schemas/models/routes for Python (Django/Flask), Ruby (Rails), Go, Rust, Java, PHP, not just TS/JS.

  • 3 new parseMikkIgnore tests — trailing-slash directories, path-based directories, bare file patterns.


Stats

Metric | v1.3.x | v1.4.0 -- | -- | -- Builds | 9/9 | 9/9 Tests | 66 | 128 Languages supported | 1 (TS) | 10 Tech stack items | ~30 | 70+ extToLang entries | 12 | 40 Domain keyword categories | 24 | 40 Bugs fixed | — | 19 Files changed | — | 12

Tested on: Mesh monorepo (9 packages, 67 files → 9 modules), zerovault (Next.js, 136 files → 25 modules), chanhdai.com (Next.js 16, 231 files → 34 modules)

v1.4.0 — Universal Language Support, Smart Ignore & Monorepo Clustering What was wrong with the previous version Analysis was broken or useless for:

Any non-TypeScript project — file discovery, parsing, contracts, and context files were all hardcoded for TS/React
Monorepos — running on Mikk's own codebase produced 12,235 lines of lock file, 1 module called "Testing", and a main diagram with a single useless node
Test files polluting results — no .mikkignore was ever generated, so test fixtures, helpers, and test directories were analyzed as production code
Projects with tsconfig.base.json — detected as JavaScript instead of TypeScript
Single-file clusters never created — orphan files silently disappeared from analysis due to a premature assignment bug
Duplicate module names — multiple clusters named "Search" or "Providers" with no disambiguation
Massive unreadable diagrams — module diagrams dumped every internal function (88+ lines of noise)
Bug Fixes (19 total)
Critical Bugs
C# detection used fs.access('*.csproj') which always fails — glob patterns don't work with fs.access. Switched to fast-glob for .csproj/.sln detection.
Cluster detector orphan bug — files were marked as assigned during greedy expansion even when they didn't join any cluster. The orphan fallback (confidence: 0.3 single-file clusters) never fired, causing 0 modules for projects with weak cross-file coupling. Fixed by deferring assignment until a cluster reaches minClusterSize.
parseMikkIgnore trailing-slash handling — dist/ stayed as dist/ (no match in fast-glob). Now correctly expands: bare dist/ → /dist/, path packages/*/tests/ → packages/*/tests/**.
detectProjectLanguage missed tsconfig.base.json — monorepos using tsconfig.base.json (no tsconfig.json at root) were detected as JavaScript. Now checks tsconfig.*.json glob.
TS parser crashed on .js/.jsx/.mjs/.cjs files — ScriptKind was always set to TS, causing parse failures on plain JS. Now maps extension → correct ScriptKind (JS, JSX, TSX).
Analysis Quality Bugs
Only 1 module detected on monorepos — all 71 files lumped into "Testing" because the cluster detector's greedy phase consumed every file as a seed, leaving nothing for orphan/merge logic.
No .mikkignore auto-generated — mikk init never created one. Test files, fixtures (packages/core/tests/fixtures/**), and build artifacts all included in analysis.
Main diagram showed single useless node — with 1 module, the main diagram was literally 📦 Testing, 14 files, 51 functions and nothing else.
Module diagrams listed every internal function — no size limits. A module with 50+ functions produced 88+ line diagrams that were unreadable.
Duplicate module names not disambiguated — "Search" appeared 4 times, "Providers" appeared 2 times with no way to tell them apart.
"React hook" label in lock compiler — framework-specific. Changed to "Hook" (framework-neutral).
shadcn false positive in tech stack detection — pattern ui matched any path containing "ui" (e.g. src/ui/button.tsx). Tightened to check for components.json + ui directory.
Hardcoded TypeScript fallback entry point — index.ts used when no entry point found. Changed to detect from language (src/main.py, cmd/main.go, src/main.rs, etc.).
Duplicate "Step 7" comment in init.ts — two steps both labeled "// 7." causing confusion.
Generality Bugs (hardcoded assumptions)
Contract generator hardcoded index.ts as entry — now auto-detects per language.
Contract generator hardcoded typescript as language — now uses detectProjectLanguage().
extToLang only had 12 extensions — expanded to 40 (Python, Go, Rust, Java, Ruby, PHP, C#, Svelte, Vue, etc.).
Tech stack detection only ~30 items — expanded to 70+ (Django, Flask, FastAPI, Rails, Spring, Laravel, Phoenix, etc.).
Package manager hardcoded to npm — now auto-detects pnpm/yarn/bun from lock files.
New Features
Auto-generated .mikkignore — mikk init creates a .mikkignore with smart defaults per detected language. Monorepo-aware: reads package.json workspaces and pnpm-workspace.yaml to generate patterns like packages/*/tests/**.

Multi-language file discovery — detectProjectLanguage() + getDiscoveryPatterns() support 10 languages: TypeScript, JavaScript, Python, Go, Rust, Java, Ruby, PHP, C#, and unknown fallback.

Diagram size limits — Module diagrams cap at 40 functions (exported/entry/cross-module only) and 15 file subgraphs. Smart single-module main diagram renders file-level view instead of one node.

Duplicate module name disambiguation — appends distinctive directory: "Search (Diagram Generator)", "Search (Intent Engine)", etc.

40 domain keyword categories for semantic module naming (up from 24).

Multi-language context file patterns — discovers schemas/models/routes for Python (Django/Flask), Ruby (Rails), Go, Rust, Java, PHP, not just TS/JS.

3 new parseMikkIgnore tests — trailing-slash directories, path-based directories, bare file patterns.

Stats
Metric v1.3.x v1.4.0
Builds 9/9 9/9
Tests 66 128
Languages supported 1 (TS) 10
Tech stack items ~30 70+
extToLang entries 12 40
Domain keyword categories 24 40
Bugs fixed — 19
Files changed — 12
Tested on: Mesh monorepo (9 packages, 67 files → 9 modules), zerovault (Next.js, 136 files → 25 modules), chanhdai.com (Next.js 16, 231 files → 34 modules)