@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.
Files changed (119) hide show
  1. package/.github/workflows/release.yml +44 -0
  2. package/.goreleaser.yml +44 -0
  3. package/AGENTS.md +60 -0
  4. package/CLAUDE.md +192 -0
  5. package/README.md +2 -0
  6. package/docs/architecture/awiki-command-v2.md +955 -0
  7. package/docs/architecture/awiki-skill-architecture.md +475 -0
  8. package/docs/architecture/awiki-v2-architecture.md +1063 -0
  9. package/docs/architecture//345/217/202/350/200/203/346/226/207/346/241/243/cli-init.md +1008 -0
  10. package/docs/architecture//345/217/202/350/200/203/346/226/207/346/241/243/output-format.md +407 -0
  11. package/docs/architecture//345/217/202/350/200/203/346/226/207/346/241/243/overall-init.md +741 -0
  12. package/docs/harness/review-spec.md +474 -0
  13. package/docs/installation.md +372 -0
  14. package/docs/plan/awiki-v2-implementation-plan.md +903 -0
  15. package/docs/plan/phase-0/adr-index.md +56 -0
  16. package/docs/plan/phase-0/audit-findings.md +251 -0
  17. package/docs/plan/phase-0/capability-mapping.md +108 -0
  18. package/docs/plan/phase-0/implementation-constraints.md +363 -0
  19. package/docs/publish.md +169 -0
  20. package/go.mod +29 -0
  21. package/go.sum +73 -0
  22. package/internal/anpsdk/registry.go +63 -0
  23. package/internal/authsdk/session.go +351 -0
  24. package/internal/buildinfo/buildinfo.go +34 -0
  25. package/internal/cli/app.go +136 -0
  26. package/internal/cli/app_test.go +88 -0
  27. package/internal/cli/debug.go +104 -0
  28. package/internal/cli/group.go +263 -0
  29. package/internal/cli/id.go +473 -0
  30. package/internal/cli/init.go +134 -0
  31. package/internal/cli/msg.go +228 -0
  32. package/internal/cli/page.go +267 -0
  33. package/internal/cli/root.go +499 -0
  34. package/internal/cli/runtime.go +232 -0
  35. package/internal/cli/upgrade.go +60 -0
  36. package/internal/cmdmeta/catalog.go +203 -0
  37. package/internal/cmdmeta/catalog_test.go +21 -0
  38. package/internal/config/config.go +399 -0
  39. package/internal/config/config_test.go +104 -0
  40. package/internal/config/write.go +37 -0
  41. package/internal/content/service.go +314 -0
  42. package/internal/content/service_test.go +165 -0
  43. package/internal/content/types.go +44 -0
  44. package/internal/docs/topics.go +110 -0
  45. package/internal/doctor/doctor.go +306 -0
  46. package/internal/identity/client.go +267 -0
  47. package/internal/identity/did.go +85 -0
  48. package/internal/identity/did_test.go +50 -0
  49. package/internal/identity/layout.go +206 -0
  50. package/internal/identity/legacy.go +378 -0
  51. package/internal/identity/public.go +70 -0
  52. package/internal/identity/public_test.go +73 -0
  53. package/internal/identity/readiness.go +74 -0
  54. package/internal/identity/service.go +826 -0
  55. package/internal/identity/store.go +385 -0
  56. package/internal/identity/store_test.go +180 -0
  57. package/internal/identity/types.go +204 -0
  58. package/internal/message/auth.go +167 -0
  59. package/internal/message/group_service.go +838 -0
  60. package/internal/message/group_wire.go +350 -0
  61. package/internal/message/group_wire_test.go +67 -0
  62. package/internal/message/helpers.go +61 -0
  63. package/internal/message/http_client.go +334 -0
  64. package/internal/message/proof.go +156 -0
  65. package/internal/message/proof_test.go +61 -0
  66. package/internal/message/service.go +696 -0
  67. package/internal/message/service_test.go +97 -0
  68. package/internal/message/types.go +155 -0
  69. package/internal/message/wire.go +100 -0
  70. package/internal/message/wire_test.go +49 -0
  71. package/internal/message/ws_proxy_client.go +151 -0
  72. package/internal/output/output.go +350 -0
  73. package/internal/output/output_test.go +48 -0
  74. package/internal/runtime/config.go +117 -0
  75. package/internal/runtime/config_test.go +46 -0
  76. package/internal/runtime/listener/files.go +65 -0
  77. package/internal/runtime/listener/manager.go +142 -0
  78. package/internal/runtime/listener/server.go +983 -0
  79. package/internal/runtime/listener/server_test.go +319 -0
  80. package/internal/runtime/listener/sysproc_unix.go +17 -0
  81. package/internal/runtime/listener/sysproc_windows.go +13 -0
  82. package/internal/runtime/listener/types.go +21 -0
  83. package/internal/runtime/listener/wsclient.go +299 -0
  84. package/internal/runtime/listener/wsclient_test.go +41 -0
  85. package/internal/store/dao.go +632 -0
  86. package/internal/store/dao_test.go +87 -0
  87. package/internal/store/helpers.go +197 -0
  88. package/internal/store/import.go +499 -0
  89. package/internal/store/import_test.go +103 -0
  90. package/internal/store/open.go +71 -0
  91. package/internal/store/query.go +151 -0
  92. package/internal/store/schema.go +277 -0
  93. package/internal/store/schema_test.go +56 -0
  94. package/internal/store/types.go +177 -0
  95. package/internal/update/update.go +368 -0
  96. package/package.json +17 -0
  97. package/scripts/install.js +171 -0
  98. package/scripts/release/release-prerelease.sh +86 -0
  99. package/scripts/release/tag-release.sh +66 -0
  100. package/scripts/release/withdraw-release.sh +78 -0
  101. package/scripts/run.js +69 -0
  102. package/skills/README.md +32 -0
  103. package/skills/awiki-bundle/SKILL.md +76 -0
  104. package/skills/awiki-debug/SKILL.md +80 -0
  105. package/skills/awiki-group/SKILL.md +111 -0
  106. package/skills/awiki-id/SKILL.md +123 -0
  107. package/skills/awiki-msg/SKILL.md +131 -0
  108. package/skills/awiki-page/SKILL.md +93 -0
  109. package/skills/awiki-people/SKILL.md +66 -0
  110. package/skills/awiki-runtime/SKILL.md +137 -0
  111. package/skills/awiki-shared/SKILL.md +124 -0
  112. package/skills/awiki-workflow-discovery/SKILL.md +93 -0
  113. package/skills/awiki-workflow-onboarding/SKILL.md +119 -0
  114. package/skills/manifests/skills.yaml +260 -0
  115. package/skills/templates/bundle-skill-template.md +42 -0
  116. package/skills/templates/debug-skill-template.md +44 -0
  117. package/skills/templates/domain-skill-template.md +56 -0
  118. package/skills/templates/shared-skill-template.md +46 -0
  119. 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
+ - **本文件只保留架构级别约束与方向**