thatgfsj-code 0.3.0 → 0.3.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 (262) hide show
  1. package/CHANGELOG.md +229 -0
  2. package/DEVELOPMENT.md +286 -0
  3. package/README.md +144 -79
  4. package/dist/agent/core.d.ts +56 -0
  5. package/dist/agent/core.d.ts.map +1 -0
  6. package/dist/agent/core.js +142 -0
  7. package/dist/agent/core.js.map +1 -0
  8. package/dist/agent/index.d.ts +8 -0
  9. package/dist/agent/index.d.ts.map +1 -0
  10. package/dist/agent/index.js +8 -0
  11. package/dist/agent/index.js.map +1 -0
  12. package/dist/agent/intent.d.ts +36 -0
  13. package/dist/agent/intent.d.ts.map +1 -0
  14. package/dist/agent/intent.js +146 -0
  15. package/dist/agent/intent.js.map +1 -0
  16. package/dist/agent/streaming.d.ts +50 -0
  17. package/dist/agent/streaming.d.ts.map +1 -0
  18. package/dist/agent/streaming.js +110 -0
  19. package/dist/agent/streaming.js.map +1 -0
  20. package/dist/core/ai-engine.d.ts +76 -0
  21. package/dist/core/ai-engine.d.ts.map +1 -0
  22. package/dist/core/ai-engine.js +394 -0
  23. package/dist/core/ai-engine.js.map +1 -0
  24. package/dist/core/cli.d.ts +21 -0
  25. package/dist/core/cli.d.ts.map +1 -0
  26. package/dist/core/cli.js +143 -0
  27. package/dist/core/cli.js.map +1 -0
  28. package/dist/core/config.d.ts +55 -0
  29. package/dist/core/config.d.ts.map +1 -0
  30. package/dist/core/config.js +162 -0
  31. package/dist/core/config.js.map +1 -0
  32. package/dist/core/context-compactor.d.ts +54 -0
  33. package/dist/core/context-compactor.d.ts.map +1 -0
  34. package/dist/core/context-compactor.js +197 -0
  35. package/dist/core/context-compactor.js.map +1 -0
  36. package/dist/core/hooks.d.ts +75 -0
  37. package/dist/core/hooks.d.ts.map +1 -0
  38. package/dist/core/hooks.js +146 -0
  39. package/dist/core/hooks.js.map +1 -0
  40. package/dist/core/permissions.d.ts +52 -0
  41. package/dist/core/permissions.d.ts.map +1 -0
  42. package/dist/core/permissions.js +237 -0
  43. package/dist/core/permissions.js.map +1 -0
  44. package/dist/core/session.d.ts +54 -0
  45. package/dist/core/session.d.ts.map +1 -0
  46. package/dist/core/session.js +147 -0
  47. package/dist/core/session.js.map +1 -0
  48. package/dist/core/skills.d.ts +60 -0
  49. package/dist/core/skills.d.ts.map +1 -0
  50. package/dist/core/skills.js +175 -0
  51. package/dist/core/skills.js.map +1 -0
  52. package/dist/core/state.d.ts +60 -0
  53. package/dist/core/state.d.ts.map +1 -0
  54. package/dist/core/state.js +106 -0
  55. package/dist/core/state.js.map +1 -0
  56. package/dist/core/subagent.d.ts +68 -0
  57. package/dist/core/subagent.d.ts.map +1 -0
  58. package/dist/core/subagent.js +142 -0
  59. package/dist/core/subagent.js.map +1 -0
  60. package/dist/core/system-prompt.d.ts +40 -0
  61. package/dist/core/system-prompt.d.ts.map +1 -0
  62. package/dist/core/system-prompt.js +138 -0
  63. package/dist/core/system-prompt.js.map +1 -0
  64. package/dist/core/tool-registry.d.ts +53 -0
  65. package/dist/core/tool-registry.d.ts.map +1 -0
  66. package/dist/core/tool-registry.js +138 -0
  67. package/dist/core/tool-registry.js.map +1 -0
  68. package/dist/core/types.d.ts +206 -0
  69. package/dist/core/types.d.ts.map +1 -0
  70. package/dist/core/types.js +127 -0
  71. package/dist/core/types.js.map +1 -0
  72. package/dist/index.d.ts +7 -0
  73. package/dist/{cmd/index.d.ts.map → index.d.ts.map} +1 -1
  74. package/dist/index.js +472 -0
  75. package/dist/index.js.map +1 -0
  76. package/dist/mcp/client.d.ts +1 -1
  77. package/dist/mcp/client.d.ts.map +1 -1
  78. package/dist/repl/index.d.ts +8 -0
  79. package/dist/repl/index.d.ts.map +1 -0
  80. package/dist/repl/index.js +8 -0
  81. package/dist/repl/index.js.map +1 -0
  82. package/dist/repl/input.d.ts +69 -0
  83. package/dist/repl/input.d.ts.map +1 -0
  84. package/dist/repl/input.js +139 -0
  85. package/dist/repl/input.js.map +1 -0
  86. package/dist/repl/loop.d.ts +184 -0
  87. package/dist/repl/loop.d.ts.map +1 -0
  88. package/dist/repl/loop.js +932 -0
  89. package/dist/repl/loop.js.map +1 -0
  90. package/dist/repl/output.d.ts +105 -0
  91. package/dist/repl/output.d.ts.map +1 -0
  92. package/dist/repl/output.js +199 -0
  93. package/dist/repl/output.js.map +1 -0
  94. package/dist/repl/welcome.d.ts +68 -0
  95. package/dist/repl/welcome.d.ts.map +1 -0
  96. package/dist/repl/welcome.js +254 -0
  97. package/dist/repl/welcome.js.map +1 -0
  98. package/dist/tools/file.d.ts +1 -1
  99. package/dist/tools/file.d.ts.map +1 -1
  100. package/dist/tools/git.d.ts +1 -1
  101. package/dist/tools/git.d.ts.map +1 -1
  102. package/dist/tools/index.d.ts +15 -35
  103. package/dist/tools/index.d.ts.map +1 -1
  104. package/dist/tools/index.js +31 -80
  105. package/dist/tools/index.js.map +1 -1
  106. package/dist/tools/search.d.ts +1 -1
  107. package/dist/tools/search.d.ts.map +1 -1
  108. package/dist/tools/shell.d.ts +11 -4
  109. package/dist/tools/shell.d.ts.map +1 -1
  110. package/dist/tools/shell.js +78 -42
  111. package/dist/tools/shell.js.map +1 -1
  112. package/dist/utils/diff-preview.d.ts +42 -0
  113. package/dist/utils/diff-preview.d.ts.map +1 -0
  114. package/dist/utils/diff-preview.js +174 -0
  115. package/dist/utils/diff-preview.js.map +1 -0
  116. package/dist/utils/index.d.ts +8 -0
  117. package/dist/utils/index.d.ts.map +1 -0
  118. package/dist/utils/index.js +8 -0
  119. package/dist/utils/index.js.map +1 -0
  120. package/dist/utils/memory.d.ts +81 -0
  121. package/dist/utils/memory.d.ts.map +1 -0
  122. package/dist/utils/memory.js +186 -0
  123. package/dist/utils/memory.js.map +1 -0
  124. package/dist/utils/project-context.d.ts +62 -0
  125. package/dist/utils/project-context.d.ts.map +1 -0
  126. package/dist/utils/project-context.js +197 -0
  127. package/dist/utils/project-context.js.map +1 -0
  128. package/docs/API_KEY_GUIDE.md +6 -0
  129. package/docs/FAQ.md +25 -3
  130. package/package.json +41 -9
  131. package/ROADMAP.md +0 -61
  132. package/dist/app/agent.d.ts +0 -31
  133. package/dist/app/agent.d.ts.map +0 -1
  134. package/dist/app/agent.js +0 -106
  135. package/dist/app/agent.js.map +0 -1
  136. package/dist/app/index.d.ts +0 -39
  137. package/dist/app/index.d.ts.map +0 -1
  138. package/dist/app/index.js +0 -80
  139. package/dist/app/index.js.map +0 -1
  140. package/dist/cmd/index.d.ts +0 -12
  141. package/dist/cmd/index.js +0 -85
  142. package/dist/cmd/index.js.map +0 -1
  143. package/dist/config/index.d.ts +0 -39
  144. package/dist/config/index.d.ts.map +0 -1
  145. package/dist/config/index.js +0 -110
  146. package/dist/config/index.js.map +0 -1
  147. package/dist/config/providers.d.ts +0 -23
  148. package/dist/config/providers.d.ts.map +0 -1
  149. package/dist/config/providers.js +0 -152
  150. package/dist/config/providers.js.map +0 -1
  151. package/dist/config/types.d.ts +0 -33
  152. package/dist/config/types.d.ts.map +0 -1
  153. package/dist/config/types.js +0 -5
  154. package/dist/config/types.js.map +0 -1
  155. package/dist/hooks/index.d.ts +0 -31
  156. package/dist/hooks/index.d.ts.map +0 -1
  157. package/dist/hooks/index.js +0 -71
  158. package/dist/hooks/index.js.map +0 -1
  159. package/dist/llm/anthropic.d.ts +0 -17
  160. package/dist/llm/anthropic.d.ts.map +0 -1
  161. package/dist/llm/anthropic.js +0 -126
  162. package/dist/llm/anthropic.js.map +0 -1
  163. package/dist/llm/gemini.d.ts +0 -16
  164. package/dist/llm/gemini.d.ts.map +0 -1
  165. package/dist/llm/gemini.js +0 -107
  166. package/dist/llm/gemini.js.map +0 -1
  167. package/dist/llm/index.d.ts +0 -48
  168. package/dist/llm/index.d.ts.map +0 -1
  169. package/dist/llm/index.js +0 -174
  170. package/dist/llm/index.js.map +0 -1
  171. package/dist/llm/openai.d.ts +0 -17
  172. package/dist/llm/openai.d.ts.map +0 -1
  173. package/dist/llm/openai.js +0 -113
  174. package/dist/llm/openai.js.map +0 -1
  175. package/dist/llm/provider.d.ts +0 -33
  176. package/dist/llm/provider.d.ts.map +0 -1
  177. package/dist/llm/provider.js +0 -6
  178. package/dist/llm/provider.js.map +0 -1
  179. package/dist/prompts/index.d.ts +0 -27
  180. package/dist/prompts/index.d.ts.map +0 -1
  181. package/dist/prompts/index.js +0 -102
  182. package/dist/prompts/index.js.map +0 -1
  183. package/dist/session/compactor.d.ts +0 -48
  184. package/dist/session/compactor.d.ts.map +0 -1
  185. package/dist/session/compactor.js +0 -77
  186. package/dist/session/compactor.js.map +0 -1
  187. package/dist/session/index.d.ts +0 -48
  188. package/dist/session/index.d.ts.map +0 -1
  189. package/dist/session/index.js +0 -69
  190. package/dist/session/index.js.map +0 -1
  191. package/dist/session/message.d.ts +0 -26
  192. package/dist/session/message.d.ts.map +0 -1
  193. package/dist/session/message.js +0 -34
  194. package/dist/session/message.js.map +0 -1
  195. package/dist/tools/types.d.ts +0 -68
  196. package/dist/tools/types.d.ts.map +0 -1
  197. package/dist/tools/types.js +0 -57
  198. package/dist/tools/types.js.map +0 -1
  199. package/dist/tui/index.d.ts +0 -8
  200. package/dist/tui/index.d.ts.map +0 -1
  201. package/dist/tui/index.js +0 -8
  202. package/dist/tui/index.js.map +0 -1
  203. package/dist/tui/input.d.ts +0 -14
  204. package/dist/tui/input.d.ts.map +0 -1
  205. package/dist/tui/input.js +0 -50
  206. package/dist/tui/input.js.map +0 -1
  207. package/dist/tui/output.d.ts +0 -20
  208. package/dist/tui/output.d.ts.map +0 -1
  209. package/dist/tui/output.js +0 -70
  210. package/dist/tui/output.js.map +0 -1
  211. package/dist/tui/repl.d.ts +0 -25
  212. package/dist/tui/repl.d.ts.map +0 -1
  213. package/dist/tui/repl.js +0 -114
  214. package/dist/tui/repl.js.map +0 -1
  215. package/dist/tui/welcome.d.ts +0 -15
  216. package/dist/tui/welcome.d.ts.map +0 -1
  217. package/dist/tui/welcome.js +0 -86
  218. package/dist/tui/welcome.js.map +0 -1
  219. package/dist/types.d.ts +0 -38
  220. package/dist/types.d.ts.map +0 -1
  221. package/dist/types.js +0 -6
  222. package/dist/types.js.map +0 -1
  223. package/dist/utils/diff.d.ts +0 -22
  224. package/dist/utils/diff.d.ts.map +0 -1
  225. package/dist/utils/diff.js +0 -60
  226. package/dist/utils/diff.js.map +0 -1
  227. package/dist/utils/project.d.ts +0 -32
  228. package/dist/utils/project.d.ts.map +0 -1
  229. package/dist/utils/project.js +0 -89
  230. package/dist/utils/project.js.map +0 -1
  231. package/src/app/agent.ts +0 -140
  232. package/src/app/index.ts +0 -101
  233. package/src/cmd/index.ts +0 -96
  234. package/src/config/index.ts +0 -130
  235. package/src/config/providers.ts +0 -160
  236. package/src/config/types.ts +0 -46
  237. package/src/hooks/index.ts +0 -111
  238. package/src/llm/anthropic.ts +0 -146
  239. package/src/llm/gemini.ts +0 -127
  240. package/src/llm/index.ts +0 -209
  241. package/src/llm/openai.ts +0 -132
  242. package/src/llm/provider.ts +0 -38
  243. package/src/mcp/client.ts +0 -330
  244. package/src/prompts/index.ts +0 -123
  245. package/src/session/compactor.ts +0 -103
  246. package/src/session/index.ts +0 -81
  247. package/src/session/message.ts +0 -42
  248. package/src/tools/file.ts +0 -117
  249. package/src/tools/git.ts +0 -132
  250. package/src/tools/index.ts +0 -108
  251. package/src/tools/search.ts +0 -263
  252. package/src/tools/shell.ts +0 -136
  253. package/src/tools/types.ts +0 -122
  254. package/src/tui/index.ts +0 -8
  255. package/src/tui/input.ts +0 -56
  256. package/src/tui/output.ts +0 -83
  257. package/src/tui/repl.ts +0 -131
  258. package/src/tui/welcome.ts +0 -101
  259. package/src/types.ts +0 -42
  260. package/src/utils/diff.ts +0 -71
  261. package/src/utils/project.ts +0 -99
  262. package/tsconfig.json +0 -19
@@ -0,0 +1,186 @@
1
+ /**
2
+ * Session Memory - Remember modifications during conversation
3
+ */
4
+ import { readFileSync, writeFileSync, existsSync, mkdirSync } from 'fs';
5
+ import { join } from 'path';
6
+ import { homedir } from 'os';
7
+ export class SessionMemory {
8
+ entries = [];
9
+ sessionId;
10
+ memoryFile;
11
+ constructor(sessionId) {
12
+ this.sessionId = sessionId || this.generateId();
13
+ }
14
+ /**
15
+ * Add an entry to memory
16
+ */
17
+ add(entry) {
18
+ this.entries.push({
19
+ ...entry,
20
+ id: this.generateId(),
21
+ timestamp: Date.now()
22
+ });
23
+ }
24
+ /**
25
+ * Record file read
26
+ */
27
+ recordRead(path, lines) {
28
+ this.add({
29
+ type: 'file_read',
30
+ description: `Read ${path}`,
31
+ details: { path, lines }
32
+ });
33
+ }
34
+ /**
35
+ * Record file write
36
+ */
37
+ recordWrite(path, content) {
38
+ this.add({
39
+ type: 'file_write',
40
+ description: `Wrote ${path}`,
41
+ details: { path, size: content?.length || 0 }
42
+ });
43
+ }
44
+ /**
45
+ * Record file edit
46
+ */
47
+ recordEdit(path, operation) {
48
+ this.add({
49
+ type: 'file_edit',
50
+ description: `Edited ${path}: ${operation}`,
51
+ details: { path, operation }
52
+ });
53
+ }
54
+ /**
55
+ * Record command execution
56
+ */
57
+ recordCommand(command, output) {
58
+ this.add({
59
+ type: 'command',
60
+ description: `Executed: ${command}`,
61
+ details: { command, output: output?.slice(0, 200) }
62
+ });
63
+ }
64
+ /**
65
+ * Record git operation
66
+ */
67
+ recordGit(operation, result) {
68
+ this.add({
69
+ type: 'git',
70
+ description: `Git ${operation}`,
71
+ details: { operation, result: result.slice(0, 200) }
72
+ });
73
+ }
74
+ /**
75
+ * Record a note
76
+ */
77
+ recordNote(note) {
78
+ this.add({
79
+ type: 'note',
80
+ description: note,
81
+ details: {}
82
+ });
83
+ }
84
+ /**
85
+ * Get all entries
86
+ */
87
+ getEntries() {
88
+ return [...this.entries];
89
+ }
90
+ /**
91
+ * Get recent entries
92
+ */
93
+ getRecent(count = 10) {
94
+ return this.entries.slice(-count);
95
+ }
96
+ /**
97
+ * Get entries by type
98
+ */
99
+ getByType(type) {
100
+ return this.entries.filter(e => e.type === type);
101
+ }
102
+ /**
103
+ * Search entries
104
+ */
105
+ search(query) {
106
+ const lower = query.toLowerCase();
107
+ return this.entries.filter(e => e.description.toLowerCase().includes(lower) ||
108
+ JSON.stringify(e.details).toLowerCase().includes(lower));
109
+ }
110
+ /**
111
+ * Get summary
112
+ */
113
+ getSummary() {
114
+ if (this.entries.length === 0) {
115
+ return 'No actions recorded yet.';
116
+ }
117
+ const types = this.entries.reduce((acc, e) => {
118
+ acc[e.type] = (acc[e.type] || 0) + 1;
119
+ return acc;
120
+ }, {});
121
+ const lines = ['📋 Session Summary:'];
122
+ for (const [type, count] of Object.entries(types)) {
123
+ const emoji = {
124
+ 'file_read': '📖',
125
+ 'file_write': '✍️',
126
+ 'file_edit': '📝',
127
+ 'command': '⚡',
128
+ 'git': '📊',
129
+ 'note': '📌'
130
+ }[type] || '•';
131
+ lines.push(` ${emoji} ${type}: ${count}`);
132
+ }
133
+ return lines.join('\n');
134
+ }
135
+ /**
136
+ * Export to file
137
+ */
138
+ save() {
139
+ if (!this.memoryFile) {
140
+ const homeDir = homedir();
141
+ const memDir = join(homeDir, '.thatgfsj', 'memory');
142
+ if (!existsSync(memDir)) {
143
+ mkdirSync(memDir, { recursive: true });
144
+ }
145
+ this.memoryFile = join(memDir, `${this.sessionId}.json`);
146
+ }
147
+ writeFileSync(this.memoryFile, JSON.stringify({
148
+ sessionId: this.sessionId,
149
+ entries: this.entries,
150
+ savedAt: Date.now()
151
+ }, null, 2));
152
+ }
153
+ /**
154
+ * Load from file
155
+ */
156
+ load(sessionId) {
157
+ const homeDir = homedir();
158
+ const memoryFile = join(homeDir, '.thatgfsj', 'memory', `${sessionId}.json`);
159
+ if (!existsSync(memoryFile)) {
160
+ return false;
161
+ }
162
+ try {
163
+ const data = JSON.parse(readFileSync(memoryFile, 'utf-8'));
164
+ this.entries = data.entries || [];
165
+ this.sessionId = data.sessionId;
166
+ this.memoryFile = memoryFile;
167
+ return true;
168
+ }
169
+ catch {
170
+ return false;
171
+ }
172
+ }
173
+ /**
174
+ * Clear memory
175
+ */
176
+ clear() {
177
+ this.entries = [];
178
+ }
179
+ /**
180
+ * Generate unique ID
181
+ */
182
+ generateId() {
183
+ return `${Date.now()}_${Math.random().toString(36).substring(2, 9)}`;
184
+ }
185
+ }
186
+ //# sourceMappingURL=memory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory.js","sourceRoot":"","sources":["../../src/utils/memory.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,62 @@
1
+ /**
2
+ * Project Context - Auto-detect and read project files
3
+ */
4
+ export interface ProjectInfo {
5
+ root: string;
6
+ name: string;
7
+ language: string;
8
+ buildTool?: string;
9
+ gitIgnore: string[];
10
+ files: string[];
11
+ hasGit: boolean;
12
+ packageJson?: PackageJson;
13
+ }
14
+ export interface PackageJson {
15
+ name: string;
16
+ version: string;
17
+ description?: string;
18
+ scripts?: Record<string, string>;
19
+ dependencies?: Record<string, string>;
20
+ devDependencies?: Record<string, string>;
21
+ }
22
+ export declare class ProjectContext {
23
+ private root;
24
+ constructor(root?: string);
25
+ /**
26
+ * Detect project type and gather context
27
+ */
28
+ detect(): Promise<ProjectInfo>;
29
+ /**
30
+ * Get project name
31
+ */
32
+ private getProjectName;
33
+ /**
34
+ * Detect primary language
35
+ */
36
+ private detectLanguage;
37
+ /**
38
+ * Detect build tool
39
+ */
40
+ private detectBuildTool;
41
+ /**
42
+ * Read .gitignore
43
+ */
44
+ private readGitIgnore;
45
+ /**
46
+ * Read package.json
47
+ */
48
+ private readPackageJson;
49
+ /**
50
+ * List project files
51
+ */
52
+ private listFiles;
53
+ /**
54
+ * Check if ignored
55
+ */
56
+ private isIgnored;
57
+ /**
58
+ * Get context summary
59
+ */
60
+ getContextSummary(): Promise<string>;
61
+ }
62
+ //# sourceMappingURL=project-context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-context.d.ts","sourceRoot":"","sources":["../../src/utils/project-context.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,MAAM,EAAE,OAAO,CAAC;IAChB,WAAW,CAAC,EAAE,WAAW,CAAC;CAC3B;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC1C;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,IAAI,CAAS;gBAET,IAAI,GAAE,MAAsB;IAIxC;;OAEG;IACG,MAAM,IAAI,OAAO,CAAC,WAAW,CAAC;IAmBpC;;OAEG;IACH,OAAO,CAAC,cAAc;IAQtB;;OAEG;IACH,OAAO,CAAC,cAAc;IAyCtB;;OAEG;IACH,OAAO,CAAC,eAAe;IAUvB;;OAEG;IACH,OAAO,CAAC,aAAa;IASrB;;OAEG;IACH,OAAO,CAAC,eAAe;IAQvB;;OAEG;IACH,OAAO,CAAC,SAAS;IA8BjB;;OAEG;IACH,OAAO,CAAC,SAAS;IAMjB;;OAEG;IACG,iBAAiB,IAAI,OAAO,CAAC,MAAM,CAAC;CAc3C"}
@@ -0,0 +1,197 @@
1
+ /**
2
+ * Project Context - Auto-detect and read project files
3
+ */
4
+ import { readFileSync, existsSync, readdirSync, statSync } from 'fs';
5
+ import { join, relative } from 'path';
6
+ export class ProjectContext {
7
+ root;
8
+ constructor(root = process.cwd()) {
9
+ this.root = root;
10
+ }
11
+ /**
12
+ * Detect project type and gather context
13
+ */
14
+ async detect() {
15
+ const info = {
16
+ root: this.root,
17
+ name: this.getProjectName(),
18
+ language: this.detectLanguage(),
19
+ buildTool: this.detectBuildTool(),
20
+ gitIgnore: this.readGitIgnore(),
21
+ files: this.listFiles(),
22
+ hasGit: existsSync(join(this.root, '.git'))
23
+ };
24
+ const pkg = this.readPackageJson();
25
+ if (pkg) {
26
+ info.packageJson = pkg;
27
+ }
28
+ return info;
29
+ }
30
+ /**
31
+ * Get project name
32
+ */
33
+ getProjectName() {
34
+ const pkg = this.readPackageJson();
35
+ if (pkg?.name) {
36
+ return pkg.name;
37
+ }
38
+ return this.root.split(/[\\/]/).pop() || 'unknown';
39
+ }
40
+ /**
41
+ * Detect primary language
42
+ */
43
+ detectLanguage() {
44
+ const langCounts = {};
45
+ const scan = (dir, depth = 0) => {
46
+ if (depth > 3)
47
+ return;
48
+ try {
49
+ const items = readdirSync(dir);
50
+ for (const item of items) {
51
+ if (['node_modules', '.git', 'dist'].includes(item))
52
+ continue;
53
+ const fullPath = join(dir, item);
54
+ try {
55
+ const stat = statSync(fullPath);
56
+ if (stat.isDirectory()) {
57
+ scan(fullPath, depth + 1);
58
+ }
59
+ else if (stat.isFile()) {
60
+ const ext = item.split('.').pop()?.toLowerCase();
61
+ if (ext)
62
+ langCounts[ext] = (langCounts[ext] || 0) + 1;
63
+ }
64
+ }
65
+ catch { /* skip */ }
66
+ }
67
+ }
68
+ catch { /* skip */ }
69
+ };
70
+ scan(this.root);
71
+ const extToLang = {
72
+ 'ts': 'TypeScript', 'tsx': 'TypeScript',
73
+ 'js': 'JavaScript', 'jsx': 'JavaScript', 'mjs': 'JavaScript',
74
+ 'py': 'Python', 'java': 'Java', 'go': 'Go', 'rs': 'Rust',
75
+ 'c': 'C/C++', 'cpp': 'C/C++', 'h': 'C/C++', 'hpp': 'C/C++',
76
+ 'cs': 'C#', 'rb': 'Ruby', 'php': 'PHP',
77
+ };
78
+ for (const [ext, count] of Object.entries(langCounts)) {
79
+ const lang = extToLang[ext];
80
+ if (lang && count > 0)
81
+ return lang;
82
+ }
83
+ return 'Unknown';
84
+ }
85
+ /**
86
+ * Detect build tool
87
+ */
88
+ detectBuildTool() {
89
+ if (existsSync(join(this.root, 'package.json')))
90
+ return 'npm/yarn/pnpm';
91
+ if (existsSync(join(this.root, 'Cargo.toml')))
92
+ return 'Cargo';
93
+ if (existsSync(join(this.root, 'go.mod')))
94
+ return 'Go';
95
+ if (existsSync(join(this.root, 'pom.xml')))
96
+ return 'Maven';
97
+ if (existsSync(join(this.root, 'build.gradle')))
98
+ return 'Gradle';
99
+ if (existsSync(join(this.root, 'Makefile')))
100
+ return 'Make';
101
+ return undefined;
102
+ }
103
+ /**
104
+ * Read .gitignore
105
+ */
106
+ readGitIgnore() {
107
+ const path = join(this.root, '.gitignore');
108
+ if (!existsSync(path))
109
+ return [];
110
+ try {
111
+ return readFileSync(path, 'utf-8').split('\n')
112
+ .map(l => l.trim()).filter(l => l && !l.startsWith('#'));
113
+ }
114
+ catch {
115
+ return [];
116
+ }
117
+ }
118
+ /**
119
+ * Read package.json
120
+ */
121
+ readPackageJson() {
122
+ const path = join(this.root, 'package.json');
123
+ if (!existsSync(path))
124
+ return null;
125
+ try {
126
+ return JSON.parse(readFileSync(path, 'utf-8'));
127
+ }
128
+ catch {
129
+ return null;
130
+ }
131
+ }
132
+ /**
133
+ * List project files
134
+ */
135
+ listFiles(maxFiles = 100) {
136
+ const files = [];
137
+ const gitIgnore = this.readGitIgnore();
138
+ const scan = (dir, depth = 0) => {
139
+ if (depth > 4 || files.length >= maxFiles)
140
+ return;
141
+ try {
142
+ const items = readdirSync(dir);
143
+ for (const item of items) {
144
+ if (files.length >= maxFiles)
145
+ break;
146
+ if (this.isIgnored(item, gitIgnore))
147
+ continue;
148
+ const fullPath = join(dir, item);
149
+ const relPath = relative(this.root, fullPath);
150
+ try {
151
+ const stat = statSync(fullPath);
152
+ if (stat.isDirectory()) {
153
+ files.push(relPath + '/');
154
+ scan(fullPath, depth + 1);
155
+ }
156
+ else if (stat.isFile()) {
157
+ files.push(relPath);
158
+ }
159
+ }
160
+ catch { /* skip */ }
161
+ }
162
+ }
163
+ catch { /* skip */ }
164
+ };
165
+ scan(this.root);
166
+ return files;
167
+ }
168
+ /**
169
+ * Check if ignored
170
+ */
171
+ isIgnored(name, gitIgnore) {
172
+ const common = ['node_modules', '.git', 'dist', 'build', '__pycache__', '.env'];
173
+ if (common.includes(name))
174
+ return true;
175
+ return gitIgnore.includes(name);
176
+ }
177
+ /**
178
+ * Get context summary
179
+ */
180
+ async getContextSummary() {
181
+ const info = await this.detect();
182
+ const lines = [`📁 Project: ${info.name}`, `💻 Language: ${info.language}`];
183
+ if (info.buildTool)
184
+ lines.push(`🔧 Build: ${info.buildTool}`);
185
+ if (info.hasGit)
186
+ lines.push(`📊 Git: Yes`);
187
+ if (info.packageJson) {
188
+ lines.push(`📦 Package: ${info.packageJson.name}@${info.packageJson.version}`);
189
+ if (info.packageJson.scripts) {
190
+ lines.push(` Scripts: ${Object.keys(info.packageJson.scripts).slice(0, 5).join(', ')}`);
191
+ }
192
+ }
193
+ lines.push(`📁 Files: ${info.files.length} files scanned`);
194
+ return lines.join('\n');
195
+ }
196
+ }
197
+ //# sourceMappingURL=project-context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-context.js","sourceRoot":"","sources":["../../src/utils/project-context.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,IAAI,CAAC;AACrE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AAsBtC,MAAM,OAAO,cAAc;IACjB,IAAI,CAAS;IAErB,YAAY,OAAe,OAAO,CAAC,GAAG,EAAE;QACtC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,MAAM;QACV,MAAM,IAAI,GAAgB;YACxB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,IAAI,EAAE,IAAI,CAAC,cAAc,EAAE;YAC3B,QAAQ,EAAE,IAAI,CAAC,cAAc,EAAE;YAC/B,SAAS,EAAE,IAAI,CAAC,eAAe,EAAE;YACjC,SAAS,EAAE,IAAI,CAAC,aAAa,EAAE;YAC/B,KAAK,EAAE,IAAI,CAAC,SAAS,EAAE;YACvB,MAAM,EAAE,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;SAC5C,CAAC;QAEF,MAAM,GAAG,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;QACnC,IAAI,GAAG,EAAE,CAAC;YACR,IAAI,CAAC,WAAW,GAAG,GAAG,CAAC;QACzB,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;OAEG;IACK,cAAc;QACpB,MAAM,GAAG,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;QACnC,IAAI,GAAG,EAAE,IAAI,EAAE,CAAC;YACd,OAAO,GAAG,CAAC,IAAI,CAAC;QAClB,CAAC;QACD,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,IAAI,SAAS,CAAC;IACrD,CAAC;IAED;;OAEG;IACK,cAAc;QACpB,MAAM,UAAU,GAA2B,EAAE,CAAC;QAE9C,MAAM,IAAI,GAAG,CAAC,GAAW,EAAE,QAAgB,CAAC,EAAE,EAAE;YAC9C,IAAI,KAAK,GAAG,CAAC;gBAAE,OAAO;YACtB,IAAI,CAAC;gBACH,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;gBAC/B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;oBACzB,IAAI,CAAC,cAAc,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC;wBAAE,SAAS;oBAC9D,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;oBACjC,IAAI,CAAC;wBACH,MAAM,IAAI,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC;wBAChC,IAAI,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;4BACvB,IAAI,CAAC,QAAQ,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;wBAC5B,CAAC;6BAAM,IAAI,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;4BACzB,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,WAAW,EAAE,CAAC;4BACjD,IAAI,GAAG;gCAAE,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;wBACxD,CAAC;oBACH,CAAC;oBAAC,MAAM,CAAC,CAAC,UAAU,CAAC,CAAC;gBACxB,CAAC;YACH,CAAC;YAAC,MAAM,CAAC,CAAC,UAAU,CAAC,CAAC;QACxB,CAAC,CAAC;QAEF,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEhB,MAAM,SAAS,GAA2B;YACxC,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,YAAY;YACvC,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,YAAY;YAC5D,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM;YACxD,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO;YAC1D,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK;SACvC,CAAC;QAEF,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;YACtD,MAAM,IAAI,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC;YAC5B,IAAI,IAAI,IAAI,KAAK,GAAG,CAAC;gBAAE,OAAO,IAAI,CAAC;QACrC,CAAC;QAED,OAAO,SAAS,CAAC;IACnB,CAAC;IAED;;OAEG;IACK,eAAe;QACrB,IAAI,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;YAAE,OAAO,eAAe,CAAC;QACxE,IAAI,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;YAAE,OAAO,OAAO,CAAC;QAC9D,IAAI,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;YAAE,OAAO,IAAI,CAAC;QACvD,IAAI,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;YAAE,OAAO,OAAO,CAAC;QAC3D,IAAI,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;YAAE,OAAO,QAAQ,CAAC;QACjE,IAAI,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;YAAE,OAAO,MAAM,CAAC;QAC3D,OAAO,SAAS,CAAC;IACnB,CAAC;IAED;;OAEG;IACK,aAAa;QACnB,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;QAC3C,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;YAAE,OAAO,EAAE,CAAC;QACjC,IAAI,CAAC;YACH,OAAO,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC;iBAC3C,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;QAC7D,CAAC;QAAC,MAAM,CAAC;YAAC,OAAO,EAAE,CAAC;QAAC,CAAC;IACxB,CAAC;IAED;;OAEG;IACK,eAAe;QACrB,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;QAC7C,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;YAAE,OAAO,IAAI,CAAC;QACnC,IAAI,CAAC;YACH,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;QACjD,CAAC;QAAC,MAAM,CAAC;YAAC,OAAO,IAAI,CAAC;QAAC,CAAC;IAC1B,CAAC;IAED;;OAEG;IACK,SAAS,CAAC,WAAmB,GAAG;QACtC,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,MAAM,SAAS,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;QAEvC,MAAM,IAAI,GAAG,CAAC,GAAW,EAAE,QAAgB,CAAC,EAAE,EAAE;YAC9C,IAAI,KAAK,GAAG,CAAC,IAAI,KAAK,CAAC,MAAM,IAAI,QAAQ;gBAAE,OAAO;YAClD,IAAI,CAAC;gBACH,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;gBAC/B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;oBACzB,IAAI,KAAK,CAAC,MAAM,IAAI,QAAQ;wBAAE,MAAM;oBACpC,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC;wBAAE,SAAS;oBAC9C,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;oBACjC,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;oBAC9C,IAAI,CAAC;wBACH,MAAM,IAAI,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC;wBAChC,IAAI,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;4BACvB,KAAK,CAAC,IAAI,CAAC,OAAO,GAAG,GAAG,CAAC,CAAC;4BAC1B,IAAI,CAAC,QAAQ,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;wBAC5B,CAAC;6BAAM,IAAI,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;4BACzB,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;wBACtB,CAAC;oBACH,CAAC;oBAAC,MAAM,CAAC,CAAC,UAAU,CAAC,CAAC;gBACxB,CAAC;YACH,CAAC;YAAC,MAAM,CAAC,CAAC,UAAU,CAAC,CAAC;QACxB,CAAC,CAAC;QAEF,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChB,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;OAEG;IACK,SAAS,CAAC,IAAY,EAAE,SAAmB;QACjD,MAAM,MAAM,GAAG,CAAC,cAAc,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,CAAC,CAAC;QAChF,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC;YAAE,OAAO,IAAI,CAAC;QACvC,OAAO,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IAClC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,iBAAiB;QACrB,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC;QACjC,MAAM,KAAK,GAAG,CAAC,eAAe,IAAI,CAAC,IAAI,EAAE,EAAE,gBAAgB,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC5E,IAAI,IAAI,CAAC,SAAS;YAAE,KAAK,CAAC,IAAI,CAAC,aAAa,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;QAC9D,IAAI,IAAI,CAAC,MAAM;YAAE,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAC3C,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACrB,KAAK,CAAC,IAAI,CAAC,eAAe,IAAI,CAAC,WAAW,CAAC,IAAI,IAAI,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC,CAAC;YAC/E,IAAI,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC;gBAC7B,KAAK,CAAC,IAAI,CAAC,eAAe,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAC5F,CAAC;QACH,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,aAAa,IAAI,CAAC,KAAK,CAAC,MAAM,gBAAgB,CAAC,CAAC;QAC3D,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;CACF"}
@@ -2,6 +2,9 @@
2
2
 
3
3
  Thatgfsj Code 支持多种 AI 提供商,以下是各提供商 API Key 的获取教程。
4
4
 
5
+ > 贡献者请阅读 [`DEVELOPMENT.md`](../DEVELOPMENT.md);版本变更与已知限制见
6
+ > [`CHANGELOG.md`](../CHANGELOG.md)。
7
+
5
8
  ## 目录
6
9
 
7
10
  1. [SiliconFlow (推荐)](#1-siliconflow-推荐)
@@ -208,6 +211,9 @@ export DEEPSEEK_API_KEY=你的密钥
208
211
 
209
212
  # Ollama
210
213
  export OLLAMA_BASE_URL=http://localhost:11434
214
+
215
+ # 文心一言 (ERNIE) — Access Token 方式
216
+ export ERNIE_API_KEY=你的_access_token
211
217
  ```
212
218
 
213
219
  或者运行 `gfcode init` 交互式配置。
package/docs/FAQ.md CHANGED
@@ -1,11 +1,14 @@
1
1
  # 常见问题 FAQ
2
2
 
3
+ > 贡献者请阅读 [`DEVELOPMENT.md`](../DEVELOPMENT.md),版本变更见
4
+ > [`CHANGELOG.md`](../CHANGELOG.md)。
5
+
3
6
  ## 目录
4
7
 
5
8
  1. [安装问题](#1-安装问题)
6
9
  2. [配置问题](#2-配置问题)
7
10
  3. [使用问题](#3-使用问题)
8
- 4. [ Provider 问题](#4-provider-问题)
11
+ 4. [Provider 问题](#4-provider-问题)
9
12
  5. [其他问题](#5-其他问题)
10
13
 
11
14
  ---
@@ -32,9 +35,10 @@
32
35
 
33
36
  ### Q: 如何配置 API Key?
34
37
 
35
- **A**: 两种方式:
38
+ **A**: 三种方式任选其一:
36
39
  1. 交互式配置(推荐):运行 `gfcode init`
37
- 2. 环境变量:设置对应的环境变量
40
+ 2. 环境变量:设置对应的环境变量(详见 [API_KEY_GUIDE.md](./API_KEY_GUIDE.md))
41
+ 3. 手动编辑 `~/.thatgfsj/config.json`
38
42
 
39
43
  ### Q: 配置文件在哪里?
40
44
 
@@ -148,12 +152,30 @@ gfcode --version
148
152
 
149
153
  ### Q: 如何更新到最新版本?
150
154
 
155
+ **A**:
151
156
  ```bash
157
+ # 源码安装
152
158
  git pull
153
159
  npm install
154
160
  npm run build
161
+
162
+ # 全局 npm 包
163
+ npm install -g thatgfsj-code@latest
155
164
  ```
156
165
 
166
+ ### Q: 启动瞬间报 `ReferenceError: require is not defined`?
167
+
168
+ **A**: 这是 0.2.1 之前的 bug,已经在 **0.2.2** 修复(用 `createRequire(import.meta.url)`)。
169
+ 如果你看到这个错,升级到最新版本即可:
170
+ ```bash
171
+ npm install -g thatgfsj-code@latest
172
+ ```
173
+
174
+ ### Q: REPL 中 Ctrl+C 不能退出?
175
+
176
+ **A**: 0.2.2 起,空输入连续按两次 Ctrl+C 即可退出。0.2.1 之前该路径只会打
177
+ warning,不会退出;升级版本解决。
178
+
157
179
  ### Q: 遇到其他错误怎么办?
158
180
 
159
181
  **A**:
package/package.json CHANGED
@@ -1,27 +1,59 @@
1
1
  {
2
2
  "name": "thatgfsj-code",
3
- "version": "0.3.0",
4
- "description": "Thatgfsj Code - AI Coding Assistant",
5
- "main": "dist/cmd/index.js",
3
+ "version": "0.3.1",
4
+ "description": "Thatgfsj Code - Your AI Coding Assistant",
5
+ "main": "dist/index.js",
6
6
  "type": "module",
7
7
  "bin": {
8
- "thatgfsj": "./dist/cmd/index.js",
9
- "gfcode": "./dist/cmd/index.js"
8
+ "thatgfsj": "./dist/index.js",
9
+ "gfcode": "./dist/index.js"
10
10
  },
11
11
  "scripts": {
12
12
  "build": "tsc",
13
- "start": "node dist/cmd/index.js",
14
- "dev": "tsc && node dist/cmd/index.js",
15
- "link": "npm link"
13
+ "start": "node dist/index.js",
14
+ "dev": "tsc && node dist/index.js",
15
+ "link": "npm link",
16
+ "test": "node --test tests/*.test.js",
17
+ "test:silent": "node --test --test-reporter=dot tests/*.test.js",
18
+ "prepublishOnly": "npm run test && npm run build"
16
19
  },
20
+ "files": [
21
+ "dist",
22
+ "README.md",
23
+ "DEVELOPMENT.md",
24
+ "CHANGELOG.md",
25
+ "LICENSE",
26
+ "docs",
27
+ "install.sh",
28
+ "install.ps1",
29
+ "install.bat"
30
+ ],
17
31
  "keywords": [
18
32
  "ai",
19
33
  "cli",
20
34
  "coding",
21
- "assistant"
35
+ "assistant",
36
+ "anthropic",
37
+ "openai",
38
+ "siliconflow",
39
+ "minimax",
40
+ "kimi",
41
+ "deepseek",
42
+ "ollama"
22
43
  ],
23
44
  "author": "Thatgfsj",
24
45
  "license": "MIT",
46
+ "engines": {
47
+ "node": ">=18"
48
+ },
49
+ "repository": {
50
+ "type": "git",
51
+ "url": "https://github.com/Thatgfsj/thatgfsj-code.git"
52
+ },
53
+ "bugs": {
54
+ "url": "https://github.com/Thatgfsj/thatgfsj-code/issues"
55
+ },
56
+ "homepage": "https://github.com/Thatgfsj/thatgfsj-code#readme",
25
57
  "dependencies": {
26
58
  "chalk": "^5.3.0",
27
59
  "commander": "^11.1.0",
package/ROADMAP.md DELETED
@@ -1,61 +0,0 @@
1
- # Thatgfsj Code - Development Roadmap
2
-
3
- ---
4
-
5
- ## ✅ v0.3.0 - 架构重构 (当前版本)
6
-
7
- ### 核心改进
8
- - [x] 参考 opencode 重构模块化架构
9
- - [x] LLM Provider 抽象层 (OpenAI/Anthropic/Gemini)
10
- - [x] 统一 App 核心服务层
11
- - [x] 精简 CLI 入口 (去掉 explain/debug/chat/template)
12
- - [x] 类型系统整理 (types.ts 拆分到各模块)
13
- - [x] 删除未使用模块 (skills, subagent, state, intent)
14
-
15
- ### 新目录结构
16
- ```
17
- src/
18
- ├── cmd/ # CLI 入口
19
- ├── app/ # 核心服务 + Agent Loop
20
- ├── config/ # 配置 + Provider 定义
21
- ├── llm/ # LLM Provider 抽象
22
- ├── session/ # 会话管理
23
- ├── tools/ # 工具系统
24
- ├── tui/ # 终端 UI
25
- ├── mcp/ # MCP 协议
26
- ├── hooks/ # 钩子系统
27
- ├── prompts/ # 提示构建
28
- └── utils/ # 工具函数
29
- ```
30
-
31
- ---
32
-
33
- ## 📋 未来计划
34
-
35
- ### v0.4.0 - 增强功能
36
- - [ ] SQLite 会话持久化
37
- - [ ] 命令历史持久化
38
- - [ ] 自定义工具插件加载
39
- - [ ] MCP 服务器配置文件支持
40
-
41
- ### v0.5.0 - TUI 升级
42
- - [ ] Ink/React TUI 替换 readline
43
- - [ ] 分屏显示 (代码 + 对话)
44
- - [ ] Vim 模式编辑器
45
- - [ ] 文件变更预览面板
46
-
47
- ### v1.0.0 - 稳定版
48
- - [ ] LSP 集成
49
- - [ ] 多会话管理
50
- - [ ] 插件市场
51
- - [ ] 完整测试覆盖
52
-
53
- ---
54
-
55
- ## 已完成的历史阶段
56
-
57
- ### ✅ v0.1.0 - REPL 基础
58
- - 彩色 UI、命令提示符、Ctrl+C 中断、内置命令
59
-
60
- ### ✅ v0.2.0 - 工具 + LLM
61
- - Git/搜索工具、多 Provider 支持、流式输出、意图识别