docs: 重构 README 并统一文档语言为中文

README 精简(中文 528 → 364 行,-31%;英文 552 → 390 行,-29%):
- 删除使用者不需要的深层细节,改为指向 references/ 与 SKILL.md:
  横向对比全表、八条契约表、project.json 逐字段说明、仓库目录树、B() 代码详解
- 第一定位改为「Agent Skill」,而不是「一条渲染流水线」
- 新增「安装」章:一句话安装 prompt + 九个智能体的技能目录对照表 + 环境要求
- 新增「参考思路与姊妹项目」:anything2explainer 与 html-video,并明确标注
  两者为不同作者的独立项目,本项目运行时不依赖其代码

文档语言统一为中文(README.en.md 除外):
CHANGELOG.md、CONTRIBUTING.md、THIRD_PARTY_NOTICES.md、PR/issue 模板、CI 注释。
许可证原文(MIT / Apache-2.0)与 GSAP 自带 README 属第三方逐字文本,未翻译。

跨平台可移植性修复(原先隐含 WorkBuddy 专属路径):
- peek_frame.mjs 的技能根兜底改为遍历各智能体技能目录
  (.workbuddy / .claude / .codex / .gemini / .cursor / .agents),已用隔离夹具正反验证
- setup_env.sh 标注哪几个候选是 WorkBuddy 托管路径
- SKILL.md 新增「跨 Agent 安装」章,安装路径不再写死单一平台

修正一处事实错误:THIRD_PARTY_NOTICES 原称两个方法来源项目「均为作者本人作品」,
与事实不符,已改为「他人独立项目」并补充来源链接。
This commit is contained in:
MohZhuang committed 2026-09-21 13:11:22 +08:00
1 parent 6474719119
commit 2581e2c685
13 files changed
+874 -1198

No files matched your search

+16 -3
View File
@@ -24,7 +24,16 @@ import { fileURLToPath, pathToFileURL } from 'node:url';
const __dirname = path.dirname(fileURLToPath(import.meta.url));
// 本脚本放在**项目**的 script/ 下(不是技能目录里),所以不能靠相对路径找技能根。
// 解析顺序:env → 向上找含 node/playwright-core 的目录 → ~/.workbuddy/skills/html-explainer
// 解析顺序:env → 向上逐级找含 node/playwright-core 的目录 → 各智能体技能目录下的同名落点。
// 与平台无关:任何一处命中即可,命中不了就报错退出(不会静默用错目录)。
const SKILL_SUBDIRS = [
['.workbuddy', 'skills'], // WorkBuddy
['.claude', 'skills'], // Claude Code
['.codex', 'skills'], // OpenAI Codex
['.gemini', 'skills'], // Gemini CLI
['.cursor', 'skills'], // Cursor
['.agents', 'skills'], // 通用约定
];
function resolveSkillRoot() {
const cands = [];
if (process.env.HTML_EXPLAINER_ROOT) cands.push(process.env.HTML_EXPLAINER_ROOT);
@@ -35,8 +44,12 @@ function resolveSkillRoot() {
if (p === d) break;
d = p;
}
if (process.env.USERPROFILE) cands.push(path.join(process.env.USERPROFILE, '.workbuddy', 'skills', 'html-explainer'));
if (process.env.HOME) cands.push(path.join(process.env.HOME, '.workbuddy', 'skills', 'html-explainer'));
const homes = [process.env.USERPROFILE, process.env.HOME].filter(Boolean);
for (const home of homes) {
for (const seg of SKILL_SUBDIRS) {
cands.push(path.join(home, ...seg, 'html-explainer'));
}
}
for (const c of cands) {
try {
if (fs.existsSync(path.join(c, 'node', 'node_modules', 'playwright-core', 'package.json'))) return c;