@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,474 @@
|
|
|
1
|
+
# awiki-cli Harness Review 规范
|
|
2
|
+
|
|
3
|
+
## 1. 文档定位
|
|
4
|
+
|
|
5
|
+
本文是 `awiki-cli` 的 **二级 review 规范文档**,用于给人类 reviewer、AI reviewer、自动化 harness 提供一份可快速执行的审查索引。
|
|
6
|
+
|
|
7
|
+
它的目标不是替代源文档,而是解决两个问题:
|
|
8
|
+
|
|
9
|
+
1. **先看什么**:当 PR 涉及命令面、配置、输出、identity、runtime、storage、API 对接时,应该先看哪些文档。
|
|
10
|
+
2. **先查什么**:每类改动的 review 关键项、不可违反的约束、以及进一步确认时要回读的源文档路径。
|
|
11
|
+
|
|
12
|
+
使用原则:
|
|
13
|
+
|
|
14
|
+
- 先按本文做 **一级筛查**。
|
|
15
|
+
- 某条规则不清晰时,再按本文给出的路径去读 **一级源文档**。
|
|
16
|
+
- 若本文与冻结文档冲突,以冻结文档为准。
|
|
17
|
+
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
## 2. Review 裁决优先级
|
|
21
|
+
|
|
22
|
+
实现与 review 的冲突裁决顺序,按 `docs/plan/phase-0/implementation-constraints.md` 冻结结果执行:
|
|
23
|
+
|
|
24
|
+
1. `docs/plan/phase-0/implementation-constraints.md`
|
|
25
|
+
2. `docs/plan/phase-0/audit-findings.md`
|
|
26
|
+
3. `docs/plan/awiki-v2-implementation-plan.md`
|
|
27
|
+
4. `docs/architecture/awiki-command-v2.md`
|
|
28
|
+
5. `docs/architecture/awiki-v2-architecture.md`
|
|
29
|
+
6. `docs/architecture/output-format.md`
|
|
30
|
+
7. `../user-service/docs/api/`
|
|
31
|
+
8. `../message-service/docs/api/`
|
|
32
|
+
9. `../awiki-agent-id-message/`
|
|
33
|
+
10. `../cli/`
|
|
34
|
+
|
|
35
|
+
补充说明:
|
|
36
|
+
|
|
37
|
+
- `docs/architecture/cli-init.md`
|
|
38
|
+
- `docs/architecture/overall-init.md`
|
|
39
|
+
|
|
40
|
+
这两份文档都已明确标注 **已过时**,只能用于回溯设计演进,**不能作为当前 review 的判定真相**。
|
|
41
|
+
|
|
42
|
+
---
|
|
43
|
+
|
|
44
|
+
## 3. 依赖与参考地图
|
|
45
|
+
|
|
46
|
+
本节按“冻结约束 / 架构设计 / API 契约 / 协议与 legacy 基线 / 外部产品参考 / 当前仓库实现锚点”分门别类整理。
|
|
47
|
+
|
|
48
|
+
### 3.1 冻结约束与架构真相
|
|
49
|
+
|
|
50
|
+
| 路径 | 类型 | review 关注点 | 核心约束摘要 |
|
|
51
|
+
|---|---|---|---|
|
|
52
|
+
| `docs/plan/phase-0/implementation-constraints.md` | 冻结约束 | **最高优先级** | canonical 顶级命令、`group` 顶级归属、全局 flags、输出 envelope、错误码/退出码、AWIKI_HOME 工作目录与 config.json(仅支持 AWIKI_HOME 或默认根,不再使用 home.json 指针)、`AWIKI_*` 环境变量集合、`owner_did`、Phase 边界全部以此为准。 |
|
|
53
|
+
| `docs/plan/phase-0/audit-findings.md` | 冻结裁决 | 冲突消歧 | 解决了 `group` vs `msg group`、`AWIKI_*` vs `AVIKI_*`、顶级 `api` 是否暴露、`e2ee_outbox` 是否必保留、XDG 与 `.openclaw` 兼容、pure Go / no CGO 等冲突。 |
|
|
54
|
+
| `docs/plan/phase-0/adr-index.md` | ADR 索引 | 规则引用 | 用于快速确认哪类问题已经被冻结,不必每次重新讨论。 |
|
|
55
|
+
| `docs/plan/phase-0/capability-mapping.md` | 能力映射 | 改动溯源 | v2 命令与 v1 脚本、user-service / message-service API 的映射关系,适合 review“改动有没有脱离既定能力映射”。 |
|
|
56
|
+
| `docs/plan/awiki-v2-implementation-plan.md` | 实施基线 | 阶段与模块边界 | 规定 Phase 1~5/7 的实现次序、目录结构、参考基线、优先级与迁移目标。 |
|
|
57
|
+
| `docs/architecture/awiki-v2-architecture.md` | 总体架构 | 设计原则 | 意图优先、小核心强边界、CLI 独立于 skill、结构化优先、安全前置、多 identity 一等公民、显式 runtime、文档即产品。 |
|
|
58
|
+
| `docs/architecture/awiki-command-v2.md` | 命令设计 | 命令与参数层 | 统一命令树、消息三维模型、shortcut 原则、命令/参数命名、schema/self-describing CLI 设计。 |
|
|
59
|
+
| `docs/architecture/output-format.md` | 输出协议 | 输出与机器契约 | canonical return 是 JSON;`pretty/table/ndjson` 是渲染层;统一 `ok/data/error/_notice/meta`,并要求 `--jq`、`--dry-run`。 |
|
|
60
|
+
|
|
61
|
+
### 3.2 user-service API 依赖
|
|
62
|
+
|
|
63
|
+
| 路径 | 覆盖域 | review 关注点 | 核心约束摘要 |
|
|
64
|
+
|---|---|---|---|
|
|
65
|
+
| `../user-service/docs/api/README.md` | 总入口 | API 入口与路径 | 区分 `/user-service/...`、`/content/rpc`、`/group/rpc` 等顶层例外路径;明确 DID / JWT 两套认证面。 |
|
|
66
|
+
| `../user-service/docs/api/authentication.md` | auth / bind | 注册与绑定 | 手机号统一 E.164;短信/邮箱验证流分离;绑定接口要求 Bearer JWT;手机号冲突与限流是显式错误。 |
|
|
67
|
+
| `../user-service/docs/api/did-auth.md` | DID 注册 / 验证 | DID 认证流 | `register` 只用于首次注册;已有 DID 更新必须走 `update_document`;DID domain 必须匹配服务域;proof/challenge/timestamp 要校验;主公钥不可漂移。 |
|
|
68
|
+
| `../user-service/docs/api/handle.md` | handle | handle 生命周期 | `lookup` 支持 handle/did 二选一;`get_quota` 只能查当前 DID 已绑定手机号;默认每手机号 3 个 handle;邮箱注册受白名单限制。 |
|
|
69
|
+
| `../user-service/docs/api/did-profile.md` | DID Profile | DID 资料面 | DID JWT 认证下的 `get_me/update_me/get_public_profile/resolve`;`profile_url` 优先走 handle 子域;`profile_md` 读取时可能注入邀请码块。 |
|
|
70
|
+
| `../user-service/docs/api/profile.md` | User Profile | 传统资料面 | 字段限制:`tags <= 10`、`bio <= 200`、`profile_md <= 50000`;公开资料与私有字段边界必须清晰。 |
|
|
71
|
+
| `../user-service/docs/api/relationships.md` | relationships | 社交关系 | 不能 follow/block 自己;block 会打断双向关系;`get_followers/get_following` 是用户关系,不是 group/member 关系。 |
|
|
72
|
+
| `../user-service/docs/api/group.md` | group | 群组领域真相 | 群是独立领域对象;入群码是全局唯一 6 位数字;只有 active 成员可查看详情/成员/消息/发送;owner 不能 leave / kick 自己;member 配额与累计字符在重入后不清零。 |
|
|
73
|
+
| `../user-service/docs/api/content.md` | page/content | 内容页 | 页面跟 handle,不跟 user_id;每个 handle 最多 5 页;slug 有正则和保留词限制;`public/draft/unlisted` 语义必须保持。 |
|
|
74
|
+
|
|
75
|
+
### 3.3 message-service API 与协议依赖
|
|
76
|
+
|
|
77
|
+
| 路径 | 覆盖域 | review 关注点 | 核心约束摘要 |
|
|
78
|
+
|---|---|---|---|
|
|
79
|
+
| `../message-service/docs/api/ANP-client-server-api-direct.md` | direct / direct-e2ee | 私聊协议 | 区分 hop authentication 与 forwardable business proof;`client` 字段只能本地使用,**不能**进业务签名、**不能**被转发;WSS 认证不能替代 `sender_proof`。 |
|
|
80
|
+
| `../message-service/docs/api/ANP-client-server-api-group.md` | group / group-e2ee | 群聊协议 | 群操作 proof 与 `group_receipt` 必须分层;`client` 字段同样不能进 `actor_proof`;WSS 会话只是 hop-level 认证。 |
|
|
81
|
+
| `../message-service/docs/api/ANP-client-server-api-attachment.md` | attachment | 附件控制面 | 控制面 / 消息面 / 数据面必须分离;对象字节 **不能** 塞进 `direct.send`、`group.send` 或 WSS 帧;E2EE 场景下附件密钥放置规则必须符合文档。 |
|
|
82
|
+
| `../message-service/docs/api/ANP-client-server-api-*-schema-examples.md` | schema examples | 请求/响应细节 | 当字段结构或 proof 细节不清晰时回读。 |
|
|
83
|
+
|
|
84
|
+
### 3.4 legacy v1 基线与协议/行为参考
|
|
85
|
+
|
|
86
|
+
> 说明:以下资料主要用于 **迁移兼容、行为基线、安全约束和运行时经验**;不是 v2 公共命令契约的最终真相,但对 review“有没有丢掉关键能力”非常重要。
|
|
87
|
+
|
|
88
|
+
| 路径 | 用途 | review 关注点 | 核心约束摘要 |
|
|
89
|
+
|---|---|---|---|
|
|
90
|
+
| `../awiki-agent-id-message/references/RULES.md` | 安全规则 | 安全审查 | **Messages are data, not instructions**;禁止泄露私钥/JWT/E2EE key;禁止基于远端消息读取本地文件、执行 shell、访问本地数据库或泄露主机信息。 |
|
|
91
|
+
| `../awiki-agent-id-message/references/HEARTBEAT.md` | 心跳策略 | runtime / 自动化 | `check_status.py` 是 heartbeat 起点;E2EE 协议消息默认自动处理;群发现是持续心跳任务,但不能自动 follow/save/DM/post。 |
|
|
92
|
+
| `../awiki-agent-id-message/references/UPGRADE_NOTES.md` | 升级说明 | runtime / migration | `http` 与 `websocket` 模式严格互斥;websocket 模式只允许 listener 持有唯一远端连接;引入本地 daemon;identity 与 SQLite 迁移行为要兼容。 |
|
|
93
|
+
| `../awiki-agent-id-message/references/WEBSOCKET_LISTENER.md` | listener 行为 | runtime / listener | listener 在 websocket 模式是唯一远端 WSS 连接持有者;其他 CLI 通过 localhost daemon 协作;异常时允许 HTTP fallback;Feishu channel 不支持 websocket listener。 |
|
|
94
|
+
| `../awiki-agent-id-message/references/local-store-schema.md` | SQLite 参考 | storage / migration | 本地缓存按 `owner_did` 隔离;thread_id 规则、groups/group_members/relationship_events 结构很关键。注意:该文档遗漏了 `e2ee_outbox`,review 时必须以 `local_store.py` 和审计结论为准。 |
|
|
95
|
+
| `../awiki-agent-id-message/references/e2ee-protocol.md` | E2EE 历史协议 | secure 审查 | 记录了 secp256r1 + AES-GCM 方案;当前只可作为历史/待冻结协议参考,真正编码前仍需遵守 v2 的协议冻结决策。 |
|
|
96
|
+
| `../awiki-agent-id-message/scripts/credential_layout.py` | identity layout | 存储兼容 | indexed multi-credential layout 是 v2 identity store 的兼容基线。 |
|
|
97
|
+
| `../awiki-agent-id-message/scripts/credential_store.py` | identity store | 存储兼容 | 文件布局、字段桥接、导入兼容。 |
|
|
98
|
+
| `../awiki-agent-id-message/scripts/local_store.py` | SQLite source of truth | 数据基线 | 是本地 SQLite 的真正 source of truth;`e2ee_outbox`、owner_did 隔离、group cache、relationship_events 都要以它为准。 |
|
|
99
|
+
| `../awiki-agent-id-message/scripts/setup_realtime.py` | runtime setup | runtime | receive mode、listener/install、HTTP/WSS 模式切换的基线参考。 |
|
|
100
|
+
| `../awiki-agent-id-message/scripts/ws_listener.py` | listener | realtime | listener 生命周期、后台服务、webhook 路由与 fallback 行为的参考实现。 |
|
|
101
|
+
| `../awiki-agent-id-message/scripts/e2ee_messaging.py` | secure messaging | Phase 5 | direct E2EE 首发功能、outbox/retry/drop 的参考入口。 |
|
|
102
|
+
| `../awiki-agent-id-message/scripts/manage_group.py` | group | group 生命周期 | create/show/update/join/leave/kick/members/messages/code 的 v1 能力基线。 |
|
|
103
|
+
|
|
104
|
+
### 3.5 外部产品与工程参考(`../cli/`)
|
|
105
|
+
|
|
106
|
+
> 说明:这部分是 **产品化组织方式参考**,不是 awiki 的业务真相。
|
|
107
|
+
|
|
108
|
+
| 路径 | 用途 | review 关注点 | 核心借鉴点 |
|
|
109
|
+
|---|---|---|---|
|
|
110
|
+
| `../cli/cmd/root.go` | 统一 CLI 入口 | 产品面组织 | 统一入口、schema/doctor/completion、更新 notice 注入、shortcuts 与 service 命令注册方式。 |
|
|
111
|
+
| `../cli/cmd/schema/schema.go` | schema 设计 | 自省能力 | schema 是一等能力,帮助系统与命令元数据应结构化、可被机器读取。 |
|
|
112
|
+
| `../cli/cmd/doctor/doctor.go` | doctor 设计 | 诊断产品化 | doctor 不只是报错,而是有 check 列表、hint、offline 模式与最终 summary。 |
|
|
113
|
+
| `../cli/internal/output/envelope.go` | 输出 envelope | 输出统一 | `ok/data/error/_notice/meta` 风格的统一封装。 |
|
|
114
|
+
| `../cli/internal/output/format.go` | 多格式输出 | 输出渲染 | JSON 为协议层,table/csv/ndjson 是渲染层。 |
|
|
115
|
+
| `../cli/internal/output/jq.go` | jq 处理 | jq 契约 | `--jq` 只能作用于 JSON 输出,必须有明确校验与错误处理。 |
|
|
116
|
+
| `../cli/skills/lark-shared/SKILL.md` | shared skill 设计 | 文档分层 | 共享规则、权限、安全、配置初始化放在 shared 层。 |
|
|
117
|
+
| `../cli/skills/lark-im/SKILL.md` | domain skill 设计 | 技能拆分 | shared + domain 技能分层,而不是一个巨型技能文档。 |
|
|
118
|
+
|
|
119
|
+
### 3.6 当前仓库实现锚点(review 当前代码时必看)
|
|
120
|
+
|
|
121
|
+
| 路径 | 当前作用 | review 关注点 |
|
|
122
|
+
|---|---|---|
|
|
123
|
+
| `internal/cmdmeta/catalog.go` | 当前 Phase 1 静态命令元数据目录 | 是否与冻结命令面一致;是否错误地引入新公共命令或错误归属。 |
|
|
124
|
+
| `internal/cli/root.go` | Cobra 根命令与 handler 装配 | 全局 flags、help/handler 装配、当前 Phase 1 已实现能力是否符合 docs。 |
|
|
125
|
+
| `internal/output/output.go` | 统一 success/error envelope 与渲染 | `--format`、`--jq`、`_notice`、table/ndjson 行为是否保持统一。 |
|
|
126
|
+
| `internal/config/config.go` | workdir / env / config 解析 | AWIKI_HOME + 单一工作目录布局、config.json 结构、flag > env (AWIKI_*) > config.json > default 优先级、legacy .openclaw 路径检测是否符合冻结规则。 |
|
|
127
|
+
| `internal/doctor/doctor.go` | 当前 doctor | pure-Go/no-CGO 检查、config/env/identity/sqlite/legacy path 诊断是否符合定位。 |
|
|
128
|
+
| `internal/docs/topics.go` | docs topic 索引 | 内建 docs 主题是否指向正确的一级源文档。 |
|
|
129
|
+
| `CLAUDE.md` | 当前项目上下文摘要 | 当前实现边界、关键文件入口、Phase 1 已有能力范围。 |
|
|
130
|
+
|
|
131
|
+
---
|
|
132
|
+
|
|
133
|
+
## 4. 核心设计思路(review 必须先对齐)
|
|
134
|
+
|
|
135
|
+
Review 任何实现前,必须先对齐下面这些“高阶设计思路”,否则容易在局部优化中破坏整体方向。
|
|
136
|
+
|
|
137
|
+
### 4.1 统一 CLI 产品面,而不是脚本集合
|
|
138
|
+
|
|
139
|
+
- 外部公共入口是 `awiki-cli`。
|
|
140
|
+
- review 要拒绝“重新暴露脚本名作为公共 API”的实现。
|
|
141
|
+
- 命令按用户意图建模,而不是按底层脚本或传输协议建模。
|
|
142
|
+
|
|
143
|
+
### 4.2 小核心、强边界
|
|
144
|
+
|
|
145
|
+
核心主线只有:
|
|
146
|
+
|
|
147
|
+
- `id`
|
|
148
|
+
- `msg`
|
|
149
|
+
- `runtime`
|
|
150
|
+
|
|
151
|
+
其余:
|
|
152
|
+
|
|
153
|
+
- `group`
|
|
154
|
+
- `people`
|
|
155
|
+
- `page`
|
|
156
|
+
- `debug`
|
|
157
|
+
- `discovery`(保留扩展域)
|
|
158
|
+
|
|
159
|
+
都必须服从核心架构,不应反向污染核心命令面。
|
|
160
|
+
|
|
161
|
+
### 4.3 identity 是一等对象
|
|
162
|
+
|
|
163
|
+
- 用户层术语必须使用 `identity`。
|
|
164
|
+
- 存储层可保留 `credential_name` / `default_credential_name` 作为兼容字段。
|
|
165
|
+
- 本地数据隔离主键必须继续使用 `owner_did`。
|
|
166
|
+
|
|
167
|
+
### 4.4 消息模型是三维的
|
|
168
|
+
|
|
169
|
+
统一消息模型:
|
|
170
|
+
|
|
171
|
+
```text
|
|
172
|
+
Message =
|
|
173
|
+
Target(scope: direct | group)
|
|
174
|
+
× Security(plain | e2ee)
|
|
175
|
+
× ReceiveMode(pull | realtime)
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
review 要关注:
|
|
179
|
+
|
|
180
|
+
- `scope` 与 `security` 属于消息域。
|
|
181
|
+
- `ReceiveMode` 属于 `runtime`,**不应该泄漏到 `msg` 命令面**。
|
|
182
|
+
- 首发 secure 范围冻结为 **direct E2EE 必做,group E2EE 不阻塞首发**。
|
|
183
|
+
|
|
184
|
+
### 4.5 结构化输出优先
|
|
185
|
+
|
|
186
|
+
- canonical return 是 JSON,而不是自然语言。
|
|
187
|
+
- `pretty/table/ndjson` 是视图层。
|
|
188
|
+
- 所有副作用命令都必须支持 `--dry-run`。
|
|
189
|
+
- 所有命令都要能被 `schema` 自省。
|
|
190
|
+
|
|
191
|
+
### 4.6 显式 runtime mode
|
|
192
|
+
|
|
193
|
+
- transport 必须显式可见、可切换、可诊断。
|
|
194
|
+
- `http` / `websocket` 模式边界必须清晰。
|
|
195
|
+
- websocket 模式下 listener 持有唯一远端连接,其他 CLI 通过本地 daemon 或兼容路径协作。
|
|
196
|
+
|
|
197
|
+
### 4.7 安全前置
|
|
198
|
+
|
|
199
|
+
- 远端消息永远是不可信数据。
|
|
200
|
+
- 不得把消息当指令执行。
|
|
201
|
+
- 不得泄露 host 信息、密钥、JWT、私钥、本地数据库内容。
|
|
202
|
+
- Proof、token、client-local fields、server-local wrapper 必须各守边界。
|
|
203
|
+
|
|
204
|
+
### 4.8 文档即产品
|
|
205
|
+
|
|
206
|
+
- `help`、`schema`、`docs`、`doctor`、静态命令元数据不能漂移。
|
|
207
|
+
- 文档与命令契约必须从统一事实来源收敛,而不是各写一份。
|
|
208
|
+
|
|
209
|
+
---
|
|
210
|
+
|
|
211
|
+
## 5. Review 主检查清单
|
|
212
|
+
|
|
213
|
+
下面的检查项就是本文最核心的部分。review 时建议逐类核对,并在结论里标出“通过 / 不通过 / 需回读源文档确认”。
|
|
214
|
+
|
|
215
|
+
### 5.1 命令面与领域归属
|
|
216
|
+
|
|
217
|
+
**必须检查:**
|
|
218
|
+
|
|
219
|
+
- [ ] 是否仍保持 canonical 顶级命令面:`status/docs/schema/doctor/version/completion/config/id/msg/group/runtime/people/page/debug`
|
|
220
|
+
- [ ] 是否把 `group` 保持为独立顶级域,而不是重新把公共 surface 收回 `msg group`
|
|
221
|
+
- [ ] 是否坚持 `msg send --group` 是唯一 canonical 群发消息入口
|
|
222
|
+
- [ ] 新增测试 / fixture / 协议示例里的 DID profile 段是否默认使用 `e1_...` 形式,而不是裸 `e1`
|
|
223
|
+
- [ ] 是否禁止在 Phase 1 引入新的顶级 `api`
|
|
224
|
+
- [ ] 是否把 transport 参数错误地放进 `msg` / `group` 命令面
|
|
225
|
+
- [ ] 是否引入 shortcut 独占语义(不允许)
|
|
226
|
+
|
|
227
|
+
**不可违反的约束:**
|
|
228
|
+
|
|
229
|
+
- `group` 是独立领域对象,不只是消息目标。
|
|
230
|
+
- `msg group ...` 最多只能做兼容 alias,不能成为主 surface。
|
|
231
|
+
- shortcut 只能是 alias,不能形成第二套命令语义。
|
|
232
|
+
- 新增本地测试数据和 DID 示例默认使用 `e1_alice` / `e1_group` 这类 `e1_...` profile 后缀。
|
|
233
|
+
|
|
234
|
+
**回读路径:**
|
|
235
|
+
|
|
236
|
+
- `docs/plan/phase-0/implementation-constraints.md`
|
|
237
|
+
- `docs/plan/phase-0/audit-findings.md`
|
|
238
|
+
- `docs/architecture/awiki-command-v2.md`
|
|
239
|
+
- `internal/cmdmeta/catalog.go`
|
|
240
|
+
|
|
241
|
+
### 5.2 输出协议、全局 flags、schema / dry-run
|
|
242
|
+
|
|
243
|
+
**必须检查:**
|
|
244
|
+
|
|
245
|
+
- [ ] 全局格式参数是否仍然是 `--format`
|
|
246
|
+
- [ ] identity 选择参数是否仍然是 `--identity`
|
|
247
|
+
- [ ] 是否保留 `--jq` 与 `--dry-run`
|
|
248
|
+
- [ ] 输出 envelope 是否仍然使用 `ok`, `data` / `error`, `_notice`, `meta`
|
|
249
|
+
- [ ] 是否有命令绕过统一 envelope 直接输出自由文本
|
|
250
|
+
- [ ] `--jq` 是否只作用在 JSON 契约之上
|
|
251
|
+
- [ ] 表格、ndjson 是否只是 JSON 的渲染视图,而不是第二套语义
|
|
252
|
+
|
|
253
|
+
**不可违反的约束:**
|
|
254
|
+
|
|
255
|
+
- `notice` 不是 canonical 字段,必须使用 `_notice`
|
|
256
|
+
- 所有副作用命令必须支持 `--dry-run`
|
|
257
|
+
- schema 是一等能力,不是文档附件
|
|
258
|
+
|
|
259
|
+
**回读路径:**
|
|
260
|
+
|
|
261
|
+
- `docs/architecture/output-format.md`
|
|
262
|
+
- `docs/plan/phase-0/implementation-constraints.md`
|
|
263
|
+
- `internal/output/output.go`
|
|
264
|
+
- `../cli/internal/output/envelope.go`
|
|
265
|
+
- `../cli/internal/output/jq.go`
|
|
266
|
+
|
|
267
|
+
### 5.3 identity / config / env / path / migration
|
|
268
|
+
|
|
269
|
+
**必须检查:**
|
|
270
|
+
|
|
271
|
+
- [ ] 用户接口是否始终使用 `identity` 术语
|
|
272
|
+
- [ ] 存储兼容字段是否仍能桥接 v1 的 `credential_*`
|
|
273
|
+
- [ ] XDG 原生路径是否保持:
|
|
274
|
+
- `~/.config/awiki-cli/`
|
|
275
|
+
- `~/.local/share/awiki-cli/`
|
|
276
|
+
- `~/.local/state/awiki-cli/`
|
|
277
|
+
- `~/.cache/awiki-cli/`
|
|
278
|
+
- [ ] 环境变量是否仍遵循优先级:`flag > env (AWIKI_*) > config.json > default`
|
|
279
|
+
- [ ] 是否仍然只检测 legacy `.openclaw` 路径而非默认原地写回
|
|
280
|
+
- [ ] 正式迁移入口是否仍为 `awiki-cli migrate from-v1`
|
|
281
|
+
|
|
282
|
+
**不可违反的约束:**
|
|
283
|
+
|
|
284
|
+
- canonical 环境变量前缀是 `AWIKI_*`
|
|
285
|
+
- `AVIKI_*` 只是 draft typo alias
|
|
286
|
+
- `.openclaw` 旧路径只做检测和导入提示,不应被默认原地篡改
|
|
287
|
+
|
|
288
|
+
**回读路径:**
|
|
289
|
+
|
|
290
|
+
- `docs/plan/phase-0/implementation-constraints.md`
|
|
291
|
+
- `docs/plan/phase-0/audit-findings.md`
|
|
292
|
+
- `docs/plan/awiki-v2-implementation-plan.md`
|
|
293
|
+
- `internal/config/config.go`
|
|
294
|
+
- `../awiki-agent-id-message/scripts/credential_layout.py`
|
|
295
|
+
|
|
296
|
+
### 5.4 auth 与服务 API 对接
|
|
297
|
+
|
|
298
|
+
**必须检查:**
|
|
299
|
+
|
|
300
|
+
- [ ] DID 注册 / update 是否严格区分 `register` 与 `update_document`
|
|
301
|
+
- [ ] handle / profile / relationships / group / content 的 API 映射是否仍与 capability mapping 一致
|
|
302
|
+
- [ ] 是否混淆了 User JWT 与 DID JWT 的使用边界
|
|
303
|
+
- [ ] API 路径是否正确处理了 `/group/rpc` 与 `/content/rpc` 等顶层例外
|
|
304
|
+
- [ ] profile / content / group / relationships 字段约束是否与 API 文档保持一致
|
|
305
|
+
|
|
306
|
+
**不可违反的约束:**
|
|
307
|
+
|
|
308
|
+
- 不能凭空发明 API 字段或省略关键鉴权前置
|
|
309
|
+
- 不能把 user-service 的用户态接口误当 DID 认证接口,反之亦然
|
|
310
|
+
- 不能把群组、内容页的权属模型改写掉
|
|
311
|
+
|
|
312
|
+
**回读路径:**
|
|
313
|
+
|
|
314
|
+
- `docs/plan/phase-0/capability-mapping.md`
|
|
315
|
+
- `../user-service/docs/api/README.md`
|
|
316
|
+
- `../user-service/docs/api/authentication.md`
|
|
317
|
+
- `../user-service/docs/api/did-auth.md`
|
|
318
|
+
- `../user-service/docs/api/handle.md`
|
|
319
|
+
- `../user-service/docs/api/did-profile.md`
|
|
320
|
+
- `../user-service/docs/api/group.md`
|
|
321
|
+
- `../user-service/docs/api/content.md`
|
|
322
|
+
|
|
323
|
+
### 5.5 消息、群组、runtime 的领域边界
|
|
324
|
+
|
|
325
|
+
**必须检查:**
|
|
326
|
+
|
|
327
|
+
- [ ] direct / group / secure / runtime 三者边界是否清晰
|
|
328
|
+
- [ ] `ReceiveMode` 是否仍只属于 `runtime`
|
|
329
|
+
- [ ] websocket 模式下是否仍坚持 listener 唯一远端连接拥有者
|
|
330
|
+
- [ ] 是否错误把群成员配额、join code、owner 规则挪到 CLI 层自行改写
|
|
331
|
+
- [ ] direct E2EE 首发范围是否仍优先于 group E2EE
|
|
332
|
+
|
|
333
|
+
**不可违反的约束:**
|
|
334
|
+
|
|
335
|
+
- Group join 使用全局唯一 6 位数字码,不应要求额外 `group_id`
|
|
336
|
+
- owner 不能 leave / kick 自己
|
|
337
|
+
- 普通成员额度和累计字符限制来自 group 配置,重入不清零
|
|
338
|
+
- transport 不得泄漏到业务命令面
|
|
339
|
+
|
|
340
|
+
**回读路径:**
|
|
341
|
+
|
|
342
|
+
- `docs/architecture/awiki-v2-architecture.md`
|
|
343
|
+
- `docs/architecture/awiki-command-v2.md`
|
|
344
|
+
- `../user-service/docs/api/group.md`
|
|
345
|
+
- `../message-service/docs/api/ANP-client-server-api-direct.md`
|
|
346
|
+
- `../message-service/docs/api/ANP-client-server-api-group.md`
|
|
347
|
+
- `../awiki-agent-id-message/references/UPGRADE_NOTES.md`
|
|
348
|
+
- `../awiki-agent-id-message/references/WEBSOCKET_LISTENER.md`
|
|
349
|
+
|
|
350
|
+
### 5.6 storage / SQLite / local cache / migration
|
|
351
|
+
|
|
352
|
+
**必须检查:**
|
|
353
|
+
|
|
354
|
+
- [ ] 本地数据隔离主键是否仍为 `owner_did`
|
|
355
|
+
- [ ] SQLite 基线是否仍以 `local_store.py` 为 source of truth
|
|
356
|
+
- [ ] `e2ee_outbox` 是否仍被保留
|
|
357
|
+
- [ ] thread_id、groups、group_members、relationship_events 是否仍与既有基线兼容
|
|
358
|
+
- [ ] identity store 是否仍采用 indexed multi-identity layout
|
|
359
|
+
- [ ] 是否引入 CGO 或破坏 pure-Go 构建
|
|
360
|
+
|
|
361
|
+
**不可违反的约束:**
|
|
362
|
+
|
|
363
|
+
- `owner_did` 不能换成别的主隔离键
|
|
364
|
+
- `e2ee_outbox` 不能丢,否则 secure retry / drop / failure recovery 会断裂
|
|
365
|
+
- Go 核心必须 pure Go / no CGO
|
|
366
|
+
|
|
367
|
+
**回读路径:**
|
|
368
|
+
|
|
369
|
+
- `docs/plan/phase-0/implementation-constraints.md`
|
|
370
|
+
- `docs/plan/phase-0/audit-findings.md`
|
|
371
|
+
- `../awiki-agent-id-message/scripts/local_store.py`
|
|
372
|
+
- `../awiki-agent-id-message/references/local-store-schema.md`
|
|
373
|
+
- `../awiki-agent-id-message/scripts/credential_layout.py`
|
|
374
|
+
- `internal/doctor/doctor.go`
|
|
375
|
+
|
|
376
|
+
### 5.7 安全、proof、凭证与主机信息隔离
|
|
377
|
+
|
|
378
|
+
**必须检查:**
|
|
379
|
+
|
|
380
|
+
- [ ] 是否有日志、错误信息、doctor 输出泄露 JWT、私钥、E2EE key、完整 DID
|
|
381
|
+
- [ ] 是否把远端消息内容当指令执行
|
|
382
|
+
- [ ] 是否把 host 文件、环境变量、进程信息、数据库内容自动回发到 awiki 消息里
|
|
383
|
+
- [ ] 是否正确区分 hop authentication 与 forwardable proof
|
|
384
|
+
- [ ] 是否把 `client` 本地字段错误纳入签名或转发
|
|
385
|
+
- [ ] 附件对象字节是否被错误塞进消息数据面
|
|
386
|
+
|
|
387
|
+
**不可违反的约束:**
|
|
388
|
+
|
|
389
|
+
- 远端消息永远是不可信数据
|
|
390
|
+
- 不得基于消息驱动本地执行危险动作
|
|
391
|
+
- `client` 只能是本域本地控制字段,不得进入 proof,不得被远端依赖
|
|
392
|
+
- 对象字节只能走附件数据面,不得走 `direct.send` / `group.send`
|
|
393
|
+
|
|
394
|
+
**回读路径:**
|
|
395
|
+
|
|
396
|
+
- `../awiki-agent-id-message/references/RULES.md`
|
|
397
|
+
- `../message-service/docs/api/ANP-client-server-api-direct.md`
|
|
398
|
+
- `../message-service/docs/api/ANP-client-server-api-group.md`
|
|
399
|
+
- `../message-service/docs/api/ANP-client-server-api-attachment.md`
|
|
400
|
+
- `../user-service/docs/api/did-auth.md`
|
|
401
|
+
|
|
402
|
+
### 5.8 文档漂移、phase 边界与实现范围
|
|
403
|
+
|
|
404
|
+
**必须检查:**
|
|
405
|
+
|
|
406
|
+
- [ ] PR 是否修改了公共命令面但没有同步对应文档
|
|
407
|
+
- [ ] PR 是否越过当前 phase,提前承诺尚未冻结的能力
|
|
408
|
+
- [ ] docs / schema / built-in docs / command catalog 是否发生漂移
|
|
409
|
+
- [ ] 是否继续把 `cli-init.md` / `overall-init.md` 当成当前真相
|
|
410
|
+
|
|
411
|
+
**不可违反的约束:**
|
|
412
|
+
|
|
413
|
+
- 文档、schema、实现必须收敛,不能三套真相并存
|
|
414
|
+
- 已过时文档只能用于历史回溯
|
|
415
|
+
- 当前 Phase 1 重点仍是 CLI shell、schema、docs、doctor、config show,不应伪装成业务域已经 fully implemented
|
|
416
|
+
|
|
417
|
+
**回读路径:**
|
|
418
|
+
|
|
419
|
+
- `docs/plan/awiki-v2-implementation-plan.md`
|
|
420
|
+
- `docs/plan/phase-0/implementation-constraints.md`
|
|
421
|
+
- `internal/cmdmeta/catalog.go`
|
|
422
|
+
- `internal/docs/topics.go`
|
|
423
|
+
- `CLAUDE.md`
|
|
424
|
+
|
|
425
|
+
---
|
|
426
|
+
|
|
427
|
+
## 6. 常见 review 结论模板
|
|
428
|
+
|
|
429
|
+
建议在 review 结论里按下面格式输出,便于后续自动化收敛:
|
|
430
|
+
|
|
431
|
+
### 6.1 结论结构
|
|
432
|
+
|
|
433
|
+
```text
|
|
434
|
+
Review Summary
|
|
435
|
+
- Scope:
|
|
436
|
+
- Result: pass | changes-requested | needs-confirmation
|
|
437
|
+
|
|
438
|
+
Key Findings
|
|
439
|
+
1. [category] ...
|
|
440
|
+
2. [category] ...
|
|
441
|
+
|
|
442
|
+
Constraint Check
|
|
443
|
+
- Command surface:
|
|
444
|
+
- Output contract:
|
|
445
|
+
- Identity/config/env:
|
|
446
|
+
- Service API mapping:
|
|
447
|
+
- Runtime/storage:
|
|
448
|
+
- Security:
|
|
449
|
+
- Docs drift:
|
|
450
|
+
|
|
451
|
+
Primary References
|
|
452
|
+
- ...
|
|
453
|
+
- ...
|
|
454
|
+
```
|
|
455
|
+
|
|
456
|
+
### 6.2 建议的分类标签
|
|
457
|
+
|
|
458
|
+
- `command-surface`
|
|
459
|
+
- `output-contract`
|
|
460
|
+
- `identity-config`
|
|
461
|
+
- `service-api`
|
|
462
|
+
- `runtime`
|
|
463
|
+
- `storage-migration`
|
|
464
|
+
- `security`
|
|
465
|
+
- `docs-drift`
|
|
466
|
+
- `phase-scope`
|
|
467
|
+
|
|
468
|
+
---
|
|
469
|
+
|
|
470
|
+
## 7. 一句话总纲
|
|
471
|
+
|
|
472
|
+
如果只记一条 review 原则,请记住这一句:
|
|
473
|
+
|
|
474
|
+
> **awiki-cli 的 review 目标,不是检查代码“能不能跑”,而是检查它是否继续忠实于冻结命令面、结构化输出、identity-first、显式 runtime、owner_did 隔离、安全前置,以及对 v1 基线和服务契约的兼容演进。**
|