@antaif3ng/til-work 0.1.2 → 0.3.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 (57) hide show
  1. package/README.md +265 -297
  2. package/dist/core/config.d.ts +29 -11
  3. package/dist/core/config.d.ts.map +1 -1
  4. package/dist/core/config.js +65 -101
  5. package/dist/core/config.js.map +1 -1
  6. package/dist/core/llm.d.ts.map +1 -1
  7. package/dist/core/llm.js +14 -0
  8. package/dist/core/llm.js.map +1 -1
  9. package/dist/core/pricing.d.ts.map +1 -1
  10. package/dist/core/pricing.js +0 -2
  11. package/dist/core/pricing.js.map +1 -1
  12. package/dist/core/session.d.ts +3 -2
  13. package/dist/core/session.d.ts.map +1 -1
  14. package/dist/core/session.js +4 -3
  15. package/dist/core/session.js.map +1 -1
  16. package/dist/core/skills.d.ts +2 -1
  17. package/dist/core/skills.d.ts.map +1 -1
  18. package/dist/core/skills.js +9 -0
  19. package/dist/core/skills.js.map +1 -1
  20. package/dist/core/system-prompt.d.ts.map +1 -1
  21. package/dist/core/system-prompt.js +6 -2
  22. package/dist/core/system-prompt.js.map +1 -1
  23. package/dist/main.d.ts.map +1 -1
  24. package/dist/main.js +66 -124
  25. package/dist/main.js.map +1 -1
  26. package/dist/modes/interactive.d.ts.map +1 -1
  27. package/dist/modes/interactive.js +514 -273
  28. package/dist/modes/interactive.js.map +1 -1
  29. package/dist/tools/browser.d.ts +10 -0
  30. package/dist/tools/browser.d.ts.map +1 -0
  31. package/dist/tools/browser.js +231 -0
  32. package/dist/tools/browser.js.map +1 -0
  33. package/dist/tools/computer.d.ts +3 -0
  34. package/dist/tools/computer.d.ts.map +1 -0
  35. package/dist/tools/computer.js +251 -0
  36. package/dist/tools/computer.js.map +1 -0
  37. package/dist/tools/index.d.ts +5 -2
  38. package/dist/tools/index.d.ts.map +1 -1
  39. package/dist/tools/index.js +11 -2
  40. package/dist/tools/index.js.map +1 -1
  41. package/dist/tools/read.d.ts.map +1 -1
  42. package/dist/tools/read.js +29 -4
  43. package/dist/tools/read.js.map +1 -1
  44. package/dist/tools/screenshot.d.ts +3 -0
  45. package/dist/tools/screenshot.d.ts.map +1 -0
  46. package/dist/tools/screenshot.js +113 -0
  47. package/dist/tools/screenshot.js.map +1 -0
  48. package/dist/utils/file-processor.d.ts +2 -2
  49. package/dist/utils/file-processor.d.ts.map +1 -1
  50. package/dist/utils/file-processor.js +7 -10
  51. package/dist/utils/file-processor.js.map +1 -1
  52. package/package.json +3 -2
  53. package/skills/find-skills/SKILL.md +66 -0
  54. package/skills/playwright-mcp/SKILL.md +90 -0
  55. package/skills/self-improving-agent/SKILL.md +88 -0
  56. package/skills/skill-creator/SKILL.md +93 -0
  57. package/skills/summarize/SKILL.md +55 -0
package/README.md CHANGED
@@ -2,45 +2,45 @@
2
2
 
3
3
  > 运行在终端里的个人电脑 AI 助手,类似 Codex CLI / Claude Code。
4
4
 
5
- TIL work 是一个基于大语言模型的命令行 Agent 工具。它可以直接操作你的文件系统、执行命令、编辑代码、搜索网页,并通过对话式交互帮你完成各种电脑任务。
5
+ TIL work 是一个基于大语言模型的命令行 Agent 工具。它可以直接操作你的文件系统、执行命令、编辑代码、搜索网页、截图、控制浏览器,并通过对话式交互帮你完成各种电脑任务。
6
6
 
7
7
  ## 核心能力
8
8
 
9
9
  | 能力 | 说明 |
10
10
  |------|------|
11
11
  | **命令执行** | 在你的系统上直接运行 bash 命令 |
12
- | **文件管理** | 读取、创建、编辑、复制、移动、删除文件 |
12
+ | **文件管理** | 读取、创建、编辑、复制、移动、删除文件(支持读取图片) |
13
13
  | **代码编辑** | 精确替换代码片段(类似 sed,但更智能) |
14
- | **系统信息** | 查看 CPU、内存、磁盘、网络等系统状态 |
14
+ | **截图** | 截取全屏或窗口截图,返回给 LLM 进行视觉分析 |
15
+ | **Computer Use** | 鼠标点击、键盘输入、滚动拖拽 + 自动截图反馈 |
16
+ | **浏览器控制** | 页面导航、点击、输入、截图、JS 执行(Playwright) |
15
17
  | **网页搜索** | 实时搜索互联网获取最新信息 |
18
+ | **MCP 扩展** | 通过 MCP 协议接入外部工具服务(stdio / HTTP) |
16
19
  | **记忆系统** | 跨对话记住上下文(MEMORY.md + AGENTS.md) |
17
- | **技能系统** | 通过 SKILL.md 扩展 Agent 的专业能力 |
20
+ | **技能系统** | 内置 5 个技能 + 支持自定义 SKILL.md 扩展 |
18
21
  | **会话持久化** | 退出后可恢复上次对话(`--resume` / `--continue`) |
19
22
  | **Context 压缩** | 长对话自动摘要压缩,防止 token 溢出 |
20
- | **用量追踪** | 实时显示 Token 消耗和上下文占用 |
21
23
  | **安全拦截** | 自动检测并拦截 `rm -rf`、`sudo` 等危险命令 |
22
- | **Markdown 渲染** | 终端内代码高亮、标题、列表等富文本显示 |
23
- | **多模型** | 支持 Anthropic、OpenAI、Google Gemini 及任意兼容接口 |
24
+ | **多模型** | 支持 Anthropic、OpenAI、Google Gemini 及任意 OpenAI 兼容接口 |
25
+
26
+ ## 交互体验
27
+
28
+ - **多行输入**:行尾输入 `\` 再回车、`Ctrl+J` 或 `Alt+Enter` 均可插入换行,`Esc` 取消多行输入
29
+ - **输入框 UI**:带上下边框的输入区域,底部常驻显示当前工作目录和随机操作提示
30
+ - **Placeholder**:空输入时显示换行快捷键提示,输入后自动消失
31
+ - **文件引用**:输入 `@` 后实时搜索文件,方向键选择,文件内容自动注入 LLM 上下文
32
+ - **命令菜单**:输入 `/` 弹出命令列表,方向键循环选择,`Enter` 直接执行,`Tab` 补全
24
33
 
25
34
  ## 前置要求
26
35
 
27
36
  - **Node.js** >= 20.6.0(推荐 22+)
28
37
  - **npm** >= 9
29
- - **至少一个 LLM API Key**(Anthropic / OpenAI / Google / 智谱等 OpenAI 兼容接口)
30
-
31
- 检查 Node.js 版本:
38
+ - **至少一个 LLM API Key**(Anthropic / OpenAI / Google / MiniMax / 智谱等 OpenAI 兼容接口)
32
39
 
33
40
  ```bash
34
41
  node -v # 需要 v20.6.0 或更高
35
42
  ```
36
43
 
37
- 如果未安装,推荐用 [nvm](https://github.com/nvm-sh/nvm) 安装:
38
-
39
- ```bash
40
- curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.0/install.sh | bash
41
- nvm install 22
42
- ```
43
-
44
44
  ## 安装
45
45
 
46
46
  ### 方式一:npm 全局安装(推荐)
@@ -49,6 +49,8 @@ nvm install 22
49
49
  npm install -g @antaif3ng/til-work
50
50
  ```
51
51
 
52
+ 安装后使用 `til` 命令启动。
53
+
52
54
  ### 方式二:从源码安装
53
55
 
54
56
  ```bash
@@ -59,6 +61,12 @@ npm run build
59
61
  npm link # 注册 til 命令到全局
60
62
  ```
61
63
 
64
+ ### 更新版本
65
+
66
+ ```bash
67
+ npm update -g @antaif3ng/til-work
68
+ ```
69
+
62
70
  ## 快速开始
63
71
 
64
72
  ### 1. 首次配置
@@ -67,7 +75,7 @@ npm link # 注册 til 命令到全局
67
75
  til --setup
68
76
  ```
69
77
 
70
- 按提示输入 API Key 和选择默认模型。配置保存在 `~/.til/config.json`。
78
+ 按提示输入模型 ID、API Key Base URL。配置保存在 `~/.til/config.json`。
71
79
 
72
80
  你也可以通过环境变量配置:
73
81
 
@@ -81,9 +89,9 @@ export OPENAI_API_KEY=sk-xxxxx
81
89
  # Google Gemini
82
90
  export GOOGLE_API_KEY=AIza-xxxxx
83
91
 
84
- # OpenAI 兼容接口(如智谱、DeepSeek、Ollama 等)
92
+ # OpenAI 兼容接口(如 MiniMax、智谱、DeepSeek、Ollama 等)
85
93
  export OPENAI_API_KEY=your-key
86
- export OPENAI_BASE_URL=https://open.bigmodel.cn/api/paas/v4
94
+ export OPENAI_BASE_URL=https://api.minimaxi.com/v1
87
95
  ```
88
96
 
89
97
  ### 2. 启动交互模式
@@ -92,28 +100,15 @@ export OPENAI_BASE_URL=https://open.bigmodel.cn/api/paas/v4
92
100
  til
93
101
  ```
94
102
 
95
- 你会看到:
96
-
97
- ```
98
- ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
99
- ┃ >_ 欢迎使用千岛湖 Agent 工具 TIL v0.1.0 ┃
100
- ┃ model: gpt-4o /model 切换 ┃
101
- ┃ directory: ~/dev/my-project ┃
102
- ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
103
- ```
103
+ 输入 `/` 查看所有可用命令(支持方向键循环选择),输入 `@` 引用文件内容(自动注入到上下文)。
104
104
 
105
- 输入 `/` 查看所有可用命令,按 Tab 自动补全。
105
+ 支持多行输入:行尾输入 `\` 再回车,或按 `Ctrl+J` / `Alt+Enter` 换行。
106
106
 
107
107
  ### 3. 单次执行模式
108
108
 
109
109
  ```bash
110
- # 直接给出提示
111
110
  til "列出当前目录的所有 TypeScript 文件"
112
-
113
- # 通过参数传入
114
111
  til -p "解释这个错误日志" < error.log
115
-
116
- # 管道输入
117
112
  cat README.md | til "总结一下这个文件"
118
113
  ```
119
114
 
@@ -126,13 +121,13 @@ til [options] [prompt]
126
121
 
127
122
  选项:
128
123
  -p, --prompt <text> 单次执行模式
129
- -m, --model <model> 指定模型(如 gpt-4o, claude-sonnet-4-20250514, gemini-2.5-pro-preview-06-05)
124
+ -m, --model <model> 指定模型 ID
130
125
  --base-url <url> 覆盖 API 地址
131
126
  --tools <list> 指定启用的工具(逗号分隔)
132
127
  --skill <path> 加载技能文件或目录(可重复)
133
128
  --no-skills 禁用自动技能加载
134
129
  --continue 恢复当前目录下的最近一次会话
135
- --resume [sessionId] 恢复指定 ID 的会话(不传 ID 等同于 --continue)
130
+ --resume [sessionId] 恢复指定 ID 的会话
136
131
  --setup 运行配置向导
137
132
  -h, --help 显示帮助
138
133
  -v, --version 显示版本
@@ -140,63 +135,101 @@ til [options] [prompt]
140
135
 
141
136
  ### 交互模式命令
142
137
 
143
- 在交互模式中输入 `/` 即可看到所有命令(支持自动补全):
138
+ 在交互模式中输入 `/` 即可看到所有命令(支持方向键选择和自动补全):
144
139
 
145
140
  | 命令 | 说明 |
146
141
  |------|------|
147
142
  | `/help` | 显示帮助信息 |
148
- | `/model <id>` | 切换模型 |
149
- | `/models` | 查看可用模型列表 |
150
- | `/skills` | 查看已加载的技能 |
143
+ | `/model` | 查看/切换/管理模型(支持方向键选择) |
144
+ | `/model add <id> [baseUrl] [apiKey]` | 添加模型配置 |
145
+ | `/model default <id>` | 设置默认模型 |
146
+ | `/skills` | 查看已加载的技能(含来源标签) |
151
147
  | `/skill:<name>` | 查看某个技能的详细内容 |
148
+ | `/mcp` | 查看已连接的 MCP 服务和工具 |
152
149
  | `/memory` | 查看当前记忆内容 |
153
150
  | `/usage` | 查看本次会话的 Token 用量 |
154
151
  | `/sessions` | 查看会话历史列表 |
155
152
  | `/config` | 查看当前配置 |
153
+ | `/config check` | 测试当前 API 连接 |
156
154
  | `/clear` | 清空对话历史 |
157
155
  | `/exit` | 退出 |
158
156
 
159
157
  ## 内置工具
160
158
 
161
- | 工具 | 说明 |
162
- |------|------|
163
- | `bash` | 执行 bash 命令(ls, grep, git, curl 等) |
164
- | `read` | 读取文件内容(支持偏移和行数限制) |
165
- | `write` | 创建或覆盖文件 |
166
- | `edit` | 精确查找替换(修改文件中的特定文本) |
167
- | `file_manager` | 高级文件操作(复制、移动、删除、列目录、获取信息) |
168
- | `system_info` | 获取系统信息(OS、CPU、内存、网络、环境变量) |
169
- | `web_search` | 搜索互联网获取实时信息 |
159
+ | 工具 | 类型 | 默认启用 | 说明 |
160
+ |------|------|----------|------|
161
+ | `bash` | 基础 | 是 | 执行 bash 命令(ls, grep, git, curl 等) |
162
+ | `read` | 基础 | 是 | 读取文件内容(文本 + 图片 base64) |
163
+ | `write` | 基础 | 是 | 创建或覆盖文件 |
164
+ | `edit` | 基础 | 是 | 精确查找替换 |
165
+ | `file_manager` | 文件 | 是 | 复制、移动、删除、列目录、获取信息 |
166
+ | `system_info` | 系统 | 是 | OS、CPU、内存、网络、环境变量 |
167
+ | `web_search` | 网络 | 是 | 搜索互联网获取实时信息 |
168
+ | `web_fetch` | 网络 | 是 | 抓取网页内容转纯文本 |
169
+ | `screenshot` | 视觉 | 是 | 截取全屏或窗口截图 |
170
+ | `computer` | 桌面自动化 | 是 | 鼠标、键盘、滚动 + 自动截图反馈 |
171
+ | `browser` | 浏览器 | 否 | Playwright 页面控制(需安装 Playwright) |
172
+
173
+ ### screenshot 工具
174
+
175
+ 截取屏幕或窗口截图,返回 base64 图片供 LLM 视觉分析。
176
+
177
+ - macOS 使用 `screencapture`(系统自带)
178
+ - Linux 使用 `gnome-screenshot` / `scrot` / `import`(需安装其中一个)
179
+
180
+ ### computer 工具
181
+
182
+ 对标 Anthropic Computer Use API,支持以下操作:
183
+
184
+ | Action | 说明 |
185
+ |--------|------|
186
+ | `screenshot` | 截屏 |
187
+ | `mouse_move` | 移动鼠标 |
188
+ | `click` | 点击 |
189
+ | `double_click` | 双击 |
190
+ | `drag` | 拖拽 |
191
+ | `type` | 输入文本 |
192
+ | `key` | 按键组合(如 cmd+c, ctrl+shift+t) |
193
+ | `scroll` | 滚动 |
194
+
195
+ 每个操作执行后自动截图,形成"操作 → 视觉反馈 → 下一步"循环。
196
+
197
+ 依赖:
198
+ - macOS: `brew install cliclick`
199
+ - Linux: `sudo apt install xdotool`
200
+
201
+ ### browser 工具
202
+
203
+ 基于 Playwright 的浏览器自动化,需单独安装:
204
+
205
+ ```bash
206
+ npm install playwright
207
+ npx playwright install chromium
208
+ ```
209
+
210
+ 支持 `navigate`、`screenshot`、`click`、`type`、`evaluate`、`get_text`、`scroll`、`wait`、`back`、`forward`、`close` 等操作。
170
211
 
171
212
  ## 配置
172
213
 
173
- 配置文件位于 `~/.til/config.json`,结构如下:
214
+ 配置文件位于 `~/.til/config.json`:
174
215
 
175
216
  ```json
176
217
  {
177
- "providers": {
178
- "anthropic": {
179
- "apiKey": "sk-ant-xxxxx"
180
- },
181
- "openai": {
182
- "apiKey": "sk-xxxxx",
183
- "baseUrl": "https://open.bigmodel.cn/api/paas/v4"
218
+ "model": "MiniMax-M2.5",
219
+ "apiKey": "sk-xxxxx",
220
+ "baseUrl": "https://api.minimaxi.com/v1",
221
+ "models": {
222
+ "MiniMax-M2.5": {
223
+ "provider": "openai-compatible",
224
+ "contextWindow": 128000
184
225
  },
185
- "google": {
186
- "apiKey": "AIza-xxxxx"
187
- }
188
- },
189
- "defaultModel": {
190
- "provider": "openai",
191
- "id": "glm-5"
192
- },
193
- "customModels": {
194
- "glm-5": {
226
+ "gpt-4o": {
195
227
  "provider": "openai",
196
- "name": "GLM-5",
197
- "contextWindow": 128000
228
+ "apiKey": "sk-openai-xxxxx"
198
229
  }
199
230
  },
231
+ "providers": {},
232
+ "mcpServers": {},
200
233
  "compaction": {
201
234
  "thresholdRatio": 0.7,
202
235
  "keepRecentTokens": 4000,
@@ -205,302 +238,232 @@ til [options] [prompt]
205
238
  }
206
239
  ```
207
240
 
208
- ### 支持的模型提供商
209
-
210
- | 提供商 | 说明 | 配置方式 |
211
- |--------|------|---------|
212
- | **Anthropic** | Claude 系列 | `ANTHROPIC_API_KEY` |
213
- | **OpenAI** | GPT 系列 | `OPENAI_API_KEY` |
214
- | **Google** | Gemini 系列 | `GOOGLE_API_KEY` |
215
- | **智谱 (GLM)** | GLM 系列 | OpenAI 兼容接口 + 自定义 base_url |
216
- | **DeepSeek** | DeepSeek 系列 | OpenAI 兼容接口 + 自定义 base_url |
217
- | **Ollama** | 本地模型 | OpenAI 兼容接口 (`http://localhost:11434/v1`) |
218
- | **其他** | 任意 OpenAI 兼容接口 | `--base-url` 或配置 |
219
-
220
- ### 内置模型及 Context Window
221
-
222
- | 模型 | 提供商 | Context Window |
223
- |------|--------|----------------|
224
- | `claude-sonnet-4-20250514` | Anthropic | 200k |
225
- | `claude-3-5-haiku-20241022` | Anthropic | 200k |
226
- | `gpt-4o` | OpenAI | 128k |
227
- | `gpt-4o-mini` | OpenAI | 128k |
228
- | `o3-mini` | OpenAI | 200k |
229
- | `gemini-2.0-flash` | Google | 1M |
230
- | `gemini-2.5-pro-preview-06-05` | Google | 1M |
231
-
232
- ## 会话持久化
233
-
234
- TIL 自动保存每次对话为会话文件(JSONL 格式),可随时恢复。
235
-
236
- ### 自动保存
241
+ ### 配置字段
237
242
 
238
- 每次对话的消息都会实时追加写入 `~/.til/sessions/` 目录。退出时会显示会话 ID 和恢复命令:
239
-
240
- ```
241
- Bye! session: abc12345
242
- 恢复此会话: til --resume abc12345
243
- ```
243
+ | 字段 | 说明 |
244
+ |------|------|
245
+ | `model` | 默认模型 ID |
246
+ | `apiKey` | 全局 API Key(所有模型的默认值) |
247
+ | `baseUrl` | 全局 Base URL(所有模型的默认值) |
248
+ | `models` | 各模型的单独配置(provider、apiKey、baseUrl、contextWindow 等) |
249
+ | `providers` | Provider 级别配置(apiKey、baseUrl、headers) |
250
+ | `mcpServers` | MCP 服务器配置 |
251
+ | `defaultTools` | 默认启用的工具列表 |
244
252
 
245
- ### 恢复会话
253
+ ### 模型管理
246
254
 
247
255
  ```bash
248
- # 恢复最近的会话
249
- til --continue
250
-
251
- # 恢复指定的会话
252
- til --resume abc12345
256
+ # 配置向导
257
+ til --setup
253
258
 
254
- # 在交互模式中查看会话列表
255
- /sessions
259
+ # 交互模式中管理
260
+ /model # 查看已配置模型
261
+ /model <id> # 切换模型
262
+ /model add <id> [url] [key] # 添加模型
263
+ /model default <id> # 设置默认
264
+ /model rm <id> # 删除配置
265
+ /config check # 测试 API 连接
256
266
  ```
257
267
 
258
- 恢复后会自动加载之前的完整对话历史,并显示上下文摘要。
268
+ ### 支持的模型
259
269
 
260
- ## Context 压缩(Compaction)
270
+ TIL 支持任何 OpenAI 兼容接口。模型 provider 根据 ID 前缀自动检测:
261
271
 
262
- 当长对话接近模型的上下文窗口上限时,TIL 会自动触发压缩:
272
+ | ID 前缀 | Provider | 示例 |
273
+ |----------|----------|------|
274
+ | `claude*` | anthropic | claude-sonnet-4-20250514 |
275
+ | `gpt*` / `o3*` / `o1*` | openai | gpt-4o, o3-mini |
276
+ | `gemini*` | google | gemini-2.5-pro-preview-06-05 |
277
+ | 其他 | openai-compatible | MiniMax-M2.5, deepseek-chat, glm-5 |
263
278
 
264
- 1. **阈值检测** — 当已用 token 超过 `contextWindow * thresholdRatio`(默认 70%)时触发
265
- 2. **溢出兜底** — 如果模型返回上下文溢出错误,自动压缩后重试
266
- 3. **智能切分** — 保留最近的对话(默认 4000 token),将历史部分交给 LLM 生成摘要
267
- 4. **增量更新** — 后续压缩会基于前一次的摘要进行增量更新,不丢失关键信息
279
+ ## MCP 扩展
268
280
 
269
- 交互界面会实时显示上下文使用率:
281
+ TIL 支持通过 MCP (Model Context Protocol) 接入外部工具服务。
270
282
 
271
- ```
272
- in:12.3k out:1.2k ctx:35% # 绿色 < 50%
273
- in:45.0k out:8.5k ctx:72% # 黄色 50-80%
274
- in:98.0k out:15.2k ctx:95% # 红色 > 80%
275
- ```
283
+ ### 配置 MCP 服务器
276
284
 
277
- ### 配置压缩参数
278
-
279
- 在 `~/.til/config.json` 中:
285
+ `~/.til/config.json` 中添加:
280
286
 
281
287
  ```json
282
288
  {
283
- "compaction": {
284
- "thresholdRatio": 0.7,
285
- "keepRecentTokens": 4000,
286
- "reserveTokens": 8000
289
+ "mcpServers": {
290
+ "playwright": {
291
+ "command": "npx",
292
+ "args": ["@playwright/mcp", "--headless"]
293
+ },
294
+ "web-search": {
295
+ "type": "http",
296
+ "url": "https://open.bigmodel.cn/api/mcp/web_search/mcp",
297
+ "headers": {
298
+ "Authorization": "Bearer your_api_key"
299
+ }
300
+ }
287
301
  }
288
302
  }
289
303
  ```
290
304
 
291
- | 参数 | 默认值 | 说明 |
292
- |------|--------|------|
293
- | `thresholdRatio` | 0.7 | 触发压缩的 token 占比阈值 |
294
- | `keepRecentTokens` | 4000 | 压缩时保留最近多少 token 不被摘要 |
295
- | `reserveTokens` | 8000 | 为模型输出预留的 token 空间 |
305
+ 支持两种传输方式:
306
+ - **stdio**:本地进程通过 stdin/stdout 通信
307
+ - **streamable_http** / **sse**:远程 HTTP 服务
296
308
 
297
- ## Token 用量追踪
298
-
299
- TIL 实时追踪每次对话的 token 消耗。
300
-
301
- ### 实时显示
302
-
303
- 每轮对话结束后会显示当前轮的用量:
309
+ ### 查看 MCP 状态
304
310
 
305
311
  ```
306
- in:12.3k out:1.2k cache_r:8.0k ctx:35%
312
+ /mcp # 查看已连接的 MCP 服务器和工具列表
313
+ /extensions # 查看所有扩展信息
307
314
  ```
308
315
 
309
- - `in` 输入 token
310
- - `out` 输出 token
311
- - `cache_r` 缓存读取 token
312
- - `cache_w` 缓存写入 token
313
- - `ctx` 上下文占用率(动态计算:已用 token / 模型上下文窗口)
316
+ ## 内置技能
317
+
318
+ TIL 内置 5 个实用技能,安装即用:
314
319
 
315
- ### 累计用量
320
+ | 技能 | 说明 |
321
+ |------|------|
322
+ | **summarize** | 使用 summarize CLI 摘要网页、PDF、YouTube 等 |
323
+ | **find-skills** | 从开源社区发现和安装新技能 |
324
+ | **self-improvement** | 自动记录错误、学习和修正,持续改进 |
325
+ | **skill-creator** | 创建新技能的指南和最佳实践 |
326
+ | **playwright-mcp** | Playwright MCP 浏览器自动化配置和用法 |
316
327
 
317
- 使用 `/usage` 命令查看本次会话的累计数据:
328
+ ### 查看和使用技能
318
329
 
319
330
  ```
320
- Token 用量统计:
321
- 输入 tokens: 45.2k
322
- 输出 tokens: 12.9k
323
- 缓存读取: 38.1k
324
- 上下文占用: 29% (窗口: 200k)
331
+ /skills # 列出所有已加载技能(显示来源:内置/用户/项目)
332
+ /skill:summarize # 查看 summarize 技能详情
325
333
  ```
326
334
 
327
- ## 工具安全拦截
335
+ ### 自定义技能
328
336
 
329
- TIL 内置危险命令检测,在执行前自动拦截以下类型的命令:
337
+ `SKILL.md` 放入以下目录即可自动加载:
330
338
 
331
- | 危险类型 | 示例 |
332
- |----------|------|
333
- | 递归删除 | `rm -rf /`, `rm -rf ~` |
334
- | 提权操作 | `sudo ...`, `su root` |
335
- | 磁盘格式化 | `mkfs`, `dd if=... of=/dev/...` |
336
- | 权限修改 | `chmod 777`, `chown root` |
337
- | 进程操作 | `kill -9`, `killall` |
338
- | 网络操作 | `iptables`, `curl \| sh` |
339
-
340
- 拦截时会显示提示并要求确认:
339
+ | 路径 | 作用 |
340
+ |------|------|
341
+ | `~/.til/skills/<name>/SKILL.md` | 全局技能 |
342
+ | `.til/skills/<name>/SKILL.md` | 项目级技能 |
343
+ | `--skill <path>` | CLI 指定 |
341
344
 
342
- ```
343
- ⚠️ 检测到危险命令: rm -rf /tmp/important
344
- 原因: 包含递归删除操作
345
- 确认执行? (y/N)
346
- ```
345
+ 同名的用户技能会覆盖内置技能。
347
346
 
348
- 在非交互模式下(单次执行),危险命令将直接被阻止。
347
+ 技能文件格式:
349
348
 
350
- ## Markdown 终端渲染
349
+ ```markdown
350
+ ---
351
+ name: my-skill
352
+ description: "简要描述技能的功能和触发条件"
353
+ ---
351
354
 
352
- TIL 的回答会以富文本格式渲染在终端中,包括:
355
+ # 技能标题
353
356
 
354
- - **标题** — 带颜色和粗体的层级标题
355
- - **代码块** — 语法高亮(支持 TypeScript、Python、Bash 等多种语言)
356
- - **行内代码** — 反引号高亮
357
- - **列表** — 有序/无序列表缩进
358
- - **引用块** — 带边框的引用
359
- - **链接** — 下划线 + URL 显示
360
- - **粗体/斜体/删除线** — 终端 ANSI 样式
357
+ 具体的指令内容...
358
+ ```
361
359
 
362
360
  ## 记忆系统
363
361
 
364
- TIL 使用双层记忆系统在对话之间保持上下文:
362
+ TIL 使用双层记忆系统:
365
363
 
366
- ### MEMORY.md(工作记忆)
364
+ ### 对话历史(短期记忆)
367
365
 
368
- AI 自动写入,跨对话持久化:
366
+ 当前会话内的完整消息历史,存储在 `~/.til/sessions/` 目录(JSONL 格式)。
367
+
368
+ ### MEMORY.md(长期记忆)
369
+
370
+ 由 AI 自动判断写入,跨会话持久化:
369
371
 
370
372
  | 文件 | 作用 |
371
373
  |------|------|
372
374
  | `~/.til/MEMORY.md` | 全局记忆(偏好、通用模式) |
373
375
  | `.til/MEMORY.md` | 项目记忆(架构决策、进行中的工作) |
374
376
 
377
+ AI 会在以下情况主动记录:用户偏好、项目架构、问题修复模式、重要决策等。
378
+
375
379
  ### AGENTS.md(项目上下文)
376
380
 
377
- 手动维护的项目指令和约定:
381
+ 手动维护的项目指令:
378
382
 
379
383
  | 文件 | 作用 |
380
384
  |------|------|
381
- | `~/.til/AGENTS.md` | 全局指令(编码风格、通用约定) |
382
- | `<项目>/AGENTS.md` | 项目指令(技术栈、架构规范) |
385
+ | `~/.til/AGENTS.md` | 全局指令 |
386
+ | `<项目>/AGENTS.md` | 项目指令 |
383
387
 
384
- 也支持 `CLAUDE.md` 文件名(兼容 Claude Code 的约定)。
388
+ 也兼容 `CLAUDE.md` 文件名。
385
389
 
386
- ## 技能系统
390
+ ## 会话持久化
387
391
 
388
- 技能是 `SKILL.md` 文件,用于扩展 Agent 的专业能力。
392
+ 每次对话自动保存,退出时显示恢复命令。
389
393
 
390
- ### 技能存放位置
394
+ ```bash
395
+ til --continue # 恢复最近的会话
396
+ til --resume abc12345 # 恢复指定会话
397
+ /sessions # 交互模式中查看会话列表
398
+ ```
391
399
 
392
- | 路径 | 作用 |
393
- |------|------|
394
- | `~/.til/skills/` | 全局技能 |
395
- | `.til/skills/` | 项目级技能 |
396
- | `--skill <path>` | CLI 指定的技能 |
400
+ ## Context 压缩
397
401
 
398
- ### 技能文件格式
402
+ 当长对话接近模型上下文窗口上限时自动触发:
399
403
 
400
- ```markdown
401
- ---
402
- name: deploy-helper
403
- description: 帮助部署应用到生产环境
404
- triggers:
405
- - deploy
406
- - 部署
407
- ---
404
+ 1. 当已用 token 超过阈值(默认 70%)时压缩
405
+ 2. 保留最近对话,将历史部分生成摘要
406
+ 3. 溢出时自动压缩后重试
408
407
 
409
- # 部署助手
408
+ 实时显示使用率:
410
409
 
411
- 当用户需要部署时,按照以下步骤操作:
412
- 1. 检查 git 状态,确保代码已提交
413
- 2. 运行测试
414
- 3. 构建项目
415
- 4. 执行部署命令
410
+ ```
411
+ in:12.3k out:1.2k ctx:35%
416
412
  ```
417
413
 
418
- ### 查看和使用技能
414
+ - `in` 输入 token · `out` 输出 token · `ctx` 上下文占用率
419
415
 
420
- ```
421
- /skills # 列出所有已加载技能
422
- /skill:deploy # 查看 deploy 技能详情
423
- ```
416
+ ## 安全拦截
417
+
418
+ 内置危险命令检测:递归删除、提权操作、磁盘格式化、权限修改等。执行前会要求确认。
424
419
 
425
420
  ## 常见问题
426
421
 
427
- ### 安装后提示 permission denied
422
+ ### 提示"未配置模型"
428
423
 
429
424
  ```bash
430
- chmod +x $(which til)
431
- # 或重新 link
432
- cd til-cli && npm link
425
+ til --setup # 运行配置向导
433
426
  ```
434
427
 
435
428
  ### 提示 No API key found
436
429
 
437
430
  ```bash
438
- # 方法 1:环境变量
439
- export OPENAI_API_KEY=your-key
440
-
441
- # 方法 2:配置向导
442
- til --setup
431
+ export OPENAI_API_KEY=your-key # 环境变量
432
+ til --setup # 或配置向导
443
433
  ```
444
434
 
445
- ### 如何使用 Google Gemini
435
+ ### 如何使用国内 LLM(MiniMax / 智谱 / DeepSeek 等)
446
436
 
447
437
  ```bash
448
- export GOOGLE_API_KEY=AIza-xxxxx
449
- til -m gemini-2.5-pro-preview-06-05
450
- ```
451
-
452
- 或在 `~/.til/config.json` 中配置:
453
-
454
- ```json
455
- {
456
- "providers": {
457
- "google": { "apiKey": "AIza-xxxxx" }
458
- },
459
- "defaultModel": { "provider": "google", "id": "gemini-2.5-pro-preview-06-05" }
460
- }
438
+ til --setup
439
+ # 模型: MiniMax-M2.5(或 deepseek-chat, glm-5 等)
440
+ # API Key: 你的 key
441
+ # Base URL: https://api.minimaxi.com/v1(或对应平台的 URL)
461
442
  ```
462
443
 
463
- ### 如何使用国内 LLM(智谱/DeepSeek 等)
464
-
465
- 运行 `til --setup`,在 CUSTOM PROVIDER 部分填入:
466
-
467
- - Base URL:如 `https://open.bigmodel.cn/api/paas/v4`
468
- - API Key:你的 API Key
469
- - Model ID:如 `glm-5`
470
-
471
- 或者直接编辑 `~/.til/config.json`。
472
-
473
444
  ### 如何使用本地模型(Ollama)
474
445
 
475
446
  ```bash
476
- # 启动 Ollama
477
447
  ollama serve
478
-
479
- # 配置 TIL
480
448
  til --setup
481
- # Base URL http://localhost:11434/v1
482
- # Model ID llama3.1:8b(或其他已 pull 的模型)
449
+ # Base URL: http://localhost:11434/v1
450
+ # Model ID: llama3.1:8b
483
451
  ```
484
452
 
485
- ### 对话太长会不会丢信息
453
+ ### API 连接失败怎么排查
486
454
 
487
- 不会。TIL 内置 Context 压缩机制,当对话接近上下文窗口上限时,会自动将历史对话摘要化,保留关键信息的同时腾出空间。你也可以通过 `/usage` 查看当前上下文使用率。
455
+ ```
456
+ /config check # 显示当前配置并测试 API 连接
457
+ ```
488
458
 
489
- ### 会话断了怎么恢复
459
+ ### 如何启用浏览器工具
490
460
 
491
461
  ```bash
492
- # 恢复最近一次会话
493
- til --continue
494
-
495
- # 恢复指定会话
496
- til --resume <sessionId>
462
+ npm install playwright
463
+ npx playwright install chromium
497
464
  ```
498
465
 
499
- 退出时会自动显示恢复命令。
500
-
501
- ### 如何关闭危险命令拦截
502
-
503
- 目前不支持全局关闭。TIL 在执行可能破坏性的命令前会要求确认,这是安全设计。在交互模式下可以选择 `y` 确认执行。
466
+ 然后在配置中将 `browser` 加入 `defaultTools`,或使用 Playwright MCP。
504
467
 
505
468
  ## 开发
506
469
 
@@ -511,52 +474,57 @@ npm install
511
474
  npm run dev # 监听模式编译
512
475
  npm run build # 一次性编译
513
476
  npm start # 运行
477
+ npm test # 运行测试
514
478
  ```
515
479
 
516
- ### 运行测试
517
-
518
- ```bash
519
- npm test # 运行全部测试
520
- npm run test:watch # 监听模式
521
- ```
522
-
523
- 测试使用 [Vitest](https://vitest.dev/),覆盖所有核心模块:
524
-
525
- - `tests/core/` — Agent、Config、LLM、Session、Compaction、Pricing、Memory、Skills、Markdown、Tool Permissions
526
- - `tests/tools/` — Bash、Read、Write、Edit 工具
527
-
528
480
  ### 项目结构
529
481
 
530
482
  ```
531
483
  til-cli/
532
484
  ├── src/
533
- │ ├── main.ts # CLI 入口
534
- │ ├── index.ts # 公共 API 导出
485
+ │ ├── main.ts # CLI 入口 & 配置向导
486
+ │ ├── version.ts # 版本号管理
535
487
  │ ├── core/
536
488
  │ │ ├── agent.ts # 双层循环 Agent 引擎
537
489
  │ │ ├── llm.ts # LLM 提供商抽象(Anthropic/OpenAI/Google)
538
- │ │ ├── config.ts # 配置管理
490
+ │ │ ├── config.ts # 配置管理 & 模型解析
539
491
  │ │ ├── session.ts # 会话包装(工具 + 系统提示)
540
492
  │ │ ├── session-manager.ts # 会话持久化(JSONL)
541
- │ │ ├── types.ts # 核心类型定义
493
+ │ │ ├── types.ts # 核心类型(含 ImageContent)
542
494
  │ │ ├── compaction.ts # Context 压缩 & 溢出检测
543
- │ │ ├── pricing.ts # Token 计费 & 用量格式化
495
+ │ │ ├── pricing.ts # Token 用量格式化
544
496
  │ │ ├── tool-permissions.ts # 危险命令拦截
545
497
  │ │ ├── markdown.ts # 终端 Markdown 渲染
546
498
  │ │ ├── memory.ts # 记忆系统
547
- │ │ ├── skills.ts # 技能系统
499
+ │ │ ├── skills.ts # 技能系统(内置 + 用户 + 项目)
548
500
  │ │ └── system-prompt.ts # 系统提示词组装
549
501
  │ ├── modes/
550
502
  │ │ ├── interactive.ts # 交互 REPL 模式
551
503
  │ │ └── oneshot.ts # 单次执行模式
552
- └── tools/ # 内置工具实现
553
- ├── bash.ts
554
- ├── read.ts
555
- ├── write.ts
556
- ├── edit.ts
557
- ├── file-manager.ts
558
- ├── system-info.ts
559
- └── web-search.ts
504
+ ├── tools/ # 内置工具
505
+ ├── bash.ts # Shell 命令执行
506
+ ├── read.ts # 文件读取(含图片 base64)
507
+ ├── write.ts # 文件写入
508
+ ├── edit.ts # 精确替换
509
+ ├── file-manager.ts # 文件操作
510
+ ├── system-info.ts # 系统信息
511
+ │ ├── web-search.ts # 网页搜索
512
+ │ │ ├── web-fetch.ts # 网页抓取
513
+ │ │ ├── screenshot.ts # 截图
514
+ │ │ ├── computer.ts # Computer Use(鼠标/键盘/截图)
515
+ │ │ └── browser.ts # 浏览器控制(Playwright)
516
+ │ ├── extensions/ # 扩展系统
517
+ │ │ ├── types.ts # 扩展/MCP 类型定义
518
+ │ │ ├── loader.ts # 扩展加载器
519
+ │ │ ├── runner.ts # 扩展运行器
520
+ │ │ └── builtin/mcp.ts # MCP 客户端(stdio + HTTP)
521
+ │ └── utils/ # 工具函数
522
+ ├── skills/ # 内置技能
523
+ │ ├── summarize/
524
+ │ ├── find-skills/
525
+ │ ├── self-improving-agent/
526
+ │ ├── skill-creator/
527
+ │ └── playwright-mcp/
560
528
  ├── tests/ # 单元测试
561
529
  ├── package.json
562
530
  ├── tsconfig.json