@aiderdesk/tree-sitter-utils 0.1.0 → 0.2.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/BENCHMARK.md +112 -0
- package/README.md +34 -0
- package/dist/__tests__/mention-extractor.test.d.ts +2 -0
- package/dist/__tests__/mention-extractor.test.d.ts.map +1 -0
- package/dist/__tests__/tree-renderer.test.d.ts +2 -0
- package/dist/__tests__/tree-renderer.test.d.ts.map +1 -0
- package/dist/cache-manager.d.ts +7 -4
- package/dist/cache-manager.d.ts.map +1 -1
- package/dist/dependency-index.d.ts +9 -0
- package/dist/dependency-index.d.ts.map +1 -0
- package/dist/file-utils.d.ts.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +670 -487
- package/dist/index.js.map +4 -4
- package/dist/mention-extractor.d.ts +4 -0
- package/dist/mention-extractor.d.ts.map +1 -0
- package/dist/repo-map-service.d.ts +28 -0
- package/dist/repo-map-service.d.ts.map +1 -0
- package/dist/repo-map-worker.d.ts +2 -0
- package/dist/repo-map-worker.d.ts.map +1 -0
- package/dist/repo-map-worker.js +907 -0
- package/dist/repo-map-worker.js.map +7 -0
- package/dist/symbol-extractor.d.ts +6 -2
- package/dist/symbol-extractor.d.ts.map +1 -1
- package/dist/tree-renderer.d.ts +1 -1
- package/dist/tree-renderer.d.ts.map +1 -1
- package/dist/tree-sitter-analyzer.d.ts +10 -4
- package/dist/tree-sitter-analyzer.d.ts.map +1 -1
- package/dist/tree-sitter-parser.d.ts +6 -5
- package/dist/tree-sitter-parser.d.ts.map +1 -1
- package/dist/types.d.ts +3 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +11 -8
- package/resources/queries/c_sharp-tags.scm +9 -4
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/language-detector.ts", "../src/repo-map-worker.ts", "../src/tree-sitter-analyzer.ts", "../src/tree-sitter-parser.ts", "../src/wasm-downloader.ts", "../src/logger.ts", "../src/constants.ts", "../src/symbol-extractor.ts", "../src/dependency-index.ts", "../src/tree-renderer.ts", "../src/cache-manager.ts", "../src/file-utils.ts"],
|
|
4
|
+
"sourcesContent": ["import * as path from 'path';\n\nconst LANGUAGE_MAP: Record<string, string> = {\n '.py': 'python',\n '.js': 'javascript',\n '.jsx': 'javascript',\n '.ts': 'typescript',\n '.tsx': 'tsx',\n '.mjs': 'javascript',\n '.cjs': 'javascript',\n '.java': 'java',\n '.go': 'go',\n '.rs': 'rust',\n '.c': 'c',\n '.cpp': 'cpp',\n '.cc': 'cpp',\n '.cxx': 'cpp',\n '.h': 'c',\n '.hpp': 'cpp',\n '.hxx': 'cpp',\n '.cs': 'c_sharp',\n '.dart': 'dart',\n '.hs': 'haskell',\n '.lhs': 'haskell',\n '.jl': 'julia',\n '.ml': 'ocaml',\n '.mli': 'ocaml_interface',\n '.php': 'php',\n '.rb': 'ruby',\n '.rake': 'ruby',\n '.gemspec': 'ruby',\n '.scala': 'scala',\n '.sc': 'scala',\n};\n\nexport function detectLanguage(filePath: string): string | null {\n const ext = path.extname(filePath).toLowerCase();\n return LANGUAGE_MAP[ext] || null;\n}\n\nexport function isLanguageSupported(filePath: string): boolean {\n return detectLanguage(filePath) !== null;\n}\n\nexport function getSupportedExtensions(): string[] {\n return Object.keys(LANGUAGE_MAP);\n}\n\nexport function getSupportedLanguages(): string[] {\n return [...new Set(Object.values(LANGUAGE_MAP))];\n}\n", "import { parentPort, workerData } from 'worker_threads';\n\nimport { TreeSitterAnalyzer } from './tree-sitter-analyzer';\nimport type { RepoMapRequest, RepoMapResponse } from './repo-map-service';\n\nconst analyzers = new Map<string, TreeSitterAnalyzer>();\nconst configuration = workerData as { cachePath?: string };\n\nparentPort!.on('message', async (request: RepoMapRequest) => {\n try {\n const root = request.options.root;\n let analyzer = analyzers.get(root);\n if (!analyzer) {\n if (analyzers.size >= 2) {\n const oldest = analyzers.keys().next().value!;\n await analyzers.get(oldest)!.dispose();\n analyzers.delete(oldest);\n }\n analyzer = new TreeSitterAnalyzer(configuration);\n }\n analyzers.delete(root);\n analyzers.set(root, analyzer);\n const output = await analyzer.getRepoMap(request.options);\n parentPort!.postMessage({\n id: request.id,\n output,\n } satisfies RepoMapResponse);\n } catch (error) {\n parentPort!.postMessage({\n id: request.id,\n error: String(error),\n } satisfies RepoMapResponse);\n }\n});\n", "import * as path from 'path';\n\nimport { TreeSitterParser } from './tree-sitter-parser';\nimport { SymbolExtractor } from './symbol-extractor';\nimport { DependencyIndex } from './dependency-index';\nimport { TreeRenderer } from './tree-renderer';\nimport { CacheManager } from './cache-manager';\nimport { getAllFiles } from './file-utils';\nimport { RepoMapOptions, SymbolOptions, Symbol, ParseResult } from './types';\n\nexport class TreeSitterAnalyzer {\n private readonly parser = new TreeSitterParser();\n private readonly symbolExtractor = new SymbolExtractor(this.parser);\n private readonly treeRenderer = new TreeRenderer();\n private readonly cacheManager: CacheManager;\n private initialization: Promise<void> | undefined;\n private queue: Promise<unknown> = Promise.resolve();\n private graph: DependencyIndex | undefined;\n private revision = -1;\n private outputs = new Map<string, string>();\n\n constructor(options: { cachePath?: string } = {}) {\n this.cacheManager = new CacheManager(options.cachePath);\n this.symbolExtractor.setCacheManager(this.cacheManager);\n }\n\n initialize(): Promise<void> {\n this.initialization ??= Promise.all([this.parser.initialize(), this.cacheManager.initialize()]).then(() => undefined);\n return this.initialization;\n }\n\n getRepoMap(options: RepoMapOptions): Promise<string> {\n const result = this.queue.then(() => this.generateRepoMap(options));\n this.queue = result.catch(() => undefined);\n return result;\n }\n\n private async generateRepoMap(options: RepoMapOptions): Promise<string> {\n options.signal?.throwIfAborted();\n await this.initialize();\n const root = path.resolve(options.root);\n const normalize = (files: Set<string> = new Set()): Set<string> =>\n new Set([...files].map((file) => path.relative(root, path.resolve(root, file)).replaceAll(path.sep, '/')));\n const mentionedFiles = normalize(options.mentionedFiles);\n const chatFiles = normalize(options.chatFiles);\n const mentionedIdents = options.mentionedIdents ?? new Set<string>();\n const files = options.files?.length ? options.files.map((file) => path.resolve(root, file)) : await getAllFiles(root, options.excludePatterns);\n options.signal?.throwIfAborted();\n const tags = await this.symbolExtractor.extractTags(files, root, options.signal, true);\n if (!tags.length) return '';\n if (this.revision !== this.symbolExtractor.revision) {\n this.graph = new DependencyIndex(tags);\n this.revision = this.symbolExtractor.revision;\n this.outputs.clear();\n }\n if (options.prepareOnly) return '';\n const key = JSON.stringify([[...mentionedFiles].sort(), [...mentionedIdents].sort(), [...chatFiles].sort(), options.maxLines]);\n const cached = this.outputs.get(key);\n if (cached !== undefined) return cached;\n options.signal?.throwIfAborted();\n const ranked = this.graph!.rank(mentionedFiles, mentionedIdents);\n options.signal?.throwIfAborted();\n const output = await this.treeRenderer.render(ranked, chatFiles, options.maxLines, root);\n options.signal?.throwIfAborted();\n if (this.outputs.size >= 8) this.outputs.delete(this.outputs.keys().next().value!);\n this.outputs.set(key, output);\n return output;\n }\n\n extractSymbols(filePaths: string[], options?: SymbolOptions): Promise<Symbol[]> {\n const result = this.queue.then(async () => {\n await this.initialize();\n if (options?.useCache === false) this.symbolExtractor.setCacheManager(null);\n try {\n const tags = await this.symbolExtractor.extractTags(filePaths, options?.rootDir);\n return tags.map((tag) => ({\n name: tag.name,\n kind: tag.kind,\n line: tag.line,\n file: tag.fname,\n relativeFile: tag.rel_fname,\n }));\n } finally {\n this.symbolExtractor.setCacheManager(this.cacheManager);\n }\n });\n this.queue = result.catch(() => undefined);\n return result;\n }\n\n async parseFile(filePath: string): Promise<ParseResult> {\n await this.initialize();\n const { detectLanguage } = await import('./language-detector');\n return {\n tags: await this.parser.parseFile(filePath),\n file: filePath,\n language: detectLanguage(filePath) || 'unknown',\n };\n }\n\n async dispose(): Promise<void> {\n await this.queue;\n await this.parser.dispose();\n this.cacheManager.close();\n this.graph = undefined;\n this.outputs.clear();\n }\n}\n", "import * as fs from 'fs/promises';\nimport * as path from 'path';\n\nimport { Parser, Language, Query } from 'web-tree-sitter';\n\nimport { Tag } from './types';\nimport { detectLanguage } from './language-detector';\nimport { downloadWasmForLanguage } from './wasm-downloader';\nimport { QUERIES_DIR } from './constants';\n\nlet runtimeInitialization: Promise<void> | undefined;\n\nexport class TreeSitterParser {\n private parser: Parser | null = null;\n private languages = new Map<string, Promise<{ language: Language; query: Query }>>();\n private initialization: Promise<void> | undefined;\n private queue: Promise<unknown> = Promise.resolve();\n\n initialize(): Promise<void> {\n this.initialization ??= this.initializeParser();\n return this.initialization;\n }\n\n private async initializeParser(): Promise<void> {\n runtimeInitialization ??= Parser.init();\n await runtimeInitialization;\n this.parser = new Parser();\n }\n\n private loadLanguage(name: string): Promise<{ language: Language; query: Query }> {\n let pending = this.languages.get(name);\n if (!pending) {\n pending = (async () => {\n const buffer = await downloadWasmForLanguage(name);\n if (!buffer) {\n throw new Error(`No WASM available for ${name}`);\n }\n const language = await Language.load(buffer);\n const source = await fs.readFile(path.join(QUERIES_DIR, `${name}-tags.scm`), 'utf-8');\n const query = new Query(language, source);\n if (name === 'c_sharp') {\n for (const capture of query.captureNames) {\n if (!capture.startsWith('name.')) query.disableCapture(capture);\n }\n }\n return { language, query };\n })();\n this.languages.set(name, pending);\n void pending.catch(() => this.languages.delete(name));\n }\n return pending;\n }\n\n parseFile(filePath: string, rootDir?: string, compactReferences = false): Promise<Tag[]> {\n const result = this.queue.then(() => this.parse(filePath, rootDir, compactReferences));\n this.queue = result.catch(() => undefined);\n return result;\n }\n\n private async parse(filePath: string, rootDir?: string, compactReferences = false): Promise<Tag[]> {\n await this.initialize();\n const name = detectLanguage(filePath);\n if (!name || !this.parser) {\n return [];\n }\n const { language, query } = await this.loadLanguage(name);\n const source = await fs.readFile(filePath, 'utf-8');\n this.parser.setLanguage(language);\n const tree = this.parser.parse(source);\n if (!tree) {\n throw new Error(`Unable to parse ${filePath}`);\n }\n try {\n const tags: Tag[] = [];\n const references = new Map<string, Tag>();\n const relative = rootDir ? path.relative(rootDir, filePath).replaceAll(path.sep, '/') : filePath;\n for (const match of query.matches(tree.rootNode)) {\n for (const capture of match.captures) {\n if (capture.name.startsWith('name.')) {\n const kind = capture.name.includes('definition') ? 'def' : 'ref';\n const name = capture.node.text;\n const previous = compactReferences && kind === 'ref' ? references.get(name) : undefined;\n if (previous) {\n previous.count = (previous.count ?? 1) + 1;\n continue;\n }\n const tag: Tag = {\n rel_fname: relative,\n fname: filePath,\n line: capture.node.startPosition.row,\n // Detach sliced node text so cached tags cannot retain entire source files.\n name: Buffer.from(name, 'utf8').toString('utf8'),\n kind,\n };\n tags.push(tag);\n if (compactReferences && kind === 'ref') references.set(tag.name, tag);\n }\n }\n }\n return tags;\n } finally {\n tree.delete();\n }\n }\n\n async dispose(): Promise<void> {\n await this.queue;\n for (const pending of this.languages.values()) {\n try {\n const { query } = await pending;\n query.delete();\n } catch {\n // Failed language loads have no query to release.\n }\n }\n this.languages.clear();\n this.parser?.delete();\n this.parser = null;\n this.initialization = undefined;\n }\n}\n", "import * as fs from 'fs/promises';\nimport * as path from 'path';\nimport * as os from 'os';\n\nimport logger from './logger';\n\nconst LANGUAGE_WASM_MAP: Record<string, { url: string; file: string }> = {\n python: {\n url: 'https://unpkg.com/tree-sitter-python/tree-sitter-python.wasm',\n file: 'tree-sitter-python.wasm',\n },\n javascript: {\n url: 'https://unpkg.com/tree-sitter-javascript/tree-sitter-javascript.wasm',\n file: 'tree-sitter-javascript.wasm',\n },\n typescript: {\n url: 'https://unpkg.com/tree-sitter-typescript/tree-sitter-typescript.wasm',\n file: 'tree-sitter-typescript.wasm',\n },\n tsx: {\n url: 'https://unpkg.com/tree-sitter-typescript/tree-sitter-tsx.wasm',\n file: 'tree-sitter-tsx.wasm',\n },\n java: {\n url: 'https://unpkg.com/tree-sitter-java/tree-sitter-java.wasm',\n file: 'tree-sitter-java.wasm',\n },\n go: {\n url: 'https://unpkg.com/tree-sitter-go/tree-sitter-go.wasm',\n file: 'tree-sitter-go.wasm',\n },\n rust: {\n url: 'https://unpkg.com/tree-sitter-rust/tree-sitter-rust.wasm',\n file: 'tree-sitter-rust.wasm',\n },\n c: {\n url: 'https://unpkg.com/tree-sitter-c/tree-sitter-c.wasm',\n file: 'tree-sitter-c.wasm',\n },\n cpp: {\n url: 'https://unpkg.com/tree-sitter-cpp/tree-sitter-cpp.wasm',\n file: 'tree-sitter-cpp.wasm',\n },\n ruby: {\n url: 'https://unpkg.com/tree-sitter-ruby/tree-sitter-ruby.wasm',\n file: 'tree-sitter-ruby.wasm',\n },\n php: {\n url: 'https://unpkg.com/tree-sitter-php/tree-sitter-php.wasm',\n file: 'tree-sitter-php.wasm',\n },\n scala: {\n url: 'https://unpkg.com/tree-sitter-scala/tree-sitter-scala.wasm',\n file: 'tree-sitter-scala.wasm',\n },\n dart: {\n url: 'https://unpkg.com/tree-sitter-dart/tree-sitter-dart.wasm',\n file: 'tree-sitter-dart.wasm',\n },\n ocaml: {\n url: 'https://unpkg.com/tree-sitter-ocaml/tree-sitter-ocaml.wasm',\n file: 'tree-sitter-ocaml.wasm',\n },\n ocaml_interface: {\n url: 'https://unpkg.com/tree-sitter-ocaml/tree-sitter-ocaml_interface.wasm',\n file: 'tree-sitter-ocaml_interface.wasm',\n },\n c_sharp: {\n url: 'https://unpkg.com/tree-sitter-c-sharp@0.23.5/tree-sitter-c_sharp.wasm',\n file: 'tree-sitter-c_sharp-0.23.5.wasm',\n },\n haskell: {\n url: 'https://unpkg.com/tree-sitter-haskell/tree-sitter-haskell.wasm',\n file: 'tree-sitter-haskell.wasm',\n },\n julia: {\n url: 'https://unpkg.com/tree-sitter-julia/tree-sitter-julia.wasm',\n file: 'tree-sitter-julia.wasm',\n },\n};\n\nfunction getCacheDir(): string {\n const platform = os.platform();\n const homeDir = os.homedir();\n\n if (platform === 'darwin') {\n return path.join(homeDir, 'Library', 'Caches', 'aiderdesk', 'tree-sitter');\n } else if (platform === 'win32') {\n return path.join(process.env.APPDATA || path.join(homeDir, 'AppData', 'Roaming'), 'aiderdesk', 'tree-sitter');\n } else {\n return path.join(homeDir, '.cache', 'aiderdesk', 'tree-sitter');\n }\n}\n\nexport async function downloadWasmForLanguage(language: string): Promise<Buffer | null> {\n const config = LANGUAGE_WASM_MAP[language];\n if (!config) {\n logger.warn(`No WASM configuration for language: ${language}`);\n return null;\n }\n\n const cacheDir = getCacheDir();\n const wasmPath = path.join(cacheDir, 'wasm', config.file);\n\n try {\n // Try to load from cache first\n try {\n const buffer = await fs.readFile(wasmPath);\n logger.debug(`Loaded WASM for ${language} from cache: ${wasmPath}`);\n return buffer;\n } catch {\n // Not in cache, download it\n }\n\n // Download WASM file\n logger.info(`Downloading WASM for ${language} from ${config.url}`);\n\n const response = await fetch(config.url, { redirect: 'follow' });\n\n if (!response.ok) {\n throw new Error(`Failed to download ${language} WASM: ${response.status} ${response.statusText}`);\n }\n\n const buffer = Buffer.from(await response.arrayBuffer());\n\n // Save to cache\n await fs.mkdir(path.dirname(wasmPath), { recursive: true });\n await fs.writeFile(wasmPath, buffer);\n\n logger.info(`Downloaded and cached WASM for ${language} (${Math.round(buffer.byteLength / 1024)} KB)`);\n\n return buffer;\n } catch (error) {\n logger.error(`Failed to download WASM for ${language}:`, error);\n return null;\n }\n}\n\nexport function getLanguageWasmConfig(language: string): { url: string; file: string } | null {\n return LANGUAGE_WASM_MAP[language] || null;\n}\n\nexport function getSupportedLanguagesForWasm(): string[] {\n return Object.keys(LANGUAGE_WASM_MAP);\n}\n", "/* eslint-disable no-console */\n\nexport interface Logger {\n info: (message: string, ...args: unknown[]) => void;\n warn: (message: string, ...args: unknown[]) => void;\n error: (message: string, ...args: unknown[]) => void;\n debug: (message: string, ...args: unknown[]) => void;\n}\n\nconst defaultLogger: Logger = {\n info: (message: string, ...args: unknown[]) => console.log(`[TreeSitterUtils] ${message}`, ...args),\n warn: (message: string, ...args: unknown[]) => console.warn(`[TreeSitterUtils] ${message}`, ...args),\n error: (message: string, ...args: unknown[]) => console.error(`[TreeSitterUtils] ${message}`, ...args),\n debug: (message: string, ...args: unknown[]) => {\n if (process.env.DEBUG_TREE_SITTER) {\n console.debug(`[TreeSitterUtils] ${message}`, ...args);\n }\n },\n};\n\nlet currentLogger = defaultLogger;\n\nexport function setLogger(logger: Logger): void {\n currentLogger = logger;\n}\n\nexport function getLogger(): Logger {\n return currentLogger;\n}\n\nexport default currentLogger;\n", "import * as path from 'path';\nimport { fileURLToPath } from 'url';\n\n// Support both CommonJS and ESM\nconst getDirname = (): string => {\n // @ts-ignore - __dirname is defined in CommonJS\n if (typeof __dirname !== 'undefined') {\n // @ts-ignore\n return __dirname;\n }\n return path.dirname(fileURLToPath(import.meta.url));\n};\n\nconst dirName = getDirname();\n\nexport const RESOURCES_DIR = path.join(dirName, '..', 'resources');\nexport const QUERIES_DIR = path.join(RESOURCES_DIR, 'queries');\nexport const WASM_DIR = path.join(RESOURCES_DIR, 'wasm');\n", "import * as fs from 'fs/promises';\nimport * as path from 'path';\n\nimport { Tag } from './types';\nimport { TreeSitterParser } from './tree-sitter-parser';\nimport { isLanguageSupported } from './language-detector';\nimport { CacheManager } from './cache-manager';\nimport logger from './logger';\n\nexport class SymbolExtractor {\n private cacheManager: CacheManager | null = null;\n private memory = new Map<string, { fingerprint: string; tags: Tag[] }>();\n private lastRoot: string | undefined;\n private lastFiles = '';\n revision = 0;\n\n constructor(private readonly parser: TreeSitterParser) {}\n\n setCacheManager(cacheManager: CacheManager | null): void {\n this.cacheManager = cacheManager;\n }\n\n async extractTags(files: string[], rootDir?: string, signal?: AbortSignal, compactReferences = false): Promise<Tag[]> {\n const allTags: Tag[] = [];\n const supported = files.filter(isLanguageSupported);\n const fileKey = JSON.stringify([compactReferences, supported]);\n if (this.lastRoot !== rootDir || this.lastFiles !== fileKey) {\n this.revision++;\n this.memory.clear();\n this.lastRoot = rootDir;\n this.lastFiles = fileKey;\n }\n for (let i = 0; i < supported.length; i += 50) {\n signal?.throwIfAborted();\n const results = await Promise.all(\n supported.slice(i, i + 50).map(async (file) => {\n try {\n const before = await fs.stat(file);\n const fingerprint = `${compactReferences}:${before.mtimeMs}:${before.ctimeMs}:${before.size}`;\n const memory = this.memory.get(file);\n if (this.cacheManager && memory?.fingerprint === fingerprint) {\n return memory.tags;\n }\n this.revision++;\n const cached = await this.cacheManager?.getFileCache(file);\n let tags: Tag[];\n if (cached?.fingerprint === fingerprint) {\n const relative = rootDir ? path.relative(rootDir, file).replaceAll(path.sep, '/') : file;\n tags = cached.tags.map((tag) => ({\n ...tag,\n rel_fname: relative,\n }));\n } else {\n tags = await this.parser.parseFile(file, rootDir, compactReferences);\n const after = await fs.stat(file);\n if (`${compactReferences}:${after.mtimeMs}:${after.ctimeMs}:${after.size}` !== fingerprint) {\n return tags;\n }\n await this.cacheManager?.setFileCache(file, before.mtimeMs, tags, fingerprint);\n }\n this.memory.set(file, { fingerprint, tags });\n return tags;\n } catch (error) {\n this.revision++;\n this.memory.delete(file);\n logger.error(`[SymbolExtractor] Error processing ${file}:`, error);\n return [];\n }\n }),\n );\n for (const tags of results) {\n for (const tag of tags) allTags.push(tag);\n }\n }\n signal?.throwIfAborted();\n return allTags;\n }\n\n filterDefinitions(tags: Tag[]): Tag[] {\n return tags.filter((tag) => tag.kind === 'def');\n }\n\n filterReferences(tags: Tag[]): Tag[] {\n return tags.filter((tag) => tag.kind === 'ref');\n }\n\n groupTagsByFile(tags: Tag[]): Map<string, Tag[]> {\n const grouped = new Map<string, Tag[]>();\n for (const tag of tags) {\n const fileTags = grouped.get(tag.rel_fname) || [];\n fileTags.push(tag);\n grouped.set(tag.rel_fname, fileTags);\n }\n return grouped;\n }\n}\n", "import { RankedDefinition, Tag } from './types';\n\ntype Relation = {\n definers: Set<string>;\n sources: Map<string, number>;\n};\n\nexport class DependencyIndex {\n private definitions: Tag[] = [];\n private relations: Relation[] = [];\n private outbound = new Map<string, number>();\n\n constructor(tags: Tag[]) {\n const definitions = new Map<string, Set<string>>();\n const references = new Map<string, Map<string, number>>();\n for (const tag of tags) {\n if (tag.kind === 'def') {\n this.definitions.push(tag);\n let files = definitions.get(tag.name);\n if (!files) definitions.set(tag.name, (files = new Set()));\n files.add(tag.rel_fname);\n this.outbound.set(tag.rel_fname, 0);\n } else {\n let counts = references.get(tag.name);\n if (!counts) references.set(tag.name, (counts = new Map()));\n counts.set(tag.rel_fname, (counts.get(tag.rel_fname) ?? 0) + (tag.count ?? 1));\n }\n }\n for (const [name, definers] of definitions) {\n const counts = references.get(name);\n if (!counts) continue;\n let multiplier = 1;\n if (\n (/^[a-z][a-z0-9_]*$/.test(name) && name.includes('_')) ||\n (/^[a-z][a-z0-9-]*$/.test(name) && name.includes('-')) ||\n (/^[a-z][a-zA-Z0-9]*$/.test(name) && /[A-Z]/.test(name))\n )\n multiplier *= 10;\n if (name.startsWith('_')) multiplier *= 0.1;\n if (definers.size > 5) multiplier *= 0.1;\n const sources = new Map<string, number>();\n for (const [file, count] of counts) {\n const targets = definers.size - Number(definers.has(file));\n if (!targets) continue;\n const weight = multiplier * Math.sqrt(count);\n sources.set(file, weight);\n this.outbound.set(file, (this.outbound.get(file) ?? 0) + weight * targets);\n }\n if (sources.size) this.relations.push({ definers, sources });\n }\n }\n\n rank(mentionedFiles = new Set<string>(), mentionedIdents = new Set<string>()): RankedDefinition[] {\n const nodes = [...this.outbound.keys()];\n const count = nodes.length;\n if (!count) return [];\n const mentionedDefinitions = new Set(this.definitions.filter((tag) => mentionedIdents.has(tag.name)).map((tag) => tag.rel_fname));\n const weights = new Map(nodes.map((node) => [node, Number(mentionedFiles.has(node)) + Number(mentionedDefinitions.has(node))]));\n const total = [...weights.values()].reduce((sum, weight) => sum + weight, 0);\n const personalization = new Map(nodes.map((node) => [node, total ? weights.get(node)! / total : 1 / count]));\n let ranks = new Map(nodes.map((node) => [node, 1 / count]));\n for (let iteration = 0; iteration < 100; iteration++) {\n let dangling = 0;\n for (const node of nodes) {\n if (!this.outbound.get(node)) dangling += ranks.get(node)!;\n }\n const base = 0.85 * dangling + 0.15;\n const next = new Map(nodes.map((node) => [node, base * personalization.get(node)!]));\n for (const { definers, sources } of this.relations) {\n let incoming = 0;\n for (const [source, weight] of sources) {\n incoming += (0.85 * ranks.get(source)! * weight) / this.outbound.get(source)!;\n }\n for (const target of definers) {\n // Each identifier is a weighted complete bipartite relation, excluding self-edges.\n const self = sources.get(target);\n const contribution = incoming - (self ? (0.85 * ranks.get(target)! * self) / this.outbound.get(target)! : 0);\n next.set(target, next.get(target)! + contribution);\n }\n }\n let error = 0;\n for (const node of nodes) error += Math.abs(next.get(node)! - ranks.get(node)!);\n ranks = next;\n if (error < count * 1e-6) break;\n if (iteration === 99) throw new Error('Repository map PageRank did not converge');\n }\n return this.definitions\n .map((tag) => ({\n rel_fname: tag.rel_fname,\n name: tag.name,\n line: tag.line,\n rank: ranks.get(tag.rel_fname)! * (this.outbound.get(tag.rel_fname) ? 2 : 1),\n }))\n .sort((a, b) => b.rank - a.rank);\n }\n}\n", "import * as fs from 'fs/promises';\nimport * as path from 'path';\n\nimport { RankedDefinition } from './types';\nimport logger from './logger';\n\nexport class TreeRenderer {\n async render(rankedDefinitions: RankedDefinition[], chatFiles: Set<string>, maxLines?: number, root = process.cwd()): Promise<string> {\n // Filter out chat files\n const filtered = rankedDefinitions.filter((def) => !chatFiles.has(def.rel_fname));\n\n // Group by file\n const byFile = new Map<string, RankedDefinition[]>();\n for (const def of filtered) {\n const fileDefs = byFile.get(def.rel_fname) || [];\n fileDefs.push(def);\n byFile.set(def.rel_fname, fileDefs);\n }\n\n const maximumRanks = new Map<string, number>();\n for (const def of filtered) maximumRanks.set(def.rel_fname, Math.max(maximumRanks.get(def.rel_fname) ?? -Infinity, def.rank));\n\n // Sort files by highest rank in file\n const sortedFiles = Array.from(byFile.entries()).sort((a, b) => {\n const maxRankA = maximumRanks.get(a[0])!;\n const maxRankB = maximumRanks.get(b[0])!;\n return maxRankB - maxRankA;\n });\n\n const totalFiles = sortedFiles.length;\n\n // If no maxLines specified, render everything\n if (!maxLines) {\n return this.renderAllFiles(sortedFiles, root);\n }\n\n // If more files than maxLines, just list filenames\n if (totalFiles * 2 > maxLines) {\n return this.renderFileListOnly(sortedFiles, maxLines);\n }\n\n // Calculate lines per file (at least 2 lines per file: 1 for content + 1 for \"...\" if truncated)\n // Account for the filename line (1 line per file)\n const headerLines = totalFiles;\n const availableLines = maxLines - headerLines;\n const linesPerFile = Math.max(1, Math.floor(availableLines / totalFiles));\n\n return this.renderWithLineLimit(sortedFiles, linesPerFile, root);\n }\n\n private async renderAllFiles(sortedFiles: [string, RankedDefinition[]][], root: string): Promise<string> {\n let output = '';\n for (const [file, definitions] of sortedFiles) {\n output += `\\n${file}:\\n`;\n\n // Sort definitions by line number\n definitions.sort((a, b) => a.line - b.line);\n\n // Get unique lines and render\n const lines = Array.from(new Set(definitions.map((d) => d.line)));\n const treeLines = await this.renderFileTree(path.resolve(root, file), lines, Infinity);\n output += treeLines;\n }\n\n return output.trim();\n }\n\n private renderFileListOnly(sortedFiles: [string, RankedDefinition[]][], maxLines: number): string {\n let output = '';\n const filesToShow = sortedFiles.slice(0, maxLines - 1); // Reserve 1 line for \"...\"\n\n for (const [file] of filesToShow) {\n output += `${file}\\n`;\n }\n\n if (sortedFiles.length > filesToShow.length) {\n output += '...\\n';\n }\n\n return output.trim();\n }\n\n private async renderWithLineLimit(sortedFiles: [string, RankedDefinition[]][], linesPerFile: number, root: string): Promise<string> {\n let output = '';\n\n for (const [file, definitions] of sortedFiles) {\n // Sort definitions by rank (highest first) then by line number\n definitions.sort((a, b) => {\n if (a.rank !== b.rank) {\n return b.rank - a.rank;\n }\n return a.line - b.line;\n });\n\n // Get unique lines, limited to linesPerFile\n const uniqueLines = Array.from(new Set(definitions.map((d) => d.line)));\n const limitedLines = uniqueLines.slice(0, linesPerFile);\n const isTruncated = uniqueLines.length > linesPerFile;\n\n output += `${file}:\\n`;\n\n const treeLines = await this.renderFileTree(path.resolve(root, file), limitedLines, linesPerFile, isTruncated);\n output += treeLines;\n }\n\n return output.trim();\n }\n\n private async renderFileTree(filePath: string, lines: number[], maxLines: number, isTruncated: boolean = false): Promise<string> {\n if (lines.length === 0) {\n return '';\n }\n\n try {\n const content = await fs.readFile(filePath, 'utf-8');\n const fileLines = content.split('\\n');\n\n let output = '';\n const maxContentLines = isTruncated ? maxLines - 1 : maxLines;\n const linesToRender = lines.slice(0, maxContentLines);\n\n for (let i = 0; i < linesToRender.length; i++) {\n const lineNum = linesToRender[i];\n const lineContent = fileLines[lineNum]?.trim() || '';\n\n if (lineContent) {\n // Truncate long lines\n const truncated = lineContent.length > 100 ? lineContent.substring(0, 97) + '...' : lineContent;\n\n // Determine if this is the last line\n const isLast = i === linesToRender.length - 1 && !isTruncated;\n const prefix = isLast ? '\u2514\u2500\u2500 ' : '\u251C\u2500\u2500 ';\n output += `${prefix}${truncated}\\n`;\n }\n }\n\n // Add truncation indicator\n if (isTruncated) {\n output += '\u2514\u2500\u2500 ...\\n';\n }\n\n return output;\n } catch (error) {\n logger.error(`[TreeRenderer] Error reading file ${filePath}:`, error);\n return '';\n }\n }\n}\n", "import { DatabaseSync, StatementSync } from 'node:sqlite';\nimport * as fs from 'fs/promises';\nimport * as path from 'path';\nimport * as os from 'os';\n\nimport { Tag } from './types';\nimport logger from './logger';\n\nconst getCacheDbPath = (): string => {\n const home = os.homedir();\n const directory =\n process.platform === 'darwin'\n ? path.join(home, 'Library', 'Caches')\n : process.platform === 'win32'\n ? process.env.APPDATA || path.join(home, 'AppData', 'Roaming')\n : path.join(home, '.cache');\n return path.join(directory, 'aiderdesk', 'tree-sitter', 'cache.db');\n};\n\nexport class CacheManager {\n private db: DatabaseSync | null = null;\n private select: StatementSync | undefined;\n private insert: StatementSync | undefined;\n\n constructor(private readonly dbPath = getCacheDbPath()) {}\n\n async initialize(): Promise<void> {\n try {\n await fs.mkdir(path.dirname(this.dbPath), { recursive: true });\n this.db = new DatabaseSync(this.dbPath);\n this.db.exec('PRAGMA journal_mode = WAL; PRAGMA synchronous = NORMAL; PRAGMA busy_timeout = 1000;');\n this.db.exec(`\n CREATE TABLE IF NOT EXISTS file_cache_v3 (\n file_path TEXT PRIMARY KEY,\n mtime REAL NOT NULL,\n fingerprint TEXT NOT NULL,\n tags TEXT NOT NULL\n )\n `);\n this.select = this.db.prepare('SELECT mtime, fingerprint, tags FROM file_cache_v3 WHERE file_path = ?');\n this.insert = this.db.prepare(`\n INSERT INTO file_cache_v3 (file_path, mtime, fingerprint, tags) VALUES (?, ?, ?, ?)\n ON CONFLICT(file_path) DO UPDATE SET mtime = excluded.mtime, fingerprint = excluded.fingerprint, tags = excluded.tags\n `);\n } catch (error) {\n logger.warn('[CacheManager] Persistent cache unavailable:', error);\n this.close();\n }\n }\n\n async getFileCache(file: string): Promise<{ tags: Tag[]; mtime: number; fingerprint: string } | null> {\n try {\n const result = this.select?.get(file) as { tags: string; mtime: number; fingerprint: string } | undefined;\n if (!result) return null;\n const stored = JSON.parse(result.tags) as {\n relative: string;\n tags: [number, string, Tag['kind'], number?][];\n };\n return {\n ...result,\n tags: stored.tags.map(([line, name, kind, count]) => ({\n fname: file,\n rel_fname: stored.relative,\n line,\n name,\n kind,\n count,\n })),\n };\n } catch (error) {\n logger.warn(`[CacheManager] Failed to read ${file}:`, error);\n return null;\n }\n }\n\n async setFileCache(file: string, mtime: number, tags: Tag[], fingerprint = String(mtime)): Promise<void> {\n try {\n this.insert?.run(\n file,\n mtime,\n fingerprint,\n JSON.stringify({\n relative: tags[0]?.rel_fname ?? file,\n tags: tags.map((tag) => [tag.line, tag.name, tag.kind, tag.count]),\n }),\n );\n } catch (error) {\n logger.warn(`[CacheManager] Failed to cache ${file}:`, error);\n }\n }\n\n async getFileMtime(file: string): Promise<number | null> {\n try {\n return (await fs.stat(file)).mtimeMs;\n } catch {\n return null;\n }\n }\n\n async clearCache(): Promise<void> {\n this.db?.exec('DELETE FROM file_cache_v3');\n }\n\n close(): void {\n this.select = undefined;\n this.insert = undefined;\n this.db?.close();\n this.db = null;\n }\n}\n", "import * as path from 'path';\n\nimport { glob } from 'glob';\nimport { Minimatch } from 'minimatch';\nimport { simpleGit } from 'simple-git';\n\nimport logger from './logger';\n\nconst DEFAULT_IGNORE_PATTERNS = [\n 'node_modules/**',\n '.git/**',\n 'dist/**',\n 'build/**',\n '.next/**',\n 'out/**',\n 'coverage/**',\n '*.min.js',\n '*.min.css',\n '.DS_Store',\n 'Thumbs.db',\n '*.log',\n '*.lock',\n 'package-lock.json',\n 'yarn.lock',\n 'pnpm-lock.yaml',\n];\n\nconst getAllFilesFromGit = async (baseDir: string): Promise<string[] | null> => {\n try {\n const result = await simpleGit(baseDir).raw(['ls-files', '-z']);\n return result\n .split(String.fromCharCode(0))\n .filter(Boolean)\n .map((file) => path.resolve(baseDir, file));\n } catch (error) {\n logger.debug('Git discovery unavailable, falling back to filesystem', error);\n return null;\n }\n};\n\nexport const getAllFiles = async (baseDir: string, excludePatterns: string[] = []): Promise<string[]> => {\n const ignore = [...DEFAULT_IGNORE_PATTERNS, ...excludePatterns];\n const matchers = ignore.map((pattern) => ({\n regex: new Minimatch(pattern, { dot: true }).makeRe(),\n basename: !pattern.includes('/'),\n }));\n const gitFiles = await getAllFilesFromGit(baseDir);\n if (gitFiles !== null) {\n return gitFiles.filter((file) => {\n const relative = path.relative(baseDir, file).split(path.sep).join('/');\n const basename = path.basename(file);\n return !matchers.some((matcher) => matcher.regex && matcher.regex.test(matcher.basename ? basename : relative));\n });\n }\n try {\n return await glob('**/*', { cwd: baseDir, nodir: true, absolute: true, dot: false, ignore });\n } catch (error) {\n logger.error('Failed to discover repository files:', error);\n return [];\n }\n};\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["path", "fs", "path", "path", "platform", "buffer", "path", "relative", "name", "fs", "path", "relative", "fs", "path", "fs", "path", "os", "path", "relative", "basename", "files", "detectLanguage"]
|
|
7
|
+
}
|
|
@@ -4,9 +4,13 @@ import { CacheManager } from './cache-manager';
|
|
|
4
4
|
export declare class SymbolExtractor {
|
|
5
5
|
private readonly parser;
|
|
6
6
|
private cacheManager;
|
|
7
|
+
private memory;
|
|
8
|
+
private lastRoot;
|
|
9
|
+
private lastFiles;
|
|
10
|
+
revision: number;
|
|
7
11
|
constructor(parser: TreeSitterParser);
|
|
8
|
-
setCacheManager(cacheManager: CacheManager): void;
|
|
9
|
-
extractTags(files: string[], rootDir?: string): Promise<Tag[]>;
|
|
12
|
+
setCacheManager(cacheManager: CacheManager | null): void;
|
|
13
|
+
extractTags(files: string[], rootDir?: string, signal?: AbortSignal, compactReferences?: boolean): Promise<Tag[]>;
|
|
10
14
|
filterDefinitions(tags: Tag[]): Tag[];
|
|
11
15
|
filterReferences(tags: Tag[]): Tag[];
|
|
12
16
|
groupTagsByFile(tags: Tag[]): Map<string, Tag[]>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"symbol-extractor.d.ts","sourceRoot":"","sources":["../src/symbol-extractor.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"symbol-extractor.d.ts","sourceRoot":"","sources":["../src/symbol-extractor.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,GAAG,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAExD,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAG/C,qBAAa,eAAe;IAOd,OAAO,CAAC,QAAQ,CAAC,MAAM;IANnC,OAAO,CAAC,YAAY,CAA6B;IACjD,OAAO,CAAC,MAAM,CAA2D;IACzE,OAAO,CAAC,QAAQ,CAAqB;IACrC,OAAO,CAAC,SAAS,CAAM;IACvB,QAAQ,SAAK;gBAEgB,MAAM,EAAE,gBAAgB;IAErD,eAAe,CAAC,YAAY,EAAE,YAAY,GAAG,IAAI,GAAG,IAAI;IAIlD,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,EAAE,iBAAiB,UAAQ,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAwDrH,iBAAiB,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,GAAG,EAAE;IAIrC,gBAAgB,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,GAAG,EAAE;IAIpC,eAAe,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC;CASjD"}
|
package/dist/tree-renderer.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { RankedDefinition } from './types';
|
|
2
2
|
export declare class TreeRenderer {
|
|
3
|
-
render(rankedDefinitions: RankedDefinition[], chatFiles: Set<string>, maxLines?: number): Promise<string>;
|
|
3
|
+
render(rankedDefinitions: RankedDefinition[], chatFiles: Set<string>, maxLines?: number, root?: string): Promise<string>;
|
|
4
4
|
private renderAllFiles;
|
|
5
5
|
private renderFileListOnly;
|
|
6
6
|
private renderWithLineLimit;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tree-renderer.d.ts","sourceRoot":"","sources":["../src/tree-renderer.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"tree-renderer.d.ts","sourceRoot":"","sources":["../src/tree-renderer.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAG3C,qBAAa,YAAY;IACjB,MAAM,CAAC,iBAAiB,EAAE,gBAAgB,EAAE,EAAE,SAAS,EAAE,GAAG,CAAC,MAAM,CAAC,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,IAAI,SAAgB,GAAG,OAAO,CAAC,MAAM,CAAC;YA2CvH,cAAc;IAiB5B,OAAO,CAAC,kBAAkB;YAeZ,mBAAmB;YA0BnB,cAAc;CAuC7B"}
|
|
@@ -2,15 +2,21 @@ import { RepoMapOptions, SymbolOptions, Symbol, ParseResult } from './types';
|
|
|
2
2
|
export declare class TreeSitterAnalyzer {
|
|
3
3
|
private readonly parser;
|
|
4
4
|
private readonly symbolExtractor;
|
|
5
|
-
private readonly graphBuilder;
|
|
6
|
-
private readonly pageRankCalculator;
|
|
7
5
|
private readonly treeRenderer;
|
|
8
6
|
private readonly cacheManager;
|
|
9
|
-
private
|
|
10
|
-
|
|
7
|
+
private initialization;
|
|
8
|
+
private queue;
|
|
9
|
+
private graph;
|
|
10
|
+
private revision;
|
|
11
|
+
private outputs;
|
|
12
|
+
constructor(options?: {
|
|
13
|
+
cachePath?: string;
|
|
14
|
+
});
|
|
11
15
|
initialize(): Promise<void>;
|
|
12
16
|
getRepoMap(options: RepoMapOptions): Promise<string>;
|
|
17
|
+
private generateRepoMap;
|
|
13
18
|
extractSymbols(filePaths: string[], options?: SymbolOptions): Promise<Symbol[]>;
|
|
14
19
|
parseFile(filePath: string): Promise<ParseResult>;
|
|
20
|
+
dispose(): Promise<void>;
|
|
15
21
|
}
|
|
16
22
|
//# sourceMappingURL=tree-sitter-analyzer.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tree-sitter-analyzer.d.ts","sourceRoot":"","sources":["../src/tree-sitter-analyzer.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"tree-sitter-analyzer.d.ts","sourceRoot":"","sources":["../src/tree-sitter-analyzer.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAE7E,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA0B;IACjD,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAoC;IACpE,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAsB;IACnD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAe;IAC5C,OAAO,CAAC,cAAc,CAA4B;IAClD,OAAO,CAAC,KAAK,CAAuC;IACpD,OAAO,CAAC,KAAK,CAA8B;IAC3C,OAAO,CAAC,QAAQ,CAAM;IACtB,OAAO,CAAC,OAAO,CAA6B;gBAEhC,OAAO,GAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAO;IAKhD,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAK3B,UAAU,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC;YAMtC,eAAe;IAgC7B,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAqBzE,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAUjD,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAO/B"}
|
|
@@ -2,12 +2,13 @@ import { Tag } from './types';
|
|
|
2
2
|
export declare class TreeSitterParser {
|
|
3
3
|
private parser;
|
|
4
4
|
private languages;
|
|
5
|
-
private
|
|
6
|
-
private
|
|
5
|
+
private initialization;
|
|
6
|
+
private queue;
|
|
7
7
|
initialize(): Promise<void>;
|
|
8
|
+
private initializeParser;
|
|
8
9
|
private loadLanguage;
|
|
9
|
-
parseFile(filePath: string, rootDir?: string): Promise<Tag[]>;
|
|
10
|
-
private
|
|
11
|
-
|
|
10
|
+
parseFile(filePath: string, rootDir?: string, compactReferences?: boolean): Promise<Tag[]>;
|
|
11
|
+
private parse;
|
|
12
|
+
dispose(): Promise<void>;
|
|
12
13
|
}
|
|
13
14
|
//# sourceMappingURL=tree-sitter-parser.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tree-sitter-parser.d.ts","sourceRoot":"","sources":["../src/tree-sitter-parser.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,GAAG,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"tree-sitter-parser.d.ts","sourceRoot":"","sources":["../src/tree-sitter-parser.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,GAAG,EAAE,MAAM,SAAS,CAAC;AAO9B,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,SAAS,CAAoE;IACrF,OAAO,CAAC,cAAc,CAA4B;IAClD,OAAO,CAAC,KAAK,CAAuC;IAEpD,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;YAKb,gBAAgB;IAM9B,OAAO,CAAC,YAAY;IAwBpB,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,iBAAiB,UAAQ,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;YAM1E,KAAK;IA8Cb,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAe/B"}
|
package/dist/types.d.ts
CHANGED
|
@@ -4,6 +4,7 @@ export interface Tag {
|
|
|
4
4
|
line: number;
|
|
5
5
|
name: string;
|
|
6
6
|
kind: 'def' | 'ref';
|
|
7
|
+
count?: number;
|
|
7
8
|
}
|
|
8
9
|
export interface Symbol {
|
|
9
10
|
name: string;
|
|
@@ -20,6 +21,8 @@ export interface RepoMapOptions {
|
|
|
20
21
|
mentionedIdents?: Set<string>;
|
|
21
22
|
chatFiles?: Set<string>;
|
|
22
23
|
maxLines?: number;
|
|
24
|
+
prepareOnly?: boolean;
|
|
25
|
+
signal?: AbortSignal;
|
|
23
26
|
}
|
|
24
27
|
export interface SymbolOptions {
|
|
25
28
|
useCache?: boolean;
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,GAAG;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,KAAK,GAAG,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,GAAG;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,KAAK,GAAG,KAAK,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,MAAM;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,KAAK,GAAG,KAAK,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,cAAc,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC7B,eAAe,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC9B,SAAS,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,GAAG,EAAE,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,MAAM;IACrB,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;IACpD,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;IACpD,KAAK,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;IACrD,KAAK,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;CACtD"}
|
package/package.json
CHANGED
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aiderdesk/tree-sitter-utils",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"description": "Tree-sitter utilities for code analysis, symbol extraction, and repository mapping",
|
|
5
|
-
"author": "
|
|
6
|
-
"homepage": "https://aiderdesk.
|
|
5
|
+
"author": "Magiksoft s.r.o.",
|
|
6
|
+
"homepage": "https://aiderdesk.dev",
|
|
7
7
|
"repository": {
|
|
8
8
|
"type": "git",
|
|
9
|
-
"url": "https://github.com/
|
|
9
|
+
"url": "https://github.com/magiksoft/aider-desk.git",
|
|
10
10
|
"directory": "packages/tree-sitter-utils"
|
|
11
11
|
},
|
|
12
12
|
"bugs": {
|
|
13
|
-
"url": "https://github.com/
|
|
13
|
+
"url": "https://github.com/magiksoft/aider-desk/issues"
|
|
14
14
|
},
|
|
15
15
|
"license": "MIT",
|
|
16
16
|
"main": "./dist/index.js",
|
|
@@ -24,11 +24,13 @@
|
|
|
24
24
|
"files": [
|
|
25
25
|
"dist",
|
|
26
26
|
"resources",
|
|
27
|
-
"README.md"
|
|
27
|
+
"README.md",
|
|
28
|
+
"BENCHMARK.md"
|
|
28
29
|
],
|
|
29
30
|
"scripts": {
|
|
30
|
-
"build": "tsc --emitDeclarationOnly --declaration && esbuild src/index.ts --bundle --platform=node --packages=external --format=cjs --
|
|
31
|
+
"build": "tsc --emitDeclarationOnly --declaration && esbuild src/index.ts src/repo-map-worker.ts --bundle --platform=node --packages=external --format=cjs --outdir=dist --sourcemap",
|
|
31
32
|
"build:check": "tsc --noEmit",
|
|
33
|
+
"test": "npm run build && vitest run --config vitest.config.ts",
|
|
32
34
|
"typecheck": "tsc --noEmit",
|
|
33
35
|
"prepublishOnly": "npm run build"
|
|
34
36
|
},
|
|
@@ -45,7 +47,8 @@
|
|
|
45
47
|
"glob": "^13.0.6",
|
|
46
48
|
"graphology": "^0.26.0",
|
|
47
49
|
"graphology-metrics": "^2.4.0",
|
|
48
|
-
"
|
|
50
|
+
"minimatch": "10.2.6",
|
|
51
|
+
"simple-git": "^4.0.2",
|
|
49
52
|
"web-tree-sitter": "^0.26.6"
|
|
50
53
|
},
|
|
51
54
|
"devDependencies": {
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
) @definition.class
|
|
4
4
|
|
|
5
5
|
(class_declaration
|
|
6
|
-
|
|
6
|
+
(base_list (_) @name.reference.class)
|
|
7
7
|
) @reference.class
|
|
8
8
|
|
|
9
9
|
(interface_declaration
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
) @definition.interface
|
|
12
12
|
|
|
13
13
|
(interface_declaration
|
|
14
|
-
|
|
14
|
+
(base_list (_) @name.reference.interface)
|
|
15
15
|
) @reference.interface
|
|
16
16
|
|
|
17
17
|
(method_declaration
|
|
@@ -23,10 +23,10 @@
|
|
|
23
23
|
) @reference.class
|
|
24
24
|
|
|
25
25
|
(type_parameter_constraints_clause
|
|
26
|
-
|
|
26
|
+
(identifier) @name.reference.class
|
|
27
27
|
) @reference.class
|
|
28
28
|
|
|
29
|
-
(
|
|
29
|
+
(type_parameter_constraint
|
|
30
30
|
type: (identifier) @name.reference.class
|
|
31
31
|
) @reference.class
|
|
32
32
|
|
|
@@ -44,3 +44,8 @@
|
|
|
44
44
|
(namespace_declaration
|
|
45
45
|
name: (identifier) @name.definition.module
|
|
46
46
|
) @definition.module
|
|
47
|
+
|
|
48
|
+
(struct_declaration name: (identifier) @name.definition.class)
|
|
49
|
+
(record_declaration name: (identifier) @name.definition.class)
|
|
50
|
+
(enum_declaration name: (identifier) @name.definition.class)
|
|
51
|
+
(file_scoped_namespace_declaration name: (identifier) @name.definition.module)
|