@yuaone/tools 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (87) hide show
  1. package/LICENSE +663 -0
  2. package/README.md +15 -0
  3. package/dist/__tests__/file-edit.test.d.ts +8 -0
  4. package/dist/__tests__/file-edit.test.d.ts.map +1 -0
  5. package/dist/__tests__/file-edit.test.js +125 -0
  6. package/dist/__tests__/file-edit.test.js.map +1 -0
  7. package/dist/__tests__/registry.test.d.ts +7 -0
  8. package/dist/__tests__/registry.test.d.ts.map +1 -0
  9. package/dist/__tests__/registry.test.js +83 -0
  10. package/dist/__tests__/registry.test.js.map +1 -0
  11. package/dist/__tests__/validators.test.d.ts +8 -0
  12. package/dist/__tests__/validators.test.d.ts.map +1 -0
  13. package/dist/__tests__/validators.test.js +189 -0
  14. package/dist/__tests__/validators.test.js.map +1 -0
  15. package/dist/base-tool.d.ts +45 -0
  16. package/dist/base-tool.d.ts.map +1 -0
  17. package/dist/base-tool.js +87 -0
  18. package/dist/base-tool.js.map +1 -0
  19. package/dist/browser-tool.d.ts +39 -0
  20. package/dist/browser-tool.d.ts.map +1 -0
  21. package/dist/browser-tool.js +518 -0
  22. package/dist/browser-tool.js.map +1 -0
  23. package/dist/code-search.d.ts +42 -0
  24. package/dist/code-search.d.ts.map +1 -0
  25. package/dist/code-search.js +298 -0
  26. package/dist/code-search.js.map +1 -0
  27. package/dist/design-tools.d.ts +70 -0
  28. package/dist/design-tools.d.ts.map +1 -0
  29. package/dist/design-tools.js +471 -0
  30. package/dist/design-tools.js.map +1 -0
  31. package/dist/dev-server-manager.d.ts +32 -0
  32. package/dist/dev-server-manager.d.ts.map +1 -0
  33. package/dist/dev-server-manager.js +183 -0
  34. package/dist/dev-server-manager.js.map +1 -0
  35. package/dist/file-edit.d.ts +19 -0
  36. package/dist/file-edit.d.ts.map +1 -0
  37. package/dist/file-edit.js +217 -0
  38. package/dist/file-edit.js.map +1 -0
  39. package/dist/file-read.d.ts +19 -0
  40. package/dist/file-read.d.ts.map +1 -0
  41. package/dist/file-read.js +142 -0
  42. package/dist/file-read.js.map +1 -0
  43. package/dist/file-write.d.ts +18 -0
  44. package/dist/file-write.d.ts.map +1 -0
  45. package/dist/file-write.js +139 -0
  46. package/dist/file-write.js.map +1 -0
  47. package/dist/git-ops.d.ts +25 -0
  48. package/dist/git-ops.d.ts.map +1 -0
  49. package/dist/git-ops.js +219 -0
  50. package/dist/git-ops.js.map +1 -0
  51. package/dist/glob.d.ts +18 -0
  52. package/dist/glob.d.ts.map +1 -0
  53. package/dist/glob.js +91 -0
  54. package/dist/glob.js.map +1 -0
  55. package/dist/grep.d.ts +19 -0
  56. package/dist/grep.d.ts.map +1 -0
  57. package/dist/grep.js +177 -0
  58. package/dist/grep.js.map +1 -0
  59. package/dist/index.d.ts +27 -0
  60. package/dist/index.d.ts.map +1 -0
  61. package/dist/index.js +29 -0
  62. package/dist/index.js.map +1 -0
  63. package/dist/security-scan.d.ts +62 -0
  64. package/dist/security-scan.d.ts.map +1 -0
  65. package/dist/security-scan.js +445 -0
  66. package/dist/security-scan.js.map +1 -0
  67. package/dist/shell-exec.d.ts +20 -0
  68. package/dist/shell-exec.d.ts.map +1 -0
  69. package/dist/shell-exec.js +206 -0
  70. package/dist/shell-exec.js.map +1 -0
  71. package/dist/test-run.d.ts +51 -0
  72. package/dist/test-run.d.ts.map +1 -0
  73. package/dist/test-run.js +359 -0
  74. package/dist/test-run.js.map +1 -0
  75. package/dist/tool-registry.d.ts +70 -0
  76. package/dist/tool-registry.d.ts.map +1 -0
  77. package/dist/tool-registry.js +181 -0
  78. package/dist/tool-registry.js.map +1 -0
  79. package/dist/types.d.ts +137 -0
  80. package/dist/types.d.ts.map +1 -0
  81. package/dist/types.js +8 -0
  82. package/dist/types.js.map +1 -0
  83. package/dist/validators.d.ts +57 -0
  84. package/dist/validators.d.ts.map +1 -0
  85. package/dist/validators.js +218 -0
  86. package/dist/validators.js.map +1 -0
  87. package/package.json +42 -0
@@ -0,0 +1,298 @@
1
+ /**
2
+ * @yuaone/tools — code_search tool
3
+ *
4
+ * Phase 1: Symbol-based code search using regex patterns.
5
+ * (Embedding-based semantic search planned for Phase 2)
6
+ *
7
+ * Search modes:
8
+ * 1. symbol: Find function/class/variable/type/interface definitions by name
9
+ * 2. reference: Find usages of a specific symbol
10
+ * 3. definition: Find where a symbol is defined
11
+ *
12
+ * Supports: TypeScript, JavaScript, Python
13
+ * Excludes: node_modules, dist, .git, build, coverage, __pycache__
14
+ *
15
+ * riskLevel: 'low' (read-only)
16
+ */
17
+ import { readFile } from 'node:fs/promises';
18
+ import { relative } from 'node:path';
19
+ import fg from 'fast-glob';
20
+ import { BaseTool } from './base-tool.js';
21
+ const MAX_RESULTS = 50;
22
+ const MAX_FILE_SIZE = 512_000; // 512KB — skip huge files
23
+ const SNIPPET_CONTEXT_LINES = 3;
24
+ /** Language-specific definition patterns. */
25
+ const DEFINITION_PATTERNS = {
26
+ typescript: (name) => [
27
+ new RegExp(`(?:export\\s+)?(?:async\\s+)?function\\s+${escapeRegex(name)}\\s*[(<]`, 'gm'),
28
+ new RegExp(`(?:export\\s+)?class\\s+${escapeRegex(name)}\\s*[{<]`, 'gm'),
29
+ new RegExp(`(?:export\\s+)?interface\\s+${escapeRegex(name)}\\s*[{<]`, 'gm'),
30
+ new RegExp(`(?:export\\s+)?type\\s+${escapeRegex(name)}\\s*[=<]`, 'gm'),
31
+ new RegExp(`(?:export\\s+)?(?:const|let|var)\\s+${escapeRegex(name)}\\s*[=:]`, 'gm'),
32
+ new RegExp(`(?:export\\s+)?enum\\s+${escapeRegex(name)}\\s*\\{`, 'gm'),
33
+ // Method definitions
34
+ new RegExp(`^\\s*(?:async\\s+)?${escapeRegex(name)}\\s*\\(`, 'gm'),
35
+ ],
36
+ javascript: (name) => [
37
+ new RegExp(`(?:export\\s+)?(?:async\\s+)?function\\s+${escapeRegex(name)}\\s*[(<]`, 'gm'),
38
+ new RegExp(`(?:export\\s+)?class\\s+${escapeRegex(name)}\\s*[{<]`, 'gm'),
39
+ new RegExp(`(?:export\\s+)?(?:const|let|var)\\s+${escapeRegex(name)}\\s*[=:]`, 'gm'),
40
+ new RegExp(`^\\s*(?:async\\s+)?${escapeRegex(name)}\\s*\\(`, 'gm'),
41
+ ],
42
+ python: (name) => [
43
+ new RegExp(`^\\s*def\\s+${escapeRegex(name)}\\s*\\(`, 'gm'),
44
+ new RegExp(`^\\s*class\\s+${escapeRegex(name)}\\s*[:(]`, 'gm'),
45
+ new RegExp(`^${escapeRegex(name)}\\s*=`, 'gm'),
46
+ ],
47
+ };
48
+ /** Map file extensions to language keys. */
49
+ const EXT_TO_LANG = {
50
+ '.ts': 'typescript', '.tsx': 'typescript',
51
+ '.js': 'javascript', '.jsx': 'javascript', '.mjs': 'javascript', '.cjs': 'javascript',
52
+ '.py': 'python',
53
+ };
54
+ /** File globs per language. */
55
+ const LANG_GLOBS = {
56
+ typescript: ['**/*.ts', '**/*.tsx'],
57
+ javascript: ['**/*.js', '**/*.jsx', '**/*.mjs', '**/*.cjs'],
58
+ python: ['**/*.py'],
59
+ };
60
+ const IGNORE_DIRS = [
61
+ '**/node_modules/**', '**/dist/**', '**/.git/**', '**/build/**',
62
+ '**/coverage/**', '**/__pycache__/**', '**/.next/**', '**/.nuxt/**',
63
+ '**/vendor/**', '**/.venv/**', '**/venv/**',
64
+ ];
65
+ export class CodeSearchTool extends BaseTool {
66
+ name = 'code_search';
67
+ description = 'Search for code symbols (functions, classes, types, variables) by name. ' +
68
+ 'Modes: symbol (definitions), reference (usages), definition (where defined). ' +
69
+ 'Supports TypeScript, JavaScript, Python.';
70
+ riskLevel = 'low';
71
+ parameters = {
72
+ query: {
73
+ type: 'string',
74
+ description: 'Symbol name or pattern to search for',
75
+ required: true,
76
+ },
77
+ mode: {
78
+ type: 'string',
79
+ description: 'Search mode: symbol (find definitions), reference (find usages), definition (find where defined)',
80
+ required: false,
81
+ enum: ['symbol', 'reference', 'definition'],
82
+ default: 'symbol',
83
+ },
84
+ path: {
85
+ type: 'string',
86
+ description: 'Search scope directory (relative to project root, default: entire project)',
87
+ required: false,
88
+ },
89
+ language: {
90
+ type: 'string',
91
+ description: 'Language filter: typescript, javascript, python (default: all supported)',
92
+ required: false,
93
+ enum: ['typescript', 'javascript', 'python'],
94
+ },
95
+ maxResults: {
96
+ type: 'number',
97
+ description: 'Maximum results to return (default: 20)',
98
+ required: false,
99
+ default: 20,
100
+ },
101
+ };
102
+ async execute(args, workDir) {
103
+ const toolCallId = args._toolCallId ?? '';
104
+ const query = args.query;
105
+ const mode = args.mode ?? 'symbol';
106
+ const searchPath = args.path;
107
+ const language = args.language;
108
+ const maxResults = Math.min(args.maxResults ?? 20, MAX_RESULTS);
109
+ if (!query) {
110
+ return this.fail(toolCallId, 'Missing required parameter: query');
111
+ }
112
+ // Validate path if provided
113
+ let searchDir = workDir;
114
+ if (searchPath) {
115
+ try {
116
+ searchDir = this.validatePath(searchPath, workDir);
117
+ }
118
+ catch (err) {
119
+ return this.fail(toolCallId, err.message);
120
+ }
121
+ }
122
+ try {
123
+ // Collect file globs
124
+ let globs;
125
+ if (language && LANG_GLOBS[language]) {
126
+ globs = LANG_GLOBS[language];
127
+ }
128
+ else {
129
+ globs = Object.values(LANG_GLOBS).flat();
130
+ }
131
+ // Find files
132
+ const files = await fg(globs, {
133
+ cwd: searchDir,
134
+ ignore: IGNORE_DIRS,
135
+ absolute: true,
136
+ onlyFiles: true,
137
+ followSymbolicLinks: false,
138
+ });
139
+ // Search files
140
+ const results = [];
141
+ for (const filePath of files) {
142
+ if (results.length >= maxResults)
143
+ break;
144
+ try {
145
+ const content = await readFile(filePath, 'utf-8');
146
+ if (content.length > MAX_FILE_SIZE)
147
+ continue;
148
+ const relPath = relative(workDir, filePath);
149
+ const ext = filePath.match(/\.[^.]+$/)?.[0] ?? '';
150
+ const lang = EXT_TO_LANG[ext];
151
+ if (!lang)
152
+ continue;
153
+ const fileResults = this.searchFile(content, relPath, lang, query, mode);
154
+ for (const r of fileResults) {
155
+ if (results.length >= maxResults)
156
+ break;
157
+ results.push(r);
158
+ }
159
+ }
160
+ catch {
161
+ // Skip unreadable files
162
+ }
163
+ }
164
+ // Format output
165
+ const output = this.formatResults(results, query, mode);
166
+ return this.ok(toolCallId, output);
167
+ }
168
+ catch (err) {
169
+ return this.fail(toolCallId, `Code search failed: ${err.message}`);
170
+ }
171
+ }
172
+ /**
173
+ * Search a single file for matching symbols.
174
+ */
175
+ searchFile(content, relPath, lang, query, mode) {
176
+ const lines = content.split('\n');
177
+ const results = [];
178
+ if (mode === 'symbol' || mode === 'definition') {
179
+ // Find definitions of the symbol
180
+ const patterns = DEFINITION_PATTERNS[lang]?.(query) ?? DEFINITION_PATTERNS.typescript(query);
181
+ for (const pattern of patterns) {
182
+ pattern.lastIndex = 0;
183
+ let match;
184
+ while ((match = pattern.exec(content)) !== null) {
185
+ const lineNumber = content.slice(0, match.index).split('\n').length;
186
+ const lineContent = lines[lineNumber - 1]?.trim() ?? '';
187
+ const kind = this.inferKind(lineContent, lang);
188
+ const column = match.index - content.lastIndexOf('\n', match.index - 1);
189
+ results.push({
190
+ file: relPath,
191
+ line: lineNumber,
192
+ column,
193
+ content: this.getSnippet(lines, lineNumber),
194
+ kind,
195
+ });
196
+ }
197
+ }
198
+ }
199
+ else if (mode === 'reference') {
200
+ // Find all usages of the symbol (excluding definitions for cleaner results)
201
+ const refPattern = new RegExp(`\\b${escapeRegex(query)}\\b`, 'g');
202
+ const defPatterns = DEFINITION_PATTERNS[lang]?.(query) ?? DEFINITION_PATTERNS.typescript(query);
203
+ // Collect definition line numbers to exclude
204
+ const defLines = new Set();
205
+ for (const dp of defPatterns) {
206
+ dp.lastIndex = 0;
207
+ let m;
208
+ while ((m = dp.exec(content)) !== null) {
209
+ const ln = content.slice(0, m.index).split('\n').length;
210
+ defLines.add(ln);
211
+ }
212
+ }
213
+ let match;
214
+ while ((match = refPattern.exec(content)) !== null) {
215
+ const lineNumber = content.slice(0, match.index).split('\n').length;
216
+ if (defLines.has(lineNumber))
217
+ continue; // Skip definition lines
218
+ const lineContent = lines[lineNumber - 1]?.trim() ?? '';
219
+ const column = match.index - content.lastIndexOf('\n', match.index - 1);
220
+ results.push({
221
+ file: relPath,
222
+ line: lineNumber,
223
+ column,
224
+ content: lineContent,
225
+ kind: 'reference',
226
+ });
227
+ }
228
+ }
229
+ return results;
230
+ }
231
+ /**
232
+ * Infer the kind of symbol from the line content.
233
+ */
234
+ inferKind(line, lang) {
235
+ if (lang === 'python') {
236
+ if (/^\s*def\s/.test(line))
237
+ return 'function';
238
+ if (/^\s*class\s/.test(line))
239
+ return 'class';
240
+ return 'variable';
241
+ }
242
+ // TypeScript / JavaScript
243
+ if (/\bfunction\b/.test(line))
244
+ return 'function';
245
+ if (/\bclass\b/.test(line))
246
+ return 'class';
247
+ if (/\binterface\b/.test(line))
248
+ return 'interface';
249
+ if (/\btype\b/.test(line))
250
+ return 'type';
251
+ if (/\benum\b/.test(line))
252
+ return 'enum';
253
+ if (/\bconst\b|\blet\b|\bvar\b/.test(line))
254
+ return 'variable';
255
+ if (/\basync\b/.test(line))
256
+ return 'function';
257
+ return 'symbol';
258
+ }
259
+ /**
260
+ * Get a snippet with context lines around a match.
261
+ */
262
+ getSnippet(lines, lineNumber) {
263
+ const start = Math.max(0, lineNumber - 1 - SNIPPET_CONTEXT_LINES);
264
+ const end = Math.min(lines.length, lineNumber + SNIPPET_CONTEXT_LINES);
265
+ return lines
266
+ .slice(start, end)
267
+ .map((l, i) => {
268
+ const ln = start + i + 1;
269
+ const marker = ln === lineNumber ? '>' : ' ';
270
+ return `${marker} ${ln}: ${l}`;
271
+ })
272
+ .join('\n');
273
+ }
274
+ /**
275
+ * Format results for output.
276
+ */
277
+ formatResults(results, query, mode) {
278
+ if (results.length === 0) {
279
+ return `No results found for "${query}" (mode: ${mode})`;
280
+ }
281
+ const lines = [];
282
+ lines.push(`[Code Search: "${query}" — mode: ${mode}]`);
283
+ lines.push(`Found ${results.length} result(s)\n`);
284
+ for (const r of results) {
285
+ lines.push(`--- ${r.file}:${r.line} [${r.kind}] ---`);
286
+ lines.push(r.content);
287
+ lines.push('');
288
+ }
289
+ return lines.join('\n');
290
+ }
291
+ }
292
+ /**
293
+ * Escape special regex characters in a string.
294
+ */
295
+ function escapeRegex(str) {
296
+ return str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
297
+ }
298
+ //# sourceMappingURL=code-search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"code-search.js","sourceRoot":"","sources":["../src/code-search.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,70 @@
1
+ /**
2
+ * @yuaone/tools — Design Mode Tools
3
+ *
4
+ * 6 design-specific tools that wrap BrowserTool for visual design iteration:
5
+ * - design_snapshot: Get DOM accessibility tree
6
+ * - design_screenshot: Capture page screenshot
7
+ * - design_navigate: Navigate to URL/route
8
+ * - design_resize: Change viewport size (presets or custom)
9
+ * - design_inspect: Get computed CSS styles for an element
10
+ * - design_scroll: Scroll to element or position
11
+ *
12
+ * These tools share a single browser session managed via
13
+ * setDesignBrowserSession() / clearDesignBrowserSession().
14
+ */
15
+ import type { ParameterDef, RiskLevel } from './types.js';
16
+ import type { ToolResult } from '@yuaone/core';
17
+ import { BaseTool } from './base-tool.js';
18
+ import { BrowserTool } from './browser-tool.js';
19
+ /**
20
+ * Set the shared browser session used by all design tools.
21
+ * Call this after opening a browser via BrowserTool's "open" action.
22
+ */
23
+ export declare function setDesignBrowserSession(sessionId: string, browserTool: BrowserTool): void;
24
+ /** Clear the shared browser session. */
25
+ export declare function clearDesignBrowserSession(): void;
26
+ export declare class DesignSnapshotTool extends BaseTool {
27
+ readonly name = "design_snapshot";
28
+ readonly description: string;
29
+ readonly riskLevel: RiskLevel;
30
+ readonly parameters: Record<string, ParameterDef>;
31
+ execute(args: Record<string, unknown>, workDir: string, _abortSignal?: AbortSignal): Promise<ToolResult>;
32
+ }
33
+ export declare class DesignScreenshotTool extends BaseTool {
34
+ readonly name = "design_screenshot";
35
+ readonly description: string;
36
+ readonly riskLevel: RiskLevel;
37
+ readonly parameters: Record<string, ParameterDef>;
38
+ execute(args: Record<string, unknown>, workDir: string, _abortSignal?: AbortSignal): Promise<ToolResult>;
39
+ }
40
+ export declare class DesignNavigateTool extends BaseTool {
41
+ readonly name = "design_navigate";
42
+ readonly description: string;
43
+ readonly riskLevel: RiskLevel;
44
+ readonly parameters: Record<string, ParameterDef>;
45
+ execute(args: Record<string, unknown>, workDir: string, _abortSignal?: AbortSignal): Promise<ToolResult>;
46
+ }
47
+ export declare class DesignResizeTool extends BaseTool {
48
+ readonly name = "design_resize";
49
+ readonly description: string;
50
+ readonly riskLevel: RiskLevel;
51
+ readonly parameters: Record<string, ParameterDef>;
52
+ execute(args: Record<string, unknown>, workDir: string, _abortSignal?: AbortSignal): Promise<ToolResult>;
53
+ }
54
+ export declare class DesignInspectTool extends BaseTool {
55
+ readonly name = "design_inspect";
56
+ readonly description: string;
57
+ readonly riskLevel: RiskLevel;
58
+ readonly parameters: Record<string, ParameterDef>;
59
+ execute(args: Record<string, unknown>, workDir: string, _abortSignal?: AbortSignal): Promise<ToolResult>;
60
+ }
61
+ export declare class DesignScrollTool extends BaseTool {
62
+ readonly name = "design_scroll";
63
+ readonly description: string;
64
+ readonly riskLevel: RiskLevel;
65
+ readonly parameters: Record<string, ParameterDef>;
66
+ execute(args: Record<string, unknown>, workDir: string, _abortSignal?: AbortSignal): Promise<ToolResult>;
67
+ }
68
+ /** Create instances of all 6 design tools. */
69
+ export declare function createDesignTools(): BaseTool[];
70
+ //# sourceMappingURL=design-tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"design-tools.d.ts","sourceRoot":"","sources":["../src/design-tools.ts"],"names":[],"mappings":"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"}