Some checks failed
Tests / test (push) Has been cancelled
按 U-Claw-海外化改造方案.md 与 范围决策记录.md 实施。这是 fork,不回上游: 海外版删掉的正是上游的中国市场默认值。 阶段 0 地基 - 下载源全部改国际:脚本/CI 61 处 + lockfile 880 条 npmmirror URL 归零 (lockfile 那 880 条是 npm 的 resolved 字段,脚本层参数化根本绕不过它) - 移除 install.ps1 里三个第三方 GitHub 加速代理,bundle 改直连 + SHA256 校验 (原来只检查"文件大于 1MB"就解压运行) - 技能内容与分发分离:skills/manifest.json 单一来源,install.sh 1170→658 行、 install.ps1 721→546 行,两者技能内容归零 实测原来是三份不一致:skills-cn 完整、install.sh 约 40%、install.ps1 约 17%, 且 7 个通用技能只有 U 盘版有 —— 一键安装的用户一个能用的技能都没有 - Node 版本三种(v22.14/16/22.1)统一,新建 NODE_VERSION 单一来源 - Config 页三份合一。portable/Config.html 用根相对路径调 API 却只从 file:// 打开, 保存功能已静默失效两个月;现缩为 120 行重定向壳 - 测试接入 CI(此前 node --test 无人运行,所有断言形同虚设) 阶段 1 双语可用 - 浏览器侧 i18n:JSON 为源、生成经典 script(file:// 下 fetch 本地 JSON 被拦) 语言跟盘走不跟机器走:启动器写 data/.openclaw/locale.js - 8 处硬编码 lang="zh-CN" 归零,data-i18n 覆盖 213 处,词条 en/zh 各 279 条 - B3 单框 Key:12 张模型卡 → 一个输入框,前缀识别 provider, 服务端 /api/test-key 发 1-token 请求实测,错误映射成人话 Key 填错到得知:从"直到对话失败"降到 ≤1 秒 - 区域格式 SG:DD/MM/YYYY、12 小时、S$、Asia/Singapore (ICU 在 en-SG 下把 SGD 渲染成裸 $,与美元无法区分,故自行拼 S$) - README 内容分叉而非翻译,§1.3 证据清单逐条清零 阶段 2 降门槛 - 启动逻辑上移 lib/start.mjs:Windows-Start.bat 220→28 行、 Mac-Start.command 235→33 行 修掉 Mac 侧两个 bug:控制台端口硬编码 18788(回落时打开死页)、 微信插件从未在 Mac 上安装 - U 盘根目录 23 → 3 个可点文件,其余进 advanced/ - 首启向导:语言 → 用途(7 角色,manifest 驱动)→ 密钥,答过不再问 - 三档界面,Simple 档隐藏一切技术名词 - 自动自愈:启动失败先自查自修,修不好导出脱敏诊断包 (Doctor 从"用户要知道去点的工具"变成后台机制) 阶段 3 技能库 - 19 个英文技能,planned 归零。sg-weather / sg-transport 的端点均实测过 - SkillHub 从 56 张手写第三方卡片改为 manifest 生成:703→125 行,中文归零 其他 - origin.json 收拢所有运行时地址,tests/origin.test.mjs 保证迁移不会漏 - portable/ 下用户可见中文归零(由断言保证) - 82 项测试 未验证(本机无 Windows / 无 pwsh): - install.ps1、setup.ps1 约 210 行改动从未经 PowerShell 解析器 - 完整启动路径仅在假 node + 假 openclaw 上冒烟 - 8 个 .bat 的盘根推导仅静态断言 详见 U盘实测清单.md 受阻: - 隐藏黑窗口 —— 需代码签名证书(.vbs 已被 Windows 弃用,替代方案都要签名) - 场景卡 —— OpenClaw 上游 Dashboard 无预填 prompt 接口 - 官网 36 条 —— 上游 2026-04-14 拆到私有仓库,无权限
156 lines
6.4 KiB
YAML
156 lines
6.4 KiB
YAML
name: Track OpenClaw upstream
|
||
|
||
# 自动跟踪 OpenClaw 上游更新(借鉴 agentkernel/openclaw-desktop 的 pin 思路,
|
||
# 但补上了它没做的最后一步:定时检测 + 自动 bump + 自动打 tag → 自动发版)。
|
||
#
|
||
# 工作原理:
|
||
# 1. 每天 cron 跑 `npm view openclaw version` 拿上游 npm 最新版
|
||
# 2. 和仓库里的 OPENCLAW_VERSION(pin)比对
|
||
# 3. 上游更新了 → 改 OPENCLAW_VERSION(根 + portable/)、bump 壳版本 patch、
|
||
# commit、push 新 tag v<壳版本>
|
||
# 4. push tag 触发 release.yml → 自动构建 Win/Mac 便携版+桌面版并发布 Release
|
||
#
|
||
# 设计原则:
|
||
# - 幂等:上游没新版就什么都不做,安静退出
|
||
# - 可手动:workflow_dispatch 支持手动触发、强制指定上游版本、dry-run 只看不改
|
||
# - 单一可信源:OPENCLAW_VERSION 是上游 pin,u-claw-app/package.json 是壳版本
|
||
|
||
on:
|
||
schedule:
|
||
# 每天 UTC 01:00(北京时间 09:00)检查一次
|
||
- cron: '0 1 * * *'
|
||
workflow_dispatch:
|
||
inputs:
|
||
force_version:
|
||
description: '强制使用的上游 OpenClaw 版本(留空=用 npm latest)'
|
||
required: false
|
||
default: ''
|
||
dry_run:
|
||
description: '只检测不改动(true/false)'
|
||
required: false
|
||
default: 'false'
|
||
|
||
permissions:
|
||
contents: write
|
||
|
||
jobs:
|
||
track:
|
||
name: Check upstream & auto-bump
|
||
runs-on: ubuntu-latest
|
||
steps:
|
||
- uses: actions/checkout@v4
|
||
with:
|
||
# 需要完整历史才能正确打 tag / 读已有 tag
|
||
fetch-depth: 0
|
||
# 半自动模式(默认):用 GITHUB_TOKEN push tag。GitHub 防递归机制下
|
||
# 自动推的 tag 不会触发 release.yml,所以需到 Actions 手动点一次 Run release。
|
||
# 想升级成全自动:去仓库 Settings → Secrets 加一个 RELEASE_PAT(个人访问令牌,
|
||
# repo 权限),本行会自动优先用它 push,tag 即可自动触发发版。
|
||
token: ${{ secrets.RELEASE_PAT || secrets.GITHUB_TOKEN }}
|
||
|
||
- uses: actions/setup-node@v4
|
||
with:
|
||
node-version: '22'
|
||
|
||
- name: Resolve upstream OpenClaw version
|
||
id: upstream
|
||
run: |
|
||
force="${{ github.event.inputs.force_version }}"
|
||
if [ -n "$force" ]; then
|
||
latest="${force#v}"
|
||
echo "强制指定上游版本: $latest"
|
||
else
|
||
latest="$(npm view openclaw version --registry=https://registry.npmjs.org 2>/dev/null | tr -d '[:space:]')"
|
||
echo "npm latest openclaw: $latest"
|
||
fi
|
||
if [ -z "$latest" ]; then
|
||
echo "::error::无法获取上游 openclaw 版本(npm view 失败)"
|
||
exit 1
|
||
fi
|
||
echo "latest=$latest" >> "$GITHUB_OUTPUT"
|
||
|
||
- name: Read current pin
|
||
id: current
|
||
run: |
|
||
pinned="$(tr -d '[:space:]' < OPENCLAW_VERSION)"
|
||
shell_ver="$(node -p "require('./u-claw-app/package.json').version")"
|
||
echo "pinned=$pinned" >> "$GITHUB_OUTPUT"
|
||
echo "shell_ver=$shell_ver" >> "$GITHUB_OUTPUT"
|
||
echo "当前 pin: $pinned | 壳版本: $shell_ver"
|
||
|
||
- name: Decide whether to bump
|
||
id: decide
|
||
run: |
|
||
latest="${{ steps.upstream.outputs.latest }}"
|
||
pinned="${{ steps.current.outputs.pinned }}"
|
||
if [ "$latest" = "$pinned" ]; then
|
||
echo "✅ 已是最新(pin=$pinned),无需发版。"
|
||
echo "changed=false" >> "$GITHUB_OUTPUT"
|
||
exit 0
|
||
fi
|
||
# 只在 latest 严格 > pinned 时发版(避免上游撤版导致回退)
|
||
newer="$(printf '%s\n%s\n' "$pinned" "$latest" | sort -V | tail -1)"
|
||
if [ "$newer" != "$latest" ]; then
|
||
echo "⚠️ npm latest ($latest) 不比当前 pin ($pinned) 新,跳过。"
|
||
echo "changed=false" >> "$GITHUB_OUTPUT"
|
||
exit 0
|
||
fi
|
||
echo "🆕 发现上游新版: $pinned → $latest"
|
||
echo "changed=true" >> "$GITHUB_OUTPUT"
|
||
|
||
- name: Compute next shell version (patch bump)
|
||
if: steps.decide.outputs.changed == 'true'
|
||
id: nextver
|
||
run: |
|
||
cur="${{ steps.current.outputs.shell_ver }}"
|
||
IFS='.' read -r MA MI PA <<< "$cur"
|
||
PA=$((PA + 1))
|
||
next="${MA}.${MI}.${PA}"
|
||
echo "壳版本 bump: $cur → $next"
|
||
echo "next=$next" >> "$GITHUB_OUTPUT"
|
||
|
||
- name: Apply changes (pin + version files)
|
||
if: steps.decide.outputs.changed == 'true' && github.event.inputs.dry_run != 'true'
|
||
run: |
|
||
latest="${{ steps.upstream.outputs.latest }}"
|
||
next="${{ steps.nextver.outputs.next }}"
|
||
|
||
# 1) 更新上游 pin(根 + portable/ 两份保持一致)
|
||
printf '%s\n' "$latest" > OPENCLAW_VERSION
|
||
printf '%s\n' "$latest" > portable/OPENCLAW_VERSION
|
||
|
||
# 2) bump 壳版本(package.json)。release.yml 仍会从 tag 同步,
|
||
# 这里写一份让 main 分支也保持一致。
|
||
node -e "const f='u-claw-app/package.json';const p=require('./'+f);p.version='$next';require('fs').writeFileSync(f, JSON.stringify(p,null,2)+'\n')"
|
||
|
||
echo "已写入: OPENCLAW_VERSION=$latest, 壳版本=$next"
|
||
|
||
- name: Commit, tag & push
|
||
if: steps.decide.outputs.changed == 'true' && github.event.inputs.dry_run != 'true'
|
||
run: |
|
||
latest="${{ steps.upstream.outputs.latest }}"
|
||
next="${{ steps.nextver.outputs.next }}"
|
||
|
||
git config user.name "u-claw-bot"
|
||
git config user.email "bot@u-claw.org"
|
||
|
||
git add OPENCLAW_VERSION portable/OPENCLAW_VERSION u-claw-app/package.json
|
||
git commit -m "chore(upstream): 跟随 OpenClaw $latest,发布 v$next
|
||
|
||
自动跟踪上游:OpenClaw npm latest 升到 $latest,
|
||
自动 bump 壳版本到 $next 并打 tag 触发发版。"
|
||
|
||
git push origin HEAD:main
|
||
|
||
# 打 tag 触发 release.yml
|
||
git tag "v$next"
|
||
git push origin "v$next"
|
||
|
||
echo "✅ 已推送 v$next,release.yml 将自动构建并发布。"
|
||
|
||
- name: Dry-run summary
|
||
if: steps.decide.outputs.changed == 'true' && github.event.inputs.dry_run == 'true'
|
||
run: |
|
||
echo "🔍 DRY RUN — 不改动。"
|
||
echo "若执行将:OPENCLAW_VERSION ${{ steps.current.outputs.pinned }} → ${{ steps.upstream.outputs.latest }},发布 v${{ steps.nextver.outputs.next }}"
|