wiggum-cli 0.8.0 → 0.9.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (80) 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 +46 -36
  17. package/dist/tui/app.d.ts.map +1 -1
  18. package/dist/tui/app.js +136 -37
  19. package/dist/tui/app.js.map +1 -1
  20. package/dist/tui/components/WiggumBanner.d.ts +30 -0
  21. package/dist/tui/components/WiggumBanner.d.ts.map +1 -0
  22. package/dist/tui/components/WiggumBanner.js +34 -0
  23. package/dist/tui/components/WiggumBanner.js.map +1 -0
  24. package/dist/tui/demo.d.ts +8 -0
  25. package/dist/tui/demo.d.ts.map +1 -0
  26. package/dist/tui/demo.js +69 -0
  27. package/dist/tui/demo.js.map +1 -0
  28. package/dist/tui/hooks/useSpecGenerator.d.ts +16 -0
  29. package/dist/tui/hooks/useSpecGenerator.d.ts.map +1 -1
  30. package/dist/tui/hooks/useSpecGenerator.js +47 -0
  31. package/dist/tui/hooks/useSpecGenerator.js.map +1 -1
  32. package/dist/tui/orchestration/index.d.ts +6 -0
  33. package/dist/tui/orchestration/index.d.ts.map +1 -0
  34. package/dist/tui/orchestration/index.js +6 -0
  35. package/dist/tui/orchestration/index.js.map +1 -0
  36. package/dist/tui/orchestration/interview-orchestrator.d.ts +136 -0
  37. package/dist/tui/orchestration/interview-orchestrator.d.ts.map +1 -0
  38. package/dist/tui/orchestration/interview-orchestrator.js +437 -0
  39. package/dist/tui/orchestration/interview-orchestrator.js.map +1 -0
  40. package/dist/tui/screens/InitScreen.d.ts +26 -0
  41. package/dist/tui/screens/InitScreen.d.ts.map +1 -0
  42. package/dist/tui/screens/InitScreen.js +30 -0
  43. package/dist/tui/screens/InitScreen.js.map +1 -0
  44. package/dist/tui/screens/InterviewScreen.d.ts +2 -13
  45. package/dist/tui/screens/InterviewScreen.d.ts.map +1 -1
  46. package/dist/tui/screens/InterviewScreen.js +162 -34
  47. package/dist/tui/screens/InterviewScreen.js.map +1 -1
  48. package/dist/tui/screens/MainShell.d.ts +46 -0
  49. package/dist/tui/screens/MainShell.d.ts.map +1 -0
  50. package/dist/tui/screens/MainShell.js +196 -0
  51. package/dist/tui/screens/MainShell.js.map +1 -0
  52. package/dist/tui/screens/WelcomeScreen.d.ts +45 -0
  53. package/dist/tui/screens/WelcomeScreen.d.ts.map +1 -0
  54. package/dist/tui/screens/WelcomeScreen.js +56 -0
  55. package/dist/tui/screens/WelcomeScreen.js.map +1 -0
  56. package/dist/tui/theme.d.ts +4 -0
  57. package/dist/tui/theme.d.ts.map +1 -1
  58. package/dist/tui/theme.js +4 -0
  59. package/dist/tui/theme.js.map +1 -1
  60. package/dist/utils/repl-prompts.d.ts +1 -1
  61. package/dist/utils/repl-prompts.d.ts.map +1 -1
  62. package/dist/utils/repl-prompts.js +77 -22
  63. package/dist/utils/repl-prompts.js.map +1 -1
  64. package/package.json +1 -1
  65. package/src/ai/conversation/conversation-manager.ts +22 -0
  66. package/src/cli.ts +4 -0
  67. package/src/commands/new.ts +79 -27
  68. package/src/index.ts +109 -27
  69. package/src/tui/app.tsx +222 -63
  70. package/src/tui/components/WiggumBanner.tsx +66 -0
  71. package/src/tui/demo.tsx +111 -0
  72. package/src/tui/hooks/useSpecGenerator.ts +73 -0
  73. package/src/tui/orchestration/index.ts +10 -0
  74. package/src/tui/orchestration/interview-orchestrator.ts +559 -0
  75. package/src/tui/screens/InitScreen.tsx +63 -0
  76. package/src/tui/screens/InterviewScreen.tsx +201 -46
  77. package/src/tui/screens/MainShell.tsx +290 -0
  78. package/src/tui/screens/WelcomeScreen.tsx +141 -0
  79. package/src/tui/theme.ts +4 -0
  80. package/src/utils/repl-prompts.ts +83 -25
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interview-orchestrator.js","sourceRoot":"","sources":["../../../src/tui/orchestration/interview-orchestrator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * InitScreen - Screen for the /init command workflow
3
+ *
4
+ * Handles project initialization within the TUI context.
5
+ * Since the init workflow uses readline-based prompts, this screen
6
+ * signals that init should run outside of Ink.
7
+ */
8
+ import React from 'react';
9
+ /**
10
+ * Props for the InitScreen component
11
+ */
12
+ export interface InitScreenProps {
13
+ /** Called to trigger the init workflow (runs outside Ink) */
14
+ onRunInit: () => void;
15
+ /** Called when user cancels */
16
+ onCancel: () => void;
17
+ }
18
+ /**
19
+ * InitScreen component
20
+ *
21
+ * Displays a message and triggers the init workflow.
22
+ * The actual init workflow runs outside of Ink because it uses
23
+ * readline-based interactive prompts.
24
+ */
25
+ export declare function InitScreen({ onRunInit, onCancel: _onCancel, }: InitScreenProps): React.ReactElement;
26
+ //# sourceMappingURL=InitScreen.d.ts.map
@@ -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"}
@@ -37,19 +37,8 @@ export interface InterviewScreenProps {
37
37
  * components (PhaseHeader, MessageList, WorkingIndicator, ChatInput) to
38
38
  * create the complete interview experience.
39
39
  *
40
- * Uses the useSpecGenerator hook to manage state and actions.
41
- *
42
- * @example
43
- * ```tsx
44
- * <InterviewScreen
45
- * featureName="user-auth"
46
- * projectRoot="/path/to/project"
47
- * provider="anthropic"
48
- * model="claude-sonnet-4-5-20250514"
49
- * onComplete={(spec) => writeSpec(spec)}
50
- * onCancel={() => process.exit(0)}
51
- * />
52
- * ```
40
+ * Uses the useSpecGenerator hook for state and InterviewOrchestrator
41
+ * to bridge to the AI conversation.
53
42
  */
54
43
  export declare function InterviewScreen({ featureName, projectRoot, provider, model, scanResult, onComplete, onCancel, }: InterviewScreenProps): React.ReactElement;
55
44
  //# sourceMappingURL=InterviewScreen.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"InterviewScreen.d.ts","sourceRoot":"","sources":["../../../src/tui/screens/InterviewScreen.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAiC,MAAM,OAAO,CAAC;AAEtD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAWzD;;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;;;;;;;;;;;;;;;;;;;;GAoBG;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,CAyF3C"}
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"}
@@ -9,13 +9,15 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
9
9
  * 3. Interview - Clarifying questions
10
10
  * 4. Generation - Generate the specification
11
11
  */
12
- import { useEffect, useCallback } from 'react';
13
- import { Box, useInput } from 'ink';
12
+ import { useEffect, useCallback, useRef } from 'react';
13
+ import { Box, Text, useInput } from 'ink';
14
14
  import { PhaseHeader } from '../components/PhaseHeader.js';
15
15
  import { MessageList } from '../components/MessageList.js';
16
16
  import { WorkingIndicator } from '../components/WorkingIndicator.js';
17
17
  import { ChatInput } from '../components/ChatInput.js';
18
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';
19
21
  /**
20
22
  * InterviewScreen component
21
23
  *
@@ -23,41 +25,155 @@ import { useSpecGenerator, PHASE_CONFIGS, TOTAL_DISPLAY_PHASES, } from '../hooks
23
25
  * components (PhaseHeader, MessageList, WorkingIndicator, ChatInput) to
24
26
  * create the complete interview experience.
25
27
  *
26
- * Uses the useSpecGenerator hook to manage state and actions.
27
- *
28
- * @example
29
- * ```tsx
30
- * <InterviewScreen
31
- * featureName="user-auth"
32
- * projectRoot="/path/to/project"
33
- * provider="anthropic"
34
- * model="claude-sonnet-4-5-20250514"
35
- * onComplete={(spec) => writeSpec(spec)}
36
- * onCancel={() => process.exit(0)}
37
- * />
38
- * ```
28
+ * Uses the useSpecGenerator hook for state and InterviewOrchestrator
29
+ * to bridge to the AI conversation.
39
30
  */
40
31
  export function InterviewScreen({ featureName, projectRoot, provider, model, scanResult, onComplete, onCancel, }) {
41
- const { state, submitAnswer, initialize, } = useSpecGenerator();
42
- // Initialize the generator when the component mounts
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
43
44
  useEffect(() => {
45
+ // Reset cancelled flag on mount
46
+ isCancelledRef.current = false;
47
+ // Initialize hook state
44
48
  initialize({
45
49
  featureName,
46
50
  projectRoot,
47
51
  provider,
48
52
  model,
49
53
  });
50
- }, [featureName, projectRoot, provider, model, initialize]);
51
- // Call onComplete when spec is generated
52
- useEffect(() => {
53
- if (state.generatedSpec) {
54
- onComplete(state.generatedSpec);
55
- }
56
- }, [state.generatedSpec, onComplete]);
57
- // Handle user input submission
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
58
138
  const handleSubmit = useCallback(async (value) => {
59
- await submitAnswer(value);
60
- }, [submitAnswer]);
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]);
61
177
  // Handle keyboard input for Escape key
62
178
  useInput((input, key) => {
63
179
  if (key.escape) {
@@ -67,18 +183,30 @@ export function InterviewScreen({ featureName, projectRoot, provider, model, sca
67
183
  // Get current phase configuration
68
184
  const phaseConfig = PHASE_CONFIGS[state.phase];
69
185
  // Determine if input should be disabled
70
- // Input is enabled when awaiting input and not working
71
- const inputDisabled = !state.awaitingInput || state.isWorking;
186
+ const inputDisabled = !state.awaitingInput || state.isWorking || state.phase === 'complete';
72
187
  // Build the working indicator state
73
188
  const workingState = {
74
189
  isWorking: state.isWorking,
75
190
  status: state.workingStatus,
76
191
  hint: 'esc to cancel',
77
192
  };
78
- return (_jsxs(Box, { flexDirection: "column", padding: 1, children: [_jsx(PhaseHeader, { currentPhase: phaseConfig.number, totalPhases: TOTAL_DISPLAY_PHASES, phaseName: phaseConfig.name }), _jsx(Box, { marginY: 1, children: _jsx(MessageList, { messages: state.messages }) }), _jsx(Box, { marginY: 1, children: _jsx(WorkingIndicator, { state: workingState }) }), _jsx(Box, { marginTop: 1, children: _jsx(ChatInput, { onSubmit: handleSubmit, disabled: inputDisabled, allowEmpty: state.phase === 'context', placeholder: state.phase === 'context'
79
- ? 'Enter URL or file path, or press Enter to continue...'
80
- : state.phase === 'goals'
81
- ? 'Describe what you want to build...'
82
- : 'Type your response...' }) })] }));
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() }) }))] }));
83
211
  }
84
212
  //# sourceMappingURL=InterviewScreen.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"InterviewScreen.js","sourceRoot":"","sources":["../../../src/tui/screens/InterviewScreen.tsx"],"names":[],"mappings":"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"}
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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"}