@awiki/cli 0.0.1-beta.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/.github/workflows/release.yml +44 -0
- package/.goreleaser.yml +44 -0
- package/AGENTS.md +60 -0
- package/CLAUDE.md +192 -0
- package/README.md +2 -0
- package/docs/architecture/awiki-command-v2.md +955 -0
- package/docs/architecture/awiki-skill-architecture.md +475 -0
- package/docs/architecture/awiki-v2-architecture.md +1063 -0
- package/docs/architecture//345/217/202/350/200/203/346/226/207/346/241/243/cli-init.md +1008 -0
- package/docs/architecture//345/217/202/350/200/203/346/226/207/346/241/243/output-format.md +407 -0
- package/docs/architecture//345/217/202/350/200/203/346/226/207/346/241/243/overall-init.md +741 -0
- package/docs/harness/review-spec.md +474 -0
- package/docs/installation.md +372 -0
- package/docs/plan/awiki-v2-implementation-plan.md +903 -0
- package/docs/plan/phase-0/adr-index.md +56 -0
- package/docs/plan/phase-0/audit-findings.md +251 -0
- package/docs/plan/phase-0/capability-mapping.md +108 -0
- package/docs/plan/phase-0/implementation-constraints.md +363 -0
- package/docs/publish.md +169 -0
- package/go.mod +29 -0
- package/go.sum +73 -0
- package/internal/anpsdk/registry.go +63 -0
- package/internal/authsdk/session.go +351 -0
- package/internal/buildinfo/buildinfo.go +34 -0
- package/internal/cli/app.go +136 -0
- package/internal/cli/app_test.go +88 -0
- package/internal/cli/debug.go +104 -0
- package/internal/cli/group.go +263 -0
- package/internal/cli/id.go +473 -0
- package/internal/cli/init.go +134 -0
- package/internal/cli/msg.go +228 -0
- package/internal/cli/page.go +267 -0
- package/internal/cli/root.go +499 -0
- package/internal/cli/runtime.go +232 -0
- package/internal/cli/upgrade.go +60 -0
- package/internal/cmdmeta/catalog.go +203 -0
- package/internal/cmdmeta/catalog_test.go +21 -0
- package/internal/config/config.go +399 -0
- package/internal/config/config_test.go +104 -0
- package/internal/config/write.go +37 -0
- package/internal/content/service.go +314 -0
- package/internal/content/service_test.go +165 -0
- package/internal/content/types.go +44 -0
- package/internal/docs/topics.go +110 -0
- package/internal/doctor/doctor.go +306 -0
- package/internal/identity/client.go +267 -0
- package/internal/identity/did.go +85 -0
- package/internal/identity/did_test.go +50 -0
- package/internal/identity/layout.go +206 -0
- package/internal/identity/legacy.go +378 -0
- package/internal/identity/public.go +70 -0
- package/internal/identity/public_test.go +73 -0
- package/internal/identity/readiness.go +74 -0
- package/internal/identity/service.go +826 -0
- package/internal/identity/store.go +385 -0
- package/internal/identity/store_test.go +180 -0
- package/internal/identity/types.go +204 -0
- package/internal/message/auth.go +167 -0
- package/internal/message/group_service.go +838 -0
- package/internal/message/group_wire.go +350 -0
- package/internal/message/group_wire_test.go +67 -0
- package/internal/message/helpers.go +61 -0
- package/internal/message/http_client.go +334 -0
- package/internal/message/proof.go +156 -0
- package/internal/message/proof_test.go +61 -0
- package/internal/message/service.go +696 -0
- package/internal/message/service_test.go +97 -0
- package/internal/message/types.go +155 -0
- package/internal/message/wire.go +100 -0
- package/internal/message/wire_test.go +49 -0
- package/internal/message/ws_proxy_client.go +151 -0
- package/internal/output/output.go +350 -0
- package/internal/output/output_test.go +48 -0
- package/internal/runtime/config.go +117 -0
- package/internal/runtime/config_test.go +46 -0
- package/internal/runtime/listener/files.go +65 -0
- package/internal/runtime/listener/manager.go +142 -0
- package/internal/runtime/listener/server.go +983 -0
- package/internal/runtime/listener/server_test.go +319 -0
- package/internal/runtime/listener/sysproc_unix.go +17 -0
- package/internal/runtime/listener/sysproc_windows.go +13 -0
- package/internal/runtime/listener/types.go +21 -0
- package/internal/runtime/listener/wsclient.go +299 -0
- package/internal/runtime/listener/wsclient_test.go +41 -0
- package/internal/store/dao.go +632 -0
- package/internal/store/dao_test.go +87 -0
- package/internal/store/helpers.go +197 -0
- package/internal/store/import.go +499 -0
- package/internal/store/import_test.go +103 -0
- package/internal/store/open.go +71 -0
- package/internal/store/query.go +151 -0
- package/internal/store/schema.go +277 -0
- package/internal/store/schema_test.go +56 -0
- package/internal/store/types.go +177 -0
- package/internal/update/update.go +368 -0
- package/package.json +17 -0
- package/scripts/install.js +171 -0
- package/scripts/release/release-prerelease.sh +86 -0
- package/scripts/release/tag-release.sh +66 -0
- package/scripts/release/withdraw-release.sh +78 -0
- package/scripts/run.js +69 -0
- package/skills/README.md +32 -0
- package/skills/awiki-bundle/SKILL.md +76 -0
- package/skills/awiki-debug/SKILL.md +80 -0
- package/skills/awiki-group/SKILL.md +111 -0
- package/skills/awiki-id/SKILL.md +123 -0
- package/skills/awiki-msg/SKILL.md +131 -0
- package/skills/awiki-page/SKILL.md +93 -0
- package/skills/awiki-people/SKILL.md +66 -0
- package/skills/awiki-runtime/SKILL.md +137 -0
- package/skills/awiki-shared/SKILL.md +124 -0
- package/skills/awiki-workflow-discovery/SKILL.md +93 -0
- package/skills/awiki-workflow-onboarding/SKILL.md +119 -0
- package/skills/manifests/skills.yaml +260 -0
- package/skills/templates/bundle-skill-template.md +42 -0
- package/skills/templates/debug-skill-template.md +44 -0
- package/skills/templates/domain-skill-template.md +56 -0
- package/skills/templates/shared-skill-template.md +46 -0
- package/skills/templates/workflow-skill-template.md +46 -0
|
@@ -0,0 +1,1063 @@
|
|
|
1
|
+
# awiki v2 系统架构设计文档
|
|
2
|
+
|
|
3
|
+
**文档状态**:Draft v1.0
|
|
4
|
+
**项目代号**:awiki v2
|
|
5
|
+
**适用范围**:awiki CLI 核心重写、skill 体系重构、运行时与分发体系设计
|
|
6
|
+
**目标读者**:产品负责人、架构师、CLI/SDK 开发者、平台接入开发者、AI Agent 集成人员
|
|
7
|
+
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
## 1. 文档目的
|
|
11
|
+
|
|
12
|
+
本文档用于定义 awiki v2 的目标架构、核心设计原则、分层模型、技术选型、分发方案与迁移路径。
|
|
13
|
+
|
|
14
|
+
本文档重点回答以下问题:
|
|
15
|
+
|
|
16
|
+
1. awiki v2 要解决什么问题,边界在哪里
|
|
17
|
+
2. 为什么要重写,以及为什么最终选择 Go
|
|
18
|
+
3. 参考了飞书 CLI/skill 的哪些设计思想,哪些吸收,哪些不照搬
|
|
19
|
+
4. awiki v2 的目标架构层次、核心模块与职责划分是什么
|
|
20
|
+
5. Go 单二进制 CLI、跨平台编译、分发、skill、输出协议、运行时模式如何设计
|
|
21
|
+
6. 如何在保留 awiki 现有优势的前提下,完成从 v1 到 v2 的系统演进
|
|
22
|
+
|
|
23
|
+
> 说明:
|
|
24
|
+
> 本文档只描述 CLI 的架构层方案、命令分层原则与输出契约,不展开具体命令参数细节。
|
|
25
|
+
> 详细 CLI 设计以单独的 CLI 规范文档为准。
|
|
26
|
+
|
|
27
|
+
---
|
|
28
|
+
|
|
29
|
+
## 2. 背景与问题陈述
|
|
30
|
+
|
|
31
|
+
awiki v1 已经具备一套相当完整的 Agent 原生能力,包括:
|
|
32
|
+
|
|
33
|
+
- DID / Handle 自主身份体系
|
|
34
|
+
- 多身份与本地凭证持久化
|
|
35
|
+
- 端到端加密消息与自动握手处理
|
|
36
|
+
- 私聊、群组、关注关系、内容页发布
|
|
37
|
+
- 基于心跳与 WebSocket 的消息接收
|
|
38
|
+
- 本地 SQLite 缓存、群组快照与关系沉淀
|
|
39
|
+
|
|
40
|
+
但 v1 仍然是“Python 脚本集合 + 巨型 SKILL.md”的形态,带来以下系统性问题:
|
|
41
|
+
|
|
42
|
+
### 2.1 路由层问题
|
|
43
|
+
当前主要能力通过多个脚本分散暴露,例如身份、消息、群组、E2EE、listener、query_db 等分别由不同脚本承载。
|
|
44
|
+
这使得 AI 必须先猜“应该运行哪个脚本”,而不是先理解“我现在要完成的任务是什么”。
|
|
45
|
+
|
|
46
|
+
### 2.2 文档层问题
|
|
47
|
+
主 SKILL 同时承担:
|
|
48
|
+
- 产品介绍
|
|
49
|
+
- 安装升级
|
|
50
|
+
- 安全规则
|
|
51
|
+
- 身份与消息能力
|
|
52
|
+
- 群组发现工作流
|
|
53
|
+
- heartbeat 行为策略
|
|
54
|
+
- listener 运行机制
|
|
55
|
+
- 本地库与 SQL 调试入口
|
|
56
|
+
|
|
57
|
+
结果是核心主线被实现细节淹没,文档既不利于 AI 路由,也不利于长期维护。
|
|
58
|
+
|
|
59
|
+
### 2.3 运行时层问题
|
|
60
|
+
v1 已形成较清晰的 `http` / `websocket` 双模式设计,以及 listener 持有唯一远端连接、本地 CLI 通过本地 daemon 协作的机制,但这套设计尚未被抽象为稳定的产品化 runtime 层。
|
|
61
|
+
|
|
62
|
+
### 2.4 产品化问题
|
|
63
|
+
v1 的安装、升级、分发、诊断与帮助体系仍偏向工程仓使用方式,而不是一个成熟的跨平台 CLI 产品:
|
|
64
|
+
- 安装依赖较重
|
|
65
|
+
- 缺少统一入口
|
|
66
|
+
- 缺少内建 docs / schema / doctor
|
|
67
|
+
- 输出协议尚未统一
|
|
68
|
+
- skill 与 CLI 本体耦合过重
|
|
69
|
+
|
|
70
|
+
---
|
|
71
|
+
|
|
72
|
+
## 3. 目标与非目标
|
|
73
|
+
|
|
74
|
+
## 3.1 总体目标
|
|
75
|
+
|
|
76
|
+
awiki v2 的总目标是:
|
|
77
|
+
|
|
78
|
+
**构建一个以 Go 为核心、统一入口、跨平台分发、对人类与 AI 都友好的 agent-native identity & messaging CLI 产品。**
|
|
79
|
+
|
|
80
|
+
其本质不是“把旧脚本换成新语言”,而是完成一次完整的产品化重构。
|
|
81
|
+
|
|
82
|
+
## 3.2 具体目标
|
|
83
|
+
|
|
84
|
+
### G1. 建立统一 CLI 产品面
|
|
85
|
+
所有核心能力统一由 `awiki-cli` 命令暴露,不再将脚本名作为公共 API。
|
|
86
|
+
|
|
87
|
+
### G2. 保留 awiki 的核心差异化能力
|
|
88
|
+
v2 必须完整保留并强化:
|
|
89
|
+
- DID / Handle / self-sovereign identity
|
|
90
|
+
- 多 identity 并行
|
|
91
|
+
- E2EE 私聊与自动协议处理
|
|
92
|
+
- heartbeat / listener / 本地缓存
|
|
93
|
+
- owner_did 隔离与本地关系沉淀
|
|
94
|
+
|
|
95
|
+
### G3. 建立清晰的系统分层
|
|
96
|
+
将系统划分为:
|
|
97
|
+
- CLI 产品层
|
|
98
|
+
- 领域应用层
|
|
99
|
+
- 运行时与传输层
|
|
100
|
+
- 本地状态与存储层
|
|
101
|
+
- 技能与文档层
|
|
102
|
+
- 平台接入层
|
|
103
|
+
|
|
104
|
+
### G4. 提供完善的可解释性与自省能力
|
|
105
|
+
CLI 必须内建:
|
|
106
|
+
- `docs`
|
|
107
|
+
- `schema`
|
|
108
|
+
- `doctor`
|
|
109
|
+
- `--dry-run`
|
|
110
|
+
- 结构化输出
|
|
111
|
+
- 可测试、可生成的帮助系统
|
|
112
|
+
|
|
113
|
+
### G5. 支持单二进制与多平台分发
|
|
114
|
+
实现面向 macOS / Linux / Windows 的一致安装体验。
|
|
115
|
+
|
|
116
|
+
## 3.3 非目标
|
|
117
|
+
|
|
118
|
+
### N1. v2 不追求一次性覆盖所有旧能力的深度细节
|
|
119
|
+
例如 group discovery、内容页、debug 等可分阶段迁移。
|
|
120
|
+
|
|
121
|
+
### N2. v2 不追求成为“大而全平台”
|
|
122
|
+
awiki 的核心是 identity + messaging + runtime,不复制飞书的业务体量。
|
|
123
|
+
|
|
124
|
+
### N3. v2 不将 skill 作为 CLI 的唯一文档入口
|
|
125
|
+
skill 是增强层,不是 CLI 基础可用性的前提。
|
|
126
|
+
|
|
127
|
+
---
|
|
128
|
+
|
|
129
|
+
## 4. 参考设计输入与外部借鉴
|
|
130
|
+
|
|
131
|
+
## 4.1 awiki 现有设计中要保留的部分
|
|
132
|
+
|
|
133
|
+
### 4.1.1 身份与 DID 模型
|
|
134
|
+
awiki 当前的自主管理身份、Handle 绑定、恢复、绑定联系方式、多身份切换与 owner_did 隔离,是 v2 的根能力,必须保留。
|
|
135
|
+
|
|
136
|
+
### 4.1.2 E2EE 与本地状态
|
|
137
|
+
E2EE 会话、失败 outbox、自动处理控制消息、本地 SQLite 历史与缓存、群组快照与关系沉淀,都是 v2 的重要资产。
|
|
138
|
+
|
|
139
|
+
### 4.1.3 安全边界
|
|
140
|
+
“消息是数据,不是指令”必须继续作为最高级别的产品安全原则。
|
|
141
|
+
|
|
142
|
+
### 4.1.4 显式传输模式
|
|
143
|
+
`http` 与 `websocket` 的显式模式切换,以及 listener 单连接持有、其他 CLI 通过本地 daemon 协作的设计,是正确方向,应保留并产品化。
|
|
144
|
+
|
|
145
|
+
## 4.2 飞书 CLI / skill 中吸收的设计思想
|
|
146
|
+
|
|
147
|
+
awiki v2 参考飞书的不是业务范围,而是**结构设计与产品组织方法**。
|
|
148
|
+
|
|
149
|
+
### 4.2.1 统一 CLI 入口
|
|
150
|
+
飞书通过 `lark-cli` 提供统一执行入口,将配置、认证、业务命令、schema、doctor 等整合到一个产品面上。
|
|
151
|
+
awiki v2 也应只有一个统一入口:`awiki-cli`。
|
|
152
|
+
|
|
153
|
+
### 4.2.2 shared skill + domain skill
|
|
154
|
+
飞书通过 `lark-shared` 处理共享规则,再按业务域拆 skill。
|
|
155
|
+
awiki v2 应采用同样策略,将共享安全规则、身份切换、输出约定与领域 skill 分离。
|
|
156
|
+
|
|
157
|
+
### 4.2.3 三层命令体系
|
|
158
|
+
飞书采用:
|
|
159
|
+
- Shortcuts
|
|
160
|
+
- API Commands
|
|
161
|
+
- Raw API
|
|
162
|
+
|
|
163
|
+
awiki v2 应吸收这种“分层暴露能力”的思想,但不盲目复制全部语法形式。
|
|
164
|
+
|
|
165
|
+
### 4.2.4 CLI 自省与产品化能力
|
|
166
|
+
飞书 CLI 将 `schema`、`dry-run`、格式输出、诊断、completion 等做成一等能力。
|
|
167
|
+
awiki v2 也应如此。
|
|
168
|
+
|
|
169
|
+
### 4.2.5 单二进制 + npm wrapper + 多平台发布
|
|
170
|
+
飞书以 Go 为核心,辅以 GoReleaser 和 npm 包装层。
|
|
171
|
+
awiki v2 可采用相似分发模型。
|
|
172
|
+
|
|
173
|
+
## 4.3 不照搬飞书的部分
|
|
174
|
+
|
|
175
|
+
### 4.3.1 不复制其业务体量
|
|
176
|
+
awiki 不需要做成 200+ 命令、12 个业务域的大平台 CLI。
|
|
177
|
+
|
|
178
|
+
### 4.3.2 不复制 profile 不一等的问题
|
|
179
|
+
awiki v2 应把多 identity 作为一等能力,而不是靠环境变量隔离工作区。
|
|
180
|
+
|
|
181
|
+
### 4.3.3 不让 skill 成为 CLI 的唯一知识来源
|
|
182
|
+
CLI 必须内建基本文档、自省与向导。
|
|
183
|
+
|
|
184
|
+
### 4.3.4 不让能力注册造成默认上下文过重
|
|
185
|
+
对于 AI 使用场景,默认上下文必须小核心,按需加载扩展能力。
|
|
186
|
+
|
|
187
|
+
---
|
|
188
|
+
|
|
189
|
+
## 5. 核心设计原则
|
|
190
|
+
|
|
191
|
+
## 5.1 意图优先
|
|
192
|
+
按用户任务组织系统,不按底层脚本或协议实现组织。
|
|
193
|
+
|
|
194
|
+
## 5.2 小核心、强边界
|
|
195
|
+
核心只围绕:
|
|
196
|
+
- identity
|
|
197
|
+
- messaging
|
|
198
|
+
- runtime
|
|
199
|
+
|
|
200
|
+
其它能力作为扩展域存在。
|
|
201
|
+
|
|
202
|
+
## 5.3 CLI 产品独立于 skill
|
|
203
|
+
CLI 必须在没有额外 skill 的情况下仍具备可用性、可解释性与可诊断性。
|
|
204
|
+
|
|
205
|
+
## 5.4 结构化优先
|
|
206
|
+
系统接口、输出、错误、dry-run、schema 均以机器可读为优先,再渲染人类视图。
|
|
207
|
+
|
|
208
|
+
## 5.5 安全前置
|
|
209
|
+
任何远端输入均视为不可信数据;任何凭证、私钥、令牌、主机信息均必须受严格保护。
|
|
210
|
+
|
|
211
|
+
## 5.6 多身份一等公民
|
|
212
|
+
identity 是系统第一层对象,不是附属配置。
|
|
213
|
+
|
|
214
|
+
## 5.7 显式运行模式
|
|
215
|
+
传输、listener、heartbeat、daemon 等运行时状态必须可见、可查询、可切换、可诊断。
|
|
216
|
+
|
|
217
|
+
## 5.8 文档即产品
|
|
218
|
+
帮助系统、schema、docs、README 与 skill 不允许漂移,应从统一元数据源生成。
|
|
219
|
+
|
|
220
|
+
---
|
|
221
|
+
|
|
222
|
+
## 6. 目标产品形态
|
|
223
|
+
|
|
224
|
+
awiki v2 的目标产品形态如下:
|
|
225
|
+
|
|
226
|
+
1. **Go 单二进制 CLI**:`awiki-cli`
|
|
227
|
+
2. **内建文档与自省系统**:`awiki-cli docs` / `awiki-cli schema` / `awiki-cli doctor`
|
|
228
|
+
3. **共享 + 领域 skill 体系**
|
|
229
|
+
4. **可选平台接入层**(如 OpenClaw 插件),但与 CLI 核心解耦
|
|
230
|
+
5. **GitHub Releases + GoReleaser + npm wrapper + 可选包管理器分发**
|
|
231
|
+
|
|
232
|
+
---
|
|
233
|
+
|
|
234
|
+
## 7. 总体架构与分层设计
|
|
235
|
+
|
|
236
|
+
## 7.1 逻辑分层
|
|
237
|
+
|
|
238
|
+
```text
|
|
239
|
+
+------------------------------------------------------+
|
|
240
|
+
| Layer 1. Product Surface |
|
|
241
|
+
| CLI commands / help / docs / schema / doctor / UX |
|
|
242
|
+
+------------------------------------------------------+
|
|
243
|
+
| Layer 2. Domain Application |
|
|
244
|
+
| identity / messaging / group / people / page |
|
|
245
|
+
+------------------------------------------------------+
|
|
246
|
+
| Layer 3. Runtime & Transport |
|
|
247
|
+
| http mode / websocket mode / listener / IPC / service|
|
|
248
|
+
+------------------------------------------------------+
|
|
249
|
+
| Layer 4. Local State & Security |
|
|
250
|
+
| identities / keyring / sqlite / cache / migrations |
|
|
251
|
+
+------------------------------------------------------+
|
|
252
|
+
| Layer 5. Skill & Documentation Layer |
|
|
253
|
+
| shared skill / domain skills / generated references |
|
|
254
|
+
+------------------------------------------------------+
|
|
255
|
+
| Layer 6. Host Integration Layer |
|
|
256
|
+
| OpenClaw plugin / webhook bridge / future adapters |
|
|
257
|
+
+------------------------------------------------------+
|
|
258
|
+
```
|
|
259
|
+
|
|
260
|
+
## 7.2 各层职责
|
|
261
|
+
|
|
262
|
+
### Layer 1:Product Surface
|
|
263
|
+
面向用户与 AI 的统一 CLI 接口,负责:
|
|
264
|
+
- 命令入口
|
|
265
|
+
- help
|
|
266
|
+
- docs
|
|
267
|
+
- schema
|
|
268
|
+
- doctor
|
|
269
|
+
- 输出格式选择
|
|
270
|
+
- dry-run 与确认机制
|
|
271
|
+
|
|
272
|
+
### Layer 2:Domain Application
|
|
273
|
+
承载业务语义,按领域划分:
|
|
274
|
+
- identity
|
|
275
|
+
- messaging
|
|
276
|
+
- group
|
|
277
|
+
- people
|
|
278
|
+
- page
|
|
279
|
+
|
|
280
|
+
### Layer 3:Runtime & Transport
|
|
281
|
+
负责消息收发的底层机制:
|
|
282
|
+
- `http` 模式
|
|
283
|
+
- `websocket` 模式
|
|
284
|
+
- listener
|
|
285
|
+
- 本地 IPC/daemon
|
|
286
|
+
- heartbeat 支持
|
|
287
|
+
- 系统服务安装与运行
|
|
288
|
+
|
|
289
|
+
### Layer 4:Local State & Security
|
|
290
|
+
负责:
|
|
291
|
+
- identity 目录
|
|
292
|
+
- token/keyring
|
|
293
|
+
- SQLite 本地库
|
|
294
|
+
- 缓存与快照
|
|
295
|
+
- 数据迁移
|
|
296
|
+
- 密钥与机密保护
|
|
297
|
+
|
|
298
|
+
### Layer 5:Skill & Documentation
|
|
299
|
+
负责 AI 路由、最佳实践、共享规则与领域技能说明。
|
|
300
|
+
不承载 CLI 的唯一知识。
|
|
301
|
+
|
|
302
|
+
### Layer 6:Host Integration
|
|
303
|
+
将 CLI 能力接入特定宿主平台,如 OpenClaw。
|
|
304
|
+
该层与 CLI 核心解耦。
|
|
305
|
+
|
|
306
|
+
---
|
|
307
|
+
|
|
308
|
+
## 8. 领域架构
|
|
309
|
+
|
|
310
|
+
## 8.1 Identity 域
|
|
311
|
+
|
|
312
|
+
### 职责
|
|
313
|
+
- DID 身份创建
|
|
314
|
+
- Handle 注册与恢复
|
|
315
|
+
- 联系方式绑定
|
|
316
|
+
- profile 管理
|
|
317
|
+
- 多 identity 管理
|
|
318
|
+
- 当前 identity 切换
|
|
319
|
+
|
|
320
|
+
### 关键设计
|
|
321
|
+
- 用户层概念统一为 `identity`
|
|
322
|
+
- 本地持有私钥
|
|
323
|
+
- Handle 是 DID 的人类可读映射
|
|
324
|
+
- identity 是其他所有域的前置依赖
|
|
325
|
+
|
|
326
|
+
## 8.2 Messaging 域
|
|
327
|
+
|
|
328
|
+
### 职责
|
|
329
|
+
- 私聊发送
|
|
330
|
+
- 收件箱读取
|
|
331
|
+
- 历史查看
|
|
332
|
+
- 已读标记
|
|
333
|
+
- 安全会话管理
|
|
334
|
+
|
|
335
|
+
### 统一消息模型
|
|
336
|
+
```text
|
|
337
|
+
Message =
|
|
338
|
+
Target(scope: direct | group)
|
|
339
|
+
× Security(plain | e2ee)
|
|
340
|
+
× ReceiveMode(pull | realtime)
|
|
341
|
+
```
|
|
342
|
+
|
|
343
|
+
其中:
|
|
344
|
+
- `scope` 和 `security` 属于业务层
|
|
345
|
+
- `ReceiveMode` 属于 runtime 层
|
|
346
|
+
|
|
347
|
+
### 当前支持矩阵
|
|
348
|
+
- direct + plain:支持
|
|
349
|
+
- direct + e2ee:支持
|
|
350
|
+
- group + plain:支持
|
|
351
|
+
- group + e2ee:暂不作为 v2 核心能力
|
|
352
|
+
|
|
353
|
+
## 8.3 Group 域
|
|
354
|
+
|
|
355
|
+
### 职责
|
|
356
|
+
- 群生命周期管理
|
|
357
|
+
- join-code / 加入
|
|
358
|
+
- 成员管理
|
|
359
|
+
- 群元数据管理
|
|
360
|
+
- 群消息列表
|
|
361
|
+
|
|
362
|
+
### 设计原则
|
|
363
|
+
- 群对象是独立资源
|
|
364
|
+
- 群发消息仍归入消息语义
|
|
365
|
+
- 群模式(如 chat / discovery)属于群元数据,而非消息层
|
|
366
|
+
|
|
367
|
+
## 8.4 Runtime 域
|
|
368
|
+
|
|
369
|
+
### 职责
|
|
370
|
+
- runtime setup
|
|
371
|
+
- 传输模式配置
|
|
372
|
+
- listener 安装 / 启停 / 状态
|
|
373
|
+
- heartbeat 运行支持
|
|
374
|
+
- daemon / IPC
|
|
375
|
+
|
|
376
|
+
### 设计原则
|
|
377
|
+
- transport 只出现在 runtime
|
|
378
|
+
- CLI 业务命令不感知 HTTP / WSS
|
|
379
|
+
- websocket 模式下 listener 持有唯一远端连接
|
|
380
|
+
- 其他命令与 listener 通过本地 IPC 协作
|
|
381
|
+
|
|
382
|
+
## 8.5 扩展域
|
|
383
|
+
|
|
384
|
+
### People
|
|
385
|
+
- 搜索
|
|
386
|
+
- 关注
|
|
387
|
+
- 联系人
|
|
388
|
+
- discovery workflow
|
|
389
|
+
|
|
390
|
+
### Page
|
|
391
|
+
- 内容页创建、读取、修改、发布
|
|
392
|
+
|
|
393
|
+
### Debug
|
|
394
|
+
- 数据库查询
|
|
395
|
+
- 状态导出
|
|
396
|
+
- 原始调用
|
|
397
|
+
- 故障排查
|
|
398
|
+
|
|
399
|
+
---
|
|
400
|
+
|
|
401
|
+
## 9. 技术实现架构
|
|
402
|
+
|
|
403
|
+
## 9.1 技术选型总览
|
|
404
|
+
|
|
405
|
+
- **实现语言**:Go
|
|
406
|
+
- **CLI 框架**:Cobra
|
|
407
|
+
- **配置合并**:Koanf
|
|
408
|
+
- **日志**:`log/slog`
|
|
409
|
+
- **本地数据库**:SQLite
|
|
410
|
+
- **SQLite 驱动**:`modernc.org/sqlite`(无 CGO)
|
|
411
|
+
- **迁移工具**:goose
|
|
412
|
+
- **类型安全 SQL**:sqlc
|
|
413
|
+
- **WebSocket**:`github.com/coder/websocket`
|
|
414
|
+
- **系统服务**:`github.com/kardianos/service`
|
|
415
|
+
- **系统凭证存储**:`github.com/99designs/keyring`
|
|
416
|
+
- **发布工具**:GoReleaser
|
|
417
|
+
|
|
418
|
+
## 9.2 为什么最终统一使用 Go
|
|
419
|
+
|
|
420
|
+
虽然前期讨论与基础资料中曾保留过“继续用 Python”的过渡方案,但 v2 已明确统一为 Go,原因如下:
|
|
421
|
+
|
|
422
|
+
1. 目标产品是跨平台单二进制 CLI
|
|
423
|
+
2. 需要稳定的 service / listener / IPC / websocket 运行时
|
|
424
|
+
3. 需要一致的多平台分发体验
|
|
425
|
+
4. 需要更强的安装可控性与更轻的运行依赖
|
|
426
|
+
5. 参考飞书产品化路径后,Go 是更适合的基础实现语言
|
|
427
|
+
|
|
428
|
+
因此,所有“继续使用 Python 作为 v2 CLI 主实现”的旧判断,在本架构中全部作废。
|
|
429
|
+
|
|
430
|
+
---
|
|
431
|
+
|
|
432
|
+
## 10. 打包与代码组织
|
|
433
|
+
|
|
434
|
+
## 10.1 仓库结构建议
|
|
435
|
+
|
|
436
|
+
```text
|
|
437
|
+
/
|
|
438
|
+
├── cmd/
|
|
439
|
+
│ └── awiki/
|
|
440
|
+
├── internal/
|
|
441
|
+
│ ├── app/
|
|
442
|
+
│ ├── cli/
|
|
443
|
+
│ ├── config/
|
|
444
|
+
│ ├── docs/
|
|
445
|
+
│ ├── schema/
|
|
446
|
+
│ ├── doctor/
|
|
447
|
+
│ ├── output/
|
|
448
|
+
│ ├── identity/
|
|
449
|
+
│ ├── messaging/
|
|
450
|
+
│ ├── group/
|
|
451
|
+
│ ├── secure/
|
|
452
|
+
│ ├── runtime/
|
|
453
|
+
│ ├── transport/
|
|
454
|
+
│ │ ├── http/
|
|
455
|
+
│ │ ├── websocket/
|
|
456
|
+
│ │ └── ipc/
|
|
457
|
+
│ ├── store/
|
|
458
|
+
│ ├── people/
|
|
459
|
+
│ ├── page/
|
|
460
|
+
│ └── migrate/
|
|
461
|
+
├── skills/
|
|
462
|
+
├── docs/
|
|
463
|
+
├── migrations/
|
|
464
|
+
├── npm/
|
|
465
|
+
└── legacy/
|
|
466
|
+
```
|
|
467
|
+
|
|
468
|
+
## 10.2 打包原则
|
|
469
|
+
|
|
470
|
+
### P1. 单二进制优先
|
|
471
|
+
所有核心运行逻辑打包进 `awiki-cli` 二进制。
|
|
472
|
+
|
|
473
|
+
### P2. 平台无差异优先
|
|
474
|
+
优先采用无 CGO 依赖,降低跨平台编译复杂度。
|
|
475
|
+
|
|
476
|
+
### P3. CLI 与技能资源分离但可同发
|
|
477
|
+
skills、docs、schema 可与二进制一起发布,但不要求安装技能后 CLI 才能工作。
|
|
478
|
+
|
|
479
|
+
---
|
|
480
|
+
|
|
481
|
+
## 11. 多平台编译与分发方案
|
|
482
|
+
|
|
483
|
+
## 11.1 编译目标
|
|
484
|
+
|
|
485
|
+
首批支持:
|
|
486
|
+
- darwin/amd64
|
|
487
|
+
- darwin/arm64
|
|
488
|
+
- linux/amd64
|
|
489
|
+
- linux/arm64
|
|
490
|
+
- windows/amd64
|
|
491
|
+
- windows/arm64
|
|
492
|
+
|
|
493
|
+
## 11.2 发布方式
|
|
494
|
+
|
|
495
|
+
### 主渠道
|
|
496
|
+
- GitHub Releases
|
|
497
|
+
- npm wrapper:`@awiki/cli`
|
|
498
|
+
|
|
499
|
+
### 补充渠道
|
|
500
|
+
- Homebrew tap
|
|
501
|
+
- winget / Scoop(后续)
|
|
502
|
+
- 企业私有镜像/CDN(后续)
|
|
503
|
+
|
|
504
|
+
## 11.3 分发结构
|
|
505
|
+
|
|
506
|
+
### 方案 A:GitHub Releases
|
|
507
|
+
发布内容:
|
|
508
|
+
- 各平台压缩包
|
|
509
|
+
- checksums
|
|
510
|
+
- changelog
|
|
511
|
+
- skills bundle
|
|
512
|
+
- docs bundle(可选)
|
|
513
|
+
|
|
514
|
+
### 方案 B:npm wrapper
|
|
515
|
+
npm 仅作为安装入口:
|
|
516
|
+
- `postinstall` 下载对应平台二进制
|
|
517
|
+
- `run.js` 转发到本地二进制
|
|
518
|
+
- 不将 JS/Node 作为业务运行时
|
|
519
|
+
|
|
520
|
+
### 方案 C:包管理器
|
|
521
|
+
- Homebrew
|
|
522
|
+
- Windows 包管理器
|
|
523
|
+
- 企业私有镜像源
|
|
524
|
+
|
|
525
|
+
## 11.4 设计理由
|
|
526
|
+
|
|
527
|
+
该分发模型兼顾:
|
|
528
|
+
- 人类用户简单安装
|
|
529
|
+
- AI 环境统一执行入口
|
|
530
|
+
- 多平台稳定发布
|
|
531
|
+
- 国内外网络环境适配
|
|
532
|
+
- 与飞书当前“Go 二进制 + npm 包装层”的产品路径兼容
|
|
533
|
+
|
|
534
|
+
---
|
|
535
|
+
|
|
536
|
+
## 12. 三层命令体系(架构层)
|
|
537
|
+
|
|
538
|
+
> 说明:详细命令设计在单独 CLI 文档中定义。
|
|
539
|
+
> 本节只描述架构意图与分层原则。
|
|
540
|
+
|
|
541
|
+
## 12.1 目标
|
|
542
|
+
|
|
543
|
+
将命令暴露面按“任务抽象级别”分成三层,避免所有能力都堆在同一命令语义上。
|
|
544
|
+
|
|
545
|
+
## 12.2 三层定义
|
|
546
|
+
|
|
547
|
+
### Layer A:Task Layer
|
|
548
|
+
面向人类与 AI 的默认入口,覆盖高频任务。
|
|
549
|
+
例如:
|
|
550
|
+
- init
|
|
551
|
+
- status
|
|
552
|
+
- id register
|
|
553
|
+
- msg send
|
|
554
|
+
- msg inbox
|
|
555
|
+
- runtime setup
|
|
556
|
+
|
|
557
|
+
### Layer B:Resource Layer
|
|
558
|
+
面向对象级操作与进阶能力。
|
|
559
|
+
例如:
|
|
560
|
+
- id resolve
|
|
561
|
+
- group members
|
|
562
|
+
- msg secure repair
|
|
563
|
+
- people discover
|
|
564
|
+
|
|
565
|
+
### Layer C:Raw / Debug Layer
|
|
566
|
+
面向调试、兜底和专家场景。
|
|
567
|
+
例如:
|
|
568
|
+
- api
|
|
569
|
+
- debug db
|
|
570
|
+
- debug state
|
|
571
|
+
- raw transport tools
|
|
572
|
+
|
|
573
|
+
## 12.3 设计原则
|
|
574
|
+
|
|
575
|
+
- 默认优先使用 Task Layer
|
|
576
|
+
- Resource Layer 适合更精细的控制
|
|
577
|
+
- Raw Layer 不参与默认 AI 路由
|
|
578
|
+
- 不复制飞书全部 shortcut 语法,只吸收其分层思想
|
|
579
|
+
|
|
580
|
+
---
|
|
581
|
+
|
|
582
|
+
## 13. skill 架构设计
|
|
583
|
+
|
|
584
|
+
## 13.1 目标
|
|
585
|
+
|
|
586
|
+
skill 的角色是:
|
|
587
|
+
- 为 AI 提供高质量路由提示
|
|
588
|
+
- 定义共享安全规则与工作流约束
|
|
589
|
+
- 提供领域级使用说明
|
|
590
|
+
|
|
591
|
+
skill 的角色不是:
|
|
592
|
+
- CLI 的唯一文档源
|
|
593
|
+
- 真实命令语义的唯一规范源
|
|
594
|
+
|
|
595
|
+
## 13.2 skill 划分
|
|
596
|
+
|
|
597
|
+
建议拆为:
|
|
598
|
+
|
|
599
|
+
```text
|
|
600
|
+
awiki-bundle
|
|
601
|
+
awiki-shared
|
|
602
|
+
awiki-id
|
|
603
|
+
awiki-msg
|
|
604
|
+
awiki-group
|
|
605
|
+
awiki-runtime
|
|
606
|
+
awiki-people
|
|
607
|
+
awiki-page
|
|
608
|
+
awiki-debug
|
|
609
|
+
awiki-workflow-onboarding
|
|
610
|
+
awiki-workflow-discovery
|
|
611
|
+
```
|
|
612
|
+
|
|
613
|
+
其中:
|
|
614
|
+
|
|
615
|
+
- `awiki-bundle` 负责总入口路由
|
|
616
|
+
- `awiki-shared` 负责横切规则
|
|
617
|
+
- `awiki-id / awiki-msg / awiki-group / awiki-runtime / awiki-people / awiki-page` 是 domain skills
|
|
618
|
+
- `awiki-workflow-onboarding / awiki-workflow-discovery` 是 workflow skills
|
|
619
|
+
- `awiki-debug` 是最后兜底入口
|
|
620
|
+
|
|
621
|
+
## 13.3 每个 skill 的职责
|
|
622
|
+
|
|
623
|
+
### awiki-shared
|
|
624
|
+
- 安全规则
|
|
625
|
+
- identity 切换规则
|
|
626
|
+
- 输出协议约定
|
|
627
|
+
- dry-run / schema / doctor 使用原则
|
|
628
|
+
- 更新与升级提示
|
|
629
|
+
|
|
630
|
+
### awiki-id
|
|
631
|
+
- DID / Handle / bind / recover / profile
|
|
632
|
+
|
|
633
|
+
### awiki-msg
|
|
634
|
+
- direct / group messaging
|
|
635
|
+
- inbox / history
|
|
636
|
+
- secure messaging
|
|
637
|
+
|
|
638
|
+
### awiki-group
|
|
639
|
+
- group lifecycle
|
|
640
|
+
- join / add / remove / leave
|
|
641
|
+
- 成员与群状态读取
|
|
642
|
+
|
|
643
|
+
### awiki-runtime
|
|
644
|
+
- mode
|
|
645
|
+
- listener
|
|
646
|
+
- heartbeat
|
|
647
|
+
- setup
|
|
648
|
+
|
|
649
|
+
### awiki-people
|
|
650
|
+
- search / follow / contacts / discovery
|
|
651
|
+
|
|
652
|
+
### awiki-page
|
|
653
|
+
- 内容页
|
|
654
|
+
|
|
655
|
+
### awiki-debug
|
|
656
|
+
- 调试与运维
|
|
657
|
+
|
|
658
|
+
## 13.4 与 CLI 的关系
|
|
659
|
+
|
|
660
|
+
- skill 由 CLI 的元数据与文档系统支撑
|
|
661
|
+
- 关键命令帮助必须由 CLI 直接提供
|
|
662
|
+
- skill 是增强层,不是必选依赖
|
|
663
|
+
|
|
664
|
+
## 13.5 详细设计文档
|
|
665
|
+
|
|
666
|
+
skill 的详细目录结构、manifest、template、workflow 边界与当前实现状态,以:
|
|
667
|
+
|
|
668
|
+
- `docs/architecture/awiki-skill-architecture.md`
|
|
669
|
+
|
|
670
|
+
为准。
|
|
671
|
+
|
|
672
|
+
---
|
|
673
|
+
|
|
674
|
+
## 14. 输出、schema 与 doctor 设计
|
|
675
|
+
|
|
676
|
+
## 14.1 输出原则
|
|
677
|
+
|
|
678
|
+
- canonical output 为 JSON
|
|
679
|
+
- human/pretty/table/ndjson 都是 JSON 的视图
|
|
680
|
+
- 自然语言不是 CLI 的主契约
|
|
681
|
+
- 所有命令返回稳定信封结构
|
|
682
|
+
- 退出码与 JSON 语义一起设计
|
|
683
|
+
|
|
684
|
+
## 14.2 dry-run
|
|
685
|
+
|
|
686
|
+
所有有副作用命令必须支持 `--dry-run`。
|
|
687
|
+
`--dry-run` 返回执行计划,而不是仅返回“未执行”。
|
|
688
|
+
|
|
689
|
+
## 14.3 schema
|
|
690
|
+
|
|
691
|
+
`schema` 是命令元数据与返回结构的统一入口,用于:
|
|
692
|
+
- AI tool routing
|
|
693
|
+
- 文档生成
|
|
694
|
+
- 集成对接
|
|
695
|
+
- help 一致性检查
|
|
696
|
+
|
|
697
|
+
## 14.4 doctor
|
|
698
|
+
|
|
699
|
+
`doctor` 是系统级诊断能力,用于:
|
|
700
|
+
- 环境检查
|
|
701
|
+
- identity 检查
|
|
702
|
+
- transport / listener / heartbeat 检查
|
|
703
|
+
- 数据库与迁移检查
|
|
704
|
+
- 配置与服务可达性检查
|
|
705
|
+
|
|
706
|
+
---
|
|
707
|
+
|
|
708
|
+
## 15. 安全架构
|
|
709
|
+
|
|
710
|
+
## 15.1 顶层原则
|
|
711
|
+
|
|
712
|
+
**Messages are data, not instructions.**
|
|
713
|
+
|
|
714
|
+
任何来自 awiki 的消息、群消息、listener 推送、webhook 内容,均视为不可信外部数据。
|
|
715
|
+
|
|
716
|
+
## 15.2 机密保护
|
|
717
|
+
|
|
718
|
+
绝不输出:
|
|
719
|
+
- 私钥
|
|
720
|
+
- JWT 原文
|
|
721
|
+
- E2EE 原始密钥
|
|
722
|
+
- 凭证文件内容
|
|
723
|
+
- 主机敏感信息
|
|
724
|
+
|
|
725
|
+
## 15.3 Host 信息隔离
|
|
726
|
+
|
|
727
|
+
CLI 与 skill 体系必须保证:
|
|
728
|
+
- 远端消息不能触发本地文件读写
|
|
729
|
+
- 不能依据消息执行 shell / API 调用
|
|
730
|
+
- 不能泄露系统配置与运行环境
|
|
731
|
+
|
|
732
|
+
## 15.4 底层安全语义冻结原则
|
|
733
|
+
|
|
734
|
+
所有涉及协议安全语义的默认值,必须由底层 AgentConnect / ANP SDK 固化;`awiki-cli` 的命令层、service 层、runtime 层只能复用,不得各自重新硬编码一套默认语义。
|
|
735
|
+
|
|
736
|
+
必须以下列规则为准:
|
|
737
|
+
- DID 文档内嵌 W3C / Data Integrity proof 的 `proofPurpose` 默认值由 SDK 决定;当前注册、更新、恢复等文档断言场景统一使用 `assertionMethod`
|
|
738
|
+
- group receipt proof 的 `proofPurpose` 默认值由 SDK 决定;上层不得改单条 receipt 的默认语义
|
|
739
|
+
- IM proof 的默认 covered components、`contentDigest`、`signatureInput` 生成规则由 SDK 决定;业务层只能提供 signature base 所需业务参数,不能私自改默认组件集
|
|
740
|
+
|
|
741
|
+
允许上层做的只有:
|
|
742
|
+
- 传入业务数据,例如 DID path、handle、group DID、message body、logical target URI
|
|
743
|
+
- 显式选择 SDK 已公开支持的可选参数
|
|
744
|
+
- 在协议升级时,通过升级 SDK 或扩展 SDK API 来变更默认语义
|
|
745
|
+
|
|
746
|
+
明确禁止:
|
|
747
|
+
- 在 `awiki-cli` 内部重新写死 `proofPurpose=authentication`、自定义 group receipt proofPurpose、或自定义 IM proof 默认组件
|
|
748
|
+
- 为了兼容单个后端行为,在命令层偷偷覆盖 SDK 默认安全语义
|
|
749
|
+
- 在多个模块各自维护一份“默认协议常量表”
|
|
750
|
+
|
|
751
|
+
判断标准:凡是同一能力需要在 Go / Python 两个客户端上保持一致时,默认应收敛到 SDK;若语义只存在于 `awiki-cli` 仓库而不在 SDK 中,就视为架构风险。
|
|
752
|
+
|
|
753
|
+
## 15.5 凭证与密钥存储策略
|
|
754
|
+
|
|
755
|
+
建议采用分层存储:
|
|
756
|
+
|
|
757
|
+
### A. 文件存储
|
|
758
|
+
适合:
|
|
759
|
+
- DID 私钥
|
|
760
|
+
- identity metadata
|
|
761
|
+
- 可迁移密钥材料
|
|
762
|
+
|
|
763
|
+
### B. keychain 存储
|
|
764
|
+
适合:
|
|
765
|
+
- bearer-like token
|
|
766
|
+
- 本地 daemon token
|
|
767
|
+
- 会话级临时机密
|
|
768
|
+
|
|
769
|
+
### C. 权限与目录要求
|
|
770
|
+
- identity 目录权限最小化
|
|
771
|
+
- 文件只对当前用户可读写
|
|
772
|
+
- 日志与错误输出自动脱敏
|
|
773
|
+
|
|
774
|
+
## 15.6 需要用户确认的动作
|
|
775
|
+
|
|
776
|
+
必须确认:
|
|
777
|
+
- 创建 identity / 注册 Handle / 绑定联系方式
|
|
778
|
+
- 发消息 / 加群 / 退群 / 踢人
|
|
779
|
+
- follow / unfollow
|
|
780
|
+
- 页面发布
|
|
781
|
+
- 运行时模式切换
|
|
782
|
+
- listener 安装与服务变更
|
|
783
|
+
|
|
784
|
+
---
|
|
785
|
+
|
|
786
|
+
## 16. 本地数据与迁移架构
|
|
787
|
+
|
|
788
|
+
## 16.1 数据层职责
|
|
789
|
+
|
|
790
|
+
本地状态分三类:
|
|
791
|
+
|
|
792
|
+
### 1. identity store
|
|
793
|
+
管理身份、索引、密钥与 metadata
|
|
794
|
+
|
|
795
|
+
### 2. local SQLite store
|
|
796
|
+
保存:
|
|
797
|
+
- messages
|
|
798
|
+
- contacts
|
|
799
|
+
- groups
|
|
800
|
+
- group_members
|
|
801
|
+
- relationship_events
|
|
802
|
+
- secure outbox / state
|
|
803
|
+
|
|
804
|
+
### 3. runtime state
|
|
805
|
+
保存:
|
|
806
|
+
- mode
|
|
807
|
+
- listener config
|
|
808
|
+
- daemon token
|
|
809
|
+
- service state
|
|
810
|
+
- heartbeat state
|
|
811
|
+
|
|
812
|
+
## 16.2 设计要求
|
|
813
|
+
|
|
814
|
+
- 继续保留 `owner_did` 隔离思想
|
|
815
|
+
- 多 identity 并行不互相污染
|
|
816
|
+
- 群组与联系人沉淀继续保留
|
|
817
|
+
- local cache 与 remote fetch 有明确边界
|
|
818
|
+
|
|
819
|
+
## 16.3 v1 → v2 迁移
|
|
820
|
+
|
|
821
|
+
建议提供:
|
|
822
|
+
|
|
823
|
+
```bash
|
|
824
|
+
awiki-cli migrate from-v1
|
|
825
|
+
```
|
|
826
|
+
|
|
827
|
+
迁移内容包括:
|
|
828
|
+
- identity layout
|
|
829
|
+
- SQLite 数据导入
|
|
830
|
+
- owner_did 归属修正
|
|
831
|
+
- group / relationship / secure outbox 导入
|
|
832
|
+
- listener / runtime 配置迁移
|
|
833
|
+
|
|
834
|
+
---
|
|
835
|
+
|
|
836
|
+
## 17. runtime 与传输架构
|
|
837
|
+
|
|
838
|
+
## 17.1 显式模式
|
|
839
|
+
|
|
840
|
+
v2 继续采用显式运行模式:
|
|
841
|
+
|
|
842
|
+
- `http`
|
|
843
|
+
- `websocket`
|
|
844
|
+
|
|
845
|
+
## 17.2 websocket 模式
|
|
846
|
+
|
|
847
|
+
原则:
|
|
848
|
+
- listener 持有唯一远端 WebSocket 连接
|
|
849
|
+
- 其他命令通过本地 IPC 与 listener 协作
|
|
850
|
+
- inbox 由 listener 管理的本地缓存提供
|
|
851
|
+
- 协议控制消息自动处理
|
|
852
|
+
|
|
853
|
+
## 17.3 http 模式
|
|
854
|
+
|
|
855
|
+
原则:
|
|
856
|
+
- 业务命令直接走 HTTP JSON-RPC
|
|
857
|
+
- listener 关闭
|
|
858
|
+
- 模型更简单,适合通用环境
|
|
859
|
+
|
|
860
|
+
## 17.4 本地 IPC
|
|
861
|
+
|
|
862
|
+
建议优先:
|
|
863
|
+
- Unix Domain Socket(Linux/macOS)
|
|
864
|
+
- Named Pipe(Windows)
|
|
865
|
+
|
|
866
|
+
必要时回退 localhost,但不是首选方案。
|
|
867
|
+
|
|
868
|
+
## 17.5 heartbeat
|
|
869
|
+
|
|
870
|
+
heartbeat 继续保留,但职责清晰化:
|
|
871
|
+
- 作为 session-level 周期检查机制
|
|
872
|
+
- 用于未读、JWT、secure state、watch groups 的检查
|
|
873
|
+
- 不替代 listener
|
|
874
|
+
- 不隐式执行业务写操作
|
|
875
|
+
|
|
876
|
+
---
|
|
877
|
+
|
|
878
|
+
## 18. 代码与文档生成策略
|
|
879
|
+
|
|
880
|
+
## 18.1 元数据驱动
|
|
881
|
+
|
|
882
|
+
建议为命令定义统一 metadata,并用它生成:
|
|
883
|
+
|
|
884
|
+
- Cobra help
|
|
885
|
+
- docs 内容
|
|
886
|
+
- schema 输出
|
|
887
|
+
- README 示例
|
|
888
|
+
- skill 引用片段
|
|
889
|
+
- CI 校验项
|
|
890
|
+
|
|
891
|
+
## 18.2 目标
|
|
892
|
+
|
|
893
|
+
实现:
|
|
894
|
+
- 一处定义,多处生成
|
|
895
|
+
- 防止 help / README / skill 漂移
|
|
896
|
+
- 提升 AI 与人类使用的一致性
|
|
897
|
+
|
|
898
|
+
---
|
|
899
|
+
|
|
900
|
+
## 19. 风险、冲突与待决策项
|
|
901
|
+
|
|
902
|
+
## 19.1 E2EE 规范冲突
|
|
903
|
+
当前资料中存在:
|
|
904
|
+
- HPKE / X25519 / chain ratchet 说法
|
|
905
|
+
- secp256r1 + AES-GCM 说法
|
|
906
|
+
|
|
907
|
+
必须在实现前冻结唯一协议规范。
|
|
908
|
+
|
|
909
|
+
## 19.2 identity 命名冻结
|
|
910
|
+
需要统一:
|
|
911
|
+
- 用户层使用 `identity`
|
|
912
|
+
- 底层兼容旧 `credential` 概念
|
|
913
|
+
|
|
914
|
+
## 19.3 group discovery 的默认行为
|
|
915
|
+
需要明确:
|
|
916
|
+
- 是显式 workflow
|
|
917
|
+
- 还是 join 后自动进入流程
|
|
918
|
+
|
|
919
|
+
建议 v2 改为显式 workflow。
|
|
920
|
+
|
|
921
|
+
## 19.4 CLI 与 OpenClaw 插件拆仓时机
|
|
922
|
+
v2 初期可先单仓,待命令树和 runtime 稳定后再拆。
|
|
923
|
+
|
|
924
|
+
---
|
|
925
|
+
|
|
926
|
+
## 20. 实施路线图
|
|
927
|
+
|
|
928
|
+
## Phase 0:冻结与审计
|
|
929
|
+
- 冻结 v1
|
|
930
|
+
- 编写 ADR
|
|
931
|
+
- 建立能力对照表
|
|
932
|
+
- 冻结协议与 identity 术语
|
|
933
|
+
|
|
934
|
+
## Phase 1:CLI 产品壳
|
|
935
|
+
- `awiki-cli`
|
|
936
|
+
- `docs`
|
|
937
|
+
- `schema`
|
|
938
|
+
- `doctor`
|
|
939
|
+
- 输出协议
|
|
940
|
+
- GoReleaser 基础链路
|
|
941
|
+
|
|
942
|
+
## Phase 2:Identity 域
|
|
943
|
+
- create / register / bind / resolve / recover / profile
|
|
944
|
+
- 多 identity
|
|
945
|
+
- v1 identity import
|
|
946
|
+
|
|
947
|
+
## Phase 3:Messaging / Group 域
|
|
948
|
+
- msg send / inbox / history
|
|
949
|
+
- group create / join / members / messages
|
|
950
|
+
- 本地 SQLite v2
|
|
951
|
+
|
|
952
|
+
## Phase 4:Secure 域
|
|
953
|
+
- E2EE 引擎
|
|
954
|
+
- auto-processing
|
|
955
|
+
- outbox retry / drop
|
|
956
|
+
|
|
957
|
+
## Phase 5:Runtime 域
|
|
958
|
+
- http / websocket
|
|
959
|
+
- listener / IPC / daemon
|
|
960
|
+
- service install / start / stop
|
|
961
|
+
|
|
962
|
+
## Phase 6:扩展域
|
|
963
|
+
- people
|
|
964
|
+
- page
|
|
965
|
+
- debug
|
|
966
|
+
- discovery 显式化
|
|
967
|
+
|
|
968
|
+
## Phase 7:Skill 与文档体系
|
|
969
|
+
- shared + domain skills
|
|
970
|
+
- docs / skill / help / schema 联动生成
|
|
971
|
+
|
|
972
|
+
## Phase 8:发布与切换
|
|
973
|
+
- GitHub Releases
|
|
974
|
+
- npm wrapper
|
|
975
|
+
- Homebrew
|
|
976
|
+
- v1 → v2 迁移指南
|
|
977
|
+
|
|
978
|
+
---
|
|
979
|
+
|
|
980
|
+
## 21. 验收标准
|
|
981
|
+
|
|
982
|
+
当以下条件全部满足时,可认为 awiki v2 架构目标成立:
|
|
983
|
+
|
|
984
|
+
1. 所有核心能力都通过 `awiki-cli` 统一入口暴露
|
|
985
|
+
2. 核心命令无需依赖外部 skill 即可被发现、理解和诊断
|
|
986
|
+
3. 多 identity 成为一等能力
|
|
987
|
+
4. direct / group / secure / runtime 语义边界清晰
|
|
988
|
+
5. JSON 输出、schema、doctor、dry-run 形成统一协议
|
|
989
|
+
6. `http` / `websocket` 模式切换清晰、可诊断
|
|
990
|
+
7. v1 本地数据可迁移
|
|
991
|
+
8. 文档、help、skill、schema 基于统一元数据生成
|
|
992
|
+
9. 至少支持 macOS / Linux / Windows 多平台稳定发布
|
|
993
|
+
10. 安全规则可在 CLI、skill、runtime 三层一致落实
|
|
994
|
+
|
|
995
|
+
---
|
|
996
|
+
|
|
997
|
+
## 22. 结论
|
|
998
|
+
|
|
999
|
+
awiki v2 不是对现有 Python skill 仓的增量修补,而是一轮完整的产品化重构。
|
|
1000
|
+
|
|
1001
|
+
本次架构设计的核心结论是:
|
|
1002
|
+
|
|
1003
|
+
- **以 Go 单二进制 CLI 为核心重建产品面**
|
|
1004
|
+
- **保留 awiki 的 DID / Handle / E2EE / 多 identity / heartbeat / local store 优势**
|
|
1005
|
+
- **吸收飞书的统一 CLI、shared skill、三层命令、自省与分发思路**
|
|
1006
|
+
- **避免飞书在文档依赖、profile 不一等、上下文过重方面暴露的问题**
|
|
1007
|
+
- **让 CLI、skill、runtime、文档、分发成为一个一致的系统,而不是脚本集合**
|
|
1008
|
+
|
|
1009
|
+
这将使 awiki 从“可工作的 skill 仓”演进为“可分发、可扩展、可被 AI 稳定调用的 agent-native 基础设施产品”。
|
|
1010
|
+
|
|
1011
|
+
---
|
|
1012
|
+
|
|
1013
|
+
## 附录 A:建议的 skill 划分
|
|
1014
|
+
|
|
1015
|
+
```text
|
|
1016
|
+
skills/
|
|
1017
|
+
awiki-bundle/
|
|
1018
|
+
awiki-shared/
|
|
1019
|
+
awiki-id/
|
|
1020
|
+
awiki-msg/
|
|
1021
|
+
awiki-group/
|
|
1022
|
+
awiki-runtime/
|
|
1023
|
+
awiki-people/
|
|
1024
|
+
awiki-page/
|
|
1025
|
+
awiki-debug/
|
|
1026
|
+
awiki-workflow-onboarding/
|
|
1027
|
+
awiki-workflow-discovery/
|
|
1028
|
+
```
|
|
1029
|
+
|
|
1030
|
+
## 附录 B:建议的核心顶层命令
|
|
1031
|
+
|
|
1032
|
+
```text
|
|
1033
|
+
awiki-cli status
|
|
1034
|
+
awiki-cli docs
|
|
1035
|
+
awiki-cli schema
|
|
1036
|
+
awiki-cli doctor
|
|
1037
|
+
awiki-cli version
|
|
1038
|
+
awiki-cli completion
|
|
1039
|
+
awiki-cli config
|
|
1040
|
+
awiki-cli id
|
|
1041
|
+
awiki-cli msg
|
|
1042
|
+
awiki-cli group
|
|
1043
|
+
awiki-cli people
|
|
1044
|
+
awiki-cli page
|
|
1045
|
+
awiki-cli runtime
|
|
1046
|
+
awiki-cli debug
|
|
1047
|
+
```
|
|
1048
|
+
|
|
1049
|
+
## 附录 C:本架构文档对 CLI 基础资料的处理说明
|
|
1050
|
+
|
|
1051
|
+
本架构文档吸收了两份 CLI 基础资料中的以下方向:
|
|
1052
|
+
|
|
1053
|
+
- 统一命令树
|
|
1054
|
+
- JSON 为主的输出协议
|
|
1055
|
+
- `schema` / `doctor` / `--dry-run`
|
|
1056
|
+
- 命令分层
|
|
1057
|
+
- shared + domain 的 skill 思路
|
|
1058
|
+
|
|
1059
|
+
但已做出以下统一修正:
|
|
1060
|
+
|
|
1061
|
+
- **实现语言统一为 Go**
|
|
1062
|
+
- **CLI 细节留给单独 CLI 规范文档**
|
|
1063
|
+
- **本文件只保留架构级别约束与方向**
|