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
package/install.ps1 ADDED
@@ -0,0 +1,238 @@
1
+ # Thatgfsj Code Installer for Windows
2
+ # Usage:
3
+ # powershell -c "irm https://raw.githubusercontent.com/Thatgfsj/thatgfsj-code/main/install.ps1 | iex"
4
+ # powershell -c "& ([scriptblock]::Create((irm https://raw.githubusercontent.com/Thatgfsj/thatgfsj-code/main/install.ps1)))"
5
+
6
+ param(
7
+ [switch]$NoOpen,
8
+ [switch]$DryRun
9
+ )
10
+
11
+ $ErrorActionPreference = "Stop"
12
+
13
+ # Colors
14
+ function Write-Step { param($msg) Write-Host "[*] $msg" -ForegroundColor Yellow }
15
+ function Write-Success { param($msg) Write-Host "[āœ“] $msg" -ForegroundColor Green }
16
+ function Write-Error { param($msg) Write-Host "[āœ—] $msg" -ForegroundColor Red }
17
+ function Write-Info { param($msg) Write-Host " $msg" -ForegroundColor Gray }
18
+
19
+ Write-Host ""
20
+ Write-Host " Thatgfsj Code 安装向导" -ForegroundColor Cyan
21
+ Write-Host " =======================" -ForegroundColor Cyan
22
+ Write-Host ""
23
+
24
+ if ($DryRun) {
25
+ Write-Host "[DRY RUN] ä»…ę˜¾ē¤ŗå°†č¦ę‰§č”Œēš„ę“ä½œ" -ForegroundColor Yellow
26
+ Write-Host ""
27
+ }
28
+
29
+ # ============== Step 1: Check PowerShell ==============
30
+ Write-Step "ę£€ęŸ„ PowerShell ē‰ˆęœ¬..."
31
+
32
+ if ($PSVersionTable.PSVersion.Major -lt 5) {
33
+ Write-Error "éœ€č¦ PowerShell 5.0 ęˆ–ę›“é«˜ē‰ˆęœ¬"
34
+ Write-Host "čÆ·å‡ēŗ§ę‚Øēš„ PowerShell: https://aka.ms/powershell" -ForegroundColor Gray
35
+ exit 1
36
+ }
37
+ Write-Success "PowerShell $($PSVersionTable.PSVersion) 检测正常"
38
+
39
+ # ============== Step 2: Check/Fetch Node.js ==============
40
+ Write-Step "ę£€ęŸ„ Node.js..."
41
+
42
+ function Test-NodeInstalled {
43
+ try {
44
+ $nodeVersion = node --version 2>$null
45
+ if ($nodeVersion) {
46
+ $version = [int]($nodeVersion -replace 'v(\d+)\..*', '$1')
47
+ return @{ installed = $true; version = $nodeVersion; major = $version }
48
+ }
49
+ } catch {}
50
+ return @{ installed = $false; version = $null; major = 0 }
51
+ }
52
+
53
+ $nodeStatus = Test-NodeInstalled
54
+ if ($nodeStatus.installed -and $nodeStatus.major -ge 18) {
55
+ Write-Success "Node.js $($nodeStatus.version) 已安装"
56
+ } else {
57
+ Write-Host " ęœŖę£€ęµ‹åˆ° Node.js 18+ļ¼Œå¼€å§‹å®‰č£…..." -ForegroundColor Gray
58
+
59
+ # Try winget first
60
+ if (Get-Command winget -ErrorAction SilentlyContinue) {
61
+ Write-Info "使用 winget 安装..."
62
+ winget install OpenJS.NodeJS.LTS --source winget --accept-package-agreements --accept-source-agreements
63
+
64
+ # Refresh PATH
65
+ $env:Path = [System.Environment]::GetEnvironmentVariable("Path","Machine") + ";" + [System.Environment]::GetEnvironmentVariable("Path","User")
66
+
67
+ $nodeStatus = Test-NodeInstalled
68
+ if ($nodeStatus.installed) {
69
+ Write-Success "Node.js å®‰č£…å®Œęˆ"
70
+ } else {
71
+ Write-Host " éœ€č¦é‡åÆ PowerShell åŽé‡ę–°čæč”Œå®‰č£…" -ForegroundColor Yellow
72
+ exit 0
73
+ }
74
+ }
75
+ # Try choco
76
+ elseif (Get-Command choco -ErrorAction SilentlyContinue) {
77
+ Write-Info "使用 Chocolatey 安装..."
78
+ choco install nodejs-lts -y
79
+ Write-Success "Node.js å®‰č£…å®Œęˆ (åÆčƒ½éœ€č¦é‡åÆ)"
80
+ }
81
+ # Manual fallback
82
+ else {
83
+ Write-Host ""
84
+ Write-Error "ęœŖę£€ęµ‹åˆ°åŒ…ē®”ē†å™Ø (winget/choco/scoop)"
85
+ Write-Host ""
86
+ Write-Host "čÆ·ę‰‹åŠØå®‰č£… Node.js:" -ForegroundColor Yellow
87
+ Write-Host " 1. 访问 https://nodejs.org" -ForegroundColor Gray
88
+ Write-Host " 2. äø‹č½½ LTS ē‰ˆęœ¬ (ęŽØč v20 ꈖ v22)" -ForegroundColor Gray
89
+ Write-Host " 3. čæč”Œå®‰č£…ēØ‹åŗ" -ForegroundColor Gray
90
+ Write-Host " 4. é‡ę–°čæč”Œę­¤å®‰č£…č„šęœ¬" -ForegroundColor Gray
91
+ Write-Host ""
92
+ exit 1
93
+ }
94
+ }
95
+
96
+ # ============== Step 3: Clone/Update Repository ==============
97
+ Write-Step "准备安装 Thatgfsj Code..."
98
+
99
+ $installDir = Join-Path $env:USERPROFILE "thatgfsj-code"
100
+
101
+ if (Test-Path $installDir) {
102
+ Write-Info "ę£€ęµ‹åˆ°å·²ęœ‰å®‰č£…ļ¼Œę­£åœØę›“ę–°..."
103
+ if (-not $DryRun) {
104
+ Set-Location $installDir
105
+ git pull origin main 2>$null
106
+ if ($LASTEXITCODE -ne 0) {
107
+ # If pull fails, re-clone
108
+ Remove-Item $installDir -Recurse -Force
109
+ }
110
+ }
111
+ } else {
112
+ if (-not $DryRun) {
113
+ Write-Info "ę­£åœØå…‹éš†ä»“åŗ“..."
114
+ git clone https://github.com/Thatgfsj/thatgfsj-code.git $installDir
115
+ Set-Location $installDir
116
+ }
117
+ }
118
+
119
+ if (-not (Test-Path (Join-Path $installDir "package.json"))) {
120
+ Write-Error "å®‰č£…ē›®å½•ę— ę•ˆ: $installDir"
121
+ exit 1
122
+ }
123
+
124
+ Write-Success "ä»£ē å‡†å¤‡å®Œęˆ: $installDir"
125
+
126
+ # ============== Step 4: Install Dependencies ==============
127
+ Write-Step "å®‰č£…ä¾čµ–..."
128
+
129
+ if (-not $DryRun) {
130
+ Set-Location $installDir
131
+ npm install
132
+ if ($LASTEXITCODE -ne 0) {
133
+ Write-Error "npm install 失蓄"
134
+ exit 1
135
+ }
136
+
137
+ Write-Info "编译 TypeScript..."
138
+ npm run build
139
+ if ($LASTEXITCODE -ne 0) {
140
+ Write-Error "编译失蓄"
141
+ exit 1
142
+ }
143
+ }
144
+ Write-Success "ä¾čµ–å®‰č£…å®Œęˆ"
145
+
146
+ # ============== Step 5: Link Command ==============
147
+ Write-Step "设置命令..."
148
+
149
+ if (-not $DryRun) {
150
+ npm link
151
+ }
152
+ Write-Success "命令 'gfcode' å·²åÆē”Ø"
153
+
154
+ # ============== Step 6: Setup API Key ==============
155
+ Write-Host ""
156
+ Write-Step "é…ē½® API Key (åÆé€‰)..."
157
+
158
+ $apiKeySet = $false
159
+ $providers = @{
160
+ "1" = @{name="SiliconFlow (ęŽØč)"; var="SILICONFLOW_API_KEY"; url="https://siliconflow.cn"}
161
+ "2" = @{name="MiniMax"; var="MINIMAX_API_KEY"; url="https://platform.minimax.io"}
162
+ "3" = @{name="OpenAI"; var="OPENAI_API_KEY"; url="https://platform.openai.com"}
163
+ "4" = @{name="Anthropic"; var="ANTHROPIC_API_KEY"; url="https://www.anthropic.com"}
164
+ "5" = @{name="Google Gemini"; var="GEMINI_API_KEY"; url="https://aistudio.google.com/app/apikey"}
165
+ "6" = @{name="跳过 (ēØåŽé…ē½®)"; var=""; url=""}
166
+ }
167
+
168
+ Write-Host ""
169
+ Write-Host " 选ꋩ AI Provider:" -ForegroundColor White
170
+ Write-Host ""
171
+ foreach ($key in $providers.Keys | Sort-Object) {
172
+ $p = $providers[$key]
173
+ Write-Host " $key. $($p.name)" -ForegroundColor Gray
174
+ }
175
+ Write-Host ""
176
+
177
+ if ($NoOpen) {
178
+ Write-Host " 使用 --NoOpen č·³čæ‡é…ē½®" -ForegroundColor Gray
179
+ } else {
180
+ $choice = Read-Host " 请选择 (1-6, ē›“ęŽ„å›žč½¦č·³čæ‡)"
181
+
182
+ if ($choice -and $providers.ContainsKey($choice)) {
183
+ $selected = $providers[$choice]
184
+ if ($selected.var) {
185
+ Write-Host ""
186
+ Write-Host " 访问 $($selected.url) čŽ·å– API Key" -ForegroundColor Cyan
187
+ Write-Host " čŽ·å–åŽē²˜č““åˆ°äø‹ę–¹" -ForegroundColor Gray
188
+ Write-Host ""
189
+
190
+ $key = Read-Host " 请输兄 API Key (č¾“å…„åŽå›žč½¦)"
191
+
192
+ if ($key) {
193
+ # Save to config file
194
+ $configDir = Join-Path $env:USERPROFILE ".thatgfsj"
195
+ if (-not (Test-Path $configDir)) {
196
+ New-Item -ItemType Directory -Path $configDir -Force | Out-Null
197
+ }
198
+
199
+ $configFile = Join-Path $configDir "config.json"
200
+ $config = @{
201
+ model = "Qwen/Qwen2.5-7B-Instruct"
202
+ apiKey = $key
203
+ provider = "siliconflow"
204
+ temperature = 0.7
205
+ maxTokens = 4096
206
+ }
207
+
208
+ # Set provider-specific defaults
209
+ switch ($choice) {
210
+ "1" { $config.provider = "siliconflow"; $config.model = "Qwen/Qwen2.5-7B-Instruct" }
211
+ "2" { $config.provider = "minimax"; $config.model = "MiniMax-M2.5" }
212
+ "3" { $config.provider = "openai"; $config.model = "gpt-4o-mini" }
213
+ "4" { $config.provider = "anthropic"; $config.model = "claude-3-haiku-20240307" }
214
+ "5" { $config.provider = "gemini"; $config.model = "gemini-1.5-flash-8b" }
215
+ }
216
+
217
+ $config | ConvertTo-Json | Set-Content $configFile -Encoding UTF8
218
+ Write-Success "é…ē½®å·²äæå­˜åˆ°: $configFile"
219
+ }
220
+ }
221
+ }
222
+ }
223
+
224
+ # ============== Done ==============
225
+ Write-Host ""
226
+ Write-Host " ======================================" -ForegroundColor Cyan
227
+ Write-Success " å®‰č£…å®Œęˆ!"
228
+ Write-Host " ======================================" -ForegroundColor Cyan
229
+ Write-Host ""
230
+ Write-Host " 使用方法:" -ForegroundColor White
231
+ Write-Host " gfcode init - é‡ę–°é…ē½®" -ForegroundColor Gray
232
+ Write-Host " gfcode - åÆåŠØäŗ¤äŗ’ęØ”å¼" -ForegroundColor Gray
233
+ Write-Host " gfcode 'ä½ ēš„é—®é¢˜' - ē›“ęŽ„ęé—®" -ForegroundColor Gray
234
+ Write-Host " gfcode explain '代码' - č§£é‡Šä»£ē " -ForegroundColor Gray
235
+ Write-Host " gfcode debug '代码' - č°ƒčÆ•ä»£ē " -ForegroundColor Gray
236
+ Write-Host ""
237
+ Write-Host " 文攣: https://github.com/Thatgfsj/thatgfsj-code" -ForegroundColor Gray
238
+ Write-Host ""
package/install.sh ADDED
@@ -0,0 +1,113 @@
1
+ #!/bin/bash
2
+ # Thatgfsj Code Installer for macOS/Linux
3
+ # Usage: curl -sL https://raw.githubusercontent.com/Thatgfsj/thatgfsj-code/main/install.sh | bash
4
+
5
+ set -e
6
+
7
+ # Colors
8
+ RED='\033[0;31m'
9
+ GREEN='\033[0;32m'
10
+ YELLOW='\033[1;33m'
11
+ CYAN='\033[0;36m'
12
+ NC='\033[0m' # No Color
13
+
14
+ echo ""
15
+ echo -e "${CYAN} Thatgfsj Code 安装向导${NC}"
16
+ echo -e "${CYAN} =======================${NC}"
17
+ echo ""
18
+
19
+ # ============== Step 1: Check Node.js ==============
20
+ echo -e "${YELLOW}[*] ę£€ęŸ„ Node.js...${NC}"
21
+
22
+ if command -v node &> /dev/null; then
23
+ NODE_VERSION=$(node --version)
24
+ MAJOR_VERSION=$(echo $NODE_VERSION | cut -d'v' -f2 | cut -d'.' -f1)
25
+ if [ "$MAJOR_VERSION" -ge 18 ]; then
26
+ echo -e "${GREEN}[āœ“] Node.js $NODE_VERSION 已安装${NC}"
27
+ else
28
+ echo -e "${RED}[āœ—] Node.js ē‰ˆęœ¬čæ‡ä½Žļ¼Œéœ€č¦ v18+${NC}"
29
+ echo " 请访问 https://nodejs.org å‡ēŗ§"
30
+ exit 1
31
+ fi
32
+ else
33
+ echo -e "${YELLOW}[*] ęœŖę£€ęµ‹åˆ° Node.jsļ¼Œå¼€å§‹å®‰č£…...${NC}"
34
+
35
+ # Try Homebrew (macOS)
36
+ if command -v brew &> /dev/null; then
37
+ echo -e "${YELLOW}[*] 使用 Homebrew 安装...${NC}"
38
+ brew install node
39
+ # Try apt (Ubuntu/Debian)
40
+ elif command -v apt-get &> /dev/null; then
41
+ echo -e "${YELLOW}[*] 使用 apt 安装...${NC}"
42
+ curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -
43
+ sudo apt-get install -y nodejs
44
+ # Try yum (CentOS/RHEL)
45
+ elif command -v yum &> /dev/null; then
46
+ echo -e "${YELLOW}[*] 使用 yum 安装...${NC}"
47
+ curl -fsSL https://rpm.nodesource.com/setup_20.x | sudo bash -
48
+ sudo yum install -y nodejs
49
+ else
50
+ echo -e "${RED}[āœ—] ęœŖę‰¾åˆ°åŒ…ē®”ē†å™Ø${NC}"
51
+ echo " čÆ·ę‰‹åŠØå®‰č£…: https://nodejs.org"
52
+ exit 1
53
+ fi
54
+ fi
55
+
56
+ # ============== Step 2: Clone/Update ==============
57
+ echo -e "${YELLOW}[*] 准备安装 Thatgfsj Code...${NC}"
58
+
59
+ INSTALL_DIR="$HOME/thatgfsj-code"
60
+
61
+ if [ -d "$INSTALL_DIR" ]; then
62
+ echo -e "${YELLOW}[*] ę£€ęµ‹åˆ°å·²ęœ‰å®‰č£…ļ¼Œę­£åœØę›“ę–°...${NC}"
63
+ cd "$INSTALL_DIR"
64
+ git pull origin main 2>/dev/null || {
65
+ echo -e "${YELLOW}[*] ę›“ę–°å¤±č“„ļ¼Œé‡ę–°å…‹éš†...${NC}"
66
+ rm -rf "$INSTALL_DIR"
67
+ }
68
+ fi
69
+
70
+ if [ ! -d "$INSTALL_DIR" ]; then
71
+ echo -e "${YELLOW}[*] å…‹éš†ä»“åŗ“...${NC}"
72
+ git clone https://github.com/Thatgfsj/thatgfsj-code.git "$INSTALL_DIR"
73
+ fi
74
+
75
+ cd "$INSTALL_DIR"
76
+
77
+ if [ ! -f "package.json" ]; then
78
+ echo -e "${RED}[āœ—] å®‰č£…ē›®å½•ę— ę•ˆ${NC}"
79
+ exit 1
80
+ fi
81
+
82
+ echo -e "${GREEN}[āœ“] ä»£ē å‡†å¤‡å®Œęˆ: $INSTALL_DIR${NC}"
83
+
84
+ # ============== Step 3: Install Dependencies ==============
85
+ echo -e "${YELLOW}[*] å®‰č£…ä¾čµ–...${NC}"
86
+
87
+ npm install
88
+ npm run build
89
+
90
+ echo -e "${GREEN}[āœ“] ä¾čµ–å®‰č£…å®Œęˆ${NC}"
91
+
92
+ # ============== Step 4: Link Command ==============
93
+ echo -e "${YELLOW}[*] 设置命令...${NC}"
94
+
95
+ npm link
96
+
97
+ echo -e "${GREEN}[āœ“] 命令 'gfcode' å·²åÆē”Ø${NC}"
98
+
99
+ # ============== Done ==============
100
+ echo ""
101
+ echo -e "${CYAN} ======================================${NC}"
102
+ echo -e "${GREEN} å®‰č£…å®Œęˆ!${NC}"
103
+ echo -e "${CYAN} ======================================${NC}"
104
+ echo ""
105
+ echo -e " ${WHITE}使用方法:${NC}"
106
+ echo -e " gfcode init - é‡ę–°é…ē½®"
107
+ echo -e " gfcode - åÆåŠØäŗ¤äŗ’ęØ”å¼"
108
+ echo -e " gfcode 'ä½ ēš„é—®é¢˜' - ē›“ęŽ„ęé—®"
109
+ echo -e " gfcode explain '代码' - č§£é‡Šä»£ē "
110
+ echo -e " gfcode debug '代码' - č°ƒčÆ•ä»£ē "
111
+ echo ""
112
+ echo -e " 文攣: ${CYAN}https://github.com/Thatgfsj/thatgfsj-code${NC}"
113
+ echo ""
package/package.json ADDED
@@ -0,0 +1,36 @@
1
+ {
2
+ "name": "thatgfsj-code",
3
+ "version": "0.2.1",
4
+ "description": "Thatgfsj Code - Your AI Coding Assistant",
5
+ "main": "dist/index.js",
6
+ "type": "module",
7
+ "bin": {
8
+ "thatgfsj": "./dist/index.js",
9
+ "gfcode": "./dist/index.js"
10
+ },
11
+ "scripts": {
12
+ "build": "tsc",
13
+ "start": "node dist/index.js",
14
+ "dev": "tsc && node dist/index.js",
15
+ "link": "npm link"
16
+ },
17
+ "keywords": [
18
+ "ai",
19
+ "cli",
20
+ "coding",
21
+ "assistant"
22
+ ],
23
+ "author": "Thatgfsj",
24
+ "license": "MIT",
25
+ "dependencies": {
26
+ "chalk": "^5.3.0",
27
+ "commander": "^11.1.0",
28
+ "inquirer": "^13.3.2",
29
+ "ora": "^7.0.1",
30
+ "readline": "^1.3.0"
31
+ },
32
+ "devDependencies": {
33
+ "@types/node": "^20.10.0",
34
+ "typescript": "^5.3.0"
35
+ }
36
+ }
@@ -0,0 +1,179 @@
1
+ /**
2
+ * Agent Module
3
+ * Core agent logic with intent recognition, task planning, and streaming
4
+ */
5
+
6
+ import { AIEngine } from '../core/ai-engine.js';
7
+ import { SessionManager } from '../core/session.js';
8
+ import { IntentRecognizer, Intent, SubTask } from './intent.js';
9
+ import { StreamingOutput } from './streaming.js';
10
+ import chalk from 'chalk';
11
+
12
+ export interface AgentConfig {
13
+ maxIterations?: number;
14
+ streaming?: boolean;
15
+ verbose?: boolean;
16
+ }
17
+
18
+ export class Agent {
19
+ private ai: AIEngine;
20
+ private session: SessionManager;
21
+ private intentRecognizer: IntentRecognizer;
22
+ private config: AgentConfig;
23
+ private streaming: StreamingOutput;
24
+
25
+ constructor(ai: AIEngine, session: SessionManager, config?: AgentConfig) {
26
+ this.ai = ai;
27
+ this.session = session;
28
+ this.intentRecognizer = new IntentRecognizer(ai);
29
+ this.config = {
30
+ maxIterations: 5,
31
+ streaming: false,
32
+ verbose: false,
33
+ ...config
34
+ };
35
+ this.streaming = new StreamingOutput();
36
+ }
37
+
38
+ /**
39
+ * Process user input through the agent
40
+ */
41
+ async process(input: string): Promise<string> {
42
+ // Step 1: Recognize intent
43
+ const intent = await this.intentRecognizer.recognize(input);
44
+
45
+ if (this.config.verbose) {
46
+ console.log(chalk.gray(`\nšŸ“ Intent: ${intent.type} (${intent.confidence}) - ${intent.reason}`));
47
+ }
48
+
49
+ // Step 2: Handle complex tasks
50
+ if (intent.type === 'complex') {
51
+ return await this.handleComplexTask(input, intent);
52
+ }
53
+
54
+ // Step 3: Route to appropriate handler
55
+ switch (intent.type) {
56
+ case 'command':
57
+ return await this.handleCommand(input);
58
+ case 'query':
59
+ return await this.handleQuery(input);
60
+ case 'code':
61
+ case 'chat':
62
+ default:
63
+ return await this.handleGeneral(input);
64
+ }
65
+ }
66
+
67
+ /**
68
+ * Handle complex multi-step tasks
69
+ */
70
+ private async handleComplexTask(input: string, intent: Intent): Promise<string> {
71
+ const subtasks = await this.intentRecognizer.breakIntoSubtasks(input);
72
+
73
+ if (this.config.verbose) {
74
+ console.log(chalk.cyan(`\nšŸ“‹ Breaking into ${subtasks.length} subtasks:`));
75
+ subtasks.forEach((task, i) => {
76
+ console.log(chalk.gray(` ${i + 1}. ${task.description} [${task.action}]`));
77
+ });
78
+ }
79
+
80
+ let results: string[] = [];
81
+
82
+ for (let i = 0; i < subtasks.length; i++) {
83
+ const task = subtasks[i];
84
+ console.log(chalk.cyan(`\n[${i + 1}/${subtasks.length}] ${task.description}...`));
85
+
86
+ const result = await this.process(task.description);
87
+ results.push(result);
88
+ }
89
+
90
+ return results.join('\n\n');
91
+ }
92
+
93
+ /**
94
+ * Handle command intent
95
+ */
96
+ private async handleCommand(input: string): Promise<string> {
97
+ // Extract command from input
98
+ const command = input
99
+ .replace(/^(run|execute|exec)\s+/i, '')
100
+ .trim();
101
+
102
+ // Add to session and get response
103
+ this.session.addMessage('user', input);
104
+
105
+ const response = await this.ai.chat(this.session.getMessages(), this.config.maxIterations);
106
+
107
+ this.session.addMessage('assistant', response.content);
108
+
109
+ return response.content;
110
+ }
111
+
112
+ /**
113
+ * Handle query intent
114
+ */
115
+ private async handleQuery(input: string): Promise<string> {
116
+ this.session.addMessage('user', input);
117
+
118
+ const response = await this.ai.chat(this.session.getMessages(), this.config.maxIterations);
119
+
120
+ this.session.addMessage('assistant', response.content);
121
+
122
+ return response.content;
123
+ }
124
+
125
+ /**
126
+ * Handle general/code/chat intents
127
+ */
128
+ private async handleGeneral(input: string): Promise<string> {
129
+ this.session.addMessage('user', input);
130
+
131
+ const response = await this.ai.chat(this.session.getMessages(), this.config.maxIterations);
132
+
133
+ this.session.addMessage('assistant', response.content);
134
+
135
+ return response.content;
136
+ }
137
+
138
+ /**
139
+ * Process with streaming output
140
+ */
141
+ async processStream(input: string, onChunk: (chunk: string) => void): Promise<string> {
142
+ const wasStreaming = this.config.streaming;
143
+ this.config.streaming = true;
144
+
145
+ this.streaming.start({ onChunk });
146
+
147
+ try {
148
+ const result = await this.process(input);
149
+ this.streaming.end();
150
+ return result;
151
+ } catch (error) {
152
+ this.streaming.stop();
153
+ throw error;
154
+ } finally {
155
+ this.config.streaming = wasStreaming;
156
+ }
157
+ }
158
+
159
+ /**
160
+ * Get session
161
+ */
162
+ getSession(): SessionManager {
163
+ return this.session;
164
+ }
165
+
166
+ /**
167
+ * Clear session
168
+ */
169
+ clearSession(): void {
170
+ this.session.clear();
171
+ }
172
+
173
+ /**
174
+ * Interrupt ongoing operation
175
+ */
176
+ interrupt(): void {
177
+ this.streaming.stop();
178
+ }
179
+ }
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Agent Module
3
+ * Core agent logic with intent recognition and task planning
4
+ */
5
+
6
+ export { Agent, type AgentConfig } from './core.js';
7
+ export { IntentRecognizer, type Intent, type SubTask } from './intent.js';
8
+ export { StreamingOutput } from './streaming.js';