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 @@
1
+ {"version":3,"file":"InitScreen.d.ts","sourceRoot":"","sources":["../../../src/tui/screens/InitScreen.tsx"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAoB,MAAM,OAAO,CAAC;AAIzC;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,6DAA6D;IAC7D,SAAS,EAAE,MAAM,IAAI,CAAC;IACtB,+BAA+B;IAC/B,QAAQ,EAAE,MAAM,IAAI,CAAC;CACtB;AAED;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,EACzB,SAAS,EACT,QAAQ,EAAE,SAAS,GACpB,EAAE,eAAe,GAAG,KAAK,CAAC,YAAY,CA8BtC"}
@@ -0,0 +1,30 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ /**
3
+ * InitScreen - Screen for the /init command workflow
4
+ *
5
+ * Handles project initialization within the TUI context.
6
+ * Since the init workflow uses readline-based prompts, this screen
7
+ * signals that init should run outside of Ink.
8
+ */
9
+ import { useEffect } from 'react';
10
+ import { Box, Text } from 'ink';
11
+ import { colors } from '../theme.js';
12
+ /**
13
+ * InitScreen component
14
+ *
15
+ * Displays a message and triggers the init workflow.
16
+ * The actual init workflow runs outside of Ink because it uses
17
+ * readline-based interactive prompts.
18
+ */
19
+ export function InitScreen({ onRunInit, onCancel: _onCancel, }) {
20
+ // Trigger init workflow on mount
21
+ useEffect(() => {
22
+ // Small delay to allow the screen to render before unmounting
23
+ const timer = setTimeout(() => {
24
+ onRunInit();
25
+ }, 100);
26
+ return () => clearTimeout(timer);
27
+ }, [onRunInit]);
28
+ return (_jsxs(Box, { flexDirection: "column", padding: 1, children: [_jsx(Box, { marginBottom: 1, children: _jsx(Text, { color: colors.yellow, bold: true, children: "Initializing Project" }) }), _jsx(Box, { marginBottom: 1, children: _jsx(Text, { children: "Starting initialization workflow..." }) }), _jsx(Box, { children: _jsx(Text, { dimColor: true, children: "Press Ctrl+C to cancel" }) })] }));
29
+ }
30
+ //# sourceMappingURL=InitScreen.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InitScreen.js","sourceRoot":"","sources":["../../../src/tui/screens/InitScreen.tsx"],"names":[],"mappings":";AAAA;;;;;;GAMG;AAEH,OAAc,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACzC,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAChC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAYrC;;;;;;GAMG;AACH,MAAM,UAAU,UAAU,CAAC,EACzB,SAAS,EACT,QAAQ,EAAE,SAAS,GACH;IAChB,iCAAiC;IACjC,SAAS,CAAC,GAAG,EAAE;QACb,8DAA8D;QAC9D,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;YAC5B,SAAS,EAAE,CAAC;QACd,CAAC,EAAE,GAAG,CAAC,CAAC;QAER,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;IACnC,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC;IAEhB,OAAO,CACL,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,OAAO,EAAE,CAAC,aACpC,KAAC,GAAG,IAAC,YAAY,EAAE,CAAC,YAClB,KAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,2CAEzB,GACH,EAEN,KAAC,GAAG,IAAC,YAAY,EAAE,CAAC,YAClB,KAAC,IAAI,sDAA2C,GAC5C,EAEN,KAAC,GAAG,cACF,KAAC,IAAI,IAAC,QAAQ,6CAEP,GACH,IACF,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,44 @@
1
+ /**
2
+ * InterviewScreen - Main screen for the /new command interview flow
3
+ *
4
+ * The complete TUI for the spec generation interview process.
5
+ * Orchestrates user input and AI responses through multiple phases:
6
+ * 1. Context - Gather reference URLs/files
7
+ * 2. Goals - Understand what to build
8
+ * 3. Interview - Clarifying questions
9
+ * 4. Generation - Generate the specification
10
+ */
11
+ import React from 'react';
12
+ import type { AIProvider } from '../../ai/providers.js';
13
+ import type { ScanResult } from '../../scanner/types.js';
14
+ /**
15
+ * Props for the InterviewScreen component
16
+ */
17
+ export interface InterviewScreenProps {
18
+ /** Name of the feature being specified */
19
+ featureName: string;
20
+ /** Project root directory path */
21
+ projectRoot: string;
22
+ /** AI provider to use */
23
+ provider: AIProvider;
24
+ /** Model ID to use */
25
+ model: string;
26
+ /** Optional scan result with detected tech stack */
27
+ scanResult?: ScanResult;
28
+ /** Called when spec generation is complete */
29
+ onComplete: (spec: string) => void;
30
+ /** Called when user cancels the interview */
31
+ onCancel: () => void;
32
+ }
33
+ /**
34
+ * InterviewScreen component
35
+ *
36
+ * The main screen for the /new command interview flow. Combines all TUI
37
+ * components (PhaseHeader, MessageList, WorkingIndicator, ChatInput) to
38
+ * create the complete interview experience.
39
+ *
40
+ * Uses the useSpecGenerator hook for state and InterviewOrchestrator
41
+ * to bridge to the AI conversation.
42
+ */
43
+ export declare function InterviewScreen({ featureName, projectRoot, provider, model, scanResult, onComplete, onCancel, }: InterviewScreenProps): React.ReactElement;
44
+ //# sourceMappingURL=InterviewScreen.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InterviewScreen.d.ts","sourceRoot":"","sources":["../../../src/tui/screens/InterviewScreen.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAyC,MAAM,OAAO,CAAC;AAE9D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAczD;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,0CAA0C;IAC1C,WAAW,EAAE,MAAM,CAAC;IACpB,kCAAkC;IAClC,WAAW,EAAE,MAAM,CAAC;IACpB,yBAAyB;IACzB,QAAQ,EAAE,UAAU,CAAC;IACrB,sBAAsB;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,oDAAoD;IACpD,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,8CAA8C;IAC9C,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,6CAA6C;IAC7C,QAAQ,EAAE,MAAM,IAAI,CAAC;CACtB;AAED;;;;;;;;;GASG;AACH,wBAAgB,eAAe,CAAC,EAC9B,WAAW,EACX,WAAW,EACX,QAAQ,EACR,KAAK,EACL,UAAU,EACV,UAAU,EACV,QAAQ,GACT,EAAE,oBAAoB,GAAG,KAAK,CAAC,YAAY,CA4P3C"}
@@ -0,0 +1,212 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ /**
3
+ * InterviewScreen - Main screen for the /new command interview flow
4
+ *
5
+ * The complete TUI for the spec generation interview process.
6
+ * Orchestrates user input and AI responses through multiple phases:
7
+ * 1. Context - Gather reference URLs/files
8
+ * 2. Goals - Understand what to build
9
+ * 3. Interview - Clarifying questions
10
+ * 4. Generation - Generate the specification
11
+ */
12
+ import { useEffect, useCallback, useRef } from 'react';
13
+ import { Box, Text, useInput } from 'ink';
14
+ import { PhaseHeader } from '../components/PhaseHeader.js';
15
+ import { MessageList } from '../components/MessageList.js';
16
+ import { WorkingIndicator } from '../components/WorkingIndicator.js';
17
+ import { ChatInput } from '../components/ChatInput.js';
18
+ import { useSpecGenerator, PHASE_CONFIGS, TOTAL_DISPLAY_PHASES, } from '../hooks/useSpecGenerator.js';
19
+ import { InterviewOrchestrator } from '../orchestration/interview-orchestrator.js';
20
+ import { colors } from '../theme.js';
21
+ /**
22
+ * InterviewScreen component
23
+ *
24
+ * The main screen for the /new command interview flow. Combines all TUI
25
+ * components (PhaseHeader, MessageList, WorkingIndicator, ChatInput) to
26
+ * create the complete interview experience.
27
+ *
28
+ * Uses the useSpecGenerator hook for state and InterviewOrchestrator
29
+ * to bridge to the AI conversation.
30
+ */
31
+ export function InterviewScreen({ featureName, projectRoot, provider, model, scanResult, onComplete, onCancel, }) {
32
+ const { state, initialize, addMessage, updateStreamingMessage, completeStreamingMessage, startToolCall, completeToolCall, setPhase, setGeneratedSpec, setError, setWorking, setReady, } = useSpecGenerator();
33
+ // Track orchestrator instance
34
+ const orchestratorRef = useRef(null);
35
+ // Track if we're in streaming mode for the current message
36
+ const isStreamingRef = useRef(false);
37
+ const streamContentRef = useRef('');
38
+ // Track if component is unmounted to prevent callbacks after cleanup
39
+ const isCancelledRef = useRef(false);
40
+ // Use refs for callbacks to avoid stale closures and unnecessary effect re-runs
41
+ const onCompleteRef = useRef(onComplete);
42
+ onCompleteRef.current = onComplete;
43
+ // Initialize the orchestrator when the component mounts
44
+ useEffect(() => {
45
+ // Reset cancelled flag on mount
46
+ isCancelledRef.current = false;
47
+ // Initialize hook state
48
+ initialize({
49
+ featureName,
50
+ projectRoot,
51
+ provider,
52
+ model,
53
+ });
54
+ // Create orchestrator with callbacks that check for cancellation
55
+ const orchestrator = new InterviewOrchestrator({
56
+ featureName,
57
+ projectRoot,
58
+ provider,
59
+ model,
60
+ scanResult,
61
+ onMessage: (role, content) => {
62
+ if (isCancelledRef.current)
63
+ return;
64
+ addMessage(role, content);
65
+ },
66
+ onStreamChunk: (chunk) => {
67
+ if (isCancelledRef.current)
68
+ return;
69
+ if (!isStreamingRef.current) {
70
+ // Start a new streaming message
71
+ isStreamingRef.current = true;
72
+ streamContentRef.current = chunk;
73
+ addMessage('assistant', chunk);
74
+ }
75
+ else {
76
+ // Append to existing streaming content
77
+ streamContentRef.current += chunk;
78
+ updateStreamingMessage(streamContentRef.current);
79
+ }
80
+ },
81
+ onStreamComplete: () => {
82
+ if (isCancelledRef.current)
83
+ return;
84
+ if (isStreamingRef.current) {
85
+ completeStreamingMessage();
86
+ isStreamingRef.current = false;
87
+ streamContentRef.current = '';
88
+ }
89
+ },
90
+ onToolStart: (toolName, input) => {
91
+ if (isCancelledRef.current)
92
+ return '';
93
+ return startToolCall(toolName, input);
94
+ },
95
+ onToolEnd: (toolId, output, error) => {
96
+ if (isCancelledRef.current)
97
+ return;
98
+ completeToolCall(toolId, output, error);
99
+ },
100
+ onPhaseChange: (phase) => {
101
+ if (isCancelledRef.current)
102
+ return;
103
+ setPhase(phase);
104
+ },
105
+ onComplete: (spec) => {
106
+ if (isCancelledRef.current)
107
+ return;
108
+ setGeneratedSpec(spec);
109
+ // Use ref to avoid stale closure
110
+ onCompleteRef.current(spec);
111
+ },
112
+ onError: (error) => {
113
+ if (isCancelledRef.current)
114
+ return;
115
+ setError(error);
116
+ },
117
+ onWorkingChange: (isWorking, status) => {
118
+ if (isCancelledRef.current)
119
+ return;
120
+ setWorking(isWorking, status);
121
+ },
122
+ onReady: () => {
123
+ if (isCancelledRef.current)
124
+ return;
125
+ setReady();
126
+ },
127
+ });
128
+ orchestratorRef.current = orchestrator;
129
+ // Start the orchestrator
130
+ orchestrator.start();
131
+ // Cleanup: mark as cancelled to prevent callbacks after unmount
132
+ return () => {
133
+ isCancelledRef.current = true;
134
+ orchestratorRef.current = null;
135
+ };
136
+ }, [featureName, projectRoot, provider, model, scanResult]);
137
+ // Handle user input submission based on current phase
138
+ const handleSubmit = useCallback(async (value) => {
139
+ const orchestrator = orchestratorRef.current;
140
+ if (!orchestrator)
141
+ return;
142
+ // Add user message to display
143
+ if (value) {
144
+ addMessage('user', value);
145
+ }
146
+ const currentPhase = orchestrator.getPhase();
147
+ switch (currentPhase) {
148
+ case 'context':
149
+ if (value) {
150
+ // User entered a reference URL/path
151
+ await orchestrator.addReference(value);
152
+ }
153
+ else {
154
+ // Empty input = done with context, advance to goals
155
+ await orchestrator.advanceToGoals();
156
+ }
157
+ break;
158
+ case 'goals':
159
+ // User entered their goals
160
+ await orchestrator.submitGoals(value);
161
+ break;
162
+ case 'interview':
163
+ if (value.toLowerCase() === 'done' || value.toLowerCase() === 'skip') {
164
+ // Skip to generation
165
+ await orchestrator.skipToGeneration();
166
+ }
167
+ else {
168
+ // Submit answer
169
+ await orchestrator.submitAnswer(value);
170
+ }
171
+ break;
172
+ default:
173
+ // In generation or complete phase, ignore input
174
+ break;
175
+ }
176
+ }, [addMessage]);
177
+ // Handle keyboard input for Escape key
178
+ useInput((input, key) => {
179
+ if (key.escape) {
180
+ onCancel();
181
+ }
182
+ });
183
+ // Get current phase configuration
184
+ const phaseConfig = PHASE_CONFIGS[state.phase];
185
+ // Determine if input should be disabled
186
+ const inputDisabled = !state.awaitingInput || state.isWorking || state.phase === 'complete';
187
+ // Build the working indicator state
188
+ const workingState = {
189
+ isWorking: state.isWorking,
190
+ status: state.workingStatus,
191
+ hint: 'esc to cancel',
192
+ };
193
+ // Get placeholder text based on phase
194
+ const getPlaceholder = () => {
195
+ switch (state.phase) {
196
+ case 'context':
197
+ return 'Enter URL or file path, or press Enter to continue...';
198
+ case 'goals':
199
+ return 'Describe what you want to build...';
200
+ case 'interview':
201
+ return 'Type your response (or "done" to generate spec)...';
202
+ case 'generation':
203
+ return 'Generating specification...';
204
+ case 'complete':
205
+ return 'Specification complete!';
206
+ default:
207
+ return 'Type your response...';
208
+ }
209
+ };
210
+ return (_jsxs(Box, { flexDirection: "column", padding: 1, children: [_jsx(PhaseHeader, { currentPhase: phaseConfig.number, totalPhases: TOTAL_DISPLAY_PHASES, phaseName: phaseConfig.name }), state.error && (_jsx(Box, { marginY: 1, children: _jsxs(Text, { color: "red", children: ["Error: ", state.error] }) })), _jsx(Box, { marginY: 1, children: _jsx(MessageList, { messages: state.messages }) }), state.isWorking && (_jsx(Box, { marginY: 1, children: _jsx(WorkingIndicator, { state: workingState }) })), state.phase === 'complete' && (_jsx(Box, { marginY: 1, children: _jsx(Text, { color: colors.green, children: "Specification generated successfully!" }) })), state.phase !== 'complete' && (_jsx(Box, { marginTop: 1, children: _jsx(ChatInput, { onSubmit: handleSubmit, disabled: inputDisabled, allowEmpty: state.phase === 'context', placeholder: getPlaceholder() }) }))] }));
211
+ }
212
+ //# sourceMappingURL=InterviewScreen.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InterviewScreen.js","sourceRoot":"","sources":["../../../src/tui/screens/InterviewScreen.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,46 @@
1
+ /**
2
+ * MainShell - Ink-based REPL replacement
3
+ *
4
+ * The main interactive shell for Wiggum CLI, replacing the readline REPL.
5
+ * Handles slash commands and provides navigation to other screens.
6
+ */
7
+ import React from 'react';
8
+ import type { SessionState } from '../../repl/session-state.js';
9
+ /**
10
+ * Navigation targets for the shell
11
+ */
12
+ export type NavigationTarget = 'welcome' | 'shell' | 'interview' | 'init';
13
+ /**
14
+ * Navigation props passed to target screens
15
+ */
16
+ export interface NavigationProps {
17
+ featureName?: string;
18
+ [key: string]: unknown;
19
+ }
20
+ /**
21
+ * Props for MainShell component
22
+ */
23
+ export interface MainShellProps {
24
+ /** Current session state */
25
+ sessionState: SessionState;
26
+ /** Called when navigating to another screen */
27
+ onNavigate: (target: NavigationTarget, props?: NavigationProps) => void;
28
+ /** Called when session state changes */
29
+ onSessionStateChange?: (state: SessionState) => void;
30
+ }
31
+ /**
32
+ * MainShell component
33
+ *
34
+ * The main interactive shell that handles slash commands and navigation.
35
+ * Replaces the readline-based REPL with an Ink-powered TUI.
36
+ *
37
+ * @example
38
+ * ```tsx
39
+ * <MainShell
40
+ * sessionState={state}
41
+ * onNavigate={(target, props) => setScreen(target, props)}
42
+ * />
43
+ * ```
44
+ */
45
+ export declare function MainShell({ sessionState, onNavigate, }: MainShellProps): React.ReactElement;
46
+ //# sourceMappingURL=MainShell.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MainShell.d.ts","sourceRoot":"","sources":["../../../src/tui/screens/MainShell.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAgC,MAAM,OAAO,CAAC;AAWrD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAEhE;;GAEG;AACH,MAAM,MAAM,gBAAgB,GAAG,SAAS,GAAG,OAAO,GAAG,WAAW,GAAG,MAAM,CAAC;AAE1E;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,4BAA4B;IAC5B,YAAY,EAAE,YAAY,CAAC;IAC3B,+CAA+C;IAC/C,UAAU,EAAE,CAAC,MAAM,EAAE,gBAAgB,EAAE,KAAK,CAAC,EAAE,eAAe,KAAK,IAAI,CAAC;IACxE,wCAAwC;IACxC,oBAAoB,CAAC,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,CAAC;CACtD;AASD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,SAAS,CAAC,EACxB,YAAY,EACZ,UAAU,GACX,EAAE,cAAc,GAAG,KAAK,CAAC,YAAY,CA4NrC"}
@@ -0,0 +1,196 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ /**
3
+ * MainShell - Ink-based REPL replacement
4
+ *
5
+ * The main interactive shell for Wiggum CLI, replacing the readline REPL.
6
+ * Handles slash commands and provides navigation to other screens.
7
+ */
8
+ import { useState, useCallback } from 'react';
9
+ import { Box, Text, useInput, useApp } from 'ink';
10
+ import { MessageList } from '../components/MessageList.js';
11
+ import { ChatInput } from '../components/ChatInput.js';
12
+ import { colors } from '../theme.js';
13
+ import { parseInput, resolveCommandAlias, formatHelpText, } from '../../repl/command-parser.js';
14
+ /**
15
+ * Generate a unique ID for messages
16
+ */
17
+ function generateId() {
18
+ return `${Date.now()}-${Math.random().toString(36).substring(2, 9)}`;
19
+ }
20
+ /**
21
+ * MainShell component
22
+ *
23
+ * The main interactive shell that handles slash commands and navigation.
24
+ * Replaces the readline-based REPL with an Ink-powered TUI.
25
+ *
26
+ * @example
27
+ * ```tsx
28
+ * <MainShell
29
+ * sessionState={state}
30
+ * onNavigate={(target, props) => setScreen(target, props)}
31
+ * />
32
+ * ```
33
+ */
34
+ export function MainShell({ sessionState, onNavigate, }) {
35
+ const { exit } = useApp();
36
+ const [messages, setMessages] = useState([]);
37
+ /**
38
+ * Add a system message to the conversation
39
+ */
40
+ const addSystemMessage = useCallback((content) => {
41
+ const message = {
42
+ id: generateId(),
43
+ role: 'system',
44
+ content,
45
+ };
46
+ setMessages((prev) => [...prev, message]);
47
+ }, []);
48
+ /**
49
+ * Handle /help command
50
+ */
51
+ const handleHelp = useCallback(() => {
52
+ addSystemMessage(formatHelpText());
53
+ }, [addSystemMessage]);
54
+ /**
55
+ * Handle /init command
56
+ */
57
+ const handleInit = useCallback(() => {
58
+ // Navigate to init screen
59
+ onNavigate('init');
60
+ }, [onNavigate]);
61
+ /**
62
+ * Handle /new command
63
+ */
64
+ const handleNew = useCallback((args) => {
65
+ if (args.length === 0) {
66
+ addSystemMessage('Feature name required. Usage: /new <feature-name>');
67
+ return;
68
+ }
69
+ if (!sessionState.initialized) {
70
+ addSystemMessage('Project not initialized. Run /init first.');
71
+ return;
72
+ }
73
+ const featureName = args[0];
74
+ onNavigate('interview', { featureName });
75
+ }, [sessionState.initialized, onNavigate, addSystemMessage]);
76
+ /**
77
+ * Handle /run command
78
+ */
79
+ const handleRun = useCallback((args) => {
80
+ if (args.length === 0) {
81
+ addSystemMessage('Feature name required. Usage: /run <feature-name>');
82
+ return;
83
+ }
84
+ if (!sessionState.initialized) {
85
+ addSystemMessage('Project not initialized. Run /init first.');
86
+ return;
87
+ }
88
+ // TODO: Implement run screen navigation
89
+ addSystemMessage(`Run command for "${args[0]}" - not yet implemented in TUI mode.`);
90
+ }, [sessionState.initialized, addSystemMessage]);
91
+ /**
92
+ * Handle /monitor command
93
+ */
94
+ const handleMonitor = useCallback((args) => {
95
+ if (args.length === 0) {
96
+ addSystemMessage('Feature name required. Usage: /monitor <feature-name>');
97
+ return;
98
+ }
99
+ // TODO: Implement monitor screen navigation
100
+ addSystemMessage(`Monitor command for "${args[0]}" - not yet implemented in TUI mode.`);
101
+ }, [addSystemMessage]);
102
+ /**
103
+ * Handle /config command
104
+ */
105
+ const handleConfig = useCallback((args) => {
106
+ // TODO: Implement config screen or inline config
107
+ if (args.length === 0) {
108
+ addSystemMessage('Config management - not yet implemented in TUI mode. Use CLI: wiggum config');
109
+ }
110
+ else {
111
+ addSystemMessage(`Config: ${args.join(' ')} - not yet implemented in TUI mode.`);
112
+ }
113
+ }, [addSystemMessage]);
114
+ /**
115
+ * Handle /exit command
116
+ */
117
+ const handleExit = useCallback(() => {
118
+ addSystemMessage('Goodbye!');
119
+ // Small delay to show message before exit
120
+ setTimeout(() => {
121
+ exit();
122
+ }, 100);
123
+ }, [addSystemMessage, exit]);
124
+ /**
125
+ * Execute a slash command
126
+ */
127
+ const executeCommand = useCallback((commandName, args) => {
128
+ switch (commandName) {
129
+ case 'help':
130
+ handleHelp();
131
+ break;
132
+ case 'init':
133
+ handleInit();
134
+ break;
135
+ case 'new':
136
+ handleNew(args);
137
+ break;
138
+ case 'run':
139
+ handleRun(args);
140
+ break;
141
+ case 'monitor':
142
+ handleMonitor(args);
143
+ break;
144
+ case 'config':
145
+ handleConfig(args);
146
+ break;
147
+ case 'exit':
148
+ handleExit();
149
+ break;
150
+ default:
151
+ addSystemMessage(`Unknown command: ${commandName}`);
152
+ }
153
+ }, [handleHelp, handleInit, handleNew, handleRun, handleMonitor, handleConfig, handleExit, addSystemMessage]);
154
+ /**
155
+ * Handle natural language input
156
+ */
157
+ const handleNaturalLanguage = useCallback((_text) => {
158
+ // For now, just show a tip (text parameter reserved for future AI chat)
159
+ addSystemMessage('Tip: Use /help to see available commands, or /new <feature> to create a spec.');
160
+ }, [addSystemMessage]);
161
+ /**
162
+ * Handle user input submission
163
+ */
164
+ const handleSubmit = useCallback((value) => {
165
+ const parsed = parseInput(value);
166
+ switch (parsed.type) {
167
+ case 'empty':
168
+ // Ignore empty input
169
+ break;
170
+ case 'slash-command': {
171
+ const { command } = parsed;
172
+ if (!command)
173
+ break;
174
+ const resolvedName = resolveCommandAlias(command.name);
175
+ if (!resolvedName) {
176
+ addSystemMessage(`Unknown command: /${command.name}. Type /help for available commands.`);
177
+ break;
178
+ }
179
+ executeCommand(resolvedName, command.args);
180
+ break;
181
+ }
182
+ case 'natural-language': {
183
+ handleNaturalLanguage(parsed.text);
184
+ break;
185
+ }
186
+ }
187
+ }, [executeCommand, handleNaturalLanguage, addSystemMessage]);
188
+ // Handle Ctrl+C
189
+ useInput((input, key) => {
190
+ if (key.ctrl && input === 'c') {
191
+ addSystemMessage('Use /exit to quit');
192
+ }
193
+ });
194
+ return (_jsxs(Box, { flexDirection: "column", padding: 1, children: [_jsxs(Box, { marginBottom: 1, children: [_jsx(Text, { color: colors.yellow, bold: true, children: "Wiggum Interactive Mode" }), _jsx(Text, { dimColor: true, children: " \u2502 " }), sessionState.initialized ? (_jsx(Text, { color: colors.green, children: "Ready" })) : (_jsx(Text, { color: colors.orange, children: "Not initialized - run /init" }))] }), _jsxs(Box, { marginBottom: 1, children: [_jsx(Text, { dimColor: true, children: sessionState.provider ? `${sessionState.provider}/${sessionState.model}` : 'No provider configured' }), _jsx(Text, { dimColor: true, children: " \u2502 Type /help for commands" })] }), messages.length > 0 && (_jsx(Box, { marginY: 1, flexDirection: "column", children: _jsx(MessageList, { messages: messages }) })), _jsx(Box, { marginTop: 1, children: _jsx(ChatInput, { onSubmit: handleSubmit, disabled: false, placeholder: "Enter command or type /help...", prompt: "wiggum> " }) })] }));
195
+ }
196
+ //# sourceMappingURL=MainShell.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MainShell.js","sourceRoot":"","sources":["../../../src/tui/screens/MainShell.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * WelcomeScreen - Dexter-inspired welcome screen
3
+ *
4
+ * Displays the Wiggum CLI banner, version, and current model info.
5
+ * Press Enter to continue to the main shell.
6
+ */
7
+ import React from 'react';
8
+ import type { AIProvider } from '../../ai/providers.js';
9
+ /**
10
+ * Props for WelcomeScreen component
11
+ */
12
+ export interface WelcomeScreenProps {
13
+ /** Current AI provider */
14
+ provider: AIProvider | null;
15
+ /** Current model ID */
16
+ model: string;
17
+ /** CLI version */
18
+ version: string;
19
+ /** Whether the project is initialized */
20
+ isInitialized: boolean;
21
+ /** Called when user presses Enter to continue */
22
+ onContinue: () => void;
23
+ }
24
+ /**
25
+ * WelcomeScreen component
26
+ *
27
+ * Displays a Dexter-inspired welcome screen with:
28
+ * - ASCII art banner
29
+ * - Version info
30
+ * - Current model configuration
31
+ * - Instructions to continue
32
+ *
33
+ * @example
34
+ * ```tsx
35
+ * <WelcomeScreen
36
+ * provider="anthropic"
37
+ * model="sonnet"
38
+ * version="0.8.0"
39
+ * isInitialized={true}
40
+ * onContinue={() => navigate('shell')}
41
+ * />
42
+ * ```
43
+ */
44
+ export declare function WelcomeScreen({ provider, model, version, isInitialized, onContinue, }: WelcomeScreenProps): React.ReactElement;
45
+ //# sourceMappingURL=WelcomeScreen.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WelcomeScreen.d.ts","sourceRoot":"","sources":["../../../src/tui/screens/WelcomeScreen.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAA8B,MAAM,OAAO,CAAC;AAInD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAExD;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,0BAA0B;IAC1B,QAAQ,EAAE,UAAU,GAAG,IAAI,CAAC;IAC5B,uBAAuB;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,kBAAkB;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,yCAAyC;IACzC,aAAa,EAAE,OAAO,CAAC;IACvB,iDAAiD;IACjD,UAAU,EAAE,MAAM,IAAI,CAAC;CACxB;AASD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,aAAa,CAAC,EAC5B,QAAQ,EACR,KAAK,EACL,OAAO,EACP,aAAa,EACb,UAAU,GACX,EAAE,kBAAkB,GAAG,KAAK,CAAC,YAAY,CA8EzC"}