Some checks failed
Tests / test (push) Has been cancelled
不是翻译 —— 多数文档描述的行为已经不存在了。 先修一个更基本的问题:我们不拥有 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:能问的产品才是不需要学的产品。
216 lines
12 KiB
HTML
216 lines
12 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="en">
|
|
<head>
|
|
<meta charset="UTF-8">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
<title data-i18n="nav.title">U-Claw — Start here</title>
|
|
<style>
|
|
* { margin: 0; padding: 0; box-sizing: border-box; }
|
|
body { font-family: -apple-system, "Microsoft YaHei", sans-serif; background: #0a0a0a; color: #e0e0e0; min-height: 100vh; }
|
|
.container { max-width: 800px; margin: 0 auto; padding: 40px 20px; }
|
|
.header { text-align: center; margin-bottom: 40px; }
|
|
.header h1 { font-size: 2.5em; margin-bottom: 8px; }
|
|
.header h1 span { color: #ff6b35; }
|
|
.header p { color: #888; font-size: 1.1em; }
|
|
.version { display: inline-block; background: #ff6b35; color: #fff; padding: 2px 10px; border-radius: 12px; font-size: 0.8em; margin-left: 8px; }
|
|
|
|
.os-tabs { display: flex; justify-content: center; gap: 12px; margin-bottom: 30px; }
|
|
.os-tab { padding: 12px 32px; border: 2px solid #333; border-radius: 8px; cursor: pointer; font-size: 1.1em; background: transparent; color: #aaa; transition: all 0.2s; }
|
|
.os-tab:hover { border-color: #666; color: #fff; }
|
|
.os-tab.active { border-color: #ff6b35; color: #ff6b35; background: rgba(255,107,53,0.1); }
|
|
|
|
.panel { display: none; }
|
|
.panel.active { display: block; }
|
|
|
|
.card { background: #1a1a1a; border: 1px solid #333; border-radius: 12px; padding: 24px; margin-bottom: 16px; }
|
|
.card h3 { color: #ff6b35; margin-bottom: 12px; font-size: 1.2em; }
|
|
.card p { color: #bbb; line-height: 1.6; }
|
|
|
|
.step { display: flex; align-items: flex-start; gap: 16px; margin: 12px 0; }
|
|
.step-num { background: #ff6b35; color: #fff; width: 32px; height: 32px; border-radius: 50%; display: flex; align-items: center; justify-content: center; font-weight: bold; flex-shrink: 0; }
|
|
.step-text { flex: 1; }
|
|
.step-text strong { color: #fff; }
|
|
.step-text code { background: #2a2a2a; padding: 2px 8px; border-radius: 4px; color: #ff6b35; font-size: 0.95em; }
|
|
|
|
.grid { display: grid; grid-template-columns: 1fr 1fr; gap: 12px; margin-top: 16px; }
|
|
.grid-item { background: #222; border: 1px solid #333; border-radius: 8px; padding: 16px; }
|
|
.grid-item h4 { color: #fff; margin-bottom: 6px; }
|
|
.grid-item p { color: #999; font-size: 0.9em; }
|
|
|
|
.status-bar { background: #1a1a1a; border: 1px solid #333; border-radius: 8px; padding: 16px; margin-bottom: 24px; display: flex; align-items: center; gap: 12px; }
|
|
.status-dot { width: 12px; height: 12px; border-radius: 50%; }
|
|
.status-dot.off { background: #666; }
|
|
.status-dot.on { background: #4caf50; animation: pulse 2s infinite; }
|
|
@keyframes pulse { 0%,100% { opacity: 1; } 50% { opacity: 0.5; } }
|
|
.status-link { color: #ff6b35; text-decoration: none; margin-left: auto; }
|
|
.status-link:hover { text-decoration: underline; }
|
|
|
|
.section-title { color: #888; font-size: 0.9em; text-transform: uppercase; letter-spacing: 2px; margin: 30px 0 12px; }
|
|
|
|
.footer { text-align: center; margin-top: 40px; padding-top: 20px; border-top: 1px solid #222; color: #666; }
|
|
.footer a { color: #ff6b35; text-decoration: none; }
|
|
</style>
|
|
<script src="../data/.openclaw/locale.js"></script>
|
|
<script src="../lib/i18n/messages.js"></script>
|
|
<script src="../lib/i18n/i18n.js"></script>
|
|
</head>
|
|
<body>
|
|
<div class="container">
|
|
|
|
<div class="header">
|
|
<h1>🦞 <span>U-Claw</span> <span class="version">v1.1</span></h1>
|
|
<p data-i18n="nav.tagline">Portable AI agent — plug in and go</p>
|
|
</div>
|
|
|
|
<!-- Status Bar -->
|
|
<div class="status-bar">
|
|
<div class="status-dot off" id="statusDot"></div>
|
|
<span id="statusText" data-i18n="nav.status_off">U-Claw is not running</span>
|
|
<a href="#" id="statusLink" class="status-link" style="display:none" target="_blank" data-i18n="nav.open_console">Open it →</a>
|
|
</div>
|
|
|
|
<!-- OS Tabs -->
|
|
<div class="os-tabs">
|
|
<div class="os-tab active" onclick="switchOS('mac')">🍎 Mac</div>
|
|
<div class="os-tab" onclick="switchOS('win')">🪟 Windows</div>
|
|
</div>
|
|
|
|
<!-- Mac Panel -->
|
|
<div class="panel active" id="panel-mac">
|
|
<div class="card">
|
|
<h3>🚀 <span data-i18n="nav.quickstart">Quick start</span></h3>
|
|
<div class="step">
|
|
<div class="step-num">1</div>
|
|
<div class="step-text"><span data-i18n="nav.doubleclick">Double-click</span> <code>START HERE - Mac.command</code></div>
|
|
</div>
|
|
<div class="step">
|
|
<div class="step-num">2</div>
|
|
<div class="step-text" data-i18n="nav.step2">Settings opens by itself the first time — pick a model and paste your key.</div>
|
|
</div>
|
|
<p style="margin-top:12px; color:#999;" data-i18n="nav.mac_gatekeeper">⚠️ If macOS says the developer cannot be verified: right-click the file, then choose Open.</p>
|
|
<p style="margin-top:8px;" data-i18n="nav.config_shortcut">📝 You can also double-click Config.html — it takes you to the settings page.</p>
|
|
</div>
|
|
|
|
<div class="card">
|
|
<h3>⚙️ <span data-i18n="nav.everything">Everything else</span></h3>
|
|
<p><span data-i18n="nav.doubleclick">Double-click</span> <code>Mac-Menu.command</code> <span data-i18n="nav.menu_opens">for the full menu:</span></p>
|
|
<div class="grid">
|
|
<div class="grid-item"><h4 data-i18n="nav.g_settings">Settings</h4><p data-i18n="nav.g_settings_d">Model, key and chat apps</p></div>
|
|
<div class="grid-item"><h4 data-i18n="nav.g_checkup">Check-up</h4><p data-i18n="nav.g_checkup_d">Finds and fixes common problems</p></div>
|
|
<div class="grid-item"><h4 data-i18n="nav.g_backup">Backup</h4><p data-i18n="nav.g_backup_d">Save settings and memory in one click</p></div>
|
|
<div class="grid-item"><h4 data-i18n="nav.g_skills">Skills</h4><p data-i18n="nav.g_skills_d">Browse what U-Claw can do</p></div>
|
|
<div class="grid-item"><h4 data-i18n="nav.g_system">System info</h4><p data-i18n="nav.g_system_d">Version, port, running state</p></div>
|
|
<div class="grid-item"><h4 data-i18n="nav.g_cli">Command line</h4><p data-i18n="nav.g_cli_d">For advanced use</p></div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Windows Panel -->
|
|
<div class="panel" id="panel-win">
|
|
<div class="card">
|
|
<h3>🚀 <span data-i18n="nav.quickstart">Quick start</span></h3>
|
|
<div class="step">
|
|
<div class="step-num">1</div>
|
|
<div class="step-text"><span data-i18n="nav.doubleclick">Double-click</span> <code>START HERE - Windows.bat</code></div>
|
|
</div>
|
|
<div class="step">
|
|
<div class="step-num">2</div>
|
|
<div class="step-text" data-i18n="nav.step2">Settings opens by itself the first time — pick a model and paste your key.</div>
|
|
</div>
|
|
<p style="margin-top:12px; color:#999;" data-i18n="nav.win_smartscreen">⚠️ If Windows shows a security warning: click More info, then Run anyway.</p>
|
|
</div>
|
|
|
|
<div class="card">
|
|
<h3>⚙️ <span data-i18n="nav.everything">Everything else</span></h3>
|
|
<p><span data-i18n="nav.doubleclick">Double-click</span> <code>Windows-Menu.bat</code> <span data-i18n="nav.menu_opens">for the full menu:</span></p>
|
|
<div class="grid">
|
|
<div class="grid-item"><h4 data-i18n="nav.g_settings">Settings</h4><p data-i18n="nav.g_settings_d">Model, key and chat apps</p></div>
|
|
<div class="grid-item"><h4 data-i18n="nav.g_checkup">Check-up</h4><p data-i18n="nav.g_checkup_d">Finds and fixes common problems</p></div>
|
|
<div class="grid-item"><h4 data-i18n="nav.g_backup">Backup</h4><p data-i18n="nav.g_backup_d">Save settings and memory in one click</p></div>
|
|
<div class="grid-item"><h4 data-i18n="nav.g_skills">Skills</h4><p data-i18n="nav.g_skills_d">Browse what U-Claw can do</p></div>
|
|
<div class="grid-item"><h4 data-i18n="nav.g_system">System info</h4><p data-i18n="nav.g_system_d">Version, port, running state</p></div>
|
|
<div class="grid-item"><h4 data-i18n="nav.g_cli">Command line</h4><p data-i18n="nav.g_cli_d">For advanced use</p></div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Common sections -->
|
|
<div class="section-title">🤖 <span data-i18n="nav.models_title">Models you can use</span></div>
|
|
<div class="card">
|
|
<div class="grid">
|
|
<div class="grid-item"><h4>Claude</h4><p data-i18n="welcome.model_claude">Best all-rounder</p></div>
|
|
<div class="grid-item"><h4>GPT</h4><p data-i18n="welcome.model_gpt">Most widely used</p></div>
|
|
<div class="grid-item"><h4>Gemini</h4><p data-i18n="welcome.model_gemini">Free tier, easiest signup</p></div>
|
|
<div class="grid-item"><h4>SEA-LION</h4><p data-i18n="nav.model_sealion">Malay, Tamil and Singlish</p></div>
|
|
<div class="grid-item"><h4 data-i18n="nav.model_local">Local model</h4><p data-i18n="welcome.model_local">Offline · nothing leaves this machine</p></div>
|
|
<div class="grid-item"><h4 data-i18n="nav.model_more">More</h4><p data-i18n="nav.model_more_d">Others are listed in Settings</p></div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="section-title">📖 <span data-i18n="nav.more_title">More</span></div>
|
|
<div class="card">
|
|
<div class="grid">
|
|
<div class="grid-item" onclick="window.open('../Read me first.html')" style="cursor:pointer"><h4>📖 <span data-i18n="nav.link_guide">Getting started</span></h4><p data-i18n="nav.link_guide_d">The three-step walkthrough</p></div>
|
|
<div class="grid-item" onclick="window.open('SkillHub.html')" style="cursor:pointer"><h4>🎯 <span data-i18n="nav.link_skills">Skills</span></h4><p data-i18n="nav.link_skills_d">Browse what U-Claw can do</p></div>
|
|
<div class="grid-item"><h4>💬 <span data-i18n="nav.link_contact">Contact</span></h4><p><a href="https://gitea.fanghe.it.com/zhenghy/u-claw/issues" target="_blank" rel="noopener" style="color:#ff6b35" data-i18n="nav.link_contact_d">Open an issue</a></p></div>
|
|
<div class="grid-item"><h4>🌐 <span data-i18n="nav.link_site">Website</span></h4><p><a href="https://u-claw.org" target="_blank" rel="noopener" style="color:#ff6b35">u-claw.org</a></p></div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="footer">
|
|
<p>Made with 🦞 by <a href="https://github.com/dongsheng123132">dongsheng</a> · <a href="https://u-claw.org">u-claw.org</a></p>
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<script>
|
|
// Auto-detect OS
|
|
const isMac = navigator.platform.toUpperCase().indexOf('MAC') >= 0;
|
|
if (!isMac) switchOS('win');
|
|
|
|
function switchOS(os) {
|
|
document.querySelectorAll('.os-tab').forEach(t => t.classList.remove('active'));
|
|
document.querySelectorAll('.panel').forEach(p => p.classList.remove('active'));
|
|
document.querySelector('#panel-' + os).classList.add('active');
|
|
document.querySelectorAll('.os-tab')[os === 'mac' ? 0 : 1].classList.add('active');
|
|
}
|
|
|
|
// Check if gateway is running (scan 18789-18799)
|
|
var _gwPort = null;
|
|
async function checkStatus() {
|
|
var found = null;
|
|
if (_gwPort) {
|
|
// Fast path: check last known port first
|
|
try {
|
|
await fetch('http://127.0.0.1:' + _gwPort + '/', { mode: 'no-cors', cache: 'no-cache' });
|
|
found = _gwPort;
|
|
} catch(e) { _gwPort = null; }
|
|
}
|
|
if (!found) {
|
|
for (var p = 18789; p <= 18799; p++) {
|
|
try {
|
|
await fetch('http://127.0.0.1:' + p + '/', { mode: 'no-cors', cache: 'no-cache' });
|
|
found = p;
|
|
_gwPort = p;
|
|
break;
|
|
} catch(e) {}
|
|
}
|
|
}
|
|
if (found) {
|
|
document.getElementById('statusDot').className = 'status-dot on';
|
|
document.getElementById('statusText').textContent = window.UClawI18n.t('nav.status_on', { port: found });
|
|
var link = document.getElementById('statusLink');
|
|
link.style.display = 'inline';
|
|
link.href = 'http://127.0.0.1:' + found + '/#token=uclaw';
|
|
} else {
|
|
document.getElementById('statusDot').className = 'status-dot off';
|
|
document.getElementById('statusText').textContent = window.UClawI18n.t('nav.status_off_hint');
|
|
document.getElementById('statusLink').style.display = 'none';
|
|
}
|
|
}
|
|
checkStatus();
|
|
setInterval(checkStatus, 5000);
|
|
</script>
|
|
</body>
|
|
</html>
|