wiggum-cli 0.7.4 → 0.7.5

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 (35) 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 +36 -0
  14. package/dist/ai/conversation/spec-generator.d.ts.map +1 -1
  15. package/dist/ai/conversation/spec-generator.js +219 -30
  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/utils/repl-prompts.d.ts +22 -0
  21. package/dist/utils/repl-prompts.d.ts.map +1 -1
  22. package/dist/utils/repl-prompts.js +82 -0
  23. package/dist/utils/repl-prompts.js.map +1 -1
  24. package/dist/utils/tui.d.ts +61 -0
  25. package/dist/utils/tui.d.ts.map +1 -0
  26. package/dist/utils/tui.js +214 -0
  27. package/dist/utils/tui.js.map +1 -0
  28. package/package.json +1 -1
  29. package/src/ai/conversation/conversation-manager.ts +66 -4
  30. package/src/ai/conversation/index.ts +7 -0
  31. package/src/ai/conversation/interview-tools.ts +293 -0
  32. package/src/ai/conversation/spec-generator.ts +287 -34
  33. package/src/commands/init.ts +3 -2
  34. package/src/utils/repl-prompts.ts +103 -0
  35. package/src/utils/tui.ts +262 -0
@@ -2,6 +2,7 @@
2
2
  * Conversation Manager
3
3
  * Manages multi-turn AI conversations for spec generation
4
4
  */
5
+ import { type Tool } from 'ai';
5
6
  import { type AIProvider } from '../providers.js';
6
7
  import type { ScanResult } from '../../scanner/types.js';
7
8
  /**
@@ -21,6 +22,10 @@ export interface ConversationContext {
21
22
  content: string;
22
23
  }>;
23
24
  }
25
+ /**
26
+ * Tool use callback for displaying tool usage
27
+ */
28
+ export type ToolUseCallback = (toolName: string, args: Record<string, unknown>) => void;
24
29
  /**
25
30
  * Conversation manager options
26
31
  */
@@ -28,6 +33,12 @@ export interface ConversationManagerOptions {
28
33
  provider: AIProvider;
29
34
  model: string;
30
35
  systemPrompt?: string;
36
+ /** Tools available to the AI */
37
+ tools?: Record<string, Tool>;
38
+ /** Callback when a tool is used */
39
+ onToolUse?: ToolUseCallback;
40
+ /** Maximum tool calling steps (default: 5) */
41
+ maxToolSteps?: number;
31
42
  }
32
43
  /**
33
44
  * Manages a multi-turn conversation with an AI model
@@ -37,8 +48,27 @@ export declare class ConversationManager {
37
48
  private context;
38
49
  private readonly provider;
39
50
  private readonly modelId;
40
- private readonly systemPrompt;
51
+ private systemPrompt;
52
+ private tools?;
53
+ private onToolUse?;
54
+ private maxToolSteps;
41
55
  constructor(options: ConversationManagerOptions);
56
+ /**
57
+ * Set tools for the conversation
58
+ */
59
+ setTools(tools: Record<string, Tool>): void;
60
+ /**
61
+ * Set tool use callback
62
+ */
63
+ setOnToolUse(callback: ToolUseCallback): void;
64
+ /**
65
+ * Update the system prompt
66
+ */
67
+ setSystemPrompt(prompt: string): void;
68
+ /**
69
+ * Append to the system prompt
70
+ */
71
+ appendSystemPrompt(addition: string): void;
42
72
  private getDefaultSystemPrompt;
43
73
  /**
44
74
  * Set codebase context from scan result
@@ -1 +1 @@
1
- {"version":3,"file":"conversation-manager.d.ts","sourceRoot":"","sources":["../../../src/ai/conversation/conversation-manager.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAA8B,KAAK,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC9E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAUzD;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,QAAQ,CAAC;IACtC,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,UAAU,EAAE,KAAK,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACxD;AAED;;GAEG;AACH,MAAM,WAAW,0BAA0B;IACzC,QAAQ,EAAE,UAAU,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAiCD;;GAEG;AACH,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,QAAQ,CAA6B;IAC7C,OAAO,CAAC,OAAO,CAA2C;IAC1D,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAa;IACtC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;gBAE1B,OAAO,EAAE,0BAA0B;IAM/C,OAAO,CAAC,sBAAsB;IAM9B;;OAEG;IACH,kBAAkB,CAAC,UAAU,EAAE,UAAU,GAAG,IAAI;IAIhD;;OAEG;IACH,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAInD;;OAEG;IACH,eAAe,IAAI,IAAI;IAIvB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAiBxB;;OAEG;IACH,OAAO,CAAC,aAAa;IAmBrB;;OAEG;IACG,IAAI,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAqBhD;;OAEG;IACI,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,aAAa,CAAC,MAAM,CAAC;IAwB7D;;OAEG;IACH,UAAU,IAAI,mBAAmB,EAAE;IAInC;;OAEG;IACH,YAAY,IAAI,IAAI;IAIpB;;OAEG;IACH,YAAY,CAAC,OAAO,EAAE,mBAAmB,GAAG,IAAI;CAGjD"}
1
+ {"version":3,"file":"conversation-manager.d.ts","sourceRoot":"","sources":["../../../src/ai/conversation/conversation-manager.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAyC,KAAK,IAAI,EAAE,MAAM,IAAI,CAAC;AACtE,OAAO,EAA8B,KAAK,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC9E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAUzD;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,QAAQ,CAAC;IACtC,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,UAAU,EAAE,KAAK,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACxD;AAED;;GAEG;AACH,MAAM,MAAM,eAAe,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;AAExF;;GAEG;AACH,MAAM,WAAW,0BAA0B;IACzC,QAAQ,EAAE,UAAU,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,gCAAgC;IAChC,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAC7B,mCAAmC;IACnC,SAAS,CAAC,EAAE,eAAe,CAAC;IAC5B,8CAA8C;IAC9C,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAiCD;;GAEG;AACH,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,QAAQ,CAA6B;IAC7C,OAAO,CAAC,OAAO,CAA2C;IAC1D,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAa;IACtC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,KAAK,CAAC,CAAuB;IACrC,OAAO,CAAC,SAAS,CAAC,CAAkB;IACpC,OAAO,CAAC,YAAY,CAAS;gBAEjB,OAAO,EAAE,0BAA0B;IAS/C;;OAEG;IACH,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,IAAI;IAI3C;;OAEG;IACH,YAAY,CAAC,QAAQ,EAAE,eAAe,GAAG,IAAI;IAI7C;;OAEG;IACH,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAIrC;;OAEG;IACH,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAI1C,OAAO,CAAC,sBAAsB;IAM9B;;OAEG;IACH,kBAAkB,CAAC,UAAU,EAAE,UAAU,GAAG,IAAI;IAIhD;;OAEG;IACH,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAInD;;OAEG;IACH,eAAe,IAAI,IAAI;IAIvB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAiBxB;;OAEG;IACH,OAAO,CAAC,aAAa;IAmBrB;;OAEG;IACG,IAAI,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAsChD;;OAEG;IACI,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,aAAa,CAAC,MAAM,CAAC;IAwB7D;;OAEG;IACH,UAAU,IAAI,mBAAmB,EAAE;IAInC;;OAEG;IACH,YAAY,IAAI,IAAI;IAIpB;;OAEG;IACH,YAAY,CAAC,OAAO,EAAE,mBAAmB,GAAG,IAAI;CAGjD"}
@@ -2,7 +2,7 @@
2
2
  * Conversation Manager
3
3
  * Manages multi-turn AI conversations for spec generation
4
4
  */
5
- import { generateText, streamText } from 'ai';
5
+ import { generateText, streamText, stepCountIs } from 'ai';
6
6
  import { getModel, isReasoningModel } from '../providers.js';
7
7
  /**
8
8
  * Format scan result into a concise codebase summary
@@ -36,10 +36,40 @@ export class ConversationManager {
36
36
  provider;
37
37
  modelId;
38
38
  systemPrompt;
39
+ tools;
40
+ onToolUse;
41
+ maxToolSteps;
39
42
  constructor(options) {
40
43
  this.provider = options.provider;
41
44
  this.modelId = options.model;
42
45
  this.systemPrompt = options.systemPrompt || this.getDefaultSystemPrompt();
46
+ this.tools = options.tools;
47
+ this.onToolUse = options.onToolUse;
48
+ this.maxToolSteps = options.maxToolSteps ?? 5;
49
+ }
50
+ /**
51
+ * Set tools for the conversation
52
+ */
53
+ setTools(tools) {
54
+ this.tools = tools;
55
+ }
56
+ /**
57
+ * Set tool use callback
58
+ */
59
+ setOnToolUse(callback) {
60
+ this.onToolUse = callback;
61
+ }
62
+ /**
63
+ * Update the system prompt
64
+ */
65
+ setSystemPrompt(prompt) {
66
+ this.systemPrompt = prompt;
67
+ }
68
+ /**
69
+ * Append to the system prompt
70
+ */
71
+ appendSystemPrompt(addition) {
72
+ this.systemPrompt = `${this.systemPrompt}\n\n${addition}`;
43
73
  }
44
74
  getDefaultSystemPrompt() {
45
75
  return `You are a helpful assistant that helps developers create feature specifications.
@@ -106,11 +136,26 @@ Be concise but thorough. Focus on understanding the user's needs before proposin
106
136
  this.messages.push({ role: 'user', content: userMessage });
107
137
  const { model } = getModel(this.provider, this.modelId);
108
138
  const messages = this.buildMessages();
109
- const result = await generateText({
139
+ // Build options based on whether we have tools
140
+ const options = {
110
141
  model,
111
142
  messages,
112
143
  ...(isReasoningModel(this.modelId) ? {} : { temperature: 0.7 }),
113
- });
144
+ };
145
+ if (this.tools && Object.keys(this.tools).length > 0) {
146
+ options.tools = this.tools;
147
+ options.stopWhen = stepCountIs(this.maxToolSteps);
148
+ options.onStepFinish = (step) => {
149
+ // Call onToolUse callback for each tool call
150
+ if (step.toolCalls && this.onToolUse) {
151
+ for (const toolCall of step.toolCalls) {
152
+ // AI SDK uses 'input' for tool arguments
153
+ this.onToolUse(toolCall.toolName, toolCall.input);
154
+ }
155
+ }
156
+ };
157
+ }
158
+ const result = await generateText(options);
114
159
  const assistantMessage = result.text;
115
160
  // Add assistant response to history
116
161
  this.messages.push({ role: 'assistant', content: assistantMessage });
@@ -1 +1 @@
1
- {"version":3,"file":"conversation-manager.js","sourceRoot":"","sources":["../../../src/ai/conversation/conversation-manager.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"conversation-manager.js","sourceRoot":"","sources":["../../../src/ai/conversation/conversation-manager.ts"],"names":[],"mappings":"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"}
@@ -2,7 +2,8 @@
2
2
  * Conversation Module
3
3
  * AI-powered conversation and spec generation
4
4
  */
5
- export { ConversationManager, type ConversationMessage, type ConversationContext, type ConversationManagerOptions, } from './conversation-manager.js';
6
- export { SpecGenerator, type SpecGeneratorOptions, } from './spec-generator.js';
5
+ export { ConversationManager, type ConversationMessage, type ConversationContext, type ConversationManagerOptions, type ToolUseCallback, } from './conversation-manager.js';
6
+ export { SpecGenerator, type SpecGeneratorOptions, type SessionContext, } from './spec-generator.js';
7
+ export { createInterviewTools, type InterviewTools, } from './interview-tools.js';
7
8
  export { fetchContent, fetchMultipleSources, isUrl, type FetchedContent, } from './url-fetcher.js';
8
9
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/ai/conversation/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACL,mBAAmB,EACnB,KAAK,mBAAmB,EACxB,KAAK,mBAAmB,EACxB,KAAK,0BAA0B,GAChC,MAAM,2BAA2B,CAAC;AAEnC,OAAO,EACL,aAAa,EACb,KAAK,oBAAoB,GAC1B,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,YAAY,EACZ,oBAAoB,EACpB,KAAK,EACL,KAAK,cAAc,GACpB,MAAM,kBAAkB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/ai/conversation/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACL,mBAAmB,EACnB,KAAK,mBAAmB,EACxB,KAAK,mBAAmB,EACxB,KAAK,0BAA0B,EAC/B,KAAK,eAAe,GACrB,MAAM,2BAA2B,CAAC;AAEnC,OAAO,EACL,aAAa,EACb,KAAK,oBAAoB,EACzB,KAAK,cAAc,GACpB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,oBAAoB,EACpB,KAAK,cAAc,GACpB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EACL,YAAY,EACZ,oBAAoB,EACpB,KAAK,EACL,KAAK,cAAc,GACpB,MAAM,kBAAkB,CAAC"}
@@ -4,5 +4,6 @@
4
4
  */
5
5
  export { ConversationManager, } from './conversation-manager.js';
6
6
  export { SpecGenerator, } from './spec-generator.js';
7
+ export { createInterviewTools, } from './interview-tools.js';
7
8
  export { fetchContent, fetchMultipleSources, isUrl, } from './url-fetcher.js';
8
9
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/ai/conversation/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACL,mBAAmB,GAIpB,MAAM,2BAA2B,CAAC;AAEnC,OAAO,EACL,aAAa,GAEd,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,YAAY,EACZ,oBAAoB,EACpB,KAAK,GAEN,MAAM,kBAAkB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/ai/conversation/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACL,mBAAmB,GAKpB,MAAM,2BAA2B,CAAC;AAEnC,OAAO,EACL,aAAa,GAGd,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,oBAAoB,GAErB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EACL,YAAY,EACZ,oBAAoB,EACpB,KAAK,GAEN,MAAM,kBAAkB,CAAC"}
@@ -0,0 +1,85 @@
1
+ /**
2
+ * Interview Tools
3
+ * Codebase tools for the AI interview agent
4
+ */
5
+ /**
6
+ * Create codebase tools for interview agent
7
+ */
8
+ export declare function createInterviewTools(projectRoot: string): {
9
+ /**
10
+ * Read a file from the project codebase
11
+ */
12
+ read_file: import("ai").Tool<{
13
+ path: string;
14
+ }, {
15
+ error: string;
16
+ content?: undefined;
17
+ truncated?: undefined;
18
+ totalLength?: undefined;
19
+ message?: undefined;
20
+ } | {
21
+ content: string;
22
+ truncated: boolean;
23
+ totalLength: number;
24
+ message: string;
25
+ error?: undefined;
26
+ } | {
27
+ content: string;
28
+ truncated: boolean;
29
+ error?: undefined;
30
+ totalLength?: undefined;
31
+ message?: undefined;
32
+ }>;
33
+ /**
34
+ * Search for patterns in the codebase
35
+ */
36
+ search_codebase: import("ai").Tool<{
37
+ pattern: string;
38
+ directory?: string | undefined;
39
+ filePattern?: string | undefined;
40
+ literal?: boolean | undefined;
41
+ }, {
42
+ error: string;
43
+ matches?: undefined;
44
+ message?: undefined;
45
+ truncated?: undefined;
46
+ } | {
47
+ matches: never[];
48
+ message: string;
49
+ error?: undefined;
50
+ truncated?: undefined;
51
+ } | {
52
+ matches: {
53
+ file: string;
54
+ line: number;
55
+ content: string;
56
+ }[];
57
+ truncated: boolean;
58
+ message: string;
59
+ error?: undefined;
60
+ }>;
61
+ /**
62
+ * List files in a directory
63
+ */
64
+ list_directory: import("ai").Tool<{
65
+ path: string;
66
+ }, {
67
+ error: string;
68
+ path?: undefined;
69
+ items?: undefined;
70
+ count?: undefined;
71
+ } | {
72
+ path: string;
73
+ items: {
74
+ name: string;
75
+ type: string;
76
+ }[];
77
+ count: number;
78
+ error?: undefined;
79
+ }>;
80
+ };
81
+ /**
82
+ * Export tool types for TypeScript
83
+ */
84
+ export type InterviewTools = ReturnType<typeof createInterviewTools>;
85
+ //# sourceMappingURL=interview-tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interview-tools.d.ts","sourceRoot":"","sources":["../../../src/ai/conversation/interview-tools.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAyCH;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,WAAW,EAAE,MAAM;IAEpD;;OAEG;;;;;;;;;;;;;;;;;;;;;;IA4CH;;OAEG;;;;;;;;;;;;;;;;;;;;;;;;;;IA+HH;;OAEG;;;;;;;;;;;;;;;;;EA6DN;AAED;;GAEG;AACH,MAAM,MAAM,cAAc,GAAG,UAAU,CAAC,OAAO,oBAAoB,CAAC,CAAC"}
@@ -0,0 +1,255 @@
1
+ /**
2
+ * Interview Tools
3
+ * Codebase tools for the AI interview agent
4
+ */
5
+ import { tool, zodSchema } from 'ai';
6
+ import { z } from 'zod';
7
+ import { existsSync, readFileSync, readdirSync, statSync } from 'node:fs';
8
+ import { relative, resolve } from 'node:path';
9
+ import { spawnSync } from 'node:child_process';
10
+ /** Maximum content length before truncation */
11
+ const MAX_CONTENT_LENGTH = 8000;
12
+ /** Maximum search results */
13
+ const MAX_SEARCH_RESULTS = 20;
14
+ /**
15
+ * Validate path is within project root (security)
16
+ * Ensures the resolved path is exactly the project root or a child of it,
17
+ * preventing prefix-based escapes like ../project-secret
18
+ */
19
+ function validatePath(projectRoot, targetPath) {
20
+ const absolutePath = resolve(projectRoot, targetPath);
21
+ const normalizedProjectRoot = resolve(projectRoot);
22
+ // Must be exactly the project root OR start with project root + separator
23
+ // This prevents prefix attacks like /project-secret matching /project
24
+ if (absolutePath !== normalizedProjectRoot &&
25
+ !absolutePath.startsWith(normalizedProjectRoot + '/')) {
26
+ return null; // Path traversal attempt
27
+ }
28
+ return absolutePath;
29
+ }
30
+ /**
31
+ * Check if ripgrep is available
32
+ */
33
+ function hasRipgrep() {
34
+ const result = spawnSync('which', ['rg'], { encoding: 'utf-8' });
35
+ return result.status === 0;
36
+ }
37
+ /**
38
+ * Create codebase tools for interview agent
39
+ */
40
+ export function createInterviewTools(projectRoot) {
41
+ return {
42
+ /**
43
+ * Read a file from the project codebase
44
+ */
45
+ read_file: tool({
46
+ description: `Read a file from the project codebase.
47
+ Use this to understand code structure, check implementations, or find patterns.
48
+ Returns file content (truncated if too long).`,
49
+ inputSchema: zodSchema(z.object({
50
+ path: z.string().describe('Relative path from project root (e.g., "src/index.ts")'),
51
+ })),
52
+ execute: async ({ path: filePath }) => {
53
+ const fullPath = validatePath(projectRoot, filePath);
54
+ if (!fullPath) {
55
+ return { error: 'Invalid path: must be within project directory' };
56
+ }
57
+ if (!existsSync(fullPath)) {
58
+ return { error: `File not found: ${filePath}` };
59
+ }
60
+ try {
61
+ const stat = statSync(fullPath);
62
+ if (stat.isDirectory()) {
63
+ return { error: `Path is a directory, not a file: ${filePath}` };
64
+ }
65
+ const content = readFileSync(fullPath, 'utf-8');
66
+ if (content.length > MAX_CONTENT_LENGTH) {
67
+ return {
68
+ content: content.slice(0, MAX_CONTENT_LENGTH),
69
+ truncated: true,
70
+ totalLength: content.length,
71
+ message: `File truncated to ${MAX_CONTENT_LENGTH} characters (total: ${content.length})`,
72
+ };
73
+ }
74
+ return { content, truncated: false };
75
+ }
76
+ catch (error) {
77
+ const msg = error instanceof Error ? error.message : String(error);
78
+ return { error: `Failed to read file: ${msg}` };
79
+ }
80
+ },
81
+ }),
82
+ /**
83
+ * Search for patterns in the codebase
84
+ */
85
+ search_codebase: tool({
86
+ description: `Search for patterns in the codebase using grep.
87
+ Use this to find function definitions, imports, usage patterns, or specific code.
88
+ Returns matching files with line snippets.`,
89
+ inputSchema: zodSchema(z.object({
90
+ pattern: z.string().describe('Search pattern (text or regex)'),
91
+ directory: z.string().optional()
92
+ .describe('Directory to search in (relative to project root). Defaults to entire project'),
93
+ filePattern: z.string().optional()
94
+ .describe('File pattern to match (e.g., "*.ts", "*.tsx")'),
95
+ literal: z.boolean().optional()
96
+ .describe('Use literal search instead of regex (faster for exact strings)'),
97
+ })),
98
+ execute: async ({ pattern, directory, filePattern, literal }) => {
99
+ // Determine search directory
100
+ let searchPath = projectRoot;
101
+ if (directory) {
102
+ const validatedDir = validatePath(projectRoot, directory);
103
+ if (!validatedDir) {
104
+ return { error: 'Invalid search directory: must be within project' };
105
+ }
106
+ if (!existsSync(validatedDir)) {
107
+ return { error: `Directory not found: ${directory}` };
108
+ }
109
+ searchPath = validatedDir;
110
+ }
111
+ try {
112
+ let result;
113
+ if (hasRipgrep()) {
114
+ // Use ripgrep (faster)
115
+ const args = [
116
+ '--line-number',
117
+ '--max-count', '3',
118
+ '--max-filesize', '1M',
119
+ '--no-heading',
120
+ '--glob', '!node_modules',
121
+ '--glob', '!.git',
122
+ '--glob', '!dist',
123
+ '--glob', '!build',
124
+ '--glob', '!*.lock',
125
+ ];
126
+ if (literal)
127
+ args.push('-F');
128
+ if (filePattern)
129
+ args.push('--glob', filePattern);
130
+ args.push('--', pattern, searchPath);
131
+ result = spawnSync('rg', args, {
132
+ encoding: 'utf-8',
133
+ maxBuffer: 1024 * 1024,
134
+ timeout: 30000,
135
+ });
136
+ }
137
+ else {
138
+ // Fallback to grep
139
+ const args = [
140
+ '-rn',
141
+ '--exclude-dir=node_modules',
142
+ '--exclude-dir=.git',
143
+ '--exclude-dir=dist',
144
+ '--exclude-dir=build',
145
+ ];
146
+ if (literal)
147
+ args.push('-F');
148
+ if (filePattern)
149
+ args.push(`--include=${filePattern}`);
150
+ // Use -- to signal end of options, preventing patterns starting with -
151
+ // from being interpreted as grep flags
152
+ args.push('--', pattern, searchPath);
153
+ result = spawnSync('grep', args, {
154
+ encoding: 'utf-8',
155
+ maxBuffer: 1024 * 1024,
156
+ timeout: 30000,
157
+ });
158
+ }
159
+ if (result.error) {
160
+ return { error: `Search failed: ${result.error.message}` };
161
+ }
162
+ // Status 1 means no matches (for both rg and grep)
163
+ if (result.status === 1 || !result.stdout?.trim()) {
164
+ return { matches: [], message: `No matches found for "${pattern}"` };
165
+ }
166
+ // Parse output into structured results
167
+ const lines = result.stdout.trim().split('\n').slice(0, MAX_SEARCH_RESULTS);
168
+ const matches = lines.map(line => {
169
+ // Format: file:line:content
170
+ const colonIndex = line.indexOf(':');
171
+ if (colonIndex === -1)
172
+ return { file: line, line: 0, content: '' };
173
+ const file = relative(projectRoot, line.slice(0, colonIndex));
174
+ const rest = line.slice(colonIndex + 1);
175
+ const lineNumMatch = rest.match(/^(\d+):/);
176
+ if (lineNumMatch) {
177
+ const lineNum = parseInt(lineNumMatch[1], 10);
178
+ const content = rest.slice(lineNumMatch[0].length).trim();
179
+ return { file, line: lineNum, content: content.slice(0, 200) };
180
+ }
181
+ return { file, line: 0, content: rest.slice(0, 200) };
182
+ });
183
+ return {
184
+ matches,
185
+ truncated: lines.length >= MAX_SEARCH_RESULTS,
186
+ message: matches.length > 0
187
+ ? `Found ${matches.length} match(es)`
188
+ : `No matches found for "${pattern}"`,
189
+ };
190
+ }
191
+ catch (error) {
192
+ const msg = error instanceof Error ? error.message : String(error);
193
+ return { error: `Search failed: ${msg}` };
194
+ }
195
+ },
196
+ }),
197
+ /**
198
+ * List files in a directory
199
+ */
200
+ list_directory: tool({
201
+ description: `List files and directories in a path.
202
+ Use this to explore project structure and find files to read.
203
+ Returns names and types (file/directory).`,
204
+ inputSchema: zodSchema(z.object({
205
+ path: z.string().describe('Directory path relative to project root (e.g., "src" or "src/components")'),
206
+ })),
207
+ execute: async ({ path: dirPath }) => {
208
+ const targetPath = dirPath || '.';
209
+ const fullPath = validatePath(projectRoot, targetPath);
210
+ if (!fullPath) {
211
+ return { error: 'Invalid path: must be within project directory' };
212
+ }
213
+ if (!existsSync(fullPath)) {
214
+ return { error: `Directory not found: ${targetPath}` };
215
+ }
216
+ try {
217
+ const stat = statSync(fullPath);
218
+ if (!stat.isDirectory()) {
219
+ return { error: `Path is a file, not a directory: ${targetPath}` };
220
+ }
221
+ const entries = readdirSync(fullPath, { withFileTypes: true });
222
+ // Filter out common non-essential entries
223
+ const filteredEntries = entries.filter(e => {
224
+ const name = e.name;
225
+ // Skip hidden files except .env.example, skip node_modules etc
226
+ if (name === 'node_modules' || name === '.git' || name === 'dist' || name === 'build') {
227
+ return false;
228
+ }
229
+ return !name.startsWith('.') || name === '.env.example';
230
+ });
231
+ const items = filteredEntries.map(e => ({
232
+ name: e.name,
233
+ type: e.isDirectory() ? 'directory' : 'file',
234
+ }));
235
+ // Sort: directories first, then files
236
+ items.sort((a, b) => {
237
+ if (a.type === b.type)
238
+ return a.name.localeCompare(b.name);
239
+ return a.type === 'directory' ? -1 : 1;
240
+ });
241
+ return {
242
+ path: targetPath,
243
+ items,
244
+ count: items.length,
245
+ };
246
+ }
247
+ catch (error) {
248
+ const msg = error instanceof Error ? error.message : String(error);
249
+ return { error: `Failed to list directory: ${msg}` };
250
+ }
251
+ },
252
+ }),
253
+ };
254
+ }
255
+ //# sourceMappingURL=interview-tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interview-tools.js","sourceRoot":"","sources":["../../../src/ai/conversation/interview-tools.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AACrC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC1E,OAAO,EAAQ,QAAQ,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpD,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAE/C,+CAA+C;AAC/C,MAAM,kBAAkB,GAAG,IAAI,CAAC;AAEhC,6BAA6B;AAC7B,MAAM,kBAAkB,GAAG,EAAE,CAAC;AAE9B;;;;GAIG;AACH,SAAS,YAAY,CAAC,WAAmB,EAAE,UAAkB;IAC3D,MAAM,YAAY,GAAG,OAAO,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;IACtD,MAAM,qBAAqB,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;IAEnD,0EAA0E;IAC1E,sEAAsE;IACtE,IAAI,YAAY,KAAK,qBAAqB;QACtC,CAAC,YAAY,CAAC,UAAU,CAAC,qBAAqB,GAAG,GAAG,CAAC,EAAE,CAAC;QAC1D,OAAO,IAAI,CAAC,CAAC,yBAAyB;IACxC,CAAC;IAED,OAAO,YAAY,CAAC;AACtB,CAAC;AAED;;GAEG;AACH,SAAS,UAAU;IACjB,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;IACjE,OAAO,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC;AAC7B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,WAAmB;IACtD,OAAO;QACL;;WAEG;QACH,SAAS,EAAE,IAAI,CAAC;YACd,WAAW,EAAE;;8CAE2B;YACxC,WAAW,EAAE,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC;gBAC9B,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,wDAAwD,CAAC;aACpF,CAAC,CAAC;YACH,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAoB,EAAE,EAAE;gBACtD,MAAM,QAAQ,GAAG,YAAY,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;gBAErD,IAAI,CAAC,QAAQ,EAAE,CAAC;oBACd,OAAO,EAAE,KAAK,EAAE,gDAAgD,EAAE,CAAC;gBACrE,CAAC;gBAED,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;oBAC1B,OAAO,EAAE,KAAK,EAAE,mBAAmB,QAAQ,EAAE,EAAE,CAAC;gBAClD,CAAC;gBAED,IAAI,CAAC;oBACH,MAAM,IAAI,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC;oBAChC,IAAI,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;wBACvB,OAAO,EAAE,KAAK,EAAE,oCAAoC,QAAQ,EAAE,EAAE,CAAC;oBACnE,CAAC;oBAED,MAAM,OAAO,GAAG,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;oBAEhD,IAAI,OAAO,CAAC,MAAM,GAAG,kBAAkB,EAAE,CAAC;wBACxC,OAAO;4BACL,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,kBAAkB,CAAC;4BAC7C,SAAS,EAAE,IAAI;4BACf,WAAW,EAAE,OAAO,CAAC,MAAM;4BAC3B,OAAO,EAAE,qBAAqB,kBAAkB,uBAAuB,OAAO,CAAC,MAAM,GAAG;yBACzF,CAAC;oBACJ,CAAC;oBAED,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;gBACvC,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,MAAM,GAAG,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;oBACnE,OAAO,EAAE,KAAK,EAAE,wBAAwB,GAAG,EAAE,EAAE,CAAC;gBAClD,CAAC;YACH,CAAC;SACF,CAAC;QAEF;;WAEG;QACH,eAAe,EAAE,IAAI,CAAC;YACpB,WAAW,EAAE;;2CAEwB;YACrC,WAAW,EAAE,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC;gBAC9B,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,gCAAgC,CAAC;gBAC9D,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;qBAC7B,QAAQ,CAAC,+EAA+E,CAAC;gBAC5F,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;qBAC/B,QAAQ,CAAC,+CAA+C,CAAC;gBAC5D,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;qBAC5B,QAAQ,CAAC,gEAAgE,CAAC;aAC9E,CAAC,CAAC;YACH,OAAO,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,OAAO,EAKzD,EAAE,EAAE;gBACH,6BAA6B;gBAC7B,IAAI,UAAU,GAAG,WAAW,CAAC;gBAC7B,IAAI,SAAS,EAAE,CAAC;oBACd,MAAM,YAAY,GAAG,YAAY,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;oBAC1D,IAAI,CAAC,YAAY,EAAE,CAAC;wBAClB,OAAO,EAAE,KAAK,EAAE,kDAAkD,EAAE,CAAC;oBACvE,CAAC;oBACD,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;wBAC9B,OAAO,EAAE,KAAK,EAAE,wBAAwB,SAAS,EAAE,EAAE,CAAC;oBACxD,CAAC;oBACD,UAAU,GAAG,YAAY,CAAC;gBAC5B,CAAC;gBAED,IAAI,CAAC;oBACH,IAAI,MAAM,CAAC;oBAEX,IAAI,UAAU,EAAE,EAAE,CAAC;wBACjB,uBAAuB;wBACvB,MAAM,IAAI,GAAa;4BACrB,eAAe;4BACf,aAAa,EAAE,GAAG;4BAClB,gBAAgB,EAAE,IAAI;4BACtB,cAAc;4BACd,QAAQ,EAAE,eAAe;4BACzB,QAAQ,EAAE,OAAO;4BACjB,QAAQ,EAAE,OAAO;4BACjB,QAAQ,EAAE,QAAQ;4BAClB,QAAQ,EAAE,SAAS;yBACpB,CAAC;wBAEF,IAAI,OAAO;4BAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;wBAC7B,IAAI,WAAW;4BAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;wBAElD,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;wBAErC,MAAM,GAAG,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE;4BAC7B,QAAQ,EAAE,OAAO;4BACjB,SAAS,EAAE,IAAI,GAAG,IAAI;4BACtB,OAAO,EAAE,KAAK;yBACf,CAAC,CAAC;oBACL,CAAC;yBAAM,CAAC;wBACN,mBAAmB;wBACnB,MAAM,IAAI,GAAa;4BACrB,KAAK;4BACL,4BAA4B;4BAC5B,oBAAoB;4BACpB,oBAAoB;4BACpB,qBAAqB;yBACtB,CAAC;wBAEF,IAAI,OAAO;4BAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;wBAC7B,IAAI,WAAW;4BAAE,IAAI,CAAC,IAAI,CAAC,aAAa,WAAW,EAAE,CAAC,CAAC;wBAEvD,uEAAuE;wBACvE,uCAAuC;wBACvC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;wBAErC,MAAM,GAAG,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE;4BAC/B,QAAQ,EAAE,OAAO;4BACjB,SAAS,EAAE,IAAI,GAAG,IAAI;4BACtB,OAAO,EAAE,KAAK;yBACf,CAAC,CAAC;oBACL,CAAC;oBAED,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;wBACjB,OAAO,EAAE,KAAK,EAAE,kBAAkB,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC;oBAC7D,CAAC;oBAED,mDAAmD;oBACnD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC;wBAClD,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,yBAAyB,OAAO,GAAG,EAAE,CAAC;oBACvE,CAAC;oBAED,uCAAuC;oBACvC,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,kBAAkB,CAAC,CAAC;oBAC5E,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;wBAC/B,4BAA4B;wBAC5B,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;wBACrC,IAAI,UAAU,KAAK,CAAC,CAAC;4BAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;wBAEnE,MAAM,IAAI,GAAG,QAAQ,CAAC,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC;wBAC9D,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC;wBAExC,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;wBAC3C,IAAI,YAAY,EAAE,CAAC;4BACjB,MAAM,OAAO,GAAG,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;4BAC9C,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;4BAC1D,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;wBACjE,CAAC;wBAED,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;oBACxD,CAAC,CAAC,CAAC;oBAEH,OAAO;wBACL,OAAO;wBACP,SAAS,EAAE,KAAK,CAAC,MAAM,IAAI,kBAAkB;wBAC7C,OAAO,EAAE,OAAO,CAAC,MAAM,GAAG,CAAC;4BACzB,CAAC,CAAC,SAAS,OAAO,CAAC,MAAM,YAAY;4BACrC,CAAC,CAAC,yBAAyB,OAAO,GAAG;qBACxC,CAAC;gBACJ,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,MAAM,GAAG,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;oBACnE,OAAO,EAAE,KAAK,EAAE,kBAAkB,GAAG,EAAE,EAAE,CAAC;gBAC5C,CAAC;YACH,CAAC;SACF,CAAC;QAEF;;WAEG;QACH,cAAc,EAAE,IAAI,CAAC;YACnB,WAAW,EAAE;;0CAEuB;YACpC,WAAW,EAAE,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC;gBAC9B,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,2EAA2E,CAAC;aACvG,CAAC,CAAC;YACH,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,EAAoB,EAAE,EAAE;gBACrD,MAAM,UAAU,GAAG,OAAO,IAAI,GAAG,CAAC;gBAClC,MAAM,QAAQ,GAAG,YAAY,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;gBAEvD,IAAI,CAAC,QAAQ,EAAE,CAAC;oBACd,OAAO,EAAE,KAAK,EAAE,gDAAgD,EAAE,CAAC;gBACrE,CAAC;gBAED,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;oBAC1B,OAAO,EAAE,KAAK,EAAE,wBAAwB,UAAU,EAAE,EAAE,CAAC;gBACzD,CAAC;gBAED,IAAI,CAAC;oBACH,MAAM,IAAI,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC;oBAChC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;wBACxB,OAAO,EAAE,KAAK,EAAE,oCAAoC,UAAU,EAAE,EAAE,CAAC;oBACrE,CAAC;oBAED,MAAM,OAAO,GAAG,WAAW,CAAC,QAAQ,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;oBAE/D,0CAA0C;oBAC1C,MAAM,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE;wBACzC,MAAM,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC;wBACpB,+DAA+D;wBAC/D,IAAI,IAAI,KAAK,cAAc,IAAI,IAAI,KAAK,MAAM,IAAI,IAAI,KAAK,MAAM,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;4BACtF,OAAO,KAAK,CAAC;wBACf,CAAC;wBACD,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,IAAI,KAAK,cAAc,CAAC;oBAC1D,CAAC,CAAC,CAAC;oBAEH,MAAM,KAAK,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;wBACtC,IAAI,EAAE,CAAC,CAAC,IAAI;wBACZ,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM;qBAC7C,CAAC,CAAC,CAAC;oBAEJ,sCAAsC;oBACtC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;wBAClB,IAAI,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI;4BAAE,OAAO,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;wBAC3D,OAAO,CAAC,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;oBACzC,CAAC,CAAC,CAAC;oBAEH,OAAO;wBACL,IAAI,EAAE,UAAU;wBAChB,KAAK;wBACL,KAAK,EAAE,KAAK,CAAC,MAAM;qBACpB,CAAC;gBACJ,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,MAAM,GAAG,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;oBACnE,OAAO,EAAE,KAAK,EAAE,6BAA6B,GAAG,EAAE,EAAE,CAAC;gBACvD,CAAC;YACH,CAAC;SACF,CAAC;KACH,CAAC;AACJ,CAAC"}
@@ -1,9 +1,24 @@
1
1
  /**
2
2
  * Spec Generator
3
3
  * AI-powered feature specification generator with interview flow
4
+ * Enhanced with codebase tools and Claude Code-like UX
4
5
  */
5
6
  import type { AIProvider } from '../providers.js';
6
7
  import type { ScanResult } from '../../scanner/types.js';
8
+ /**
9
+ * Session context from /init analysis
10
+ */
11
+ export interface SessionContext {
12
+ entryPoints?: string[];
13
+ keyDirectories?: Record<string, string>;
14
+ commands?: {
15
+ build?: string;
16
+ dev?: string;
17
+ test?: string;
18
+ };
19
+ namingConventions?: string;
20
+ implementationGuidelines?: string[];
21
+ }
7
22
  /**
8
23
  * Spec generator options
9
24
  */
@@ -13,6 +28,12 @@ export interface SpecGeneratorOptions {
13
28
  provider: AIProvider;
14
29
  model: string;
15
30
  scanResult?: ScanResult;
31
+ /** Rich session context from /init */
32
+ sessionContext?: SessionContext;
33
+ /** Tavily API key for web search */
34
+ tavilyApiKey?: string;
35
+ /** Context7 API key for docs lookup */
36
+ context7ApiKey?: string;
16
37
  }
17
38
  /**
18
39
  * Generation phases
@@ -27,7 +48,18 @@ export declare class SpecGenerator {
27
48
  private readonly featureName;
28
49
  private readonly projectRoot;
29
50
  private generatedSpec;
51
+ private questionCount;
52
+ private readonly hasTools;
53
+ private readonly sessionContext?;
30
54
  constructor(options: SpecGeneratorOptions);
55
+ /**
56
+ * Display the current phase header
57
+ */
58
+ private displayHeader;
59
+ /**
60
+ * Display session context at start
61
+ */
62
+ private displayContext;
31
63
  /**
32
64
  * Phase 1: Gather context from URLs/files
33
65
  */
@@ -40,6 +72,10 @@ export declare class SpecGenerator {
40
72
  * Phase 3: Conduct interview
41
73
  */
42
74
  private conductInterview;
75
+ /**
76
+ * Process a user answer and get AI response
77
+ */
78
+ private processAnswer;
43
79
  /**
44
80
  * Phase 4: Generate spec
45
81
  */
@@ -1 +1 @@
1
- {"version":3,"file":"spec-generator.d.ts","sourceRoot":"","sources":["../../../src/ai/conversation/spec-generator.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAMzD;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,UAAU,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,UAAU,CAAC;CACzB;AAED;;GAEG;AACH,KAAK,cAAc,GAAG,SAAS,GAAG,OAAO,GAAG,WAAW,GAAG,YAAY,GAAG,UAAU,CAAC;AA+EpF;;GAEG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,YAAY,CAAsB;IAC1C,OAAO,CAAC,KAAK,CAA6B;IAC1C,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,aAAa,CAAc;gBAEvB,OAAO,EAAE,oBAAoB;IAezC;;OAEG;YACW,aAAa;IA2B3B;;OAEG;YACW,YAAY;IAgC1B;;OAEG;YACW,gBAAgB;IAgD9B;;OAEG;YACW,YAAY;IAsB1B;;;OAGG;IACG,GAAG,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAkCnC;;OAEG;IACH,OAAO,IAAI,MAAM;IAIjB;;OAEG;IACH,QAAQ,IAAI,cAAc;CAG3B"}
1
+ {"version":3,"file":"spec-generator.d.ts","sourceRoot":"","sources":["../../../src/ai/conversation/spec-generator.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AASH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAczD;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxC,QAAQ,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC3D,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,wBAAwB,CAAC,EAAE,MAAM,EAAE,CAAC;CACrC;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,UAAU,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,sCAAsC;IACtC,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,oCAAoC;IACpC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,uCAAuC;IACvC,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED;;GAEG;AACH,KAAK,cAAc,GAAG,SAAS,GAAG,OAAO,GAAG,WAAW,GAAG,YAAY,GAAG,UAAU,CAAC;AAgNpF;;GAEG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,YAAY,CAAsB;IAC1C,OAAO,CAAC,KAAK,CAA6B;IAC1C,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,aAAa,CAAc;IACnC,OAAO,CAAC,aAAa,CAAa;IAClC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA4D;IACrF,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAiB;gBAErC,OAAO,EAAE,oBAAoB;IA0DzC;;OAEG;IACH,OAAO,CAAC,aAAa;IAOrB;;OAEG;IACH,OAAO,CAAC,cAAc;IAWtB;;OAEG;YACW,aAAa;IA6B3B;;OAEG;YACW,YAAY;IAkC1B;;OAEG;YACW,gBAAgB;IAyC9B;;OAEG;YACW,aAAa;IAwB3B;;OAEG;YACW,YAAY;IAuB1B;;;OAGG;IACG,GAAG,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAkCnC;;OAEG;IACH,OAAO,IAAI,MAAM;IAIjB;;OAEG;IACH,QAAQ,IAAI,cAAc;CAG3B"}