thatgfsj-code 0.5.0 → 0.7.0

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 (185) hide show
  1. package/README.md +7 -12
  2. package/dist/app/index.d.ts +2 -0
  3. package/dist/app/index.d.ts.map +1 -1
  4. package/dist/app/index.js +11 -6
  5. package/dist/app/index.js.map +1 -1
  6. package/dist/cmd/index.d.ts +1 -2
  7. package/dist/cmd/index.d.ts.map +1 -1
  8. package/dist/cmd/index.js +26 -23
  9. package/dist/cmd/index.js.map +1 -1
  10. package/dist/config/index.d.ts.map +1 -1
  11. package/dist/config/index.js +1 -0
  12. package/dist/config/index.js.map +1 -1
  13. package/dist/config/types.d.ts +1 -0
  14. package/dist/config/types.d.ts.map +1 -1
  15. package/dist/prompts/index.d.ts +2 -0
  16. package/dist/prompts/index.d.ts.map +1 -1
  17. package/dist/prompts/index.js +7 -0
  18. package/dist/prompts/index.js.map +1 -1
  19. package/dist/skills/brainstorming.d.ts +3 -0
  20. package/dist/skills/brainstorming.d.ts.map +1 -0
  21. package/dist/skills/brainstorming.js +42 -0
  22. package/dist/skills/brainstorming.js.map +1 -0
  23. package/dist/skills/code-review.d.ts +3 -0
  24. package/dist/skills/code-review.d.ts.map +1 -0
  25. package/dist/skills/code-review.js +44 -0
  26. package/dist/skills/code-review.js.map +1 -0
  27. package/dist/skills/executing-plans.d.ts +3 -0
  28. package/dist/skills/executing-plans.d.ts.map +1 -0
  29. package/dist/skills/executing-plans.js +26 -0
  30. package/dist/skills/executing-plans.js.map +1 -0
  31. package/dist/skills/frontend-design.d.ts +3 -0
  32. package/dist/skills/frontend-design.d.ts.map +1 -0
  33. package/dist/skills/frontend-design.js +34 -0
  34. package/dist/skills/frontend-design.js.map +1 -0
  35. package/dist/skills/git-workflow.d.ts +3 -0
  36. package/dist/skills/git-workflow.d.ts.map +1 -0
  37. package/dist/skills/git-workflow.js +35 -0
  38. package/dist/skills/git-workflow.js.map +1 -0
  39. package/dist/skills/improve-architecture.d.ts +3 -0
  40. package/dist/skills/improve-architecture.d.ts.map +1 -0
  41. package/dist/skills/improve-architecture.js +37 -0
  42. package/dist/skills/improve-architecture.js.map +1 -0
  43. package/dist/skills/index.d.ts +50 -0
  44. package/dist/skills/index.d.ts.map +1 -0
  45. package/dist/skills/index.js +98 -0
  46. package/dist/skills/index.js.map +1 -0
  47. package/dist/skills/neuroweave.d.ts +3 -0
  48. package/dist/skills/neuroweave.d.ts.map +1 -0
  49. package/dist/skills/neuroweave.js +46 -0
  50. package/dist/skills/neuroweave.js.map +1 -0
  51. package/dist/skills/playwright.d.ts +3 -0
  52. package/dist/skills/playwright.d.ts.map +1 -0
  53. package/dist/skills/playwright.js +71 -0
  54. package/dist/skills/playwright.js.map +1 -0
  55. package/dist/skills/prototype.d.ts +3 -0
  56. package/dist/skills/prototype.d.ts.map +1 -0
  57. package/dist/skills/prototype.js +29 -0
  58. package/dist/skills/prototype.js.map +1 -0
  59. package/dist/skills/subagent.d.ts +3 -0
  60. package/dist/skills/subagent.d.ts.map +1 -0
  61. package/dist/skills/subagent.js +27 -0
  62. package/dist/skills/subagent.js.map +1 -0
  63. package/dist/skills/supabase.d.ts +3 -0
  64. package/dist/skills/supabase.d.ts.map +1 -0
  65. package/dist/skills/supabase.js +43 -0
  66. package/dist/skills/supabase.js.map +1 -0
  67. package/dist/skills/systematic-debugging.d.ts +3 -0
  68. package/dist/skills/systematic-debugging.d.ts.map +1 -0
  69. package/dist/skills/systematic-debugging.js +43 -0
  70. package/dist/skills/systematic-debugging.js.map +1 -0
  71. package/dist/skills/tdd.d.ts +3 -0
  72. package/dist/skills/tdd.d.ts.map +1 -0
  73. package/dist/skills/tdd.js +38 -0
  74. package/dist/skills/tdd.js.map +1 -0
  75. package/dist/skills/triage.d.ts +3 -0
  76. package/dist/skills/triage.d.ts.map +1 -0
  77. package/dist/skills/triage.js +34 -0
  78. package/dist/skills/triage.js.map +1 -0
  79. package/dist/skills/verification.d.ts +3 -0
  80. package/dist/skills/verification.d.ts.map +1 -0
  81. package/dist/skills/verification.js +30 -0
  82. package/dist/skills/verification.js.map +1 -0
  83. package/dist/skills/writing-plans.d.ts +3 -0
  84. package/dist/skills/writing-plans.d.ts.map +1 -0
  85. package/dist/skills/writing-plans.js +41 -0
  86. package/dist/skills/writing-plans.js.map +1 -0
  87. package/dist/tools/index.d.ts +1 -0
  88. package/dist/tools/index.d.ts.map +1 -1
  89. package/dist/tools/index.js +3 -0
  90. package/dist/tools/index.js.map +1 -1
  91. package/dist/tools/nwt.d.ts +70 -0
  92. package/dist/tools/nwt.d.ts.map +1 -0
  93. package/dist/tools/nwt.js +289 -0
  94. package/dist/tools/nwt.js.map +1 -0
  95. package/dist/tui/app.d.ts +9 -0
  96. package/dist/tui/app.d.ts.map +1 -0
  97. package/dist/tui/app.js +40 -0
  98. package/dist/tui/app.js.map +1 -0
  99. package/dist/tui/components/ChatList.d.ts +13 -0
  100. package/dist/tui/components/ChatList.d.ts.map +1 -0
  101. package/dist/tui/components/ChatList.js +11 -0
  102. package/dist/tui/components/ChatList.js.map +1 -0
  103. package/dist/tui/components/ChatMessage.d.ts +15 -0
  104. package/dist/tui/components/ChatMessage.d.ts.map +1 -0
  105. package/dist/tui/components/ChatMessage.js +17 -0
  106. package/dist/tui/components/ChatMessage.js.map +1 -0
  107. package/dist/tui/components/Header.d.ts +9 -0
  108. package/dist/tui/components/Header.d.ts.map +1 -0
  109. package/dist/tui/components/Header.js +6 -0
  110. package/dist/tui/components/Header.js.map +1 -0
  111. package/dist/tui/components/Markdown.d.ts +8 -0
  112. package/dist/tui/components/Markdown.d.ts.map +1 -0
  113. package/dist/tui/components/Markdown.js +31 -0
  114. package/dist/tui/components/Markdown.js.map +1 -0
  115. package/dist/tui/components/StatusBar.d.ts +9 -0
  116. package/dist/tui/components/StatusBar.d.ts.map +1 -0
  117. package/dist/tui/components/StatusBar.js +8 -0
  118. package/dist/tui/components/StatusBar.js.map +1 -0
  119. package/dist/tui/components/Thinking.d.ts +8 -0
  120. package/dist/tui/components/Thinking.d.ts.map +1 -0
  121. package/dist/tui/components/Thinking.js +7 -0
  122. package/dist/tui/components/Thinking.js.map +1 -0
  123. package/dist/tui/components/ToolCall.d.ts +15 -0
  124. package/dist/tui/components/ToolCall.d.ts.map +1 -0
  125. package/dist/tui/components/ToolCall.js +42 -0
  126. package/dist/tui/components/ToolCall.js.map +1 -0
  127. package/dist/tui/components/UserInput.d.ts +9 -0
  128. package/dist/tui/components/UserInput.d.ts.map +1 -0
  129. package/dist/tui/components/UserInput.js +76 -0
  130. package/dist/tui/components/UserInput.js.map +1 -0
  131. package/dist/tui/hooks/useChat.d.ts +11 -0
  132. package/dist/tui/hooks/useChat.d.ts.map +1 -0
  133. package/dist/tui/hooks/useChat.js +138 -0
  134. package/dist/tui/hooks/useChat.js.map +1 -0
  135. package/dist/tui/hooks/useCommands.d.ts +10 -0
  136. package/dist/tui/hooks/useCommands.d.ts.map +1 -0
  137. package/dist/tui/hooks/useCommands.js +78 -0
  138. package/dist/tui/hooks/useCommands.js.map +1 -0
  139. package/dist/tui/index.d.ts +2 -4
  140. package/dist/tui/index.d.ts.map +1 -1
  141. package/dist/tui/index.js +2 -4
  142. package/dist/tui/index.js.map +1 -1
  143. package/dist/tui/welcome.d.ts.map +1 -1
  144. package/dist/tui/welcome.js +22 -4
  145. package/dist/tui/welcome.js.map +1 -1
  146. package/install.ps1 +171 -192
  147. package/package.json +9 -1
  148. package/src/app/index.ts +13 -7
  149. package/src/cmd/{index.ts → index.tsx} +28 -27
  150. package/src/config/index.ts +1 -0
  151. package/src/config/types.ts +1 -0
  152. package/src/prompts/index.ts +8 -0
  153. package/src/skills/brainstorming.ts +43 -0
  154. package/src/skills/code-review.ts +45 -0
  155. package/src/skills/executing-plans.ts +27 -0
  156. package/src/skills/frontend-design.ts +35 -0
  157. package/src/skills/git-workflow.ts +36 -0
  158. package/src/skills/improve-architecture.ts +38 -0
  159. package/src/skills/index.ts +136 -0
  160. package/src/skills/neuroweave.ts +47 -0
  161. package/src/skills/playwright.ts +72 -0
  162. package/src/skills/prototype.ts +30 -0
  163. package/src/skills/subagent.ts +28 -0
  164. package/src/skills/supabase.ts +44 -0
  165. package/src/skills/systematic-debugging.ts +44 -0
  166. package/src/skills/tdd.ts +39 -0
  167. package/src/skills/triage.ts +35 -0
  168. package/src/skills/verification.ts +31 -0
  169. package/src/skills/writing-plans.ts +42 -0
  170. package/src/tools/index.ts +3 -0
  171. package/src/tools/nwt.ts +362 -0
  172. package/src/tui/app.tsx +61 -0
  173. package/src/tui/components/ChatList.tsx +32 -0
  174. package/src/tui/components/ChatMessage.tsx +54 -0
  175. package/src/tui/components/Header.tsx +28 -0
  176. package/src/tui/components/Markdown.tsx +35 -0
  177. package/src/tui/components/StatusBar.tsx +30 -0
  178. package/src/tui/components/Thinking.tsx +19 -0
  179. package/src/tui/components/ToolCall.tsx +74 -0
  180. package/src/tui/components/UserInput.tsx +83 -0
  181. package/src/tui/hooks/useChat.ts +154 -0
  182. package/src/tui/hooks/useCommands.ts +91 -0
  183. package/src/tui/index.ts +2 -4
  184. package/src/tui/welcome.ts +24 -5
  185. package/tsconfig.json +5 -3
@@ -0,0 +1,78 @@
1
+ import { useCallback } from 'react';
2
+ export function useCommands(app) {
3
+ const handleCommand = useCallback((input) => {
4
+ const cmd = input.toLowerCase().trim();
5
+ switch (cmd) {
6
+ case 'help':
7
+ return {
8
+ handled: true,
9
+ output: [
10
+ 'Commands:',
11
+ ' help Show this help',
12
+ ' tools List available tools',
13
+ ' model Show current model',
14
+ ' clear Clear screen',
15
+ ' exit Exit',
16
+ '',
17
+ 'Keyboard:',
18
+ ' ↑/↓ Browse history',
19
+ ' Ctrl+C Exit',
20
+ ].join('\n'),
21
+ };
22
+ case 'tools':
23
+ return {
24
+ handled: true,
25
+ output: app.tools.list()
26
+ .map(t => ` ${t.name.padEnd(16)} ${t.description}`)
27
+ .join('\n'),
28
+ };
29
+ case 'model': {
30
+ const c = app.config.get();
31
+ return {
32
+ handled: true,
33
+ output: [
34
+ ` Provider: ${c.provider}`,
35
+ ` Model: ${c.model}`,
36
+ ` Base URL: ${c.baseUrl || 'default'}`,
37
+ ` API Key: ${c.apiKey ? '••••' + c.apiKey.slice(-4) : 'not set'}`,
38
+ ` Context Length: ${c.contextLength || 50} messages`,
39
+ ].join('\n'),
40
+ };
41
+ }
42
+ case 'clear':
43
+ return { handled: true };
44
+ default:
45
+ // Handle /skill commands
46
+ if (cmd.startsWith('skill') || cmd.startsWith('/skill')) {
47
+ const parts = input.trim().split(/\s+/);
48
+ const sub = parts[1] || 'list';
49
+ if (sub === 'list') {
50
+ const all = app.skills.list();
51
+ const lines = all.map(s => {
52
+ const active = app.skills.isActive(s.id) ? '✓' : ' ';
53
+ return ` [${active}] ${s.name.padEnd(28)} ${s.description}`;
54
+ });
55
+ return {
56
+ handled: true,
57
+ output: ['Skills ([✓] = active):', ...lines, '', 'Usage: skill <id> to toggle'].join('\n'),
58
+ };
59
+ }
60
+ // Toggle skill
61
+ const skillId = sub;
62
+ if (app.skills.isActive(skillId)) {
63
+ app.skills.deactivate(skillId);
64
+ return { handled: true, output: ` Deactivated: ${skillId}` };
65
+ }
66
+ else if (app.skills.activate(skillId)) {
67
+ return { handled: true, output: ` Activated: ${skillId}` };
68
+ }
69
+ else {
70
+ return { handled: true, output: ` Unknown skill: ${skillId}` };
71
+ }
72
+ }
73
+ return { handled: false };
74
+ }
75
+ }, [app]);
76
+ return { handleCommand };
77
+ }
78
+ //# sourceMappingURL=useCommands.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useCommands.js","sourceRoot":"","sources":["../../../src/tui/hooks/useCommands.ts"],"names":[],"mappings":"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"}
@@ -1,8 +1,6 @@
1
1
  /**
2
- * TUI Module - Terminal User Interface
2
+ * TUI Module - Ink-based Terminal UI
3
3
  */
4
- export { REPL } from './repl.js';
5
- export { REPLInput } from './input.js';
6
- export { REPLOutput } from './output.js';
4
+ export { TuiApp } from './app.js';
7
5
  export { WelcomeScreen } from './welcome.js';
8
6
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tui/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tui/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC"}
package/dist/tui/index.js CHANGED
@@ -1,8 +1,6 @@
1
1
  /**
2
- * TUI Module - Terminal User Interface
2
+ * TUI Module - Ink-based Terminal UI
3
3
  */
4
- export { REPL } from './repl.js';
5
- export { REPLInput } from './input.js';
6
- export { REPLOutput } from './output.js';
4
+ export { TuiApp } from './app.js';
7
5
  export { WelcomeScreen } from './welcome.js';
8
6
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tui/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tui/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"welcome.d.ts","sourceRoot":"","sources":["../../src/tui/welcome.ts"],"names":[],"mappings":"AAAA;;GAEG;AAYH,qBAAa,aAAa;IAExB,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,GAAG,IAAI;WAkBxB,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC;IAgG9C,OAAO,CAAC,MAAM,CAAC,UAAU;CA2B1B"}
1
+ {"version":3,"file":"welcome.d.ts","sourceRoot":"","sources":["../../src/tui/welcome.ts"],"names":[],"mappings":"AAAA;;GAEG;AAYH,qBAAa,aAAa;IAExB,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,GAAG,IAAI;WAkBxB,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC;IAkH9C,OAAO,CAAC,MAAM,CAAC,UAAU;CA4B1B"}
@@ -72,17 +72,17 @@ export class WelcomeScreen {
72
72
  console.log();
73
73
  console.log(chalk.bold(' 3. Choose Model'));
74
74
  console.log();
75
+ let model;
75
76
  if (isCustomProvider(providerName)) {
76
77
  console.log(chalk.gray(' Enter model name for your relay station'));
77
78
  console.log(chalk.gray(' e.g. gpt-4o-mini, claude-sonnet-4-20250514'));
78
79
  console.log();
79
- const model = await ask(chalk.cyan(' Model ❯ '));
80
+ model = await ask(chalk.cyan(' Model ❯ '));
80
81
  if (!model) {
81
82
  console.log(chalk.red(' ❌ Model name required'));
82
83
  rl.close();
83
84
  return;
84
85
  }
85
- this.saveConfig(providerName, model, apiKey, baseUrl);
86
86
  }
87
87
  else {
88
88
  const models = getModelsForProvider(providerName);
@@ -93,8 +93,25 @@ export class WelcomeScreen {
93
93
  console.log();
94
94
  const modelChoice = await ask(chalk.cyan(' ❯ '));
95
95
  const selectedModel = models[parseInt(modelChoice) - 1] || models[0];
96
- this.saveConfig(providerName, selectedModel.id, apiKey, baseUrl);
96
+ model = selectedModel.id;
97
97
  }
98
+ // ── Step 4: Context Length ───────────────────────────
99
+ console.log();
100
+ console.log(chalk.bold(' 4. Context Length'));
101
+ console.log();
102
+ console.log(chalk.gray(' Max messages kept in conversation history'));
103
+ console.log(chalk.gray(' Higher = more context, more tokens used'));
104
+ console.log();
105
+ console.log(chalk.cyan(' 1') + ' 20 ' + chalk.gray('(short,节省 token)'));
106
+ console.log(chalk.cyan(' 2') + ' 50 ' + chalk.gray('(default,推荐)'));
107
+ console.log(chalk.cyan(' 3') + ' 100 ' + chalk.gray('(long,长对话)'));
108
+ console.log(chalk.cyan(' 4') + ' 200 ' + chalk.gray('(very long,超长对话)'));
109
+ console.log();
110
+ const ctxChoice = await ask(chalk.cyan(' ❯ '));
111
+ const ctxMap = { '1': 20, '2': 50, '3': 100, '4': 200 };
112
+ const contextLength = ctxMap[ctxChoice] || 50;
113
+ // ── Save ────────────────────────────────────────────
114
+ this.saveConfig(providerName, model, apiKey, baseUrl, contextLength);
98
115
  // ── Done ────────────────────────────────────────────
99
116
  console.log();
100
117
  console.log(line);
@@ -109,7 +126,7 @@ export class WelcomeScreen {
109
126
  rl.close();
110
127
  }
111
128
  }
112
- static saveConfig(provider, model, apiKey, baseUrl) {
129
+ static saveConfig(provider, model, apiKey, baseUrl, contextLength = 50) {
113
130
  const configDir = join(homedir(), '.thatgfsj');
114
131
  const configPath = join(configDir, 'config.json');
115
132
  if (!existsSync(configDir)) {
@@ -121,6 +138,7 @@ export class WelcomeScreen {
121
138
  apiKey,
122
139
  temperature: 0.7,
123
140
  maxTokens: 4096,
141
+ contextLength,
124
142
  };
125
143
  if (baseUrl)
126
144
  config.baseUrl = baseUrl;
@@ -1 +1 @@
1
- {"version":3,"file":"welcome.js","sourceRoot":"","sources":["../../src/tui/welcome.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"welcome.js","sourceRoot":"","sources":["../../src/tui/welcome.ts"],"names":[],"mappings":"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"}
package/install.ps1 CHANGED
@@ -1,238 +1,217 @@
1
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
- )
2
+ # Works on any Windows machine - auto-downloads Node.js if needed
3
+ #
4
+ # Usage:
5
+ # irm https://raw.githubusercontent.com/Thatgfsj/thatgfsj-code/master/install.ps1 | iex
10
6
 
11
7
  $ErrorActionPreference = "Stop"
12
8
 
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 }
9
+ function Log($msg) { Write-Host " $msg" -ForegroundColor Gray }
10
+ function Step($msg) { Write-Host " > $msg" -ForegroundColor Cyan }
11
+ function Ok($msg) { Write-Host " OK $msg" -ForegroundColor Green }
12
+ function Fail($msg) { Write-Host " !! $msg" -ForegroundColor Red }
18
13
 
19
14
  Write-Host ""
20
- Write-Host " Thatgfsj Code 安装向导" -ForegroundColor Cyan
21
- Write-Host " =======================" -ForegroundColor Cyan
15
+ Write-Host " Thatgfsj Code Installer" -ForegroundColor Cyan
16
+ Write-Host " ────────────────────────" -ForegroundColor DarkGray
22
17
  Write-Host ""
23
18
 
24
- if ($DryRun) {
25
- Write-Host "[DRY RUN] 仅显示将要执行的操作" -ForegroundColor Yellow
26
- Write-Host ""
27
- }
28
-
29
- # ============== Step 1: Check PowerShell ==============
30
- Write-Step "检查 PowerShell 版本..."
19
+ # ── Helper: Refresh PATH from registry ────────────────────
31
20
 
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
21
+ function Refresh-Path {
22
+ $machinePath = [System.Environment]::GetEnvironmentVariable("Path", "Machine")
23
+ $userPath = [System.Environment]::GetEnvironmentVariable("Path", "User")
24
+ $env:Path = "$machinePath;$userPath"
36
25
  }
37
- Write-Success "PowerShell $($PSVersionTable.PSVersion) 检测正常"
38
26
 
39
- # ============== Step 2: Check/Fetch Node.js ==============
40
- Write-Step "检查 Node.js..."
27
+ # ── Helper: Download file with progress ───────────────────
41
28
 
42
- function Test-NodeInstalled {
29
+ function Download-File {
30
+ param($url, $dest)
31
+ Log "Downloading $url ..."
43
32
  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 }
33
+ $wc = New-Object System.Net.WebClient
34
+ $wc.DownloadFile($url, $dest)
35
+ } catch {
36
+ # Fallback to Invoke-WebRequest
37
+ Invoke-WebRequest -Uri $url -OutFile $dest -UseBasicParsing
38
+ }
51
39
  }
52
40
 
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 安装完成 (可能需要重启)"
41
+ # ── Helper: Install Node.js by downloading binary ─────────
42
+
43
+ function Install-NodeJs-Binary {
44
+ Log "Downloading Node.js LTS binary..."
45
+
46
+ $nodeVersion = "v22.16.0"
47
+ $arch = if ([Environment]::Is64BitOperatingSystem) { "x64" } else { "x86" }
48
+ $filename = "node-$nodeVersion-win-$arch"
49
+ $zipUrl = "https://nodejs.org/dist/$nodeVersion/$filename.zip"
50
+
51
+ $tempDir = Join-Path $env:TEMP "gfcode-node-install"
52
+ $zipFile = Join-Path $tempDir "$filename.zip"
53
+ $extractDir = Join-Path $tempDir $filename
54
+
55
+ # Clean up previous attempts
56
+ if (Test-Path $tempDir) { Remove-Item $tempDir -Recurse -Force }
57
+ New-Item -ItemType Directory -Path $tempDir -Force | Out-Null
58
+
59
+ # Download
60
+ Download-File $zipUrl $zipFile
61
+
62
+ # Extract
63
+ Log "Extracting..."
64
+ Expand-Archive -Path $zipFile -DestinationPath $tempDir -Force
65
+
66
+ # Move to install location
67
+ $installBase = Join-Path $env:USERPROFILE ".gfcode-node"
68
+ if (Test-Path $installBase) { Remove-Item $installBase -Recurse -Force }
69
+ Move-Item $extractDir $installBase
70
+
71
+ # Add to PATH (current session + user env)
72
+ $nodeBin = $installBase
73
+ $env:Path = "$nodeBin;$env:Path"
74
+
75
+ # Persist to user PATH
76
+ $userPath = [System.Environment]::GetEnvironmentVariable("Path", "User")
77
+ if ($userPath -notlike "*$nodeBin*") {
78
+ [System.Environment]::SetEnvironmentVariable("Path", "$nodeBin;$userPath", "User")
80
79
  }
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
80
+
81
+ # Cleanup
82
+ Remove-Item $tempDir -Recurse -Force -ErrorAction SilentlyContinue
83
+
84
+ # Verify
85
+ try {
86
+ $ver = & "$nodeBin\node.exe" --version
87
+ Ok "Node.js $ver (portable)"
88
+ return $true
89
+ } catch {
90
+ return $false
93
91
  }
94
92
  }
95
93
 
96
- # ============== Step 3: Clone/Update Repository ==============
97
- Write-Step "准备安装 Thatgfsj Code..."
94
+ # ── Step 1: Check / Install Node.js ───────────────────────
95
+
96
+ Step "Checking Node.js..."
98
97
 
99
- $installDir = Join-Path $env:USERPROFILE "thatgfsj-code"
98
+ $nodeOk = $false
100
99
 
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
100
+ # Check if node is available
101
+ try {
102
+ $ver = node --version 2>$null
103
+ if ($ver) {
104
+ $major = [int]($ver -replace 'v(\d+)\..*', '$1')
105
+ if ($major -ge 18) {
106
+ Ok "Node.js $ver"
107
+ $nodeOk = $true
108
+ } else {
109
+ Log "Node.js $ver found but too old (need 18+)"
109
110
  }
110
111
  }
111
- } else {
112
- if (-not $DryRun) {
113
- Write-Info "正在克隆仓库..."
114
- git clone https://github.com/Thatgfsj/thatgfsj-code.git $installDir
115
- Set-Location $installDir
112
+ } catch {}
113
+
114
+ if (-not $nodeOk) {
115
+ Log "Node.js 18+ not found."
116
+
117
+ # Try 1: winget
118
+ if (-not $nodeOk -and (Get-Command winget -ErrorAction SilentlyContinue)) {
119
+ Log "Trying winget..."
120
+ try {
121
+ winget install OpenJS.NodeJS.LTS --accept-package-agreements --accept-source-agreements 2>&1 | Out-Null
122
+ Refresh-Path
123
+ $ver = node --version 2>$null
124
+ if ($ver -and [int]($ver -replace 'v(\d+)\..*', '$1') -ge 18) {
125
+ Ok "Node.js $ver via winget"
126
+ $nodeOk = $true
127
+ }
128
+ } catch {}
116
129
  }
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
130
 
126
- # ============== Step 4: Install Dependencies ==============
127
- Write-Step "安装依赖..."
131
+ # Try 2: choco
132
+ if (-not $nodeOk -and (Get-Command choco -ErrorAction SilentlyContinue)) {
133
+ Log "Trying Chocolatey..."
134
+ try {
135
+ choco install nodejs-lts -y 2>&1 | Out-Null
136
+ Refresh-Path
137
+ $ver = node --version 2>$null
138
+ if ($ver -and [int]($ver -replace 'v(\d+)\..*', '$1') -ge 18) {
139
+ Ok "Node.js $ver via Chocolatey"
140
+ $nodeOk = $true
141
+ }
142
+ } catch {}
143
+ }
128
144
 
129
- if (-not $DryRun) {
130
- Set-Location $installDir
131
- npm install
132
- if ($LASTEXITCODE -ne 0) {
133
- Write-Error "npm install 失败"
134
- exit 1
145
+ # Try 3: Direct download (works on any machine)
146
+ if (-not $nodeOk) {
147
+ $nodeOk = Install-NodeJs-Binary
135
148
  }
136
-
137
- Write-Info "编译 TypeScript..."
138
- npm run build
139
- if ($LASTEXITCODE -ne 0) {
140
- Write-Error "编译失败"
149
+
150
+ if (-not $nodeOk) {
151
+ Fail "Failed to install Node.js"
152
+ Log "Please install manually: https://nodejs.org"
141
153
  exit 1
142
154
  }
143
155
  }
144
- Write-Success "依赖安装完成"
145
156
 
146
- # ============== Step 5: Link Command ==============
147
- Write-Step "设置命令..."
157
+ # ── Step 2: Install gfcode via npm ────────────────────────
158
+
159
+ Step "Installing thatgfsj-code..."
160
+
161
+ $npmPath = Join-Path (Split-Path (Get-Command node).Source) "npm.cmd"
162
+ $npmGlobalPrefix = & node -e "console.log(require('path').resolve(process.execPath, '..','..'))" 2>$null
163
+ $npmBinDir = Join-Path $npmGlobalPrefix "bin"
148
164
 
149
- if (-not $DryRun) {
150
- npm link
165
+ # Install globally
166
+ $env:npm_config_prefix = $npmGlobalPrefix
167
+ & node (Join-Path (Split-Path (Get-Command node).Source) "node_modules\npm\bin\npm-cli.js") install -g thatgfsj-code 2>&1 | Out-Null
168
+
169
+ if ($LASTEXITCODE -ne 0) {
170
+ # Fallback: try npm directly
171
+ npm install -g thatgfsj-code 2>&1 | Out-Null
151
172
  }
152
- Write-Success "命令 'gfcode' 已可用"
153
173
 
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=""}
174
+ if ($LASTEXITCODE -ne 0) {
175
+ Fail "npm install failed"
176
+ exit 1
166
177
  }
167
178
 
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
179
+ Ok "thatgfsj-code installed"
180
+
181
+ # Make sure gfcode is in PATH for this session
182
+ $npmBin = Join-Path $npmGlobalPrefix "bin"
183
+ if (Test-Path $npmBin) {
184
+ $env:Path = "$npmBin;$env:Path"
174
185
  }
175
- Write-Host ""
176
186
 
177
- if ($NoOpen) {
178
- Write-Host " 使用 --NoOpen 跳过配置" -ForegroundColor Gray
187
+ # ── Step 3: Verify ────────────────────────────────────────
188
+
189
+ Step "Verifying..."
190
+
191
+ $gfcodePath = Get-Command gfcode -ErrorAction SilentlyContinue
192
+ if ($gfcodePath) {
193
+ $cliVer = gfcode --version 2>$null
194
+ Ok "gfcode v$cliVer"
179
195
  } 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
- }
196
+ # Try direct path
197
+ $directPath = Join-Path $npmGlobalPrefix "bin\gfcode.cmd"
198
+ if (Test-Path $directPath) {
199
+ Ok "gfcode installed at $directPath"
200
+ Log "You may need to restart your terminal."
201
+ } else {
202
+ Ok "gfcode installed (restart terminal if command not found)"
221
203
  }
222
204
  }
223
205
 
224
- # ============== Done ==============
206
+ # ── Done ──────────────────────────────────────────────────
207
+
225
208
  Write-Host ""
226
- Write-Host " ======================================" -ForegroundColor Cyan
227
- Write-Success " 安装完成!"
228
- Write-Host " ======================================" -ForegroundColor Cyan
209
+ Write-Host " ────────────────────────────────" -ForegroundColor DarkGray
210
+ Write-Host " Done!" -ForegroundColor Green
229
211
  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
212
+ Write-Host " Next steps:" -ForegroundColor White
213
+ Write-Host " gfcode init " -ForegroundColor Cyan -NoNewline; Write-Host "# Configure API key" -ForegroundColor DarkGray
214
+ Write-Host " gfcode " -ForegroundColor Cyan -NoNewline; Write-Host "# Start coding" -ForegroundColor DarkGray
236
215
  Write-Host ""
237
- Write-Host " 文档: https://github.com/Thatgfsj/thatgfsj-code" -ForegroundColor Gray
216
+ Write-Host " Docs: https://github.com/Thatgfsj/thatgfsj-code" -ForegroundColor DarkGray
238
217
  Write-Host ""