@seanyao/roll 3.606.2 → 3.607.1
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 +67 -0
- package/bin/roll +37 -9
- package/dist/roll.mjs +6959 -1749
- package/package.json +1 -1
- package/skills/roll-build/SKILL.md +58 -10
- package/skills/roll-design/SKILL.md +35 -27
- package/skills/roll-fix/SKILL.md +59 -8
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,72 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## v3.607.1 — 2026-06-07
|
|
4
|
+
|
|
5
|
+
### 可见性
|
|
6
|
+
|
|
7
|
+
- detectLiveCycle 僵尸周期污染:无 cycle:end 的僵尸周期被误判为"当前正在运行",叠加 state.current_item 过期,dashboard 头行显示已交付数小时的旧故事;已加 >2h 僵尸跳过+最近活跃优先(FIX-217) `[loop]`
|
|
8
|
+
|
|
9
|
+
### 其他
|
|
10
|
+
|
|
11
|
+
- 验收闸查旧档案位:迁移后真报告被判缺失,硬闸假阴性逼出双账,闸址改与写端同源(FIX-216) `[loop]`
|
|
12
|
+
- roll peer mktemp 竞态 + 解析器无法解析自然语言决议;已加 PID 防竞态 + prompt 要求 Resolution: 行 + 解析器优先读该行(FIX-219) `[loop]`
|
|
13
|
+
- 层层嵌套索引站:从总览到史诗到卡片到报告全程可点击浏览(US-META-003)
|
|
14
|
+
- 建卡时自动生成 story 定义文件和全景报告骨架,后续阶段逐步填充(US-META-005)
|
|
15
|
+
- 交付与终评产物写入 story 文件夹,与验收报告同处一层(US-META-006)
|
|
16
|
+
- 存量 story 数据迁移命令:补定义文件、建文件夹、跳过多故事文件并保留反向引用(US-META-007)
|
|
17
|
+
|
|
18
|
+
## v3.606.3 — 2026-06-06
|
|
19
|
+
|
|
20
|
+
### 新功能
|
|
21
|
+
|
|
22
|
+
- 档案制写入端:待办与交付物同夹的布局支持,含编号到史诗的索引与垃圾回收命令(US-META-001)
|
|
23
|
+
|
|
24
|
+
### 稳定性
|
|
25
|
+
|
|
26
|
+
- 版本探针读冻结引擎的化石串:version 显示旧号、update 自检误报、升级 nag 永不消失,三症同根(FIX-202) `[loop]`
|
|
27
|
+
|
|
28
|
+
### 可见性
|
|
29
|
+
|
|
30
|
+
- 完成状态抢跑:PR 还没合并卡片就翻了完成,违反完成即已合主干的纪律(FIX-211) `[loop]`
|
|
31
|
+
- 面板对历史全瞎:周期记录缺时间戳,八次真实交付显示零,统计无从分桶(FIX-213) `[loop]`
|
|
32
|
+
- 面板对运行中的周期全盲:活性探测还读旧信号,真在干活却显示空闲零周期(FIX-203) `[loop]`
|
|
33
|
+
- (最小核) — roll loop now 改前台直跑:重入本 CLI run-once,agent 转录经 ROLL_LOOP_STREAM 实时打到当前终端(零 tmux 零弹窗零 tail);launchd 排程仍走静默 runner;buffered 用量采集不变 (#470)(US-PORT-011)
|
|
34
|
+
|
|
35
|
+
### 自动化流水线
|
|
36
|
+
|
|
37
|
+
- 终态失真:真实交付已合并完成,周期记录却写失败,失败语义被稀释(FIX-214) `[loop]`
|
|
38
|
+
- 无人值守周期自产实拍:给截屏调度器加终端通道,无图形环境时诚实跳过留痕(US-ATTEST-011)
|
|
39
|
+
- roll release v3 原生重写:版本号引导、changelog、PR 与 tag 流程提示;发版闸已在 CI(US-PORT-004)
|
|
40
|
+
- loop 读面子命令 TS 薄读取(eval、runs、story、signals);tmux 流的 monitor 与 attach 退役(US-PORT-007)
|
|
41
|
+
- dream 服务出 v3 runner(复用调度模板模式)或裁定退役;现状是断链僵尸(US-PORT-008)
|
|
42
|
+
- loop cycle cycle-20260606-050516-6852 (#477)(PR#477)
|
|
43
|
+
|
|
44
|
+
### 工程和测试
|
|
45
|
+
|
|
46
|
+
- 迁移命令嵌套仓盲区:对私仓的搬迁打到主仓上,吞错自报成功,修执行面并补嵌套形态测试(FIX-215) `[loop]`
|
|
47
|
+
- 档案迁移命令:读索引按清单搬树改名重建链,演练模式先行,可重入有测试(US-META-002a)
|
|
48
|
+
- difftest 卸 oracle:领域服务层一批对拍全部转冻结期望,测试期不再起 bash 或 python 引擎(US-PORT-009b)
|
|
49
|
+
|
|
50
|
+
### 其他
|
|
51
|
+
|
|
52
|
+
- v3 心脏首跑即瘫:skill 路径化石致 agent 盲开、改动漏回主仓、被杀不留痕、cycle 不可观测;修解析+钉题+连 .roll+信号善后+tmux 观测窗(FIX-204) `[loop]`
|
|
53
|
+
- 交付可以悄悄跳过验收报告:文本约束没牙,缺报告要在运行时留痕可审计,政策可升硬闸(FIX-207) `[loop]`
|
|
54
|
+
- 排程静默死亡:启用命令吞掉挂载失败照报成功,三小时无 tick 全靠人肉掩盖(FIX-212) `[loop]`
|
|
55
|
+
- 验收证据惯例升级:文本证据属 agent 自述可伪造,CLI 卡默认改为真实终端截屏走独立捕获通道,文本降级为补充(US-ATTEST-010)
|
|
56
|
+
- 验收口径补全:失败与阻塞有名分、敏感信息进档前遮蔽、报告生成后冒烟自检(US-ATTEST-012)
|
|
57
|
+
- 验收报告分层且自含待办全貌:卡情上下文与业务结论在前技术折叠,空章节裁剪,设计审查不改证据(US-ATTEST-013)
|
|
58
|
+
- 过程内联进报告:时间线与关键转折加折叠全转录,无人过程也可回溯(US-ATTEST-014)
|
|
59
|
+
- 执行存量迁移:演练过目后真跑,重写唯一活引用,全仓对账校验存档(US-META-002b)
|
|
60
|
+
- skills 验收文案同步新档案布局,跨仓改 roll-skills 后 bump submodule manual-only(US-META-004)
|
|
61
|
+
- changelog 生成同输入两次运行结果漂移:探针偶发失败静默切换过滤分支,17 条目消失(FIX-199) `[loop]`
|
|
62
|
+
- 观测窗可读性:裸流换三层关键节点转录,信号口径与验收报告时间线同源(US-PORT-012)
|
|
63
|
+
- roll brief TS 化:汇报口吻保留,默认一屏精简、细节折叠,跟随 locale 单语;agent 经结构化流只取终稿,绝不漏思考过程(US-PORT-002)
|
|
64
|
+
- roll idea TS 化:分类、自动编号、过 lint 规则落卡,与 backlog 存取同源(US-PORT-003)
|
|
65
|
+
- changelog 确定性输出转正:AI 润色降级为可选路径或退役,默认不再回落 bash(US-PORT-005)
|
|
66
|
+
- config 写面 TS 化,整个 config 命令收口(US-PORT-006)
|
|
67
|
+
- difftest 卸 oracle 第一步:立可复用的冻结期望转换范式,先转规格层与基础设施层两批验证可行(US-PORT-009a)
|
|
68
|
+
- difftest 卸 oracle:命令行只读命令一批对拍转冻结期望(US-PORT-009c)
|
|
69
|
+
|
|
3
70
|
## v3.606.2
|
|
4
71
|
|
|
5
72
|
### 稳定性
|
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="3.
|
|
7
|
+
VERSION="3.606.3"
|
|
8
8
|
ROLL_HOME="${ROLL_HOME:-${HOME}/.roll}"
|
|
9
9
|
ROLL_CONFIG="${ROLL_HOME}/config.yaml"
|
|
10
10
|
ROLL_GLOBAL="${ROLL_HOME}/conventions/global"
|
|
@@ -1948,7 +1948,7 @@ _check_installed_version_or_retry() {
|
|
|
1948
1948
|
local expected installed pkg_dir
|
|
1949
1949
|
expected="$(npm view @seanyao/roll version 2>/dev/null || true)"
|
|
1950
1950
|
pkg_dir="$(npm root -g 2>/dev/null || true)"
|
|
1951
|
-
installed="$(
|
|
1951
|
+
installed="$(_tree_version "${pkg_dir}/@seanyao/roll")" # FIX-202: package.json, not fossil VERSION=
|
|
1952
1952
|
|
|
1953
1953
|
[[ -z "$expected" || -z "$installed" ]] && return 0
|
|
1954
1954
|
|
|
@@ -1957,7 +1957,7 @@ _check_installed_version_or_retry() {
|
|
|
1957
1957
|
npm cache clean --force &>/dev/null || true
|
|
1958
1958
|
npm install -g @seanyao/roll@latest &>/dev/null || true
|
|
1959
1959
|
local after
|
|
1960
|
-
after="$(
|
|
1960
|
+
after="$(_tree_version "${pkg_dir}/@seanyao/roll")"
|
|
1961
1961
|
if [[ -n "$after" && "$after" != "$expected" ]]; then
|
|
1962
1962
|
warn "$(msg update.still_mismatch "$after")"
|
|
1963
1963
|
fi
|
|
@@ -1987,7 +1987,7 @@ cmd_update() {
|
|
|
1987
1987
|
fi
|
|
1988
1988
|
|
|
1989
1989
|
local new_version
|
|
1990
|
-
new_version="$(
|
|
1990
|
+
new_version="$(_tree_version "$ROLL_PKG_DIR")" # FIX-202: package.json, not fossil VERSION=
|
|
1991
1991
|
if [[ -n "$new_version" ]]; then
|
|
1992
1992
|
info "$(msg update.new_version "$new_version")"
|
|
1993
1993
|
fi
|
|
@@ -3960,7 +3960,7 @@ _peer_dispatch_in_tmux() {
|
|
|
3960
3960
|
local session="$1" cmd_str="$2" out_file="$3" err_file="$4" timeout="${5:-180}"
|
|
3961
3961
|
local done_file="${out_file}.done"
|
|
3962
3962
|
local inner
|
|
3963
|
-
inner=$(mktemp /tmp/roll-peer-inner
|
|
3963
|
+
inner=$(mktemp /tmp/roll-peer-inner-$$-XXXXXX.sh)
|
|
3964
3964
|
{
|
|
3965
3965
|
printf '#!/bin/bash -l\n'
|
|
3966
3966
|
# FIX-050: portable PATH assembly (was hardcoded /opt/homebrew/bin)
|
|
@@ -4074,9 +4074,12 @@ _peer_call() {
|
|
|
4074
4074
|
_peer_parse_resolution() {
|
|
4075
4075
|
local output="$1"
|
|
4076
4076
|
local resolution
|
|
4077
|
-
#
|
|
4078
|
-
|
|
4079
|
-
|
|
4077
|
+
# Prefer explicit "Resolution:" or "决议:" line (most reliable).
|
|
4078
|
+
resolution="$(printf '%s\n' "$output" | grep -oiE '^(Resolution|决议)\s*:\s*(AGREE|REFINE|OBJECT|ESCALATE)\b' | head -1 | grep -oiE '\b(AGREE|REFINE|OBJECT|ESCALATE)\b' | tr '[:lower:]' '[:upper:]')"
|
|
4079
|
+
if [[ -z "$resolution" ]]; then
|
|
4080
|
+
# Fallback: keyword at line start (legacy, kimi natural-language detection).
|
|
4081
|
+
resolution="$(printf '%s\n' "$output" | grep -oiE '^[^a-zA-Z]*\b(AGREE|REFINE|OBJECT|ESCALATE)\b' | head -1 | grep -oiE '\b(AGREE|REFINE|OBJECT|ESCALATE)\b' | tr '[:lower:]' '[:upper:]')"
|
|
4082
|
+
fi
|
|
4080
4083
|
printf '%s\n' "$resolution"
|
|
4081
4084
|
}
|
|
4082
4085
|
|
|
@@ -4197,7 +4200,7 @@ cmd_peer() {
|
|
|
4197
4200
|
fi
|
|
4198
4201
|
|
|
4199
4202
|
local prompt
|
|
4200
|
-
prompt="[PEER_REVIEW round=${round} tool=${from_tool}→${to_tool}]\n\n${context}"
|
|
4203
|
+
prompt="[PEER_REVIEW round=${round} tool=${from_tool}→${to_tool}]\n\n${context}\n\n---\n请以以下格式结束你的回复(必须单独一行):\nResolution: AGREE|REFINE|OBJECT"
|
|
4201
4204
|
|
|
4202
4205
|
local peer_session=""
|
|
4203
4206
|
if command -v tmux >/dev/null 2>&1; then
|
|
@@ -15326,6 +15329,31 @@ _notify_update() {
|
|
|
15326
15329
|
warn "$(msg update.available "$latest")"
|
|
15327
15330
|
}
|
|
15328
15331
|
|
|
15332
|
+
# FIX-202: read an install tree's version — package.json is the single source of
|
|
15333
|
+
# truth (v3 bumps it on release); the bin/roll VERSION= literal is only a
|
|
15334
|
+
# last-resort fallback for a tree predating the package.json convention. Used for
|
|
15335
|
+
# $VERSION (the running version) and by the update self-checks. Defined at the
|
|
15336
|
+
# foot so the resolution runs after every helper is sourced and so it adds no
|
|
15337
|
+
# lines above the line-coupled extraction regions other difftests rely on.
|
|
15338
|
+
_tree_version() {
|
|
15339
|
+
local tree="$1" v=""
|
|
15340
|
+
if [[ -f "${tree}/package.json" ]]; then
|
|
15341
|
+
v="$(grep -m1 '"version"' "${tree}/package.json" 2>/dev/null \
|
|
15342
|
+
| sed 's/.*"version"[[:space:]]*:[[:space:]]*"\([^"]*\)".*/\1/' || true)"
|
|
15343
|
+
fi
|
|
15344
|
+
if [[ -z "$v" ]]; then
|
|
15345
|
+
v="$(grep "^VERSION=" "${tree}/bin/roll" 2>/dev/null \
|
|
15346
|
+
| sed 's/.*VERSION="\([^"]*\)".*/\1/' || true)"
|
|
15347
|
+
fi
|
|
15348
|
+
echo "$v"
|
|
15349
|
+
}
|
|
15350
|
+
|
|
15351
|
+
# The running version is the tree containing THIS bin/roll ($(dirname SCRIPT_DIR)),
|
|
15352
|
+
# independent of any ROLL_PKG_DIR override (tests isolate the curl-swap tree there).
|
|
15353
|
+
_running_v="$(_tree_version "$(dirname "$SCRIPT_DIR")")"
|
|
15354
|
+
[[ -n "$_running_v" ]] && VERSION="$_running_v"
|
|
15355
|
+
unset _running_v
|
|
15356
|
+
|
|
15329
15357
|
if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then
|
|
15330
15358
|
_check_update_async
|
|
15331
15359
|
main "$@"
|