@seanyao/roll 2026.510.6 → 2026.510.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.
Files changed (3) hide show
  1. package/CHANGELOG.md +12 -1
  2. package/bin/roll +31 -26
  3. package/package.json +1 -1
package/CHANGELOG.md CHANGED
@@ -1,13 +1,24 @@
1
1
  # Changelog
2
2
 
3
3
  ## 2026.05.10
4
+ - **Added**: roll-loop — BACKLOG 自主执行器,支持调度、跨 Agent 路由和失败处理,让 AI 自主推进项目任务
5
+ - **Added**: roll-brief — Feature完成汇报、每日晨报、按需简报,一句话掌握项目状态和发布就绪情况
6
+ - **Added**: roll-.dream — 每晚代码架构健康巡检,自动产出 REFACTOR 条目,架构问题持续浮出水面
7
+ - **Added**: roll-build 架构摩擦信号 — 实现遇阻时自动向 BACKLOG 写入 REFACTOR 标记,技术债持续可见
4
8
  - **Added**: E2E 自动沉淀 — 每个 Story 交付时自动写一个端到端测试,项目逐步积累可回放的 E2E 套件
5
9
  - **Added**: CI E2E 门禁 — 模板 CI 每次推送自动跑 E2E 测试,没有 E2E 时静默跳过不阻塞
6
10
  - **Added**: CI 红灯分诊 — 按严重程度分类 CI 失败,自动路由到 backlog 变成可执行的修复项
7
11
  - **Added**: roll-debug 自动修复 — 诊断后若根因在项目源码内,自动进入 TCR 修复流程并回验
8
12
  - **Added**: Changelog 自动生成 — 每次部署后自动更新,首次运行时回填全部历史记录
9
- - **Fixed**: roll-release 补齐 GitHub Release 创建步骤 — 修复版本更新提醒从不生效的问题,并回填全部 40 个历史 tag
10
13
  - **Added**: roll status/update 显示最近更新 — 运行 `roll status` 或 `roll update` 时展示最近 3 个版本的 changelog
14
+ - **Fixed**: roll-release 补齐 GitHub Release 创建步骤 — 修复版本更新提醒从不生效的问题,并回填全部 40 个历史 tag
15
+ - **Fixed**: Agent 调用层统一 — 移除所有 claude -p 硬编码,统一 agent 抽象层,支持 Claude/Kimi/Pi/Codex/OpenCode
16
+ - **Fixed**: Kimi CLI 解析修复 — 剥离 YAML frontmatter 中的 `---` 分隔符,避免 Kimi 调用时解析崩溃
17
+ - **Fixed**: 版本比较改用 sort -V,防止旧版本号被误判为最新
18
+ - **Fixed**: dashboard 命令列表补全,`roll --help` 现在展示全部可用命令
19
+ - **Fixed**: `roll release` 命令补全到 usage() 帮助中
20
+ - **Fixed**: 版本更新后主动清缓存 — 检测到当前运行版本更新时自动清缓存,避免旧版本幽灵提示
21
+ - **Fixed**: release.sh 自洽 — 内联 agent 检测和 changelog 同步,发版流程不再依赖外部调用
11
22
 
12
23
  ## 2026.05.09
13
24
  - **Added**: roll-peer 跨 Agent 代码评审 — 支持 Claude Code、Kimi CLI、DeepSeek TUI、Codex CLI 多工具协同评审 (by @seanyao)
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.510.6"
7
+ VERSION="2026.510.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"
@@ -1662,18 +1662,24 @@ _project_agent() {
1662
1662
  fi
1663
1663
  }
1664
1664
 
1665
+ _skill_content() {
1666
+ # Strip YAML frontmatter (---...---) — it's roll-internal metadata, not agent instructions
1667
+ awk 'NR==1 && /^---$/{skip=1;next} skip && /^---$/{skip=0;next} !skip{print}' "$1"
1668
+ }
1669
+
1665
1670
  _agent_run_skill() {
1666
1671
  local skill="$1"
1667
1672
  local agent; agent=$(_project_agent)
1668
1673
  local skill_file="${ROLL_HOME}/skills/${skill}/SKILL.md"
1669
1674
  [[ -f "$skill_file" ]] || { err "Skill not found: ${skill}"; return 1; }
1675
+ local content; content=$(_skill_content "$skill_file")
1670
1676
  case "$agent" in
1671
- claude) claude -p "$(cat "$skill_file")" ;;
1672
- kimi) kimi --quiet -p "$(cat "$skill_file")" ;;
1673
- deepseek) deepseek "$(cat "$skill_file")" ;;
1674
- pi) pi -p "$(cat "$skill_file")" ;;
1675
- codex) codex exec --json --output-last-message "$(cat "$skill_file")" ;;
1676
- opencode) opencode run "$(cat "$skill_file")" ;;
1677
+ claude) claude -p "$content" ;;
1678
+ kimi) kimi --quiet -p "$content" ;;
1679
+ deepseek) deepseek "$content" ;;
1680
+ pi) pi -p "$content" ;;
1681
+ codex) codex exec "$content" ;;
1682
+ opencode) opencode run "$content" ;;
1677
1683
  *) err "Unknown agent '${agent}'. Run: roll agent use <claude|kimi|deepseek|pi|codex|opencode>"; return 1 ;;
1678
1684
  esac
1679
1685
  }
@@ -1729,13 +1735,15 @@ _LOOP_ALERT="${HOME}/.shared/roll/loop/ALERT.md"
1729
1735
  _agent_skill_cmd() {
1730
1736
  local skill_path="$1"
1731
1737
  local agent; agent=$(_project_agent)
1738
+ # Strip YAML frontmatter inline for cron commands
1739
+ local strip="awk 'NR==1 && /^---$/{skip=1;next} skip && /^---$/{skip=0;next} !skip{print}' '${skill_path}'"
1732
1740
  case "$agent" in
1733
- claude) echo "claude -p \"\$(cat '${skill_path}')\"" ;;
1734
- kimi) echo "kimi --quiet -p \"\$(cat '${skill_path}')\"" ;;
1735
- deepseek) echo "deepseek \"\$(cat '${skill_path}')\"" ;;
1736
- pi) echo "pi -p \"\$(cat '${skill_path}')\"" ;;
1737
- codex) echo "codex exec --json --output-last-message \"\$(cat '${skill_path}')\"" ;;
1738
- opencode) echo "opencode run \"\$(cat '${skill_path}')\"" ;;
1741
+ claude) echo "claude -p \"\$(${strip})\"" ;;
1742
+ kimi) echo "kimi --quiet -p \"\$(${strip})\"" ;;
1743
+ deepseek) echo "deepseek \"\$(${strip})\"" ;;
1744
+ pi) echo "pi -p \"\$(${strip})\"" ;;
1745
+ codex) echo "codex exec \"\$(${strip})\"" ;;
1746
+ opencode) echo "opencode run \"\$(${strip})\"" ;;
1739
1747
  *) err "Unknown agent '${agent}'. Run: roll agent use <claude|kimi|deepseek|pi|codex|opencode>"; return 1 ;;
1740
1748
  esac
1741
1749
  }
@@ -1861,18 +1869,7 @@ cmd_brief() {
1861
1869
  }
1862
1870
 
1863
1871
  cmd_release() {
1864
- local script="scripts/release.sh"
1865
- if [[ ! -f "$script" ]]; then
1866
- err "scripts/release.sh not found — run this command from the roll project root."
1867
- exit 1
1868
- fi
1869
- # Sync CHANGELOG.md before releasing, using the configured agent
1870
- local last_tag; last_tag=$(git tag --sort=-version:refname | grep "^v" | head -1)
1871
- if [[ -n "$last_tag" ]] && ! git diff "${last_tag}..HEAD" --name-only | grep -q "CHANGELOG.md"; then
1872
- info "CHANGELOG.md not updated since ${last_tag}, syncing via $(_project_agent)..."
1873
- _agent_run_skill "roll-.changelog"
1874
- fi
1875
- bash "$script" "$@"
1872
+ _agent_run_skill "roll-release"
1876
1873
  }
1877
1874
 
1878
1875
  # ─────────────────────────────────────────────────────────────────────────────
@@ -1906,7 +1903,8 @@ _dashboard() {
1906
1903
  fi
1907
1904
 
1908
1905
  echo ""
1909
- echo " roll loop on|off|now|status|resume|reset · roll brief · roll agent use <name>"
1906
+ echo " loop <on|off|now|status|resume|reset> · brief · agent use <name> · release"
1907
+ echo " setup · update · init · status · peer · help"
1910
1908
  echo ""
1911
1909
  }
1912
1910
 
@@ -1935,6 +1933,7 @@ usage() {
1935
1933
  echo " loop <on|off|now|status|resume|reset> [Autonomous] Manage scheduled BACKLOG executor 管理自主执行循环"
1936
1934
  echo " brief [Digest] Show latest owner brief (regenerate if stale) 展示最新简报"
1937
1935
  echo " agent [use <name>|list] [Config] Per-project agent selection 切换项目 agent"
1936
+ echo " release [Publish] Sync changelog + version bump + npm publish 同步日志并发版"
1938
1937
  echo ""
1939
1938
  echo "Examples / 示例:"
1940
1939
  echo " roll setup # New machine: first-time install 新机器首次安装"
@@ -2016,6 +2015,12 @@ _notify_update() {
2016
2015
  [[ -f "$cache" ]] || return
2017
2016
  local latest; latest=$(awk '{print $2}' "$cache" 2>/dev/null || true)
2018
2017
  [[ -z "$latest" || "$latest" == "$VERSION" ]] && return
2018
+ local newer; newer=$(printf '%s\n%s\n' "$VERSION" "$latest" | sort -V | tail -1)
2019
+ if [[ "$newer" == "$VERSION" ]]; then
2020
+ # Running version is newer than cached — stale cache, clear it
2021
+ rm -f "$cache"
2022
+ return
2023
+ fi
2019
2024
  echo ""
2020
2025
  warn "v${latest} available — run 'roll update' to upgrade 有新版本 v${latest} — 运行 'roll update' 升级"
2021
2026
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@seanyao/roll",
3
- "version": "2026.510.6",
3
+ "version": "2026.510.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"