wiggum-cli 0.7.4 → 0.7.6

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 (39) hide show
  1. package/dist/ai/conversation/conversation-manager.d.ts +31 -1
  2. package/dist/ai/conversation/conversation-manager.d.ts.map +1 -1
  3. package/dist/ai/conversation/conversation-manager.js +48 -3
  4. package/dist/ai/conversation/conversation-manager.js.map +1 -1
  5. package/dist/ai/conversation/index.d.ts +3 -2
  6. package/dist/ai/conversation/index.d.ts.map +1 -1
  7. package/dist/ai/conversation/index.js +1 -0
  8. package/dist/ai/conversation/index.js.map +1 -1
  9. package/dist/ai/conversation/interview-tools.d.ts +85 -0
  10. package/dist/ai/conversation/interview-tools.d.ts.map +1 -0
  11. package/dist/ai/conversation/interview-tools.js +255 -0
  12. package/dist/ai/conversation/interview-tools.js.map +1 -0
  13. package/dist/ai/conversation/spec-generator.d.ts +47 -1
  14. package/dist/ai/conversation/spec-generator.d.ts.map +1 -1
  15. package/dist/ai/conversation/spec-generator.js +287 -33
  16. package/dist/ai/conversation/spec-generator.js.map +1 -1
  17. package/dist/commands/init.d.ts.map +1 -1
  18. package/dist/commands/init.js +3 -2
  19. package/dist/commands/init.js.map +1 -1
  20. package/dist/commands/new.d.ts.map +1 -1
  21. package/dist/commands/new.js +3 -0
  22. package/dist/commands/new.js.map +1 -1
  23. package/dist/utils/repl-prompts.d.ts +22 -0
  24. package/dist/utils/repl-prompts.d.ts.map +1 -1
  25. package/dist/utils/repl-prompts.js +82 -0
  26. package/dist/utils/repl-prompts.js.map +1 -1
  27. package/dist/utils/tui.d.ts +61 -0
  28. package/dist/utils/tui.d.ts.map +1 -0
  29. package/dist/utils/tui.js +214 -0
  30. package/dist/utils/tui.js.map +1 -0
  31. package/package.json +1 -1
  32. package/src/ai/conversation/conversation-manager.ts +66 -4
  33. package/src/ai/conversation/index.ts +7 -0
  34. package/src/ai/conversation/interview-tools.ts +293 -0
  35. package/src/ai/conversation/spec-generator.ts +368 -39
  36. package/src/commands/init.ts +3 -2
  37. package/src/commands/new.ts +4 -0
  38. package/src/utils/repl-prompts.ts +103 -0
  39. package/src/utils/tui.ts +262 -0
@@ -33,4 +33,26 @@ export declare function confirm(options: {
33
33
  * Check if user cancelled (similar to clack's isCancel)
34
34
  */
35
35
  export declare function isCancel(value: unknown): value is null;
36
+ /**
37
+ * Multi-line input for paste support
38
+ * Reads input until an empty line (after content) or Ctrl+D
39
+ *
40
+ * @param prompt - The prompt to display
41
+ * @returns The collected input or null if cancelled
42
+ */
43
+ export declare function multilineInput(options: {
44
+ prompt?: string;
45
+ /** Hint to show for how to end input */
46
+ endHint?: string;
47
+ }): Promise<string | null>;
48
+ /**
49
+ * Simple text input prompt
50
+ *
51
+ * @param prompt - The prompt to display
52
+ * @returns The input text or null if cancelled
53
+ */
54
+ export declare function textInput(options: {
55
+ message: string;
56
+ placeholder?: string;
57
+ }): Promise<string | null>;
36
58
  //# sourceMappingURL=repl-prompts.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"repl-prompts.d.ts","sourceRoot":"","sources":["../../src/utils/repl-prompts.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,MAAM,WAAW,YAAY,CAAC,CAAC;IAC7B,KAAK,EAAE,CAAC,CAAC;IACT,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,wBAAsB,MAAM,CAAC,CAAC,EAAE,OAAO,EAAE;IACvC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC;CAC5B,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CAsCpB;AAED;;;GAGG;AACH,wBAAsB,QAAQ,CAAC,OAAO,EAAE;IACtC,OAAO,EAAE,MAAM,CAAC;CACjB,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CA+DzB;AAED;;GAEG;AACH,wBAAsB,OAAO,CAAC,OAAO,EAAE;IACrC,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAoC1B;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,IAAI,CAEtD"}
1
+ {"version":3,"file":"repl-prompts.d.ts","sourceRoot":"","sources":["../../src/utils/repl-prompts.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,MAAM,WAAW,YAAY,CAAC,CAAC;IAC7B,KAAK,EAAE,CAAC,CAAC;IACT,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,wBAAsB,MAAM,CAAC,CAAC,EAAE,OAAO,EAAE;IACvC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC;CAC5B,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CAsCpB;AAED;;;GAGG;AACH,wBAAsB,QAAQ,CAAC,OAAO,EAAE;IACtC,OAAO,EAAE,MAAM,CAAC;CACjB,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CA+DzB;AAED;;GAEG;AACH,wBAAsB,OAAO,CAAC,OAAO,EAAE;IACrC,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAoC1B;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,IAAI,CAEtD;AAED;;;;;;GAMG;AACH,wBAAsB,cAAc,CAAC,OAAO,EAAE;IAC5C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,wCAAwC;IACxC,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAoDzB;AAED;;;;;GAKG;AACH,wBAAsB,SAAS,CAAC,OAAO,EAAE;IACvC,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CA2BzB"}
@@ -146,4 +146,86 @@ export async function confirm(options) {
146
146
  export function isCancel(value) {
147
147
  return value === null;
148
148
  }
149
+ /**
150
+ * Multi-line input for paste support
151
+ * Reads input until an empty line (after content) or Ctrl+D
152
+ *
153
+ * @param prompt - The prompt to display
154
+ * @returns The collected input or null if cancelled
155
+ */
156
+ export async function multilineInput(options) {
157
+ const { prompt = '>', endHint = 'Press Enter twice when done' } = options;
158
+ console.log(pc.dim(` (${endHint})`));
159
+ return new Promise((resolve) => {
160
+ const lines = [];
161
+ let lastLineEmpty = false;
162
+ const rl = readline.createInterface({
163
+ input: process.stdin,
164
+ output: process.stdout,
165
+ prompt: `${pc.dim(prompt)} `,
166
+ });
167
+ rl.prompt();
168
+ rl.on('line', (line) => {
169
+ const trimmed = line.trim();
170
+ // If we get an empty line after having content, we're done
171
+ if (trimmed === '' && lines.length > 0 && lastLineEmpty) {
172
+ rl.close();
173
+ // Remove the trailing empty line we added
174
+ const result = lines.slice(0, -1).join('\n').trim();
175
+ if (result) {
176
+ console.log(pc.green('✓') + pc.dim(` Received ${result.split('\n').length} line(s)`));
177
+ }
178
+ resolve(result || null);
179
+ return;
180
+ }
181
+ lastLineEmpty = trimmed === '';
182
+ lines.push(line);
183
+ rl.prompt();
184
+ });
185
+ rl.on('close', () => {
186
+ // Ctrl+D or EOF
187
+ const result = lines.join('\n').trim();
188
+ if (result) {
189
+ console.log(pc.green('✓') + pc.dim(` Received ${result.split('\n').length} line(s)`));
190
+ }
191
+ resolve(result || null);
192
+ });
193
+ rl.on('SIGINT', () => {
194
+ rl.close();
195
+ console.log('');
196
+ resolve(null);
197
+ });
198
+ });
199
+ }
200
+ /**
201
+ * Simple text input prompt
202
+ *
203
+ * @param prompt - The prompt to display
204
+ * @returns The input text or null if cancelled
205
+ */
206
+ export async function textInput(options) {
207
+ const { message, placeholder } = options;
208
+ const hint = placeholder ? pc.dim(` (${placeholder})`) : '';
209
+ const rl = readline.createInterface({
210
+ input: process.stdin,
211
+ output: process.stdout,
212
+ });
213
+ return new Promise((resolve) => {
214
+ rl.question(`${simpson.yellow('?')} ${message}${hint}: `, (answer) => {
215
+ rl.close();
216
+ const trimmed = answer.trim();
217
+ if (trimmed) {
218
+ resolve(trimmed);
219
+ }
220
+ else {
221
+ resolve(null);
222
+ }
223
+ });
224
+ rl.on('SIGINT', () => {
225
+ rl.close();
226
+ console.log('');
227
+ resolve(null);
228
+ });
229
+ });
230
+ }
149
231
  //# sourceMappingURL=repl-prompts.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"repl-prompts.js","sourceRoot":"","sources":["../../src/utils/repl-prompts.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"repl-prompts.js","sourceRoot":"","sources":["../../src/utils/repl-prompts.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,61 @@
1
+ /**
2
+ * TUI (Text User Interface) Utilities
3
+ * Claude Code-like display helpers for the interview agent
4
+ */
5
+ /**
6
+ * Generation phases for the spec generator
7
+ */
8
+ export type Phase = 'context' | 'goals' | 'interview' | 'generation' | 'complete';
9
+ /**
10
+ * Display the phase header (Claude Code style box)
11
+ */
12
+ export declare function displayPhaseHeader(featureName: string, currentPhase: Phase, questionCount?: {
13
+ current: number;
14
+ max: number;
15
+ }): void;
16
+ /**
17
+ * Display a tool usage indicator (like Claude Code)
18
+ */
19
+ export declare function displayToolUse(toolName: string, args: Record<string, unknown>): void;
20
+ /**
21
+ * Display session context (project info)
22
+ */
23
+ export declare function displaySessionContext(context: {
24
+ projectName?: string;
25
+ stack?: string;
26
+ entryPoints?: string[];
27
+ tools?: {
28
+ tavily: boolean;
29
+ context7: boolean;
30
+ codebase: boolean;
31
+ };
32
+ }): void;
33
+ /**
34
+ * Display progress phases with visual indicators
35
+ */
36
+ export declare function displayProgressPhases(currentPhase: Phase): void;
37
+ /**
38
+ * Display a warning for garbled input
39
+ */
40
+ export declare function displayGarbledInputWarning(received: string): void;
41
+ /**
42
+ * Display AI prefix before streaming
43
+ */
44
+ export declare function displayAIPrefix(): void;
45
+ /**
46
+ * Display a simple separator line
47
+ */
48
+ export declare function displaySeparator(): void;
49
+ /**
50
+ * Display thinking indicator
51
+ */
52
+ export declare function displayThinking(): void;
53
+ /**
54
+ * Clear thinking indicator
55
+ */
56
+ export declare function clearThinking(): void;
57
+ /**
58
+ * Format bytes for display
59
+ */
60
+ export declare function formatBytes(bytes: number): string;
61
+ //# sourceMappingURL=tui.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tui.d.ts","sourceRoot":"","sources":["../../src/utils/tui.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH;;GAEG;AACH,MAAM,MAAM,KAAK,GAAG,SAAS,GAAG,OAAO,GAAG,WAAW,GAAG,YAAY,GAAG,UAAU,CAAC;AAgClF;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,KAAK,EACnB,aAAa,CAAC,EAAE;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GAC/C,IAAI,CAuCN;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAIpF;AAoCD;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE;IAC7C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,KAAK,CAAC,EAAE;QAAE,MAAM,EAAE,OAAO,CAAC;QAAC,QAAQ,EAAE,OAAO,CAAC;QAAC,QAAQ,EAAE,OAAO,CAAA;KAAE,CAAC;CACnE,GAAG,IAAI,CAmCP;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,YAAY,EAAE,KAAK,GAAG,IAAI,CAwB/D;AAUD;;GAEG;AACH,wBAAgB,0BAA0B,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAIjE;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,IAAI,CAEtC;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,IAAI,CAEvC;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,IAAI,CAEtC;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI,IAAI,CAGpC;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAIjD"}
@@ -0,0 +1,214 @@
1
+ /**
2
+ * TUI (Text User Interface) Utilities
3
+ * Claude Code-like display helpers for the interview agent
4
+ */
5
+ import pc from 'picocolors';
6
+ import { simpson } from './colors.js';
7
+ const PHASE_CONFIG = {
8
+ context: { label: 'Context', description: 'Share reference URLs or files' },
9
+ goals: { label: 'Goals', description: 'Describe what you want to build' },
10
+ interview: { label: 'Interview', description: 'Answer clarifying questions' },
11
+ generation: { label: 'Spec', description: 'Generate specification' },
12
+ complete: { label: 'Complete', description: 'Spec generated' },
13
+ };
14
+ /**
15
+ * Tool icons for display
16
+ */
17
+ const TOOL_ICONS = {
18
+ read_file: '📂',
19
+ search_codebase: '🔍',
20
+ list_directory: '📁',
21
+ tavily_search: '🌐',
22
+ resolveLibraryId: '📚',
23
+ queryDocs: '📚',
24
+ context7: '📚',
25
+ default: '🔧',
26
+ };
27
+ /**
28
+ * Display the phase header (Claude Code style box)
29
+ */
30
+ export function displayPhaseHeader(featureName, currentPhase, questionCount) {
31
+ const width = 66;
32
+ // Build phase indicators
33
+ const phases = ['context', 'goals', 'interview', 'generation'];
34
+ const phaseLabels = phases.map(phase => {
35
+ const config = PHASE_CONFIG[phase];
36
+ if (phase === currentPhase) {
37
+ return `[${config.label}]`;
38
+ }
39
+ return config.label;
40
+ });
41
+ const phaseString = phaseLabels.join(' → ');
42
+ // Build right-side info (question count)
43
+ const rightInfo = questionCount
44
+ ? `Questions: ${questionCount.current}/${questionCount.max}`
45
+ : '';
46
+ // Create the header box
47
+ const title = `Feature: ${featureName}`;
48
+ const topLine = '┌─' + ' '.repeat(width - 4) + '─┐';
49
+ const bottomLine = '└─' + ' '.repeat(width - 4) + '─┘';
50
+ // Title line
51
+ const titlePadding = width - 4 - title.length;
52
+ const titleLine = `│ ${simpson.yellow(title)}${' '.repeat(Math.max(0, titlePadding))} │`;
53
+ // Phase line with right info
54
+ const phasePadding = width - 4 - phaseString.length - rightInfo.length;
55
+ const phaseLine = `│ ${pc.dim(phaseString)}${' '.repeat(Math.max(0, phasePadding))}${pc.dim(rightInfo)} │`;
56
+ console.log('');
57
+ console.log(pc.dim(topLine));
58
+ console.log(titleLine);
59
+ console.log(phaseLine);
60
+ console.log(pc.dim(bottomLine));
61
+ console.log('');
62
+ }
63
+ /**
64
+ * Display a tool usage indicator (like Claude Code)
65
+ */
66
+ export function displayToolUse(toolName, args) {
67
+ const icon = TOOL_ICONS[toolName] || TOOL_ICONS.default;
68
+ const formattedCall = formatToolCall(toolName, args);
69
+ console.log(pc.dim(` ${icon} ${formattedCall}`));
70
+ }
71
+ /**
72
+ * Format a tool call for display
73
+ */
74
+ function formatToolCall(toolName, args) {
75
+ switch (toolName) {
76
+ case 'read_file':
77
+ return `Reading ${args.path}`;
78
+ case 'search_codebase':
79
+ const dir = args.directory ? ` in ${args.directory}/` : '';
80
+ return `Searching for "${args.pattern}"${dir}`;
81
+ case 'list_directory':
82
+ return `Listing ${args.path || '.'}`;
83
+ case 'tavily_search':
84
+ return `Web: "${args.query}"`;
85
+ case 'resolveLibraryId':
86
+ return `Looking up library: ${args.libraryName}`;
87
+ case 'queryDocs':
88
+ return `Docs: ${args.libraryId} - "${args.query?.slice(0, 40)}..."`;
89
+ default:
90
+ // Generic format
91
+ const argStr = Object.entries(args)
92
+ .slice(0, 2)
93
+ .map(([k, v]) => `${k}=${JSON.stringify(v)}`.slice(0, 30))
94
+ .join(', ');
95
+ return `${toolName}(${argStr})`;
96
+ }
97
+ }
98
+ /**
99
+ * Display session context (project info)
100
+ */
101
+ export function displaySessionContext(context) {
102
+ const width = 66;
103
+ const topLine = '┌─' + ' '.repeat(width - 4) + '─┐';
104
+ const bottomLine = '└─' + ' '.repeat(width - 4) + '─┘';
105
+ const lines = [];
106
+ if (context.projectName) {
107
+ lines.push(`Project: ${context.projectName}`);
108
+ }
109
+ if (context.stack) {
110
+ lines.push(`Stack: ${context.stack}`);
111
+ }
112
+ if (context.entryPoints && context.entryPoints.length > 0) {
113
+ lines.push(`Entry: ${context.entryPoints.slice(0, 2).join(', ')}`);
114
+ }
115
+ if (context.tools) {
116
+ const toolList = [];
117
+ if (context.tools.tavily)
118
+ toolList.push('Tavily ✓');
119
+ if (context.tools.context7)
120
+ toolList.push('Context7 ✓');
121
+ if (context.tools.codebase)
122
+ toolList.push('Codebase ✓');
123
+ if (toolList.length > 0) {
124
+ lines.push(`Tools: ${toolList.join(' ')}`);
125
+ }
126
+ }
127
+ if (lines.length === 0)
128
+ return;
129
+ console.log(pc.dim(topLine));
130
+ for (const line of lines) {
131
+ const padding = width - 4 - line.length;
132
+ console.log(`│ ${pc.dim(line)}${' '.repeat(Math.max(0, padding))} │`);
133
+ }
134
+ console.log(pc.dim(bottomLine));
135
+ console.log('');
136
+ }
137
+ /**
138
+ * Display progress phases with visual indicators
139
+ */
140
+ export function displayProgressPhases(currentPhase) {
141
+ const phases = ['context', 'goals', 'interview', 'generation'];
142
+ console.log('');
143
+ for (const phase of phases) {
144
+ const config = PHASE_CONFIG[phase];
145
+ let indicator;
146
+ let style;
147
+ if (phase === currentPhase) {
148
+ indicator = '◐'; // In progress
149
+ style = simpson.yellow;
150
+ }
151
+ else if (getPhaseIndex(phase) < getPhaseIndex(currentPhase)) {
152
+ indicator = '●'; // Completed
153
+ style = pc.green;
154
+ }
155
+ else {
156
+ indicator = '○'; // Pending
157
+ style = pc.dim;
158
+ }
159
+ const current = phase === currentPhase ? ' ← current' : '';
160
+ console.log(` ${style(indicator)} ${style(config.label)} ${pc.dim(`- ${config.description}`)}${pc.dim(current)}`);
161
+ }
162
+ console.log('');
163
+ }
164
+ /**
165
+ * Get the index of a phase for comparison
166
+ */
167
+ function getPhaseIndex(phase) {
168
+ const order = ['context', 'goals', 'interview', 'generation', 'complete'];
169
+ return order.indexOf(phase);
170
+ }
171
+ /**
172
+ * Display a warning for garbled input
173
+ */
174
+ export function displayGarbledInputWarning(received) {
175
+ console.log('');
176
+ console.log(pc.yellow(`⚠️ Received incomplete input: "${received.slice(0, 50)}${received.length > 50 ? '...' : ''}"`));
177
+ console.log(pc.dim(' Please paste again or type your answer.'));
178
+ }
179
+ /**
180
+ * Display AI prefix before streaming
181
+ */
182
+ export function displayAIPrefix() {
183
+ process.stdout.write(simpson.blue('AI: '));
184
+ }
185
+ /**
186
+ * Display a simple separator line
187
+ */
188
+ export function displaySeparator() {
189
+ console.log(pc.dim('─'.repeat(60)));
190
+ }
191
+ /**
192
+ * Display thinking indicator
193
+ */
194
+ export function displayThinking() {
195
+ process.stdout.write(pc.dim('Thinking...'));
196
+ }
197
+ /**
198
+ * Clear thinking indicator
199
+ */
200
+ export function clearThinking() {
201
+ // Move cursor back and clear line
202
+ process.stdout.write('\r' + ' '.repeat(20) + '\r');
203
+ }
204
+ /**
205
+ * Format bytes for display
206
+ */
207
+ export function formatBytes(bytes) {
208
+ if (bytes < 1024)
209
+ return `${bytes}B`;
210
+ if (bytes < 1024 * 1024)
211
+ return `${(bytes / 1024).toFixed(1)}KB`;
212
+ return `${(bytes / (1024 * 1024)).toFixed(1)}MB`;
213
+ }
214
+ //# sourceMappingURL=tui.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tui.js","sourceRoot":"","sources":["../../src/utils/tui.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "wiggum-cli",
3
- "version": "0.7.4",
3
+ "version": "0.7.6",
4
4
  "description": "AI-powered feature development loop CLI",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -3,7 +3,7 @@
3
3
  * Manages multi-turn AI conversations for spec generation
4
4
  */
5
5
 
6
- import { generateText, streamText } from 'ai';
6
+ import { generateText, streamText, stepCountIs, type Tool } from 'ai';
7
7
  import { getModel, isReasoningModel, type AIProvider } from '../providers.js';
8
8
  import type { ScanResult } from '../../scanner/types.js';
9
9
 
@@ -31,6 +31,11 @@ export interface ConversationContext {
31
31
  references: Array<{ source: string; content: string }>;
32
32
  }
33
33
 
34
+ /**
35
+ * Tool use callback for displaying tool usage
36
+ */
37
+ export type ToolUseCallback = (toolName: string, args: Record<string, unknown>) => void;
38
+
34
39
  /**
35
40
  * Conversation manager options
36
41
  */
@@ -38,6 +43,12 @@ export interface ConversationManagerOptions {
38
43
  provider: AIProvider;
39
44
  model: string;
40
45
  systemPrompt?: string;
46
+ /** Tools available to the AI */
47
+ tools?: Record<string, Tool>;
48
+ /** Callback when a tool is used */
49
+ onToolUse?: ToolUseCallback;
50
+ /** Maximum tool calling steps (default: 5) */
51
+ maxToolSteps?: number;
41
52
  }
42
53
 
43
54
  /**
@@ -79,12 +90,46 @@ export class ConversationManager {
79
90
  private context: ConversationContext = { references: [] };
80
91
  private readonly provider: AIProvider;
81
92
  private readonly modelId: string;
82
- private readonly systemPrompt: string;
93
+ private systemPrompt: string;
94
+ private tools?: Record<string, Tool>;
95
+ private onToolUse?: ToolUseCallback;
96
+ private maxToolSteps: number;
83
97
 
84
98
  constructor(options: ConversationManagerOptions) {
85
99
  this.provider = options.provider;
86
100
  this.modelId = options.model;
87
101
  this.systemPrompt = options.systemPrompt || this.getDefaultSystemPrompt();
102
+ this.tools = options.tools;
103
+ this.onToolUse = options.onToolUse;
104
+ this.maxToolSteps = options.maxToolSteps ?? 5;
105
+ }
106
+
107
+ /**
108
+ * Set tools for the conversation
109
+ */
110
+ setTools(tools: Record<string, Tool>): void {
111
+ this.tools = tools;
112
+ }
113
+
114
+ /**
115
+ * Set tool use callback
116
+ */
117
+ setOnToolUse(callback: ToolUseCallback): void {
118
+ this.onToolUse = callback;
119
+ }
120
+
121
+ /**
122
+ * Update the system prompt
123
+ */
124
+ setSystemPrompt(prompt: string): void {
125
+ this.systemPrompt = prompt;
126
+ }
127
+
128
+ /**
129
+ * Append to the system prompt
130
+ */
131
+ appendSystemPrompt(addition: string): void {
132
+ this.systemPrompt = `${this.systemPrompt}\n\n${addition}`;
88
133
  }
89
134
 
90
135
  private getDefaultSystemPrompt(): string {
@@ -166,11 +211,28 @@ Be concise but thorough. Focus on understanding the user's needs before proposin
166
211
  const { model } = getModel(this.provider, this.modelId);
167
212
  const messages = this.buildMessages();
168
213
 
169
- const result = await generateText({
214
+ // Build options based on whether we have tools
215
+ const options: Parameters<typeof generateText>[0] = {
170
216
  model,
171
217
  messages,
172
218
  ...(isReasoningModel(this.modelId) ? {} : { temperature: 0.7 }),
173
- });
219
+ };
220
+
221
+ if (this.tools && Object.keys(this.tools).length > 0) {
222
+ options.tools = this.tools;
223
+ options.stopWhen = stepCountIs(this.maxToolSteps);
224
+ options.onStepFinish = (step) => {
225
+ // Call onToolUse callback for each tool call
226
+ if (step.toolCalls && this.onToolUse) {
227
+ for (const toolCall of step.toolCalls) {
228
+ // AI SDK uses 'input' for tool arguments
229
+ this.onToolUse(toolCall.toolName, toolCall.input as Record<string, unknown>);
230
+ }
231
+ }
232
+ };
233
+ }
234
+
235
+ const result = await generateText(options);
174
236
 
175
237
  const assistantMessage = result.text;
176
238
 
@@ -8,13 +8,20 @@ export {
8
8
  type ConversationMessage,
9
9
  type ConversationContext,
10
10
  type ConversationManagerOptions,
11
+ type ToolUseCallback,
11
12
  } from './conversation-manager.js';
12
13
 
13
14
  export {
14
15
  SpecGenerator,
15
16
  type SpecGeneratorOptions,
17
+ type SessionContext,
16
18
  } from './spec-generator.js';
17
19
 
20
+ export {
21
+ createInterviewTools,
22
+ type InterviewTools,
23
+ } from './interview-tools.js';
24
+
18
25
  export {
19
26
  fetchContent,
20
27
  fetchMultipleSources,