vralphy 0.0.1

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 (66) hide show
  1. package/bin/vralphy.js +3 -0
  2. package/dist/commands/build.d.ts +9 -0
  3. package/dist/commands/build.d.ts.map +1 -0
  4. package/dist/commands/build.js +85 -0
  5. package/dist/commands/build.js.map +1 -0
  6. package/dist/commands/init.d.ts +8 -0
  7. package/dist/commands/init.d.ts.map +1 -0
  8. package/dist/commands/init.js +34 -0
  9. package/dist/commands/init.js.map +1 -0
  10. package/dist/commands/plan.d.ts +9 -0
  11. package/dist/commands/plan.d.ts.map +1 -0
  12. package/dist/commands/plan.js +85 -0
  13. package/dist/commands/plan.js.map +1 -0
  14. package/dist/commands/spec.d.ts +9 -0
  15. package/dist/commands/spec.d.ts.map +1 -0
  16. package/dist/commands/spec.js +109 -0
  17. package/dist/commands/spec.js.map +1 -0
  18. package/dist/index.d.ts +3 -0
  19. package/dist/index.d.ts.map +1 -0
  20. package/dist/index.js +114 -0
  21. package/dist/index.js.map +1 -0
  22. package/dist/lib/agents.d.ts +32 -0
  23. package/dist/lib/agents.d.ts.map +1 -0
  24. package/dist/lib/agents.js +94 -0
  25. package/dist/lib/agents.js.map +1 -0
  26. package/dist/lib/config.d.ts +38 -0
  27. package/dist/lib/config.d.ts.map +1 -0
  28. package/dist/lib/config.js +96 -0
  29. package/dist/lib/config.js.map +1 -0
  30. package/dist/lib/config.test.d.ts +2 -0
  31. package/dist/lib/config.test.d.ts.map +1 -0
  32. package/dist/lib/config.test.js +45 -0
  33. package/dist/lib/config.test.js.map +1 -0
  34. package/dist/lib/engines/base.d.ts +57 -0
  35. package/dist/lib/engines/base.d.ts.map +1 -0
  36. package/dist/lib/engines/base.js +18 -0
  37. package/dist/lib/engines/base.js.map +1 -0
  38. package/dist/lib/engines/base.test.d.ts +2 -0
  39. package/dist/lib/engines/base.test.d.ts.map +1 -0
  40. package/dist/lib/engines/base.test.js +28 -0
  41. package/dist/lib/engines/base.test.js.map +1 -0
  42. package/dist/lib/engines/claude.d.ts +11 -0
  43. package/dist/lib/engines/claude.d.ts.map +1 -0
  44. package/dist/lib/engines/claude.js +124 -0
  45. package/dist/lib/engines/claude.js.map +1 -0
  46. package/dist/lib/engines/index.d.ts +18 -0
  47. package/dist/lib/engines/index.d.ts.map +1 -0
  48. package/dist/lib/engines/index.js +37 -0
  49. package/dist/lib/engines/index.js.map +1 -0
  50. package/dist/lib/engines/opencode.d.ts +10 -0
  51. package/dist/lib/engines/opencode.d.ts.map +1 -0
  52. package/dist/lib/engines/opencode.js +71 -0
  53. package/dist/lib/engines/opencode.js.map +1 -0
  54. package/dist/lib/init.d.ts +8 -0
  55. package/dist/lib/init.d.ts.map +1 -0
  56. package/dist/lib/init.js +254 -0
  57. package/dist/lib/init.js.map +1 -0
  58. package/dist/lib/prompts.d.ts +34 -0
  59. package/dist/lib/prompts.d.ts.map +1 -0
  60. package/dist/lib/prompts.js +130 -0
  61. package/dist/lib/prompts.js.map +1 -0
  62. package/dist/lib/skills.d.ts +32 -0
  63. package/dist/lib/skills.d.ts.map +1 -0
  64. package/dist/lib/skills.js +119 -0
  65. package/dist/lib/skills.js.map +1 -0
  66. package/package.json +47 -0
package/bin/vralphy.js ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+
3
+ import '../dist/index.js';
@@ -0,0 +1,9 @@
1
+ import { VralphyConfig } from '../lib/config.js';
2
+ export interface BuildOptions {
3
+ iterations?: number;
4
+ }
5
+ /**
6
+ * Execute build mode
7
+ */
8
+ export declare function buildCommand(config: VralphyConfig, options: BuildOptions): Promise<void>;
9
+ //# sourceMappingURL=build.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../src/commands/build.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAOjD,MAAM,WAAW,YAAY;IAC3B,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,MAAM,EAAE,aAAa,EAAE,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAsF9F"}
@@ -0,0 +1,85 @@
1
+ import { existsSync } from 'fs';
2
+ import { getEngine } from '../lib/engines/index.js';
3
+ import { loadPrompt, interpolatePrompt, DEFAULT_BUILD_PROMPT } from '../lib/prompts.js';
4
+ import { loadSkills, filterSkillsByTriggers, formatSkillsForPrompt } from '../lib/skills.js';
5
+ import { loadAgents, formatAgentsForPrompt } from '../lib/agents.js';
6
+ import { getSkillsDir, getAgentsDir } from '../lib/config.js';
7
+ /**
8
+ * Execute build mode
9
+ */
10
+ export async function buildCommand(config, options) {
11
+ const engine = getEngine(config.engine);
12
+ if (!(await engine.isAvailable())) {
13
+ console.error(`Engine '${config.engine}' is not available. Please install it first.`);
14
+ process.exit(1);
15
+ }
16
+ const maxIterations = options.iterations ?? 0;
17
+ let iteration = 0;
18
+ console.log(`Starting build mode with ${config.engine} engine`);
19
+ console.log(`Model: ${config.model}, Executor: ${config.executor}`);
20
+ console.log(`Max iterations: ${maxIterations || 'unlimited'}`);
21
+ const skillsDir = getSkillsDir(config.engine, config.skillsDir);
22
+ const agentsDir = getAgentsDir(config.engine, config.agentsDir);
23
+ const skills = await loadSkills(skillsDir);
24
+ const agents = await loadAgents(agentsDir);
25
+ while (true) {
26
+ if (maxIterations > 0 && iteration >= maxIterations) {
27
+ console.log(`Reached max iterations (${maxIterations})`);
28
+ break;
29
+ }
30
+ console.log(`\n=== Iteration ${iteration + 1} ===\n`);
31
+ let prompt;
32
+ if (existsSync('PROMPT_build.md')) {
33
+ prompt = await loadPrompt('PROMPT_build.md', {
34
+ model: config.model,
35
+ executor: config.executor,
36
+ });
37
+ }
38
+ else {
39
+ prompt = interpolatePrompt(DEFAULT_BUILD_PROMPT, {
40
+ model: config.model,
41
+ executor: config.executor,
42
+ });
43
+ }
44
+ const relevantSkills = filterSkillsByTriggers(skills, prompt);
45
+ if (relevantSkills.length > 0) {
46
+ prompt += '\n\n' + formatSkillsForPrompt(relevantSkills);
47
+ }
48
+ if (agents.length > 0) {
49
+ prompt += '\n\n' + formatAgentsForPrompt(agents, config.executor);
50
+ }
51
+ if (config.dryRun) {
52
+ console.log('--- DRY RUN: Would execute prompt ---');
53
+ console.log(prompt.slice(0, 500) + '...');
54
+ console.log('--- END DRY RUN ---');
55
+ break;
56
+ }
57
+ try {
58
+ for await (const chunk of engine.execute(prompt, {
59
+ model: config.model,
60
+ executor: config.executor,
61
+ headless: true,
62
+ skipPermissions: true,
63
+ outputFormat: 'stream-json',
64
+ verbose: config.verbose,
65
+ })) {
66
+ if (chunk.type === 'text' && chunk.content) {
67
+ process.stdout.write(chunk.content);
68
+ }
69
+ else if (chunk.type === 'error') {
70
+ console.error('Error:', chunk.error);
71
+ }
72
+ }
73
+ }
74
+ catch (e) {
75
+ console.error('Execution failed:', e);
76
+ process.exit(1);
77
+ }
78
+ iteration++;
79
+ if (maxIterations === 0) {
80
+ break;
81
+ }
82
+ }
83
+ console.log(`\nBuild complete after ${iteration} iteration(s)`);
84
+ }
85
+ //# sourceMappingURL=build.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build.js","sourceRoot":"","sources":["../../src/commands/build.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ export interface InitOptions {
2
+ from?: string;
3
+ }
4
+ /**
5
+ * Execute init command
6
+ */
7
+ export declare function initCommand(options: InitOptions): Promise<void>;
8
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,WAAW;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,wBAAsB,WAAW,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAgCrE"}
@@ -0,0 +1,34 @@
1
+ import { initProject } from '../lib/init.js';
2
+ /**
3
+ * Execute init command
4
+ */
5
+ export async function initCommand(options) {
6
+ const dir = options.from ?? process.cwd();
7
+ console.log(`Initializing vralphy in: ${dir}`);
8
+ try {
9
+ const { created, skipped } = await initProject(dir);
10
+ if (created.length > 0) {
11
+ console.log('\nCreated:');
12
+ for (const file of created) {
13
+ console.log(` + ${file}`);
14
+ }
15
+ }
16
+ if (skipped.length > 0) {
17
+ console.log('\nSkipped (already exist):');
18
+ for (const file of skipped) {
19
+ console.log(` - ${file}`);
20
+ }
21
+ }
22
+ console.log('\nInitialization complete!');
23
+ console.log('\nNext steps:');
24
+ console.log(' 1. Review and customize AGENTS.md');
25
+ console.log(' 2. Create specs in specs/ directory');
26
+ console.log(' 3. Run: vralphy plan');
27
+ console.log(' 4. Run: vralphy build');
28
+ }
29
+ catch (e) {
30
+ console.error('Initialization failed:', e);
31
+ process.exit(1);
32
+ }
33
+ }
34
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAM7C;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,OAAoB;IACpD,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IAE1C,OAAO,CAAC,GAAG,CAAC,4BAA4B,GAAG,EAAE,CAAC,CAAC;IAE/C,IAAI,CAAC;QACH,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,MAAM,WAAW,CAAC,GAAG,CAAC,CAAC;QAEpD,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACvB,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;YAC1B,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE,CAAC;gBAC3B,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;YAC7B,CAAC;QACH,CAAC;QAED,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACvB,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;YAC1C,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE,CAAC;gBAC3B,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;YAC7B,CAAC;QACH,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;QAC1C,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;QAC7B,OAAO,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAC;QACnD,OAAO,CAAC,GAAG,CAAC,uCAAuC,CAAC,CAAC;QACrD,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;QACtC,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;IACzC,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,CAAC,KAAK,CAAC,wBAAwB,EAAE,CAAC,CAAC,CAAC;QAC3C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
@@ -0,0 +1,9 @@
1
+ import { VralphyConfig } from '../lib/config.js';
2
+ export interface PlanOptions {
3
+ iterations?: number;
4
+ }
5
+ /**
6
+ * Execute plan mode
7
+ */
8
+ export declare function planCommand(config: VralphyConfig, options: PlanOptions): Promise<void>;
9
+ //# sourceMappingURL=plan.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan.d.ts","sourceRoot":"","sources":["../../src/commands/plan.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAOjD,MAAM,WAAW,WAAW;IAC1B,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,wBAAsB,WAAW,CAAC,MAAM,EAAE,aAAa,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAsF5F"}
@@ -0,0 +1,85 @@
1
+ import { existsSync } from 'fs';
2
+ import { getEngine } from '../lib/engines/index.js';
3
+ import { loadPrompt, interpolatePrompt, DEFAULT_PLAN_PROMPT } from '../lib/prompts.js';
4
+ import { loadSkills, filterSkillsByTriggers, formatSkillsForPrompt } from '../lib/skills.js';
5
+ import { loadAgents, formatAgentsForPrompt } from '../lib/agents.js';
6
+ import { getSkillsDir, getAgentsDir } from '../lib/config.js';
7
+ /**
8
+ * Execute plan mode
9
+ */
10
+ export async function planCommand(config, options) {
11
+ const engine = getEngine(config.engine);
12
+ if (!(await engine.isAvailable())) {
13
+ console.error(`Engine '${config.engine}' is not available. Please install it first.`);
14
+ process.exit(1);
15
+ }
16
+ const maxIterations = options.iterations ?? 0;
17
+ let iteration = 0;
18
+ console.log(`Starting plan mode with ${config.engine} engine`);
19
+ console.log(`Model: ${config.model}, Executor: ${config.executor}`);
20
+ console.log(`Max iterations: ${maxIterations || 'unlimited'}`);
21
+ const skillsDir = getSkillsDir(config.engine, config.skillsDir);
22
+ const agentsDir = getAgentsDir(config.engine, config.agentsDir);
23
+ const skills = await loadSkills(skillsDir);
24
+ const agents = await loadAgents(agentsDir);
25
+ while (true) {
26
+ if (maxIterations > 0 && iteration >= maxIterations) {
27
+ console.log(`Reached max iterations (${maxIterations})`);
28
+ break;
29
+ }
30
+ console.log(`\n=== Plan Iteration ${iteration + 1} ===\n`);
31
+ let prompt;
32
+ if (existsSync('PROMPT_plan.md')) {
33
+ prompt = await loadPrompt('PROMPT_plan.md', {
34
+ model: config.model,
35
+ executor: config.executor,
36
+ });
37
+ }
38
+ else {
39
+ prompt = interpolatePrompt(DEFAULT_PLAN_PROMPT, {
40
+ model: config.model,
41
+ executor: config.executor,
42
+ });
43
+ }
44
+ const relevantSkills = filterSkillsByTriggers(skills, prompt);
45
+ if (relevantSkills.length > 0) {
46
+ prompt += '\n\n' + formatSkillsForPrompt(relevantSkills);
47
+ }
48
+ if (agents.length > 0) {
49
+ prompt += '\n\n' + formatAgentsForPrompt(agents, config.executor);
50
+ }
51
+ if (config.dryRun) {
52
+ console.log('--- DRY RUN: Would execute prompt ---');
53
+ console.log(prompt.slice(0, 500) + '...');
54
+ console.log('--- END DRY RUN ---');
55
+ break;
56
+ }
57
+ try {
58
+ for await (const chunk of engine.execute(prompt, {
59
+ model: config.model,
60
+ executor: config.executor,
61
+ headless: true,
62
+ skipPermissions: true,
63
+ outputFormat: 'stream-json',
64
+ verbose: config.verbose,
65
+ })) {
66
+ if (chunk.type === 'text' && chunk.content) {
67
+ process.stdout.write(chunk.content);
68
+ }
69
+ else if (chunk.type === 'error') {
70
+ console.error('Error:', chunk.error);
71
+ }
72
+ }
73
+ }
74
+ catch (e) {
75
+ console.error('Execution failed:', e);
76
+ process.exit(1);
77
+ }
78
+ iteration++;
79
+ if (maxIterations === 0) {
80
+ break;
81
+ }
82
+ }
83
+ console.log(`\nPlanning complete after ${iteration} iteration(s)`);
84
+ }
85
+ //# sourceMappingURL=plan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan.js","sourceRoot":"","sources":["../../src/commands/plan.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import { VralphyConfig } from '../lib/config.js';
2
+ export interface SpecOptions {
3
+ topic?: string;
4
+ }
5
+ /**
6
+ * Execute spec mode
7
+ */
8
+ export declare function specCommand(config: VralphyConfig, options: SpecOptions): Promise<void>;
9
+ //# sourceMappingURL=spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spec.d.ts","sourceRoot":"","sources":["../../src/commands/spec.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAKjD,MAAM,WAAW,WAAW;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAaD;;GAEG;AACH,wBAAsB,WAAW,CAAC,MAAM,EAAE,aAAa,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAgG5F"}
@@ -0,0 +1,109 @@
1
+ import { existsSync } from 'fs';
2
+ import { readdir, writeFile } from 'fs/promises';
3
+ import { join } from 'path';
4
+ import { getEngine } from '../lib/engines/index.js';
5
+ import { loadPrompt, interpolatePrompt, DEFAULT_SPEC_PROMPT } from '../lib/prompts.js';
6
+ import { findProjectRoot } from '../lib/config.js';
7
+ /**
8
+ * List existing specs
9
+ */
10
+ async function listSpecs() {
11
+ const specsDir = 'specs';
12
+ if (!existsSync(specsDir))
13
+ return [];
14
+ const files = await readdir(specsDir);
15
+ return files.filter((f) => f.endsWith('.md')).map((f) => f.replace('.md', ''));
16
+ }
17
+ /**
18
+ * Execute spec mode
19
+ */
20
+ export async function specCommand(config, options) {
21
+ const engine = getEngine(config.engine);
22
+ if (!(await engine.isAvailable())) {
23
+ console.error(`Engine '${config.engine}' is not available. Please install it first.`);
24
+ process.exit(1);
25
+ }
26
+ if (!options.topic) {
27
+ const existingSpecs = await listSpecs();
28
+ if (existingSpecs.length > 0) {
29
+ console.log('Existing specs:');
30
+ for (const spec of existingSpecs) {
31
+ console.log(` - ${spec}`);
32
+ }
33
+ console.log('\nUsage: vralphy spec <topic>');
34
+ }
35
+ else {
36
+ console.log('No specs found. Create one with: vralphy spec <topic>');
37
+ }
38
+ return;
39
+ }
40
+ const topic = options.topic;
41
+ const existingSpecs = await listSpecs();
42
+ console.log(`Starting spec phase for: ${topic}`);
43
+ console.log(`Engine: ${config.engine}`);
44
+ if (!engine.supportsInteractive()) {
45
+ console.log('\nNote: Non-interactive mode (OpenCode engine)');
46
+ console.log('A template will be generated for manual editing.\n');
47
+ }
48
+ const projectRoot = findProjectRoot();
49
+ const projectName = projectRoot.split('/').pop() ?? 'project';
50
+ let prompt;
51
+ if (existsSync('PROMPT_spec.md')) {
52
+ prompt = await loadPrompt('PROMPT_spec.md', {
53
+ model: config.model,
54
+ executor: config.executor,
55
+ topic,
56
+ projectName,
57
+ existingSpecs,
58
+ });
59
+ }
60
+ else {
61
+ prompt = interpolatePrompt(DEFAULT_SPEC_PROMPT, {
62
+ model: config.model,
63
+ executor: config.executor,
64
+ topic,
65
+ projectName,
66
+ existingSpecs,
67
+ });
68
+ }
69
+ if (config.dryRun) {
70
+ console.log('--- DRY RUN: Would execute prompt ---');
71
+ console.log(prompt);
72
+ console.log('--- END DRY RUN ---');
73
+ return;
74
+ }
75
+ let specContent = '';
76
+ try {
77
+ for await (const chunk of engine.execute(prompt, {
78
+ model: config.model,
79
+ executor: config.executor,
80
+ headless: false,
81
+ skipPermissions: false,
82
+ outputFormat: 'text',
83
+ verbose: config.verbose,
84
+ })) {
85
+ if (chunk.type === 'text' && chunk.content) {
86
+ process.stdout.write(chunk.content);
87
+ specContent += chunk.content;
88
+ }
89
+ else if (chunk.type === 'error') {
90
+ console.error('Error:', chunk.error);
91
+ }
92
+ }
93
+ }
94
+ catch (e) {
95
+ console.error('Execution failed:', e);
96
+ process.exit(1);
97
+ }
98
+ if (specContent.trim()) {
99
+ const specsDir = 'specs';
100
+ if (!existsSync(specsDir)) {
101
+ const { mkdir } = await import('fs/promises');
102
+ await mkdir(specsDir, { recursive: true });
103
+ }
104
+ const specPath = join(specsDir, `${topic}.md`);
105
+ await writeFile(specPath, specContent);
106
+ console.log(`\nSpec saved to: ${specPath}`);
107
+ }
108
+ }
109
+ //# sourceMappingURL=spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spec.js","sourceRoot":"","sources":["../../src/commands/spec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/dist/index.js ADDED
@@ -0,0 +1,114 @@
1
+ #!/usr/bin/env node
2
+ import { Command } from 'commander';
3
+ import { resolveConfig } from './lib/config.js';
4
+ import { buildCommand } from './commands/build.js';
5
+ import { planCommand } from './commands/plan.js';
6
+ import { specCommand } from './commands/spec.js';
7
+ import { initCommand } from './commands/init.js';
8
+ import { detectEngines } from './lib/engines/index.js';
9
+ import { listSkills } from './lib/skills.js';
10
+ import { listAgents } from './lib/agents.js';
11
+ import { getSkillsDir, getAgentsDir } from './lib/config.js';
12
+ const program = new Command();
13
+ program
14
+ .name('vralphy')
15
+ .description('CLI tool implementing the Ralph Playbook methodology')
16
+ .version('0.0.1');
17
+ program
18
+ .option('--engine <engine>', 'Engine selection (claude|opencode)', 'claude')
19
+ .option('--model <model>', 'Primary model (default: opus)', 'opus')
20
+ .option('--executor <model>', 'Executor/subagent model (default: sonnet)', 'sonnet')
21
+ .option('--skills <path>', 'Skills directory')
22
+ .option('--agents <path>', 'Agents directory')
23
+ .option('--config <path>', 'Config file (default: vralphy.config.json)')
24
+ .option('--verbose', 'Verbose output', false)
25
+ .option('--dry-run', 'Show what would execute without running', false);
26
+ program
27
+ .command('build [iterations]')
28
+ .description('Run build mode (default command)')
29
+ .action(async (iterations) => {
30
+ const opts = program.opts();
31
+ const config = await resolveConfig(opts);
32
+ await buildCommand(config, { iterations: iterations ? parseInt(iterations, 10) : undefined });
33
+ });
34
+ program
35
+ .command('plan [iterations]')
36
+ .description('Run plan mode')
37
+ .action(async (iterations) => {
38
+ const opts = program.opts();
39
+ const config = await resolveConfig(opts);
40
+ await planCommand(config, { iterations: iterations ? parseInt(iterations, 10) : undefined });
41
+ });
42
+ program
43
+ .command('spec [topic]')
44
+ .description('Interactive spec creation')
45
+ .action(async (topic) => {
46
+ const opts = program.opts();
47
+ const config = await resolveConfig(opts);
48
+ await specCommand(config, { topic });
49
+ });
50
+ program
51
+ .command('init')
52
+ .description('Initialize project for vralphy')
53
+ .option('--from <path>', 'Initialize from existing project')
54
+ .action(async (cmdOpts) => {
55
+ await initCommand(cmdOpts);
56
+ });
57
+ program
58
+ .command('engines')
59
+ .description('List available engines')
60
+ .action(async () => {
61
+ const available = await detectEngines();
62
+ console.log('Available engines:');
63
+ for (const engine of available) {
64
+ console.log(` - ${engine}`);
65
+ }
66
+ if (available.length === 0) {
67
+ console.log(' (none found - install claude or opencode CLI)');
68
+ }
69
+ });
70
+ program
71
+ .command('skills')
72
+ .description('List available skills')
73
+ .action(async () => {
74
+ const opts = program.opts();
75
+ const config = await resolveConfig(opts);
76
+ const skillsDir = getSkillsDir(config.engine, config.skillsDir);
77
+ const skills = await listSkills(skillsDir);
78
+ if (skills.length === 0) {
79
+ console.log(`No skills found in: ${skillsDir}`);
80
+ console.log('Create .md files with frontmatter to add skills.');
81
+ return;
82
+ }
83
+ console.log('Available skills:');
84
+ for (const skill of skills) {
85
+ console.log(` - ${skill.name}${skill.description ? `: ${skill.description}` : ''}`);
86
+ }
87
+ });
88
+ program
89
+ .command('agents')
90
+ .description('List available agents')
91
+ .action(async () => {
92
+ const opts = program.opts();
93
+ const config = await resolveConfig(opts);
94
+ const agentsDir = getAgentsDir(config.engine, config.agentsDir);
95
+ const agents = await listAgents(agentsDir);
96
+ if (agents.length === 0) {
97
+ console.log(`No agents found in: ${agentsDir}`);
98
+ console.log('Create .md files with frontmatter to add agents.');
99
+ return;
100
+ }
101
+ console.log('Available agents:');
102
+ for (const agent of agents) {
103
+ const model = agent.model ? ` (${agent.model})` : '';
104
+ console.log(` - ${agent.name}${model}${agent.description ? `: ${agent.description}` : ''}`);
105
+ }
106
+ });
107
+ program
108
+ .action(async () => {
109
+ const opts = program.opts();
110
+ const config = await resolveConfig(opts);
111
+ await buildCommand(config, {});
112
+ });
113
+ program.parse();
114
+ //# 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,CAYnF;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"}