@eduardo-afonso/codebase-intelligence 0.1.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.
- package/README.md +147 -0
- package/README.pt-BR.md +147 -0
- package/dist/analysis/DependencyAnalyzer.d.ts +8 -0
- package/dist/analysis/DependencyAnalyzer.d.ts.map +1 -0
- package/dist/analysis/DependencyAnalyzer.js +13 -0
- package/dist/analysis/DependencyAnalyzer.js.map +1 -0
- package/dist/analysis/ImpactAnalyzer.d.ts +25 -0
- package/dist/analysis/ImpactAnalyzer.d.ts.map +1 -0
- package/dist/analysis/ImpactAnalyzer.js +41 -0
- package/dist/analysis/ImpactAnalyzer.js.map +1 -0
- package/dist/cli/Watcher.d.ts +40 -0
- package/dist/cli/Watcher.d.ts.map +1 -0
- package/dist/cli/Watcher.js +80 -0
- package/dist/cli/Watcher.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +243 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/core/AnalysisCache.d.ts +43 -0
- package/dist/core/AnalysisCache.d.ts.map +1 -0
- package/dist/core/AnalysisCache.js +120 -0
- package/dist/core/AnalysisCache.js.map +1 -0
- package/dist/core/Codebase.d.ts +39 -0
- package/dist/core/Codebase.d.ts.map +1 -0
- package/dist/core/Codebase.js +122 -0
- package/dist/core/Codebase.js.map +1 -0
- package/dist/core/errors.d.ts +15 -0
- package/dist/core/errors.d.ts.map +1 -0
- package/dist/core/errors.js +29 -0
- package/dist/core/errors.js.map +1 -0
- package/dist/core/interfaces.d.ts +6 -0
- package/dist/core/interfaces.d.ts.map +1 -0
- package/dist/core/interfaces.js +2 -0
- package/dist/core/interfaces.js.map +1 -0
- package/dist/core/types.d.ts +29 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +2 -0
- package/dist/core/types.js.map +1 -0
- package/dist/discovery/FileScanner.d.ts +13 -0
- package/dist/discovery/FileScanner.d.ts.map +1 -0
- package/dist/discovery/FileScanner.js +55 -0
- package/dist/discovery/FileScanner.js.map +1 -0
- package/dist/discovery/IgnoreMatcher.d.ts +11 -0
- package/dist/discovery/IgnoreMatcher.d.ts.map +1 -0
- package/dist/discovery/IgnoreMatcher.js +30 -0
- package/dist/discovery/IgnoreMatcher.js.map +1 -0
- package/dist/discovery/ProjectDetector.d.ts +17 -0
- package/dist/discovery/ProjectDetector.d.ts.map +1 -0
- package/dist/discovery/ProjectDetector.js +82 -0
- package/dist/discovery/ProjectDetector.js.map +1 -0
- package/dist/graph/DependencyGraph.d.ts +48 -0
- package/dist/graph/DependencyGraph.d.ts.map +1 -0
- package/dist/graph/DependencyGraph.js +114 -0
- package/dist/graph/DependencyGraph.js.map +1 -0
- package/dist/graph/GraphBuilder.d.ts +11 -0
- package/dist/graph/GraphBuilder.d.ts.map +1 -0
- package/dist/graph/GraphBuilder.js +22 -0
- package/dist/graph/GraphBuilder.js.map +1 -0
- package/dist/index/FileIndex.d.ts +12 -0
- package/dist/index/FileIndex.d.ts.map +1 -0
- package/dist/index/FileIndex.js +26 -0
- package/dist/index/FileIndex.js.map +1 -0
- package/dist/index/SymbolIndex.d.ts +18 -0
- package/dist/index/SymbolIndex.d.ts.map +1 -0
- package/dist/index/SymbolIndex.js +40 -0
- package/dist/index/SymbolIndex.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -0
- package/dist/parsers/Parser.d.ts +3 -0
- package/dist/parsers/Parser.d.ts.map +1 -0
- package/dist/parsers/Parser.js +2 -0
- package/dist/parsers/Parser.js.map +1 -0
- package/dist/parsers/ParserRegistry.d.ts +7 -0
- package/dist/parsers/ParserRegistry.d.ts.map +1 -0
- package/dist/parsers/ParserRegistry.js +10 -0
- package/dist/parsers/ParserRegistry.js.map +1 -0
- package/dist/parsers/typescript/TypeScriptParser.d.ts +9 -0
- package/dist/parsers/typescript/TypeScriptParser.d.ts.map +1 -0
- package/dist/parsers/typescript/TypeScriptParser.js +134 -0
- package/dist/parsers/typescript/TypeScriptParser.js.map +1 -0
- package/dist/search/CodeSearch.d.ts +20 -0
- package/dist/search/CodeSearch.d.ts.map +1 -0
- package/dist/search/CodeSearch.js +54 -0
- package/dist/search/CodeSearch.js.map +1 -0
- package/package.json +51 -0
package/README.md
ADDED
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
# Codebase Intelligence
|
|
2
|
+
|
|
3
|
+
**Codebase Intelligence** is a professional-grade Node.js library designed to parse, index, and understand codebases programmatically. It scans files, builds dependency graphs, and indexes symbols (like classes, functions, and interfaces) directly from the AST.
|
|
4
|
+
|
|
5
|
+
## The Problem It Solves
|
|
6
|
+
|
|
7
|
+
Modern applications are complex. When developers (or AI agents) need to understand how pieces of code fit together, simple text search (like `grep`) falls short. Finding exactly where a class is used, understanding the impact of modifying a specific file, or tracing transitive dependencies usually requires manual work or a heavy IDE.
|
|
8
|
+
|
|
9
|
+
Codebase Intelligence acts as a foundational "Knowledge Graph" for your code. It provides structured insights into your codebase, serving as the perfect backbone for AI-assisted development tools, code generation, RAG pipelines, and automated code review systems.
|
|
10
|
+
|
|
11
|
+
## Features
|
|
12
|
+
|
|
13
|
+
- **Project Discovery**: Automatically detects project languages, frameworks (React, Next.js, etc.), and package managers.
|
|
14
|
+
- **AST Parsing**: Leverages `ts-morph` for robust, regex-free TypeScript/JavaScript parsing to extract classes, functions, methods, and variables.
|
|
15
|
+
- **Symbol Indexing**: Instantly query your codebase for symbols by name, type, or file.
|
|
16
|
+
- **Dependency Graph**: Builds a directed graph of imports, `extends`, and `implements`.
|
|
17
|
+
- **Code Search**: Lexical and structural search across files and symbols.
|
|
18
|
+
- **Impact Analysis**: Understand the direct and indirect consequences of modifying any given file, including related test files.
|
|
19
|
+
- **CLI Included**: Run analyses and queries directly from your terminal.
|
|
20
|
+
|
|
21
|
+
---
|
|
22
|
+
|
|
23
|
+
## Installation
|
|
24
|
+
|
|
25
|
+
```bash
|
|
26
|
+
npm install codebase-intelligence
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
*(Note: Currently in MVP phase. Ensure your project has TypeScript setup to use properly).*
|
|
30
|
+
|
|
31
|
+
## Quick Start
|
|
32
|
+
|
|
33
|
+
You can use the library programmatically in your own scripts:
|
|
34
|
+
|
|
35
|
+
```typescript
|
|
36
|
+
import { Codebase } from 'codebase-intelligence';
|
|
37
|
+
|
|
38
|
+
async function run() {
|
|
39
|
+
// 1. Load the codebase (scans files and detects project info)
|
|
40
|
+
const codebase = await Codebase.load('./src');
|
|
41
|
+
|
|
42
|
+
// 2. Analyze the AST and build the dependency graph
|
|
43
|
+
await codebase.analyze();
|
|
44
|
+
|
|
45
|
+
// 3. Query the data
|
|
46
|
+
console.log('Total files:', codebase.files().length);
|
|
47
|
+
|
|
48
|
+
// Search for a specific class or function
|
|
49
|
+
const searchResults = codebase.search('AuthService');
|
|
50
|
+
console.log('Search Results:', searchResults);
|
|
51
|
+
|
|
52
|
+
// Check the impact of a file change
|
|
53
|
+
const impact = codebase.impact('src/auth/AuthService.ts');
|
|
54
|
+
console.log('Files directly depending on this:', impact.direct);
|
|
55
|
+
console.log('Files indirectly depending on this:', impact.indirect);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
run();
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
---
|
|
62
|
+
|
|
63
|
+
## Public API Reference
|
|
64
|
+
|
|
65
|
+
### `Codebase.load(path: string, options?: CodebaseOptions): Promise<Codebase>`
|
|
66
|
+
Initializes the instance, scanning the given directory path. `options.ignore` accepts an array of glob patterns to exclude.
|
|
67
|
+
|
|
68
|
+
### `codebase.analyze(): Promise<void>`
|
|
69
|
+
Parses the discovered files and populates the internal Symbol Index and Dependency Graph. Must be called before querying symbols or dependencies.
|
|
70
|
+
|
|
71
|
+
### `codebase.files(): CodebaseFile[]`
|
|
72
|
+
Returns all indexed files in the project.
|
|
73
|
+
|
|
74
|
+
### `codebase.symbols(): CodeSymbol[]`
|
|
75
|
+
Returns all extracted symbols (classes, functions, interfaces, etc.) from the project.
|
|
76
|
+
|
|
77
|
+
### `codebase.search(query: string, options?: SearchOptions): SearchResult[]`
|
|
78
|
+
Performs a lexical/structural search for files and symbols matching the query.
|
|
79
|
+
|
|
80
|
+
### `codebase.dependencies(file: string): string[]`
|
|
81
|
+
Returns files that the target file directly depends on (imports).
|
|
82
|
+
|
|
83
|
+
### `codebase.dependents(file: string): string[]`
|
|
84
|
+
Returns files that directly depend on the target file.
|
|
85
|
+
|
|
86
|
+
### `codebase.impact(file: string): ImpactResult`
|
|
87
|
+
Returns `{ direct: string[], indirect: string[], tests: string[] }`, revealing the full blast radius of a change to the given file.
|
|
88
|
+
|
|
89
|
+
---
|
|
90
|
+
|
|
91
|
+
## CLI Reference
|
|
92
|
+
|
|
93
|
+
Codebase Intelligence comes with a CLI for terminal use:
|
|
94
|
+
|
|
95
|
+
```bash
|
|
96
|
+
# Analyze the current directory and output a summary
|
|
97
|
+
npx codebase-intelligence analyze .
|
|
98
|
+
|
|
99
|
+
# Search for a specific symbol
|
|
100
|
+
npx codebase-intelligence search "UserService" .
|
|
101
|
+
|
|
102
|
+
# View what a file depends on
|
|
103
|
+
npx codebase-intelligence dependencies "src/auth/AuthService.ts" .
|
|
104
|
+
|
|
105
|
+
# View what depends on a file
|
|
106
|
+
npx codebase-intelligence dependents "src/auth/AuthService.ts" .
|
|
107
|
+
|
|
108
|
+
# View the full impact of a file
|
|
109
|
+
npx codebase-intelligence impact "src/auth/AuthService.ts" .
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
---
|
|
113
|
+
|
|
114
|
+
## Architecture Overview
|
|
115
|
+
|
|
116
|
+
Codebase Intelligence is designed in modular layers to allow future extensibility (e.g., adding C# or Python parsers):
|
|
117
|
+
|
|
118
|
+
1. **Discovery Layer**: Responsible for finding files (`FileScanner`) and detecting project properties (`ProjectDetector`).
|
|
119
|
+
2. **Analysis Layer**: Houses parsers (`TypeScriptParser`) that turn raw code into structured `CodeSymbol` and `CodeDependency` objects.
|
|
120
|
+
3. **Knowledge Layer**: Indexes the data for fast retrieval (`SymbolIndex`, `FileIndex`, `DependencyGraph`).
|
|
121
|
+
|
|
122
|
+
For deeper architectural details, see [docs/architecture.md](docs/architecture.md).
|
|
123
|
+
|
|
124
|
+
---
|
|
125
|
+
|
|
126
|
+
## Roadmap
|
|
127
|
+
|
|
128
|
+
The current version (MVP) establishes the deterministic structural analysis of a codebase. Future versions will introduce:
|
|
129
|
+
|
|
130
|
+
- **AI Adapters**: Interfaces to connect external LLMs (OpenAI, Anthropic, Gemini, Ollama).
|
|
131
|
+
- **RAG & Embeddings Pipeline**: Automatic chunking and vector storage integrations for semantic code search.
|
|
132
|
+
- **Context Engine**: Tools to dynamically generate context payloads for LLMs based on the dependency graph.
|
|
133
|
+
- **Multi-language Support**: Expanding the `ParserRegistry` to handle Python, Go, and C#.
|
|
134
|
+
|
|
135
|
+
---
|
|
136
|
+
|
|
137
|
+
## Contributing
|
|
138
|
+
|
|
139
|
+
Contributions are welcome. Please ensure that you:
|
|
140
|
+
1. Discuss major architectural changes in an issue first.
|
|
141
|
+
2. Ensure all tests pass (`npm run test:run`).
|
|
142
|
+
3. Ensure no type errors (`npm run typecheck`).
|
|
143
|
+
4. Avoid introducing unnecessary dependencies. The core library aims to remain lightweight.
|
|
144
|
+
|
|
145
|
+
## License
|
|
146
|
+
|
|
147
|
+
ISC License. See the `LICENSE` file for details.
|
package/README.pt-BR.md
ADDED
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
# Codebase Intelligence
|
|
2
|
+
|
|
3
|
+
**Codebase Intelligence** é uma biblioteca Node.js de nível profissional, projetada para analisar, indexar e compreender bases de código (codebases) de forma programática. Ela escaneia arquivos, constrói grafos de dependência e indexa símbolos (como classes, funções e interfaces) diretamente a partir da AST.
|
|
4
|
+
|
|
5
|
+
## O Problema que Resolve
|
|
6
|
+
|
|
7
|
+
Aplicações modernas são complexas. Quando desenvolvedores (ou agentes de IA) precisam entender como as partes do código se encaixam, a busca textual simples (como `grep`) não é suficiente. Encontrar exatamente onde uma classe é usada, entender o impacto de modificar um arquivo específico, ou rastrear dependências transitivas geralmente exige trabalho manual ou uma IDE pesada.
|
|
8
|
+
|
|
9
|
+
O Codebase Intelligence funciona como um "Grafo de Conhecimento" fundamental para o seu código. Ele fornece insights estruturados sobre sua base de código, servindo como a espinha dorsal perfeita para ferramentas de desenvolvimento assistido por IA, geração de código, pipelines de RAG e sistemas automatizados de revisão de código.
|
|
10
|
+
|
|
11
|
+
## Funcionalidades
|
|
12
|
+
|
|
13
|
+
- **Descoberta de Projeto**: Detecta automaticamente linguagens do projeto, frameworks (React, Next.js, etc.) e gerenciadores de pacotes.
|
|
14
|
+
- **Análise via AST**: Utiliza o `ts-morph` para uma análise robusta e livre de regex de TypeScript/JavaScript, extraindo classes, funções, métodos e variáveis.
|
|
15
|
+
- **Indexação de Símbolos**: Consulte instantaneamente sua base de código por símbolos, seja por nome, tipo ou arquivo.
|
|
16
|
+
- **Grafo de Dependências**: Constrói um grafo direcionado de imports, `extends` e `implements`.
|
|
17
|
+
- **Busca de Código**: Busca léxica e estrutural em arquivos e símbolos.
|
|
18
|
+
- **Análise de Impacto**: Entenda as consequências diretas e indiretas de modificar qualquer arquivo, incluindo arquivos de teste relacionados.
|
|
19
|
+
- **CLI Incluída**: Execute análises e consultas diretamente pelo terminal.
|
|
20
|
+
|
|
21
|
+
---
|
|
22
|
+
|
|
23
|
+
## Instalação
|
|
24
|
+
|
|
25
|
+
```bash
|
|
26
|
+
npm install codebase-intelligence
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
*(Nota: Atualmente em fase de MVP. Certifique-se de que seu projeto tenha o TypeScript configurado para uso adequado).*
|
|
30
|
+
|
|
31
|
+
## Início Rápido
|
|
32
|
+
|
|
33
|
+
Você pode usar a biblioteca de forma programática em seus próprios scripts:
|
|
34
|
+
|
|
35
|
+
```typescript
|
|
36
|
+
import { Codebase } from 'codebase-intelligence';
|
|
37
|
+
|
|
38
|
+
async function run() {
|
|
39
|
+
// 1. Carrega a base de código (escaneia arquivos e detecta informações do projeto)
|
|
40
|
+
const codebase = await Codebase.load('./src');
|
|
41
|
+
|
|
42
|
+
// 2. Analisa a AST e constrói o grafo de dependências
|
|
43
|
+
await codebase.analyze();
|
|
44
|
+
|
|
45
|
+
// 3. Consulta os dados
|
|
46
|
+
console.log('Total de arquivos:', codebase.files().length);
|
|
47
|
+
|
|
48
|
+
// Busca por uma classe ou função específica
|
|
49
|
+
const searchResults = codebase.search('AuthService');
|
|
50
|
+
console.log('Resultados da busca:', searchResults);
|
|
51
|
+
|
|
52
|
+
// Verifica o impacto de uma alteração em um arquivo
|
|
53
|
+
const impact = codebase.impact('src/auth/AuthService.ts');
|
|
54
|
+
console.log('Arquivos que dependem diretamente deste:', impact.direct);
|
|
55
|
+
console.log('Arquivos que dependem indiretamente deste:', impact.indirect);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
run();
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
---
|
|
62
|
+
|
|
63
|
+
## Referência da API Pública
|
|
64
|
+
|
|
65
|
+
### `Codebase.load(path: string, options?: CodebaseOptions): Promise<Codebase>`
|
|
66
|
+
Inicializa a instância, escaneando o diretório informado. `options.ignore` aceita um array de padrões glob para excluir arquivos.
|
|
67
|
+
|
|
68
|
+
### `codebase.analyze(): Promise<void>`
|
|
69
|
+
Analisa os arquivos descobertos e popula o Índice de Símbolos e o Grafo de Dependências internos. Deve ser chamado antes de consultar símbolos ou dependências.
|
|
70
|
+
|
|
71
|
+
### `codebase.files(): CodebaseFile[]`
|
|
72
|
+
Retorna todos os arquivos indexados do projeto.
|
|
73
|
+
|
|
74
|
+
### `codebase.symbols(): CodeSymbol[]`
|
|
75
|
+
Retorna todos os símbolos extraídos (classes, funções, interfaces, etc.) do projeto.
|
|
76
|
+
|
|
77
|
+
### `codebase.search(query: string, options?: SearchOptions): SearchResult[]`
|
|
78
|
+
Realiza uma busca léxica/estrutural por arquivos e símbolos que correspondam à consulta.
|
|
79
|
+
|
|
80
|
+
### `codebase.dependencies(file: string): string[]`
|
|
81
|
+
Retorna os arquivos dos quais o arquivo informado depende diretamente (imports).
|
|
82
|
+
|
|
83
|
+
### `codebase.dependents(file: string): string[]`
|
|
84
|
+
Retorna os arquivos que dependem diretamente do arquivo informado.
|
|
85
|
+
|
|
86
|
+
### `codebase.impact(file: string): ImpactResult`
|
|
87
|
+
Retorna `{ direct: string[], indirect: string[], tests: string[] }`, revelando o raio de impacto completo de uma alteração no arquivo informado.
|
|
88
|
+
|
|
89
|
+
---
|
|
90
|
+
|
|
91
|
+
## Referência da CLI
|
|
92
|
+
|
|
93
|
+
O Codebase Intelligence vem com uma CLI para uso no terminal:
|
|
94
|
+
|
|
95
|
+
```bash
|
|
96
|
+
# Analisa o diretório atual e exibe um resumo
|
|
97
|
+
npx codebase-intelligence analyze .
|
|
98
|
+
|
|
99
|
+
# Busca por um símbolo específico
|
|
100
|
+
npx codebase-intelligence search "UserService" .
|
|
101
|
+
|
|
102
|
+
# Exibe as dependências de um arquivo
|
|
103
|
+
npx codebase-intelligence dependencies "src/auth/AuthService.ts" .
|
|
104
|
+
|
|
105
|
+
# Exibe o que depende de um arquivo
|
|
106
|
+
npx codebase-intelligence dependents "src/auth/AuthService.ts" .
|
|
107
|
+
|
|
108
|
+
# Exibe o impacto completo de um arquivo
|
|
109
|
+
npx codebase-intelligence impact "src/auth/AuthService.ts" .
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
---
|
|
113
|
+
|
|
114
|
+
## Visão Geral da Arquitetura
|
|
115
|
+
|
|
116
|
+
O Codebase Intelligence é projetado em camadas modulares para permitir extensibilidade futura (por exemplo, adicionar parsers de C# ou Python):
|
|
117
|
+
|
|
118
|
+
1. **Camada de Descoberta**: Responsável por encontrar arquivos (`FileScanner`) e detectar propriedades do projeto (`ProjectDetector`).
|
|
119
|
+
2. **Camada de Análise**: Contém os parsers (`TypeScriptParser`) que transformam código bruto em objetos estruturados `CodeSymbol` e `CodeDependency`.
|
|
120
|
+
3. **Camada de Conhecimento**: Indexa os dados para recuperação rápida (`SymbolIndex`, `FileIndex`, `DependencyGraph`).
|
|
121
|
+
|
|
122
|
+
Para detalhes arquiteturais mais profundos, veja [docs/architecture.md](docs/architecture.md).
|
|
123
|
+
|
|
124
|
+
---
|
|
125
|
+
|
|
126
|
+
## Roadmap
|
|
127
|
+
|
|
128
|
+
A versão atual (MVP) estabelece a análise estrutural determinística de uma base de código. Versões futuras irão introduzir:
|
|
129
|
+
|
|
130
|
+
- **Adaptadores de IA**: Interfaces para conectar LLMs externos (OpenAI, Anthropic, Gemini, Ollama).
|
|
131
|
+
- **Pipeline de RAG e Embeddings**: Chunking automático e integrações de armazenamento vetorial para busca semântica de código.
|
|
132
|
+
- **Context Engine**: Ferramentas para gerar dinamicamente payloads de contexto para LLMs com base no grafo de dependências.
|
|
133
|
+
- **Suporte Multi-linguagem**: Expansão do `ParserRegistry` para suportar Python, Go e C#.
|
|
134
|
+
|
|
135
|
+
---
|
|
136
|
+
|
|
137
|
+
## Contribuindo
|
|
138
|
+
|
|
139
|
+
Contribuições são bem-vindas. Por favor, certifique-se de que você:
|
|
140
|
+
1. Discuta mudanças arquiteturais importantes em uma issue primeiro.
|
|
141
|
+
2. Garanta que todos os testes passem (`npm run test:run`).
|
|
142
|
+
3. Garanta que não haja erros de tipo (`npm run typecheck`).
|
|
143
|
+
4. Evite introduzir dependências desnecessárias. A biblioteca principal busca permanecer leve.
|
|
144
|
+
|
|
145
|
+
## Licença
|
|
146
|
+
|
|
147
|
+
Licença ISC. Veja o arquivo `LICENSE` para mais detalhes.
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { DependencyGraph } from '../graph/DependencyGraph.js';
|
|
2
|
+
export declare class DependencyAnalyzer {
|
|
3
|
+
private graph;
|
|
4
|
+
constructor(graph: DependencyGraph);
|
|
5
|
+
dependencies(file: string): string[];
|
|
6
|
+
dependents(file: string): string[];
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=DependencyAnalyzer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DependencyAnalyzer.d.ts","sourceRoot":"","sources":["../../src/analysis/DependencyAnalyzer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAEnE,qBAAa,kBAAkB;IACjB,OAAO,CAAC,KAAK;IAAzB,YAAoB,KAAK,EAAE,eAAe,EAAI;IAEvC,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAE1C;IAEM,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAExC;CACF"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export class DependencyAnalyzer {
|
|
2
|
+
graph;
|
|
3
|
+
constructor(graph) {
|
|
4
|
+
this.graph = graph;
|
|
5
|
+
}
|
|
6
|
+
dependencies(file) {
|
|
7
|
+
return this.graph.dependenciesOf(file);
|
|
8
|
+
}
|
|
9
|
+
dependents(file) {
|
|
10
|
+
return this.graph.dependentsOf(file);
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=DependencyAnalyzer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DependencyAnalyzer.js","sourceRoot":"","sources":["../../src/analysis/DependencyAnalyzer.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,kBAAkB;IACT,KAAK;IAAzB,YAAoB,KAAsB;qBAAtB,KAAK;IAAoB,CAAC;IAEvC,YAAY,CAAC,IAAY;QAC9B,OAAO,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;IACzC,CAAC;IAEM,UAAU,CAAC,IAAY;QAC5B,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;IACvC,CAAC;CACF"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { DependencyGraph } from '../graph/DependencyGraph.js';
|
|
2
|
+
export interface ImpactResult {
|
|
3
|
+
direct: string[];
|
|
4
|
+
indirect: string[];
|
|
5
|
+
tests: string[];
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Analyzes the impact of changing a file.
|
|
9
|
+
*
|
|
10
|
+
* - `direct`: files that directly import/depend on the given file
|
|
11
|
+
* - `indirect`: all transitive dependents minus the direct ones
|
|
12
|
+
* - `tests`: discovered by convention only — files whose basename matches
|
|
13
|
+
* `<basename>.test.ts`, `<basename>.spec.ts`, `<basename>.test.js`, or
|
|
14
|
+
* `<basename>.spec.js` among the nodes in the graph.
|
|
15
|
+
* This uses NO relationship proof from the graph itself — it is purely
|
|
16
|
+
* name-based convention. If the convention is insufficient for a project,
|
|
17
|
+
* the list will be empty.
|
|
18
|
+
*/
|
|
19
|
+
export declare class ImpactAnalyzer {
|
|
20
|
+
private graph;
|
|
21
|
+
constructor(graph: DependencyGraph);
|
|
22
|
+
impact(file: string): ImpactResult;
|
|
23
|
+
private findRelatedTests;
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=ImpactAnalyzer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ImpactAnalyzer.d.ts","sourceRoot":"","sources":["../../src/analysis/ImpactAnalyzer.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAEnE,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAED;;;;;;;;;;;GAWG;AACH,qBAAa,cAAc;IACb,OAAO,CAAC,KAAK;IAAzB,YAAoB,KAAK,EAAE,eAAe,EAAI;IAEvC,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,CAUxC;IAED,OAAO,CAAC,gBAAgB;CAezB"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import * as path from 'path';
|
|
2
|
+
/**
|
|
3
|
+
* Analyzes the impact of changing a file.
|
|
4
|
+
*
|
|
5
|
+
* - `direct`: files that directly import/depend on the given file
|
|
6
|
+
* - `indirect`: all transitive dependents minus the direct ones
|
|
7
|
+
* - `tests`: discovered by convention only — files whose basename matches
|
|
8
|
+
* `<basename>.test.ts`, `<basename>.spec.ts`, `<basename>.test.js`, or
|
|
9
|
+
* `<basename>.spec.js` among the nodes in the graph.
|
|
10
|
+
* This uses NO relationship proof from the graph itself — it is purely
|
|
11
|
+
* name-based convention. If the convention is insufficient for a project,
|
|
12
|
+
* the list will be empty.
|
|
13
|
+
*/
|
|
14
|
+
export class ImpactAnalyzer {
|
|
15
|
+
graph;
|
|
16
|
+
constructor(graph) {
|
|
17
|
+
this.graph = graph;
|
|
18
|
+
}
|
|
19
|
+
impact(file) {
|
|
20
|
+
const direct = this.graph.dependentsOf(file);
|
|
21
|
+
const directSet = new Set(direct);
|
|
22
|
+
const allTransitive = this.graph.allDependentsOf(file);
|
|
23
|
+
const indirect = allTransitive.filter(dep => !directSet.has(dep));
|
|
24
|
+
const tests = this.findRelatedTests(file);
|
|
25
|
+
return { direct, indirect, tests };
|
|
26
|
+
}
|
|
27
|
+
findRelatedTests(file) {
|
|
28
|
+
const basename = path.basename(file, path.extname(file));
|
|
29
|
+
const testSuffixes = ['.test.ts', '.spec.ts', '.test.js', '.spec.js'];
|
|
30
|
+
const candidateNames = testSuffixes.map(s => `${basename}${s}`);
|
|
31
|
+
const testFiles = [];
|
|
32
|
+
for (const node of this.graph.nodes()) {
|
|
33
|
+
const nodeName = path.basename(node);
|
|
34
|
+
if (candidateNames.includes(nodeName)) {
|
|
35
|
+
testFiles.push(node);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
return testFiles;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=ImpactAnalyzer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ImpactAnalyzer.js","sourceRoot":"","sources":["../../src/analysis/ImpactAnalyzer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAS7B;;;;;;;;;;;GAWG;AACH,MAAM,OAAO,cAAc;IACL,KAAK;IAAzB,YAAoB,KAAsB;qBAAtB,KAAK;IAAoB,CAAC;IAEvC,MAAM,CAAC,IAAY;QACxB,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;QAC7C,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC;QAElC,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QACvD,MAAM,QAAQ,GAAG,aAAa,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;QAElE,MAAM,KAAK,GAAG,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;QAE1C,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;IACrC,CAAC;IAEO,gBAAgB,CAAC,IAAY;QACnC,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;QACzD,MAAM,YAAY,GAAG,CAAC,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC;QACtE,MAAM,cAAc,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,QAAQ,GAAG,CAAC,EAAE,CAAC,CAAC;QAEhE,MAAM,SAAS,GAAa,EAAE,CAAC;QAC/B,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC;YACtC,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YACrC,IAAI,cAAc,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACtC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACvB,CAAC;QACH,CAAC;QAED,OAAO,SAAS,CAAC;IACnB,CAAC;CACF"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
export type WatchEventHandler = (changedFiles: ReadonlySet<string>) => Promise<void>;
|
|
2
|
+
export interface WatcherOptions {
|
|
3
|
+
/** Debounce window in ms (default: 300) */
|
|
4
|
+
debounceMs?: number;
|
|
5
|
+
/** Called after debounce with the set of changed absolute paths */
|
|
6
|
+
onChanged: WatchEventHandler;
|
|
7
|
+
/**
|
|
8
|
+
* Injection point for tests — replaces the real `fs.watch` call.
|
|
9
|
+
* The factory receives the directory and a raw event callback, and must
|
|
10
|
+
* return a { close() } handle.
|
|
11
|
+
*/
|
|
12
|
+
watchFactory?: (dir: string, signal: AbortSignal, rawHandler: (filename: string) => void) => void;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Lightweight file watcher built on Node's native `fs.watch` with:
|
|
16
|
+
* - `recursive: true` (Node ≥ 18.8)
|
|
17
|
+
* - Configurable debounce window
|
|
18
|
+
* - Graceful shutdown via AbortController
|
|
19
|
+
*
|
|
20
|
+
* `dependenciesOf`/`dependentsOf` are direct (not transitive).
|
|
21
|
+
* For transitive traversal use `allDependenciesOf` / `allDependentsOf`.
|
|
22
|
+
*/
|
|
23
|
+
export declare class Watcher {
|
|
24
|
+
private readonly debounceMs;
|
|
25
|
+
private readonly onChanged;
|
|
26
|
+
private readonly watchFactory;
|
|
27
|
+
private abortController;
|
|
28
|
+
private debounceTimer;
|
|
29
|
+
private pendingFiles;
|
|
30
|
+
constructor(opts: WatcherOptions);
|
|
31
|
+
start(dir: string): void;
|
|
32
|
+
stop(): void;
|
|
33
|
+
/**
|
|
34
|
+
* Exposed for testing: directly enqueue a file change.
|
|
35
|
+
*/
|
|
36
|
+
_enqueue(absolutePath: string): void;
|
|
37
|
+
private handleRaw;
|
|
38
|
+
private scheduleFlush;
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=Watcher.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Watcher.d.ts","sourceRoot":"","sources":["../../src/cli/Watcher.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,iBAAiB,GAAG,CAAC,YAAY,EAAE,WAAW,CAAC,MAAM,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;AAErF,MAAM,WAAW,cAAc;IAC7B,2CAA2C;IAC3C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,mEAAmE;IACnE,SAAS,EAAE,iBAAiB,CAAC;IAC7B;;;;OAIG;IACH,YAAY,CAAC,EAAE,CACb,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,WAAW,EACnB,UAAU,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,KACnC,IAAI,CAAC;CACX;AAED;;;;;;;;GAQG;AACH,qBAAa,OAAO;IAClB,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAoB;IAC9C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAiC;IAE9D,OAAO,CAAC,eAAe,CAAgC;IACvD,OAAO,CAAC,aAAa,CAA8C;IACnE,OAAO,CAAC,YAAY,CAAqB;IAEzC,YAAY,IAAI,EAAE,cAAc,EAI/B;IAEM,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CA4B9B;IAEM,IAAI,IAAI,IAAI,CAQlB;IAID;;OAEG;IACI,QAAQ,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAE1C;IAED,OAAO,CAAC,SAAS;IAMjB,OAAO,CAAC,aAAa;CAWtB"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import * as fs from 'fs';
|
|
2
|
+
/**
|
|
3
|
+
* Lightweight file watcher built on Node's native `fs.watch` with:
|
|
4
|
+
* - `recursive: true` (Node ≥ 18.8)
|
|
5
|
+
* - Configurable debounce window
|
|
6
|
+
* - Graceful shutdown via AbortController
|
|
7
|
+
*
|
|
8
|
+
* `dependenciesOf`/`dependentsOf` are direct (not transitive).
|
|
9
|
+
* For transitive traversal use `allDependenciesOf` / `allDependentsOf`.
|
|
10
|
+
*/
|
|
11
|
+
export class Watcher {
|
|
12
|
+
debounceMs;
|
|
13
|
+
onChanged;
|
|
14
|
+
watchFactory;
|
|
15
|
+
abortController = null;
|
|
16
|
+
debounceTimer = null;
|
|
17
|
+
pendingFiles = new Set();
|
|
18
|
+
constructor(opts) {
|
|
19
|
+
this.debounceMs = opts.debounceMs ?? 300;
|
|
20
|
+
this.onChanged = opts.onChanged;
|
|
21
|
+
this.watchFactory = opts.watchFactory;
|
|
22
|
+
}
|
|
23
|
+
start(dir) {
|
|
24
|
+
if (this.abortController) {
|
|
25
|
+
throw new Error('Watcher is already running. Call stop() first.');
|
|
26
|
+
}
|
|
27
|
+
this.abortController = new AbortController();
|
|
28
|
+
const signal = this.abortController.signal;
|
|
29
|
+
if (this.watchFactory) {
|
|
30
|
+
// Testable path — delegate to injected factory
|
|
31
|
+
this.watchFactory(dir, signal, (filename) => this.handleRaw(dir, filename));
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
// Production path — native fs.watch
|
|
35
|
+
const watcher = fs.watch(dir, { recursive: true, signal }, (_event, filename) => {
|
|
36
|
+
if (filename)
|
|
37
|
+
this.handleRaw(dir, filename);
|
|
38
|
+
});
|
|
39
|
+
watcher.on('error', (err) => {
|
|
40
|
+
// AbortError is expected on stop() — swallow it silently
|
|
41
|
+
if (err.name !== 'AbortError') {
|
|
42
|
+
console.error('[watch] error:', err.message);
|
|
43
|
+
}
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
stop() {
|
|
48
|
+
if (this.debounceTimer !== null) {
|
|
49
|
+
clearTimeout(this.debounceTimer);
|
|
50
|
+
this.debounceTimer = null;
|
|
51
|
+
}
|
|
52
|
+
this.pendingFiles.clear();
|
|
53
|
+
this.abortController?.abort();
|
|
54
|
+
this.abortController = null;
|
|
55
|
+
}
|
|
56
|
+
// ---- Internal -------------------------------------------------------
|
|
57
|
+
/**
|
|
58
|
+
* Exposed for testing: directly enqueue a file change.
|
|
59
|
+
*/
|
|
60
|
+
_enqueue(absolutePath) {
|
|
61
|
+
this.handleRaw('', absolutePath, true);
|
|
62
|
+
}
|
|
63
|
+
handleRaw(dir, filename, alreadyAbsolute = false) {
|
|
64
|
+
const fullPath = alreadyAbsolute ? filename : `${dir}/${filename}`.replace(/\\/g, '/');
|
|
65
|
+
this.pendingFiles.add(fullPath);
|
|
66
|
+
this.scheduleFlush();
|
|
67
|
+
}
|
|
68
|
+
scheduleFlush() {
|
|
69
|
+
if (this.debounceTimer !== null) {
|
|
70
|
+
clearTimeout(this.debounceTimer);
|
|
71
|
+
}
|
|
72
|
+
this.debounceTimer = setTimeout(async () => {
|
|
73
|
+
this.debounceTimer = null;
|
|
74
|
+
const snapshot = new Set(this.pendingFiles);
|
|
75
|
+
this.pendingFiles.clear();
|
|
76
|
+
await this.onChanged(snapshot);
|
|
77
|
+
}, this.debounceMs);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=Watcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Watcher.js","sourceRoot":"","sources":["../../src/cli/Watcher.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":""}
|