autodocs-engine 0.9.8 → 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (76) hide show
  1. package/README.md +123 -117
  2. package/dist/anti-pattern-detector.js +22 -0
  3. package/dist/anti-pattern-detector.js.map +1 -1
  4. package/dist/architecture-detector.js +33 -29
  5. package/dist/architecture-detector.js.map +1 -1
  6. package/dist/ast-parser.js +31 -3
  7. package/dist/ast-parser.js.map +1 -1
  8. package/dist/benchmark/scorer.js +3 -1
  9. package/dist/benchmark/scorer.js.map +1 -1
  10. package/dist/bin/autodocs-engine.js +7 -0
  11. package/dist/bin/autodocs-engine.js.map +1 -1
  12. package/dist/bin/serve.d.ts +1 -0
  13. package/dist/bin/serve.js +5 -1
  14. package/dist/bin/serve.js.map +1 -1
  15. package/dist/bin/setup-hooks.d.ts +1 -0
  16. package/dist/bin/setup-hooks.js +59 -0
  17. package/dist/bin/setup-hooks.js.map +1 -0
  18. package/dist/config.d.ts +1 -0
  19. package/dist/config.js +4 -0
  20. package/dist/config.js.map +1 -1
  21. package/dist/convention-extractor.js +10 -0
  22. package/dist/convention-extractor.js.map +1 -1
  23. package/dist/detectors/api-patterns.d.ts +2 -0
  24. package/dist/detectors/api-patterns.js +101 -0
  25. package/dist/detectors/api-patterns.js.map +1 -0
  26. package/dist/detectors/async-patterns.d.ts +2 -0
  27. package/dist/detectors/async-patterns.js +79 -0
  28. package/dist/detectors/async-patterns.js.map +1 -0
  29. package/dist/detectors/error-handling.js +82 -30
  30. package/dist/detectors/error-handling.js.map +1 -1
  31. package/dist/detectors/state-management.d.ts +2 -0
  32. package/dist/detectors/state-management.js +75 -0
  33. package/dist/detectors/state-management.js.map +1 -0
  34. package/dist/execution-flow.d.ts +23 -0
  35. package/dist/execution-flow.js +286 -0
  36. package/dist/execution-flow.js.map +1 -0
  37. package/dist/git-history.js +18 -7
  38. package/dist/git-history.js.map +1 -1
  39. package/dist/implicit-coupling.d.ts +7 -0
  40. package/dist/implicit-coupling.js +40 -0
  41. package/dist/implicit-coupling.js.map +1 -0
  42. package/dist/import-chain.js +12 -3
  43. package/dist/import-chain.js.map +1 -1
  44. package/dist/index.js +20 -1
  45. package/dist/index.js.map +1 -1
  46. package/dist/llm/serializer.js +8 -6
  47. package/dist/llm/serializer.js.map +1 -1
  48. package/dist/mcp/cache.d.ts +11 -1
  49. package/dist/mcp/cache.js +49 -7
  50. package/dist/mcp/cache.js.map +1 -1
  51. package/dist/mcp/queries.d.ts +19 -3
  52. package/dist/mcp/queries.js +342 -62
  53. package/dist/mcp/queries.js.map +1 -1
  54. package/dist/mcp/server.d.ts +1 -0
  55. package/dist/mcp/server.js +42 -1
  56. package/dist/mcp/server.js.map +1 -1
  57. package/dist/mcp/tools.d.ts +1 -0
  58. package/dist/mcp/tools.js +162 -20
  59. package/dist/mcp/tools.js.map +1 -1
  60. package/dist/output-validator.js +73 -0
  61. package/dist/output-validator.js.map +1 -1
  62. package/dist/pipeline.js +37 -0
  63. package/dist/pipeline.js.map +1 -1
  64. package/dist/symbol-graph.js +4 -0
  65. package/dist/symbol-graph.js.map +1 -1
  66. package/dist/type-enricher.d.ts +17 -0
  67. package/dist/type-enricher.js +127 -0
  68. package/dist/type-enricher.js.map +1 -0
  69. package/dist/type-resolver.d.ts +13 -0
  70. package/dist/type-resolver.js +75 -0
  71. package/dist/type-resolver.js.map +1 -0
  72. package/dist/types.d.ts +37 -4
  73. package/dist/types.js +7 -2
  74. package/dist/types.js.map +1 -1
  75. package/hooks/autodocs-hook.cjs +227 -0
  76. package/package.json +3 -2
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # autodocs-engine
2
2
 
3
- Deterministic codebase intelligence for AI coding tools.
3
+ Codebase intelligence for AI coding agents. Analyzes TypeScript/JavaScript codebases and serves actionable intelligence via MCP.
4
4
 
5
5
  [![npm version](https://img.shields.io/npm/v/autodocs-engine)](https://www.npmjs.com/package/autodocs-engine)
6
6
  [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE)
@@ -8,172 +8,176 @@ Deterministic codebase intelligence for AI coding tools.
8
8
 
9
9
  ## What It Does
10
10
 
11
- Analyzes TypeScript/JavaScript codebases and extracts actionable intelligencecommands, conventions, file coupling patterns, contribution recipes, architecture that AI coding tools need to write code that fits your project.
11
+ Gives AI coding agents deep understanding of your codebase not just what files exist, but how they connect, what conventions to follow, and what breaks when you change something. Combines AST analysis, git history mining, and import graph intelligence to answer questions no other tool can:
12
12
 
13
- Two ways to use it:
14
-
15
- 1. **MCP Server** Live codebase queries via Model Context Protocol. AI tools ask for exactly the context they need, on demand.
16
- 2. **AGENTS.md Generator** Static context file for universal compatibility. Works with every tool that reads AGENTS.md, CLAUDE.md, or .cursorrules.
13
+ - **"What files should I also check when modifying `src/types.ts`?"** → Import dependents, co-change partners from git history, implicit coupling (files that change together without import relationships), and affected execution flows.
14
+ - **"Which specific files import `Convention` from `src/types.ts`?"** → 25 files (not all 98 importers of the file — only the ones using that symbol).
15
+ - **"What caused this test failure?"** Ranked suspect files with confidence assessment, validated on 95 real bug-fix commits across 10 repos.
16
+ - **"What patterns should I follow?"** 13 convention detectors covering error handling, async patterns, state management, API patterns, hooks, testing, and more.
17
17
 
18
18
  ## Quick Start
19
19
 
20
20
  ```bash
21
- # Generate a focused AGENTS.md (no API key needed)
22
- npx autodocs-engine init
23
-
24
- # Or start the MCP server for live queries
25
- npx autodocs-engine serve
26
- ```
21
+ # MCP server for Claude Code
22
+ claude mcp add autodocs -- npx autodocs-engine serve
27
23
 
28
- ### MCP Server Setup (Claude Code)
24
+ # Install Claude Code hooks (automatic search augmentation)
25
+ npx autodocs-engine setup-hooks
29
26
 
30
- ```bash
31
- claude mcp add autodocs -- npx autodocs-engine serve
27
+ # Or generate a focused AGENTS.md (no API key needed)
28
+ npx autodocs-engine init
32
29
  ```
33
30
 
34
- This gives Claude Code 13 codebase intelligence tools:
31
+ ## MCP Tools (13)
35
32
 
36
33
  | Tool | What It Returns |
37
34
  |------|----------------|
38
35
  | `get_commands` | Build, test, lint commands with exact flags |
39
- | `get_architecture` | Directory structure, entry points, package type |
40
- | `get_conventions` | DO/DON'T rules with confidence levels (filterable by category) |
41
- | `get_workflow_rules` | File coupling and co-change patterns (filterable by file) |
42
- | `get_contribution_guide` | How to add new code, with inline example snippets |
43
- | `get_exports` | Public API with usage examples and parameter shapes |
44
- | `analyze_impact` | Blast radius + importers + co-change partners for a file |
36
+ | `get_architecture` | Directory structure, entry points, execution flows |
37
+ | `get_conventions` | DO/DON'T rules from 13 detectors (error handling, async, state management, API patterns, hooks, testing, file naming, import ordering, frameworks, databases, data fetching, build tools) |
38
+ | `get_workflow_rules` | File coupling and co-change patterns |
39
+ | `get_contribution_guide` | How to add code, with inline examples and registration steps |
40
+ | `get_exports` | Public API with resolved TypeScript types (parameter types, return types) |
41
+ | `analyze_impact` | Blast radius: importers, callers, co-change partners |
42
+ | `plan_change` | Full change plan: dependents, co-changes, implicit coupling, execution flows, registration/barrel updates, tests. **With optional `symbols` parameter: narrows dependents to files importing specific symbols.** |
43
+ | `get_test_info` | Test file path + exact per-file run command |
44
+ | `auto_register` | Exact code insertions for registration + barrel updates |
45
+ | `review_changes` | Pattern compliance: suffix, imports, registration, barrel, tests |
46
+ | `diagnose` | Root cause analysis with confidence level (high/medium/low), import path traces, and 7 scoring signals |
45
47
  | `list_packages` | Monorepo package inventory |
46
- | `plan_change` | Full change plan: dependents, co-changes, registrations, tests, checklist |
47
- | `get_test_info` | Test file path + exact per-file run command for any source file |
48
- | `auto_register` | Exact code insertions for registration files + barrel updates |
49
- | `review_changes` | Pattern compliance check: suffix, imports, registration, barrel, tests |
50
- | **`diagnose`** | **Root cause analysis: traces test failures to suspect files via import graph, git co-change, and call graph** |
51
-
52
- ## Why Minimal Mode?
53
48
 
54
- Research shows comprehensive context files can actually **hurt** AI performance:
49
+ Every tool response includes **next-step hints** guiding the agent to the logical next action.
55
50
 
56
- - LLM-generated AGENTS.md: **-0.5% to -2%** accuracy ([arxiv 2602.11988](https://arxiv.org/abs/2602.11988))
57
- - Developer-written focused AGENTS.md: **+4%** accuracy, **-29% runtime** ([arxiv 2601.20404](https://arxiv.org/abs/2601.20404))
51
+ ## What Makes It Different
58
52
 
59
- The difference: developer-written files are short, focused, and only include what the AI can't figure out on its own. That's exactly what `--minimal` generates.
53
+ ### Git Co-Change Intelligence
54
+ Mines commit history using Jaccard similarity to find files that frequently change together. Produces workflow rules ("when modifying X, also check Y") and **implicit coupling** — file pairs that co-change but have no import relationship. This catches the "forgotten file" that static analysis misses.
60
55
 
61
- **Minimal mode** (~200-450 tokens) includes only:
62
- - Exact commands with flags (proven to help, never hurts)
63
- - Workflow rules from git co-change analysis (patterns the AI can't discover from code)
64
- - High-confidence conventions (only if ≥95% consistent and non-obvious)
65
- - Non-obvious directories (with "non-exhaustive" qualifier to prevent anchoring)
66
-
67
- **Full mode** (~1,500-2,500 tokens) adds public API, dependency graphs, all conventions, and architecture details. Use `--full` when you need comprehensive documentation.
68
-
69
- ## How It Works
56
+ ### Convention Detection (13 Detectors)
57
+ Extracts real coding patterns from AST analysis, not configured rules:
58
+ - Error handling: custom error classes, Result/Either patterns, typed error hierarchies
59
+ - Async patterns: Promise.all usage, sequential-await-in-loops detection, AbortController
60
+ - State management: Redux, Zustand, Jotai, MobX, Signals, Context API (reports all, not just dominant)
61
+ - API patterns: Express, Fastify, Hono, NestJS, tRPC, GraphQL (framework-aware, not directory heuristics)
62
+ - Plus: hooks, testing, file naming, import ordering, web frameworks, databases, data fetching, build tools
70
63
 
71
- Unlike tools that dump code into an LLM or pack everything into one file, autodocs-engine uses deterministic static analysis:
64
+ ### Symbol-Level Filtering
65
+ ```
66
+ plan_change({ files: ["src/types.ts"], symbols: ["Convention"] })
67
+ ```
68
+ Narrows 98 dependents to 25 — only files that actually import `Convention`. Every other tool shows all dependents regardless of which symbol you're changing.
72
69
 
73
- 1. **Parse** — AST analysis via TypeScript Compiler API
74
- 2. **Detect** 9 convention detectors (naming, hooks, testing, import ordering, frameworks, etc.)
75
- 3. **Extract** — Commands from package.json, turbo.json, biome.json, and 10+ config formats
76
- 4. **Graph** Call graph, import chains, and git co-change analysis (Jaccard similarity)
77
- 5. **Score** — Inferability scoring decides what's worth including vs. what the AI already knows
78
- 6. **Generate**14/16 sections are deterministic (no LLM). Only architecture summary and domain terms use optional micro-LLM calls.
70
+ ### Type-Aware Analysis
71
+ Opt-in `--type-checking` creates a TypeScript Program for resolved parameter types and return types:
72
+ ```
73
+ analyze(options: Partial<ResolvedConfig> & { packages: string[] }): Promise<StructuredAnalysis>
74
+ ```
75
+ Not text extraction actual TypeChecker resolution through re-export chains.
79
76
 
80
- **No API key needed** for minimal mode or JSON output. The analysis is pure computation.
77
+ ### Execution Flow Tracing
78
+ Detects execution paths from entry points through the call graph:
79
+ ```
80
+ runPipeline → analyzePackage → buildSymbolGraph → computeImpactRadius (4 steps, 4 files)
81
+ ```
82
+ Scored by co-change confidence — flows through files that frequently change together are higher confidence.
81
83
 
82
- ## Output Formats
84
+ ### Validated Diagnose Tool
85
+ Tested against **95 real bug-fix commits across 10 repos**:
86
+ - Unit-test repos: **83% recall@3** (root cause in top 3 suspects)
87
+ - All repos: **47% recall@3**, **33% precision@1**
88
+ - Confidence assessment based on signal quality and score discrimination
83
89
 
90
+ ### Claude Code Hooks
84
91
  ```bash
85
- npx autodocs-engine init # Focused AGENTS.md (~300 tokens, no API key)
86
- npx autodocs-engine init --full # Comprehensive AGENTS.md (needs API key)
87
- npx autodocs-engine analyze . --format json # Raw analysis JSON
88
- npx autodocs-engine analyze . --format claude.md # CLAUDE.md format
89
- npx autodocs-engine analyze . --format cursorrules # .cursorrules format
92
+ npx autodocs-engine setup-hooks
90
93
  ```
94
+ Installs PreToolUse + PostToolUse hooks:
95
+ - **PreToolUse**: When you grep for "validateUser", automatically shows callers, co-change partners, and execution flows alongside results
96
+ - **PostToolUse**: After `git commit`, detects when analysis cache is stale
91
97
 
92
- ## Monorepo Support
93
-
94
- Auto-detects workspace packages from `pnpm-workspace.yaml`, `workspaces` field in package.json, `turbo.json`, or `nx.json`:
98
+ ## Claude Code Setup
95
99
 
96
100
  ```bash
97
- npx autodocs-engine init # Works for monorepos too
98
- ```
101
+ # Add MCP server
102
+ claude mcp add autodocs -- npx autodocs-engine serve
99
103
 
100
- For explicit control:
104
+ # Install hooks for automatic search augmentation
105
+ npx autodocs-engine setup-hooks
106
+ ```
101
107
 
108
+ With `--type-checking` for resolved TypeScript types:
102
109
  ```bash
103
- npx autodocs-engine analyze packages/app packages/hooks packages/ui \
104
- --format agents.md --hierarchical --root .
110
+ claude mcp add autodocs -- npx autodocs-engine serve --type-checking
105
111
  ```
106
112
 
107
- ## Staleness Detection
113
+ ## AGENTS.md Generation
108
114
 
109
- Check if your AGENTS.md needs updating (for CI):
115
+ For tools without MCP support:
110
116
 
111
117
  ```bash
112
- npx autodocs-engine check
118
+ npx autodocs-engine init # Focused (~300 tokens, no API key)
119
+ npx autodocs-engine init --full # Comprehensive (needs API key)
113
120
  ```
114
121
 
115
- Returns exit code 1 if conventions have drifted. Useful in CI pipelines to keep context files honest.
116
-
117
- ## Tested On
118
-
119
- | Repo | Files | Time | Token Count (minimal) |
120
- |------|------:|-----:|:-----:|
121
- | autodocs-engine | 115 | 450ms | ~443 |
122
- | vitest | 1,200+ | 1.2s | ~307 |
123
- | nitro | 469 | 220ms | ~121 |
124
- | sanity | 3,746 | 1.6s | — |
125
- | medusa | 720 | 316ms | — |
122
+ Research-backed: focused context files improve AI accuracy by +4% and reduce runtime by 29%. LLM-generated comprehensive files hurt by -2%.
126
123
 
127
- 569 tests. Zero type errors. 13 MCP tools. Zero technology hallucinations across all tested repos.
124
+ ## CLI Reference
128
125
 
129
- ## Library API
126
+ ```
127
+ autodocs-engine init [--full] Generate AGENTS.md
128
+ autodocs-engine serve [path] [options] Start MCP server
129
+ autodocs-engine setup-hooks Install Claude Code hooks
130
+ autodocs-engine check Staleness detection for CI
131
+ autodocs-engine analyze [paths...] [options] Analyze specific packages
130
132
 
131
- ```typescript
132
- import { analyze, generateMinimalAgentsMd } from 'autodocs-engine';
133
+ Options:
134
+ --type-checking Enable resolved TypeScript types (requires tsconfig.json)
135
+ --minimal Focused output (<500 tokens, default for init)
136
+ --full Comprehensive output (requires ANTHROPIC_API_KEY)
137
+ --format, -f json | agents.md | claude.md | cursorrules
138
+ --verbose, -v Timing and analysis details
139
+ --dry-run Print to stdout (no file writes)
140
+ ```
133
141
 
134
- // Analyze (pure computation, no API key)
135
- const analysis = await analyze({ packages: ['./packages/my-pkg'] });
142
+ ## How It Works
136
143
 
137
- // Generate minimal AGENTS.md (no API key)
138
- const minimal = generateMinimalAgentsMd(analysis);
144
+ 18-stage analysis pipeline:
139
145
 
140
- // Or use the full deterministic format (optional API key for 2 LLM sections)
141
- import { formatDeterministic } from 'autodocs-engine';
142
- const full = await formatDeterministic(analysis, config);
143
- ```
146
+ 1. **File Discovery** git ls-files with .gitignore respect
147
+ 2. **AST Parsing** TypeScript Compiler API for exports, imports, call references
148
+ 3. **Symbol Graph** barrel resolution, re-export chains, call graph construction
149
+ 4. **Import Chain** → file-to-file coupling with confidence scores
150
+ 5. **Tier Classification** → public API (T1), internal (T2), test/generated (T3)
151
+ 6. **Type Enrichment** → optional ts.Program for resolved parameter/return types
152
+ 7. **Convention Extraction** → 13 detectors with structured confidence metrics
153
+ 8. **Git History Mining** → co-change mining with Jaccard similarity, adaptive thresholds
154
+ 9. **Implicit Coupling** → co-change pairs with no import relationship
155
+ 10. **Execution Flow Tracing** → entry point scoring, spine-first BFS, co-change validation
156
+ 11. **Impact Classification** → high/medium/low impact scoring on conventions
157
+ 12. **Workspace Auto-Detection** → monorepo roots expand to workspace packages
144
158
 
145
- ## Configuration
159
+ 5 production dependencies. No native bindings, no graph database, no WASM. Installs instantly.
146
160
 
147
- Optional `autodocs.config.json`:
161
+ ## Stats
148
162
 
149
- ```json
150
- {
151
- "exclude": ["**/vendor/**", "**/generated/**"],
152
- "conventions": { "disable": ["telemetry-patterns"] }
153
- }
154
- ```
163
+ - 713 tests across 53 files
164
+ - 13 MCP tools with next-step hints
165
+ - 13 convention detectors
166
+ - 95-commit diagnose validation corpus (10 repos)
167
+ - 10 execution flows detected on medium codebases
168
+ - Zero type errors, zero technology hallucinations
155
169
 
156
- Most options are auto-detected. Zero config is the default.
170
+ ## Library API
157
171
 
158
- ## CLI Reference
172
+ ```typescript
173
+ import { analyze, generateMinimalAgentsMd } from 'autodocs-engine';
159
174
 
160
- ```
161
- autodocs-engine init [--full] Generate AGENTS.md (minimal by default, no API key)
162
- autodocs-engine serve [path] Start MCP server
163
- autodocs-engine check Check if AGENTS.md needs regeneration
164
- autodocs-engine analyze [paths...] [options]
175
+ const analysis = await analyze({
176
+ packages: ['./'],
177
+ typeChecking: true, // optional: resolved TypeScript types
178
+ });
165
179
 
166
- Options:
167
- --full Comprehensive output (requires ANTHROPIC_API_KEY)
168
- --minimal Focused output (<500 tokens, no API key needed — default for init)
169
- --telemetry Enable session telemetry (writes to ~/.autodocs/telemetry/)
170
- --format, -f json | agents.md | claude.md | cursorrules
171
- --output, -o Output directory (default: .)
172
- --root Monorepo root directory
173
- --hierarchical Root + per-package output
174
- --merge Preserve human-written sections when regenerating
175
- --verbose, -v Timing details
176
- --dry-run Print to stdout (no file writes)
180
+ const agentsMd = generateMinimalAgentsMd(analysis);
177
181
  ```
178
182
 
179
183
  ## Contributing
@@ -182,11 +186,13 @@ Options:
182
186
  git clone https://github.com/msiric/autodocs-engine.git
183
187
  cd autodocs-engine
184
188
  npm install
185
- npm test # 569 tests
189
+ npm test # 713 tests
186
190
  npm run typecheck # Zero errors
187
191
  npm run build
188
192
  ```
189
193
 
194
+ See [CONTRIBUTING.md](CONTRIBUTING.md) for development workflow.
195
+
190
196
  ## License
191
197
 
192
198
  [MIT](LICENSE)
@@ -23,6 +23,28 @@ const INVERSION_RULES = [
23
23
  rule: () => "Do NOT return arrays from hooks (use { value, setter } not [value, setter])",
24
24
  reason: (c) => `${c.confidence.description} return objects from hooks`,
25
25
  },
26
+ // Phase 1A: Error handling inversions (project-relative, not prescriptive)
27
+ {
28
+ match: /typed error class hierarchy/i,
29
+ rule: (c) => `Do NOT use inline new Error() for domain errors — use typed error subclasses (${c.examples?.[0] ?? "see existing error classes"})`,
30
+ reason: (c) => `${c.confidence.description} define typed error class hierarchies`,
31
+ },
32
+ {
33
+ match: /Result\/Either pattern|Custom Result type/i,
34
+ rule: () => "Do NOT throw exceptions for expected failures — use Result types",
35
+ reason: (c) => `${c.confidence.description} use Result/Either types for error handling`,
36
+ },
37
+ // Phase 1B: Async pattern inversions
38
+ {
39
+ match: /Promise\.all concurrent/i,
40
+ rule: () => "Do NOT await independent async operations sequentially — use Promise.all/allSettled",
41
+ reason: (c) => `${c.confidence.description} use Promise.all for concurrent operations`,
42
+ },
43
+ {
44
+ match: /Sequential await in loops/i,
45
+ rule: () => "Do NOT use await inside loops for independent operations — batch with Promise.all",
46
+ reason: (c) => `${c.confidence.description} contain sequential await in loops`,
47
+ },
26
48
  ];
27
49
  /**
28
50
  * Derive anti-patterns from conventions.
@@ -1 +1 @@
1
- {"version":3,"file":"anti-pattern-detector.js","sourceRoot":"","sources":["../src/anti-pattern-detector.ts"],"names":[],"mappings":"AAAA,wEAAwE;AACxE,0DAA0D;AAI1D,sFAAsF;AACtF,wFAAwF;AACxF,MAAM,eAAe,GAIf;IACJ;QACE,KAAK,EAAE,cAAc;QACrB,IAAI,EAAE,GAAG,EAAE,CAAC,kDAAkD;QAC9D,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,UAAU,CAAC,WAAW,sEAAsE;KACjH;IACD;QACE,KAAK,EAAE,cAAc;QACrB,IAAI,EAAE,GAAG,EAAE,CAAC,mDAAmD;QAC/D,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,UAAU,CAAC,WAAW,oEAAoE;KAC/G;IACD;QACE,KAAK,EAAE,oBAAoB;QAC3B,IAAI,EAAE,GAAG,EAAE,CAAC,kFAAkF;QAC9F,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,UAAU,CAAC,WAAW,uCAAuC;KAClF;IACD;QACE,KAAK,EAAE,uBAAuB;QAC9B,IAAI,EAAE,GAAG,EAAE,CAAC,6EAA6E;QACzF,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,UAAU,CAAC,WAAW,4BAA4B;KACvE;CACF,CAAC;AAEF;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,WAAyB;IAC1D,MAAM,YAAY,GAAkB,EAAE,CAAC;IAEvC,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE,CAAC;QAC/B,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC;QACvC,IAAI,GAAG,GAAG,EAAE;YAAE,SAAS,CAAC,sCAAsC;QAE9D,MAAM,UAAU,GAAsB,GAAG,IAAI,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC;QAEpE,0BAA0B;QAC1B,KAAK,MAAM,IAAI,IAAI,eAAe,EAAE,CAAC;YACnC,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC/B,YAAY,CAAC,IAAI,CAAC;oBAChB,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;oBACrB,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;oBACzB,UAAU;oBACV,WAAW,EAAE,IAAI,CAAC,IAAI;iBACvB,CAAC,CAAC;gBACH,MAAM,CAAC,oCAAoC;YAC7C,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,YAAY,CAAC;AACtB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,wBAAwB,CAAC,iBAA+B;IACtE,OAAO,kBAAkB,CAAC,iBAAiB,CAAC,CAAC;AAC/C,CAAC"}
1
+ {"version":3,"file":"anti-pattern-detector.js","sourceRoot":"","sources":["../src/anti-pattern-detector.ts"],"names":[],"mappings":"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"}
@@ -95,42 +95,46 @@ function classifyByDependencies(packageDir) {
95
95
  }
96
96
  return undefined;
97
97
  }
98
+ const SKIP_DIR_NAMES = new Set(["node_modules", "dist", "build", "coverage", ".git", ".next", ".turbo"]);
99
+ const MAX_DIR_DEPTH = 2;
98
100
  function detectDirectories(parsedFiles, packageDir, publicAPI) {
99
101
  const dirs = [];
100
102
  // Look for src/ directory first
101
103
  const srcDir = join(packageDir, "src");
102
104
  const baseDir = existsSync(srcDir) ? srcDir : packageDir;
103
105
  const baseDirRel = existsSync(srcDir) ? "src" : "";
104
- try {
105
- const entries = readdirSync(baseDir, { withFileTypes: true });
106
- for (const entry of entries) {
107
- if (!entry.isDirectory())
108
- continue;
109
- if (entry.name.startsWith(".") || entry.name === "node_modules")
110
- continue;
111
- const dirRelPath = baseDirRel ? `${baseDirRel}/${entry.name}` : entry.name;
112
- const filesInDir = parsedFiles.filter((f) => f.relativePath.startsWith(`${dirRelPath}/`) && !f.isTestFile && !f.isGeneratedFile);
113
- if (filesInDir.length === 0)
114
- continue;
115
- const purpose = DIRECTORY_PURPOSES[entry.name] ?? `Feature: ${entry.name}`;
116
- // Enhancement 2: Map public exports to this directory
117
- const dirExports = publicAPI.filter((e) => e.sourceFile.startsWith(`${dirRelPath}/`)).map((e) => e.name);
118
- // Enhancement 2: Detect file naming pattern
119
- const pattern = detectFilePattern(filesInDir.map((f) => {
120
- const parts = f.relativePath.split("/");
121
- return parts[parts.length - 1];
122
- }));
123
- dirs.push({
124
- path: dirRelPath,
125
- purpose,
126
- fileCount: filesInDir.length,
127
- exports: dirExports,
128
- pattern,
129
- });
106
+ // BFS scan to depth MAX_DIR_DEPTH — finds workspace package subdirectories in monorepos
107
+ const queue = [
108
+ { absDir: baseDir, relPath: baseDirRel, depth: 0 },
109
+ ];
110
+ while (queue.length > 0) {
111
+ const { absDir, relPath, depth } = queue.shift();
112
+ try {
113
+ for (const entry of readdirSync(absDir, { withFileTypes: true })) {
114
+ if (!entry.isDirectory())
115
+ continue;
116
+ if (entry.name.startsWith(".") || SKIP_DIR_NAMES.has(entry.name))
117
+ continue;
118
+ const entryRel = relPath ? `${relPath}/${entry.name}` : entry.name;
119
+ const filesInDir = parsedFiles.filter((f) => f.relativePath.startsWith(`${entryRel}/`) && !f.isTestFile && !f.isGeneratedFile);
120
+ if (filesInDir.length === 0)
121
+ continue;
122
+ const purpose = DIRECTORY_PURPOSES[entry.name] ?? `Feature: ${entry.name}`;
123
+ const dirExports = publicAPI.filter((e) => e.sourceFile.startsWith(`${entryRel}/`)).map((e) => e.name);
124
+ const pattern = detectFilePattern(filesInDir.map((f) => {
125
+ const parts = f.relativePath.split("/");
126
+ return parts[parts.length - 1];
127
+ }));
128
+ dirs.push({ path: entryRel, purpose, fileCount: filesInDir.length, exports: dirExports, pattern });
129
+ // Queue subdirectories for next depth
130
+ if (depth < MAX_DIR_DEPTH) {
131
+ queue.push({ absDir: join(absDir, entry.name), relPath: entryRel, depth: depth + 1 });
132
+ }
133
+ }
134
+ }
135
+ catch {
136
+ /* can't read directory */
130
137
  }
131
- }
132
- catch {
133
- // Can't read directory
134
138
  }
135
139
  return dirs.sort((a, b) => b.fileCount - a.fileCount);
136
140
  }
@@ -1 +1 @@
1
- {"version":3,"file":"architecture-detector.js","sourceRoot":"","sources":["../src/architecture-detector.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"architecture-detector.js","sourceRoot":"","sources":["../src/architecture-detector.ts"],"names":[],"mappings":"AAAA,iEAAiE;AACjE,0FAA0F;AAE1F,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAChE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAG1C,MAAM,kBAAkB,GAA2B;IACjD,KAAK,EAAE,cAAc;IACrB,UAAU,EAAE,kBAAkB;IAC9B,OAAO,EAAE,oBAAoB;IAC7B,OAAO,EAAE,iBAAiB;IAC1B,SAAS,EAAE,mBAAmB;IAC9B,KAAK,EAAE,kBAAkB;IACzB,UAAU,EAAE,kBAAkB;IAC9B,KAAK,EAAE,WAAW;IAClB,OAAO,EAAE,WAAW;IACpB,GAAG,EAAE,WAAW;IAChB,QAAQ,EAAE,eAAe;IACzB,SAAS,EAAE,eAAe;IAC1B,SAAS,EAAE,WAAW;IACtB,SAAS,EAAE,OAAO;IAClB,IAAI,EAAE,OAAO;IACb,KAAK,EAAE,OAAO;IACd,MAAM,EAAE,aAAa;IACrB,QAAQ,EAAE,UAAU;IACpB,GAAG,EAAE,WAAW;CACjB,CAAC;AAEF,MAAM,UAAU,kBAAkB,CAChC,WAAyB,EACzB,UAAkB,EAClB,SAA2B,EAC3B,UAA8B,EAC9B,YAAuB,EAAE;IAEzB,MAAM,aAAa,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IAE1C,MAAM,UAAU,GAAG,UAAU,IAAI,MAAM,CAAC;IACxC,MAAM,MAAM,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC;IACxF,MAAM,WAAW,GAAG,mBAAmB,CAAC,SAAS,EAAE,WAAW,EAAE,aAAa,CAAC,CAAC;IAC/E,MAAM,WAAW,GAAG,iBAAiB,CAAC,WAAW,EAAE,aAAa,EAAE,SAAS,CAAC,CAAC;IAE7E,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC;AAC1D,CAAC;AAED,SAAS,mBAAmB,CAC1B,SAA2B,EAC3B,WAAyB,EACzB,UAAkB;IAElB,MAAM,cAAc,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;IAC9D,IAAI,cAAc,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAChC,uEAAuE;QACvE,wDAAwD;QACxD,MAAM,iBAAiB,GAAG,sBAAsB,CAAC,UAAU,CAAC,CAAC;QAC7D,IAAI,iBAAiB;YAAE,OAAO,iBAAiB,CAAC;QAEhD,+BAA+B;QAC/B,IAAI,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC;YAAE,OAAO,OAAO,CAAC;QACtD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,KAAK,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,MAAM,CAAC;IACrE,MAAM,UAAU,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC,MAAM,CAAC;IAC/E,MAAM,KAAK,GAAG,cAAc,CAAC,MAAM,CAAC;IAEpC,IAAI,KAAK,GAAG,CAAC,IAAI,KAAK,GAAG,KAAK,GAAG,GAAG;QAAE,OAAO,OAAO,CAAC;IACrD,IAAI,UAAU,GAAG,CAAC,IAAI,UAAU,GAAG,KAAK,GAAG,GAAG;QAAE,OAAO,kBAAkB,CAAC;IAC1E,IAAI,KAAK,GAAG,CAAC,IAAI,UAAU,GAAG,CAAC;QAAE,OAAO,OAAO,CAAC;IAEhD,kEAAkE;IAClE,0BAA0B;IAC1B,MAAM,UAAU,GAAG,WAAW,CAAC,IAAI,CACjC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,eAAe,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,YAAY,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,CAC7G,CAAC;IACF,IAAI,UAAU;QAAE,OAAO,SAAS,CAAC,CAAC,sCAAsC;IAExE,4BAA4B;IAC5B,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,UAAU,EAAE,cAAc,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;QACpF,IAAI,OAAO,CAAC,GAAG;YAAE,OAAO,KAAK,CAAC;IAChC,CAAC;IAAC,MAAM,CAAC;QACP,kBAAkB;IACpB,CAAC;IAED,kDAAkD;IAClD,MAAM,iBAAiB,GAAG,sBAAsB,CAAC,UAAU,CAAC,CAAC;IAC7D,IAAI,iBAAiB;QAAE,OAAO,iBAAiB,CAAC;IAEhD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;GAEG;AACH,SAAS,sBAAsB,CAAC,UAAkB;IAChD,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,UAAU,EAAE,cAAc,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;QACpF,MAAM,OAAO,GAAG;YACd,GAAG,OAAO,CAAC,YAAY;YACvB,GAAG,OAAO,CAAC,eAAe;SAC3B,CAAC;QAEF,MAAM,aAAa,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,eAAe,CAAC,CAAC;QAC1E,IAAI,aAAa,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,OAAO,CAAC;YAAE,OAAO,iBAAiB,CAAC;QAExE,MAAM,cAAc,GAAG,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,mBAAmB,CAAC,CAAC;QAClG,IAAI,cAAc,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,OAAO,CAAC;YAAE,OAAO,YAAY,CAAC;IACtE,CAAC;IAAC,MAAM,CAAC;QACP,kBAAkB;IACpB,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC,CAAC,cAAc,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC;AACzG,MAAM,aAAa,GAAG,CAAC,CAAC;AAExB,SAAS,iBAAiB,CACxB,WAAyB,EACzB,UAAkB,EAClB,SAA2B;IAE3B,MAAM,IAAI,GAAoB,EAAE,CAAC;IAEjC,gCAAgC;IAChC,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;IACvC,MAAM,OAAO,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC;IACzD,MAAM,UAAU,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;IAEnD,wFAAwF;IACxF,MAAM,KAAK,GAAyD;QAClE,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,EAAE;KACnD,CAAC;IAEF,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,KAAK,CAAC,KAAK,EAAG,CAAC;QAClD,IAAI,CAAC;YACH,KAAK,MAAM,KAAK,IAAI,WAAW,CAAC,MAAM,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;gBACjE,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE;oBAAE,SAAS;gBACnC,IAAI,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC;oBAAE,SAAS;gBAE3E,MAAM,QAAQ,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC;gBAEnE,MAAM,UAAU,GAAG,WAAW,CAAC,MAAM,CACnC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,UAAU,CAAC,GAAG,QAAQ,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC,CAAC,eAAe,CACxF,CAAC;gBACF,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;oBAAE,SAAS;gBAEtC,MAAM,OAAO,GAAG,kBAAkB,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,YAAY,KAAK,CAAC,IAAI,EAAE,CAAC;gBAC3E,MAAM,UAAU,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,UAAU,CAAC,GAAG,QAAQ,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;gBACvG,MAAM,OAAO,GAAG,iBAAiB,CAC/B,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;oBACnB,MAAM,KAAK,GAAG,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;oBACxC,OAAO,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;gBACjC,CAAC,CAAC,CACH,CAAC;gBAEF,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,UAAU,CAAC,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC,CAAC;gBAEnG,sCAAsC;gBACtC,IAAI,KAAK,GAAG,aAAa,EAAE,CAAC;oBAC1B,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,GAAG,CAAC,EAAE,CAAC,CAAC;gBACxF,CAAC;YACH,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,0BAA0B;QAC5B,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC;AACxD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,SAAmB;IACnD,8CAA8C;IAC9C,MAAM,KAAK,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,oBAAoB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/F,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,SAAS,CAAC;IAEvC,wCAAwC;IACxC,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,oBAAoB,EAAE,EAAE,CAAC,CAAC,CAAC;IACvE,MAAM,SAAS,GAAG,sBAAsB,CAAC,SAAS,CAAC,CAAC;IAEpD,6BAA6B;IAC7B,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,MAAM,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;IAC1B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACtB,IAAI,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,EAAE,CAAC;YACzD,MAAM,IAAI,IAAI,CAAC;QACjB,CAAC;aAAM,CAAC;YACN,MAAM;QACR,CAAC;IACH,CAAC;IAED,6BAA6B;IAC7B,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,MAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;IAChE,MAAM,QAAQ,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;IAC7B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACzC,MAAM,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;QACzB,IAAI,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,EAAE,CAAC;YACzD,MAAM,GAAG,IAAI,GAAG,MAAM,CAAC;QACzB,CAAC;aAAM,CAAC;YACN,MAAM;QACR,CAAC;IACH,CAAC;IAED,8CAA8C;IAC9C,IAAI,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;QAClD,OAAO,SAAS,CAAC,CAAC,4CAA4C;IAChE,CAAC;IAED,qEAAqE;IACrE,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,SAAS,CAAC;IAE7D,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,QAAQ,MAAM,GAAG,SAAS,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;IAE5G,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAS,sBAAsB,CAAC,SAAmB;IACjD,MAAM,MAAM,GAAG,IAAI,GAAG,EAAkB,CAAC;IACzC,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;QAC7B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;QAC3C,IAAI,KAAK,EAAE,CAAC;YACV,MAAM,GAAG,GAAG,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;YAC3B,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAC9C,CAAC;IACH,CAAC;IACD,IAAI,MAAM,GAAG,KAAK,CAAC;IACnB,IAAI,QAAQ,GAAG,CAAC,CAAC;IACjB,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,EAAE,CAAC;QAClC,IAAI,KAAK,GAAG,QAAQ,EAAE,CAAC;YACrB,MAAM,GAAG,GAAG,CAAC;YACb,QAAQ,GAAG,KAAK,CAAC;QACnB,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -369,6 +369,9 @@ function walkForDynamicImports(node, imports) {
369
369
  function computeContentSignals(content, sourceFile) {
370
370
  // AST-based signals (E-17)
371
371
  let tryCatchCount = 0;
372
+ let promiseAllCount = 0;
373
+ let asyncFunctionCount = 0;
374
+ let awaitInLoopCount = 0;
372
375
  const hookCounts = {
373
376
  useMemo: 0,
374
377
  useCallback: 0,
@@ -377,23 +380,45 @@ function computeContentSignals(content, sourceFile) {
377
380
  useQuery: 0,
378
381
  useMutation: 0,
379
382
  };
380
- function walkForSignals(node) {
383
+ function walkForSignals(node, insideLoop = false) {
381
384
  if (ts.isTryStatement(node)) {
382
385
  tryCatchCount++;
383
386
  }
387
+ // Phase 1B: Async pattern signals
388
+ if ((ts.isFunctionDeclaration(node) || ts.isArrowFunction(node) || ts.isMethodDeclaration(node)) &&
389
+ node.modifiers?.some((m) => m.kind === ts.SyntaxKind.AsyncKeyword)) {
390
+ asyncFunctionCount++;
391
+ }
392
+ if (ts.isAwaitExpression(node) && insideLoop) {
393
+ awaitInLoopCount++;
394
+ }
395
+ // Track if we're inside a loop for await-in-loop detection
396
+ const isLoop = ts.isForStatement(node) ||
397
+ ts.isForOfStatement(node) ||
398
+ ts.isForInStatement(node) ||
399
+ ts.isWhileStatement(node) ||
400
+ ts.isDoStatement(node);
384
401
  if (ts.isCallExpression(node)) {
385
402
  let calleeName;
386
403
  if (ts.isIdentifier(node.expression)) {
387
404
  calleeName = node.expression.text;
388
405
  }
389
406
  else if (ts.isPropertyAccessExpression(node.expression)) {
390
- calleeName = node.expression.name.text;
407
+ // Detect Promise.all/allSettled/race
408
+ const obj = node.expression.expression;
409
+ const method = node.expression.name.text;
410
+ if (ts.isIdentifier(obj) &&
411
+ obj.text === "Promise" &&
412
+ (method === "all" || method === "allSettled" || method === "race")) {
413
+ promiseAllCount++;
414
+ }
415
+ calleeName = method;
391
416
  }
392
417
  if (calleeName && calleeName in hookCounts) {
393
418
  hookCounts[calleeName]++;
394
419
  }
395
420
  }
396
- ts.forEachChild(node, walkForSignals);
421
+ ts.forEachChild(node, (child) => walkForSignals(child, insideLoop || isLoop));
397
422
  }
398
423
  walkForSignals(sourceFile);
399
424
  // Regex-based signals (E-17: keep — no clean AST equivalent)
@@ -408,6 +433,9 @@ function computeContentSignals(content, sourceFile) {
408
433
  useStateCount: hookCounts.useState,
409
434
  useQueryCount: hookCounts.useQuery,
410
435
  useMutationCount: hookCounts.useMutation,
436
+ promiseAllCount,
437
+ asyncFunctionCount,
438
+ awaitInLoopCount,
411
439
  jestMockCount,
412
440
  hasDisplayName,
413
441
  hasErrorBoundary,