@jun133/athlete 0.0.2

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 (61) hide show
  1. package/README.md +146 -0
  2. package/dist/cli.js +22731 -0
  3. package/dist/cli.js.map +1 -0
  4. package/package.json +72 -0
  5. package/scripts/postinstall-playwright.mjs +79 -0
  6. package/spec/README.md +56 -0
  7. package/spec/adr/ADR-0001-/345/215/225/346/250/241/345/274/217/345/205/250/346/235/203/351/231/220.md +16 -0
  8. package/spec/adr/ADR-0002-/345/215/225agent/350/265/267/346/255/245/345/271/266/351/242/204/347/225/231/345/244/232agent/350/276/271/347/225/214.md +19 -0
  9. package/spec/adr/ADR-0003-openai-compatible/344/274/230/345/205/210.md +16 -0
  10. package/spec/architecture//346/200/273/344/275/223/346/236/266/346/236/204.md +111 -0
  11. package/spec/architecture//347/212/266/346/200/201/344/270/216/347/234/237/347/233/270/346/272/220.md +117 -0
  12. package/spec/architecture//350/277/220/350/241/214/346/227/266/345/276/252/347/216/257.md +82 -0
  13. package/spec/implementation/README.md +17 -0
  14. package/spec/implementation//346/250/241/345/235/227/347/272/247/345/274/200/345/217/221/344/273/273/345/212/241/345/215/225.md +55 -0
  15. package/spec/implementation//347/233/256/345/275/225/347/273/223/346/236/204/345/210/260/344/273/243/347/240/201/346/226/207/344/273/266/346/230/240/345/260/204/350/241/250.md +101 -0
  16. package/spec/interfaces/InteractionShell.md +85 -0
  17. package/spec/interfaces/ProviderAdapter.md +23 -0
  18. package/spec/interfaces/README.md +17 -0
  19. package/spec/interfaces/RuntimeLoop.md +28 -0
  20. package/spec/interfaces/SessionStore.md +22 -0
  21. package/spec/interfaces/ToolRegistry.md +21 -0
  22. package/spec/modules/config-system.md +51 -0
  23. package/spec/modules/interactive-terminal.md +112 -0
  24. package/spec/modules/lightweight-context-runtime.md +63 -0
  25. package/spec/modules/provider-adapter.md +20 -0
  26. package/spec/modules/runtime-metrics.md +132 -0
  27. package/spec/modules/runtime-rules.md +33 -0
  28. package/spec/modules/session-resume-compact.md +49 -0
  29. package/spec/modules/task-state.md +34 -0
  30. package/spec/modules/telegram-private-chat.md +290 -0
  31. package/spec/modules/tool-registry.md +79 -0
  32. package/spec/modules/weixin-private-chat.md +291 -0
  33. package/spec/modules/workspace-isolation.md +24 -0
  34. package/spec/modules//346/211/251/345/261/225/346/234/272/345/210/266.md +105 -0
  35. package/spec/overview/v0/350/214/203/345/233/264.md +54 -0
  36. package/spec/overview//344/272/247/345/223/201/345/256/232/344/271/211.md +59 -0
  37. package/spec/principles/P01-/344/270/200/344/270/252/345/276/252/347/216/257/344/270/200/344/270/252/346/231/272/350/203/275/344/275/223.md +31 -0
  38. package/spec/principles/P02-/345/212/240/344/270/200/344/270/252/345/267/245/345/205/267/345/217/252/345/212/240/344/270/200/344/270/252/345/244/204/347/220/206/345/231/250.md +28 -0
  39. package/spec/principles/P03-/345/205/210/350/256/241/345/210/222/345/206/215/345/212/250/346/211/213.md +25 -0
  40. package/spec/principles/P04-/345/244/247/344/273/273/345/212/241/346/213/206/347/273/231/345/255/220/346/231/272/350/203/275/344/275/223.md +26 -0
  41. package/spec/principles/P05-/347/237/245/350/257/206/346/214/211/351/234/200/345/212/240/350/275/275.md +29 -0
  42. package/spec/principles/P06-/344/270/212/344/270/213/346/226/207/350/246/201/350/203/275/345/216/213/347/274/251.md +23 -0
  43. package/spec/principles/P07-/344/273/273/345/212/241/345/233/276/350/246/201/350/220/275/347/233/230.md +20 -0
  44. package/spec/principles/P08-/346/205/242/346/223/215/344/275/234/346/224/276/345/220/216/345/217/260.md +23 -0
  45. package/spec/principles/P09-/344/273/273/345/212/241/345/244/252/345/244/247/345/260/261/345/210/206/347/273/231/351/230/237/345/217/213.md +21 -0
  46. package/spec/principles/P10-/351/230/237/345/217/213/344/271/213/351/227/264/350/246/201/346/234/211/347/273/237/344/270/200/345/215/217/350/256/256.md +23 -0
  47. package/spec/principles/P11-/351/230/237/345/217/213/350/207/252/345/267/261/350/256/244/351/242/206/344/273/273/345/212/241.md +25 -0
  48. package/spec/principles/P12-/345/267/245/344/275/234/345/214/272/345/222/214/344/273/273/345/212/241/350/246/201/351/232/224/347/246/273.md +20 -0
  49. package/spec/principles/P13-session/346/230/257/344/273/273/345/212/241/347/216/260/345/234/272.md +30 -0
  50. package/spec/principles/P14-/346/211/247/350/241/214/347/272/246/346/235/237/344/270/215/346/230/257/345/256/211/345/205/250/347/255/226/347/225/245.md +27 -0
  51. package/spec/principles/P15-provider/345/277/205/351/241/273/345/217/257/346/233/277/346/215/242.md +22 -0
  52. package/spec/principles/P16-/351/205/215/347/275/256/345/217/252/350/203/275/346/234/211/344/270/200/344/270/252/345/205/245/345/217/243.md +22 -0
  53. package/spec/principles/P17-/346/211/251/345/261/225/351/235/240/344/272/213/344/273/266/347/224/237/351/225/277.md +32 -0
  54. package/spec/principles/P18-/344/270/273/345/276/252/347/216/257/345/222/214/346/226/207/344/273/266/351/203/275/344/270/215/350/203/275/351/225/277/350/203/226.md +36 -0
  55. package/spec/principles/P19-/345/205/210/345/206/231/345/244/261/350/264/245/346/265/213/350/257/225/345/206/215/345/206/231/345/256/236/347/216/260.md +29 -0
  56. package/spec/principles/README.md +39 -0
  57. package/spec/repo//345/274/200/345/217/221/350/247/204/345/210/231.md +39 -0
  58. package/spec/repo//346/234/254/345/234/260/345/221/275/344/273/244/344/270/216/346/265/201/347/250/213.md +32 -0
  59. package/spec/testing/fail-first-/347/254/254/344/270/200/346/211/271/346/265/213/350/257/225/345/210/227/350/241/250.md +11 -0
  60. package/spec/testing/fixtures-/350/247/204/350/214/203.md +20 -0
  61. package/spec/testing//346/265/213/350/257/225/347/255/226/347/225/245.md +97 -0
package/README.md ADDED
@@ -0,0 +1,146 @@
1
+ # Athlete
2
+
3
+ <p align="center">
4
+ <strong>一个把 LLM 变成可持续执行系统的 Agent Harness</strong>
5
+ </p>
6
+
7
+ <p align="center">
8
+ <img alt="terminal first" src="https://img.shields.io/badge/terminal-first-2ea44f?style=for-the-badge">
9
+ <img alt="durable runtime" src="https://img.shields.io/badge/durable-runtime-1f6feb?style=for-the-badge">
10
+ <img alt="checkpoint persisted" src="https://img.shields.io/badge/checkpoint-persisted-8250df?style=for-the-badge">
11
+ <img alt="runtime stats" src="https://img.shields.io/badge/runtime-stats-f59e0b?style=for-the-badge">
12
+ </p>
13
+
14
+ 一个单纯的 LLM,往往擅长回答问题;一个加上 harness 的 LLM,才开始真正接住任务。它不只是“说下一句”,而是能在复杂任务里持续往前跑,知道什么时候该读文件、什么时候该调用工具、什么时候该拆任务、什么时候该把状态记下来,出了错以后还能接着做。
15
+
16
+ Athlete 想做的,就是这层把模型变成“可执行系统”的底盘。它不只是在终端里包一层聊天壳,而是把状态、工具、恢复、协作和通道接成一条完整链路,让任务可以推进、暂停、恢复、续跑,并把过程留下来。
17
+
18
+ ## 功能清单
19
+
20
+ ### Harness 机制
21
+
22
+ #### 先讲原则
23
+
24
+ 白话一点说,`LLM` 更像一个会思考、会表达的大脑,但它天然不擅长长期把一件复杂的事做完。上下文会满,任务会中断,结果会散,工具会失败,执行会卡住。`LLM + harness` 的意义,就是给这个大脑补上手脚、记忆、流程和恢复力,让它不只是会答,而是会把任务从头接住,一步一步推进到可交付的结果。
25
+
26
+ Athlete 想坚持的,不是“让模型显得更聪明”,而是让任务真的能跑完。所以它会先守住几个原则:
27
+
28
+ 1. 先列计划,再动手。复杂任务不能一上来就乱写,必须先形成 `todo list` 和执行顺序。
29
+ 2. session 不是聊天记录,而是任务现场。做到了哪一步、卡在哪一步、下一步做什么,不能只留在模型脑子里。
30
+ 3. 能拆就拆,能并行就并行。大任务要拆成子任务,慢操作放后台,必要时交给队友并行推进。
31
+ 4. 每做一步都要能接回来。工具调用完、文件改完、任务推进完,都要重新回到主循环继续判断下一步。
32
+ 5. 最后必须验证和交付。不是“解释清楚了”就算完成,而是要把结果真的做出来、跑起来、验一遍。
33
+
34
+ #### 一个完整例子
35
+
36
+ 比如用户只说一句话:
37
+
38
+ > “帮我做一个展示《Helldivers 2》最新新闻的东西。”
39
+
40
+ 对普通 LLM 来说,它很可能会马上给你一段页面草图、一个伪代码方案,或者一份“你可以这样做”的建议。但对一个带 harness 的系统来说,这句话会被当成一个真实任务,而不只是一个聊天话题。
41
+
42
+ 它接到这句话以后,更像是这样推进:
43
+
44
+ 1. 先列一个 `todo list`。
45
+ 不是马上开写,而是先把任务拆出来,比如:确认新闻来源、浏览最近新闻、定义数据结构、写抓取脚本、写前后端展示、跑验证、整理最终交付。
46
+ 2. 先去浏览器里看新闻到底长什么样。
47
+ 它会真的打开网页,看《Helldivers 2》的新闻页面、更新时间、标题结构、链接结构、图片结构,判断应该抓哪些字段,而不是闭着眼凭空假设。
48
+ 3. 再决定数据获取方式。
49
+ 如果页面结构稳定,就写一个小爬虫;如果已有接口或更稳的来源,就改成调用接口。这里不是先选技术,而是先根据真实页面决定方案。
50
+ 4. 然后开始写代码。
51
+ 先写抓取新闻的脚本或服务,再写前端页面把新闻列表展示出来,必要时再补一个简单后端,或者接进现有项目结构里。
52
+ 5. 写完以后不会立刻自称“完成了”。
53
+ 它会继续跑 `build`、开页面、检查新闻有没有真的展示出来、链接能不能点、时间是不是正确、抓取是不是失败、页面有没有报错。
54
+ 6. 如果中途有一步很慢,或者任务太大。
55
+ 它不会整条链路卡死在那里,而是把慢操作丢到 `background`,或者把某一部分拆给别的 teammate 去做,比如一个队友写抓取,一个队友做前端。
56
+ 7. 如果中途断了。
57
+ 比如浏览器挂了、命令超时了、上下文满了、你关掉终端了,它也不是从零再来,而是会从 checkpoint 和 session 里找回现场,知道“新闻抓取已经写完了,现在还差页面展示和验证”。
58
+ 8. 最后交付的不应该是一段解释。
59
+ 它应该交付的是一个真的能展示最新《Helldivers 2》新闻的结果,外加清楚的验证结果和改动记录。
60
+
61
+ 这就是 harness 和普通对话式 LLM 的差别。普通 LLM 更像是在讨论“这件事怎么做”;带 harness 的系统,是在真的把这件事往下做。
62
+
63
+ #### 技术上怎么做到
64
+
65
+ 技术上看,Athlete 不是“写了一个更长的 prompt”,而是把模型放进了一套可持续执行的 runtime 里。
66
+
67
+ - 主体仍然是一个清晰的 agent loop:看上下文,决定下一步,调用工具,把结果接回循环。
68
+ - `tools` 负责动作,`skills` 负责 workflow,`MCP` 负责接外部能力;所有能力统一走 tool registry,不让能力从旁路长出来。
69
+ - `session` 被当成任务现场,而不是普通聊天记录;所以任务状态、todo、验证状态、恢复线索都能落在同一个真相源里。
70
+ - 长任务靠 `checkpoint`、上下文压缩和 continuation 续跑;上下文满了不是直接死掉,而是压缩后继续往前。
71
+ - 大目标可以写进任务板,复杂任务可以拆给 `teammate`,并且用 `worktree` 做目录隔离,避免多人并行时互相踩文件。
72
+ - 慢操作不堵住主循环,直接进 `background`;主循环可以一边等,一边继续处理下一步。
73
+ - 最后还有 `runtimeStats`、变更记录和验证链路,帮助系统知道自己到底做到了哪里、改了什么、验过没有。
74
+
75
+ 所以 Athlete 想解决的,从来不只是“这一轮回答漂不漂亮”,而是另一件更难的事:当任务真的变长、变复杂、会失败、会中断的时候,系统还能不能继续把事情做下去。
76
+
77
+ ### 已实现能力
78
+
79
+ | 能力 | 接口 / 实现 | 状态 |
80
+ | --- | --- | --- |
81
+ | 浏览器自动化 | Playwright MCP `@playwright/mcp` | ✅ |
82
+ | PDF 读取 | MinerU `mineru_pdf_read` | ✅ |
83
+ | 图片读取 | MinerU `mineru_image_read` | ✅ |
84
+ | Word 读取 | MinerU `mineru_doc_read`,`.docx` 可回退到 `read_docx` | ✅ |
85
+ | Word 写入 / 编辑 | `write_docx` / `edit_docx` | ✅ |
86
+ | PPT / PPTX 读取 | MinerU `mineru_ppt_read` | ✅ |
87
+ | 表格读取 | `read_spreadsheet`,支持 `xlsx` / `xls` / `csv` / `tsv` / `ods` | ✅ |
88
+ | 本地文件读写 / 补丁 | 内建 tools:`read_file` / `write_file` / `edit_file` / `apply_patch` / `search_files` | ✅ |
89
+ | Shell 与后台任务 | `run_shell` / `background_run` / `background_check` | ✅ |
90
+ | 任务板与协作队友 | `task` / `spawn_teammate` / `read_inbox` / `send_message` | ✅ |
91
+ | 隔离工作区 | Git worktree:`worktree_*` | ✅ |
92
+ | Telegram 私聊接入 | Telegram Bot API:`telegram serve` | ✅ |
93
+ | Weixin 私聊接入 | OpenILink:`weixin login` / `weixin serve` / `weixin logout` | ✅ |
94
+
95
+ ## 指令集
96
+
97
+ ### 开发指令
98
+
99
+ | 命令 | 含义 |
100
+ | --- | --- |
101
+ | `npm.cmd install` | 安装依赖 |
102
+ | `npm.cmd run build` | 构建 CLI 到 `dist/cli.js` |
103
+ | `npm.cmd run check` | 执行 `typecheck + build` |
104
+ | `npm.cmd test` | 执行完整测试入口 |
105
+ | `node dist\cli.js` | 直接用构建产物启动交互 CLI |
106
+ | `node dist\cli.js "帮我看看这个项目"` | 源码环境下执行一次任务 |
107
+ | `node dist\cli.js telegram serve` | 源码环境启动 Telegram 私聊服务 |
108
+ | `node dist\cli.js weixin login` | 源码环境执行 Weixin 扫码登录 |
109
+ | `node dist\cli.js weixin serve` | 源码环境启动 Weixin 私聊服务 |
110
+
111
+ ### 用户指令
112
+
113
+ 全局安装后直接使用 `athlete`;源码联调时,把 `athlete` 换成 `node dist\cli.js` 即可。
114
+
115
+ | 命令 | 含义 |
116
+ | --- | --- |
117
+ | `npm install -g @jun133/athlete` | 全局安装 CLI |
118
+ | `athlete init` | 在当前项目生成 `.athlete/.env`、`.athlete/.env.example`、`.athlete/.athleteignore` |
119
+ | `athlete` | 进入交互模式 |
120
+ | `athlete "帮我看看这个项目"` | 单次执行一个任务 |
121
+ | `athlete run "帮我看看这个项目"` | 显式执行一次单次任务 |
122
+ | `athlete resume [sessionId]` | 继续最近一次或指定会话 |
123
+ | `athlete sessions -n 20` | 查看最近会话 |
124
+ | `athlete diff [path]` | 查看当前项目 Git diff |
125
+ | `athlete changes [changeId]` | 查看变更记录 |
126
+ | `athlete undo [changeId]` | 回滚最近一次或指定变更 |
127
+ | `athlete config show` | 查看当前配置 |
128
+ | `athlete doctor` | 检查本地配置和 API 连通性 |
129
+ | `athlete telegram serve` | 启动 Telegram 私聊服务 |
130
+ | `athlete weixin login` | Weixin 扫码登录并保存登录态 |
131
+ | `athlete weixin serve` | 启动 Weixin 私聊服务 |
132
+ | `athlete weixin logout` | 清理 Weixin 登录态 |
133
+
134
+ 文档读取能力依赖 `MINERU_API_TOKEN`。Telegram 需要 `ATHLETE_TELEGRAM_TOKEN` 和 `ATHLETE_TELEGRAM_ALLOWED_USER_IDS`。Weixin 需要先执行 `athlete weixin login`,再配置 `ATHLETE_WEIXIN_ALLOWED_USER_IDS`。
135
+
136
+ ### NPM 发布
137
+
138
+ | 命令 | 含义 |
139
+ | --- | --- |
140
+ | `npm login` | 登录 NPM |
141
+ | `npm whoami` | 确认当前发布账号 |
142
+ | `npm.cmd run check` | 发布前检查 |
143
+ | `npm version patch` | 发布补丁版本 |
144
+ | `npm version minor` | 发布次版本 |
145
+ | `npm version major` | 发布主版本 |
146
+ | `npm publish` | 发布到 NPM |