vralphy 0.8.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 +512 -0
- package/bin/vralphy.js +3 -0
- package/dist/commands/build.d.ts +9 -0
- package/dist/commands/build.d.ts.map +1 -0
- package/dist/commands/build.js +176 -0
- package/dist/commands/build.js.map +1 -0
- package/dist/commands/cleanup.d.ts +19 -0
- package/dist/commands/cleanup.d.ts.map +1 -0
- package/dist/commands/cleanup.js +159 -0
- package/dist/commands/cleanup.js.map +1 -0
- package/dist/commands/cleanup.test.d.ts +2 -0
- package/dist/commands/cleanup.test.d.ts.map +1 -0
- package/dist/commands/cleanup.test.js +389 -0
- package/dist/commands/cleanup.test.js.map +1 -0
- package/dist/commands/init.d.ts +13 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +120 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/plan.d.ts +9 -0
- package/dist/commands/plan.d.ts.map +1 -0
- package/dist/commands/plan.js +147 -0
- package/dist/commands/plan.js.map +1 -0
- package/dist/commands/spec.d.ts +9 -0
- package/dist/commands/spec.d.ts.map +1 -0
- package/dist/commands/spec.js +111 -0
- package/dist/commands/spec.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +251 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/agents.d.ts +32 -0
- package/dist/lib/agents.d.ts.map +1 -0
- package/dist/lib/agents.js +96 -0
- package/dist/lib/agents.js.map +1 -0
- package/dist/lib/config.d.ts +54 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +199 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/config.test.d.ts +2 -0
- package/dist/lib/config.test.d.ts.map +1 -0
- package/dist/lib/config.test.js +57 -0
- package/dist/lib/config.test.js.map +1 -0
- package/dist/lib/context.d.ts +29 -0
- package/dist/lib/context.d.ts.map +1 -0
- package/dist/lib/context.js +175 -0
- package/dist/lib/context.js.map +1 -0
- package/dist/lib/engines/base.d.ts +75 -0
- package/dist/lib/engines/base.d.ts.map +1 -0
- package/dist/lib/engines/base.js +62 -0
- package/dist/lib/engines/base.js.map +1 -0
- package/dist/lib/engines/base.test.d.ts +2 -0
- package/dist/lib/engines/base.test.d.ts.map +1 -0
- package/dist/lib/engines/base.test.js +28 -0
- package/dist/lib/engines/base.test.js.map +1 -0
- package/dist/lib/engines/claude.d.ts +12 -0
- package/dist/lib/engines/claude.d.ts.map +1 -0
- package/dist/lib/engines/claude.js +156 -0
- package/dist/lib/engines/claude.js.map +1 -0
- package/dist/lib/engines/codex.d.ts +28 -0
- package/dist/lib/engines/codex.d.ts.map +1 -0
- package/dist/lib/engines/codex.js +177 -0
- package/dist/lib/engines/codex.js.map +1 -0
- package/dist/lib/engines/index.d.ts +19 -0
- package/dist/lib/engines/index.d.ts.map +1 -0
- package/dist/lib/engines/index.js +40 -0
- package/dist/lib/engines/index.js.map +1 -0
- package/dist/lib/engines/opencode.d.ts +14 -0
- package/dist/lib/engines/opencode.d.ts.map +1 -0
- package/dist/lib/engines/opencode.js +127 -0
- package/dist/lib/engines/opencode.js.map +1 -0
- package/dist/lib/events/index.d.ts +6 -0
- package/dist/lib/events/index.d.ts.map +1 -0
- package/dist/lib/events/index.js +5 -0
- package/dist/lib/events/index.js.map +1 -0
- package/dist/lib/events/types.d.ts +93 -0
- package/dist/lib/events/types.d.ts.map +1 -0
- package/dist/lib/events/types.js +7 -0
- package/dist/lib/events/types.js.map +1 -0
- package/dist/lib/events/writer.d.ts +68 -0
- package/dist/lib/events/writer.d.ts.map +1 -0
- package/dist/lib/events/writer.js +178 -0
- package/dist/lib/events/writer.js.map +1 -0
- package/dist/lib/events.d.ts +33 -0
- package/dist/lib/events.d.ts.map +1 -0
- package/dist/lib/events.js +81 -0
- package/dist/lib/events.js.map +1 -0
- package/dist/lib/events.test.d.ts +2 -0
- package/dist/lib/events.test.d.ts.map +1 -0
- package/dist/lib/events.test.js +123 -0
- package/dist/lib/events.test.js.map +1 -0
- package/dist/lib/file-injection.d.ts +32 -0
- package/dist/lib/file-injection.d.ts.map +1 -0
- package/dist/lib/file-injection.js +138 -0
- package/dist/lib/file-injection.js.map +1 -0
- package/dist/lib/file-injection.test.d.ts +2 -0
- package/dist/lib/file-injection.test.d.ts.map +1 -0
- package/dist/lib/file-injection.test.js +508 -0
- package/dist/lib/file-injection.test.js.map +1 -0
- package/dist/lib/init.d.ts +27 -0
- package/dist/lib/init.d.ts.map +1 -0
- package/dist/lib/init.js +363 -0
- package/dist/lib/init.js.map +1 -0
- package/dist/lib/init.test.d.ts +2 -0
- package/dist/lib/init.test.d.ts.map +1 -0
- package/dist/lib/init.test.js +315 -0
- package/dist/lib/init.test.js.map +1 -0
- package/dist/lib/plan.d.ts +11 -0
- package/dist/lib/plan.d.ts.map +1 -0
- package/dist/lib/plan.js +22 -0
- package/dist/lib/plan.js.map +1 -0
- package/dist/lib/plan.test.d.ts +2 -0
- package/dist/lib/plan.test.d.ts.map +1 -0
- package/dist/lib/plan.test.js +70 -0
- package/dist/lib/plan.test.js.map +1 -0
- package/dist/lib/prompts/codex.d.ts +18 -0
- package/dist/lib/prompts/codex.d.ts.map +1 -0
- package/dist/lib/prompts/codex.js +82 -0
- package/dist/lib/prompts/codex.js.map +1 -0
- package/dist/lib/prompts/opencode.d.ts +16 -0
- package/dist/lib/prompts/opencode.d.ts.map +1 -0
- package/dist/lib/prompts/opencode.js +71 -0
- package/dist/lib/prompts/opencode.js.map +1 -0
- package/dist/lib/prompts.d.ts +57 -0
- package/dist/lib/prompts.d.ts.map +1 -0
- package/dist/lib/prompts.js +255 -0
- package/dist/lib/prompts.js.map +1 -0
- package/dist/lib/prompts.test.d.ts +2 -0
- package/dist/lib/prompts.test.d.ts.map +1 -0
- package/dist/lib/prompts.test.js +128 -0
- package/dist/lib/prompts.test.js.map +1 -0
- package/dist/lib/skills.d.ts +36 -0
- package/dist/lib/skills.d.ts.map +1 -0
- package/dist/lib/skills.js +132 -0
- package/dist/lib/skills.js.map +1 -0
- package/dist/lib/slack.d.ts +43 -0
- package/dist/lib/slack.d.ts.map +1 -0
- package/dist/lib/slack.js +130 -0
- package/dist/lib/slack.js.map +1 -0
- package/dist/lib/slack.test.d.ts +2 -0
- package/dist/lib/slack.test.d.ts.map +1 -0
- package/dist/lib/slack.test.js +74 -0
- package/dist/lib/slack.test.js.map +1 -0
- package/dist/lib/templates/injections.d.ts +18 -0
- package/dist/lib/templates/injections.d.ts.map +1 -0
- package/dist/lib/templates/injections.js +32 -0
- package/dist/lib/templates/injections.js.map +1 -0
- package/dist/lib/templates/readme.d.ts +6 -0
- package/dist/lib/templates/readme.d.ts.map +1 -0
- package/dist/lib/templates/readme.js +168 -0
- package/dist/lib/templates/readme.js.map +1 -0
- package/docs/COMMANDS.md +664 -0
- package/docs/DESIGN.md +537 -0
- package/docs/EXAMPLES.md +812 -0
- package/docs/METHODOLOGY.md +390 -0
- package/docs/README.md +110 -0
- package/docs/WORKFLOWS.md +808 -0
- package/llms.txt +104 -0
- package/package.json +58 -0
package/dist/index.js
ADDED
|
@@ -0,0 +1,251 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { Command } from 'commander';
|
|
3
|
+
import { readFileSync } from 'fs';
|
|
4
|
+
import { fileURLToPath } from 'url';
|
|
5
|
+
import { dirname, join } from 'path';
|
|
6
|
+
import { resolveConfig } from './lib/config.js';
|
|
7
|
+
import { buildCommand } from './commands/build.js';
|
|
8
|
+
import { planCommand } from './commands/plan.js';
|
|
9
|
+
import { specCommand } from './commands/spec.js';
|
|
10
|
+
import { initCommand } from './commands/init.js';
|
|
11
|
+
import { cleanupCommand } from './commands/cleanup.js';
|
|
12
|
+
import { detectEngines } from './lib/engines/index.js';
|
|
13
|
+
import { listSkills, getSkill } from './lib/skills.js';
|
|
14
|
+
import { listAgents, getAgent } from './lib/agents.js';
|
|
15
|
+
import { getSkillsDir, getAgentsDir } from './lib/config.js';
|
|
16
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
17
|
+
const __dirname = dirname(__filename);
|
|
18
|
+
const packageJson = JSON.parse(readFileSync(join(__dirname, '../package.json'), 'utf-8'));
|
|
19
|
+
const program = new Command();
|
|
20
|
+
program
|
|
21
|
+
.name('vralphy')
|
|
22
|
+
.description('CLI tool implementing the Ralph Playbook methodology')
|
|
23
|
+
.version(packageJson.version);
|
|
24
|
+
program
|
|
25
|
+
.option('--engine <engine>', 'Engine selection (claude|opencode|codex)')
|
|
26
|
+
.option('--planning-model <model>', 'Planning model (default: opus)')
|
|
27
|
+
.option('--executor-model <model>', 'Executor/subagent model (default: sonnet)')
|
|
28
|
+
.option('--skills <path>', 'Skills directory')
|
|
29
|
+
.option('--agents <path>', 'Agents directory')
|
|
30
|
+
.option('--config <path>', 'Config file (default: vralphy.config.json)')
|
|
31
|
+
.option('--reasoning-effort <level>', 'Reasoning effort level (e.g., high, xhigh)')
|
|
32
|
+
.option('--verbose', 'Verbose output', false)
|
|
33
|
+
.option('--dry-run', 'Show what would execute without running', false);
|
|
34
|
+
program
|
|
35
|
+
.command('build [iterations]')
|
|
36
|
+
.description('Run build mode (default command)')
|
|
37
|
+
.action(async (iterations) => {
|
|
38
|
+
const opts = program.opts();
|
|
39
|
+
const config = await resolveConfig(opts);
|
|
40
|
+
let parsedIterations;
|
|
41
|
+
if (iterations) {
|
|
42
|
+
parsedIterations = parseInt(iterations, 10);
|
|
43
|
+
if (isNaN(parsedIterations) || parsedIterations < 0 || parsedIterations > 1000000) {
|
|
44
|
+
console.error('Error: iterations must be a positive number between 0 and 1,000,000');
|
|
45
|
+
process.exit(1);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
await buildCommand(config, { iterations: parsedIterations });
|
|
49
|
+
});
|
|
50
|
+
program
|
|
51
|
+
.command('plan [iterations]')
|
|
52
|
+
.description('Run plan mode')
|
|
53
|
+
.action(async (iterations) => {
|
|
54
|
+
const opts = program.opts();
|
|
55
|
+
const config = await resolveConfig(opts);
|
|
56
|
+
let parsedIterations;
|
|
57
|
+
if (iterations) {
|
|
58
|
+
parsedIterations = parseInt(iterations, 10);
|
|
59
|
+
if (isNaN(parsedIterations) || parsedIterations < 0 || parsedIterations > 1000000) {
|
|
60
|
+
console.error('Error: iterations must be a positive number between 0 and 1,000,000');
|
|
61
|
+
process.exit(1);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
await planCommand(config, { iterations: parsedIterations });
|
|
65
|
+
});
|
|
66
|
+
program
|
|
67
|
+
.command('spec [topic]')
|
|
68
|
+
.description('Interactive spec creation')
|
|
69
|
+
.action(async (topic) => {
|
|
70
|
+
const opts = program.opts();
|
|
71
|
+
const config = await resolveConfig(opts);
|
|
72
|
+
await specCommand(config, { topic });
|
|
73
|
+
});
|
|
74
|
+
program
|
|
75
|
+
.command('init')
|
|
76
|
+
.description('Initialize project for vralphy')
|
|
77
|
+
.option('--from <path>', 'Initialize from existing project')
|
|
78
|
+
.option('--no-ai', 'Skip AI generation, use template fallback')
|
|
79
|
+
.option('--no-inject', 'Skip injecting references into CLAUDE.md and AGENTS.md')
|
|
80
|
+
.option('--approve', 'Review AGENTS.md before saving')
|
|
81
|
+
.option('--engine <engine>', 'Specify engine for AI generation (claude|opencode|codex)')
|
|
82
|
+
.action(async (cmdOpts) => {
|
|
83
|
+
const globalOpts = program.opts();
|
|
84
|
+
// Commander parses --no-ai as ai: false, so we convert to noAi: true
|
|
85
|
+
const noAi = cmdOpts.ai === false;
|
|
86
|
+
const noInject = cmdOpts.inject === false;
|
|
87
|
+
await initCommand({ ...cmdOpts, noAi, noInject, verbose: globalOpts.verbose });
|
|
88
|
+
});
|
|
89
|
+
program
|
|
90
|
+
.command('cleanup')
|
|
91
|
+
.description('Remove vralphy from project')
|
|
92
|
+
.option('--from <path>', 'Clean up from existing project')
|
|
93
|
+
.option('--remove-specs', 'Also remove specs/ directory')
|
|
94
|
+
.option('--force', 'Skip confirmation prompt')
|
|
95
|
+
.action(async (cmdOpts) => {
|
|
96
|
+
await cleanupCommand(cmdOpts);
|
|
97
|
+
});
|
|
98
|
+
program
|
|
99
|
+
.command('engines')
|
|
100
|
+
.description('List available engines')
|
|
101
|
+
.action(async () => {
|
|
102
|
+
const available = await detectEngines();
|
|
103
|
+
console.log('Available engines:');
|
|
104
|
+
for (const engine of available) {
|
|
105
|
+
console.log(` - ${engine}`);
|
|
106
|
+
}
|
|
107
|
+
if (available.length === 0) {
|
|
108
|
+
console.log(' (none found - install claude or opencode CLI)');
|
|
109
|
+
}
|
|
110
|
+
});
|
|
111
|
+
const skillsCmd = program
|
|
112
|
+
.command('skills')
|
|
113
|
+
.description('Manage skills');
|
|
114
|
+
skillsCmd
|
|
115
|
+
.command('list')
|
|
116
|
+
.description('List available skills')
|
|
117
|
+
.action(async () => {
|
|
118
|
+
const opts = program.opts();
|
|
119
|
+
const config = await resolveConfig(opts);
|
|
120
|
+
const skillsDir = getSkillsDir(config.engine, config.skillsDir);
|
|
121
|
+
const skills = await listSkills(skillsDir);
|
|
122
|
+
if (skills.length === 0) {
|
|
123
|
+
console.log(`No skills found in: ${skillsDir}`);
|
|
124
|
+
console.log('Create .md files with frontmatter to add skills.');
|
|
125
|
+
return;
|
|
126
|
+
}
|
|
127
|
+
console.log('Available skills:');
|
|
128
|
+
for (const skill of skills) {
|
|
129
|
+
console.log(` - ${skill.name}${skill.description ? `: ${skill.description}` : ''}`);
|
|
130
|
+
}
|
|
131
|
+
});
|
|
132
|
+
skillsCmd
|
|
133
|
+
.command('show <name>')
|
|
134
|
+
.description('Show skill content')
|
|
135
|
+
.action(async (name) => {
|
|
136
|
+
const opts = program.opts();
|
|
137
|
+
const config = await resolveConfig(opts);
|
|
138
|
+
const skillsDir = getSkillsDir(config.engine, config.skillsDir);
|
|
139
|
+
const skill = await getSkill(skillsDir, name);
|
|
140
|
+
if (!skill) {
|
|
141
|
+
console.error(`Skill not found: ${name}`);
|
|
142
|
+
console.log(`\nAvailable skills in ${skillsDir}:`);
|
|
143
|
+
const skills = await listSkills(skillsDir);
|
|
144
|
+
for (const s of skills) {
|
|
145
|
+
console.log(` - ${s.name}`);
|
|
146
|
+
}
|
|
147
|
+
process.exit(1);
|
|
148
|
+
}
|
|
149
|
+
console.log(`# ${skill.name}`);
|
|
150
|
+
if (skill.metadata.description) {
|
|
151
|
+
console.log(`\n${skill.metadata.description}`);
|
|
152
|
+
}
|
|
153
|
+
if (skill.metadata.triggers && skill.metadata.triggers.length > 0) {
|
|
154
|
+
console.log(`\nTriggers: ${skill.metadata.triggers.join(', ')}`);
|
|
155
|
+
}
|
|
156
|
+
if (skill.metadata.alwaysInclude) {
|
|
157
|
+
console.log('Always included: yes');
|
|
158
|
+
}
|
|
159
|
+
console.log(`\n---\n`);
|
|
160
|
+
console.log(skill.content);
|
|
161
|
+
});
|
|
162
|
+
// Default action for 'skills' with no subcommand (backwards compat)
|
|
163
|
+
skillsCmd.action(async () => {
|
|
164
|
+
const opts = program.opts();
|
|
165
|
+
const config = await resolveConfig(opts);
|
|
166
|
+
const skillsDir = getSkillsDir(config.engine, config.skillsDir);
|
|
167
|
+
const skills = await listSkills(skillsDir);
|
|
168
|
+
if (skills.length === 0) {
|
|
169
|
+
console.log(`No skills found in: ${skillsDir}`);
|
|
170
|
+
console.log('Create .md files with frontmatter to add skills.');
|
|
171
|
+
return;
|
|
172
|
+
}
|
|
173
|
+
console.log('Available skills:');
|
|
174
|
+
for (const skill of skills) {
|
|
175
|
+
console.log(` - ${skill.name}${skill.description ? `: ${skill.description}` : ''}`);
|
|
176
|
+
}
|
|
177
|
+
});
|
|
178
|
+
const agentsCmd = program
|
|
179
|
+
.command('agents')
|
|
180
|
+
.description('Manage agents');
|
|
181
|
+
agentsCmd
|
|
182
|
+
.command('list')
|
|
183
|
+
.description('List available agents')
|
|
184
|
+
.action(async () => {
|
|
185
|
+
const opts = program.opts();
|
|
186
|
+
const config = await resolveConfig(opts);
|
|
187
|
+
const agentsDir = getAgentsDir(config.engine, config.agentsDir);
|
|
188
|
+
const agents = await listAgents(agentsDir);
|
|
189
|
+
if (agents.length === 0) {
|
|
190
|
+
console.log(`No agents found in: ${agentsDir}`);
|
|
191
|
+
console.log('Create .md files with frontmatter to add agents.');
|
|
192
|
+
return;
|
|
193
|
+
}
|
|
194
|
+
console.log('Available agents:');
|
|
195
|
+
for (const agent of agents) {
|
|
196
|
+
const model = agent.model ? ` (${agent.model})` : '';
|
|
197
|
+
console.log(` - ${agent.name}${model}${agent.description ? `: ${agent.description}` : ''}`);
|
|
198
|
+
}
|
|
199
|
+
});
|
|
200
|
+
agentsCmd
|
|
201
|
+
.command('show <name>')
|
|
202
|
+
.description('Show agent content')
|
|
203
|
+
.action(async (name) => {
|
|
204
|
+
const opts = program.opts();
|
|
205
|
+
const config = await resolveConfig(opts);
|
|
206
|
+
const agentsDir = getAgentsDir(config.engine, config.agentsDir);
|
|
207
|
+
const agent = await getAgent(agentsDir, name);
|
|
208
|
+
if (!agent) {
|
|
209
|
+
console.error(`Agent not found: ${name}`);
|
|
210
|
+
console.log(`\nAvailable agents in ${agentsDir}:`);
|
|
211
|
+
const agents = await listAgents(agentsDir);
|
|
212
|
+
for (const a of agents) {
|
|
213
|
+
console.log(` - ${a.name}`);
|
|
214
|
+
}
|
|
215
|
+
process.exit(1);
|
|
216
|
+
}
|
|
217
|
+
console.log(`# ${agent.name}`);
|
|
218
|
+
if (agent.metadata.description) {
|
|
219
|
+
console.log(`\n${agent.metadata.description}`);
|
|
220
|
+
}
|
|
221
|
+
if (agent.metadata.model) {
|
|
222
|
+
console.log(`\nModel: ${agent.metadata.model}`);
|
|
223
|
+
}
|
|
224
|
+
console.log(`\n---\n`);
|
|
225
|
+
console.log(agent.content);
|
|
226
|
+
});
|
|
227
|
+
// Default action for 'agents' with no subcommand (backwards compat)
|
|
228
|
+
agentsCmd.action(async () => {
|
|
229
|
+
const opts = program.opts();
|
|
230
|
+
const config = await resolveConfig(opts);
|
|
231
|
+
const agentsDir = getAgentsDir(config.engine, config.agentsDir);
|
|
232
|
+
const agents = await listAgents(agentsDir);
|
|
233
|
+
if (agents.length === 0) {
|
|
234
|
+
console.log(`No agents found in: ${agentsDir}`);
|
|
235
|
+
console.log('Create .md files with frontmatter to add agents.');
|
|
236
|
+
return;
|
|
237
|
+
}
|
|
238
|
+
console.log('Available agents:');
|
|
239
|
+
for (const agent of agents) {
|
|
240
|
+
const model = agent.model ? ` (${agent.model})` : '';
|
|
241
|
+
console.log(` - ${agent.name}${model}${agent.description ? `: ${agent.description}` : ''}`);
|
|
242
|
+
}
|
|
243
|
+
});
|
|
244
|
+
program
|
|
245
|
+
.action(async () => {
|
|
246
|
+
const opts = program.opts();
|
|
247
|
+
const config = await resolveConfig(opts);
|
|
248
|
+
await buildCommand(config, {});
|
|
249
|
+
});
|
|
250
|
+
program.parse();
|
|
251
|
+
//# 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,32 @@
|
|
|
1
|
+
export interface AgentMetadata {
|
|
2
|
+
name: string;
|
|
3
|
+
description?: string;
|
|
4
|
+
model?: string;
|
|
5
|
+
}
|
|
6
|
+
export interface Agent {
|
|
7
|
+
name: string;
|
|
8
|
+
path: string;
|
|
9
|
+
metadata: AgentMetadata;
|
|
10
|
+
content: string;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Load all agents from a directory
|
|
14
|
+
*/
|
|
15
|
+
export declare function loadAgents(dir: string): Promise<Agent[]>;
|
|
16
|
+
/**
|
|
17
|
+
* Format agents for prompt injection
|
|
18
|
+
*/
|
|
19
|
+
export declare function formatAgentsForPrompt(agents: Agent[], defaultModel: string): string;
|
|
20
|
+
/**
|
|
21
|
+
* List available agents (for CLI command)
|
|
22
|
+
*/
|
|
23
|
+
export declare function listAgents(dir: string): Promise<{
|
|
24
|
+
name: string;
|
|
25
|
+
description?: string;
|
|
26
|
+
model?: string;
|
|
27
|
+
}[]>;
|
|
28
|
+
/**
|
|
29
|
+
* Get agent by name
|
|
30
|
+
*/
|
|
31
|
+
export declare function getAgent(dir: string, name: string): Promise<Agent | undefined>;
|
|
32
|
+
//# sourceMappingURL=agents.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agents.d.ts","sourceRoot":"","sources":["../../src/lib/agents.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,KAAK;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,aAAa,CAAC;IACxB,OAAO,EAAE,MAAM,CAAC;CACjB;AA+CD;;GAEG;AACH,wBAAsB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC,CAoB9D;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM,CAcnF;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,EAAE,CAAC,CAO/G;AAED;;GAEG;AACH,wBAAsB,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,GAAG,SAAS,CAAC,CAGpF"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { readFile, readdir } from 'fs/promises';
|
|
2
|
+
import { existsSync } from 'fs';
|
|
3
|
+
import { join, basename } from 'path';
|
|
4
|
+
/**
|
|
5
|
+
* Parse frontmatter from markdown file
|
|
6
|
+
*/
|
|
7
|
+
function parseFrontmatter(content) {
|
|
8
|
+
const frontmatterMatch = content.match(/^---\n([\s\S]*?)\n---\n([\s\S]*)$/);
|
|
9
|
+
if (!frontmatterMatch) {
|
|
10
|
+
return { metadata: {}, content };
|
|
11
|
+
}
|
|
12
|
+
const [, frontmatter, body] = frontmatterMatch;
|
|
13
|
+
const metadata = {};
|
|
14
|
+
for (const line of frontmatter.split('\n')) {
|
|
15
|
+
const match = line.match(/^(\w+):\s*(.*)$/);
|
|
16
|
+
if (match) {
|
|
17
|
+
const [, key, value] = match;
|
|
18
|
+
metadata[key] = value;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
return { metadata, content: body };
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Load a single agent from file
|
|
25
|
+
*/
|
|
26
|
+
async function loadAgent(path) {
|
|
27
|
+
const content = await readFile(path, 'utf-8');
|
|
28
|
+
const { metadata, content: body } = parseFrontmatter(content);
|
|
29
|
+
const name = metadata.name ?? basename(path, '.md');
|
|
30
|
+
return {
|
|
31
|
+
name,
|
|
32
|
+
path,
|
|
33
|
+
metadata: {
|
|
34
|
+
name,
|
|
35
|
+
description: metadata.description,
|
|
36
|
+
model: metadata.model,
|
|
37
|
+
},
|
|
38
|
+
content: body,
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Load all agents from a directory
|
|
43
|
+
*/
|
|
44
|
+
export async function loadAgents(dir) {
|
|
45
|
+
if (!existsSync(dir)) {
|
|
46
|
+
return [];
|
|
47
|
+
}
|
|
48
|
+
const files = await readdir(dir);
|
|
49
|
+
const mdFiles = files.filter((f) => f.endsWith('.md'));
|
|
50
|
+
const agents = [];
|
|
51
|
+
for (const file of mdFiles) {
|
|
52
|
+
try {
|
|
53
|
+
const agent = await loadAgent(join(dir, file));
|
|
54
|
+
agents.push(agent);
|
|
55
|
+
}
|
|
56
|
+
catch (e) {
|
|
57
|
+
console.error(`Failed to load agent ${file}:`, e);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
return agents;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Format agents for prompt injection
|
|
64
|
+
*/
|
|
65
|
+
export function formatAgentsForPrompt(agents, defaultModel) {
|
|
66
|
+
if (agents.length === 0)
|
|
67
|
+
return '';
|
|
68
|
+
let result = '## Available Specialized Agents\n\n';
|
|
69
|
+
result += 'You may spawn these agents using subagents when their expertise is needed:\n\n';
|
|
70
|
+
for (const agent of agents) {
|
|
71
|
+
const name = agent.name ?? 'Unnamed Agent';
|
|
72
|
+
const description = agent.metadata?.description ?? 'No description';
|
|
73
|
+
const model = agent.metadata?.model ?? defaultModel;
|
|
74
|
+
result += `- **${name}**: ${description} (use ${model})\n`;
|
|
75
|
+
}
|
|
76
|
+
return result;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* List available agents (for CLI command)
|
|
80
|
+
*/
|
|
81
|
+
export async function listAgents(dir) {
|
|
82
|
+
const agents = await loadAgents(dir);
|
|
83
|
+
return agents.map((a) => ({
|
|
84
|
+
name: a.name,
|
|
85
|
+
description: a.metadata.description,
|
|
86
|
+
model: a.metadata.model,
|
|
87
|
+
}));
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Get agent by name
|
|
91
|
+
*/
|
|
92
|
+
export async function getAgent(dir, name) {
|
|
93
|
+
const agents = await loadAgents(dir);
|
|
94
|
+
return agents.find((a) => a.name === name);
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=agents.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agents.js","sourceRoot":"","sources":["../../src/lib/agents.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { EngineName } from './engines/index.js';
|
|
2
|
+
export interface CodexConfig {
|
|
3
|
+
maxAgents?: number;
|
|
4
|
+
workerTimeout?: number;
|
|
5
|
+
}
|
|
6
|
+
export interface VralphyConfig {
|
|
7
|
+
engine: EngineName;
|
|
8
|
+
planningModel: string;
|
|
9
|
+
executorModel: string;
|
|
10
|
+
skillsDir: string;
|
|
11
|
+
agentsDir: string;
|
|
12
|
+
verbose: boolean;
|
|
13
|
+
dryRun: boolean;
|
|
14
|
+
reasoningEffort?: string;
|
|
15
|
+
codex?: CodexConfig;
|
|
16
|
+
slackWebhook?: string;
|
|
17
|
+
}
|
|
18
|
+
export interface ConfigOptions {
|
|
19
|
+
engine?: string;
|
|
20
|
+
planningModel?: string;
|
|
21
|
+
executorModel?: string;
|
|
22
|
+
skills?: string;
|
|
23
|
+
agents?: string;
|
|
24
|
+
config?: string;
|
|
25
|
+
reasoningEffort?: string;
|
|
26
|
+
verbose?: boolean;
|
|
27
|
+
dryRun?: boolean;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Get preferred project config path (non-invasive location)
|
|
31
|
+
*/
|
|
32
|
+
export declare function getPreferredConfigPath(): string;
|
|
33
|
+
/**
|
|
34
|
+
* Get all possible project config paths in order of preference
|
|
35
|
+
*/
|
|
36
|
+
export declare function getProjectConfigPaths(): string[];
|
|
37
|
+
/**
|
|
38
|
+
* Resolve configuration from multiple sources
|
|
39
|
+
* Priority: CLI flags > env vars > project config > global config > defaults
|
|
40
|
+
*/
|
|
41
|
+
export declare function resolveConfig(cliOptions: ConfigOptions): Promise<VralphyConfig>;
|
|
42
|
+
/**
|
|
43
|
+
* Determine skills directory based on engine
|
|
44
|
+
*/
|
|
45
|
+
export declare function getSkillsDir(engine: EngineName, customPath?: string): string;
|
|
46
|
+
/**
|
|
47
|
+
* Determine agents directory based on engine
|
|
48
|
+
*/
|
|
49
|
+
export declare function getAgentsDir(engine: EngineName, customPath?: string): string;
|
|
50
|
+
/**
|
|
51
|
+
* Find project root by looking for common markers
|
|
52
|
+
*/
|
|
53
|
+
export declare function findProjectRoot(startDir?: string): string;
|
|
54
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,UAAU,EAAa,MAAM,oBAAoB,CAAC;AAG3D,MAAM,WAAW,WAAW;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,UAAU,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,OAAO,CAAC;IAChB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AA2CD;;GAEG;AACH,wBAAgB,sBAAsB,IAAI,MAAM,CAE/C;AAED;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,MAAM,EAAE,CAKhD;AAED;;;GAGG;AACH,wBAAsB,aAAa,CAAC,UAAU,EAAE,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC,CAqFrF;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,UAAU,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,CAe5E;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,UAAU,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,CAe5E;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,QAAQ,GAAE,MAAsB,GAAG,MAAM,CAoBxE"}
|
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
import { readFile } from 'fs/promises';
|
|
2
|
+
import { existsSync } from 'fs';
|
|
3
|
+
import { join, parse as parsePath } from 'path';
|
|
4
|
+
import { homedir } from 'os';
|
|
5
|
+
import { getEngine } from './engines/index.js';
|
|
6
|
+
import { validateModelForEngine } from './engines/base.js';
|
|
7
|
+
const DEFAULT_CONFIG = {
|
|
8
|
+
engine: 'claude',
|
|
9
|
+
planningModel: 'opus',
|
|
10
|
+
executorModel: 'sonnet',
|
|
11
|
+
skillsDir: '.claude/skills',
|
|
12
|
+
agentsDir: 'agents',
|
|
13
|
+
verbose: false,
|
|
14
|
+
dryRun: false,
|
|
15
|
+
reasoningEffort: undefined,
|
|
16
|
+
codex: {
|
|
17
|
+
maxAgents: 8,
|
|
18
|
+
workerTimeout: 300,
|
|
19
|
+
},
|
|
20
|
+
};
|
|
21
|
+
/**
|
|
22
|
+
* Load config from file if it exists
|
|
23
|
+
*/
|
|
24
|
+
async function loadConfigFile(path) {
|
|
25
|
+
if (!existsSync(path)) {
|
|
26
|
+
return {};
|
|
27
|
+
}
|
|
28
|
+
try {
|
|
29
|
+
const content = await readFile(path, 'utf-8');
|
|
30
|
+
return JSON.parse(content);
|
|
31
|
+
}
|
|
32
|
+
catch (e) {
|
|
33
|
+
const errorMsg = e instanceof Error ? e.message : String(e);
|
|
34
|
+
console.warn(`Warning: Failed to parse config file at ${path}: ${errorMsg}`);
|
|
35
|
+
console.warn('Using default configuration instead.');
|
|
36
|
+
return {};
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Get path to global config file
|
|
41
|
+
*/
|
|
42
|
+
function getGlobalConfigPath() {
|
|
43
|
+
return join(homedir(), '.config', 'vralphy', 'config.json');
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Get preferred project config path (non-invasive location)
|
|
47
|
+
*/
|
|
48
|
+
export function getPreferredConfigPath() {
|
|
49
|
+
return '.vralphy/config.json';
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Get all possible project config paths in order of preference
|
|
53
|
+
*/
|
|
54
|
+
export function getProjectConfigPaths() {
|
|
55
|
+
return [
|
|
56
|
+
'.vralphy/config.json', // Preferred (non-invasive)
|
|
57
|
+
'vralphy.config.json', // Legacy (backwards compat)
|
|
58
|
+
];
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Resolve configuration from multiple sources
|
|
62
|
+
* Priority: CLI flags > env vars > project config > global config > defaults
|
|
63
|
+
*/
|
|
64
|
+
export async function resolveConfig(cliOptions) {
|
|
65
|
+
// Load global config first (lowest priority of file configs)
|
|
66
|
+
const globalConfig = await loadConfigFile(getGlobalConfigPath());
|
|
67
|
+
// Load project config (overrides global)
|
|
68
|
+
// Prefer .vralphy/config.json (non-invasive), fallback to vralphy.config.json (legacy)
|
|
69
|
+
let configPath;
|
|
70
|
+
if (cliOptions.config) {
|
|
71
|
+
configPath = cliOptions.config;
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
const projectConfigPaths = [
|
|
75
|
+
'.vralphy/config.json', // Preferred (non-invasive)
|
|
76
|
+
'vralphy.config.json', // Legacy (backwards compat)
|
|
77
|
+
];
|
|
78
|
+
configPath = projectConfigPaths.find(p => existsSync(p)) ?? '.vralphy/config.json';
|
|
79
|
+
}
|
|
80
|
+
const projectConfig = await loadConfigFile(configPath);
|
|
81
|
+
// Merge: global ← project (project wins)
|
|
82
|
+
const fileConfig = {
|
|
83
|
+
...globalConfig,
|
|
84
|
+
...projectConfig,
|
|
85
|
+
// Deep merge codex config
|
|
86
|
+
codex: {
|
|
87
|
+
...globalConfig.codex,
|
|
88
|
+
...projectConfig.codex,
|
|
89
|
+
},
|
|
90
|
+
};
|
|
91
|
+
// Resolve Codex-specific config
|
|
92
|
+
const codexMaxAgents = process.env.VRALPHY_CODEX_MAX_AGENTS
|
|
93
|
+
? parseInt(process.env.VRALPHY_CODEX_MAX_AGENTS, 10)
|
|
94
|
+
: fileConfig.codex?.maxAgents ?? DEFAULT_CONFIG.codex?.maxAgents;
|
|
95
|
+
const codexWorkerTimeout = process.env.VRALPHY_CODEX_WORKER_TIMEOUT
|
|
96
|
+
? parseInt(process.env.VRALPHY_CODEX_WORKER_TIMEOUT, 10)
|
|
97
|
+
: fileConfig.codex?.workerTimeout ?? DEFAULT_CONFIG.codex?.workerTimeout;
|
|
98
|
+
// Validate and resolve engine
|
|
99
|
+
const engineValue = cliOptions.engine ?? process.env.VRALPHY_ENGINE ?? fileConfig.engine ?? DEFAULT_CONFIG.engine;
|
|
100
|
+
const validEngines = ['claude', 'opencode', 'codex'];
|
|
101
|
+
if (!validEngines.includes(engineValue)) {
|
|
102
|
+
throw new Error(`Invalid engine: ${engineValue}. Must be one of: ${validEngines.join(', ')}`);
|
|
103
|
+
}
|
|
104
|
+
// Resolve Slack webhook URL
|
|
105
|
+
const slackWebhook = process.env.VRALPHY_SLACK_WEBHOOK ?? fileConfig.slackWebhook;
|
|
106
|
+
const config = {
|
|
107
|
+
engine: engineValue,
|
|
108
|
+
planningModel: cliOptions.planningModel ?? process.env.VRALPHY_PLANNING_MODEL ?? fileConfig.planningModel ?? DEFAULT_CONFIG.planningModel,
|
|
109
|
+
executorModel: cliOptions.executorModel ?? process.env.VRALPHY_EXECUTOR_MODEL ?? fileConfig.executorModel ?? DEFAULT_CONFIG.executorModel,
|
|
110
|
+
skillsDir: cliOptions.skills ?? fileConfig.skillsDir ?? DEFAULT_CONFIG.skillsDir,
|
|
111
|
+
agentsDir: cliOptions.agents ?? fileConfig.agentsDir ?? DEFAULT_CONFIG.agentsDir,
|
|
112
|
+
verbose: cliOptions.verbose ?? fileConfig.verbose ?? DEFAULT_CONFIG.verbose,
|
|
113
|
+
dryRun: cliOptions.dryRun ?? fileConfig.dryRun ?? DEFAULT_CONFIG.dryRun,
|
|
114
|
+
reasoningEffort: cliOptions.reasoningEffort ?? process.env.VRALPHY_REASONING_EFFORT ?? fileConfig.reasoningEffort ?? DEFAULT_CONFIG.reasoningEffort,
|
|
115
|
+
codex: {
|
|
116
|
+
maxAgents: codexMaxAgents,
|
|
117
|
+
workerTimeout: codexWorkerTimeout,
|
|
118
|
+
},
|
|
119
|
+
slackWebhook,
|
|
120
|
+
};
|
|
121
|
+
// Validate model is compatible with engine
|
|
122
|
+
validateModelForEngine(config.planningModel, config.engine);
|
|
123
|
+
// Soft-validate model availability (warn, don't error)
|
|
124
|
+
const engine = getEngine(config.engine);
|
|
125
|
+
const isSupported = await engine.isModelSupported(config.planningModel);
|
|
126
|
+
if (!isSupported) {
|
|
127
|
+
const availableModels = await engine.getAvailableModels();
|
|
128
|
+
if (availableModels.length === 0) {
|
|
129
|
+
// Cache unavailable - allow execution
|
|
130
|
+
console.warn(`Warning: Could not verify model '${config.planningModel}' (${config.engine} model cache unavailable).`);
|
|
131
|
+
console.warn('Attempting to use anyway. If model is invalid, the engine will report an error.\n');
|
|
132
|
+
}
|
|
133
|
+
else {
|
|
134
|
+
// Cache available but model not found - still allow but warn
|
|
135
|
+
console.warn(`Warning: Model '${config.planningModel}' not found in ${config.engine} cache.`);
|
|
136
|
+
console.warn(`Known models: ${availableModels.slice(0, 5).join(', ')}${availableModels.length > 5 ? '...' : ''}`);
|
|
137
|
+
console.warn('Attempting to use anyway.\n');
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
return config;
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Determine skills directory based on engine
|
|
144
|
+
*/
|
|
145
|
+
export function getSkillsDir(engine, customPath) {
|
|
146
|
+
if (customPath)
|
|
147
|
+
return customPath;
|
|
148
|
+
const engineDirs = {
|
|
149
|
+
claude: '.claude/skills',
|
|
150
|
+
opencode: '.opencode/skills',
|
|
151
|
+
codex: '.codex/skills',
|
|
152
|
+
};
|
|
153
|
+
const engineDir = engineDirs[engine];
|
|
154
|
+
if (existsSync(engineDir))
|
|
155
|
+
return engineDir;
|
|
156
|
+
if (existsSync('skills'))
|
|
157
|
+
return 'skills';
|
|
158
|
+
return engineDir;
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Determine agents directory based on engine
|
|
162
|
+
*/
|
|
163
|
+
export function getAgentsDir(engine, customPath) {
|
|
164
|
+
if (customPath)
|
|
165
|
+
return customPath;
|
|
166
|
+
const engineDirs = {
|
|
167
|
+
claude: '.claude/agents',
|
|
168
|
+
opencode: '.opencode/agents',
|
|
169
|
+
codex: '.codex/agents',
|
|
170
|
+
};
|
|
171
|
+
const engineDir = engineDirs[engine];
|
|
172
|
+
if (existsSync(engineDir))
|
|
173
|
+
return engineDir;
|
|
174
|
+
if (existsSync('agents'))
|
|
175
|
+
return 'agents';
|
|
176
|
+
return engineDir;
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Find project root by looking for common markers
|
|
180
|
+
*/
|
|
181
|
+
export function findProjectRoot(startDir = process.cwd()) {
|
|
182
|
+
let dir = startDir;
|
|
183
|
+
const rootPath = parsePath(dir).root;
|
|
184
|
+
while (dir !== rootPath) {
|
|
185
|
+
const markers = ['package.json', 'Cargo.toml', 'go.mod', '.git', 'AGENTS.md'];
|
|
186
|
+
for (const marker of markers) {
|
|
187
|
+
if (existsSync(join(dir, marker))) {
|
|
188
|
+
return dir;
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
const parent = join(dir, '..');
|
|
192
|
+
// Prevent infinite loop if join doesn't change the path
|
|
193
|
+
if (parent === dir)
|
|
194
|
+
break;
|
|
195
|
+
dir = parent;
|
|
196
|
+
}
|
|
197
|
+
return startDir;
|
|
198
|
+
}
|
|
199
|
+
//# sourceMappingURL=config.js.map
|