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.
- package/dist/ai/conversation/conversation-manager.d.ts +31 -1
- package/dist/ai/conversation/conversation-manager.d.ts.map +1 -1
- package/dist/ai/conversation/conversation-manager.js +48 -3
- package/dist/ai/conversation/conversation-manager.js.map +1 -1
- package/dist/ai/conversation/index.d.ts +3 -2
- package/dist/ai/conversation/index.d.ts.map +1 -1
- package/dist/ai/conversation/index.js +1 -0
- package/dist/ai/conversation/index.js.map +1 -1
- package/dist/ai/conversation/interview-tools.d.ts +85 -0
- package/dist/ai/conversation/interview-tools.d.ts.map +1 -0
- package/dist/ai/conversation/interview-tools.js +255 -0
- package/dist/ai/conversation/interview-tools.js.map +1 -0
- package/dist/ai/conversation/spec-generator.d.ts +47 -1
- package/dist/ai/conversation/spec-generator.d.ts.map +1 -1
- package/dist/ai/conversation/spec-generator.js +287 -33
- package/dist/ai/conversation/spec-generator.js.map +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +3 -2
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/new.d.ts.map +1 -1
- package/dist/commands/new.js +3 -0
- package/dist/commands/new.js.map +1 -1
- package/dist/utils/repl-prompts.d.ts +22 -0
- package/dist/utils/repl-prompts.d.ts.map +1 -1
- package/dist/utils/repl-prompts.js +82 -0
- package/dist/utils/repl-prompts.js.map +1 -1
- package/dist/utils/tui.d.ts +61 -0
- package/dist/utils/tui.d.ts.map +1 -0
- package/dist/utils/tui.js +214 -0
- package/dist/utils/tui.js.map +1 -0
- package/package.json +1 -1
- package/src/ai/conversation/conversation-manager.ts +66 -4
- package/src/ai/conversation/index.ts +7 -0
- package/src/ai/conversation/interview-tools.ts +293 -0
- package/src/ai/conversation/spec-generator.ts +368 -39
- package/src/commands/init.ts +3 -2
- package/src/commands/new.ts +4 -0
- package/src/utils/repl-prompts.ts +103 -0
- 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
|
@@ -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
|
|
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
|
-
|
|
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,
|