deepseek-coder-cli 1.0.10 → 1.0.12

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,500 @@
1
+ /**
2
+ * UNIFIED CODING CAPABILITY
3
+ *
4
+ * A lean, consolidated capability module that provides all essential
5
+ * tools for an AI coding assistant in a single, coherent interface.
6
+ *
7
+ * Consolidates: Filesystem, Edit, Bash, Search, Git, Web
8
+ */
9
+ import * as fs from 'fs';
10
+ import * as path from 'path';
11
+ import { execSync } from 'child_process';
12
+ // ============================================================================
13
+ // SCHEMA HELPERS
14
+ // ============================================================================
15
+ function stringProp(description, enumValues) {
16
+ const prop = {
17
+ type: 'string',
18
+ description,
19
+ };
20
+ if (enumValues) {
21
+ return { ...prop, enum: enumValues };
22
+ }
23
+ return prop;
24
+ }
25
+ function objectSchema(properties, required) {
26
+ return {
27
+ type: 'object',
28
+ properties,
29
+ required,
30
+ };
31
+ }
32
+ // ============================================================================
33
+ // UNIFIED CODING CAPABILITY MODULE
34
+ // ============================================================================
35
+ export class UnifiedCodingCapabilityModule {
36
+ id = 'unified-coding';
37
+ options;
38
+ constructor(options = {}) {
39
+ this.options = {
40
+ workingDir: options.workingDir ?? process.cwd(),
41
+ enableGit: options.enableGit ?? true,
42
+ enableWeb: options.enableWeb ?? true,
43
+ enableBash: options.enableBash ?? true,
44
+ maxFileSize: options.maxFileSize ?? 10 * 1024 * 1024, // 10MB
45
+ timeout: options.timeout ?? 30000, // 30s
46
+ };
47
+ }
48
+ async create(_context) {
49
+ return {
50
+ id: this.id,
51
+ description: 'Unified coding assistant tools',
52
+ toolSuite: this.buildToolSuite(),
53
+ };
54
+ }
55
+ buildToolSuite() {
56
+ const tools = [];
57
+ // === FILESYSTEM TOOLS ===
58
+ tools.push(this.createReadFileTool());
59
+ tools.push(this.createWriteFileTool());
60
+ tools.push(this.createListFilesTool());
61
+ tools.push(this.createFileExistsTool());
62
+ // === EDIT TOOLS ===
63
+ tools.push(this.createEditFileTool());
64
+ tools.push(this.createSearchReplaceTool());
65
+ // === SEARCH TOOLS ===
66
+ tools.push(this.createGrepTool());
67
+ tools.push(this.createGlobTool());
68
+ // === BASH TOOLS ===
69
+ if (this.options.enableBash) {
70
+ tools.push(this.createBashTool());
71
+ }
72
+ // === GIT TOOLS ===
73
+ if (this.options.enableGit) {
74
+ tools.push(this.createGitTool());
75
+ }
76
+ // === WEB TOOLS ===
77
+ if (this.options.enableWeb) {
78
+ tools.push(this.createWebFetchTool());
79
+ }
80
+ return {
81
+ id: 'unified-coding-tools',
82
+ description: 'Unified coding assistant tools for file operations, editing, search, and execution',
83
+ tools,
84
+ };
85
+ }
86
+ // ============================================================================
87
+ // FILESYSTEM TOOLS
88
+ // ============================================================================
89
+ createReadFileTool() {
90
+ return {
91
+ name: 'read_file',
92
+ description: 'Read the contents of a file. Returns the file content as a string.',
93
+ parameters: objectSchema({
94
+ path: stringProp('Absolute or relative path to the file'),
95
+ encoding: stringProp('File encoding (default: utf-8)'),
96
+ }, ['path']),
97
+ handler: async (args) => {
98
+ try {
99
+ const filePath = this.resolvePath(args.path);
100
+ const stat = fs.statSync(filePath);
101
+ if (stat.size > this.options.maxFileSize) {
102
+ return `Error: File too large (${stat.size} bytes). Max: ${this.options.maxFileSize} bytes`;
103
+ }
104
+ const content = fs.readFileSync(filePath, { encoding: args.encoding ?? 'utf-8' });
105
+ return content;
106
+ }
107
+ catch (error) {
108
+ return `Error reading file: ${error.message}`;
109
+ }
110
+ },
111
+ };
112
+ }
113
+ createWriteFileTool() {
114
+ return {
115
+ name: 'write_file',
116
+ description: 'Write content to a file. Creates the file if it does not exist.',
117
+ parameters: objectSchema({
118
+ path: stringProp('Absolute or relative path to the file'),
119
+ content: stringProp('Content to write to the file'),
120
+ createDirs: stringProp('Create parent directories if they do not exist (default: true)'),
121
+ }, ['path', 'content']),
122
+ handler: async (args) => {
123
+ try {
124
+ const filePath = this.resolvePath(args.path);
125
+ if (args.createDirs !== 'false') {
126
+ const dir = path.dirname(filePath);
127
+ if (!fs.existsSync(dir)) {
128
+ fs.mkdirSync(dir, { recursive: true });
129
+ }
130
+ }
131
+ fs.writeFileSync(filePath, args.content, 'utf-8');
132
+ return `Successfully wrote ${args.content.length} characters to ${filePath}`;
133
+ }
134
+ catch (error) {
135
+ return `Error writing file: ${error.message}`;
136
+ }
137
+ },
138
+ };
139
+ }
140
+ createListFilesTool() {
141
+ return {
142
+ name: 'list_files',
143
+ description: 'List files in a directory. Optionally filter by pattern and recurse into subdirectories.',
144
+ parameters: objectSchema({
145
+ path: stringProp('Directory path to list'),
146
+ recursive: stringProp('Recurse into subdirectories (default: false)'),
147
+ pattern: stringProp('Glob pattern to filter files (e.g., "*.ts")'),
148
+ }, ['path']),
149
+ handler: async (args) => {
150
+ try {
151
+ const dirPath = this.resolvePath(args.path);
152
+ const files = this.listDirectory(dirPath, args.recursive === 'true', args.pattern);
153
+ return files.join('\n');
154
+ }
155
+ catch (error) {
156
+ return `Error listing files: ${error.message}`;
157
+ }
158
+ },
159
+ };
160
+ }
161
+ createFileExistsTool() {
162
+ return {
163
+ name: 'file_exists',
164
+ description: 'Check if a file or directory exists.',
165
+ parameters: objectSchema({
166
+ path: stringProp('Path to check'),
167
+ }, ['path']),
168
+ handler: async (args) => {
169
+ const filePath = this.resolvePath(args.path);
170
+ const exists = fs.existsSync(filePath);
171
+ if (exists) {
172
+ const stat = fs.statSync(filePath);
173
+ return `Exists: ${stat.isDirectory() ? 'directory' : 'file'}`;
174
+ }
175
+ return 'Does not exist';
176
+ },
177
+ };
178
+ }
179
+ // ============================================================================
180
+ // EDIT TOOLS
181
+ // ============================================================================
182
+ createEditFileTool() {
183
+ return {
184
+ name: 'edit_file',
185
+ description: 'Edit a file by replacing specific text. The oldText must match exactly.',
186
+ parameters: objectSchema({
187
+ path: stringProp('Path to the file to edit'),
188
+ oldText: stringProp('Exact text to find and replace'),
189
+ newText: stringProp('Text to replace with'),
190
+ }, ['path', 'oldText', 'newText']),
191
+ handler: async (args) => {
192
+ try {
193
+ const filePath = this.resolvePath(args.path);
194
+ const content = fs.readFileSync(filePath, 'utf-8');
195
+ if (!content.includes(args.oldText)) {
196
+ return `Error: Could not find the specified text in ${filePath}`;
197
+ }
198
+ const newContent = content.replace(args.oldText, args.newText);
199
+ fs.writeFileSync(filePath, newContent, 'utf-8');
200
+ return `Successfully edited ${filePath}`;
201
+ }
202
+ catch (error) {
203
+ return `Error editing file: ${error.message}`;
204
+ }
205
+ },
206
+ };
207
+ }
208
+ createSearchReplaceTool() {
209
+ return {
210
+ name: 'search_replace',
211
+ description: 'Search and replace text in a file. Supports regex patterns.',
212
+ parameters: objectSchema({
213
+ path: stringProp('Path to the file'),
214
+ search: stringProp('Text or regex pattern to search for'),
215
+ replace: stringProp('Replacement text'),
216
+ regex: stringProp('Treat search as regex (default: false)'),
217
+ global: stringProp('Replace all occurrences (default: true)'),
218
+ }, ['path', 'search', 'replace']),
219
+ handler: async (args) => {
220
+ try {
221
+ const filePath = this.resolvePath(args.path);
222
+ const content = fs.readFileSync(filePath, 'utf-8');
223
+ let pattern;
224
+ if (args.regex === 'true') {
225
+ const flags = args.global !== 'false' ? 'g' : '';
226
+ pattern = new RegExp(args.search, flags);
227
+ }
228
+ else {
229
+ pattern = args.global !== 'false'
230
+ ? new RegExp(this.escapeRegex(args.search), 'g')
231
+ : args.search;
232
+ }
233
+ const newContent = content.replace(pattern, args.replace);
234
+ const matchCount = (content.match(pattern instanceof RegExp ? pattern : new RegExp(this.escapeRegex(args.search), 'g')) || []).length;
235
+ fs.writeFileSync(filePath, newContent, 'utf-8');
236
+ return `Replaced ${matchCount} occurrence(s) in ${filePath}`;
237
+ }
238
+ catch (error) {
239
+ return `Error in search/replace: ${error.message}`;
240
+ }
241
+ },
242
+ };
243
+ }
244
+ // ============================================================================
245
+ // SEARCH TOOLS
246
+ // ============================================================================
247
+ createGrepTool() {
248
+ return {
249
+ name: 'grep',
250
+ description: 'Search for a pattern in files. Returns matching lines with file names and line numbers.',
251
+ parameters: objectSchema({
252
+ pattern: stringProp('Regex pattern to search for'),
253
+ path: stringProp('Directory or file to search in (default: working directory)'),
254
+ filePattern: stringProp('Filter files by glob pattern (e.g., "*.ts")'),
255
+ contextLines: stringProp('Number of context lines around matches (default: 0)'),
256
+ }, ['pattern']),
257
+ handler: async (args) => {
258
+ try {
259
+ const searchPath = this.resolvePath(args.path ?? '.');
260
+ const results = [];
261
+ const files = fs.statSync(searchPath).isDirectory()
262
+ ? this.listDirectory(searchPath, true, args.filePattern)
263
+ : [searchPath];
264
+ // Use regex without 'g' flag for test() to avoid lastIndex issues
265
+ const regex = new RegExp(args.pattern, 'i');
266
+ const contextLines = parseInt(args.contextLines ?? '0', 10) || 0;
267
+ const matchedLineSet = new Set(); // Prevent duplicate context lines
268
+ for (const file of files.slice(0, 100)) { // Limit to 100 files
269
+ try {
270
+ // Skip binary files by checking for null bytes
271
+ const buffer = fs.readFileSync(file);
272
+ if (buffer.includes(0))
273
+ continue; // Binary file
274
+ const content = buffer.toString('utf-8');
275
+ // Skip very large files
276
+ if (content.length > 1024 * 1024)
277
+ continue; // > 1MB
278
+ const lines = content.split('\n');
279
+ const fileMatches = [];
280
+ // First pass: find all matching line numbers
281
+ for (let i = 0; i < lines.length; i++) {
282
+ if (regex.test(lines[i])) {
283
+ fileMatches.push(i);
284
+ }
285
+ }
286
+ // Second pass: output with context, avoiding duplicates
287
+ for (const matchIdx of fileMatches) {
288
+ const start = Math.max(0, matchIdx - contextLines);
289
+ const end = Math.min(lines.length - 1, matchIdx + contextLines);
290
+ for (let j = start; j <= end; j++) {
291
+ const lineKey = `${file}:${j}`;
292
+ if (!matchedLineSet.has(lineKey)) {
293
+ matchedLineSet.add(lineKey);
294
+ const prefix = j === matchIdx ? '>' : ' ';
295
+ results.push(`${file}:${j + 1}:${prefix} ${lines[j]}`);
296
+ }
297
+ }
298
+ if (contextLines > 0 && matchIdx < fileMatches[fileMatches.length - 1]) {
299
+ results.push('--');
300
+ }
301
+ }
302
+ }
303
+ catch {
304
+ // Skip unreadable files
305
+ }
306
+ // Stop if we have enough results
307
+ if (results.length > 500)
308
+ break;
309
+ }
310
+ return results.length > 0
311
+ ? results.slice(0, 500).join('\n')
312
+ : 'No matches found';
313
+ }
314
+ catch (error) {
315
+ return `Error in grep: ${error.message}`;
316
+ }
317
+ },
318
+ };
319
+ }
320
+ createGlobTool() {
321
+ return {
322
+ name: 'glob',
323
+ description: 'Find files matching a glob pattern.',
324
+ parameters: objectSchema({
325
+ pattern: stringProp('Glob pattern (e.g., "**/*.ts", "src/**/*.js")'),
326
+ path: stringProp('Base directory (default: working directory)'),
327
+ }, ['pattern']),
328
+ handler: async (args) => {
329
+ try {
330
+ const basePath = this.resolvePath(args.path ?? '.');
331
+ const files = this.listDirectory(basePath, true, args.pattern);
332
+ return files.length > 0
333
+ ? files.slice(0, 200).join('\n')
334
+ : 'No files found matching pattern';
335
+ }
336
+ catch (error) {
337
+ return `Error in glob: ${error.message}`;
338
+ }
339
+ },
340
+ };
341
+ }
342
+ // ============================================================================
343
+ // BASH TOOL
344
+ // ============================================================================
345
+ createBashTool() {
346
+ return {
347
+ name: 'bash',
348
+ description: 'Execute a bash command and return the output. Use for running builds, tests, git commands, etc.',
349
+ parameters: objectSchema({
350
+ command: stringProp('The command to execute'),
351
+ timeout: stringProp('Timeout in milliseconds (default: 30000)'),
352
+ cwd: stringProp('Working directory for the command'),
353
+ }, ['command']),
354
+ handler: async (args) => {
355
+ return new Promise((resolve) => {
356
+ try {
357
+ const timeout = parseInt(args.timeout ?? String(this.options.timeout), 10);
358
+ const cwd = args.cwd ? this.resolvePath(args.cwd) : this.options.workingDir;
359
+ const result = execSync(args.command, {
360
+ cwd,
361
+ timeout,
362
+ encoding: 'utf-8',
363
+ maxBuffer: 10 * 1024 * 1024,
364
+ stdio: ['pipe', 'pipe', 'pipe'],
365
+ });
366
+ resolve(result.trim() || '(no output)');
367
+ }
368
+ catch (error) {
369
+ const execError = error;
370
+ const stdout = execError.stdout ?? '';
371
+ const stderr = execError.stderr ?? '';
372
+ resolve(`Error: ${execError.message}\nStdout: ${stdout}\nStderr: ${stderr}`);
373
+ }
374
+ });
375
+ },
376
+ };
377
+ }
378
+ // ============================================================================
379
+ // GIT TOOL
380
+ // ============================================================================
381
+ createGitTool() {
382
+ return {
383
+ name: 'git',
384
+ description: 'Execute git operations. Supports: status, diff, log, add, commit, push, pull, branch, checkout, merge, stash',
385
+ parameters: objectSchema({
386
+ operation: stringProp('Git operation', ['status', 'diff', 'log', 'add', 'commit', 'push', 'pull', 'branch', 'checkout', 'merge', 'stash', 'reset', 'fetch']),
387
+ args: stringProp('Additional arguments for the git command'),
388
+ }, ['operation']),
389
+ handler: async (args) => {
390
+ try {
391
+ const command = `git ${args.operation}${args.args ? ' ' + args.args : ''}`;
392
+ const result = execSync(command, {
393
+ cwd: this.options.workingDir,
394
+ encoding: 'utf-8',
395
+ timeout: this.options.timeout,
396
+ });
397
+ return result.trim() || '(no output)';
398
+ }
399
+ catch (error) {
400
+ const execError = error;
401
+ return `Git error: ${execError.stderr || execError.message}`;
402
+ }
403
+ },
404
+ };
405
+ }
406
+ // ============================================================================
407
+ // WEB TOOL
408
+ // ============================================================================
409
+ createWebFetchTool() {
410
+ return {
411
+ name: 'web_fetch',
412
+ description: 'Fetch content from a URL. Useful for downloading documentation or API responses.',
413
+ parameters: objectSchema({
414
+ url: stringProp('URL to fetch'),
415
+ method: stringProp('HTTP method (default: GET)'),
416
+ headers: stringProp('JSON string of headers'),
417
+ }, ['url']),
418
+ handler: async (args) => {
419
+ try {
420
+ const headers = args.headers ? JSON.parse(args.headers) : {};
421
+ const response = await fetch(args.url, {
422
+ method: args.method ?? 'GET',
423
+ headers,
424
+ });
425
+ if (!response.ok) {
426
+ return `HTTP ${response.status}: ${response.statusText}`;
427
+ }
428
+ const contentType = response.headers.get('content-type') ?? '';
429
+ if (contentType.includes('application/json')) {
430
+ const json = await response.json();
431
+ return JSON.stringify(json, null, 2);
432
+ }
433
+ const text = await response.text();
434
+ return text.slice(0, 50000); // Limit response size
435
+ }
436
+ catch (error) {
437
+ return `Fetch error: ${error.message}`;
438
+ }
439
+ },
440
+ };
441
+ }
442
+ // ============================================================================
443
+ // UTILITY METHODS
444
+ // ============================================================================
445
+ resolvePath(inputPath) {
446
+ if (path.isAbsolute(inputPath)) {
447
+ return inputPath;
448
+ }
449
+ return path.resolve(this.options.workingDir, inputPath);
450
+ }
451
+ listDirectory(dir, recursive, pattern) {
452
+ const results = [];
453
+ const regex = pattern ? this.globToRegex(pattern) : null;
454
+ const walk = (currentDir) => {
455
+ try {
456
+ const entries = fs.readdirSync(currentDir, { withFileTypes: true });
457
+ for (const entry of entries) {
458
+ const fullPath = path.join(currentDir, entry.name);
459
+ // Skip hidden files and common ignore patterns
460
+ if (entry.name.startsWith('.') || entry.name === 'node_modules') {
461
+ continue;
462
+ }
463
+ if (entry.isDirectory()) {
464
+ if (recursive) {
465
+ walk(fullPath);
466
+ }
467
+ }
468
+ else {
469
+ if (!regex || regex.test(entry.name) || regex.test(fullPath)) {
470
+ results.push(fullPath);
471
+ }
472
+ }
473
+ }
474
+ }
475
+ catch {
476
+ // Skip unreadable directories
477
+ }
478
+ };
479
+ walk(dir);
480
+ return results;
481
+ }
482
+ globToRegex(pattern) {
483
+ const escaped = pattern
484
+ .replace(/[.+^${}()|[\]\\]/g, '\\$&')
485
+ .replace(/\*/g, '.*')
486
+ .replace(/\?/g, '.');
487
+ return new RegExp(escaped, 'i');
488
+ }
489
+ escapeRegex(str) {
490
+ return str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
491
+ }
492
+ }
493
+ // ============================================================================
494
+ // FACTORY & CONVENIENCE EXPORTS
495
+ // ============================================================================
496
+ export function createUnifiedCodingCapability(options) {
497
+ return new UnifiedCodingCapabilityModule(options);
498
+ }
499
+ export default UnifiedCodingCapabilityModule;
500
+ //# sourceMappingURL=unifiedCodingCapability.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"unifiedCodingCapability.js","sourceRoot":"","sources":["../../src/capabilities/unifiedCodingCapability.ts"],"names":[],"mappings":"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"}
@@ -2307,6 +2307,7 @@ Any text response is a failure. Only tool calls are accepted.`;
2307
2307
  if (lower === '/key' || lower.startsWith('/key ')) {
2308
2308
  const parts = trimmed.split(/\s+/);
2309
2309
  const keyValue = parts[1];
2310
+ const renderer = this.promptController?.getRenderer();
2310
2311
  if (keyValue) {
2311
2312
  // Direct file write - most reliable method
2312
2313
  try {
@@ -2323,16 +2324,17 @@ Any text response is a failure. Only tool calls are accepted.`;
2323
2324
  writeFileSync(secretFile, JSON.stringify(existing, null, 2) + '\n');
2324
2325
  // Also set in process.env for immediate use
2325
2326
  process.env['DEEPSEEK_API_KEY'] = keyValue;
2326
- stdout.write(chalk.green('\n✓ DEEPSEEK_API_KEY saved\n\n'));
2327
+ // Show confirmation via renderer
2328
+ renderer?.addEvent('response', chalk.green('✓ DEEPSEEK_API_KEY saved\n'));
2327
2329
  }
2328
2330
  catch (error) {
2329
2331
  const msg = error instanceof Error ? error.message : String(error);
2330
- stdout.write(chalk.red(`\n✗ Failed: ${msg}\n\n`));
2332
+ renderer?.addEvent('response', chalk.red(`✗ Failed: ${msg}\n`));
2331
2333
  }
2332
2334
  }
2333
2335
  else {
2334
- // Interactive mode: /key (prompts for input)
2335
- void this.startSecretInput('DEEPSEEK_API_KEY');
2336
+ // Show usage hint
2337
+ renderer?.addEvent('response', chalk.yellow('Usage: /key YOUR_API_KEY\n'));
2336
2338
  }
2337
2339
  return true;
2338
2340
  }