feishu-codex-console 1.0.0-beta.6

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 (113) hide show
  1. package/.env.example +101 -0
  2. package/.feishu-codex-policy.example.json +11 -0
  3. package/.feishu-codex-runbooks.example.json +36 -0
  4. package/CHANGELOG.md +129 -0
  5. package/CODE_OF_CONDUCT.md +7 -0
  6. package/CONTRIBUTING.md +52 -0
  7. package/LICENSE +21 -0
  8. package/README.en.md +81 -0
  9. package/README.md +398 -0
  10. package/ROADMAP.md +40 -0
  11. package/SECURITY.md +53 -0
  12. package/dist/account-quota-card.js +233 -0
  13. package/dist/account-quota.js +125 -0
  14. package/dist/app-server-client.js +281 -0
  15. package/dist/card-session.js +166 -0
  16. package/dist/codex-events.js +1 -0
  17. package/dist/codex-runner.js +875 -0
  18. package/dist/config.js +198 -0
  19. package/dist/confirmation-card.js +135 -0
  20. package/dist/control-card.js +345 -0
  21. package/dist/conversation-turn-session.js +209 -0
  22. package/dist/data-maintenance.js +71 -0
  23. package/dist/device-card.js +460 -0
  24. package/dist/device-health.js +94 -0
  25. package/dist/diagnostics.js +253 -0
  26. package/dist/doctor.js +250 -0
  27. package/dist/fallback-card-session.js +37 -0
  28. package/dist/health-file.js +75 -0
  29. package/dist/index.js +4330 -0
  30. package/dist/lark-cli.js +558 -0
  31. package/dist/lark-retry.js +34 -0
  32. package/dist/maintenance.js +140 -0
  33. package/dist/model-capabilities.js +31 -0
  34. package/dist/onboarding-card.js +312 -0
  35. package/dist/permission-lease.js +22 -0
  36. package/dist/policy.js +506 -0
  37. package/dist/progress.js +267 -0
  38. package/dist/project-card.js +303 -0
  39. package/dist/project-overview-card.js +182 -0
  40. package/dist/project-overview.js +278 -0
  41. package/dist/project-policy.js +160 -0
  42. package/dist/project-registry.js +259 -0
  43. package/dist/project-status.js +45 -0
  44. package/dist/project-workspace.js +55 -0
  45. package/dist/quota-card.js +94 -0
  46. package/dist/recovery-policy.js +26 -0
  47. package/dist/redaction.js +67 -0
  48. package/dist/remote-ready.js +112 -0
  49. package/dist/response-card.js +139 -0
  50. package/dist/result-card.js +166 -0
  51. package/dist/review-card.js +452 -0
  52. package/dist/runbook-card.js +272 -0
  53. package/dist/runbooks.js +191 -0
  54. package/dist/runtime-card.js +337 -0
  55. package/dist/session-card.js +128 -0
  56. package/dist/session-naming.js +14 -0
  57. package/dist/smoke.js +28 -0
  58. package/dist/state-backup.js +302 -0
  59. package/dist/state-store.js +874 -0
  60. package/dist/task-card.js +640 -0
  61. package/dist/task-center-card.js +176 -0
  62. package/dist/task-failure.js +43 -0
  63. package/dist/task-intent.js +76 -0
  64. package/dist/task-queue.js +187 -0
  65. package/dist/task-reconciliation.js +80 -0
  66. package/dist/task-review.js +497 -0
  67. package/dist/team-card.js +275 -0
  68. package/dist/team-directory.js +54 -0
  69. package/dist/team-policy.js +93 -0
  70. package/dist/types.js +1 -0
  71. package/dist/version.js +9 -0
  72. package/dist/workspace-session.js +64 -0
  73. package/docs/ARCHITECTURE.md +54 -0
  74. package/docs/COMPATIBILITY.md +55 -0
  75. package/docs/CONFIGURATION.md +88 -0
  76. package/docs/DEMO.md +45 -0
  77. package/docs/GOOD_FIRST_ISSUES.md +23 -0
  78. package/docs/INSTALLATION.md +207 -0
  79. package/docs/OPEN_SOURCE_PRODUCT_PLAN.md +113 -0
  80. package/docs/PRODUCT_REQUIREMENTS_MAP.md +591 -0
  81. package/docs/RELEASE_CHECKLIST.md +65 -0
  82. package/docs/TEAM_DEPLOYMENT.md +35 -0
  83. package/docs/TROUBLESHOOTING.md +130 -0
  84. package/docs/V4_WORKSPACE_SESSION_FLOW.md +232 -0
  85. package/docs/requirements/D10_MAINTENANCE_AND_ECOSYSTEM.md +103 -0
  86. package/docs/requirements/D1_INSTALLATION_AND_FIRST_CONNECTION.md +479 -0
  87. package/docs/requirements/D2_DEVICE_AND_CONNECTIVITY.md +54 -0
  88. package/docs/requirements/D3_PROJECTS_AND_SESSIONS.md +107 -0
  89. package/docs/requirements/D4_REMOTE_TASK_EXECUTION.md +102 -0
  90. package/docs/requirements/D5_CODEX_NATIVE_INTERACTIONS.md +99 -0
  91. package/docs/requirements/D6_RESULTS_AND_CODE_REVIEW.md +100 -0
  92. package/docs/requirements/D7_SECURITY_GOVERNANCE.md +106 -0
  93. package/docs/requirements/D8_RELIABILITY_AND_RECOVERY.md +182 -0
  94. package/docs/requirements/D9_TEAM_COLLABORATION.md +129 -0
  95. package/package.json +76 -0
  96. package/scripts/capability-probe.mjs +113 -0
  97. package/scripts/cli.mjs +919 -0
  98. package/scripts/config-file.mjs +137 -0
  99. package/scripts/discovery-lib.mjs +78 -0
  100. package/scripts/install-card.mjs +37 -0
  101. package/scripts/install-detection.mjs +126 -0
  102. package/scripts/install-state.mjs +107 -0
  103. package/scripts/launchd.mjs +161 -0
  104. package/scripts/migrate-legacy.mjs +97 -0
  105. package/scripts/package-smoke.mjs +163 -0
  106. package/scripts/release-dist-tag.mjs +7 -0
  107. package/scripts/runbook-template.mjs +36 -0
  108. package/scripts/service-health.mjs +110 -0
  109. package/scripts/service.mjs +24 -0
  110. package/scripts/setup-lib.mjs +118 -0
  111. package/scripts/systemd.mjs +96 -0
  112. package/scripts/upgrade-lib.mjs +99 -0
  113. package/scripts/verify-release.mjs +37 -0
@@ -0,0 +1,479 @@
1
+ # D1 安装与首次连接 PRD
2
+
3
+ > 产品:Feishu Codex Console
4
+ > 状态:`beta.4` 闭环已完成
5
+ > 优先级:P0
6
+ > 目标版本:`1.0.0-beta.4`
7
+ > 依赖:Node.js 22+、Codex 登录态、用户已有飞书自建应用
8
+
9
+ ## 1. 已确认边界
10
+
11
+ MVP 绑定用户已有的飞书自建应用,不替用户自动创建飞书应用。
12
+
13
+ 初始化向导负责:
14
+
15
+ - 检查本机运行环境。
16
+ - 引导绑定已有飞书应用。
17
+ - 验证 Bot 身份、所需权限和事件能力。
18
+ - 自动识别安装者的 `open_id`、测试会话的 `chat_id` 和会话类型。
19
+ - 选择默认项目和权限预设。
20
+ - 生成私有配置。
21
+ - 安装后台服务。
22
+ - 发送第一张测试卡和新手引导入口。
23
+
24
+ 初始化向导不负责:
25
+
26
+ - 替用户注册飞书账号或创建企业。
27
+ - 绕过企业管理员审批应用权限。
28
+ - 自动发布飞书应用版本。
29
+ - 保存 App Secret 到项目仓库或桥接服务 `.env`。
30
+ - 为用户修改 Codex 或操作系统账号安全策略。
31
+
32
+ ## 2. 用户问题
33
+
34
+ 当前能力可以运行,但第一次安装涉及飞书应用、Bot 身份、事件、成员 ID、项目路径、权限模式和后台服务。新用户不知道步骤之间的依赖,也无法判断失败发生在哪一层。
35
+
36
+ 需要把“阅读文档并手工拼装配置”变成一个可暂停、可恢复、可验证的安装流程。
37
+
38
+ ## 3. 目标
39
+
40
+ ### 业务目标
41
+
42
+ - 新用户在 10 分钟内从运行安装命令到收到第一张飞书测试卡。
43
+ - 降低因权限、事件订阅、身份 ID 和配置文件错误造成的安装失败。
44
+ - 让个人模式和团队模式使用同一套向导。
45
+
46
+ ### 用户目标
47
+
48
+ - 明确知道当前处于哪一步。
49
+ - 每一步只填写当前需要的信息。
50
+ - 失败时知道原因、修复动作和如何继续。
51
+ - 不需要理解全部环境变量。
52
+
53
+ ### 安全目标
54
+
55
+ - 默认使用个人安全或团队安全预设。
56
+ - 高级模式需要单独确认。
57
+ - 不在命令参数、日志和 Git 仓库中暴露 Secret。
58
+ - 配置文件为 `0600`,数据目录为 `0700`。
59
+
60
+ ## 4. 非目标
61
+
62
+ - 支持 Windows 后台服务。
63
+ - 自动申请企业管理员权限。
64
+ - 默认启用网络、Web 搜索或完全访问。
65
+ - 在安装阶段配置所有高级参数。
66
+ - 为多个 IM 平台提供统一安装器。
67
+
68
+ ## 5. 用户故事
69
+
70
+ ### 个人开发者
71
+
72
+ > 作为个人开发者,我希望只提供已有飞书应用和默认项目,就能在飞书收到测试卡并开始使用。
73
+
74
+ ### 团队维护者
75
+
76
+ > 作为团队维护者,我希望在安装时明确区分管理员、操作者和只读成员,并确保普通成员不能获得完全访问。
77
+
78
+ ### 已有用户
79
+
80
+ > 作为已经通过源码运行的用户,我希望重新运行向导时识别现有配置,不覆盖未知配置,也不破坏 SQLite 数据。
81
+
82
+ ### 故障用户
83
+
84
+ > 作为安装失败的用户,我希望修复某一步后从该步骤继续,而不是重新输入全部内容。
85
+
86
+ ## 6. 端到端安装流程
87
+
88
+ ```text
89
+ 运行 npx feishu-codex-console init
90
+
91
+ 欢迎页与已有安装检测
92
+
93
+ 本机环境检查
94
+
95
+ 绑定并验证已有飞书应用
96
+
97
+ 验证权限、事件和 CardKit
98
+
99
+ 发送测试消息,自动识别用户与会话
100
+
101
+ 选择个人安全 / 团队安全 / 高级模式
102
+
103
+ 选择默认项目与扫描根目录
104
+
105
+ 查看安装摘要并确认
106
+
107
+ 备份旧配置并原子写入新配置
108
+
109
+ 运行 doctor
110
+
111
+ 安装后台服务并等待健康
112
+
113
+ 向测试会话发送成功卡
114
+
115
+ 进入飞书新手引导
116
+ ```
117
+
118
+ ## 7. 分步需求
119
+
120
+ ### Step 0:欢迎与安装状态
121
+
122
+ 展示:
123
+
124
+ - 产品一句话说明。
125
+ - 预计耗时。
126
+ - 本次会修改的位置。
127
+ - 是否检测到已有配置、服务和数据。
128
+
129
+ 行为:
130
+
131
+ - 新安装进入完整流程。
132
+ - 未完成安装从最后成功步骤继续。
133
+ - 已安装用户进入“检查、修改配置、修复、重新安装服务”菜单。
134
+
135
+ ### Step 1:本机环境检查
136
+
137
+ 检查:
138
+
139
+ - Node.js 版本。
140
+ - 当前操作系统和后台服务支持情况。
141
+ - Codex CLI 是否可执行。
142
+ - `codex login status` 是否成功。
143
+ - 安装目录、配置目录和数据目录是否安全可写。
144
+ - Git 是否可用。
145
+
146
+ 结果等级:
147
+
148
+ - 通过:继续。
149
+ - 提醒:不影响核心流程,可继续。
150
+ - 阻塞:给出修复命令,修复后重新检查。
151
+
152
+ ### Step 2:绑定飞书应用
153
+
154
+ 如果 Bot 身份已配置:
155
+
156
+ - 展示已绑定应用的脱敏信息。
157
+ - 允许继续使用或重新绑定。
158
+
159
+ 如果尚未配置:
160
+
161
+ - 解释需要已有自建应用。
162
+ - 提供“启动 lark-cli 配置流程”。
163
+ - 用户确认后运行 `lark-cli config init`。
164
+ - Secret 通过安全输入或 stdin 交给 lark-cli,不回显、不写入桥接配置。
165
+
166
+ ### Step 3:验证飞书能力
167
+
168
+ 必须验证:
169
+
170
+ - Bot 身份 Token 可用。
171
+ - 能消费 `im.message.receive_v1`。
172
+ - 能接收 `card.action.trigger`。
173
+ - 具备消息回复能力。
174
+ - 具备 `cardkit:card:write`。
175
+ - 应用事件接收方式支持长连接。
176
+
177
+ 验证结果必须指出:
178
+
179
+ - 缺少的具体权限或事件。
180
+ - 应在飞书开发者后台的哪个位置修复。
181
+ - 修改后是否需要重新发布应用版本。
182
+ - “重新检查”入口。
183
+
184
+ ### Step 4:自动识别安装者
185
+
186
+ 流程:
187
+
188
+ 1. 启动最多接收一个事件、最多等待两分钟的只读监听。
189
+ 2. 提示用户在飞书中给机器人发送任意测试消息。
190
+ 3. 提取 `sender_id`、`chat_id` 和 `chat_type`。
191
+ 4. 不保存测试消息正文。
192
+ 5. 展示脱敏后的识别结果并要求用户确认。
193
+
194
+ 规则:
195
+
196
+ - 私聊用于确认安装者身份,不加入群白名单。
197
+ - 群聊用于确认身份,并默认建议把该群加入白名单。
198
+ - 自动识别超时后允许重新监听或手工输入。
199
+ - 团队模式仍必须显式确认管理员。
200
+
201
+ ### Step 5:权限预设
202
+
203
+ 默认顺序:
204
+
205
+ 1. 个人安全(推荐)。
206
+ 2. 团队安全。
207
+ 3. 高级模式。
208
+
209
+ 每个预设展示:
210
+
211
+ - 谁可以使用。
212
+ - 可以修改什么。
213
+ - 是否允许网络。
214
+ - 是否允许群聊。
215
+ - 哪些动作仍需要审批。
216
+
217
+ 高级模式必须输入确认文字或完成单独确认步骤,不能通过默认回车启用。
218
+
219
+ ### Step 6:项目配置
220
+
221
+ 必填:
222
+
223
+ - 默认项目目录。
224
+
225
+ 可选:
226
+
227
+ - 同步 Codex 桌面端保存项目。
228
+ - 增加一个或多个扫描根目录。
229
+
230
+ 验证:
231
+
232
+ - 路径存在并解析真实路径。
233
+ - 默认情况下要求 Git 仓库。
234
+ - 扫描根目录不能是文件或不安全符号链接。
235
+ - 展示预计发现的项目数量和前几个项目。
236
+
237
+ ### Step 7:安装摘要
238
+
239
+ 确认前展示:
240
+
241
+ - 实例名称。
242
+ - 飞书安装者和测试会话。
243
+ - 权限预设。
244
+ - 默认项目和扫描根目录。
245
+ - 配置文件和数据目录。
246
+ - 将安装的后台服务名称。
247
+
248
+ 不展示:
249
+
250
+ - App Secret。
251
+ - 完整 Token。
252
+ - 测试消息正文。
253
+
254
+ ### Step 8:安全写入配置
255
+
256
+ 要求:
257
+
258
+ - 新配置写入临时文件后原子替换。
259
+ - 配置文件权限固定为 `0600`。
260
+ - 数据目录权限固定为 `0700`。
261
+ - 已有配置先备份,并记录备份路径。
262
+ - 只管理已知键,保留未知高级配置。
263
+ - 任一步失败时不留下半写入配置。
264
+
265
+ ### Step 9:自检与服务安装
266
+
267
+ 顺序:
268
+
269
+ 1. 运行完整 `doctor`。
270
+ 2. 有失败项时停止,不安装服务。
271
+ 3. 全部阻塞项通过后安装 LaunchAgent 或 systemd user service。
272
+ 4. 等待进程启动和连接健康。
273
+ 5. 检查服务使用的是刚生成的配置文件。
274
+
275
+ ### Step 10:发送测试卡
276
+
277
+ 向刚才识别的会话发送一张安装成功卡:
278
+
279
+ - 设备名称和在线状态。
280
+ - 默认项目。
281
+ - 当前权限预设。
282
+ - “开始新手引导”。
283
+ - “打开控制台”。
284
+ - “查看安装诊断”。
285
+
286
+ 测试卡发送成功,才将安装状态标记为完成。
287
+
288
+ ## 8. 安装状态模型
289
+
290
+ ```text
291
+ not_started
292
+ → environment_ready
293
+ → feishu_bound
294
+ → capabilities_verified
295
+ → identity_discovered
296
+ → preferences_confirmed
297
+ → config_written
298
+ → service_running
299
+ → test_card_delivered
300
+ → completed
301
+ ```
302
+
303
+ 每一步保存:
304
+
305
+ - 状态名称。
306
+ - 完成时间。
307
+ - 非敏感输入摘要。
308
+ - 最近错误类型。
309
+ - 是否可以安全重试。
310
+
311
+ 不保存 App Secret、Token 和测试消息正文。
312
+
313
+ ## 9. 异常与恢复
314
+
315
+ | 异常 | 用户看到的结果 | 可执行动作 |
316
+ |---|---|---|
317
+ | Node 版本过低 | 当前版本和最低要求 | 打开升级说明、重新检查 |
318
+ | Codex 未登录 | 登录状态失败 | 运行登录、重新检查 |
319
+ | 飞书 Bot 无效 | 当前应用身份不可用 | 重新绑定应用 |
320
+ | 权限缺失 | 缺少的权限名称 | 打开配置说明、重新检查 |
321
+ | 事件未启用 | 缺少的事件名称 | 打开事件订阅说明、重新检查 |
322
+ | 身份监听超时 | 未收到测试消息 | 重新监听、手工输入 |
323
+ | 项目路径无效 | 具体路径和原因 | 重新选择 |
324
+ | 配置已存在 | 检测到现有安装 | 检查、备份后更新、退出 |
325
+ | doctor 失败 | 失败项与原因 | 修复、重新检查 |
326
+ | 服务启动失败 | 服务名和日志位置 | 查看日志、重新安装 |
327
+ | 测试卡失败 | 服务已启动但飞书发送失败 | 重试发送、运行诊断 |
328
+
329
+ ## 10. 功能需求编号
330
+
331
+ | 编号 | 需求 | 优先级 |
332
+ |---|---|---|
333
+ | D1-FR-001 | 检测新安装、未完成安装和已有安装 | P0 |
334
+ | D1-FR-002 | 分级检查本机环境 | P0 |
335
+ | D1-FR-003 | 绑定和重新绑定已有飞书应用 | P0 |
336
+ | D1-FR-004 | 验证消息、事件和 CardKit 能力 | P0 |
337
+ | D1-FR-005 | 自动发现安装者和测试会话 | P0 |
338
+ | D1-FR-006 | 提供三档权限预设 | P0 |
339
+ | D1-FR-007 | 验证默认项目和扫描根目录 | P0 |
340
+ | D1-FR-008 | 展示脱敏安装摘要 | P0 |
341
+ | D1-FR-009 | 原子写入、备份并保留未知配置 | P0 |
342
+ | D1-FR-010 | doctor 通过后安装后台服务 | P0 |
343
+ | D1-FR-011 | 发送测试卡并进入新手引导 | P0 |
344
+ | D1-FR-012 | 保存非敏感安装进度并支持恢复 | P1 |
345
+ | D1-FR-013 | 提供非交互式安装参数 | P1 |
346
+ | D1-FR-014 | 提供现有源码安装迁移入口 | P1 |
347
+
348
+ ## 11. 验收标准
349
+
350
+ ### 新安装
351
+
352
+ - 给定已正确配置的飞书应用和已登录 Codex,新用户可以在 10 分钟内收到测试卡。
353
+ - 用户无需手工编辑 `.env`。
354
+ - 安装结果可以通过 `doctor` 和 `status` 再次验证。
355
+
356
+ ### 默认安全
357
+
358
+ - 默认权限是 `workspace-write`。
359
+ - 网络和 Web 搜索默认关闭。
360
+ - 高级模式不能被误触启用。
361
+ - App Secret 不进入桥接配置、日志或进程参数。
362
+
363
+ ### 可恢复
364
+
365
+ - 身份监听超时后可以重试,而不丢失之前步骤。
366
+ - doctor 失败时不安装或启动后台服务。
367
+ - 已有配置更新前自动备份,未知配置保留。
368
+ - 安装进程被中断后可以从最后安全步骤恢复。
369
+
370
+ ### 多平台
371
+
372
+ - macOS 使用 LaunchAgent。
373
+ - Linux 使用 systemd user service。
374
+ - 不支持的平台在写配置前明确阻塞。
375
+
376
+ ### 自动化
377
+
378
+ - 单元测试覆盖配置生成、身份事件解析和状态迁移。
379
+ - tarball 测试从真实 npm 包完成非交互初始化。
380
+ - CI 验证安装脚本、包文件和权限模式。
381
+
382
+ ## 12. 当前实现差距
383
+
384
+ | 能力 | 当前状态 | 需要补充 |
385
+ |---|---|---|
386
+ | Node/Codex/Bot 检查 | 已实现 | 输出结构化检查结果 |
387
+ | 三档权限预设 | 已实现 | 安装摘要和更清楚的影响说明 |
388
+ | 身份自动发现 | 已实现 | 确认页、重试和进度恢复 |
389
+ | 私有配置目录 | 已实现 | 原子写入、备份和未知键保留已完成 |
390
+ | doctor | 已实现 | 能力检查与 `--fix` |
391
+ | 后台服务 | 已实现 | 安装后等待双事件消费者健康,并核对实例、PID、心跳和配置路径 |
392
+ | npm 干净安装测试 | 已实现 | 加入 macOS 实机发布前验证 |
393
+ | 飞书权限/事件验证 | 已实现 | 已探测 Bot、消息事件和卡片事件;测试卡验证 CardKit 写入 |
394
+ | 测试卡 | 已实现 | 私聊自动发送,群聊确认,失败不标记完成 |
395
+ | 断点续装 | 部分完成 | 已持久化非敏感进度;仍需按步骤直接恢复 |
396
+ | 旧安装迁移 | 已实现 | 复制旧源码配置、复用旧数据并在健康验证后切换服务 |
397
+
398
+ ## 13. 开发任务拆分
399
+
400
+ ### 第一批:安装状态与安全写入
401
+
402
+ - [x] D1-T01:实现安装状态文件和状态迁移。
403
+ - [x] D1-T02:解析已有配置,区分已知键和未知键。
404
+ - [x] D1-T03:配置原子写入、`0600` 修正和自动备份。
405
+ - [x] D1-T04:检测已有服务和已有数据。
406
+
407
+ ### 第二批:飞书能力验证
408
+
409
+ - [x] D1-T05:定义消息、事件、卡片所需能力清单。
410
+ - [x] D1-T06:实现 Bot、事件流和 CardKit 探测。
411
+ - [x] D1-T07:把缺失能力映射成具体修复说明。
412
+ - [x] D1-T08:为能力探测增加可替换测试适配器。
413
+
414
+ ### 第三批:服务闭环
415
+
416
+ - [x] D1-T09:服务安装后等待健康状态。
417
+ - [x] D1-T10:验证服务实际加载的配置文件。
418
+ - [x] D1-T11:发送安装成功测试卡。
419
+ - [x] D1-T12:测试卡跳转到飞书新手引导和控制台。
420
+
421
+ ### 第四批:迁移与自动化
422
+
423
+ - [x] D1-T13:增加旧源码安装迁移。
424
+ - [x] D1-T14:增加安装中断和恢复集成测试。
425
+ - [x] D1-T15:增加 Linux/macOS 发布前检查清单。
426
+ - [x] D1-T16:更新演示、排错和维护者文档。
427
+
428
+ ## 14. 仍需产品确认
429
+
430
+ ### 决策 A:安装交互形式(已确认)
431
+
432
+ 推荐:`beta.4` 保持 CLI 向导,不同时建设本地网页安装器。
433
+
434
+ 理由:
435
+
436
+ - 当前用户是开发者和团队维护者。
437
+ - CLI 更容易跨 macOS/Linux、测试和发布。
438
+ - 本地网页仍要处理进程、权限、Secret 和服务安装,复杂度较高。
439
+ - 等安装流程稳定后,可以让网页调用同一套安装状态机。
440
+
441
+ ### 决策 B:测试卡发送(已确认)
442
+
443
+ 确认:私聊自动发送;群聊在安装摘要中再次确认。提供 `--no-test-card` 关闭自动发送。
444
+
445
+ ### 决策 C:已有配置更新(已确认)
446
+
447
+ 确认:默认备份后合并已知键,保留未知键;只有 `--force-reset` 才完整重建。
448
+
449
+ ### 决策 D:安装完成标准(已确认)
450
+
451
+ 确认:后台服务健康且测试卡发送成功才算完成。使用 `--no-test-card` 时,以服务健康和完整 doctor 通过作为完成标准;仅写入配置不算安装成功。
452
+
453
+ ## 15. 决策记录
454
+
455
+ ### 决策记录 2026-07-16
456
+
457
+ - 决策:MVP 绑定用户已有的飞书自建应用,不自动创建应用。
458
+ - 原因:自动创建会引入企业管理员权限、租户差异和外部账号状态,扩大首版边界。
459
+ - MVP 包含:应用绑定、身份验证、能力检查、测试消息、服务安装和测试卡。
460
+ - MVP 不包含:创建企业、创建应用、管理员审批和自动发布飞书应用版本。
461
+ - 验收标准:给定已有应用,新用户可以在 10 分钟内收到测试卡。
462
+ - 后续版本:评估本地网页安装器和更深的开放平台自动化。
463
+
464
+ ### 决策记录 2026-07-16 · D1-A
465
+
466
+ - 决策:`beta.4` 只提供 CLI 安装向导,不同时建设本地网页安装器。
467
+ - 原因:目标用户是开发者和团队维护者;CLI 更容易跨 macOS/Linux、自动测试和发布。
468
+ - MVP 包含:交互式 CLI、非交互参数、可恢复安装状态和结构化错误。
469
+ - MVP 不包含:本地 Web 服务、浏览器安装页面和两套交互层。
470
+ - 验收标准:CLI 覆盖新安装、继续安装、检查、修复和重新安装服务。
471
+ - 后续版本:安装状态机稳定后,网页安装器可以复用同一套底层能力。
472
+
473
+ ### 决策记录 2026-07-16 · D1-B/C/D
474
+
475
+ - 测试卡:私聊自动发送,群聊再次确认;支持 `--no-test-card`。
476
+ - 配置更新:默认备份、合并已知键并保留未知键;`--force-reset` 才完整重建。
477
+ - 完成标准:doctor 通过、服务健康并成功发送测试卡;禁用测试卡时以服务健康为准。
478
+ - 原因:安装完成必须证明真实端到端链路可用,同时避免覆盖维护者的高级配置或在群聊中意外发消息。
479
+ - MVP 不包含:自动向未参与身份发现的聊天发送消息。
@@ -0,0 +1,54 @@
1
+ # D2:设备与连接状态
2
+
3
+ 状态:`beta.4` 闭环已完成
4
+ 范围:`beta.4` 设备可用性闭环
5
+ 日期:2026-07-16
6
+
7
+ ## 1. 产品目标
8
+
9
+ 用户在飞书打开控制台后,5 秒内能判断这台本地设备现在是否适合执行 Codex 任务;异常时能看到原因、状态采样时间和下一步动作,而不是把旧卡片误认为实时在线证明。
10
+
11
+ ## 2. 已确认决策
12
+
13
+ - 第一版一个桥接实例只代表一台设备;多设备路由留到存在中心控制面之后。
14
+ - 状态卡必须显示绝对采样时间和本人最后一次成功任务时间,不显示提示词内容。
15
+ - 本地服务已经离线时无法主动更新飞书卡或发送离线提醒;不为此引入公网入站服务,也不伪装成实时云监控。
16
+ - 服务恢复后优先更新已有控制台卡,再按会话去重发送一次恢复通知。
17
+ - Remote Ready 保持管理员显式开启,不默认开启,也不承诺远程开机或绕过合盖策略。
18
+
19
+ ## 3. 状态模型
20
+
21
+ | 状态 | 含义 | 是否可发任务 | 卡片动作 |
22
+ |---|---|---:|---|
23
+ | 在线 | 消息与卡片事件可用,Codex 正常或可按需启动 | 是 | 完整控制 |
24
+ | 连接中 | 消息事件尚未就绪 | 否 | 不显示虚假按钮 |
25
+ | 部分可用 | 文字消息可用,卡片回调不可用 | 是,建议文字 | 隐藏按钮 |
26
+ | 离线 | 健康心跳过期 | 否 | 展示电源/网络/服务恢复说明 |
27
+ | 异常 | 飞书在线,但 Codex 最近启动失败 | 否 | 刷新、重连 Codex |
28
+ | 维护中 | 服务在线但管理员暂停新任务 | 否 | 查看状态,等待恢复 |
29
+
30
+ ## 4. 核心流程
31
+
32
+ 1. 收到“状态”或控制台卡刷新请求。
33
+ 2. 汇总消息消费者、卡片消费者、Codex app-server、任务队列、电源和 Remote Ready。
34
+ 3. 生成唯一权威设备状态与可操作性。
35
+ 4. 展示采样时间、本人最后成功任务和对应恢复建议。
36
+ 5. 只在回调链路可用时展示按钮;Codex 异常时提供显式重连。
37
+ 6. 服务重启恢复后,更新持久化的旧控制台卡并去重通知。
38
+
39
+ ## 5. 开发任务
40
+
41
+ - [x] D2-T01:定义在线、连接中、部分可用、离线、异常和维护状态。
42
+ - [x] D2-T02:实现纯函数状态推导和状态测试。
43
+ - [x] D2-T03:控制台展示采样时间和本人最后成功任务。
44
+ - [x] D2-T04:异常状态隐藏不可执行动作。
45
+ - [x] D2-T05:增加 Codex 重连动作。
46
+ - [x] D2-T06:持久化设备控制台卡引用。
47
+ - [x] D2-T07:服务恢复后原卡更新和通知去重。
48
+ - [x] D2-T08:补齐重启、过期心跳和恢复集成测试。
49
+
50
+ ## 6. 非目标
51
+
52
+ - 远程开机、远程解锁或绕过公司设备策略。
53
+ - 在没有外部在线控制面的情况下承诺实时离线推送。
54
+ - beta.4 内自动跨多台电脑路由项目和任务。
@@ -0,0 +1,107 @@
1
+ # D3:项目与会话
2
+
3
+ 状态:`beta.4` 闭环已完成
4
+ 优先级:P0
5
+ 日期:2026-07-16
6
+
7
+ > 2026-07-17 更新:群聊话题现在是一等工作会话。群顶层普通 prompt 以根消息创建独立会话键,串内回复恢复同一个 Codex thread;详细规则见 [V4 工作区会话交互模型](../V4_WORKSPACE_SESSION_FLOW.md)。以下按成员隔离规则继续用于群主会话和兼容模式。
8
+
9
+ ## 1. 产品目标
10
+
11
+ 用户在飞书里发起任务前,能够明确确认本地执行目录、Git 分支、未提交状态和 Codex 上下文;项目重名、收藏排序、服务重启或多人共用时,都不能把任务静默送进错误的目录或会话。
12
+
13
+ ## 2. 已确认决策
14
+
15
+ - 一个飞书会话只有一个当前项目,但允许快速切换;群聊默认按成员隔离当前项目和 Codex thread。
16
+ - 项目列表始终展示项目名和可辨识路径。用户目录使用 `~` 缩写;重名项目依靠路径区分,不只显示文件夹名。
17
+ - 收藏和最近使用按成员保存,不成为团队全局偏好,也不能由管理员替成员修改。
18
+ - 收藏优先、最近使用其次;卡片顺序、文字回退列表和 `/use <编号>` 必须使用同一顺序。
19
+ - 卡片下拉切换始终显示确认弹窗。文字切换在存在运行任务、排队任务或已保存 thread 时,需要发送 `确认切换 <项目>`。
20
+ - 切换项目会停止该飞书会话中的未完成任务,并清空当前保存的 Codex 上下文;不会删除项目文件或 Codex 历史 thread。
21
+ - Git 状态只读取当前项目,使用一次有 3 秒超时的只读 `git status`;读取失败不阻塞项目切换。
22
+ - 新建 Codex thread 使用首条有效任务自动命名;名称写入 Codex 原生 thread,因此飞书和本机看到同一个名称。
23
+ - 团队成员只能看到项目 ACL 允许的项目。历史 thread 默认只展示本人通过桥接创建或恢复的记录;管理员可做受审计的团队排障。
24
+
25
+ ## 3. 核心流程
26
+
27
+ ```text
28
+ 发送“项目”
29
+ → 按成员 ACL 过滤项目
30
+ → 收藏优先、最近使用其次排序
31
+ → 展示当前路径、分支、未提交文件数
32
+ → 搜索或选择目标项目
33
+ → 明确提示运行任务、队列和上下文影响
34
+ → 用户确认
35
+ → 停止当前会话未完成任务
36
+ → 切换项目并清空保存的 thread
37
+ → 记录最近使用并更新原卡片
38
+ ```
39
+
40
+ 恢复会话:
41
+
42
+ ```text
43
+ 发送“会话”
44
+ → 只读取当前项目的 Codex thread
45
+ → 应用成员可见性规则
46
+ → 展示名称、最近更新时间和任务摘要
47
+ → 用户选择并确认恢复
48
+ → 停止当前未完成任务
49
+ → 保存选中的原生 thread ID
50
+ → 下一条任务通过 thread/resume 继续
51
+ ```
52
+
53
+ ## 4. 交互与数据规则
54
+
55
+ ### 项目标识
56
+
57
+ - 卡片当前项目区同时展示名称和 `displayPath`。
58
+ - 下拉选项同时包含名称、类型和路径,并对收藏、最近使用增加视觉标记。
59
+ - 最多在卡片展示 100 项;超过上限时,文字命令仍可按名称或路径搜索全部授权项目。
60
+ - 模糊匹配到多个项目时返回候选名称和路径,不自动选择第一个。
61
+
62
+ ### Git 状态
63
+
64
+ - 展示当前分支或 detached HEAD。
65
+ - 展示未提交文件数量以及相对上游的 ahead/behind。
66
+ - 不执行 fetch,不访问网络,不改变 index,也不持有 Git 锁。
67
+
68
+ ### 收藏与最近使用
69
+
70
+ - 唯一键为 `owner_id + project_path`。
71
+ - 最近使用在切换和实际创建任务时更新。
72
+ - ACL 撤销后,对应项目立即从列表、收藏和最近使用结果中消失;保留本地偏好行以便恢复授权后继续使用。
73
+
74
+ ### 会话
75
+
76
+ - 新 thread 名称取首条任务的第一行,清理 Markdown 前缀并限制长度。
77
+ - 会话中心使用 Codex 原生 name/preview/updatedAt,不复制完整对话到桥接数据库。
78
+ - 项目切换只解除当前飞书会话的 thread 绑定,不归档或删除原生 thread。
79
+
80
+ ## 5. 验收标准
81
+
82
+ - 同名项目在所有选择入口都能通过路径辨识。
83
+ - 收藏或最近使用改变排序后,`/use 1` 与列表第 1 项保持一致。
84
+ - 存在任务、队列或保存上下文时,普通文字切换不会立即执行。
85
+ - 项目卡能展示当前 Git 分支和未提交文件数;非 Git 目录不显示伪造状态。
86
+ - 无权项目不会出现在卡片、文字回退、模糊搜索、最近使用或会话历史中。
87
+ - 收藏按成员隔离,管理员不能通过他人的卡片修改其偏好。
88
+ - 服务重启后当前项目、收藏、最近使用和 thread 绑定仍然存在。
89
+ - 新建 thread 获得可读名称,恢复后下一轮继续同一个 thread ID。
90
+
91
+ ## 6. 开发任务
92
+
93
+ - [x] D3-T01:实现当前项目只读 Git 分支、dirty、ahead/behind 采样。
94
+ - [x] D3-T02:项目卡展示可辨识路径、Git 状态和重名辨识信息。
95
+ - [x] D3-T03:实现按成员持久化的收藏、最近使用和访问隔离。
96
+ - [x] D3-T04:统一卡片、文字回退和数字选择器的排序与搜索语义。
97
+ - [x] D3-T05:切换前展示任务、队列和上下文影响,并要求显式确认。
98
+ - [x] D3-T06:为首条任务创建的 Codex thread 自动命名。
99
+ - [x] D3-T07:会话中心展示名称、摘要和更新时间,并恢复原生 thread。
100
+ - [x] D3-T08:补齐 Git 解析、排序、选择、卡片、持久化和命名测试。
101
+
102
+ ## 7. 非目标
103
+
104
+ - 通过飞书输入任意绝对路径并把它注册成项目。
105
+ - 在项目卡内实现完整 Git 分支管理、提交、拉取或合并。
106
+ - 删除、归档或跨项目搬运 Codex 原生 thread。
107
+ - 在 `beta.4` 引入云端项目索引或多设备项目路由。