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
@@ -0,0 +1,120 @@
1
+ import { createInterface } from 'readline';
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, reject) => {
12
+ const cleanup = () => {
13
+ try {
14
+ rl.close();
15
+ }
16
+ catch {
17
+ // Ignore cleanup errors
18
+ }
19
+ };
20
+ rl.question(`${message} [y/N] `, (answer) => {
21
+ cleanup();
22
+ resolve(answer.toLowerCase() === 'y' || answer.toLowerCase() === 'yes');
23
+ });
24
+ rl.on('error', (err) => {
25
+ cleanup();
26
+ reject(err);
27
+ });
28
+ // Handle SIGINT (Ctrl+C) to cleanup properly
29
+ const sigintHandler = () => {
30
+ cleanup();
31
+ resolve(false);
32
+ };
33
+ process.once('SIGINT', sigintHandler);
34
+ // Remove SIGINT handler after question is answered
35
+ rl.on('close', () => {
36
+ process.removeListener('SIGINT', sigintHandler);
37
+ });
38
+ });
39
+ }
40
+ /**
41
+ * Execute init command
42
+ */
43
+ export async function initCommand(options) {
44
+ const dir = options.from ?? process.cwd();
45
+ console.log(`Initializing vralphy in: ${dir}`);
46
+ // Build init options
47
+ const initOptions = {
48
+ noAi: options.noAi,
49
+ noInject: options.noInject,
50
+ approve: options.approve,
51
+ verbose: options.verbose,
52
+ };
53
+ // Validate engine if specified
54
+ if (options.engine) {
55
+ const validEngines = ['claude', 'opencode', 'codex'];
56
+ if (!validEngines.includes(options.engine)) {
57
+ console.error(`Invalid engine: ${options.engine}. Valid options: ${validEngines.join(', ')}`);
58
+ process.exit(1);
59
+ }
60
+ initOptions.engine = options.engine;
61
+ }
62
+ try {
63
+ // If --approve flag is set, we need to handle the approval flow
64
+ if (options.approve && !options.noAi) {
65
+ // First run with approve mode - AI generates but we need to confirm
66
+ const result = await initProject(dir, { ...initOptions, approve: true });
67
+ if (result.agentsMdContent) {
68
+ console.log('\n--- Generated AGENTS.md Preview ---\n');
69
+ console.log(result.agentsMdContent);
70
+ console.log('\n--- End Preview ---\n');
71
+ const approved = await confirm('Save this AGENTS.md?');
72
+ if (!approved) {
73
+ console.log('Initialization cancelled.');
74
+ process.exit(0);
75
+ }
76
+ }
77
+ // Report results
78
+ reportResults(result.created, result.skipped, result.injected);
79
+ }
80
+ else {
81
+ // Normal flow (no approval needed)
82
+ const { created, skipped, injected } = await initProject(dir, initOptions);
83
+ reportResults(created, skipped, injected);
84
+ }
85
+ console.log('\nInitialization complete!');
86
+ console.log('\nNext steps:');
87
+ console.log(' 1. Review and customize .vralphy/AGENTS.md');
88
+ console.log(' 2. Create specs in specs/ directory');
89
+ console.log(' 3. Run: vralphy plan');
90
+ console.log(' 4. Run: vralphy build');
91
+ }
92
+ catch (e) {
93
+ console.error('Initialization failed:', e);
94
+ process.exit(1);
95
+ }
96
+ }
97
+ /**
98
+ * Report created, skipped, and injected files
99
+ */
100
+ function reportResults(created, skipped, injected = []) {
101
+ if (created.length > 0) {
102
+ console.log('\nCreated:');
103
+ for (const file of created) {
104
+ console.log(` + ${file}`);
105
+ }
106
+ }
107
+ if (injected.length > 0) {
108
+ console.log('\nInjected vralphy references:');
109
+ for (const file of injected) {
110
+ console.log(` ↪ ${file}`);
111
+ }
112
+ }
113
+ if (skipped.length > 0) {
114
+ console.log('\nSkipped (already exist):');
115
+ for (const file of skipped) {
116
+ console.log(` - ${file}`);
117
+ }
118
+ }
119
+ }
120
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
@@ -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":"AAEA,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,CAqJ5F"}
@@ -0,0 +1,147 @@
1
+ import { existsSync } from 'fs';
2
+ import { basename } from 'path';
3
+ import { getEngine } from '../lib/engines/index.js';
4
+ import { CodexEngine } from '../lib/engines/codex.js';
5
+ import { loadPrompt, interpolatePrompt, getDefaultPlanPrompt } from '../lib/prompts.js';
6
+ import { sendSlack, sessionStartMessage, iterationEndMessage, sessionEndMessage, iterationErrorMessage } from '../lib/slack.js';
7
+ import { initEventLogger, logEvent, generateSessionId } from '../lib/events.js';
8
+ /**
9
+ * Execute plan mode
10
+ */
11
+ export async function planCommand(config, options) {
12
+ const engine = getEngine(config.engine);
13
+ if (!(await engine.isAvailable())) {
14
+ throw new Error(`Engine '${config.engine}' is not available. Please install it first.`);
15
+ }
16
+ // Configure Codex-specific settings if using Codex engine
17
+ if (config.engine === 'codex' && engine instanceof CodexEngine) {
18
+ engine.configure({
19
+ maxAgents: config.codex?.maxAgents,
20
+ workerTimeout: config.codex?.workerTimeout,
21
+ });
22
+ }
23
+ const maxIterations = options.iterations ?? 0;
24
+ let iteration = 0;
25
+ const project = basename(process.cwd());
26
+ const sessionId = generateSessionId();
27
+ initEventLogger(sessionId, project);
28
+ const webhookUrl = config.slackWebhook;
29
+ const sessionStart = Date.now();
30
+ console.log(`Starting plan mode with ${config.engine} engine`);
31
+ console.log(`Planning Model: ${config.planningModel}, Executor Model: ${config.executorModel}`);
32
+ if (config.engine === 'codex') {
33
+ console.log(`Max agents: ${config.codex?.maxAgents ?? 8}, Worker timeout: ${config.codex?.workerTimeout ?? 300}s`);
34
+ }
35
+ console.log(`Max iterations: ${maxIterations || 'unlimited'}`);
36
+ // Log and notify session start
37
+ logEvent({
38
+ type: 'session.start',
39
+ command: 'plan',
40
+ engine: config.engine,
41
+ planningModel: config.planningModel,
42
+ executorModel: config.executorModel,
43
+ maxIterations,
44
+ });
45
+ if (webhookUrl) {
46
+ sendSlack(webhookUrl, sessionStartMessage(project, 'plan', maxIterations, config.engine, config.planningModel));
47
+ }
48
+ // Prompt locations in order of preference (engine-specific first)
49
+ const promptPaths = [
50
+ `.vralphy/prompts/${config.engine}/plan.md`, // Engine-specific location
51
+ '.vralphy/prompts/plan.md', // Generic new location
52
+ 'PROMPT_plan.md', // Legacy location (backwards compat)
53
+ ];
54
+ let success = true;
55
+ try {
56
+ while (true) {
57
+ if (maxIterations > 0 && iteration >= maxIterations) {
58
+ console.log(`Reached max iterations (${maxIterations})`);
59
+ break;
60
+ }
61
+ const iterationStart = Date.now();
62
+ console.log(`\n=== Plan Iteration ${iteration + 1} ===\n`);
63
+ let prompt;
64
+ const promptContext = {
65
+ planningModel: config.planningModel,
66
+ executorModel: config.executorModel,
67
+ engine: config.engine,
68
+ maxAgents: config.codex?.maxAgents,
69
+ workerTimeout: config.codex?.workerTimeout,
70
+ };
71
+ // Find first existing prompt file
72
+ const existingPromptPath = promptPaths.find(p => existsSync(p));
73
+ if (existingPromptPath) {
74
+ prompt = await loadPrompt(existingPromptPath, promptContext);
75
+ }
76
+ else {
77
+ // Use engine-specific default prompt
78
+ const defaultPrompt = getDefaultPlanPrompt(config.engine);
79
+ prompt = interpolatePrompt(defaultPrompt, promptContext);
80
+ }
81
+ if (config.dryRun) {
82
+ console.log('--- DRY RUN: Would execute prompt ---');
83
+ console.log(prompt.slice(0, 500) + '...');
84
+ console.log('--- END DRY RUN ---');
85
+ break;
86
+ }
87
+ try {
88
+ // Engine handles output to terminal
89
+ for await (const chunk of engine.execute(prompt, {
90
+ planningModel: config.planningModel,
91
+ executorModel: config.executorModel,
92
+ headless: true,
93
+ skipPermissions: true,
94
+ verbose: config.verbose,
95
+ reasoningEffort: config.reasoningEffort,
96
+ })) {
97
+ if (chunk.type === 'error') {
98
+ console.error('Error:', chunk.error);
99
+ }
100
+ }
101
+ }
102
+ catch (e) {
103
+ const errorMsg = e instanceof Error ? e.message : String(e);
104
+ console.error('Execution failed:', e);
105
+ // Log and notify error
106
+ logEvent({
107
+ type: 'iteration.error',
108
+ iteration: iteration + 1,
109
+ maxIterations,
110
+ error: errorMsg,
111
+ });
112
+ if (webhookUrl) {
113
+ sendSlack(webhookUrl, iterationErrorMessage(project, iteration + 1, maxIterations, errorMsg));
114
+ }
115
+ success = false;
116
+ throw e;
117
+ }
118
+ iteration++;
119
+ // Log and notify iteration end
120
+ const iterationDuration = Date.now() - iterationStart;
121
+ logEvent({
122
+ type: 'iteration.end',
123
+ iteration,
124
+ maxIterations,
125
+ durationMs: iterationDuration,
126
+ });
127
+ if (webhookUrl) {
128
+ sendSlack(webhookUrl, iterationEndMessage(project, iteration, maxIterations, iterationDuration));
129
+ }
130
+ }
131
+ }
132
+ finally {
133
+ // Log and notify session end
134
+ const totalDuration = Date.now() - sessionStart;
135
+ logEvent({
136
+ type: 'session.end',
137
+ success,
138
+ iterationsCompleted: iteration,
139
+ durationMs: totalDuration,
140
+ });
141
+ if (webhookUrl) {
142
+ sendSlack(webhookUrl, sessionEndMessage(project, iteration, totalDuration, success));
143
+ }
144
+ }
145
+ console.log(`\nPlanning complete after ${iteration} iteration(s)`);
146
+ }
147
+ //# 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,CAqG5F"}
@@ -0,0 +1,111 @@
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
+ throw new Error(`Engine '${config.engine}' is not available. Please install it first.`);
24
+ }
25
+ if (!options.topic) {
26
+ const existingSpecs = await listSpecs();
27
+ if (existingSpecs.length > 0) {
28
+ console.log('Existing specs:');
29
+ for (const spec of existingSpecs) {
30
+ console.log(` - ${spec}`);
31
+ }
32
+ console.log('\nUsage: vralphy spec <topic>');
33
+ }
34
+ else {
35
+ console.log('No specs found. Create one with: vralphy spec <topic>');
36
+ }
37
+ return;
38
+ }
39
+ const topic = options.topic;
40
+ const existingSpecs = await listSpecs();
41
+ console.log(`Starting spec phase for: ${topic}`);
42
+ console.log(`Engine: ${config.engine}`);
43
+ if (!engine.supportsInteractive()) {
44
+ console.log('\nNote: Non-interactive mode (OpenCode engine)');
45
+ console.log('A template will be generated for manual editing.\n');
46
+ }
47
+ const projectRoot = findProjectRoot();
48
+ const projectName = projectRoot.split('/').pop() ?? 'project';
49
+ // Prompt locations in order of preference
50
+ const promptPaths = [
51
+ '.vralphy/prompts/spec.md', // New location
52
+ 'PROMPT_spec.md', // Legacy location (backwards compat)
53
+ ];
54
+ const promptContext = {
55
+ planningModel: config.planningModel,
56
+ executorModel: config.executorModel,
57
+ engine: config.engine,
58
+ topic,
59
+ projectName,
60
+ existingSpecs,
61
+ };
62
+ // Find first existing prompt file
63
+ const existingPromptPath = promptPaths.find(p => existsSync(p));
64
+ let prompt;
65
+ if (existingPromptPath) {
66
+ prompt = await loadPrompt(existingPromptPath, promptContext);
67
+ }
68
+ else {
69
+ prompt = interpolatePrompt(DEFAULT_SPEC_PROMPT, promptContext);
70
+ }
71
+ if (config.dryRun) {
72
+ console.log('--- DRY RUN: Would execute prompt ---');
73
+ console.log(prompt);
74
+ console.log('--- END DRY RUN ---');
75
+ return;
76
+ }
77
+ let specContent = '';
78
+ try {
79
+ // Engine handles output to terminal, we just capture for saving
80
+ for await (const chunk of engine.execute(prompt, {
81
+ planningModel: config.planningModel,
82
+ executorModel: config.executorModel,
83
+ headless: false,
84
+ skipPermissions: false,
85
+ verbose: config.verbose,
86
+ reasoningEffort: config.reasoningEffort,
87
+ })) {
88
+ if (chunk.type === 'text' && chunk.content) {
89
+ specContent += chunk.content;
90
+ }
91
+ else if (chunk.type === 'error') {
92
+ console.error('Error:', chunk.error);
93
+ }
94
+ }
95
+ }
96
+ catch (e) {
97
+ console.error('Execution failed:', e);
98
+ throw e;
99
+ }
100
+ if (specContent.trim()) {
101
+ const specsDir = 'specs';
102
+ if (!existsSync(specsDir)) {
103
+ const { mkdir } = await import('fs/promises');
104
+ await mkdir(specsDir, { recursive: true });
105
+ }
106
+ const specPath = join(specsDir, `${topic}.md`);
107
+ await writeFile(specPath, specContent);
108
+ console.log(`\nSpec saved to: ${specPath}`);
109
+ }
110
+ }
111
+ //# sourceMappingURL=spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spec.js","sourceRoot":"","sources":["../../src/commands/spec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAChC,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,OAAO,EAAE,SAAS,EAAc,MAAM,yBAAyB,CAAC;AAChE,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACvF,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAMnD;;GAEG;AACH,KAAK,UAAU,SAAS;IACtB,MAAM,QAAQ,GAAG,OAAO,CAAC;IACzB,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;QAAE,OAAO,EAAE,CAAC;IAErC,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,QAAQ,CAAC,CAAC;IACtC,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC;AACjF,CAAC;AAED;;GAEG;AACH,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,MAAM,IAAI,KAAK,CAAC,WAAW,MAAM,CAAC,MAAM,8CAA8C,CAAC,CAAC;IAC1F,CAAC;IAED,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QACnB,MAAM,aAAa,GAAG,MAAM,SAAS,EAAE,CAAC;QACxC,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC7B,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;YAC/B,KAAK,MAAM,IAAI,IAAI,aAAa,EAAE,CAAC;gBACjC,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;YAC7B,CAAC;YACD,OAAO,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAC;QAC/C,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,uDAAuD,CAAC,CAAC;QACvE,CAAC;QACD,OAAO;IACT,CAAC;IAED,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;IAC5B,MAAM,aAAa,GAAG,MAAM,SAAS,EAAE,CAAC;IAExC,OAAO,CAAC,GAAG,CAAC,4BAA4B,KAAK,EAAE,CAAC,CAAC;IACjD,OAAO,CAAC,GAAG,CAAC,WAAW,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;IAExC,IAAI,CAAC,MAAM,CAAC,mBAAmB,EAAE,EAAE,CAAC;QAClC,OAAO,CAAC,GAAG,CAAC,gDAAgD,CAAC,CAAC;QAC9D,OAAO,CAAC,GAAG,CAAC,oDAAoD,CAAC,CAAC;IACpE,CAAC;IAED,MAAM,WAAW,GAAG,eAAe,EAAE,CAAC;IACtC,MAAM,WAAW,GAAG,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,SAAS,CAAC;IAE9D,0CAA0C;IAC1C,MAAM,WAAW,GAAG;QAClB,0BAA0B,EAAG,eAAe;QAC5C,gBAAgB,EAAc,qCAAqC;KACpE,CAAC;IAEF,MAAM,aAAa,GAAG;QACpB,aAAa,EAAE,MAAM,CAAC,aAAa;QACnC,aAAa,EAAE,MAAM,CAAC,aAAa;QACnC,MAAM,EAAE,MAAM,CAAC,MAAoB;QACnC,KAAK;QACL,WAAW;QACX,aAAa;KACd,CAAC;IAEF,kCAAkC;IAClC,MAAM,kBAAkB,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;IAEhE,IAAI,MAAc,CAAC;IACnB,IAAI,kBAAkB,EAAE,CAAC;QACvB,MAAM,GAAG,MAAM,UAAU,CAAC,kBAAkB,EAAE,aAAa,CAAC,CAAC;IAC/D,CAAC;SAAM,CAAC;QACN,MAAM,GAAG,iBAAiB,CAAC,mBAAmB,EAAE,aAAa,CAAC,CAAC;IACjE,CAAC;IAED,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QAClB,OAAO,CAAC,GAAG,CAAC,uCAAuC,CAAC,CAAC;QACrD,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACpB,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;QACnC,OAAO;IACT,CAAC;IAED,IAAI,WAAW,GAAG,EAAE,CAAC;IAErB,IAAI,CAAC;QACH,gEAAgE;QAChE,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE;YAC/C,aAAa,EAAE,MAAM,CAAC,aAAa;YACnC,aAAa,EAAE,MAAM,CAAC,aAAa;YACnC,QAAQ,EAAE,KAAK;YACf,eAAe,EAAE,KAAK;YACtB,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,eAAe,EAAE,MAAM,CAAC,eAAe;SACxC,CAAC,EAAE,CAAC;YACH,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;gBAC3C,WAAW,IAAI,KAAK,CAAC,OAAO,CAAC;YAC/B,CAAC;iBAAM,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;gBAClC,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;YACvC,CAAC;QACH,CAAC;IACH,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,CAAC,KAAK,CAAC,mBAAmB,EAAE,CAAC,CAAC,CAAC;QACtC,MAAM,CAAC,CAAC;IACV,CAAC;IAED,IAAI,WAAW,CAAC,IAAI,EAAE,EAAE,CAAC;QACvB,MAAM,QAAQ,GAAG,OAAO,CAAC;QACzB,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC1B,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,CAAC;YAC9C,MAAM,KAAK,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC7C,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE,GAAG,KAAK,KAAK,CAAC,CAAC;QAC/C,MAAM,SAAS,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;QACvC,OAAO,CAAC,GAAG,CAAC,oBAAoB,QAAQ,EAAE,CAAC,CAAC;IAC9C,CAAC;AACH,CAAC"}
@@ -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":""}