From a2ecfbfb80ee688ec17d5d3860715f9847e41563 Mon Sep 17 00:00:00 2001 From: Candido Sales Gomes Date: Fri, 13 Mar 2026 17:46:59 -0400 Subject: [PATCH] feat(ruby): Add Ruby language support for CLI and web (#111) --- README.md | 2 +- .../public/wasm/ruby/tree-sitter-ruby.wasm | Bin 0 -> 2106352 bytes .../src/components/CodeReferencesPanel.tsx | 49 +++-- .../src/config/supported-languages.ts | 2 +- .../src/core/ingestion/call-processor.ts | 176 ++++++++++++++---- .../src/core/ingestion/entry-point-scoring.ts | 16 +- .../src/core/ingestion/framework-detection.ts | 11 ++ .../src/core/ingestion/import-processor.ts | 33 +++- .../src/core/ingestion/parsing-processor.ts | 8 +- .../src/core/ingestion/ruby-call-routing.ts | 116 ++++++++++++ .../src/core/ingestion/tree-sitter-queries.ts | 35 ++++ gitnexus-web/src/core/ingestion/utils.ts | 12 ++ .../src/core/tree-sitter/parser-loader.ts | 1 + gitnexus/README.md | 3 +- gitnexus/package-lock.json | 35 +++- gitnexus/package.json | 2 + gitnexus/src/config/supported-languages.ts | 2 +- gitnexus/src/core/ingestion/call-processor.ts | 65 ++++++- .../src/core/ingestion/entry-point-scoring.ts | 16 +- .../src/core/ingestion/export-detection.ts | 1 + .../src/core/ingestion/framework-detection.ts | 12 ++ .../src/core/ingestion/import-processor.ts | 19 ++ gitnexus/src/core/ingestion/pipeline.ts | 5 +- .../src/core/ingestion/resolvers/index.ts | 2 + gitnexus/src/core/ingestion/resolvers/ruby.ts | 23 +++ .../src/core/ingestion/resolvers/utils.ts | 2 + .../src/core/ingestion/ruby-call-routing.ts | 116 ++++++++++++ .../src/core/ingestion/tree-sitter-queries.ts | 36 ++++ .../core/ingestion/type-extractors/index.ts | 5 + gitnexus/src/core/ingestion/utils.ts | 28 +++ .../core/ingestion/workers/parse-worker.ts | 88 +++++++++ .../src/core/tree-sitter/parser-loader.ts | 2 + gitnexus/src/mcp/local/local-backend.ts | 1 + gitnexus/test/integration/parsing.test.ts | 4 +- gitnexus/test/unit/ingestion-utils.test.ts | 19 +- gitnexus/test/unit/parser-loader.test.ts | 6 +- .../sequential-language-availability.test.ts | 2 +- 37 files changed, 886 insertions(+), 69 deletions(-) create mode 100644 gitnexus-web/public/wasm/ruby/tree-sitter-ruby.wasm create mode 100644 gitnexus-web/src/core/ingestion/ruby-call-routing.ts create mode 100644 gitnexus/src/core/ingestion/resolvers/ruby.ts create mode 100644 gitnexus/src/core/ingestion/ruby-call-routing.ts diff --git a/README.md b/README.md index 2a1213b77c..3061e1958f 100644 --- a/README.md +++ b/README.md @@ -327,7 +327,7 @@ GitNexus builds a complete knowledge graph of your codebase through a multi-phas ### Supported Languages -TypeScript, JavaScript, Python, Java, Kotlin, C, C++, C#, Go, Rust, PHP, Swift +TypeScript, JavaScript, Python, Java, Kotlin, C, C++, C#, Go, Ruby, Rust, PHP, Swift --- diff --git a/gitnexus-web/public/wasm/ruby/tree-sitter-ruby.wasm b/gitnexus-web/public/wasm/ruby/tree-sitter-ruby.wasm new file mode 100644 index 0000000000000000000000000000000000000000..c7a619c96c137c8ead46d6e791a91ec81b2dc87b GIT binary patch literal 2106352 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±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 literal 0 HcmV?d00001 diff --git a/gitnexus-web/src/components/CodeReferencesPanel.tsx b/gitnexus-web/src/components/CodeReferencesPanel.tsx index 4bda5cca05..021ccd9022 100644 --- a/gitnexus-web/src/components/CodeReferencesPanel.tsx +++ b/gitnexus-web/src/components/CodeReferencesPanel.tsx @@ -5,6 +5,42 @@ import { vscDarkPlus } from 'react-syntax-highlighter/dist/esm/styles/prism'; import { useAppState } from '../hooks/useAppState'; import { NODE_COLORS } from '../lib/constants'; +/** Map file extension to Prism syntax highlighter language identifier */ +const getSyntaxLanguage = (filePath: string | undefined): string => { + if (!filePath) return 'text'; + const ext = filePath.split('.').pop()?.toLowerCase(); + switch (ext) { + case 'js': case 'jsx': case 'mjs': case 'cjs': return 'javascript'; + case 'ts': case 'tsx': case 'mts': case 'cts': return 'typescript'; + case 'py': case 'pyw': return 'python'; + case 'rb': case 'rake': case 'gemspec': return 'ruby'; + case 'java': return 'java'; + case 'go': return 'go'; + case 'rs': return 'rust'; + case 'c': case 'h': return 'c'; + case 'cpp': case 'cc': case 'cxx': case 'hpp': case 'hxx': case 'hh': return 'cpp'; + case 'cs': return 'csharp'; + case 'php': return 'php'; + case 'kt': case 'kts': return 'kotlin'; + case 'swift': return 'swift'; + case 'json': return 'json'; + case 'yaml': case 'yml': return 'yaml'; + case 'md': case 'mdx': return 'markdown'; + case 'html': case 'htm': case 'erb': return 'markup'; + case 'css': case 'scss': case 'sass': return 'css'; + case 'sh': case 'bash': case 'zsh': return 'bash'; + case 'sql': return 'sql'; + case 'xml': return 'xml'; + default: break; + } + // Handle extensionless Ruby files + const basename = filePath.split('/').pop() || ''; + if (['Rakefile', 'Gemfile', 'Guardfile', 'Vagrantfile', 'Brewfile'].includes(basename)) return 'ruby'; + if (['Makefile'].includes(basename)) return 'makefile'; + if (['Dockerfile'].includes(basename)) return 'docker'; + return 'text'; +}; + // Match the code theme used elsewhere in the app const customTheme = { ...vscDarkPlus, @@ -267,12 +303,7 @@ export const CodeReferencesPanel = ({ onFocusNode }: CodeReferencesPanelProps) =

{selectedFileContent ? ( c.type === 'identifier'); funcName = nameNode?.text; label = 'Method'; // Treat constructors as methods for process detection + } else if (current.type === 'method') { + // Ruby instance method: def foo + const nameNode = current.childForFieldName?.('name') || + current.children?.find((c: any) => c.type === 'identifier'); + funcName = nameNode?.text; + label = 'Method'; + } else if (current.type === 'singleton_method') { + // Ruby class method: def self.foo + const nameNode = current.childForFieldName?.('name') || + current.children?.find((c: any) => c.type === 'identifier'); + funcName = nameNode?.text; + label = 'Function'; } else if (current.type === 'arrow_function' || current.type === 'function_expression') { // Arrow/expression: const foo = () => {} - check parent variable declarator const parent = current.parent; @@ -184,6 +201,62 @@ export const processCalls = async ( const calledName = nameNode.text; + // Ruby: route special calls to heritage or properties (imports handled by import-processor) + if (language === SupportedLanguages.Ruby) { + const callNode = captureMap['call']; + const routed = routeRubyCall(calledName, callNode); + + switch (routed.kind) { + case 'skip': + case 'import': // handled by import-processor + return; + + case 'heritage': + for (const item of routed.items) { + const childId = symbolTable.lookupExact(file.path, item.enclosingClass) || + symbolTable.lookupFuzzy(item.enclosingClass)[0]?.nodeId || + generateId('Class', `${file.path}:${item.enclosingClass}`); + const parentId = symbolTable.lookupFuzzy(item.mixinName)[0]?.nodeId || + generateId('Module', `${item.mixinName}`); + if (childId && parentId) { + const relId = generateId('IMPLEMENTS', `${childId}->${parentId}`); + graph.addRelationship({ + id: relId, sourceId: childId, targetId: parentId, + type: 'IMPLEMENTS', confidence: 1.0, reason: 'trait-impl', + }); + } + } + return; + + case 'properties': { + const fileId = generateId('File', file.path); + for (const item of routed.items) { + const nodeId = generateId('Property', `${file.path}:${item.propName}`); + graph.addNode({ + id: nodeId, + label: 'Property' as any, // TODO: add 'Property' to graph node label union + properties: { + name: item.propName, filePath: file.path, + startLine: item.startLine, endLine: item.endLine, + language: SupportedLanguages.Ruby, isExported: true, + description: item.accessorType, + }, + }); + symbolTable.add(file.path, item.propName, nodeId, 'Property'); + const relId = generateId('DEFINES', `${fileId}->${nodeId}`); + graph.addRelationship({ + id: relId, sourceId: fileId, targetId: nodeId, + type: 'DEFINES', confidence: 1.0, reason: '', + }); + } + return; + } + + case 'call': + break; // fall through to normal call processing below + } + } + // Skip common built-ins and noise if (isBuiltInOrNoise(calledName)) return; @@ -200,10 +273,10 @@ export const processCalls = async ( // 5. Find the enclosing function (caller) const callNode = captureMap['call']; const enclosingFuncId = findEnclosingFunction(callNode, file.path, symbolTable); - + // Use enclosing function as source, fallback to file for top-level calls const sourceId = enclosingFuncId || generateId('File', file.path); - + const relId = generateId('CALLS', `${sourceId}:${calledName}->${resolved.nodeId}`); graph.addRelationship({ @@ -711,37 +784,72 @@ const resolveCallTarget = ( * Filter out common built-in functions and noise * that shouldn't be tracked as calls */ -const isBuiltInOrNoise = (name: string): boolean => { - const builtIns = new Set([ - // JavaScript/TypeScript built-ins - 'console', 'log', 'warn', 'error', 'info', 'debug', - 'setTimeout', 'setInterval', 'clearTimeout', 'clearInterval', - 'parseInt', 'parseFloat', 'isNaN', 'isFinite', - 'encodeURI', 'decodeURI', 'encodeURIComponent', 'decodeURIComponent', - 'JSON', 'parse', 'stringify', - 'Object', 'Array', 'String', 'Number', 'Boolean', 'Symbol', 'BigInt', - 'Map', 'Set', 'WeakMap', 'WeakSet', - 'Promise', 'resolve', 'reject', 'then', 'catch', 'finally', - 'Math', 'Date', 'RegExp', 'Error', - 'require', 'import', 'export', - 'fetch', 'Response', 'Request', - // React hooks and common functions - 'useState', 'useEffect', 'useCallback', 'useMemo', 'useRef', 'useContext', - 'useReducer', 'useLayoutEffect', 'useImperativeHandle', 'useDebugValue', - 'createElement', 'createContext', 'createRef', 'forwardRef', 'memo', 'lazy', - // Common array/object methods - 'map', 'filter', 'reduce', 'forEach', 'find', 'findIndex', 'some', 'every', - 'includes', 'indexOf', 'slice', 'splice', 'concat', 'join', 'split', - 'push', 'pop', 'shift', 'unshift', 'sort', 'reverse', - 'keys', 'values', 'entries', 'assign', 'freeze', 'seal', - 'hasOwnProperty', 'toString', 'valueOf', - // Python built-ins - 'print', 'len', 'range', 'str', 'int', 'float', 'list', 'dict', 'set', 'tuple', - 'open', 'read', 'write', 'close', 'append', 'extend', 'update', - 'super', 'type', 'isinstance', 'issubclass', 'getattr', 'setattr', 'hasattr', - 'enumerate', 'zip', 'sorted', 'reversed', 'min', 'max', 'sum', 'abs', - ]); +/** Pre-built set (module-level singleton) to avoid re-creating per call */ +const BUILT_IN_NAMES = new Set([ + // JavaScript/TypeScript built-ins + 'console', 'log', 'warn', 'error', 'info', 'debug', + 'setTimeout', 'setInterval', 'clearTimeout', 'clearInterval', + 'parseInt', 'parseFloat', 'isNaN', 'isFinite', + 'encodeURI', 'decodeURI', 'encodeURIComponent', 'decodeURIComponent', + 'JSON', 'parse', 'stringify', + 'Object', 'Array', 'String', 'Number', 'Boolean', 'Symbol', 'BigInt', + 'Map', 'Set', 'WeakMap', 'WeakSet', + 'Promise', 'resolve', 'reject', 'then', 'catch', 'finally', + 'Math', 'Date', 'RegExp', 'Error', + 'require', 'import', 'export', + 'fetch', 'Response', 'Request', + // React hooks and common functions + 'useState', 'useEffect', 'useCallback', 'useMemo', 'useRef', 'useContext', + 'useReducer', 'useLayoutEffect', 'useImperativeHandle', 'useDebugValue', + 'createElement', 'createContext', 'createRef', 'forwardRef', 'memo', 'lazy', + // Common array/object methods + 'map', 'filter', 'reduce', 'forEach', 'find', 'findIndex', 'some', 'every', + 'includes', 'indexOf', 'slice', 'splice', 'concat', 'join', 'split', + 'push', 'pop', 'shift', 'unshift', 'sort', 'reverse', + 'keys', 'values', 'entries', 'assign', 'freeze', 'seal', + 'hasOwnProperty', 'toString', 'valueOf', + // Python built-ins + 'print', 'len', 'range', 'str', 'int', 'float', 'list', 'dict', 'set', 'tuple', + 'open', 'read', 'write', 'close', 'append', 'extend', 'update', + 'super', 'type', 'isinstance', 'issubclass', 'getattr', 'setattr', 'hasattr', + 'enumerate', 'zip', 'sorted', 'reversed', 'min', 'max', 'sum', 'abs', + // C/C++ standard library and common kernel helpers + 'printf', 'fprintf', 'sprintf', 'snprintf', 'vprintf', 'vfprintf', 'vsprintf', 'vsnprintf', + 'scanf', 'fscanf', 'sscanf', + 'malloc', 'calloc', 'realloc', 'free', 'memcpy', 'memmove', 'memset', 'memcmp', + 'strlen', 'strcpy', 'strncpy', 'strcat', 'strncat', 'strcmp', 'strncmp', 'strstr', 'strchr', 'strrchr', + 'atoi', 'atol', 'atof', 'strtol', 'strtoul', 'strtoll', 'strtoull', 'strtod', + 'sizeof', 'offsetof', 'typeof', + 'assert', 'abort', 'exit', '_exit', + 'fopen', 'fclose', 'fread', 'fwrite', 'fseek', 'ftell', 'rewind', 'fflush', 'fgets', 'fputs', + // Linux kernel common macros/helpers (not real call targets) + 'likely', 'unlikely', 'BUG', 'BUG_ON', 'WARN', 'WARN_ON', 'WARN_ONCE', + 'IS_ERR', 'PTR_ERR', 'ERR_PTR', 'IS_ERR_OR_NULL', + 'ARRAY_SIZE', 'container_of', 'list_for_each_entry', 'list_for_each_entry_safe', + 'min', 'max', 'clamp', 'abs', 'swap', + 'pr_info', 'pr_warn', 'pr_err', 'pr_debug', 'pr_notice', 'pr_crit', 'pr_emerg', + 'printk', 'dev_info', 'dev_warn', 'dev_err', 'dev_dbg', + 'GFP_KERNEL', 'GFP_ATOMIC', + 'spin_lock', 'spin_unlock', 'spin_lock_irqsave', 'spin_unlock_irqrestore', + 'mutex_lock', 'mutex_unlock', 'mutex_init', + 'kfree', 'kmalloc', 'kzalloc', 'kcalloc', 'krealloc', 'kvmalloc', 'kvfree', + 'get', 'put', + // Ruby built-ins and Kernel methods + 'puts', 'print', 'p', 'pp', 'warn', 'raise', 'fail', + 'require', 'require_relative', 'load', 'autoload', + 'include', 'extend', 'prepend', + 'attr_accessor', 'attr_reader', 'attr_writer', + 'public', 'private', 'protected', 'module_function', + 'lambda', 'proc', 'block_given?', + 'nil?', 'is_a?', 'kind_of?', 'instance_of?', 'respond_to?', + 'freeze', 'frozen?', 'dup', 'clone', 'tap', 'then', 'yield_self', + // Ruby enumerables + 'each', 'map', 'select', 'reject', 'find', 'detect', 'collect', + 'inject', 'reduce', 'flat_map', 'each_with_object', 'each_with_index', + 'any?', 'all?', 'none?', 'count', 'first', 'last', + 'sort', 'sort_by', 'min', 'max', 'min_by', 'max_by', + 'group_by', 'partition', 'zip', 'compact', 'flatten', 'uniq', +]); - return builtIns.has(name); -}; +const isBuiltInOrNoise = (name: string): boolean => BUILT_IN_NAMES.has(name); diff --git a/gitnexus-web/src/core/ingestion/entry-point-scoring.ts b/gitnexus-web/src/core/ingestion/entry-point-scoring.ts index 89645769e2..f53ce06d60 100644 --- a/gitnexus-web/src/core/ingestion/entry-point-scoring.ts +++ b/gitnexus-web/src/core/ingestion/entry-point-scoring.ts @@ -13,7 +13,7 @@ import { detectFrameworkFromPath } from './framework-detection'; // ============================================================================ -// NAME PATTERNS - All 9 supported languages +// NAME PATTERNS - All 11 supported languages // ============================================================================ /** @@ -143,6 +143,13 @@ const ENTRY_POINT_PATTERNS: Record = { /^save$/, // Repository::save() /^delete$/, // Repository::delete() ], + + // Ruby + 'ruby': [ + /^call$/, // Service objects (MyService.call) + /^perform$/, // Background jobs (Sidekiq, ActiveJob) + /^execute$/, // Command pattern + ], }; // ============================================================================ @@ -302,7 +309,12 @@ export function isTestFile(filePath: string): boolean { p.endsWith('test.php') || p.endsWith('spec.php') || p.includes('/tests/feature/') || - p.includes('/tests/unit/') + p.includes('/tests/unit/') || + // Ruby test patterns + p.endsWith('_spec.rb') || + p.endsWith('_test.rb') || + p.includes('/spec/') || + p.includes('/test/fixtures/') ); } diff --git a/gitnexus-web/src/core/ingestion/framework-detection.ts b/gitnexus-web/src/core/ingestion/framework-detection.ts index 15f681fadd..b190e4baf5 100644 --- a/gitnexus-web/src/core/ingestion/framework-detection.ts +++ b/gitnexus-web/src/core/ingestion/framework-detection.ts @@ -257,6 +257,17 @@ export function detectFrameworkFromPath(filePath: string): FrameworkHint | null return { framework: 'laravel', entryPointMultiplier: 1.5, reason: 'laravel-repository' }; } + // ========== RUBY ========== + + // Ruby: bin/ or exe/ (CLI entry points) + if ((p.includes('/bin/') || p.includes('/exe/')) && p.endsWith('.rb')) { + return { framework: 'ruby', entryPointMultiplier: 2.5, reason: 'ruby-executable' }; + } + + // Ruby: Rakefile or *.rake (task definitions) + if (p.endsWith('/rakefile') || p.endsWith('.rake')) { + return { framework: 'ruby', entryPointMultiplier: 1.5, reason: 'ruby-rake' }; + } // ========== SWIFT / iOS ========== // iOS App entry points (highest priority) diff --git a/gitnexus-web/src/core/ingestion/import-processor.ts b/gitnexus-web/src/core/ingestion/import-processor.ts index c0cb6bd681..e49ab7aa9c 100644 --- a/gitnexus-web/src/core/ingestion/import-processor.ts +++ b/gitnexus-web/src/core/ingestion/import-processor.ts @@ -4,6 +4,7 @@ import { loadParser, loadLanguage } from '../tree-sitter/parser-loader'; import { LANGUAGE_QUERIES } from './tree-sitter-queries'; import { generateId } from '../../lib/utils'; import { getLanguageFromFilename } from './utils'; +import { routeRubyCall } from './ruby-call-routing'; // Type: Map> // Stores all files that a given file imports from @@ -53,7 +54,9 @@ const resolveImportPath = ( // Go '.go', // Rust - '.rs', '/mod.rs' + '.rs', '/mod.rs', + // Ruby + '.rb', '.rake', ]; if (importPath.startsWith('.')) { @@ -220,6 +223,34 @@ export const processImports = async ( importMap.get(file.path)!.add(resolvedPath); } } + + // ---- Ruby: require/require_relative come through @call, not @import ---- + if (language === 'ruby' && captureMap['call']) { + const callNameNode = captureMap['call.name']; + if (callNameNode) { + const routed = routeRubyCall(callNameNode.text, captureMap['call']); + if (routed.kind === 'import') { + totalImportsFound++; + const resolvedPath = resolveImportPath( + file.path, routed.importPath, allFilePaths, allFileList, resolveCache + ); + if (resolvedPath) { + const sourceId = generateId('File', file.path); + const targetId = generateId('File', resolvedPath); + const relId = generateId('IMPORTS', `${file.path}->${resolvedPath}`); + totalImportsResolved++; + graph.addRelationship({ + id: relId, sourceId, targetId, + type: 'IMPORTS', confidence: 1.0, reason: '', + }); + if (!importMap.has(file.path)) { + importMap.set(file.path, new Set()); + } + importMap.get(file.path)!.add(resolvedPath); + } + } + } + } }); // If re-parsed just for this, delete the tree to save memory diff --git a/gitnexus-web/src/core/ingestion/parsing-processor.ts b/gitnexus-web/src/core/ingestion/parsing-processor.ts index 807bcf5815..a063db6ccd 100644 --- a/gitnexus-web/src/core/ingestion/parsing-processor.ts +++ b/gitnexus-web/src/core/ingestion/parsing-processor.ts @@ -14,7 +14,7 @@ export type FileProgressCallback = (current: number, total: number, filePath: st /** * Check if a symbol (function, class, etc.) is exported/public - * Handles all 9 supported languages with explicit logic + * Handles all 11 supported languages with explicit logic * * @param node - The AST node for the symbol name * @param name - The symbol name @@ -104,7 +104,11 @@ const isNodeExported = (node: any, name: string, language: string): boolean => { case 'c': case 'cpp': return false; - + + // Ruby: All top-level definitions are public by default + case 'ruby': + return true; + default: return false; } diff --git a/gitnexus-web/src/core/ingestion/ruby-call-routing.ts b/gitnexus-web/src/core/ingestion/ruby-call-routing.ts new file mode 100644 index 0000000000..c634742d33 --- /dev/null +++ b/gitnexus-web/src/core/ingestion/ruby-call-routing.ts @@ -0,0 +1,116 @@ +/** + * Shared Ruby call routing logic. + * + * Ruby expresses imports, heritage (mixins), and property definitions as + * method calls rather than syntax-level constructs. This module provides a + * routing function used by the CLI call-processor, CLI parse-worker, and + * the web call-processor so that the classification logic lives in one place. + * + * NOTE: This file is intentionally duplicated in gitnexus-web/ because the + * two packages have separate build targets (Node native vs WASM/browser). + * Keep both copies in sync until a shared package is introduced. + */ + +// ── Result types ──────────────────────────────────────────────────────────── + +export type RubyCallRouting = + | { kind: 'import'; importPath: string; isRelative: boolean } + | { kind: 'heritage'; items: RubyHeritageItem[] } + | { kind: 'properties'; items: RubyPropertyItem[] } + | { kind: 'call' } + | { kind: 'skip' }; + +export interface RubyHeritageItem { + enclosingClass: string; + mixinName: string; +} + +export type RubyAccessorType = 'attr_accessor' | 'attr_reader' | 'attr_writer'; + +export interface RubyPropertyItem { + propName: string; + accessorType: RubyAccessorType; + startLine: number; + endLine: number; +} + +// ── Pre-allocated singletons for common return values ──────────────────────── +const CALL_RESULT: RubyCallRouting = { kind: 'call' }; +const SKIP_RESULT: RubyCallRouting = { kind: 'skip' }; + +/** Max depth for parent-walking loops to prevent pathological AST traversals */ +const MAX_PARENT_DEPTH = 50; + +// ── Routing function ──────────────────────────────────────────────────────── + +/** + * Classify a Ruby call node and extract its semantic payload. + * + * @param calledName - The method name (e.g. 'require', 'include', 'attr_accessor') + * @param callNode - The tree-sitter `call` AST node + * @returns A discriminated union describing the call's semantic role + */ +export function routeRubyCall(calledName: string, callNode: any): RubyCallRouting { + // ── require / require_relative → import ───────────────────────────────── + if (calledName === 'require' || calledName === 'require_relative') { + const argList = callNode.childForFieldName?.('arguments'); + const stringNode = argList?.children?.find((c: any) => c.type === 'string'); + const contentNode = stringNode?.children?.find((c: any) => c.type === 'string_content'); + if (!contentNode) return SKIP_RESULT; + + let importPath: string = contentNode.text; + // Validate: reject null bytes, control chars, excessively long paths + if (!importPath || importPath.length > 1024 || /[\x00-\x1f]/.test(importPath)) { + return SKIP_RESULT; + } + const isRelative = calledName === 'require_relative'; + if (isRelative && !importPath.startsWith('.')) { + importPath = './' + importPath; + } + return { kind: 'import', importPath, isRelative }; + } + + // ── include / extend / prepend → heritage (mixin) ────────────────────── + if (calledName === 'include' || calledName === 'extend' || calledName === 'prepend') { + let enclosingClass: string | null = null; + let current = callNode.parent; + let depth = 0; + while (current && ++depth <= MAX_PARENT_DEPTH) { + if (current.type === 'class' || current.type === 'module') { + const nameNode = current.childForFieldName?.('name'); + if (nameNode) { enclosingClass = nameNode.text; break; } + } + current = current.parent; + } + if (!enclosingClass) return SKIP_RESULT; + + const items: RubyHeritageItem[] = []; + const argList = callNode.childForFieldName?.('arguments'); + for (const arg of (argList?.children ?? [])) { + if (arg.type === 'constant' || arg.type === 'scope_resolution') { + items.push({ enclosingClass, mixinName: arg.text }); + } + } + return items.length > 0 ? { kind: 'heritage', items } : SKIP_RESULT; + } + + // ── attr_accessor / attr_reader / attr_writer → property definitions ─── + if (calledName === 'attr_accessor' || calledName === 'attr_reader' || calledName === 'attr_writer') { + const items: RubyPropertyItem[] = []; + const argList = callNode.childForFieldName?.('arguments'); + for (const arg of (argList?.children ?? [])) { + if (arg.type === 'simple_symbol') { + items.push({ + propName: arg.text.startsWith(':') ? arg.text.slice(1) : arg.text, + accessorType: calledName as RubyAccessorType, + startLine: arg.startPosition.row, + endLine: arg.endPosition.row, + }); + } + } + return items.length > 0 ? { kind: 'properties', items } : SKIP_RESULT; + } + + // ── Everything else → regular call ───────────────────────────────────── + return CALL_RESULT; +} diff --git a/gitnexus-web/src/core/ingestion/tree-sitter-queries.ts b/gitnexus-web/src/core/ingestion/tree-sitter-queries.ts index 3ba476ba33..acef63c852 100644 --- a/gitnexus-web/src/core/ingestion/tree-sitter-queries.ts +++ b/gitnexus-web/src/core/ingestion/tree-sitter-queries.ts @@ -396,6 +396,40 @@ export const PHP_QUERIES = ` [(name) (qualified_name)] @heritage.trait))) @heritage `; +// Ruby queries - works with tree-sitter-ruby +// NOTE: Ruby uses `call` for require, include, extend, prepend, attr_* etc. +// These are all captured as @call and routed in JS post-processing: +// - require/require_relative → import extraction +// - include/extend/prepend → heritage (mixin) extraction +// - attr_accessor/attr_reader/attr_writer → property definition extraction +// - everything else → regular call extraction +export const RUBY_QUERIES = ` +; ── Modules ────────────────────────────────────────────────────────────────── +(module + name: (constant) @name) @definition.module + +; ── Classes ────────────────────────────────────────────────────────────────── +(class + name: (constant) @name) @definition.class + +; ── Instance methods ───────────────────────────────────────────────────────── +(method + name: (identifier) @name) @definition.method + +; ── Singleton (class-level) methods ────────────────────────────────────────── +(singleton_method + name: (identifier) @name) @definition.function + +; ── All calls (require, include, attr_*, and regular calls routed in JS) ───── +(call + method: (identifier) @call.name) @call + +; ── Heritage: class < SuperClass ───────────────────────────────────────────── +(class + name: (constant) @heritage.class + superclass: (superclass + (constant) @heritage.extends)) @heritage`; + // Swift queries - works with tree-sitter-swift export const SWIFT_QUERIES = ` ; Classes @@ -460,6 +494,7 @@ export const LANGUAGE_QUERIES: Record = { [SupportedLanguages.CSharp]: CSHARP_QUERIES, [SupportedLanguages.Rust]: RUST_QUERIES, [SupportedLanguages.PHP]: PHP_QUERIES, + [SupportedLanguages.Ruby]: RUBY_QUERIES, [SupportedLanguages.Swift]: SWIFT_QUERIES, }; \ No newline at end of file diff --git a/gitnexus-web/src/core/ingestion/utils.ts b/gitnexus-web/src/core/ingestion/utils.ts index c7479aaa64..22bb6d72e1 100644 --- a/gitnexus-web/src/core/ingestion/utils.ts +++ b/gitnexus-web/src/core/ingestion/utils.ts @@ -1,5 +1,8 @@ import { SupportedLanguages } from '../../config/supported-languages'; +/** Ruby extensionless filenames recognised as Ruby source */ +const RUBY_EXTENSIONLESS_FILES = new Set(['Rakefile', 'Gemfile', 'Guardfile', 'Vagrantfile', 'Brewfile']); + /** * Map file extension to SupportedLanguage enum */ @@ -31,6 +34,15 @@ export const getLanguageFromFilename = (filename: string): SupportedLanguages | filename.endsWith('.php5') || filename.endsWith('.php8')) { return SupportedLanguages.PHP; } + // Ruby (extensions) + if (filename.endsWith('.rb') || filename.endsWith('.rake') || filename.endsWith('.gemspec')) { + return SupportedLanguages.Ruby; + } + // Ruby (extensionless files) + const basename = filename.split('/').pop() || filename; + if (RUBY_EXTENSIONLESS_FILES.has(basename)) { + return SupportedLanguages.Ruby; + } // Swift if (filename.endsWith('.swift')) return SupportedLanguages.Swift; return null; diff --git a/gitnexus-web/src/core/tree-sitter/parser-loader.ts b/gitnexus-web/src/core/tree-sitter/parser-loader.ts index e434874c4a..7a4d6a85d8 100644 --- a/gitnexus-web/src/core/tree-sitter/parser-loader.ts +++ b/gitnexus-web/src/core/tree-sitter/parser-loader.ts @@ -40,6 +40,7 @@ const getWasmPath = (language: SupportedLanguages, filePath?: string): string => [SupportedLanguages.Go]: '/wasm/go/tree-sitter-go.wasm', [SupportedLanguages.Rust]: '/wasm/rust/tree-sitter-rust.wasm', [SupportedLanguages.PHP]: '/wasm/php/tree-sitter-php.wasm', + [SupportedLanguages.Ruby]: '/wasm/ruby/tree-sitter-ruby.wasm', [SupportedLanguages.Swift]: '/wasm/swift/tree-sitter-swift.wasm', }; diff --git a/gitnexus/README.md b/gitnexus/README.md index 957da11b9f..b637735f6a 100644 --- a/gitnexus/README.md +++ b/gitnexus/README.md @@ -157,7 +157,7 @@ GitNexus supports indexing multiple repositories. Each `gitnexus analyze` regist ## Supported Languages -TypeScript, JavaScript, Python, Java, C, C++, C#, Go, Rust, PHP, Kotlin, Swift +TypeScript, JavaScript, Python, Java, C, C++, C#, Go, Rust, PHP, Kotlin, Swift, Ruby ### Language Feature Matrix @@ -173,6 +173,7 @@ TypeScript, JavaScript, Python, Java, C, C++, C#, Go, Rust, PHP, Kotlin, Swift | Rust | ✓ | ✓ | ✓ | ✓ | — | ✓ | ✓ | ✓ | | PHP | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | — | | Swift | — | ✓ | ✓ | — | ✓ | ✓ | ✓ | ✓ | +| Ruby | ✓ | ✓ | ✓ | — | — | ✓ | ✓ | ✓ | | C | — | ✓ | ✓ | — | — | ✓ | ✓ | ✓ | | C++ | — | ✓ | ✓ | — | — | ✓ | ✓ | ✓ | diff --git a/gitnexus/package-lock.json b/gitnexus/package-lock.json index 6d8c28e152..392c0eac3d 100644 --- a/gitnexus/package-lock.json +++ b/gitnexus/package-lock.json @@ -31,9 +31,9 @@ "tree-sitter-go": "^0.21.0", "tree-sitter-java": "^0.21.0", "tree-sitter-javascript": "^0.21.0", - "tree-sitter-kotlin": "^0.3.8", "tree-sitter-php": "^0.23.12", "tree-sitter-python": "^0.21.0", + "tree-sitter-ruby": "^0.23.1", "tree-sitter-rust": "^0.21.0", "tree-sitter-typescript": "^0.21.0", "uuid": "^13.0.0" @@ -56,6 +56,7 @@ "node": ">=18.0.0" }, "optionalDependencies": { + "tree-sitter-kotlin": "^0.3.8", "tree-sitter-swift": "^0.6.0" } }, @@ -5415,6 +5416,7 @@ "integrity": "sha512-A4obq6bjzmYrA+F0JLLoheFPcofFkctNaZSpnDd+GPn1SfVZLY4/GG4C0cYVBTOShuPBGGAOPLM1JWLZQV4m1g==", "hasInstallScript": true, "license": "MIT", + "optional": true, "dependencies": { "node-addon-api": "^7.1.0", "node-gyp-build": "^4.8.0" @@ -5432,7 +5434,8 @@ "version": "7.1.1", "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", - "license": "MIT" + "license": "MIT", + "optional": true }, "node_modules/tree-sitter-php": { "version": "0.23.12", @@ -5487,6 +5490,34 @@ "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", "license": "MIT" }, + "node_modules/tree-sitter-ruby": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/tree-sitter-ruby/-/tree-sitter-ruby-0.23.1.tgz", + "integrity": "sha512-d9/RXgWjR6HanN7wTYhS5bpBQLz1VkH048Vm3CodPGyJVnamXMGb8oEhDypVCBq4QnHui9sTXuJBBP3WtCw5RA==", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "node-addon-api": "^8.2.2", + "node-gyp-build": "^4.8.2" + }, + "peerDependencies": { + "tree-sitter": "^0.21.1" + }, + "peerDependenciesMeta": { + "tree-sitter": { + "optional": true + } + } + }, + "node_modules/tree-sitter-ruby/node_modules/node-addon-api": { + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-8.6.0.tgz", + "integrity": "sha512-gBVjCaqDlRUk0EwoPNKzIr9KkS9041G/q31IBShPs1Xz6UTA+EXdZADbzqAJQrpDRq71CIMnOP5VMut3SL0z5Q==", + "license": "MIT", + "engines": { + "node": "^18 || ^20 || >= 21" + } + }, "node_modules/tree-sitter-rust": { "version": "0.21.0", "resolved": "https://registry.npmjs.org/tree-sitter-rust/-/tree-sitter-rust-0.21.0.tgz", diff --git a/gitnexus/package.json b/gitnexus/package.json index 4a9ad4c342..44281ba4b7 100644 --- a/gitnexus/package.json +++ b/gitnexus/package.json @@ -72,11 +72,13 @@ "tree-sitter-kotlin": "^0.3.8", "tree-sitter-php": "^0.23.12", "tree-sitter-python": "^0.21.0", + "tree-sitter-ruby": "^0.23.1", "tree-sitter-rust": "^0.21.0", "tree-sitter-typescript": "^0.21.0", "uuid": "^13.0.0" }, "optionalDependencies": { + "tree-sitter-kotlin": "^0.3.8", "tree-sitter-swift": "^0.6.0" }, "devDependencies": { diff --git a/gitnexus/src/config/supported-languages.ts b/gitnexus/src/config/supported-languages.ts index 9d67eaf051..48562033aa 100644 --- a/gitnexus/src/config/supported-languages.ts +++ b/gitnexus/src/config/supported-languages.ts @@ -7,9 +7,9 @@ export enum SupportedLanguages { CPlusPlus = 'cpp', CSharp = 'csharp', Go = 'go', + Ruby = 'ruby', Rust = 'rust', PHP = 'php', Kotlin = 'kotlin', - // Ruby = 'ruby', Swift = 'swift', } \ No newline at end of file diff --git a/gitnexus/src/core/ingestion/call-processor.ts b/gitnexus/src/core/ingestion/call-processor.ts index 6718faba87..81dc96318a 100644 --- a/gitnexus/src/core/ingestion/call-processor.ts +++ b/gitnexus/src/core/ingestion/call-processor.ts @@ -2,12 +2,13 @@ import { KnowledgeGraph } from '../graph/types.js'; import { ASTCache } from './ast-cache.js'; import type { SymbolDefinition, SymbolTable } from './symbol-table.js'; import { ImportMap, PackageMap, NamedImportMap, isFileInPackageDir } from './import-processor.js'; -import { resolveSymbol, resolveSymbolInternal } from './symbol-resolver.js'; +import { resolveSymbolInternal } from './symbol-resolver.js'; import { walkBindingChain } from './named-binding-extraction.js'; import Parser from 'tree-sitter'; import { isLanguageAvailable, loadParser, loadLanguage } from '../tree-sitter/parser-loader.js'; import { LANGUAGE_QUERIES } from './tree-sitter-queries.js'; import { generateId } from '../../lib/utils.js'; +import { SupportedLanguages } from '../../config/supported-languages.js'; import { getLanguageFromFilename, isVerboseIngestionEnabled, @@ -21,7 +22,8 @@ import { } from './utils.js'; import { buildTypeEnv, lookupTypeEnv } from './type-env.js'; import { getTreeSitterBufferSize } from './constants.js'; -import type { ExtractedCall, ExtractedRoute } from './workers/parse-worker.js'; +import type { ExtractedCall, ExtractedHeritage, ExtractedRoute } from './workers/parse-worker.js'; +import { routeRubyCall } from './ruby-call-routing.js'; /** * Walk up the AST from a node to find the enclosing function/method. @@ -60,8 +62,9 @@ export const processCalls = async ( packageMap?: PackageMap, onProgress?: (current: number, total: number) => void, namedImportMap?: NamedImportMap, -) => { +): Promise => { const parser = await loadParser(); + const collectedHeritage: ExtractedHeritage[] = []; const logSkipped = isVerboseIngestionEnabled(); const skippedByLang = logSkipped ? new Map() : null; @@ -132,6 +135,56 @@ export const processCalls = async ( const calledName = nameNode.text; + // Ruby: route special calls to heritage or properties (imports handled by import-processor) + if (language === SupportedLanguages.Ruby) { + const callNode = captureMap['call']; + const routed = routeRubyCall(calledName, callNode); + + switch (routed.kind) { + case 'skip': + case 'import': // handled by import-processor + return; + + case 'heritage': + for (const item of routed.items) { + collectedHeritage.push({ + filePath: file.path, + className: item.enclosingClass, + parentName: item.mixinName, + kind: 'trait-impl', + }); + } + return; + + case 'properties': { + const fileId = generateId('File', file.path); + for (const item of routed.items) { + const nodeId = generateId('Property', `${file.path}:${item.propName}`); + graph.addNode({ + id: nodeId, + label: 'Property' as any, // TODO: add 'Property' to graph node label union + properties: { + name: item.propName, filePath: file.path, + startLine: item.startLine, endLine: item.endLine, + language: SupportedLanguages.Ruby, isExported: true, + description: item.accessorType, + }, + }); + symbolTable.add(file.path, item.propName, nodeId, 'Property'); + const relId = generateId('DEFINES', `${fileId}->${nodeId}`); + graph.addRelationship({ + id: relId, sourceId: fileId, targetId: nodeId, + type: 'DEFINES', confidence: 1.0, reason: '', + }); + } + return; + } + + case 'call': + break; // fall through to normal call processing below + } + } + // Skip common built-ins and noise if (isBuiltInOrNoise(calledName)) return; @@ -152,10 +205,10 @@ export const processCalls = async ( // 5. Find the enclosing function (caller) const enclosingFuncId = findEnclosingFunction(callNode, file.path, symbolTable); - + // Use enclosing function as source, fallback to file for top-level calls const sourceId = enclosingFuncId || generateId('File', file.path); - + const relId = generateId('CALLS', `${sourceId}:${calledName}->${resolved.nodeId}`); graph.addRelationship({ @@ -178,6 +231,8 @@ export const processCalls = async ( ); } } + + return collectedHeritage; }; /** diff --git a/gitnexus/src/core/ingestion/entry-point-scoring.ts b/gitnexus/src/core/ingestion/entry-point-scoring.ts index b05be85e45..b58bbe33d5 100644 --- a/gitnexus/src/core/ingestion/entry-point-scoring.ts +++ b/gitnexus/src/core/ingestion/entry-point-scoring.ts @@ -14,7 +14,7 @@ import { detectFrameworkFromPath } from './framework-detection.js'; import { SupportedLanguages } from '../../config/supported-languages.js'; // ============================================================================ -// NAME PATTERNS - All 9 supported languages +// NAME PATTERNS - All 11 supported languages // ============================================================================ /** @@ -191,6 +191,13 @@ const ENTRY_POINT_PATTERNS: Record = { /^save$/, // Repository::save() /^delete$/, // Repository::delete() ], + + // Ruby + [SupportedLanguages.Ruby]: [ + /^call$/, // Service objects (MyService.call) + /^perform$/, // Background jobs (Sidekiq, ActiveJob) + /^execute$/, // Command pattern + ], }; /** Pre-computed merged patterns (universal + language-specific) to avoid per-call array allocation. */ @@ -361,7 +368,12 @@ export function isTestFile(filePath: string): boolean { p.endsWith('test.php') || p.endsWith('spec.php') || p.includes('/tests/feature/') || - p.includes('/tests/unit/') + p.includes('/tests/unit/') || + // Ruby test patterns + p.endsWith('_spec.rb') || + p.endsWith('_test.rb') || + p.includes('/spec/') || + p.includes('/test/fixtures/') ); } diff --git a/gitnexus/src/core/ingestion/export-detection.ts b/gitnexus/src/core/ingestion/export-detection.ts index 822b297d26..e6c6e89df9 100644 --- a/gitnexus/src/core/ingestion/export-detection.ts +++ b/gitnexus/src/core/ingestion/export-detection.ts @@ -222,6 +222,7 @@ const exportCheckers = { [SupportedLanguages.CPlusPlus]: cCppExportChecker, [SupportedLanguages.PHP]: phpExportChecker, [SupportedLanguages.Swift]: swiftExportChecker, + [SupportedLanguages.Ruby]: (_node, _name) => true, } satisfies Record; // ============================================================================ diff --git a/gitnexus/src/core/ingestion/framework-detection.ts b/gitnexus/src/core/ingestion/framework-detection.ts index eb392a7622..f17d93b361 100644 --- a/gitnexus/src/core/ingestion/framework-detection.ts +++ b/gitnexus/src/core/ingestion/framework-detection.ts @@ -330,6 +330,18 @@ export function detectFrameworkFromPath(filePath: string): FrameworkHint | null return { framework: 'laravel', entryPointMultiplier: 1.5, reason: 'laravel-repository' }; } + // ========== RUBY ========== + + // Ruby: bin/ or exe/ (CLI entry points) + if ((p.includes('/bin/') || p.includes('/exe/')) && p.endsWith('.rb')) { + return { framework: 'ruby', entryPointMultiplier: 2.5, reason: 'ruby-executable' }; + } + + // Ruby: Rakefile or *.rake (task definitions) + if (p.endsWith('/rakefile') || p.endsWith('.rake')) { + return { framework: 'ruby', entryPointMultiplier: 1.5, reason: 'ruby-rake' }; + } + // ========== SWIFT / iOS ========== // iOS App entry points (highest priority) diff --git a/gitnexus/src/core/ingestion/import-processor.ts b/gitnexus/src/core/ingestion/import-processor.ts index 7533d8f4e4..447bd98a50 100644 --- a/gitnexus/src/core/ingestion/import-processor.ts +++ b/gitnexus/src/core/ingestion/import-processor.ts @@ -31,6 +31,7 @@ import { resolvePhpImport, resolveRustImport, } from './resolvers/index.js'; +import { routeRubyCall } from './ruby-call-routing.js'; import type { SuffixIndex, TsconfigPaths, @@ -444,6 +445,24 @@ export const processImports = async ( const bindings = namedImportMap ? extractNamedBindings(captureMap['import'], language) : undefined; applyImportResult(result, file.path, importMap, packageMap, addImportEdge, addImportGraphEdge, bindings, namedImportMap); } + + // ---- Ruby: require/require_relative come through @call, not @import ---- + if (language === SupportedLanguages.Ruby && captureMap['call']) { + const callNameNode = captureMap['call.name']; + if (callNameNode) { + const routed = routeRubyCall(callNameNode.text, captureMap['call']); + if (routed.kind === 'import') { + totalImportsFound++; + const resolvedPath = resolveImportPath( + file.path, routed.importPath, allFilePaths, allFileList, + normalizedFileList, resolveCache, language, configs.tsconfigPaths, index, + ); + if (resolvedPath) { + addImportEdge(file.path, resolvedPath); + } + } + } + } }); // Tree is now owned by the LRU cache — no manual delete needed diff --git a/gitnexus/src/core/ingestion/pipeline.ts b/gitnexus/src/core/ingestion/pipeline.ts index 489e18ccf5..e3cacd78ce 100644 --- a/gitnexus/src/core/ingestion/pipeline.ts +++ b/gitnexus/src/core/ingestion/pipeline.ts @@ -273,8 +273,11 @@ export const runPipelineFromRepo = async ( .filter(p => chunkContents.has(p)) .map(p => ({ path: p, content: chunkContents.get(p)! })); astCache = createASTCache(chunkFiles.length); - await processCalls(graph, chunkFiles, astCache, symbolTable, importMap, packageMap, undefined, namedImportMap); + const rubyHeritage = await processCalls(graph, chunkFiles, astCache, symbolTable, importMap, packageMap, undefined, namedImportMap); await processHeritage(graph, chunkFiles, astCache, symbolTable, importMap, packageMap); + if (rubyHeritage.length > 0) { + await processHeritageFromExtracted(graph, rubyHeritage, symbolTable, importMap, packageMap); + } astCache.clear(); } diff --git a/gitnexus/src/core/ingestion/resolvers/index.ts b/gitnexus/src/core/ingestion/resolvers/index.ts index 693ad09a22..b1d6cabf15 100644 --- a/gitnexus/src/core/ingestion/resolvers/index.ts +++ b/gitnexus/src/core/ingestion/resolvers/index.ts @@ -19,5 +19,7 @@ export type { ComposerConfig } from './php.js'; export { resolveRustImport, tryRustModulePath } from './rust.js'; +export { resolveRubyImport } from './ruby.js'; + export { resolveImportPath, RESOLVE_CACHE_CAP } from './standard.js'; export type { TsconfigPaths } from './standard.js'; diff --git a/gitnexus/src/core/ingestion/resolvers/ruby.ts b/gitnexus/src/core/ingestion/resolvers/ruby.ts new file mode 100644 index 0000000000..e0ae8e690c --- /dev/null +++ b/gitnexus/src/core/ingestion/resolvers/ruby.ts @@ -0,0 +1,23 @@ +/** + * Ruby require/require_relative import resolution. + * Handles path resolution for Ruby's require and require_relative calls. + */ + +import type { SuffixIndex } from './utils.js'; +import { suffixResolve } from './utils.js'; + +/** + * Resolve a Ruby require/require_relative path to a matching .rb file. + * + * require_relative paths are pre-normalized to './' prefix by the caller. + * require paths use suffix matching (gem-style paths like 'json', 'net/http'). + */ +export function resolveRubyImport( + importPath: string, + normalizedFileList: string[], + allFileList: string[], + index?: SuffixIndex, +): string | null { + const pathParts = importPath.replace(/^\.\//, '').split('/').filter(Boolean); + return suffixResolve(pathParts, normalizedFileList, allFileList, index); +} diff --git a/gitnexus/src/core/ingestion/resolvers/utils.ts b/gitnexus/src/core/ingestion/resolvers/utils.ts index e68116e2d1..3c7a1eb2e4 100644 --- a/gitnexus/src/core/ingestion/resolvers/utils.ts +++ b/gitnexus/src/core/ingestion/resolvers/utils.ts @@ -26,6 +26,8 @@ export const EXTENSIONS = [ '.php', '.phtml', // Swift '.swift', + // Ruby + '.rb', ]; /** diff --git a/gitnexus/src/core/ingestion/ruby-call-routing.ts b/gitnexus/src/core/ingestion/ruby-call-routing.ts new file mode 100644 index 0000000000..c634742d33 --- /dev/null +++ b/gitnexus/src/core/ingestion/ruby-call-routing.ts @@ -0,0 +1,116 @@ +/** + * Shared Ruby call routing logic. + * + * Ruby expresses imports, heritage (mixins), and property definitions as + * method calls rather than syntax-level constructs. This module provides a + * routing function used by the CLI call-processor, CLI parse-worker, and + * the web call-processor so that the classification logic lives in one place. + * + * NOTE: This file is intentionally duplicated in gitnexus-web/ because the + * two packages have separate build targets (Node native vs WASM/browser). + * Keep both copies in sync until a shared package is introduced. + */ + +// ── Result types ──────────────────────────────────────────────────────────── + +export type RubyCallRouting = + | { kind: 'import'; importPath: string; isRelative: boolean } + | { kind: 'heritage'; items: RubyHeritageItem[] } + | { kind: 'properties'; items: RubyPropertyItem[] } + | { kind: 'call' } + | { kind: 'skip' }; + +export interface RubyHeritageItem { + enclosingClass: string; + mixinName: string; +} + +export type RubyAccessorType = 'attr_accessor' | 'attr_reader' | 'attr_writer'; + +export interface RubyPropertyItem { + propName: string; + accessorType: RubyAccessorType; + startLine: number; + endLine: number; +} + +// ── Pre-allocated singletons for common return values ──────────────────────── +const CALL_RESULT: RubyCallRouting = { kind: 'call' }; +const SKIP_RESULT: RubyCallRouting = { kind: 'skip' }; + +/** Max depth for parent-walking loops to prevent pathological AST traversals */ +const MAX_PARENT_DEPTH = 50; + +// ── Routing function ──────────────────────────────────────────────────────── + +/** + * Classify a Ruby call node and extract its semantic payload. + * + * @param calledName - The method name (e.g. 'require', 'include', 'attr_accessor') + * @param callNode - The tree-sitter `call` AST node + * @returns A discriminated union describing the call's semantic role + */ +export function routeRubyCall(calledName: string, callNode: any): RubyCallRouting { + // ── require / require_relative → import ───────────────────────────────── + if (calledName === 'require' || calledName === 'require_relative') { + const argList = callNode.childForFieldName?.('arguments'); + const stringNode = argList?.children?.find((c: any) => c.type === 'string'); + const contentNode = stringNode?.children?.find((c: any) => c.type === 'string_content'); + if (!contentNode) return SKIP_RESULT; + + let importPath: string = contentNode.text; + // Validate: reject null bytes, control chars, excessively long paths + if (!importPath || importPath.length > 1024 || /[\x00-\x1f]/.test(importPath)) { + return SKIP_RESULT; + } + const isRelative = calledName === 'require_relative'; + if (isRelative && !importPath.startsWith('.')) { + importPath = './' + importPath; + } + return { kind: 'import', importPath, isRelative }; + } + + // ── include / extend / prepend → heritage (mixin) ────────────────────── + if (calledName === 'include' || calledName === 'extend' || calledName === 'prepend') { + let enclosingClass: string | null = null; + let current = callNode.parent; + let depth = 0; + while (current && ++depth <= MAX_PARENT_DEPTH) { + if (current.type === 'class' || current.type === 'module') { + const nameNode = current.childForFieldName?.('name'); + if (nameNode) { enclosingClass = nameNode.text; break; } + } + current = current.parent; + } + if (!enclosingClass) return SKIP_RESULT; + + const items: RubyHeritageItem[] = []; + const argList = callNode.childForFieldName?.('arguments'); + for (const arg of (argList?.children ?? [])) { + if (arg.type === 'constant' || arg.type === 'scope_resolution') { + items.push({ enclosingClass, mixinName: arg.text }); + } + } + return items.length > 0 ? { kind: 'heritage', items } : SKIP_RESULT; + } + + // ── attr_accessor / attr_reader / attr_writer → property definitions ─── + if (calledName === 'attr_accessor' || calledName === 'attr_reader' || calledName === 'attr_writer') { + const items: RubyPropertyItem[] = []; + const argList = callNode.childForFieldName?.('arguments'); + for (const arg of (argList?.children ?? [])) { + if (arg.type === 'simple_symbol') { + items.push({ + propName: arg.text.startsWith(':') ? arg.text.slice(1) : arg.text, + accessorType: calledName as RubyAccessorType, + startLine: arg.startPosition.row, + endLine: arg.endPosition.row, + }); + } + } + return items.length > 0 ? { kind: 'properties', items } : SKIP_RESULT; + } + + // ── Everything else → regular call ───────────────────────────────────── + return CALL_RESULT; +} diff --git a/gitnexus/src/core/ingestion/tree-sitter-queries.ts b/gitnexus/src/core/ingestion/tree-sitter-queries.ts index 4a8d18707f..6f40b0d785 100644 --- a/gitnexus/src/core/ingestion/tree-sitter-queries.ts +++ b/gitnexus/src/core/ingestion/tree-sitter-queries.ts @@ -496,6 +496,41 @@ export const PHP_QUERIES = ` [(name) (qualified_name)] @heritage.trait))) @heritage `; +// Ruby queries - works with tree-sitter-ruby +// NOTE: Ruby uses `call` for require, include, extend, prepend, attr_* etc. +// These are all captured as @call and routed in JS post-processing: +// - require/require_relative → import extraction +// - include/extend/prepend → heritage (mixin) extraction +// - attr_accessor/attr_reader/attr_writer → property definition extraction +// - everything else → regular call extraction +export const RUBY_QUERIES = ` +; ── Modules ────────────────────────────────────────────────────────────────── +(module + name: (constant) @name) @definition.module + +; ── Classes ────────────────────────────────────────────────────────────────── +(class + name: (constant) @name) @definition.class + +; ── Instance methods ───────────────────────────────────────────────────────── +(method + name: (identifier) @name) @definition.method + +; ── Singleton (class-level) methods ────────────────────────────────────────── +(singleton_method + name: (identifier) @name) @definition.function + +; ── All calls (require, include, attr_*, and regular calls routed in JS) ───── +(call + method: (identifier) @call.name) @call + +; ── Heritage: class < SuperClass ───────────────────────────────────────────── +(class + name: (constant) @heritage.class + superclass: (superclass + (constant) @heritage.extends)) @heritage +`; + // Kotlin queries - works with tree-sitter-kotlin (fwcd/tree-sitter-kotlin) // Based on official tags.scm; functions use simple_identifier, classes use type_identifier export const KOTLIN_QUERIES = ` @@ -643,6 +678,7 @@ export const LANGUAGE_QUERIES: Record = { [SupportedLanguages.Go]: GO_QUERIES, [SupportedLanguages.CPlusPlus]: CPP_QUERIES, [SupportedLanguages.CSharp]: CSHARP_QUERIES, + [SupportedLanguages.Ruby]: RUBY_QUERIES, [SupportedLanguages.Rust]: RUST_QUERIES, [SupportedLanguages.PHP]: PHP_QUERIES, [SupportedLanguages.Kotlin]: KOTLIN_QUERIES, diff --git a/gitnexus/src/core/ingestion/type-extractors/index.ts b/gitnexus/src/core/ingestion/type-extractors/index.ts index f0d6468d36..50e35a7e74 100644 --- a/gitnexus/src/core/ingestion/type-extractors/index.ts +++ b/gitnexus/src/core/ingestion/type-extractors/index.ts @@ -29,6 +29,11 @@ export const typeConfigs = { [SupportedLanguages.C]: cCppConfig, [SupportedLanguages.CPlusPlus]: cCppConfig, [SupportedLanguages.PHP]: phpConfig, + [SupportedLanguages.Ruby]: { + declarationNodeTypes: new Set(), + extractDeclaration: () => {}, + extractParameter: () => {}, + }, } satisfies Record; export type { LanguageTypeConfig, TypeBindingExtractor, ParameterExtractor } from './types.js'; diff --git a/gitnexus/src/core/ingestion/utils.ts b/gitnexus/src/core/ingestion/utils.ts index bbab770125..a180166dc4 100644 --- a/gitnexus/src/core/ingestion/utils.ts +++ b/gitnexus/src/core/ingestion/utils.ts @@ -236,6 +236,21 @@ export const BUILT_IN_NAMES = new Set([ 'lock', 'read', 'write', 'try_lock', 'spawn', 'join', 'sleep', 'Some', 'None', 'Ok', 'Err', + // Ruby built-ins and Kernel methods + 'puts', 'p', 'pp', 'raise', 'fail', + 'require', 'require_relative', 'load', 'autoload', + 'include', 'extend', 'prepend', + 'attr_accessor', 'attr_reader', 'attr_writer', + 'public', 'private', 'protected', 'module_function', + 'lambda', 'proc', 'block_given?', + 'nil?', 'is_a?', 'kind_of?', 'instance_of?', 'respond_to?', + 'freeze', 'frozen?', 'dup', 'tap', 'yield_self', + // Ruby enumerables + 'each', 'select', 'reject', 'detect', 'collect', + 'inject', 'flat_map', 'each_with_object', 'each_with_index', + 'any?', 'all?', 'none?', 'count', 'first', 'last', + 'sort_by', 'min_by', 'max_by', + 'group_by', 'partition', 'compact', 'flatten', 'uniq', ]); /** Check if a name is a built-in function or common noise that should be filtered out */ @@ -417,6 +432,9 @@ export const extractFunctionName = (node: any): { funcName: string | null; label */ export const yieldToEventLoop = (): Promise => new Promise(resolve => setImmediate(resolve)); +/** Ruby extensionless filenames recognised as Ruby source */ +const RUBY_EXTENSIONLESS_FILES = new Set(['Rakefile', 'Gemfile', 'Guardfile', 'Vagrantfile', 'Brewfile']); + /** * Find a child of `childType` within a sibling node of `siblingType`. * Used for Kotlin AST traversal where visibility_modifier lives inside a modifiers sibling. @@ -469,6 +487,16 @@ export const getLanguageFromFilename = (filename: string): SupportedLanguages | filename.endsWith('.php5') || filename.endsWith('.php8')) { return SupportedLanguages.PHP; } + // Ruby (extensions) + if (filename.endsWith('.rb') || filename.endsWith('.rake') || filename.endsWith('.gemspec')) { + return SupportedLanguages.Ruby; + } + // Ruby (extensionless files) + const basename = filename.split('/').pop() || filename; + if (RUBY_EXTENSIONLESS_FILES.has(basename)) { + return SupportedLanguages.Ruby; + } + // Swift (extensions) if (filename.endsWith('.swift')) return SupportedLanguages.Swift; return null; }; diff --git a/gitnexus/src/core/ingestion/workers/parse-worker.ts b/gitnexus/src/core/ingestion/workers/parse-worker.ts index 0bad543f55..9ab48f6822 100644 --- a/gitnexus/src/core/ingestion/workers/parse-worker.ts +++ b/gitnexus/src/core/ingestion/workers/parse-worker.ts @@ -11,6 +11,7 @@ import Go from 'tree-sitter-go'; import Rust from 'tree-sitter-rust'; import Kotlin from 'tree-sitter-kotlin'; import PHP from 'tree-sitter-php'; +import Ruby from 'tree-sitter-ruby'; import { createRequire } from 'node:module'; import { SupportedLanguages } from '../../../config/supported-languages.js'; import { LANGUAGE_QUERIES } from '../tree-sitter-queries.js'; @@ -38,6 +39,7 @@ import { detectFrameworkFromAST } from '../framework-detection.js'; import { generateId } from '../../../lib/utils.js'; import { extractNamedBindings } from '../named-binding-extraction.js'; import { appendKotlinWildcard } from '../resolvers/index.js'; +import { routeRubyCall } from '../ruby-call-routing.js'; // ============================================================================ // Types for serializable results @@ -155,6 +157,7 @@ const languageMap: Record = { [SupportedLanguages.Rust]: Rust, [SupportedLanguages.Kotlin]: Kotlin, [SupportedLanguages.PHP]: PHP.php_only, + [SupportedLanguages.Ruby]: Ruby, ...(Swift ? { [SupportedLanguages.Swift]: Swift } : {}), }; @@ -858,6 +861,91 @@ const processFileGroup = ( const callNameNode = captureMap['call.name']; if (callNameNode) { const calledName = callNameNode.text; + + // Ruby: route special calls to imports, heritage, or properties + if (language === SupportedLanguages.Ruby) { + const callNode = captureMap['call']; + const routed = routeRubyCall(calledName, callNode); + + switch (routed.kind) { + case 'skip': + continue; + + case 'import': + result.imports.push({ + filePath: file.path, + rawImportPath: routed.importPath, + language, + }); + continue; + + case 'heritage': + for (const item of routed.items) { + result.heritage.push({ + filePath: file.path, + className: item.enclosingClass, + parentName: item.mixinName, + kind: 'trait-impl', + }); + } + continue; + + case 'properties': + for (const item of routed.items) { + const nodeId = generateId('Property', `${file.path}:${item.propName}`); + result.nodes.push({ + id: nodeId, + label: 'Property', + properties: { + name: item.propName, + filePath: file.path, + startLine: item.startLine, + endLine: item.endLine, + language, + isExported: true, + description: item.accessorType, + }, + }); + result.symbols.push({ + filePath: file.path, + name: item.propName, + nodeId, + type: 'Property', + }); + const fileId = generateId('File', file.path); + const relId = generateId('DEFINES', `${fileId}->${nodeId}`); + result.relationships.push({ + id: relId, + sourceId: fileId, + targetId: nodeId, + type: 'DEFINES', + confidence: 1.0, + reason: '', + }); + } + continue; + + case 'call': + if (!isBuiltInOrNoise(calledName)) { + const sourceId = findEnclosingFunctionId(callNode, file.path) + || generateId('File', file.path); + const callForm = inferCallForm(callNode, callNameNode); + const receiverName = callForm === 'member' ? extractReceiverName(callNameNode) : undefined; + const receiverTypeName = receiverName ? lookupTypeEnv(typeEnv, receiverName, callNode) : undefined; + result.calls.push({ + filePath: file.path, + calledName, + sourceId, + argCount: countCallArguments(callNode), + ...(callForm !== undefined ? { callForm } : {}), + ...(receiverName !== undefined ? { receiverName } : {}), + ...(receiverTypeName !== undefined ? { receiverTypeName } : {}), + }); + } + continue; + } + } + if (!isBuiltInOrNoise(calledName)) { const callNode = captureMap['call']; const sourceId = findEnclosingFunctionId(callNode, file.path) diff --git a/gitnexus/src/core/tree-sitter/parser-loader.ts b/gitnexus/src/core/tree-sitter/parser-loader.ts index f7eadc1ab1..c8cac82af2 100644 --- a/gitnexus/src/core/tree-sitter/parser-loader.ts +++ b/gitnexus/src/core/tree-sitter/parser-loader.ts @@ -10,6 +10,7 @@ import Go from 'tree-sitter-go'; import Rust from 'tree-sitter-rust'; import Kotlin from 'tree-sitter-kotlin'; import PHP from 'tree-sitter-php'; +import Ruby from 'tree-sitter-ruby'; import { createRequire } from 'node:module'; import { SupportedLanguages } from '../../config/supported-languages.js'; @@ -33,6 +34,7 @@ const languageMap: Record = { [SupportedLanguages.Rust]: Rust, [SupportedLanguages.Kotlin]: Kotlin, [SupportedLanguages.PHP]: PHP.php_only, + [SupportedLanguages.Ruby]: Ruby, ...(Swift ? { [SupportedLanguages.Swift]: Swift } : {}), }; diff --git a/gitnexus/src/mcp/local/local-backend.ts b/gitnexus/src/mcp/local/local-backend.ts index 2386fe25e9..90873f50ec 100644 --- a/gitnexus/src/mcp/local/local-backend.ts +++ b/gitnexus/src/mcp/local/local-backend.ts @@ -32,6 +32,7 @@ export function isTestFilePath(filePath: string): boolean { p.includes('/test/') || p.includes('/tests/') || p.includes('/testing/') || p.includes('/fixtures/') || p.endsWith('_test.go') || p.endsWith('_test.py') || + p.endsWith('_spec.rb') || p.endsWith('_test.rb') || p.includes('/spec/') || p.includes('/test_') || p.includes('/conftest.') ); } diff --git a/gitnexus/test/integration/parsing.test.ts b/gitnexus/test/integration/parsing.test.ts index fb96eb252d..e918e181f5 100644 --- a/gitnexus/test/integration/parsing.test.ts +++ b/gitnexus/test/integration/parsing.test.ts @@ -742,8 +742,8 @@ describe('parsing', () => { it('falls back gracefully for unsupported language', async () => { // getLanguageFromFilename returns null for extensions with no grammar mapping. - const rubyLang = getLanguageFromFilename('script.rb'); - expect(rubyLang).toBeNull(); + const scalaLang = getLanguageFromFilename('Main.scala'); + expect(scalaLang).toBeNull(); const luaLang = getLanguageFromFilename('module.lua'); expect(luaLang).toBeNull(); diff --git a/gitnexus/test/unit/ingestion-utils.test.ts b/gitnexus/test/unit/ingestion-utils.test.ts index de0507c90b..08415bb1ad 100644 --- a/gitnexus/test/unit/ingestion-utils.test.ts +++ b/gitnexus/test/unit/ingestion-utils.test.ts @@ -93,6 +93,23 @@ describe('getLanguageFromFilename', () => { }); }); + describe('Ruby', () => { + it.each(['.rb', '.rake', '.gemspec'])( + 'detects %s files', + (ext) => { + expect(getLanguageFromFilename(`file${ext}`)).toBe(SupportedLanguages.Ruby); + } + ); + + it('detects extensionless Rakefile', () => { + expect(getLanguageFromFilename('Rakefile')).toBe(SupportedLanguages.Ruby); + }); + + it('detects extensionless Gemfile', () => { + expect(getLanguageFromFilename('Gemfile')).toBe(SupportedLanguages.Ruby); + }); + }); + describe('Kotlin', () => { it.each(['.kt', '.kts'])( 'detects %s files', @@ -103,7 +120,7 @@ describe('getLanguageFromFilename', () => { }); describe('unsupported', () => { - it.each(['.rb', '.scala', '.r', '.lua', '.zig', '.txt', '.md', '.json', '.yaml'])( + it.each(['.scala', '.r', '.lua', '.zig', '.txt', '.md', '.json', '.yaml'])( 'returns null for %s files', (ext) => { expect(getLanguageFromFilename(`file${ext}`)).toBeNull(); diff --git a/gitnexus/test/unit/parser-loader.test.ts b/gitnexus/test/unit/parser-loader.test.ts index ebc8acd868..11e747f403 100644 --- a/gitnexus/test/unit/parser-loader.test.ts +++ b/gitnexus/test/unit/parser-loader.test.ts @@ -67,8 +67,12 @@ describe('parser-loader', () => { await expect(loadLanguage(SupportedLanguages.TypeScript, 'utils.ts')).resolves.not.toThrow(); }); + it('loads Ruby language', async () => { + await expect(loadLanguage(SupportedLanguages.Ruby)).resolves.not.toThrow(); + }); + it('throws for unsupported language', async () => { - await expect(loadLanguage('ruby' as SupportedLanguages)).rejects.toThrow('Unsupported language'); + await expect(loadLanguage('erlang' as SupportedLanguages)).rejects.toThrow('Unsupported language'); }); }); diff --git a/gitnexus/test/unit/sequential-language-availability.test.ts b/gitnexus/test/unit/sequential-language-availability.test.ts index 4a88a1a6a7..8a0d855532 100644 --- a/gitnexus/test/unit/sequential-language-availability.test.ts +++ b/gitnexus/test/unit/sequential-language-availability.test.ts @@ -76,7 +76,7 @@ describe('sequential native parser availability', () => { createASTCache(), createSymbolTable(), createImportMap(), - )).resolves.toBeUndefined(); + )).resolves.toEqual([]); expect(parserLoader.loadLanguage).not.toHaveBeenCalled(); });