@seanyao/roll 2026.511.7 → 2026.511.8
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 +23 -33
- package/bin/roll +6 -2
- package/package.json +1 -1
- package/skills/roll-.changelog/SKILL.md +70 -41
package/CHANGELOG.md
CHANGED
|
@@ -1,52 +1,42 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
-
##
|
|
4
|
-
- **
|
|
5
|
-
- **Added**: `roll loop mute` / `roll loop unmute` 一键开关 — 不想看弹窗时 `roll loop mute` 创建 `~/.shared/roll/mute` 标记文件即刻静音,`unmute` 删掉它恢复;mute 状态对所有项目生效(一个开关治整机),`roll loop status` 新增 `Auto-attach live | muted` 一行实时显示。
|
|
6
|
-
- **Added**: tmux 升级为 `roll setup` 必装依赖 — 新增 `_ensure_tmux` helper:macOS 自动 `brew install tmux`(无 brew 给手动命令),Linux/其他系统打印对应包管理器安装指引;任何失败路径都返回 0,不阻塞 setup 主流程。
|
|
7
|
-
- **Fixed**: launchd runner 缺 brew PATH 导致 hook 子进程报 `node: command not found` — launchd 默认 PATH 不含 `/opt/homebrew/bin`,claude 通过 `sh -c` 调 SessionEnd hook 时找不到 node;inner runner 模板显式 `export PATH="/opt/homebrew/bin:$PATH"` 让整条 fork 链都能拿到 brew 工具。
|
|
8
|
-
- **Fixed**: runs.jsonl schema 漂移 — 早期 claude 在 status/ts/alerts/project 字段自由发挥(`built` vs `success` vs `noop`、UTC vs `+08:00`、number vs array、全路径 vs slug)。SKILL Step 5 改为"严格契约":ts 强制 UTC Z 后缀、project 用 slug、alerts/built/skipped 永远是数组、status 限定 `built/idle/failed` 三个 enum 无同义词;contract test 锁死关键不变量留在 prompt 里。
|
|
9
|
-
|
|
10
|
-
## v2026.511.9
|
|
11
|
-
- **Added**: `roll loop runs` 每次 loop 运行的快速可见性 — 单次 loop 结束追加一行 JSON 到 `~/.shared/roll/loop/runs.jsonl`(含 ts/project/run_id/status/built/skipped/alerts/tcr_count/duration_sec),新命令 `roll loop runs [N] [--all]` 倒序显示最近 N 次(默认 10),不必等次日早报就能查到中间 13 次 loop 各干了啥。
|
|
12
|
-
- **Added**: loop 跑在 tmux session + `roll loop attach` 实时观看 — runner script 自动把 claude 包进 detached tmux session `roll-loop-<slug>`,输出同时 pipe 到 `cron.log`;执行 `roll loop attach` 可随时 attach 上去看它打字、写文件、commit,Ctrl-B D 分离后 loop 继续跑;未装 tmux 时自动 fallback 到原 headless 模式,零依赖回退。
|
|
13
|
-
- **Improved**: roll-.dream 日志改为中文输出 — Dream Log 输出模板(概要 / 死代码 / 架构漂移 / 裁剪候选 / 新兴模式 / 创建的 REFACTOR 条目)和"未发现 / 部分完成"等固定文案全部中文化,与 roll-brief 风格对齐,晨间扫一眼不再需要在中英文之间切换语境。
|
|
14
|
-
|
|
15
|
-
## v2026.511.8
|
|
16
|
-
- **Fixed**: 集成测试 launchd ghost 泄漏 — `integration_teardown` 在删除 TEST_TMP 之前,先 `launchctl bootout` 该沙箱里被 `roll loop on` 注册到 user gui domain 的所有 `com.roll.*` 服务,避免删 plist 后 launchd 仍保留指向不存在路径的 ghost 注册。
|
|
3
|
+
## Unreleased
|
|
4
|
+
- **Fixed**: `roll loop attach` 不再黑屏,AI 干活过程实时可见
|
|
17
5
|
|
|
18
6
|
## v2026.511.7
|
|
19
|
-
- **Added**: loop
|
|
20
|
-
- **Added**: loop
|
|
21
|
-
- **
|
|
7
|
+
- **Added**: loop 跑起来时自动弹出一个终端窗口,看 AI 实时干活
|
|
8
|
+
- **Added**: `roll loop mute` 关掉自动弹窗,`roll loop unmute` 恢复
|
|
9
|
+
- **Added**: `roll loop runs` — 查看 loop 最近几次都跑了什么
|
|
10
|
+
- **Added**: `roll loop attach` — 随时接入正在跑的 loop 现场围观
|
|
11
|
+
- **Added**: BACKLOG 任务执行中会实时显示 🔨 进度,不用等做完才知道
|
|
12
|
+
- **Added**: `roll setup` 自动安装 tmux(macOS 通过 brew)
|
|
13
|
+
- **Improved**: 代码巡检(dream)报告改为中文输出
|
|
14
|
+
- **Fixed**: loop 在某些情况下完成后不正常退出
|
|
15
|
+
- **Fixed**: loop 中途崩溃后下次启动会自动清理残留状态
|
|
22
16
|
|
|
23
17
|
## v2026.511.6
|
|
24
|
-
- **
|
|
25
|
-
- **Added**: roll-loop SKILL 显式声明 skip-🔨 In Progress 语义 — claude 扫 BACKLOG 时跳过已被人工或 peer agent 标记的执行中条目,为人机协同和多 agent 协作奠定基础。
|
|
26
|
-
- **Fixed**: 5 个 pre-existing 测试失败 — `run_roll` helper 切换到 TEST_TMP 作为 cwd 避免 slug 冲突;loop status 测试匹配三态显示新文案;dashboard 测试匹配 `_launchd_svc_state` + array 派生 schedule 的新结构。
|
|
18
|
+
- **Fixed**: 多个 loop 实例不会再因为定时重复触发而互相打架
|
|
27
19
|
|
|
28
20
|
## v2026.511.5
|
|
29
|
-
- **Fixed**:
|
|
30
|
-
- **Improved**: roll loop status
|
|
21
|
+
- **Fixed**: 升级 roll 后 loop 服务自动生效,无需手动重启
|
|
22
|
+
- **Improved**: `roll loop status` 三态显示,看得清是真没装、装了没启、还是在跑
|
|
31
23
|
|
|
32
24
|
## v2026.511.4
|
|
33
|
-
- **Fixed**:
|
|
25
|
+
- **Fixed**: 升级 roll 后 `roll init` 自动迁移 loop 配置,少一步手动操作
|
|
34
26
|
|
|
35
27
|
## v2026.511.3
|
|
36
|
-
- **Fixed**:
|
|
37
|
-
- **Fixed**:
|
|
28
|
+
- **Fixed**: 多个项目同时跑 loop,互不干扰
|
|
29
|
+
- **Fixed**: 在 roll 项目里运行 `roll release` 会提示改用 `scripts/release.sh`
|
|
38
30
|
|
|
39
31
|
## v2026.511.2
|
|
40
|
-
- **Added**: roll loop monitor
|
|
41
|
-
- **Fixed**: dashboard
|
|
42
|
-
- **Fixed**: loop
|
|
43
|
-
- **
|
|
44
|
-
- **Improved**: roll-brief 输出格式 — 序号命名、省略空 section、元信息格式精简,减少无效噪音
|
|
32
|
+
- **Added**: `roll loop monitor` — 一屏看 loop/dream/brief 三个调度服务状态
|
|
33
|
+
- **Fixed**: dashboard 待办数、release 状态显示问题
|
|
34
|
+
- **Fixed**: loop 异常退出后队列卡住不再继续执行
|
|
35
|
+
- **Improved**: 简报输出更精简,去掉空白段落和冗余信息
|
|
45
36
|
|
|
46
37
|
## v2026.511.1
|
|
47
|
-
- **Changed**:
|
|
48
|
-
- **Added**:
|
|
49
|
-
- **Fixed**: CI 测试环境兼容 — 移除依赖本地 state.yaml 的 hello_world.bats,修复 GitHub Actions 持续失败
|
|
38
|
+
- **Changed**: macOS 上 loop 调度切换到 launchd,比 crontab 更稳定
|
|
39
|
+
- **Added**: agent 跳过 TCR 节奏时自动拦回 Todo,强制重做
|
|
50
40
|
|
|
51
41
|
## v2026.510.10
|
|
52
42
|
- **Fixed**: release.sh changelog 同步时序修复 — 修正条件逻辑和执行顺序,确保每次发版时 changelog 正确更新
|
package/bin/roll
CHANGED
|
@@ -4,7 +4,7 @@ set -euo pipefail
|
|
|
4
4
|
# Roll — AI Agent Convention Manager
|
|
5
5
|
# Single source of truth for how all AI coding agents behave.
|
|
6
6
|
|
|
7
|
-
VERSION="2026.511.
|
|
7
|
+
VERSION="2026.511.8"
|
|
8
8
|
ROLL_HOME="${ROLL_HOME:-${HOME}/.roll}"
|
|
9
9
|
ROLL_CONFIG="${ROLL_HOME}/config.yaml"
|
|
10
10
|
ROLL_GLOBAL="${ROLL_HOME}/conventions/global"
|
|
@@ -1891,10 +1891,14 @@ _write_loop_runner_script() {
|
|
|
1891
1891
|
mkdir -p "$(dirname "$script_path")"
|
|
1892
1892
|
|
|
1893
1893
|
local inner_path="${script_path%.sh}-inner.sh"
|
|
1894
|
+
# Inject --verbose into `claude -p` so the tmux-attach view shows live
|
|
1895
|
+
# tool-use and reasoning events (loop is launchd-triggered, the user is
|
|
1896
|
+
# not driving it — visibility is required, not optional).
|
|
1897
|
+
local cmd_verbose="${cmd/claude -p/claude --verbose -p}"
|
|
1894
1898
|
cat > "$inner_path" << INNER
|
|
1895
1899
|
#!/bin/bash -l
|
|
1896
1900
|
export PATH="/opt/homebrew/bin:\$PATH"
|
|
1897
|
-
cd "${project_path}" && ${
|
|
1901
|
+
cd "${project_path}" && ${cmd_verbose}
|
|
1898
1902
|
INNER
|
|
1899
1903
|
chmod +x "$inner_path"
|
|
1900
1904
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@seanyao/roll",
|
|
3
|
-
"version": "2026.511.
|
|
3
|
+
"version": "2026.511.8",
|
|
4
4
|
"description": "Roll — Roll out features with AI agents",
|
|
5
5
|
"scripts": {
|
|
6
6
|
"test": "find tests/unit tests/integration -name '*.bats' | sort | xargs ./tests/helpers/bats-core/bin/bats"
|
|
@@ -45,83 +45,112 @@ Create mode:
|
|
|
45
45
|
|
|
46
46
|
### 3. Filter for External Content
|
|
47
47
|
|
|
48
|
-
|
|
49
|
-
- Progress tables, completion percentages
|
|
50
|
-
- "As a / I can / So that" format
|
|
51
|
-
- Detailed AC checklists
|
|
52
|
-
- Technical debt, internal file paths
|
|
53
|
-
- Test case counts, architecture diagrams
|
|
48
|
+
CHANGELOG 是给**使用者**看的,不是给维护者看的。一句话讲清"用户能做什么 / 不再被什么坑",能不写就不写。
|
|
54
49
|
|
|
55
|
-
|
|
56
|
-
-
|
|
57
|
-
-
|
|
58
|
-
-
|
|
59
|
-
-
|
|
50
|
+
**完全跳过(不写入 CHANGELOG):**
|
|
51
|
+
- 测试基建(teardown 清理、test isolation、bats helper、CI 时序)
|
|
52
|
+
- prompt / SKILL.md 内部契约(schema 锁定、enum 强制、contract test)
|
|
53
|
+
- 内部重构(提取函数、变量改名、目录调整)
|
|
54
|
+
- 只有开发者会遇到的 bug(release.sh 自身逻辑、TCR 节奏调整)
|
|
55
|
+
- 任何"用户体验不变"的改动
|
|
60
56
|
|
|
61
|
-
|
|
57
|
+
判断准则:**如果用户读了这条记录,他不会改变使用方式,就别写。**
|
|
62
58
|
|
|
63
|
-
|
|
59
|
+
**保留:**
|
|
60
|
+
- 用户能直接调用的新功能 / 新命令
|
|
61
|
+
- 用户实际遇到过的 bug 修复
|
|
62
|
+
- 看得见的体验变化(布局、文案、速度、可见性)
|
|
63
|
+
- 影响安装、升级、配置的改动
|
|
64
64
|
|
|
65
|
-
|
|
65
|
+
**写法约束:**
|
|
66
|
+
|
|
67
|
+
1. **一行,30 字以内**。超了就是太啰嗦。
|
|
68
|
+
2. **不写实现细节**:禁止文件路径、函数名、字段列表、命令参数、配置键名。
|
|
69
|
+
3. **不写数字细节**:"3 个服务"、"60+ ghost" 这种内部状态不写。
|
|
70
|
+
4. **说人话**:避免 "幂等"、"trap"、"epoch" 等技术黑话;说"做两次效果一样"、"异常退出也会清理"、"启动时间"。
|
|
71
|
+
5. **句式**:`功能名 — 用户能做什么 / 解决了什么麻烦`。
|
|
72
|
+
|
|
73
|
+
**语言:中文。**
|
|
74
|
+
|
|
75
|
+
具体对比(都是真实的 roll 改动):
|
|
76
|
+
|
|
77
|
+
❌ 全是实现细节:
|
|
66
78
|
```
|
|
67
|
-
- **Added**: roll
|
|
68
|
-
- **Fixed**: 同步时清理已删除文件,防止用户机器残留幽灵文件
|
|
79
|
+
- **Added**: `roll loop runs` 每次 loop 运行的快速可见性 — 单次 loop 结束追加一行 JSON 到 `~/.shared/roll/loop/runs.jsonl`(含 ts/project/run_id/status/built/skipped/alerts/tcr_count/duration_sec),新命令 `roll loop runs [N] [--all]` 倒序显示最近 N 次(默认 10)。
|
|
69
80
|
```
|
|
70
81
|
|
|
71
|
-
|
|
82
|
+
✅ 讲价值:
|
|
72
83
|
```
|
|
73
|
-
- **Added**:
|
|
74
|
-
- **Fixed**: Sync prunes stale files to prevent ghost files
|
|
84
|
+
- **Added**: `roll loop runs` — 随时查看 loop 最近几次都跑了什么
|
|
75
85
|
```
|
|
76
86
|
|
|
77
|
-
|
|
87
|
+
❌ 内部信息扎堆:
|
|
88
|
+
```
|
|
89
|
+
- **Fixed**: 集成测试 launchd ghost 泄漏 — `integration_teardown` 在删除 TEST_TMP 之前,先 `launchctl bootout` 该沙箱里被 `roll loop on` 注册到 user gui domain 的所有 `com.roll.*` 服务。
|
|
90
|
+
```
|
|
78
91
|
|
|
79
|
-
|
|
92
|
+
✅ **直接跳过**:测试基建修复,用户感知不到。
|
|
80
93
|
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
94
|
+
❌ 参数列表+黑话:
|
|
95
|
+
```
|
|
96
|
+
- **Added**: Loop 并发安全 — runner script 启动时写入 per-project LOCK 文件并检测重入;活跃 PID 已存在则跳过本次,残留死 LOCK 自动清理;正常/异常退出均通过 trap 清掉 LOCK。
|
|
84
97
|
```
|
|
85
98
|
|
|
86
|
-
|
|
99
|
+
✅ 用户视角:
|
|
100
|
+
```
|
|
101
|
+
- **Fixed**: 多个 loop 实例不会再互相打架(重复触发自动跳过)
|
|
102
|
+
```
|
|
87
103
|
|
|
88
|
-
|
|
104
|
+
### 4. Section Header — Always `## Unreleased`
|
|
105
|
+
|
|
106
|
+
**⚠️ do NOT guess version numbers.** Only `scripts/release.sh` assigns concrete
|
|
107
|
+
versions, and it only does so at the moment of a real release. Until then,
|
|
108
|
+
every new bullet goes under `## Unreleased` at the top of CHANGELOG.md.
|
|
89
109
|
|
|
90
110
|
```
|
|
91
|
-
##
|
|
111
|
+
## Unreleased
|
|
112
|
+
- **Added**: ...new entries here...
|
|
113
|
+
- **Fixed**: ...
|
|
92
114
|
```
|
|
93
115
|
|
|
94
|
-
|
|
116
|
+
When `release.sh` runs, it renames `## Unreleased` to `## v{N}` (where N is
|
|
117
|
+
computed from git tags) — that's the single moment a version label gets
|
|
118
|
+
assigned.
|
|
119
|
+
|
|
120
|
+
Do NOT read `package.json` version, do NOT call `git describe`, do NOT invent
|
|
121
|
+
version numbers like `v2026.511.8`. Just write to `## Unreleased`.
|
|
95
122
|
|
|
96
123
|
### 5. Generate CHANGELOG.md
|
|
97
124
|
|
|
98
|
-
**Create mode** (first time):
|
|
125
|
+
**Create mode** (first time, no CHANGELOG.md yet):
|
|
99
126
|
```markdown
|
|
100
127
|
# Changelog
|
|
101
128
|
|
|
129
|
+
## Unreleased
|
|
130
|
+
- **Added**: ...current deploy's entries...
|
|
131
|
+
|
|
102
132
|
## 2026.05.10
|
|
103
|
-
- **Added**:
|
|
104
|
-
|
|
133
|
+
- **Added**: ...historical entries from completed Stories before today...
|
|
134
|
+
```
|
|
105
135
|
|
|
106
|
-
|
|
107
|
-
- **Added**: BB 注入模式 — 对未集成 Black Box 的页面自动注入诊断探针,统一数据采集接口
|
|
136
|
+
**Append mode** (most common — CHANGELOG.md exists):
|
|
108
137
|
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
138
|
+
1. Find `## Unreleased` heading at the top of CHANGELOG.md.
|
|
139
|
+
2. If it exists → append new bullets under it (do NOT create a new section).
|
|
140
|
+
3. If it doesn't exist → insert a fresh `## Unreleased` at the very top (right after the `# Changelog` title) with the new bullets.
|
|
112
141
|
|
|
113
|
-
**Append mode** (subsequent):
|
|
114
142
|
```markdown
|
|
115
143
|
# Changelog
|
|
116
144
|
|
|
117
|
-
##
|
|
118
|
-
- **Added**:
|
|
145
|
+
## Unreleased
|
|
146
|
+
- **Added**: ...just-deployed entry appended here...
|
|
147
|
+
- **Fixed**: ...another just-deployed entry...
|
|
119
148
|
|
|
120
|
-
##
|
|
149
|
+
## v2026.05.07 ← previous releases left untouched
|
|
121
150
|
- ...
|
|
122
151
|
```
|
|
123
152
|
|
|
124
|
-
**Ordering**:
|
|
153
|
+
**Ordering**: Unreleased always at top. Below it, released versions in reverse chronological order.
|
|
125
154
|
|
|
126
155
|
### 6. Commit Update
|
|
127
156
|
|