thatgfsj-code 0.2.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 (179) hide show
  1. package/.patches/0001-fix-repl-replace-readline-with-inquirer-input-for-ke.patch +279 -0
  2. package/.patches/0002-fix-repl-stream-AI-output-directly-to-stdout-so-term.patch +564 -0
  3. package/.patches/0003-fix-session-break-the-hallucination-loop-in-assistan.patch +194 -0
  4. package/.patches/0004-chore-release-bump-version-to-0.2.1.patch +24 -0
  5. package/LICENSE +21 -0
  6. package/README.md +100 -0
  7. package/ROADMAP.md +107 -0
  8. package/dist/agent/core.d.ts +56 -0
  9. package/dist/agent/core.d.ts.map +1 -0
  10. package/dist/agent/core.js +142 -0
  11. package/dist/agent/core.js.map +1 -0
  12. package/dist/agent/index.d.ts +8 -0
  13. package/dist/agent/index.d.ts.map +1 -0
  14. package/dist/agent/index.js +8 -0
  15. package/dist/agent/index.js.map +1 -0
  16. package/dist/agent/intent.d.ts +36 -0
  17. package/dist/agent/intent.d.ts.map +1 -0
  18. package/dist/agent/intent.js +146 -0
  19. package/dist/agent/intent.js.map +1 -0
  20. package/dist/agent/streaming.d.ts +50 -0
  21. package/dist/agent/streaming.d.ts.map +1 -0
  22. package/dist/agent/streaming.js +110 -0
  23. package/dist/agent/streaming.js.map +1 -0
  24. package/dist/core/ai-engine.d.ts +59 -0
  25. package/dist/core/ai-engine.d.ts.map +1 -0
  26. package/dist/core/ai-engine.js +378 -0
  27. package/dist/core/ai-engine.js.map +1 -0
  28. package/dist/core/cli.d.ts +21 -0
  29. package/dist/core/cli.d.ts.map +1 -0
  30. package/dist/core/cli.js +143 -0
  31. package/dist/core/cli.js.map +1 -0
  32. package/dist/core/config.d.ts +38 -0
  33. package/dist/core/config.d.ts.map +1 -0
  34. package/dist/core/config.js +129 -0
  35. package/dist/core/config.js.map +1 -0
  36. package/dist/core/context-compactor.d.ts +54 -0
  37. package/dist/core/context-compactor.d.ts.map +1 -0
  38. package/dist/core/context-compactor.js +197 -0
  39. package/dist/core/context-compactor.js.map +1 -0
  40. package/dist/core/hooks.d.ts +75 -0
  41. package/dist/core/hooks.d.ts.map +1 -0
  42. package/dist/core/hooks.js +146 -0
  43. package/dist/core/hooks.js.map +1 -0
  44. package/dist/core/permissions.d.ts +52 -0
  45. package/dist/core/permissions.d.ts.map +1 -0
  46. package/dist/core/permissions.js +237 -0
  47. package/dist/core/permissions.js.map +1 -0
  48. package/dist/core/session.d.ts +54 -0
  49. package/dist/core/session.d.ts.map +1 -0
  50. package/dist/core/session.js +147 -0
  51. package/dist/core/session.js.map +1 -0
  52. package/dist/core/skills.d.ts +60 -0
  53. package/dist/core/skills.d.ts.map +1 -0
  54. package/dist/core/skills.js +175 -0
  55. package/dist/core/skills.js.map +1 -0
  56. package/dist/core/state.d.ts +60 -0
  57. package/dist/core/state.d.ts.map +1 -0
  58. package/dist/core/state.js +106 -0
  59. package/dist/core/state.js.map +1 -0
  60. package/dist/core/subagent.d.ts +68 -0
  61. package/dist/core/subagent.d.ts.map +1 -0
  62. package/dist/core/subagent.js +142 -0
  63. package/dist/core/subagent.js.map +1 -0
  64. package/dist/core/system-prompt.d.ts +40 -0
  65. package/dist/core/system-prompt.d.ts.map +1 -0
  66. package/dist/core/system-prompt.js +138 -0
  67. package/dist/core/system-prompt.js.map +1 -0
  68. package/dist/core/tool-registry.d.ts +53 -0
  69. package/dist/core/tool-registry.d.ts.map +1 -0
  70. package/dist/core/tool-registry.js +138 -0
  71. package/dist/core/tool-registry.js.map +1 -0
  72. package/dist/core/types.d.ts +206 -0
  73. package/dist/core/types.d.ts.map +1 -0
  74. package/dist/core/types.js +127 -0
  75. package/dist/core/types.js.map +1 -0
  76. package/dist/index.d.ts +7 -0
  77. package/dist/index.d.ts.map +1 -0
  78. package/dist/index.js +481 -0
  79. package/dist/index.js.map +1 -0
  80. package/dist/mcp/client.d.ts +83 -0
  81. package/dist/mcp/client.d.ts.map +1 -0
  82. package/dist/mcp/client.js +267 -0
  83. package/dist/mcp/client.js.map +1 -0
  84. package/dist/repl/index.d.ts +8 -0
  85. package/dist/repl/index.d.ts.map +1 -0
  86. package/dist/repl/index.js +8 -0
  87. package/dist/repl/index.js.map +1 -0
  88. package/dist/repl/input.d.ts +61 -0
  89. package/dist/repl/input.d.ts.map +1 -0
  90. package/dist/repl/input.js +127 -0
  91. package/dist/repl/input.js.map +1 -0
  92. package/dist/repl/loop.d.ts +53 -0
  93. package/dist/repl/loop.d.ts.map +1 -0
  94. package/dist/repl/loop.js +241 -0
  95. package/dist/repl/loop.js.map +1 -0
  96. package/dist/repl/output.d.ts +105 -0
  97. package/dist/repl/output.d.ts.map +1 -0
  98. package/dist/repl/output.js +197 -0
  99. package/dist/repl/output.js.map +1 -0
  100. package/dist/repl/welcome.d.ts +68 -0
  101. package/dist/repl/welcome.d.ts.map +1 -0
  102. package/dist/repl/welcome.js +249 -0
  103. package/dist/repl/welcome.js.map +1 -0
  104. package/dist/tools/file.d.ts +46 -0
  105. package/dist/tools/file.d.ts.map +1 -0
  106. package/dist/tools/file.js +100 -0
  107. package/dist/tools/file.js.map +1 -0
  108. package/dist/tools/git.d.ts +52 -0
  109. package/dist/tools/git.d.ts.map +1 -0
  110. package/dist/tools/git.js +112 -0
  111. package/dist/tools/git.js.map +1 -0
  112. package/dist/tools/index.d.ts +22 -0
  113. package/dist/tools/index.d.ts.map +1 -0
  114. package/dist/tools/index.js +43 -0
  115. package/dist/tools/index.js.map +1 -0
  116. package/dist/tools/search.d.ts +36 -0
  117. package/dist/tools/search.d.ts.map +1 -0
  118. package/dist/tools/search.js +223 -0
  119. package/dist/tools/search.js.map +1 -0
  120. package/dist/tools/shell.d.ts +57 -0
  121. package/dist/tools/shell.d.ts.map +1 -0
  122. package/dist/tools/shell.js +153 -0
  123. package/dist/tools/shell.js.map +1 -0
  124. package/dist/utils/diff-preview.d.ts +42 -0
  125. package/dist/utils/diff-preview.d.ts.map +1 -0
  126. package/dist/utils/diff-preview.js +174 -0
  127. package/dist/utils/diff-preview.js.map +1 -0
  128. package/dist/utils/index.d.ts +8 -0
  129. package/dist/utils/index.d.ts.map +1 -0
  130. package/dist/utils/index.js +8 -0
  131. package/dist/utils/index.js.map +1 -0
  132. package/dist/utils/memory.d.ts +81 -0
  133. package/dist/utils/memory.d.ts.map +1 -0
  134. package/dist/utils/memory.js +186 -0
  135. package/dist/utils/memory.js.map +1 -0
  136. package/dist/utils/project-context.d.ts +62 -0
  137. package/dist/utils/project-context.d.ts.map +1 -0
  138. package/dist/utils/project-context.js +197 -0
  139. package/dist/utils/project-context.js.map +1 -0
  140. package/docs/API_KEY_GUIDE.md +236 -0
  141. package/docs/FAQ.md +182 -0
  142. package/install.bat +63 -0
  143. package/install.ps1 +238 -0
  144. package/install.sh +113 -0
  145. package/package.json +36 -0
  146. package/src/agent/core.ts +179 -0
  147. package/src/agent/index.ts +8 -0
  148. package/src/agent/intent.ts +181 -0
  149. package/src/agent/streaming.ts +132 -0
  150. package/src/core/ai-engine.ts +437 -0
  151. package/src/core/cli.ts +171 -0
  152. package/src/core/config.ts +147 -0
  153. package/src/core/context-compactor.ts +245 -0
  154. package/src/core/hooks.ts +196 -0
  155. package/src/core/permissions.ts +308 -0
  156. package/src/core/session.ts +165 -0
  157. package/src/core/skills.ts +208 -0
  158. package/src/core/state.ts +120 -0
  159. package/src/core/subagent.ts +195 -0
  160. package/src/core/system-prompt.ts +163 -0
  161. package/src/core/tool-registry.ts +157 -0
  162. package/src/core/types.ts +280 -0
  163. package/src/index.ts +544 -0
  164. package/src/mcp/client.ts +330 -0
  165. package/src/repl/index.ts +8 -0
  166. package/src/repl/input.ts +139 -0
  167. package/src/repl/loop.ts +280 -0
  168. package/src/repl/output.ts +222 -0
  169. package/src/repl/welcome.ts +296 -0
  170. package/src/tools/file.ts +117 -0
  171. package/src/tools/git.ts +132 -0
  172. package/src/tools/index.ts +48 -0
  173. package/src/tools/search.ts +263 -0
  174. package/src/tools/shell.ts +181 -0
  175. package/src/utils/diff-preview.ts +202 -0
  176. package/src/utils/index.ts +8 -0
  177. package/src/utils/memory.ts +223 -0
  178. package/src/utils/project-context.ts +207 -0
  179. package/tsconfig.json +19 -0
@@ -0,0 +1,127 @@
1
+ /**
2
+ * Type definitions for Thatgfsj Code
3
+ * S02: Enhanced Tool interface with Builder pattern, inputSchema, and metadata
4
+ */
5
+ /**
6
+ * S02: Tool Builder — fluent API to construct tools
7
+ */
8
+ export class ToolBuilder {
9
+ _name = '';
10
+ _description = '';
11
+ _parameters = [];
12
+ _inputSchema = { type: 'object', properties: {} };
13
+ _metadata = {};
14
+ _fn;
15
+ name(n) { this._name = n; return this; }
16
+ description(d) { this._description = d; return this; }
17
+ param(p) {
18
+ this._parameters.push(p);
19
+ this._inputSchema.properties[p.name] = {
20
+ type: p.type,
21
+ description: p.description,
22
+ default: p.default,
23
+ enum: p.enum
24
+ };
25
+ return this;
26
+ }
27
+ stringParam(name, description, required = true, defaultVal) {
28
+ return this.param({ name, type: 'string', description, required, default: defaultVal });
29
+ }
30
+ numberParam(name, description, required = true, defaultVal) {
31
+ return this.param({ name, type: 'number', description, required, default: defaultVal });
32
+ }
33
+ booleanParam(name, description, required = false, defaultVal) {
34
+ return this.param({ name, type: 'boolean', description, required, default: defaultVal });
35
+ }
36
+ required(...names) {
37
+ this._inputSchema.required = names;
38
+ return this;
39
+ }
40
+ meta(m) {
41
+ this._metadata = { ...this._metadata, ...m };
42
+ return this;
43
+ }
44
+ permissions(...perms) {
45
+ this._metadata.permissions = perms;
46
+ return this;
47
+ }
48
+ tags(...t) {
49
+ this._metadata.tags = t;
50
+ return this;
51
+ }
52
+ handle(fn) {
53
+ this._fn = fn;
54
+ return this;
55
+ }
56
+ build() {
57
+ if (!this._name || !this._fn) {
58
+ throw new Error('Tool name and handler are required');
59
+ }
60
+ return {
61
+ name: this._name,
62
+ description: this._description,
63
+ parameters: this._parameters,
64
+ inputSchema: this._inputSchema,
65
+ metadata: this._metadata,
66
+ execute: this._fn
67
+ };
68
+ }
69
+ }
70
+ // Provider configurations
71
+ export const PROVIDERS = {
72
+ minimax: {
73
+ name: 'MiniMax',
74
+ baseUrl: 'https://api.minimax.io/anthropic/v1',
75
+ defaultModel: 'MiniMax-M2.5',
76
+ envKeys: ['MINIMAX_API_KEY', 'OPENAI_API_KEY']
77
+ },
78
+ siliconflow: {
79
+ name: 'SiliconFlow (硅基流动)',
80
+ baseUrl: 'https://api.siliconflow.cn/v1',
81
+ defaultModel: 'Qwen/Qwen2.5-7B-Instruct',
82
+ envKeys: ['SILICONFLOW_API_KEY', 'OPENAI_API_KEY']
83
+ },
84
+ openai: {
85
+ name: 'OpenAI',
86
+ baseUrl: 'https://api.openai.com/v1',
87
+ defaultModel: 'gpt-4o-mini',
88
+ envKeys: ['OPENAI_API_KEY']
89
+ },
90
+ anthropic: {
91
+ name: 'Anthropic',
92
+ baseUrl: 'https://api.anthropic.com/v1',
93
+ defaultModel: 'claude-3-haiku-20240307',
94
+ envKeys: ['ANTHROPIC_API_KEY']
95
+ },
96
+ ollama: {
97
+ name: 'Ollama (Local)',
98
+ baseUrl: process.env.OLLAMA_BASE_URL || 'http://localhost:11434',
99
+ defaultModel: 'llama2',
100
+ envKeys: []
101
+ },
102
+ gemini: {
103
+ name: 'Google Gemini',
104
+ baseUrl: 'https://generativelanguage.googleapis.com/v1beta',
105
+ defaultModel: 'gemini-1.5-flash',
106
+ envKeys: ['GEMINI_API_KEY']
107
+ },
108
+ kimi: {
109
+ name: 'Kimi (Moonshot AI)',
110
+ baseUrl: 'https://api.moonshot.cn/v1',
111
+ defaultModel: 'moonshot-v1-8k',
112
+ envKeys: ['KIMI_API_KEY', 'MOONSHOT_API_KEY']
113
+ },
114
+ deepseek: {
115
+ name: 'DeepSeek',
116
+ baseUrl: 'https://api.deepseek.com/v1',
117
+ defaultModel: 'deepseek-chat',
118
+ envKeys: ['DEEPSEEK_API_KEY']
119
+ },
120
+ ernie: {
121
+ name: 'Baidu ERNIE (文心一言)',
122
+ baseUrl: 'https://aip.baidubce.com/rpc/2.0/ai_custom/v1',
123
+ defaultModel: 'ernie-4.0-8k',
124
+ envKeys: ['ERNIE_API_KEY', 'BAIDU_API_KEY']
125
+ }
126
+ };
127
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Thatgfsj Code - AI Coding Assistant
4
+ * Claude Code-like interactive CLI
5
+ */
6
+ export {};
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA;;;GAGG"}
package/dist/index.js ADDED
@@ -0,0 +1,481 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Thatgfsj Code - AI Coding Assistant
4
+ * Claude Code-like interactive CLI
5
+ */
6
+ // 强制 UTF-8 编码 (Windows) - 必须在任何输出之前
7
+ if (process.platform === 'win32') {
8
+ try {
9
+ // 执行 chcp 65001 设置代码页
10
+ require('child_process').execSync('chcp 65001', { stdio: 'ignore', windowsHide: true });
11
+ }
12
+ catch { }
13
+ }
14
+ import { program } from 'commander';
15
+ import chalk from 'chalk';
16
+ import ora from 'ora';
17
+ import { fileURLToPath } from 'url';
18
+ import { dirname, join } from 'path';
19
+ import { existsSync, readdirSync, statSync } from 'fs';
20
+ import { AIEngine } from './core/ai-engine.js';
21
+ import { ToolRegistry } from './core/tool-registry.js';
22
+ import { SessionManager } from './core/session.js';
23
+ import { ConfigManager } from './core/config.js';
24
+ import { FileTool, ShellTool, GitTool, SearchTool } from './tools/index.js';
25
+ import { WelcomeScreen } from './repl/welcome.js';
26
+ import { REPLLoop } from './repl/loop.js';
27
+ const __filename = fileURLToPath(import.meta.url);
28
+ const __dirname = dirname(__filename);
29
+ // ============== Global Error Handling ==============
30
+ process.on('uncaughtException', (error) => {
31
+ console.error(chalk.red('\n❌ Error:'), error.message);
32
+ process.exit(1);
33
+ });
34
+ process.on('unhandledRejection', (reason) => {
35
+ console.error(chalk.red('\n❌ Error:'), reason);
36
+ process.exit(1);
37
+ });
38
+ // ============== CLI Program ==============
39
+ // Add init command
40
+ program
41
+ .command('init')
42
+ .description('初始化配置/设置向导')
43
+ .action(async () => {
44
+ const { WelcomeScreen } = await import('./repl/welcome.js');
45
+ await WelcomeScreen.interactiveSetup();
46
+ });
47
+ // Add explain command
48
+ program
49
+ .command('explain')
50
+ .description('解释代码含义 (Explain code in plain language)')
51
+ .argument('[file or code]', '要解释的代码或文件路径')
52
+ .option('-f, --file <path>', '从文件读取代码')
53
+ .action(async (code, options) => {
54
+ await executeExplain(code, options);
55
+ });
56
+ // Add debug command
57
+ program
58
+ .command('debug')
59
+ .description('Debug 代码问题 (Find and fix bugs)')
60
+ .argument('[file or code]', '需要调试的代码或文件路径')
61
+ .option('-f, --file <path>', '从文件读取代码')
62
+ .option('-e, --error <message>', '附加的错误信息')
63
+ .action(async (code, options) => {
64
+ await executeDebug(code, options);
65
+ });
66
+ // Add chat command (simple Q&A)
67
+ program
68
+ .command('chat')
69
+ .description('与 AI 问答 (Simple Q&A about your project)')
70
+ .argument('[question]', '问题')
71
+ .action(async (question) => {
72
+ await executeChat(question);
73
+ });
74
+ // Add template command
75
+ program
76
+ .command('template')
77
+ .description('代码模板生成 (Generate common code templates)')
78
+ .argument('[type]', '模板类型: react, vue, express, python-script, api-client, etc.')
79
+ .option('-n, --name <name>', '项目/组件名称')
80
+ .option('-o, --output <dir>', '输出目录')
81
+ .action(async (type, options) => {
82
+ await executeTemplate(type, options);
83
+ });
84
+ program
85
+ .name('gfcode')
86
+ .description('🤖 AI Coding Assistant - Like Claude Code')
87
+ .version('0.2.0')
88
+ .argument('[prompt]', 'Task to execute (omit to start interactive mode)')
89
+ .option('-i, --interactive', 'Start interactive mode')
90
+ .option('-s, --stream', 'Stream output')
91
+ .option('-m, --model <model>', 'Specify model')
92
+ .option('--no-auto', 'Disable auto-read project files')
93
+ .action(async (prompt, options) => {
94
+ // Check for API key and show welcome if needed
95
+ const { WelcomeScreen } = await import('./repl/welcome.js');
96
+ const hasApiKey = checkApiKey();
97
+ if (!hasApiKey) {
98
+ WelcomeScreen.show();
99
+ }
100
+ // Default to interactive mode if no prompt provided
101
+ if (!prompt && !options.interactive) {
102
+ await startInteractive();
103
+ }
104
+ else if (prompt) {
105
+ await executeTask(prompt, options);
106
+ }
107
+ else {
108
+ await startInteractive();
109
+ }
110
+ });
111
+ // Helper to check API key
112
+ function checkApiKey() {
113
+ return !!(process.env.SILICONFLOW_API_KEY ||
114
+ process.env.OPENAI_API_KEY ||
115
+ process.env.MINIMAX_API_KEY ||
116
+ process.env.ANTHROPIC_API_KEY ||
117
+ process.env.GEMINI_API_KEY ||
118
+ process.env.KIMI_API_KEY ||
119
+ process.env.MOONSHOT_API_KEY ||
120
+ process.env.DEEPSEEK_API_KEY ||
121
+ process.env.OLLAMA_BASE_URL);
122
+ }
123
+ // Parse
124
+ program.parse(process.argv);
125
+ // ============== Core Functions ==============
126
+ /**
127
+ * Get project context
128
+ */
129
+ function getProjectContext() {
130
+ const cwd = process.cwd();
131
+ const info = [];
132
+ try {
133
+ // Package info
134
+ const pkgPath = join(cwd, 'package.json');
135
+ if (existsSync(pkgPath)) {
136
+ info.push(`📦 Project: ${cwd}`);
137
+ const { readFileSync } = require('fs');
138
+ const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8'));
139
+ info.push(` Name: ${pkg.name || 'unknown'}`);
140
+ if (pkg.dependencies && Object.keys(pkg.dependencies).length > 0) {
141
+ info.push(` Deps: ${Object.keys(pkg.dependencies).length} packages`);
142
+ }
143
+ }
144
+ else {
145
+ info.push(`📁 Working dir: ${cwd}`);
146
+ }
147
+ // Count files
148
+ let fileCount = 0;
149
+ const countFiles = (dir) => {
150
+ try {
151
+ const items = readdirSync(dir);
152
+ for (const item of items) {
153
+ if (item === 'node_modules' || item === '.git')
154
+ continue;
155
+ const fullPath = join(dir, item);
156
+ const stat = statSync(fullPath);
157
+ if (stat.isDirectory()) {
158
+ countFiles(fullPath);
159
+ }
160
+ else if (/\.(ts|js|py|go|rs|java|cpp|c|h)$/.test(item)) {
161
+ fileCount++;
162
+ }
163
+ }
164
+ }
165
+ catch { }
166
+ };
167
+ countFiles(cwd);
168
+ if (fileCount > 0) {
169
+ info.push(` Files: ${fileCount} code files`);
170
+ }
171
+ }
172
+ catch { }
173
+ return info.join('\n');
174
+ }
175
+ /**
176
+ * Execute a task (Claude Code style)
177
+ */
178
+ async function executeTask(prompt, options) {
179
+ console.log(chalk.cyan('\n🤖 Thatgfsj Code\n'));
180
+ console.log(chalk.gray(getProjectContext()));
181
+ console.log(chalk.gray('─'.repeat(40)));
182
+ console.log(chalk.cyan('\n> ') + prompt + '\n');
183
+ try {
184
+ const config = await ConfigManager.load();
185
+ if (options.model)
186
+ config.model = options.model;
187
+ const ai = new AIEngine(config);
188
+ const session = new SessionManager();
189
+ const registry = new ToolRegistry();
190
+ // Register tools - all available tools
191
+ const shellTool = new ShellTool();
192
+ const fileTool = new FileTool();
193
+ const gitTool = new GitTool();
194
+ const searchTool = new SearchTool();
195
+ ai.registerTool(shellTool);
196
+ ai.registerTool(fileTool);
197
+ ai.registerTool(gitTool);
198
+ ai.registerTool(searchTool);
199
+ // System prompt - Claude Code style
200
+ const systemPrompt = `You are Thatgfsj Code, an AI coding assistant like Claude Code.
201
+ You can read files, write files, and execute shell commands to complete coding tasks.
202
+
203
+ When working on a task:
204
+ 1. First understand what files are involved
205
+ 2. Read necessary files to understand the codebase
206
+ 3. Make changes
207
+ 4. Verify the changes work
208
+
209
+ Be concise but thorough. Show your reasoning.`;
210
+ session.addMessage('system', systemPrompt);
211
+ session.addMessage('user', prompt);
212
+ const spinner = ora(chalk.gray('Thinking...')).start();
213
+ let fullResponse = '';
214
+ for await (const chunk of ai.chatStream(session.getMessages())) {
215
+ spinner.stop();
216
+ process.stdout.write(chunk);
217
+ fullResponse += chunk;
218
+ }
219
+ console.log(chalk.gray('\n' + '─'.repeat(40)));
220
+ }
221
+ catch (error) {
222
+ console.error(chalk.red(`\n❌ Error: ${error.message}`));
223
+ process.exit(1);
224
+ }
225
+ }
226
+ /**
227
+ * Handle model switch in interactive mode
228
+ * (Not invoked from startInteractive anymore — REPLLoop handles it via /model.)
229
+ * Kept for backwards compatibility with any callers.
230
+ */
231
+ async function handleModelSwitch(_rl, currentConfig) {
232
+ console.log(chalk.cyan('\n切换模型...\n'));
233
+ const models = WelcomeScreen.getModelsForProvider(currentConfig.provider || 'siliconflow');
234
+ console.log(chalk.gray('可用模型:\n'));
235
+ models.forEach((model, idx) => {
236
+ const selected = model.id === currentConfig.model ? ' ✓' : '';
237
+ console.log(chalk.gray(` ${idx + 1}. ${model.name} - ${model.desc}${selected}`));
238
+ });
239
+ console.log(chalk.yellow('\n(自动切换已禁用,请编辑 ~/.thatgfsj/config.json 修改 model)\n'));
240
+ }
241
+ /**
242
+ * Start interactive mode (Claude Code style)
243
+ *
244
+ * 委托给 REPLLoop,它使用 @inquirer/input,支持方向键(含数字小键盘)、行内
245
+ * 编辑、命令历史、可滚动流式输出。原生 readline 在 Windows 终端下对小键盘
246
+ * 方向键的 ANSI 转义序列不友好 (Bug #1),所以这里不再直接用 readline。
247
+ */
248
+ async function startInteractive() {
249
+ console.log(chalk.cyan('\n🤖 Thatgfsj Code - Interactive Mode\n'));
250
+ console.log(chalk.gray(getProjectContext()));
251
+ console.log(chalk.gray('─'.repeat(40)));
252
+ console.log(chalk.gray('\nCommands:'));
253
+ console.log(chalk.gray(' exit, Ctrl+C - Quit'));
254
+ console.log(chalk.gray(' clear - Clear screen'));
255
+ console.log(chalk.gray(' context - Show project context'));
256
+ console.log(chalk.gray(' history - Show command history'));
257
+ console.log(chalk.gray(' help - Show all commands'));
258
+ console.log(chalk.gray('\n' + '─'.repeat(40) + '\n'));
259
+ try {
260
+ const repl = new REPLLoop();
261
+ await repl.start();
262
+ }
263
+ catch (error) {
264
+ console.error(chalk.red(`\n❌ Failed to start: ${error.message}`));
265
+ process.exit(1);
266
+ }
267
+ }
268
+ /**
269
+ * Execute explain command - explain code in plain language
270
+ */
271
+ async function executeExplain(code, options) {
272
+ let codeContent = code;
273
+ // Read from file if specified
274
+ if (options.file) {
275
+ try {
276
+ const { readFileSync } = await import('fs');
277
+ codeContent = readFileSync(options.file, 'utf-8');
278
+ console.log(chalk.gray(`📄 Reading from: ${options.file}\n`));
279
+ }
280
+ catch (error) {
281
+ console.error(chalk.red(`❌ 无法读取文件: ${error.message}`));
282
+ process.exit(1);
283
+ }
284
+ }
285
+ if (!codeContent) {
286
+ console.error(chalk.red('❌ 请提供要解释的代码或使用 -f <file> 指定文件'));
287
+ console.log(chalk.gray('用法: gfcode explain "代码" 或 gfcode explain -f path/to/file'));
288
+ process.exit(1);
289
+ }
290
+ console.log(chalk.cyan('\n📖 Thatgfsj Code - 代码解释\n'));
291
+ console.log(chalk.gray('─'.repeat(40)));
292
+ console.log(chalk.gray('\n📝 要解释的代码:\n'));
293
+ console.log(chalk.white(codeContent.slice(0, 500) + (codeContent.length > 500 ? '...' : '')));
294
+ console.log(chalk.gray('\n' + '─'.repeat(40)));
295
+ try {
296
+ const config = await ConfigManager.load();
297
+ const ai = new AIEngine(config);
298
+ const prompt = `请用通俗易懂的语言解释以下代码的功能和工作原理。
299
+ 如果代码有问题或可以优化,也请指出。
300
+
301
+ \`\`\`
302
+ ${codeContent}
303
+ \`\`\`
304
+
305
+ 请用中文回复,解释要清晰详细,适合编程新手理解。`;
306
+ const spinner = ora(chalk.gray('AI 正在分析代码...')).start();
307
+ const response = await ai.chat([
308
+ { role: 'system', content: '你是一个耐心的编程老师,善于用通俗易懂的语言解释代码。' },
309
+ { role: 'user', content: prompt }
310
+ ]);
311
+ spinner.stop();
312
+ console.log(chalk.cyan('\n💡 解释结果:\n'));
313
+ console.log(chalk.white(response.content));
314
+ }
315
+ catch (error) {
316
+ console.error(chalk.red(`\n❌ 解释失败: ${error.message}`));
317
+ process.exit(1);
318
+ }
319
+ }
320
+ /**
321
+ * Execute debug command - find and fix bugs
322
+ */
323
+ async function executeDebug(code, options) {
324
+ let codeContent = code;
325
+ // Read from file if specified
326
+ if (options.file) {
327
+ try {
328
+ const { readFileSync } = await import('fs');
329
+ codeContent = readFileSync(options.file, 'utf-8');
330
+ console.log(chalk.gray(`📄 Reading from: ${options.file}\n`));
331
+ }
332
+ catch (error) {
333
+ console.error(chalk.red(`❌ 无法读取文件: ${error.message}`));
334
+ process.exit(1);
335
+ }
336
+ }
337
+ if (!codeContent) {
338
+ console.error(chalk.red('❌ 请提供要调试的代码或使用 -f <file> 指定文件'));
339
+ console.log(chalk.gray('用法: gfcode debug "代码" 或 gfcode debug -f path/to/file'));
340
+ process.exit(1);
341
+ }
342
+ console.log(chalk.cyan('\n🔧 Thatgfsj Code - 代码调试\n'));
343
+ console.log(chalk.gray('─'.repeat(40)));
344
+ if (options.error) {
345
+ console.log(chalk.yellow('\n⚠️ 附加的错误信息:'));
346
+ console.log(chalk.red(options.error));
347
+ }
348
+ console.log(chalk.gray('\n📝 待调试的代码:\n'));
349
+ console.log(chalk.white(codeContent.slice(0, 500) + (codeContent.length > 500 ? '...' : '')));
350
+ console.log(chalk.gray('\n' + '─'.repeat(40)));
351
+ try {
352
+ const config = await ConfigManager.load();
353
+ const ai = new AIEngine(config);
354
+ const errorInfo = options.error ? `\n附加的错误信息: ${options.error}` : '';
355
+ const prompt = `请分析以下代码,找出潜在的问题和 bug,并给出修复建议。
356
+
357
+ \`\`\`
358
+ ${codeContent}
359
+ \`\`\`
360
+ ${errorInfo}
361
+
362
+ 请用中文回复,包括:
363
+ 1. 发现的问题列表
364
+ 2. 问题的原因分析
365
+ 3. 修复后的代码
366
+ 4. 预防此类问题的建议`;
367
+ const spinner = ora(chalk.gray('AI 正在分析代码...')).start();
368
+ const response = await ai.chat([
369
+ { role: 'system', content: '你是一个专业的代码调试专家,善于找出 bug 并提供修复方案。' },
370
+ { role: 'user', content: prompt }
371
+ ]);
372
+ spinner.stop();
373
+ console.log(chalk.cyan('\n🔍 调试结果:\n'));
374
+ console.log(chalk.white(response.content));
375
+ }
376
+ catch (error) {
377
+ console.error(chalk.red(`\n❌ 调试失败: ${error.message}`));
378
+ process.exit(1);
379
+ }
380
+ }
381
+ /**
382
+ * Execute chat command - simple Q&A about the project
383
+ */
384
+ async function executeChat(question) {
385
+ if (!question) {
386
+ console.error(chalk.red('❌ 请提供问题'));
387
+ console.log(chalk.gray('用法: gfcode chat "你的问题"'));
388
+ process.exit(1);
389
+ }
390
+ console.log(chalk.cyan('\n💬 Thatgfsj Code - 问答\n'));
391
+ console.log(chalk.gray('─'.repeat(40)));
392
+ console.log(chalk.cyan('\n❓ 问题: ') + question + '\n');
393
+ try {
394
+ const config = await ConfigManager.load();
395
+ const ai = new AIEngine(config);
396
+ // Get project context
397
+ const context = getProjectContext();
398
+ const prompt = `你是一个专业的编程助手。请回答用户的问题。
399
+
400
+ 项目上下文:
401
+ ${context}
402
+
403
+ 用户问题: ${question}
404
+
405
+ 请用中文回答,如果涉及到代码,请给出完整的代码示例。`;
406
+ const spinner = ora(chalk.gray('AI 正在思考...')).start();
407
+ const response = await ai.chat([
408
+ { role: 'system', content: '你是一个专业、友好的编程助手,善于用通俗易懂的语言回答问题。' },
409
+ { role: 'user', content: prompt }
410
+ ]);
411
+ spinner.stop();
412
+ console.log(chalk.cyan('\n💡 回答:\n'));
413
+ console.log(chalk.white(response.content));
414
+ }
415
+ catch (error) {
416
+ console.error(chalk.red(`\n❌ 问答失败: ${error.message}`));
417
+ process.exit(1);
418
+ }
419
+ }
420
+ /**
421
+ * Execute template command - generate code templates
422
+ */
423
+ async function executeTemplate(type, options) {
424
+ if (!type) {
425
+ console.error(chalk.red('❌ 请指定模板类型'));
426
+ console.log(chalk.gray('\n可用模板类型:'));
427
+ console.log(chalk.gray(' react - React 组件'));
428
+ console.log(chalk.gray(' vue - Vue 3 组件'));
429
+ console.log(chalk.gray(' express - Express API'));
430
+ console.log(chalk.gray(' python - Python 脚本'));
431
+ console.log(chalk.gray(' api-client - API 客户端'));
432
+ console.log(chalk.gray(' component - 通用组件'));
433
+ console.log(chalk.gray('\n用法: gfcode template react -n MyComponent'));
434
+ process.exit(1);
435
+ }
436
+ const name = options.name || 'MyProject';
437
+ const output = options.output || '.';
438
+ console.log(chalk.cyan('\n📦 Thatgfsj Code - 代码模板\n'));
439
+ console.log(chalk.gray('─'.repeat(40)));
440
+ console.log(chalk.gray(`模板类型: ${type}`));
441
+ console.log(chalk.gray(`项目名称: ${name}`));
442
+ console.log(chalk.gray(`输出目录: ${output}\n`));
443
+ try {
444
+ const config = await ConfigManager.load();
445
+ const ai = new AIEngine(config);
446
+ const templates = {
447
+ 'react': 'React 组件 (TypeScript)',
448
+ 'vue': 'Vue 3 组件 (TypeScript)',
449
+ 'express': 'Express API 路由',
450
+ 'python': 'Python 脚本',
451
+ 'api-client': 'API 客户端封装',
452
+ 'component': '通用前端组件'
453
+ };
454
+ const templateDesc = templates[type] || type;
455
+ const prompt = `请生成一个 ${templateDesc} 的代码模板。
456
+
457
+ 要求:
458
+ 1. 代码要完整、可运行
459
+ 2. 使用现代最佳实践
460
+ 3. 包含适当的注释
461
+ 4. 项目名称: ${name}
462
+
463
+ 请只返回代码,不要解释。如果需要多个文件,请用 ---FILE:filename--- 分隔。`;
464
+ const spinner = ora(chalk.gray('AI 正在生成模板...')).start();
465
+ const response = await ai.chat([
466
+ { role: 'system', content: '你是一个代码生成专家,擅长生成高质量、可运行的代码模板。' },
467
+ { role: 'user', content: prompt }
468
+ ]);
469
+ spinner.stop();
470
+ console.log(chalk.cyan('\n📄 生成的代码:\n'));
471
+ console.log(chalk.white(response.content));
472
+ // Ask if user wants to save
473
+ console.log(chalk.gray('\n' + '─'.repeat(40)));
474
+ console.log(chalk.gray('\n💡 要保存到文件吗? (y/n): '));
475
+ }
476
+ catch (error) {
477
+ console.error(chalk.red(`\n❌ 模板生成失败: ${error.message}`));
478
+ process.exit(1);
479
+ }
480
+ }
481
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}