vralphy 0.6.0 → 0.6.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 (49) hide show
  1. package/dist/commands/build.d.ts +3 -0
  2. package/dist/commands/build.d.ts.map +1 -1
  3. package/dist/commands/build.js +47 -16
  4. package/dist/commands/build.js.map +1 -1
  5. package/dist/commands/init.d.ts +7 -0
  6. package/dist/commands/init.d.ts.map +1 -1
  7. package/dist/commands/init.js +77 -12
  8. package/dist/commands/init.js.map +1 -1
  9. package/dist/commands/plan.d.ts +3 -0
  10. package/dist/commands/plan.d.ts.map +1 -1
  11. package/dist/commands/plan.js +47 -16
  12. package/dist/commands/plan.js.map +1 -1
  13. package/dist/commands/spec.d.ts +3 -0
  14. package/dist/commands/spec.d.ts.map +1 -1
  15. package/dist/commands/spec.js +76 -15
  16. package/dist/commands/spec.js.map +1 -1
  17. package/dist/index.js +72 -20
  18. package/dist/index.js.map +1 -1
  19. package/dist/lib/config.d.ts +23 -0
  20. package/dist/lib/config.d.ts.map +1 -1
  21. package/dist/lib/config.js +63 -4
  22. package/dist/lib/config.js.map +1 -1
  23. package/dist/lib/config.test.js +2 -2
  24. package/dist/lib/config.test.js.map +1 -1
  25. package/dist/lib/engines/base.d.ts +57 -8
  26. package/dist/lib/engines/base.d.ts.map +1 -1
  27. package/dist/lib/engines/base.js +58 -5
  28. package/dist/lib/engines/base.js.map +1 -1
  29. package/dist/lib/engines/claude.d.ts +5 -2
  30. package/dist/lib/engines/claude.d.ts.map +1 -1
  31. package/dist/lib/engines/claude.js +58 -12
  32. package/dist/lib/engines/claude.js.map +1 -1
  33. package/dist/lib/engines/codex.d.ts +5 -2
  34. package/dist/lib/engines/codex.d.ts.map +1 -1
  35. package/dist/lib/engines/codex.js +58 -12
  36. package/dist/lib/engines/codex.js.map +1 -1
  37. package/dist/lib/engines/index.d.ts +11 -1
  38. package/dist/lib/engines/index.d.ts.map +1 -1
  39. package/dist/lib/engines/index.js +16 -0
  40. package/dist/lib/engines/index.js.map +1 -1
  41. package/dist/lib/engines/opencode.d.ts +5 -2
  42. package/dist/lib/engines/opencode.d.ts.map +1 -1
  43. package/dist/lib/engines/opencode.js +49 -11
  44. package/dist/lib/engines/opencode.js.map +1 -1
  45. package/dist/lib/init.d.ts +17 -1
  46. package/dist/lib/init.d.ts.map +1 -1
  47. package/dist/lib/init.js +242 -55
  48. package/dist/lib/init.js.map +1 -1
  49. package/package.json +1 -1
@@ -2,5 +2,8 @@ import { VralphyConfig } from '../lib/config.js';
2
2
  export interface BuildOptions {
3
3
  iterations?: number;
4
4
  }
5
+ /**
6
+ * Execute build mode
7
+ */
5
8
  export declare function buildCommand(config: VralphyConfig, options: BuildOptions): Promise<void>;
6
9
  //# sourceMappingURL=build.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../src/commands/build.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAGjD,MAAM,WAAW,YAAY;IAC3B,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,wBAAsB,YAAY,CAAC,MAAM,EAAE,aAAa,EAAE,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAiD9F"}
1
+ {"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../src/commands/build.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAIjD,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,CA4E9F"}
@@ -1,5 +1,9 @@
1
- import { existsSync, readFileSync } from 'fs';
1
+ import { existsSync } from 'fs';
2
2
  import { getEngine } from '../lib/engines/index.js';
3
+ import { loadPrompt, interpolatePrompt, DEFAULT_BUILD_PROMPT } from '../lib/prompts.js';
4
+ /**
5
+ * Execute build mode
6
+ */
3
7
  export async function buildCommand(config, options) {
4
8
  const engine = getEngine(config.engine);
5
9
  if (!(await engine.isAvailable())) {
@@ -8,28 +12,55 @@ export async function buildCommand(config, options) {
8
12
  }
9
13
  const maxIterations = options.iterations ?? 0;
10
14
  let iteration = 0;
11
- console.log(`\n=== vralphy build | ${config.engine} | ${config.model} ===`);
12
- console.log(`Max iterations: ${maxIterations || 'unlimited'}\n`);
13
- // Find prompt file
14
- const promptPaths = ['.vralphy/prompts/build.md', 'PROMPT_build.md'];
15
- const promptPath = promptPaths.find(p => existsSync(p));
16
- if (!promptPath) {
17
- console.error('No build prompt found. Create .vralphy/prompts/build.md or PROMPT_build.md');
18
- process.exit(1);
19
- }
15
+ console.log(`Starting build mode with ${config.engine} engine`);
16
+ console.log(`Model: ${config.model}, Executor: ${config.executor}`);
17
+ console.log(`Max iterations: ${maxIterations || 'unlimited'}`);
18
+ // Prompt locations in order of preference
19
+ const promptPaths = [
20
+ '.vralphy/prompts/build.md', // New location
21
+ 'PROMPT_build.md', // Legacy location (backwards compat)
22
+ ];
20
23
  while (true) {
21
24
  if (maxIterations > 0 && iteration >= maxIterations) {
22
- console.log(`\nReached max iterations (${maxIterations})`);
25
+ console.log(`Reached max iterations (${maxIterations})`);
23
26
  break;
24
27
  }
25
- console.log(`\n--- Iteration ${iteration + 1} ---\n`);
26
- const prompt = readFileSync(promptPath, 'utf-8');
28
+ console.log(`\n=== Iteration ${iteration + 1} ===\n`);
29
+ let prompt;
30
+ const promptContext = {
31
+ model: config.model,
32
+ executor: config.executor,
33
+ engine: config.engine,
34
+ };
35
+ // Find first existing prompt file
36
+ const existingPromptPath = promptPaths.find(p => existsSync(p));
37
+ if (existingPromptPath) {
38
+ prompt = await loadPrompt(existingPromptPath, promptContext);
39
+ }
40
+ else {
41
+ // Use default prompt with lazy loading section already included
42
+ prompt = interpolatePrompt(DEFAULT_BUILD_PROMPT, promptContext);
43
+ }
27
44
  if (config.dryRun) {
28
- console.log('DRY RUN:', prompt.slice(0, 200) + '...');
45
+ console.log('--- DRY RUN: Would execute prompt ---');
46
+ console.log(prompt.slice(0, 500) + '...');
47
+ console.log('--- END DRY RUN ---');
29
48
  break;
30
49
  }
31
50
  try {
32
- await engine.run(prompt, { model: config.model });
51
+ // Engine handles output to terminal
52
+ for await (const chunk of engine.execute(prompt, {
53
+ model: config.model,
54
+ executor: config.executor,
55
+ headless: true,
56
+ skipPermissions: true,
57
+ verbose: config.verbose,
58
+ reasoningEffort: config.reasoningEffort,
59
+ })) {
60
+ if (chunk.type === 'error') {
61
+ console.error('Error:', chunk.error);
62
+ }
63
+ }
33
64
  }
34
65
  catch (e) {
35
66
  console.error('Execution failed:', e);
@@ -37,6 +68,6 @@ export async function buildCommand(config, options) {
37
68
  }
38
69
  iteration++;
39
70
  }
40
- console.log(`\nDone after ${iteration} iteration(s)`);
71
+ console.log(`\nBuild complete after ${iteration} iteration(s)`);
41
72
  }
42
73
  //# sourceMappingURL=build.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"build.js","sourceRoot":"","sources":["../../src/commands/build.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAE9C,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAMpD,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,MAAqB,EAAE,OAAqB;IAC7E,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAExC,IAAI,CAAC,CAAC,MAAM,MAAM,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC;QAClC,OAAO,CAAC,KAAK,CAAC,WAAW,MAAM,CAAC,MAAM,8CAA8C,CAAC,CAAC;QACtF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,aAAa,GAAG,OAAO,CAAC,UAAU,IAAI,CAAC,CAAC;IAC9C,IAAI,SAAS,GAAG,CAAC,CAAC;IAElB,OAAO,CAAC,GAAG,CAAC,yBAAyB,MAAM,CAAC,MAAM,MAAM,MAAM,CAAC,KAAK,MAAM,CAAC,CAAC;IAC5E,OAAO,CAAC,GAAG,CAAC,mBAAmB,aAAa,IAAI,WAAW,IAAI,CAAC,CAAC;IAEjE,mBAAmB;IACnB,MAAM,WAAW,GAAG,CAAC,2BAA2B,EAAE,iBAAiB,CAAC,CAAC;IACrE,MAAM,UAAU,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;IAExD,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,OAAO,CAAC,KAAK,CAAC,4EAA4E,CAAC,CAAC;QAC5F,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,OAAO,IAAI,EAAE,CAAC;QACZ,IAAI,aAAa,GAAG,CAAC,IAAI,SAAS,IAAI,aAAa,EAAE,CAAC;YACpD,OAAO,CAAC,GAAG,CAAC,6BAA6B,aAAa,GAAG,CAAC,CAAC;YAC3D,MAAM;QACR,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,mBAAmB,SAAS,GAAG,CAAC,QAAQ,CAAC,CAAC;QAEtD,MAAM,MAAM,GAAG,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QAEjD,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YAClB,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC;YACtD,MAAM;QACR,CAAC;QAED,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;QACpD,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,CAAC,KAAK,CAAC,mBAAmB,EAAE,CAAC,CAAC,CAAC;YACtC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,SAAS,EAAE,CAAC;IACd,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,gBAAgB,SAAS,eAAe,CAAC,CAAC;AACxD,CAAC"}
1
+ {"version":3,"file":"build.js","sourceRoot":"","sources":["../../src/commands/build.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,12 @@
1
1
  export interface InitCommandOptions {
2
2
  from?: string;
3
+ noAi?: boolean;
4
+ approve?: boolean;
5
+ engine?: string;
6
+ verbose?: boolean;
3
7
  }
8
+ /**
9
+ * Execute init command
10
+ */
4
11
  export declare function initCommand(options: InitCommandOptions): Promise<void>;
5
12
  //# sourceMappingURL=init.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,kBAAkB;IACjC,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,wBAAsB,WAAW,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CA2B5E"}
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,kBAAkB;IACjC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAmBD;;GAEG;AACH,wBAAsB,WAAW,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CA0D5E"}
@@ -1,26 +1,91 @@
1
+ import { createInterface } from 'readline';
1
2
  import { initProject } from '../lib/init.js';
3
+ /**
4
+ * Prompt user for confirmation
5
+ */
6
+ async function confirm(message) {
7
+ const rl = createInterface({
8
+ input: process.stdin,
9
+ output: process.stdout,
10
+ });
11
+ return new Promise((resolve) => {
12
+ rl.question(`${message} [y/N] `, (answer) => {
13
+ rl.close();
14
+ resolve(answer.toLowerCase() === 'y' || answer.toLowerCase() === 'yes');
15
+ });
16
+ });
17
+ }
18
+ /**
19
+ * Execute init command
20
+ */
2
21
  export async function initCommand(options) {
3
22
  const dir = options.from ?? process.cwd();
4
- console.log(`Initializing vralphy in: ${dir}\n`);
23
+ console.log(`Initializing vralphy in: ${dir}`);
24
+ // Build init options
25
+ const initOptions = {
26
+ noAi: options.noAi,
27
+ approve: options.approve,
28
+ verbose: options.verbose,
29
+ };
30
+ // Validate engine if specified
31
+ if (options.engine) {
32
+ const validEngines = ['claude', 'opencode', 'codex'];
33
+ if (!validEngines.includes(options.engine)) {
34
+ console.error(`Invalid engine: ${options.engine}. Valid options: ${validEngines.join(', ')}`);
35
+ process.exit(1);
36
+ }
37
+ initOptions.engine = options.engine;
38
+ }
5
39
  try {
6
- const { created, skipped } = await initProject(dir);
7
- if (created.length > 0) {
8
- console.log('Created:');
9
- for (const file of created) {
10
- console.log(` + ${file}`);
40
+ // If --approve flag is set, we need to handle the approval flow
41
+ if (options.approve && !options.noAi) {
42
+ // First run with approve mode - AI generates but we need to confirm
43
+ const result = await initProject(dir, { ...initOptions, approve: true });
44
+ if (result.agentsMdContent) {
45
+ console.log('\n--- Generated AGENTS.md Preview ---\n');
46
+ console.log(result.agentsMdContent);
47
+ console.log('\n--- End Preview ---\n');
48
+ const approved = await confirm('Save this AGENTS.md?');
49
+ if (!approved) {
50
+ console.log('Initialization cancelled.');
51
+ process.exit(0);
52
+ }
11
53
  }
54
+ // Report results
55
+ reportResults(result.created, result.skipped);
12
56
  }
13
- if (skipped.length > 0) {
14
- console.log('\nSkipped (already exist):');
15
- for (const file of skipped) {
16
- console.log(` - ${file}`);
17
- }
57
+ else {
58
+ // Normal flow (no approval needed)
59
+ const { created, skipped } = await initProject(dir, initOptions);
60
+ reportResults(created, skipped);
18
61
  }
19
- console.log('\nDone! Edit .vralphy/prompts/ and run: vralphy plan');
62
+ console.log('\nInitialization complete!');
63
+ console.log('\nNext steps:');
64
+ console.log(' 1. Review and customize .vralphy/AGENTS.md');
65
+ console.log(' 2. Create specs in specs/ directory');
66
+ console.log(' 3. Run: vralphy plan');
67
+ console.log(' 4. Run: vralphy build');
20
68
  }
21
69
  catch (e) {
22
70
  console.error('Initialization failed:', e);
23
71
  process.exit(1);
24
72
  }
25
73
  }
74
+ /**
75
+ * Report created and skipped files
76
+ */
77
+ function reportResults(created, skipped) {
78
+ if (created.length > 0) {
79
+ console.log('\nCreated:');
80
+ for (const file of created) {
81
+ console.log(` + ${file}`);
82
+ }
83
+ }
84
+ if (skipped.length > 0) {
85
+ console.log('\nSkipped (already exist):');
86
+ for (const file of skipped) {
87
+ console.log(` - ${file}`);
88
+ }
89
+ }
90
+ }
26
91
  //# sourceMappingURL=init.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAM7C,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,OAA2B;IAC3D,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IAE1C,OAAO,CAAC,GAAG,CAAC,4BAA4B,GAAG,IAAI,CAAC,CAAC;IAEjD,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,UAAU,CAAC,CAAC;YACxB,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,sDAAsD,CAAC,CAAC;IACtE,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"}
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
@@ -2,5 +2,8 @@ import { VralphyConfig } from '../lib/config.js';
2
2
  export interface PlanOptions {
3
3
  iterations?: number;
4
4
  }
5
+ /**
6
+ * Execute plan mode
7
+ */
5
8
  export declare function planCommand(config: VralphyConfig, options: PlanOptions): Promise<void>;
6
9
  //# sourceMappingURL=plan.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"plan.d.ts","sourceRoot":"","sources":["../../src/commands/plan.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAGjD,MAAM,WAAW,WAAW;IAC1B,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,wBAAsB,WAAW,CAAC,MAAM,EAAE,aAAa,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAiD5F"}
1
+ {"version":3,"file":"plan.d.ts","sourceRoot":"","sources":["../../src/commands/plan.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAIjD,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,CA4E5F"}
@@ -1,5 +1,9 @@
1
- import { existsSync, readFileSync } from 'fs';
1
+ import { existsSync } from 'fs';
2
2
  import { getEngine } from '../lib/engines/index.js';
3
+ import { loadPrompt, interpolatePrompt, DEFAULT_PLAN_PROMPT } from '../lib/prompts.js';
4
+ /**
5
+ * Execute plan mode
6
+ */
3
7
  export async function planCommand(config, options) {
4
8
  const engine = getEngine(config.engine);
5
9
  if (!(await engine.isAvailable())) {
@@ -8,28 +12,55 @@ export async function planCommand(config, options) {
8
12
  }
9
13
  const maxIterations = options.iterations ?? 0;
10
14
  let iteration = 0;
11
- console.log(`\n=== vralphy plan | ${config.engine} | ${config.model} ===`);
12
- console.log(`Max iterations: ${maxIterations || 'unlimited'}\n`);
13
- // Find prompt file
14
- const promptPaths = ['.vralphy/prompts/plan.md', 'PROMPT_plan.md'];
15
- const promptPath = promptPaths.find(p => existsSync(p));
16
- if (!promptPath) {
17
- console.error('No plan prompt found. Create .vralphy/prompts/plan.md or PROMPT_plan.md');
18
- process.exit(1);
19
- }
15
+ console.log(`Starting plan mode with ${config.engine} engine`);
16
+ console.log(`Model: ${config.model}, Executor: ${config.executor}`);
17
+ console.log(`Max iterations: ${maxIterations || 'unlimited'}`);
18
+ // Prompt locations in order of preference
19
+ const promptPaths = [
20
+ '.vralphy/prompts/plan.md', // New location
21
+ 'PROMPT_plan.md', // Legacy location (backwards compat)
22
+ ];
20
23
  while (true) {
21
24
  if (maxIterations > 0 && iteration >= maxIterations) {
22
- console.log(`\nReached max iterations (${maxIterations})`);
25
+ console.log(`Reached max iterations (${maxIterations})`);
23
26
  break;
24
27
  }
25
- console.log(`\n--- Iteration ${iteration + 1} ---\n`);
26
- const prompt = readFileSync(promptPath, 'utf-8');
28
+ console.log(`\n=== Plan Iteration ${iteration + 1} ===\n`);
29
+ let prompt;
30
+ const promptContext = {
31
+ model: config.model,
32
+ executor: config.executor,
33
+ engine: config.engine,
34
+ };
35
+ // Find first existing prompt file
36
+ const existingPromptPath = promptPaths.find(p => existsSync(p));
37
+ if (existingPromptPath) {
38
+ prompt = await loadPrompt(existingPromptPath, promptContext);
39
+ }
40
+ else {
41
+ // Use default prompt with lazy loading section already included
42
+ prompt = interpolatePrompt(DEFAULT_PLAN_PROMPT, promptContext);
43
+ }
27
44
  if (config.dryRun) {
28
- console.log('DRY RUN:', prompt.slice(0, 200) + '...');
45
+ console.log('--- DRY RUN: Would execute prompt ---');
46
+ console.log(prompt.slice(0, 500) + '...');
47
+ console.log('--- END DRY RUN ---');
29
48
  break;
30
49
  }
31
50
  try {
32
- await engine.run(prompt, { model: config.model });
51
+ // Engine handles output to terminal
52
+ for await (const chunk of engine.execute(prompt, {
53
+ model: config.model,
54
+ executor: config.executor,
55
+ headless: true,
56
+ skipPermissions: true,
57
+ verbose: config.verbose,
58
+ reasoningEffort: config.reasoningEffort,
59
+ })) {
60
+ if (chunk.type === 'error') {
61
+ console.error('Error:', chunk.error);
62
+ }
63
+ }
33
64
  }
34
65
  catch (e) {
35
66
  console.error('Execution failed:', e);
@@ -37,6 +68,6 @@ export async function planCommand(config, options) {
37
68
  }
38
69
  iteration++;
39
70
  }
40
- console.log(`\nDone after ${iteration} iteration(s)`);
71
+ console.log(`\nPlanning complete after ${iteration} iteration(s)`);
41
72
  }
42
73
  //# sourceMappingURL=plan.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"plan.js","sourceRoot":"","sources":["../../src/commands/plan.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAE9C,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAMpD,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,MAAqB,EAAE,OAAoB;IAC3E,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAExC,IAAI,CAAC,CAAC,MAAM,MAAM,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC;QAClC,OAAO,CAAC,KAAK,CAAC,WAAW,MAAM,CAAC,MAAM,8CAA8C,CAAC,CAAC;QACtF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,aAAa,GAAG,OAAO,CAAC,UAAU,IAAI,CAAC,CAAC;IAC9C,IAAI,SAAS,GAAG,CAAC,CAAC;IAElB,OAAO,CAAC,GAAG,CAAC,wBAAwB,MAAM,CAAC,MAAM,MAAM,MAAM,CAAC,KAAK,MAAM,CAAC,CAAC;IAC3E,OAAO,CAAC,GAAG,CAAC,mBAAmB,aAAa,IAAI,WAAW,IAAI,CAAC,CAAC;IAEjE,mBAAmB;IACnB,MAAM,WAAW,GAAG,CAAC,0BAA0B,EAAE,gBAAgB,CAAC,CAAC;IACnE,MAAM,UAAU,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;IAExD,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,OAAO,CAAC,KAAK,CAAC,yEAAyE,CAAC,CAAC;QACzF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,OAAO,IAAI,EAAE,CAAC;QACZ,IAAI,aAAa,GAAG,CAAC,IAAI,SAAS,IAAI,aAAa,EAAE,CAAC;YACpD,OAAO,CAAC,GAAG,CAAC,6BAA6B,aAAa,GAAG,CAAC,CAAC;YAC3D,MAAM;QACR,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,mBAAmB,SAAS,GAAG,CAAC,QAAQ,CAAC,CAAC;QAEtD,MAAM,MAAM,GAAG,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QAEjD,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YAClB,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC;YACtD,MAAM;QACR,CAAC;QAED,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;QACpD,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,CAAC,KAAK,CAAC,mBAAmB,EAAE,CAAC,CAAC,CAAC;YACtC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,SAAS,EAAE,CAAC;IACd,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,gBAAgB,SAAS,eAAe,CAAC,CAAC;AACxD,CAAC"}
1
+ {"version":3,"file":"plan.js","sourceRoot":"","sources":["../../src/commands/plan.ts"],"names":[],"mappings":"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"}
@@ -2,5 +2,8 @@ import { VralphyConfig } from '../lib/config.js';
2
2
  export interface SpecOptions {
3
3
  topic?: string;
4
4
  }
5
+ /**
6
+ * Execute spec mode
7
+ */
5
8
  export declare function specCommand(config: VralphyConfig, options: SpecOptions): Promise<void>;
6
9
  //# sourceMappingURL=spec.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"spec.d.ts","sourceRoot":"","sources":["../../src/commands/spec.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAGjD,MAAM,WAAW,WAAW;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AASD,wBAAsB,WAAW,CAAC,MAAM,EAAE,aAAa,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CA+C5F"}
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,CAsG5F"}
@@ -1,6 +1,12 @@
1
- import { existsSync, readFileSync } from 'fs';
2
- import { readdir } from 'fs/promises';
1
+ import { existsSync } from 'fs';
2
+ import { readdir, writeFile } from 'fs/promises';
3
+ import { join } from 'path';
3
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
+ */
4
10
  async function listSpecs() {
5
11
  const specsDir = 'specs';
6
12
  if (!existsSync(specsDir))
@@ -8,6 +14,9 @@ async function listSpecs() {
8
14
  const files = await readdir(specsDir);
9
15
  return files.filter((f) => f.endsWith('.md')).map((f) => f.replace('.md', ''));
10
16
  }
17
+ /**
18
+ * Execute spec mode
19
+ */
11
20
  export async function specCommand(config, options) {
12
21
  const engine = getEngine(config.engine);
13
22
  if (!(await engine.isAvailable())) {
@@ -21,31 +30,83 @@ export async function specCommand(config, options) {
21
30
  for (const spec of existingSpecs) {
22
31
  console.log(` - ${spec}`);
23
32
  }
33
+ console.log('\nUsage: vralphy spec <topic>');
34
+ }
35
+ else {
36
+ console.log('No specs found. Create one with: vralphy spec <topic>');
24
37
  }
25
- console.log('\nUsage: vralphy spec <topic>');
26
38
  return;
27
39
  }
28
- console.log(`\n=== vralphy spec | ${config.engine} | ${options.topic} ===\n`);
29
- // Find prompt file
30
- const promptPaths = ['.vralphy/prompts/spec.md', 'PROMPT_spec.md'];
31
- const promptPath = promptPaths.find(p => existsSync(p));
32
- if (!promptPath) {
33
- console.error('No spec prompt found. Create .vralphy/prompts/spec.md or PROMPT_spec.md');
34
- process.exit(1);
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
+ // Prompt locations in order of preference
51
+ const promptPaths = [
52
+ '.vralphy/prompts/spec.md', // New location
53
+ 'PROMPT_spec.md', // Legacy location (backwards compat)
54
+ ];
55
+ const promptContext = {
56
+ model: config.model,
57
+ executor: config.executor,
58
+ engine: config.engine,
59
+ topic,
60
+ projectName,
61
+ existingSpecs,
62
+ };
63
+ // Find first existing prompt file
64
+ const existingPromptPath = promptPaths.find(p => existsSync(p));
65
+ let prompt;
66
+ if (existingPromptPath) {
67
+ prompt = await loadPrompt(existingPromptPath, promptContext);
68
+ }
69
+ else {
70
+ prompt = interpolatePrompt(DEFAULT_SPEC_PROMPT, promptContext);
35
71
  }
36
- const prompt = readFileSync(promptPath, 'utf-8')
37
- .replace('${topic}', options.topic);
38
72
  if (config.dryRun) {
39
- console.log('DRY RUN:', prompt.slice(0, 200) + '...');
73
+ console.log('--- DRY RUN: Would execute prompt ---');
74
+ console.log(prompt);
75
+ console.log('--- END DRY RUN ---');
40
76
  return;
41
77
  }
78
+ let specContent = '';
42
79
  try {
43
- await engine.run(prompt, { model: config.model });
80
+ // Engine handles output to terminal, we just capture for saving
81
+ for await (const chunk of engine.execute(prompt, {
82
+ model: config.model,
83
+ executor: config.executor,
84
+ headless: false,
85
+ skipPermissions: false,
86
+ verbose: config.verbose,
87
+ reasoningEffort: config.reasoningEffort,
88
+ })) {
89
+ if (chunk.type === 'text' && chunk.content) {
90
+ specContent += chunk.content;
91
+ }
92
+ else if (chunk.type === 'error') {
93
+ console.error('Error:', chunk.error);
94
+ }
95
+ }
44
96
  }
45
97
  catch (e) {
46
98
  console.error('Execution failed:', e);
47
99
  process.exit(1);
48
100
  }
49
- console.log('\nSpec session complete. Save output to specs/ directory manually if needed.');
101
+ if (specContent.trim()) {
102
+ const specsDir = 'specs';
103
+ if (!existsSync(specsDir)) {
104
+ const { mkdir } = await import('fs/promises');
105
+ await mkdir(specsDir, { recursive: true });
106
+ }
107
+ const specPath = join(specsDir, `${topic}.md`);
108
+ await writeFile(specPath, specContent);
109
+ console.log(`\nSpec saved to: ${specPath}`);
110
+ }
50
111
  }
51
112
  //# sourceMappingURL=spec.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"spec.js","sourceRoot":"","sources":["../../src/commands/spec.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"spec.js","sourceRoot":"","sources":["../../src/commands/spec.ts"],"names":[],"mappings":"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"}