onebot-agent 0.1.0__tar.gz
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.
- onebot_agent-0.1.0/.github/workflows/ci.yml +28 -0
- onebot_agent-0.1.0/.github/workflows/publish.yml +42 -0
- onebot_agent-0.1.0/.gitignore +21 -0
- onebot_agent-0.1.0/.python-version +1 -0
- onebot_agent-0.1.0/LICENSE +21 -0
- onebot_agent-0.1.0/PKG-INFO +217 -0
- onebot_agent-0.1.0/README.md +199 -0
- onebot_agent-0.1.0/plan.md +170 -0
- onebot_agent-0.1.0/pyproject.toml +48 -0
- onebot_agent-0.1.0/src/onebot/__init__.py +8 -0
- onebot_agent-0.1.0/src/onebot/api/__init__.py +2 -0
- onebot_agent-0.1.0/src/onebot/api/app.py +137 -0
- onebot_agent-0.1.0/src/onebot/backends/__init__.py +4 -0
- onebot_agent-0.1.0/src/onebot/backends/acp.py +137 -0
- onebot_agent-0.1.0/src/onebot/clawhub.py +44 -0
- onebot_agent-0.1.0/src/onebot/cli.py +172 -0
- onebot_agent-0.1.0/src/onebot/gateway.py +54 -0
- onebot_agent-0.1.0/src/onebot/safety.py +91 -0
- onebot_agent-0.1.0/src/onebot/settings.py +56 -0
- onebot_agent-0.1.0/src/onebot/skills/__init__.py +5 -0
- onebot_agent-0.1.0/src/onebot/skills/frontmatter.py +94 -0
- onebot_agent-0.1.0/src/onebot/skills/models.py +20 -0
- onebot_agent-0.1.0/src/onebot/skills/registry.py +158 -0
- onebot_agent-0.1.0/src/onebot/transports/__init__.py +2 -0
- onebot_agent-0.1.0/src/onebot/transports/telegram.py +77 -0
- onebot_agent-0.1.0/src/onebot/workspace.py +28 -0
- onebot_agent-0.1.0/tests/test_frontmatter.py +22 -0
- onebot_agent-0.1.0/tests/test_registry.py +19 -0
- onebot_agent-0.1.0/tests/test_safety.py +24 -0
- onebot_agent-0.1.0/uv.lock +942 -0
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
name: CI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: ["**"]
|
|
6
|
+
pull_request:
|
|
7
|
+
|
|
8
|
+
jobs:
|
|
9
|
+
lint-and-test:
|
|
10
|
+
runs-on: ubuntu-latest
|
|
11
|
+
steps:
|
|
12
|
+
- name: Checkout
|
|
13
|
+
uses: actions/checkout@v4
|
|
14
|
+
|
|
15
|
+
- name: Setup uv
|
|
16
|
+
uses: astral-sh/setup-uv@v5
|
|
17
|
+
with:
|
|
18
|
+
python-version: "3.11"
|
|
19
|
+
|
|
20
|
+
- name: Sync dependencies
|
|
21
|
+
run: uv sync --dev
|
|
22
|
+
|
|
23
|
+
- name: Lint
|
|
24
|
+
run: uv run ruff check .
|
|
25
|
+
|
|
26
|
+
- name: Test
|
|
27
|
+
run: uv run pytest -q
|
|
28
|
+
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
name: Publish (PyPI)
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
release:
|
|
5
|
+
types: [published]
|
|
6
|
+
|
|
7
|
+
jobs:
|
|
8
|
+
verify:
|
|
9
|
+
runs-on: ubuntu-latest
|
|
10
|
+
steps:
|
|
11
|
+
- uses: actions/checkout@v4
|
|
12
|
+
|
|
13
|
+
- uses: astral-sh/setup-uv@v5
|
|
14
|
+
with:
|
|
15
|
+
python-version: "3.11"
|
|
16
|
+
|
|
17
|
+
- run: uv sync --dev
|
|
18
|
+
- run: uv run ruff check .
|
|
19
|
+
- run: uv run pytest -q
|
|
20
|
+
|
|
21
|
+
publish:
|
|
22
|
+
needs: verify
|
|
23
|
+
runs-on: ubuntu-latest
|
|
24
|
+
environment: pypi
|
|
25
|
+
permissions:
|
|
26
|
+
id-token: write
|
|
27
|
+
contents: read
|
|
28
|
+
steps:
|
|
29
|
+
- uses: actions/checkout@v4
|
|
30
|
+
|
|
31
|
+
- uses: astral-sh/setup-uv@v5
|
|
32
|
+
with:
|
|
33
|
+
python-version: "3.11"
|
|
34
|
+
|
|
35
|
+
- name: Build
|
|
36
|
+
run: uv build
|
|
37
|
+
|
|
38
|
+
- name: Publish
|
|
39
|
+
uses: pypa/gh-action-pypi-publish@release/v1
|
|
40
|
+
with:
|
|
41
|
+
packages-dir: dist
|
|
42
|
+
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# Python
|
|
2
|
+
__pycache__/
|
|
3
|
+
*.py[cod]
|
|
4
|
+
*.pyo
|
|
5
|
+
*.pyd
|
|
6
|
+
*.so
|
|
7
|
+
.pytest_cache/
|
|
8
|
+
.mypy_cache/
|
|
9
|
+
.ruff_cache/
|
|
10
|
+
.coverage
|
|
11
|
+
htmlcov/
|
|
12
|
+
|
|
13
|
+
# Virtualenv / uv
|
|
14
|
+
.venv/
|
|
15
|
+
!.python-version
|
|
16
|
+
!uv.lock
|
|
17
|
+
|
|
18
|
+
# OS / editor
|
|
19
|
+
.DS_Store
|
|
20
|
+
.idea/
|
|
21
|
+
.vscode/
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
3.11
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 onebot contributors
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: onebot-agent
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: Minimal single-agent gateway with ACP backends, skills, and messaging adapters
|
|
5
|
+
Author: onebot contributors
|
|
6
|
+
License: MIT
|
|
7
|
+
License-File: LICENSE
|
|
8
|
+
Requires-Python: >=3.11
|
|
9
|
+
Requires-Dist: claude-code-acp>=0.4.4
|
|
10
|
+
Requires-Dist: fastapi>=0.128.8
|
|
11
|
+
Requires-Dist: httpx>=0.28.1
|
|
12
|
+
Requires-Dist: pydantic-settings>=2.12.0
|
|
13
|
+
Requires-Dist: python-telegram-bot>=21
|
|
14
|
+
Requires-Dist: rich>=14.3.2
|
|
15
|
+
Requires-Dist: typer>=0.23.0
|
|
16
|
+
Requires-Dist: uvicorn>=0.40.0
|
|
17
|
+
Description-Content-Type: text/markdown
|
|
18
|
+
|
|
19
|
+
# onebot
|
|
20
|
+
|
|
21
|
+
`onebot` 是一個以 Python + uv 打造的精簡 single-agent 框架,支援:
|
|
22
|
+
|
|
23
|
+
- CLI 與 Web(FastAPI + Uvicorn)
|
|
24
|
+
- Telegram / LINE 作為訊息 I/O
|
|
25
|
+
- Skills(相容 OpenClaw / SKILLS 的 `SKILL.md` 規範)
|
|
26
|
+
- ClawHub skill 搜尋 / 安裝(透過官方 `clawhub` CLI)
|
|
27
|
+
- ACP backend 切換:`gemini --acp`、`copilot --acp`、`claude-code-acp`
|
|
28
|
+
- MCP servers(透過 ACP backend 傳入)
|
|
29
|
+
|
|
30
|
+
> PyPI distribution 名稱:`onebot-agent`(CLI 指令:`onebot`)
|
|
31
|
+
|
|
32
|
+
---
|
|
33
|
+
|
|
34
|
+
## 1) 需求
|
|
35
|
+
|
|
36
|
+
- Python 3.11+
|
|
37
|
+
- [uv](https://github.com/astral-sh/uv)
|
|
38
|
+
|
|
39
|
+
依你選的 backend,還需要:
|
|
40
|
+
|
|
41
|
+
- Claude:`claude-code-acp`(由 Python 套件安裝),以及 Claude CLI 已完成登入
|
|
42
|
+
- Gemini:`gemini` CLI(ACP 模式)
|
|
43
|
+
- Copilot:`copilot` CLI(ACP 模式)
|
|
44
|
+
|
|
45
|
+
若要使用 ClawHub skills:
|
|
46
|
+
|
|
47
|
+
- `clawhub` CLI(例如:`npm i -g clawhub`)
|
|
48
|
+
|
|
49
|
+
---
|
|
50
|
+
|
|
51
|
+
## 2) 安裝與開發
|
|
52
|
+
|
|
53
|
+
```bash
|
|
54
|
+
# 進入專案
|
|
55
|
+
cd onebot
|
|
56
|
+
|
|
57
|
+
# 安裝(含 dev)
|
|
58
|
+
uv sync --dev
|
|
59
|
+
|
|
60
|
+
# 看指令
|
|
61
|
+
uv run onebot --help
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
---
|
|
65
|
+
|
|
66
|
+
## 3) 快速開始
|
|
67
|
+
|
|
68
|
+
### 3.1 本地單次對話(ACP backend)
|
|
69
|
+
|
|
70
|
+
```bash
|
|
71
|
+
export ONEBOT_ACP_BACKEND=claude
|
|
72
|
+
uv run onebot chat "請幫我建立一個 hello.py"
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
切換 backend:
|
|
76
|
+
|
|
77
|
+
```bash
|
|
78
|
+
# Gemini
|
|
79
|
+
export ONEBOT_ACP_BACKEND=gemini
|
|
80
|
+
export ONEBOT_ACP_COMMAND=gemini
|
|
81
|
+
export ONEBOT_ACP_ARGS="--experimental-acp"
|
|
82
|
+
|
|
83
|
+
# Copilot
|
|
84
|
+
export ONEBOT_ACP_BACKEND=copilot
|
|
85
|
+
export ONEBOT_ACP_COMMAND=copilot
|
|
86
|
+
export ONEBOT_ACP_ARGS="--acp"
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
### 3.2 啟動 Web API
|
|
90
|
+
|
|
91
|
+
```bash
|
|
92
|
+
uv run onebot web --host 127.0.0.1 --port 18790
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
可用端點:
|
|
96
|
+
|
|
97
|
+
- `GET /health`
|
|
98
|
+
- `GET /skills`
|
|
99
|
+
- `GET /adapters`
|
|
100
|
+
- `GET /config`
|
|
101
|
+
- `POST /line/webhook`
|
|
102
|
+
|
|
103
|
+
### 3.3 啟動 Telegram polling
|
|
104
|
+
|
|
105
|
+
```bash
|
|
106
|
+
export ONEBOT_TELEGRAM_TOKEN=<your-bot-token>
|
|
107
|
+
uv run onebot telegram
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
### 3.4 LINE webhook
|
|
111
|
+
|
|
112
|
+
1. 設定:
|
|
113
|
+
|
|
114
|
+
```bash
|
|
115
|
+
export ONEBOT_LINE_CHANNEL_SECRET=<secret>
|
|
116
|
+
export ONEBOT_LINE_CHANNEL_ACCESS_TOKEN=<token>
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
2. 啟動 Web:
|
|
120
|
+
|
|
121
|
+
```bash
|
|
122
|
+
uv run onebot web --host 0.0.0.0 --port 18790
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
3. 在 LINE Developers 把 webhook URL 設為:
|
|
126
|
+
|
|
127
|
+
```text
|
|
128
|
+
https://<your-domain>/line/webhook
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
---
|
|
132
|
+
|
|
133
|
+
## 4) Skills / ClawHub
|
|
134
|
+
|
|
135
|
+
列本地 skills:
|
|
136
|
+
|
|
137
|
+
```bash
|
|
138
|
+
uv run onebot skill list
|
|
139
|
+
uv run onebot skill list --all
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
搜尋 / 安裝 / 更新(透過 clawhub CLI):
|
|
143
|
+
|
|
144
|
+
```bash
|
|
145
|
+
uv run onebot skill search "postgres backups"
|
|
146
|
+
uv run onebot skill install my-skill
|
|
147
|
+
uv run onebot skill update my-skill
|
|
148
|
+
uv run onebot skill update --all
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
進階 passthrough:
|
|
152
|
+
|
|
153
|
+
```bash
|
|
154
|
+
uv run onebot skill clawhub list
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
---
|
|
158
|
+
|
|
159
|
+
## 5) MCP 設定
|
|
160
|
+
|
|
161
|
+
透過 `ONEBOT_MCP_SERVERS` 以 JSON 陣列提供(會傳入 ACP backend):
|
|
162
|
+
|
|
163
|
+
```bash
|
|
164
|
+
export ONEBOT_MCP_SERVERS='[
|
|
165
|
+
{
|
|
166
|
+
"name": "my-mcp",
|
|
167
|
+
"command": "uvx",
|
|
168
|
+
"args": ["my-mcp-server"]
|
|
169
|
+
}
|
|
170
|
+
]'
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
> 注意:不同 backend 對 MCP 的支援程度不同(例如 Gemini 通常需要先在 CLI 內預先配置)。
|
|
174
|
+
|
|
175
|
+
---
|
|
176
|
+
|
|
177
|
+
## 6) 主要環境變數
|
|
178
|
+
|
|
179
|
+
- `ONEBOT_WORKSPACE`(預設 `~/.onebot`)
|
|
180
|
+
- `ONEBOT_ACP_BACKEND`:`claude|gemini|copilot`
|
|
181
|
+
- `ONEBOT_ACP_COMMAND`:覆寫 backend command
|
|
182
|
+
- `ONEBOT_ACP_ARGS`:覆寫 backend args(shell 字串)
|
|
183
|
+
- `ONEBOT_MCP_SERVERS`:MCP servers JSON 陣列
|
|
184
|
+
- `ONEBOT_TELEGRAM_TOKEN`
|
|
185
|
+
- `ONEBOT_LINE_CHANNEL_SECRET`
|
|
186
|
+
- `ONEBOT_LINE_CHANNEL_ACCESS_TOKEN`
|
|
187
|
+
|
|
188
|
+
---
|
|
189
|
+
|
|
190
|
+
## 7) 測試與品質
|
|
191
|
+
|
|
192
|
+
```bash
|
|
193
|
+
uv run ruff check .
|
|
194
|
+
uv run pytest -q
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
---
|
|
198
|
+
|
|
199
|
+
## 8) 發佈流程(GitHub Release -> PyPI)
|
|
200
|
+
|
|
201
|
+
本專案已提供:
|
|
202
|
+
|
|
203
|
+
- `.github/workflows/ci.yml`:push / PR 執行 lint + test
|
|
204
|
+
- `.github/workflows/publish.yml`:Release published 時 build + publish
|
|
205
|
+
|
|
206
|
+
建議使用 PyPI Trusted Publisher(OIDC):
|
|
207
|
+
|
|
208
|
+
1. 在 PyPI 專案設定 Trusted Publisher 指向本 GitHub repo/workflow
|
|
209
|
+
2. GitHub 建立 Release(Published)
|
|
210
|
+
3. workflow 自動 `uv build` 並上傳 `dist/*` 到 PyPI
|
|
211
|
+
|
|
212
|
+
---
|
|
213
|
+
|
|
214
|
+
## 9) 安全說明(目前)
|
|
215
|
+
|
|
216
|
+
- ACP 的檔案讀寫與終端執行有 workspace 限制與危險指令 deny patterns。
|
|
217
|
+
- 目前屬 MVP 安全層;高隔離場景建議後續加 Docker sandbox。
|
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
# onebot
|
|
2
|
+
|
|
3
|
+
`onebot` 是一個以 Python + uv 打造的精簡 single-agent 框架,支援:
|
|
4
|
+
|
|
5
|
+
- CLI 與 Web(FastAPI + Uvicorn)
|
|
6
|
+
- Telegram / LINE 作為訊息 I/O
|
|
7
|
+
- Skills(相容 OpenClaw / SKILLS 的 `SKILL.md` 規範)
|
|
8
|
+
- ClawHub skill 搜尋 / 安裝(透過官方 `clawhub` CLI)
|
|
9
|
+
- ACP backend 切換:`gemini --acp`、`copilot --acp`、`claude-code-acp`
|
|
10
|
+
- MCP servers(透過 ACP backend 傳入)
|
|
11
|
+
|
|
12
|
+
> PyPI distribution 名稱:`onebot-agent`(CLI 指令:`onebot`)
|
|
13
|
+
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
## 1) 需求
|
|
17
|
+
|
|
18
|
+
- Python 3.11+
|
|
19
|
+
- [uv](https://github.com/astral-sh/uv)
|
|
20
|
+
|
|
21
|
+
依你選的 backend,還需要:
|
|
22
|
+
|
|
23
|
+
- Claude:`claude-code-acp`(由 Python 套件安裝),以及 Claude CLI 已完成登入
|
|
24
|
+
- Gemini:`gemini` CLI(ACP 模式)
|
|
25
|
+
- Copilot:`copilot` CLI(ACP 模式)
|
|
26
|
+
|
|
27
|
+
若要使用 ClawHub skills:
|
|
28
|
+
|
|
29
|
+
- `clawhub` CLI(例如:`npm i -g clawhub`)
|
|
30
|
+
|
|
31
|
+
---
|
|
32
|
+
|
|
33
|
+
## 2) 安裝與開發
|
|
34
|
+
|
|
35
|
+
```bash
|
|
36
|
+
# 進入專案
|
|
37
|
+
cd onebot
|
|
38
|
+
|
|
39
|
+
# 安裝(含 dev)
|
|
40
|
+
uv sync --dev
|
|
41
|
+
|
|
42
|
+
# 看指令
|
|
43
|
+
uv run onebot --help
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
---
|
|
47
|
+
|
|
48
|
+
## 3) 快速開始
|
|
49
|
+
|
|
50
|
+
### 3.1 本地單次對話(ACP backend)
|
|
51
|
+
|
|
52
|
+
```bash
|
|
53
|
+
export ONEBOT_ACP_BACKEND=claude
|
|
54
|
+
uv run onebot chat "請幫我建立一個 hello.py"
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
切換 backend:
|
|
58
|
+
|
|
59
|
+
```bash
|
|
60
|
+
# Gemini
|
|
61
|
+
export ONEBOT_ACP_BACKEND=gemini
|
|
62
|
+
export ONEBOT_ACP_COMMAND=gemini
|
|
63
|
+
export ONEBOT_ACP_ARGS="--experimental-acp"
|
|
64
|
+
|
|
65
|
+
# Copilot
|
|
66
|
+
export ONEBOT_ACP_BACKEND=copilot
|
|
67
|
+
export ONEBOT_ACP_COMMAND=copilot
|
|
68
|
+
export ONEBOT_ACP_ARGS="--acp"
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
### 3.2 啟動 Web API
|
|
72
|
+
|
|
73
|
+
```bash
|
|
74
|
+
uv run onebot web --host 127.0.0.1 --port 18790
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
可用端點:
|
|
78
|
+
|
|
79
|
+
- `GET /health`
|
|
80
|
+
- `GET /skills`
|
|
81
|
+
- `GET /adapters`
|
|
82
|
+
- `GET /config`
|
|
83
|
+
- `POST /line/webhook`
|
|
84
|
+
|
|
85
|
+
### 3.3 啟動 Telegram polling
|
|
86
|
+
|
|
87
|
+
```bash
|
|
88
|
+
export ONEBOT_TELEGRAM_TOKEN=<your-bot-token>
|
|
89
|
+
uv run onebot telegram
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
### 3.4 LINE webhook
|
|
93
|
+
|
|
94
|
+
1. 設定:
|
|
95
|
+
|
|
96
|
+
```bash
|
|
97
|
+
export ONEBOT_LINE_CHANNEL_SECRET=<secret>
|
|
98
|
+
export ONEBOT_LINE_CHANNEL_ACCESS_TOKEN=<token>
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
2. 啟動 Web:
|
|
102
|
+
|
|
103
|
+
```bash
|
|
104
|
+
uv run onebot web --host 0.0.0.0 --port 18790
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
3. 在 LINE Developers 把 webhook URL 設為:
|
|
108
|
+
|
|
109
|
+
```text
|
|
110
|
+
https://<your-domain>/line/webhook
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
---
|
|
114
|
+
|
|
115
|
+
## 4) Skills / ClawHub
|
|
116
|
+
|
|
117
|
+
列本地 skills:
|
|
118
|
+
|
|
119
|
+
```bash
|
|
120
|
+
uv run onebot skill list
|
|
121
|
+
uv run onebot skill list --all
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
搜尋 / 安裝 / 更新(透過 clawhub CLI):
|
|
125
|
+
|
|
126
|
+
```bash
|
|
127
|
+
uv run onebot skill search "postgres backups"
|
|
128
|
+
uv run onebot skill install my-skill
|
|
129
|
+
uv run onebot skill update my-skill
|
|
130
|
+
uv run onebot skill update --all
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
進階 passthrough:
|
|
134
|
+
|
|
135
|
+
```bash
|
|
136
|
+
uv run onebot skill clawhub list
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
---
|
|
140
|
+
|
|
141
|
+
## 5) MCP 設定
|
|
142
|
+
|
|
143
|
+
透過 `ONEBOT_MCP_SERVERS` 以 JSON 陣列提供(會傳入 ACP backend):
|
|
144
|
+
|
|
145
|
+
```bash
|
|
146
|
+
export ONEBOT_MCP_SERVERS='[
|
|
147
|
+
{
|
|
148
|
+
"name": "my-mcp",
|
|
149
|
+
"command": "uvx",
|
|
150
|
+
"args": ["my-mcp-server"]
|
|
151
|
+
}
|
|
152
|
+
]'
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
> 注意:不同 backend 對 MCP 的支援程度不同(例如 Gemini 通常需要先在 CLI 內預先配置)。
|
|
156
|
+
|
|
157
|
+
---
|
|
158
|
+
|
|
159
|
+
## 6) 主要環境變數
|
|
160
|
+
|
|
161
|
+
- `ONEBOT_WORKSPACE`(預設 `~/.onebot`)
|
|
162
|
+
- `ONEBOT_ACP_BACKEND`:`claude|gemini|copilot`
|
|
163
|
+
- `ONEBOT_ACP_COMMAND`:覆寫 backend command
|
|
164
|
+
- `ONEBOT_ACP_ARGS`:覆寫 backend args(shell 字串)
|
|
165
|
+
- `ONEBOT_MCP_SERVERS`:MCP servers JSON 陣列
|
|
166
|
+
- `ONEBOT_TELEGRAM_TOKEN`
|
|
167
|
+
- `ONEBOT_LINE_CHANNEL_SECRET`
|
|
168
|
+
- `ONEBOT_LINE_CHANNEL_ACCESS_TOKEN`
|
|
169
|
+
|
|
170
|
+
---
|
|
171
|
+
|
|
172
|
+
## 7) 測試與品質
|
|
173
|
+
|
|
174
|
+
```bash
|
|
175
|
+
uv run ruff check .
|
|
176
|
+
uv run pytest -q
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
---
|
|
180
|
+
|
|
181
|
+
## 8) 發佈流程(GitHub Release -> PyPI)
|
|
182
|
+
|
|
183
|
+
本專案已提供:
|
|
184
|
+
|
|
185
|
+
- `.github/workflows/ci.yml`:push / PR 執行 lint + test
|
|
186
|
+
- `.github/workflows/publish.yml`:Release published 時 build + publish
|
|
187
|
+
|
|
188
|
+
建議使用 PyPI Trusted Publisher(OIDC):
|
|
189
|
+
|
|
190
|
+
1. 在 PyPI 專案設定 Trusted Publisher 指向本 GitHub repo/workflow
|
|
191
|
+
2. GitHub 建立 Release(Published)
|
|
192
|
+
3. workflow 自動 `uv build` 並上傳 `dist/*` 到 PyPI
|
|
193
|
+
|
|
194
|
+
---
|
|
195
|
+
|
|
196
|
+
## 9) 安全說明(目前)
|
|
197
|
+
|
|
198
|
+
- ACP 的檔案讀寫與終端執行有 workspace 限制與危險指令 deny patterns。
|
|
199
|
+
- 目前屬 MVP 安全層;高隔離場景建議後續加 Docker sandbox。
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
onebot 計劃(可正式發佈版)
|
|
2
|
+
|
|
3
|
+
本文件是「可一路做到正式發佈、可用、可維護」的完整工作計劃;接下來會依此逐步實作並以 commit 方式交付。
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## 0. 目標 / 範圍
|
|
8
|
+
|
|
9
|
+
### 目標
|
|
10
|
+
|
|
11
|
+
- 建立可發佈至 PyPI 的 Python 套件(distribution 名稱暫定:`onebot-agent`;import module:`onebot`)。
|
|
12
|
+
- 提供單一 agent(single-agent)架構:
|
|
13
|
+
- **CLI**(Typer):啟動、狀態、技能管理、ACP backend 設定。
|
|
14
|
+
- **Web**(FastAPI + Uvicorn):健康檢查、技能/adapter 列表、基本管理 API。
|
|
15
|
+
- 支援通訊通道作為 I/O:
|
|
16
|
+
- Telegram(MVP:polling;後續可加 webhook)
|
|
17
|
+
- LINE(M1:webhook)
|
|
18
|
+
- 支援兩種執行能力:
|
|
19
|
+
- **Skills**:相容 OpenClaw / SKILLS 規範(`skills/<name>/SKILL.md` YAML frontmatter)。
|
|
20
|
+
- **MCP**:可配置 MCP servers 並交由 ACP agent 使用(支援程度依 backend 而定)。
|
|
21
|
+
- 支援 **ACP 相容 agent backend**(可切換):
|
|
22
|
+
- `gemini --acp`(實際多為 `--experimental-acp`;以設定檔可覆寫)
|
|
23
|
+
- `copilot --acp`
|
|
24
|
+
- Python ClaudeAcpAgent:採用 `claude-code-acp`(https://github.com/yazelin/claude-code-acp-py)
|
|
25
|
+
- 依 GitHub Release 自動發佈至 PyPI(GitHub Actions)。
|
|
26
|
+
|
|
27
|
+
### 非目標(先不做)
|
|
28
|
+
|
|
29
|
+
- 多 agent / 多租戶(multi-tenant)路由。
|
|
30
|
+
- 內建大型前端 SPA(MVP 只提供 API,必要時加最小靜態頁)。
|
|
31
|
+
|
|
32
|
+
---
|
|
33
|
+
|
|
34
|
+
## 1. 技術選型
|
|
35
|
+
|
|
36
|
+
- Python:3.12(最低支援 3.11;依依賴調整)
|
|
37
|
+
- Web:FastAPI + Uvicorn
|
|
38
|
+
- CLI:Typer + Rich
|
|
39
|
+
- 設定:pydantic-settings(env + config 檔)
|
|
40
|
+
- 套件/環境管理:**uv(Astral uv)**
|
|
41
|
+
- 開發:`uv sync` / `uv run ...`
|
|
42
|
+
- 建置:`uv build`
|
|
43
|
+
- ACP:使用 `claude-code-acp` 的 `AcpClient`(避免自行實作 ACP 協議)
|
|
44
|
+
- Telegram:python-telegram-bot(async)
|
|
45
|
+
- LINE:line-bot-sdk(webhook)
|
|
46
|
+
|
|
47
|
+
---
|
|
48
|
+
|
|
49
|
+
## 2. 架構(最小可用、可擴充)
|
|
50
|
+
|
|
51
|
+
### 核心元件
|
|
52
|
+
|
|
53
|
+
- `Workspace`
|
|
54
|
+
- 管理 workspace 路徑、skills 安裝位置、暫存、設定檔。
|
|
55
|
+
- `SkillRegistry`
|
|
56
|
+
- 掃描/解析 skills(`SKILL.md` frontmatter)。
|
|
57
|
+
- 建立 skills summary(供 prompt 注入)。
|
|
58
|
+
- gating:requires.bins/env/os(缺少則標示 unavailable)。
|
|
59
|
+
- `AcpBackend`
|
|
60
|
+
- 包裝 `claude_code_acp.AcpClient`。
|
|
61
|
+
- 支援 backend profile:`claude|gemini|copilot`(command/args 可覆寫)。
|
|
62
|
+
- 提供:start session / prompt / stream text。
|
|
63
|
+
- 實作 hooks:permission / file read-write / terminal exec(安全限制)。
|
|
64
|
+
- `TransportAdapter`
|
|
65
|
+
- Telegram / LINE / CLI。
|
|
66
|
+
- 統一 `start()`、`stop()`、`send()`、`on_message(cb)`。
|
|
67
|
+
- `Gateway`
|
|
68
|
+
- inbound message -> (build prompt) -> acp backend -> outbound reply。
|
|
69
|
+
|
|
70
|
+
### Skills 與 ClawHub
|
|
71
|
+
|
|
72
|
+
- Skills 格式:遵循 OpenClaw 慣例:`skills/<name>/SKILL.md`(YAML frontmatter:name/description/metadata)。
|
|
73
|
+
- ClawHub 搜尋/安裝:
|
|
74
|
+
- **MVP:包裝 ClawHub 官方 CLI**(`clawhub search/install/update/list`)。
|
|
75
|
+
- 預設安裝路徑:`<workspace>/skills`(與 OpenClaw 的 workspace skills 相容)。
|
|
76
|
+
- 若未安裝 `clawhub`:回傳明確指引(npm/pnpm/bun 安裝)。
|
|
77
|
+
|
|
78
|
+
### Skills 執行隔離
|
|
79
|
+
|
|
80
|
+
- 預設:subprocess + per-skill virtualenv
|
|
81
|
+
- venv:**Python 標準 `venv` 模組**(每個 skill 一個 `.venv`)
|
|
82
|
+
- 安裝依賴:可用 `uv pip` 或 `pip`(依環境)
|
|
83
|
+
- 執行:`asyncio.create_subprocess_shell` / `create_subprocess_exec`
|
|
84
|
+
- 安全 guard:deny patterns(參考 nanobot ExecTool)+ 限制 cwd 於 workspace
|
|
85
|
+
- 選配(M2):Docker sandbox(高隔離)
|
|
86
|
+
|
|
87
|
+
### MCP 支援
|
|
88
|
+
|
|
89
|
+
- 以「backend 能力」為主:
|
|
90
|
+
- `claude-code-acp`:可動態帶入 MCP servers
|
|
91
|
+
- `gemini`:通常需先用 gemini CLI 設定 MCP,再以 allowlist 啟用(依 CLI 行為)
|
|
92
|
+
- onebot 先提供:
|
|
93
|
+
- config 中的 mcp server 定義
|
|
94
|
+
- 啟動 backend session 時傳入(若 backend 支援)
|
|
95
|
+
|
|
96
|
+
---
|
|
97
|
+
|
|
98
|
+
## 3. 設定(Config)
|
|
99
|
+
|
|
100
|
+
MVP 先做:env + 可選 `onebot.toml`。
|
|
101
|
+
|
|
102
|
+
必要設定(MVP):
|
|
103
|
+
|
|
104
|
+
- Workspace
|
|
105
|
+
- `ONEBOT_WORKSPACE`(預設:`~/.onebot`)
|
|
106
|
+
|
|
107
|
+
- ACP backend
|
|
108
|
+
- `ONEBOT_ACP_BACKEND`:`claude|gemini|copilot`
|
|
109
|
+
- `ONEBOT_ACP_COMMAND`:覆寫 command(例:`gemini`)
|
|
110
|
+
- `ONEBOT_ACP_ARGS`:覆寫 args(例:`--experimental-acp`)
|
|
111
|
+
|
|
112
|
+
- Telegram
|
|
113
|
+
- `ONEBOT_TELEGRAM_TOKEN`
|
|
114
|
+
|
|
115
|
+
- LINE(M1)
|
|
116
|
+
- `ONEBOT_LINE_CHANNEL_SECRET`
|
|
117
|
+
- `ONEBOT_LINE_CHANNEL_ACCESS_TOKEN`
|
|
118
|
+
|
|
119
|
+
---
|
|
120
|
+
|
|
121
|
+
## 4. 測試與品質
|
|
122
|
+
|
|
123
|
+
- Ruff(lint)
|
|
124
|
+
- Pytest + pytest-asyncio
|
|
125
|
+
- FastAPI:httpx ASGI 測試
|
|
126
|
+
- 覆蓋範圍(最低):
|
|
127
|
+
- skill parser / registry
|
|
128
|
+
- guard(deny patterns / workspace restriction)
|
|
129
|
+
- clawhub wrapper(以 mock subprocess)
|
|
130
|
+
- acp backend wrapper(以 mock / 或 integration 標記)
|
|
131
|
+
|
|
132
|
+
---
|
|
133
|
+
|
|
134
|
+
## 5. CI/CD(GitHub Release -> PyPI)
|
|
135
|
+
|
|
136
|
+
- PR/Push:lint + test
|
|
137
|
+
- Release(published):
|
|
138
|
+
- `uv build`
|
|
139
|
+
- 發佈到 PyPI
|
|
140
|
+
|
|
141
|
+
建議:PyPI Trusted Publisher(OIDC)。備援:`PYPI_API_TOKEN`。
|
|
142
|
+
|
|
143
|
+
---
|
|
144
|
+
|
|
145
|
+
## 6. 工作拆解(以 commit 逐步交付)
|
|
146
|
+
|
|
147
|
+
> 每一項至少 1 個 commit;完成後會回來更新本清單。
|
|
148
|
+
|
|
149
|
+
- [x] C01:初始化 git + uv 專案骨架(pyproject、src layout、README、LICENSE)
|
|
150
|
+
- [x] C02:核心 Workspace/Config(pydantic-settings)
|
|
151
|
+
- [x] C03:Skills:SKILL.md 解析 + SkillRegistry + list/summary
|
|
152
|
+
- [x] C04:ClawHub wrapper:`onebot skill search/install/update/list`(subprocess 呼叫 clawhub)
|
|
153
|
+
- [x] C05:ACP backend:整合 `claude-code-acp` 的 `AcpClient`(claude/gemini/copilot profiles)
|
|
154
|
+
- [x] C06:Terminal/FS 安全層:workspace 限制 + deny patterns(參考 nanobot)
|
|
155
|
+
- [x] C07:Gateway:inbound message -> acp prompt -> outbound reply
|
|
156
|
+
- [x] C08:Telegram adapter(polling):可收訊息並回覆
|
|
157
|
+
- [x] C09:FastAPI:`/health` `/skills` `/adapters`(最小可用)
|
|
158
|
+
- [x] C10:測試(pytest)+ GitHub Actions(lint/test/release)
|
|
159
|
+
- [x] C11:文件補齊:快速上手、設定、skill/MCP/ACP、發佈流程
|
|
160
|
+
|
|
161
|
+
---
|
|
162
|
+
|
|
163
|
+
## 7. 驗收標準(正式可用)
|
|
164
|
+
|
|
165
|
+
- `uv sync` 後可用 `uv run onebot --help`
|
|
166
|
+
- `uv run onebot web` 可啟動 FastAPI(`/health` 回 200)
|
|
167
|
+
- `uv run onebot telegram` 可 polling 並回覆訊息(需 token)
|
|
168
|
+
- `uv run onebot skill list` 可列出 skills(內建 + workspace)
|
|
169
|
+
- `uv run onebot skill search <q>` 可透過 clawhub CLI 查詢(已安裝 clawhub 時)
|
|
170
|
+
- GitHub Release 觸發 build/publish workflow(可先 dry-run 驗證)
|