@cesarandreslopez/occ 0.2.0 → 0.3.1

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.
@@ -0,0 +1,178 @@
1
+ import { writeFile } from 'node:fs/promises';
2
+ import path from 'node:path';
3
+ import { Option } from 'commander';
4
+ import { buildCodebaseIndex } from './build.js';
5
+ import { writeStream } from '../utils.js';
6
+ import { analyzeCallChain, analyzeCallers, analyzeCalls, analyzeDeps, analyzeTree, createPayload, findByName, findByPattern, findByType, findContent, } from './query.js';
7
+ import { formatChains, formatClassTree, formatContentResults, formatDependencies, formatPayloadJson, formatRelationResults, formatSearchResults, } from './output.js';
8
+ function getOptions(command) {
9
+ return command.optsWithGlobals();
10
+ }
11
+ const FINDABLE_TYPES = ['file', 'module', 'function', 'class', 'variable'];
12
+ function parseLimit(value, fallback) {
13
+ if (!value)
14
+ return fallback;
15
+ const parsed = Number.parseInt(value, 10);
16
+ if (!Number.isFinite(parsed) || parsed <= 0) {
17
+ throw new Error(`Invalid numeric limit: "${value}"`);
18
+ }
19
+ return parsed;
20
+ }
21
+ function parseType(value) {
22
+ if (!value)
23
+ return undefined;
24
+ if (!FINDABLE_TYPES.includes(value)) {
25
+ throw new Error(`Invalid type "${value}". Expected one of: ${FINDABLE_TYPES.join(', ')}`);
26
+ }
27
+ return value;
28
+ }
29
+ async function emit(output, options) {
30
+ if (options.output) {
31
+ await writeFile(options.output, output);
32
+ return;
33
+ }
34
+ await writeStream(process.stdout, output);
35
+ }
36
+ async function withIndex(options) {
37
+ const repoRoot = path.resolve(options.path ?? process.cwd());
38
+ return buildCodebaseIndex({
39
+ repoRoot,
40
+ excludeDir: options.excludeDir?.split(',').map(value => value.trim()).filter(Boolean),
41
+ noGitignore: options.gitignore === false,
42
+ });
43
+ }
44
+ function addSharedOptions(command, extra = {}) {
45
+ command
46
+ .option('--path <repo-root>', 'repository root to analyze', process.cwd())
47
+ .option('--format <type>', 'output format: tabular or json', 'tabular')
48
+ .option('-o, --output <file>', 'write output to file')
49
+ .option('--ci', 'ASCII-only output, no colors')
50
+ .option('--exclude-dir <dirs>', 'directories to skip (comma-separated)', 'node_modules,.git,dist,vendor,build,coverage,target')
51
+ .option('--no-gitignore', 'disable .gitignore respect');
52
+ if (extra.includeFile) {
53
+ command.option('--file <path>', 'specific file path to disambiguate the target');
54
+ }
55
+ if (extra.includeLimit) {
56
+ command.option('--limit <n>', 'maximum results to return', '50');
57
+ }
58
+ if (extra.includeDepth) {
59
+ command.option('--depth <n>', 'maximum call-chain depth', '5');
60
+ }
61
+ if (extra.includeType) {
62
+ command.addOption(new Option('--type <node-type>', 'filter by node type').choices(FINDABLE_TYPES));
63
+ }
64
+ }
65
+ export function registerCodeCommands(program) {
66
+ const code = program.command('code').description('Explore code structure with first-class JS/TS and Python support');
67
+ const find = code.command('find').description('Find symbols and source content');
68
+ const analyze = code.command('analyze').description('Analyze relationships between code elements');
69
+ const findName = find.command('name <name>').description('Find code elements by exact name');
70
+ addSharedOptions(findName, { includeFile: true, includeLimit: true, includeType: true });
71
+ findName.action(async (name, _options, command) => {
72
+ const options = getOptions(command);
73
+ const index = await withIndex(options);
74
+ const results = findByName(index, name, parseType(options.type), options.file, parseLimit(options.limit, 50));
75
+ const payload = createPayload(index, { command: 'code.find.name', value: name, file: options.file, type: options.type }, results);
76
+ const output = options.format === 'json'
77
+ ? formatPayloadJson(payload)
78
+ : formatSearchResults(`Code Search: ${name}`, results, options.ci);
79
+ await emit(output.endsWith('\n') ? output : `${output}\n`, options);
80
+ });
81
+ const findPatternCmd = find.command('pattern <pattern>').description('Find code elements by substring pattern');
82
+ addSharedOptions(findPatternCmd, { includeLimit: true, includeType: true });
83
+ findPatternCmd.action(async (pattern, _options, command) => {
84
+ const options = getOptions(command);
85
+ const index = await withIndex(options);
86
+ const results = findByPattern(index, pattern, parseType(options.type), parseLimit(options.limit, 50));
87
+ const payload = createPayload(index, { command: 'code.find.pattern', value: pattern, type: options.type }, results);
88
+ const output = options.format === 'json'
89
+ ? formatPayloadJson(payload)
90
+ : formatSearchResults(`Code Pattern: ${pattern}`, results, options.ci);
91
+ await emit(output.endsWith('\n') ? output : `${output}\n`, options);
92
+ });
93
+ const findTypeCmd = find.command('type <nodeType>').description('List all nodes of a given type');
94
+ addSharedOptions(findTypeCmd, { includeLimit: true });
95
+ findTypeCmd.action(async (nodeType, _options, command) => {
96
+ const options = getOptions(command);
97
+ const index = await withIndex(options);
98
+ const results = findByType(index, parseType(nodeType) ?? 'function', parseLimit(options.limit, 50));
99
+ const payload = createPayload(index, { command: 'code.find.type', value: nodeType }, results);
100
+ const output = options.format === 'json'
101
+ ? formatPayloadJson(payload)
102
+ : formatSearchResults(`Code Type: ${nodeType}`, results, options.ci);
103
+ await emit(output.endsWith('\n') ? output : `${output}\n`, options);
104
+ });
105
+ const findContentCmd = find.command('content <text>').description('Search code content');
106
+ addSharedOptions(findContentCmd, { includeLimit: true });
107
+ findContentCmd.action(async (text, _options, command) => {
108
+ const options = getOptions(command);
109
+ const index = await withIndex(options);
110
+ const results = findContent(index, text, parseLimit(options.limit, 50));
111
+ const payload = createPayload(index, { command: 'code.find.content', value: text }, results);
112
+ const output = options.format === 'json'
113
+ ? formatPayloadJson(payload)
114
+ : formatContentResults(results, options.ci);
115
+ await emit(output.endsWith('\n') ? output : `${output}\n`, options);
116
+ });
117
+ const analyzeCallsCmd = analyze.command('calls <functionName>').description('Show what a function calls');
118
+ addSharedOptions(analyzeCallsCmd, { includeFile: true });
119
+ analyzeCallsCmd.action(async (functionName, _options, command) => {
120
+ const options = getOptions(command);
121
+ const index = await withIndex(options);
122
+ const results = analyzeCalls(index, functionName, options.file);
123
+ const payload = createPayload(index, { command: 'code.analyze.calls', value: functionName, file: options.file }, results);
124
+ const output = options.format === 'json'
125
+ ? formatPayloadJson(payload)
126
+ : formatRelationResults(`Outgoing Calls: ${functionName}`, 'Callee', results, options.ci);
127
+ await emit(output.endsWith('\n') ? output : `${output}\n`, options);
128
+ });
129
+ const analyzeCallersCmd = analyze.command('callers <functionName>').description('Show what calls a function');
130
+ addSharedOptions(analyzeCallersCmd, { includeFile: true });
131
+ analyzeCallersCmd.action(async (functionName, _options, command) => {
132
+ const options = getOptions(command);
133
+ const index = await withIndex(options);
134
+ const results = analyzeCallers(index, functionName, options.file);
135
+ const payload = createPayload(index, { command: 'code.analyze.callers', value: functionName, file: options.file }, results);
136
+ const output = options.format === 'json'
137
+ ? formatPayloadJson(payload)
138
+ : formatRelationResults(`Incoming Calls: ${functionName}`, 'Caller', results, options.ci, 'from');
139
+ await emit(output.endsWith('\n') ? output : `${output}\n`, options);
140
+ });
141
+ const analyzeChainCmd = analyze.command('chain <fromFunction> <toFunction>').description('Find call paths between two functions');
142
+ addSharedOptions(analyzeChainCmd, { includeDepth: true });
143
+ analyzeChainCmd.action(async (fromFunction, toFunction, _options, command) => {
144
+ const options = getOptions(command);
145
+ const index = await withIndex(options);
146
+ const results = analyzeCallChain(index, fromFunction, toFunction, parseLimit(options.depth, 5));
147
+ const payload = createPayload(index, { command: 'code.analyze.chain', from: fromFunction, to: toFunction, depth: options.depth }, results);
148
+ const output = options.format === 'json'
149
+ ? formatPayloadJson(payload)
150
+ : formatChains(results, options.ci);
151
+ await emit(output.endsWith('\n') ? output : `${output}\n`, options);
152
+ });
153
+ const analyzeDepsCmd = analyze.command('deps <target>').description('Show module/file import relationships');
154
+ addSharedOptions(analyzeDepsCmd);
155
+ analyzeDepsCmd.action(async (target, _options, command) => {
156
+ const options = getOptions(command);
157
+ const index = await withIndex(options);
158
+ const results = analyzeDeps(index, target);
159
+ const payload = createPayload(index, { command: 'code.analyze.deps', value: target }, results);
160
+ const output = options.format === 'json'
161
+ ? formatPayloadJson(payload)
162
+ : formatDependencies(results, options.ci);
163
+ await emit(output.endsWith('\n') ? output : `${output}\n`, options);
164
+ });
165
+ const analyzeTreeCmd = analyze.command('tree <className>').description('Show class inheritance relationships');
166
+ addSharedOptions(analyzeTreeCmd, { includeFile: true });
167
+ analyzeTreeCmd.action(async (className, _options, command) => {
168
+ const options = getOptions(command);
169
+ const index = await withIndex(options);
170
+ const results = analyzeTree(index, className, options.file);
171
+ const payload = createPayload(index, { command: 'code.analyze.tree', value: className, file: options.file }, results);
172
+ const output = options.format === 'json'
173
+ ? formatPayloadJson(payload)
174
+ : formatClassTree(results, options.ci);
175
+ await emit(output.endsWith('\n') ? output : `${output}\n`, options);
176
+ });
177
+ }
178
+ //# sourceMappingURL=command.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command.js","sourceRoot":"","sources":["../../../src/code/command.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export interface DiscoverCodeOptions {
2
+ excludeDir?: string[];
3
+ noGitignore?: boolean;
4
+ }
5
+ export declare function discoverCodeFiles(repoRoot: string, options?: DiscoverCodeOptions): Promise<string[]>;
@@ -0,0 +1,53 @@
1
+ import fg from 'fast-glob';
2
+ import { readFile, stat } from 'node:fs/promises';
3
+ import path from 'node:path';
4
+ import { CODE_EXTENSIONS, normalizePath } from './languages.js';
5
+ async function loadGitignorePatterns(repoRoot) {
6
+ try {
7
+ const content = await readFile(path.join(repoRoot, '.gitignore'), 'utf8');
8
+ return content
9
+ .split(/\r?\n/)
10
+ .map(line => line.trim())
11
+ .filter(line => line.length > 0 && !line.startsWith('#') && !line.startsWith('!'))
12
+ .map(line => {
13
+ const normalized = normalizePath(line.replace(/^\//, ''));
14
+ if (normalized.endsWith('/'))
15
+ return `${normalized}**`;
16
+ return normalized;
17
+ });
18
+ }
19
+ catch {
20
+ return [];
21
+ }
22
+ }
23
+ export async function discoverCodeFiles(repoRoot, options = {}) {
24
+ const excludeDir = options.excludeDir ?? ['node_modules', '.git', 'dist', 'vendor', 'build', 'coverage', 'target'];
25
+ const ignore = excludeDir.flatMap(dir => [`**/${dir}/**`]);
26
+ if (!options.noGitignore) {
27
+ ignore.push(...await loadGitignorePatterns(repoRoot));
28
+ }
29
+ const pattern = CODE_EXTENSIONS.length === 1
30
+ ? `**/*.${CODE_EXTENSIONS[0]}`
31
+ : `**/*.{${CODE_EXTENSIONS.join(',')}}`;
32
+ const discovered = await fg(pattern, {
33
+ cwd: repoRoot,
34
+ absolute: true,
35
+ onlyFiles: true,
36
+ dot: false,
37
+ followSymbolicLinks: false,
38
+ ignore,
39
+ });
40
+ const existing = [];
41
+ for (const filePath of discovered.sort()) {
42
+ try {
43
+ const fileStat = await stat(filePath);
44
+ if (fileStat.isFile())
45
+ existing.push(filePath);
46
+ }
47
+ catch {
48
+ // Ignore files that disappear during discovery.
49
+ }
50
+ }
51
+ return existing;
52
+ }
53
+ //# sourceMappingURL=discover.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discover.js","sourceRoot":"","sources":["../../../src/code/discover.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,WAAW,CAAC;AAC3B,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAOhE,KAAK,UAAU,qBAAqB,CAAC,QAAgB;IACnD,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,YAAY,CAAC,EAAE,MAAM,CAAC,CAAC;QAC1E,OAAO,OAAO;aACX,KAAK,CAAC,OAAO,CAAC;aACd,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;aACxB,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;aACjF,GAAG,CAAC,IAAI,CAAC,EAAE;YACV,MAAM,UAAU,GAAG,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC;YAC1D,IAAI,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC;gBAAE,OAAO,GAAG,UAAU,IAAI,CAAC;YACvD,OAAO,UAAU,CAAC;QACpB,CAAC,CAAC,CAAC;IACP,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,QAAgB,EAAE,UAA+B,EAAE;IACzF,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,CAAC,cAAc,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC;IACnH,MAAM,MAAM,GAAG,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC;IAC3D,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;QACzB,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,qBAAqB,CAAC,QAAQ,CAAC,CAAC,CAAC;IACxD,CAAC;IAED,MAAM,OAAO,GAAG,eAAe,CAAC,MAAM,KAAK,CAAC;QAC1C,CAAC,CAAC,QAAQ,eAAe,CAAC,CAAC,CAAC,EAAE;QAC9B,CAAC,CAAC,SAAS,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;IAE1C,MAAM,UAAU,GAAG,MAAM,EAAE,CAAC,OAAO,EAAE;QACnC,GAAG,EAAE,QAAQ;QACb,QAAQ,EAAE,IAAI;QACd,SAAS,EAAE,IAAI;QACf,GAAG,EAAE,KAAK;QACV,mBAAmB,EAAE,KAAK;QAC1B,MAAM;KACP,CAAC,CAAC;IAEH,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,KAAK,MAAM,QAAQ,IAAI,UAAU,CAAC,IAAI,EAAE,EAAE,CAAC;QACzC,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,CAAC;YACtC,IAAI,QAAQ,CAAC,MAAM,EAAE;gBAAE,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACjD,CAAC;QAAC,MAAM,CAAC;YACP,gDAAgD;QAClD,CAAC;IACH,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC"}
@@ -0,0 +1,15 @@
1
+ import type { CodeCapabilities } from './types.js';
2
+ export interface LanguageSpec {
3
+ name: string;
4
+ extensions: string[];
5
+ parser: 'typescript' | 'python' | 'go' | 'rust' | 'generic';
6
+ capabilities: CodeCapabilities;
7
+ }
8
+ export declare const LANGUAGE_SPECS: LanguageSpec[];
9
+ export declare const CODE_EXTENSIONS: string[];
10
+ export declare function getLanguageSpec(filePath: string): LanguageSpec | null;
11
+ export declare function getModuleName(repoRoot: string, filePath: string): string;
12
+ export declare function normalizePath(value: string): string;
13
+ export declare function isLocalSpecifier(specifier: string): boolean;
14
+ export declare function resolveLocalImport(repoRoot: string, fromFile: string, specifier: string): string | undefined;
15
+ export declare function resolvePythonImport(repoRoot: string, fromFile: string, specifier: string): string | undefined;
@@ -0,0 +1,117 @@
1
+ import path from 'node:path';
2
+ import { existsSync } from 'node:fs';
3
+ export const LANGUAGE_SPECS = [
4
+ {
5
+ name: 'javascript',
6
+ extensions: ['js', 'jsx', 'mjs', 'cjs'],
7
+ parser: 'typescript',
8
+ capabilities: { definitions: true, imports: true, calls: true, inheritance: true, content: true },
9
+ },
10
+ {
11
+ name: 'typescript',
12
+ extensions: ['ts', 'tsx'],
13
+ parser: 'typescript',
14
+ capabilities: { definitions: true, imports: true, calls: true, inheritance: true, content: true },
15
+ },
16
+ {
17
+ name: 'python',
18
+ extensions: ['py'],
19
+ parser: 'python',
20
+ capabilities: { definitions: true, imports: true, calls: true, inheritance: true, content: true },
21
+ },
22
+ {
23
+ name: 'go',
24
+ extensions: ['go'],
25
+ parser: 'go',
26
+ capabilities: { definitions: true, imports: true, calls: true, inheritance: false, content: true },
27
+ },
28
+ {
29
+ name: 'rust',
30
+ extensions: ['rs'],
31
+ parser: 'rust',
32
+ capabilities: { definitions: true, imports: true, calls: true, inheritance: false, content: true },
33
+ },
34
+ {
35
+ name: 'generic',
36
+ extensions: ['java', 'rb', 'php', 'c', 'h', 'hpp', 'hh', 'cpp', 'cc', 'cxx', 'cs', 'kt', 'scala', 'swift'],
37
+ parser: 'generic',
38
+ capabilities: { definitions: true, imports: true, calls: false, inheritance: false, content: true },
39
+ },
40
+ ];
41
+ const EXTENSION_TO_SPEC = new Map();
42
+ for (const spec of LANGUAGE_SPECS) {
43
+ for (const extension of spec.extensions) {
44
+ EXTENSION_TO_SPEC.set(extension, spec);
45
+ }
46
+ }
47
+ export const CODE_EXTENSIONS = [...EXTENSION_TO_SPEC.keys()].sort();
48
+ export function getLanguageSpec(filePath) {
49
+ const extension = path.extname(filePath).toLowerCase().replace('.', '');
50
+ return EXTENSION_TO_SPEC.get(extension) ?? null;
51
+ }
52
+ export function getModuleName(repoRoot, filePath) {
53
+ const relative = normalizePath(path.relative(repoRoot, filePath));
54
+ return relative.replace(/\.[^.]+$/, '');
55
+ }
56
+ export function normalizePath(value) {
57
+ return value.split(path.sep).join('/');
58
+ }
59
+ export function isLocalSpecifier(specifier) {
60
+ return specifier.startsWith('.') || specifier.startsWith('/');
61
+ }
62
+ export function resolveLocalImport(repoRoot, fromFile, specifier) {
63
+ const fromDir = path.dirname(fromFile);
64
+ const candidateBase = path.resolve(specifier.startsWith('/') ? repoRoot : fromDir, specifier.startsWith('/') ? `.${specifier}` : specifier);
65
+ const candidates = new Set([
66
+ candidateBase,
67
+ `${candidateBase}.ts`,
68
+ `${candidateBase}.tsx`,
69
+ `${candidateBase}.js`,
70
+ `${candidateBase}.jsx`,
71
+ `${candidateBase}.mjs`,
72
+ `${candidateBase}.cjs`,
73
+ `${candidateBase}.py`,
74
+ `${candidateBase}.go`,
75
+ `${candidateBase}.rs`,
76
+ `${candidateBase}.java`,
77
+ `${candidateBase}.rb`,
78
+ `${candidateBase}.php`,
79
+ `${candidateBase}.c`,
80
+ `${candidateBase}.cpp`,
81
+ `${candidateBase}.h`,
82
+ `${candidateBase}.hpp`,
83
+ path.join(candidateBase, 'index.ts'),
84
+ path.join(candidateBase, 'index.tsx'),
85
+ path.join(candidateBase, 'index.js'),
86
+ path.join(candidateBase, 'index.jsx'),
87
+ path.join(candidateBase, 'index.py'),
88
+ ]);
89
+ for (const candidate of candidates) {
90
+ const spec = getLanguageSpec(candidate);
91
+ if (spec && existsSync(candidate))
92
+ return candidate;
93
+ }
94
+ return undefined;
95
+ }
96
+ export function resolvePythonImport(repoRoot, fromFile, specifier) {
97
+ const fromDir = path.dirname(fromFile);
98
+ if (specifier.startsWith('.')) {
99
+ const relativeSpecifier = specifier.replace(/\./g, '/');
100
+ return resolveLocalImport(repoRoot, fromFile, relativeSpecifier);
101
+ }
102
+ const dottedPath = specifier.replace(/\./g, '/');
103
+ const sameDirCandidate = path.resolve(fromDir, `${dottedPath}.py`);
104
+ if (getLanguageSpec(sameDirCandidate)?.name === 'python' && existsSync(sameDirCandidate))
105
+ return sameDirCandidate;
106
+ const repoCandidate = path.resolve(repoRoot, `${dottedPath}.py`);
107
+ if (getLanguageSpec(repoCandidate)?.name === 'python' && existsSync(repoCandidate))
108
+ return repoCandidate;
109
+ const sameDirInit = path.resolve(fromDir, dottedPath, '__init__.py');
110
+ if (getLanguageSpec(sameDirInit)?.name === 'python' && existsSync(sameDirInit))
111
+ return sameDirInit;
112
+ const repoInit = path.resolve(repoRoot, dottedPath, '__init__.py');
113
+ if (getLanguageSpec(repoInit)?.name === 'python' && existsSync(repoInit))
114
+ return repoInit;
115
+ return undefined;
116
+ }
117
+ //# sourceMappingURL=languages.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"languages.js","sourceRoot":"","sources":["../../../src/code/languages.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { CallChain, ClassTreeAnalysis, CodeCommandPayload, CodeSearchResult, ContentMatch, DependencyAnalysis, RelationMatch } from './types.js';
2
+ export declare function formatPayloadJson(payload: CodeCommandPayload): string;
3
+ export declare function formatSearchResults(title: string, results: CodeSearchResult[], ci?: boolean): string;
4
+ export declare function formatContentResults(results: ContentMatch[], ci?: boolean): string;
5
+ export declare function formatRelationResults(title: string, label: string, relations: RelationMatch[], ci?: boolean, side?: 'from' | 'to'): string;
6
+ export declare function formatDependencies(result: DependencyAnalysis, ci?: boolean): string;
7
+ export declare function formatClassTree(result: ClassTreeAnalysis | null, ci?: boolean): string;
8
+ export declare function formatChains(chains: CallChain[], ci?: boolean): string;