thatgfsj-code 1.0.3 → 3.0.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 (184) hide show
  1. package/CHANGELOG.md +192 -0
  2. package/DEVELOPMENT.md +286 -0
  3. package/dist/app/index.d.ts +40 -3
  4. package/dist/app/index.d.ts.map +1 -1
  5. package/dist/app/index.js +87 -12
  6. package/dist/app/index.js.map +1 -1
  7. package/dist/cache/fingerprint.d.ts +49 -0
  8. package/dist/cache/fingerprint.d.ts.map +1 -0
  9. package/dist/cache/fingerprint.js +100 -0
  10. package/dist/cache/fingerprint.js.map +1 -0
  11. package/dist/cache/index.d.ts +15 -0
  12. package/dist/cache/index.d.ts.map +1 -0
  13. package/dist/cache/index.js +15 -0
  14. package/dist/cache/index.js.map +1 -0
  15. package/dist/cache/smartModel.d.ts +40 -0
  16. package/dist/cache/smartModel.d.ts.map +1 -0
  17. package/dist/cache/smartModel.js +43 -0
  18. package/dist/cache/smartModel.js.map +1 -0
  19. package/dist/cache/stats.d.ts +93 -0
  20. package/dist/cache/stats.d.ts.map +1 -0
  21. package/dist/cache/stats.js +155 -0
  22. package/dist/cache/stats.js.map +1 -0
  23. package/dist/cache/volatile.d.ts +32 -0
  24. package/dist/cache/volatile.d.ts.map +1 -0
  25. package/dist/cache/volatile.js +44 -0
  26. package/dist/cache/volatile.js.map +1 -0
  27. package/dist/cmd/index.d.ts +21 -0
  28. package/dist/cmd/index.d.ts.map +1 -1
  29. package/dist/cmd/index.js +155 -31
  30. package/dist/cmd/index.js.map +1 -1
  31. package/dist/config/index.d.ts.map +1 -1
  32. package/dist/config/index.js +8 -0
  33. package/dist/config/index.js.map +1 -1
  34. package/dist/config/types.d.ts +14 -0
  35. package/dist/config/types.d.ts.map +1 -1
  36. package/dist/llm/anthropic.d.ts +55 -5
  37. package/dist/llm/anthropic.d.ts.map +1 -1
  38. package/dist/llm/anthropic.js +172 -26
  39. package/dist/llm/anthropic.js.map +1 -1
  40. package/dist/llm/index.d.ts +26 -8
  41. package/dist/llm/index.d.ts.map +1 -1
  42. package/dist/llm/index.js +83 -15
  43. package/dist/llm/index.js.map +1 -1
  44. package/dist/llm/openai.d.ts +28 -8
  45. package/dist/llm/openai.d.ts.map +1 -1
  46. package/dist/llm/openai.js +58 -8
  47. package/dist/llm/openai.js.map +1 -1
  48. package/dist/llm/provider.d.ts +40 -8
  49. package/dist/llm/provider.d.ts.map +1 -1
  50. package/dist/llm/provider.js +8 -1
  51. package/dist/llm/provider.js.map +1 -1
  52. package/dist/prompts/index.d.ts +32 -0
  53. package/dist/prompts/index.d.ts.map +1 -1
  54. package/dist/prompts/index.js +33 -11
  55. package/dist/prompts/index.js.map +1 -1
  56. package/dist/session/index.d.ts +43 -3
  57. package/dist/session/index.d.ts.map +1 -1
  58. package/dist/session/index.js +114 -17
  59. package/dist/session/index.js.map +1 -1
  60. package/dist/skills/brainstorming.js +33 -33
  61. package/dist/skills/code-review.js +35 -35
  62. package/dist/skills/executing-plans.js +18 -18
  63. package/dist/skills/frontend-design.js +25 -25
  64. package/dist/skills/git-workflow.js +26 -26
  65. package/dist/skills/improve-architecture.js +28 -28
  66. package/dist/skills/neuroweave.js +37 -37
  67. package/dist/skills/playwright.js +62 -62
  68. package/dist/skills/prototype.js +20 -20
  69. package/dist/skills/subagent.js +19 -19
  70. package/dist/skills/supabase.js +34 -34
  71. package/dist/skills/systematic-debugging.js +34 -34
  72. package/dist/skills/tdd.js +29 -29
  73. package/dist/skills/triage.js +25 -25
  74. package/dist/skills/verification.js +22 -22
  75. package/dist/skills/writing-plans.js +32 -32
  76. package/dist/tools/nwt.js +16 -16
  77. package/dist/tui/app.d.ts.map +1 -1
  78. package/dist/tui/app.js +9 -2
  79. package/dist/tui/app.js.map +1 -1
  80. package/dist/tui/components/ChatList.d.ts.map +1 -1
  81. package/dist/tui/components/ChatList.js +4 -3
  82. package/dist/tui/components/ChatList.js.map +1 -1
  83. package/dist/tui/components/Header.d.ts +8 -0
  84. package/dist/tui/components/Header.d.ts.map +1 -1
  85. package/dist/tui/components/Header.js +17 -3
  86. package/dist/tui/components/Header.js.map +1 -1
  87. package/dist/tui/components/InitWizard.d.ts +12 -1
  88. package/dist/tui/components/InitWizard.d.ts.map +1 -1
  89. package/dist/tui/components/InitWizard.js +58 -3
  90. package/dist/tui/components/InitWizard.js.map +1 -1
  91. package/dist/tui/components/ToolCall.d.ts +1 -1
  92. package/dist/tui/components/ToolCall.d.ts.map +1 -1
  93. package/dist/tui/components/ToolCall.js +4 -4
  94. package/dist/tui/components/ToolCall.js.map +1 -1
  95. package/dist/tui/hooks/useChat.d.ts +22 -0
  96. package/dist/tui/hooks/useChat.d.ts.map +1 -1
  97. package/dist/tui/hooks/useChat.js +127 -50
  98. package/dist/tui/hooks/useChat.js.map +1 -1
  99. package/dist/tui/hooks/useCommands.d.ts.map +1 -1
  100. package/dist/tui/hooks/useCommands.js +78 -0
  101. package/dist/tui/hooks/useCommands.js.map +1 -1
  102. package/dist/types.d.ts +79 -6
  103. package/dist/types.d.ts.map +1 -1
  104. package/dist/types.js +7 -0
  105. package/dist/types.js.map +1 -1
  106. package/dist/utils/stableStringify.d.ts +21 -0
  107. package/dist/utils/stableStringify.d.ts.map +1 -0
  108. package/dist/utils/stableStringify.js +53 -0
  109. package/dist/utils/stableStringify.js.map +1 -0
  110. package/dist/utils/thinking.d.ts +59 -0
  111. package/dist/utils/thinking.d.ts.map +1 -0
  112. package/dist/utils/thinking.js +104 -0
  113. package/dist/utils/thinking.js.map +1 -0
  114. package/install.bat +63 -0
  115. package/install.ps1 +238 -0
  116. package/install.sh +113 -0
  117. package/package.json +7 -4
  118. package/src/app/index.ts +180 -108
  119. package/src/cache/fingerprint.ts +101 -0
  120. package/src/cache/index.ts +15 -0
  121. package/src/cache/smartModel.ts +52 -0
  122. package/src/cache/stats.ts +199 -0
  123. package/src/cache/volatile.ts +47 -0
  124. package/src/cmd/index.tsx +288 -160
  125. package/src/config/index.ts +156 -148
  126. package/src/config/providers.ts +234 -234
  127. package/src/config/types.ts +67 -53
  128. package/src/hooks/index.ts +111 -111
  129. package/src/llm/anthropic.ts +388 -243
  130. package/src/llm/gemini.ts +169 -169
  131. package/src/llm/index.ts +265 -200
  132. package/src/llm/openai.ts +243 -196
  133. package/src/llm/provider.ts +66 -34
  134. package/src/prompts/index.ts +260 -220
  135. package/src/session/compactor.ts +103 -103
  136. package/src/session/index.ts +181 -87
  137. package/src/session/message.ts +42 -42
  138. package/src/skills/brainstorming.ts +43 -43
  139. package/src/skills/code-review.ts +45 -45
  140. package/src/skills/executing-plans.ts +27 -27
  141. package/src/skills/frontend-design.ts +35 -35
  142. package/src/skills/git-workflow.ts +36 -36
  143. package/src/skills/improve-architecture.ts +38 -38
  144. package/src/skills/index.ts +136 -136
  145. package/src/skills/neuroweave.ts +47 -47
  146. package/src/skills/playwright.ts +72 -72
  147. package/src/skills/prototype.ts +30 -30
  148. package/src/skills/subagent.ts +28 -28
  149. package/src/skills/supabase.ts +44 -44
  150. package/src/skills/systematic-debugging.ts +44 -44
  151. package/src/skills/tdd.ts +39 -39
  152. package/src/skills/triage.ts +35 -35
  153. package/src/skills/verification.ts +31 -31
  154. package/src/skills/writing-plans.ts +42 -42
  155. package/src/tools/nwt.ts +598 -598
  156. package/src/tools/types.ts +122 -122
  157. package/src/tui/app.tsx +199 -186
  158. package/src/tui/components/ChatList.tsx +41 -32
  159. package/src/tui/components/ChatMessage.tsx +54 -54
  160. package/src/tui/components/Header.tsx +56 -28
  161. package/src/tui/components/InitWizard.tsx +217 -132
  162. package/src/tui/components/Markdown.tsx +35 -35
  163. package/src/tui/components/ModelSelector.tsx +87 -87
  164. package/src/tui/components/StatusBar.tsx +30 -30
  165. package/src/tui/components/Thinking.tsx +17 -17
  166. package/src/tui/components/ToolCall.tsx +102 -71
  167. package/src/tui/components/UserInput.tsx +131 -131
  168. package/src/tui/hooks/useChat.ts +287 -194
  169. package/src/tui/hooks/useCommands.ts +234 -154
  170. package/src/tui/index.ts +6 -6
  171. package/src/tui/welcome.ts +177 -177
  172. package/src/types.ts +104 -42
  173. package/src/utils/diff.ts +71 -71
  174. package/src/utils/project.ts +99 -99
  175. package/src/utils/stableStringify.ts +47 -0
  176. package/src/utils/thinking.ts +119 -0
  177. package/tests/cache/fingerprint.test.ts +75 -0
  178. package/tests/cache/stableStringify.test.ts +43 -0
  179. package/tests/cache/stats.test.ts +146 -0
  180. package/tests/cache/volatile.test.ts +75 -0
  181. package/tests/smoke-pollution.mjs +78 -0
  182. package/tests/smoke-thinking.mjs +110 -0
  183. package/tests/smoke-tool-stream.mjs +69 -0
  184. package/tests/smoke-tool.mjs +117 -0
@@ -1,131 +1,131 @@
1
- /** @jsxImportSource react */
2
- import React, { useState } from 'react';
3
- import { Box, Text, useInput, useApp, useFocus } from 'ink';
4
- import { COMMAND_LIST } from '../hooks/useCommands.js';
5
-
6
- interface Props {
7
- onSubmit: (input: string) => void;
8
- onCancel: () => void;
9
- disabled?: boolean;
10
- }
11
-
12
- export function UserInput({ onSubmit, onCancel, disabled }: Props) {
13
- const [value, setValue] = useState('');
14
- const [history, setHistory] = useState<string[]>([]);
15
- const [historyIdx, setHistoryIdx] = useState(-1);
16
- const [selectedCmd, setSelectedCmd] = useState(0);
17
- const { exit } = useApp();
18
- useFocus({ autoFocus: true });
19
-
20
- const showCommands = value.startsWith('/') && value.length > 0 && !value.includes(' ');
21
- const filteredCommands = showCommands
22
- ? COMMAND_LIST.filter(c => c.name.startsWith(value))
23
- : [];
24
-
25
- useInput((input, key) => {
26
- // ESC - cancel/clear (always works, even when disabled)
27
- if (key.escape) {
28
- setValue('');
29
- setSelectedCmd(0);
30
- setHistoryIdx(-1);
31
- onCancel();
32
- return;
33
- }
34
-
35
- if (disabled) return;
36
-
37
- // Command selector navigation
38
- if (showCommands && filteredCommands.length > 0) {
39
- if (key.upArrow) {
40
- setSelectedCmd(prev => Math.max(0, prev - 1));
41
- return;
42
- }
43
- if (key.downArrow) {
44
- setSelectedCmd(prev => Math.min(filteredCommands.length - 1, prev + 1));
45
- return;
46
- }
47
- if (key.tab || key.return) {
48
- const selected = filteredCommands[selectedCmd] || filteredCommands[0];
49
- setValue(selected.name + ' ');
50
- setSelectedCmd(0);
51
- return;
52
- }
53
- }
54
-
55
- if (key.return) {
56
- const trimmed = value.trim();
57
- if (trimmed) {
58
- if (trimmed === 'exit' || trimmed === 'quit') {
59
- exit();
60
- return;
61
- }
62
- setHistory(prev => [...prev, trimmed]);
63
- setHistoryIdx(-1);
64
- onSubmit(trimmed);
65
- setValue('');
66
- setSelectedCmd(0);
67
- }
68
- return;
69
- }
70
-
71
- if (key.upArrow && history.length > 0) {
72
- const newIdx = historyIdx === -1 ? history.length - 1 : Math.max(0, historyIdx - 1);
73
- setHistoryIdx(newIdx);
74
- setValue(history[newIdx]);
75
- return;
76
- }
77
-
78
- if (key.downArrow && historyIdx >= 0) {
79
- const newIdx = historyIdx + 1;
80
- if (newIdx >= history.length) {
81
- setHistoryIdx(-1);
82
- setValue('');
83
- } else {
84
- setHistoryIdx(newIdx);
85
- setValue(history[newIdx]);
86
- }
87
- return;
88
- }
89
-
90
- if (key.backspace || key.delete) {
91
- setValue(v => v.slice(0, -1));
92
- setSelectedCmd(0);
93
- return;
94
- }
95
-
96
- if (key.ctrl && input === 'c') {
97
- exit();
98
- return;
99
- }
100
-
101
- if (input && !key.ctrl && !key.meta) {
102
- setValue(v => v + input);
103
- setSelectedCmd(0);
104
- }
105
- });
106
-
107
- return (
108
- <Box flexDirection="column">
109
- {showCommands && filteredCommands.length > 0 && (
110
- <Box flexDirection="column" paddingLeft={2} marginBottom={0}>
111
- {filteredCommands.map((cmd, i) => (
112
- <Box key={cmd.name}>
113
- <Text color={i === selectedCmd ? '#06B6D4' : '#64748B'}>
114
- {i === selectedCmd ? '▸ ' : ' '}
115
- </Text>
116
- <Text color={i === selectedCmd ? '#06B6D4' : '#94A3B8'} bold={i === selectedCmd}>
117
- {cmd.name}
118
- </Text>
119
- <Text color="#64748B"> {cmd.desc}</Text>
120
- </Box>
121
- ))}
122
- </Box>
123
- )}
124
- <Box paddingY={0}>
125
- <Text color="#06B6D4" bold>{disabled ? ' ' : '❯ '}</Text>
126
- <Text>{value}</Text>
127
- {!disabled && <Text color="#06B6D4">█</Text>}
128
- </Box>
129
- </Box>
130
- );
131
- }
1
+ /** @jsxImportSource react */
2
+ import React, { useState } from 'react';
3
+ import { Box, Text, useInput, useApp, useFocus } from 'ink';
4
+ import { COMMAND_LIST } from '../hooks/useCommands.js';
5
+
6
+ interface Props {
7
+ onSubmit: (input: string) => void;
8
+ onCancel: () => void;
9
+ disabled?: boolean;
10
+ }
11
+
12
+ export function UserInput({ onSubmit, onCancel, disabled }: Props) {
13
+ const [value, setValue] = useState('');
14
+ const [history, setHistory] = useState<string[]>([]);
15
+ const [historyIdx, setHistoryIdx] = useState(-1);
16
+ const [selectedCmd, setSelectedCmd] = useState(0);
17
+ const { exit } = useApp();
18
+ useFocus({ autoFocus: true });
19
+
20
+ const showCommands = value.startsWith('/') && value.length > 0 && !value.includes(' ');
21
+ const filteredCommands = showCommands
22
+ ? COMMAND_LIST.filter(c => c.name.startsWith(value))
23
+ : [];
24
+
25
+ useInput((input, key) => {
26
+ // ESC - cancel/clear (always works, even when disabled)
27
+ if (key.escape) {
28
+ setValue('');
29
+ setSelectedCmd(0);
30
+ setHistoryIdx(-1);
31
+ onCancel();
32
+ return;
33
+ }
34
+
35
+ if (disabled) return;
36
+
37
+ // Command selector navigation
38
+ if (showCommands && filteredCommands.length > 0) {
39
+ if (key.upArrow) {
40
+ setSelectedCmd(prev => Math.max(0, prev - 1));
41
+ return;
42
+ }
43
+ if (key.downArrow) {
44
+ setSelectedCmd(prev => Math.min(filteredCommands.length - 1, prev + 1));
45
+ return;
46
+ }
47
+ if (key.tab || key.return) {
48
+ const selected = filteredCommands[selectedCmd] || filteredCommands[0];
49
+ setValue(selected.name + ' ');
50
+ setSelectedCmd(0);
51
+ return;
52
+ }
53
+ }
54
+
55
+ if (key.return) {
56
+ const trimmed = value.trim();
57
+ if (trimmed) {
58
+ if (trimmed === 'exit' || trimmed === 'quit') {
59
+ exit();
60
+ return;
61
+ }
62
+ setHistory(prev => [...prev, trimmed]);
63
+ setHistoryIdx(-1);
64
+ onSubmit(trimmed);
65
+ setValue('');
66
+ setSelectedCmd(0);
67
+ }
68
+ return;
69
+ }
70
+
71
+ if (key.upArrow && history.length > 0) {
72
+ const newIdx = historyIdx === -1 ? history.length - 1 : Math.max(0, historyIdx - 1);
73
+ setHistoryIdx(newIdx);
74
+ setValue(history[newIdx]);
75
+ return;
76
+ }
77
+
78
+ if (key.downArrow && historyIdx >= 0) {
79
+ const newIdx = historyIdx + 1;
80
+ if (newIdx >= history.length) {
81
+ setHistoryIdx(-1);
82
+ setValue('');
83
+ } else {
84
+ setHistoryIdx(newIdx);
85
+ setValue(history[newIdx]);
86
+ }
87
+ return;
88
+ }
89
+
90
+ if (key.backspace || key.delete) {
91
+ setValue(v => v.slice(0, -1));
92
+ setSelectedCmd(0);
93
+ return;
94
+ }
95
+
96
+ if (key.ctrl && input === 'c') {
97
+ exit();
98
+ return;
99
+ }
100
+
101
+ if (input && !key.ctrl && !key.meta) {
102
+ setValue(v => v + input);
103
+ setSelectedCmd(0);
104
+ }
105
+ });
106
+
107
+ return (
108
+ <Box flexDirection="column">
109
+ {showCommands && filteredCommands.length > 0 && (
110
+ <Box flexDirection="column" paddingLeft={2} marginBottom={0}>
111
+ {filteredCommands.map((cmd, i) => (
112
+ <Box key={cmd.name}>
113
+ <Text color={i === selectedCmd ? '#06B6D4' : '#64748B'}>
114
+ {i === selectedCmd ? '▸ ' : ' '}
115
+ </Text>
116
+ <Text color={i === selectedCmd ? '#06B6D4' : '#94A3B8'} bold={i === selectedCmd}>
117
+ {cmd.name}
118
+ </Text>
119
+ <Text color="#64748B"> {cmd.desc}</Text>
120
+ </Box>
121
+ ))}
122
+ </Box>
123
+ )}
124
+ <Box paddingY={0}>
125
+ <Text color="#06B6D4" bold>{disabled ? ' ' : '❯ '}</Text>
126
+ <Text>{value}</Text>
127
+ {!disabled && <Text color="#06B6D4">█</Text>}
128
+ </Box>
129
+ </Box>
130
+ );
131
+ }