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,235 @@
1
+ import { readFile, readdir, access } from 'fs/promises';
2
+ import { join, extname, basename } from 'path';
3
+ import { glob } from 'glob';
4
+ import { countTokens } from '../utils/token-counter.js';
5
+ import { logger } from '../utils/logger.js';
6
+ const IGNORE_PATTERNS = [
7
+ 'node_modules/**', 'dist/**', 'build/**', '.git/**',
8
+ '*.lock', '*.min.js', '*.min.css', '*.map',
9
+ '__pycache__/**', '*.pyc', '.next/**', '.nuxt/**',
10
+ 'coverage/**', '.turbo/**', 'out/**',
11
+ ];
12
+ const CODE_EXTENSIONS = new Set([
13
+ '.ts', '.tsx', '.js', '.jsx', '.mjs', '.cjs',
14
+ '.py', '.go', '.rs', '.java', '.kt', '.swift',
15
+ '.c', '.cpp', '.h', '.cs', '.rb', '.php',
16
+ '.vue', '.svelte', '.html', '.css', '.scss', '.sass',
17
+ '.json', '.yaml', '.yml', '.toml', '.env.example',
18
+ '.md', '.sql', '.sh', '.bash',
19
+ ]);
20
+ async function exists(p) {
21
+ try {
22
+ await access(p);
23
+ return true;
24
+ }
25
+ catch {
26
+ return false;
27
+ }
28
+ }
29
+ async function readJsonFile(p) {
30
+ try {
31
+ const txt = await readFile(p, 'utf-8');
32
+ return JSON.parse(txt);
33
+ }
34
+ catch {
35
+ return null;
36
+ }
37
+ }
38
+ export async function collectProjectContext(rootDir = process.cwd()) {
39
+ const pkg = await readJsonFile(join(rootDir, 'package.json'));
40
+ const name = pkg?.name ?? basename(rootDir);
41
+ const runtimeDeps = Object.keys(pkg?.dependencies ?? {});
42
+ const devDeps = Object.keys(pkg?.devDependencies ?? {});
43
+ const allDeps = [...runtimeDeps, ...devDeps];
44
+ // Detect language
45
+ let language = 'javascript';
46
+ if (await exists(join(rootDir, 'tsconfig.json')) || allDeps.includes('typescript')) {
47
+ language = 'typescript';
48
+ }
49
+ else if (await exists(join(rootDir, 'go.mod'))) {
50
+ language = 'go';
51
+ }
52
+ else if (await exists(join(rootDir, 'Cargo.toml'))) {
53
+ language = 'rust';
54
+ }
55
+ else if (await exists(join(rootDir, 'requirements.txt')) || await exists(join(rootDir, 'pyproject.toml'))) {
56
+ language = 'python';
57
+ }
58
+ else if (await exists(join(rootDir, 'pom.xml'))) {
59
+ language = 'java';
60
+ }
61
+ // Detect framework
62
+ let framework = 'none';
63
+ if (allDeps.includes('next'))
64
+ framework = 'nextjs';
65
+ else if (allDeps.includes('react'))
66
+ framework = 'react';
67
+ else if (allDeps.includes('vue'))
68
+ framework = 'vue';
69
+ else if (allDeps.includes('svelte'))
70
+ framework = 'svelte';
71
+ else if (allDeps.includes('@angular/core'))
72
+ framework = 'angular';
73
+ else if (allDeps.includes('express'))
74
+ framework = 'express';
75
+ else if (allDeps.includes('fastify'))
76
+ framework = 'fastify';
77
+ else if (allDeps.includes('nestjs') || allDeps.includes('@nestjs/core'))
78
+ framework = 'nestjs';
79
+ else if (allDeps.includes('koa'))
80
+ framework = 'koa';
81
+ else if (allDeps.includes('hono'))
82
+ framework = 'hono';
83
+ // Detect project type
84
+ const hasFrontend = ['react', 'nextjs', 'vue', 'svelte', 'angular'].includes(framework) ||
85
+ allDeps.some(d => ['react-dom', 'vue', '@angular/core'].includes(d));
86
+ const hasBackend = ['express', 'fastify', 'nestjs', 'koa', 'hono'].includes(framework) ||
87
+ allDeps.some(d => ['express', 'fastify', 'koa', 'hono'].includes(d));
88
+ let type = 'unknown';
89
+ if (hasFrontend && hasBackend)
90
+ type = 'fullstack';
91
+ else if (hasFrontend)
92
+ type = 'frontend';
93
+ else if (hasBackend)
94
+ type = 'backend';
95
+ else if (language !== 'javascript' && language !== 'typescript')
96
+ type = 'backend';
97
+ // Config files
98
+ const configCandidates = ['package.json', 'tsconfig.json', 'vite.config.ts', 'vite.config.js',
99
+ 'webpack.config.js', 'tailwind.config.ts', 'tailwind.config.js', '.eslintrc.json',
100
+ '.eslintrc.js', 'jest.config.ts', 'jest.config.js', 'vitest.config.ts',
101
+ 'go.mod', 'Cargo.toml', 'requirements.txt', 'pyproject.toml', 'Makefile', 'Dockerfile'];
102
+ const configFiles = [];
103
+ for (const cf of configCandidates) {
104
+ if (await exists(join(rootDir, cf)))
105
+ configFiles.push(cf);
106
+ }
107
+ // Count files and lines
108
+ let fileCount = 0;
109
+ let lineCount = 0;
110
+ try {
111
+ const files = await glob('**/*.{ts,tsx,js,jsx,py,go,rs,java,vue,svelte}', {
112
+ cwd: rootDir,
113
+ ignore: IGNORE_PATTERNS,
114
+ });
115
+ fileCount = files.length;
116
+ for (const f of files.slice(0, 200)) {
117
+ try {
118
+ const content = await readFile(join(rootDir, f), 'utf-8');
119
+ lineCount += content.split('\n').length;
120
+ }
121
+ catch (e) {
122
+ logger.debug(`context: skipping unreadable file ${f}: ${e.message}`);
123
+ }
124
+ }
125
+ }
126
+ catch (e) {
127
+ logger.debug(`context: glob failed: ${e.message}`);
128
+ }
129
+ // Recent/important files
130
+ const recentFiles = [];
131
+ const srcDir = join(rootDir, 'src');
132
+ if (await exists(srcDir)) {
133
+ try {
134
+ const entries = await readdir(srcDir, { withFileTypes: true });
135
+ for (const e of entries.slice(0, 10)) {
136
+ if (e.isFile() && CODE_EXTENSIONS.has(extname(e.name))) {
137
+ recentFiles.push(`src/${e.name}`);
138
+ }
139
+ }
140
+ }
141
+ catch (e) {
142
+ logger.debug(`context: cannot read src dir: ${e.message}`);
143
+ }
144
+ }
145
+ return {
146
+ name,
147
+ type,
148
+ language,
149
+ framework,
150
+ rootDir,
151
+ structure: {
152
+ src: await exists(join(rootDir, 'src')) ? './src' : undefined,
153
+ tests: (await exists(join(rootDir, '__tests__'))) ? './__tests__' :
154
+ (await exists(join(rootDir, 'test'))) ? './test' :
155
+ (await exists(join(rootDir, 'tests'))) ? './tests' : undefined,
156
+ docs: await exists(join(rootDir, 'docs')) ? './docs' : undefined,
157
+ config: configFiles,
158
+ },
159
+ dependencies: {
160
+ runtime: runtimeDeps.slice(0, 30),
161
+ dev: devDeps.slice(0, 20),
162
+ },
163
+ stats: { files: fileCount, lines: lineCount },
164
+ recentFiles,
165
+ configFiles,
166
+ };
167
+ }
168
+ export function contextToSystemPrompt(ctx) {
169
+ return `## Project Context
170
+ Name: ${ctx.name}
171
+ Type: ${ctx.type}
172
+ Language: ${ctx.language}
173
+ Framework: ${ctx.framework}
174
+ Stats: ${ctx.stats.files} files, ~${ctx.stats.lines} lines
175
+
176
+ ## Dependencies
177
+ Runtime: ${ctx.dependencies.runtime.slice(0, 15).join(', ') || 'none'}
178
+ Dev: ${ctx.dependencies.dev.slice(0, 10).join(', ') || 'none'}
179
+
180
+ ## Structure
181
+ ${ctx.structure.src ? `Source: ${ctx.structure.src}` : ''}
182
+ ${ctx.structure.tests ? `Tests: ${ctx.structure.tests}` : ''}
183
+ Config files: ${ctx.configFiles.join(', ')}`.trim();
184
+ }
185
+ export async function loadFilesForContext(paths, rootDir, maxTokens = 6000) {
186
+ const result = [];
187
+ let totalTokens = 0;
188
+ for (const p of paths) {
189
+ if (totalTokens >= maxTokens)
190
+ break;
191
+ try {
192
+ const fullPath = join(rootDir, p);
193
+ const content = await readFile(fullPath, 'utf-8');
194
+ const tokens = countTokens(content);
195
+ if (totalTokens + tokens > maxTokens)
196
+ continue;
197
+ result.push({ path: p, content, tokens });
198
+ totalTokens += tokens;
199
+ }
200
+ catch (e) {
201
+ logger.debug(`loadFilesForContext: skipping ${p}: ${e.message}`);
202
+ }
203
+ }
204
+ return result;
205
+ }
206
+ export async function discoverRelevantFiles(query, rootDir, maxFiles = 20) {
207
+ const keywords = query.toLowerCase().split(/\s+/).filter(w => w.length > 3);
208
+ try {
209
+ const allFiles = await glob('**/*.{ts,tsx,js,jsx,py,go,rs,vue,svelte,css,scss}', {
210
+ cwd: rootDir,
211
+ ignore: IGNORE_PATTERNS,
212
+ });
213
+ const scored = allFiles.map(f => {
214
+ const lower = f.toLowerCase();
215
+ let score = 0;
216
+ for (const kw of keywords) {
217
+ if (lower.includes(kw))
218
+ score += 2;
219
+ }
220
+ // Prefer src/ files
221
+ if (lower.startsWith('src/'))
222
+ score += 1;
223
+ return { path: f, score };
224
+ });
225
+ return scored
226
+ .sort((a, b) => b.score - a.score)
227
+ .slice(0, maxFiles)
228
+ .map(f => f.path);
229
+ }
230
+ catch (e) {
231
+ logger.debug(`discoverRelevantFiles: glob failed: ${e.message}`);
232
+ return [];
233
+ }
234
+ }
235
+ //# sourceMappingURL=context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/core/context.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ export interface FileChange {
2
+ path: string;
3
+ content: string;
4
+ originalContent?: string;
5
+ }
6
+ export declare function readProjectFile(path: string, rootDir?: string): Promise<string>;
7
+ export declare function writeProjectFile(path: string, content: string, rootDir?: string): Promise<void>;
8
+ export declare function listDirectory(dirPath: string, rootDir?: string): Promise<Array<{
9
+ name: string;
10
+ type: 'file' | 'dir';
11
+ size?: number;
12
+ }>>;
13
+ export declare function renderDiff(filePath: string, oldContent: string, newContent: string): string;
14
+ export declare function applyFileChanges(changes: FileChange[], rootDir?: string, showDiff?: boolean): Promise<{
15
+ applied: string[];
16
+ skipped: string[];
17
+ }>;
18
+ export declare function extractFileChanges(aiResponse: string): FileChange[];
19
+ export declare function formatFileSize(bytes: number): string;
20
+ //# sourceMappingURL=file-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-manager.d.ts","sourceRoot":"","sources":["../../src/core/file-manager.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAMD,wBAAsB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,SAAgB,GAAG,OAAO,CAAC,MAAM,CAAC,CAG5F;AAED,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,OAAO,SAAgB,GACtB,OAAO,CAAC,IAAI,CAAC,CAQf;AAED,wBAAsB,aAAa,CACjC,OAAO,EAAE,MAAM,EACf,OAAO,SAAgB,GACtB,OAAO,CAAC,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,GAAG,KAAK,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC,CAqBvE;AAED,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAoB3F;AAED,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,UAAU,EAAE,EACrB,OAAO,SAAgB,EACvB,QAAQ,UAAO,GACd,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,EAAE,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CAwBnD;AAID,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,UAAU,EAAE,CAiBnE;AAaD,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAIpD"}
@@ -0,0 +1,133 @@
1
+ import { readFile, writeFile, mkdir, readdir, stat, access } from 'fs/promises';
2
+ import { join, dirname, normalize, extname } from 'path';
3
+ import { createPatch } from 'diff';
4
+ import chalk from 'chalk';
5
+ import { logger } from '../utils/logger.js';
6
+ const MAX_FILE_SIZE = 10 * 1024 * 1024; // 10 MB
7
+ async function exists(p) {
8
+ try {
9
+ await access(p);
10
+ return true;
11
+ }
12
+ catch {
13
+ return false;
14
+ }
15
+ }
16
+ export async function readProjectFile(path, rootDir = process.cwd()) {
17
+ const fullPath = join(rootDir, path);
18
+ return readFile(fullPath, 'utf-8');
19
+ }
20
+ export async function writeProjectFile(path, content, rootDir = process.cwd()) {
21
+ const byteLength = Buffer.byteLength(content, 'utf-8');
22
+ if (byteLength > MAX_FILE_SIZE) {
23
+ throw new Error(`Refusing to write ${path}: content is ${(byteLength / 1024 / 1024).toFixed(1)}MB (limit 10MB)`);
24
+ }
25
+ const fullPath = join(rootDir, path);
26
+ await mkdir(dirname(fullPath), { recursive: true });
27
+ await writeFile(fullPath, content, 'utf-8');
28
+ }
29
+ export async function listDirectory(dirPath, rootDir = process.cwd()) {
30
+ const fullPath = join(rootDir, dirPath);
31
+ const entries = await readdir(fullPath, { withFileTypes: true });
32
+ const result = [];
33
+ for (const e of entries) {
34
+ if (e.name.startsWith('.') && e.name !== '.env.example')
35
+ continue;
36
+ const info = {
37
+ name: e.name,
38
+ type: e.isDirectory() ? 'dir' : 'file',
39
+ };
40
+ if (e.isFile()) {
41
+ try {
42
+ const s = await stat(join(fullPath, e.name));
43
+ info.size = s.size;
44
+ }
45
+ catch (statErr) {
46
+ logger.debug(`listDirectory: stat failed for ${e.name}: ${statErr.message}`);
47
+ }
48
+ }
49
+ result.push(info);
50
+ }
51
+ return result;
52
+ }
53
+ export function renderDiff(filePath, oldContent, newContent) {
54
+ const patch = createPatch(filePath, oldContent, newContent, 'original', 'modified');
55
+ const lines = patch.split('\n');
56
+ const rendered = [];
57
+ for (const line of lines) {
58
+ if (line.startsWith('---') || line.startsWith('+++')) {
59
+ rendered.push(chalk.bold(line));
60
+ }
61
+ else if (line.startsWith('@@')) {
62
+ rendered.push(chalk.cyan(line));
63
+ }
64
+ else if (line.startsWith('+')) {
65
+ rendered.push(chalk.green(line));
66
+ }
67
+ else if (line.startsWith('-')) {
68
+ rendered.push(chalk.red(line));
69
+ }
70
+ else {
71
+ rendered.push(chalk.gray(line));
72
+ }
73
+ }
74
+ return rendered.join('\n');
75
+ }
76
+ export async function applyFileChanges(changes, rootDir = process.cwd(), showDiff = true) {
77
+ const applied = [];
78
+ const skipped = [];
79
+ for (const change of changes) {
80
+ const fullPath = join(rootDir, change.path);
81
+ let originalContent = '';
82
+ if (await exists(fullPath)) {
83
+ originalContent = await readFile(fullPath, 'utf-8');
84
+ }
85
+ if (showDiff) {
86
+ logger.newline();
87
+ logger.bold(`File: ${change.path}`);
88
+ console.log(renderDiff(change.path, originalContent, change.content));
89
+ }
90
+ applied.push(change.path);
91
+ await writeProjectFile(change.path, change.content, rootDir);
92
+ logger.success(`Written: ${change.path}`);
93
+ }
94
+ return { applied, skipped };
95
+ }
96
+ // Extract file changes from AI markdown response
97
+ // Looks for ```lang\n...``` blocks preceded by a filename hint
98
+ export function extractFileChanges(aiResponse) {
99
+ const changes = [];
100
+ // Pattern: optional filename comment before code block
101
+ const pattern = /(?:(?:^|\n)(?:#+\s*)?(?:File|файл)?:?\s*[`]?([^\n`]+)[`]?\s*\n)?```(?:\w+)?\n([\s\S]*?)```/gi;
102
+ let match;
103
+ while ((match = pattern.exec(aiResponse)) !== null) {
104
+ const possiblePath = match[1]?.trim();
105
+ const content = match[2];
106
+ if (possiblePath && isValidFilePath(possiblePath) && content) {
107
+ changes.push({ path: possiblePath, content });
108
+ }
109
+ }
110
+ return changes;
111
+ }
112
+ function isValidFilePath(s) {
113
+ if (!s || s.length > 300)
114
+ return false;
115
+ if (s.includes('\n') || s.includes('\r') || s.includes('\0'))
116
+ return false;
117
+ // Normalize to forward slashes, then check for traversal
118
+ const normalized = normalize(s).replace(/\\/g, '/');
119
+ if (normalized.includes('../') || normalized.startsWith('/'))
120
+ return false;
121
+ // Allow only safe characters (no backslash — normalize already unified them)
122
+ if (!/^[a-zA-Z0-9_\-./]+$/.test(normalized))
123
+ return false;
124
+ return extname(normalized).length > 0;
125
+ }
126
+ export function formatFileSize(bytes) {
127
+ if (bytes < 1024)
128
+ return `${bytes}B`;
129
+ if (bytes < 1024 * 1024)
130
+ return `${(bytes / 1024).toFixed(1)}KB`;
131
+ return `${(bytes / 1024 / 1024).toFixed(1)}MB`;
132
+ }
133
+ //# sourceMappingURL=file-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-manager.js","sourceRoot":"","sources":["../../src/core/file-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ import type { Tool } from './api.js';
2
+ export interface McpServerConfig {
3
+ name: string;
4
+ command: string;
5
+ args?: string[];
6
+ env?: Record<string, string>;
7
+ enabled?: boolean;
8
+ }
9
+ export interface McpTool extends Tool {
10
+ _mcpServer: string;
11
+ _mcpOriginalName: string;
12
+ }
13
+ export declare class McpManager {
14
+ private clients;
15
+ private toolEntries;
16
+ private mcpTools;
17
+ get tools(): McpTool[];
18
+ get isConnected(): boolean;
19
+ connectAll(servers: McpServerConfig[]): Promise<void>;
20
+ connectOne(config: McpServerConfig): Promise<void>;
21
+ call(qualifiedName: string, args: Record<string, unknown>): Promise<string>;
22
+ isMcpTool(name: string): boolean;
23
+ summary(): Array<{
24
+ server: string;
25
+ tools: string[];
26
+ }>;
27
+ disconnectAll(): Promise<void>;
28
+ }
29
+ export declare function getMcpManager(): McpManager;
30
+ export declare function initMcp(servers: McpServerConfig[]): Promise<McpManager>;
31
+ //# sourceMappingURL=mcp.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp.d.ts","sourceRoot":"","sources":["../../src/core/mcp.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;AAIrC,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAGD,MAAM,WAAW,OAAQ,SAAQ,IAAI;IACnC,UAAU,EAAE,MAAM,CAAC;IACnB,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAQD,qBAAa,UAAU;IACrB,OAAO,CAAC,OAAO,CAA6B;IAC5C,OAAO,CAAC,WAAW,CAAgC;IACnD,OAAO,CAAC,QAAQ,CAAiB;IAEjC,IAAI,KAAK,IAAI,OAAO,EAAE,CAErB;IAED,IAAI,WAAW,IAAI,OAAO,CAEzB;IAGK,UAAU,CAAC,OAAO,EAAE,eAAe,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IASrD,UAAU,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC;IAqDlD,IAAI,CAAC,aAAa,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IAsBjF,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAKhC,OAAO,IAAI,KAAK,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;IAS/C,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;CAQrC;AAKD,wBAAgB,aAAa,IAAI,UAAU,CAG1C;AAED,wBAAsB,OAAO,CAAC,OAAO,EAAE,eAAe,EAAE,GAAG,OAAO,CAAC,UAAU,CAAC,CAI7E"}
@@ -0,0 +1,112 @@
1
+ import { Client } from '@modelcontextprotocol/sdk/client/index.js';
2
+ import { StdioClientTransport } from '@modelcontextprotocol/sdk/client/stdio.js';
3
+ import { logger } from '../utils/logger.js';
4
+ import { withTimeout } from '../utils/resilience.js';
5
+ export class McpManager {
6
+ clients = new Map();
7
+ toolEntries = new Map(); // qualifiedName → entry
8
+ mcpTools = [];
9
+ get tools() {
10
+ return this.mcpTools;
11
+ }
12
+ get isConnected() {
13
+ return this.clients.size > 0;
14
+ }
15
+ // Connect to all enabled servers. Non-fatal: logs warnings on failure.
16
+ async connectAll(servers) {
17
+ const enabled = servers.filter(s => s.enabled !== false);
18
+ if (enabled.length === 0)
19
+ return;
20
+ await Promise.allSettled(enabled.map(s => this.connectOne(s)));
21
+ }
22
+ async connectOne(config) {
23
+ try {
24
+ const env = {};
25
+ for (const [k, v] of Object.entries(process.env)) {
26
+ if (v !== undefined)
27
+ env[k] = v;
28
+ }
29
+ // Apply server-specific env, expanding ${VAR} references
30
+ for (const [k, v] of Object.entries(config.env ?? {})) {
31
+ env[k] = v.replace(/\$\{([^}]+)\}/g, (_, name) => process.env[name] ?? '');
32
+ }
33
+ const transport = new StdioClientTransport({
34
+ command: config.command,
35
+ args: config.args ?? [],
36
+ env,
37
+ });
38
+ const client = new Client({ name: 'didev', version: '1.0.0' }, { capabilities: {} });
39
+ await withTimeout(client.connect(transport), 10_000, `MCP connect "${config.name}"`);
40
+ this.clients.set(config.name, client);
41
+ const { tools } = await withTimeout(client.listTools(), 10_000, `MCP listTools "${config.name}"`);
42
+ for (const tool of tools) {
43
+ const qualifiedName = `${config.name}__${tool.name}`;
44
+ this.toolEntries.set(qualifiedName, {
45
+ client,
46
+ originalName: tool.name,
47
+ serverName: config.name,
48
+ });
49
+ this.mcpTools.push({
50
+ type: 'function',
51
+ function: {
52
+ name: qualifiedName,
53
+ description: `[MCP:${config.name}] ${tool.description ?? tool.name}`,
54
+ parameters: (tool.inputSchema ?? { type: 'object', properties: {} }),
55
+ },
56
+ _mcpServer: config.name,
57
+ _mcpOriginalName: tool.name,
58
+ });
59
+ }
60
+ logger.success(`MCP: "${config.name}" connected — ${tools.length} tool(s)`);
61
+ }
62
+ catch (e) {
63
+ logger.warn(`MCP: "${config.name}" failed — ${e.message}`);
64
+ }
65
+ }
66
+ // Call an MCP tool by qualified name (serverName__toolName)
67
+ async call(qualifiedName, args) {
68
+ const entry = this.toolEntries.get(qualifiedName);
69
+ if (!entry)
70
+ throw new Error(`MCP tool not found: ${qualifiedName}`);
71
+ logger.debug(`MCP call: ${qualifiedName}(${JSON.stringify(args)})`);
72
+ const result = await withTimeout(entry.client.callTool({ name: entry.originalName, arguments: args }), 30_000, `MCP tool "${qualifiedName}"`);
73
+ // Flatten mixed content blocks to a string
74
+ const content = Array.isArray(result.content) ? result.content : [];
75
+ return content
76
+ .map((c) => c.type === 'text' ? (c.text ?? '') : JSON.stringify(c))
77
+ .join('\n')
78
+ || '(no output)';
79
+ }
80
+ isMcpTool(name) {
81
+ return this.toolEntries.has(name);
82
+ }
83
+ // Return a human-readable summary for didev mcp list
84
+ summary() {
85
+ const map = new Map();
86
+ for (const [qualName, entry] of this.toolEntries) {
87
+ if (!map.has(entry.serverName))
88
+ map.set(entry.serverName, []);
89
+ map.get(entry.serverName).push(entry.originalName);
90
+ }
91
+ return [...map.entries()].map(([server, tools]) => ({ server, tools }));
92
+ }
93
+ async disconnectAll() {
94
+ await Promise.allSettled([...this.clients.values()].map(c => c.close()));
95
+ this.clients.clear();
96
+ this.toolEntries.clear();
97
+ this.mcpTools = [];
98
+ }
99
+ }
100
+ // Singleton per process — shared between chat and agents in the same session
101
+ let _manager = null;
102
+ export function getMcpManager() {
103
+ if (!_manager)
104
+ _manager = new McpManager();
105
+ return _manager;
106
+ }
107
+ export async function initMcp(servers) {
108
+ const mgr = getMcpManager();
109
+ await mgr.connectAll(servers);
110
+ return mgr;
111
+ }
112
+ //# sourceMappingURL=mcp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp.js","sourceRoot":"","sources":["../../src/core/mcp.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import type { Message } from './api.js';
2
+ export interface Session {
3
+ id: string;
4
+ name: string;
5
+ createdAt: string;
6
+ updatedAt: string;
7
+ messages: Message[];
8
+ contextFiles: string[];
9
+ metadata: Record<string, unknown>;
10
+ }
11
+ export declare function saveSession(session: Session, rootDir?: string): Promise<void>;
12
+ export declare function loadSession(name: string, rootDir?: string): Promise<Session | null>;
13
+ export declare function listSessions(rootDir?: string): Promise<Session[]>;
14
+ export declare function deleteSession(name: string, rootDir?: string): Promise<void>;
15
+ export declare function createSession(name: string, metadata?: Record<string, unknown>): Session;
16
+ //# sourceMappingURL=session.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/core/session.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AAGxC,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC;AAMD,wBAAsB,WAAW,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,SAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAK1F;AAED,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,SAAgB,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAQhG;AAED,wBAAsB,YAAY,CAAC,OAAO,SAAgB,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAkB9E;AAED,wBAAsB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,SAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAGxF;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GAAG,OAAO,CAU3F"}