didev 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 (112) hide show
  1. package/README.md +378 -0
  2. package/dist/agents/analyst.d.ts +21 -0
  3. package/dist/agents/analyst.d.ts.map +1 -0
  4. package/dist/agents/analyst.js +69 -0
  5. package/dist/agents/analyst.js.map +1 -0
  6. package/dist/agents/architect.d.ts +21 -0
  7. package/dist/agents/architect.d.ts.map +1 -0
  8. package/dist/agents/architect.js +85 -0
  9. package/dist/agents/architect.js.map +1 -0
  10. package/dist/agents/base-agent.d.ts +56 -0
  11. package/dist/agents/base-agent.d.ts.map +1 -0
  12. package/dist/agents/base-agent.js +263 -0
  13. package/dist/agents/base-agent.js.map +1 -0
  14. package/dist/agents/developer.d.ts +21 -0
  15. package/dist/agents/developer.d.ts.map +1 -0
  16. package/dist/agents/developer.js +87 -0
  17. package/dist/agents/developer.js.map +1 -0
  18. package/dist/agents/orchestrator.d.ts +23 -0
  19. package/dist/agents/orchestrator.d.ts.map +1 -0
  20. package/dist/agents/orchestrator.js +287 -0
  21. package/dist/agents/orchestrator.js.map +1 -0
  22. package/dist/agents/reviewer.d.ts +15 -0
  23. package/dist/agents/reviewer.d.ts.map +1 -0
  24. package/dist/agents/reviewer.js +65 -0
  25. package/dist/agents/reviewer.js.map +1 -0
  26. package/dist/agents/tester.d.ts +15 -0
  27. package/dist/agents/tester.d.ts.map +1 -0
  28. package/dist/agents/tester.js +64 -0
  29. package/dist/agents/tester.js.map +1 -0
  30. package/dist/bmad/method.d.ts +6 -0
  31. package/dist/bmad/method.d.ts.map +1 -0
  32. package/dist/bmad/method.js +221 -0
  33. package/dist/bmad/method.js.map +1 -0
  34. package/dist/cli/commands/agent.d.ts +10 -0
  35. package/dist/cli/commands/agent.d.ts.map +1 -0
  36. package/dist/cli/commands/agent.js +28 -0
  37. package/dist/cli/commands/agent.js.map +1 -0
  38. package/dist/cli/commands/chat.d.ts +6 -0
  39. package/dist/cli/commands/chat.d.ts.map +1 -0
  40. package/dist/cli/commands/chat.js +556 -0
  41. package/dist/cli/commands/chat.js.map +1 -0
  42. package/dist/cli/commands/config.d.ts +3 -0
  43. package/dist/cli/commands/config.d.ts.map +1 -0
  44. package/dist/cli/commands/config.js +65 -0
  45. package/dist/cli/commands/config.js.map +1 -0
  46. package/dist/cli/commands/init.d.ts +8 -0
  47. package/dist/cli/commands/init.d.ts.map +1 -0
  48. package/dist/cli/commands/init.js +204 -0
  49. package/dist/cli/commands/init.js.map +1 -0
  50. package/dist/cli/commands/mcp.d.ts +5 -0
  51. package/dist/cli/commands/mcp.d.ts.map +1 -0
  52. package/dist/cli/commands/mcp.js +836 -0
  53. package/dist/cli/commands/mcp.js.map +1 -0
  54. package/dist/cli/commands/refactor.d.ts +8 -0
  55. package/dist/cli/commands/refactor.d.ts.map +1 -0
  56. package/dist/cli/commands/refactor.js +161 -0
  57. package/dist/cli/commands/refactor.js.map +1 -0
  58. package/dist/cli/commands/review.d.ts +9 -0
  59. package/dist/cli/commands/review.d.ts.map +1 -0
  60. package/dist/cli/commands/review.js +138 -0
  61. package/dist/cli/commands/review.js.map +1 -0
  62. package/dist/core/api.d.ts +73 -0
  63. package/dist/core/api.d.ts.map +1 -0
  64. package/dist/core/api.js +206 -0
  65. package/dist/core/api.js.map +1 -0
  66. package/dist/core/config.d.ts +42 -0
  67. package/dist/core/config.d.ts.map +1 -0
  68. package/dist/core/config.js +180 -0
  69. package/dist/core/config.js.map +1 -0
  70. package/dist/core/context.d.ts +33 -0
  71. package/dist/core/context.d.ts.map +1 -0
  72. package/dist/core/context.js +235 -0
  73. package/dist/core/context.js.map +1 -0
  74. package/dist/core/file-manager.d.ts +20 -0
  75. package/dist/core/file-manager.d.ts.map +1 -0
  76. package/dist/core/file-manager.js +133 -0
  77. package/dist/core/file-manager.js.map +1 -0
  78. package/dist/core/mcp.d.ts +31 -0
  79. package/dist/core/mcp.d.ts.map +1 -0
  80. package/dist/core/mcp.js +112 -0
  81. package/dist/core/mcp.js.map +1 -0
  82. package/dist/core/session.d.ts +16 -0
  83. package/dist/core/session.d.ts.map +1 -0
  84. package/dist/core/session.js +60 -0
  85. package/dist/core/session.js.map +1 -0
  86. package/dist/index.d.ts +3 -0
  87. package/dist/index.d.ts.map +1 -0
  88. package/dist/index.js +237 -0
  89. package/dist/index.js.map +1 -0
  90. package/dist/utils/banner.d.ts +2 -0
  91. package/dist/utils/banner.d.ts.map +1 -0
  92. package/dist/utils/banner.js +50 -0
  93. package/dist/utils/banner.js.map +1 -0
  94. package/dist/utils/git.d.ts +9 -0
  95. package/dist/utils/git.d.ts.map +1 -0
  96. package/dist/utils/git.js +49 -0
  97. package/dist/utils/git.js.map +1 -0
  98. package/dist/utils/logger.d.ts +42 -0
  99. package/dist/utils/logger.d.ts.map +1 -0
  100. package/dist/utils/logger.js +98 -0
  101. package/dist/utils/logger.js.map +1 -0
  102. package/dist/utils/resilience.d.ts +17 -0
  103. package/dist/utils/resilience.d.ts.map +1 -0
  104. package/dist/utils/resilience.js +41 -0
  105. package/dist/utils/resilience.js.map +1 -0
  106. package/dist/utils/token-counter.d.ts +7 -0
  107. package/dist/utils/token-counter.d.ts.map +1 -0
  108. package/dist/utils/token-counter.js +20 -0
  109. package/dist/utils/token-counter.js.map +1 -0
  110. package/package.json +62 -0
  111. package/scripts/postinstall.mjs +54 -0
  112. package/scripts/setup-path.sh +42 -0
@@ -0,0 +1,556 @@
1
+ import * as readline from 'readline';
2
+ import chalk from 'chalk';
3
+ import { logger } from '../../utils/logger.js';
4
+ import { loadConfig, getApiKey, setConfigValue } from '../../core/config.js';
5
+ import { initClient } from '../../core/api.js';
6
+ import { collectProjectContext, contextToSystemPrompt } from '../../core/context.js';
7
+ import { createSession, saveSession, loadSession, listSessions } from '../../core/session.js';
8
+ import { readProjectFile, writeProjectFile, renderDiff } from '../../core/file-manager.js';
9
+ import { getDiff } from '../../utils/git.js';
10
+ import { initMcp } from '../../core/mcp.js';
11
+ import { glob } from 'glob';
12
+ import { readFile } from 'fs/promises';
13
+ import { join } from 'path';
14
+ import inquirer from 'inquirer';
15
+ const TOOLS = [
16
+ {
17
+ type: 'function',
18
+ function: {
19
+ name: 'read_file',
20
+ description: 'Read the contents of a file in the project',
21
+ parameters: {
22
+ type: 'object',
23
+ properties: { path: { type: 'string', description: 'Relative path to the file' } },
24
+ required: ['path'],
25
+ },
26
+ },
27
+ },
28
+ {
29
+ type: 'function',
30
+ function: {
31
+ name: 'write_file',
32
+ description: 'Write or update a file in the project (requires user confirmation)',
33
+ parameters: {
34
+ type: 'object',
35
+ properties: {
36
+ path: { type: 'string', description: 'Relative path to the file' },
37
+ content: { type: 'string', description: 'File content' },
38
+ },
39
+ required: ['path', 'content'],
40
+ },
41
+ },
42
+ },
43
+ {
44
+ type: 'function',
45
+ function: {
46
+ name: 'list_files',
47
+ description: 'List files and directories',
48
+ parameters: {
49
+ type: 'object',
50
+ properties: {
51
+ path: { type: 'string', description: 'Directory path (default: ".")' },
52
+ pattern: { type: 'string', description: 'Glob pattern' },
53
+ },
54
+ required: [],
55
+ },
56
+ },
57
+ },
58
+ {
59
+ type: 'function',
60
+ function: {
61
+ name: 'search_code',
62
+ description: 'Search for text/pattern in project files',
63
+ parameters: {
64
+ type: 'object',
65
+ properties: {
66
+ query: { type: 'string', description: 'Search query' },
67
+ glob: { type: 'string', description: 'File pattern to search in' },
68
+ },
69
+ required: ['query'],
70
+ },
71
+ },
72
+ },
73
+ {
74
+ type: 'function',
75
+ function: {
76
+ name: 'git_diff',
77
+ description: 'Get git diff of changes',
78
+ parameters: {
79
+ type: 'object',
80
+ properties: { base: { type: 'string', description: 'Base branch (default: HEAD)' } },
81
+ required: [],
82
+ },
83
+ },
84
+ },
85
+ ];
86
+ async function executeToolCall(name, args, rootDir, pendingWrites) {
87
+ switch (name) {
88
+ case 'read_file': {
89
+ try {
90
+ const content = await readProjectFile(String(args['path']), rootDir);
91
+ return content.slice(0, 200_000);
92
+ }
93
+ catch (e) {
94
+ return `Error reading file: ${e.message}`;
95
+ }
96
+ }
97
+ case 'write_file': {
98
+ const path = String(args['path']);
99
+ const content = String(args['content']);
100
+ pendingWrites.set(path, content);
101
+ return `File ${path} queued for writing. Use /apply to confirm changes.`;
102
+ }
103
+ case 'list_files': {
104
+ const pattern = String(args['pattern'] ?? '**/*');
105
+ const dir = String(args['path'] ?? '.');
106
+ try {
107
+ const files = await glob(pattern === '**/*' ? `${dir}/**/*` : pattern, {
108
+ cwd: rootDir,
109
+ ignore: ['node_modules/**', 'dist/**', '.git/**'],
110
+ });
111
+ return files.slice(0, 100).join('\n') || 'No files found';
112
+ }
113
+ catch (e) {
114
+ return `Error: ${e.message}`;
115
+ }
116
+ }
117
+ case 'search_code': {
118
+ const query = String(args['query']);
119
+ const pattern = String(args['glob'] ?? '**/*.{ts,tsx,js,jsx,py,go}');
120
+ try {
121
+ const files = await glob(pattern, {
122
+ cwd: rootDir,
123
+ ignore: ['node_modules/**', 'dist/**', '.git/**'],
124
+ });
125
+ const results = [];
126
+ for (const f of files.slice(0, 50)) {
127
+ try {
128
+ const content = await readFile(join(rootDir, f), 'utf-8');
129
+ const lines = content.split('\n');
130
+ for (let i = 0; i < lines.length; i++) {
131
+ if (lines[i].includes(query)) {
132
+ results.push(`${f}:${i + 1}: ${lines[i].trim()}`);
133
+ }
134
+ }
135
+ }
136
+ catch { /* skip */ }
137
+ }
138
+ return results.slice(0, 50).join('\n') || 'No matches found';
139
+ }
140
+ catch (e) {
141
+ return `Error: ${e.message}`;
142
+ }
143
+ }
144
+ case 'git_diff': {
145
+ try {
146
+ const base = String(args['base'] ?? 'HEAD');
147
+ const diff = await getDiff(base, rootDir);
148
+ return diff.slice(0, 400_000) || 'No changes';
149
+ }
150
+ catch (e) {
151
+ return `Error: ${e.message}`;
152
+ }
153
+ }
154
+ default:
155
+ return `Unknown tool: ${name}`;
156
+ }
157
+ }
158
+ function printHeader(projectName, model, apiKey) {
159
+ const keyStatus = apiKey
160
+ ? chalk.green('● ') + chalk.gray(`${apiKey.slice(0, 6)}…${apiKey.slice(-4)}`)
161
+ : chalk.red('● key missing');
162
+ const line1 = chalk.bold.cyan('didev') + chalk.gray(' v1.0.0') +
163
+ chalk.gray(' · ') + chalk.white(projectName) +
164
+ chalk.gray(' · ') + chalk.yellow(model) +
165
+ chalk.gray(' · ') + keyStatus;
166
+ console.log('\n' + line1);
167
+ console.log(chalk.gray('─'.repeat(60)));
168
+ }
169
+ function printHelp() {
170
+ const cmds = [
171
+ ['/agent <task>', 'запустить agent pipeline (Analyst→Architect→Dev→Review)'],
172
+ ['/review', 'code review изменённых файлов'],
173
+ ['/refactor [hint]', 'AI-рефакторинг кода'],
174
+ ['/apply', 'применить отложенные изменения файлов'],
175
+ ['/files', 'показать файлы в контексте и ожидающие запись'],
176
+ ['/add <file>', 'добавить файл в контекст'],
177
+ ['/sessions', 'список сохранённых сессий'],
178
+ ['/save <name>', 'сохранить текущую сессию'],
179
+ ['/load <name>', 'загрузить сессию'],
180
+ ['/config [k=v]', 'показать конфиг или установить значение'],
181
+ ['/clear', 'очистить историю диалога'],
182
+ ['/help', 'показать эту справку'],
183
+ ['/exit', 'выход'],
184
+ ];
185
+ console.log('\n' + chalk.bold('Доступные команды:'));
186
+ for (const [cmd, desc] of cmds) {
187
+ console.log(' ' + chalk.cyan(cmd.padEnd(22)) + chalk.gray(desc));
188
+ }
189
+ console.log('');
190
+ console.log(chalk.gray(' Или просто пишите — и AI ответит.'));
191
+ console.log('');
192
+ }
193
+ async function applyPendingWrites(pendingWrites, rootDir) {
194
+ if (pendingWrites.size === 0) {
195
+ logger.info('Нет ожидающих изменений');
196
+ return;
197
+ }
198
+ console.log('');
199
+ console.log(chalk.bold(` Изменения (${pendingWrites.size} файл(ов)):`));
200
+ for (const [filePath, content] of pendingWrites) {
201
+ const original = await readProjectFile(filePath, rootDir).catch(() => '');
202
+ const isNew = !original;
203
+ const lines = content.split('\n').length;
204
+ if (isNew) {
205
+ console.log(` ${chalk.green('+')} ${chalk.white(filePath)} ${chalk.gray(`(новый, ${lines} строк)`)}`);
206
+ }
207
+ else {
208
+ console.log(` ${chalk.yellow('~')} ${chalk.white(filePath)}`);
209
+ console.log(renderDiff(filePath, original, content));
210
+ }
211
+ }
212
+ console.log('');
213
+ const { confirm } = await inquirer.prompt([{
214
+ type: 'confirm',
215
+ name: 'confirm',
216
+ message: `Применить ${pendingWrites.size} изменение(й)?`,
217
+ default: true,
218
+ }]);
219
+ if (confirm) {
220
+ for (const [filePath, content] of pendingWrites) {
221
+ await writeProjectFile(filePath, content, rootDir);
222
+ logger.success(`Записан: ${filePath}`);
223
+ }
224
+ pendingWrites.clear();
225
+ }
226
+ else {
227
+ logger.info('Изменения отменены');
228
+ }
229
+ }
230
+ export async function runChat(options = {}) {
231
+ const config = await loadConfig();
232
+ const apiKey = await getApiKey(config);
233
+ if (!apiKey) {
234
+ logger.error('API ключ не установлен. Выполните: didev config set DEEPSEEK_API_KEY=sk-xxx');
235
+ process.exit(1);
236
+ }
237
+ const client = initClient({
238
+ apiKey,
239
+ baseUrl: config.api.baseUrl,
240
+ model: options.model ?? config.api.model,
241
+ maxTokens: config.api.maxTokens,
242
+ temperature: config.api.temperature,
243
+ });
244
+ const rootDir = process.cwd();
245
+ const projectCtx = await collectProjectContext(rootDir);
246
+ const model = options.model ?? config.api.model;
247
+ let systemPrompt = `You are didev, an expert AI coding assistant integrated with the developer's project.
248
+ You have access to tools to read files, search code, and make changes.
249
+
250
+ ${contextToSystemPrompt(projectCtx)}
251
+
252
+ Guidelines:
253
+ - Be concise and practical
254
+ - When making file changes, use the write_file tool
255
+ - Always show what you're changing and why
256
+ - Use the project's existing patterns and conventions`;
257
+ if (options.file) {
258
+ try {
259
+ const content = await readProjectFile(options.file, rootDir);
260
+ systemPrompt += `\n\n## Current File: ${options.file}\n\`\`\`\n${content.slice(0, 400_000)}\n\`\`\``;
261
+ }
262
+ catch {
263
+ logger.warn(`Не удалось прочитать файл: ${options.file}`);
264
+ }
265
+ }
266
+ const mcp = await initMcp(config.mcp?.servers ?? []);
267
+ const mcpTools = mcp.tools;
268
+ if (mcpTools.length > 0) {
269
+ logger.success(`MCP: ${mcpTools.length} tool(s) подключено`);
270
+ }
271
+ const allTools = [...TOOLS, ...mcpTools];
272
+ const messages = [{ role: 'system', content: systemPrompt }];
273
+ const contextFiles = options.file ? [options.file] : [];
274
+ const pendingWrites = new Map();
275
+ let session = createSession('chat', { model });
276
+ session.messages = messages;
277
+ session.contextFiles = contextFiles;
278
+ // ── Header ──
279
+ printHeader(projectCtx.name, model, apiKey);
280
+ console.log(chalk.gray(' Введите сообщение или /help для справки. /exit для выхода.\n'));
281
+ const rl = readline.createInterface({
282
+ input: process.stdin,
283
+ output: process.stdout,
284
+ terminal: true,
285
+ });
286
+ const prompt = chalk.cyan('you') + chalk.gray(' › ');
287
+ const askQuestion = () => new Promise((resolve, reject) => {
288
+ rl.question(prompt, resolve);
289
+ rl.once('close', () => reject(new Error('closed')));
290
+ });
291
+ while (true) {
292
+ let input;
293
+ try {
294
+ input = await askQuestion();
295
+ }
296
+ catch {
297
+ break;
298
+ }
299
+ input = input.trim();
300
+ if (!input)
301
+ continue;
302
+ // ── Slash commands ──────────────────────────────────────────────────────
303
+ if (input.startsWith('/')) {
304
+ const spaceIdx = input.indexOf(' ');
305
+ const cmd = spaceIdx === -1 ? input.slice(1) : input.slice(1, spaceIdx);
306
+ const arg = spaceIdx === -1 ? '' : input.slice(spaceIdx + 1).trim();
307
+ switch (cmd) {
308
+ // ── exit ──
309
+ case 'exit':
310
+ case 'quit':
311
+ logger.dim('До свидания!');
312
+ rl.close();
313
+ return;
314
+ // ── help ──
315
+ case 'help':
316
+ printHelp();
317
+ continue;
318
+ // ── agent ──
319
+ case 'agent': {
320
+ const task = arg || (await inquirer.prompt([{
321
+ type: 'input',
322
+ name: 'task',
323
+ message: 'Задача для агентов:',
324
+ validate: (v) => v.trim().length > 0 || 'Введите задачу',
325
+ }])).task;
326
+ if (!task?.trim())
327
+ continue;
328
+ rl.pause();
329
+ try {
330
+ const { runOrchestration } = await import('../../agents/orchestrator.js');
331
+ await runOrchestration({ task: task.trim(), rootDir, model });
332
+ }
333
+ catch (e) {
334
+ logger.error(`Agent pipeline завершился с ошибкой: ${e.message}`);
335
+ }
336
+ finally {
337
+ rl.resume();
338
+ }
339
+ continue;
340
+ }
341
+ // ── review ──
342
+ case 'review': {
343
+ rl.pause();
344
+ try {
345
+ const { runReview } = await import('./review.js');
346
+ await runReview({ file: arg || undefined, model });
347
+ }
348
+ catch (e) {
349
+ logger.error(`Review завершился с ошибкой: ${e.message}`);
350
+ }
351
+ finally {
352
+ rl.resume();
353
+ }
354
+ continue;
355
+ }
356
+ // ── refactor ──
357
+ case 'refactor': {
358
+ rl.pause();
359
+ try {
360
+ const { runRefactor } = await import('./refactor.js');
361
+ await runRefactor(arg || undefined, { model, dryRun: true });
362
+ }
363
+ catch (e) {
364
+ logger.error(`Refactor завершился с ошибкой: ${e.message}`);
365
+ }
366
+ finally {
367
+ rl.resume();
368
+ }
369
+ continue;
370
+ }
371
+ // ── config ──
372
+ case 'config': {
373
+ if (arg) {
374
+ // didev config set KEY=VALUE inline
375
+ try {
376
+ const eqIdx = arg.indexOf('=');
377
+ if (eqIdx === -1) {
378
+ logger.warn('Использование: /config KEY=VALUE');
379
+ }
380
+ else {
381
+ const key = arg.slice(0, eqIdx).trim();
382
+ const value = arg.slice(eqIdx + 1).trim();
383
+ await setConfigValue(key, value);
384
+ logger.success(`Установлено: ${key} = ${key.toLowerCase().includes('key') ? '***' : value}`);
385
+ }
386
+ }
387
+ catch (e) {
388
+ logger.error(e.message);
389
+ }
390
+ }
391
+ else {
392
+ const { runConfigShow } = await import('./config.js');
393
+ await runConfigShow();
394
+ }
395
+ continue;
396
+ }
397
+ // ── files ──
398
+ case 'files':
399
+ console.log('');
400
+ if (contextFiles.length === 0) {
401
+ logger.dim(' Нет файлов в контексте');
402
+ }
403
+ else {
404
+ logger.info(`Файлы в контексте (${contextFiles.length}):`);
405
+ contextFiles.forEach(f => logger.dim(` ${f}`));
406
+ }
407
+ if (pendingWrites.size > 0) {
408
+ console.log('');
409
+ logger.warn(`Ожидают записи (${pendingWrites.size}): используйте /apply`);
410
+ for (const p of pendingWrites.keys())
411
+ logger.dim(` ${p}`);
412
+ }
413
+ console.log('');
414
+ continue;
415
+ // ── add ──
416
+ case 'add':
417
+ if (!arg) {
418
+ logger.warn('Использование: /add <файл>');
419
+ continue;
420
+ }
421
+ try {
422
+ const content = await readProjectFile(arg, rootDir);
423
+ contextFiles.push(arg);
424
+ messages.push({
425
+ role: 'user',
426
+ content: `[Добавлен файл в контекст]\n\`\`\`\n// ${arg}\n${content.slice(0, 200_000)}\n\`\`\``,
427
+ });
428
+ messages.push({ role: 'assistant', content: `Файл ${arg} добавлен в контекст.` });
429
+ logger.success(`Добавлен: ${arg}`);
430
+ }
431
+ catch (e) {
432
+ logger.error(`Не могу прочитать ${arg}: ${e.message}`);
433
+ }
434
+ continue;
435
+ // ── apply ──
436
+ case 'apply':
437
+ await applyPendingWrites(pendingWrites, rootDir);
438
+ continue;
439
+ // ── save ──
440
+ case 'save':
441
+ if (!arg) {
442
+ logger.warn('Использование: /save <имя>');
443
+ continue;
444
+ }
445
+ session.name = arg;
446
+ session.messages = messages;
447
+ session.contextFiles = contextFiles;
448
+ session.updatedAt = new Date().toISOString();
449
+ await saveSession(session, rootDir);
450
+ logger.success(`Сессия сохранена как "${arg}"`);
451
+ continue;
452
+ // ── load ──
453
+ case 'load': {
454
+ if (!arg) {
455
+ logger.warn('Использование: /load <имя>');
456
+ continue;
457
+ }
458
+ const loaded = await loadSession(arg, rootDir);
459
+ if (!loaded) {
460
+ logger.error(`Сессия "${arg}" не найдена`);
461
+ continue;
462
+ }
463
+ messages.length = 0;
464
+ messages.push(...loaded.messages);
465
+ contextFiles.length = 0;
466
+ contextFiles.push(...loaded.contextFiles);
467
+ session = loaded;
468
+ logger.success(`Сессия "${arg}" загружена (${loaded.messages.length} сообщений)`);
469
+ continue;
470
+ }
471
+ // ── sessions ──
472
+ case 'sessions': {
473
+ const sessions = await listSessions(rootDir);
474
+ if (sessions.length === 0) {
475
+ logger.info('Нет сохранённых сессий');
476
+ }
477
+ else {
478
+ console.log('');
479
+ console.log(chalk.bold(' Сессии:'));
480
+ for (const s of sessions) {
481
+ const date = new Date(s.updatedAt).toLocaleString('ru-RU');
482
+ const msgs = s.messages.filter(m => m.role === 'user').length;
483
+ console.log(` ${chalk.cyan(s.name.padEnd(20))} ${chalk.gray(date + ' ')}` +
484
+ chalk.dim(`${msgs} сообщ.`));
485
+ }
486
+ console.log('');
487
+ }
488
+ continue;
489
+ }
490
+ // ── clear ──
491
+ case 'clear':
492
+ messages.length = 1; // keep system prompt
493
+ pendingWrites.clear();
494
+ logger.info('Диалог очищен');
495
+ continue;
496
+ default:
497
+ logger.warn(`Неизвестная команда: /${cmd} (введите /help)`);
498
+ continue;
499
+ }
500
+ }
501
+ // ── Regular message → streaming API call ───────────────────────────────
502
+ messages.push({ role: 'user', content: input });
503
+ let currentToolLabel = '';
504
+ const spinner = logger.spinner({ text: chalk.gray('Думаю...'), color: 'cyan' }).start();
505
+ try {
506
+ console.log(''); // blank line before response
507
+ const { messages: updatedMsgs, finalContent } = await client.runToolLoopStream(messages, allTools, async (name, args) => {
508
+ if (mcp.isMcpTool(name))
509
+ return mcp.call(name, args);
510
+ return executeToolCall(name, args, rootDir, pendingWrites);
511
+ }, (chunk) => {
512
+ if (spinner.isSpinning) {
513
+ spinner.stop();
514
+ process.stdout.write(chalk.magenta('didev') + chalk.gray(' › ') + chalk.white(chunk));
515
+ }
516
+ else {
517
+ process.stdout.write(chalk.white(chunk));
518
+ }
519
+ }, (toolName) => {
520
+ currentToolLabel = toolName;
521
+ spinner.text = chalk.gray(`Использую: ${toolName}...`);
522
+ if (!spinner.isSpinning)
523
+ spinner.start();
524
+ }, model, { temperature: config.api.temperature });
525
+ // Ensure spinner is stopped and newline is printed
526
+ if (spinner.isSpinning)
527
+ spinner.stop();
528
+ process.stdout.write('\n\n');
529
+ // Unused, suppress
530
+ void currentToolLabel;
531
+ // Update messages array in place
532
+ messages.length = 0;
533
+ messages.push(...updatedMsgs);
534
+ if (pendingWrites.size > 0) {
535
+ logger.warn(`${pendingWrites.size} файл(ов) ожидают записи → /apply`);
536
+ }
537
+ // Auto-save session
538
+ if (config.output.saveSessions) {
539
+ session.messages = messages;
540
+ session.contextFiles = contextFiles;
541
+ session.updatedAt = new Date().toISOString();
542
+ await saveSession(session, rootDir).catch(() => { });
543
+ }
544
+ void finalContent; // captured via onChunk above
545
+ }
546
+ catch (e) {
547
+ if (spinner.isSpinning)
548
+ spinner.fail(chalk.red('Ошибка: ' + e.message));
549
+ else
550
+ console.error('\n' + chalk.red('Ошибка: ' + e.message));
551
+ messages.pop(); // remove failed user message
552
+ }
553
+ }
554
+ rl.close();
555
+ }
556
+ //# sourceMappingURL=chat.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat.js","sourceRoot":"","sources":["../../../src/cli/commands/chat.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export declare function runConfigSet(assignment: string): Promise<void>;
2
+ export declare function runConfigShow(): Promise<void>;
3
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/config.ts"],"names":[],"mappings":"AAIA,wBAAsB,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAiBpE;AAED,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAoDnD"}
@@ -0,0 +1,65 @@
1
+ import chalk from 'chalk';
2
+ import { logger } from '../../utils/logger.js';
3
+ import { loadConfig, setConfigValue, getApiKey } from '../../core/config.js';
4
+ export async function runConfigSet(assignment) {
5
+ const eqIdx = assignment.indexOf('=');
6
+ if (eqIdx === -1) {
7
+ logger.error('Usage: didev config set KEY=VALUE');
8
+ process.exit(1);
9
+ }
10
+ const key = assignment.slice(0, eqIdx).trim();
11
+ const value = assignment.slice(eqIdx + 1).trim();
12
+ if (!key || !value) {
13
+ logger.error('Both key and value are required');
14
+ process.exit(1);
15
+ }
16
+ await setConfigValue(key, value);
17
+ logger.success(`Set ${chalk.bold(key)} = ${key.toLowerCase().includes('key') ? '***' : chalk.cyan(value)}`);
18
+ }
19
+ export async function runConfigShow() {
20
+ const config = await loadConfig();
21
+ const apiKey = await getApiKey(config);
22
+ logger.banner('didev config', 'Current configuration');
23
+ logger.bold('API');
24
+ logger.table([
25
+ ['provider', config.api.provider],
26
+ ['model', config.api.model],
27
+ ['apiKey', apiKey ? `${apiKey.slice(0, 6)}***${apiKey.slice(-4)}` : chalk.red('NOT SET')],
28
+ ['maxTokens', String(config.api.maxTokens)],
29
+ ['temperature', String(config.api.temperature)],
30
+ ['baseUrl', config.api.baseUrl ?? 'https://api.deepseek.com/v1'],
31
+ ]);
32
+ logger.newline();
33
+ logger.bold('Context');
34
+ logger.table([
35
+ ['maxFiles', String(config.context.maxFiles)],
36
+ ['maxTokens', String(config.context.maxTokens)],
37
+ ['autoDiscover', String(config.context.autoDiscover)],
38
+ ]);
39
+ logger.newline();
40
+ logger.bold('Agents');
41
+ logger.table([
42
+ ['family', config.agents.family],
43
+ ['orchestrate', String(config.agents.orchestrate)],
44
+ ['reviewRequired', String(config.agents.reviewRequired)],
45
+ ['autoApply', String(config.agents.autoApply)],
46
+ ]);
47
+ logger.newline();
48
+ logger.bold('BMad');
49
+ logger.table([
50
+ ['enabled', String(config.bmad.enabled)],
51
+ ['templatesPath', config.bmad.templatesPath],
52
+ ]);
53
+ logger.newline();
54
+ logger.bold('Output');
55
+ logger.table([
56
+ ['style', config.output.style],
57
+ ['color', String(config.output.color)],
58
+ ['saveSessions', String(config.output.saveSessions)],
59
+ ]);
60
+ if (!apiKey) {
61
+ logger.newline();
62
+ logger.warn('API key not configured. Run: ' + chalk.cyan('didev config set DEEPSEEK_API_KEY=sk-xxx'));
63
+ }
64
+ }
65
+ //# sourceMappingURL=config.js.map