@seanyao/roll 4.630.2 → 4.702.2

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 (108) hide show
  1. package/CHANGELOG.md +64 -0
  2. package/README.md +65 -56
  3. package/conventions/global/AGENTS.md +8 -7
  4. package/dist/roll.mjs +12909 -8532
  5. package/docs/INDEX.md +32 -0
  6. package/docs/architecture.md +444 -0
  7. package/docs/difftest-freeze-paradigm.md +113 -0
  8. package/docs/live-console.md +203 -0
  9. package/docs/manifesto.md +65 -0
  10. package/docs/migration/role-taxonomy-v4.md +60 -0
  11. package/docs/verification.md +83 -0
  12. package/guide/INDEX.md +86 -0
  13. package/guide/assets/layouts/cards-2.png +0 -0
  14. package/guide/assets/layouts/cards-3.png +0 -0
  15. package/guide/assets/layouts/cards-4.png +0 -0
  16. package/guide/assets/layouts/compare.png +0 -0
  17. package/guide/assets/layouts/highlight.png +0 -0
  18. package/guide/assets/layouts/pipeline.png +0 -0
  19. package/guide/assets/layouts/plain.png +0 -0
  20. package/guide/assets/layouts/quote.png +0 -0
  21. package/guide/assets/layouts/timeline.png +0 -0
  22. package/guide/en/acceptance-evidence.md +231 -0
  23. package/guide/en/ai-agents.md +185 -0
  24. package/guide/en/backlog-github-sync.md +108 -0
  25. package/guide/en/changelog.md +66 -0
  26. package/guide/en/configuration.md +112 -0
  27. package/guide/en/consistency.md +58 -0
  28. package/guide/en/conventions.md +113 -0
  29. package/guide/en/dream.md +121 -0
  30. package/guide/en/faq.md +855 -0
  31. package/guide/en/feedback.md +31 -0
  32. package/guide/en/getting-started.md +103 -0
  33. package/guide/en/installation.md +86 -0
  34. package/guide/en/legacy-onboarding.md +195 -0
  35. package/guide/en/loop-data-layout.md +256 -0
  36. package/guide/en/loop-driven-architecture.md +186 -0
  37. package/guide/en/loop.md +1324 -0
  38. package/guide/en/methodology.md +715 -0
  39. package/guide/en/migration-2.0.md +154 -0
  40. package/guide/en/overview.md +190 -0
  41. package/guide/en/pairing.md +151 -0
  42. package/guide/en/patterns/README.md +76 -0
  43. package/guide/en/patterns/graft-pattern.md +110 -0
  44. package/guide/en/patterns/replant-pattern.md +114 -0
  45. package/guide/en/patterns/seed-pattern.md +132 -0
  46. package/guide/en/peer.md +71 -0
  47. package/guide/en/pr-review.md +62 -0
  48. package/guide/en/practices/engineering-common-sense.md +395 -0
  49. package/guide/en/pricing.md +116 -0
  50. package/guide/en/project-setup.md +126 -0
  51. package/guide/en/roll-doc-audit.md +98 -0
  52. package/guide/en/skills.md +206 -0
  53. package/guide/en/test-isolation.md +51 -0
  54. package/guide/en/testing/quality-rubric.md +340 -0
  55. package/guide/en/testing.md +123 -0
  56. package/guide/en/tools.md +173 -0
  57. package/guide/skills.md +30 -0
  58. package/guide/zh/acceptance-evidence.md +194 -0
  59. package/guide/zh/ai-agents.md +170 -0
  60. package/guide/zh/backlog-github-sync.md +105 -0
  61. package/guide/zh/changelog.md +57 -0
  62. package/guide/zh/configuration.md +99 -0
  63. package/guide/zh/consistency.md +48 -0
  64. package/guide/zh/conventions.md +96 -0
  65. package/guide/zh/dream.md +97 -0
  66. package/guide/zh/faq.md +773 -0
  67. package/guide/zh/feedback.md +30 -0
  68. package/guide/zh/getting-started.md +96 -0
  69. package/guide/zh/installation.md +83 -0
  70. package/guide/zh/legacy-onboarding.md +192 -0
  71. package/guide/zh/loop-data-layout.md +236 -0
  72. package/guide/zh/loop-driven-architecture.md +186 -0
  73. package/guide/zh/loop.md +1124 -0
  74. package/guide/zh/methodology.md +702 -0
  75. package/guide/zh/migration-2.0.md +154 -0
  76. package/guide/zh/overview.md +186 -0
  77. package/guide/zh/pairing.md +117 -0
  78. package/guide/zh/patterns/README.md +74 -0
  79. package/guide/zh/patterns/graft-pattern.md +108 -0
  80. package/guide/zh/patterns/replant-pattern.md +112 -0
  81. package/guide/zh/patterns/seed-pattern.md +130 -0
  82. package/guide/zh/peer.md +63 -0
  83. package/guide/zh/pr-review.md +54 -0
  84. package/guide/zh/practices/engineering-common-sense.md +393 -0
  85. package/guide/zh/pricing.md +97 -0
  86. package/guide/zh/project-setup.md +114 -0
  87. package/guide/zh/roll-doc-audit.md +90 -0
  88. package/guide/zh/skills.md +191 -0
  89. package/guide/zh/test-isolation.md +46 -0
  90. package/guide/zh/testing/quality-rubric.md +284 -0
  91. package/guide/zh/testing.md +116 -0
  92. package/guide/zh/tools.md +173 -0
  93. package/package.json +4 -1
  94. package/skills/README.md +1 -0
  95. package/skills/roll-.qa/SKILL.md +1 -1
  96. package/skills/roll-.review/SKILL.md +1 -1
  97. package/skills/roll-build/SKILL.md +1 -1
  98. package/skills/roll-build/references/full-contract.md +16 -13
  99. package/skills/roll-design/SKILL.md +3 -3
  100. package/skills/roll-design/references/full-contract.md +17 -13
  101. package/skills/roll-fix/SKILL.md +1 -1
  102. package/skills/roll-fix/references/full-contract.md +13 -10
  103. package/skills/roll-peer/SKILL.md +1 -1
  104. package/skills/roll-prime/SKILL.md +77 -0
  105. package/skills/roll-prime/references/explorer-annex.md +39 -0
  106. package/skills/roll-prime/references/supervisor-prompt.md +165 -0
  107. package/skills/route-cases/skills.json +10 -0
  108. package/template/AGENTS.md +3 -1
@@ -0,0 +1,30 @@
1
+ # 反馈与 issue 入口
2
+
3
+ Roll 把两条反馈路径分开:
4
+
5
+ - 输入应该进入本地 Roll backlog 时,用 `roll idea "<一句话>"`。
6
+ - 输入属于公开仓库或跨项目 tracker 时,直接用 `gh issue create`。
7
+
8
+ ## 本地 Roll backlog
9
+
10
+ ```bash
11
+ roll idea "Safari 登录在 session cookie 过期后失败"
12
+ roll idea "给 Story 报告归档加暗色主题"
13
+ ```
14
+
15
+ `roll idea` 会分类、分配下一个 ID、推断 epic、铸卡夹、追加 backlog 行并刷新索引。
16
+ 这是项目 owner 把零散反馈变成 Roll 工作项的常规入口。
17
+
18
+ ## GitHub Issues
19
+
20
+ 公开 bug 或外部协作直接走 GitHub:
21
+
22
+ ```bash
23
+ gh issue create \
24
+ --repo owner/repo \
25
+ --title "Safari 登录失败" \
26
+ --body "复现步骤:1. ... 2. ..."
27
+ ```
28
+
29
+ 如果项目看板会把 issue 回流进 Roll backlog,可以按需加 `bug`、`idea`、
30
+ `enhancement`、`FIX`、`US` 等 labels。
@@ -0,0 +1,96 @@
1
+ # Roll — 快速上手
2
+
3
+ 这条路径把一个 git 项目从安装带到验收报告,目标是 5 分钟内跑通第一条
4
+ Roll 管理的故事。
5
+
6
+ ## 1. 安装
7
+
8
+ ```bash
9
+ curl -fsSL https://seanyao.github.io/roll/install | bash
10
+ # 或
11
+ npm install -g @seanyao/roll
12
+ ```
13
+
14
+ Roll 需要 Node.js 22 或更新版本,并且本机至少装好一个支持的 AI agent。
15
+
16
+ ## 2. 初始化项目
17
+
18
+ ```bash
19
+ cd your-project
20
+ roll setup
21
+ roll init
22
+ ```
23
+
24
+ `roll init` 会先诊断当前目录,再决定是否写文件。空项目走新项目骨架;已有
25
+ 代码库走 `$roll-onboard`;只有 PRD/文档的目录会被当成新项目并指向设计;
26
+ 部分 Roll 或旧 Roll 布局只打印修复/迁移建议,不直接改文件。
27
+
28
+ ## 3. 从需求到 Backlog
29
+
30
+ 如果你手头有需求文档(PRD、草图、笔记)但还没有源码,`roll init` 会把它识别
31
+ 为 PRD-only 新项目并指向设计。已有 Roll 骨架但 backlog 为空时,`roll status`
32
+ 和 `roll doctor` 仍会提示进入设计阶段。
33
+
34
+ 想立刻开始设计对话:
35
+
36
+ ```bash
37
+ roll design --from-file docs/PRD.md
38
+ ```
39
+
40
+ 如果 `roll init` 检测到 PRD,就使用它打印出来的那条
41
+ `roll design --from-file ...` 命令;没有文件时,`roll design` 仍会在你的 AI
42
+ agent 里拉起同一个 `roll-design` 技能。你描述领域模型,agent 把 INVEST 故事写入
43
+ `.roll/backlog.md`,详细设计会生成自包含的 `design-review.html` Design Review Page,
44
+ 然后 `roll loop` 接过去接着干。
45
+
46
+ 你也可以直接在 agent 里跑 `$roll-design`,效果一样。
47
+
48
+ 如果你心里已经有故事,只想快速加一条,跳到第 4 步。
49
+
50
+ ## 4. 写第一条 Backlog
51
+
52
+ 用一句话建一张小故事卡:
53
+
54
+ ```bash
55
+ roll idea "Add a health check endpoint"
56
+ ```
57
+
58
+ `roll idea` 自动分类、取号、推断史诗、建卡片文件夹 — 一步完成待办行和故事文件夹。
59
+
60
+ 然后编辑 `.roll/features/<史诗>/<ID>/spec.md`,把 AC 写清楚。
61
+
62
+ 第一条故事要小:一个可见行为,一条明确测试路径。
63
+
64
+ ## 5. 启动 Loop
65
+
66
+ ```bash
67
+ roll loop on
68
+ roll loop status
69
+ ```
70
+
71
+ `roll loop status` 是常用快照视图。若当前有 cycle 在跑,并且你想看实时视图,
72
+ 先用只读 watch 命令:
73
+
74
+ ```bash
75
+ roll loop watch
76
+ ```
77
+
78
+ 排查事件用 `roll loop watch --events`,只有需要原始审计 JSON 时才用
79
+ `roll loop watch --raw-events`。所有 watch 模式都是只读;Ctrl-C 只停止视图。
80
+
81
+ 如果不想等调度触发,可以手动跑一轮:
82
+
83
+ ```bash
84
+ roll loop now
85
+ ```
86
+
87
+ ## 6. 生成验收报告
88
+
89
+ 故事落地、backlog 行变成 `✅ Done` 后,生成离线验收报告:
90
+
91
+ ```bash
92
+ roll attest US-DEMO-001
93
+ ```
94
+
95
+ 报告会写进该故事的 `.roll/features/` 文件夹。发布前,每条 AC 都应有 verdict
96
+ 和证据链接。
@@ -0,0 +1,83 @@
1
+ # Roll — 安装与更新
2
+
3
+ ## 安装
4
+
5
+ ### curl(推荐)
6
+
7
+ ```bash
8
+ curl -fsSL https://seanyao.github.io/roll/install | bash
9
+ ```
10
+
11
+ 仅需 bash 3.2+、curl、tar —— macOS 和 Linux 预装即可,无需 Node.js。
12
+
13
+ 钉版本:
14
+
15
+ ```bash
16
+ curl -fsSL https://seanyao.github.io/roll/install | ROLL_VERSION=v3.610.1 bash
17
+ ```
18
+
19
+ ### npm
20
+
21
+ ```bash
22
+ npm install -g @seanyao/roll
23
+ ```
24
+
25
+ 需要 Node.js 16+。
26
+
27
+ 无论哪种方式安装,完成后运行 setup 将约定和技能同步到你的 AI 工具:
28
+
29
+ ```bash
30
+ roll setup
31
+ ```
32
+
33
+ ## 验证
34
+
35
+ ```bash
36
+ roll --version # 显示已安装版本
37
+ roll status # 显示路径和约定状态
38
+ ```
39
+
40
+ ## 更新
41
+
42
+ ```bash
43
+ roll update
44
+ ```
45
+
46
+ Roll 自动检测安装方式并对应处理:
47
+
48
+ | 安装方式 | `roll update` 的行为 |
49
+ |---|---|
50
+ | curl(默认) | 重新下载最新 tarball、原子替换,然后 `roll sync` |
51
+ | npm | `npm update -g @seanyao/roll`,然后 `roll sync` |
52
+ | git clone(贡献者) | 在包目录执行 `git pull`,然后 `roll sync` |
53
+
54
+ ## 自动版本提示
55
+
56
+ 每次 `roll` 命令结束后,后台静默查询 GitHub releases API(每 24 小时最多一次,缓存在 `~/.roll/.update-check`)。若有新版本,下一条命令结束时显示一行提示。检查完全异步,不影响命令速度。
57
+
58
+ ## 卸载
59
+
60
+ ### curl
61
+
62
+ ```bash
63
+ rm -rf ~/.local/share/roll ~/.local/bin/roll
64
+ ```
65
+
66
+ ### npm
67
+
68
+ ```bash
69
+ npm uninstall -g @seanyao/roll
70
+ ```
71
+
72
+ 不再需要时删除状态文件:
73
+
74
+ ```bash
75
+ rm -rf ~/.roll ~/.shared/roll
76
+ ```
77
+
78
+ ## 另见
79
+
80
+ - [overview.md](overview.md) — roll 是什么
81
+ - [project-setup.md](project-setup.md) — 新项目的 `roll init`
82
+ - [configuration.md](configuration.md) — 环境变量
83
+ - [SECURITY.md](../../SECURITY.md) — curl|bash 信任边界与版本钉住
@@ -0,0 +1,192 @@
1
+ # 已有代码库接入 Roll
2
+
3
+ > 在现有代码库上接入 Roll,不破坏你团队现有的工作流。
4
+
5
+ 本页继续保留 `legacy-onboarding.md` 路径以保证旧链接稳定;可见流程名称统一为
6
+ **已有代码库接入 Roll**。
7
+
8
+ 如果你有一个已经运行了一段时间的真实项目——有代码、有测试、有历史、有约定——想开始用 Roll 管理它,这是你要走的路径。
9
+
10
+ ## 三种接入模式
11
+
12
+ | 模式 | 适用场景 | 取舍 |
13
+ |------|---------|------|
14
+ | **Seed**(播种) | 新项目从零开始 | 摩擦最低,day 1 就有 specs/backlog |
15
+ | **Graft**(嫁接,本页) | 活跃的已有代码库,还在演化 | 零侵入原代码,Roll 在上层叠加 |
16
+ | **Replant**(翻种) | 想清债、重写一次 | 工作量大,需要先反推规格 |
17
+
18
+ 本页讲 **graft**。关于 seed / replant,见 [接入模式文档](https://github.com/seanyao/roll-meta)(维护者私有仓,README 有公开摘要)。
19
+
20
+ ## Graft 做了什么
21
+
22
+ - **读**你的项目,理解类型、领域、关键模块
23
+ - **问**你 9 个问题,3 分钟内完成
24
+ - **生成** `.roll/` 目录,与原代码并列(不动你的源文件)
25
+ - **同步**Roll 约定到你用的 AI 工具
26
+ - 你得到的项目同时拥有:原来的工作流 + Roll 的项目管理能力
27
+
28
+ Graft 是**完全可逆**的:跑 `roll setup offboard` 让 Roll 自己撤销它加进来的全部痕迹(见下文"怎么退出")。
29
+
30
+ ## 分步操作
31
+
32
+ ### 1. 安装 Roll
33
+
34
+ ```bash
35
+ curl -fsSL https://seanyao.github.io/roll/install | bash
36
+ ```
37
+
38
+ 或通过 npm:
39
+
40
+ ```bash
41
+ npm install -g @seanyao/roll@latest
42
+ ```
43
+
44
+ 然后:
45
+
46
+ ```bash
47
+ roll setup
48
+ ```
49
+
50
+ ### 2. 在项目里跑 `roll init`
51
+
52
+ ```bash
53
+ cd your-project
54
+ roll init
55
+ ```
56
+
57
+ Roll 会检测到这是已有代码库且尚未接入 Roll(有源码/清单文件,但没有当前 Roll 标记),打印类似:
58
+
59
+ ```
60
+ Detected: existing codebase without Roll
61
+ Recommended path: agentic-onboard
62
+ Facts:
63
+ - manifests: package.json
64
+ - source dirs: src
65
+ - test dirs: tests
66
+ - source files: 47
67
+ - Roll markers: none
68
+ - facts hash: sha256:...
69
+ Next: $roll-onboard
70
+ Agent status: available: claude, codex
71
+ Run `$roll-onboard` with an available agent, review the artifacts, then run `roll init --apply`.
72
+ No files changed.
73
+ ```
74
+
75
+ ### 3. 在 AI agent 里跑 `$roll-onboard`
76
+
77
+ 打开你想用的 agent(Claude Code、Codex CLI、Cursor 等),运行:
78
+
79
+ ```
80
+ $roll-onboard
81
+ ```
82
+
83
+ 技能会:
84
+ 1. 浏览你的仓库,告诉你它看到的项目结构
85
+ 2. 第一组 3 问:确认推断的项目类型 / 领域 / 关键模块
86
+ 3. 第二组 3 问:要生成哪些 `.roll/` 产物,哪些现有文档要 include 而非重新生成
87
+ 4. 第三组 3 问:`.gitignore`、AI 工具同步、loop 启用与否
88
+ 5. 只写两个结构化产物:`.roll/init-diagnosis.yaml` 和 `.roll/onboard-plan.yaml`
89
+
90
+ 总耗时:3 分钟以内。
91
+
92
+ ### 4. 应用 plan
93
+
94
+ 回到终端,先审阅 `.roll/init-diagnosis.yaml` 和 `.roll/onboard-plan.yaml`,然后执行:
95
+
96
+ ```bash
97
+ roll init --apply
98
+ ```
99
+
100
+ 这一步会先校验成对的 diagnosis / plan 产物,任何写文件之前先拒绝不支持的 schema 版本、过期或 stale 的 facts hash、非幂等 file operation、路径穿越和 shell-command key。
101
+
102
+ 校验通过后,Roll 会打印 apply 审阅检查点:表格列出每个计划操作的动作、目标路径、
103
+ 合并/创建模式,以及是否保留用户内容。在交互终端里,确认前不会写入任何已审阅的变更。
104
+
105
+ 如果是在非交互自动化里执行,审阅后要显式确认:
106
+
107
+ ```bash
108
+ roll init --apply --auto
109
+ ```
110
+
111
+ 校验通过后,Roll 会:
112
+ - 按你选的 scope 创建 `.roll/` 子目录
113
+ - 如果选了"生成 backlog",写入初始 `.roll/backlog.md`
114
+ - 你标记 include 的现有文档不会被覆盖
115
+ - 如果 Q7 说 yes,把 `.roll/` 加入 `.gitignore`
116
+ - 把 Roll 约定同步到你选的 AI 工具
117
+
118
+ 完事。执行 `roll next` 接续下一步。
119
+
120
+ ### 5.(可选)启动自治 loop
121
+
122
+ 如果 Q9 选了 yes,`roll loop on` 会按定时表激活 loop,自动从 `BACKLOG.md` 拉 `📋 Todo` 任务,跑 `$roll-build` / `$roll-fix`。
123
+
124
+ ## Graft 的边界
125
+
126
+ Roll 只动它**自己的**文件:
127
+
128
+ | Roll 会动 | Roll 不会动 |
129
+ |----------|------------|
130
+ | `.roll/`(全部) | `src/`、`lib/`、`tests/` 等你的代码 |
131
+ | `AGENTS.md`(不存在则创建,存在则 section 级合并) | `README.md` |
132
+ | `.gitignore`(仅当 Q7 说 yes) | `package.json`、`pyproject.toml` 等 |
133
+
134
+ 如果你已有 `CONTRIBUTING.md` 或 `.github/` workflow,Roll 不会碰它们。如果想把 Roll 工作流接到现有 CI,需要你后续手动配置。
135
+
136
+ `$roll-onboard` 自己的边界比 `roll init --apply` 更窄:agent 只能写 `.roll/init-diagnosis.yaml` 和 `.roll/onboard-plan.yaml`。`AGENTS.md`、`.gitignore`、backlog、features、docs、offboard changeset 都由 apply 命令负责。
137
+
138
+ ## 怎么退出
139
+
140
+ `roll init --apply` 会把 Roll 管理的文件、目录、合并 marker 区块、`.gitignore` 行都记到 `.roll/onboard-changeset.yaml`。重复执行同一个 plan 会保留并去重这份 metadata,不会丢掉第一次 apply 的 offboard 记录。如果 apply 中途失败,先检查 changeset,再在确认后运行 `roll setup offboard --confirm` 回滚 Roll 管理的产物。
141
+
142
+ 已有 `AGENTS.md` 会被保留。Roll 只会在稳定的 `<!-- roll:onboard:start -->` / `<!-- roll:onboard:end -->` marker 中追加自己管理的区块,之后 offboard 只剥离这些区块。
143
+
144
+ **先预演(默认):**
145
+
146
+ ```bash
147
+ cd your-project
148
+ roll setup offboard
149
+ ```
150
+
151
+ 这是 dry-run,不会真的删除。输出会列出清单中记录的所有产物,以及将要从 `.gitignore` 撤销的行。
152
+
153
+ **确认后执行:**
154
+
155
+ ```bash
156
+ roll setup offboard --confirm
157
+ ```
158
+
159
+ Roll 不创建的文件 / 目录原封不动;已有用户文件里的 Roll marker 区块会被剥离,但文件本身不会被删除;你自己加到 `.gitignore` 的内容也保留。执行成功后,清单文件本身也会被删除。
160
+
161
+ 安全保障:
162
+
163
+ - 找不到 `.roll/onboard-changeset.yaml`(比如较早版本的 Roll 没记录、或者这个项目从没跑过 `roll init --apply`),`roll setup offboard` 拒绝执行,并打印手动 `rm` 命令,不会自己猜。
164
+ - 如果清单里的路径不在当前项目根目录下(跨项目串路径),`roll setup offboard` 也拒绝执行,并提示你切到正确目录再跑。
165
+
166
+ **完全卸载(全机器):**
167
+
168
+ ```bash
169
+ roll setup offboard --confirm
170
+ npm uninstall -g @seanyao/roll
171
+ ```
172
+
173
+ 项目回到接入前的状态。
174
+
175
+ ## FAQ
176
+
177
+ **Q: 没装 AI agent 怎么办?**
178
+ 至少装一个。Claude Code、Codex CLI、Cursor 都可以——安装免费,AI 调用走你的账户消耗 token。
179
+
180
+ **Q: 已经有从别的工具来的 `BACKLOG.md` 怎么办?**
181
+ Roll 会检测为 pre-2.0 Roll 项目(不是已有代码库接入目标),让你跑 `npx @seanyao/roll@2 migrate`。如果文件来自完全不同的工具,先重命名(`mv BACKLOG.md old-backlog.md`)再跑 `roll init`。
182
+
183
+ **Q: roll-onboard 推断的项目类型不对,怎么改?**
184
+ 在对话里告诉它。第一组 3 问就是为了让你纠正。Skill 把纠正后的理解写进 plan,bash 信任 plan。
185
+
186
+ **Q: 能手动编辑 `.roll/onboard-plan.yaml` 吗?**
187
+ 可以,但要和 `.roll/init-diagnosis.yaml` 配套。`roll init --apply` 要求两边的 `factsHash` 一致,并会重新计算当前项目 facts hash;同时不允许 shell-command key,`file_operations` 只能声明那两个位于项目内且幂等的允许文件。超过 24 小时、相对当前项目已 stale,或由旧版 `$roll-onboard` 生成的 plan,都应该重新生成。
188
+
189
+ 手动改过的 plan 仍然会进入同一个审阅检查点;没有交互确认或显式 `--auto` 时,不会修改文件。
190
+
191
+ **Q: 我们团队用 GitHub Issues / Jira / Linear,Roll 会替代它们吗?**
192
+ 不会。Roll 的 `BACKLOG.md` 是给 AI loop 自治执行用的。你团队的外部 tracker 继续用。有的团队只把"AI-loop 能执行的 story"放 Roll,纯人工任务留在原 tracker。
@@ -0,0 +1,236 @@
1
+ # Loop 数据布局(Phase 2.0)
2
+
3
+ From Phase 2.0 onward, a project's loop runtime data lives inside the project at
4
+ `<project>/.roll/loop/`.
5
+
6
+ 从 Phase 2.0 起,项目自己的 loop 运行时数据搬进了**项目目录** `<project>/.roll/loop/`,
7
+ 不再放在家目录下。只有机器级的绑定文件(launchd runner、attach 脚本)留在
8
+ `~/.shared/roll/loop/`。
9
+
10
+ Move the project, the state moves with it; delete it, the state goes too.
11
+
12
+ 项目挪走,状态跟着走;项目删掉,状态也一起没了。`git status` 和你的 IDE 能在代码
13
+ 旁边看到 loop 的控制与数据文件。
14
+
15
+ ---
16
+
17
+ ## `<project>/.roll/loop/` 里有什么
18
+
19
+ What lives in `<project>/.roll/loop/`:
20
+
21
+ `<project>/.roll/loop/` 里放什么:
22
+
23
+ | 文件 | 平面 | 内容 |
24
+ |------|------|------|
25
+ | `state-<slug>.yaml` | 控制 | 当前/最近一次运行:状态、故事 ID、Agent、run_id |
26
+ | `ALERT-<slug>.md` | 控制 | 累积的告警(失败、TCR 违规) |
27
+ | `PAUSE-<slug>` | 控制 | 暂停标记(由 `roll loop pause` 创建) |
28
+ | `mute-<slug>` | 控制 | 项目级 auto-attach 静音标记 |
29
+ | `.LOCK-<slug>` | 控制 | 本项目的单实例锁 |
30
+ | `heartbeat` | 控制 | 当前 cycle 的存活时间戳 |
31
+ | `runs.jsonl` | 数据 | 只追加的运行历史(每次 cycle 一行 JSON) |
32
+ | `events.ndjson` | 数据 | 逐 cycle 事件流(phase_start/phase_end…) |
33
+ | `cron.log` | 数据 | 旧的聚合 cycle 日志(见下方弃用说明) |
34
+
35
+ The control plane and the data plane ship independently but both resolve to this
36
+ project-local directory.
37
+
38
+ 控制平面(outer runner 在 spawn tmux 之前接触的)和数据平面(inner cycle 脚本写
39
+ 入的)各自独立演进,但现在都解析到同一个项目本地目录。
40
+
41
+ ---
42
+
43
+ ## Dream 的 cron 日志
44
+
45
+ `roll-.dream`(每晚代码健康扫描)的 cron stdout 捕获日志也改为项目本地:
46
+
47
+ | 服务 | 路径 |
48
+ |------|------|
49
+ | dream | `<project>/.roll/dream/cron.log` |
50
+
51
+ 以前放在 `~/.shared/roll/dream/cron-<slug>.log`。项目本地后,删项目即
52
+ 清日志,并发项目也不会互相穿插。
53
+
54
+ `roll-.dream` (the nightly code-health scan) also writes its cron stdout capture
55
+ project-local:
56
+
57
+ | Service | Path |
58
+ |---------|------|
59
+ | dream | `<project>/.roll/dream/cron.log` |
60
+
61
+ Previously this lived in `~/.shared/roll/dream/cron-<slug>.log`.
62
+ Moving it project-local means it is naturally garbage-collected when
63
+ the project is deleted, and concurrent projects never interleave.
64
+
65
+ ---
66
+
67
+ ## `~/.shared/roll/loop/` 还剩什么
68
+
69
+ What is left in `~/.shared/roll/loop/`:
70
+
71
+ `~/.shared/roll/loop/` 现在只剩:
72
+
73
+ | 文件 | 为什么留着 |
74
+ |------|-----------|
75
+ | `run-<slug>.sh` / `run-<slug>-inner.sh` | launchd `WorkingDirectory` / `ProgramArguments` 绑定绝对家目录路径 |
76
+ | `attach-<slug>.command` | LaunchServices 双击目标,必须是稳定家目录路径 |
77
+ | `worktrees/` | 机器级临时区,非项目本征 |
78
+ | `changelog-audit*` | 机器级审计日志 |
79
+ | `archived/` | `roll loop gc` 退役 slug 的停车场 |
80
+
81
+ The global mute switch `~/.shared/roll/mute` also stays in home — it is
82
+ machine-wide on purpose.
83
+
84
+ 全局静音开关 `~/.shared/roll/mute`(所有项目、所有自动化活动共享)也留在家目录 ——
85
+ 它本来就是机器级的。
86
+
87
+ ---
88
+
89
+ ## 跨项目 dashboard
90
+
91
+ `roll loop runs --all` aggregates per-project files live instead of reading one
92
+ machine-wide file.
93
+
94
+ `roll loop runs --all` 不再读单个机器级的 `runs.jsonl`,而是:
95
+
96
+ 1. Enumerate slugs from launchd plists.
97
+ 2. Resolve each slug to its project, read its `.roll/loop/runs.jsonl`.
98
+ 3. Merge with `jq`, sort by timestamp.
99
+
100
+ 1. 从 launchd plist 枚举已安装的 slug。
101
+ 2. 把每个 slug 解析到它的项目路径,读该项目的 `.roll/loop/runs.jsonl`。
102
+ 3. 用 `jq` 把所有项目的行归并,按时间排序。
103
+
104
+ You still get a machine-wide overview, computed live — no central file to drift.
105
+
106
+ 所以你照样能看到机器级总览,只是改为从各项目文件实时聚合 —— 没有会失同步的中心文件。
107
+
108
+ The cache hook `ROLL_LOOP_RUNS_CACHE_TTL` (default `0`) is reserved for future
109
+ use.
110
+
111
+ 可选缓存钩子 `ROLL_LOOP_RUNS_CACHE_TTL`(默认 `0` = 不缓存)为未来预留;目前是实时
112
+ 聚合。
113
+
114
+ ---
115
+
116
+ ## 自动迁移(7 天双路窗口)
117
+
118
+ If you upgrade an existing project you do not need to do anything.
119
+
120
+ 如果你升级一个既有项目,**无需任何手动操作**。outer runner 会在下一个 cycle 自动
121
+ 迁移老文件。
122
+
123
+ **How it works:**
124
+
125
+ **工作原理:**
126
+
127
+ 1. Before reading control state, `旧路径迁移 helper <slug>` copies
128
+ `state` / `ALERT` / `PAUSE` / `mute` from home into the project, then renames
129
+ each legacy file `<name>.migrated-<timestamp>`.
130
+ 2. `旧运行记录迁移 helper` splits the machine-wide `runs.jsonl` by each
131
+ row's `project` slug into each project's file, then renames the legacy file.
132
+ Unresolvable rows are left behind so no history is lost.
133
+ 3. Migration is idempotent and never overwrites a newer target.
134
+
135
+ 1. 读控制状态之前,`旧路径迁移 helper <slug>` 把 `state` / `ALERT` /
136
+ `PAUSE` / `mute` 从家目录复制进项目,再把每个老文件改名为
137
+ `<name>.migrated-<时间戳>`。
138
+ 2. `旧运行记录迁移 helper` 把机器级 `runs.jsonl` 按每行的 `project` slug 拆
139
+ 分进各项目文件,再把老文件改名。无法解析的行留在原处,不丢历史。
140
+ 3. 迁移幂等,已存在的更新目标永不被覆盖。
141
+
142
+ **During the 7-day window**, control-plane reads use dual-path lookup
143
+ (`控制状态路径解析器`): project-local first, legacy home as fallback. A
144
+ separate FIX removes the fallback afterward.
145
+
146
+ **在 7 天窗口期内**,控制平面文件的读取走双路查找(`控制状态路径解析器`):
147
+ 优先项目本地路径,回退到家目录老路径。窗口结束后由单独的 FIX 移除回退。
148
+
149
+ The `.migrated-*` artifacts are reaped by `roll loop gc` after they age out.
150
+
151
+ `.migrated-*` 和 `runs.jsonl.migrated-*` 残骸到期后由 `roll loop gc` 回收,家目录不
152
+ 会堆积。
153
+
154
+ ---
155
+
156
+ ## `roll loop gc` — 垃圾回收
157
+
158
+ `roll loop gc` retires slugs whose project directory no longer exists and sweeps
159
+ debris.
160
+
161
+ `roll loop gc` 退役那些项目目录已不存在的 slug,并清扫迁移/备份残骸。
162
+
163
+ ```bash
164
+ roll loop gc # 回收孤儿 slug + 残骸(默认保留 30 天)
165
+ roll loop gc --dry-run # 预览将清理什么 —— 不动任何文件
166
+ roll loop gc --keep-days 14 # 本次覆盖保留期
167
+ ```
168
+
169
+ **What it cleans:**
170
+
171
+ **它清什么:**
172
+
173
+ - Orphan slugs → moved to `~/.shared/roll/loop/archived/<slug>-<timestamp>/`,
174
+ launchd plist booted out first.
175
+ - `runs.jsonl.tmp.*` write-interrupted leftovers.
176
+ - `backup-before-merge-*.tgz` older than 5 days.
177
+ - `*.migrated-<ts>` markers older than 7 days.
178
+
179
+ - 孤儿 slug —— `run-<slug>.sh` / `-inner.sh` / `attach-*.command` 移到
180
+ `~/.shared/roll/loop/archived/<slug>-<时间戳>/`,先 bootout launchd plist。
181
+ - `runs.jsonl.tmp.*` 写中断残留。
182
+ - 5 天前的 `backup-before-merge-*.tgz`。
183
+ - 7 天前的 `*.migrated-<时间戳>` 标记。
184
+
185
+ **Retention precedence** (highest first): `ROLL_LOOP_GC_RETENTION_DAYS` env >
186
+ `loop_gc.retention_days` in `.roll/local.yaml` > default 30 days.
187
+
188
+ **保留期优先级**(从高到低):
189
+
190
+ 1. 环境变量 `ROLL_LOOP_GC_RETENTION_DAYS`。
191
+ 2. `.roll/local.yaml` 里的 `loop_gc.retention_days`。
192
+ 3. 默认 30 天。
193
+
194
+ `--dry-run` lists the plan without executing — safe anytime.
195
+
196
+ `--dry-run` 列出完整计划但不执行 —— 随时可放心运行。
197
+
198
+ ---
199
+
200
+ ## 排查
201
+
202
+ **Where did my ALERT go?**
203
+
204
+ **我的 ALERT 跑到哪去了?**
205
+
206
+ It is now at `<project>/.roll/loop/ALERT-<slug>.md`. Run `roll loop alert` inside
207
+ the project.
208
+
209
+ 现在在 `<project>/.roll/loop/ALERT-<slug>.md`。在项目里跑 `roll loop alert`,或直
210
+ 接打开文件。
211
+
212
+ **How do I migrate manually?**
213
+
214
+ **怎么手动迁移?**
215
+
216
+ You never need to — the next cycle does it. To force it, run `roll loop now`
217
+ once.
218
+
219
+ 正常你永远不需要 —— 下一个 cycle 会做。要不等就触发,跑一次 `roll loop now`(或
220
+ `roll loop test`);runner 在读状态前会先迁移。
221
+
222
+ **How do I roll back?**
223
+
224
+ **怎么回滚?**
225
+
226
+ Legacy files are kept as `<name>.migrated-<timestamp>` for 7 days. Rename one
227
+ back (drop the suffix) and remove the project-local copy. Roll back within the
228
+ window before `roll loop gc` reaps the markers.
229
+
230
+ 老文件以 `<name>.migrated-<时间戳>` 形式保留 7 天。要回退某个文件,把它改名回去
231
+ (去掉 `.migrated-<时间戳>` 后缀)并删掉项目本地副本。7 天后 `roll loop gc` 会回
232
+ 收这些标记,所以请在窗口期内回滚。
233
+
234
+ See also: [roll loop](loop.md) · [Migration 2.0](migration-2.0.md) · [FAQ](faq.md)
235
+
236
+ 另见:[roll loop](loop.md) · [Migration 2.0](migration-2.0.md) · [FAQ](faq.md)