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.
- package/AGENTS.md +110 -0
- package/DASHBOARD.md +160 -0
- package/PRODUCT.md +113 -0
- package/README.md +403 -0
- package/ally.sh +171 -0
- package/bridge/src/approval-rules.ts +360 -0
- package/bridge/src/channel-delivery.ts +207 -0
- package/bridge/src/channel-types.ts +22 -0
- package/bridge/src/channels/fake/adapter.ts +31 -0
- package/bridge/src/channels/feishu/adapter.ts +411 -0
- package/bridge/src/channels/feishu/approvals.ts +6 -0
- package/bridge/src/channels/feishu/formatter.ts +276 -0
- package/bridge/src/channels/feishu/normalize.ts +368 -0
- package/bridge/src/codex-config.ts +52 -0
- package/bridge/src/config.ts +240 -0
- package/bridge/src/fake-runtime-client.ts +505 -0
- package/bridge/src/handoff-service.ts +494 -0
- package/bridge/src/logger.ts +194 -0
- package/bridge/src/memory-digest.ts +186 -0
- package/bridge/src/receiver-approval-autonomy.ts +158 -0
- package/bridge/src/receiver-control-core.ts +140 -0
- package/bridge/src/receiver-control-work-session.ts +218 -0
- package/bridge/src/receiver-control.ts +83 -0
- package/bridge/src/receiver-delivery.ts +136 -0
- package/bridge/src/receiver-helpers.ts +96 -0
- package/bridge/src/receiver-human-gate.ts +333 -0
- package/bridge/src/receiver-inbound-preflight.ts +162 -0
- package/bridge/src/receiver-recovery.ts +236 -0
- package/bridge/src/receiver-runtime-callbacks.ts +367 -0
- package/bridge/src/receiver-runtime-policy.ts +132 -0
- package/bridge/src/receiver-runtime-state.ts +124 -0
- package/bridge/src/receiver-support-actions.ts +189 -0
- package/bridge/src/receiver-thread-start.ts +57 -0
- package/bridge/src/receiver-turn-coordination.ts +94 -0
- package/bridge/src/receiver-turn-execution.ts +257 -0
- package/bridge/src/receiver-turn-failure.ts +143 -0
- package/bridge/src/receiver-turn-result.ts +185 -0
- package/bridge/src/receiver-turn-steer.ts +70 -0
- package/bridge/src/receiver-work-session.ts +76 -0
- package/bridge/src/receiver.ts +329 -0
- package/bridge/src/router.ts +62 -0
- package/bridge/src/runtime-client-agent-messages.ts +150 -0
- package/bridge/src/runtime-client-message-dispatch.ts +176 -0
- package/bridge/src/runtime-client-protocol.ts +411 -0
- package/bridge/src/runtime-client-request-ops.ts +56 -0
- package/bridge/src/runtime-client-run-turn.ts +158 -0
- package/bridge/src/runtime-client-thread-ops.ts +270 -0
- package/bridge/src/runtime-client-transport.ts +309 -0
- package/bridge/src/runtime-client-turn-poll.ts +224 -0
- package/bridge/src/runtime-client-turn-read.ts +185 -0
- package/bridge/src/runtime-client-turn-state.ts +105 -0
- package/bridge/src/runtime-client.ts +344 -0
- package/bridge/src/runtime-user-input.ts +403 -0
- package/bridge/src/scheduler.ts +239 -0
- package/bridge/src/server-handoff-command.ts +364 -0
- package/bridge/src/server-main.ts +80 -0
- package/bridge/src/server-routine-command.ts +60 -0
- package/bridge/src/server-routine-execution.ts +222 -0
- package/bridge/src/server-runtime-app-support.ts +107 -0
- package/bridge/src/server-runtime-app.ts +238 -0
- package/bridge/src/server-thread-sync-command.ts +63 -0
- package/bridge/src/server.ts +17 -0
- package/bridge/src/session-store-delivery.ts +220 -0
- package/bridge/src/session-store-human-gate.ts +380 -0
- package/bridge/src/session-store-inbound-acceptance.ts +66 -0
- package/bridge/src/session-store-meta.ts +134 -0
- package/bridge/src/session-store-turn-ledger.ts +272 -0
- package/bridge/src/session-store.ts +380 -0
- package/bridge/src/system-notify.ts +220 -0
- package/bridge/src/thread-sync.ts +200 -0
- package/bridge/src/translator.ts +494 -0
- package/bridge/src/types.ts +289 -0
- package/bridge/src/utils.ts +104 -0
- package/bridge/src/work-session-store.ts +471 -0
- package/docs/.gitkeep +0 -0
- package/docs/architecture/codex-feishu-bridge-proposal.md +2742 -0
- package/docs/completed/FEATURE-feishu-markdown-and-reply-support.md +327 -0
- package/docs/completed/README.md +21 -0
- package/docs/completed/SPEC-approval-autonomy-and-safe-defaults.md +205 -0
- package/docs/completed/SPEC-approval-batch-and-strict-reply-shortcuts.md +153 -0
- package/docs/completed/SPEC-conversation-noise-reduction-and-busy-input-gate.md +538 -0
- package/docs/completed/SPEC-engineering-sop-skillization.md +190 -0
- package/docs/completed/SPEC-faithful-bridge-core-thinning-v2.md +376 -0
- package/docs/completed/SPEC-faithful-bridge-core-thinning.md +1071 -0
- package/docs/completed/SPEC-group-chat-sender-identity.md +301 -0
- package/docs/completed/SPEC-middleware-exception-visibility.md +227 -0
- package/docs/completed/SPEC-nightly-memory-digest-visibility.md +121 -0
- package/docs/completed/SPEC-project-group-chat-human-centered-conversation-mapping.md +326 -0
- package/docs/completed/SPEC-remove-cli-persona-bootstrap.md +201 -0
- package/docs/developer-workflow.md +49 -0
- package/docs/implementation/SPEC-codex-same-machine-session-handoff-implementation.md +239 -0
- package/docs/implementation/test-coverage-map.md +363 -0
- package/docs/implementation/work-ally-implementation-guide.md +790 -0
- package/docs/issues/README.md +10 -0
- package/docs/issues/pending/ANALYSIS-ally-premature-recovery-notice-and-task-state-semantics-2026-03-18.md +295 -0
- package/docs/issues/resolved/ANALYSIS-approval-waiting-visible-but-approval-artifact-missing-2026-03-16.md +466 -0
- package/docs/issues/resolved/ANALYSIS-blocking-state-visible-without-user-actionable-artifact-2026-03-16.md +261 -0
- package/docs/issues/resolved/ANALYSIS-codex-app-server-transport-disconnect-semantics-2026-03-14.md +606 -0
- package/docs/issues/resolved/ANALYSIS-premature-terminalization-on-fresh-thread-poll-and-object-error-leak-2026-03-16.md +348 -0
- package/docs/issues/resolved/ANALYSIS-runtime-turn-delivery-and-recovery-2026-03-14.md +603 -0
- package/docs/issues/resolved/ANALYSIS-self-test-gap-approval-waiting-visible-but-approval-artifact-missing-2026-03-16.md +166 -0
- package/docs/issues/resolved/ANALYSIS-self-test-gap-blocking-state-visible-without-user-actionable-artifact-2026-03-16.md +186 -0
- package/docs/issues/resolved/ANALYSIS-self-test-gap-premature-terminalization-on-fresh-thread-poll-and-object-error-leak-2026-03-16.md +166 -0
- package/docs/issues/resolved/REPORT-ally-runtime-turn-delivery-3b42fb8-2026-03-15.md +373 -0
- package/docs/manual-acceptance.md +127 -0
- package/docs/ops-runbook.md +44 -0
- package/docs/planning/FEATURE-memory-system.md +748 -0
- package/docs/planning/SPEC-active-turn-steer-and-context-compaction-visibility.md +269 -0
- package/docs/planning/SPEC-approval-rules-inheritance-and-local-validation-lane.md +450 -0
- package/docs/planning/SPEC-assistant-persona-bootstrap.md +199 -0
- package/docs/planning/SPEC-assistant-rename.md +610 -0
- package/docs/planning/SPEC-bridge-app-server-protocol-alignment.md +667 -0
- package/docs/planning/SPEC-claude-runtime-host-for-work-ally.md +434 -0
- package/docs/planning/SPEC-cli-feishu-codex-session-unification.md +236 -0
- package/docs/planning/SPEC-codex-same-machine-session-handoff.md +873 -0
- package/docs/planning/SPEC-feishu-reaction-shortcuts.md +282 -0
- package/docs/planning/SPEC-local-stable-release-boundary.md +166 -0
- package/docs/planning/SPEC-managed-thread-entry-and-surface-mobility.md +862 -0
- package/docs/planning/SPEC-minimal-bridge-semantics-and-user-visible-surface.md +362 -0
- package/docs/planning/SPEC-npm-alpha-distribution-and-install-first-release.md +222 -0
- package/docs/planning/SPEC-remove-websocket-runtime-transport.md +364 -0
- package/docs/planning/SPEC-runtime-abstraction-phase-1.md +424 -0
- package/docs/planning/SPEC-runtime-connection-and-turn-recovery-semantics.md +274 -0
- package/docs/planning/SPEC-session-presence-and-state-visibility.md +397 -0
- package/docs/planning/SPEC-skill-first-capability-packaging.md +338 -0
- package/docs/planning/SPEC-stable-archive-contract.md +456 -0
- package/docs/planning/SPEC-supervised-start-boundary.md +127 -0
- package/docs/planning/SPEC-user-barrier-reduction-and-activation.md +832 -0
- package/docs/planning/ally-next.md +1278 -0
- package/docs/planning/assistant-workbench-spec.md +725 -0
- package/docs/planning/product-workbench.md +283 -0
- package/docs/product-onboarding.md +227 -0
- package/docs/product-spec-standard.md +528 -0
- package/docs/troubleshooting.md +45 -0
- package/docs/user-quickstart.md +46 -0
- package/internal/dispatch.sh +95 -0
- package/internal/lib/common.sh +1450 -0
- package/internal/modules/assistant/manage.sh +1312 -0
- package/internal/modules/bootstrap/setup.sh +144 -0
- package/internal/modules/config/init-env.sh +10 -0
- package/internal/modules/global/manage.sh +154 -0
- package/internal/modules/handoff/manage.sh +54 -0
- package/internal/modules/mcp/manage.sh +83 -0
- package/internal/modules/ops/logs.sh +76 -0
- package/internal/modules/routines/manage.sh +55 -0
- package/internal/modules/runtime/assistant-autosave.sh +26 -0
- package/internal/modules/runtime/restart.sh +6 -0
- package/internal/modules/runtime/start.sh +283 -0
- package/internal/modules/runtime/status.sh +194 -0
- package/internal/modules/runtime/stop.sh +55 -0
- package/internal/modules/runtime/supervisor.sh +216 -0
- package/internal/modules/runtime/update.sh +26 -0
- package/package.json +41 -0
- package/runtime/config/.gitkeep +0 -0
- package/runtime/host/.gitkeep +0 -0
- package/runtime/host/healthcheck-codex-app-server.ts +22 -0
- package/runtime/host/ping-pong-codex-app-server.ts +66 -0
- package/runtime/host/probe-codex-app-server.ts +115 -0
- package/skills/archive-reader/SKILL.md +9 -0
- package/skills/feishu-production-debug/SKILL.md +37 -0
- package/skills/feishu-production-debug/references/feishu-debug-order.md +49 -0
- package/skills/feishu-production-debug/references/platform-permission-baseline.md +23 -0
- package/skills/issue-to-spec-triage/SKILL.md +44 -0
- package/skills/issue-to-spec-triage/references/triage-rules.md +66 -0
- package/skills/memory-digest/SKILL.md +9 -0
- package/skills/post-implementation-closure/SKILL.md +39 -0
- package/skills/post-implementation-closure/references/closure-checklist.md +45 -0
- package/skills/post-implementation-closure/references/doc-drift-map.md +49 -0
- package/skills/product-spec/SKILL.md +244 -0
- package/templates/env.example +5 -0
- package/templates/routines/nightly-memory-digest.yaml +10 -0
- package/templates/workspace/AGENTS.md +26 -0
|
@@ -0,0 +1,610 @@
|
|
|
1
|
+
# SPEC: Assistant 改名
|
|
2
|
+
|
|
3
|
+
更新时间:2026-03-18
|
|
4
|
+
状态:Implemented / Pending acceptance
|
|
5
|
+
Owner:work-ally product / engineering
|
|
6
|
+
相关文档:
|
|
7
|
+
- `docs/product-spec-standard.md`
|
|
8
|
+
- `docs/planning/SPEC-codex-same-machine-session-handoff.md`
|
|
9
|
+
- `README.md`
|
|
10
|
+
- `docs/user-quickstart.md`
|
|
11
|
+
- `docs/ops-runbook.md`
|
|
12
|
+
|
|
13
|
+
## 1. Summary
|
|
14
|
+
|
|
15
|
+
这份 spec 为 `work-ally` 增加一条正式的 assistant 改名能力:
|
|
16
|
+
|
|
17
|
+
> 用户可以把一个已经存在的 assistant 从旧名字改成新名字,同时保留同一个 assistant desk、同一份记忆和历史、同一组项目绑定、同一批 runtime / handoff 资产。
|
|
18
|
+
|
|
19
|
+
这不是“新建一个 assistant 再人工搬东西”,也不是“让用户自己改几处文件名”。当前 assistant name 已经是系统级 key,贯穿 registry、desk 路径、`.system/config.env`、runtime state、global lock、work session / same-machine handoff 持久化,以及 desktop read model。rename 的本质是一笔受控迁移。
|
|
20
|
+
|
|
21
|
+
V1 只提供 CLI 正式入口:`./ally.sh assistant rename <old> <new>`。rename 只能在安全前提满足时执行;不安全时必须明确拒绝。rename 成功后,旧名字不再是正式控制入口,也不提供 alias 兼容。
|
|
22
|
+
|
|
23
|
+
这份 spec 同时收口一个关键边界:**系统管理的结构化身份要 clean migration;用户自己写下的自由文本不承诺被静默全局改写。**
|
|
24
|
+
|
|
25
|
+
## 2. 背景
|
|
26
|
+
|
|
27
|
+
当前仓库已经支持 assistant 的创建、绑定、运行、停止、查看和删除,但没有 rename。
|
|
28
|
+
|
|
29
|
+
现状里 assistant 名字并不是 display label,而是以下结构的共同锚点:
|
|
30
|
+
|
|
31
|
+
- `~/.work-ally/assistants/<name>/` desk 根目录
|
|
32
|
+
- `assistants/registry.yaml` 的顶层键
|
|
33
|
+
- `projects/registry.yaml` 中的 `assistant: <name>`
|
|
34
|
+
- `~/.work-ally/assistants/<name>/.system/config.env` 中的 `WORK_ALLY_ASSISTANT_NAME` 及相关 assistant path 字段
|
|
35
|
+
- `~/.work-ally/assistants/<name>/.system/runtime/assistant.env`
|
|
36
|
+
- `~/.work-ally/locks/assistant-<name>.lock`
|
|
37
|
+
- `~/.work-ally/assistants/<name>/.system/runtime/work-sessions/` 下的 assistant index 与 `meta.json` 中的 `assistantName` / `assistantCodexHome`
|
|
38
|
+
- same-machine handoff 导出的 payload 里的 `assistantName`
|
|
39
|
+
- desktop backend / tauri snapshot 中的 assistant `id` / `name` / project `assistant_names`
|
|
40
|
+
|
|
41
|
+
因此,用户今天如果想把 `allen` 改成 `ramond`,并不存在一条官方、安全、可验证的路径。手工修改会同时暴露这些风险:
|
|
42
|
+
|
|
43
|
+
- registry 改了,但 desk 路径没改
|
|
44
|
+
- desk 路径改了,但 `.system/config.env` / `assistant.env` / lock 仍指向旧名字
|
|
45
|
+
- shell 层看似能用,work session / handoff 还挂着旧 assistantName
|
|
46
|
+
- desktop 刷新后还显示旧名字或 ghost record
|
|
47
|
+
- 用户长期资产里哪些该改、哪些不该改,没有明确边界
|
|
48
|
+
|
|
49
|
+
这说明 assistant rename 不是小修文案,而是需要先拍板合同的系统级 feature。
|
|
50
|
+
|
|
51
|
+
## 3. 问题定义
|
|
52
|
+
|
|
53
|
+
本专题要解决 6 个问题。
|
|
54
|
+
|
|
55
|
+
### 3.1 用户没有正式的 rename 主路径
|
|
56
|
+
|
|
57
|
+
当前用户只能创建新 assistant 或删除旧 assistant,不能把“同一个 assistant”换名字。对真实使用来说,这会直接导致身份割裂:名字起错了,只能重建。
|
|
58
|
+
|
|
59
|
+
### 3.2 当前名字耦合得太深,手工修改不可信
|
|
60
|
+
|
|
61
|
+
assistant 名字今天同时承担产品名、CLI 句柄、registry 主键、desk 路径名、runtime 锁键、handoff / work-session 索引键、desktop 控制键。任何“改一两处就行”的认知都不成立。
|
|
62
|
+
|
|
63
|
+
### 3.3 系统缺少对 rename 安全边界的定义
|
|
64
|
+
|
|
65
|
+
没有 spec 时,rename 很容易被做成危险补丁:
|
|
66
|
+
|
|
67
|
+
- assistant 运行中也允许改
|
|
68
|
+
- target 已存在时靠覆盖或猜测继续
|
|
69
|
+
- 迁移中途失败后不回滚
|
|
70
|
+
- 用户自由文本被静默全局替换
|
|
71
|
+
|
|
72
|
+
这些都不可接受。
|
|
73
|
+
|
|
74
|
+
### 3.4 assistant 的“系统身份”和“用户写过的文字”边界没有讲清
|
|
75
|
+
|
|
76
|
+
`SOUL.md`、`NOW.md`、`MEMORY.md`、`journal/`、`conversations/` 等长期资产里可能出现旧名字;其中有些是系统模板生成的,有些是用户自己写的。rename 如果不先定义自动改写边界,就无法做到既安全又可预期。
|
|
77
|
+
|
|
78
|
+
### 3.5 `.system/config.env` 与 runtime state 会放大脏状态
|
|
79
|
+
|
|
80
|
+
当前 desktop 会直接读取 `.system/config.env` 作为本地输入来源;runtime / global tooling 会读取 `assistant.env`、lock、runtime dir。rename 如果只改 registry 和路径,不同步这些受管理状态,系统会出现“名字看似改了,但控制和本地输入还挂在旧 assistant 下”的错位。
|
|
81
|
+
|
|
82
|
+
### 3.6 same-machine handoff / work session 会在 rename 后残留旧 owner
|
|
83
|
+
|
|
84
|
+
bridge 当前已经持久化 work session,对象里直接存 `assistantName` 与 `assistantCodexHome`,assistant index 文件名也按名字生成。rename 如果不迁移这层,后续 handoff export / attach、active work session 解析、ownership 判定都会残留旧名字。
|
|
85
|
+
|
|
86
|
+
## 4. 目标 / 非目标
|
|
87
|
+
|
|
88
|
+
### 4.1 目标
|
|
89
|
+
|
|
90
|
+
1. 提供正式命令 `./ally.sh assistant rename <old> <new>`。
|
|
91
|
+
2. rename 成功后,系统认定这仍是同一个 assistant,而不是新的 assistant 身份。
|
|
92
|
+
3. assistant registry、project registry、desk 路径、`.system/config.env`、runtime `assistant.env`、global lock、work session / same-machine handoff 持久化、desktop read model 都迁移到新名字。
|
|
93
|
+
4. rename 只在安全前提满足时成功;不安全时稳定拒绝。
|
|
94
|
+
5. 如果 rename 过程中的某一步失败,系统要么完整回滚到旧状态,要么明确报出 rollback 失败,不允许静默留下半迁移状态。
|
|
95
|
+
6. 明确自动改写边界:系统管理字段与受管理模板引用必须更新;用户自由文本不承诺全量自动改名。
|
|
96
|
+
7. 补齐 rename 的 shell / unit / 必要 desktop 验证与用户文档。
|
|
97
|
+
|
|
98
|
+
### 4.2 非目标
|
|
99
|
+
|
|
100
|
+
1. 不在 V1 引入新的持久对象,例如独立 `assistant_id`。
|
|
101
|
+
2. 不在 V1 支持 display name / alias 与系统 key 并存。
|
|
102
|
+
3. 不在 V1 提供 desktop GUI rename 按钮。
|
|
103
|
+
4. 不支持 assistant 正在运行、被活锁占用、或被外部 surface 持有时 rename。
|
|
104
|
+
5. 不对 `MEMORY.md`、`NOW.md`、`MISTAKES.md`、`journal/`、`conversations/`、`.system/archive/` 里的任意旧名字做全局搜索替换。
|
|
105
|
+
6. 不负责把旧名字作为兼容命令继续保留。
|
|
106
|
+
7. 不迁移 channel lock key;channel lock 与 app id 绑定,不与 assistant name 绑定。
|
|
107
|
+
|
|
108
|
+
## 5. 产品定义与用户路径
|
|
109
|
+
|
|
110
|
+
### 5.1 一句话定义
|
|
111
|
+
|
|
112
|
+
assistant rename 是一笔针对既有 assistant 身份的**受控迁移**:把旧名字下的系统结构切换到新名字,同时保留同一个 assistant 的历史和绑定。
|
|
113
|
+
|
|
114
|
+
### 5.2 正式入口
|
|
115
|
+
|
|
116
|
+
V1 唯一正式入口:
|
|
117
|
+
|
|
118
|
+
```bash
|
|
119
|
+
./ally.sh assistant rename <old> <new>
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
成功时返回至少包含:
|
|
123
|
+
|
|
124
|
+
- `old_name`
|
|
125
|
+
- `new_name`
|
|
126
|
+
- `assistant_home`
|
|
127
|
+
- `codex_home`
|
|
128
|
+
- `workspace`
|
|
129
|
+
- 如有必要,附带 warnings
|
|
130
|
+
|
|
131
|
+
### 5.3 主路径
|
|
132
|
+
|
|
133
|
+
用户场景:已经有一个 assistant,例如 `allen`,但不满意这个名字,希望改成 `ramond`,同时保留原 desk、Git 历史、绑定项目和 handoff / runtime 资产。
|
|
134
|
+
|
|
135
|
+
主路径:
|
|
136
|
+
|
|
137
|
+
1. 用户执行 `./ally.sh assistant rename allen ramond`。
|
|
138
|
+
2. 系统校验 source assistant 存在、target 名字符合规则且未被占用。
|
|
139
|
+
3. 系统确认 assistant 当前不在运行,也不存在活锁或被外部 surface 持有的 busy 状态。
|
|
140
|
+
4. 系统校验 source assistant 仍处于 canonical 可迁移状态。
|
|
141
|
+
5. 系统在 staging / backup 保护下完成迁移。
|
|
142
|
+
6. 系统输出 rename 成功结果。
|
|
143
|
+
7. 后续 `assistant list/show/status/start/stop/logs`、`global list/stop --assistant`、desktop snapshot、same-machine handoff、project binding 都只认新名字。
|
|
144
|
+
|
|
145
|
+
### 5.4 拒绝路径
|
|
146
|
+
|
|
147
|
+
以下情况必须明确拒绝:
|
|
148
|
+
|
|
149
|
+
1. source assistant 不存在。
|
|
150
|
+
2. target name 非法。
|
|
151
|
+
3. target name 已存在于 assistant registry。
|
|
152
|
+
4. target assistant home、target assistant index、或 target lock file 路径已存在。
|
|
153
|
+
5. source assistant 当前正在运行、被活锁占用,或当前 assistant index 指向一个 active work session 且 surface 不是 `idle` / `closed`。
|
|
154
|
+
6. source assistant 的 registry 路径与 canonical 目录推导不一致,无法安全判定 rename 边界。
|
|
155
|
+
7. staging 或 rollback 失败,系统不能确认最终状态。
|
|
156
|
+
|
|
157
|
+
### 5.5 Rename 完成后的用户体验事实
|
|
158
|
+
|
|
159
|
+
rename 成功后,下面这些事实必须同时成立:
|
|
160
|
+
|
|
161
|
+
- `assistant list` 只能看到新名字。
|
|
162
|
+
- `assistant show <new>` 可以看到原 desk 的长期资产与新路径。
|
|
163
|
+
- 旧名字不再是合法控制入口。
|
|
164
|
+
- desk Git 仓库仍然是原来的那份仓库,只是目录名变了。
|
|
165
|
+
- same-machine handoff 与 active work session 只认新名字。
|
|
166
|
+
- desktop 刷新后只看到新名字,不保留旧名字 ghost record。
|
|
167
|
+
|
|
168
|
+
## 6. 当前影响面总表
|
|
169
|
+
|
|
170
|
+
当前 rename 需要触达的代码与对象至少包括以下几层。
|
|
171
|
+
|
|
172
|
+
### 6.1 命令面与分发
|
|
173
|
+
|
|
174
|
+
- `ally.sh`
|
|
175
|
+
- `internal/dispatch.sh`
|
|
176
|
+
- `internal/modules/assistant/manage.sh`
|
|
177
|
+
|
|
178
|
+
这里决定是否存在正式 `assistant rename` 命令面,以及 help / usage 是否暴露该能力。
|
|
179
|
+
|
|
180
|
+
### 6.2 assistant registry 与 name-derived path
|
|
181
|
+
|
|
182
|
+
- `internal/lib/common.sh`
|
|
183
|
+
- `internal/modules/assistant/manage.sh`
|
|
184
|
+
|
|
185
|
+
这里定义了 assistant home / codex home / runtime / logs / cache / runs / state file 路径推导,以及 registry 的查找和字段读取。当前这些函数都把 name 当成根键。
|
|
186
|
+
|
|
187
|
+
### 6.3 project registry 绑定
|
|
188
|
+
|
|
189
|
+
- `internal/lib/common.sh`
|
|
190
|
+
|
|
191
|
+
`projects/registry.yaml` 里记录的是 `assistant: <name>`,rename 必须同步迁移 workspace -> assistant 绑定值。
|
|
192
|
+
|
|
193
|
+
### 6.4 本地 config 与 runtime state
|
|
194
|
+
|
|
195
|
+
- `internal/lib/common.sh`
|
|
196
|
+
- `internal/modules/bootstrap/setup.sh`
|
|
197
|
+
- `internal/modules/runtime/start.sh`
|
|
198
|
+
- `internal/modules/runtime/stop.sh`
|
|
199
|
+
- `internal/modules/runtime/status.sh`
|
|
200
|
+
- `internal/modules/runtime/supervisor.sh`
|
|
201
|
+
- `internal/modules/global/manage.sh`
|
|
202
|
+
- `internal/modules/ops/logs.sh`
|
|
203
|
+
- `internal/modules/routines/manage.sh`
|
|
204
|
+
- `internal/modules/mcp/manage.sh`
|
|
205
|
+
- `internal/modules/handoff/manage.sh`
|
|
206
|
+
|
|
207
|
+
这里会读取:
|
|
208
|
+
|
|
209
|
+
- `.system/config.env`
|
|
210
|
+
- `.system/runtime/assistant.env`
|
|
211
|
+
- `.system/runtime/bridge.pid` / health files
|
|
212
|
+
- `~/.work-ally/locks/assistant-<name>.lock`
|
|
213
|
+
|
|
214
|
+
rename 后如果任何一处仍指向旧名字,控制链路就会断或显示错位。
|
|
215
|
+
|
|
216
|
+
### 6.5 desk 模板与受管理内容
|
|
217
|
+
|
|
218
|
+
- `internal/modules/assistant/manage.sh`
|
|
219
|
+
|
|
220
|
+
当前至少有以下受管理内容显式嵌入 assistant 名字或 assistant home 路径:
|
|
221
|
+
|
|
222
|
+
- `SOUL.md` 模板中的“名字:<name>`
|
|
223
|
+
- `assistant_home/AGENTS.md`
|
|
224
|
+
- `.system/codex-home/AGENTS.md`
|
|
225
|
+
- `.system/codex-home/config.toml` 中的 assistant desk trusted root / writable root
|
|
226
|
+
|
|
227
|
+
### 6.6 work session / same-machine handoff
|
|
228
|
+
|
|
229
|
+
- `bridge/src/work-session-store.ts`
|
|
230
|
+
- `bridge/src/handoff-service.ts`
|
|
231
|
+
- `bridge/src/types.ts`
|
|
232
|
+
- `bridge/src/server.ts`
|
|
233
|
+
- `bridge/src/receiver.ts`
|
|
234
|
+
- `docs/planning/SPEC-codex-same-machine-session-handoff.md`
|
|
235
|
+
|
|
236
|
+
这里已经持久化:
|
|
237
|
+
|
|
238
|
+
- work session `meta.json` 中的 `assistantName` / `assistantCodexHome`
|
|
239
|
+
- `indexes/assistants/<name>.json`
|
|
240
|
+
- handoff export / attach payload 里的 `assistantName`
|
|
241
|
+
|
|
242
|
+
rename 后这些对象必须与新名字一致。
|
|
243
|
+
|
|
244
|
+
### 6.7 desktop read model 与控制面
|
|
245
|
+
|
|
246
|
+
- `desktop/backend/rust/src/repository.rs`
|
|
247
|
+
- `desktop/backend/rust/src/models.rs`
|
|
248
|
+
- `desktop/src-tauri/src/repository.rs`
|
|
249
|
+
- `desktop/src-tauri/src/models.rs`
|
|
250
|
+
- `desktop/src-tauri/src/lib.rs`
|
|
251
|
+
|
|
252
|
+
desktop 当前直接读取 registry 与 `.system/config.env`,构建 `AssistantSnapshot.name/id` 与 `ProjectSnapshot.assistant_names`,并把 assistant name 当作控制命令参数。
|
|
253
|
+
|
|
254
|
+
### 6.8 测试与 fixtures
|
|
255
|
+
|
|
256
|
+
- `tests/shell/assistant.sh`
|
|
257
|
+
- `tests/shell/assistant-remove.sh`
|
|
258
|
+
- 新增 `tests/shell/assistant-rename.sh`
|
|
259
|
+
- 必要的 bridge / desktop backend tests
|
|
260
|
+
- `tests/fixtures/empty-work-ally-home/...`
|
|
261
|
+
|
|
262
|
+
现有测试覆盖 add / bind / remove,但没有 rename 主路径。
|
|
263
|
+
|
|
264
|
+
## 7. 机制设计
|
|
265
|
+
|
|
266
|
+
### 7.1 V1 不新增 `assistant_id`
|
|
267
|
+
|
|
268
|
+
V1 不引入新的稳定对象 ID。当前 rename 直接迁移现有 assistant key 本身。
|
|
269
|
+
|
|
270
|
+
原因:
|
|
271
|
+
|
|
272
|
+
- 用户当前已经通过名字理解 assistant 身份。
|
|
273
|
+
- 仓库现状所有关键路径都围绕 name 展开。
|
|
274
|
+
- 先把 rename 合同收口,比同时引入新主键体系更可控。
|
|
275
|
+
|
|
276
|
+
这也意味着 V1 的 rename 不是“改 display name”,而是真正迁移系统键。
|
|
277
|
+
|
|
278
|
+
### 7.2 Canonical 可迁移前提
|
|
279
|
+
|
|
280
|
+
只有满足以下前提,rename 才能执行:
|
|
281
|
+
|
|
282
|
+
1. `assistants/registry.yaml` 中 source assistant 存在。
|
|
283
|
+
2. source assistant 的 `assistant_home` 等于 canonical 路径 `~/.work-ally/assistants/<old>`。
|
|
284
|
+
3. source assistant 的 `codex_home` 等于 canonical 路径 `~/.work-ally/assistants/<old>/.system/codex-home`。
|
|
285
|
+
4. 目标 canonical 路径 `~/.work-ally/assistants/<new>` 不存在。
|
|
286
|
+
5. 目标 assistant index 文件 `.../.system/runtime/work-sessions/indexes/assistants/<new>.json` 不存在。
|
|
287
|
+
6. 目标 lock 文件 `~/.work-ally/locks/assistant-<new>.lock` 不存在。
|
|
288
|
+
7. source assistant 不 busy。
|
|
289
|
+
|
|
290
|
+
如果 registry 已被人工改成非 canonical 路径,V1 不尝试猜测如何迁移,而是直接拒绝,并要求先把 profile 修回 canonical 状态。
|
|
291
|
+
|
|
292
|
+
### 7.3 Preflight 规则
|
|
293
|
+
|
|
294
|
+
rename 开始前,系统必须一次性完成以下 preflight:
|
|
295
|
+
|
|
296
|
+
- 校验 `old`、`new` 都满足 assistant name 规则。
|
|
297
|
+
- 校验 `old != new`。
|
|
298
|
+
- 校验 source assistant 已注册。
|
|
299
|
+
- 校验 target assistant 未注册。
|
|
300
|
+
- 校验 source assistant 未运行、未 busy。
|
|
301
|
+
- 只允许清理 stale source lock;不允许绕过活锁。
|
|
302
|
+
- 校验 source desk 目录存在,target desk 目录不存在。
|
|
303
|
+
- 校验 source registry 字段完整,且路径与 canonical 推导一致。
|
|
304
|
+
- 如果存在 `.system/config.env`、`.system/runtime/assistant.env`、assistant index 文件,则它们必须是可读的常规文件;不可读或类型异常时直接拒绝。
|
|
305
|
+
|
|
306
|
+
任一失败都直接退出,不触发任何迁移写入。
|
|
307
|
+
|
|
308
|
+
### 7.4 Busy 定义
|
|
309
|
+
|
|
310
|
+
V1 的 rename busy 定义如下;命中任一条件都必须拒绝:
|
|
311
|
+
|
|
312
|
+
1. `work_ally_assistant_is_busy <old>` 判断为 running。
|
|
313
|
+
2. source lock 文件存在且 PID 存活。
|
|
314
|
+
3. source assistant index 指向一个未归档 work session,且该 session 的 `activeSurface` 为 `work_ally_channel` 或 `official_codex_cli`。
|
|
315
|
+
|
|
316
|
+
下列情况允许继续:
|
|
317
|
+
|
|
318
|
+
- source lock 为 stale,且可被清理。
|
|
319
|
+
- source assistant index 不存在。
|
|
320
|
+
- source assistant index 指向的 work session 已归档,或 `activeSurface` 为 `idle` / `closed`。
|
|
321
|
+
|
|
322
|
+
这里的判断目的是避免 rename 发生在 live runtime / live handoff 期间。
|
|
323
|
+
|
|
324
|
+
### 7.5 迁移事务模型
|
|
325
|
+
|
|
326
|
+
rename 必须按“先 staging,再 commit;失败即 rollback”的方式执行。
|
|
327
|
+
|
|
328
|
+
最小事务顺序如下:
|
|
329
|
+
|
|
330
|
+
1. 读取并缓存 source assistant registry block、project registry 当前内容、source `.system/config.env`、source `.system/runtime/assistant.env`、source lock、source assistant index、所有受影响 work session meta。
|
|
331
|
+
2. 在临时目录生成 rewritten registry / project registry / rewritten managed files / rewritten work session metas。
|
|
332
|
+
3. 执行 desk 根目录 rename:`assistants/<old>` -> `assistants/<new>`。
|
|
333
|
+
4. 在新 desk 路径下写入受管理文件改写:`AGENTS.md`、`SOUL.md` 受管理名字区块、`codex_home/config.toml`、`.system/config.env`、`.system/runtime/assistant.env`。
|
|
334
|
+
5. 写入 assistant registry、project registry、work session metas、assistant index、lock 文件名与内容。
|
|
335
|
+
6. 删除旧 assistant index 文件与旧 lock 文件。
|
|
336
|
+
7. 只有全部成功后才返回 success。
|
|
337
|
+
|
|
338
|
+
rollback 要求:
|
|
339
|
+
|
|
340
|
+
- registry 恢复旧版本。
|
|
341
|
+
- project registry 恢复旧版本。
|
|
342
|
+
- new desk 目录改回 old 路径。
|
|
343
|
+
- `.system/config.env`、`.system/runtime/assistant.env`、assistant index、work session metas、lock 恢复旧内容。
|
|
344
|
+
- 如果已经创建了 target index / target lock,但原状态里不存在,rollback 时必须清掉它们。
|
|
345
|
+
|
|
346
|
+
如果 rollback 也失败,命令必须明确输出 `rollback_failed` 类错误,并附带现场路径,不能假装成功。
|
|
347
|
+
|
|
348
|
+
### 7.6 需要自动迁移的结构化对象
|
|
349
|
+
|
|
350
|
+
#### 7.6.1 `assistants/registry.yaml`
|
|
351
|
+
|
|
352
|
+
rename 时必须更新:
|
|
353
|
+
|
|
354
|
+
- 顶层键:`old` -> `new`
|
|
355
|
+
- `assistant_home`
|
|
356
|
+
- `codex_home`
|
|
357
|
+
- `updated_at`
|
|
358
|
+
|
|
359
|
+
必须保留:
|
|
360
|
+
|
|
361
|
+
- `created_at`
|
|
362
|
+
- `description`
|
|
363
|
+
- `workspace_root`
|
|
364
|
+
|
|
365
|
+
#### 7.6.2 `projects/registry.yaml`
|
|
366
|
+
|
|
367
|
+
所有 `assistant: <old>` 都必须改成 `assistant: <new>`。
|
|
368
|
+
|
|
369
|
+
V1 不保留 alias;rename 成功后 project registry 只认新名字。
|
|
370
|
+
|
|
371
|
+
#### 7.6.3 desk 根目录
|
|
372
|
+
|
|
373
|
+
必须迁移整个 desk 根目录:
|
|
374
|
+
|
|
375
|
+
- `~/.work-ally/assistants/<old>/` -> `~/.work-ally/assistants/<new>/`
|
|
376
|
+
|
|
377
|
+
这意味着以下资产自然跟随迁移:
|
|
378
|
+
|
|
379
|
+
- `SOUL.md`
|
|
380
|
+
- `NOW.md`
|
|
381
|
+
- `MEMORY.md`
|
|
382
|
+
- `MISTAKES.md`
|
|
383
|
+
- `journal/`
|
|
384
|
+
- `conversations/`
|
|
385
|
+
- `.system/archive/`
|
|
386
|
+
- `.git/`
|
|
387
|
+
|
|
388
|
+
#### 7.6.4 `.system/config.env`
|
|
389
|
+
|
|
390
|
+
如果 source assistant 存在 `.system/config.env`,rename 后必须重写以下受管理键:
|
|
391
|
+
|
|
392
|
+
- `WORK_ALLY_ASSISTANT_NAME`
|
|
393
|
+
- `WORK_ALLY_ASSISTANT_HOME`(若存在)
|
|
394
|
+
- `WORK_ALLY_ASSISTANT_CODEX_HOME`(若存在)
|
|
395
|
+
- `WORK_ALLY_STATE_DIR`(若存在)
|
|
396
|
+
|
|
397
|
+
必须保持不变:
|
|
398
|
+
|
|
399
|
+
- `FEISHU_*`
|
|
400
|
+
- `WORK_ALLY_ALLOWED_USER_IDS`
|
|
401
|
+
- `WORK_ALLY_CHANNEL_IMPL`
|
|
402
|
+
- `WORK_ALLY_RUNTIME_MODE`
|
|
403
|
+
- `WORK_ALLY_ASSISTANT_GIT_REMOTE`
|
|
404
|
+
- 其他用户本地输入
|
|
405
|
+
|
|
406
|
+
V1 规则:
|
|
407
|
+
|
|
408
|
+
- 只重写受管理键,不删除、不重排其他键。
|
|
409
|
+
- `.system/config.env` 不存在时不强行创建;沿用现状。
|
|
410
|
+
|
|
411
|
+
#### 7.6.5 `.system/runtime/assistant.env`
|
|
412
|
+
|
|
413
|
+
如果 source assistant 有 `.system/runtime/assistant.env`,rename 后必须重写其中至少这些字段:
|
|
414
|
+
|
|
415
|
+
- `WORK_ALLY_ASSISTANT_NAME`
|
|
416
|
+
- `WORK_ALLY_ASSISTANT_HOME`
|
|
417
|
+
- `WORK_ALLY_ASSISTANT_CODEX_HOME`
|
|
418
|
+
- `WORK_ALLY_STATE_DIR`
|
|
419
|
+
|
|
420
|
+
以及所有仍然内嵌 old canonical path 的字段。
|
|
421
|
+
|
|
422
|
+
#### 7.6.6 global lock
|
|
423
|
+
|
|
424
|
+
如果 source assistant 有 stale lock 文件,rename 后 lock 文件名和内容都要对齐新名字:
|
|
425
|
+
|
|
426
|
+
- 文件名:`assistant-<old>.lock` -> `assistant-<new>.lock`
|
|
427
|
+
- 内容中的 `assistant=<old>` -> `assistant=<new>`
|
|
428
|
+
|
|
429
|
+
活锁场景不允许 rename,因此不会出现边运行边迁移 lock owner 的合同。
|
|
430
|
+
|
|
431
|
+
#### 7.6.7 work sessions / same-machine handoff 持久化
|
|
432
|
+
|
|
433
|
+
如果 source assistant 存在 `.../.system/runtime/work-sessions/`,rename 后必须迁移:
|
|
434
|
+
|
|
435
|
+
- 所有 `meta.json` 中 `assistantName == <old>` 的对象,改成 `assistantName == <new>`
|
|
436
|
+
- 所有 `meta.json` 中 `assistantCodexHome == <old canonical codex home>` 的对象,改成新 canonical codex home
|
|
437
|
+
- assistant index 文件:`indexes/assistants/<old>.json` -> `indexes/assistants/<new>.json`
|
|
438
|
+
- assistant index 内容中的 `assistantName` 改成新名字
|
|
439
|
+
|
|
440
|
+
必须保持不变:
|
|
441
|
+
|
|
442
|
+
- `workSessionId`
|
|
443
|
+
- `runtimeThreadId`
|
|
444
|
+
- `deliveryChannel` / `deliveryConversationKey`
|
|
445
|
+
- `lastTurnId`、`lastPromptPreview`、`lastReplyPreview`
|
|
446
|
+
- archived / history 语义
|
|
447
|
+
|
|
448
|
+
额外合同:
|
|
449
|
+
|
|
450
|
+
- archived work session 也要迁移 `assistantName`,因为它仍属于同一个 assistant 的历史资产。
|
|
451
|
+
- delivery index 文件按 conversation key 建立,不按 assistant name 建立,因此不需要重命名。
|
|
452
|
+
- rename 成功后,same-machine handoff 的 export / attach / active session 解析必须只认新名字。
|
|
453
|
+
|
|
454
|
+
#### 7.6.8 明确不迁移的 channel lock
|
|
455
|
+
|
|
456
|
+
channel lock key 与 channel / app id 绑定,不与 assistant name 绑定。V1 rename 不改写 channel lock。
|
|
457
|
+
|
|
458
|
+
原因:
|
|
459
|
+
|
|
460
|
+
- rename 只允许 idle / not busy 场景。
|
|
461
|
+
- live channel lock 场景本就会被 busy preflight 拒绝。
|
|
462
|
+
|
|
463
|
+
### 7.7 需要自动改写的受管理文件
|
|
464
|
+
|
|
465
|
+
#### 7.7.1 `assistant_home/AGENTS.md`
|
|
466
|
+
|
|
467
|
+
rename 后必须把旧 desk 路径重写成新 desk 路径。
|
|
468
|
+
|
|
469
|
+
#### 7.7.2 `codex_home/AGENTS.md`
|
|
470
|
+
|
|
471
|
+
同上,内部包含 assistant home 路径,也必须更新。
|
|
472
|
+
|
|
473
|
+
#### 7.7.3 `codex_home/config.toml`
|
|
474
|
+
|
|
475
|
+
rename 后必须把 assistant desk 根目录相关 trusted root / writable root 从旧路径更新到新路径。
|
|
476
|
+
|
|
477
|
+
workspace root 不变,不得误改。
|
|
478
|
+
|
|
479
|
+
#### 7.7.4 `SOUL.md`
|
|
480
|
+
|
|
481
|
+
`SOUL.md` 只允许更新受管理的名字区块,不允许把整个文件当模板重写。
|
|
482
|
+
|
|
483
|
+
V1 合同:
|
|
484
|
+
|
|
485
|
+
- 如果 `SOUL.md` 中存在标准区块 `## 你的名称` 下的行 `- 名字:<old>`,rename 时将其改为 `- 名字:<new>`。
|
|
486
|
+
- rename 不尝试全局替换 `SOUL.md` 其他段落中的旧名字。
|
|
487
|
+
- rename 不重排、不覆盖用户已经写下的其他人格内容。
|
|
488
|
+
|
|
489
|
+
### 7.8 明确不自动改写的内容
|
|
490
|
+
|
|
491
|
+
以下内容不做全局改名:
|
|
492
|
+
|
|
493
|
+
- `NOW.md`
|
|
494
|
+
- `MEMORY.md`
|
|
495
|
+
- `MISTAKES.md`
|
|
496
|
+
- `journal/`
|
|
497
|
+
- `conversations/`
|
|
498
|
+
- `.system/archive/`
|
|
499
|
+
- 任何历史日志、历史对话、用户自由书写的说明文案
|
|
500
|
+
|
|
501
|
+
原因:
|
|
502
|
+
|
|
503
|
+
- 这些内容里出现旧名字,可能是历史事实,不应被系统静默重写。
|
|
504
|
+
- V1 无法可靠区分“应改的新身份指代”与“应保留的历史记录”。
|
|
505
|
+
|
|
506
|
+
### 7.9 CLI、global、handoff、desktop 合同
|
|
507
|
+
|
|
508
|
+
rename 成功后必须同时成立:
|
|
509
|
+
|
|
510
|
+
- `assistant list/show/status/start/stop/logs` 只认新名字。
|
|
511
|
+
- `global list` 只枚举新名字;`global stop --assistant <new>` 有效,旧名字无效。
|
|
512
|
+
- `handoff export` / `handoff attach` / active work session 解析只认新名字。
|
|
513
|
+
- `AssistantSnapshot.id` 与 `name` 只暴露新名字。
|
|
514
|
+
- `ProjectSnapshot.assistant_names` 只暴露新名字。
|
|
515
|
+
- 以 assistant name 为参数的 desktop 控制动作,后续必须使用新名字。
|
|
516
|
+
- refresh 后不再出现旧名字 ghost record。
|
|
517
|
+
|
|
518
|
+
### 7.10 命令输出合同
|
|
519
|
+
|
|
520
|
+
成功输出至少包含:
|
|
521
|
+
|
|
522
|
+
- `old_name: <old>`
|
|
523
|
+
- `new_name: <new>`
|
|
524
|
+
- `assistant_home: <new path>`
|
|
525
|
+
- `codex_home: <new path>`
|
|
526
|
+
- `workspace: <workspace_root>`
|
|
527
|
+
|
|
528
|
+
拒绝输出必须短、准、直接,并说明原因,例如:
|
|
529
|
+
|
|
530
|
+
- `Assistant rename refused: target name already exists`
|
|
531
|
+
- `Assistant rename refused: assistant is currently running`
|
|
532
|
+
- `Assistant rename refused: work session is still active`
|
|
533
|
+
- `Assistant rename refused: profile path is not canonical`
|
|
534
|
+
- `Assistant rename failed: rollback_failed`
|
|
535
|
+
|
|
536
|
+
## 8. 验收标准
|
|
537
|
+
|
|
538
|
+
### 8.1 功能验收
|
|
539
|
+
|
|
540
|
+
以下主路径必须成立:
|
|
541
|
+
|
|
542
|
+
1. source assistant idle,target name 可用时,rename 成功。
|
|
543
|
+
2. rename 后 `assistant list`、`assistant show`、`status`、`start`、`stop`、`logs`、`global list/stop --assistant` 都只认新名字。
|
|
544
|
+
3. rename 后原 desk 内容、Git 历史、项目绑定、`codex_home`、长期资产都还在。
|
|
545
|
+
4. rename 后 `.system/config.env` 与 `.system/runtime/assistant.env` 中的受管理 assistant 字段对齐新名字。
|
|
546
|
+
5. rename 后 existing work sessions / assistant index / same-machine handoff 只认新名字。
|
|
547
|
+
6. rename 后 desktop snapshot 只暴露新名字。
|
|
548
|
+
|
|
549
|
+
### 8.2 拒绝路径验收
|
|
550
|
+
|
|
551
|
+
以下场景必须稳定拒绝:
|
|
552
|
+
|
|
553
|
+
1. source assistant 不存在。
|
|
554
|
+
2. target name 非法或已存在。
|
|
555
|
+
3. source assistant 正在运行、被活锁占用,或当前仍有 active work session surface。
|
|
556
|
+
4. target canonical path、target index path、或 target lock path 已存在。
|
|
557
|
+
5. source registry 路径不是 canonical,系统无法安全迁移。
|
|
558
|
+
6. `.system/config.env` / `assistant.env` / assistant index 存在但不可读或无法安全回写。
|
|
559
|
+
|
|
560
|
+
### 8.3 自动化验证基线
|
|
561
|
+
|
|
562
|
+
至少覆盖:
|
|
563
|
+
|
|
564
|
+
- `bash -n ally.sh`
|
|
565
|
+
- `bash -n internal/dispatch.sh`
|
|
566
|
+
- `bash -n internal/modules/assistant/manage.sh`
|
|
567
|
+
- shell:新增 `tests/shell/assistant-rename.sh`
|
|
568
|
+
- shell:成功 rename、busy 拒绝、target exists 拒绝、canonical mismatch 拒绝、rollback 场景
|
|
569
|
+
- shell:rename 后 `global list/stop --assistant <new>` 与旧名字失效
|
|
570
|
+
- shell / unit:rename 后 `.system/config.env` 与 `assistant.env` 的受管理键更新正确
|
|
571
|
+
- bridge/unit:work session assistant index 与 `meta.json` 迁移正确
|
|
572
|
+
- 必要的 desktop/backend 测试:rename 后 machine snapshot / project snapshot 不再保留旧名字
|
|
573
|
+
|
|
574
|
+
### 8.4 文档验收
|
|
575
|
+
|
|
576
|
+
以下文档必须回写:
|
|
577
|
+
|
|
578
|
+
- `README.md`
|
|
579
|
+
- `docs/user-quickstart.md`
|
|
580
|
+
- 必要时 `docs/ops-runbook.md`
|
|
581
|
+
|
|
582
|
+
文档必须明确:
|
|
583
|
+
|
|
584
|
+
- 已支持 `assistant rename`
|
|
585
|
+
- rename 是系统级迁移,不是 display alias
|
|
586
|
+
- 哪些用户自由文本不会被自动改名
|
|
587
|
+
- rename 不支持运行中 assistant
|
|
588
|
+
|
|
589
|
+
## 9. 风险 / 假设 / 待决问题
|
|
590
|
+
|
|
591
|
+
### 9.1 风险
|
|
592
|
+
|
|
593
|
+
- 当前 registry 解析是自定义文本处理,不是强 schema parser;rename 若实现粗糙,容易留下半迁移状态。
|
|
594
|
+
- assistant 名字深度耦合到 shell、bridge、handoff 与 desktop 读模型;任何遗漏都会被用户直接看到。
|
|
595
|
+
- `SOUL.md` 与其他长期资产有用户自写内容,rename 不能装作能把所有旧名字都改干净。
|
|
596
|
+
|
|
597
|
+
### 9.2 假设
|
|
598
|
+
|
|
599
|
+
- assistant desk 默认仍位于 canonical 目录 `~/.work-ally/assistants/<name>/`。
|
|
600
|
+
- rename 发生在同一文件系统卷内,目录 rename 可按本地 move 处理。
|
|
601
|
+
- desktop V1 继续只读 registry / config / snapshot,不在 rename 过程中持有独立写缓存。
|
|
602
|
+
|
|
603
|
+
### 9.3 待决问题
|
|
604
|
+
|
|
605
|
+
当前无阻塞实现的产品级待决问题;V1 边界在本文已固定:
|
|
606
|
+
|
|
607
|
+
- 不做 alias
|
|
608
|
+
- 不做 desktop rename 入口
|
|
609
|
+
- 不做用户自由文本全量改名
|
|
610
|
+
- 不引入新 `assistant_id`
|