Files
u-claw/CONTRIBUTING.md
zheng 3221856d50
Some checks failed
Tests / test (push) Has been cancelled
docs: 文档改为英文,并修正过时内容
不是翻译 —— 多数文档描述的行为已经不存在了。

先修一个更基本的问题:我们不拥有 u-claw.org 域名,那是上游的。所以之前写在
README、诊断包提示、联系方式里的 help@u-claw.org 全都会把用户的问题发给
上游 —— 一个没有理由回复的人。改为指向我们自己的 issue tracker,并加断言
禁止再出现指向该域名的支持入口。

重写(内容过时,不是语言问题):
- install/README.md —— 还写着 10 个中国技能、DeepSeek 优先、国内镜像。
  现在按实际流程写:技能读 manifest、模型菜单 Gemini 优先、bundle 有
  SHA256 校验。并如实写明 curl|bash 在受管企业电脑上会被 EDR 拦。
- CLAUDE.md 的模型配置整节 —— 还在描述虾盘云首选卡片和 12 个 provider,
  那个界面已经换成单框 Key 输入了。
- SECURITY.md —— 安全报告原本指向上游维护者个人邮箱。fork 之后那条路由
  是错的:漏洞会发给写不了这份代码、也修不了的人。
- CONTRIBUTING.md —— 补上 fork 关系、pre-push 钩子怎么装、以及
  `node --test tests/` 为什么不能用。

翻译并保留:
- bootable/README.md、TROUBLESHOOTING.md —— 面向用户,顺带把
  「国内镜像」「小米/华为 BIOS 按键」等换成目标市场的实际情况

HANDOFF.md 重写为一份事故复盘:原文一半是过时的一次性交接笔记(引用的
website/guide.html 已不在本仓库),另一半是 persistence.dat 未格式化导致
启动失败的排查记录 —— 后者有长期价值,尤其是「读 offset 1080 的两字节
验证 ext4」这个判断方法,已同时写进 bootable/README.md。

bootable/IMPROVEMENTS_SUMMARY.md 保留中文,加了说明:它是上游 fork 前的
历史改进记录,没人引用,描述的是已完成的工作而非当前行为。翻译它反而会
让人误以为是现行文档。

新增 skills/en/uclaw-help —— 把「怎么用、东西在哪、出问题怎么办」做成
内置知识,每个角色都装。方案 C10.8:能问的产品才是不需要学的产品。
2026-08-17 19:12:07 +08:00

5.7 KiB

Contributing

The mental model, first

This repository is the USB drive's contents — scripts, HTML, small files. After setup.sh it is a working drive — the above plus Node.js and OpenClaw.

It is not a build tool that produces a drive. It is the drive. That one idea explains most of the layout.

Four distribution forms, deliberately independent — changing one does not touch the others:

Directory Form Entry point
portable/ USB drive — the main product advanced/setup.shSTART HERE - Mac.command
bootable/ Linux USB that boots a machine with no OS 1-prepare-usb.ps14-copy-to-usb.ps1
install/ One-line network install install.sh / install.ps1
u-claw-app/ Electron desktop — deprecated, archive only not built

This is a fork

Upstream is github.com/dongsheng123132/u-claw. We host at gitea.fanghe.it.com/zhenghy/u-claw and do not send changes back: this build removes the China-market defaults that are the point of the upstream project.

If you are fixing something we inherited unchanged, consider telling them too.

Getting set up

git clone ssh://git@gitea.fanghe.it.com:222/zhenghy/u-claw.git
cd u-claw

# Enable the pre-push hook. Nothing installs it for you, and it is the only
# thing reliably running the tests — see below.
git config core.hooksPath .githooks

# The fastest thing to iterate on is the portable build
cd portable/advanced && bash setup.sh    # fetches Node.js + OpenClaw into ../app/
cd .. && bash "START HERE - Mac.command"
Platform State
macOS Apple Silicon main development platform
macOS Intel works — setup.sh fetches node-mac-x64 first
Windows x64 🚧 needs verification — see below
Linux x64 via bootable/

Windows currently carries unverified changes. A large amount of PowerShell and several .bat path-resolution changes were written on a Mac with no PowerShell available, so they have never been through a parser. If you have a Windows machine, running that check is the single most useful thing you can do right now. U盘实测清单.md in the workspace root has the exact commands.

Tests

node --test                     # everything
node --test tests/windows-launchers.test.mjs   # one file

Not node --test tests/. Node reads that path as a module to load and dies with "Cannot find module" — zero tests run, exit code 1. That form was the documented command here for a long time, which is a good part of why the suite went unrun for the life of the project.

The suite asserts on the text and behaviour of scripts rather than spawning OpenClaw: that .bat files stay pure ASCII (Chinese Windows cmd.exe reads non-ASCII as GBK and mis-parses), that .command files stay LF-only, that no China-routed download source comes back, that both installers resolve skills identically, that every UI string exists in every language, and that nothing points at a host origin.json does not declare.

CI runs it where a runner exists (.gitea/workflows/tests.yml, mirrored to .github/). On our Gitea there is currently no registered runner, so the pre-push hook is doing the work. Install it.

Filing an issue

A bug report needs four things, or nobody can act on it:

  1. OS and version — macOS 14.5, Windows 11 23H2
  2. Which form — portable / install / bootable
  3. The full error as text. Not a screenshot of text.
  4. What you already tried

A feature request needs a situation, not a feature. "I'd like X" is not enough to discuss. "I'm doing Y, I need X, because Z" is.

Sending a change

Before you write it:

  • Does anyone need this? For anything large, open an issue first.
  • Does it break another form? A change in portable/ should not affect bootable/.
  • Did you run it? Not just the tests — the actual thing.

Do not:

  • Commit node_modules/, app/, data/, *.dmg, *.exe — all in .gitignore
  • Put an API key, token or password in any file
  • Reformat unrelated code ("ran prettier over everything" makes review impossible)
  • Open a PR with a title and no description

Commit messages: say what changed and why, in a sentence someone can act on.

fix(install.sh): npm wrapper cannot be run through node directly
feat(skills): add linkedin-post
docs: note Windows 11 ARM64 support

Not update, fix, or changed some files.

git switch -c fix/something      # never work on main
git add <specific files>         # not git add .
git push -u origin fix/something

Notes per form

portable/

  • Never commit app/ or data/setup.sh produces them
  • .command files need the executable bit and LF endings
  • .bat files must be pure ASCII with CRLF, and must not contain an unescaped ) inside an IF (...) block — that closes the block early and the window flash-exits. There is a test for it, and it has caught real regressions.
  • User config lives in data/.openclaw/openclaw.json. That file being on the drive is the entire portability story; do not move it.
  • User-facing text belongs in lib/messages/*.json, never in a script

bootable/

  • The four PowerShell scripts must run in order
  • Fully self-contained: it references nothing from portable/ on purpose

install/

  • These run through curl | bash with no checkout, so they cannot read origin.json and carry URLs as literals. tests/origin.test.mjs fails if those literals drift from origin.json — that is what stops a host migration from half-happening.
  • Neither script may contain skill text. Both call lib/install-skills.mjs.

u-claw-app/ — deprecated 2026-06-19, kept for archive. Do not add to it.