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,725 @@
1
+ # assistant-workbench-spec
2
+
3
+ 更新时间:2026-03-18
4
+ 状态:Historical / drifted
5
+
6
+ > 说明:这份文档承载的是较早阶段的产品设想,已明显落后于当前 shipped model。
7
+ > 当前 assistant desk、独立 `CODEX_HOME`、项目绑定、作用域命令与桌面控制面等主能力,请优先以 `README.md`、`DASHBOARD.md`、`docs/implementation/work-ally-implementation-guide.md` 为准。
8
+ > 如需看当前会话主线,请改读 `docs/planning/SPEC-codex-same-machine-session-handoff.md`;不要再把本文当作可直接派工的现行 spec。
9
+
10
+ 本 spec 定义 `work-ally` 下一阶段的正式产品路线:**命名助理独立 profile + 当前项目自然叠加**。
11
+
12
+ 它面向实现者,而不是面向讨论过程本身。
13
+ 目标是让另一位工程师读完后,能够直接开始设计与开发,而不需要再回头猜测“我们到底想做什么”。
14
+
15
+ ---
16
+
17
+ ## 1. 文档目标
18
+
19
+ 这份文档要回答四个问题:
20
+
21
+ 1. 这个 feature 到底是什么
22
+ 2. 为什么要这样做
23
+ 3. 产品边界是什么
24
+ 4. 工程上应如何落地
25
+
26
+ 本 spec 只保留最终结论,不保留方案比较、发散路径或讨论痕迹。
27
+
28
+ ---
29
+
30
+ ## 2. 一句话定义
31
+
32
+ > **给每个助理一个独立 profile,并在当前项目目录中用该 profile 启动 Codex;项目自身规则继续通过项目目录自然生效。**
33
+
34
+ 换句话说:
35
+
36
+ - 助理是谁,放在助理 profile
37
+ - 项目怎么工作,放在项目目录
38
+ - `work-ally` 负责把这两层稳定叠加起来
39
+
40
+ ---
41
+
42
+ ## 3. 产品结论
43
+
44
+ ### 3.1 最终路线
45
+
46
+ 本 feature 的正式路线如下:
47
+
48
+ - 每个命名助理拥有自己的独立 profile
49
+ - profile 的技术承载方式是独立 `CODEX_HOME`
50
+ - 用户总是在**当前项目目录**里启动助理
51
+ - 当前项目自己的 `AGENTS.md` 按 Codex 原生机制自然生效
52
+ - 助理级 guidance 通过该助理的 `CODEX_HOME` 注入
53
+
54
+ ### 3.2 不做的事
55
+
56
+ 本 feature **不**负责:
57
+
58
+ - 不保证用户在原生 Codex App / CLI / IDE 中仍命中同一个助理身份
59
+ - 不把项目变成助理工作台的一部分
60
+ - 不引入 `assistant-root/project/` 作为核心模型
61
+ - 不自建新的会话、上下文、thread、memory runtime
62
+ - 不把长期记忆全文塞进 prompt
63
+ - 不改写项目原有 `AGENTS.md` 作为默认实现路径
64
+
65
+ ### 3.3 产品承诺
66
+
67
+ `work-ally` 只承诺下面这件事:
68
+
69
+ > **当用户通过 `work-ally` 在某个项目目录中启动指定助理时,该助理的 profile 会被稳定注入,当前项目规则也会稳定生效。**
70
+
71
+ 除此之外,不做额外承诺。
72
+
73
+ ---
74
+
75
+ ## 4. 问题定义
76
+
77
+ ### 4.1 我们真正要解决的问题
78
+
79
+ 当前问题不是“如何让 Codex 在所有入口保持同一人格”,而是:
80
+
81
+ > **如何让一个命名助理在通过 `work-ally` 启动时,具备稳定、可恢复、可复用的助理身份。**
82
+
83
+ 这个问题包含三层要求:
84
+
85
+ 1. 助理要有长期身份,而不是每次都靠临时 prompt 拼接
86
+ 2. 项目自身规则不能被助理层覆盖或污染
87
+ 3. 助理长期资产不能与项目仓库混在一起
88
+
89
+ ### 4.2 为什么不能把助理直接揉进项目里
90
+
91
+ 如果把助理人格、记忆、知识、工作流都直接塞进项目目录,会出现以下问题:
92
+
93
+ - 人和项目混层:项目是工作对象,助理是工作主体
94
+ - 项目迁移困难:同一个助理跨项目会不断重复初始化
95
+ - 规则冲突:项目已有 `AGENTS.md` 时,助理规则与项目规则容易纠缠
96
+ - 资产归属不清:长期记忆和项目代码会混进同一个边界
97
+ - 恢复能力差:项目删了、迁了、拆了,助理身份也跟着丢
98
+
99
+ 因此,助理必须有独立于项目的身份容器。
100
+
101
+ ---
102
+
103
+ ## 5. 产品边界
104
+
105
+ ### 5.1 我们支持什么
106
+
107
+ 本 feature 支持:
108
+
109
+ - 注册多个命名助理
110
+ - 为每个助理维护独立 profile
111
+ - 在任意项目目录中选择某个助理启动
112
+ - 让助理级 guidance 与项目级 guidance 正常叠加
113
+ - 让助理长期资产与项目资产分离
114
+
115
+ ### 5.2 我们刻意不支持什么
116
+
117
+ 本 feature 不支持:
118
+
119
+ - “同一个助理跨所有 Codex 入口自动一致”
120
+ - 一助理同时编排多个项目
121
+ - 当前对话里动态切主项目并重新挂载新项目规则
122
+ - 产品层实现自己的上下文压缩 / 总结 / 分层记忆系统
123
+ - 助理人格通过修改用户项目文件来实现
124
+
125
+ ### 5.3 为什么不保证“所有入口同身份”
126
+
127
+ 这是刻意的产品边界,而不是缺陷。
128
+
129
+ 原因如下:
130
+
131
+ - 原生 Codex 是原生 Codex
132
+ - `work-ally` 是在原生 Codex 之上增加“命名助理模式”的产品层
133
+ - 用户若绕过 `work-ally` 直接使用其他入口,属于另一种使用模式
134
+ - 我们不会为了追求“所有入口统一人格”而引入额外复杂度和脆弱性
135
+
136
+ 因此,产品上明确区分:
137
+
138
+ - **原生模式**:用户直接使用 Codex 自己的默认环境
139
+ - **助理模式**:用户通过 `work-ally` 使用命名助理 profile
140
+
141
+ ---
142
+
143
+ ## 6. 核心概念
144
+
145
+ ### 6.1 Assistant
146
+
147
+ `Assistant` 是一个可注册、可命名、可复用的助理身份。
148
+
149
+ 每个助理包含:
150
+
151
+ - `name`:助理名
152
+ - `assistant_home`:助理长期资产目录
153
+ - `codex_home`:该助理专属 `CODEX_HOME`
154
+ - `profile`:助理级 guidance 与 profile 配置
155
+
156
+ 它回答的是:
157
+
158
+ - 这个助理是谁
159
+ - 这个助理长期如何工作
160
+ - 这个助理有哪些长期资产
161
+ - 这个助理的入口 guidance 是什么
162
+
163
+ ### 6.2 Project
164
+
165
+ `Project` 不是一个需要我们建模的新对象。
166
+
167
+ `Project` 在本 feature 中只意味着:
168
+
169
+ - 用户当前所在的工作目录
170
+ - Codex 当前真正要读写和执行的目录
171
+ - 项目规则、构建方式、测试方式的天然承载地
172
+
173
+ 本 feature 不引入额外 `project` 实体,不做项目注册中心。
174
+
175
+ ### 6.3 Assistant Profile
176
+
177
+ `Assistant Profile` 是命名助理的最小可运行身份集合。
178
+
179
+ profile 的技术载体就是该助理独立的 `CODEX_HOME`。
180
+
181
+ 其中需要承载:
182
+
183
+ - 助理级 `AGENTS.md`
184
+ - 助理级配置
185
+ - 助理长期资产入口信息
186
+
187
+ ### 6.4 Runtime State
188
+
189
+ 运行态仍然只是运行态。
190
+
191
+ 例如:
192
+
193
+ - `.work-ally/`
194
+ - pid / health / lock / queue
195
+ - bridge state
196
+ - runtime state
197
+ - logs / sessions / archive
198
+
199
+ 这些是可重建的过程数据,不是助理身份本体。
200
+
201
+ ---
202
+
203
+ ## 7. 设计原则
204
+
205
+ ### 7.1 一层只做一件事
206
+
207
+ - 助理层只定义助理是谁
208
+ - 项目层只定义项目如何工作
209
+ - 运行层只负责把两者接起来
210
+
211
+ ### 7.2 尽量走 Codex 原生机制
212
+
213
+ - 项目规则继续走项目目录中的 `AGENTS.md`
214
+ - 助理规则通过 `CODEX_HOME` 注入
215
+ - 不在产品层发明第二套 guidance 继承系统
216
+
217
+ ### 7.3 边界清晰优先于省一步初始化
218
+
219
+ 即使用户需要理解“助理 profile”这个概念,
220
+ 也不能把助理长期资产、项目代码、运行时状态混成一团。
221
+
222
+ ### 7.4 默认实现必须低侵入
223
+
224
+ 除非未来出现硬性证据证明不够用,
225
+ 否则不允许把“自动改写项目 `AGENTS.md`”作为主路径。
226
+
227
+ ---
228
+
229
+ ## 8. 数据模型
230
+
231
+ ### 8.1 助理注册表
232
+
233
+ 系统需要有一份助理注册表,记录可用助理。
234
+
235
+ 注册表包含以下字段:
236
+
237
+ - `assistant_name`
238
+ - `assistant_home`
239
+ - `codex_home`
240
+ - `description`
241
+ - `created_at` / `updated_at`
242
+
243
+ 结构示例:
244
+
245
+ ```yaml
246
+ assistants:
247
+ allen:
248
+ assistant_home: /path/to/assistants/allen
249
+ codex_home: /path/to/assistants/allen/.codex-home
250
+ description: Personal engineering assistant for Allen
251
+ ```
252
+
253
+ 这里的格式只是结构示例,最终文件格式由实现确定,但字段语义必须保持一致。
254
+
255
+ ### 8.2 助理长期资产目录
256
+
257
+ 每个助理有独立长期资产目录。
258
+
259
+ 当前 spec 不强制固定目录树,但要求具备下列逻辑分区:
260
+
261
+ - `profile/` 或 `codex_home/`
262
+ - `memory/`
263
+ - `knowledge/`
264
+ - `docs/`
265
+ - `routines/`
266
+ - `archive/` 或其他留档目录
267
+
268
+ 是否最终物理命名成这些目录,不是当前 spec 的关键。
269
+
270
+ 关键要求只有两个:
271
+
272
+ 1. 助理资产独立于项目仓库
273
+ 2. 助理资产能独立备份、独立恢复、独立迁移
274
+
275
+ ### 8.3 助理级 `AGENTS.md`
276
+
277
+ 助理 profile 中必须存在一份助理级 `AGENTS.md`,作为助理身份入口。
278
+
279
+ 它的职责是:
280
+
281
+ - 定义助理人格
282
+ - 定义长期工作原则
283
+ - 给出长期记忆索引
284
+ - 标明关键目录映射
285
+ - 告诉系统“需要更多资料时去哪里找”
286
+
287
+ 它不应承担:
288
+
289
+ - 长篇记忆正文
290
+ - 具体项目构建命令
291
+ - 某个项目独有规范
292
+
293
+ ### 8.4 项目级 `AGENTS.md`
294
+
295
+ 项目目录中的 `AGENTS.md` 继续由项目自己负责。
296
+
297
+ 它的职责是:
298
+
299
+ - 定义项目内的开发、构建、测试、提交流程
300
+ - 定义项目特有约束
301
+ - 定义仓库结构、模块规则等
302
+
303
+ 它不应承担:
304
+
305
+ - 助理人格
306
+ - 助理长期记忆
307
+ - 助理全局行为风格
308
+
309
+ ---
310
+
311
+ ## 9. 运行时行为
312
+
313
+ ### 9.1 启动前提
314
+
315
+ 用户已经:
316
+
317
+ - 进入目标项目目录
318
+ - 明确要使用哪个命名助理
319
+
320
+ 本 feature 不处理“进入项目后再切到另一个项目”的复杂流程。
321
+
322
+ ### 9.2 启动流程
323
+
324
+ 当用户在当前项目目录启动某个命名助理时,系统执行:
325
+
326
+ 1. 解析目标助理名
327
+ 2. 从助理注册表中找到对应条目
328
+ 3. 读取该助理的 `codex_home`
329
+ 4. 以**当前目录**作为工作目录启动 Codex 运行时
330
+ 5. 将 `CODEX_HOME` 指向该助理 profile
331
+ 6. 保持项目目录原有 guidance 发现链不变
332
+
333
+ 最终效果:
334
+
335
+ - 助理级 guidance 从助理 profile 来
336
+ - 项目级 guidance 从当前项目目录来
337
+ - 二者在一次启动中共同生效
338
+
339
+ ### 9.3 运行中可见性
340
+
341
+ 系统需要明确告诉用户以下信息:
342
+
343
+ - 当前使用的助理名
344
+ - 当前工作目录
345
+ - 当前是否处于“助理模式”
346
+ - 当前使用的 profile / `CODEX_HOME` 来源
347
+
348
+ 这是产品层必须显性的内容,避免用户误解自己现在到底在什么模式下工作。
349
+
350
+ ### 9.4 停止与重启
351
+
352
+ 停止和重启只影响当前运行实例,不改变:
353
+
354
+ - 助理注册信息
355
+ - 助理长期资产
356
+ - 项目目录本身
357
+
358
+ 也就是说,运行实例可销毁,但助理身份必须可恢复。
359
+
360
+ ---
361
+
362
+ ## 10. 配置、凭证与责任分层
363
+
364
+ ### 10.1 配置隔离原则
365
+
366
+ 本 feature 的正式配置策略如下:
367
+
368
+ - 每个助理拥有独立 `CODEX_HOME`
369
+ - 每个助理拥有自己的 `config.toml` 与本地状态目录
370
+ - 助理的模型、推理强度、verbosity、MCP、审批策略等默认值,都在该助理自己的 profile 中定义
371
+ - 助理之间不共享配置文件本体
372
+
373
+ 也就是说:
374
+
375
+ > **助理的行为默认值按助理隔离。**
376
+
377
+ ### 10.2 凭证策略
378
+
379
+ 本 feature 的正式凭证策略如下:
380
+
381
+ - 助理配置独立
382
+ - 凭证默认共享
383
+
384
+ 当前实现采用:
385
+
386
+ - 各助理自己的 `config.toml` 可以独立存在
387
+ - 配置中的 provider 凭证引用共享环境变量或共享认证来源
388
+ - 不要求用户为每个助理重复录入同一套 API key
389
+ - 不应把同一份密钥复制散落到多个助理目录中作为默认做法
390
+
391
+ 也就是说:
392
+
393
+ > **独立的是助理配置,不是默认要求独立的是助理密钥。**
394
+
395
+ 这样做的原因是:
396
+
397
+ - 能保留每个助理的独立行为默认值
398
+ - 能降低用户初始化成本
399
+ - 能减少敏感凭证在多个目录中的散落
400
+ - 同时保留未来按助理隔离凭证的扩展空间
401
+
402
+ ### 10.3 产品层责任
403
+
404
+ `work-ally` 负责:
405
+
406
+ - 助理注册与查找
407
+ - 助理 profile 解析
408
+ - 启动时注入正确 `CODEX_HOME`
409
+ - 让当前项目目录继续作为工作目录
410
+ - 在状态与日志中明确当前助理身份
411
+ - 让每个助理拥有独立配置面
412
+ - 让默认凭证来源保持共享且可复用
413
+
414
+ ### 10.4 Codex 原生责任
415
+
416
+ Codex 原生负责:
417
+
418
+ - 基于 `CODEX_HOME` 加载全局 guidance
419
+ - 基于当前项目目录加载项目 guidance
420
+ - 读取对应 profile 下的模型与运行配置
421
+ - 在运行时管理 thread / context / compaction / tool use 等原生能力
422
+
423
+ ### 10.5 项目自身责任
424
+
425
+ 项目自己负责:
426
+
427
+ - 维护项目级 `AGENTS.md`
428
+ - 维护本项目测试、构建、提交流程
429
+ - 维护项目代码与 Git 历史
430
+
431
+ ---
432
+
433
+ ## 11. 默认用户路径
434
+
435
+ ### 11.1 标准路径
436
+
437
+ 标准用户路径如下:
438
+
439
+ 1. 用户进入目标项目目录
440
+ 2. 用户选择一个已注册助理
441
+ 3. 用户通过 `work-ally` 启动该助理
442
+ 4. 系统以当前项目目录 + 该助理 profile 启动 Codex
443
+ 5. 用户开始对话、修改代码、调用工具
444
+
445
+ ### 11.2 非标准路径
446
+
447
+ 如果用户绕过 `work-ally`,直接使用原生 Codex:
448
+
449
+ - 可以正常工作
450
+ - 但不属于本 feature 保证范围
451
+ - 不应假定仍命中同一个命名助理身份
452
+
453
+ 实现与文档中都必须明确这一点。
454
+
455
+ ---
456
+
457
+ ## 12. 失败场景与预期行为
458
+
459
+ ### 12.1 助理未注册
460
+
461
+ 若用户指定的助理不存在:
462
+
463
+ - 启动失败
464
+ - 提示助理未注册
465
+ - 给出后续动作,例如注册或列出可用助理
466
+
467
+ ### 12.2 助理 profile 缺失或损坏
468
+
469
+ 若注册表存在,但 `codex_home` 不存在或关键文件缺失:
470
+
471
+ - 启动失败
472
+ - 报告 profile 不完整
473
+ - 不得静默回退到用户默认 `~/.codex`
474
+
475
+ ### 12.3 项目目录无 `AGENTS.md`
476
+
477
+ 这是正常场景。
478
+
479
+ 预期行为:
480
+
481
+ - 继续启动
482
+ - 仅加载助理级 guidance
483
+ - 不把“项目缺失 `AGENTS.md`”视为错误
484
+
485
+ ### 12.4 用户直接使用原生 Codex 后又回来用 `work-ally`
486
+
487
+ 这是正常场景。
488
+
489
+ 预期行为:
490
+
491
+ - `work-ally` 重新按命名助理模式启动
492
+ - 不尝试追踪外部运行实例的人格一致性
493
+ - 只保证本次通过 `work-ally` 启动的实例是正确的
494
+
495
+ ---
496
+
497
+ ## 13. 实现约束
498
+
499
+ ### 13.1 不允许的实现捷径
500
+
501
+ 以下方式不得作为主实现:
502
+
503
+ - 自动 prepend / overwrite 用户项目 `AGENTS.md`
504
+ - 通过复制项目到助理目录来实现 profile 注入
505
+ - 通过生成超长系统 prompt 代替助理级 `AGENTS.md`
506
+ - 通过共享单一 `CODEX_HOME` + 临时文件覆盖的方式伪装多助理
507
+
508
+ ### 13.2 可接受的实现方向
509
+
510
+ 实现可以自由选择具体文件布局,但必须满足:
511
+
512
+ - 每个助理有独立 `CODEX_HOME`
513
+ - 当前项目目录保持原位,不被搬运、不被挂载为核心模型
514
+ - 助理级 guidance 与项目级 guidance 是叠加关系,不是替代关系
515
+ - 助理身份的建立不依赖修改项目仓库文件
516
+
517
+ ---
518
+
519
+ ## 14. 验收标准
520
+
521
+ ### 14.1 功能验收
522
+
523
+ 以下场景必须成立:
524
+
525
+ 1. 可以注册两个不同助理
526
+ 2. 同一项目目录中,使用不同助理启动时,能命中不同 profile
527
+ 3. 同一助理可在两个不同项目目录中启动
528
+ 4. 项目目录中的 `AGENTS.md` 仍按原有方式生效
529
+ 5. 项目目录没有 `AGENTS.md` 时仍可正常启动
530
+ 6. 助理 profile 缺失时启动明确失败,不静默回退
531
+
532
+ ### 14.2 产品验收
533
+
534
+ 系统需要让用户明确看到:
535
+
536
+ - 当前助理是谁
537
+ - 当前工作目录是什么
538
+ - 当前正在使用助理模式,而非原生模式
539
+
540
+ ### 14.3 架构验收
541
+
542
+ 实现完成后,必须满足:
543
+
544
+ - 助理资产与项目仓库边界清晰
545
+ - 不需要修改项目 `AGENTS.md` 才能工作
546
+ - 不引入新的上下文系统
547
+ - 不引入 `assistant-root/project/` 作为产品核心
548
+
549
+ ---
550
+
551
+ ## 15. 后续阶段不在本次范围内的潜在扩展
552
+
553
+ 以下内容不在本次范围内:
554
+
555
+ - 项目默认绑定某个助理
556
+ - 助理共享 / 导出 / 团队分发
557
+ - 助理市场或模板化初始化
558
+ - 助理多项目调度
559
+ - 可视化的助理列表与状态面板
560
+ - 助理级长期记忆治理策略
561
+ - 按助理隔离凭证与计费账户
562
+
563
+ 这些内容不阻塞当前正式路线落地。
564
+
565
+ ---
566
+
567
+ ## 16. 实施拆分
568
+
569
+ 本节将 spec 直接拆成可执行子任务,供下一位工程师按顺序推进。
570
+
571
+ ### 16.1 Task 1:定义助理注册表
572
+
573
+ 目标:建立“命名助理 -> profile / `CODEX_HOME` / 资产目录”的稳定映射。
574
+
575
+ 完成标准:
576
+
577
+ - 能落地一份助理注册表
578
+ - 能唯一定位某个助理的 `assistant_home`
579
+ - 能唯一定位某个助理的 `codex_home`
580
+ - 能判断助理是否已注册
581
+ - 注册表字段语义与本 spec 一致
582
+
583
+ 当前状态:未开始
584
+
585
+ ### 16.2 Task 2:定义助理 profile 目录约定
586
+
587
+ 目标:确定每个助理 profile 与长期资产的最小目录结构。
588
+
589
+ 完成标准:
590
+
591
+ - 明确助理级 `AGENTS.md` 放置位置
592
+ - 明确 `config.toml` 放置位置
593
+ - 明确长期资产目录的逻辑分区
594
+ - 明确哪些内容属于 profile,哪些内容属于运行时状态
595
+
596
+ 当前状态:未开始
597
+
598
+ ### 16.3 Task 3:实现启动时的 `CODEX_HOME` 注入
599
+
600
+ 目标:在当前项目目录启动命名助理时,正确注入对应 profile。
601
+
602
+ 完成标准:
603
+
604
+ - 启动时能根据助理名解析到 `codex_home`
605
+ - Codex 运行实例使用该助理自己的 `CODEX_HOME`
606
+ - 当前工作目录保持为用户所在项目目录
607
+ - 项目级 `AGENTS.md` 仍能自然生效
608
+
609
+ 当前状态:未开始
610
+
611
+ ### 16.4 Task 4:实现配置与凭证策略
612
+
613
+ 目标:落地“配置独立、凭证默认共享”的正式结论。
614
+
615
+ 完成标准:
616
+
617
+ - 每个助理拥有自己的 `config.toml`
618
+ - 助理配置之间彼此独立
619
+ - 默认 provider 凭证来自共享环境变量或共享认证来源
620
+ - 不要求用户为每个助理重复录入同一套 API key
621
+ - 不把同一份密钥复制散落到多个助理目录中作为默认行为
622
+
623
+ 当前状态:未开始
624
+
625
+ ### 16.5 Task 5:实现状态可见性
626
+
627
+ 目标:让用户清楚知道当前是谁、在哪、以什么模式运行。
628
+
629
+ 完成标准:
630
+
631
+ - 状态输出中能看到当前助理名
632
+ - 状态输出中能看到当前工作目录
633
+ - 状态输出中能看到当前处于助理模式
634
+ - 状态输出中能看到当前 profile / `CODEX_HOME` 来源
635
+
636
+ 当前状态:未开始
637
+
638
+ ### 16.6 Task 6:实现失败场景处理
639
+
640
+ 目标:让所有关键失败都具备一致、明确、不可误解的行为。
641
+
642
+ 完成标准:
643
+
644
+ - 助理未注册时明确失败
645
+ - `codex_home` 缺失或损坏时明确失败
646
+ - 不发生静默回退到默认 `~/.codex`
647
+ - 项目无 `AGENTS.md` 时仍可正常启动
648
+
649
+ 当前状态:未开始
650
+
651
+ ### 16.7 Task 7:补齐验证与文档
652
+
653
+ 目标:让该 feature 可验收、可交接、可继续开发。
654
+
655
+ 完成标准:
656
+
657
+ - 有对应的最小验证路径
658
+ - README 或相关维护文档补到位
659
+ - 行为与本 spec 保持一致
660
+ - 验收项能被逐条核对
661
+
662
+ 当前状态:未开始
663
+
664
+ ---
665
+
666
+ ## 17. 当前进度
667
+
668
+ 截至本 spec 更新时:
669
+
670
+ - 产品路线:已拍板
671
+ - 关键边界:已拍板
672
+ - 配置与凭证策略:已拍板
673
+ - 实现:未开始
674
+ - 验收:未开始
675
+
676
+ 也就是说:
677
+
678
+ > **这份文档当前承担的是“实现起点”职责,而不是“实施中记录”职责。**
679
+
680
+ 如果后续进入开发阶段,应由实施文档或任务文档承接实时进度,而不是回头污染本 spec 主体。
681
+
682
+ ---
683
+
684
+ ## 18. Definition of Done
685
+
686
+ 当且仅当满足以下条件时,本 feature 才算完成:
687
+
688
+ ### 18.1 Spec 层 DoD
689
+
690
+ - 另一位工程师在低上下文下读完本文,知道要做什么
691
+ - 另一位工程师在低上下文下读完本文,知道不该做什么
692
+ - 另一位工程师在低上下文下读完本文,知道要从哪些子任务开始做
693
+
694
+ ### 18.2 实现层 DoD
695
+
696
+ - 命名助理可被注册并解析
697
+ - 不同助理可命中不同 `CODEX_HOME`
698
+ - 同一助理可在不同项目目录启动
699
+ - 项目级 `AGENTS.md` 与助理级 profile 能正确叠加
700
+ - 配置独立、凭证默认共享的策略真实落地
701
+ - 启动失败不发生静默回退到默认全局配置
702
+
703
+ ### 18.3 产品层 DoD
704
+
705
+ - 用户能明确知道当前使用的是哪个助理
706
+ - 用户能明确知道当前所在的工作目录
707
+ - 用户能明确知道当前处于助理模式,而不是原生模式
708
+ - 用户在关键错误场景下能得到明确、可操作的提示
709
+
710
+ ### 18.4 架构层 DoD
711
+
712
+ - 不引入 `assistant-root/project/` 作为核心模型
713
+ - 不修改项目 `AGENTS.md` 作为主实现路径
714
+ - 不引入新的 thread / session / context 管理层
715
+ - 助理资产、项目资产、运行时状态边界清晰
716
+
717
+ ---
718
+
719
+ ## 19. 最终结论
720
+
721
+ 本 feature 的正式定义如下:
722
+
723
+ > `work-ally` 为命名助理提供独立 profile,并在当前项目目录中以该 profile 启动 Codex;项目规则继续由项目目录自然提供,助理身份与项目边界保持分离。
724
+
725
+ 这就是本 feature 的唯一主路线。