didev 1.1.2 → 1.2.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.
- package/dist/agents/orchestrator.d.ts.map +1 -1
- package/dist/agents/orchestrator.js +6 -0
- package/dist/agents/orchestrator.js.map +1 -1
- package/dist/cli/commands/chat.d.ts.map +1 -1
- package/dist/cli/commands/chat.js +124 -10
- package/dist/cli/commands/chat.js.map +1 -1
- package/dist/cli/commands/context.d.ts.map +1 -1
- package/dist/cli/commands/context.js +73 -3
- package/dist/cli/commands/context.js.map +1 -1
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/init.js +47 -1
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/menu.d.ts +9 -0
- package/dist/cli/commands/menu.d.ts.map +1 -0
- package/dist/cli/commands/menu.js +342 -0
- package/dist/cli/commands/menu.js.map +1 -0
- package/dist/core/bundled-mcp.d.ts +24 -0
- package/dist/core/bundled-mcp.d.ts.map +1 -0
- package/dist/core/bundled-mcp.js +112 -0
- package/dist/core/bundled-mcp.js.map +1 -0
- package/dist/core/mcp.d.ts +10 -0
- package/dist/core/mcp.d.ts.map +1 -1
- package/dist/core/mcp.js +27 -1
- package/dist/core/mcp.js.map +1 -1
- package/dist/core/post-apply.d.ts +15 -0
- package/dist/core/post-apply.d.ts.map +1 -0
- package/dist/core/post-apply.js +256 -0
- package/dist/core/post-apply.js.map +1 -0
- package/dist/index.js +46 -5
- package/dist/index.js.map +1 -1
- package/dist/utils/build-runner.d.ts +29 -0
- package/dist/utils/build-runner.d.ts.map +1 -0
- package/dist/utils/build-runner.js +172 -0
- package/dist/utils/build-runner.js.map +1 -0
- package/package.json +1 -1
|
@@ -1,11 +1,16 @@
|
|
|
1
|
-
import { mkdir, writeFile, access } from 'fs/promises';
|
|
1
|
+
import { mkdir, writeFile, access, readFile } from 'fs/promises';
|
|
2
2
|
import { join } from 'path';
|
|
3
|
+
import { homedir } from 'os';
|
|
4
|
+
import { execFile } from 'child_process';
|
|
5
|
+
import { promisify } from 'util';
|
|
3
6
|
import inquirer from 'inquirer';
|
|
4
7
|
import chalk from 'chalk';
|
|
5
8
|
import { logger } from '../../utils/logger.js';
|
|
6
9
|
import { collectProjectContext } from '../../core/context.js';
|
|
7
10
|
import { saveConfig } from '../../core/config.js';
|
|
8
11
|
import { generateContextDocument } from './context.js';
|
|
12
|
+
import { BUNDLED_SERVERS, mergeBundledServers, isBundledServerReady } from '../../core/bundled-mcp.js';
|
|
13
|
+
const execFileAsync = promisify(execFile);
|
|
9
14
|
async function exists(p) {
|
|
10
15
|
try {
|
|
11
16
|
await access(p);
|
|
@@ -142,7 +147,11 @@ export async function runInit(options = {}) {
|
|
|
142
147
|
servers: [],
|
|
143
148
|
},
|
|
144
149
|
};
|
|
150
|
+
// Merge bundled MCP servers into config
|
|
151
|
+
config.mcp.servers = mergeBundledServers(config.mcp.servers);
|
|
145
152
|
await saveConfig(config, rootDir);
|
|
153
|
+
// Clone + build GitHub-based bundled servers that don't require auth
|
|
154
|
+
await setupBundledGitServers();
|
|
146
155
|
// Create context.md — AI-generated if key is available, otherwise a template
|
|
147
156
|
let contextMd;
|
|
148
157
|
if (apiKey) {
|
|
@@ -178,6 +187,43 @@ export async function runInit(options = {}) {
|
|
|
178
187
|
logger.dim('Then generate project knowledge base: ' + chalk.cyan('didev context update'));
|
|
179
188
|
}
|
|
180
189
|
}
|
|
190
|
+
async function setupBundledGitServers() {
|
|
191
|
+
const mcpDir = join(homedir(), '.didev', 'mcp');
|
|
192
|
+
await mkdir(mcpDir, { recursive: true });
|
|
193
|
+
const toSetup = BUNDLED_SERVERS.filter(s => s.gitRepo && !s.requiresAuth);
|
|
194
|
+
for (const def of toSetup) {
|
|
195
|
+
const ready = await isBundledServerReady(def);
|
|
196
|
+
if (ready)
|
|
197
|
+
continue;
|
|
198
|
+
const repoName = def.gitRepo.split('/').pop().replace(/\.git$/, '');
|
|
199
|
+
const targetDir = join(mcpDir, repoName);
|
|
200
|
+
const spinner = logger.spinner(`Setting up bundled MCP: ${chalk.bold(def.displayName)}...`).start();
|
|
201
|
+
try {
|
|
202
|
+
const alreadyCloned = await exists(join(targetDir, '.git'));
|
|
203
|
+
if (!alreadyCloned) {
|
|
204
|
+
await execFileAsync('git', ['clone', '--depth', '1', '--quiet', def.gitRepo, targetDir], { shell: true });
|
|
205
|
+
}
|
|
206
|
+
// Install + build if package.json exists
|
|
207
|
+
const hasPkg = await exists(join(targetDir, 'package.json'));
|
|
208
|
+
if (hasPkg) {
|
|
209
|
+
await execFileAsync('npm', ['install', '--prefer-offline', '--silent'], { cwd: targetDir, shell: true });
|
|
210
|
+
let scripts = {};
|
|
211
|
+
try {
|
|
212
|
+
const raw = await readFile(join(targetDir, 'package.json'), 'utf-8');
|
|
213
|
+
scripts = (JSON.parse(raw)['scripts'] ?? {});
|
|
214
|
+
}
|
|
215
|
+
catch { /* ignore */ }
|
|
216
|
+
if (scripts['build']) {
|
|
217
|
+
await execFileAsync('npm', ['run', 'build'], { cwd: targetDir, shell: true });
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
spinner.succeed(`${chalk.bold(def.displayName)} ready`);
|
|
221
|
+
}
|
|
222
|
+
catch (e) {
|
|
223
|
+
spinner.warn(`${def.displayName}: ${e.message}`);
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
}
|
|
181
227
|
function generateContextMd(ctx, type) {
|
|
182
228
|
return `# Project Context
|
|
183
229
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/cli/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/cli/commands/init.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export interface MenuResult {
|
|
2
|
+
action: 'chat' | 'agent' | 'exit' | 'back';
|
|
3
|
+
model?: string;
|
|
4
|
+
agentTask?: string;
|
|
5
|
+
agentMode?: 'full' | 'light' | 'developer-only';
|
|
6
|
+
agentSkip?: string[];
|
|
7
|
+
}
|
|
8
|
+
export declare function runMenu(inChat?: boolean): Promise<MenuResult>;
|
|
9
|
+
//# sourceMappingURL=menu.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"menu.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/menu.ts"],"names":[],"mappings":"AAaA,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,CAAC;IAC3C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,gBAAgB,CAAC;IAChD,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;CACtB;AAyCD,wBAAsB,OAAO,CAAC,MAAM,UAAQ,GAAG,OAAO,CAAC,UAAU,CAAC,CAgEjE"}
|
|
@@ -0,0 +1,342 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import inquirer from 'inquirer';
|
|
3
|
+
import { createRequire } from 'module';
|
|
4
|
+
import { loadConfig, setConfigValue } from '../../core/config.js';
|
|
5
|
+
import { getMcpManager } from '../../core/mcp.js';
|
|
6
|
+
import { BUNDLED_SERVERS, getMissingRequiredEnv, mergeBundledServers } from '../../core/bundled-mcp.js';
|
|
7
|
+
import { logger } from '../../utils/logger.js';
|
|
8
|
+
const _require = createRequire(import.meta.url);
|
|
9
|
+
const { version: PKG_VERSION } = _require('../../../package.json');
|
|
10
|
+
const MODELS = [
|
|
11
|
+
{
|
|
12
|
+
name: 'deepseek-v4-flash',
|
|
13
|
+
value: 'deepseek-v4-flash',
|
|
14
|
+
desc: 'быстрая · 1M контекст · 384K вывод (по умолчанию)',
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
name: 'deepseek-v4-pro',
|
|
18
|
+
value: 'deepseek-v4-pro',
|
|
19
|
+
desc: 'thinking model · сложные архитектурные задачи',
|
|
20
|
+
},
|
|
21
|
+
];
|
|
22
|
+
const AGENTS = [
|
|
23
|
+
['Analyst', 'анализ задачи и требований'],
|
|
24
|
+
['Architect', 'архитектура и технический план'],
|
|
25
|
+
['Developer', 'реализация кода'],
|
|
26
|
+
['Reviewer', 'code review'],
|
|
27
|
+
['Tester', 'написание тестов'],
|
|
28
|
+
];
|
|
29
|
+
function sep(len = 44) {
|
|
30
|
+
return new inquirer.Separator(chalk.gray('─'.repeat(len)));
|
|
31
|
+
}
|
|
32
|
+
function header(projectName) {
|
|
33
|
+
console.log('');
|
|
34
|
+
console.log(chalk.bold.cyan('didev') +
|
|
35
|
+
chalk.gray(` v${PKG_VERSION}`) +
|
|
36
|
+
chalk.gray(' · ') +
|
|
37
|
+
chalk.white(projectName));
|
|
38
|
+
console.log(chalk.gray('─'.repeat(50)));
|
|
39
|
+
console.log('');
|
|
40
|
+
}
|
|
41
|
+
// ── Main entry point ──────────────────────────────────────────────────────────
|
|
42
|
+
export async function runMenu(inChat = false) {
|
|
43
|
+
const projectName = process.cwd().split(/[/\\]/).pop() ?? 'project';
|
|
44
|
+
while (true) {
|
|
45
|
+
const config = await loadConfig();
|
|
46
|
+
const currentModel = config.api.model;
|
|
47
|
+
const servers = config.mcp?.servers ?? [];
|
|
48
|
+
const mcpLabel = servers.length > 0
|
|
49
|
+
? chalk.dim(`(${servers.length})`)
|
|
50
|
+
: chalk.dim('(нет)');
|
|
51
|
+
header(projectName);
|
|
52
|
+
const { action } = await inquirer.prompt([{
|
|
53
|
+
type: 'list',
|
|
54
|
+
name: 'action',
|
|
55
|
+
message: 'Меню',
|
|
56
|
+
choices: [
|
|
57
|
+
inChat
|
|
58
|
+
? { name: `${chalk.cyan('▶')} Вернуться в чат`, value: 'chat' }
|
|
59
|
+
: { name: `${chalk.cyan('▶')} Чат с AI`, value: 'chat' },
|
|
60
|
+
{ name: `${chalk.yellow('◈')} Агент pipeline`, value: 'agent' },
|
|
61
|
+
sep(),
|
|
62
|
+
{ name: `${chalk.blue('◉')} MCP серверы ${mcpLabel}`, value: 'mcp' },
|
|
63
|
+
{ name: `${chalk.green('◉')} Контекст проекта`, value: 'context' },
|
|
64
|
+
{ name: `${chalk.magenta('◉')} Модель: ${chalk.bold(currentModel)}`, value: 'model' },
|
|
65
|
+
{ name: `${chalk.gray('◉')} Настройки конфига`, value: 'settings' },
|
|
66
|
+
sep(),
|
|
67
|
+
{ name: `${chalk.red('✕')} Выход`, value: 'exit' },
|
|
68
|
+
],
|
|
69
|
+
pageSize: 12,
|
|
70
|
+
}]);
|
|
71
|
+
switch (action) {
|
|
72
|
+
case 'chat':
|
|
73
|
+
return { action: inChat ? 'back' : 'chat', model: config.api.model };
|
|
74
|
+
case 'agent': {
|
|
75
|
+
const result = await agentMenu();
|
|
76
|
+
if (result !== null)
|
|
77
|
+
return result;
|
|
78
|
+
break;
|
|
79
|
+
}
|
|
80
|
+
case 'mcp':
|
|
81
|
+
await mcpMenu(servers);
|
|
82
|
+
break;
|
|
83
|
+
case 'context':
|
|
84
|
+
await contextMenu(config.api.model);
|
|
85
|
+
break;
|
|
86
|
+
case 'model':
|
|
87
|
+
await modelMenu(currentModel);
|
|
88
|
+
break;
|
|
89
|
+
case 'settings':
|
|
90
|
+
await settingsMenu();
|
|
91
|
+
break;
|
|
92
|
+
case 'exit':
|
|
93
|
+
return { action: 'exit' };
|
|
94
|
+
}
|
|
95
|
+
// loop → redraw menu
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
// ── Agents / Skills ───────────────────────────────────────────────────────────
|
|
99
|
+
async function agentMenu() {
|
|
100
|
+
console.log('');
|
|
101
|
+
console.log(chalk.bold(' Skills — доступные агенты:'));
|
|
102
|
+
console.log('');
|
|
103
|
+
for (const [name, desc] of AGENTS) {
|
|
104
|
+
console.log(` ${chalk.cyan(name.padEnd(12))}${chalk.gray(desc)}`);
|
|
105
|
+
}
|
|
106
|
+
console.log('');
|
|
107
|
+
const { choice } = await inquirer.prompt([{
|
|
108
|
+
type: 'list',
|
|
109
|
+
name: 'choice',
|
|
110
|
+
message: 'Режим запуска',
|
|
111
|
+
choices: [
|
|
112
|
+
{ name: 'Полный pipeline (Analyst → Architect → Developer → Reviewer)', value: 'full' },
|
|
113
|
+
{ name: 'Только Developer', value: 'dev' },
|
|
114
|
+
{ name: 'Только Reviewer', value: 'review' },
|
|
115
|
+
{ name: 'Только Tester', value: 'tester' },
|
|
116
|
+
sep(),
|
|
117
|
+
{ name: chalk.gray('Назад'), value: 'back' },
|
|
118
|
+
],
|
|
119
|
+
}]);
|
|
120
|
+
if (choice === 'back')
|
|
121
|
+
return null;
|
|
122
|
+
const { task } = await inquirer.prompt([{
|
|
123
|
+
type: 'input',
|
|
124
|
+
name: 'task',
|
|
125
|
+
message: 'Опишите задачу:',
|
|
126
|
+
validate: (v) => v.trim().length > 0 || 'Введите задачу',
|
|
127
|
+
}]);
|
|
128
|
+
if (!task?.trim())
|
|
129
|
+
return null;
|
|
130
|
+
const SKIP_ALL_BUT_DEV = ['Analyst', 'Frontend Analyst', 'Backend Analyst', 'Architect', 'Frontend Architect', 'Backend Architect', 'Reviewer', 'Security Auditor', 'Tester', 'Performance Auditor'];
|
|
131
|
+
const SKIP_ALL_BUT_REVIEW = ['Analyst', 'Frontend Analyst', 'Backend Analyst', 'Architect', 'Frontend Architect', 'Backend Architect', 'Developer', 'Frontend Developer', 'Backend Developer', 'Tester', 'Performance Auditor'];
|
|
132
|
+
const SKIP_ALL_BUT_TEST = ['Analyst', 'Frontend Analyst', 'Backend Analyst', 'Architect', 'Frontend Architect', 'Backend Architect', 'Developer', 'Frontend Developer', 'Backend Developer', 'Reviewer', 'Security Auditor'];
|
|
133
|
+
const modeMap = {
|
|
134
|
+
full: { agentMode: 'full' },
|
|
135
|
+
dev: { agentMode: 'developer-only' },
|
|
136
|
+
review: { agentSkip: SKIP_ALL_BUT_REVIEW },
|
|
137
|
+
tester: { agentSkip: SKIP_ALL_BUT_TEST },
|
|
138
|
+
};
|
|
139
|
+
return { action: 'agent', agentTask: task.trim(), ...modeMap[choice] };
|
|
140
|
+
}
|
|
141
|
+
// ── MCP ───────────────────────────────────────────────────────────────────────
|
|
142
|
+
function mcpStatusIcon(status) {
|
|
143
|
+
switch (status) {
|
|
144
|
+
case 'connected': return chalk.green('●');
|
|
145
|
+
case 'failed': return chalk.red('✕');
|
|
146
|
+
case 'disabled': return chalk.gray('○');
|
|
147
|
+
default: return chalk.dim('·');
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
async function mcpMenu(servers) {
|
|
151
|
+
console.log('');
|
|
152
|
+
// Merge bundled to get the full picture even if config doesn't have them yet
|
|
153
|
+
const allServers = mergeBundledServers(servers);
|
|
154
|
+
const manager = getMcpManager();
|
|
155
|
+
const liveStatuses = manager.getServerStatuses();
|
|
156
|
+
const statusMap = new Map(liveStatuses.map(s => [s.name, s]));
|
|
157
|
+
// Build display rows
|
|
158
|
+
console.log(chalk.bold(` MCP серверы (${allServers.length}):`));
|
|
159
|
+
console.log('');
|
|
160
|
+
for (const s of allServers) {
|
|
161
|
+
const live = statusMap.get(s.name);
|
|
162
|
+
const status = live?.status ?? (s.enabled === false ? 'disabled' : 'unknown');
|
|
163
|
+
const icon = mcpStatusIcon(status);
|
|
164
|
+
// Status label
|
|
165
|
+
let statusLabel;
|
|
166
|
+
if (status === 'connected') {
|
|
167
|
+
statusLabel = chalk.green(`подключён (${live.toolCount} tools)`);
|
|
168
|
+
}
|
|
169
|
+
else if (status === 'failed') {
|
|
170
|
+
const shortErr = (live?.error ?? '').slice(0, 40);
|
|
171
|
+
statusLabel = chalk.red(`ошибка ${chalk.dim(shortErr)}`);
|
|
172
|
+
}
|
|
173
|
+
else if (status === 'disabled') {
|
|
174
|
+
// Show which env vars are missing for bundled servers
|
|
175
|
+
const def = BUNDLED_SERVERS.find(d => d.name === s.name);
|
|
176
|
+
if (def?.requiresAuth) {
|
|
177
|
+
const missing = getMissingRequiredEnv(def);
|
|
178
|
+
if (missing.length > 0) {
|
|
179
|
+
statusLabel = chalk.gray(`отключён `) + chalk.dim(`нет: ${missing.join(', ')}`);
|
|
180
|
+
}
|
|
181
|
+
else {
|
|
182
|
+
statusLabel = chalk.yellow('отключён (включить: didev mcp)');
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
else {
|
|
186
|
+
statusLabel = chalk.gray('отключён');
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
else {
|
|
190
|
+
statusLabel = chalk.dim('не запущен в этой сессии');
|
|
191
|
+
}
|
|
192
|
+
console.log(` ${icon} ${chalk.bold(s.name.padEnd(14))} ${statusLabel}`);
|
|
193
|
+
}
|
|
194
|
+
console.log('');
|
|
195
|
+
// Show hints for disabled bundled servers that need env vars
|
|
196
|
+
const needsSetup = BUNDLED_SERVERS.filter(def => {
|
|
197
|
+
const missing = getMissingRequiredEnv(def);
|
|
198
|
+
return def.requiresAuth && missing.length > 0;
|
|
199
|
+
});
|
|
200
|
+
if (needsSetup.length > 0) {
|
|
201
|
+
console.log(chalk.dim(' Для активации требуются токены:'));
|
|
202
|
+
for (const def of needsSetup) {
|
|
203
|
+
const missing = getMissingRequiredEnv(def);
|
|
204
|
+
for (const varName of missing) {
|
|
205
|
+
const envDef = def.requiredEnv.find(e => e.name === varName);
|
|
206
|
+
console.log(` ${chalk.yellow('→')} ${chalk.bold(varName.padEnd(24))} ${chalk.dim(envDef?.hint ?? '')}`);
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
console.log(chalk.dim(` Установить: ${chalk.cyan('didev config set VAR=value')}`));
|
|
210
|
+
console.log('');
|
|
211
|
+
}
|
|
212
|
+
const { action } = await inquirer.prompt([{
|
|
213
|
+
type: 'list',
|
|
214
|
+
name: 'action',
|
|
215
|
+
message: 'MCP серверы',
|
|
216
|
+
choices: [
|
|
217
|
+
{ name: 'Добавить сервер', value: 'add' },
|
|
218
|
+
...(allServers.length > 0 ? [
|
|
219
|
+
{ name: 'Тестировать соединения', value: 'test' },
|
|
220
|
+
{ name: 'Удалить сервер', value: 'remove' },
|
|
221
|
+
] : []),
|
|
222
|
+
sep(),
|
|
223
|
+
{ name: chalk.gray('Назад'), value: 'back' },
|
|
224
|
+
],
|
|
225
|
+
}]);
|
|
226
|
+
if (action === 'back')
|
|
227
|
+
return;
|
|
228
|
+
const { runMcpAdd, runMcpTest, runMcpRemove } = await import('./mcp.js');
|
|
229
|
+
if (action === 'add') {
|
|
230
|
+
await runMcpAdd();
|
|
231
|
+
}
|
|
232
|
+
else if (action === 'test') {
|
|
233
|
+
await runMcpTest();
|
|
234
|
+
}
|
|
235
|
+
else if (action === 'remove' && allServers.length > 0) {
|
|
236
|
+
const { serverName } = await inquirer.prompt([{
|
|
237
|
+
type: 'list',
|
|
238
|
+
name: 'serverName',
|
|
239
|
+
message: 'Выберите сервер для удаления:',
|
|
240
|
+
choices: allServers.map(s => ({ name: s.name, value: s.name })),
|
|
241
|
+
}]);
|
|
242
|
+
await runMcpRemove(serverName);
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
// ── Context ───────────────────────────────────────────────────────────────────
|
|
246
|
+
async function contextMenu(model) {
|
|
247
|
+
const { action } = await inquirer.prompt([{
|
|
248
|
+
type: 'list',
|
|
249
|
+
name: 'action',
|
|
250
|
+
message: 'Контекст проекта',
|
|
251
|
+
choices: [
|
|
252
|
+
{ name: 'Показать базу знаний', value: 'show' },
|
|
253
|
+
{ name: 'Обновить базу знаний через AI', value: 'update' },
|
|
254
|
+
sep(),
|
|
255
|
+
{ name: chalk.gray('Назад'), value: 'back' },
|
|
256
|
+
],
|
|
257
|
+
}]);
|
|
258
|
+
if (action === 'back')
|
|
259
|
+
return;
|
|
260
|
+
const { runContextShow, runContextUpdate } = await import('./context.js');
|
|
261
|
+
if (action === 'show') {
|
|
262
|
+
console.log('');
|
|
263
|
+
await runContextShow();
|
|
264
|
+
console.log('');
|
|
265
|
+
await inquirer.prompt([{
|
|
266
|
+
type: 'input',
|
|
267
|
+
name: '_',
|
|
268
|
+
message: chalk.gray('Enter для возврата...'),
|
|
269
|
+
}]);
|
|
270
|
+
}
|
|
271
|
+
else if (action === 'update') {
|
|
272
|
+
await runContextUpdate({ model });
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
// ── Model selection ───────────────────────────────────────────────────────────
|
|
276
|
+
async function modelMenu(currentModel) {
|
|
277
|
+
console.log('');
|
|
278
|
+
const { choice } = await inquirer.prompt([{
|
|
279
|
+
type: 'list',
|
|
280
|
+
name: 'choice',
|
|
281
|
+
message: 'Выберите модель',
|
|
282
|
+
choices: [
|
|
283
|
+
...MODELS.map(m => ({
|
|
284
|
+
name: chalk.bold(m.name.padEnd(22)) +
|
|
285
|
+
chalk.gray(m.desc) +
|
|
286
|
+
(m.value === currentModel ? chalk.green(' ✓') : ''),
|
|
287
|
+
value: m.value,
|
|
288
|
+
short: m.value,
|
|
289
|
+
})),
|
|
290
|
+
sep(),
|
|
291
|
+
{ name: chalk.gray('Назад'), value: 'back' },
|
|
292
|
+
],
|
|
293
|
+
pageSize: 6,
|
|
294
|
+
}]);
|
|
295
|
+
if (choice === 'back' || choice === currentModel)
|
|
296
|
+
return;
|
|
297
|
+
await setConfigValue('api.model', choice);
|
|
298
|
+
console.log('');
|
|
299
|
+
logger.success(`Модель установлена: ${chalk.bold(choice)}`);
|
|
300
|
+
console.log('');
|
|
301
|
+
}
|
|
302
|
+
// ── Settings / Config ─────────────────────────────────────────────────────────
|
|
303
|
+
async function settingsMenu() {
|
|
304
|
+
const { action } = await inquirer.prompt([{
|
|
305
|
+
type: 'list',
|
|
306
|
+
name: 'action',
|
|
307
|
+
message: 'Настройки',
|
|
308
|
+
choices: [
|
|
309
|
+
{ name: 'Показать конфигурацию', value: 'show' },
|
|
310
|
+
{ name: 'Установить значение (KEY=VALUE)', value: 'set' },
|
|
311
|
+
sep(),
|
|
312
|
+
{ name: chalk.gray('Назад'), value: 'back' },
|
|
313
|
+
],
|
|
314
|
+
}]);
|
|
315
|
+
if (action === 'back')
|
|
316
|
+
return;
|
|
317
|
+
if (action === 'show') {
|
|
318
|
+
const { runConfigShow } = await import('./config.js');
|
|
319
|
+
console.log('');
|
|
320
|
+
await runConfigShow();
|
|
321
|
+
console.log('');
|
|
322
|
+
await inquirer.prompt([{
|
|
323
|
+
type: 'input',
|
|
324
|
+
name: '_',
|
|
325
|
+
message: chalk.gray('Enter для возврата...'),
|
|
326
|
+
}]);
|
|
327
|
+
}
|
|
328
|
+
else if (action === 'set') {
|
|
329
|
+
const { assignment } = await inquirer.prompt([{
|
|
330
|
+
type: 'input',
|
|
331
|
+
name: 'assignment',
|
|
332
|
+
message: 'KEY=VALUE (например: api.temperature=0.5):',
|
|
333
|
+
validate: (v) => v.includes('=') || 'Формат: KEY=VALUE',
|
|
334
|
+
}]);
|
|
335
|
+
if (assignment?.trim()) {
|
|
336
|
+
const { runConfigSet } = await import('./config.js');
|
|
337
|
+
await runConfigSet(assignment.trim());
|
|
338
|
+
console.log('');
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
//# sourceMappingURL=menu.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"menu.js","sourceRoot":"","sources":["../../../src/cli/commands/menu.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { McpServerConfig } from './mcp.js';
|
|
2
|
+
export interface RequiredEnvVar {
|
|
3
|
+
name: string;
|
|
4
|
+
hint: string;
|
|
5
|
+
sensitive: boolean;
|
|
6
|
+
}
|
|
7
|
+
export interface BundledServerDef {
|
|
8
|
+
name: string;
|
|
9
|
+
displayName: string;
|
|
10
|
+
description: string;
|
|
11
|
+
command: string;
|
|
12
|
+
args: string[];
|
|
13
|
+
env?: Record<string, string>;
|
|
14
|
+
requiresAuth: boolean;
|
|
15
|
+
requiredEnv: RequiredEnvVar[];
|
|
16
|
+
gitRepo?: string;
|
|
17
|
+
defaultEnabled: boolean;
|
|
18
|
+
}
|
|
19
|
+
export declare const BUNDLED_SERVERS: BundledServerDef[];
|
|
20
|
+
export declare function toBundledMcpConfig(def: BundledServerDef): McpServerConfig;
|
|
21
|
+
export declare function getMissingRequiredEnv(def: BundledServerDef): string[];
|
|
22
|
+
export declare function isBundledServerReady(def: BundledServerDef): Promise<boolean>;
|
|
23
|
+
export declare function mergeBundledServers(existing: McpServerConfig[]): McpServerConfig[];
|
|
24
|
+
//# sourceMappingURL=bundled-mcp.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bundled-mcp.d.ts","sourceRoot":"","sources":["../../src/core/bundled-mcp.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAEhD,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,YAAY,EAAE,OAAO,CAAC;IACtB,WAAW,EAAE,cAAc,EAAE,CAAC;IAC9B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,OAAO,CAAC;CACzB;AAID,eAAO,MAAM,eAAe,EAAE,gBAAgB,EAwD7C,CAAC;AAIF,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,gBAAgB,GAAG,eAAe,CAQzE;AAUD,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,gBAAgB,GAAG,MAAM,EAAE,CAIrE;AAGD,wBAAsB,oBAAoB,CAAC,GAAG,EAAE,gBAAgB,GAAG,OAAO,CAAC,OAAO,CAAC,CAUlF;AAGD,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,eAAe,EAAE,GAAG,eAAe,EAAE,CASlF"}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import { join } from 'path';
|
|
2
|
+
import { homedir } from 'os';
|
|
3
|
+
import { access } from 'fs/promises';
|
|
4
|
+
const MCP_DIR = join(homedir(), '.didev', 'mcp');
|
|
5
|
+
export const BUNDLED_SERVERS = [
|
|
6
|
+
{
|
|
7
|
+
name: 'java-vuln',
|
|
8
|
+
displayName: 'Java Vuln Remediation',
|
|
9
|
+
description: 'Find vulnerable Java deps via OSV.dev + Maven Central',
|
|
10
|
+
command: 'node',
|
|
11
|
+
args: [join(MCP_DIR, 'java-vuln-remediation', 'dist', 'index.js')],
|
|
12
|
+
requiresAuth: false,
|
|
13
|
+
requiredEnv: [],
|
|
14
|
+
gitRepo: 'https://github.com/Neovaryag/java-vuln-remediation.git',
|
|
15
|
+
defaultEnabled: true,
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
name: 'context7',
|
|
19
|
+
displayName: 'Context7',
|
|
20
|
+
description: 'Real-time library documentation from context7.com',
|
|
21
|
+
command: 'npx',
|
|
22
|
+
args: ['-y', '@upstash/context7-mcp'],
|
|
23
|
+
requiresAuth: false,
|
|
24
|
+
requiredEnv: [],
|
|
25
|
+
defaultEnabled: true,
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
name: 'pgs-tool',
|
|
29
|
+
displayName: 'PostgreSQL Tool',
|
|
30
|
+
description: 'PostgreSQL MCP tools for database interaction',
|
|
31
|
+
command: 'node',
|
|
32
|
+
args: [join(MCP_DIR, 'mcp-pgs-tool', 'dist', 'index.js')],
|
|
33
|
+
env: { DATABASE_URL: '${DATABASE_URL}' },
|
|
34
|
+
requiresAuth: true,
|
|
35
|
+
requiredEnv: [
|
|
36
|
+
{ name: 'DATABASE_URL', hint: 'postgresql://user:pass@host/dbname', sensitive: false },
|
|
37
|
+
],
|
|
38
|
+
gitRepo: 'https://github.com/Neovaryag/mcp-pgs-tool.git',
|
|
39
|
+
defaultEnabled: false,
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
name: 'atlassian',
|
|
43
|
+
displayName: 'Atlassian MCP',
|
|
44
|
+
description: 'Jira & Confluence integration',
|
|
45
|
+
command: 'node',
|
|
46
|
+
args: [join(MCP_DIR, 'atlassian-mcp', 'dist', 'index.js')],
|
|
47
|
+
env: {
|
|
48
|
+
ATLASSIAN_API_TOKEN: '${ATLASSIAN_API_TOKEN}',
|
|
49
|
+
ATLASSIAN_BASE_URL: '${ATLASSIAN_BASE_URL}',
|
|
50
|
+
ATLASSIAN_EMAIL: '${ATLASSIAN_EMAIL}',
|
|
51
|
+
},
|
|
52
|
+
requiresAuth: true,
|
|
53
|
+
requiredEnv: [
|
|
54
|
+
{ name: 'ATLASSIAN_EMAIL', hint: 'your@email.com', sensitive: false },
|
|
55
|
+
{ name: 'ATLASSIAN_API_TOKEN', hint: 'your Atlassian API token', sensitive: true },
|
|
56
|
+
{ name: 'ATLASSIAN_BASE_URL', hint: 'https://yourcompany.atlassian.net', sensitive: false },
|
|
57
|
+
],
|
|
58
|
+
gitRepo: 'https://github.com/varunkumar/atlassian-mcp.git',
|
|
59
|
+
defaultEnabled: false,
|
|
60
|
+
},
|
|
61
|
+
];
|
|
62
|
+
// ── Helpers ───────────────────────────────────────────────────────────────────
|
|
63
|
+
export function toBundledMcpConfig(def) {
|
|
64
|
+
return {
|
|
65
|
+
name: def.name,
|
|
66
|
+
command: def.command,
|
|
67
|
+
args: def.args,
|
|
68
|
+
...(def.env ? { env: def.env } : {}),
|
|
69
|
+
enabled: resolveEnabled(def),
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
function resolveEnabled(def) {
|
|
73
|
+
if (!def.defaultEnabled)
|
|
74
|
+
return false;
|
|
75
|
+
// If it requires env vars that aren't set, disable it
|
|
76
|
+
const missing = getMissingRequiredEnv(def);
|
|
77
|
+
if (missing.length > 0)
|
|
78
|
+
return false;
|
|
79
|
+
return true;
|
|
80
|
+
}
|
|
81
|
+
export function getMissingRequiredEnv(def) {
|
|
82
|
+
return def.requiredEnv
|
|
83
|
+
.filter(e => !process.env[e.name])
|
|
84
|
+
.map(e => e.name);
|
|
85
|
+
}
|
|
86
|
+
// Returns true if the server entry point file exists (for node-based cloned servers)
|
|
87
|
+
export async function isBundledServerReady(def) {
|
|
88
|
+
if (def.command === 'npx')
|
|
89
|
+
return true;
|
|
90
|
+
const entryPoint = def.args[0];
|
|
91
|
+
if (!entryPoint)
|
|
92
|
+
return false;
|
|
93
|
+
try {
|
|
94
|
+
await access(entryPoint);
|
|
95
|
+
return true;
|
|
96
|
+
}
|
|
97
|
+
catch {
|
|
98
|
+
return false;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
// Merges bundled servers into an existing list — skips ones already present by name
|
|
102
|
+
export function mergeBundledServers(existing) {
|
|
103
|
+
const names = new Set(existing.map(s => s.name));
|
|
104
|
+
const result = [...existing];
|
|
105
|
+
for (const def of BUNDLED_SERVERS) {
|
|
106
|
+
if (!names.has(def.name)) {
|
|
107
|
+
result.push(toBundledMcpConfig(def));
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
return result;
|
|
111
|
+
}
|
|
112
|
+
//# sourceMappingURL=bundled-mcp.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bundled-mcp.js","sourceRoot":"","sources":["../../src/core/bundled-mcp.ts"],"names":[],"mappings":"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"}
|