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.
Files changed (158) hide show
  1. package/README.md +512 -0
  2. package/bin/vralphy.js +3 -0
  3. package/dist/commands/build.d.ts +9 -0
  4. package/dist/commands/build.d.ts.map +1 -0
  5. package/dist/commands/build.js +176 -0
  6. package/dist/commands/build.js.map +1 -0
  7. package/dist/commands/cleanup.d.ts +19 -0
  8. package/dist/commands/cleanup.d.ts.map +1 -0
  9. package/dist/commands/cleanup.js +159 -0
  10. package/dist/commands/cleanup.js.map +1 -0
  11. package/dist/commands/cleanup.test.d.ts +2 -0
  12. package/dist/commands/cleanup.test.d.ts.map +1 -0
  13. package/dist/commands/cleanup.test.js +389 -0
  14. package/dist/commands/cleanup.test.js.map +1 -0
  15. package/dist/commands/init.d.ts +13 -0
  16. package/dist/commands/init.d.ts.map +1 -0
  17. package/dist/commands/init.js +120 -0
  18. package/dist/commands/init.js.map +1 -0
  19. package/dist/commands/plan.d.ts +9 -0
  20. package/dist/commands/plan.d.ts.map +1 -0
  21. package/dist/commands/plan.js +147 -0
  22. package/dist/commands/plan.js.map +1 -0
  23. package/dist/commands/spec.d.ts +9 -0
  24. package/dist/commands/spec.d.ts.map +1 -0
  25. package/dist/commands/spec.js +111 -0
  26. package/dist/commands/spec.js.map +1 -0
  27. package/dist/index.d.ts +3 -0
  28. package/dist/index.d.ts.map +1 -0
  29. package/dist/index.js +251 -0
  30. package/dist/index.js.map +1 -0
  31. package/dist/lib/agents.d.ts +32 -0
  32. package/dist/lib/agents.d.ts.map +1 -0
  33. package/dist/lib/agents.js +96 -0
  34. package/dist/lib/agents.js.map +1 -0
  35. package/dist/lib/config.d.ts +54 -0
  36. package/dist/lib/config.d.ts.map +1 -0
  37. package/dist/lib/config.js +199 -0
  38. package/dist/lib/config.js.map +1 -0
  39. package/dist/lib/config.test.d.ts +2 -0
  40. package/dist/lib/config.test.d.ts.map +1 -0
  41. package/dist/lib/config.test.js +57 -0
  42. package/dist/lib/config.test.js.map +1 -0
  43. package/dist/lib/context.d.ts +29 -0
  44. package/dist/lib/context.d.ts.map +1 -0
  45. package/dist/lib/context.js +175 -0
  46. package/dist/lib/context.js.map +1 -0
  47. package/dist/lib/engines/base.d.ts +75 -0
  48. package/dist/lib/engines/base.d.ts.map +1 -0
  49. package/dist/lib/engines/base.js +62 -0
  50. package/dist/lib/engines/base.js.map +1 -0
  51. package/dist/lib/engines/base.test.d.ts +2 -0
  52. package/dist/lib/engines/base.test.d.ts.map +1 -0
  53. package/dist/lib/engines/base.test.js +28 -0
  54. package/dist/lib/engines/base.test.js.map +1 -0
  55. package/dist/lib/engines/claude.d.ts +12 -0
  56. package/dist/lib/engines/claude.d.ts.map +1 -0
  57. package/dist/lib/engines/claude.js +156 -0
  58. package/dist/lib/engines/claude.js.map +1 -0
  59. package/dist/lib/engines/codex.d.ts +28 -0
  60. package/dist/lib/engines/codex.d.ts.map +1 -0
  61. package/dist/lib/engines/codex.js +177 -0
  62. package/dist/lib/engines/codex.js.map +1 -0
  63. package/dist/lib/engines/index.d.ts +19 -0
  64. package/dist/lib/engines/index.d.ts.map +1 -0
  65. package/dist/lib/engines/index.js +40 -0
  66. package/dist/lib/engines/index.js.map +1 -0
  67. package/dist/lib/engines/opencode.d.ts +14 -0
  68. package/dist/lib/engines/opencode.d.ts.map +1 -0
  69. package/dist/lib/engines/opencode.js +127 -0
  70. package/dist/lib/engines/opencode.js.map +1 -0
  71. package/dist/lib/events/index.d.ts +6 -0
  72. package/dist/lib/events/index.d.ts.map +1 -0
  73. package/dist/lib/events/index.js +5 -0
  74. package/dist/lib/events/index.js.map +1 -0
  75. package/dist/lib/events/types.d.ts +93 -0
  76. package/dist/lib/events/types.d.ts.map +1 -0
  77. package/dist/lib/events/types.js +7 -0
  78. package/dist/lib/events/types.js.map +1 -0
  79. package/dist/lib/events/writer.d.ts +68 -0
  80. package/dist/lib/events/writer.d.ts.map +1 -0
  81. package/dist/lib/events/writer.js +178 -0
  82. package/dist/lib/events/writer.js.map +1 -0
  83. package/dist/lib/events.d.ts +33 -0
  84. package/dist/lib/events.d.ts.map +1 -0
  85. package/dist/lib/events.js +81 -0
  86. package/dist/lib/events.js.map +1 -0
  87. package/dist/lib/events.test.d.ts +2 -0
  88. package/dist/lib/events.test.d.ts.map +1 -0
  89. package/dist/lib/events.test.js +123 -0
  90. package/dist/lib/events.test.js.map +1 -0
  91. package/dist/lib/file-injection.d.ts +32 -0
  92. package/dist/lib/file-injection.d.ts.map +1 -0
  93. package/dist/lib/file-injection.js +138 -0
  94. package/dist/lib/file-injection.js.map +1 -0
  95. package/dist/lib/file-injection.test.d.ts +2 -0
  96. package/dist/lib/file-injection.test.d.ts.map +1 -0
  97. package/dist/lib/file-injection.test.js +508 -0
  98. package/dist/lib/file-injection.test.js.map +1 -0
  99. package/dist/lib/init.d.ts +27 -0
  100. package/dist/lib/init.d.ts.map +1 -0
  101. package/dist/lib/init.js +363 -0
  102. package/dist/lib/init.js.map +1 -0
  103. package/dist/lib/init.test.d.ts +2 -0
  104. package/dist/lib/init.test.d.ts.map +1 -0
  105. package/dist/lib/init.test.js +315 -0
  106. package/dist/lib/init.test.js.map +1 -0
  107. package/dist/lib/plan.d.ts +11 -0
  108. package/dist/lib/plan.d.ts.map +1 -0
  109. package/dist/lib/plan.js +22 -0
  110. package/dist/lib/plan.js.map +1 -0
  111. package/dist/lib/plan.test.d.ts +2 -0
  112. package/dist/lib/plan.test.d.ts.map +1 -0
  113. package/dist/lib/plan.test.js +70 -0
  114. package/dist/lib/plan.test.js.map +1 -0
  115. package/dist/lib/prompts/codex.d.ts +18 -0
  116. package/dist/lib/prompts/codex.d.ts.map +1 -0
  117. package/dist/lib/prompts/codex.js +82 -0
  118. package/dist/lib/prompts/codex.js.map +1 -0
  119. package/dist/lib/prompts/opencode.d.ts +16 -0
  120. package/dist/lib/prompts/opencode.d.ts.map +1 -0
  121. package/dist/lib/prompts/opencode.js +71 -0
  122. package/dist/lib/prompts/opencode.js.map +1 -0
  123. package/dist/lib/prompts.d.ts +57 -0
  124. package/dist/lib/prompts.d.ts.map +1 -0
  125. package/dist/lib/prompts.js +255 -0
  126. package/dist/lib/prompts.js.map +1 -0
  127. package/dist/lib/prompts.test.d.ts +2 -0
  128. package/dist/lib/prompts.test.d.ts.map +1 -0
  129. package/dist/lib/prompts.test.js +128 -0
  130. package/dist/lib/prompts.test.js.map +1 -0
  131. package/dist/lib/skills.d.ts +36 -0
  132. package/dist/lib/skills.d.ts.map +1 -0
  133. package/dist/lib/skills.js +132 -0
  134. package/dist/lib/skills.js.map +1 -0
  135. package/dist/lib/slack.d.ts +43 -0
  136. package/dist/lib/slack.d.ts.map +1 -0
  137. package/dist/lib/slack.js +130 -0
  138. package/dist/lib/slack.js.map +1 -0
  139. package/dist/lib/slack.test.d.ts +2 -0
  140. package/dist/lib/slack.test.d.ts.map +1 -0
  141. package/dist/lib/slack.test.js +74 -0
  142. package/dist/lib/slack.test.js.map +1 -0
  143. package/dist/lib/templates/injections.d.ts +18 -0
  144. package/dist/lib/templates/injections.d.ts.map +1 -0
  145. package/dist/lib/templates/injections.js +32 -0
  146. package/dist/lib/templates/injections.js.map +1 -0
  147. package/dist/lib/templates/readme.d.ts +6 -0
  148. package/dist/lib/templates/readme.d.ts.map +1 -0
  149. package/dist/lib/templates/readme.js +168 -0
  150. package/dist/lib/templates/readme.js.map +1 -0
  151. package/docs/COMMANDS.md +664 -0
  152. package/docs/DESIGN.md +537 -0
  153. package/docs/EXAMPLES.md +812 -0
  154. package/docs/METHODOLOGY.md +390 -0
  155. package/docs/README.md +110 -0
  156. package/docs/WORKFLOWS.md +808 -0
  157. package/llms.txt +104 -0
  158. 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