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,206 @@
1
+ import { logger } from '../utils/logger.js';
2
+ import { withTimeout, retryWithBackoff } from '../utils/resilience.js';
3
+ export class DeepSeekClient {
4
+ apiKey;
5
+ baseUrl;
6
+ defaultModel;
7
+ defaultMaxTokens;
8
+ defaultTemperature;
9
+ constructor(config) {
10
+ this.apiKey = config.apiKey;
11
+ this.baseUrl = config.baseUrl ?? 'https://api.deepseek.com/v1';
12
+ this.defaultModel = config.model ?? 'deepseek-chat';
13
+ this.defaultMaxTokens = config.maxTokens ?? 8192;
14
+ this.defaultTemperature = config.temperature ?? 0.3;
15
+ }
16
+ get headers() {
17
+ return {
18
+ 'Authorization': `Bearer ${this.apiKey}`,
19
+ 'Content-Type': 'application/json',
20
+ };
21
+ }
22
+ async chat(messages, model, options = {}) {
23
+ const body = {
24
+ model: model ?? this.defaultModel,
25
+ messages: messages.map(this.serializeMessage),
26
+ max_tokens: options.maxTokens ?? this.defaultMaxTokens,
27
+ temperature: options.temperature ?? this.defaultTemperature,
28
+ ...(options.tools ? { tools: options.tools, tool_choice: options.toolChoice ?? 'auto' } : {}),
29
+ };
30
+ logger.debug(`POST ${this.baseUrl}/chat/completions model=${body.model} msgs=${messages.length}`);
31
+ const res = await retryWithBackoff(() => withTimeout(fetch(`${this.baseUrl}/chat/completions`, {
32
+ method: 'POST',
33
+ headers: this.headers,
34
+ body: JSON.stringify(body),
35
+ }), 30_000, 'DeepSeek chat'), { maxAttempts: 3, label: 'DeepSeek chat' });
36
+ if (!res.ok) {
37
+ const text = await res.text().catch(() => res.statusText);
38
+ throw new Error(`DeepSeek API error ${res.status}: ${text}`);
39
+ }
40
+ const data = await res.json();
41
+ const choice = data.choices[0];
42
+ return {
43
+ content: choice.message.content ?? '',
44
+ toolCalls: choice.message.tool_calls,
45
+ usage: data.usage
46
+ ? { promptTokens: data.usage.prompt_tokens, completionTokens: data.usage.completion_tokens }
47
+ : undefined,
48
+ };
49
+ }
50
+ async *stream(messages, model, options = {}) {
51
+ const body = {
52
+ model: model ?? this.defaultModel,
53
+ messages: messages.map(this.serializeMessage),
54
+ max_tokens: options.maxTokens ?? this.defaultMaxTokens,
55
+ temperature: options.temperature ?? this.defaultTemperature,
56
+ stream: true,
57
+ };
58
+ const res = await withTimeout(fetch(`${this.baseUrl}/chat/completions`, {
59
+ method: 'POST',
60
+ headers: this.headers,
61
+ body: JSON.stringify(body),
62
+ }), 30_000, 'DeepSeek stream connect');
63
+ if (!res.ok) {
64
+ const text = await res.text().catch(() => res.statusText);
65
+ throw new Error(`DeepSeek API error ${res.status}: ${text}`);
66
+ }
67
+ if (!res.body)
68
+ throw new Error('No response body for streaming');
69
+ const reader = res.body.getReader();
70
+ const decoder = new TextDecoder();
71
+ let buffer = '';
72
+ while (true) {
73
+ const { done, value } = await withTimeout(reader.read(), 60_000, 'Stream chunk');
74
+ if (done)
75
+ break;
76
+ buffer += decoder.decode(value, { stream: true });
77
+ const lines = buffer.split('\n');
78
+ buffer = lines.pop() ?? '';
79
+ for (const line of lines) {
80
+ const trimmed = line.trim();
81
+ if (!trimmed.startsWith('data:'))
82
+ continue;
83
+ const data = trimmed.slice(5).trim();
84
+ if (data === '[DONE]')
85
+ return;
86
+ try {
87
+ const parsed = JSON.parse(data);
88
+ const delta = parsed.choices[0]?.delta?.content;
89
+ if (delta)
90
+ yield delta;
91
+ }
92
+ catch {
93
+ // skip malformed SSE lines
94
+ }
95
+ }
96
+ }
97
+ }
98
+ // Run a tool-calling loop until the model stops requesting tools
99
+ async runToolLoop(messages, tools, executor, model, options = {}, maxRounds = 10) {
100
+ const msgs = [...messages];
101
+ let round = 0;
102
+ while (round < maxRounds) {
103
+ const response = await this.chat(msgs, model, { ...options, tools });
104
+ round++;
105
+ const assistantMsg = {
106
+ role: 'assistant',
107
+ content: response.content,
108
+ tool_calls: response.toolCalls,
109
+ };
110
+ msgs.push(assistantMsg);
111
+ if (!response.toolCalls || response.toolCalls.length === 0) {
112
+ return { messages: msgs, finalContent: response.content };
113
+ }
114
+ for (const tc of response.toolCalls) {
115
+ let result;
116
+ try {
117
+ const args = JSON.parse(tc.function.arguments);
118
+ logger.debug(`Tool call: ${tc.function.name}(${JSON.stringify(args)})`);
119
+ result = await executor(tc.function.name, args);
120
+ }
121
+ catch (e) {
122
+ result = `Error: ${e.message}`;
123
+ }
124
+ msgs.push({
125
+ role: 'tool',
126
+ tool_call_id: tc.id,
127
+ content: result,
128
+ });
129
+ }
130
+ }
131
+ return { messages: msgs, finalContent: msgs[msgs.length - 1]?.content ?? '' };
132
+ }
133
+ // Same as runToolLoop but streams the final (no-tool-call) response via onChunk.
134
+ // Intermediate tool-call rounds use non-streaming; only the last response is streamed.
135
+ async runToolLoopStream(messages, tools, executor, onChunk, onToolCall, model, options = {}, maxRounds = 10) {
136
+ const msgs = [...messages];
137
+ let round = 0;
138
+ while (round < maxRounds) {
139
+ round++;
140
+ // Use non-streaming to detect tool calls
141
+ const probe = await this.chat(msgs, model, { ...options, tools });
142
+ if (!probe.toolCalls || probe.toolCalls.length === 0) {
143
+ // Final response — stream it for real-time output
144
+ let finalContent = '';
145
+ try {
146
+ for await (const chunk of this.stream(msgs, model, options)) {
147
+ finalContent += chunk;
148
+ onChunk(chunk);
149
+ }
150
+ }
151
+ catch {
152
+ // Streaming failed — fall back to already-received content
153
+ finalContent = probe.content;
154
+ onChunk(probe.content);
155
+ }
156
+ const content = finalContent || probe.content;
157
+ msgs.push({ role: 'assistant', content });
158
+ return { messages: msgs, finalContent: content };
159
+ }
160
+ // Has tool calls — execute them (non-streaming)
161
+ msgs.push({
162
+ role: 'assistant',
163
+ content: probe.content,
164
+ tool_calls: probe.toolCalls,
165
+ });
166
+ for (const tc of probe.toolCalls) {
167
+ let result;
168
+ try {
169
+ const args = JSON.parse(tc.function.arguments);
170
+ logger.debug(`Tool call: ${tc.function.name}(${JSON.stringify(args)})`);
171
+ onToolCall?.(tc.function.name);
172
+ result = await executor(tc.function.name, args);
173
+ }
174
+ catch (e) {
175
+ result = `Error: ${e.message}`;
176
+ }
177
+ msgs.push({ role: 'tool', tool_call_id: tc.id, content: result });
178
+ }
179
+ }
180
+ return { messages: msgs, finalContent: msgs[msgs.length - 1]?.content ?? '' };
181
+ }
182
+ serializeMessage(msg) {
183
+ const out = { role: msg.role, content: msg.content };
184
+ if (msg.tool_call_id)
185
+ out['tool_call_id'] = msg.tool_call_id;
186
+ if (msg.tool_calls)
187
+ out['tool_calls'] = msg.tool_calls;
188
+ if (msg.name)
189
+ out['name'] = msg.name;
190
+ return out;
191
+ }
192
+ }
193
+ let _client = null;
194
+ export function getClient(config) {
195
+ if (!_client) {
196
+ if (!config)
197
+ throw new Error('DeepSeek client not initialized');
198
+ _client = new DeepSeekClient(config);
199
+ }
200
+ return _client;
201
+ }
202
+ export function initClient(config) {
203
+ _client = new DeepSeekClient(config);
204
+ return _client;
205
+ }
206
+ //# sourceMappingURL=api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/core/api.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ import type { McpServerConfig } from './mcp.js';
2
+ export type { McpServerConfig };
3
+ export interface DidevConfig {
4
+ api: {
5
+ provider: 'deepseek';
6
+ apiKey: string;
7
+ model: string;
8
+ maxTokens: number;
9
+ temperature: number;
10
+ baseUrl?: string;
11
+ };
12
+ context: {
13
+ maxFiles: number;
14
+ maxTokens: number;
15
+ autoDiscover: boolean;
16
+ excludePatterns: string[];
17
+ };
18
+ agents: {
19
+ family: 'full' | 'light' | 'custom';
20
+ orchestrate: boolean;
21
+ reviewRequired: boolean;
22
+ autoApply: boolean;
23
+ };
24
+ bmad: {
25
+ enabled: boolean;
26
+ templatesPath: string;
27
+ linkIssues: boolean;
28
+ };
29
+ output: {
30
+ style: 'fancy' | 'minimal' | 'json';
31
+ color: boolean;
32
+ saveSessions: boolean;
33
+ };
34
+ mcp: {
35
+ servers: McpServerConfig[];
36
+ };
37
+ }
38
+ export declare function loadConfig(rootDir?: string): Promise<DidevConfig>;
39
+ export declare function saveConfig(config: DidevConfig, rootDir?: string, global?: boolean): Promise<void>;
40
+ export declare function setConfigValue(key: string, value: string, rootDir?: string): Promise<void>;
41
+ export declare function getApiKey(config: DidevConfig): Promise<string>;
42
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAGhD,YAAY,EAAE,eAAe,EAAE,CAAC;AAEhC,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE;QACH,QAAQ,EAAE,UAAU,CAAC;QACrB,MAAM,EAAE,MAAM,CAAC;QACf,KAAK,EAAE,MAAM,CAAC;QACd,SAAS,EAAE,MAAM,CAAC;QAClB,WAAW,EAAE,MAAM,CAAC;QACpB,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,CAAC;IACF,OAAO,EAAE;QACP,QAAQ,EAAE,MAAM,CAAC;QACjB,SAAS,EAAE,MAAM,CAAC;QAClB,YAAY,EAAE,OAAO,CAAC;QACtB,eAAe,EAAE,MAAM,EAAE,CAAC;KAC3B,CAAC;IACF,MAAM,EAAE;QACN,MAAM,EAAE,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAC;QACpC,WAAW,EAAE,OAAO,CAAC;QACrB,cAAc,EAAE,OAAO,CAAC;QACxB,SAAS,EAAE,OAAO,CAAC;KACpB,CAAC;IACF,IAAI,EAAE;QACJ,OAAO,EAAE,OAAO,CAAC;QACjB,aAAa,EAAE,MAAM,CAAC;QACtB,UAAU,EAAE,OAAO,CAAC;KACrB,CAAC;IACF,MAAM,EAAE;QACN,KAAK,EAAE,OAAO,GAAG,SAAS,GAAG,MAAM,CAAC;QACpC,KAAK,EAAE,OAAO,CAAC;QACf,YAAY,EAAE,OAAO,CAAC;KACvB,CAAC;IACF,GAAG,EAAE;QACH,OAAO,EAAE,eAAe,EAAE,CAAC;KAC5B,CAAC;CACH;AAuDD,wBAAsB,UAAU,CAAC,OAAO,SAAgB,GAAG,OAAO,CAAC,WAAW,CAAC,CA8C9E;AAED,wBAAsB,UAAU,CAAC,MAAM,EAAE,WAAW,EAAE,OAAO,SAAgB,EAAE,MAAM,UAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAY5G;AAED,wBAAsB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,SAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAuCvG;AAED,wBAAsB,SAAS,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CAKpE"}
@@ -0,0 +1,180 @@
1
+ import { readFile, writeFile, mkdir, access } from 'fs/promises';
2
+ import { join } from 'path';
3
+ import { homedir } from 'os';
4
+ import yaml from 'js-yaml';
5
+ import { logger } from '../utils/logger.js';
6
+ const DEFAULT_CONFIG = {
7
+ api: {
8
+ provider: 'deepseek',
9
+ apiKey: '',
10
+ model: 'deepseek-v4-flash', // deepseek-chat alias, context: 1M, max output: 384K
11
+ maxTokens: 32768,
12
+ temperature: 0.3,
13
+ baseUrl: 'https://api.deepseek.com/v1',
14
+ },
15
+ context: {
16
+ maxFiles: 100,
17
+ maxTokens: 128000, // 1M context window — можно передавать гораздо больше
18
+ autoDiscover: true,
19
+ excludePatterns: ['node_modules/**', 'dist/**', '.git/**', '*.lock', '*.min.js'],
20
+ },
21
+ agents: {
22
+ family: 'full',
23
+ orchestrate: true,
24
+ reviewRequired: true,
25
+ autoApply: false,
26
+ },
27
+ bmad: {
28
+ enabled: true,
29
+ templatesPath: '.didev/bmad/templates',
30
+ linkIssues: false,
31
+ },
32
+ output: {
33
+ style: 'fancy',
34
+ color: true,
35
+ saveSessions: true,
36
+ },
37
+ mcp: {
38
+ servers: [],
39
+ },
40
+ };
41
+ function configPath(rootDir = process.cwd()) {
42
+ return join(rootDir, '.didev', 'config.yaml');
43
+ }
44
+ // Global config stored in user home dir
45
+ function globalConfigPath() {
46
+ return join(homedir(), '.didev', 'config.yaml');
47
+ }
48
+ async function exists(p) {
49
+ try {
50
+ await access(p);
51
+ return true;
52
+ }
53
+ catch {
54
+ return false;
55
+ }
56
+ }
57
+ function isPlaceholderKey(key) {
58
+ return !key || key.startsWith('${') || key.trim() === '';
59
+ }
60
+ export async function loadConfig(rootDir = process.cwd()) {
61
+ const localPath = configPath(rootDir);
62
+ const globalPath = globalConfigPath();
63
+ let config = structuredClone(DEFAULT_CONFIG);
64
+ let globalApiKey = '';
65
+ // Load global config first
66
+ if (await exists(globalPath)) {
67
+ try {
68
+ const text = await readFile(globalPath, 'utf-8');
69
+ const loaded = yaml.load(text);
70
+ // Preserve real API key from global config before local can override it
71
+ if (!isPlaceholderKey(loaded?.api?.apiKey)) {
72
+ globalApiKey = loaded.api.apiKey;
73
+ }
74
+ config = deepMerge(config, loaded);
75
+ }
76
+ catch (e) {
77
+ logger.warn(`Config parse error in ${globalPath}: ${e.message}`);
78
+ }
79
+ }
80
+ // Load local config (may contain placeholder for apiKey — handled below)
81
+ if (await exists(localPath)) {
82
+ try {
83
+ const text = await readFile(localPath, 'utf-8');
84
+ const loaded = yaml.load(text);
85
+ config = deepMerge(config, loaded);
86
+ }
87
+ catch (e) {
88
+ logger.warn(`Config parse error in ${localPath}: ${e.message}`);
89
+ }
90
+ }
91
+ // If local config replaced a real key with a placeholder, restore the global key
92
+ if (isPlaceholderKey(config.api.apiKey) && globalApiKey) {
93
+ config.api.apiKey = globalApiKey;
94
+ }
95
+ // Environment variables always take highest priority
96
+ const envKey = process.env['DEEPSEEK_API_KEY'];
97
+ if (envKey)
98
+ config.api.apiKey = envKey;
99
+ const envModel = process.env['DEEPSEEK_MODEL'];
100
+ if (envModel)
101
+ config.api.model = envModel;
102
+ return config;
103
+ }
104
+ export async function saveConfig(config, rootDir = process.cwd(), global = false) {
105
+ const path = global ? globalConfigPath() : configPath(rootDir);
106
+ await mkdir(join(path, '..'), { recursive: true });
107
+ // Never save API key to file — use env vars
108
+ const toSave = structuredClone(config);
109
+ if (toSave.api.apiKey && !global) {
110
+ toSave.api.apiKey = '${DEEPSEEK_API_KEY}';
111
+ }
112
+ const text = yaml.dump(toSave, { indent: 2, lineWidth: 100 });
113
+ await writeFile(path, text, 'utf-8');
114
+ }
115
+ export async function setConfigValue(key, value, rootDir = process.cwd()) {
116
+ const config = await loadConfig(rootDir);
117
+ // Special handling for API key — save to global config
118
+ if (key === 'DEEPSEEK_API_KEY' || key === 'api.apiKey') {
119
+ const globalPath = globalConfigPath();
120
+ await mkdir(join(globalPath, '..'), { recursive: true });
121
+ let globalConfig = structuredClone(DEFAULT_CONFIG);
122
+ if (await exists(globalPath)) {
123
+ try {
124
+ const text = await readFile(globalPath, 'utf-8');
125
+ globalConfig = deepMerge(globalConfig, yaml.load(text));
126
+ }
127
+ catch (e) {
128
+ logger.warn(`Global config parse error: ${e.message}`);
129
+ }
130
+ }
131
+ globalConfig.api.apiKey = value;
132
+ const text = yaml.dump(globalConfig, { indent: 2 });
133
+ await writeFile(globalPath, text, 'utf-8');
134
+ return;
135
+ }
136
+ // Set nested key like "api.model" or "agents.autoApply"
137
+ const parts = key.split('.');
138
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
139
+ let obj = config;
140
+ for (let i = 0; i < parts.length - 1; i++) {
141
+ if (obj[parts[i]] === undefined)
142
+ obj[parts[i]] = {};
143
+ obj = obj[parts[i]];
144
+ }
145
+ const last = parts[parts.length - 1];
146
+ // Type coercion — only convert to number if the entire string is numeric
147
+ if (value === 'true')
148
+ obj[last] = true;
149
+ else if (value === 'false')
150
+ obj[last] = false;
151
+ else if (value !== '' && !isNaN(Number(value)) && String(Number(value)) === value)
152
+ obj[last] = Number(value);
153
+ else
154
+ obj[last] = value;
155
+ await saveConfig(config, rootDir);
156
+ }
157
+ export async function getApiKey(config) {
158
+ if (config.api.apiKey && config.api.apiKey !== '${DEEPSEEK_API_KEY}') {
159
+ return config.api.apiKey;
160
+ }
161
+ return process.env['DEEPSEEK_API_KEY'] ?? '';
162
+ }
163
+ function deepMerge(target, source) {
164
+ if (!source)
165
+ return target;
166
+ const result = { ...target };
167
+ for (const key of Object.keys(source)) {
168
+ const sv = source[key];
169
+ const tv = target[key];
170
+ if (sv && typeof sv === 'object' && !Array.isArray(sv) &&
171
+ tv && typeof tv === 'object' && !Array.isArray(tv)) {
172
+ result[key] = deepMerge(tv, sv);
173
+ }
174
+ else if (sv !== undefined) {
175
+ result[key] = sv;
176
+ }
177
+ }
178
+ return result;
179
+ }
180
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ export interface ProjectContext {
2
+ name: string;
3
+ type: 'frontend' | 'backend' | 'fullstack' | 'mobile' | 'library' | 'unknown';
4
+ language: string;
5
+ framework: string;
6
+ rootDir: string;
7
+ structure: {
8
+ src?: string;
9
+ tests?: string;
10
+ docs?: string;
11
+ config: string[];
12
+ };
13
+ dependencies: {
14
+ runtime: string[];
15
+ dev: string[];
16
+ };
17
+ stats: {
18
+ files: number;
19
+ lines: number;
20
+ };
21
+ recentFiles: string[];
22
+ configFiles: string[];
23
+ }
24
+ export interface FileContext {
25
+ path: string;
26
+ content: string;
27
+ tokens: number;
28
+ }
29
+ export declare function collectProjectContext(rootDir?: string): Promise<ProjectContext>;
30
+ export declare function contextToSystemPrompt(ctx: ProjectContext): string;
31
+ export declare function loadFilesForContext(paths: string[], rootDir: string, maxTokens?: number): Promise<FileContext[]>;
32
+ export declare function discoverRelevantFiles(query: string, rootDir: string, maxFiles?: number): Promise<string[]>;
33
+ //# sourceMappingURL=context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/core/context.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,UAAU,GAAG,SAAS,GAAG,WAAW,GAAG,QAAQ,GAAG,SAAS,GAAG,SAAS,CAAC;IAC9E,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE;QACT,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,EAAE,CAAC;KAClB,CAAC;IACF,YAAY,EAAE;QACZ,OAAO,EAAE,MAAM,EAAE,CAAC;QAClB,GAAG,EAAE,MAAM,EAAE,CAAC;KACf,CAAC;IACF,KAAK,EAAE;QACL,KAAK,EAAE,MAAM,CAAC;QACd,KAAK,EAAE,MAAM,CAAC;KACf,CAAC;IACF,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;CAChB;AA6BD,wBAAsB,qBAAqB,CAAC,OAAO,SAAgB,GAAG,OAAO,CAAC,cAAc,CAAC,CAwH5F;AAED,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,cAAc,GAAG,MAAM,CAgBjE;AAED,wBAAsB,mBAAmB,CACvC,KAAK,EAAE,MAAM,EAAE,EACf,OAAO,EAAE,MAAM,EACf,SAAS,SAAO,GACf,OAAO,CAAC,WAAW,EAAE,CAAC,CAmBxB;AAED,wBAAsB,qBAAqB,CACzC,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EACf,QAAQ,SAAK,GACZ,OAAO,CAAC,MAAM,EAAE,CAAC,CA4BnB"}