wiggum-cli 0.11.25 → 0.12.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 (103) hide show
  1. package/README.md +2 -1
  2. package/dist/__test-utils__/fixtures.d.ts +17 -0
  3. package/dist/__test-utils__/fixtures.d.ts.map +1 -0
  4. package/dist/__test-utils__/fixtures.js +32 -0
  5. package/dist/__test-utils__/fixtures.js.map +1 -0
  6. package/dist/__test-utils__/ink-helpers.d.ts +43 -0
  7. package/dist/__test-utils__/ink-helpers.d.ts.map +1 -0
  8. package/dist/__test-utils__/ink-helpers.js +62 -0
  9. package/dist/__test-utils__/ink-helpers.js.map +1 -0
  10. package/dist/__test-utils__/mock-ai.d.ts +99 -0
  11. package/dist/__test-utils__/mock-ai.d.ts.map +1 -0
  12. package/dist/__test-utils__/mock-ai.js +75 -0
  13. package/dist/__test-utils__/mock-ai.js.map +1 -0
  14. package/dist/__test-utils__/mock-tracing.d.ts +18 -0
  15. package/dist/__test-utils__/mock-tracing.d.ts.map +1 -0
  16. package/dist/__test-utils__/mock-tracing.js +24 -0
  17. package/dist/__test-utils__/mock-tracing.js.map +1 -0
  18. package/dist/__test-utils__/setup.d.ts +8 -0
  19. package/dist/__test-utils__/setup.d.ts.map +1 -0
  20. package/dist/__test-utils__/setup.js +21 -0
  21. package/dist/__test-utils__/setup.js.map +1 -0
  22. package/dist/commands/monitor.d.ts.map +1 -1
  23. package/dist/commands/monitor.js +3 -1
  24. package/dist/commands/monitor.js.map +1 -1
  25. package/dist/commands/run.d.ts +1 -0
  26. package/dist/commands/run.d.ts.map +1 -1
  27. package/dist/commands/run.js +8 -0
  28. package/dist/commands/run.js.map +1 -1
  29. package/dist/templates/config/ralph.config.cjs.tmpl +1 -0
  30. package/dist/templates/prompts/PROMPT_review_manual.md.tmpl +96 -0
  31. package/dist/templates/root/README.md.tmpl +7 -6
  32. package/dist/templates/scripts/feature-loop.sh.tmpl +34 -5
  33. package/dist/templates/scripts/ralph-monitor.sh.tmpl +3 -1
  34. package/dist/tui/app.d.ts.map +1 -1
  35. package/dist/tui/app.js +3 -0
  36. package/dist/tui/app.js.map +1 -1
  37. package/dist/tui/components/ChatInput.test.d.ts +2 -0
  38. package/dist/tui/components/ChatInput.test.d.ts.map +1 -0
  39. package/dist/tui/components/ChatInput.test.js +75 -0
  40. package/dist/tui/components/ChatInput.test.js.map +1 -0
  41. package/dist/tui/components/MultiSelect.d.ts.map +1 -1
  42. package/dist/tui/components/MultiSelect.js +5 -3
  43. package/dist/tui/components/MultiSelect.js.map +1 -1
  44. package/dist/tui/components/WiggumBanner.d.ts.map +1 -1
  45. package/dist/tui/components/WiggumBanner.js +1 -2
  46. package/dist/tui/components/WiggumBanner.js.map +1 -1
  47. package/dist/tui/components/WorkingIndicator.test.d.ts +2 -0
  48. package/dist/tui/components/WorkingIndicator.test.d.ts.map +1 -0
  49. package/dist/tui/components/WorkingIndicator.test.js +26 -0
  50. package/dist/tui/components/WorkingIndicator.test.js.map +1 -0
  51. package/dist/tui/orchestration/interview-orchestrator.d.ts +2 -2
  52. package/dist/tui/orchestration/interview-orchestrator.d.ts.map +1 -1
  53. package/dist/tui/orchestration/interview-orchestrator.js +19 -5
  54. package/dist/tui/orchestration/interview-orchestrator.js.map +1 -1
  55. package/dist/tui/screens/InterviewScreen.d.ts.map +1 -1
  56. package/dist/tui/screens/InterviewScreen.integration.test.d.ts +7 -0
  57. package/dist/tui/screens/InterviewScreen.integration.test.d.ts.map +1 -0
  58. package/dist/tui/screens/InterviewScreen.integration.test.js +149 -0
  59. package/dist/tui/screens/InterviewScreen.integration.test.js.map +1 -0
  60. package/dist/tui/screens/InterviewScreen.js +5 -7
  61. package/dist/tui/screens/InterviewScreen.js.map +1 -1
  62. package/dist/tui/screens/MainShell.test.d.ts +2 -0
  63. package/dist/tui/screens/MainShell.test.d.ts.map +1 -0
  64. package/dist/tui/screens/MainShell.test.js +103 -0
  65. package/dist/tui/screens/MainShell.test.js.map +1 -0
  66. package/dist/tui/screens/RunScreen.d.ts.map +1 -1
  67. package/dist/tui/screens/RunScreen.js +8 -0
  68. package/dist/tui/screens/RunScreen.js.map +1 -1
  69. package/dist/tui/screens/WelcomeScreen.test.d.ts +2 -0
  70. package/dist/tui/screens/WelcomeScreen.test.d.ts.map +1 -0
  71. package/dist/tui/screens/WelcomeScreen.test.js +51 -0
  72. package/dist/tui/screens/WelcomeScreen.test.js.map +1 -0
  73. package/dist/tui/types/interview.d.ts +3 -1
  74. package/dist/tui/types/interview.d.ts.map +1 -1
  75. package/dist/tui/types/interview.js.map +1 -1
  76. package/dist/tui/utils/loop-status.d.ts.map +1 -1
  77. package/dist/tui/utils/loop-status.js +3 -1
  78. package/dist/tui/utils/loop-status.js.map +1 -1
  79. package/dist/utils/config.d.ts +1 -0
  80. package/dist/utils/config.d.ts.map +1 -1
  81. package/dist/utils/config.js +2 -0
  82. package/dist/utils/config.js.map +1 -1
  83. package/package.json +4 -2
  84. package/src/templates/config/ralph.config.cjs.tmpl +1 -0
  85. package/src/templates/prompts/PROMPT_review_manual.md.tmpl +96 -0
  86. package/src/templates/root/README.md.tmpl +7 -6
  87. package/src/templates/scripts/feature-loop.sh.tmpl +34 -5
  88. package/src/templates/scripts/ralph-monitor.sh.tmpl +3 -1
  89. package/dist/cli.d.ts +0 -6
  90. package/dist/cli.d.ts.map +0 -1
  91. package/dist/cli.js +0 -212
  92. package/dist/cli.js.map +0 -1
  93. package/dist/repl/repl-loop.d.ts +0 -32
  94. package/dist/repl/repl-loop.d.ts.map +0 -1
  95. package/dist/repl/repl-loop.js +0 -309
  96. package/dist/repl/repl-loop.js.map +0 -1
  97. package/dist/templates/config/ralph.config.js.tmpl +0 -38
  98. package/dist/utils/repl-prompts.d.ts +0 -59
  99. package/dist/utils/repl-prompts.d.ts.map +0 -1
  100. package/dist/utils/repl-prompts.js +0 -314
  101. package/dist/utils/repl-prompts.js.map +0 -1
  102. /package/dist/templates/prompts/{PROMPT_review.md.tmpl → PROMPT_review_auto.md.tmpl} +0 -0
  103. /package/src/templates/prompts/{PROMPT_review.md.tmpl → PROMPT_review_auto.md.tmpl} +0 -0
package/dist/cli.js DELETED
@@ -1,212 +0,0 @@
1
- import { Command } from 'commander';
2
- import { displayHeader } from './utils/header.js';
3
- import { initCommand } from './commands/init.js';
4
- import { runCommand } from './commands/run.js';
5
- import { monitorCommand } from './commands/monitor.js';
6
- import { newCommand } from './commands/new.js';
7
- import { logger } from './utils/logger.js';
8
- /**
9
- * Set up and configure the CLI
10
- */
11
- export function createCli() {
12
- const program = new Command();
13
- program
14
- .name('wiggum')
15
- .description('AI-powered feature development loop CLI.\n\n' +
16
- 'Ralph auto-detects your tech stack and generates an intelligent\n' +
17
- 'development environment for AI-driven feature implementation.')
18
- .version('0.1.0')
19
- .hook('preAction', () => {
20
- displayHeader();
21
- })
22
- .addHelpText('after', `
23
- Examples:
24
- $ wiggum init Initialize Wiggum with AI analysis
25
- $ wiggum new my-feature Create a new feature specification
26
- $ wiggum run my-feature Run the feature development loop
27
- $ wiggum monitor my-feature Monitor progress in real-time
28
-
29
- Documentation:
30
- https://github.com/your-org/wiggum-cli#readme
31
- `);
32
- // wiggum init
33
- program
34
- .command('init')
35
- .description('Initialize Ralph in the current project.\n\n' +
36
- 'Uses AI to analyze your codebase, detect the tech stack, and generate\n' +
37
- 'intelligent configuration files in .ralph/')
38
- .option('--provider <name>', 'AI provider to use (anthropic, openai, openrouter)', 'anthropic')
39
- .option('-y, --yes', 'Accept defaults and skip all confirmation prompts')
40
- .option('-i, --interactive', 'Stay in interactive REPL mode after initialization')
41
- .addHelpText('after', `
42
- Examples:
43
- $ wiggum init Initialize with AI analysis
44
- $ wiggum init --provider openai Use OpenAI provider
45
- $ wiggum init --yes Non-interactive mode
46
- $ wiggum init -i Initialize and enter interactive mode
47
-
48
- API Keys (BYOK - Bring Your Own Keys):
49
- Required (one of):
50
- ANTHROPIC_API_KEY For Anthropic (Claude) provider
51
- OPENAI_API_KEY For OpenAI provider
52
- OPENROUTER_API_KEY For OpenRouter provider
53
-
54
- Optional (for enhanced research):
55
- TAVILY_API_KEY Enable web search for best practices
56
- CONTEXT7_API_KEY Enable documentation lookup
57
- `)
58
- .action(async (options) => {
59
- try {
60
- await initCommand(options);
61
- }
62
- catch (error) {
63
- handleCommandError(error);
64
- }
65
- });
66
- // wiggum run <feature>
67
- program
68
- .command('run <feature>')
69
- .description('Run the feature development loop for a specific feature.\n\n' +
70
- 'Executes the AI-driven implementation workflow using the feature\n' +
71
- 'spec in .ralph/specs/<feature>.md')
72
- .option('--worktree', 'Use git worktree for isolation (enables parallel execution of multiple features)')
73
- .option('--resume', 'Resume an interrupted loop (reuses existing branch and worktree)')
74
- .option('--model <model>', 'Claude model to use for implementation (opus, sonnet)')
75
- .option('--max-iterations <n>', 'Maximum number of implementation iterations (default: 50)', parseInt)
76
- .option('--max-e2e-attempts <n>', 'Maximum E2E test retry attempts before giving up (default: 3)', parseInt)
77
- .addHelpText('after', `
78
- Examples:
79
- $ wiggum run user-auth Run the user-auth feature
80
- $ wiggum run payment --worktree Run in isolated worktree
81
- $ wiggum run payment --resume Resume interrupted session
82
- $ wiggum run my-feature --model opus Use Claude Opus model
83
- $ wiggum run my-feature --max-iterations 30 --max-e2e-attempts 5
84
-
85
- Notes:
86
- - Create a feature spec first with: wiggum new <feature>
87
- - The spec file should be at: .ralph/specs/<feature>.md
88
- - Use --worktree to run multiple features in parallel
89
- `)
90
- .action(async (feature, options) => {
91
- try {
92
- const runOptions = {
93
- worktree: options.worktree,
94
- resume: options.resume,
95
- model: options.model,
96
- maxIterations: options.maxIterations,
97
- maxE2eAttempts: options.maxE2eAttempts,
98
- };
99
- await runCommand(feature, runOptions);
100
- }
101
- catch (error) {
102
- handleCommandError(error);
103
- }
104
- });
105
- // wiggum monitor <feature>
106
- program
107
- .command('monitor <feature>')
108
- .description('Launch the monitoring dashboard for a feature.\n\n' +
109
- 'Displays real-time progress including iteration count, phase,\n' +
110
- 'task completion, token usage, and E2E test status.')
111
- .option('--bash', 'Use the bash script monitor instead of the built-in dashboard')
112
- .option('--python', 'Use the Python TUI monitor (if available)')
113
- .option('--interval <seconds>', 'Dashboard refresh interval in seconds (default: 5)', parseInt, 5)
114
- .addHelpText('after', `
115
- Examples:
116
- $ wiggum monitor my-feature Monitor with built-in dashboard
117
- $ wiggum monitor my-feature --interval 2 Refresh every 2 seconds
118
- $ wiggum monitor my-feature --bash Use bash script monitor
119
-
120
- Dashboard Shows:
121
- - Current phase (Planning, Implementation, E2E Testing, etc.)
122
- - Iteration progress
123
- - Task completion status
124
- - Token usage (input/output)
125
- - Git branch information
126
- `)
127
- .action(async (feature, options) => {
128
- try {
129
- const monitorOptions = {
130
- bash: options.bash,
131
- python: options.python,
132
- interval: options.interval,
133
- };
134
- await monitorCommand(feature, monitorOptions);
135
- }
136
- catch (error) {
137
- handleCommandError(error);
138
- }
139
- });
140
- // wiggum new <feature>
141
- program
142
- .command('new <feature>')
143
- .description('Create a new feature specification from template.\n\n' +
144
- 'Generates a markdown spec file with sections for requirements,\n' +
145
- 'acceptance criteria, technical notes, and more.')
146
- .option('-e, --edit', 'Open the spec in your editor after creation')
147
- .option('--editor <editor>', 'Editor command to use (defaults to $EDITOR or "code")')
148
- .option('-y, --yes', 'Skip confirmation prompts')
149
- .option('-f, --force', 'Overwrite existing spec file without prompting')
150
- .option('--ai', 'Use AI interview to generate the spec')
151
- .option('--tui', 'Use Ink TUI for AI interview (with --ai)')
152
- .option('--provider <name>', 'AI provider for spec generation (anthropic, openai, openrouter)')
153
- .option('--model <model>', 'Model to use for AI spec generation')
154
- .addHelpText('after', `
155
- Examples:
156
- $ wiggum new user-dashboard Create spec from template
157
- $ wiggum new user-dashboard --ai Use AI interview to generate spec
158
- $ wiggum new user-dashboard --ai --tui Use AI with Ink TUI interface
159
- $ wiggum new user-dashboard --edit Create and open in editor
160
- $ wiggum new user-dashboard -e --editor vim Open in vim
161
- $ wiggum new user-dashboard --yes Skip confirmations
162
- $ wiggum new user-dashboard --force Overwrite if exists
163
-
164
- Output:
165
- Creates: .ralph/specs/<feature>.md
166
-
167
- AI Mode (--ai):
168
- - Gathers context from URLs/files you provide
169
- - Conducts an interview to understand your requirements
170
- - Generates a detailed, project-specific specification
171
- - Add --tui for a beautiful Ink-based terminal interface
172
-
173
- Template Mode (default):
174
- - Uses a standard template with sections for:
175
- Purpose, user stories, requirements, technical notes, etc.
176
- `)
177
- .action(async (feature, options) => {
178
- try {
179
- const newOptions = {
180
- edit: options.edit,
181
- editor: options.editor,
182
- yes: options.yes,
183
- force: options.force,
184
- ai: options.ai,
185
- tui: options.tui,
186
- provider: options.provider,
187
- model: options.model,
188
- };
189
- await newCommand(feature, newOptions);
190
- }
191
- catch (error) {
192
- handleCommandError(error);
193
- }
194
- });
195
- return program;
196
- }
197
- /**
198
- * Handle command errors with user-friendly output
199
- */
200
- function handleCommandError(error) {
201
- if (error instanceof Error) {
202
- logger.error(error.message);
203
- if (process.env.DEBUG) {
204
- console.error(error.stack);
205
- }
206
- }
207
- else {
208
- logger.error(String(error));
209
- }
210
- process.exit(1);
211
- }
212
- //# sourceMappingURL=cli.js.map
package/dist/cli.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -1,32 +0,0 @@
1
- /**
2
- * REPL Loop
3
- * Main interactive loop for the Wiggum CLI
4
- */
5
- import readline from 'node:readline';
6
- import type { SessionState } from './session-state.js';
7
- import { type ReplCommandName } from './command-parser.js';
8
- /**
9
- * Execute a REPL command
10
- */
11
- declare function executeCommand(commandName: ReplCommandName, args: string[], state: SessionState, rl: readline.Interface): Promise<{
12
- state: SessionState;
13
- shouldExit: boolean;
14
- needsRlRecreate: boolean;
15
- }>;
16
- /**
17
- * Process a single line of input
18
- */
19
- declare function processInput(input: string, state: SessionState, rl: readline.Interface): Promise<{
20
- state: SessionState;
21
- shouldExit: boolean;
22
- needsRlRecreate: boolean;
23
- }>;
24
- /**
25
- * Start the REPL loop
26
- */
27
- export declare function startRepl(initialState: SessionState): Promise<void>;
28
- /**
29
- * Export for testing
30
- */
31
- export { processInput, executeCommand };
32
- //# sourceMappingURL=repl-loop.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"repl-loop.d.ts","sourceRoot":"","sources":["../../src/repl/repl-loop.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,QAAQ,MAAM,eAAe,CAAC;AASrC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAEvD,OAAO,EAIL,KAAK,eAAe,EACrB,MAAM,qBAAqB,CAAC;AAwL7B;;GAEG;AACH,iBAAe,cAAc,CAC3B,WAAW,EAAE,eAAe,EAC5B,IAAI,EAAE,MAAM,EAAE,EACd,KAAK,EAAE,YAAY,EACnB,EAAE,EAAE,QAAQ,CAAC,SAAS,GACrB,OAAO,CAAC;IAAE,KAAK,EAAE,YAAY,CAAC;IAAC,UAAU,EAAE,OAAO,CAAC;IAAC,eAAe,EAAE,OAAO,CAAA;CAAE,CAAC,CA6BjF;AAuBD;;GAEG;AACH,iBAAe,YAAY,CACzB,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,YAAY,EACnB,EAAE,EAAE,QAAQ,CAAC,SAAS,GACrB,OAAO,CAAC;IAAE,KAAK,EAAE,YAAY,CAAC;IAAC,UAAU,EAAE,OAAO,CAAC;IAAC,eAAe,EAAE,OAAO,CAAA;CAAE,CAAC,CA8BjF;AA6BD;;GAEG;AACH,wBAAsB,SAAS,CAAC,YAAY,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAiDzE;AAED;;GAEG;AACH,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,CAAC"}
@@ -1,309 +0,0 @@
1
- /**
2
- * REPL Loop
3
- * Main interactive loop for the Wiggum CLI
4
- */
5
- import readline from 'node:readline';
6
- import pc from 'picocolors';
7
- import { logger } from '../utils/logger.js';
8
- import { simpson } from '../utils/colors.js';
9
- import { runCommand } from '../commands/run.js';
10
- import { monitorCommand } from '../commands/monitor.js';
11
- import { runInitWorkflow } from '../commands/init.js';
12
- import { handleConfigCommand } from '../commands/config.js';
13
- import { hasConfig } from '../utils/config.js';
14
- import { updateSessionState } from './session-state.js';
15
- import { parseInput, resolveCommandAlias, formatHelpText, } from './command-parser.js';
16
- const PROMPT = `${simpson.yellow('wiggum')}${simpson.brown('>')} `;
17
- /**
18
- * Clear any buffered stdin data
19
- * Prevents leaked input after subcommands that use their own stdin handling
20
- */
21
- async function clearStdinBuffer() {
22
- return new Promise((resolve) => {
23
- if (process.stdin.isTTY) {
24
- // Set raw mode temporarily to drain buffer
25
- const wasRaw = process.stdin.isRaw;
26
- process.stdin.setRawMode(true);
27
- process.stdin.once('readable', () => {
28
- // Drain any buffered data
29
- while (process.stdin.read() !== null) {
30
- // discard
31
- }
32
- process.stdin.setRawMode(wasRaw);
33
- resolve();
34
- });
35
- // Trigger readable if nothing buffered
36
- setTimeout(resolve, 10);
37
- }
38
- else {
39
- resolve();
40
- }
41
- });
42
- }
43
- /**
44
- * Handler for the /init command
45
- */
46
- async function handleInitCommand(_args, state, rl) {
47
- // Check if already initialized
48
- if (state.initialized && hasConfig(state.projectRoot)) {
49
- logger.warn('Project is already initialized. Re-running init will update configuration.');
50
- console.log('');
51
- }
52
- // Close REPL readline to avoid conflicts with subcommand's stdin usage
53
- // We'll signal to recreate it after the command completes
54
- rl.close();
55
- try {
56
- const result = await runInitWorkflow(state.projectRoot, {
57
- yes: false, // Always interactive in REPL
58
- });
59
- if (result) {
60
- // Update state with init result
61
- return updateSessionState(state, {
62
- provider: result.provider,
63
- model: result.model,
64
- scanResult: result.scanResult,
65
- config: result.config,
66
- initialized: true,
67
- });
68
- }
69
- // User cancelled
70
- return state;
71
- }
72
- catch (error) {
73
- logger.error(`Init failed: ${error instanceof Error ? error.message : String(error)}`);
74
- return state;
75
- }
76
- }
77
- /**
78
- * Handler for the /new command
79
- * Always uses AI interview mode in REPL (falls back to template if no API key)
80
- */
81
- async function handleNewCommand(args, state, rl) {
82
- // Check if initialized
83
- if (!state.initialized && !hasConfig(state.projectRoot)) {
84
- logger.warn('Project not initialized. Run /init first.');
85
- return state;
86
- }
87
- if (args.length === 0) {
88
- logger.error('Feature name required. Usage: /new <feature-name>');
89
- return state;
90
- }
91
- const featureName = args[0];
92
- // Close REPL readline to avoid stdin conflicts with subcommand prompts
93
- rl.close();
94
- try {
95
- // Delegate to the existing new command behavior
96
- // Always use AI mode in REPL (the command handles fallback to template if no API key)
97
- const { newCommand } = await import('../commands/new.js');
98
- await newCommand(featureName, {
99
- yes: false,
100
- scanResult: state.scanResult,
101
- provider: state.provider ?? undefined,
102
- model: state.model,
103
- ai: true, // Always use AI interview in REPL
104
- });
105
- }
106
- catch (error) {
107
- logger.error(`New command failed: ${error instanceof Error ? error.message : String(error)}`);
108
- }
109
- return state;
110
- }
111
- /**
112
- * Handler for the /run command
113
- */
114
- async function handleRunCommand(args, state, rl) {
115
- // Check if initialized
116
- if (!state.initialized && !hasConfig(state.projectRoot)) {
117
- logger.warn('Project not initialized. Run /init first.');
118
- return state;
119
- }
120
- if (args.length === 0) {
121
- logger.error('Feature name required. Usage: /run <feature-name>');
122
- return state;
123
- }
124
- const featureName = args[0];
125
- // Close REPL readline to avoid stdin conflicts with subcommand
126
- rl.close();
127
- try {
128
- await runCommand(featureName, {});
129
- }
130
- catch (error) {
131
- logger.error(`Run command failed: ${error instanceof Error ? error.message : String(error)}`);
132
- }
133
- return state;
134
- }
135
- /**
136
- * Handler for the /monitor command
137
- */
138
- async function handleMonitorCommand(args, state, rl) {
139
- if (args.length === 0) {
140
- logger.error('Feature name required. Usage: /monitor <feature-name>');
141
- return state;
142
- }
143
- const featureName = args[0];
144
- // Close REPL readline to avoid stdin conflicts with subcommand
145
- rl.close();
146
- try {
147
- await monitorCommand(featureName, {});
148
- }
149
- catch (error) {
150
- logger.error(`Monitor command failed: ${error instanceof Error ? error.message : String(error)}`);
151
- }
152
- return state;
153
- }
154
- /**
155
- * Handler for the /help command
156
- */
157
- function handleHelpCommand() {
158
- console.log('');
159
- console.log(formatHelpText());
160
- console.log('');
161
- }
162
- /**
163
- * Execute a REPL command
164
- */
165
- async function executeCommand(commandName, args, state, rl) {
166
- switch (commandName) {
167
- case 'init':
168
- // Init closes the readline to avoid stdin conflicts
169
- return { state: await handleInitCommand(args, state, rl), shouldExit: false, needsRlRecreate: true };
170
- case 'new':
171
- return { state: await handleNewCommand(args, state, rl), shouldExit: false, needsRlRecreate: true };
172
- case 'run':
173
- return { state: await handleRunCommand(args, state, rl), shouldExit: false, needsRlRecreate: true };
174
- case 'monitor':
175
- return { state: await handleMonitorCommand(args, state, rl), shouldExit: false, needsRlRecreate: true };
176
- case 'config':
177
- return { state: await handleConfigCommand(args, state), shouldExit: false, needsRlRecreate: false };
178
- case 'help':
179
- handleHelpCommand();
180
- return { state, shouldExit: false, needsRlRecreate: false };
181
- case 'exit':
182
- return { state, shouldExit: true, needsRlRecreate: false };
183
- default:
184
- logger.warn(`Unknown command: ${commandName}`);
185
- return { state, shouldExit: false, needsRlRecreate: false };
186
- }
187
- }
188
- /**
189
- * Handle natural language input
190
- * For now, just shows a message. Will be enhanced in Phase 3.
191
- */
192
- async function handleNaturalLanguage(text, state) {
193
- if (state.conversationMode) {
194
- // In conversation mode, pass to the conversation handler
195
- // This will be implemented in Phase 3
196
- console.log(pc.dim('(Conversation mode not yet implemented)'));
197
- }
198
- else {
199
- console.log('');
200
- console.log(pc.dim('Tip: Use /help to see available commands, or /new <feature> to create a spec.'));
201
- console.log('');
202
- }
203
- return state;
204
- }
205
- /**
206
- * Process a single line of input
207
- */
208
- async function processInput(input, state, rl) {
209
- const parsed = parseInput(input);
210
- switch (parsed.type) {
211
- case 'empty':
212
- return { state, shouldExit: false, needsRlRecreate: false };
213
- case 'slash-command': {
214
- const { command } = parsed;
215
- if (!command) {
216
- return { state, shouldExit: false, needsRlRecreate: false };
217
- }
218
- const resolvedName = resolveCommandAlias(command.name);
219
- if (!resolvedName) {
220
- logger.warn(`Unknown command: /${command.name}. Type /help for available commands.`);
221
- return { state, shouldExit: false, needsRlRecreate: false };
222
- }
223
- return executeCommand(resolvedName, command.args, state, rl);
224
- }
225
- case 'natural-language': {
226
- const newState = await handleNaturalLanguage(parsed.text, state);
227
- return { state: newState, shouldExit: false, needsRlRecreate: false };
228
- }
229
- default:
230
- return { state, shouldExit: false, needsRlRecreate: false };
231
- }
232
- }
233
- /**
234
- * Create a new readline interface
235
- */
236
- function createReadline() {
237
- return readline.createInterface({
238
- input: process.stdin,
239
- output: process.stdout,
240
- prompt: PROMPT,
241
- terminal: true,
242
- });
243
- }
244
- /**
245
- * Read a single line from readline
246
- */
247
- function readLine(rl) {
248
- return new Promise((resolve) => {
249
- rl.once('line', (line) => resolve(line));
250
- rl.once('close', () => resolve(null));
251
- rl.once('SIGINT', () => {
252
- console.log('');
253
- logger.info('Use /exit to quit');
254
- rl.prompt();
255
- });
256
- });
257
- }
258
- /**
259
- * Start the REPL loop
260
- */
261
- export async function startRepl(initialState) {
262
- let state = initialState;
263
- console.log('');
264
- console.log(simpson.yellow('Wiggum Interactive Mode'));
265
- // Show context-aware welcome message
266
- if (!state.initialized && !hasConfig(state.projectRoot)) {
267
- console.log(pc.dim('Not initialized. Run /init to set up this project.'));
268
- }
269
- else {
270
- console.log(pc.dim('Type /help for commands, /exit to quit'));
271
- }
272
- console.log('');
273
- let rl = createReadline();
274
- let running = true;
275
- while (running) {
276
- rl.prompt();
277
- const line = await readLine(rl);
278
- // Handle EOF (Ctrl+D)
279
- if (line === null) {
280
- console.log('');
281
- logger.info('Goodbye!');
282
- running = false;
283
- break;
284
- }
285
- try {
286
- const result = await processInput(line, state, rl);
287
- state = result.state;
288
- if (result.shouldExit) {
289
- console.log('');
290
- logger.info('Goodbye!');
291
- rl.close();
292
- running = false;
293
- break;
294
- }
295
- // Recreate readline if needed (after commands that closed it)
296
- if (result.needsRlRecreate) {
297
- rl = createReadline();
298
- }
299
- }
300
- catch (error) {
301
- logger.error(`Error: ${error instanceof Error ? error.message : String(error)}`);
302
- }
303
- }
304
- }
305
- /**
306
- * Export for testing
307
- */
308
- export { processInput, executeCommand };
309
- //# sourceMappingURL=repl-loop.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"repl-loop.js","sourceRoot":"","sources":["../../src/repl/repl-loop.ts"],"names":[],"mappings":"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"}
@@ -1,38 +0,0 @@
1
- module.exports = {
2
- name: '{{projectName}}',
3
- stack: {
4
- framework: {
5
- name: '{{framework}}',
6
- version: '{{frameworkVersion}}',
7
- variant: '{{frameworkVariant}}',
8
- },
9
- packageManager: '{{packageManager}}',
10
- testing: {
11
- unit: '{{unitTest}}',
12
- e2e: '{{e2eTest}}',
13
- },
14
- styling: '{{styling}}',
15
- },
16
- commands: {
17
- dev: '{{devCommand}}',
18
- build: '{{buildCommand}}',
19
- test: '{{testCommand}}',
20
- lint: '{{lintCommand}}',
21
- typecheck: '{{typecheckCommand}}',
22
- },
23
- paths: {
24
- root: '.ralph',
25
- prompts: '.ralph/prompts',
26
- guides: '.ralph/guides',
27
- specs: '.ralph/specs',
28
- scripts: '.ralph/scripts',
29
- learnings: '.ralph/LEARNINGS.md',
30
- agents: '.ralph/AGENTS.md',
31
- },
32
- loop: {
33
- maxIterations: 10,
34
- maxE2eAttempts: 5,
35
- defaultModel: 'sonnet',
36
- planningModel: 'opus',
37
- },
38
- };