@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 CHANGED
@@ -1,52 +1,42 @@
1
1
  # Changelog
2
2
 
3
- ## v2026.511.11
4
- - **Added**: loop 默认 auto-attach 弹窗 — 每次 loop 触发时,runner script 自动通过 osascript 开一个背景 Terminal 窗口 `tmux attach -t roll-loop-<slug>`,看 claude 实时打字干活;弹窗用 `delay 0.3` + 还原前一个 frontmost app 做到不抢焦点,tmux session 结束窗口保留供回看,关掉窗口 loop 仍在 tmux 里继续跑。
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 执行 story 前显式标记 🔨 In Progress — roll-loop SKILL 在调用 executor 之前先把 BACKLOG 中的故事状态从 📋 Todo 改为 🔨 In Progress 并提交 `chore: mark US-XXX in progress`,brief 简报和 peer agent 都能即时感知正在进行的工作,tcr 微提交不再"对 brief 不可见"。
20
- - **Added**: loop 启动时孤儿 🔨 自愈 扫描 BACKLOG 中无对应 state.yaml running item 的 🔨 条目,视为上次崩溃残留,自动 revert 回 📋 Todo 并写 ALERT,避免被"卡"在错误的中间状态里。
21
- - **Improved**: roll-build / roll-fix SKILL 状态转换段更新 显式接受 📋 Todo 或 🔨 In Progress 作为 ✅ Done 前置状态,loop 触发链路状态过渡更稳健。
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
- - **Added**: Loop 并发安全 — runner script 启动时写入 per-project LOCK 文件并检测重入;活跃 PID 已存在则跳过本次,残留死 LOCK 自动清理;正常/异常退出均通过 trap 清掉 LOCK。彻底防止两个 loop 实例同时启动造成的 BACKLOG/git 冲突。
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**: launchd plist 自动 reload — plist 内容变更且服务已加载时自动 unload + reload,升级 roll 后 loop 服务立即生效,无需手动重启
30
- - **Improved**: roll loop status/monitor 三态展示 — 区分 ● 运行中 / ⚠ 已安装未加载 / ○ 未安装,并给出对应的自愈操作提示
21
+ - **Fixed**: 升级 roll 后 loop 服务自动生效,无需手动重启
22
+ - **Improved**: `roll loop status` 三态显示,看得清是真没装、装了没启、还是在跑
31
23
 
32
24
  ## v2026.511.4
33
- - **Fixed**: roll init 自动重建 launchd runner scripts — 升级 roll 后直接跑 `roll init` 即可迁移到独立 runner,无需手动执行 roll setup 或 roll loop on
25
+ - **Fixed**: 升级 roll `roll init` 自动迁移 loop 配置,少一步手动操作
34
26
 
35
27
  ## v2026.511.3
36
- - **Fixed**: loop/dream/brief 多项目运行隔离 — 共享 run.sh 导致所有项目的 loop 在同一目录执行,改为每个项目独立 runner 脚本(run-{slug}.sh),彻底隔离多项目并发执行环境
37
- - **Fixed**: roll release 自发版拦截 — 在 roll 自身项目执行 `roll release` 时自动拦截并提示改用 scripts/release.sh,防止误操作绕过 2FA
28
+ - **Fixed**: 多个项目同时跑 loop,互不干扰
29
+ - **Fixed**: 在 roll 项目里运行 `roll release` 会提示改用 `scripts/release.sh`
38
30
 
39
31
  ## v2026.511.2
40
- - **Added**: roll loop monitor 三服务状态 监控台新增 loop/dream/brief 三个 launchd 服务的运行状态、调度时间和实时 log tail,一屏掌握全局执行情况
41
- - **Fixed**: dashboard 多处展示问题 — 修复 pending_count 算术错误、brief 内联显示 release readiness、移除底部冗余命令列表
42
- - **Fixed**: loop 异常退出后 state 未重置 — 防止 queue 卡住导致后续任务无法执行
43
- - **Fixed**: CI 稳定性 — 修复 _notify_update 裸返回和时间断言,消除环境差异引起的随机失败
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**: roll loop 调度器切换到 launchd(macOS)— `roll setup` 自动安装 loop/dream/brief 三个 launchd 服务(默认关闭),`roll loop on/off/status` 统一走 launchctl 管理,幂等安装,Linux 保留 crontab 回退路径
48
- - **Added**: roll-loop TCR 硬校验 — 故事完成后自动统计 `tcr:` 微提交数量,为 0 时将故事状态回退为 📋 Todo 并写 ALERT,防止 agent 跳过 TCR 节奏
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"
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}" && ${cmd}
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.7",
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
- **Remove internal information:**
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
- **Keep user-facing value:**
56
- - New features (one-sentence description)
57
- - Bug fixes (user-visible impact)
58
- - UX improvements (layout, interaction enhancements)
59
- - Performance/reliability improvements
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
- **语言:中文。** 所有 changelog 条目必须用中文撰写。
57
+ 判断准则:**如果用户读了这条记录,他不会改变使用方式,就别写。**
62
58
 
63
- **Description format:** `功能名 — 做了什么 + 用在什么场景`,一句话,精简。
59
+ **保留:**
60
+ - 用户能直接调用的新功能 / 新命令
61
+ - 用户实际遇到过的 bug 修复
62
+ - 看得见的体验变化(布局、文案、速度、可见性)
63
+ - 影响安装、升级、配置的改动
64
64
 
65
- Good:
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-jot一句话快速记录 bug 或想法到 backlog,不打断当前工作
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
- Bad:
82
+ ✅ 讲价值:
72
83
  ```
73
- - **Added**: Add roll-jot skill for fast backlog capture
74
- - **Fixed**: Sync prunes stale files to prevent ghost files
84
+ - **Added**: `roll loop runs` 随时查看 loop 最近几次都跑了什么
75
85
  ```
76
86
 
77
- ### 4. Version Number Format
87
+ 内部信息扎堆:
88
+ ```
89
+ - **Fixed**: 集成测试 launchd ghost 泄漏 — `integration_teardown` 在删除 TEST_TMP 之前,先 `launchctl bootout` 该沙箱里被 `roll loop on` 注册到 user gui domain 的所有 `com.roll.*` 服务。
90
+ ```
78
91
 
79
- Determine the current version being released:
92
+ **直接跳过**:测试基建修复,用户感知不到。
80
93
 
81
- ```bash
82
- VERSION=$(node -e "process.stdout.write(require('./package.json').version)" 2>/dev/null \
83
- || git describe --tags --abbrev=0 2>/dev/null | sed 's/^v//')
94
+ ❌ 参数列表+黑话:
95
+ ```
96
+ - **Added**: Loop 并发安全 runner script 启动时写入 per-project LOCK 文件并检测重入;活跃 PID 已存在则跳过本次,残留死 LOCK 自动清理;正常/异常退出均通过 trap 清掉 LOCK。
84
97
  ```
85
98
 
86
- `package.json` is the authoritative source — it is updated before this skill runs. Fall back to git tags only if `package.json` is unavailable.
99
+ 用户视角:
100
+ ```
101
+ - **Fixed**: 多个 loop 实例不会再互相打架(重复触发自动跳过)
102
+ ```
87
103
 
88
- The CHANGELOG section header uses the full version string with a `v` prefix:
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
- ## v${VERSION}
111
+ ## Unreleased
112
+ - **Added**: ...new entries here...
113
+ - **Fixed**: ...
92
114
  ```
93
115
 
94
- For the human-readable date display within entries, use `YYYY.MM.DD` format.
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**: E2E 自动沉淀 每个 Story 交付时自动写一个端到端测试,项目逐步积累可回放的 E2E 套件
104
- - **Fixed**: 同步时清理已删除文件,防止用户机器残留幽灵文件
133
+ - **Added**: ...historical entries from completed Stories before today...
134
+ ```
105
135
 
106
- ## 2026.05.04
107
- - **Added**: BB 注入模式 — 对未集成 Black Box 的页面自动注入诊断探针,统一数据采集接口
136
+ **Append mode** (most common — CHANGELOG.md exists):
108
137
 
109
- ## 2026.04.28
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
- ## 2026.05.10 ← 新条目插入顶部
118
- - **Added**: Changelog 自动生成 每次部署后自动更新,首次运行时回填全部历史记录
145
+ ## Unreleased
146
+ - **Added**: ...just-deployed entry appended here...
147
+ - **Fixed**: ...another just-deployed entry...
119
148
 
120
- ## 2026.05.04 已有条目不动
149
+ ## v2026.05.07 previous releases left untouched
121
150
  - ...
122
151
  ```
123
152
 
124
- **Ordering**: Most recent version first (reverse chronological)
153
+ **Ordering**: Unreleased always at top. Below it, released versions in reverse chronological order.
125
154
 
126
155
  ### 6. Commit Update
127
156