@jun133/athlete 0.0.5 → 0.0.7

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 (91) hide show
  1. package/README.md +151 -98
  2. package/dist/cli.js +24415 -20574
  3. package/dist/cli.js.map +1 -1
  4. package/package.json +3 -1
  5. package/scripts/postinstall-playwright.mjs +10 -10
  6. package/spec/README.md +49 -41
  7. package/spec//346/212/200/346/234/257/345/256/236/347/216/260/README.md +29 -0
  8. package/spec//346/212/200/346/234/257/345/256/236/347/216/260//344/270/273/345/276/252/347/216/257/344/270/216/350/260/203/345/272/246.md +60 -0
  9. package/spec//346/212/200/346/234/257/345/256/236/347/216/260//344/273/223/345/272/223/347/272/246/346/235/237//345/274/200/345/217/221/350/247/204/345/210/231.md +14 -0
  10. package/spec//346/212/200/346/234/257/345/256/236/347/216/260//344/273/223/345/272/223/347/272/246/346/235/237//346/234/254/345/234/260/345/221/275/344/273/244/344/270/216/346/265/201/347/250/213.md +20 -0
  11. package/spec//346/212/200/346/234/257/345/256/236/347/216/260//344/273/223/345/272/223/347/272/246/346/235/237//346/265/213/350/257/225/347/255/226/347/225/245.md +48 -0
  12. package/spec//346/212/200/346/234/257/345/256/236/347/216/260//344/273/243/347/240/201/345/234/260/345/233/276//347/233/256/345/275/225/345/210/260/344/273/243/347/240/201/346/230/240/345/260/204.md +51 -0
  13. package/spec//346/212/200/346/234/257/345/256/236/347/216/260//345/205/263/351/224/256/346/250/241/345/235/227/Telegram/347/247/201/350/201/212.md +31 -0
  14. package/spec//346/212/200/346/234/257/345/256/236/347/216/260//345/205/263/351/224/256/346/250/241/345/235/227//344/272/244/344/272/222/347/273/210/347/253/257.md +26 -0
  15. package/spec//346/212/200/346/234/257/345/256/236/347/216/260//345/205/263/351/224/256/346/250/241/345/235/227//345/221/275/344/273/244/350/241/214/344/272/247/345/223/201/351/235/242.md +27 -0
  16. package/spec//346/212/200/346/234/257/345/256/236/347/216/260//345/205/263/351/224/256/346/250/241/345/235/227//345/244/232/346/231/272/350/203/275/344/275/223/350/260/203/345/272/246.md +79 -0
  17. package/spec//346/212/200/346/234/257/345/256/236/347/216/260//345/205/263/351/224/256/346/250/241/345/235/227//345/256/277/344/270/273/350/277/220/350/241/214/350/276/271/347/225/214.md +74 -0
  18. package/spec//346/212/200/346/234/257/345/256/236/347/216/260//345/205/263/351/224/256/346/250/241/345/235/227//345/267/245/344/275/234/345/214/272/344/270/216/345/271/266/350/241/214/351/232/224/347/246/273.md +55 -0
  19. package/spec//346/212/200/346/234/257/345/256/236/347/216/260//345/205/263/351/224/256/346/250/241/345/235/227//345/276/256/344/277/241/347/247/201/350/201/212.md +33 -0
  20. package/spec//346/212/200/346/234/257/345/256/236/347/216/260//345/205/263/351/224/256/346/250/241/345/235/227//346/211/251/345/261/225/346/234/272/345/210/266.md +179 -0
  21. package/spec//346/212/200/346/234/257/345/256/236/347/216/260//345/205/263/351/224/256/346/250/241/345/235/227//346/216/247/345/210/266/351/235/242/350/264/246/346/234/254.md +32 -0
  22. package/spec//346/212/200/346/234/257/345/256/236/347/216/260//345/205/263/351/224/256/346/250/241/345/235/227//351/205/215/347/275/256/347/263/273/347/273/237.md +31 -0
  23. package/spec//346/212/200/346/234/257/345/256/236/347/216/260//346/200/273/344/275/223/346/236/266/346/236/204.md +115 -0
  24. package/spec//346/212/200/346/234/257/345/256/236/347/216/260//347/212/266/346/200/201/344/270/216/347/234/237/347/233/270/346/272/220.md +129 -0
  25. package/spec//347/224/250/346/210/267/345/256/241/351/230/205/README.md +27 -0
  26. package/spec//347/224/250/346/210/267/345/256/241/351/230/205//344/272/247/345/223/201/345/256/232/344/275/215.md +78 -0
  27. package/spec/{principles/P06- → /347/224/250/346/210/267/345/256/241/351/230/205//345/256/252/346/263/225/345/216/237/345/210/231/06-}/344/270/212/344/270/213/346/226/207/350/246/201/350/203/275/345/216/213/347/274/251.md +5 -5
  28. package/spec/{principles/P08- → /347/224/250/346/210/267/345/256/241/351/230/205//345/256/252/346/263/225/345/216/237/345/210/231/08-}/346/205/242/346/223/215/344/275/234/346/224/276/345/220/216/345/217/260.md +1 -1
  29. package/spec/{principles/P13-session → /347/224/250/346/210/267/345/256/241/351/230/205//345/256/252/346/263/225/345/216/237/345/210/231/13-session}/346/230/257/344/273/273/345/212/241/347/216/260/345/234/272.md +5 -5
  30. package/spec/{principles/P15-provider → /347/224/250/346/210/267/345/256/241/351/230/205//345/256/252/346/263/225/345/216/237/345/210/231/15-provider}/345/277/205/351/241/273/345/217/257/346/233/277/346/215/242.md +12 -12
  31. package/spec//347/224/250/346/210/267/345/256/241/351/230/205//345/256/252/346/263/225/345/216/237/345/210/231/17-/346/211/251/345/261/225/351/235/240/344/272/213/344/273/266/347/224/237/351/225/277.md +71 -0
  32. package/spec/{principles/P18- → /347/224/250/346/210/267/345/256/241/351/230/205//345/256/252/346/263/225/345/216/237/345/210/231/18-}/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 +37 -37
  33. package/spec/{principles/P20- → /347/224/250/346/210/267/345/256/241/351/230/205//345/256/252/346/263/225/345/216/237/345/210/231/20-}/345/244/226/351/203/250/344/272/213/345/256/236/345/277/205/351/241/273/347/273/221/345/256/232/350/257/201/346/215/256.md +48 -48
  34. package/spec/{principles/P21- → /347/224/250/346/210/267/345/256/241/351/230/205//345/256/252/346/263/225/345/216/237/345/210/231/21-}/346/262/241/351/252/214/350/277/207/345/260/261/344/270/215/350/203/275/346/224/266/345/217/243.md +46 -46
  35. package/spec/{principles/P22- → /347/224/250/346/210/267/345/256/241/351/230/205//345/256/252/346/263/225/345/216/237/345/210/231/22-}/351/230/266/346/256/265/346/216/250/350/277/233/345/277/205/351/241/273/346/234/211/346/234/272/345/231/250/347/212/266/346/200/201.md +40 -40
  36. package/spec/{principles/P23- → /347/224/250/346/210/267/345/256/241/351/230/205//345/256/252/346/263/225/345/216/237/345/210/231/23-}/346/226/207/346/234/254/351/223/276/350/267/257/345/277/205/351/241/273/347/250/263/345/256/232/345/217/257/350/257/273.md +38 -38
  37. package/spec/{principles/P24- → /347/224/250/346/210/267/345/256/241/351/230/205//345/256/252/346/263/225/345/216/237/345/210/231/24-}/351/224/231/350/257/257/345/205/274/345/256/271/344/270/215/350/203/275/351/253/230/344/272/216/346/255/243/347/241/256/346/200/247.md +38 -37
  38. package/spec//347/224/250/346/210/267/345/256/241/351/230/205//345/256/252/346/263/225/345/216/237/345/210/231/25-/346/226/260/351/241/271/347/233/256/344/270/215/344/270/272/346/227/247/346/256/213/344/275/231/344/277/235/346/264/273.md +66 -0
  39. package/spec//347/224/250/346/210/267/345/256/241/351/230/205//345/256/252/346/263/225/345/216/237/345/210/231/README.md +37 -0
  40. package/spec//347/224/250/346/210/267/345/256/241/351/230/205//347/263/273/347/273/237/345/205/250/346/231/257.md +57 -0
  41. package/spec//347/224/250/346/210/267/345/256/241/351/230/205//351/241/271/347/233/256/350/214/203/345/233/264.md +59 -0
  42. package/spec/adr/ADR-0001-/345/215/225/346/250/241/345/274/217/345/205/250/346/235/203/351/231/220.md +0 -16
  43. 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 +0 -19
  44. package/spec/adr/ADR-0003-openai-compatible/344/274/230/345/205/210.md +0 -16
  45. package/spec/architecture//346/200/273/344/275/223/346/236/266/346/236/204.md +0 -115
  46. package/spec/architecture//347/212/266/346/200/201/344/270/216/347/234/237/347/233/270/346/272/220.md +0 -120
  47. package/spec/architecture//350/277/220/350/241/214/346/227/266/345/276/252/347/216/257.md +0 -139
  48. package/spec/implementation/README.md +0 -17
  49. 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 +0 -55
  50. 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 +0 -176
  51. package/spec/interfaces/InteractionShell.md +0 -93
  52. package/spec/interfaces/ProviderAdapter.md +0 -23
  53. package/spec/interfaces/README.md +0 -17
  54. package/spec/interfaces/RuntimeLoop.md +0 -28
  55. package/spec/interfaces/SessionStore.md +0 -22
  56. package/spec/interfaces/ToolRegistry.md +0 -21
  57. package/spec/modules/config-system.md +0 -77
  58. package/spec/modules/interactive-terminal.md +0 -139
  59. package/spec/modules/lightweight-context-runtime.md +0 -80
  60. package/spec/modules/provider-adapter.md +0 -45
  61. package/spec/modules/runtime-metrics.md +0 -162
  62. package/spec/modules/runtime-rules.md +0 -65
  63. package/spec/modules/session-resume-compact.md +0 -55
  64. package/spec/modules/task-state.md +0 -41
  65. package/spec/modules/telegram-private-chat.md +0 -291
  66. package/spec/modules/tool-registry.md +0 -137
  67. package/spec/modules/weixin-private-chat.md +0 -291
  68. package/spec/modules/workspace-isolation.md +0 -24
  69. package/spec/modules//346/211/251/345/261/225/346/234/272/345/210/266.md +0 -141
  70. package/spec/overview/v0/350/214/203/345/233/264.md +0 -55
  71. package/spec/overview//344/272/247/345/223/201/345/256/232/344/271/211.md +0 -61
  72. 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 +0 -32
  73. package/spec/principles/README.md +0 -47
  74. package/spec/repo//345/274/200/345/217/221/350/247/204/345/210/231.md +0 -39
  75. 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 +0 -32
  76. 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 +0 -11
  77. package/spec/testing/fixtures-/350/247/204/350/214/203.md +0 -20
  78. package/spec/testing//346/265/213/350/257/225/347/255/226/347/225/245.md +0 -108
  79. /package/spec/{principles/P01- → /347/224/250/346/210/267/345/256/241/351/230/205//345/256/252/346/263/225/345/216/237/345/210/231/01-}/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" +0 -0
  80. /package/spec/{principles/P02- → /347/224/250/346/210/267/345/256/241/351/230/205//345/256/252/346/263/225/345/216/237/345/210/231/02-}/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" +0 -0
  81. /package/spec/{principles/P03- → /347/224/250/346/210/267/345/256/241/351/230/205//345/256/252/346/263/225/345/216/237/345/210/231/03-}/345/205/210/350/256/241/345/210/222/345/206/215/345/212/250/346/211/213.md" +0 -0
  82. /package/spec/{principles/P04- → /347/224/250/346/210/267/345/256/241/351/230/205//345/256/252/346/263/225/345/216/237/345/210/231/04-}/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" +0 -0
  83. /package/spec/{principles/P05- → /347/224/250/346/210/267/345/256/241/351/230/205//345/256/252/346/263/225/345/216/237/345/210/231/05-}/347/237/245/350/257/206/346/214/211/351/234/200/345/212/240/350/275/275.md" +0 -0
  84. /package/spec/{principles/P07- → /347/224/250/346/210/267/345/256/241/351/230/205//345/256/252/346/263/225/345/216/237/345/210/231/07-}/344/273/273/345/212/241/345/233/276/350/246/201/350/220/275/347/233/230.md" +0 -0
  85. /package/spec/{principles/P09- → /347/224/250/346/210/267/345/256/241/351/230/205//345/256/252/346/263/225/345/216/237/345/210/231/09-}/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" +0 -0
  86. /package/spec/{principles/P10- → /347/224/250/346/210/267/345/256/241/351/230/205//345/256/252/346/263/225/345/216/237/345/210/231/10-}/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" +0 -0
  87. /package/spec/{principles/P11- → /347/224/250/346/210/267/345/256/241/351/230/205//345/256/252/346/263/225/345/216/237/345/210/231/11-}/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" +0 -0
  88. /package/spec/{principles/P12- → /347/224/250/346/210/267/345/256/241/351/230/205//345/256/252/346/263/225/345/216/237/345/210/231/12-}/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" +0 -0
  89. /package/spec/{principles/P14- → /347/224/250/346/210/267/345/256/241/351/230/205//345/256/252/346/263/225/345/216/237/345/210/231/14-}/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" +0 -0
  90. /package/spec/{principles/P16- → /347/224/250/346/210/267/345/256/241/351/230/205//345/256/252/346/263/225/345/216/237/345/210/231/16-}/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" +0 -0
  91. /package/spec/{principles/P19- → /347/224/250/346/210/267/345/256/241/351/230/205//345/256/252/346/263/225/345/216/237/345/210/231/19-}/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" +0 -0
package/README.md CHANGED
@@ -11,134 +11,187 @@
11
11
  <img alt="runtime stats" src="https://img.shields.io/badge/runtime-stats-f59e0b?style=for-the-badge">
12
12
  </p>
13
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
- - 文档相关 workflow skills 当前包括 `mineru-pdf-reading`、`mineru-image-reading`、`mineru-doc-reading`、`mineru-ppt-reading`,分别路由到 `mineru_pdf_read`、`mineru_image_read`、`mineru_doc_read`、`mineru_ppt_read`。
70
- - `session` 被当成任务现场,而不是普通聊天记录;所以任务状态、todo、验证状态、恢复线索都能落在同一个真相源里。
71
- - 长任务靠 `checkpoint`、上下文压缩和 continuation 续跑;上下文满了不是直接死掉,而是压缩后继续往前。
72
- - 大目标可以写进任务板,复杂任务可以拆给 `teammate`,并且用 `worktree` 做目录隔离,避免多人并行时互相踩文件。
73
- - 慢操作不堵住主循环,直接进 `background`;主循环可以一边等,一边继续处理下一步。
74
- - 最后还有 `runtimeStats`、变更记录和验证链路,帮助系统知道自己到底做到了哪里、改了什么、验过没有。
75
-
76
- 所以 Athlete 想解决的,从来不只是“这一轮回答漂不漂亮”,而是另一件更难的事:当任务真的变长、变复杂、会失败、会中断的时候,系统还能不能继续把事情做下去。
77
-
78
- ### 已实现能力
14
+ 一个终端优先的 Agent Harness。
15
+
16
+ 一个单纯的 LLM,往往擅长回答问题;一个加上 harness 的 LLM,才开始真正接住任务。它不只是“说下一句”,而是能在复杂任务里持续往前跑,知道什么时候该读文件、什么时候该调用工具、什么时候该拆任务、什么时候该把状态记下来,出了错以后还能接着做。✨
17
+
18
+ Athlete 想做的,就是这层把模型变成“可执行系统”的底盘。它不只是在终端里包一层聊天壳,而是把状态、工具、恢复、协作和通道接成一条完整链路,让任务可以推进、暂停、恢复、续跑,并把过程留下来。🛠️
19
+
20
+ Athlete 当前的核心不是“陪聊”,而是“持续推进任务”:
21
+
22
+ - 一个耐跑的主 Agent
23
+ - 一个会拆任务、派任务、等任务、合流任务的总指挥层
24
+ - 一套统一的控制面、宿主边界和扩展口
25
+
26
+ 它已经不该被理解成一个“自己闷头干活的单兵 Agent”,而应该被理解成:
27
+
28
+ - 一个能长期耐跑的主 Agent
29
+ - 一个会组织任务、拆解任务、调度任务的总指挥
30
+ - 一个把工具、技能、宿主和控制面统一起来的平台内核
31
+
32
+ 主文档现在只看 `spec/`:
33
+
34
+ - 给人审阅的:`spec/用户审阅/`
35
+ - 给实现和测试用的:`spec/技术实现/`
36
+
37
+ ## 一个完整例子
38
+
39
+ 比如用户在 Telegram 私聊里丢来一句话,再附上几份材料:
40
+
41
+ > “帮我做一个《Helldivers 2》最新新闻情报包。
42
+ > 去网上找最新公开新闻,再结合我刚发给你的 PDF、截图、docx、pptx、表格和一个公开链接,最后给我:
43
+ > 1. 一个网页摘要
44
+ > 2. 一份 markdown 报告
45
+ > 3. 一份 docx 成品
46
+ > 4. 把最终文件回传给我。
47
+ > 如果任务太大,你自己拆分和调度。”
48
+
49
+ 这一个例子,基本就能把 Athlete 当前大部分能力串起来。🌟
50
+
51
+ ### 你从用户视角会看到什么 👀
52
+
53
+ 你看到的不是“建议你这样做”,而是一条真的在推进的任务链:
54
+
55
+ 1. 它先接住多种输入。
56
+ 不管你是从 CLI 直接发任务,还是从 Telegram / 微信私聊发消息、发图片、发文件、发语音,它都不是当成一段普通聊天,而是当成一个真实任务的入口。
57
+ 2. 它先理解任务全貌。
58
+ 它会判断:这个目标不只是“找新闻”,还包含网页信息搜集、附件解析、报告生成、文件交付和最终验证,所以不能闷头一步做到底。
59
+ 3. 它会把不同材料接进来。
60
+ PDF、截图、docx、pptx、表格、公开 URL,都不会被一刀切当成“普通文件”处理,而是按各自最合适的读取链路走。
61
+ 4. 它会真的去外部世界看。
62
+ 它会去搜新闻、打开页面、检查标题、时间、链接和内容,而不是假装“我大概知道最新新闻是什么”。
63
+ 5. 它会真的开始干活。
64
+ 它会写报告、改文件、做网页、补脚本、整理输出,而不是只给你一个“你可以这样做”的方案。
65
+ 6. 它会自己组织任务。
66
+ 一部分工作可以自己做,一部分可以放后台慢慢跑,一部分可以拆给别的执行者并行推进。
67
+ 7. 它会继续验证。
68
+ 它不会一写完就说“完成了”,而是继续检查网页、命令、HTTP 探针、输出文件和最终交付是否真的可用。
69
+ 8. 它会把结果交回给你。
70
+ 如果你在 Telegram / 微信里,它会把文本结果分块可见地发出来,并在需要时把最终文件直接发回去。
71
+ 9. 如果你中途要停,它也不会炸掉。
72
+ `/stop` 会停当前任务,但宿主服务不会退出;你下一条消息还可以继续接着干。🫶
73
+
74
+ ### 系统在机器层 / 开发视角到底做了什么 🤖
75
+
76
+ 这个例子背后,不是 prompt 在“努力自觉”,而是机器层在强约束:
77
+
78
+ 1. 统一宿主入口。
79
+ 同一个任务,不管来自 CLI、Telegram 还是微信,都会先经过统一宿主边界进入核心,而不是每个宿主自己偷偷拼一套 runtime。
80
+ 2. lead 先做总指挥预处理。
81
+ 真正调用模型前,系统会先分析 objective、复杂度、现有任务进度,判断这一步应该自己做、拆任务、派工、等待还是合流。
82
+ 3. 控制面落正式真相。
83
+ 任务、队友、后台任务、协议请求、worktree 绑定这些状态,都落在统一控制面里,不靠聊天记录临时记忆。
84
+ 4. session 是任务现场,不是普通聊天记录。
85
+ session 里会带着 checkpoint、verificationState、acceptanceState、runtimeStats,所以系统中断以后不是从零开始,而是能从现场继续。
86
+ 5. 文件和材料按能力链路走。
87
+ PDF 会走 `mineru_pdf_read`,图片走 `mineru_image_read`,docx 走 `mineru_doc_read`,pptx 走 `mineru_ppt_read`,表格走 `read_spreadsheet`,公开链接走 `download_url`,不是所有输入都粗暴塞给一个读文件工具。
88
+ 6. 网页和文件能力都是真实动作。
89
+ 网页部分依赖浏览器能力和网页研究链路;本地部分依赖 `read_file`、`write_file`、`edit_file`、`apply_patch`、`search_files`、`run_shell` 等真实工具,而不是让模型“脑补执行”。
90
+ 7. 慢任务和并行任务有正式执行位。
91
+ 慢操作可以进入 `background_run`;适合拆分的工作可以交给 teammate;并行改动需要 worktree 隔离,而不是所有执行者挤在同一个目录里乱改。
92
+ 8. finalize 受机器状态约束。
93
+ 一旦文件改动、工具执行或 closeout 条件触发,verification 和 acceptance 会进入正式状态机;没验过、没收口、没满足条件,就不能假装完成。
94
+ 9. 文件交付不是旁路。
95
+ Telegram / 微信的 send file 能力是通过宿主边界注入的正式 extra tool,不是宿主自己绕开核心偷偷发文件。
96
+ 10. 通道自己的现实语义也被保留。
97
+ Telegram 会保留它的 delivery、typing 和 `/stop` 语义;微信会保留 `context_token`、delivery、附件输入和 `/stop` 语义,但这些都不能反过来定义核心真相。
98
+ 11. 所有这些能力最后还能重新回到同一条主路径。
99
+ 所以 Athlete 不是“碰巧能做很多事”,而是“在机器层被组织成了同一个可续跑、可调度、可验证的系统”。🧭
100
+
101
+ 所以这个例子展示的,不只是“Agent 会不会写代码”,而是整个项目真正的能力全景:
102
+
103
+ - 网页研究与浏览器动作
104
+ - 文档、图片、PPT、表格、URL 输入链路
105
+ - 本地文件读写与补丁修改
106
+ - shell、后台任务和 HTTP 验证
107
+ - lead 调度、teammate、background、worktree
108
+ - session、checkpoint、verification、acceptance、runtime stats
109
+ - CLI、Telegram、微信三种宿主入口
110
+ - 文本结果与文件结果的最终交付
111
+
112
+ ## 已实现功能
79
113
 
80
114
  | 能力 | 接口 / 实现 | 状态 |
81
115
  | --- | --- | --- |
82
116
  | 浏览器自动化 | Playwright MCP `@playwright/mcp` | ✅ |
83
- | PDF 读取 | MinerU `mineru_pdf_read` | ✅ |
84
- | 图片读取 | MinerU `mineru_image_read` | ✅ |
85
- | Word 读取 | MinerU `mineru_doc_read`,`.docx` 可回退到 `read_docx` | ✅ |
86
- | Word 写入 / 编辑 | `write_docx` / `edit_docx` | ✅ |
87
- | PPT / PPTX 读取 | MinerU `mineru_ppt_read` | ✅ |
88
- | 表格读取 | `read_spreadsheet`,支持 `xlsx` / `xls` / `csv` / `tsv` / `ods` | ✅ |
89
- | 远程文件获取 | `download_url`,把公开 URL 落到本地再进入文档/文件链 | ✅ |
90
- | HTTP 探针 | `http_probe`,验证本地或远程页面 / API 是否真的可达 | ✅ |
91
- | 本地文件读写 / 补丁 | 内建 tools:`read_file` / `write_file` / `edit_file` / `apply_patch` / `search_files` | ✅ |
117
+ | PDF 读取 | `mineru_pdf_read` + `mineru-pdf-reading` | ✅ |
118
+ | 图片读取 | `mineru_image_read` + `mineru-image-reading` | ✅ |
119
+ | Word 读取 | `mineru_doc_read` + `mineru-doc-reading`,`.docx` 可回退到 `read_docx` | ✅ |
120
+ | Word 写入 / 编辑 | `write_docx` / `edit_docx` | ✅ |
121
+ | PPT / PPTX 读取 | `mineru_ppt_read` + `mineru-ppt-reading` | ✅ |
122
+ | 表格读取 | `read_spreadsheet`,支持 `xlsx` / `xls` / `csv` / `tsv` / `ods` | ✅ |
123
+ | 远程文件获取 | `download_url` | ✅ |
124
+ | HTTP 探针 | `http_probe` | ✅ |
125
+ | 本地文件读写 / 补丁 | `read_file` / `write_file` / `edit_file` / `apply_patch` / `search_files` | ✅ |
92
126
  | Shell 与后台任务 | `run_shell` / `background_run` / `background_check` | ✅ |
93
127
  | 任务板与协作队友 | `task` / `spawn_teammate` / `read_inbox` / `send_message` | ✅ |
94
128
  | 隔离工作区 | Git worktree:`worktree_*` | ✅ |
95
- | Telegram 私聊接入 | Telegram Bot API:`telegram serve` | ✅ |
96
- | Weixin 私聊接入 | OpenILink:`weixin login` / `weixin serve` / `weixin logout` | ✅ |
129
+ | Telegram 私聊接入 | `athlete telegram serve` | ✅ |
130
+ | 微信私聊接入 | `athlete weixin login` / `athlete weixin serve` / `athlete weixin logout` | ✅ |
131
+
132
+ ## 使用说明
97
133
 
98
- ## 指令集
134
+ - 文档读取能力依赖 `MINERU_API_TOKEN`。
135
+ - Telegram 需要 `ATHLETE_TELEGRAM_TOKEN` 和 `ATHLETE_TELEGRAM_ALLOWED_USER_IDS`。
136
+ - Telegram 私聊支持 `/stop`,可以停止当前任务但不关闭服务。
137
+ - Telegram 支持 file 输入与 file 回传;终端 logs 会显示服务启动、投递和失败信息。
138
+ - 微信需要先执行 `athlete weixin login`,再配置 `ATHLETE_WEIXIN_ALLOWED_USER_IDS`。
139
+ - 微信私聊支持 `/stop`,会维护 `context_token`,并接住 image / video / file / voice 输入与回传。
140
+ - 微信当前是 private only,不支持 group 群聊。
99
141
 
100
- ### 开发指令
142
+ ## 开发指令
101
143
 
102
144
  | 命令 | 含义 |
103
145
  | --- | --- |
104
146
  | `npm.cmd install` | 安装依赖 |
105
147
  | `npm.cmd run build` | 构建 CLI 到 `dist/cli.js` |
106
148
  | `npm.cmd run check` | 执行 `typecheck + build` |
107
- | `npm.cmd test` | 执行完整测试入口 |
108
- | `node dist\cli.js` | 直接用构建产物启动交互 CLI |
109
- | `node dist\cli.js "帮我看看这个项目"` | 源码环境下执行一次任务 |
110
- | `node dist\cli.js telegram serve` | 源码环境启动 Telegram 私聊服务 |
111
- | `node dist\cli.js weixin login` | 源码环境执行 Weixin 扫码登录 |
112
- | `node dist\cli.js weixin serve` | 源码环境启动 Weixin 私聊服务 |
113
-
114
- ### 用户指令
149
+ | `npm.cmd test` | 执行完整测试 |
150
+ | `npm.cmd run test:build` | 单独构建测试产物 |
151
+ | `node dist\\cli.js` | 用构建产物启动 CLI |
152
+ | `node dist\\cli.js "帮我看看这个项目"` | 执行一次 one-shot 任务 |
153
+ | `node dist\\cli.js telegram serve` | 源码环境启动 Telegram 服务 |
154
+ | `node dist\\cli.js weixin login` | 源码环境执行微信扫码登录 |
155
+ | `node dist\\cli.js weixin serve` | 源码环境启动微信服务 |
156
+ | `node dist\\cli.js weixin logout` | 源码环境清理微信登录态 |
115
157
 
116
- 全局安装后直接使用 `athlete`;源码联调时,把 `athlete` 换成 `node dist\cli.js` 即可。
158
+ ## 用户指令
117
159
 
118
160
  | 命令 | 含义 |
119
161
  | --- | --- |
120
162
  | `npm install -g @jun133/athlete` | 全局安装 CLI |
121
- | `athlete init` | 在当前项目生成 `.athlete/.env`、`.athlete/.env.example`、`.athlete/.athleteignore` |
163
+ | `athlete init` | 初始化当前项目的 `.athlete/` |
122
164
  | `athlete` | 进入交互模式 |
123
- | `athlete "帮我看看这个项目"` | 单次执行一个任务 |
124
- | `athlete run "帮我看看这个项目"` | 显式执行一次单次任务 |
125
- | `athlete resume [sessionId]` | 继续最近一次或指定会话 |
165
+ | `athlete "帮我看看这个项目"` | 执行一次任务 |
166
+ | `athlete run "帮我看看这个项目"` | 显式执行一次任务 |
167
+ | `athlete resume [sessionId]` | 恢复最近一次或指定会话 |
126
168
  | `athlete sessions -n 20` | 查看最近会话 |
127
169
  | `athlete diff [path]` | 查看当前项目 Git diff |
128
170
  | `athlete changes [changeId]` | 查看变更记录 |
129
171
  | `athlete undo [changeId]` | 回滚最近一次或指定变更 |
130
172
  | `athlete config show` | 查看当前配置 |
173
+ | `athlete config path` | 查看配置文件路径 |
131
174
  | `athlete doctor` | 检查本地配置和 API 连通性 |
132
175
  | `athlete telegram serve` | 启动 Telegram 私聊服务 |
133
- | `athlete weixin login` | Weixin 扫码登录并保存登录态 |
134
- | `athlete weixin serve` | 启动 Weixin 私聊服务 |
135
- | `athlete weixin logout` | 清理 Weixin 登录态 |
176
+ | `athlete weixin login` | 微信扫码登录并保存登录态 |
177
+ | `athlete weixin serve` | 启动微信私聊服务 |
178
+ | `athlete weixin logout` | 清理微信登录态 |
136
179
 
137
- 文档读取能力依赖 `MINERU_API_TOKEN`。Telegram 需要 `ATHLETE_TELEGRAM_TOKEN` 和 `ATHLETE_TELEGRAM_ALLOWED_USER_IDS`。Weixin 需要先执行 `athlete weixin login`,再配置 `ATHLETE_WEIXIN_ALLOWED_USER_IDS`。Telegram 和 Weixin 私聊里都支持 `/stop`,用于停止当前任务但不关闭服务。
138
-
139
- Weixin 当前只支持 private 私聊,不支持 group 群聊;服务会维护每个会话的 `context_token`,并接住 image、video、file、voice 等私聊附件输入与回传链路。
180
+ ## CI / 验证指令
140
181
 
141
- ### NPM 发布
182
+ | 命令 | 含义 |
183
+ | --- | --- |
184
+ | `npm.cmd run check` | CI 最基础检查 |
185
+ | `npm.cmd test` | 完整 CI 主入口 |
186
+ | `npm.cmd run test:build` | 只编译测试 |
187
+ | `node --test .test-build/tests/**/*.test.js` | 直接运行编译后的测试 |
188
+ | `npm.cmd run verify:skills-api` | 校验 skills API |
189
+ | `npm.cmd run verify:runtime-context-api` | 校验 runtime context API |
190
+ | `npm.cmd run verify:runtime-checkpoint-api` | 校验 runtime checkpoint API |
191
+ | `npm.cmd run verify:runtime-observability-api` | 校验 runtime observability API |
192
+ | `npm.cmd run verify:mineru-documents-api` | 校验 MinerU 文档链路 |
193
+
194
+ ## 发布指令
142
195
 
143
196
  | 命令 | 含义 |
144
197
  | --- | --- |