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.
- package/README.md +378 -0
- package/dist/agents/analyst.d.ts +21 -0
- package/dist/agents/analyst.d.ts.map +1 -0
- package/dist/agents/analyst.js +69 -0
- package/dist/agents/analyst.js.map +1 -0
- package/dist/agents/architect.d.ts +21 -0
- package/dist/agents/architect.d.ts.map +1 -0
- package/dist/agents/architect.js +85 -0
- package/dist/agents/architect.js.map +1 -0
- package/dist/agents/base-agent.d.ts +56 -0
- package/dist/agents/base-agent.d.ts.map +1 -0
- package/dist/agents/base-agent.js +263 -0
- package/dist/agents/base-agent.js.map +1 -0
- package/dist/agents/developer.d.ts +21 -0
- package/dist/agents/developer.d.ts.map +1 -0
- package/dist/agents/developer.js +87 -0
- package/dist/agents/developer.js.map +1 -0
- package/dist/agents/orchestrator.d.ts +23 -0
- package/dist/agents/orchestrator.d.ts.map +1 -0
- package/dist/agents/orchestrator.js +287 -0
- package/dist/agents/orchestrator.js.map +1 -0
- package/dist/agents/reviewer.d.ts +15 -0
- package/dist/agents/reviewer.d.ts.map +1 -0
- package/dist/agents/reviewer.js +65 -0
- package/dist/agents/reviewer.js.map +1 -0
- package/dist/agents/tester.d.ts +15 -0
- package/dist/agents/tester.d.ts.map +1 -0
- package/dist/agents/tester.js +64 -0
- package/dist/agents/tester.js.map +1 -0
- package/dist/bmad/method.d.ts +6 -0
- package/dist/bmad/method.d.ts.map +1 -0
- package/dist/bmad/method.js +221 -0
- package/dist/bmad/method.js.map +1 -0
- package/dist/cli/commands/agent.d.ts +10 -0
- package/dist/cli/commands/agent.d.ts.map +1 -0
- package/dist/cli/commands/agent.js +28 -0
- package/dist/cli/commands/agent.js.map +1 -0
- package/dist/cli/commands/chat.d.ts +6 -0
- package/dist/cli/commands/chat.d.ts.map +1 -0
- package/dist/cli/commands/chat.js +556 -0
- package/dist/cli/commands/chat.js.map +1 -0
- package/dist/cli/commands/config.d.ts +3 -0
- package/dist/cli/commands/config.d.ts.map +1 -0
- package/dist/cli/commands/config.js +65 -0
- package/dist/cli/commands/config.js.map +1 -0
- package/dist/cli/commands/init.d.ts +8 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +204 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/mcp.d.ts +5 -0
- package/dist/cli/commands/mcp.d.ts.map +1 -0
- package/dist/cli/commands/mcp.js +836 -0
- package/dist/cli/commands/mcp.js.map +1 -0
- package/dist/cli/commands/refactor.d.ts +8 -0
- package/dist/cli/commands/refactor.d.ts.map +1 -0
- package/dist/cli/commands/refactor.js +161 -0
- package/dist/cli/commands/refactor.js.map +1 -0
- package/dist/cli/commands/review.d.ts +9 -0
- package/dist/cli/commands/review.d.ts.map +1 -0
- package/dist/cli/commands/review.js +138 -0
- package/dist/cli/commands/review.js.map +1 -0
- package/dist/core/api.d.ts +73 -0
- package/dist/core/api.d.ts.map +1 -0
- package/dist/core/api.js +206 -0
- package/dist/core/api.js.map +1 -0
- package/dist/core/config.d.ts +42 -0
- package/dist/core/config.d.ts.map +1 -0
- package/dist/core/config.js +180 -0
- package/dist/core/config.js.map +1 -0
- package/dist/core/context.d.ts +33 -0
- package/dist/core/context.d.ts.map +1 -0
- package/dist/core/context.js +235 -0
- package/dist/core/context.js.map +1 -0
- package/dist/core/file-manager.d.ts +20 -0
- package/dist/core/file-manager.d.ts.map +1 -0
- package/dist/core/file-manager.js +133 -0
- package/dist/core/file-manager.js.map +1 -0
- package/dist/core/mcp.d.ts +31 -0
- package/dist/core/mcp.d.ts.map +1 -0
- package/dist/core/mcp.js +112 -0
- package/dist/core/mcp.js.map +1 -0
- package/dist/core/session.d.ts +16 -0
- package/dist/core/session.d.ts.map +1 -0
- package/dist/core/session.js +60 -0
- package/dist/core/session.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +237 -0
- package/dist/index.js.map +1 -0
- package/dist/utils/banner.d.ts +2 -0
- package/dist/utils/banner.d.ts.map +1 -0
- package/dist/utils/banner.js +50 -0
- package/dist/utils/banner.js.map +1 -0
- package/dist/utils/git.d.ts +9 -0
- package/dist/utils/git.d.ts.map +1 -0
- package/dist/utils/git.js +49 -0
- package/dist/utils/git.js.map +1 -0
- package/dist/utils/logger.d.ts +42 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +98 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/resilience.d.ts +17 -0
- package/dist/utils/resilience.d.ts.map +1 -0
- package/dist/utils/resilience.js +41 -0
- package/dist/utils/resilience.js.map +1 -0
- package/dist/utils/token-counter.d.ts +7 -0
- package/dist/utils/token-counter.d.ts.map +1 -0
- package/dist/utils/token-counter.js +20 -0
- package/dist/utils/token-counter.js.map +1 -0
- package/package.json +62 -0
- package/scripts/postinstall.mjs +54 -0
- package/scripts/setup-path.sh +42 -0
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { readFile, writeFile, mkdir, readdir, rm } from 'fs/promises';
|
|
2
|
+
import { join } from 'path';
|
|
3
|
+
import { logger } from '../utils/logger.js';
|
|
4
|
+
function sessionsDir(rootDir = process.cwd()) {
|
|
5
|
+
return join(rootDir, '.didev', 'sessions');
|
|
6
|
+
}
|
|
7
|
+
export async function saveSession(session, rootDir = process.cwd()) {
|
|
8
|
+
const dir = sessionsDir(rootDir);
|
|
9
|
+
await mkdir(dir, { recursive: true });
|
|
10
|
+
const path = join(dir, `${session.name}.json`);
|
|
11
|
+
await writeFile(path, JSON.stringify(session, null, 2), 'utf-8');
|
|
12
|
+
}
|
|
13
|
+
export async function loadSession(name, rootDir = process.cwd()) {
|
|
14
|
+
try {
|
|
15
|
+
const path = join(sessionsDir(rootDir), `${name}.json`);
|
|
16
|
+
const text = await readFile(path, 'utf-8');
|
|
17
|
+
return JSON.parse(text);
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
return null;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
export async function listSessions(rootDir = process.cwd()) {
|
|
24
|
+
try {
|
|
25
|
+
const dir = sessionsDir(rootDir);
|
|
26
|
+
const files = await readdir(dir);
|
|
27
|
+
const sessions = [];
|
|
28
|
+
for (const f of files) {
|
|
29
|
+
if (!f.endsWith('.json'))
|
|
30
|
+
continue;
|
|
31
|
+
try {
|
|
32
|
+
const text = await readFile(join(dir, f), 'utf-8');
|
|
33
|
+
sessions.push(JSON.parse(text));
|
|
34
|
+
}
|
|
35
|
+
catch (e) {
|
|
36
|
+
logger.debug(`session: skipping malformed session ${f}: ${e.message}`);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
return sessions.sort((a, b) => new Date(b.updatedAt).getTime() - new Date(a.updatedAt).getTime());
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
return [];
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
export async function deleteSession(name, rootDir = process.cwd()) {
|
|
46
|
+
const path = join(sessionsDir(rootDir), `${name}.json`);
|
|
47
|
+
await rm(path, { force: true });
|
|
48
|
+
}
|
|
49
|
+
export function createSession(name, metadata = {}) {
|
|
50
|
+
return {
|
|
51
|
+
id: `${Date.now()}-${Math.random().toString(36).slice(2, 8)}`,
|
|
52
|
+
name,
|
|
53
|
+
createdAt: new Date().toISOString(),
|
|
54
|
+
updatedAt: new Date().toISOString(),
|
|
55
|
+
messages: [],
|
|
56
|
+
contextFiles: [],
|
|
57
|
+
metadata,
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=session.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/core/session.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,eAAe,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,237 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import 'dotenv/config';
|
|
3
|
+
import { Command } from 'commander';
|
|
4
|
+
import chalk from 'chalk';
|
|
5
|
+
import { printBanner } from './utils/banner.js';
|
|
6
|
+
const program = new Command();
|
|
7
|
+
program
|
|
8
|
+
.name('didev')
|
|
9
|
+
.description('AI-powered development CLI using DeepSeek API')
|
|
10
|
+
.version('1.0.0')
|
|
11
|
+
.addHelpText('after', `
|
|
12
|
+
${chalk.bold('Examples:')}
|
|
13
|
+
${chalk.cyan('didev init')} Initialize didev in current project
|
|
14
|
+
${chalk.cyan('didev config set DEEPSEEK_API_KEY=sk-x')} Set API key
|
|
15
|
+
${chalk.cyan('didev chat')} Start AI chat with project context
|
|
16
|
+
${chalk.cyan('didev agent "Add user auth via JWT"')} Run AI agent family
|
|
17
|
+
${chalk.cyan('didev review')} Review changed files
|
|
18
|
+
${chalk.cyan('didev refactor "Extract service layer"')} Refactor code
|
|
19
|
+
${chalk.cyan('didev bmad epic')} Create BMad epic
|
|
20
|
+
`);
|
|
21
|
+
// ── init ──────────────────────────────────────────────────────────────────────
|
|
22
|
+
program
|
|
23
|
+
.command('init')
|
|
24
|
+
.description('Initialize didev in the current project')
|
|
25
|
+
.option('--frontend', 'Configure as frontend project')
|
|
26
|
+
.option('--backend', 'Configure as backend project')
|
|
27
|
+
.option('--fullstack', 'Configure as fullstack project')
|
|
28
|
+
.option('-y, --yes', 'Skip interactive prompts')
|
|
29
|
+
.action(async (opts) => {
|
|
30
|
+
const { runInit } = await import('./cli/commands/init.js');
|
|
31
|
+
await runInit(opts);
|
|
32
|
+
});
|
|
33
|
+
// ── config ────────────────────────────────────────────────────────────────────
|
|
34
|
+
const configCmd = program
|
|
35
|
+
.command('config')
|
|
36
|
+
.description('Manage didev configuration');
|
|
37
|
+
configCmd
|
|
38
|
+
.command('set <assignment>')
|
|
39
|
+
.description('Set a config value (e.g. DEEPSEEK_API_KEY=sk-xxx or api.model=deepseek-reasoner)')
|
|
40
|
+
.action(async (assignment) => {
|
|
41
|
+
const { runConfigSet } = await import('./cli/commands/config.js');
|
|
42
|
+
await runConfigSet(assignment);
|
|
43
|
+
});
|
|
44
|
+
configCmd
|
|
45
|
+
.command('show')
|
|
46
|
+
.description('Show current configuration')
|
|
47
|
+
.action(async () => {
|
|
48
|
+
const { runConfigShow } = await import('./cli/commands/config.js');
|
|
49
|
+
await runConfigShow();
|
|
50
|
+
});
|
|
51
|
+
// Default config action — show if no subcommand
|
|
52
|
+
configCmd.action(async () => {
|
|
53
|
+
const { runConfigShow } = await import('./cli/commands/config.js');
|
|
54
|
+
await runConfigShow();
|
|
55
|
+
});
|
|
56
|
+
// ── chat ──────────────────────────────────────────────────────────────────────
|
|
57
|
+
program
|
|
58
|
+
.command('chat')
|
|
59
|
+
.description('Interactive AI chat with project context')
|
|
60
|
+
.option('-m, --model <model>', 'Model: deepseek-v4-flash (default) | deepseek-v4-pro (thinking)')
|
|
61
|
+
.option('-f, --file <path>', 'Add a specific file to the initial context')
|
|
62
|
+
.action(async (opts) => {
|
|
63
|
+
const { runChat } = await import('./cli/commands/chat.js');
|
|
64
|
+
await runChat(opts);
|
|
65
|
+
});
|
|
66
|
+
// ── agent ─────────────────────────────────────────────────────────────────────
|
|
67
|
+
program
|
|
68
|
+
.command('agent [task]')
|
|
69
|
+
.description('Run AI agent family to complete a development task')
|
|
70
|
+
.option('-t, --type <family>', 'Agent family: frontend | backend | fullstack | auto', 'auto')
|
|
71
|
+
.option('-m, --model <model>', 'Model to use')
|
|
72
|
+
.option('--mode <mode>', 'Orchestration mode: full | light | developer-only', 'full')
|
|
73
|
+
.option('--skip <agents>', 'Comma-separated list of agents to skip')
|
|
74
|
+
.option('--orchestrate', 'Enter interactive task mode')
|
|
75
|
+
.action(async (task, opts) => {
|
|
76
|
+
const { runAgentCommand } = await import('./cli/commands/agent.js');
|
|
77
|
+
await runAgentCommand(task, opts);
|
|
78
|
+
});
|
|
79
|
+
// ── review ────────────────────────────────────────────────────────────────────
|
|
80
|
+
program
|
|
81
|
+
.command('review')
|
|
82
|
+
.description('AI-powered code review')
|
|
83
|
+
.option('-a, --all', 'Review all source files')
|
|
84
|
+
.option('-f, --file <path>', 'Review a specific file')
|
|
85
|
+
.option('--pr', 'Review PR diff vs main branch')
|
|
86
|
+
.option('-m, --model <model>', 'Model to use')
|
|
87
|
+
.option('--no-save', 'Do not save review report')
|
|
88
|
+
.action(async (opts) => {
|
|
89
|
+
const { runReview } = await import('./cli/commands/review.js');
|
|
90
|
+
await runReview(opts);
|
|
91
|
+
});
|
|
92
|
+
// ── refactor ──────────────────────────────────────────────────────────────────
|
|
93
|
+
program
|
|
94
|
+
.command('refactor [instruction]')
|
|
95
|
+
.description('AI-powered refactoring')
|
|
96
|
+
.option('--auto', 'Automatically detect and fix refactoring opportunities')
|
|
97
|
+
.option('--dry-run', 'Preview changes without applying')
|
|
98
|
+
.option('-f, --file <path>', 'Refactor a specific file')
|
|
99
|
+
.option('-m, --model <model>', 'Model to use')
|
|
100
|
+
.action(async (instruction, opts) => {
|
|
101
|
+
const { runRefactor } = await import('./cli/commands/refactor.js');
|
|
102
|
+
await runRefactor(instruction, opts);
|
|
103
|
+
});
|
|
104
|
+
// ── bmad ──────────────────────────────────────────────────────────────────────
|
|
105
|
+
const bmadCmd = program
|
|
106
|
+
.command('bmad')
|
|
107
|
+
.description('BMad Method — Behavior-Motivated Agile Development');
|
|
108
|
+
bmadCmd
|
|
109
|
+
.command('init')
|
|
110
|
+
.description('Initialize BMad in the current project')
|
|
111
|
+
.action(async () => {
|
|
112
|
+
const { runBmadInit } = await import('./bmad/method.js');
|
|
113
|
+
await runBmadInit();
|
|
114
|
+
});
|
|
115
|
+
bmadCmd
|
|
116
|
+
.command('epic')
|
|
117
|
+
.description('Create a new BMad epic')
|
|
118
|
+
.action(async () => {
|
|
119
|
+
const { runBmadEpic } = await import('./bmad/method.js');
|
|
120
|
+
await runBmadEpic();
|
|
121
|
+
});
|
|
122
|
+
bmadCmd
|
|
123
|
+
.command('story')
|
|
124
|
+
.description('Create a user story from an epic')
|
|
125
|
+
.action(async () => {
|
|
126
|
+
const { runBmadStory } = await import('./bmad/method.js');
|
|
127
|
+
await runBmadStory();
|
|
128
|
+
});
|
|
129
|
+
bmadCmd
|
|
130
|
+
.command('implement')
|
|
131
|
+
.description('Implement the current story using AI agents')
|
|
132
|
+
.option('--story <id>', 'Story ID to implement')
|
|
133
|
+
.action(async (opts) => {
|
|
134
|
+
const { runBmadImplement } = await import('./bmad/method.js');
|
|
135
|
+
await runBmadImplement(opts.story);
|
|
136
|
+
});
|
|
137
|
+
bmadCmd
|
|
138
|
+
.command('review')
|
|
139
|
+
.description('Review the implementation of current story')
|
|
140
|
+
.action(async () => {
|
|
141
|
+
const { runBmadReview } = await import('./bmad/method.js');
|
|
142
|
+
await runBmadReview();
|
|
143
|
+
});
|
|
144
|
+
// ── mcp ───────────────────────────────────────────────────────────────────────
|
|
145
|
+
const mcpCmd = program
|
|
146
|
+
.command('mcp')
|
|
147
|
+
.description('Manage MCP (Model Context Protocol) servers');
|
|
148
|
+
mcpCmd
|
|
149
|
+
.command('list')
|
|
150
|
+
.description('Show configured MCP servers')
|
|
151
|
+
.action(async () => {
|
|
152
|
+
const { runMcpList } = await import('./cli/commands/mcp.js');
|
|
153
|
+
await runMcpList();
|
|
154
|
+
});
|
|
155
|
+
mcpCmd
|
|
156
|
+
.command('add [url]')
|
|
157
|
+
.description('Add MCP server from URL (GitHub/GitLab/npm) or interactive wizard')
|
|
158
|
+
.action(async (url) => {
|
|
159
|
+
const { runMcpAdd } = await import('./cli/commands/mcp.js');
|
|
160
|
+
await runMcpAdd(url);
|
|
161
|
+
});
|
|
162
|
+
mcpCmd
|
|
163
|
+
.command('test [server]')
|
|
164
|
+
.description('Test connection to MCP server(s)')
|
|
165
|
+
.action(async (server) => {
|
|
166
|
+
const { runMcpTest } = await import('./cli/commands/mcp.js');
|
|
167
|
+
await runMcpTest(server);
|
|
168
|
+
});
|
|
169
|
+
mcpCmd
|
|
170
|
+
.command('remove <server>')
|
|
171
|
+
.description('Remove an MCP server from config')
|
|
172
|
+
.action(async (server) => {
|
|
173
|
+
const { runMcpRemove } = await import('./cli/commands/mcp.js');
|
|
174
|
+
await runMcpRemove(server);
|
|
175
|
+
});
|
|
176
|
+
// Default mcp action
|
|
177
|
+
mcpCmd.action(async () => {
|
|
178
|
+
const { runMcpList } = await import('./cli/commands/mcp.js');
|
|
179
|
+
await runMcpList();
|
|
180
|
+
});
|
|
181
|
+
// ── error handling ────────────────────────────────────────────────────────────
|
|
182
|
+
program.on('command:*', (operands) => {
|
|
183
|
+
console.error(chalk.red(`Unknown command: ${operands[0]}`));
|
|
184
|
+
console.log(`Run ${chalk.cyan('didev --help')} for available commands`);
|
|
185
|
+
process.exit(1);
|
|
186
|
+
});
|
|
187
|
+
process.on('uncaughtException', (err) => {
|
|
188
|
+
console.error(chalk.red('Fatal error:'), err.message);
|
|
189
|
+
if (process.env['DIDEV_DEBUG'])
|
|
190
|
+
console.error(err.stack);
|
|
191
|
+
process.exit(1);
|
|
192
|
+
});
|
|
193
|
+
process.on('unhandledRejection', (reason) => {
|
|
194
|
+
if (reason instanceof Error) {
|
|
195
|
+
console.error(chalk.red('Error:'), reason.message);
|
|
196
|
+
if (process.env['DIDEV_DEBUG'])
|
|
197
|
+
console.error(reason.stack);
|
|
198
|
+
}
|
|
199
|
+
else {
|
|
200
|
+
console.error(chalk.red('Error:'), reason);
|
|
201
|
+
}
|
|
202
|
+
process.exit(1);
|
|
203
|
+
});
|
|
204
|
+
// ── graceful shutdown ─────────────────────────────────────────────────────────
|
|
205
|
+
let _shuttingDown = false;
|
|
206
|
+
async function gracefulShutdown(signal) {
|
|
207
|
+
if (_shuttingDown)
|
|
208
|
+
return;
|
|
209
|
+
_shuttingDown = true;
|
|
210
|
+
try {
|
|
211
|
+
const { getMcpManager } = await import('./core/mcp.js');
|
|
212
|
+
// Give MCP servers 5s to disconnect, then force exit
|
|
213
|
+
await Promise.race([
|
|
214
|
+
getMcpManager().disconnectAll(),
|
|
215
|
+
new Promise(r => setTimeout(r, 5_000)),
|
|
216
|
+
]);
|
|
217
|
+
}
|
|
218
|
+
catch { /* ignore cleanup errors */ }
|
|
219
|
+
process.exit(signal === 'SIGINT' ? 130 : 0);
|
|
220
|
+
}
|
|
221
|
+
process.on('SIGTERM', () => { void gracefulShutdown('SIGTERM'); });
|
|
222
|
+
process.on('SIGINT', () => { void gracefulShutdown('SIGINT'); });
|
|
223
|
+
const _rawArgs = process.argv.slice(2);
|
|
224
|
+
// Show banner only for subcommands (not for bare invocation or --version)
|
|
225
|
+
const _isVersionFlag = _rawArgs.includes('--version') || _rawArgs.includes('-V');
|
|
226
|
+
const _isBareInvocation = _rawArgs.length === 0;
|
|
227
|
+
if (!_isVersionFlag && !_isBareInvocation) {
|
|
228
|
+
printBanner('1.0.0');
|
|
229
|
+
}
|
|
230
|
+
// Bare `didev` (no args) → open interactive shell immediately
|
|
231
|
+
if (_isBareInvocation) {
|
|
232
|
+
const { runChat } = await import('./cli/commands/chat.js');
|
|
233
|
+
await runChat();
|
|
234
|
+
process.exit(0);
|
|
235
|
+
}
|
|
236
|
+
program.parse();
|
|
237
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"banner.d.ts","sourceRoot":"","sources":["../../src/utils/banner.ts"],"names":[],"mappings":"AAkCA,wBAAgB,WAAW,CAAC,OAAO,SAAU,GAAG,IAAI,CAiCnD"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
const ART = [
|
|
3
|
+
' ██████╗ ██╗██████╗ ███████╗██╗ ██╗',
|
|
4
|
+
' ██╔══██╗██║██╔══██╗██╔════╝██║ ██║',
|
|
5
|
+
' ██║ ██║██║██║ ██║█████╗ ╚██╗ ██╔╝',
|
|
6
|
+
' ██║ ██║██║██║ ██║██╔══╝ ╚████╔╝ ',
|
|
7
|
+
' ██████╔╝██║██████╔╝███████╗ ╚██╔╝ ',
|
|
8
|
+
' ╚═════╝ ╚═╝╚═════╝ ╚══════╝ ╚═╝ ',
|
|
9
|
+
];
|
|
10
|
+
// Purple → Electric Cyan gradient (top → bottom)
|
|
11
|
+
const GRAD = [
|
|
12
|
+
chalk.hex('#CF00FF'),
|
|
13
|
+
chalk.hex('#9922FF'),
|
|
14
|
+
chalk.hex('#5555FF'),
|
|
15
|
+
chalk.hex('#2288FF'),
|
|
16
|
+
chalk.hex('#00BBFF'),
|
|
17
|
+
chalk.hex('#00EEFF'),
|
|
18
|
+
];
|
|
19
|
+
const TAGLINES = [
|
|
20
|
+
'Ship features at the speed of thought',
|
|
21
|
+
'Your AI agent family is ready to code',
|
|
22
|
+
'From idea to PR in one command',
|
|
23
|
+
'Powered by DeepSeek · Built for devs',
|
|
24
|
+
'Architect · Develop · Review · Repeat',
|
|
25
|
+
];
|
|
26
|
+
function center(str, width) {
|
|
27
|
+
const pad = Math.max(0, Math.floor((width - str.length) / 2));
|
|
28
|
+
return ' '.repeat(pad) + str;
|
|
29
|
+
}
|
|
30
|
+
export function printBanner(version = '1.0.0') {
|
|
31
|
+
const width = ART[0].length;
|
|
32
|
+
const tagline = TAGLINES[Math.floor(Date.now() / 1000) % TAGLINES.length];
|
|
33
|
+
process.stdout.write('\n');
|
|
34
|
+
for (let i = 0; i < ART.length; i++) {
|
|
35
|
+
process.stdout.write(GRAD[i](ART[i]) + '\n');
|
|
36
|
+
}
|
|
37
|
+
process.stdout.write('\n');
|
|
38
|
+
// Tagline
|
|
39
|
+
process.stdout.write(chalk.bold.white(center(tagline, width)) + '\n');
|
|
40
|
+
process.stdout.write('\n');
|
|
41
|
+
// Meta row: version · provider · license
|
|
42
|
+
const meta = `v${version} ✦ ⚡ DeepSeek ✦ MIT`;
|
|
43
|
+
process.stdout.write(chalk.hex('#666688')(center(meta, width)) + '\n');
|
|
44
|
+
process.stdout.write('\n');
|
|
45
|
+
// Divider
|
|
46
|
+
process.stdout.write(chalk.hex('#3344AA')('▀'.repeat(Math.floor(width / 2))) +
|
|
47
|
+
chalk.hex('#00EEFF')('▀'.repeat(width - Math.floor(width / 2))) +
|
|
48
|
+
'\n\n');
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=banner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"banner.js","sourceRoot":"","sources":["../../src/utils/banner.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,MAAM,GAAG,GAAG;IACV,uCAAuC;IACvC,uCAAuC;IACvC,uCAAuC;IACvC,uCAAuC;IACvC,uCAAuC;IACvC,uCAAuC;CACxC,CAAC;AAEF,iDAAiD;AACjD,MAAM,IAAI,GAAG;IACX,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC;IACpB,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC;IACpB,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC;IACpB,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC;IACpB,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC;IACpB,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC;CACrB,CAAC;AAEF,MAAM,QAAQ,GAAG;IACf,uCAAuC;IACvC,uCAAuC;IACvC,gCAAgC;IAChC,sCAAsC;IACtC,uCAAuC;CACxC,CAAC;AAEF,SAAS,MAAM,CAAC,GAAW,EAAE,KAAa;IACxC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,GAAG,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAC9D,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC;AAC/B,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,OAAO,GAAG,OAAO;IAC3C,MAAM,KAAK,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;IAC5B,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;IAE1E,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAE3B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACpC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IAC/C,CAAC;IAED,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAE3B,UAAU;IACV,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,GAAG,IAAI,CAChD,CAAC;IAEF,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAE3B,yCAAyC;IACzC,MAAM,IAAI,GAAG,IAAI,OAAO,yBAAyB,CAAC;IAClD,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,GAAG,IAAI,CACjD,CAAC;IAEF,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAE3B,UAAU;IACV,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC;QACvD,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC;QAC/D,MAAM,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export declare function isGitRepo(cwd?: string): Promise<boolean>;
|
|
2
|
+
export declare function getGitRoot(cwd?: string): Promise<string | null>;
|
|
3
|
+
export declare function getChangedFiles(cwd?: string): Promise<string[]>;
|
|
4
|
+
export declare function getDiff(base?: string, cwd?: string): Promise<string>;
|
|
5
|
+
export declare function getCurrentBranch(cwd?: string): Promise<string>;
|
|
6
|
+
export declare function getRemoteUrl(cwd?: string): Promise<string>;
|
|
7
|
+
export declare function createBranch(name: string, cwd?: string): Promise<void>;
|
|
8
|
+
export declare function getRecentCommits(n?: number, cwd?: string): Promise<string>;
|
|
9
|
+
//# sourceMappingURL=git.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git.d.ts","sourceRoot":"","sources":["../../src/utils/git.ts"],"names":[],"mappings":"AAuBA,wBAAsB,SAAS,CAAC,GAAG,SAAgB,GAAG,OAAO,CAAC,OAAO,CAAC,CAGrE;AAED,wBAAsB,UAAU,CAAC,GAAG,SAAgB,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAG5E;AAED,wBAAsB,eAAe,CAAC,GAAG,SAAgB,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAO5E;AAED,wBAAsB,OAAO,CAAC,IAAI,SAAS,EAAE,GAAG,SAAgB,GAAG,OAAO,CAAC,MAAM,CAAC,CAEjF;AAED,wBAAsB,gBAAgB,CAAC,GAAG,SAAgB,GAAG,OAAO,CAAC,MAAM,CAAC,CAE3E;AAED,wBAAsB,YAAY,CAAC,GAAG,SAAgB,GAAG,OAAO,CAAC,MAAM,CAAC,CAEvE;AAED,wBAAsB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,SAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAEnF;AAED,wBAAsB,gBAAgB,CAAC,CAAC,SAAK,EAAE,GAAG,SAAgB,GAAG,OAAO,CAAC,MAAM,CAAC,CAEnF"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { execFile } from 'child_process';
|
|
2
|
+
import { promisify } from 'util';
|
|
3
|
+
import { withTimeout } from './resilience.js';
|
|
4
|
+
const execFileAsync = promisify(execFile);
|
|
5
|
+
const GIT_TIMEOUT_MS = 15_000;
|
|
6
|
+
async function git(args, cwd = process.cwd()) {
|
|
7
|
+
try {
|
|
8
|
+
const { stdout } = await withTimeout(execFileAsync('git', args, { cwd, maxBuffer: 10 * 1024 * 1024 }), GIT_TIMEOUT_MS, `git ${args[0]}`);
|
|
9
|
+
return stdout.trim();
|
|
10
|
+
}
|
|
11
|
+
catch (e) {
|
|
12
|
+
const err = e;
|
|
13
|
+
if (err.code === 128 || (err.message ?? '').includes('not a git repository'))
|
|
14
|
+
return '';
|
|
15
|
+
throw new Error(`git ${args[0]} failed: ${err.stderr ?? err.message}`);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
export async function isGitRepo(cwd = process.cwd()) {
|
|
19
|
+
const result = await git(['rev-parse', '--is-inside-work-tree'], cwd);
|
|
20
|
+
return result === 'true';
|
|
21
|
+
}
|
|
22
|
+
export async function getGitRoot(cwd = process.cwd()) {
|
|
23
|
+
const result = await git(['rev-parse', '--show-toplevel'], cwd);
|
|
24
|
+
return result || null;
|
|
25
|
+
}
|
|
26
|
+
export async function getChangedFiles(cwd = process.cwd()) {
|
|
27
|
+
const output = await git(['diff', '--name-only', 'HEAD'], cwd);
|
|
28
|
+
const staged = await git(['diff', '--name-only', '--cached'], cwd);
|
|
29
|
+
const untracked = await git(['ls-files', '--others', '--exclude-standard'], cwd);
|
|
30
|
+
const all = [...new Set([...output.split('\n'), ...staged.split('\n'), ...untracked.split('\n')])]
|
|
31
|
+
.filter(Boolean);
|
|
32
|
+
return all;
|
|
33
|
+
}
|
|
34
|
+
export async function getDiff(base = 'main', cwd = process.cwd()) {
|
|
35
|
+
return git(['diff', `${base}...HEAD`], cwd);
|
|
36
|
+
}
|
|
37
|
+
export async function getCurrentBranch(cwd = process.cwd()) {
|
|
38
|
+
return git(['rev-parse', '--abbrev-ref', 'HEAD'], cwd);
|
|
39
|
+
}
|
|
40
|
+
export async function getRemoteUrl(cwd = process.cwd()) {
|
|
41
|
+
return git(['remote', 'get-url', 'origin'], cwd);
|
|
42
|
+
}
|
|
43
|
+
export async function createBranch(name, cwd = process.cwd()) {
|
|
44
|
+
await git(['checkout', '-b', name], cwd);
|
|
45
|
+
}
|
|
46
|
+
export async function getRecentCommits(n = 10, cwd = process.cwd()) {
|
|
47
|
+
return git(['log', `--oneline`, `-${n}`], cwd);
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=git.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git.js","sourceRoot":"","sources":["../../src/utils/git.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import type { Options as OraOptions, Ora } from 'ora';
|
|
2
|
+
export type LogLevel = 'info' | 'success' | 'warn' | 'error' | 'debug' | 'agent';
|
|
3
|
+
export declare const icons: {
|
|
4
|
+
info: string;
|
|
5
|
+
success: string;
|
|
6
|
+
warn: string;
|
|
7
|
+
error: string;
|
|
8
|
+
debug: string;
|
|
9
|
+
ai: string;
|
|
10
|
+
agent: string;
|
|
11
|
+
think: string;
|
|
12
|
+
file: string;
|
|
13
|
+
folder: string;
|
|
14
|
+
gear: string;
|
|
15
|
+
rocket: string;
|
|
16
|
+
check: string;
|
|
17
|
+
cross: string;
|
|
18
|
+
arrow: string;
|
|
19
|
+
dot: string;
|
|
20
|
+
};
|
|
21
|
+
declare class Logger {
|
|
22
|
+
private debugMode;
|
|
23
|
+
info(msg: string): void;
|
|
24
|
+
success(msg: string): void;
|
|
25
|
+
warn(msg: string): void;
|
|
26
|
+
error(msg: string): void;
|
|
27
|
+
debug(msg: string): void;
|
|
28
|
+
agent(name: string, msg: string): void;
|
|
29
|
+
agentHeader(name: string, role: string): void;
|
|
30
|
+
step(emoji: string, msg: string): void;
|
|
31
|
+
dim(msg: string): void;
|
|
32
|
+
bold(msg: string): void;
|
|
33
|
+
newline(): void;
|
|
34
|
+
banner(title: string, subtitle?: string): void;
|
|
35
|
+
result(title: string, body: string): void;
|
|
36
|
+
table(rows: [string, string][]): void;
|
|
37
|
+
raw(msg: string): void;
|
|
38
|
+
spinner(options: string | OraOptions): Ora;
|
|
39
|
+
}
|
|
40
|
+
export declare const logger: Logger;
|
|
41
|
+
export {};
|
|
42
|
+
//# sourceMappingURL=logger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,IAAI,UAAU,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAEtD,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,GAAG,OAAO,CAAC;AAEjF,eAAO,MAAM,KAAK;;;;;;;;;;;;;;;;;CAiBjB,CAAC;AAEF,cAAM,MAAM;IACV,OAAO,CAAC,SAAS,CAAmC;IAEpD,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAIvB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAI1B,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAIvB,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAIxB,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAMxB,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI;IAItC,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAW7C,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI;IAItC,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAItB,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAIvB,OAAO,IAAI,IAAI;IAIf,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI;IAa9C,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAUzC,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,GAAG,IAAI;IAOrC,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAItB,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,UAAU,GAAG,GAAG;CAM3C;AAED,eAAO,MAAM,MAAM,QAAe,CAAC"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import boxen from 'boxen';
|
|
3
|
+
import ora from 'ora';
|
|
4
|
+
export const icons = {
|
|
5
|
+
info: 'ℹ',
|
|
6
|
+
success: '✓',
|
|
7
|
+
warn: '⚠',
|
|
8
|
+
error: '✗',
|
|
9
|
+
debug: '◆',
|
|
10
|
+
ai: '🤖',
|
|
11
|
+
agent: '🎯',
|
|
12
|
+
think: '💭',
|
|
13
|
+
file: '📄',
|
|
14
|
+
folder: '📁',
|
|
15
|
+
gear: '⚙',
|
|
16
|
+
rocket: '🚀',
|
|
17
|
+
check: '✅',
|
|
18
|
+
cross: '❌',
|
|
19
|
+
arrow: '→',
|
|
20
|
+
dot: '•',
|
|
21
|
+
};
|
|
22
|
+
class Logger {
|
|
23
|
+
debugMode = process.env.DIDEV_DEBUG === '1';
|
|
24
|
+
info(msg) {
|
|
25
|
+
console.log(chalk.cyan(`${icons.info} ${msg}`));
|
|
26
|
+
}
|
|
27
|
+
success(msg) {
|
|
28
|
+
console.log(chalk.green(`${icons.success} ${msg}`));
|
|
29
|
+
}
|
|
30
|
+
warn(msg) {
|
|
31
|
+
console.log(chalk.yellow(`${icons.warn} ${msg}`));
|
|
32
|
+
}
|
|
33
|
+
error(msg) {
|
|
34
|
+
console.error(chalk.red(`${icons.error} ${msg}`));
|
|
35
|
+
}
|
|
36
|
+
debug(msg) {
|
|
37
|
+
if (this.debugMode) {
|
|
38
|
+
console.log(chalk.gray(`${icons.debug} [DEBUG] ${msg}`));
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
agent(name, msg) {
|
|
42
|
+
console.log(chalk.magenta(`${icons.agent} ${chalk.bold(name)}:`) + ` ${msg}`);
|
|
43
|
+
}
|
|
44
|
+
agentHeader(name, role) {
|
|
45
|
+
console.log('');
|
|
46
|
+
console.log(boxen(chalk.bold.magenta(`${icons.agent} ${name}`) + chalk.gray(`\n${role}`), {
|
|
47
|
+
padding: { top: 0, bottom: 0, left: 1, right: 1 },
|
|
48
|
+
borderColor: 'magenta',
|
|
49
|
+
borderStyle: 'round',
|
|
50
|
+
}));
|
|
51
|
+
}
|
|
52
|
+
step(emoji, msg) {
|
|
53
|
+
console.log(` ${emoji} ${msg}`);
|
|
54
|
+
}
|
|
55
|
+
dim(msg) {
|
|
56
|
+
console.log(chalk.gray(msg));
|
|
57
|
+
}
|
|
58
|
+
bold(msg) {
|
|
59
|
+
console.log(chalk.bold(msg));
|
|
60
|
+
}
|
|
61
|
+
newline() {
|
|
62
|
+
console.log('');
|
|
63
|
+
}
|
|
64
|
+
banner(title, subtitle) {
|
|
65
|
+
const content = chalk.bold.cyan(title) + (subtitle ? `\n${chalk.gray(subtitle)}` : '');
|
|
66
|
+
console.log(boxen(content, {
|
|
67
|
+
padding: 1,
|
|
68
|
+
margin: { top: 1, bottom: 1, left: 0, right: 0 },
|
|
69
|
+
borderColor: 'cyan',
|
|
70
|
+
borderStyle: 'double',
|
|
71
|
+
textAlignment: 'center',
|
|
72
|
+
}));
|
|
73
|
+
}
|
|
74
|
+
result(title, body) {
|
|
75
|
+
console.log(boxen(chalk.bold(title) + '\n\n' + body, {
|
|
76
|
+
padding: 1,
|
|
77
|
+
borderColor: 'green',
|
|
78
|
+
borderStyle: 'round',
|
|
79
|
+
}));
|
|
80
|
+
}
|
|
81
|
+
table(rows) {
|
|
82
|
+
const maxKey = Math.max(...rows.map(([k]) => k.length));
|
|
83
|
+
for (const [key, val] of rows) {
|
|
84
|
+
console.log(` ${chalk.gray(key.padEnd(maxKey))} ${chalk.white(val)}`);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
raw(msg) {
|
|
88
|
+
process.stdout.write(msg);
|
|
89
|
+
}
|
|
90
|
+
spinner(options) {
|
|
91
|
+
const opts = typeof options === 'string'
|
|
92
|
+
? { text: options }
|
|
93
|
+
: options;
|
|
94
|
+
return ora({ ...opts, stream: process.stdout });
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
export const logger = new Logger();
|
|
98
|
+
//# sourceMappingURL=logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Race a promise against a timeout. Rejects with a descriptive error if ms elapses first.
|
|
3
|
+
* Clears the internal timer regardless of which side wins, preventing Node from staying alive.
|
|
4
|
+
*/
|
|
5
|
+
export declare function withTimeout<T>(promise: Promise<T>, ms: number, label?: string): Promise<T>;
|
|
6
|
+
export interface RetryOptions {
|
|
7
|
+
maxAttempts?: number;
|
|
8
|
+
initialDelay?: number;
|
|
9
|
+
maxDelay?: number;
|
|
10
|
+
label?: string;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Retry fn with exponential backoff + jitter on transient errors.
|
|
14
|
+
* Non-retriable errors (4xx except 429, logic errors) are re-thrown immediately.
|
|
15
|
+
*/
|
|
16
|
+
export declare function retryWithBackoff<T>(fn: () => Promise<T>, options?: RetryOptions): Promise<T>;
|
|
17
|
+
//# sourceMappingURL=resilience.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resilience.d.ts","sourceRoot":"","sources":["../../src/utils/resilience.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,SAAc,GAAG,OAAO,CAAC,CAAC,CAAC,CAY/F;AAED,MAAM,WAAW,YAAY;IAC3B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAID;;;GAGG;AACH,wBAAsB,gBAAgB,CAAC,CAAC,EACtC,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACpB,OAAO,GAAE,YAAiB,GACzB,OAAO,CAAC,CAAC,CAAC,CAmBZ"}
|