@aiagentflow/cli 0.1.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/LICENSE +21 -0
- package/README.md +232 -0
- package/dist/agents/base.d.ts +69 -0
- package/dist/agents/base.d.ts.map +1 -0
- package/dist/agents/base.js +78 -0
- package/dist/agents/base.js.map +1 -0
- package/dist/agents/factory.d.ts +21 -0
- package/dist/agents/factory.d.ts.map +1 -0
- package/dist/agents/factory.js +50 -0
- package/dist/agents/factory.js.map +1 -0
- package/dist/agents/roles/architect.d.ts +23 -0
- package/dist/agents/roles/architect.d.ts.map +1 -0
- package/dist/agents/roles/architect.js +39 -0
- package/dist/agents/roles/architect.js.map +1 -0
- package/dist/agents/roles/coder.d.ts +19 -0
- package/dist/agents/roles/coder.d.ts.map +1 -0
- package/dist/agents/roles/coder.js +38 -0
- package/dist/agents/roles/coder.js.map +1 -0
- package/dist/agents/roles/fixer.d.ts +19 -0
- package/dist/agents/roles/fixer.d.ts.map +1 -0
- package/dist/agents/roles/fixer.js +29 -0
- package/dist/agents/roles/fixer.js.map +1 -0
- package/dist/agents/roles/judge.d.ts +24 -0
- package/dist/agents/roles/judge.d.ts.map +1 -0
- package/dist/agents/roles/judge.js +38 -0
- package/dist/agents/roles/judge.js.map +1 -0
- package/dist/agents/roles/reviewer.d.ts +28 -0
- package/dist/agents/roles/reviewer.d.ts.map +1 -0
- package/dist/agents/roles/reviewer.js +49 -0
- package/dist/agents/roles/reviewer.js.map +1 -0
- package/dist/agents/roles/tester.d.ts +19 -0
- package/dist/agents/roles/tester.d.ts.map +1 -0
- package/dist/agents/roles/tester.js +29 -0
- package/dist/agents/roles/tester.js.map +1 -0
- package/dist/agents/types.d.ts +13 -0
- package/dist/agents/types.d.ts.map +1 -0
- package/dist/agents/types.js +25 -0
- package/dist/agents/types.js.map +1 -0
- package/dist/cli/commands/config.d.ts +9 -0
- package/dist/cli/commands/config.d.ts.map +1 -0
- package/dist/cli/commands/config.js +30 -0
- package/dist/cli/commands/config.js.map +1 -0
- package/dist/cli/commands/doctor.d.ts +12 -0
- package/dist/cli/commands/doctor.d.ts.map +1 -0
- package/dist/cli/commands/doctor.js +63 -0
- package/dist/cli/commands/doctor.js.map +1 -0
- package/dist/cli/commands/init.d.ts +12 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +231 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/run.d.ts +11 -0
- package/dist/cli/commands/run.d.ts.map +1 -0
- package/dist/cli/commands/run.js +66 -0
- package/dist/cli/commands/run.js.map +1 -0
- package/dist/cli/index.d.ts +9 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +24 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/core/config/defaults.d.ts +22 -0
- package/dist/core/config/defaults.d.ts.map +1 -0
- package/dist/core/config/defaults.js +60 -0
- package/dist/core/config/defaults.js.map +1 -0
- package/dist/core/config/manager.d.ts +45 -0
- package/dist/core/config/manager.d.ts.map +1 -0
- package/dist/core/config/manager.js +106 -0
- package/dist/core/config/manager.js.map +1 -0
- package/dist/core/config/schema.d.ts +780 -0
- package/dist/core/config/schema.d.ts.map +1 -0
- package/dist/core/config/schema.js +102 -0
- package/dist/core/config/schema.js.map +1 -0
- package/dist/core/config/types.d.ts +24 -0
- package/dist/core/config/types.d.ts.map +1 -0
- package/dist/core/config/types.js +11 -0
- package/dist/core/config/types.js.map +1 -0
- package/dist/core/errors.d.ts +36 -0
- package/dist/core/errors.d.ts.map +1 -0
- package/dist/core/errors.js +60 -0
- package/dist/core/errors.js.map +1 -0
- package/dist/core/workflow/approval.d.ts +22 -0
- package/dist/core/workflow/approval.d.ts.map +1 -0
- package/dist/core/workflow/approval.js +54 -0
- package/dist/core/workflow/approval.js.map +1 -0
- package/dist/core/workflow/engine.d.ts +128 -0
- package/dist/core/workflow/engine.d.ts.map +1 -0
- package/dist/core/workflow/engine.js +159 -0
- package/dist/core/workflow/engine.js.map +1 -0
- package/dist/core/workflow/file-parser.d.ts +41 -0
- package/dist/core/workflow/file-parser.d.ts.map +1 -0
- package/dist/core/workflow/file-parser.js +138 -0
- package/dist/core/workflow/file-parser.js.map +1 -0
- package/dist/core/workflow/qa-policy.d.ts +55 -0
- package/dist/core/workflow/qa-policy.d.ts.map +1 -0
- package/dist/core/workflow/qa-policy.js +119 -0
- package/dist/core/workflow/qa-policy.js.map +1 -0
- package/dist/core/workflow/runner.d.ts +30 -0
- package/dist/core/workflow/runner.d.ts.map +1 -0
- package/dist/core/workflow/runner.js +273 -0
- package/dist/core/workflow/runner.js.map +1 -0
- package/dist/core/workflow/session.d.ts +37 -0
- package/dist/core/workflow/session.d.ts.map +1 -0
- package/dist/core/workflow/session.js +93 -0
- package/dist/core/workflow/session.js.map +1 -0
- package/dist/core/workflow/task-queue.d.ts +46 -0
- package/dist/core/workflow/task-queue.d.ts.map +1 -0
- package/dist/core/workflow/task-queue.js +106 -0
- package/dist/core/workflow/task-queue.js.map +1 -0
- package/dist/core/workflow/test-runner.d.ts +25 -0
- package/dist/core/workflow/test-runner.d.ts.map +1 -0
- package/dist/core/workflow/test-runner.js +50 -0
- package/dist/core/workflow/test-runner.js.map +1 -0
- package/dist/core/workflow/token-tracker.d.ts +54 -0
- package/dist/core/workflow/token-tracker.d.ts.map +1 -0
- package/dist/core/workflow/token-tracker.js +98 -0
- package/dist/core/workflow/token-tracker.js.map +1 -0
- package/dist/git/client.d.ts +47 -0
- package/dist/git/client.d.ts.map +1 -0
- package/dist/git/client.js +109 -0
- package/dist/git/client.js.map +1 -0
- package/dist/prompts/library.d.ts +35 -0
- package/dist/prompts/library.d.ts.map +1 -0
- package/dist/prompts/library.js +238 -0
- package/dist/prompts/library.js.map +1 -0
- package/dist/providers/anthropic.d.ts +55 -0
- package/dist/providers/anthropic.d.ts.map +1 -0
- package/dist/providers/anthropic.js +237 -0
- package/dist/providers/anthropic.js.map +1 -0
- package/dist/providers/ollama.d.ts +44 -0
- package/dist/providers/ollama.d.ts.map +1 -0
- package/dist/providers/ollama.js +211 -0
- package/dist/providers/ollama.js.map +1 -0
- package/dist/providers/registry.d.ts +36 -0
- package/dist/providers/registry.d.ts.map +1 -0
- package/dist/providers/registry.js +91 -0
- package/dist/providers/registry.js.map +1 -0
- package/dist/providers/types.d.ts +100 -0
- package/dist/providers/types.d.ts.map +1 -0
- package/dist/providers/types.js +12 -0
- package/dist/providers/types.js.map +1 -0
- package/dist/types/index.d.ts +11 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +9 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/fs.d.ts +30 -0
- package/dist/utils/fs.d.ts.map +1 -0
- package/dist/utils/fs.js +80 -0
- package/dist/utils/fs.js.map +1 -0
- package/dist/utils/logger.d.ts +46 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +87 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/validation.d.ts +28 -0
- package/dist/utils/validation.d.ts.map +1 -0
- package/dist/utils/validation.js +38 -0
- package/dist/utils/validation.js.map +1 -0
- package/package.json +62 -0
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `aiagentflow init` — Interactive setup wizard.
|
|
3
|
+
*
|
|
4
|
+
* Walks the user through configuring providers, models, and workflow settings.
|
|
5
|
+
* Generates `.aiagentflow/config.json` in the current project directory.
|
|
6
|
+
*
|
|
7
|
+
* Dependency direction: init.ts → commander, prompts, ora, chalk, config module
|
|
8
|
+
* Used by: cli/index.ts
|
|
9
|
+
*/
|
|
10
|
+
import { Command } from 'commander';
|
|
11
|
+
import prompts from 'prompts';
|
|
12
|
+
import chalk from 'chalk';
|
|
13
|
+
import ora from 'ora';
|
|
14
|
+
import { configExists, saveConfig, getDefaultConfig, getConfigPath } from '../../core/config/manager.js';
|
|
15
|
+
import { ALL_AGENT_ROLES, AGENT_ROLE_LABELS } from '../../agents/types.js';
|
|
16
|
+
import { getSupportedProviders } from '../../providers/registry.js';
|
|
17
|
+
import { generateDefaultPrompts } from '../../prompts/library.js';
|
|
18
|
+
import { logger } from '../../utils/logger.js';
|
|
19
|
+
export const initCommand = new Command('init')
|
|
20
|
+
.description('Initialize AI Workflow in the current project')
|
|
21
|
+
.option('-f, --force', 'Overwrite existing configuration')
|
|
22
|
+
.option('-y, --yes', 'Accept defaults without prompting')
|
|
23
|
+
.action(async (options) => {
|
|
24
|
+
const projectRoot = process.cwd();
|
|
25
|
+
logger.header('AI Workflow — Project Setup');
|
|
26
|
+
// Check for existing config
|
|
27
|
+
if (configExists(projectRoot) && !options.force) {
|
|
28
|
+
const { overwrite } = await prompts({
|
|
29
|
+
type: 'confirm',
|
|
30
|
+
name: 'overwrite',
|
|
31
|
+
message: 'Configuration already exists. Overwrite?',
|
|
32
|
+
initial: false,
|
|
33
|
+
});
|
|
34
|
+
if (!overwrite) {
|
|
35
|
+
logger.info('Setup cancelled.');
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
// Quick mode — accept all defaults
|
|
40
|
+
if (options.yes) {
|
|
41
|
+
const config = getDefaultConfig();
|
|
42
|
+
const spinner = ora('Saving configuration...').start();
|
|
43
|
+
saveConfig(projectRoot, config);
|
|
44
|
+
generateDefaultPrompts(projectRoot);
|
|
45
|
+
spinner.succeed(`Configuration saved to ${getConfigPath(projectRoot)}`);
|
|
46
|
+
logger.success('Setup complete! Run "aiagentflow doctor" to verify your setup.');
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
// Interactive wizard
|
|
50
|
+
const config = await runWizard(projectRoot);
|
|
51
|
+
if (!config) {
|
|
52
|
+
logger.info('Setup cancelled.');
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
const spinner = ora('Saving configuration...').start();
|
|
56
|
+
saveConfig(projectRoot, config);
|
|
57
|
+
generateDefaultPrompts(projectRoot);
|
|
58
|
+
spinner.succeed(`Configuration saved to ${getConfigPath(projectRoot)}`);
|
|
59
|
+
console.log();
|
|
60
|
+
logger.success('Setup complete!');
|
|
61
|
+
console.log(chalk.gray(' Next steps:'));
|
|
62
|
+
console.log(chalk.gray(' 1. Run "aiagentflow doctor" to verify providers'));
|
|
63
|
+
console.log(chalk.gray(' 2. Run "aiagentflow run <task>" to start a workflow'));
|
|
64
|
+
console.log();
|
|
65
|
+
});
|
|
66
|
+
/**
|
|
67
|
+
* Run the interactive setup wizard.
|
|
68
|
+
*/
|
|
69
|
+
async function runWizard(projectRoot) {
|
|
70
|
+
const config = getDefaultConfig();
|
|
71
|
+
const availableProviders = getSupportedProviders();
|
|
72
|
+
// ── Step 1: Project Detection ──
|
|
73
|
+
logger.step(1, 5, 'Project Settings');
|
|
74
|
+
const projectAnswers = await prompts([
|
|
75
|
+
{
|
|
76
|
+
type: 'select',
|
|
77
|
+
name: 'language',
|
|
78
|
+
message: 'Primary programming language:',
|
|
79
|
+
choices: [
|
|
80
|
+
{ title: 'TypeScript', value: 'typescript' },
|
|
81
|
+
{ title: 'JavaScript', value: 'javascript' },
|
|
82
|
+
{ title: 'Python', value: 'python' },
|
|
83
|
+
{ title: 'Go', value: 'go' },
|
|
84
|
+
{ title: 'Rust', value: 'rust' },
|
|
85
|
+
{ title: 'Java', value: 'java' },
|
|
86
|
+
{ title: 'Other', value: 'other' },
|
|
87
|
+
],
|
|
88
|
+
initial: 0,
|
|
89
|
+
},
|
|
90
|
+
{
|
|
91
|
+
type: 'text',
|
|
92
|
+
name: 'framework',
|
|
93
|
+
message: 'Framework (or "none"):',
|
|
94
|
+
initial: 'none',
|
|
95
|
+
},
|
|
96
|
+
{
|
|
97
|
+
type: 'text',
|
|
98
|
+
name: 'testFramework',
|
|
99
|
+
message: 'Test framework:',
|
|
100
|
+
initial: 'vitest',
|
|
101
|
+
},
|
|
102
|
+
]);
|
|
103
|
+
if (!projectAnswers.language)
|
|
104
|
+
return null;
|
|
105
|
+
config.project.language = projectAnswers.language;
|
|
106
|
+
config.project.framework = projectAnswers.framework;
|
|
107
|
+
config.project.testFramework = projectAnswers.testFramework;
|
|
108
|
+
// ── Step 2: Provider Selection ──
|
|
109
|
+
logger.step(2, 5, 'LLM Providers');
|
|
110
|
+
const providerAnswers = await prompts({
|
|
111
|
+
type: 'multiselect',
|
|
112
|
+
name: 'providers',
|
|
113
|
+
message: 'Select LLM providers to configure:',
|
|
114
|
+
choices: availableProviders.map((p) => ({
|
|
115
|
+
title: p === 'anthropic' ? 'Anthropic (Claude)' : 'Ollama (Local Models)',
|
|
116
|
+
value: p,
|
|
117
|
+
selected: true,
|
|
118
|
+
})),
|
|
119
|
+
min: 1,
|
|
120
|
+
});
|
|
121
|
+
if (!providerAnswers.providers)
|
|
122
|
+
return null;
|
|
123
|
+
const selectedProviders = providerAnswers.providers;
|
|
124
|
+
// ── Step 3: Provider Configuration ──
|
|
125
|
+
logger.step(3, 5, 'Provider Settings');
|
|
126
|
+
if (selectedProviders.includes('anthropic')) {
|
|
127
|
+
const anthropicAnswers = await prompts([
|
|
128
|
+
{
|
|
129
|
+
type: 'password',
|
|
130
|
+
name: 'apiKey',
|
|
131
|
+
message: 'Anthropic API key:',
|
|
132
|
+
validate: (val) => val.length >= 8 || 'API key seems too short',
|
|
133
|
+
},
|
|
134
|
+
]);
|
|
135
|
+
if (!anthropicAnswers.apiKey)
|
|
136
|
+
return null;
|
|
137
|
+
config.providers.anthropic = {
|
|
138
|
+
apiKey: anthropicAnswers.apiKey,
|
|
139
|
+
baseUrl: 'https://api.anthropic.com',
|
|
140
|
+
apiVersion: '2023-06-01',
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
if (selectedProviders.includes('ollama')) {
|
|
144
|
+
const ollamaAnswers = await prompts({
|
|
145
|
+
type: 'text',
|
|
146
|
+
name: 'baseUrl',
|
|
147
|
+
message: 'Ollama base URL:',
|
|
148
|
+
initial: 'http://localhost:11434',
|
|
149
|
+
});
|
|
150
|
+
config.providers.ollama = {
|
|
151
|
+
baseUrl: ollamaAnswers.baseUrl || 'http://localhost:11434',
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
// ── Step 4: Agent Model Assignment ──
|
|
155
|
+
logger.step(4, 5, 'Agent Model Assignment');
|
|
156
|
+
const defaultProvider = selectedProviders.includes('anthropic') ? 'anthropic' : 'ollama';
|
|
157
|
+
const defaultModel = defaultProvider === 'anthropic' ? 'claude-sonnet-4-20250514' : 'llama3.2:latest';
|
|
158
|
+
console.log(chalk.gray(` Default: ${defaultProvider} / ${defaultModel}`));
|
|
159
|
+
const { customizeAgents } = await prompts({
|
|
160
|
+
type: 'confirm',
|
|
161
|
+
name: 'customizeAgents',
|
|
162
|
+
message: 'Customize model per agent role? (No = use defaults for all)',
|
|
163
|
+
initial: false,
|
|
164
|
+
});
|
|
165
|
+
if (customizeAgents) {
|
|
166
|
+
for (const role of ALL_AGENT_ROLES) {
|
|
167
|
+
const label = AGENT_ROLE_LABELS[role];
|
|
168
|
+
const roleAnswers = await prompts([
|
|
169
|
+
{
|
|
170
|
+
type: 'select',
|
|
171
|
+
name: 'provider',
|
|
172
|
+
message: `${label} — provider:`,
|
|
173
|
+
choices: selectedProviders.map((p) => ({ title: p, value: p })),
|
|
174
|
+
initial: selectedProviders.indexOf(defaultProvider),
|
|
175
|
+
},
|
|
176
|
+
{
|
|
177
|
+
type: 'text',
|
|
178
|
+
name: 'model',
|
|
179
|
+
message: `${label} — model:`,
|
|
180
|
+
initial: (prev) => prev === 'anthropic' ? 'claude-sonnet-4-20250514' : 'llama3.2:latest',
|
|
181
|
+
},
|
|
182
|
+
]);
|
|
183
|
+
if (!roleAnswers.provider)
|
|
184
|
+
return null;
|
|
185
|
+
config.agents[role] = {
|
|
186
|
+
...config.agents[role],
|
|
187
|
+
provider: roleAnswers.provider,
|
|
188
|
+
model: roleAnswers.model,
|
|
189
|
+
};
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
else {
|
|
193
|
+
// Apply defaults to all agents
|
|
194
|
+
for (const role of ALL_AGENT_ROLES) {
|
|
195
|
+
config.agents[role] = {
|
|
196
|
+
...config.agents[role],
|
|
197
|
+
provider: defaultProvider,
|
|
198
|
+
model: defaultModel,
|
|
199
|
+
};
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
// ── Step 5: Workflow Settings ──
|
|
203
|
+
logger.step(5, 5, 'Workflow Settings');
|
|
204
|
+
const workflowAnswers = await prompts([
|
|
205
|
+
{
|
|
206
|
+
type: 'number',
|
|
207
|
+
name: 'maxIterations',
|
|
208
|
+
message: 'Max fix iterations per task:',
|
|
209
|
+
initial: 5,
|
|
210
|
+
min: 1,
|
|
211
|
+
max: 20,
|
|
212
|
+
},
|
|
213
|
+
{
|
|
214
|
+
type: 'confirm',
|
|
215
|
+
name: 'humanApproval',
|
|
216
|
+
message: 'Require human approval between stages?',
|
|
217
|
+
initial: true,
|
|
218
|
+
},
|
|
219
|
+
{
|
|
220
|
+
type: 'confirm',
|
|
221
|
+
name: 'autoCreateBranch',
|
|
222
|
+
message: 'Auto-create Git branch for each task?',
|
|
223
|
+
initial: true,
|
|
224
|
+
},
|
|
225
|
+
]);
|
|
226
|
+
config.workflow.maxIterations = workflowAnswers.maxIterations ?? 5;
|
|
227
|
+
config.workflow.humanApproval = workflowAnswers.humanApproval ?? true;
|
|
228
|
+
config.workflow.autoCreateBranch = workflowAnswers.autoCreateBranch ?? true;
|
|
229
|
+
return config;
|
|
230
|
+
}
|
|
231
|
+
//# sourceMappingURL=init.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/cli/commands/init.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `aiagentflow run` — Execute a workflow task or batch of tasks.
|
|
3
|
+
*
|
|
4
|
+
* Supports single tasks, batch mode from a file, and autonomous mode.
|
|
5
|
+
*
|
|
6
|
+
* Dependency direction: run.ts → commander, workflow/runner, task-queue, config
|
|
7
|
+
* Used by: cli/index.ts
|
|
8
|
+
*/
|
|
9
|
+
import { Command } from 'commander';
|
|
10
|
+
export declare const runCommand: Command;
|
|
11
|
+
//# sourceMappingURL=run.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/run.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOpC,eAAO,MAAM,UAAU,SAwDjB,CAAC"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `aiagentflow run` — Execute a workflow task or batch of tasks.
|
|
3
|
+
*
|
|
4
|
+
* Supports single tasks, batch mode from a file, and autonomous mode.
|
|
5
|
+
*
|
|
6
|
+
* Dependency direction: run.ts → commander, workflow/runner, task-queue, config
|
|
7
|
+
* Used by: cli/index.ts
|
|
8
|
+
*/
|
|
9
|
+
import { Command } from 'commander';
|
|
10
|
+
import { readFileSync, existsSync } from 'node:fs';
|
|
11
|
+
import { configExists } from '../../core/config/manager.js';
|
|
12
|
+
import { runWorkflow } from '../../core/workflow/runner.js';
|
|
13
|
+
import { runTaskQueue, parseTasks } from '../../core/workflow/task-queue.js';
|
|
14
|
+
import { logger } from '../../utils/logger.js';
|
|
15
|
+
export const runCommand = new Command('run')
|
|
16
|
+
.description('Run an AI workflow task')
|
|
17
|
+
.argument('<task>', 'Task description or path to a task list file (.txt)')
|
|
18
|
+
.option('--auto', 'Autonomous mode — skip all human approval gates')
|
|
19
|
+
.option('--batch', 'Treat the argument as a task list file (one task per line)')
|
|
20
|
+
.option('--stop-on-failure', 'Stop the queue on first failure (batch mode)')
|
|
21
|
+
.action(async (task, options) => {
|
|
22
|
+
const projectRoot = process.cwd();
|
|
23
|
+
if (!configExists(projectRoot)) {
|
|
24
|
+
logger.error('No configuration found. Run "aiagentflow init" first.');
|
|
25
|
+
process.exit(1);
|
|
26
|
+
}
|
|
27
|
+
try {
|
|
28
|
+
// Batch mode: read tasks from file
|
|
29
|
+
if (options.batch || task.endsWith('.txt')) {
|
|
30
|
+
if (!existsSync(task)) {
|
|
31
|
+
logger.error(`Task list file not found: ${task}`);
|
|
32
|
+
process.exit(1);
|
|
33
|
+
}
|
|
34
|
+
const content = readFileSync(task, 'utf-8');
|
|
35
|
+
const tasks = parseTasks(content);
|
|
36
|
+
if (tasks.length === 0) {
|
|
37
|
+
logger.error('No tasks found in file. Each line should be a task description.');
|
|
38
|
+
process.exit(1);
|
|
39
|
+
}
|
|
40
|
+
const results = await runTaskQueue({
|
|
41
|
+
projectRoot,
|
|
42
|
+
tasks,
|
|
43
|
+
auto: options.auto,
|
|
44
|
+
stopOnFailure: options.stopOnFailure,
|
|
45
|
+
});
|
|
46
|
+
const failed = results.filter(t => t.status === 'failed').length;
|
|
47
|
+
if (failed > 0)
|
|
48
|
+
process.exit(1);
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
// Single task mode
|
|
52
|
+
const result = await runWorkflow({
|
|
53
|
+
projectRoot,
|
|
54
|
+
task,
|
|
55
|
+
auto: options.auto,
|
|
56
|
+
});
|
|
57
|
+
if (result.state === 'failed') {
|
|
58
|
+
process.exit(1);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
catch (err) {
|
|
62
|
+
logger.error(`Unexpected error: ${err instanceof Error ? err.message : String(err)}`);
|
|
63
|
+
process.exit(1);
|
|
64
|
+
}
|
|
65
|
+
});
|
|
66
|
+
//# sourceMappingURL=run.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run.js","sourceRoot":"","sources":["../../../src/cli/commands/run.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* CLI entry point — registers all commands with Commander.js.
|
|
4
|
+
*
|
|
5
|
+
* Dependency direction: cli/index.ts → commander, all command files
|
|
6
|
+
* Used by: package.json bin entry ("aiagentflow" binary)
|
|
7
|
+
*/
|
|
8
|
+
export {};
|
|
9
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AAEA;;;;;GAKG"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* CLI entry point — registers all commands with Commander.js.
|
|
4
|
+
*
|
|
5
|
+
* Dependency direction: cli/index.ts → commander, all command files
|
|
6
|
+
* Used by: package.json bin entry ("aiagentflow" binary)
|
|
7
|
+
*/
|
|
8
|
+
import { Command } from 'commander';
|
|
9
|
+
import { initCommand } from './commands/init.js';
|
|
10
|
+
import { configCommand } from './commands/config.js';
|
|
11
|
+
import { doctorCommand } from './commands/doctor.js';
|
|
12
|
+
import { runCommand } from './commands/run.js';
|
|
13
|
+
const program = new Command();
|
|
14
|
+
program
|
|
15
|
+
.name('aiagentflow')
|
|
16
|
+
.description('AI Engineering Workflow Orchestrator — multi-agent development automation')
|
|
17
|
+
.version('0.1.0');
|
|
18
|
+
// Register commands
|
|
19
|
+
program.addCommand(initCommand);
|
|
20
|
+
program.addCommand(configCommand);
|
|
21
|
+
program.addCommand(doctorCommand);
|
|
22
|
+
program.addCommand(runCommand);
|
|
23
|
+
program.parse();
|
|
24
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AAEA;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAE/C,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACF,IAAI,CAAC,aAAa,CAAC;KACnB,WAAW,CAAC,2EAA2E,CAAC;KACxF,OAAO,CAAC,OAAO,CAAC,CAAC;AAEtB,oBAAoB;AACpB,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;AAChC,OAAO,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;AAClC,OAAO,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;AAClC,OAAO,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;AAE/B,OAAO,CAAC,KAAK,EAAE,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Default configuration values.
|
|
3
|
+
*
|
|
4
|
+
* These are sensible defaults for a new project. The init wizard
|
|
5
|
+
* will override these based on user choices.
|
|
6
|
+
*
|
|
7
|
+
* Dependency direction: defaults.ts → types.ts
|
|
8
|
+
* Used by: manager.ts, init.ts
|
|
9
|
+
*/
|
|
10
|
+
import type { AppConfig } from './types.js';
|
|
11
|
+
/**
|
|
12
|
+
* Full default configuration.
|
|
13
|
+
*
|
|
14
|
+
* Key design decision: defaults to Ollama so users can start
|
|
15
|
+
* without any API keys. Anthropic is opt-in via the init wizard.
|
|
16
|
+
*/
|
|
17
|
+
export declare const DEFAULT_CONFIG: AppConfig;
|
|
18
|
+
/** The directory name where config is stored inside a project. */
|
|
19
|
+
export declare const CONFIG_DIR_NAME = ".aiagentflow";
|
|
20
|
+
/** The config file name. */
|
|
21
|
+
export declare const CONFIG_FILE_NAME = "config.json";
|
|
22
|
+
//# sourceMappingURL=defaults.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"defaults.d.ts","sourceRoot":"","sources":["../../../src/core/config/defaults.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAa5C;;;;;GAKG;AACH,eAAO,MAAM,cAAc,EAAE,SAiC5B,CAAC;AAEF,kEAAkE;AAClE,eAAO,MAAM,eAAe,iBAAiB,CAAC;AAE9C,4BAA4B;AAC5B,eAAO,MAAM,gBAAgB,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Default configuration values.
|
|
3
|
+
*
|
|
4
|
+
* These are sensible defaults for a new project. The init wizard
|
|
5
|
+
* will override these based on user choices.
|
|
6
|
+
*
|
|
7
|
+
* Dependency direction: defaults.ts → types.ts
|
|
8
|
+
* Used by: manager.ts, init.ts
|
|
9
|
+
*/
|
|
10
|
+
/**
|
|
11
|
+
* Default agent role config — uses Ollama with a local model.
|
|
12
|
+
* This is the safe default that doesn't require paid API keys.
|
|
13
|
+
*/
|
|
14
|
+
const DEFAULT_AGENT_ROLE = {
|
|
15
|
+
provider: 'ollama',
|
|
16
|
+
model: 'llama3.2:latest',
|
|
17
|
+
temperature: 0.7,
|
|
18
|
+
maxTokens: 4096,
|
|
19
|
+
};
|
|
20
|
+
/**
|
|
21
|
+
* Full default configuration.
|
|
22
|
+
*
|
|
23
|
+
* Key design decision: defaults to Ollama so users can start
|
|
24
|
+
* without any API keys. Anthropic is opt-in via the init wizard.
|
|
25
|
+
*/
|
|
26
|
+
export const DEFAULT_CONFIG = {
|
|
27
|
+
version: 1,
|
|
28
|
+
providers: {
|
|
29
|
+
ollama: {
|
|
30
|
+
baseUrl: 'http://localhost:11434',
|
|
31
|
+
},
|
|
32
|
+
},
|
|
33
|
+
agents: {
|
|
34
|
+
architect: { ...DEFAULT_AGENT_ROLE, temperature: 0.5 },
|
|
35
|
+
coder: { ...DEFAULT_AGENT_ROLE, temperature: 0.3, maxTokens: 8192 },
|
|
36
|
+
reviewer: { ...DEFAULT_AGENT_ROLE, temperature: 0.4 },
|
|
37
|
+
tester: { ...DEFAULT_AGENT_ROLE, temperature: 0.3 },
|
|
38
|
+
fixer: { ...DEFAULT_AGENT_ROLE, temperature: 0.3, maxTokens: 8192 },
|
|
39
|
+
judge: { ...DEFAULT_AGENT_ROLE, temperature: 0.2 },
|
|
40
|
+
},
|
|
41
|
+
project: {
|
|
42
|
+
language: 'typescript',
|
|
43
|
+
framework: 'none',
|
|
44
|
+
testFramework: 'vitest',
|
|
45
|
+
sourceGlobs: ['src/**/*.ts'],
|
|
46
|
+
testGlobs: ['tests/**/*.test.ts'],
|
|
47
|
+
},
|
|
48
|
+
workflow: {
|
|
49
|
+
maxIterations: 5,
|
|
50
|
+
humanApproval: true,
|
|
51
|
+
autoCreateBranch: true,
|
|
52
|
+
branchPrefix: 'aiagentflow/',
|
|
53
|
+
autoRunTests: true,
|
|
54
|
+
},
|
|
55
|
+
};
|
|
56
|
+
/** The directory name where config is stored inside a project. */
|
|
57
|
+
export const CONFIG_DIR_NAME = '.aiagentflow';
|
|
58
|
+
/** The config file name. */
|
|
59
|
+
export const CONFIG_FILE_NAME = 'config.json';
|
|
60
|
+
//# sourceMappingURL=defaults.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"defaults.js","sourceRoot":"","sources":["../../../src/core/config/defaults.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH;;;GAGG;AACH,MAAM,kBAAkB,GAAG;IACvB,QAAQ,EAAE,QAAiB;IAC3B,KAAK,EAAE,iBAAiB;IACxB,WAAW,EAAE,GAAG;IAChB,SAAS,EAAE,IAAI;CAClB,CAAC;AAEF;;;;;GAKG;AACH,MAAM,CAAC,MAAM,cAAc,GAAc;IACrC,OAAO,EAAE,CAAC;IAEV,SAAS,EAAE;QACP,MAAM,EAAE;YACJ,OAAO,EAAE,wBAAwB;SACpC;KACJ;IAED,MAAM,EAAE;QACJ,SAAS,EAAE,EAAE,GAAG,kBAAkB,EAAE,WAAW,EAAE,GAAG,EAAE;QACtD,KAAK,EAAE,EAAE,GAAG,kBAAkB,EAAE,WAAW,EAAE,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE;QACnE,QAAQ,EAAE,EAAE,GAAG,kBAAkB,EAAE,WAAW,EAAE,GAAG,EAAE;QACrD,MAAM,EAAE,EAAE,GAAG,kBAAkB,EAAE,WAAW,EAAE,GAAG,EAAE;QACnD,KAAK,EAAE,EAAE,GAAG,kBAAkB,EAAE,WAAW,EAAE,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE;QACnE,KAAK,EAAE,EAAE,GAAG,kBAAkB,EAAE,WAAW,EAAE,GAAG,EAAE;KACrD;IAED,OAAO,EAAE;QACL,QAAQ,EAAE,YAAY;QACtB,SAAS,EAAE,MAAM;QACjB,aAAa,EAAE,QAAQ;QACvB,WAAW,EAAE,CAAC,aAAa,CAAC;QAC5B,SAAS,EAAE,CAAC,oBAAoB,CAAC;KACpC;IAED,QAAQ,EAAE;QACN,aAAa,EAAE,CAAC;QAChB,aAAa,EAAE,IAAI;QACnB,gBAAgB,EAAE,IAAI;QACtB,YAAY,EAAE,cAAc;QAC5B,YAAY,EAAE,IAAI;KACrB;CACJ,CAAC;AAEF,kEAAkE;AAClE,MAAM,CAAC,MAAM,eAAe,GAAG,cAAc,CAAC;AAE9C,4BAA4B;AAC5B,MAAM,CAAC,MAAM,gBAAgB,GAAG,aAAa,CAAC"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Configuration manager — load, save, validate, and merge configs.
|
|
3
|
+
*
|
|
4
|
+
* Dependency direction: manager.ts → schema.ts, defaults.ts, utils/fs.ts, errors.ts
|
|
5
|
+
* Used by: CLI commands, workflow engine, provider registry
|
|
6
|
+
*/
|
|
7
|
+
import type { AppConfig } from './types.js';
|
|
8
|
+
/**
|
|
9
|
+
* Resolve the config directory path for a given project root.
|
|
10
|
+
*/
|
|
11
|
+
export declare function getConfigDir(projectRoot: string): string;
|
|
12
|
+
/**
|
|
13
|
+
* Resolve the full config file path for a given project root.
|
|
14
|
+
*/
|
|
15
|
+
export declare function getConfigPath(projectRoot: string): string;
|
|
16
|
+
/**
|
|
17
|
+
* Check whether a config file exists in the given project root.
|
|
18
|
+
*/
|
|
19
|
+
export declare function configExists(projectRoot: string): boolean;
|
|
20
|
+
/**
|
|
21
|
+
* Load and validate the configuration from disk.
|
|
22
|
+
*
|
|
23
|
+
* @param projectRoot - The root directory of the project (where .aiagentflow/ lives)
|
|
24
|
+
* @returns The validated AppConfig
|
|
25
|
+
* @throws {ConfigError} if the file doesn't exist, is invalid JSON, or fails validation
|
|
26
|
+
*/
|
|
27
|
+
export declare function loadConfig(projectRoot: string): AppConfig;
|
|
28
|
+
/**
|
|
29
|
+
* Save configuration to disk, validating before write.
|
|
30
|
+
*
|
|
31
|
+
* @param projectRoot - The root directory of the project
|
|
32
|
+
* @param config - The configuration to save
|
|
33
|
+
* @throws {ConfigError} if validation fails or write fails
|
|
34
|
+
*/
|
|
35
|
+
export declare function saveConfig(projectRoot: string, config: AppConfig): void;
|
|
36
|
+
/**
|
|
37
|
+
* Deep merge two config objects. Source values override target values.
|
|
38
|
+
* Arrays are replaced, not concatenated.
|
|
39
|
+
*/
|
|
40
|
+
export declare function mergeConfig(target: Partial<AppConfig>, source: Partial<AppConfig>): Partial<AppConfig>;
|
|
41
|
+
/**
|
|
42
|
+
* Get the default configuration with optional partial overrides merged in.
|
|
43
|
+
*/
|
|
44
|
+
export declare function getDefaultConfig(overrides?: Partial<AppConfig>): AppConfig;
|
|
45
|
+
//# sourceMappingURL=manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../../src/core/config/manager.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAK5C;;GAEG;AACH,wBAAgB,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAExD;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAEzD;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAEzD;AAED;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,SAAS,CA4BzD;AAED;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,GAAG,IAAI,CAoBvE;AAED;;;GAGG;AACH,wBAAgB,WAAW,CACvB,MAAM,EAAE,OAAO,CAAC,SAAS,CAAC,EAC1B,MAAM,EAAE,OAAO,CAAC,SAAS,CAAC,GAC3B,OAAO,CAAC,SAAS,CAAC,CA4BpB;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC,SAAS,CAAC,GAAG,SAAS,CAG1E"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Configuration manager — load, save, validate, and merge configs.
|
|
3
|
+
*
|
|
4
|
+
* Dependency direction: manager.ts → schema.ts, defaults.ts, utils/fs.ts, errors.ts
|
|
5
|
+
* Used by: CLI commands, workflow engine, provider registry
|
|
6
|
+
*/
|
|
7
|
+
import { join, resolve } from 'node:path';
|
|
8
|
+
import { appConfigSchema } from './schema.js';
|
|
9
|
+
import { CONFIG_DIR_NAME, CONFIG_FILE_NAME, DEFAULT_CONFIG } from './defaults.js';
|
|
10
|
+
import { fileExists, readJsonFile, writeJsonFile, ensureDir } from '../../utils/fs.js';
|
|
11
|
+
import { ConfigError } from '../errors.js';
|
|
12
|
+
import { logger } from '../../utils/logger.js';
|
|
13
|
+
/**
|
|
14
|
+
* Resolve the config directory path for a given project root.
|
|
15
|
+
*/
|
|
16
|
+
export function getConfigDir(projectRoot) {
|
|
17
|
+
return join(resolve(projectRoot), CONFIG_DIR_NAME);
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Resolve the full config file path for a given project root.
|
|
21
|
+
*/
|
|
22
|
+
export function getConfigPath(projectRoot) {
|
|
23
|
+
return join(getConfigDir(projectRoot), CONFIG_FILE_NAME);
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Check whether a config file exists in the given project root.
|
|
27
|
+
*/
|
|
28
|
+
export function configExists(projectRoot) {
|
|
29
|
+
return fileExists(getConfigPath(projectRoot));
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Load and validate the configuration from disk.
|
|
33
|
+
*
|
|
34
|
+
* @param projectRoot - The root directory of the project (where .aiagentflow/ lives)
|
|
35
|
+
* @returns The validated AppConfig
|
|
36
|
+
* @throws {ConfigError} if the file doesn't exist, is invalid JSON, or fails validation
|
|
37
|
+
*/
|
|
38
|
+
export function loadConfig(projectRoot) {
|
|
39
|
+
const configPath = getConfigPath(projectRoot);
|
|
40
|
+
if (!fileExists(configPath)) {
|
|
41
|
+
throw new ConfigError(`No configuration found. Run "aiagentflow init" first.`, { configPath, projectRoot });
|
|
42
|
+
}
|
|
43
|
+
logger.debug(`Loading config from ${configPath}`);
|
|
44
|
+
const raw = readJsonFile(configPath);
|
|
45
|
+
const result = appConfigSchema.safeParse(raw);
|
|
46
|
+
if (!result.success) {
|
|
47
|
+
const issues = result.error.issues.map((i) => ` - ${i.path.join('.')}: ${i.message}`).join('\n');
|
|
48
|
+
throw new ConfigError(`Invalid configuration file:\n${issues}`, { configPath, issues: result.error.issues });
|
|
49
|
+
}
|
|
50
|
+
logger.debug('Config loaded and validated successfully');
|
|
51
|
+
return result.data;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Save configuration to disk, validating before write.
|
|
55
|
+
*
|
|
56
|
+
* @param projectRoot - The root directory of the project
|
|
57
|
+
* @param config - The configuration to save
|
|
58
|
+
* @throws {ConfigError} if validation fails or write fails
|
|
59
|
+
*/
|
|
60
|
+
export function saveConfig(projectRoot, config) {
|
|
61
|
+
const result = appConfigSchema.safeParse(config);
|
|
62
|
+
if (!result.success) {
|
|
63
|
+
const issues = result.error.issues.map((i) => ` - ${i.path.join('.')}: ${i.message}`).join('\n');
|
|
64
|
+
throw new ConfigError(`Cannot save invalid configuration:\n${issues}`, { issues: result.error.issues });
|
|
65
|
+
}
|
|
66
|
+
const configDir = getConfigDir(projectRoot);
|
|
67
|
+
const configPath = getConfigPath(projectRoot);
|
|
68
|
+
ensureDir(configDir);
|
|
69
|
+
writeJsonFile(configPath, result.data);
|
|
70
|
+
logger.debug(`Config saved to ${configPath}`);
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Deep merge two config objects. Source values override target values.
|
|
74
|
+
* Arrays are replaced, not concatenated.
|
|
75
|
+
*/
|
|
76
|
+
export function mergeConfig(target, source) {
|
|
77
|
+
const result = { ...target };
|
|
78
|
+
for (const key of Object.keys(source)) {
|
|
79
|
+
const sourceVal = source[key];
|
|
80
|
+
const targetVal = result[key];
|
|
81
|
+
if (sourceVal !== null &&
|
|
82
|
+
sourceVal !== undefined &&
|
|
83
|
+
typeof sourceVal === 'object' &&
|
|
84
|
+
!Array.isArray(sourceVal) &&
|
|
85
|
+
targetVal !== null &&
|
|
86
|
+
targetVal !== undefined &&
|
|
87
|
+
typeof targetVal === 'object' &&
|
|
88
|
+
!Array.isArray(targetVal)) {
|
|
89
|
+
// Recursively merge objects
|
|
90
|
+
result[key] = mergeConfig(targetVal, sourceVal);
|
|
91
|
+
}
|
|
92
|
+
else if (sourceVal !== undefined) {
|
|
93
|
+
result[key] = sourceVal;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
return result;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Get the default configuration with optional partial overrides merged in.
|
|
100
|
+
*/
|
|
101
|
+
export function getDefaultConfig(overrides) {
|
|
102
|
+
if (!overrides)
|
|
103
|
+
return { ...DEFAULT_CONFIG };
|
|
104
|
+
return mergeConfig(DEFAULT_CONFIG, overrides);
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manager.js","sourceRoot":"","sources":["../../../src/core/config/manager.ts"],"names":[],"mappings":"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"}
|