在别处诞生的项目,也能装上 harness。
在项目内的会话中,/arch-adopt 把这套 .claude/ 安装进从未由 Nerviz 生成的项目,或为落后的项目带来新版本。它拒绝不干净的工作区,为写入的每个文件记录哈希,并把 diff 留给你审阅。
一个操作,两种起点
这不是两条命令。区分两者的是溯源标记;其余流程相同。skill 负责决定:用哪个来源、哪个蓝图、是否可以安全写入。几乎每一个字节随后都由确定性的 export 模式根据数据清单写入。
| 起点 | 发生什么 | skill 如何判断 |
|---|---|---|
从未由 /init-project 生成、没有这种形态 .claude/ 的项目 | 安装 | 没有 .claude/.arch-provenance.json |
已有这套 .claude/ 但版本落后的项目 | 升级 | 标记存在,且指向更早的 ref |
# the example in docs/en/10-arch-adopt.md; the ref, counts and file names are illustrative › /arch-adopt --ref latest-tag --blueprint hexagonal ✅ updated — blueprint hexagonal, ref v0.9.3 (a1b2c3d) Source ....... codeload.github.com, fetched at 14:22 Files ........ 136 written · 118 unchanged · 4 overwritten Warnings ..... none Schema ....... exit 0 Provenance ... ⚠️ 2 files edited locally since the stamp: .claude/rules/persistence.md .claude/settings.json Bounded ctx .. already declared Migrations ... 1 below, to paste when you choose Review: git diff · Undo: git checkout -- .claude Next: /arch-doctor for the full diagnosis
输出取自 nerviz 文档中的示例。ref、数量和文件名仅作示意。
这套流程承诺什么
- 拒绝不干净的工作区。不是 git 仓库,或
git status --porcelain非空:就停止。升级会覆盖文件,所以git diff是你审阅的方式,git checkout是你撤销的方式。它会说明该运行什么,并且不会替你提交。 source的四个值,没有一个是凭记忆写的。base_url、git_url、auth_env和default_ref是extensions.json中的数据。auth_env只写环境变量的名字,从不携带它的值;公开仓库不需要凭据。- 溯源是写下来的,不是承诺出来的。标记记录 ref、sha、蓝图,以及写入的每个文件的哈希。
/arch-doctor把这些哈希与磁盘对比,在下次升级覆盖之前点名你手工修改过的文件。
哪些进入项目,哪些留在外面
这一切都是 extensions.json 的 export 块:数据,而不是文字说明。ArchHook.java schema 会对照磁盘检查清单,所以既不在 include 也不在 exclude 里的 skill 或智能体,会按名字报错。
| 分组 | 内容 |
|---|---|
| Hook 与数据 | ArchHook.java、ArchHook.jar(按字节复制)和 extensions.json |
settings.json | 按 project-bootstrap 的模板整体覆盖:项目自己的 hook 和 permissions 会消失,并出现在 git diff 中 |
| 规则 | 每条规范,其 paths 按当前蓝图的包重写 |
| Skill 与智能体 | 开发用的 skill 和执行器智能体。init-project、project-bootstrap 和 project-initializer 留在外面:它们只在项目存在之前有用 |
| 蓝图 | 只带当前蓝图,绝不带目录;没有它,下次升级就无法解析标记中记录的 id |
| 审计轨迹 | .claude/audit-usage/ 被创建(这会打开轨迹),并随项目纳入版本管理;docs/lessons-learned/ 是本地的,不纳入版本管理 |
已有自己 .claude/ 的项目,路径与清单不同的内容会保留。请先运行 --dry-run:它列出将被覆盖的内容,并且不写入任何东西。
四种情形,下限是其中之一
/arch-adopt 不评判项目的代码。它只决定写入 .claude/ 是否安全。
| 情形 | 步骤 | 结果 |
|---|---|---|
不是 git 仓库,或 git status --porcelain 非空 | 1 | 停止;不写入任何内容 |
| 没有凭据的抓取,或 HTTP 错误 | 3 | 停止;--fail 把 404 变成错误,而不是一个损坏的 tarball |
Spring Boot 低于 doctor.platform.min_line(目前是 4.0) | 5 | export 在写入任何字节之前以 2 退出;没有 --force。向上的路是 /platform-upgrade |
export 之后 schema 没有以 0 退出 | 6 | 文件已经写入;报告先显示失败,步骤 7 到 9 不再运行 |
下限只是下限:没有上限。Spring Boot 5.x 可以通过,而为 4 线编写的规范可能与它产生偏差,且不会有任何警告。隐藏版本号的构建(例如企业级 parent 或外部 BOM)也能通过。
一段可粘贴的提示词,绝不是一次编辑
当规范的变化会让此前生成的代码落后时,这个变化以 extensions.json 的 migrations 块中的一条记录发布。升级时,skill 会显示项目尚未见过、且适用于其蓝图的每一条记录:一段说明,加一段可粘贴到项目里 Claude Code 中的提示词。它绝不会执行。项目自己那份 extensions.json 就是它已看过什么的记录,所以在某条记录之后生成的项目永远不会看到它。
审阅、撤销、诊断
它让工作树带着可供审阅的 diff,并说明如何撤销。之后由 /arch-doctor 给出完整诊断。它发现的内容会变成报告中的一行;只有 doctor.gate.labels 中的行才会让 CI 失败。
- 生成项目。没有
pom.xml或build.gradle时,你要的是/init-project。 - 编写业务代码,或触碰
src/。 - 提交。
- 标记已记录蓝图时再次询问蓝图:升级时,蓝图是项目的既定事实。
# review git diff # undo git checkout -- .claude && git clean -fd .claude # then the full diagnosis › /arch-doctor
- 对应的 skill
它的契约、写入领地,以及 guard 如何处理它。
arch-adopt · skill 页面 → - 完整文档
在 nerviz 仓库中。 (英文)
10-arch-adopt.md →