@tng-sh/mcp-server 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. package/README.md +461 -0
  2. package/dist/index.d.ts +3 -0
  3. package/dist/index.d.ts.map +1 -0
  4. package/dist/index.js +189 -0
  5. package/dist/index.js.map +1 -0
  6. package/dist/init.d.ts +2 -0
  7. package/dist/init.d.ts.map +1 -0
  8. package/dist/init.js +113 -0
  9. package/dist/init.js.map +1 -0
  10. package/dist/tools/audit.d.ts +21 -0
  11. package/dist/tools/audit.d.ts.map +1 -0
  12. package/dist/tools/audit.js +204 -0
  13. package/dist/tools/audit.js.map +1 -0
  14. package/dist/tools/clones.d.ts +20 -0
  15. package/dist/tools/clones.d.ts.map +1 -0
  16. package/dist/tools/clones.js +202 -0
  17. package/dist/tools/clones.js.map +1 -0
  18. package/dist/tools/config.d.ts +30 -0
  19. package/dist/tools/config.d.ts.map +1 -0
  20. package/dist/tools/config.js +51 -0
  21. package/dist/tools/config.js.map +1 -0
  22. package/dist/tools/deadcode.d.ts +19 -0
  23. package/dist/tools/deadcode.d.ts.map +1 -0
  24. package/dist/tools/deadcode.js +223 -0
  25. package/dist/tools/deadcode.js.map +1 -0
  26. package/dist/tools/generate.d.ts +21 -0
  27. package/dist/tools/generate.d.ts.map +1 -0
  28. package/dist/tools/generate.js +186 -0
  29. package/dist/tools/generate.js.map +1 -0
  30. package/dist/tools/list.d.ts +18 -0
  31. package/dist/tools/list.d.ts.map +1 -0
  32. package/dist/tools/list.js +147 -0
  33. package/dist/tools/list.js.map +1 -0
  34. package/dist/tools/trace.d.ts +20 -0
  35. package/dist/tools/trace.d.ts.map +1 -0
  36. package/dist/tools/trace.js +194 -0
  37. package/dist/tools/trace.js.map +1 -0
  38. package/dist/tools/utils.d.ts +19 -0
  39. package/dist/tools/utils.d.ts.map +1 -0
  40. package/dist/tools/utils.js +143 -0
  41. package/dist/tools/utils.js.map +1 -0
  42. package/dist/tools/xray.d.ts +20 -0
  43. package/dist/tools/xray.d.ts.map +1 -0
  44. package/dist/tools/xray.js +187 -0
  45. package/dist/tools/xray.js.map +1 -0
  46. package/package.json +44 -0
@@ -0,0 +1,147 @@
1
+ import { exec } from 'child_process';
2
+ import { promisify } from 'util';
3
+ import { readFile } from 'fs/promises';
4
+ const execAsync = promisify(exec);
5
+ export async function listMethods(args) {
6
+ const { file_path } = args;
7
+ try {
8
+ // Try using TNG's parser first
9
+ const tngResult = await listMethodsWithTNG(file_path);
10
+ if (tngResult) {
11
+ return {
12
+ content: [
13
+ {
14
+ type: 'text',
15
+ text: tngResult,
16
+ },
17
+ ],
18
+ };
19
+ }
20
+ // Fallback to simple regex parsing
21
+ const simpleResult = await listMethodsSimple(file_path);
22
+ return {
23
+ content: [
24
+ {
25
+ type: 'text',
26
+ text: simpleResult,
27
+ },
28
+ ],
29
+ };
30
+ }
31
+ catch (error) {
32
+ return {
33
+ content: [
34
+ {
35
+ type: 'text',
36
+ text: `Error listing methods in ${file_path}: ${error.message}`,
37
+ },
38
+ ],
39
+ isError: true,
40
+ };
41
+ }
42
+ }
43
+ async function listMethodsWithTNG(filePath) {
44
+ try {
45
+ const ext = filePath.split('.').pop()?.toLowerCase();
46
+ let command = '';
47
+ switch (ext) {
48
+ case 'rb':
49
+ // Use Ruby parser
50
+ command = `ruby -e "require 'parser/current'; ast = Parser::CurrentRuby.parse(File.read('${filePath}')); puts ast.to_s"`;
51
+ break;
52
+ case 'py':
53
+ // Use Python AST
54
+ command = `python3 -c "import ast, json; tree = ast.parse(open('${filePath}').read()); methods = [node.name for node in ast.walk(tree) if isinstance(node, (ast.FunctionDef, ast.AsyncFunctionDef))]; print(json.dumps(methods))"`;
55
+ break;
56
+ case 'js':
57
+ case 'ts':
58
+ case 'jsx':
59
+ case 'tsx':
60
+ // Use js-pie if available
61
+ command = `js-pie "${filePath}" --list-methods 2>/dev/null || echo "null"`;
62
+ break;
63
+ default:
64
+ return null;
65
+ }
66
+ const { stdout } = await execAsync(command, {
67
+ timeout: 10000,
68
+ maxBuffer: 5 * 1024 * 1024,
69
+ });
70
+ if (!stdout || stdout.trim() === 'null') {
71
+ return null;
72
+ }
73
+ // For Python, parse JSON array
74
+ if (ext === 'py') {
75
+ const methods = JSON.parse(stdout);
76
+ if (methods.length === 0) {
77
+ return `No methods found in ${filePath}`;
78
+ }
79
+ return `# Methods in ${filePath}\n\n${methods.map((m, i) => `${i + 1}. ${m}`).join('\n')}`;
80
+ }
81
+ return stdout;
82
+ }
83
+ catch {
84
+ return null;
85
+ }
86
+ }
87
+ async function listMethodsSimple(filePath) {
88
+ const content = await readFile(filePath, 'utf-8');
89
+ const ext = filePath.split('.').pop()?.toLowerCase();
90
+ let methods = [];
91
+ switch (ext) {
92
+ case 'rb':
93
+ // Ruby: def method_name
94
+ const rubyRegex = /^\s*def\s+(?:self\.)?(\w+[\w!?]*)/gm;
95
+ let rubyMatch;
96
+ let rubyLineNum = 1;
97
+ const rubyLines = content.split('\n');
98
+ for (let i = 0; i < rubyLines.length; i++) {
99
+ rubyMatch = rubyRegex.exec(rubyLines[i]);
100
+ if (rubyMatch) {
101
+ methods.push({ name: rubyMatch[1], line: i + 1 });
102
+ }
103
+ }
104
+ break;
105
+ case 'py':
106
+ // Python: def method_name or async def method_name
107
+ const pythonRegex = /^\s*(?:async\s+)?def\s+(\w+)/gm;
108
+ let pythonMatch;
109
+ const pythonLines = content.split('\n');
110
+ for (let i = 0; i < pythonLines.length; i++) {
111
+ pythonMatch = pythonRegex.exec(pythonLines[i]);
112
+ if (pythonMatch) {
113
+ methods.push({ name: pythonMatch[1], line: i + 1 });
114
+ }
115
+ }
116
+ break;
117
+ case 'js':
118
+ case 'ts':
119
+ case 'jsx':
120
+ case 'tsx':
121
+ // JavaScript/TypeScript: function name, const name = function, const name = () =>
122
+ const jsRegex = /(?:function\s+(\w+)|(?:const|let|var)\s+(\w+)\s*=\s*(?:function|async\s+function|\([^)]*\)\s*=>|async\s*\([^)]*\)\s*=>))/gm;
123
+ let jsMatch;
124
+ const jsLines = content.split('\n');
125
+ for (let i = 0; i < jsLines.length; i++) {
126
+ jsMatch = jsRegex.exec(jsLines[i]);
127
+ if (jsMatch) {
128
+ const name = jsMatch[1] || jsMatch[2];
129
+ if (name) {
130
+ methods.push({ name, line: i + 1 });
131
+ }
132
+ }
133
+ }
134
+ break;
135
+ default:
136
+ return `Unsupported file type: ${ext}`;
137
+ }
138
+ if (methods.length === 0) {
139
+ return `No methods found in ${filePath}`;
140
+ }
141
+ let output = `# Methods in ${filePath}\n\n`;
142
+ methods.forEach((method, index) => {
143
+ output += `${index + 1}. **${method.name}** (Line ${method.line})\n`;
144
+ });
145
+ return output;
146
+ }
147
+ //# sourceMappingURL=list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/tools/list.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ interface TraceArgs {
2
+ file_path: string;
3
+ method_name: string;
4
+ project_root?: string;
5
+ }
6
+ export declare function traceMethod(args: TraceArgs): Promise<{
7
+ content: {
8
+ type: "text";
9
+ text: string;
10
+ }[];
11
+ isError: boolean;
12
+ } | {
13
+ content: {
14
+ type: "text";
15
+ text: string;
16
+ }[];
17
+ isError?: undefined;
18
+ }>;
19
+ export {};
20
+ //# sourceMappingURL=trace.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trace.d.ts","sourceRoot":"","sources":["../../src/tools/trace.ts"],"names":[],"mappings":"AAQA,UAAU,SAAS;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,wBAAsB,WAAW,CAAC,IAAI,EAAE,SAAS;;;;;;;;;;;;GA0IhD"}
@@ -0,0 +1,194 @@
1
+ import { exec, execFile } from 'child_process';
2
+ import { promisify } from 'util';
3
+ import { resolve } from 'path';
4
+ import { findProjectRoot, getTngCommandConfig, detectLanguage, getShellEnv, shellEscape } from './utils.js';
5
+ const execAsync = promisify(exec);
6
+ const execFileAsync = promisify(execFile);
7
+ export async function traceMethod(args) {
8
+ const { file_path, method_name, project_root } = args;
9
+ try {
10
+ const absoluteFilePath = resolve(file_path);
11
+ const cwd = project_root || findProjectRoot(absoluteFilePath) || process.cwd();
12
+ const tngCommand = getTngCommandConfig(cwd, file_path);
13
+ // Build trace command with JSON output
14
+ const baseArgs = ['--trace', '--json', '-f', file_path, '-m', method_name];
15
+ const command = tngCommand.shell
16
+ ? `${tngCommand.cmd} ${baseArgs.map(shellEscape).join(' ')}`
17
+ : `${tngCommand.cmd} ${[...tngCommand.args, ...baseArgs].map(shellEscape).join(' ')}`;
18
+ console.error(`[TNG MCP] Running: ${command}`);
19
+ console.error(`[TNG MCP] CWD: ${cwd}`);
20
+ const { stdout, stderr } = tngCommand.shell
21
+ ? await execAsync(command, {
22
+ cwd,
23
+ env: getShellEnv(),
24
+ timeout: 120000, // 2 minutes
25
+ maxBuffer: 10 * 1024 * 1024,
26
+ })
27
+ : await execFileAsync(tngCommand.cmd, [...tngCommand.args, ...baseArgs], {
28
+ cwd,
29
+ env: getShellEnv(),
30
+ timeout: 120000,
31
+ maxBuffer: 10 * 1024 * 1024,
32
+ });
33
+ if (stderr && !stderr.includes('TNG')) {
34
+ console.error('[TNG MCP] stderr:', stderr);
35
+ }
36
+ // Parse JSON output
37
+ const lines = stdout.trim().split('\n');
38
+ let result = null;
39
+ for (const line of lines) {
40
+ if (!line.trim())
41
+ continue;
42
+ try {
43
+ const event = JSON.parse(line);
44
+ // Check for various trace-like properties
45
+ if (event.type === 'result' || event.trace || event.execution_path || event.timeline || event.steps) {
46
+ result = event;
47
+ break;
48
+ }
49
+ if (event.type === 'error' || event.type === 'auth_error') {
50
+ throw new Error(event.message || 'Trace generation failed');
51
+ }
52
+ }
53
+ catch (e) {
54
+ // Try parsing as single JSON - look for ANY trace-related fields
55
+ if (line.includes('{') && (line.includes('"trace"') ||
56
+ line.includes('"timeline"') ||
57
+ line.includes('"execution_path"') ||
58
+ line.includes('"steps"'))) {
59
+ result = JSON.parse(line);
60
+ break;
61
+ }
62
+ }
63
+ }
64
+ if (!result) {
65
+ return {
66
+ content: [
67
+ {
68
+ type: 'text',
69
+ text: `No trace results returned. Raw output:\n${stdout.substring(0, 500)}`,
70
+ },
71
+ ],
72
+ isError: true,
73
+ };
74
+ }
75
+ const formattedOutput = formatTraceResult(result, file_path, method_name);
76
+ return {
77
+ content: [
78
+ {
79
+ type: 'text',
80
+ text: formattedOutput,
81
+ },
82
+ ],
83
+ };
84
+ }
85
+ catch (error) {
86
+ if (error.code === 'ENOENT') {
87
+ return {
88
+ content: [
89
+ {
90
+ type: 'text',
91
+ text: `Error: TNG CLI not found in project. Please install TNG first.`,
92
+ },
93
+ ],
94
+ isError: true,
95
+ };
96
+ }
97
+ if (error.killed) {
98
+ return {
99
+ content: [
100
+ {
101
+ type: 'text',
102
+ text: `Error: Trace generation timed out after 2 minutes.`,
103
+ },
104
+ ],
105
+ isError: true,
106
+ };
107
+ }
108
+ let errorMessage = error.message;
109
+ try {
110
+ const errorOutput = error.stdout || error.stderr || '';
111
+ const lines = errorOutput.split('\n');
112
+ for (const line of lines) {
113
+ if (!line.trim())
114
+ continue;
115
+ try {
116
+ const event = JSON.parse(line);
117
+ if (event.type === 'error' || event.type === 'auth_error') {
118
+ errorMessage = event.message || errorMessage;
119
+ break;
120
+ }
121
+ }
122
+ catch { }
123
+ }
124
+ }
125
+ catch { }
126
+ return {
127
+ content: [
128
+ {
129
+ type: 'text',
130
+ text: `Error generating trace for ${file_path}#${method_name}: ${errorMessage}`,
131
+ },
132
+ ],
133
+ isError: true,
134
+ };
135
+ }
136
+ }
137
+ function formatTraceResult(result, filePath, methodName) {
138
+ const trace = result.trace || result.execution_path || result.timeline || result.steps || [];
139
+ const className = result.class_name || result.className || '';
140
+ const fullName = className ? `${className}#${methodName}` : methodName;
141
+ const lang = detectLanguage(filePath);
142
+ let output = `# Symbolic Trace for ${fullName}\n\n`;
143
+ output += `**File:** ${filePath}\n\n`;
144
+ // Add metadata if present
145
+ if (result.param_shapes && Object.keys(result.param_shapes).length > 0) {
146
+ output += `### Expected Parameter Shapes\n`;
147
+ output += `*Inferred structure of arguments based on usage:*\n\n`;
148
+ Object.entries(result.param_shapes).forEach(([param, fields]) => {
149
+ const fieldList = Array.isArray(fields) ? fields.join(', ') : fields;
150
+ output += `- **${param}**: \`{ ${fieldList} }\`\n`;
151
+ });
152
+ output += '\n';
153
+ }
154
+ if (result.possible_callers && result.possible_callers.length > 0) {
155
+ output += `### Possible Callers\n`;
156
+ output += `*Found ${result.possible_callers.length} locations calling this method:*\n\n`;
157
+ result.possible_callers.forEach((caller) => {
158
+ // caller format: { file, line, content, context }
159
+ output += `- **${caller.file}:${caller.line}**\n \`\`\`${lang}\n ${caller.content.trim()}\n \`\`\`\n`;
160
+ });
161
+ output += '\n';
162
+ }
163
+ if (Array.isArray(trace) && trace.length > 0) {
164
+ output += `## Execution Path\n\n`;
165
+ trace.forEach((step, index) => {
166
+ const stepNum = index + 1;
167
+ // Rust timeline format: { line, code, action, insides }
168
+ const action = step.action || step.type || 'STEP';
169
+ const description = step.code || step.description || step.message || '';
170
+ const location = step.line || step.location || '';
171
+ const internals = step.insides || step.state || step.data || {};
172
+ output += `### ${stepNum}. [${action}] ${description}\n`;
173
+ if (location) {
174
+ output += `**Location:** Line ${location}\n`;
175
+ }
176
+ if (internals && Object.keys(internals).length > 0) {
177
+ output += `**Details:**\n`;
178
+ Object.entries(internals).forEach(([key, value]) => {
179
+ const formattedValue = typeof value === 'object' ? JSON.stringify(value) : value;
180
+ output += `- ${key}: \`${formattedValue}\`\n`;
181
+ });
182
+ }
183
+ output += '\n';
184
+ });
185
+ }
186
+ else if (typeof trace === 'string') {
187
+ output += `## Execution Path\n\n${trace}\n`;
188
+ }
189
+ else {
190
+ output += `⚠️ No trace data was generated.\n`;
191
+ }
192
+ return output;
193
+ }
194
+ //# sourceMappingURL=trace.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trace.js","sourceRoot":"","sources":["../../src/tools/trace.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ export declare function findProjectRoot(filePath: string): string | null;
2
+ export interface TngCommandConfig {
3
+ cmd: string;
4
+ args: string[];
5
+ shell: boolean;
6
+ }
7
+ export declare function getTngCommandConfig(projectRoot: string, filePath: string): TngCommandConfig;
8
+ /**
9
+ * Get the environment to use for running TNG commands.
10
+ * The correct paths (PATH, GEM_HOME, etc.) should be configured
11
+ * in the MCP server's env section (e.g., mcp_config.json).
12
+ */
13
+ export declare function getShellEnv(): {
14
+ TNG_JSON_MODE: string;
15
+ TZ?: string | undefined;
16
+ };
17
+ export declare function shellEscape(arg: string): string;
18
+ export declare function detectLanguage(filePath: string): string;
19
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/tools/utils.ts"],"names":[],"mappings":"AAIA,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAkB/D;AAED,MAAM,WAAW,gBAAgB;IAC7B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,KAAK,EAAE,OAAO,CAAC;CAClB;AAUD,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,gBAAgB,CAsF3F;AAED;;;;GAIG;AACH,wBAAgB,WAAW;;;EAE1B;AAED,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAG/C;AAED,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAoBvD"}
@@ -0,0 +1,143 @@
1
+ import { existsSync } from 'fs';
2
+ import { join, dirname } from 'path';
3
+ import { execSync } from 'child_process';
4
+ export function findProjectRoot(filePath) {
5
+ let dir = dirname(filePath);
6
+ // Look for project markers
7
+ const markers = ['Gemfile', 'go.mod', 'pyproject.toml', 'package.json', 'setup.py', 'requirements.txt'];
8
+ for (let i = 0; i < 10; i++) { // Max 10 levels up
9
+ for (const marker of markers) {
10
+ if (existsSync(join(dir, marker))) {
11
+ return dir;
12
+ }
13
+ }
14
+ const parent = dirname(dir);
15
+ if (parent === dir)
16
+ break; // Reached root
17
+ dir = parent;
18
+ }
19
+ return null;
20
+ }
21
+ function parseArgsList(argsValue) {
22
+ if (!argsValue)
23
+ return [];
24
+ return argsValue
25
+ .split(',')
26
+ .map((part) => part.trim())
27
+ .filter((part) => part.length > 0);
28
+ }
29
+ export function getTngCommandConfig(projectRoot, filePath) {
30
+ const ext = filePath.split('.').pop()?.toLowerCase();
31
+ const langSuffixMap = {
32
+ rb: 'RUBY',
33
+ py: 'PYTHON',
34
+ js: 'JS',
35
+ jsx: 'JS',
36
+ ts: 'TS',
37
+ tsx: 'TS',
38
+ };
39
+ const langSuffix = ext ? langSuffixMap[ext] : undefined;
40
+ if (langSuffix) {
41
+ const cmd = process.env[`TNG_COMMAND_${langSuffix}`];
42
+ if (cmd && cmd.trim().length > 0) {
43
+ const args = parseArgsList(process.env[`TNG_COMMAND_${langSuffix}_ARGS`]);
44
+ return { cmd: cmd.trim(), args, shell: false };
45
+ }
46
+ }
47
+ const overrideCommand = process.env.TNG_COMMAND;
48
+ if (overrideCommand && overrideCommand.trim().length > 0) {
49
+ const overrideArgs = parseArgsList(process.env.TNG_COMMAND_ARGS);
50
+ if (overrideArgs.length > 0) {
51
+ return { cmd: overrideCommand.trim(), args: overrideArgs, shell: false };
52
+ }
53
+ return { cmd: overrideCommand.trim(), args: [], shell: true };
54
+ }
55
+ // PRIORITY 1: dev binary for js-pie repo (needs 'node' prefix)
56
+ const devBinary = join(projectRoot, 'bin', 'tng.js');
57
+ if (existsSync(devBinary)) {
58
+ return { cmd: 'node', args: [devBinary], shell: false };
59
+ }
60
+ // PRIORITY 3: Local project binaries
61
+ const localPaths = [
62
+ // Python virtual environments
63
+ join(projectRoot, 'venv', 'bin', 'tng'),
64
+ join(projectRoot, '.venv', 'bin', 'tng'),
65
+ join(projectRoot, 'env', 'bin', 'tng'),
66
+ // Ruby bundler binstubs
67
+ join(projectRoot, 'bin', 'tng'),
68
+ join(projectRoot, 'vendor', 'bin', 'tng'),
69
+ // Node.js local install (executable)
70
+ join(projectRoot, 'node_modules', '.bin', 'tng'),
71
+ ];
72
+ for (const localPath of localPaths) {
73
+ if (existsSync(localPath)) {
74
+ return { cmd: localPath, args: [], shell: false };
75
+ }
76
+ }
77
+ // PRIORITY 4: Use bundler for Ruby
78
+ if (ext === 'rb' && existsSync(join(projectRoot, 'Gemfile'))) {
79
+ return { cmd: 'bundle', args: ['exec', 'tng'], shell: false };
80
+ }
81
+ // PRIORITY 5: Use uv for Python
82
+ if (ext === 'py') {
83
+ try {
84
+ execSync('which uv', { timeout: 1000, stdio: 'ignore' });
85
+ if (existsSync(join(projectRoot, 'pyproject.toml'))) {
86
+ return { cmd: 'uv', args: ['run', 'tng'], shell: false };
87
+ }
88
+ }
89
+ catch {
90
+ // uv not available
91
+ }
92
+ }
93
+ // PRIORITY 6: Fall back to global command or npx
94
+ switch (ext) {
95
+ case 'rb':
96
+ return { cmd: 'tng', args: [], shell: false };
97
+ case 'py':
98
+ return { cmd: 'tng', args: [], shell: false };
99
+ case 'js':
100
+ case 'ts':
101
+ case 'jsx':
102
+ case 'tsx':
103
+ // Fallback to npx to match VSCode plugin behavior
104
+ return { cmd: 'npx', args: ['-p', '@tng-sh/js', 'tng'], shell: false };
105
+ default:
106
+ return { cmd: 'tng', args: [], shell: false };
107
+ }
108
+ }
109
+ /**
110
+ * Get the environment to use for running TNG commands.
111
+ * The correct paths (PATH, GEM_HOME, etc.) should be configured
112
+ * in the MCP server's env section (e.g., mcp_config.json).
113
+ */
114
+ export function getShellEnv() {
115
+ return { ...process.env, TNG_JSON_MODE: 'true' };
116
+ }
117
+ export function shellEscape(arg) {
118
+ if (arg.length === 0)
119
+ return '""';
120
+ return `"${arg.replace(/\\/g, '\\\\').replace(/"/g, '\\"')}"`;
121
+ }
122
+ export function detectLanguage(filePath) {
123
+ const ext = filePath.split('.').pop()?.toLowerCase();
124
+ switch (ext) {
125
+ case 'rb':
126
+ return 'ruby';
127
+ case 'py':
128
+ return 'python';
129
+ case 'js':
130
+ case 'jsx':
131
+ return 'javascript';
132
+ case 'ts':
133
+ case 'tsx':
134
+ return 'typescript';
135
+ case 'go':
136
+ return 'go';
137
+ case 'rs':
138
+ return 'rust';
139
+ default:
140
+ return 'text';
141
+ }
142
+ }
143
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/tools/utils.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ interface XRayArgs {
2
+ file_path: string;
3
+ method_name: string;
4
+ project_root?: string;
5
+ }
6
+ export declare function xrayMethod(args: XRayArgs): Promise<{
7
+ content: {
8
+ type: "text";
9
+ text: string;
10
+ }[];
11
+ isError: boolean;
12
+ } | {
13
+ content: {
14
+ type: "text";
15
+ text: string;
16
+ }[];
17
+ isError?: undefined;
18
+ }>;
19
+ export {};
20
+ //# sourceMappingURL=xray.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"xray.d.ts","sourceRoot":"","sources":["../../src/tools/xray.ts"],"names":[],"mappings":"AAQA,UAAU,QAAQ;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,wBAAsB,UAAU,CAAC,IAAI,EAAE,QAAQ;;;;;;;;;;;;GAgJ9C"}