wiggum-cli 0.7.8 → 0.9.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 (126) hide show
  1. package/dist/ai/conversation/conversation-manager.d.ts +11 -0
  2. package/dist/ai/conversation/conversation-manager.d.ts.map +1 -1
  3. package/dist/ai/conversation/conversation-manager.js +14 -0
  4. package/dist/ai/conversation/conversation-manager.js.map +1 -1
  5. package/dist/cli.d.ts.map +1 -1
  6. package/dist/cli.js +4 -0
  7. package/dist/cli.js.map +1 -1
  8. package/dist/commands/new.d.ts +2 -0
  9. package/dist/commands/new.d.ts.map +1 -1
  10. package/dist/commands/new.js +63 -22
  11. package/dist/commands/new.js.map +1 -1
  12. package/dist/index.d.ts +3 -2
  13. package/dist/index.d.ts.map +1 -1
  14. package/dist/index.js +97 -22
  15. package/dist/index.js.map +1 -1
  16. package/dist/tui/app.d.ts +108 -0
  17. package/dist/tui/app.d.ts.map +1 -0
  18. package/dist/tui/app.js +169 -0
  19. package/dist/tui/app.js.map +1 -0
  20. package/dist/tui/components/ChatInput.d.ts +40 -0
  21. package/dist/tui/components/ChatInput.d.ts.map +1 -0
  22. package/dist/tui/components/ChatInput.js +61 -0
  23. package/dist/tui/components/ChatInput.js.map +1 -0
  24. package/dist/tui/components/MessageList.d.ts +79 -0
  25. package/dist/tui/components/MessageList.d.ts.map +1 -0
  26. package/dist/tui/components/MessageList.js +68 -0
  27. package/dist/tui/components/MessageList.js.map +1 -0
  28. package/dist/tui/components/PhaseHeader.d.ts +36 -0
  29. package/dist/tui/components/PhaseHeader.d.ts.map +1 -0
  30. package/dist/tui/components/PhaseHeader.js +31 -0
  31. package/dist/tui/components/PhaseHeader.js.map +1 -0
  32. package/dist/tui/components/StreamingText.d.ts +47 -0
  33. package/dist/tui/components/StreamingText.d.ts.map +1 -0
  34. package/dist/tui/components/StreamingText.js +38 -0
  35. package/dist/tui/components/StreamingText.js.map +1 -0
  36. package/dist/tui/components/ToolCallCard.d.ts +65 -0
  37. package/dist/tui/components/ToolCallCard.d.ts.map +1 -0
  38. package/dist/tui/components/ToolCallCard.js +100 -0
  39. package/dist/tui/components/ToolCallCard.js.map +1 -0
  40. package/dist/tui/components/WiggumBanner.d.ts +30 -0
  41. package/dist/tui/components/WiggumBanner.d.ts.map +1 -0
  42. package/dist/tui/components/WiggumBanner.js +34 -0
  43. package/dist/tui/components/WiggumBanner.js.map +1 -0
  44. package/dist/tui/components/WorkingIndicator.d.ts +45 -0
  45. package/dist/tui/components/WorkingIndicator.d.ts.map +1 -0
  46. package/dist/tui/components/WorkingIndicator.js +31 -0
  47. package/dist/tui/components/WorkingIndicator.js.map +1 -0
  48. package/dist/tui/components/index.d.ts +16 -0
  49. package/dist/tui/components/index.d.ts.map +1 -0
  50. package/dist/tui/components/index.js +10 -0
  51. package/dist/tui/components/index.js.map +1 -0
  52. package/dist/tui/demo.d.ts +8 -0
  53. package/dist/tui/demo.d.ts.map +1 -0
  54. package/dist/tui/demo.js +69 -0
  55. package/dist/tui/demo.js.map +1 -0
  56. package/dist/tui/hooks/index.d.ts +7 -0
  57. package/dist/tui/hooks/index.d.ts.map +1 -0
  58. package/dist/tui/hooks/index.js +6 -0
  59. package/dist/tui/hooks/index.js.map +1 -0
  60. package/dist/tui/hooks/useSpecGenerator.d.ts +184 -0
  61. package/dist/tui/hooks/useSpecGenerator.d.ts.map +1 -0
  62. package/dist/tui/hooks/useSpecGenerator.js +452 -0
  63. package/dist/tui/hooks/useSpecGenerator.js.map +1 -0
  64. package/dist/tui/index.d.ts +14 -0
  65. package/dist/tui/index.d.ts.map +1 -0
  66. package/dist/tui/index.js +18 -0
  67. package/dist/tui/index.js.map +1 -0
  68. package/dist/tui/orchestration/index.d.ts +6 -0
  69. package/dist/tui/orchestration/index.d.ts.map +1 -0
  70. package/dist/tui/orchestration/index.js +6 -0
  71. package/dist/tui/orchestration/index.js.map +1 -0
  72. package/dist/tui/orchestration/interview-orchestrator.d.ts +136 -0
  73. package/dist/tui/orchestration/interview-orchestrator.d.ts.map +1 -0
  74. package/dist/tui/orchestration/interview-orchestrator.js +437 -0
  75. package/dist/tui/orchestration/interview-orchestrator.js.map +1 -0
  76. package/dist/tui/screens/InitScreen.d.ts +26 -0
  77. package/dist/tui/screens/InitScreen.d.ts.map +1 -0
  78. package/dist/tui/screens/InitScreen.js +30 -0
  79. package/dist/tui/screens/InitScreen.js.map +1 -0
  80. package/dist/tui/screens/InterviewScreen.d.ts +44 -0
  81. package/dist/tui/screens/InterviewScreen.d.ts.map +1 -0
  82. package/dist/tui/screens/InterviewScreen.js +212 -0
  83. package/dist/tui/screens/InterviewScreen.js.map +1 -0
  84. package/dist/tui/screens/MainShell.d.ts +46 -0
  85. package/dist/tui/screens/MainShell.d.ts.map +1 -0
  86. package/dist/tui/screens/MainShell.js +196 -0
  87. package/dist/tui/screens/MainShell.js.map +1 -0
  88. package/dist/tui/screens/WelcomeScreen.d.ts +45 -0
  89. package/dist/tui/screens/WelcomeScreen.d.ts.map +1 -0
  90. package/dist/tui/screens/WelcomeScreen.js +56 -0
  91. package/dist/tui/screens/WelcomeScreen.js.map +1 -0
  92. package/dist/tui/screens/index.d.ts +6 -0
  93. package/dist/tui/screens/index.d.ts.map +1 -0
  94. package/dist/tui/screens/index.js +5 -0
  95. package/dist/tui/screens/index.js.map +1 -0
  96. package/dist/tui/theme.d.ts +66 -0
  97. package/dist/tui/theme.d.ts.map +1 -0
  98. package/dist/tui/theme.js +62 -0
  99. package/dist/tui/theme.js.map +1 -0
  100. package/package.json +6 -1
  101. package/src/ai/conversation/conversation-manager.ts +22 -0
  102. package/src/cli.ts +4 -0
  103. package/src/commands/new.ts +79 -27
  104. package/src/index.ts +109 -27
  105. package/src/tui/app.tsx +297 -0
  106. package/src/tui/components/ChatInput.tsx +105 -0
  107. package/src/tui/components/MessageList.tsx +186 -0
  108. package/src/tui/components/PhaseHeader.tsx +63 -0
  109. package/src/tui/components/StreamingText.tsx +69 -0
  110. package/src/tui/components/ToolCallCard.tsx +215 -0
  111. package/src/tui/components/WiggumBanner.tsx +66 -0
  112. package/src/tui/components/WorkingIndicator.tsx +72 -0
  113. package/src/tui/components/index.ts +21 -0
  114. package/src/tui/demo.tsx +111 -0
  115. package/src/tui/hooks/index.ts +13 -0
  116. package/src/tui/hooks/useSpecGenerator.ts +662 -0
  117. package/src/tui/index.ts +23 -0
  118. package/src/tui/orchestration/index.ts +10 -0
  119. package/src/tui/orchestration/interview-orchestrator.ts +559 -0
  120. package/src/tui/screens/InitScreen.tsx +63 -0
  121. package/src/tui/screens/InterviewScreen.tsx +319 -0
  122. package/src/tui/screens/MainShell.tsx +290 -0
  123. package/src/tui/screens/WelcomeScreen.tsx +141 -0
  124. package/src/tui/screens/index.ts +6 -0
  125. package/src/tui/theme.ts +76 -0
  126. package/tsconfig.json +2 -1
@@ -0,0 +1,184 @@
1
+ /**
2
+ * useSpecGenerator - Event-based SpecGenerator wrapper for React/Ink TUI
3
+ *
4
+ * Wraps the existing SpecGenerator to emit events and manage state:
5
+ * - phase_change -> update PhaseHeader
6
+ * - tool_start / tool_end -> show ToolCallCard
7
+ * - text_delta -> stream to StreamingText
8
+ * - question -> prompt user input
9
+ * - done -> complete flow
10
+ */
11
+ import type { Message, ToolCall } from '../components/MessageList.js';
12
+ /**
13
+ * Generator phases matching SpecGenerator
14
+ */
15
+ export type GeneratorPhase = 'context' | 'goals' | 'interview' | 'generation' | 'complete';
16
+ /**
17
+ * Phase configuration for display
18
+ */
19
+ export interface PhaseConfig {
20
+ /** Phase number (1-based) */
21
+ number: number;
22
+ /** Human-readable phase name */
23
+ name: string;
24
+ /** Description of what happens in this phase */
25
+ description: string;
26
+ }
27
+ /**
28
+ * Phase configurations for display
29
+ */
30
+ export declare const PHASE_CONFIGS: Record<GeneratorPhase, PhaseConfig>;
31
+ /**
32
+ * Total number of display phases (excludes 'complete' in progress bar)
33
+ */
34
+ export declare const TOTAL_DISPLAY_PHASES = 4;
35
+ /**
36
+ * State managed by the useSpecGenerator hook
37
+ */
38
+ export interface SpecGeneratorState {
39
+ /** Current phase of the generation process */
40
+ phase: GeneratorPhase;
41
+ /** Conversation history for MessageList */
42
+ messages: Message[];
43
+ /** Whether the AI is currently working (thinking/executing) */
44
+ isWorking: boolean;
45
+ /** Status message for working indicator ("Thinking...", "Reading files...", etc.) */
46
+ workingStatus: string;
47
+ /** Current AI question waiting for user answer */
48
+ currentQuestion: string;
49
+ /** Whether waiting for user input */
50
+ awaitingInput: boolean;
51
+ /** Final generated spec when done */
52
+ generatedSpec: string | null;
53
+ /** Error message if something went wrong */
54
+ error: string | null;
55
+ /** Number of interview questions completed */
56
+ questionCount: number;
57
+ /** References added during context phase */
58
+ references: Array<{
59
+ source: string;
60
+ content: string;
61
+ }>;
62
+ }
63
+ /**
64
+ * Options for initializing the spec generator
65
+ */
66
+ export interface SpecGeneratorOptions {
67
+ /** Name of the feature being specified */
68
+ featureName: string;
69
+ /** Project root directory path */
70
+ projectRoot: string;
71
+ /** AI provider to use */
72
+ provider?: string;
73
+ /** Model ID to use */
74
+ model?: string;
75
+ }
76
+ /**
77
+ * Return value from useSpecGenerator hook
78
+ */
79
+ export interface UseSpecGeneratorReturn {
80
+ /** Current state */
81
+ state: SpecGeneratorState;
82
+ /**
83
+ * Submit user's answer to the current question
84
+ * Used during interview phase
85
+ */
86
+ submitAnswer: (answer: string) => Promise<void>;
87
+ /**
88
+ * Add a reference URL or file path during context phase
89
+ */
90
+ addReference: (refUrl: string) => Promise<void>;
91
+ /**
92
+ * Skip context/interview and go directly to generation
93
+ */
94
+ skipToGeneration: () => Promise<void>;
95
+ /**
96
+ * Move to the next phase
97
+ */
98
+ advancePhase: () => void;
99
+ /**
100
+ * Reset to initial state
101
+ */
102
+ reset: () => void;
103
+ /**
104
+ * Initialize the generator with options
105
+ */
106
+ initialize: (options: SpecGeneratorOptions) => void;
107
+ /**
108
+ * Add a message to the conversation
109
+ */
110
+ addMessage: (role: 'user' | 'assistant' | 'system', content: string, toolCalls?: ToolCall[]) => void;
111
+ /**
112
+ * Update the streaming message content
113
+ */
114
+ updateStreamingMessage: (content: string) => void;
115
+ /**
116
+ * Mark the current streaming message as complete
117
+ */
118
+ completeStreamingMessage: () => void;
119
+ /**
120
+ * Clear working state and re-enable input
121
+ * Call this when AI response is complete and ready for next user input
122
+ */
123
+ setReady: () => void;
124
+ /**
125
+ * Start a tool execution (shows ToolCallCard)
126
+ */
127
+ startToolCall: (toolName: string, input: Record<string, unknown>) => string;
128
+ /**
129
+ * Complete a tool execution
130
+ */
131
+ completeToolCall: (toolId: string, output?: string, error?: string) => void;
132
+ /**
133
+ * Set the current phase (used by orchestrator)
134
+ */
135
+ setPhase: (phase: GeneratorPhase) => void;
136
+ /**
137
+ * Set the generated spec (used by orchestrator on completion)
138
+ */
139
+ setGeneratedSpec: (spec: string) => void;
140
+ /**
141
+ * Set an error state (used by orchestrator on error)
142
+ */
143
+ setError: (error: string) => void;
144
+ /**
145
+ * Set working state with status message (used by orchestrator)
146
+ */
147
+ setWorking: (isWorking: boolean, status: string) => void;
148
+ }
149
+ /**
150
+ * useSpecGenerator - React hook wrapping SpecGenerator for TUI use
151
+ *
152
+ * This hook manages the state and provides actions for running the
153
+ * spec generation flow in a React/Ink application.
154
+ *
155
+ * The hook does not directly instantiate SpecGenerator; instead, it
156
+ * provides the state management and action handlers that a screen
157
+ * component can use to orchestrate the flow.
158
+ *
159
+ * @example
160
+ * ```tsx
161
+ * function SpecGeneratorScreen({ featureName }: Props) {
162
+ * const { state, submitAnswer, addReference, initialize } = useSpecGenerator();
163
+ *
164
+ * useEffect(() => {
165
+ * initialize({ featureName, projectRoot: process.cwd() });
166
+ * }, []);
167
+ *
168
+ * return (
169
+ * <Box flexDirection="column">
170
+ * <PhaseHeader
171
+ * currentPhase={PHASE_CONFIGS[state.phase].number}
172
+ * totalPhases={TOTAL_DISPLAY_PHASES}
173
+ * phaseName={PHASE_CONFIGS[state.phase].name}
174
+ * />
175
+ * <MessageList messages={state.messages} />
176
+ * {state.isWorking && <WorkingIndicator state="thinking" status={state.workingStatus} />}
177
+ * {state.awaitingInput && <ChatInput onSubmit={submitAnswer} />}
178
+ * </Box>
179
+ * );
180
+ * }
181
+ * ```
182
+ */
183
+ export declare function useSpecGenerator(): UseSpecGeneratorReturn;
184
+ //# sourceMappingURL=useSpecGenerator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useSpecGenerator.d.ts","sourceRoot":"","sources":["../../../src/tui/hooks/useSpecGenerator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,452 @@
1
+ /**
2
+ * useSpecGenerator - Event-based SpecGenerator wrapper for React/Ink TUI
3
+ *
4
+ * Wraps the existing SpecGenerator to emit events and manage state:
5
+ * - phase_change -> update PhaseHeader
6
+ * - tool_start / tool_end -> show ToolCallCard
7
+ * - text_delta -> stream to StreamingText
8
+ * - question -> prompt user input
9
+ * - done -> complete flow
10
+ */
11
+ import { useState, useCallback, useRef } from 'react';
12
+ /**
13
+ * Phase configurations for display
14
+ */
15
+ export const PHASE_CONFIGS = {
16
+ context: {
17
+ number: 1,
18
+ name: 'Context',
19
+ description: 'Share reference URLs or files',
20
+ },
21
+ goals: {
22
+ number: 2,
23
+ name: 'Goals',
24
+ description: 'Describe what you want to build',
25
+ },
26
+ interview: {
27
+ number: 3,
28
+ name: 'Interview',
29
+ description: 'Answer clarifying questions',
30
+ },
31
+ generation: {
32
+ number: 4,
33
+ name: 'Generation',
34
+ description: 'Generate specification',
35
+ },
36
+ complete: {
37
+ number: 5,
38
+ name: 'Complete',
39
+ description: 'Spec generated',
40
+ },
41
+ };
42
+ /**
43
+ * Total number of display phases (excludes 'complete' in progress bar)
44
+ */
45
+ export const TOTAL_DISPLAY_PHASES = 4;
46
+ /**
47
+ * Generate a unique ID for messages and tool calls
48
+ */
49
+ function generateId() {
50
+ return `${Date.now()}-${Math.random().toString(36).substring(2, 9)}`;
51
+ }
52
+ /**
53
+ * Format tool input for display
54
+ */
55
+ function formatToolInput(toolName, args) {
56
+ switch (toolName) {
57
+ case 'read_file':
58
+ return String(args.path || '');
59
+ case 'search_codebase':
60
+ return `"${args.pattern || ''}"${args.directory ? ` in ${args.directory}/` : ''}`;
61
+ case 'list_directory':
62
+ return String(args.path || '.');
63
+ case 'tavily_search':
64
+ return `"${args.query || ''}"`;
65
+ case 'resolveLibraryId':
66
+ return String(args.libraryName || '');
67
+ case 'queryDocs':
68
+ return `${args.libraryId} - "${String(args.query || '').slice(0, 40)}..."`;
69
+ default:
70
+ return JSON.stringify(args).slice(0, 50);
71
+ }
72
+ }
73
+ /**
74
+ * Initial state for the generator
75
+ */
76
+ const initialState = {
77
+ phase: 'context',
78
+ messages: [],
79
+ isWorking: false,
80
+ workingStatus: '',
81
+ currentQuestion: '',
82
+ awaitingInput: false,
83
+ generatedSpec: null,
84
+ error: null,
85
+ questionCount: 0,
86
+ references: [],
87
+ };
88
+ /**
89
+ * useSpecGenerator - React hook wrapping SpecGenerator for TUI use
90
+ *
91
+ * This hook manages the state and provides actions for running the
92
+ * spec generation flow in a React/Ink application.
93
+ *
94
+ * The hook does not directly instantiate SpecGenerator; instead, it
95
+ * provides the state management and action handlers that a screen
96
+ * component can use to orchestrate the flow.
97
+ *
98
+ * @example
99
+ * ```tsx
100
+ * function SpecGeneratorScreen({ featureName }: Props) {
101
+ * const { state, submitAnswer, addReference, initialize } = useSpecGenerator();
102
+ *
103
+ * useEffect(() => {
104
+ * initialize({ featureName, projectRoot: process.cwd() });
105
+ * }, []);
106
+ *
107
+ * return (
108
+ * <Box flexDirection="column">
109
+ * <PhaseHeader
110
+ * currentPhase={PHASE_CONFIGS[state.phase].number}
111
+ * totalPhases={TOTAL_DISPLAY_PHASES}
112
+ * phaseName={PHASE_CONFIGS[state.phase].name}
113
+ * />
114
+ * <MessageList messages={state.messages} />
115
+ * {state.isWorking && <WorkingIndicator state="thinking" status={state.workingStatus} />}
116
+ * {state.awaitingInput && <ChatInput onSubmit={submitAnswer} />}
117
+ * </Box>
118
+ * );
119
+ * }
120
+ * ```
121
+ */
122
+ export function useSpecGenerator() {
123
+ const [state, setState] = useState(initialState);
124
+ // Track options for potential re-initialization
125
+ const optionsRef = useRef(null);
126
+ // Track current streaming message ID for updates
127
+ const streamingMessageIdRef = useRef(null);
128
+ // Track active tool calls by ID
129
+ const activeToolCallsRef = useRef(new Map());
130
+ /**
131
+ * Initialize with options
132
+ */
133
+ const initialize = useCallback((options) => {
134
+ optionsRef.current = options;
135
+ // Add initial system message
136
+ const systemMessage = {
137
+ id: generateId(),
138
+ role: 'system',
139
+ content: `Spec Generator initialized for feature: ${options.featureName}`,
140
+ };
141
+ setState({
142
+ ...initialState,
143
+ messages: [systemMessage],
144
+ // Enable input immediately so users can enter context/goals
145
+ awaitingInput: true,
146
+ });
147
+ }, []);
148
+ /**
149
+ * Add a message to the conversation
150
+ */
151
+ const addMessage = useCallback((role, content, toolCalls) => {
152
+ const message = {
153
+ id: generateId(),
154
+ role,
155
+ content,
156
+ toolCalls,
157
+ };
158
+ setState((prev) => ({
159
+ ...prev,
160
+ messages: [...prev.messages, message],
161
+ // Clear awaiting input when assistant responds
162
+ awaitingInput: role === 'assistant' ? false : prev.awaitingInput,
163
+ }));
164
+ }, []);
165
+ /**
166
+ * Add a streaming message (assistant) that will be updated
167
+ */
168
+ const addStreamingMessage = useCallback((initialContent = '', toolCalls) => {
169
+ const messageId = generateId();
170
+ streamingMessageIdRef.current = messageId;
171
+ const message = {
172
+ id: messageId,
173
+ role: 'assistant',
174
+ content: initialContent,
175
+ toolCalls,
176
+ isStreaming: true,
177
+ };
178
+ setState((prev) => ({
179
+ ...prev,
180
+ messages: [...prev.messages, message],
181
+ }));
182
+ return messageId;
183
+ }, []);
184
+ /**
185
+ * Update the streaming message content
186
+ */
187
+ const updateStreamingMessage = useCallback((content) => {
188
+ const messageId = streamingMessageIdRef.current;
189
+ if (!messageId)
190
+ return;
191
+ setState((prev) => ({
192
+ ...prev,
193
+ messages: prev.messages.map((msg) => msg.id === messageId ? { ...msg, content } : msg),
194
+ }));
195
+ }, []);
196
+ /**
197
+ * Mark the current streaming message as complete
198
+ */
199
+ const completeStreamingMessage = useCallback(() => {
200
+ const messageId = streamingMessageIdRef.current;
201
+ if (!messageId)
202
+ return;
203
+ setState((prev) => ({
204
+ ...prev,
205
+ messages: prev.messages.map((msg) => msg.id === messageId ? { ...msg, isStreaming: false } : msg),
206
+ }));
207
+ streamingMessageIdRef.current = null;
208
+ }, []);
209
+ /**
210
+ * Clear working state and re-enable input
211
+ * Call this when AI response is complete and ready for next user input
212
+ */
213
+ const setReady = useCallback(() => {
214
+ setState((prev) => ({
215
+ ...prev,
216
+ isWorking: false,
217
+ workingStatus: '',
218
+ awaitingInput: true,
219
+ }));
220
+ }, []);
221
+ /**
222
+ * Start a tool execution
223
+ */
224
+ const startToolCall = useCallback((toolName, input) => {
225
+ const toolId = generateId();
226
+ const formattedInput = formatToolInput(toolName, input);
227
+ const toolCall = {
228
+ toolName,
229
+ status: 'running',
230
+ input: formattedInput,
231
+ };
232
+ // If there's a streaming message, add tool call to it
233
+ // Otherwise, create a new assistant message with the tool call
234
+ setState((prev) => {
235
+ const streamingId = streamingMessageIdRef.current;
236
+ if (streamingId) {
237
+ // Add to existing streaming message
238
+ const updatedMessages = prev.messages.map((msg) => {
239
+ if (msg.id === streamingId) {
240
+ const existingToolCalls = msg.toolCalls || [];
241
+ activeToolCallsRef.current.set(toolId, {
242
+ messageId: streamingId,
243
+ index: existingToolCalls.length,
244
+ });
245
+ return {
246
+ ...msg,
247
+ toolCalls: [...existingToolCalls, toolCall],
248
+ };
249
+ }
250
+ return msg;
251
+ });
252
+ return { ...prev, messages: updatedMessages };
253
+ }
254
+ else {
255
+ // Create new message with tool call
256
+ const messageId = generateId();
257
+ streamingMessageIdRef.current = messageId;
258
+ activeToolCallsRef.current.set(toolId, {
259
+ messageId,
260
+ index: 0,
261
+ });
262
+ const newMessage = {
263
+ id: messageId,
264
+ role: 'assistant',
265
+ content: '',
266
+ toolCalls: [toolCall],
267
+ isStreaming: true,
268
+ };
269
+ return {
270
+ ...prev,
271
+ messages: [...prev.messages, newMessage],
272
+ isWorking: true,
273
+ workingStatus: `Using ${toolName}...`,
274
+ };
275
+ }
276
+ });
277
+ return toolId;
278
+ }, []);
279
+ /**
280
+ * Complete a tool execution
281
+ */
282
+ const completeToolCall = useCallback((toolId, output, error) => {
283
+ const toolInfo = activeToolCallsRef.current.get(toolId);
284
+ if (!toolInfo)
285
+ return;
286
+ const newStatus = error ? 'error' : 'complete';
287
+ setState((prev) => ({
288
+ ...prev,
289
+ messages: prev.messages.map((msg) => {
290
+ if (msg.id === toolInfo.messageId && msg.toolCalls) {
291
+ const updatedToolCalls = [...msg.toolCalls];
292
+ if (updatedToolCalls[toolInfo.index]) {
293
+ updatedToolCalls[toolInfo.index] = {
294
+ ...updatedToolCalls[toolInfo.index],
295
+ status: newStatus,
296
+ output,
297
+ error,
298
+ };
299
+ }
300
+ return { ...msg, toolCalls: updatedToolCalls };
301
+ }
302
+ return msg;
303
+ }),
304
+ }));
305
+ activeToolCallsRef.current.delete(toolId);
306
+ }, []);
307
+ /**
308
+ * Advance to the next phase
309
+ */
310
+ const advancePhase = useCallback(() => {
311
+ setState((prev) => {
312
+ const phaseOrder = ['context', 'goals', 'interview', 'generation', 'complete'];
313
+ const currentIndex = phaseOrder.indexOf(prev.phase);
314
+ const nextPhase = phaseOrder[currentIndex + 1] || 'complete';
315
+ // Add system message for phase change
316
+ const phaseConfig = PHASE_CONFIGS[nextPhase];
317
+ const systemMessage = {
318
+ id: generateId(),
319
+ role: 'system',
320
+ content: `Phase ${phaseConfig.number}: ${phaseConfig.name} - ${phaseConfig.description}`,
321
+ };
322
+ return {
323
+ ...prev,
324
+ phase: nextPhase,
325
+ messages: [...prev.messages, systemMessage],
326
+ awaitingInput: nextPhase === 'context' || nextPhase === 'goals' || nextPhase === 'interview',
327
+ };
328
+ });
329
+ }, []);
330
+ /**
331
+ * Submit user's answer
332
+ */
333
+ const submitAnswer = useCallback(async (answer) => {
334
+ // Add user message
335
+ addMessage('user', answer);
336
+ // Update state
337
+ setState((prev) => ({
338
+ ...prev,
339
+ awaitingInput: false,
340
+ isWorking: true,
341
+ workingStatus: 'Thinking...',
342
+ questionCount: prev.phase === 'interview' ? prev.questionCount + 1 : prev.questionCount,
343
+ }));
344
+ // The actual AI processing would be handled by the screen component
345
+ // that orchestrates the SpecGenerator or conversation manager
346
+ }, [addMessage]);
347
+ /**
348
+ * Add a reference during context phase
349
+ */
350
+ const addReference = useCallback(async (refUrl) => {
351
+ // Add user message showing the reference
352
+ addMessage('user', refUrl);
353
+ setState((prev) => ({
354
+ ...prev,
355
+ isWorking: true,
356
+ workingStatus: 'Fetching reference...',
357
+ }));
358
+ // The actual fetching would be handled by the screen component
359
+ }, [addMessage]);
360
+ /**
361
+ * Skip to generation phase
362
+ */
363
+ const skipToGeneration = useCallback(async () => {
364
+ setState((prev) => {
365
+ const systemMessage = {
366
+ id: generateId(),
367
+ role: 'system',
368
+ content: 'Skipping to specification generation...',
369
+ };
370
+ return {
371
+ ...prev,
372
+ phase: 'generation',
373
+ messages: [...prev.messages, systemMessage],
374
+ awaitingInput: false,
375
+ isWorking: true,
376
+ workingStatus: 'Generating specification...',
377
+ };
378
+ });
379
+ }, []);
380
+ /**
381
+ * Reset to initial state
382
+ */
383
+ const reset = useCallback(() => {
384
+ streamingMessageIdRef.current = null;
385
+ activeToolCallsRef.current.clear();
386
+ optionsRef.current = null;
387
+ setState(initialState);
388
+ }, []);
389
+ /**
390
+ * Set the current phase (used by orchestrator)
391
+ */
392
+ const setPhase = useCallback((phase) => {
393
+ setState((prev) => ({
394
+ ...prev,
395
+ phase,
396
+ }));
397
+ }, []);
398
+ /**
399
+ * Set the generated spec (used by orchestrator on completion)
400
+ */
401
+ const setGeneratedSpec = useCallback((spec) => {
402
+ setState((prev) => ({
403
+ ...prev,
404
+ generatedSpec: spec,
405
+ phase: 'complete',
406
+ isWorking: false,
407
+ awaitingInput: false,
408
+ }));
409
+ }, []);
410
+ /**
411
+ * Set an error state (used by orchestrator on error)
412
+ */
413
+ const setError = useCallback((error) => {
414
+ setState((prev) => ({
415
+ ...prev,
416
+ error,
417
+ isWorking: false,
418
+ }));
419
+ }, []);
420
+ /**
421
+ * Set working state with status message (used by orchestrator)
422
+ */
423
+ const setWorking = useCallback((isWorking, status) => {
424
+ setState((prev) => ({
425
+ ...prev,
426
+ isWorking,
427
+ workingStatus: status,
428
+ awaitingInput: !isWorking && prev.phase !== 'complete',
429
+ }));
430
+ }, []);
431
+ return {
432
+ state,
433
+ submitAnswer,
434
+ addReference,
435
+ skipToGeneration,
436
+ advancePhase,
437
+ reset,
438
+ initialize,
439
+ addMessage,
440
+ updateStreamingMessage,
441
+ completeStreamingMessage,
442
+ setReady,
443
+ startToolCall,
444
+ completeToolCall,
445
+ // Orchestrator-specific actions
446
+ setPhase,
447
+ setGeneratedSpec,
448
+ setError,
449
+ setWorking,
450
+ };
451
+ }
452
+ //# sourceMappingURL=useSpecGenerator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useSpecGenerator.js","sourceRoot":"","sources":["../../../src/tui/hooks/useSpecGenerator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Ink-based Terminal UI for Wiggum CLI
3
+ *
4
+ * This module provides React-based terminal UI components using Ink.
5
+ * It exports the main App component, all screens, reusable components,
6
+ * hooks, and theme utilities.
7
+ */
8
+ export { App, renderApp } from './app.js';
9
+ export type { AppProps, AppScreen, InterviewAppProps } from './app.js';
10
+ export * from './theme.js';
11
+ export * from './components/index.js';
12
+ export * from './hooks/index.js';
13
+ export * from './screens/index.js';
14
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tui/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAC1C,YAAY,EAAE,QAAQ,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAGvE,cAAc,YAAY,CAAC;AAG3B,cAAc,uBAAuB,CAAC;AAGtC,cAAc,kBAAkB,CAAC;AAGjC,cAAc,oBAAoB,CAAC"}