@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.
- package/README.md +146 -0
- package/dist/cli.js +22731 -0
- package/dist/cli.js.map +1 -0
- package/package.json +72 -0
- package/scripts/postinstall-playwright.mjs +79 -0
- package/spec/README.md +56 -0
- 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
- 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
- package/spec/adr/ADR-0003-openai-compatible/344/274/230/345/205/210.md +16 -0
- package/spec/architecture//346/200/273/344/275/223/346/236/266/346/236/204.md +111 -0
- package/spec/architecture//347/212/266/346/200/201/344/270/216/347/234/237/347/233/270/346/272/220.md +117 -0
- package/spec/architecture//350/277/220/350/241/214/346/227/266/345/276/252/347/216/257.md +82 -0
- package/spec/implementation/README.md +17 -0
- 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
- 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
- package/spec/interfaces/InteractionShell.md +85 -0
- package/spec/interfaces/ProviderAdapter.md +23 -0
- package/spec/interfaces/README.md +17 -0
- package/spec/interfaces/RuntimeLoop.md +28 -0
- package/spec/interfaces/SessionStore.md +22 -0
- package/spec/interfaces/ToolRegistry.md +21 -0
- package/spec/modules/config-system.md +51 -0
- package/spec/modules/interactive-terminal.md +112 -0
- package/spec/modules/lightweight-context-runtime.md +63 -0
- package/spec/modules/provider-adapter.md +20 -0
- package/spec/modules/runtime-metrics.md +132 -0
- package/spec/modules/runtime-rules.md +33 -0
- package/spec/modules/session-resume-compact.md +49 -0
- package/spec/modules/task-state.md +34 -0
- package/spec/modules/telegram-private-chat.md +290 -0
- package/spec/modules/tool-registry.md +79 -0
- package/spec/modules/weixin-private-chat.md +291 -0
- package/spec/modules/workspace-isolation.md +24 -0
- package/spec/modules//346/211/251/345/261/225/346/234/272/345/210/266.md +105 -0
- package/spec/overview/v0/350/214/203/345/233/264.md +54 -0
- package/spec/overview//344/272/247/345/223/201/345/256/232/344/271/211.md +59 -0
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- package/spec/principles/P13-session/346/230/257/344/273/273/345/212/241/347/216/260/345/234/272.md +30 -0
- 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
- package/spec/principles/P15-provider/345/277/205/351/241/273/345/217/257/346/233/277/346/215/242.md +22 -0
- 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
- 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
- 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
- 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
- package/spec/principles/README.md +39 -0
- package/spec/repo//345/274/200/345/217/221/350/247/204/345/210/231.md +39 -0
- 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
- 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
- package/spec/testing/fixtures-/350/247/204/350/214/203.md +20 -0
- package/spec/testing//346/265/213/350/257/225/347/255/226/347/225/245.md +97 -0
package/package.json
ADDED
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@jun133/athlete",
|
|
3
|
+
"version": "0.0.2",
|
|
4
|
+
"description": "A global terminal AI coding assistant.",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"athlete",
|
|
7
|
+
"cli",
|
|
8
|
+
"ai",
|
|
9
|
+
"agent",
|
|
10
|
+
"coding"
|
|
11
|
+
],
|
|
12
|
+
"bin": {
|
|
13
|
+
"athlete": "dist/cli.js"
|
|
14
|
+
},
|
|
15
|
+
"files": [
|
|
16
|
+
"dist",
|
|
17
|
+
"README.md",
|
|
18
|
+
"spec",
|
|
19
|
+
"scripts/postinstall-playwright.mjs"
|
|
20
|
+
],
|
|
21
|
+
"publishConfig": {
|
|
22
|
+
"access": "public"
|
|
23
|
+
},
|
|
24
|
+
"engines": {
|
|
25
|
+
"node": ">=20.0.0"
|
|
26
|
+
},
|
|
27
|
+
"scripts": {
|
|
28
|
+
"build": "tsup src/cli.ts --format cjs --platform node --target node20 --outDir dist --clean --sourcemap",
|
|
29
|
+
"check": "npm run typecheck && npm run build",
|
|
30
|
+
"dev": "tsx src/cli.ts",
|
|
31
|
+
"postinstall": "node scripts/postinstall-playwright.mjs",
|
|
32
|
+
"test:build": "node -e \"require('node:fs').rmSync('.test-build', { recursive: true, force: true })\" && tsc -p tsconfig.tests.json",
|
|
33
|
+
"test:core": "npm run test:build && node --test .test-build/tests/**/*.test.js",
|
|
34
|
+
"verify:skills-api": "npm run test:build && node scripts/verify-skills-v1.mjs",
|
|
35
|
+
"verify:runtime-context-api": "npm run test:build && node scripts/verify-runtime-lightweight-context-api.mjs",
|
|
36
|
+
"verify:runtime-checkpoint-api": "npm run test:build && node scripts/verify-runtime-checkpoint-api.mjs",
|
|
37
|
+
"verify:runtime-observability-api": "npm run test:build && node scripts/verify-runtime-observability-api.mjs",
|
|
38
|
+
"verify:mineru-documents-api": "npm run test:build && node scripts/verify-mineru-documents-api.mjs",
|
|
39
|
+
"typecheck": "tsc --noEmit",
|
|
40
|
+
"prepublishOnly": "npm run build",
|
|
41
|
+
"test": "npm run check && npm run test:core"
|
|
42
|
+
},
|
|
43
|
+
"dependencies": {
|
|
44
|
+
"@inquirer/prompts": "^7.9.0",
|
|
45
|
+
"@modelcontextprotocol/sdk": "^1.29.0",
|
|
46
|
+
"@openilink/openilink-sdk-node": "^0.6.0",
|
|
47
|
+
"@playwright/mcp": "^0.0.70",
|
|
48
|
+
"@types/adm-zip": "^0.5.8",
|
|
49
|
+
"adm-zip": "^0.5.17",
|
|
50
|
+
"cfb": "^1.2.2",
|
|
51
|
+
"chalk": "^5.6.2",
|
|
52
|
+
"commander": "^14.0.1",
|
|
53
|
+
"diff": "^8.0.2",
|
|
54
|
+
"docx": "^9.5.1",
|
|
55
|
+
"dompurify": "^3.3.3",
|
|
56
|
+
"dotenv": "^17.2.3",
|
|
57
|
+
"env-paths": "^3.0.0",
|
|
58
|
+
"execa": "^9.6.0",
|
|
59
|
+
"fast-glob": "^3.3.3",
|
|
60
|
+
"mammoth": "^1.10.0",
|
|
61
|
+
"marked": "^17.0.4",
|
|
62
|
+
"openai": "^6.4.0",
|
|
63
|
+
"silk-wasm": "^3.7.1",
|
|
64
|
+
"xlsx": "^0.18.5"
|
|
65
|
+
},
|
|
66
|
+
"devDependencies": {
|
|
67
|
+
"@types/node": "^24.5.2",
|
|
68
|
+
"tsup": "^8.5.0",
|
|
69
|
+
"tsx": "^4.20.5",
|
|
70
|
+
"typescript": "^5.9.2"
|
|
71
|
+
}
|
|
72
|
+
}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { createRequire } from "node:module";
|
|
4
|
+
import { spawnSync } from "node:child_process";
|
|
5
|
+
|
|
6
|
+
const require = createRequire(import.meta.url);
|
|
7
|
+
|
|
8
|
+
if (shouldSkipInstall()) {
|
|
9
|
+
process.exit(0);
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
const target = resolveInstallTarget(process.env.ATHLETE_MCP_PLAYWRIGHT_BROWSER);
|
|
13
|
+
const cliPath = resolvePlaywrightCliPath();
|
|
14
|
+
const location = readInstallLocation(cliPath, target);
|
|
15
|
+
|
|
16
|
+
if (location === "<system>" || (location && fs.existsSync(location))) {
|
|
17
|
+
process.exit(0);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
const result = spawnSync(process.execPath, [cliPath, "install", target], {
|
|
21
|
+
stdio: "inherit",
|
|
22
|
+
windowsHide: true,
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
if ((result.status ?? 1) !== 0) {
|
|
26
|
+
const message = `[athlete] Playwright browser bootstrap failed for "${target}". ` +
|
|
27
|
+
`You can retry later, or skip with ATHLETE_SKIP_PLAYWRIGHT_BROWSER_INSTALL=1.`;
|
|
28
|
+
|
|
29
|
+
if (isStrictInstall()) {
|
|
30
|
+
console.error(message);
|
|
31
|
+
process.exit(result.status ?? 1);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
console.warn(message);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
function resolveInstallTarget(rawValue) {
|
|
38
|
+
switch (String(rawValue ?? "").trim().toLowerCase()) {
|
|
39
|
+
case "chrome":
|
|
40
|
+
return "chrome";
|
|
41
|
+
case "firefox":
|
|
42
|
+
return "firefox";
|
|
43
|
+
case "webkit":
|
|
44
|
+
return "webkit";
|
|
45
|
+
case "msedge":
|
|
46
|
+
return "msedge";
|
|
47
|
+
default:
|
|
48
|
+
return "chrome";
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
function resolvePlaywrightCliPath() {
|
|
53
|
+
const packageJsonPath = require.resolve("playwright/package.json");
|
|
54
|
+
return path.join(path.dirname(packageJsonPath), "cli.js");
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
function readInstallLocation(cliPath, target) {
|
|
58
|
+
const result = spawnSync(process.execPath, [cliPath, "install", "--dry-run", target], {
|
|
59
|
+
encoding: "utf8",
|
|
60
|
+
windowsHide: true,
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
if ((result.status ?? 1) !== 0) {
|
|
64
|
+
return "";
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
const match = String(result.stdout ?? "").match(/Install location:\s+([^\r\n]+)/i);
|
|
68
|
+
return match?.[1]?.trim() ?? "";
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
function shouldSkipInstall() {
|
|
72
|
+
const value = String(process.env.ATHLETE_SKIP_PLAYWRIGHT_BROWSER_INSTALL ?? "").trim().toLowerCase();
|
|
73
|
+
return value === "1" || value === "true" || value === "yes";
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
function isStrictInstall() {
|
|
77
|
+
const value = String(process.env.ATHLETE_STRICT_PLAYWRIGHT_BROWSER_INSTALL ?? "").trim().toLowerCase();
|
|
78
|
+
return value === "1" || value === "true" || value === "yes";
|
|
79
|
+
}
|
package/spec/README.md
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
# Athlete SPEC
|
|
2
|
+
|
|
3
|
+
`spec/` 是 Athlete 当前唯一的规范与维护文档源。
|
|
4
|
+
|
|
5
|
+
这里描述的是:
|
|
6
|
+
|
|
7
|
+
- 项目现在已经做到什么
|
|
8
|
+
- 当前架构如何组织
|
|
9
|
+
- 关键规则和边界是什么
|
|
10
|
+
- 维护时应该改哪一层
|
|
11
|
+
|
|
12
|
+
这里不负责:
|
|
13
|
+
|
|
14
|
+
- 历史演进叙事
|
|
15
|
+
- 营销式介绍
|
|
16
|
+
- 运行产物归档
|
|
17
|
+
|
|
18
|
+
## 单一真相源规则
|
|
19
|
+
|
|
20
|
+
从现在开始:
|
|
21
|
+
|
|
22
|
+
- 规范、原则、模块边界、维护说明统一写在 `spec/`
|
|
23
|
+
- 根目录 `README.md` 只保留用户入口和高层说明
|
|
24
|
+
- 根目录 `validation/` 只保留验证产物,不再承担规范文档职责
|
|
25
|
+
|
|
26
|
+
## 阅读顺序
|
|
27
|
+
|
|
28
|
+
1. `principles/README.md`
|
|
29
|
+
2. `overview/产品定义.md`
|
|
30
|
+
3. `overview/v0范围.md`
|
|
31
|
+
4. `architecture/总体架构.md`
|
|
32
|
+
5. `architecture/状态与真相源.md`
|
|
33
|
+
6. `architecture/运行时循环.md`
|
|
34
|
+
7. `modules/`
|
|
35
|
+
8. `interfaces/`
|
|
36
|
+
9. `implementation/`
|
|
37
|
+
10. `testing/`
|
|
38
|
+
11. `adr/`
|
|
39
|
+
|
|
40
|
+
## 目录说明
|
|
41
|
+
|
|
42
|
+
- `principles/`: 架构宪法与工程铁律
|
|
43
|
+
- `overview/`: 产品定义、范围、边界
|
|
44
|
+
- `architecture/`: 总体架构、真相源、主循环
|
|
45
|
+
- `modules/`: 模块职责与约束
|
|
46
|
+
- `interfaces/`: 核心接口契约
|
|
47
|
+
- `repo/`: 仓库级规则与流程
|
|
48
|
+
- `implementation/`: 当前目录与代码映射
|
|
49
|
+
- `testing/`: 测试策略与 fail-first 列表
|
|
50
|
+
- `adr/`: 关键架构决策记录
|
|
51
|
+
|
|
52
|
+
## 文档要求
|
|
53
|
+
|
|
54
|
+
1. 只写现状,不写过时历史说明。
|
|
55
|
+
2. 如果文档与 `src/` 当前实现冲突,以当前实现为准,并及时改文档。
|
|
56
|
+
3. 同类说明只保留一份,不并行维护 `docs/` 和 `spec/` 两套说法。
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
# ADR-0001:默认 Agent 模式优先,保留 Read-Only 辅助模式
|
|
2
|
+
|
|
3
|
+
## 背景
|
|
4
|
+
|
|
5
|
+
Athlete 起家的核心能力是“在终端里持续把任务做完”,而不是只做分析。
|
|
6
|
+
|
|
7
|
+
## 决策
|
|
8
|
+
|
|
9
|
+
1. 默认心智模型以 `agent` 模式为主。
|
|
10
|
+
2. `read-only` 保留,用于分析、审阅、低风险探索。
|
|
11
|
+
3. 核心规格和扩展方向优先围绕 `agent` 模式设计。
|
|
12
|
+
|
|
13
|
+
## 后果
|
|
14
|
+
|
|
15
|
+
- Athlete 保持“能干活”的产品性格
|
|
16
|
+
- 同时仍保留安全一些的分析入口
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# ADR-0002:强主 Agent 起步,预留多 Agent 边界
|
|
2
|
+
|
|
3
|
+
## 背景
|
|
4
|
+
|
|
5
|
+
Athlete 当前最强的价值来自耐跑主 Agent。
|
|
6
|
+
|
|
7
|
+
同时,复杂任务又确实需要 subagent、teammate、background、worktree。
|
|
8
|
+
|
|
9
|
+
## 决策
|
|
10
|
+
|
|
11
|
+
1. 主 Agent 仍是系统核心。
|
|
12
|
+
2. 多 Agent 是按需能力,不是默认军团模式。
|
|
13
|
+
3. 下一阶段优先补“总指挥层”,不是先做大规模 swarm。
|
|
14
|
+
|
|
15
|
+
## 后果
|
|
16
|
+
|
|
17
|
+
- 能保住当前耐跑底盘
|
|
18
|
+
- 以后还能继续扩到多 Agent
|
|
19
|
+
- 不会过早进入复杂协作失控状态
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
# ADR-0003:OpenAI-Compatible 优先
|
|
2
|
+
|
|
3
|
+
## 背景
|
|
4
|
+
|
|
5
|
+
Athlete 要做 harness,而不是绑死在某一家 provider 上。
|
|
6
|
+
|
|
7
|
+
## 决策
|
|
8
|
+
|
|
9
|
+
1. 当前 provider 接口优先兼容 OpenAI-compatible。
|
|
10
|
+
2. provider 选择属于配置问题,不属于业务设计问题。
|
|
11
|
+
3. 上层 runtime、tools、orchestrator 不依赖某一家的专属行为。
|
|
12
|
+
|
|
13
|
+
## 后果
|
|
14
|
+
|
|
15
|
+
- Athlete 更容易切换模型与服务商
|
|
16
|
+
- 后续扩展更稳定
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
# 总体架构
|
|
2
|
+
|
|
3
|
+
## 一句话
|
|
4
|
+
|
|
5
|
+
Athlete 是一个终端里的智能体运行系统:
|
|
6
|
+
|
|
7
|
+
- 一个主循环驱动模型与工具
|
|
8
|
+
- 一组落盘状态构成控制面
|
|
9
|
+
- 一组工具与 worker 构成执行面
|
|
10
|
+
- 一层 orchestrator 负责 lead 的任务组织与派工
|
|
11
|
+
|
|
12
|
+
## 当前主要分层
|
|
13
|
+
|
|
14
|
+
### 1. Runtime Kernel
|
|
15
|
+
|
|
16
|
+
目录:`src/agent/`
|
|
17
|
+
|
|
18
|
+
负责:
|
|
19
|
+
|
|
20
|
+
- turn loop
|
|
21
|
+
- system prompt 组装
|
|
22
|
+
- continuation / compact / recovery
|
|
23
|
+
- todo / verification / runtime state
|
|
24
|
+
- 最终收口
|
|
25
|
+
- 轻量验证信号与 auto-readback
|
|
26
|
+
|
|
27
|
+
### 2. Tool Plane
|
|
28
|
+
|
|
29
|
+
目录:`src/tools/` `src/mcp/`
|
|
30
|
+
|
|
31
|
+
负责:
|
|
32
|
+
|
|
33
|
+
- 向模型暴露动作
|
|
34
|
+
- 参数解析
|
|
35
|
+
- 机器约束检查
|
|
36
|
+
- 调用底层能力
|
|
37
|
+
|
|
38
|
+
### 3. Skill Plane
|
|
39
|
+
|
|
40
|
+
目录:`src/skills/`
|
|
41
|
+
|
|
42
|
+
负责:
|
|
43
|
+
|
|
44
|
+
- skill schema
|
|
45
|
+
- discovery
|
|
46
|
+
- matching
|
|
47
|
+
- loading
|
|
48
|
+
- workflow gating
|
|
49
|
+
|
|
50
|
+
### 4. Control Plane
|
|
51
|
+
|
|
52
|
+
目录:`src/tasks/` `src/team/` `src/background/` `src/worktrees/`
|
|
53
|
+
|
|
54
|
+
负责:
|
|
55
|
+
|
|
56
|
+
- 任务真相源
|
|
57
|
+
- 协议真相源
|
|
58
|
+
- 队友状态
|
|
59
|
+
- 后台作业状态
|
|
60
|
+
- worktree 状态
|
|
61
|
+
|
|
62
|
+
### 5. Execution Plane
|
|
63
|
+
|
|
64
|
+
负责真正干活:
|
|
65
|
+
|
|
66
|
+
- 文件读写
|
|
67
|
+
- shell 命令
|
|
68
|
+
- 背景任务
|
|
69
|
+
- teammate worker
|
|
70
|
+
- worktree 目录
|
|
71
|
+
- MCP 浏览器
|
|
72
|
+
|
|
73
|
+
### 6. Orchestrator Layer
|
|
74
|
+
|
|
75
|
+
目录:`src/orchestrator/`
|
|
76
|
+
|
|
77
|
+
负责:
|
|
78
|
+
|
|
79
|
+
- 复杂度判断
|
|
80
|
+
- 最小任务图落盘
|
|
81
|
+
- self / subagent / teammate / background 路由
|
|
82
|
+
- lead slice 开始前的任务组织
|
|
83
|
+
|
|
84
|
+
## 当前最重要的架构边界
|
|
85
|
+
|
|
86
|
+
### 控制面
|
|
87
|
+
|
|
88
|
+
回答:
|
|
89
|
+
|
|
90
|
+
- 现在有哪些任务
|
|
91
|
+
- 谁该做、谁在做
|
|
92
|
+
- 哪些正式协作在 pending
|
|
93
|
+
- 哪些后台任务在跑
|
|
94
|
+
- 哪些 worktree 仍然有效
|
|
95
|
+
|
|
96
|
+
### 执行面
|
|
97
|
+
|
|
98
|
+
回答:
|
|
99
|
+
|
|
100
|
+
- 文件怎么改
|
|
101
|
+
- 命令怎么跑
|
|
102
|
+
- 浏览器怎么导航
|
|
103
|
+
- 某个 worker 具体在执行什么
|
|
104
|
+
|
|
105
|
+
### 关键规则
|
|
106
|
+
|
|
107
|
+
1. 控制面不直接改文件。
|
|
108
|
+
2. 执行面不发明控制面真相。
|
|
109
|
+
3. orchestrator 负责调度,不负责具体文件改写。
|
|
110
|
+
4. tools 提供动作,skills 提供 workflow,二者不互相替代。
|
|
111
|
+
5. 主循环只做调度;closeout、verification signal、workflow gating 这类长期规则要下沉到独立模块。
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
# 状态与真相源
|
|
2
|
+
|
|
3
|
+
## 目标
|
|
4
|
+
|
|
5
|
+
Athlete 要跑长任务、协作任务和恢复任务,关键状态不能只放在 prompt 里。
|
|
6
|
+
|
|
7
|
+
必须有落盘真相源。
|
|
8
|
+
|
|
9
|
+
## 当前真相源
|
|
10
|
+
|
|
11
|
+
### TaskStore
|
|
12
|
+
|
|
13
|
+
回答:
|
|
14
|
+
|
|
15
|
+
- 有哪些任务
|
|
16
|
+
- 哪些任务被阻塞
|
|
17
|
+
- 谁被指派
|
|
18
|
+
- 谁正在做
|
|
19
|
+
- 任务绑定了哪个 worktree
|
|
20
|
+
|
|
21
|
+
状态目录:`.athlete/tasks/`
|
|
22
|
+
|
|
23
|
+
### TeamStore
|
|
24
|
+
|
|
25
|
+
回答:
|
|
26
|
+
|
|
27
|
+
- 现在有哪些 teammate
|
|
28
|
+
- 各自角色和状态是什么
|
|
29
|
+
|
|
30
|
+
状态文件:`.athlete/team/config.json`
|
|
31
|
+
|
|
32
|
+
### ProtocolRequestStore
|
|
33
|
+
|
|
34
|
+
回答:
|
|
35
|
+
|
|
36
|
+
- 哪些正式协作在 pending
|
|
37
|
+
- 哪些已经 approved / rejected
|
|
38
|
+
|
|
39
|
+
状态目录:`.athlete/team/requests/`
|
|
40
|
+
|
|
41
|
+
### CoordinationPolicyStore
|
|
42
|
+
|
|
43
|
+
回答:
|
|
44
|
+
|
|
45
|
+
- 现在允不允许做 plan decision
|
|
46
|
+
- 现在允不允许运行 shutdown request
|
|
47
|
+
|
|
48
|
+
状态文件:`.athlete/team/policy.json`
|
|
49
|
+
|
|
50
|
+
### BackgroundJobStore
|
|
51
|
+
|
|
52
|
+
回答:
|
|
53
|
+
|
|
54
|
+
- 哪些后台命令在跑
|
|
55
|
+
- 谁发起的
|
|
56
|
+
- 是否完成、失败、超时
|
|
57
|
+
|
|
58
|
+
### WorktreeStore
|
|
59
|
+
|
|
60
|
+
回答:
|
|
61
|
+
|
|
62
|
+
- 哪些 worktree 存在
|
|
63
|
+
- 绑定了哪个任务
|
|
64
|
+
- 是否 active / kept / removed
|
|
65
|
+
|
|
66
|
+
状态文件:
|
|
67
|
+
|
|
68
|
+
- `.athlete/worktrees/index.json`
|
|
69
|
+
- `.athlete/worktrees/events.jsonl`
|
|
70
|
+
|
|
71
|
+
### MessageBus
|
|
72
|
+
|
|
73
|
+
负责:
|
|
74
|
+
|
|
75
|
+
- inbox 投递
|
|
76
|
+
- 消息审计
|
|
77
|
+
|
|
78
|
+
相关文件:
|
|
79
|
+
|
|
80
|
+
- `.athlete/team/inbox/*.jsonl`
|
|
81
|
+
- `.athlete/team/messages.jsonl`
|
|
82
|
+
|
|
83
|
+
它不是最终业务真相源,但它是协作事件流和审计层。
|
|
84
|
+
|
|
85
|
+
## 普通消息与正式协议的边界
|
|
86
|
+
|
|
87
|
+
### 普通消息
|
|
88
|
+
|
|
89
|
+
用于:
|
|
90
|
+
|
|
91
|
+
- 通知
|
|
92
|
+
- 提醒
|
|
93
|
+
- 状态更新
|
|
94
|
+
|
|
95
|
+
### 正式协议
|
|
96
|
+
|
|
97
|
+
用于:
|
|
98
|
+
|
|
99
|
+
- 会改变协作状态的沟通
|
|
100
|
+
|
|
101
|
+
当前协议类型:
|
|
102
|
+
|
|
103
|
+
- `plan_approval`
|
|
104
|
+
- `shutdown`
|
|
105
|
+
|
|
106
|
+
正式协议必须:
|
|
107
|
+
|
|
108
|
+
- 有 `request_id`
|
|
109
|
+
- 有 request / response 对应关系
|
|
110
|
+
- 有持久化状态
|
|
111
|
+
|
|
112
|
+
## 当前规则
|
|
113
|
+
|
|
114
|
+
1. 新增状态前,先问是不是已有真相源应扩字段。
|
|
115
|
+
2. 能复用现有真相源,就不要新造平行 JSON 文件。
|
|
116
|
+
3. 任何需要跨 turn、跨 agent 保持一致的信息,都不能只存在 system prompt 里。
|
|
117
|
+
4. 普通消息不能代替正式审批。
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
# 运行时循环
|
|
2
|
+
|
|
3
|
+
## 当前 loop 在做什么
|
|
4
|
+
|
|
5
|
+
当前主循环负责 5 件事:
|
|
6
|
+
|
|
7
|
+
1. 组装 system prompt
|
|
8
|
+
2. 注入运行时状态
|
|
9
|
+
3. 调模型
|
|
10
|
+
4. 执行工具
|
|
11
|
+
5. 判断继续、yield、暂停、结束
|
|
12
|
+
|
|
13
|
+
当前 lead 路径接法:
|
|
14
|
+
|
|
15
|
+
- `runManagedAgentTurn`
|
|
16
|
+
- `prepareLeadTurn`
|
|
17
|
+
- `runAgentTurn`
|
|
18
|
+
|
|
19
|
+
也就是说:
|
|
20
|
+
|
|
21
|
+
- orchestrator 在 lead slice 开始前先做任务组织与派工
|
|
22
|
+
- `runTurn` 继续专注模型请求、工具执行、continuation、verification、compact
|
|
23
|
+
- teammate / subagent loop 不走 lead orchestrator
|
|
24
|
+
|
|
25
|
+
## 当前最重要的机器规则
|
|
26
|
+
|
|
27
|
+
### 计划规则
|
|
28
|
+
|
|
29
|
+
变更型动作默认要求先 `todo_write`。
|
|
30
|
+
|
|
31
|
+
### inbox 规则
|
|
32
|
+
|
|
33
|
+
lead 和 teammate 的 inbox 在 turn 开头统一注入。
|
|
34
|
+
|
|
35
|
+
### verification 规则
|
|
36
|
+
|
|
37
|
+
发生文件改动或 mutating shell 后,会进入 verification 状态机。
|
|
38
|
+
|
|
39
|
+
verification 不是无限提醒:
|
|
40
|
+
|
|
41
|
+
- `pendingPaths` 会随 session 持久化,continuation 后仍然有效
|
|
42
|
+
- 显式 build / test / verify 命令会记录为正式 verification attempt
|
|
43
|
+
- 对轻量交付物(如 `validation/*.md`、`.txt`)的定向 `read_file` 检查,也会被记录为一次通过的轻量验证
|
|
44
|
+
- 如果任务已经结束、输出文件已经存在且属于轻量交付物,finalize 会先尝试 auto-readback,再决定是否 pause 给用户
|
|
45
|
+
|
|
46
|
+
### 收口规则
|
|
47
|
+
|
|
48
|
+
当主目标已经满足时,runtime 会优先结束,而不是继续补做 task / todo / verification 文书动作。
|
|
49
|
+
|
|
50
|
+
- 收口判断不只看模型文本,还看 `changedPaths`、`verificationState`、todo 完成度与本轮是否已有实质工具活动
|
|
51
|
+
- 一旦进入“应该收口”的区间,`task_list` / `task_get` / `task_update` 会在工具集里被隐藏
|
|
52
|
+
- 当 todo 已全部完成时,`todo_write` 也会在收口阶段从工具集中移除,避免重复 closeout
|
|
53
|
+
- 旧 todo 过时但真实工作已完成时,不再把 stale todo 当成 finalize 的硬阻塞
|
|
54
|
+
|
|
55
|
+
### continuation 规则
|
|
56
|
+
|
|
57
|
+
工具步数过多时,不中断任务,而是自动续跑。
|
|
58
|
+
|
|
59
|
+
### compact 规则
|
|
60
|
+
|
|
61
|
+
上下文过长时,自动压缩请求上下文,不直接放弃任务。
|
|
62
|
+
|
|
63
|
+
### 浏览器 workflow 规则
|
|
64
|
+
|
|
65
|
+
在相关 skill 已加载且浏览器工具可用时:
|
|
66
|
+
|
|
67
|
+
- 自然语言网页任务优先走 Playwright MCP 工具
|
|
68
|
+
- shell 网页抓取只能作为 fallback
|
|
69
|
+
- 在导航和 snapshot 之前,shell detour 会被 workflow guard 拦住
|
|
70
|
+
|
|
71
|
+
### 交互等待反馈
|
|
72
|
+
|
|
73
|
+
交互模式下,用户发出输入后、模型真正开始输出前,会显示短暂 spinner。
|
|
74
|
+
|
|
75
|
+
它属于 UI 层,不参与 agent 状态机本身。
|
|
76
|
+
|
|
77
|
+
## 设计要求
|
|
78
|
+
|
|
79
|
+
1. loop 只保留全局调度规则。
|
|
80
|
+
2. 具体模块细节下沉到各自目录。
|
|
81
|
+
3. 新增长期能力时,优先接到 runtime state、tool priority 或 workflow guard,而不是直接堆 prompt。
|
|
82
|
+
4. “应该结束”的判断必须落在机器层,不能只靠 prompt 提醒模型自觉收口。
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
# 模块级开发任务单
|
|
2
|
+
|
|
3
|
+
## Phase 1:保底
|
|
4
|
+
|
|
5
|
+
### 目标
|
|
6
|
+
|
|
7
|
+
在不破坏当前耐跑能力的前提下继续演进。
|
|
8
|
+
|
|
9
|
+
### 任务
|
|
10
|
+
|
|
11
|
+
1. 补强 continuation / compact / recovery 相关测试
|
|
12
|
+
2. 把主循环继续瘦身,避免后续总指挥逻辑直接堆进去
|
|
13
|
+
3. 明确当前 control plane 字段与职责
|
|
14
|
+
|
|
15
|
+
## Phase 2:总指挥层
|
|
16
|
+
|
|
17
|
+
### 目标
|
|
18
|
+
|
|
19
|
+
让主 Agent 更会决定“什么时候该用哪一招”。
|
|
20
|
+
|
|
21
|
+
### 任务
|
|
22
|
+
|
|
23
|
+
1. 增加 orchestrator 目录与基础类型
|
|
24
|
+
2. 定义任务拆分、派工、等待、收结果的最小流程
|
|
25
|
+
3. 支持在 lead 层统一选择:
|
|
26
|
+
- 自己做
|
|
27
|
+
- 派 subagent
|
|
28
|
+
- 派 teammate
|
|
29
|
+
- 丢 background
|
|
30
|
+
4. 增加 reviewer / verifier / planner 的边界设计
|
|
31
|
+
|
|
32
|
+
## Phase 3:skills 标准化
|
|
33
|
+
|
|
34
|
+
### 目标
|
|
35
|
+
|
|
36
|
+
让 skills 成为稳定扩展口,而不是散装提示词。
|
|
37
|
+
|
|
38
|
+
### 任务
|
|
39
|
+
|
|
40
|
+
1. 定义 skill metadata 规范
|
|
41
|
+
2. 定义 skill 的触发方式与加载方式
|
|
42
|
+
3. 定义 skill 与角色、工具、任务的关系
|
|
43
|
+
4. 补技能加载、缺技能、错技能的测试
|
|
44
|
+
|
|
45
|
+
## Phase 4:再往外扩
|
|
46
|
+
|
|
47
|
+
### 目标
|
|
48
|
+
|
|
49
|
+
从 coding harness 扩到更广的复杂任务。
|
|
50
|
+
|
|
51
|
+
### 任务
|
|
52
|
+
|
|
53
|
+
1. 文档与表格类增强
|
|
54
|
+
2. 浏览器 / 外部系统类能力
|
|
55
|
+
3. 项目内经验沉淀
|