@seanyao/roll 2026.518.4 → 2026.519.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.
- package/CHANGELOG.md +31 -0
- package/README.md +26 -14
- package/bin/roll +683 -81
- package/conventions/global/AGENTS.md +6 -6
- package/conventions/templates/backend-service/AGENTS.md +4 -4
- package/conventions/templates/cli/AGENTS.md +4 -4
- package/conventions/templates/frontend-only/AGENTS.md +4 -4
- package/conventions/templates/fullstack/AGENTS.md +4 -4
- package/lib/__pycache__/roll-loop-status.cpython-314.pyc +0 -0
- package/lib/roll-backlog.py +3 -3
- package/lib/roll-brief.py +2 -2
- package/lib/roll-help.py +3 -3
- package/lib/roll-home.py +28 -8
- package/lib/roll-init.py +101 -0
- package/lib/roll-loop-status.py +24 -8
- package/lib/roll-plan-validate.py +221 -0
- package/lib/roll-status.py +4 -4
- package/package.json +1 -1
- package/skills/roll-.changelog/SKILL.md +13 -13
- package/skills/roll-.dream/SKILL.md +21 -21
- package/skills/roll-brief/SKILL.md +12 -12
- package/skills/roll-build/SKILL.md +15 -15
- package/skills/roll-debug/SKILL.md +1 -1
- package/skills/roll-design/SKILL.md +46 -46
- package/skills/roll-doc/SKILL.md +10 -10
- package/skills/roll-fix/SKILL.md +7 -7
- package/skills/roll-idea/SKILL.md +4 -4
- package/skills/roll-loop/SKILL.md +11 -11
- package/skills/roll-onboard/SKILL.md +143 -0
- package/skills/roll-peer/SKILL.md +1 -1
- package/skills/roll-propose/SKILL.md +13 -13
- package/skills/roll-sentinel/SKILL.md +1 -1
- package/template/AGENTS.md +2 -2
- /package/template/{BACKLOG.md → .roll/backlog.md} +0 -0
package/lib/roll-status.py
CHANGED
|
@@ -293,8 +293,8 @@ def _render_this_project(d: Dict[str, Any]) -> None:
|
|
|
293
293
|
print(line)
|
|
294
294
|
|
|
295
295
|
_file_row("AGENTS.md", d["project_has_agents"])
|
|
296
|
-
_file_row("
|
|
297
|
-
_file_row("
|
|
296
|
+
_file_row(".roll/backlog.md", d["project_has_backlog"])
|
|
297
|
+
_file_row(".roll/features/", d["project_features_count"] > 0,
|
|
298
298
|
f"{d['project_features_count']} feature docs")
|
|
299
299
|
|
|
300
300
|
# Loop & dream launchd
|
|
@@ -329,14 +329,14 @@ def _live_data() -> Dict[str, Any]:
|
|
|
329
329
|
"skills": _ai_skill_count(e),
|
|
330
330
|
})
|
|
331
331
|
templates = [(t, _template_count(t)) for t in TEMPLATES]
|
|
332
|
-
feat_dir = Path("
|
|
332
|
+
feat_dir = Path(".roll/features")
|
|
333
333
|
return dict(
|
|
334
334
|
conventions = _global_conventions(),
|
|
335
335
|
ai_clients = ai_clients,
|
|
336
336
|
templates = templates,
|
|
337
337
|
skills_installed = _skills_installed(),
|
|
338
338
|
project_has_agents = Path("AGENTS.md").exists(),
|
|
339
|
-
project_has_backlog = Path("
|
|
339
|
+
project_has_backlog = Path(".roll/backlog.md").exists(),
|
|
340
340
|
project_features_count = sum(1 for _ in feat_dir.glob("*.md")) if feat_dir.exists() else 0,
|
|
341
341
|
loop_state = _launchd_state("loop", slug),
|
|
342
342
|
dream_state = _launchd_state("dream", slug),
|
package/package.json
CHANGED
|
@@ -3,12 +3,12 @@ hidden: true
|
|
|
3
3
|
name: roll-.changelog
|
|
4
4
|
license: MIT
|
|
5
5
|
allowed-tools: "Read, Edit, Write, Bash(git:*)"
|
|
6
|
-
description: After build completion, extracts completed Stories from
|
|
6
|
+
description: After build completion, extracts completed Stories from .roll/backlog.md to generate CHANGELOG.md. Auto-triggered after successful deploy, keeping the external changelog in sync with the internal backlog.
|
|
7
7
|
---
|
|
8
8
|
|
|
9
9
|
# WK Generate Changelog
|
|
10
10
|
|
|
11
|
-
After successful Build & Deploy, extracts completed Stories from
|
|
11
|
+
After successful Build & Deploy, extracts completed Stories from .roll/backlog.md to generate a user-friendly `CHANGELOG.md`.
|
|
12
12
|
|
|
13
13
|
## When Triggered
|
|
14
14
|
|
|
@@ -31,7 +31,7 @@ CHANGELOG.md exists?
|
|
|
31
31
|
└── No → Create mode (backfill all historical completed Stories)
|
|
32
32
|
```
|
|
33
33
|
|
|
34
|
-
### 2. Read
|
|
34
|
+
### 2. Read .roll/backlog.md
|
|
35
35
|
|
|
36
36
|
```
|
|
37
37
|
Append mode:
|
|
@@ -39,7 +39,7 @@ Append mode:
|
|
|
39
39
|
|
|
40
40
|
Create mode:
|
|
41
41
|
Extract ALL Stories and Fixes with status ✅ Done.
|
|
42
|
-
Read each Story's
|
|
42
|
+
Read each Story's .roll/features/<feature>.md for Completed date.
|
|
43
43
|
Group entries by completion date, reverse chronological order.
|
|
44
44
|
```
|
|
45
45
|
|
|
@@ -361,25 +361,25 @@ After successful deploy in `$roll-build` / `$roll-fix`:
|
|
|
361
361
|
## 8. features.md 重写模式(产品 SOT)
|
|
362
362
|
|
|
363
363
|
US-DOC-008 — `scripts/release.sh` 在 changelog/release-notes 生成完后会再
|
|
364
|
-
调一次本 skill,请求"整体重写
|
|
364
|
+
调一次本 skill,请求"整体重写 `.roll/features.md`"。这次调用的语义和上面
|
|
365
365
|
两种完全不同:**不是基于本版 Story 增量**,而是基于**项目整体当前状态**。
|
|
366
366
|
|
|
367
367
|
### 8.1 何时触发
|
|
368
368
|
|
|
369
369
|
release.sh 完成 changelog/release-notes 写盘后,喂一段以
|
|
370
|
-
`## 当前任务:重写
|
|
370
|
+
`## 当前任务:重写 .roll/features.md(Section 8)` 开头的 prompt。
|
|
371
371
|
|
|
372
372
|
### 8.2 输入
|
|
373
373
|
|
|
374
374
|
prompt 会包含:
|
|
375
|
-
- 当前
|
|
376
|
-
- 当前
|
|
377
|
-
- 当前
|
|
375
|
+
- 当前 `.roll/features.md`(可能为空,可能上一版本的)
|
|
376
|
+
- 当前 `.roll/backlog.md` 全文(Epic / Feature 分组结构)
|
|
377
|
+
- 当前 `.roll/features/` 目录清单
|
|
378
378
|
- 当前版本号
|
|
379
379
|
|
|
380
380
|
### 8.3 输出契约
|
|
381
381
|
|
|
382
|
-
把整个
|
|
382
|
+
把整个 `.roll/features.md` 写出来。结构固定为三段:
|
|
383
383
|
|
|
384
384
|
```
|
|
385
385
|
# Roll — Features
|
|
@@ -399,7 +399,7 @@ prompt 会包含:
|
|
|
399
399
|
## Features by Epic
|
|
400
400
|
|
|
401
401
|
### <Epic 名>
|
|
402
|
-
- [<Feature 名>](
|
|
402
|
+
- [<Feature 名>](.roll/features/<file>.md) — 1 句话描述
|
|
403
403
|
- <Feature 名> — 1 句话描述(缺 deep doc 时不加链接)
|
|
404
404
|
|
|
405
405
|
### <Epic 名>
|
|
@@ -414,7 +414,7 @@ prompt 会包含:
|
|
|
414
414
|
|
|
415
415
|
- **Catalog 必须列出 BACKLOG 中所有 `### Feature:` 出现的 Feature 名**
|
|
416
416
|
(即使没有 deep doc 也要列)
|
|
417
|
-
- Feature 名跟
|
|
417
|
+
- Feature 名跟 `.roll/features/<file>.md` 文件名一致时,加链接到该 md
|
|
418
418
|
- 没有对应 deep doc 的 Feature,**只写 plain text 不加链接**
|
|
419
419
|
- **Planning distinction(US-DOC-011)**:
|
|
420
420
|
- 该 Feature 下**所有** Story 均为 `📋 Todo` → 在描述末尾追加 `*(规划中)*`
|
|
@@ -424,7 +424,7 @@ prompt 会包含:
|
|
|
424
424
|
`_enforce_planning_markers`,即使本规则被 AI 漏掉也会自动补 `*(规划中)*`;
|
|
425
425
|
规则的权威实现是 release.sh 里的纯 shell 函数,prompt 这条只是软提示
|
|
426
426
|
- 描述写 1 句话 **产品视角**:用户能用它做什么,避免实现细节
|
|
427
|
-
- **语言:单一中文**。Feature 名(如 `roll-loop` / `Cross-Agent Peer Review`)和命令、环境变量等术语保留英文原样;描述句一律中文。**不要**在条目下追加英文翻译行(早期 v517.x 双语混排版式已废弃,理由:扫读困难、维护翻倍、与 `
|
|
427
|
+
- **语言:单一中文**。Feature 名(如 `roll-loop` / `Cross-Agent Peer Review`)和命令、环境变量等术语保留英文原样;描述句一律中文。**不要**在条目下追加英文翻译行(早期 v517.x 双语混排版式已废弃,理由:扫读困难、维护翻倍、与 `guide/en|zh/` 平行目录约定不一致;英文受众走 site 端 i18n)
|
|
428
428
|
- 分组用 BACKLOG 的 Epic 名,原序,不重排
|
|
429
429
|
- Core Highlights 从所有 Features 里挑 3-5 个最能代表产品定位的,
|
|
430
430
|
描述用 bold 标 Feature 名后接说明;不照搬 catalog 文案
|
|
@@ -8,7 +8,7 @@ description: |
|
|
|
8
8
|
(cron or GitHub Actions), not invoked by users directly. Detects dead code,
|
|
9
9
|
architectural drift from domain model, pruning candidates, emerging patterns,
|
|
10
10
|
doc coverage gaps, and doc staleness (文档新鲜度). Outputs REFACTOR entries
|
|
11
|
-
to
|
|
11
|
+
to .roll/backlog.md and a daily log to .roll/dream/.
|
|
12
12
|
Distinct from roll-sentinel: sentinel monitors runtime behavior; dream reviews
|
|
13
13
|
code structure and architectural health.
|
|
14
14
|
---
|
|
@@ -56,7 +56,7 @@ Flag: files or exports with zero references outside their own file.
|
|
|
56
56
|
|
|
57
57
|
### Scan 2 — Architectural Drift
|
|
58
58
|
|
|
59
|
-
Compare current code structure against the domain model in
|
|
59
|
+
Compare current code structure against the domain model in `.roll/domain/`:
|
|
60
60
|
|
|
61
61
|
```bash
|
|
62
62
|
# Read context-map.md and ubiquitous-language.md if they exist
|
|
@@ -69,7 +69,7 @@ Flag: modules that import directly from a different Bounded Context without
|
|
|
69
69
|
an Anti-Corruption Layer, or module names that have diverged from the
|
|
70
70
|
Ubiquitous Language.
|
|
71
71
|
|
|
72
|
-
**Distinction from Scan 6C**: Scan 2 flags *import boundary violations* (cross-context coupling). Scan 6C flags *missing documentation entries* (module exists but has no entry in
|
|
72
|
+
**Distinction from Scan 6C**: Scan 2 flags *import boundary violations* (cross-context coupling). Scan 6C flags *missing documentation entries* (module exists but has no entry in `.roll/domain/*.md`). Never double-flag — Scan 2 and Scan 6C are orthogonal checks.
|
|
73
73
|
|
|
74
74
|
### Scan 3 — Pruning Candidates
|
|
75
75
|
|
|
@@ -106,18 +106,18 @@ Check documentation structure against the conventions in `AGENTS.md § Documenta
|
|
|
106
106
|
|
|
107
107
|
**Check A — BACKLOG Done stories missing guide/en/ docs:**
|
|
108
108
|
|
|
109
|
-
Scan
|
|
109
|
+
Scan .roll/backlog.md for features with multiple ✅ Done stories. For each feature epic, check whether a corresponding `guide/en/<topic>.md` exists. If a feature has ≥3 Done stories and no guide doc, flag it.
|
|
110
110
|
|
|
111
111
|
**Check B — guide/en/ files missing guide/zh/ translations:**
|
|
112
112
|
|
|
113
113
|
```bash
|
|
114
|
-
for f in
|
|
114
|
+
for f in guide/en/*.md; do
|
|
115
115
|
base=$(basename "$f")
|
|
116
|
-
[ ! -f "
|
|
116
|
+
[ ! -f "guide/zh/$base" ] && echo "missing ZH: $base"
|
|
117
117
|
done
|
|
118
118
|
```
|
|
119
119
|
|
|
120
|
-
Flag any `
|
|
120
|
+
Flag any `guide/en/<topic>.md` that has no matching `guide/zh/<topic>.md`, provided the EN file has existed since before the most recent git tag (i.e., at least one release cycle old).
|
|
121
121
|
|
|
122
122
|
**Check C — stray files in docs/ root (根目录散落文件):**
|
|
123
123
|
|
|
@@ -129,9 +129,9 @@ Flag any `.md` file directly in `docs/` root (allowed subdirs: `guide/`, `domain
|
|
|
129
129
|
|
|
130
130
|
**Check D — features.md Feature Coverage (US-DOC-009):**
|
|
131
131
|
|
|
132
|
-
Dependency gate: skip when
|
|
132
|
+
Dependency gate: skip when `.roll/features.md` does not exist.
|
|
133
133
|
|
|
134
|
-
Parse
|
|
134
|
+
Parse .roll/backlog.md for all `### Feature: <name>` groups that contain ≥1 ✅ Done story. Parse `.roll/features.md` for Feature names. If any Feature group with Done stories is absent from `.roll/features.md`, the catalog is stale — flag as REFACTOR:
|
|
135
135
|
|
|
136
136
|
```markdown
|
|
137
137
|
| REFACTOR-XXX | features.md 功能目录落后于 BACKLOG,N 个已完成功能区未收录,用户无法通过产品目录发现这些功能 — flagged by dream YYYY-MM-DD | 📋 Todo |
|
|
@@ -168,14 +168,14 @@ When deployed, each finding produces a REFACTOR entry with `$roll-doc` as execut
|
|
|
168
168
|
Flag source files whose owning doc is >30 days stale:
|
|
169
169
|
|
|
170
170
|
```bash
|
|
171
|
-
# For each file listed in
|
|
171
|
+
# For each file listed in .roll/features/*.md or README.md "## Files:" sections:
|
|
172
172
|
# owner_doc_commit = git log -1 --format="%ci" -- <doc_file>
|
|
173
173
|
# source_commit = git log -1 --format="%ci" -- <source_file>
|
|
174
174
|
# lag_days = (source_commit - owner_doc_commit) in days
|
|
175
175
|
# if lag_days > 30 AND doc contains at least one specific file path reference → flag
|
|
176
176
|
```
|
|
177
177
|
|
|
178
|
-
The "owner doc" for a source file is the nearest `README.md` or
|
|
178
|
+
The "owner doc" for a source file is the nearest `README.md` or `.roll/features/*.md` that lists the file path in a `## Files:` section. Skip docs that contain only conceptual descriptions (no specific file path references) — they cannot be objectively stale.
|
|
179
179
|
|
|
180
180
|
#### Check B — Undocumented ENV Vars
|
|
181
181
|
|
|
@@ -204,13 +204,13 @@ This is distinct from Scan 2 (which checks *import violations*) — Scan 6C chec
|
|
|
204
204
|
```bash
|
|
205
205
|
# Walk all non-excluded directories
|
|
206
206
|
# For each dir with >= 3 non-hidden, non-.md source files:
|
|
207
|
-
# check if any
|
|
207
|
+
# check if any .roll/domain/*.md contains the directory name
|
|
208
208
|
# if not found → flag as "existence drift"
|
|
209
209
|
```
|
|
210
210
|
|
|
211
211
|
Exclusions: `node_modules/`, `.git/`, `dist/`, `build/`, `.shared/`, `docs/`, `tests/`.
|
|
212
212
|
|
|
213
|
-
Flag directories with ≥3 source files and zero name-match in
|
|
213
|
+
Flag directories with ≥3 source files and zero name-match in `.roll/domain/*.md`.
|
|
214
214
|
|
|
215
215
|
#### Dream Log Section
|
|
216
216
|
|
|
@@ -220,16 +220,16 @@ Add after `## 文档覆盖度` section:
|
|
|
220
220
|
## 文档新鲜度
|
|
221
221
|
- 滞后文档:{N} 个(超过 30 天未更新但绑定了代码文件)
|
|
222
222
|
- 未记录 ENV 变量:{N} 个(出现 ≥5 次但无文档)
|
|
223
|
-
- 架构文档缺失模块:{N} 个(≥3 个源文件的目录未出现在
|
|
223
|
+
- 架构文档缺失模块:{N} 个(≥3 个源文件的目录未出现在 .roll/domain/)
|
|
224
224
|
{发现内容列表 或 "文档新鲜度良好,无滞后或缺失项。"}
|
|
225
225
|
```
|
|
226
226
|
|
|
227
227
|
## Output
|
|
228
228
|
|
|
229
|
-
### REFACTOR Entry (
|
|
229
|
+
### REFACTOR Entry (.roll/backlog.md)
|
|
230
230
|
|
|
231
231
|
For each finding that warrants action, append one row to the `## ♻️ Refactor`
|
|
232
|
-
section of
|
|
232
|
+
section of .roll/backlog.md:
|
|
233
233
|
|
|
234
234
|
```markdown
|
|
235
235
|
| REFACTOR-XXX | {one-line description} — flagged by dream {YYYY-MM-DD} | 📋 Todo |
|
|
@@ -240,7 +240,7 @@ section of BACKLOG.md:
|
|
|
240
240
|
**Threshold**: only flag items where the fix would meaningfully reduce
|
|
241
241
|
complexity or prevent future bugs. Ignore cosmetic issues.
|
|
242
242
|
|
|
243
|
-
### Dream Log (
|
|
243
|
+
### Dream Log (.roll/dream/YYYY-MM-DD.md)
|
|
244
244
|
|
|
245
245
|
Always write a log, even when no REFACTOR entries are created. Output uses
|
|
246
246
|
Chinese to align with roll-brief style — easier for the morning reader to scan
|
|
@@ -283,7 +283,7 @@ without context switching:
|
|
|
283
283
|
扫描完成后立即提交,把 dream 发现纳入 git 历史,便于晨报追溯:
|
|
284
284
|
|
|
285
285
|
```bash
|
|
286
|
-
git add
|
|
286
|
+
git add .roll/backlog.md .roll/dream/YYYY-MM-DD.md
|
|
287
287
|
# 有 REFACTOR 条目时:
|
|
288
288
|
git commit -m "chore: dream scan YYYY-MM-DD — {N} REFACTOR entries"
|
|
289
289
|
# 无发现时:
|
|
@@ -291,9 +291,9 @@ git commit -m "chore: dream scan YYYY-MM-DD — no findings"
|
|
|
291
291
|
git push origin main
|
|
292
292
|
```
|
|
293
293
|
|
|
294
|
-
-
|
|
294
|
+
- .roll/backlog.md 和 dream 日志必须在**同一个 commit** 里入库,避免出现"REFACTOR 已加但日志找不到"或反过来的撕裂状态
|
|
295
295
|
- 写文件失败时不要执行 commit;保持工作区干净,由调度器负责重试
|
|
296
|
-
- 仅
|
|
296
|
+
- 仅 `.roll/backlog.md` 和 `.roll/dream/YYYY-MM-DD.md` 入 commit,不要顺带带入其他无关变更
|
|
297
297
|
|
|
298
298
|
## Scheduler Configuration
|
|
299
299
|
|
|
@@ -308,7 +308,7 @@ The cron entry is generated using the configured agent — no manual cron editin
|
|
|
308
308
|
|
|
309
309
|
If the scan fails partway through:
|
|
310
310
|
|
|
311
|
-
1. Write partial results to
|
|
311
|
+
1. Write partial results to `.roll/dream/YYYY-MM-DD.md` with a `## 状态:部分完成` header
|
|
312
312
|
2. Do not write incomplete REFACTOR entries to BACKLOG
|
|
313
313
|
3. Log the error to `~/.shared/roll/dream/error.log`
|
|
314
314
|
|
|
@@ -62,25 +62,25 @@ $roll-brief --feature auth # scoped to one feature
|
|
|
62
62
|
|
|
63
63
|
```bash
|
|
64
64
|
# Find timestamp of last brief
|
|
65
|
-
ls
|
|
65
|
+
ls .roll/briefs/ | sort | tail -1
|
|
66
66
|
|
|
67
|
-
# Read
|
|
67
|
+
# Read .roll/backlog.md — collect all status changes since last brief
|
|
68
68
|
# Read git log — commits since last brief timestamp
|
|
69
69
|
git log --since="{last_brief_timestamp}" --oneline
|
|
70
70
|
```
|
|
71
71
|
|
|
72
72
|
### Step 2 — Collect Activity
|
|
73
73
|
|
|
74
|
-
From
|
|
74
|
+
From .roll/backlog.md and git log, classify all items since last brief:
|
|
75
75
|
|
|
76
76
|
- **Completed**: US-XXX ✅, FIX-XXX ✅, REFACTOR-XXX ✅
|
|
77
77
|
- **In progress**: items currently 🔨
|
|
78
78
|
- **Queue**: items still 📋 Todo (ordered by priority)
|
|
79
79
|
- **Dream findings**: any REFACTOR entries added by roll-.dream since last brief
|
|
80
80
|
- **Escalations**: any ALERT files in `~/.shared/roll/loop/` or `~/.shared/roll/dream/`
|
|
81
|
-
- **Doc coverage**: compute from `
|
|
82
|
-
- EN coverage = number of files in `
|
|
83
|
-
- ZH translation rate = files in `
|
|
81
|
+
- **Doc coverage**: compute from `guide/en/` and `guide/zh/`:
|
|
82
|
+
- EN coverage = number of files in `guide/en/`
|
|
83
|
+
- ZH translation rate = files in `guide/zh/` ÷ files in `guide/en/` × 100%
|
|
84
84
|
|
|
85
85
|
### Step 3 — Assess Release Readiness
|
|
86
86
|
|
|
@@ -98,8 +98,8 @@ A simple heuristic — not a gate, just a signal for the human:
|
|
|
98
98
|
|
|
99
99
|
### Step 4 — Write Brief
|
|
100
100
|
|
|
101
|
-
|
|
102
|
-
计算方式:`ls
|
|
101
|
+
文件命名:`.roll/briefs/YYYY-MM-DD-{NN}.md`,NN 为当日序号(01 起,零填充两位)。
|
|
102
|
+
计算方式:`ls .roll/briefs/YYYY-MM-DD-*.md 2>/dev/null | wc -l`,+1 即为本次序号。
|
|
103
103
|
|
|
104
104
|
全部用中文输出。**省略空 section**(无内容时连标题一起不输出):
|
|
105
105
|
|
|
@@ -129,7 +129,7 @@ A simple heuristic — not a gate, just a signal for the human:
|
|
|
129
129
|
|
|
130
130
|
<!-- 仅当 roll-.dream 有新发现时输出 -->
|
|
131
131
|
## 悟见
|
|
132
|
-
{来自
|
|
132
|
+
{来自 .roll/dream/ 的摘要}
|
|
133
133
|
|
|
134
134
|
<!-- 仅当有 ESCALATE 告警时输出 -->
|
|
135
135
|
## 需人工介入
|
|
@@ -165,21 +165,21 @@ A simple heuristic — not a gate, just a signal for the human:
|
|
|
165
165
|
写完文件后立即提交,让简报进入 git 历史,便于后续追溯与跨会话审计:
|
|
166
166
|
|
|
167
167
|
```bash
|
|
168
|
-
git add
|
|
168
|
+
git add .roll/briefs/YYYY-MM-DD-NN.md
|
|
169
169
|
git commit -m "docs: roll-brief YYYY-MM-DD-NN — {触发原因}"
|
|
170
170
|
git push origin main
|
|
171
171
|
```
|
|
172
172
|
|
|
173
173
|
- 触发原因来自调用上下文(Feature 完成 / 每日 / 手动 / `--feature` / `--since`),用一句话填入
|
|
174
174
|
- 写文件失败时不要执行 commit;保持工作区干净,由调用方处理重试
|
|
175
|
-
- 仅
|
|
175
|
+
- 仅 `.roll/briefs/` 下新文件入 commit,不要顺带带入其他无关变更
|
|
176
176
|
|
|
177
177
|
### Step 5 — Notify
|
|
178
178
|
|
|
179
179
|
写完文件后在终端或 CI 日志中打印简报路径:
|
|
180
180
|
|
|
181
181
|
```
|
|
182
|
-
📋
|
|
182
|
+
📋 简报已生成:.roll/briefs/2026-05-10-01.md
|
|
183
183
|
发布就绪:✅ 可发版
|
|
184
184
|
```
|
|
185
185
|
|
|
@@ -54,7 +54,7 @@ Activate when input is a `US-[A-Z]+-[0-9]+` identifier.
|
|
|
54
54
|
|
|
55
55
|
### Step 1: Read the Story
|
|
56
56
|
|
|
57
|
-
1. Open
|
|
57
|
+
1. Open `.roll/backlog.md`, find the US row, follow the link to `.roll/features/<feature>.md`
|
|
58
58
|
2. Read the full AC / Files / Dependencies section
|
|
59
59
|
3. If a plan doc (`<feature>-plan.md`) exists, read it for context
|
|
60
60
|
|
|
@@ -160,8 +160,8 @@ Wait for the user's response before editing files. If the user does not object w
|
|
|
160
160
|
### Phase 2: Create US / Actions
|
|
161
161
|
|
|
162
162
|
- Use `$roll-design` to split vague request into INVEST-compliant User Stories
|
|
163
|
-
- Insert US into
|
|
164
|
-
- If a new
|
|
163
|
+
- Insert US into `.roll/backlog.md` under the relevant Epic > Feature group
|
|
164
|
+
- If a new `.roll/features/<feature>.md` is needed, create it
|
|
165
165
|
|
|
166
166
|
After creation, switch to **Story mode** and execute the first US immediately.
|
|
167
167
|
|
|
@@ -275,19 +275,19 @@ While implementing, watch for these signals:
|
|
|
275
275
|
When any signal appears, **do not stop — flag it**:
|
|
276
276
|
|
|
277
277
|
```bash
|
|
278
|
-
# 1. Append to
|
|
278
|
+
# 1. Append to .roll/backlog.md under ## ♻️ Refactor
|
|
279
279
|
# REFACTOR-XXX | <one-line description> | 📋 Todo
|
|
280
280
|
|
|
281
|
-
# 2. Append a brief entry to
|
|
281
|
+
# 2. Append a brief entry to .roll/features/refactor-log.md
|
|
282
282
|
```
|
|
283
283
|
|
|
284
|
-
**REFACTOR entry format in
|
|
284
|
+
**REFACTOR entry format in .roll/backlog.md:**
|
|
285
285
|
|
|
286
286
|
```markdown
|
|
287
287
|
| REFACTOR-001 | {one-line plain-language description} | 📋 Todo |
|
|
288
288
|
```
|
|
289
289
|
|
|
290
|
-
描述写法:参见 AGENTS.md "Backlog descriptions" 规则。说清楚"什么需要改"以及"不改会怎样",技术细节写在
|
|
290
|
+
描述写法:参见 AGENTS.md "Backlog descriptions" 规则。说清楚"什么需要改"以及"不改会怎样",技术细节写在 `.roll/features/refactor-log.md`。
|
|
291
291
|
|
|
292
292
|
**refactor-log.md entry format:**
|
|
293
293
|
|
|
@@ -504,16 +504,16 @@ Follow the repo's deployment path (Vercel / Railway / etc.) and record the deplo
|
|
|
504
504
|
|
|
505
505
|
Both locations must be updated — neither can be skipped:
|
|
506
506
|
|
|
507
|
-
**① Update
|
|
507
|
+
**① Update .roll/backlog.md index row (Status column):**
|
|
508
508
|
|
|
509
509
|
```markdown
|
|
510
|
-
| [US-{ID}](
|
|
510
|
+
| [US-{ID}](.roll/features/<feature>.md#us-{id}) | {Title} | ✅ Done |
|
|
511
511
|
```
|
|
512
512
|
|
|
513
513
|
Change the Status from `📋 Todo` or `🔨 In Progress` (whichever the row currently shows) to `✅ Done`. When invoked by `roll-loop`, the row will already be `🔨 In Progress` — that is the expected starting state, and the transition is the same Edit operation.
|
|
514
514
|
For Fly mode: first append an index row under the appropriate Epic > Feature group, then mark it done.
|
|
515
515
|
|
|
516
|
-
**② Update
|
|
516
|
+
**② Update `.roll/features/<feature>.md` US section:**
|
|
517
517
|
|
|
518
518
|
```markdown
|
|
519
519
|
## US-{ID} {Story Title} ✅
|
|
@@ -544,7 +544,7 @@ it in the completion commit so no separate changelog commit is created.
|
|
|
544
544
|
$roll-.changelog
|
|
545
545
|
|
|
546
546
|
# 2. Commit BACKLOG + feature doc + CHANGELOG.md together
|
|
547
|
-
git add
|
|
547
|
+
git add .roll/backlog.md .roll/features/ CHANGELOG.md
|
|
548
548
|
git commit -m "docs: mark {US-ID} as completed"
|
|
549
549
|
git push
|
|
550
550
|
```
|
|
@@ -614,7 +614,7 @@ Before creating any file or directory:
|
|
|
614
614
|
- No "while I'm here" refactors unless in a separate TCR cycle
|
|
615
615
|
|
|
616
616
|
7. **Always update BACKLOG status**
|
|
617
|
-
-
|
|
617
|
+
- .roll/backlog.md index row and `.roll/features/<feature>.md` US section are both required
|
|
618
618
|
- Neither can be skipped
|
|
619
619
|
|
|
620
620
|
---
|
|
@@ -633,8 +633,8 @@ Before creating any file or directory:
|
|
|
633
633
|
- [ ] Deployed to production
|
|
634
634
|
- [ ] Online verification performed
|
|
635
635
|
- [ ] **Verification Gate passed** (fresh evidence for tests, build, deploy, no regression)
|
|
636
|
-
- [ ]
|
|
637
|
-
- [ ]
|
|
636
|
+
- [ ] **.roll/backlog.md index status updated** (📋 → ✅, REQUIRED)
|
|
637
|
+
- [ ] **`.roll/features/<feature>.md` US section updated** (Completed date + [x] ACs, REQUIRED)
|
|
638
638
|
- [ ] **CHANGELOG.md staged and bundled** into completion commit via `$roll-.changelog` in Phase 11 (REQUIRED)
|
|
639
639
|
- [ ] Summary reported to user
|
|
640
640
|
|
|
@@ -685,7 +685,7 @@ When complex state management is error-prone → consider full reset + re-initia
|
|
|
685
685
|
roll-build → ship anything (new idea, US-ID, free-text request)
|
|
686
686
|
roll-fix → fix a specific known bug (FIX-XXX / BUG-XXX)
|
|
687
687
|
roll-design → plan and design before building (no code output)
|
|
688
|
-
roll-idea → fast capture a bug or idea into
|
|
688
|
+
roll-idea → fast capture a bug or idea into .roll/backlog.md
|
|
689
689
|
roll-.clarify → passive scope clarification for vague build requests
|
|
690
690
|
```
|
|
691
691
|
|
|
@@ -587,7 +587,7 @@ Root cause identified
|
|
|
587
587
|
│ └── Re-mount BB → re-verify on page
|
|
588
588
|
│
|
|
589
589
|
├── In project source + cross-module / architectural
|
|
590
|
-
│ └── ESCALATE: create US-XXX in
|
|
590
|
+
│ └── ESCALATE: create US-XXX in .roll/backlog.md
|
|
591
591
|
│ ├── Suggest: $roll-build US-XXX
|
|
592
592
|
│ └── Report diagnosis findings
|
|
593
593
|
│
|