work-ally 0.2.0-alpha.1

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 (172) hide show
  1. package/AGENTS.md +110 -0
  2. package/DASHBOARD.md +160 -0
  3. package/PRODUCT.md +113 -0
  4. package/README.md +403 -0
  5. package/ally.sh +171 -0
  6. package/bridge/src/approval-rules.ts +360 -0
  7. package/bridge/src/channel-delivery.ts +207 -0
  8. package/bridge/src/channel-types.ts +22 -0
  9. package/bridge/src/channels/fake/adapter.ts +31 -0
  10. package/bridge/src/channels/feishu/adapter.ts +411 -0
  11. package/bridge/src/channels/feishu/approvals.ts +6 -0
  12. package/bridge/src/channels/feishu/formatter.ts +276 -0
  13. package/bridge/src/channels/feishu/normalize.ts +368 -0
  14. package/bridge/src/codex-config.ts +52 -0
  15. package/bridge/src/config.ts +240 -0
  16. package/bridge/src/fake-runtime-client.ts +505 -0
  17. package/bridge/src/handoff-service.ts +494 -0
  18. package/bridge/src/logger.ts +194 -0
  19. package/bridge/src/memory-digest.ts +186 -0
  20. package/bridge/src/receiver-approval-autonomy.ts +158 -0
  21. package/bridge/src/receiver-control-core.ts +140 -0
  22. package/bridge/src/receiver-control-work-session.ts +218 -0
  23. package/bridge/src/receiver-control.ts +83 -0
  24. package/bridge/src/receiver-delivery.ts +136 -0
  25. package/bridge/src/receiver-helpers.ts +96 -0
  26. package/bridge/src/receiver-human-gate.ts +333 -0
  27. package/bridge/src/receiver-inbound-preflight.ts +162 -0
  28. package/bridge/src/receiver-recovery.ts +236 -0
  29. package/bridge/src/receiver-runtime-callbacks.ts +367 -0
  30. package/bridge/src/receiver-runtime-policy.ts +132 -0
  31. package/bridge/src/receiver-runtime-state.ts +124 -0
  32. package/bridge/src/receiver-support-actions.ts +189 -0
  33. package/bridge/src/receiver-thread-start.ts +57 -0
  34. package/bridge/src/receiver-turn-coordination.ts +94 -0
  35. package/bridge/src/receiver-turn-execution.ts +257 -0
  36. package/bridge/src/receiver-turn-failure.ts +143 -0
  37. package/bridge/src/receiver-turn-result.ts +185 -0
  38. package/bridge/src/receiver-turn-steer.ts +70 -0
  39. package/bridge/src/receiver-work-session.ts +76 -0
  40. package/bridge/src/receiver.ts +329 -0
  41. package/bridge/src/router.ts +62 -0
  42. package/bridge/src/runtime-client-agent-messages.ts +150 -0
  43. package/bridge/src/runtime-client-message-dispatch.ts +176 -0
  44. package/bridge/src/runtime-client-protocol.ts +411 -0
  45. package/bridge/src/runtime-client-request-ops.ts +56 -0
  46. package/bridge/src/runtime-client-run-turn.ts +158 -0
  47. package/bridge/src/runtime-client-thread-ops.ts +270 -0
  48. package/bridge/src/runtime-client-transport.ts +309 -0
  49. package/bridge/src/runtime-client-turn-poll.ts +224 -0
  50. package/bridge/src/runtime-client-turn-read.ts +185 -0
  51. package/bridge/src/runtime-client-turn-state.ts +105 -0
  52. package/bridge/src/runtime-client.ts +344 -0
  53. package/bridge/src/runtime-user-input.ts +403 -0
  54. package/bridge/src/scheduler.ts +239 -0
  55. package/bridge/src/server-handoff-command.ts +364 -0
  56. package/bridge/src/server-main.ts +80 -0
  57. package/bridge/src/server-routine-command.ts +60 -0
  58. package/bridge/src/server-routine-execution.ts +222 -0
  59. package/bridge/src/server-runtime-app-support.ts +107 -0
  60. package/bridge/src/server-runtime-app.ts +238 -0
  61. package/bridge/src/server-thread-sync-command.ts +63 -0
  62. package/bridge/src/server.ts +17 -0
  63. package/bridge/src/session-store-delivery.ts +220 -0
  64. package/bridge/src/session-store-human-gate.ts +380 -0
  65. package/bridge/src/session-store-inbound-acceptance.ts +66 -0
  66. package/bridge/src/session-store-meta.ts +134 -0
  67. package/bridge/src/session-store-turn-ledger.ts +272 -0
  68. package/bridge/src/session-store.ts +380 -0
  69. package/bridge/src/system-notify.ts +220 -0
  70. package/bridge/src/thread-sync.ts +200 -0
  71. package/bridge/src/translator.ts +494 -0
  72. package/bridge/src/types.ts +289 -0
  73. package/bridge/src/utils.ts +104 -0
  74. package/bridge/src/work-session-store.ts +471 -0
  75. package/docs/.gitkeep +0 -0
  76. package/docs/architecture/codex-feishu-bridge-proposal.md +2742 -0
  77. package/docs/completed/FEATURE-feishu-markdown-and-reply-support.md +327 -0
  78. package/docs/completed/README.md +21 -0
  79. package/docs/completed/SPEC-approval-autonomy-and-safe-defaults.md +205 -0
  80. package/docs/completed/SPEC-approval-batch-and-strict-reply-shortcuts.md +153 -0
  81. package/docs/completed/SPEC-conversation-noise-reduction-and-busy-input-gate.md +538 -0
  82. package/docs/completed/SPEC-engineering-sop-skillization.md +190 -0
  83. package/docs/completed/SPEC-faithful-bridge-core-thinning-v2.md +376 -0
  84. package/docs/completed/SPEC-faithful-bridge-core-thinning.md +1071 -0
  85. package/docs/completed/SPEC-group-chat-sender-identity.md +301 -0
  86. package/docs/completed/SPEC-middleware-exception-visibility.md +227 -0
  87. package/docs/completed/SPEC-nightly-memory-digest-visibility.md +121 -0
  88. package/docs/completed/SPEC-project-group-chat-human-centered-conversation-mapping.md +326 -0
  89. package/docs/completed/SPEC-remove-cli-persona-bootstrap.md +201 -0
  90. package/docs/developer-workflow.md +49 -0
  91. package/docs/implementation/SPEC-codex-same-machine-session-handoff-implementation.md +239 -0
  92. package/docs/implementation/test-coverage-map.md +363 -0
  93. package/docs/implementation/work-ally-implementation-guide.md +790 -0
  94. package/docs/issues/README.md +10 -0
  95. package/docs/issues/pending/ANALYSIS-ally-premature-recovery-notice-and-task-state-semantics-2026-03-18.md +295 -0
  96. package/docs/issues/resolved/ANALYSIS-approval-waiting-visible-but-approval-artifact-missing-2026-03-16.md +466 -0
  97. package/docs/issues/resolved/ANALYSIS-blocking-state-visible-without-user-actionable-artifact-2026-03-16.md +261 -0
  98. package/docs/issues/resolved/ANALYSIS-codex-app-server-transport-disconnect-semantics-2026-03-14.md +606 -0
  99. package/docs/issues/resolved/ANALYSIS-premature-terminalization-on-fresh-thread-poll-and-object-error-leak-2026-03-16.md +348 -0
  100. package/docs/issues/resolved/ANALYSIS-runtime-turn-delivery-and-recovery-2026-03-14.md +603 -0
  101. package/docs/issues/resolved/ANALYSIS-self-test-gap-approval-waiting-visible-but-approval-artifact-missing-2026-03-16.md +166 -0
  102. package/docs/issues/resolved/ANALYSIS-self-test-gap-blocking-state-visible-without-user-actionable-artifact-2026-03-16.md +186 -0
  103. package/docs/issues/resolved/ANALYSIS-self-test-gap-premature-terminalization-on-fresh-thread-poll-and-object-error-leak-2026-03-16.md +166 -0
  104. package/docs/issues/resolved/REPORT-ally-runtime-turn-delivery-3b42fb8-2026-03-15.md +373 -0
  105. package/docs/manual-acceptance.md +127 -0
  106. package/docs/ops-runbook.md +44 -0
  107. package/docs/planning/FEATURE-memory-system.md +748 -0
  108. package/docs/planning/SPEC-active-turn-steer-and-context-compaction-visibility.md +269 -0
  109. package/docs/planning/SPEC-approval-rules-inheritance-and-local-validation-lane.md +450 -0
  110. package/docs/planning/SPEC-assistant-persona-bootstrap.md +199 -0
  111. package/docs/planning/SPEC-assistant-rename.md +610 -0
  112. package/docs/planning/SPEC-bridge-app-server-protocol-alignment.md +667 -0
  113. package/docs/planning/SPEC-claude-runtime-host-for-work-ally.md +434 -0
  114. package/docs/planning/SPEC-cli-feishu-codex-session-unification.md +236 -0
  115. package/docs/planning/SPEC-codex-same-machine-session-handoff.md +873 -0
  116. package/docs/planning/SPEC-feishu-reaction-shortcuts.md +282 -0
  117. package/docs/planning/SPEC-local-stable-release-boundary.md +166 -0
  118. package/docs/planning/SPEC-managed-thread-entry-and-surface-mobility.md +862 -0
  119. package/docs/planning/SPEC-minimal-bridge-semantics-and-user-visible-surface.md +362 -0
  120. package/docs/planning/SPEC-npm-alpha-distribution-and-install-first-release.md +222 -0
  121. package/docs/planning/SPEC-remove-websocket-runtime-transport.md +364 -0
  122. package/docs/planning/SPEC-runtime-abstraction-phase-1.md +424 -0
  123. package/docs/planning/SPEC-runtime-connection-and-turn-recovery-semantics.md +274 -0
  124. package/docs/planning/SPEC-session-presence-and-state-visibility.md +397 -0
  125. package/docs/planning/SPEC-skill-first-capability-packaging.md +338 -0
  126. package/docs/planning/SPEC-stable-archive-contract.md +456 -0
  127. package/docs/planning/SPEC-supervised-start-boundary.md +127 -0
  128. package/docs/planning/SPEC-user-barrier-reduction-and-activation.md +832 -0
  129. package/docs/planning/ally-next.md +1278 -0
  130. package/docs/planning/assistant-workbench-spec.md +725 -0
  131. package/docs/planning/product-workbench.md +283 -0
  132. package/docs/product-onboarding.md +227 -0
  133. package/docs/product-spec-standard.md +528 -0
  134. package/docs/troubleshooting.md +45 -0
  135. package/docs/user-quickstart.md +46 -0
  136. package/internal/dispatch.sh +95 -0
  137. package/internal/lib/common.sh +1450 -0
  138. package/internal/modules/assistant/manage.sh +1312 -0
  139. package/internal/modules/bootstrap/setup.sh +144 -0
  140. package/internal/modules/config/init-env.sh +10 -0
  141. package/internal/modules/global/manage.sh +154 -0
  142. package/internal/modules/handoff/manage.sh +54 -0
  143. package/internal/modules/mcp/manage.sh +83 -0
  144. package/internal/modules/ops/logs.sh +76 -0
  145. package/internal/modules/routines/manage.sh +55 -0
  146. package/internal/modules/runtime/assistant-autosave.sh +26 -0
  147. package/internal/modules/runtime/restart.sh +6 -0
  148. package/internal/modules/runtime/start.sh +283 -0
  149. package/internal/modules/runtime/status.sh +194 -0
  150. package/internal/modules/runtime/stop.sh +55 -0
  151. package/internal/modules/runtime/supervisor.sh +216 -0
  152. package/internal/modules/runtime/update.sh +26 -0
  153. package/package.json +41 -0
  154. package/runtime/config/.gitkeep +0 -0
  155. package/runtime/host/.gitkeep +0 -0
  156. package/runtime/host/healthcheck-codex-app-server.ts +22 -0
  157. package/runtime/host/ping-pong-codex-app-server.ts +66 -0
  158. package/runtime/host/probe-codex-app-server.ts +115 -0
  159. package/skills/archive-reader/SKILL.md +9 -0
  160. package/skills/feishu-production-debug/SKILL.md +37 -0
  161. package/skills/feishu-production-debug/references/feishu-debug-order.md +49 -0
  162. package/skills/feishu-production-debug/references/platform-permission-baseline.md +23 -0
  163. package/skills/issue-to-spec-triage/SKILL.md +44 -0
  164. package/skills/issue-to-spec-triage/references/triage-rules.md +66 -0
  165. package/skills/memory-digest/SKILL.md +9 -0
  166. package/skills/post-implementation-closure/SKILL.md +39 -0
  167. package/skills/post-implementation-closure/references/closure-checklist.md +45 -0
  168. package/skills/post-implementation-closure/references/doc-drift-map.md +49 -0
  169. package/skills/product-spec/SKILL.md +244 -0
  170. package/templates/env.example +5 -0
  171. package/templates/routines/nightly-memory-digest.yaml +10 -0
  172. package/templates/workspace/AGENTS.md +26 -0
@@ -0,0 +1,528 @@
1
+ # Product Spec Standard
2
+
3
+ 更新时间:2026-03-15
4
+ 状态:Draft / Team standard proposal
5
+
6
+ ## 1. 这份标准解决什么问题
7
+
8
+ 这份标准不是为了把 spec 写得更长,而是为了让 spec 更稳定地起到三件事:
9
+
10
+ 1. 让产品经理把问题讲明白,而不是只给一个方向口号
11
+ 2. 让工程师在开工前知道边界、机制与验收,不靠猜
12
+ 3. 让评审者能快速判断:这件事是否真的 ready for implementation
13
+
14
+ 一份合格 spec 的目标不是“展示思考很多”,而是让后续协作的人能回答:
15
+
16
+ - 这件事到底是什么
17
+ - 为什么值得做 / 为什么现在做
18
+ - 具体要怎么做,做到什么算完成
19
+
20
+ ## 1.1 第一性原理
21
+
22
+ 这份标准最终只服务一个目标:
23
+
24
+ > **写出一份清晰、让别人看得懂、能据此正确开工的 spec。**
25
+
26
+ 因此,所有规则都要服从这三条原则:
27
+
28
+ - 不为了显得专业而增加结构
29
+ - 不为了省事而省掉关键机制
30
+ - 不让后续协作者依赖作者本人现场解释
31
+
32
+ 如果一条规则不能明显提升“清晰、可理解、可开工”,它就不该进入团队标准。
33
+
34
+ ## 1.2 最小工作标准
35
+
36
+ 为了避免标准本身过重,团队日常执行只要求一份 spec 先满足下面 6 件事。
37
+
38
+ ### 必须讲清的 6 件事
39
+
40
+ 1. `是什么`
41
+ - 这次要做的 feature / 变化是什么
42
+ 2. `为什么`
43
+ - 解决什么真实问题,为什么现在做
44
+ 3. `范围`
45
+ - 这次做到什么,不做到什么
46
+ 4. `用户路径`
47
+ - 用户如何触发,主路径和关键异常路径是什么
48
+ 5. `机制`
49
+ - 对象、状态、流程、边界如何工作
50
+ 6. `完成标准`
51
+ - 什么叫 done,如何验证
52
+
53
+ 这 6 件事全部清楚,spec 才能进入 `Ready for implementation`。
54
+
55
+ ## 1.3 推荐分层
56
+
57
+ 为了兼顾“够用”和“不复杂”,建议把 spec 标准分成两层:
58
+
59
+ - `最小标准`:所有非平凡需求都必须满足
60
+ - `展开说明`:当 feature 更复杂时,再补更多细节
61
+
62
+ 在这个定义下:
63
+
64
+ - 不是所有 spec 都必须写得很长
65
+ - 但任何 spec 都不能跳过最小标准
66
+
67
+ ## 2. 什么时候必须写 spec
68
+
69
+ 满足任一条件,就应该先写 spec:
70
+
71
+ - 改动会影响产品语义、默认行为或用户路径
72
+ - 改动跨模块、跨角色或跨系统边界
73
+ - 改动会引入新对象、新状态、新流程或新命令
74
+ - 改动需要产品、工程、设计或运营共同理解同一件事
75
+ - 改动一旦做错,后续返工成本明显高
76
+
77
+ 通常可不单独写 spec 的情况:
78
+
79
+ - 纯文案微调
80
+ - 局部、低风险 bugfix,且不改变产品语义
81
+ - 已有 spec 覆盖范围内的实现细化
82
+
83
+ ## 3. 优秀 spec 的最低标准
84
+
85
+ 业界公开实践有几个稳定共识:
86
+
87
+ - spec / PRD 不应 bloated;它首先要建立共享理解,而不是写成百科全书。Atlassian 明确强调有效 PRD 应该简洁,并至少包含目标、假设、设计和清晰的 out-of-scope。citeturn5view0turn5view1
88
+ - spec 不只写“做什么”,还要写“为什么做、如何衡量成功”。Atlassian 对 product specification 的定义就是:说明 what、why,以及 success 如何衡量。citeturn5view1turn5view0
89
+ - 好的产品文档要先把问题讲清楚,而不是直接接受表面方案。GitLab 明确要求 product 要追到 feature request 背后的基础问题,并先做 problem validation。citeturn5view2turn5view3
90
+ - 文档写法应该直接、清楚、方便匆忙阅读的人理解;Google 的文档风格指南强调简单、一致、直白、避免长句和术语堆叠。citeturn5view5
91
+ - 对中小团队来说,轻量但前置的 design/spec 文档比在代码评审里再吵架更有效。Microsoft Golazo 把 lightweight design doc 和 implementation 前 signoff 作为核心实践,并强调 concise design docs 会形成可检索的长期团队上下文。citeturn5view6
92
+
93
+ 结合这些实践,`work-ally` 需要的不是“大而全模板”,而是一套**够用、可审、能派工**的标准。
94
+
95
+ ## 4. 一份 spec 必须回答的 8 个问题
96
+
97
+ 如果一份 spec 不能清楚回答下面 8 个问题,就不算 ready:
98
+
99
+ 1. 这件事是什么?
100
+ 2. 为什么要做?不做会怎样?为什么现在做?
101
+ 3. 这次到底做到哪里,不做到哪里?
102
+ 4. 用户路径 / 使用场景是什么?
103
+ 5. 产品对象、状态、流程、边界如何变化?
104
+ 6. 关键机制是什么?系统如何工作?
105
+ 7. 什么叫完成?如何验证?
106
+ 8. 已知风险、假设和待决问题是什么?
107
+
108
+ 其中:
109
+
110
+ - `是什么` = 产品定义、scope、对象
111
+ - `为什么` = 背景、问题、目标、优先级理由
112
+ - `如何做` = 机制、流程、状态机、接口边界、迁移、验收
113
+
114
+ ## 5. 推荐标准结构
115
+
116
+ 先说结论:
117
+
118
+ - **团队执行以“最小结构”作为硬标准**
119
+ - **更完整的 10 段结构,作为复杂 feature 的推荐展开版**
120
+
121
+ ### 5.1 最小结构(默认标准)
122
+
123
+ 对大多数 feature,先写到下面 7 段就够了:
124
+
125
+ 1. `Summary`
126
+ 2. `背景`
127
+ 3. `问题定义`
128
+ 4. `目标 / 非目标`
129
+ 5. `产品定义与用户路径`
130
+ 6. `机制设计`
131
+ 7. `验收标准 + 风险/假设/待决问题`
132
+
133
+ 如果这 7 段已经清楚,文档就可以很短,但仍然合格。
134
+
135
+ ### 5.2 完整结构(复杂 feature 推荐)
136
+
137
+ 建议默认使用下面 10 段结构。对小 feature 可以压缩,但不要跳过关键问题。
138
+
139
+ ### 5.3 Header
140
+
141
+ 至少包含:
142
+
143
+ - 标题
144
+ - 更新时间
145
+ - 状态
146
+ - 作者 / owner
147
+ - 相关文档
148
+
149
+ ### 5.4 Summary
150
+
151
+ 用 3-6 句话讲清楚:
152
+
153
+ - 这是什么 feature
154
+ - 它解决什么问题
155
+ - 这次交付的核心变化是什么
156
+
157
+ 要求:
158
+
159
+ - PM、工程师、评审者只看这一段,也能大致知道文档值不值得继续读
160
+
161
+ ### 5.5 背景
162
+
163
+ 回答:现状是什么,为什么会走到今天。
164
+
165
+ 要写:
166
+
167
+ - 当前行为 / 现有能力
168
+ - 用户或业务上下文
169
+ - 触发这次 spec 的事实基础
170
+
171
+ 不要写:
172
+
173
+ - 过长迁移史
174
+ - 与本次决策无关的历史八卦
175
+
176
+ ### 5.6 问题定义
177
+
178
+ 这是最重要的一段之一。
179
+
180
+ 要求:
181
+
182
+ - 问题必须是“用户/产品/系统”的真实缺口,不是“我想做个功能”
183
+ - 优先写问题,而不是先写方案
184
+ - 尽量拆成 2-5 个子问题
185
+
186
+ 好问题定义通常包括:
187
+
188
+ - 谁遇到问题
189
+ - 在什么场景遇到
190
+ - 具体卡在哪里
191
+ - 造成什么后果
192
+ - 当前为什么不能靠已有方案解决
193
+
194
+ ### 5.7 目标与非目标
195
+
196
+ 目标写“这次必须达成什么”;非目标写“这次明确不做什么”。
197
+
198
+ 要求:
199
+
200
+ - 目标不要写成抽象愿景,要能判断是否达成
201
+ - 非目标必须能防止 scope 失控
202
+
203
+ ### 5.8 产品定义与用户路径
204
+
205
+ 回答“是什么”。
206
+
207
+ 至少要包含:
208
+
209
+ - feature 的一句话定义
210
+ - 用户看到什么
211
+ - 用户如何触发
212
+ - 典型路径 A / B / C
213
+ - 异常路径或拒绝路径
214
+
215
+ 如果是非 UI feature,也要写“谁通过什么入口触发,得到什么结果”。
216
+
217
+ ### 5.9 机制设计
218
+
219
+ 回答“如何做”,但不是写代码。
220
+
221
+ 这是很多 spec 最容易缺的部分。最少要讲清:
222
+
223
+ - 新增或变化的核心对象
224
+ - 关键字段 / 主键 / 关系模型
225
+ - 状态机或状态切换条件
226
+ - 端到端流程
227
+ - 模块职责边界
228
+ - 外部依赖和内部依赖
229
+ - 迁移 / 兼容 / fallback 机制
230
+
231
+ 如果 feature 有下列任意一种,就必须单独写清:
232
+
233
+ - 新对象
234
+ - 新 ID
235
+ - 新状态
236
+ - 新命令
237
+ - 新持久化结构
238
+ - 新的“当前绑定 / 历史保留 / 默认行为”
239
+
240
+ ### 5.10 Scope / Phase
241
+
242
+ 如果事情不小,必须写 phase。
243
+
244
+ 要求:
245
+
246
+ - Phase 要按产品可交付切,不按工程模块切
247
+ - 每个 phase 都要说明交付了什么用户价值
248
+ - V1 必须能独立成立,不能只是“铺底但用户无感”
249
+
250
+ 反例提醒:
251
+
252
+ - 不要把 `前端页搭建 / 状态接口接入 / 本地存储改造 / 联调` 这类工程拆任务直接写成产品 phase
253
+ - 不要把 phase 写成“先把基础设施铺好,用户暂时感知不到”的占位说法
254
+ - 如果 phase 只能说明工程顺序,不能说明每一段用户会获得什么新价值,说明 phase 写法不合格
255
+
256
+ ### 5.11 验收标准
257
+
258
+ 这是 spec 是否可派工的硬门槛。
259
+
260
+ 至少要写:
261
+
262
+ - 功能验收
263
+ - 语义验收
264
+ - 验证建议
265
+
266
+ 好的验收标准应该满足:
267
+
268
+ - 工程师能据此写测试
269
+ - 评审者能据此判断 done / not done
270
+ - 不依赖作者本人现场解释
271
+
272
+ ### 5.12 风险 / 假设 / 待决问题
273
+
274
+ 必须区分三类:
275
+
276
+ - `风险`:已知可能出问题,但可以先推进
277
+ - `假设`:当前先按某个前提推进
278
+ - `待决问题`:不拍板就会影响设计或排期
279
+
280
+ 不要把所有不确定性都扔进 open questions。
281
+
282
+ ## 6. 对“如何做”的最低要求
283
+
284
+ 产品经理不需要把 spec 写到程序员直接 copy 成代码,但至少要让工程师不再猜下面这些关键点:
285
+
286
+ - 主要对象是什么
287
+ - 哪个 ID 是主键
288
+ - 当前 / 历史 / 活跃 / 关闭分别是什么意思
289
+ - 默认路径是什么
290
+ - 异常路径怎么处理
291
+ - 谁负责更新状态
292
+ - 什么信息要持久化
293
+ - 什么时候需要迁移旧数据
294
+
295
+ 简单说:
296
+
297
+ - 不要求代码级实现
298
+ - 但要求机制级清晰
299
+
300
+ 一个实用判断方法:
301
+
302
+ > 如果换一个没参与讨论的工程师来读,是否能画出流程图、状态图和模块拆分?
303
+
304
+ 如果不能,说明 spec 的“如何做”还没写清。
305
+
306
+ ## 6.1 什么情况下必须展开“机制设计”
307
+
308
+ 为了防止把每份 spec 都写成复杂设计文档,只在下面这些情况强制展开写:
309
+
310
+ - 引入新对象
311
+ - 引入新 ID / 主键
312
+ - 引入新状态或状态切换
313
+ - 引入新命令 / 新入口
314
+ - 涉及 current / history / default / fallback 这类默认行为
315
+ - 涉及持久化结构变化
316
+
317
+ 如果都不涉及,机制设计可以很短;如果涉及其中任意一项,就不能只写方向。
318
+
319
+ ## 7. 写作要求
320
+
321
+ ### 7.1 语言要求
322
+
323
+ - 先结论,后展开
324
+ - 句子短,少套话
325
+ - 一个术语只表达一个意思
326
+ - 少用“可能 / 也许 / 大概 / 之类”
327
+ - 少写空话,比如“提升体验”“增强能力”而不解释具体提升什么
328
+
329
+ ### 7.2 术语要求
330
+
331
+ - 新术语必须定义
332
+ - 同一概念在全文只能有一个主叫法
333
+ - 不要混用用户概念和系统概念
334
+
335
+ 例如:
336
+
337
+ - `conversation` 是外部聊天窗口
338
+ - `work session` 是产品级连续会话
339
+ - `engine session` 是底层 runtime 可恢复会话
340
+
341
+ 如果三者混着写,工程实现一定会歪。
342
+
343
+ ### 7.3 篇幅要求
344
+
345
+ - 小 feature:800-1800 字常常足够
346
+ - 中等 feature:1500-3500 字更常见
347
+ - 大 feature:可以更长,但必须靠结构让人可扫读
348
+
349
+ 长不是问题,**结构差和信息密度低才是问题**。
350
+
351
+ ## 8. `work-ally` 语境下的特别要求
352
+
353
+ 对这个仓库,spec 还要额外讲清楚下面几类边界:
354
+
355
+ - 用户看到的产品概念,和系统内部 runtime / bridge 概念的区分
356
+ - 项目工作现场、assistant desk、runtime 之间的边界
357
+ - 默认行为是什么,用户是否需要显式命令
358
+ - 哪些内部实现细节不能暴露给普通用户
359
+ - 哪些改动会影响 README、quickstart、ops runbook、troubleshooting
360
+
361
+ 如果 spec 涉及以下变化,必须明确写“文档联动要求”:
362
+
363
+ - 命令语义变化
364
+ - desk 结构变化
365
+ - 记忆机制变化
366
+ - 审批机制变化
367
+ - bridge 行为变化
368
+
369
+ ## 9. 评审通过线
370
+
371
+ 为了保持实用,评审不要追求“写满模板”,而只看一个问题:
372
+
373
+ > 一个没参与前期讨论的工程师,是否能读完后正确开工?
374
+
375
+ 如果答案是否定的,就说明不是结构不够多,而是清晰度还不够。
376
+
377
+ 建议把 spec 评审分成两层:
378
+
379
+ ### 9.1 Ready for review
380
+
381
+ 满足:
382
+
383
+ - 背景、问题、目标、非目标都有
384
+ - 用户路径能讲清楚
385
+ - 没有明显术语混乱
386
+
387
+ ### 9.2 Ready for implementation
388
+
389
+ 满足:
390
+
391
+ - 对象、状态、流程、边界已清楚
392
+ - 验收标准已可测试
393
+ - 风险 / 假设 / 待决问题已分类
394
+ - 关键 open question 不再阻塞工程拆解
395
+ - 如果写了 `Scope / Phase`,其分段必须是按用户价值切的可交付阶段,而不是工程任务分解
396
+
397
+ ## 10. PM 自评分表
398
+
399
+ 每项 0-2 分:
400
+
401
+ - `0` = 缺失或明显不清楚
402
+ - `1` = 有,但仍需大量口头补充
403
+ - `2` = 清楚、可评审、可派工
404
+
405
+ ### 10.1 快速版自检
406
+
407
+ 在正式打分前,先过这 4 个 yes/no 问题:
408
+
409
+ 1. 只看 summary,别人能知道这次改什么吗?
410
+ 2. 只看问题定义,别人能知道为什么非做不可吗?
411
+ 3. 只看机制设计,工程师能画出主流程吗?
412
+ 4. 只看验收标准,评审能判断 done / not done 吗?
413
+
414
+ 如果任一答案是 `否`,先不要进入打分。
415
+
416
+ ### 10.2 评分项
417
+
418
+ 1. Summary 是否在开头就讲清这件事是什么
419
+ 2. 背景是否交代清楚现状与触发原因
420
+ 3. 问题定义是否在讲真实问题,而不是先塞方案
421
+ 4. 目标与非目标是否明确且不打架
422
+ 5. 用户路径是否覆盖主路径和关键异常路径
423
+ 6. 产品对象 / 术语 / 主键是否清楚
424
+ 7. 状态机或关键状态切换是否清楚
425
+ 8. 端到端机制是否能让工程师画出流程图
426
+ 9. 验收标准是否足够判断 done / not done
427
+ 10. 风险 / 假设 / 待决问题是否分开写清楚
428
+
429
+ ### 10.3 通过标准
430
+
431
+ - 总分至少 `16 / 20`
432
+ - 第 3、6、8、9 项不能低于 `1`
433
+
434
+ 如果任一关键项为 `0`,不应标记为 Ready for implementation。
435
+
436
+ ## 11. 推荐模板
437
+
438
+ ### 11.1 最小模板
439
+
440
+ 下面这个版本适合作为团队默认模板:
441
+
442
+ ```md
443
+ # SPEC: <title>
444
+
445
+ 更新时间:YYYY-MM-DD
446
+ 状态:Draft / Ready for review / Ready for implementation / In implementation / Shipped
447
+ Owner:<name>
448
+
449
+ ## 1. Summary
450
+
451
+ ## 2. 背景
452
+
453
+ ## 3. 问题定义
454
+
455
+ ## 4. 目标 / 非目标
456
+
457
+ ## 5. 产品定义与用户路径
458
+
459
+ ## 6. 机制设计
460
+
461
+ ## 7. 验收标准
462
+
463
+ ## 8. 风险 / 假设 / 待决问题
464
+ ```
465
+
466
+ ### 11.2 完整模板
467
+
468
+ 下面这个模板足够覆盖大多数 feature:
469
+
470
+ ```md
471
+ # SPEC: <title>
472
+
473
+ 更新时间:YYYY-MM-DD
474
+ 状态:Draft / Ready for review / Ready for implementation / In implementation / Shipped
475
+ Owner:<name>
476
+ 相关文档:<links>
477
+
478
+ ## 1. Summary
479
+
480
+ ## 2. 背景
481
+
482
+ ## 3. 问题定义
483
+
484
+ ## 4. 目标
485
+
486
+ ## 5. 非目标
487
+
488
+ ## 6. 产品定义与用户路径
489
+
490
+ ## 7. 机制设计
491
+
492
+ ### 7.1 对象与关系
493
+
494
+ ### 7.2 状态机
495
+
496
+ ### 7.3 端到端流程
497
+
498
+ ### 7.4 模块边界 / 依赖 / 迁移
499
+
500
+ ## 8. Scope / Phase
501
+
502
+ ## 9. 验收标准
503
+
504
+ ## 10. 风险 / 假设 / 待决问题
505
+ ```
506
+
507
+ ## 12. 对当前仓库 spec 的观察
508
+
509
+ 当前仓库里比较稳定的优点是:
510
+
511
+ - 多数 spec 已经有“背景 / 问题 / 目标 / 非目标 / 验收”这些骨架,例如 [SPEC-session-presence-and-state-visibility.md](/Users/allenfeng/Development/Repositories/work-ally/docs/planning/SPEC-session-presence-and-state-visibility.md) 和 [SPEC-runtime-connection-and-turn-recovery-semantics.md](/Users/allenfeng/Development/Repositories/work-ally/docs/planning/SPEC-runtime-connection-and-turn-recovery-semantics.md)。
512
+ - 一些较强的 spec 已经开始讲 durable ledger、状态流转、实现要求,这说明团队已经天然在往“机制级 spec”走。
513
+
514
+ 当前更常见的缺口是:
515
+
516
+ - `如何做` 仍然容易停留在方向,而没有把对象、ID、状态机、端到端流程讲透
517
+ - 有时“用户概念”和“系统概念”会混写
518
+ - 有时 phase 是按工程模块切,而不是按用户价值切
519
+
520
+ 这也是为什么下一阶段最值得统一的,不是“再加更多章节”,而是把“机制设计”这一段写扎实。
521
+
522
+ ## 13. 结论
523
+
524
+ 对 `work-ally` 来说,一份够用的优秀 spec 标准可以压缩成一句话:
525
+
526
+ > **用最少但完整的结构,把“是什么、为什么、如何做、做到什么算完成”讲清楚,让一个没参与前期讨论的工程师也能正确开工。**
527
+
528
+ 如果做不到这一点,文档再长也不算好 spec。
@@ -0,0 +1,45 @@
1
+ # 排障手册
2
+
3
+ ## 源码已经改了,但安装版 `ally` 还是旧行为
4
+
5
+ 先执行:
6
+
7
+ ```bash
8
+ npm i -g work-ally@alpha
9
+ ```
10
+
11
+ 当前默认入口是 npm 安装形态,不是源码树。
12
+
13
+ 这意味着:
14
+
15
+ - 你在源码仓库里改代码,不会自动影响已安装版本
16
+ - 需要 npm 安装/升级后,默认 `ally` 才会更新
17
+ - 如果你要直接联调源码,请显式带 `WORK_ALLY_SOURCE_DIR=<repo>`
18
+
19
+ ## `ally start` 失败
20
+
21
+ 优先按顺序排:
22
+
23
+ 1. `ally status --assistant <name>`
24
+ 2. `ally logs bridge --assistant <name>`
25
+ 3. `ally logs supervisor --assistant <name>`
26
+
27
+ 常见原因:
28
+
29
+ - assistant 未 setup
30
+ - Feishu 配置缺失或权限未开通
31
+ - 在受限 AI 执行环境中拉起长期进程
32
+
33
+ ## 如何确认安装来源
34
+
35
+ 执行:
36
+
37
+ ```bash
38
+ ally status --assistant <name>
39
+ ```
40
+
41
+ 重点看:
42
+
43
+ - `install channel`
44
+ - `implementation`
45
+ - `install root`
@@ -0,0 +1,46 @@
1
+ # 用户快速开始(CLI)
2
+
3
+ ## 前提
4
+
5
+ - Node.js 与 npm 已安装
6
+ - 首发正式支持平台:`macOS arm64`
7
+ - 已有可用的模型 provider 环境变量
8
+
9
+ ## 安装
10
+
11
+ ```bash
12
+ npm i -g work-ally@alpha
13
+ ```
14
+
15
+ 安装后确认:
16
+
17
+ ```bash
18
+ ally help
19
+ ```
20
+
21
+ ## 三步启动
22
+
23
+ ```bash
24
+ ally setup <assistant-name> --workspace /path/to/your-project
25
+ ally start --assistant <assistant-name>
26
+ ally status --assistant <assistant-name>
27
+ ```
28
+
29
+ ## 升级
30
+
31
+ ```bash
32
+ npm update -g work-ally
33
+ # 或固定 alpha 通道
34
+ npm i -g work-ally@alpha
35
+ ```
36
+
37
+ ## 关键说明
38
+
39
+ - 默认是 install-first:`ally` 行为来自当前 npm 安装版本
40
+ - 如果你在源码仓库开发并想直接联调,可显式使用:
41
+
42
+ ```bash
43
+ WORK_ALLY_SOURCE_DIR=/path/to/work-ally ally status --assistant <assistant-name>
44
+ ```
45
+
46
+ - 当前不支持用户侧定时任务能力;默认不会在无触发时自行执行任务
@@ -0,0 +1,95 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+
4
+ SCRIPT_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)
5
+ # shellcheck disable=SC1091
6
+ . "$SCRIPT_DIR/lib/common.sh"
7
+
8
+ usage() {
9
+ local cmd_name
10
+ cmd_name=$(work_ally_cmd_name)
11
+ cat <<EOF2
12
+ Usage: $cmd_name <command> [args]
13
+
14
+ Commands:
15
+ setup # assistant scope; requires --workspace <path>
16
+ assistant <add|ensure|bind|remove|rename|list|show> [args] # global profile management
17
+ start # assistant scope; use --assistant <name> when needed
18
+ stop # assistant scope; use --assistant <name> when needed
19
+ restart # assistant scope; use --assistant <name> when needed
20
+ status # assistant scope; use --assistant <name> when needed
21
+ logs [bridge|runtime|supervisor|routine] [follow|print|--tail N] # assistant scope
22
+ update # assistant scope
23
+ codex # assistant scope; launch official Codex CLI with assistant profile
24
+ new|continue|attach|threads [args] # assistant scope; managed Codex thread actions
25
+ handoff <codex|attach|new|continue|threads> [args] # assistant scope; compatibility wrapper
26
+ mcp <status|install-feishu|remove-feishu|list> # assistant scope
27
+ routine <list|run|enable|disable> [args] # assistant scope
28
+ thread-sync [--thread <id>|--json] # assistant scope; sync thread conversation snapshot(s)
29
+ global <list|stop> [args] # machine scope; `global list` shows currently running assistants
30
+ help
31
+ EOF2
32
+ }
33
+
34
+ CMD="${1:-help}"
35
+ shift || true
36
+
37
+ case "$CMD" in
38
+ help|-h|--help)
39
+ usage
40
+ ;;
41
+ assistant)
42
+ exec "$SCRIPT_DIR/modules/assistant/manage.sh" "$@"
43
+ ;;
44
+ global)
45
+ exec "$SCRIPT_DIR/modules/global/manage.sh" "$@"
46
+ ;;
47
+ esac
48
+
49
+ work_ally_init_context
50
+ work_ally_ensure_state_dirs
51
+
52
+ case "$CMD" in
53
+ setup)
54
+ exec "$SCRIPT_DIR/modules/bootstrap/setup.sh" "$@"
55
+ ;;
56
+ start)
57
+ exec "$SCRIPT_DIR/modules/runtime/start.sh" "$@"
58
+ ;;
59
+ stop)
60
+ exec "$SCRIPT_DIR/modules/runtime/stop.sh" "$@"
61
+ ;;
62
+ restart)
63
+ exec "$SCRIPT_DIR/modules/runtime/restart.sh" "$@"
64
+ ;;
65
+ status)
66
+ exec "$SCRIPT_DIR/modules/runtime/status.sh" "$@"
67
+ ;;
68
+ logs)
69
+ exec "$SCRIPT_DIR/modules/ops/logs.sh" "$@"
70
+ ;;
71
+ update)
72
+ exec "$SCRIPT_DIR/modules/runtime/update.sh" "$@"
73
+ ;;
74
+ mcp)
75
+ exec "$SCRIPT_DIR/modules/mcp/manage.sh" "$@"
76
+ ;;
77
+ codex)
78
+ exec "$SCRIPT_DIR/modules/handoff/manage.sh" "codex" "$@"
79
+ ;;
80
+ handoff)
81
+ exec "$SCRIPT_DIR/modules/handoff/manage.sh" "$@"
82
+ ;;
83
+ new|continue|attach|threads)
84
+ exec "$SCRIPT_DIR/modules/handoff/manage.sh" "$CMD" "$@"
85
+ ;;
86
+ routine)
87
+ exec "$SCRIPT_DIR/modules/routines/manage.sh" "$@"
88
+ ;;
89
+ thread-sync)
90
+ exec "$SCRIPT_DIR/modules/handoff/manage.sh" "thread-sync" "$@"
91
+ ;;
92
+ *)
93
+ work_ally_die "Unknown command: $CMD"
94
+ ;;
95
+ esac