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