diff --git a/.gitignore b/.gitignore index a5261ab..df6dcd9 100644 --- a/.gitignore +++ b/.gitignore @@ -38,3 +38,12 @@ bootable/.download-cache/ # ── Install module cache ── install/.download-cache/ + +# ── USB release (runtime + data downloaded on build) ── +usb-release/runtime/ +usb-release/core/node_modules/ +usb-release/data/ +usb-release/toolkit/*.pkg +usb-release/toolkit/*.msi +usb-release/toolkit/*.tar.gz +usb-release/toolkit/*.zip diff --git a/usb-release/.gitignore b/usb-release/.gitignore new file mode 100644 index 0000000..0f25210 --- /dev/null +++ b/usb-release/.gitignore @@ -0,0 +1,10 @@ +runtime/ +core/node_modules/ +core/package-lock.json +data/ +toolkit/*.pkg +toolkit/*.msi +toolkit/*.tar.gz +toolkit/*.zip +.DS_Store +Thumbs.db diff --git a/usb-release/Config.html b/usb-release/Config.html new file mode 100644 index 0000000..cda9c94 --- /dev/null +++ b/usb-release/Config.html @@ -0,0 +1,621 @@ + + + + + +U-Claw Pro — 模型配置 + + + +
+

🦞 U-Claw Pro

+

便携版 — 选择模型,填入 API Key,一键启动

+ + +
+
1选模型
+
2填 Key
+
3启动
+
+ + +
+

选择 AI 模型

+

选择你要使用的模型,推荐国内用户用 MiniMax / Kimi / DeepSeek

+ +
+
+ +

MiniMax 推荐国内

+

MiniMax-Text-01,速度快,性价比高

+ → 获取 API Key +
+
+ +

Kimi (月之暗面) 国内

+

moonshot-v1-auto,智能选模型

+ → 获取 API Key +
+
+ +

DeepSeek 国内便宜

+

deepseek-chat,超低价格

+ → 获取 API Key +
+
+ +

智谱 GLM 国内有免费

+

glm-5(zai provider),免费额度可用

+ → 获取 API Key +
+
+ +

通义千问 国内有免费

+

qwen-turbo,阿里云出品

+ → 获取 API Key +
+
+ +

豆包 (字节) 国内

+

doubao-1.5-pro,字节跳动

+ → 获取 API Key +
+
+ +

OpenAI

+

GPT-4o,需翻墙或中转

+ → 获取 API Key +
+
+ +

Claude

+

Claude Sonnet 4,需翻墙或中转

+ → 获取 API Key +
+
+ +

Groq 极快有免费

+

Llama 3.3 70B,超高速推理

+ → 获取 API Key +
+
+ +

硅基流动 国内便宜

+

多模型聚合,价格低

+ → 获取 API Key +
+
+ +

自定义 OpenAI 兼容

+

填写任意 OpenAI 兼容 API 地址

+
+
+ +
+ +
+
+ + +
+

填写 API Key

+

请填写对应模型的 API Key

+ +
+

📌 如何获取 API Key?

+ +
+ + + + +
+ +
+ + +
+

你的 Key 仅保存在本地 U 盘,不会上传到任何服务器

+
+ +
+ + +
+
+ + +
+
+
🦞
+

配置完成!

+

模型和 API Key 已保存,准备好后点击下方按钮启动

+
http://127.0.0.1:18789
+ +
+

📱 接入更多渠道(可选)

+

点击展开卡片填写配置,启动时自动写入。不填也可以直接启动:

+
+
+

✈️ Telegram

+

接入 Telegram Bot

+
+
+ + +

→ 从 @BotFather 获取

+
+
+
+
+

🐧 QQ Bot

+

接入 QQ 群/私聊机器人

+
+
+ + +
+
+ + +

→ 从 QQ 开放平台获取

+
+
+
+
+

📘 飞书

+

接入飞书机器人

+
+
+ + +
+
+ + +

→ 从飞书开放平台获取

+
+
+
+
+

🏢 企业微信

+

接入企业微信机器人

+
+
+ + +
+ +
+
+
+
+ +
+ +

启动后会自动打开控制台,渠道配置会自动写入 openclaw.json

+
+ +
+ +
+
+
+ + +
+

📦 技能 & 文档

+

技能存放在 skills/ 目录,文档存放在 docs/ 目录,随 U 盘携带

+
+
+
+

skills/ — 技能目录

+

放入 .md 技能文件,OpenClaw 会自动加载

+
+ 📁 +
+
+
+

docs/ — 文档目录

+

存放使用说明、帮助文档等

+
+ 📁 +
+
+
+

data/ — 配置和聊天记录

+

API Key、聊天历史等保存在此

+
+ 🔒 +
+
+
+
+ +
+ + + + diff --git a/usb-release/Windows-Menu.bat b/usb-release/Windows-Menu.bat new file mode 100644 index 0000000..83d1ee0 --- /dev/null +++ b/usb-release/Windows-Menu.bat @@ -0,0 +1,618 @@ +@echo off +setlocal EnableDelayedExpansion +chcp 65001 >nul 2>&1 +title U-Claw Menu + +set "UCLAW_DIR=%~dp0" +set "CORE_DIR=%UCLAW_DIR%core" +set "DATA_DIR=%UCLAW_DIR%data" +set "STATE_DIR=%DATA_DIR%\.openclaw" +set "NODE_DIR=%UCLAW_DIR%runtime\node-win-x64" +set "NODE_BIN=%NODE_DIR%\node.exe" +set "NPM_BIN=%NODE_DIR%\npm.cmd" + +set "OPENCLAW_HOME=%DATA_DIR%" +set "OPENCLAW_STATE_DIR=%STATE_DIR%" +set "OPENCLAW_CONFIG_PATH=%STATE_DIR%\openclaw.json" +set "PATH=%NODE_DIR%;%PATH%" + +set "OPENCLAW_MJS=%CORE_DIR%\node_modules\openclaw\openclaw.mjs" +set "LOG_DIR=%DATA_DIR%\logs" +set "BACKUP_DIR=%DATA_DIR%\backups" + +if not exist "%STATE_DIR%" mkdir "%STATE_DIR%" +if not exist "%DATA_DIR%\memory" mkdir "%DATA_DIR%\memory" +if not exist "%BACKUP_DIR%" mkdir "%BACKUP_DIR%" +if not exist "%LOG_DIR%" mkdir "%LOG_DIR%" + +:menu +cls +echo. +echo ======================================== +echo U-Claw - Menu +echo Portable AI Agent +echo ======================================== +echo. + +if exist "%NODE_BIN%" ( + for /f "tokens=*" %%v in ('"%NODE_BIN%" --version') do echo Node: %%v +) else ( + echo [!] Node.js not found +) +if exist "%STATE_DIR%\openclaw.json" (echo Config: OK) else (echo Config: NOT SET) +echo. +echo -- Config -- +echo [1] Setup wizard (model, API key) +echo [2] Open web dashboard +echo. +echo -- Chat Platforms -- +echo [3] QQ Bot (pre-installed, enter ID only) +echo [4] Other platforms (Feishu/Telegram/WeChat) +echo. +echo -- Maintenance -- +echo [5] Diagnostics +echo [6] Backup config +echo [7] Restore backup +echo [8] System info +echo. +echo -- Advanced -- +echo [9] Kill residual processes +echo [10] View logs +echo [11] Factory reset +echo [12] Uninstall +echo [13] Check for updates +echo [14] Disk cleanup +echo [15] Plugin management +echo. +echo [0] Exit +echo. +set /p choice=" Choose [0-15]: " + +if "%choice%"=="1" goto :onboard +if "%choice%"=="2" goto :dashboard +if "%choice%"=="3" goto :qqbot +if "%choice%"=="4" goto :channels +if "%choice%"=="5" goto :doctor +if "%choice%"=="6" goto :backup +if "%choice%"=="7" goto :restore +if "%choice%"=="8" goto :sysinfo +if "%choice%"=="9" goto :killproc +if "%choice%"=="10" goto :viewlogs +if "%choice%"=="11" goto :factoryreset +if "%choice%"=="12" goto :uninstall +if "%choice%"=="13" goto :checkupdate +if "%choice%"=="14" goto :diskcleanup +if "%choice%"=="15" goto :plugins +if "%choice%"=="0" exit /b 0 +echo Invalid choice +pause +goto :menu + +:onboard +echo. +echo === Setup Wizard === +echo. +echo DeepSeek - Custom Provider, URL: https://api.deepseek.com/v1 +echo Kimi - Moonshot AI +echo Qwen - Qwen +echo Doubao - Volcano Engine +echo. +cd /d "%CORE_DIR%" +"%NODE_BIN%" "%OPENCLAW_MJS%" onboard +pause +goto :menu + +:dashboard +echo. +echo Starting gateway... +set PORT=18789 +:find_port +netstat -an | findstr ":%PORT% " | findstr "LISTENING" >nul 2>&1 +if !errorlevel!==0 ( + set /a PORT+=1 + if !PORT! gtr 18799 (echo No available port & pause & goto :menu) + goto :find_port +) +cd /d "%CORE_DIR%" +if not exist "%STATE_DIR%\openclaw.json" ( + echo {"gateway":{"mode":"local","auth":{"token":"uclaw"}}} > "%STATE_DIR%\openclaw.json" +) + +REM Read token from config +set "TOKEN=uclaw" +if exist "%STATE_DIR%\openclaw.json" ( + for /f "tokens=*" %%t in ('"%NODE_BIN%" -e "try{const c=JSON.parse(require('fs').readFileSync(process.argv[1],'utf8'));console.log((c.gateway&&c.gateway.auth&&c.gateway.auth.token)||'uclaw')}catch(e){console.log('uclaw')}" "%STATE_DIR%\openclaw.json"') do set "TOKEN=%%t" +) + +start /B "" cmd /c "timeout /t 3 /nobreak >nul && start http://127.0.0.1:!PORT!/#token=!TOKEN!" +"%NODE_BIN%" "%OPENCLAW_MJS%" gateway run --allow-unconfigured --force --port !PORT! +pause +goto :menu + +:qqbot +echo. +echo === QQ Bot Setup === +echo. +echo QQ plugin is pre-installed! +echo You only need your AppID and AppSecret. +echo. +echo Get them at: q.qq.com (create a bot) +echo. +set /p qqid=" AppID: " +set /p qqsecret=" AppSecret: " +if "%qqid%"=="" goto :qq_cancel +if "%qqsecret%"=="" goto :qq_cancel +cd /d "%CORE_DIR%" +"%NODE_BIN%" "%OPENCLAW_MJS%" channels add --channel qqbot --token "%qqid%:%qqsecret%" +echo. +set /p qqallow=" Your QQ number (allowlist, empty to skip): " +if not "%qqallow%"=="" "%NODE_BIN%" "%OPENCLAW_MJS%" config set channels.qqbot.allowFrom "%qqallow%" +echo. +echo QQ Bot configured! Restart gateway to apply. +pause +goto :menu +:qq_cancel +echo Cancelled. +pause +goto :menu + +:channels +echo. +echo === Other Platforms === +echo. +echo [a] Feishu (Lark) - Enterprise +echo [b] Telegram - International +echo [c] WeChat (plugin) - iPad protocol +echo [d] Discord +echo. +set /p ch_choice=" Choose (a-d, empty to cancel): " +if "%ch_choice%"=="a" ( + echo. + echo Feishu setup: + echo 1. Visit open.feishu.cn/app to create an app + echo 2. Get App ID and App Secret + echo 3. Run Setup wizard [1] to bind +) +if "%ch_choice%"=="b" ( + echo. + echo Telegram setup: + echo 1. Message @BotFather on Telegram + echo 2. Create a bot and get the token + echo 3. Run Setup wizard [1] to bind +) +if "%ch_choice%"=="c" ( + echo. + echo Installing WeChat plugin... + cd /d "%CORE_DIR%" + "%NODE_BIN%" "%OPENCLAW_MJS%" plugins install @icesword760/openclaw-wechat + echo WeChat plugin installed! +) +if "%ch_choice%"=="d" ( + echo. + echo Discord setup: + echo 1. Visit discord.com/developers/applications + echo 2. Create a bot and get the token + echo 3. Run Setup wizard [1] to bind +) +echo. +pause +goto :menu + +:doctor +cd /d "%CORE_DIR%" +"%NODE_BIN%" "%OPENCLAW_MJS%" doctor --repair +pause +goto :menu + +:backup +echo. +set "TS=%date:~0,4%%date:~5,2%%date:~8,2%_%time:~0,2%%time:~3,2%" +set "TS=!TS: =0!" +set "BK=%BACKUP_DIR%\backup_!TS!" +mkdir "!BK!" 2>nul +set "BK_COUNT=0" +if exist "%STATE_DIR%\openclaw.json" ( + copy "%STATE_DIR%\openclaw.json" "!BK!\" >nul + echo + openclaw.json + set /a BK_COUNT+=1 +) +if exist "%DATA_DIR%\memory" ( + xcopy /s /q "%DATA_DIR%\memory" "!BK!\memory\" >nul 2>nul + echo + memory/ + set /a BK_COUNT+=1 +) +echo. +if !BK_COUNT!==0 ( + echo Nothing to backup. + rmdir "!BK!" 2>nul +) else ( + for /f "tokens=*" %%s in ('powershell -command "(Get-ChildItem '!BK!' -Recurse -ErrorAction SilentlyContinue | Measure-Object -Property Length -Sum).Sum / 1KB" 2^>nul') do echo Size: %%s KB + echo Backup saved: !BK! +) +pause +goto :menu + +:restore +echo. +echo === Restore Backup === +echo. +echo Available backups: +echo. +set "BK_NUM=0" +for /d %%d in ("%BACKUP_DIR%\*") do ( + set /a BK_NUM+=1 + echo [!BK_NUM!] %%~nxd + set "BK_PATH_!BK_NUM!=%%d" +) +if !BK_NUM!==0 ( + echo No backups found. + pause + goto :menu +) +echo. +set /p rnum=" Choose backup number: " +if "!rnum!"=="" goto :menu +set "RESTORE_PATH=!BK_PATH_%rnum%!" +if "!RESTORE_PATH!"=="" ( + echo Invalid choice. + pause + goto :menu +) +if exist "!RESTORE_PATH!\openclaw.json" ( + copy "!RESTORE_PATH!\openclaw.json" "%STATE_DIR%\" >nul + echo + Config restored +) +if exist "!RESTORE_PATH!\memory" ( + xcopy /s /q "!RESTORE_PATH!\memory" "%DATA_DIR%\memory\" >nul 2>nul + echo + Memory restored +) +echo. +echo Restore complete! +pause +goto :menu + +:sysinfo +echo. +echo === System Info === +echo. +echo OS: Windows +for /f "tokens=2 delims==" %%v in ('wmic os get Version /format:list 2^>nul ^| findstr "="') do echo Ver: %%v +for /f "tokens=2 delims==" %%v in ('wmic os get OSArchitecture /format:list 2^>nul ^| findstr "="') do echo Arch: %%v +for /f "tokens=2 delims==" %%v in ('wmic computersystem get TotalPhysicalMemory /format:list 2^>nul ^| findstr "="') do ( + set "MEM=%%v" + set /a "MEM_GB=!MEM:~0,-9!" + echo Memory: !MEM_GB! GB +) +if exist "%NODE_BIN%" ( + for /f "tokens=*" %%v in ('"%NODE_BIN%" --version') do echo Node: %%v +) +echo Path: %UCLAW_DIR% +echo Data: %DATA_DIR% +for /f "tokens=*" %%s in ('powershell -command "(Get-ChildItem '%UCLAW_DIR%' -Recurse -ErrorAction SilentlyContinue | Measure-Object -Property Length -Sum).Sum / 1MB" 2^>nul') do echo Size: %%s MB +for /f "tokens=3" %%s in ('dir /-c "%UCLAW_DIR%." 2^>nul ^| findstr /c:"bytes free"') do echo Free: %%s bytes +echo. +if exist "%CORE_DIR%\node_modules\openclaw\package.json" ( + for /f "tokens=*" %%v in ('"%NODE_BIN%" -e "console.log(require('%CORE_DIR:\=/%/node_modules/openclaw/package.json').version)"') do echo OpenClaw: %%v +) +pause +goto :menu + +:killproc +echo. +echo === Kill Residual Processes === +echo. +echo Checking ports 18789-18799... +set FOUND=0 +for /l %%p in (18789,1,18799) do ( + netstat -ano | findstr ":%%p " | findstr "LISTENING" >nul 2>&1 + if not errorlevel 1 ( + echo Port %%p: process found + set FOUND=1 + for /f "tokens=5" %%a in ('netstat -ano ^| findstr ":%%p " ^| findstr "LISTENING"') do ( + echo PID: %%a + ) + ) +) + +REM Also check for openclaw node processes +for /f "tokens=2" %%p in ('tasklist /fi "imagename eq node.exe" /fo csv /nh 2^>nul ^| findstr /i "node"') do ( + set "FOUND_NODE=1" +) + +if "!FOUND!"=="0" ( + echo No residual processes found on gateway ports. + pause + goto :menu +) + +echo. +set /p killconfirm=" Kill these processes? (y/N): " +if /i not "!killconfirm!"=="y" ( + echo Cancelled. + pause + goto :menu +) + +for /l %%p in (18789,1,18799) do ( + for /f "tokens=5" %%a in ('netstat -ano ^| findstr ":%%p " ^| findstr "LISTENING"') do ( + taskkill /PID %%a /F >nul 2>&1 + ) +) +echo Processes killed. +pause +goto :menu + +:viewlogs +echo. +echo === Log Management === +echo. +set "LOG_FILE=%LOG_DIR%\gateway.log" +if not exist "%LOG_FILE%" ( + echo No log file found. Start the gateway first. + pause + goto :menu +) +echo [a] View last 50 lines +echo [b] Open log in Notepad +echo [c] Export log to Desktop +echo [d] Clean logs older than 7 days +echo. +set /p logchoice=" Choose (a-d): " +if "%logchoice%"=="a" ( + echo. + powershell -command "Get-Content '%LOG_FILE%' -Tail 50" +) +if "%logchoice%"=="b" ( + start notepad "%LOG_FILE%" +) +if "%logchoice%"=="c" ( + set "TS=%date:~0,4%%date:~5,2%%date:~8,2%_%time:~0,2%%time:~3,2%" + set "TS=!TS: =0!" + set "EXPORT=%USERPROFILE%\Desktop\uclaw-logs-!TS!.txt" + copy "%LOG_FILE%" "!EXPORT!" >nul + echo Log exported: !EXPORT! +) +if "%logchoice%"=="d" ( + echo. + echo Cleaning logs older than 7 days... + powershell -command "Get-ChildItem '%LOG_DIR%' -Filter '*.log' | Where-Object { $_.LastWriteTime -lt (Get-Date).AddDays(-7) } | Remove-Item -Force" + echo Old logs cleaned. +) +pause +goto :menu + +:factoryreset +echo. +echo === Factory Reset === +echo. +echo WARNING: This will delete all config and memory data! +echo. +echo Actions: +echo 1. Auto-backup current config and memory +echo 2. Delete config (openclaw.json) +echo 3. Delete memory data +echo 4. Restore default config +echo. +echo Type RESET to confirm: +set /p resetconfirm=" > " +if not "%resetconfirm%"=="RESET" ( + echo Cancelled. + pause + goto :menu +) +echo. +echo [1/4] Backing up... +set "TS=%date:~0,4%%date:~5,2%%date:~8,2%_%time:~0,2%%time:~3,2%" +set "TS=!TS: =0!" +set "BK=%BACKUP_DIR%\pre-reset_!TS!" +mkdir "!BK!" 2>nul +if exist "%STATE_DIR%\openclaw.json" copy "%STATE_DIR%\openclaw.json" "!BK!\" >nul 2>nul +if exist "%DATA_DIR%\memory" xcopy /s /q "%DATA_DIR%\memory" "!BK!\memory\" >nul 2>nul +echo Backup saved: !BK! +echo [2/4] Deleting config... +del "%STATE_DIR%\openclaw.json" 2>nul +del "%DATA_DIR%\config.json" 2>nul +echo [3/4] Clearing memory... +rmdir /s /q "%DATA_DIR%\memory" 2>nul +mkdir "%DATA_DIR%\memory" 2>nul +echo [4/4] Restoring default config... +echo {"gateway":{"mode":"local","auth":{"token":"uclaw"}}} > "%STATE_DIR%\openclaw.json" +echo. +echo Factory reset complete! Run Setup wizard [1] to reconfigure. +pause +goto :menu + +:uninstall +echo. +echo === Uninstall U-Claw === +echo. +if exist "%USERPROFILE%\.uclaw" ( + echo Found installed version: %USERPROFILE%\.uclaw + for /f "tokens=*" %%s in ('powershell -command "(Get-ChildItem '%USERPROFILE%\.uclaw' -Recurse -ErrorAction SilentlyContinue | Measure-Object -Property Length -Sum).Sum / 1MB" 2^>nul') do echo Size: %%s MB + echo. + echo Type UNINSTALL to delete: + set /p unconfirm=" > " + if "!unconfirm!"=="UNINSTALL" ( + rmdir /s /q "%USERPROFILE%\.uclaw" 2>nul + echo Uninstalled! + ) else ( + echo Cancelled. + ) +) else ( + echo Portable version - just delete this folder to uninstall. + echo Path: %UCLAW_DIR% + echo. + echo For Electron desktop app: + echo Open Settings - Apps - find U-Claw - Uninstall +) +pause +goto :menu + +:checkupdate +echo. +echo === Check for Updates === +echo. +if not exist "%CORE_DIR%\node_modules\openclaw\package.json" ( + echo OpenClaw not installed. + pause + goto :menu +) +echo Checking... +for /f "tokens=*" %%v in ('"%NODE_BIN%" -e "console.log(require('%CORE_DIR:\=/%/node_modules/openclaw/package.json').version)"') do set CUR_VER=%%v +echo Current version: %CUR_VER% + +echo Fetching latest version... +for /f "tokens=*" %%v in ('"%NODE_BIN%" -e "const https=require('https');https.get('https://registry.npmmirror.com/openclaw/latest',r=>{let d='';r.on('data',c=>d+=c);r.on('end',()=>{try{console.log(JSON.parse(d).version)}catch(e){console.log('error')}})})" 2^>nul') do set LATEST_VER=%%v + +if "!LATEST_VER!"=="" ( + echo Could not fetch latest version (network issue?) + pause + goto :menu +) +if "!LATEST_VER!"=="error" ( + echo Could not fetch latest version (network issue?) + pause + goto :menu +) + +echo Latest version: !LATEST_VER! +echo. + +if "!CUR_VER!"=="!LATEST_VER!" ( + echo Already up to date! + pause + goto :menu +) + +echo New version available! +set /p doupdate=" Update now? (y/N): " +if /i not "!doupdate!"=="y" ( + echo Cancelled. + pause + goto :menu +) + +echo. +echo Updating... +cd /d "%CORE_DIR%" +call "%NPM_BIN%" install openclaw@latest --registry=https://registry.npmmirror.com +for /f "tokens=*" %%v in ('"%NODE_BIN%" -e "console.log(require('./node_modules/openclaw/package.json').version)"') do set NEW_VER=%%v +echo. +echo Updated! %CUR_VER% - %NEW_VER% +pause +goto :menu + +:diskcleanup +echo. +echo === Disk Cleanup === +echo. +echo Directory sizes: +if exist "%CORE_DIR%\node_modules" ( + for /f "tokens=*" %%s in ('powershell -command "(Get-ChildItem '%CORE_DIR%\node_modules' -Recurse -ErrorAction SilentlyContinue | Measure-Object -Property Length -Sum).Sum / 1MB" 2^>nul') do echo node_modules: %%s MB +) +if exist "%DATA_DIR%\memory" ( + for /f "tokens=*" %%s in ('powershell -command "(Get-ChildItem '%DATA_DIR%\memory' -Recurse -ErrorAction SilentlyContinue | Measure-Object -Property Length -Sum).Sum / 1KB" 2^>nul') do echo memory: %%s KB +) +if exist "%BACKUP_DIR%" ( + for /f "tokens=*" %%s in ('powershell -command "(Get-ChildItem '%BACKUP_DIR%' -Recurse -ErrorAction SilentlyContinue | Measure-Object -Property Length -Sum).Sum / 1KB" 2^>nul') do echo backups: %%s KB +) +if exist "%LOG_DIR%" ( + for /f "tokens=*" %%s in ('powershell -command "(Get-ChildItem '%LOG_DIR%' -Recurse -ErrorAction SilentlyContinue | Measure-Object -Property Length -Sum).Sum / 1KB" 2^>nul') do echo logs: %%s KB +) +for /f "tokens=*" %%s in ('powershell -command "(Get-ChildItem '%UCLAW_DIR%' -Recurse -ErrorAction SilentlyContinue | Measure-Object -Property Length -Sum).Sum / 1MB" 2^>nul') do echo Total: %%s MB +echo. + +REM Clean old backups (keep latest 3) +set "BK_COUNT=0" +for /d %%d in ("%BACKUP_DIR%\*") do set /a BK_COUNT+=1 +if !BK_COUNT! gtr 3 ( + set /a OLD_COUNT=BK_COUNT-3 + echo Found !BK_COUNT! backups, keeping latest 3. + set /p delbk=" Delete !OLD_COUNT! old backups? (y/N): " + if /i "!delbk!"=="y" ( + set "DEL_NUM=0" + for /f "tokens=*" %%d in ('powershell -command "Get-ChildItem '%BACKUP_DIR%' -Directory | Sort-Object LastWriteTime | Select-Object -First !OLD_COUNT! | ForEach-Object { $_.FullName }"') do ( + rmdir /s /q "%%d" 2>nul + set /a DEL_NUM+=1 + ) + echo Cleaned !DEL_NUM! old backups. + ) +) else ( + echo Backups: !BK_COUNT! (no cleanup needed) +) + +REM Clean old logs (>7 days) +set "OLD_LOGS=0" +for /f "tokens=*" %%n in ('powershell -command "(Get-ChildItem '%LOG_DIR%' -Filter '*.log' -ErrorAction SilentlyContinue | Where-Object { $_.LastWriteTime -lt (Get-Date).AddDays(-7) }).Count" 2^>nul') do set OLD_LOGS=%%n +if !OLD_LOGS! gtr 0 ( + echo Found !OLD_LOGS! logs older than 7 days. + set /p dellog=" Delete old logs? (y/N): " + if /i "!dellog!"=="y" ( + powershell -command "Get-ChildItem '%LOG_DIR%' -Filter '*.log' | Where-Object { $_.LastWriteTime -lt (Get-Date).AddDays(-7) } | Remove-Item -Force" + echo Old logs cleaned. + ) +) else ( + echo Logs: no cleanup needed +) + +REM Clean npm cache +echo. +set /p delcache=" Clean npm cache? (y/N): " +if /i "!delcache!"=="y" ( + call "%NPM_BIN%" cache clean --force 2>nul + echo npm cache cleaned. +) + +echo. +for /f "tokens=*" %%s in ('powershell -command "(Get-ChildItem '%UCLAW_DIR%' -Recurse -ErrorAction SilentlyContinue | Measure-Object -Property Length -Sum).Sum / 1MB" 2^>nul') do echo Total after cleanup: %%s MB +pause +goto :menu + +:plugins +echo. +echo === Plugin Management === +echo. +echo [a] List installed plugins +echo [b] Install a plugin +echo [c] Remove a plugin +echo. +set /p plgchoice=" Choose (a-c): " +cd /d "%CORE_DIR%" +if "%plgchoice%"=="a" ( + echo. + "%NODE_BIN%" "%OPENCLAW_MJS%" plugins list +) +if "%plgchoice%"=="b" ( + echo. + echo Common plugins: + echo @icesword760/openclaw-wechat - WeChat + echo @nicepkg/openclaw-plugin-qq - QQ (community) + echo. + set /p plgname=" Plugin name (empty to cancel): " + if not "!plgname!"=="" ( + echo. + echo Installing !plgname! ... + "%NODE_BIN%" "%OPENCLAW_MJS%" plugins install "!plgname!" + echo. + echo Done! + ) else ( + echo Cancelled. + ) +) +if "%plgchoice%"=="c" ( + echo. + "%NODE_BIN%" "%OPENCLAW_MJS%" plugins list + echo. + set /p plgname=" Plugin to remove (empty to cancel): " + if not "!plgname!"=="" ( + echo. + echo Removing !plgname! ... + "%NODE_BIN%" "%OPENCLAW_MJS%" plugins remove "!plgname!" + echo. + echo Done! + ) else ( + echo Cancelled. + ) +) +pause +goto :menu diff --git a/usb-release/Windows-Start.bat b/usb-release/Windows-Start.bat new file mode 100644 index 0000000..bfe238a --- /dev/null +++ b/usb-release/Windows-Start.bat @@ -0,0 +1,114 @@ +@echo off +setlocal EnableDelayedExpansion +chcp 65001 >nul 2>&1 +title U-Claw - Portable AI Agent + +echo. +echo ======================================== +echo U-Claw - Portable AI Agent +echo ======================================== +echo. + +set "UCLAW_DIR=%~dp0" +set "CORE_DIR=%UCLAW_DIR%core" +set "DATA_DIR=%UCLAW_DIR%data" +set "STATE_DIR=%DATA_DIR%\.openclaw" +set "NODE_DIR=%UCLAW_DIR%runtime\node-win-x64" +set "NODE_BIN=%NODE_DIR%\node.exe" +set "NPM_BIN=%NODE_DIR%\npm.cmd" + +set "OPENCLAW_HOME=%DATA_DIR%" +set "OPENCLAW_STATE_DIR=%STATE_DIR%" +set "OPENCLAW_CONFIG_PATH=%STATE_DIR%\openclaw.json" + +REM Check runtime +if not exist "%NODE_BIN%" ( + echo [ERROR] Node.js runtime not found + echo Please ensure runtime\node-win-x64 is complete + pause + exit /b 1 +) + +for /f "tokens=*" %%v in ('"%NODE_BIN%" --version') do set NODE_VER=%%v +echo Node.js: %NODE_VER% +echo. + +set "PATH=%NODE_DIR%;%NODE_DIR%\node_modules\.bin;%PATH%" + +REM Init data directories +if not exist "%DATA_DIR%" mkdir "%DATA_DIR%" +if not exist "%STATE_DIR%" mkdir "%STATE_DIR%" +if not exist "%DATA_DIR%\memory" mkdir "%DATA_DIR%\memory" +if not exist "%DATA_DIR%\backups" mkdir "%DATA_DIR%\backups" +if not exist "%DATA_DIR%\logs" mkdir "%DATA_DIR%\logs" + +REM Default config +if not exist "%STATE_DIR%\openclaw.json" ( + echo First run - creating default config... + echo {"gateway":{"mode":"local","auth":{"token":"uclaw"}}} > "%STATE_DIR%\openclaw.json" + echo Config created + echo. +) + +REM Check dependencies +if not exist "%CORE_DIR%\node_modules" ( + echo First run - installing dependencies... + echo Using China mirror, please wait... + echo. + cd /d "%CORE_DIR%" + call "%NPM_BIN%" install --registry=https://registry.npmmirror.com + echo. + echo Dependencies installed! + echo. +) + +REM Find available port +set PORT=18789 +:check_port +netstat -an | findstr ":%PORT% " | findstr "LISTENING" >nul 2>&1 +if !errorlevel!==0 ( + echo Port %PORT% in use, trying next... + set /a PORT+=1 + if !PORT! gtr 18799 ( + echo No available port 18789-18799 + pause + exit /b 1 + ) + goto :check_port +) + +REM Read token from config +set "TOKEN=uclaw" +if exist "%STATE_DIR%\openclaw.json" ( + for /f "tokens=*" %%t in ('"%NODE_BIN%" -e "try{const c=JSON.parse(require('fs').readFileSync(process.argv[1],'utf8'));console.log((c.gateway&&c.gateway.auth&&c.gateway.auth.token)||'uclaw')}catch(e){console.log('uclaw')}" "%STATE_DIR%\openclaw.json"') do set "TOKEN=%%t" +) + +echo Starting OpenClaw on port !PORT!... +echo DO NOT close this window while using U-Claw! +echo. + +cd /d "%CORE_DIR%" +set "OPENCLAW_MJS=%CORE_DIR%\node_modules\openclaw\openclaw.mjs" +echo Log: %DATA_DIR%\logs\gateway.log + +REM Check if model is configured +set "HAS_MODEL=no" +if exist "%STATE_DIR%\openclaw.json" ( + findstr /c:"model" "%STATE_DIR%\openclaw.json" >nul 2>&1 && set "HAS_MODEL=yes" +) + +REM Open browser after a short delay +if "!HAS_MODEL!"=="yes" ( + echo Opening dashboard in 3 seconds... + start /B "" cmd /c "timeout /t 3 /nobreak >nul && start http://127.0.0.1:!PORT!/#token=!TOKEN!" +) else ( + echo First time setup - opening Config page in 3 seconds... + start /B "" cmd /c "timeout /t 3 /nobreak >nul && start %UCLAW_DIR%Config.html?port=!PORT!" +) + +REM Start gateway (foreground, blocks until stopped) +"%NODE_BIN%" "%OPENCLAW_MJS%" gateway run --allow-unconfigured --force --port !PORT! 2>&1 | powershell -command "& { $input | Tee-Object -Append -FilePath '%DATA_DIR%\logs\gateway.log' }" + +echo. +echo OpenClaw stopped. +pause diff --git a/usb-release/core/package.json b/usb-release/core/package.json new file mode 100644 index 0000000..25f8daf --- /dev/null +++ b/usb-release/core/package.json @@ -0,0 +1,9 @@ +{ + "name": "u-claw-core", + "version": "1.0.0", + "private": true, + "dependencies": { + "openclaw": "latest", + "@sliverp/qqbot": "^1.5.4" + } +} diff --git a/usb-release/docs/README.md b/usb-release/docs/README.md new file mode 100644 index 0000000..c0bae61 --- /dev/null +++ b/usb-release/docs/README.md @@ -0,0 +1,46 @@ +# U-Claw — 便携式 AI 助手 + +从 U 盘直接运行,无需安装。 + +## 快速开始 + +### Mac +双击 `启动 U-Claw.command` 即可。 + +### Windows +双击 `Windows-Start.bat` 即可。 + +## 首次使用 + +1. 双击启动脚本 +2. 浏览器自动打开配置页面 +3. 选择模型、填写 API Key +4. 点击「保存并启动」 + +## 目录说明 + +``` +├── 启动 U-Claw.command ← Mac 启动 +├── 重新配置.command ← Mac 重新配置 +├── Windows-Start.bat ← Windows 启动 +├── Windows-Menu.bat ← Windows 功能菜单 +├── Config.html ← 配置页面 +├── core/ ← OpenClaw + 依赖 +├── runtime/ ← Node.js 运行时 +├── data/ ← 用户数据(自动生成) +├── skills/ ← 中国优化技能 +└── toolkit/ ← 快速装机包 +``` + +## 开发者 + +```bash +# 搭建开发环境(下载 Node.js + OpenClaw) +bash setup.sh + +# 制作跨平台 U 盘 +bash setup.sh --all-platforms + +# 下载 Node.js 安装包到 toolkit/ +bash setup.sh --with-toolkit +``` diff --git a/usb-release/setup.sh b/usb-release/setup.sh new file mode 100755 index 0000000..6aaa173 --- /dev/null +++ b/usb-release/setup.sh @@ -0,0 +1,207 @@ +#!/bin/bash +# ============================================================ +# U-Claw — 开发环境搭建脚本 +# 用法: bash setup.sh [--all-platforms] [--with-toolkit] +# 作用: 下载 Node.js 运行时 + 安装 OpenClaw 到 core/ +# ============================================================ + +set -e + +SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" +CORE_DIR="$SCRIPT_DIR/core" +RUNTIME_DIR="$SCRIPT_DIR/runtime" +MIRROR="https://registry.npmmirror.com" +NODE_MIRROR="https://npmmirror.com/mirrors/node" +NODE_VERSION="v22.14.0" +ALL_PLATFORMS=false +WITH_TOOLKIT=false + +for arg in "$@"; do + [ "$arg" = "--all-platforms" ] && ALL_PLATFORMS=true + [ "$arg" = "--with-toolkit" ] && WITH_TOOLKIT=true +done + +GREEN='\033[0;32m' +CYAN='\033[0;36m' +RED='\033[0;31m' +NC='\033[0m' + +echo "" +echo -e "${CYAN}╔══════════════════════════════════════╗${NC}" +echo -e "${CYAN}║ 🦞 U-Claw Setup ║${NC}" +echo -e "${CYAN}╚══════════════════════════════════════╝${NC}" +echo "" + +# ---- Detect OS & Arch ---- +OS=$(uname -s) +ARCH=$(uname -m) + +if [ "$OS" = "Darwin" ]; then + if [ "$ARCH" = "arm64" ]; then + PLATFORM="darwin-arm64" + NODE_DIR_NAME="node-mac-arm64" + else + PLATFORM="darwin-x64" + NODE_DIR_NAME="node-mac-x64" + fi +else + echo -e "${RED}请在 Mac 上运行此脚本。Windows 请用 setup.bat${NC}" + exit 1 +fi + +echo -e " 系统: ${GREEN}$OS $ARCH${NC}" +echo "" + +# ---- 1. Download Node.js (Current Platform) ---- +download_node() { + local platform=$1 + local dir_name=$2 + local target="$RUNTIME_DIR/$dir_name" + + if [ "$platform" = "win-x64" ]; then + if [ -f "$target/node.exe" ]; then + echo -e " ${GREEN}✓${NC} Node.js ($platform) 已存在,跳过下载" + return + fi + echo -e " ${CYAN}↓${NC} 下载 Node.js $NODE_VERSION ($platform)..." + mkdir -p "$target" + local url="$NODE_MIRROR/$NODE_VERSION/node-$NODE_VERSION-$platform.zip" + echo " $url" + local tmp_zip="/tmp/node-$platform-$$.zip" + curl -fSL "$url" -o "$tmp_zip" + if command -v unzip >/dev/null 2>&1; then + unzip -q "$tmp_zip" -d "/tmp/node-extract-$$" + cp -r "/tmp/node-extract-$$"/node-$NODE_VERSION-$platform/* "$target/" + rm -rf "/tmp/node-extract-$$" + else + echo -e " ${RED}✗ unzip not found, skipping $platform runtime${NC}" + fi + rm -f "$tmp_zip" + if [ -f "$target/node.exe" ]; then + echo -e " ${GREEN}✓${NC} Node.js ($platform) 下载完成" + else + echo -e " ${CYAN}⚠${NC} $platform runtime 下载失败 (不影响当前平台使用)" + fi + else + if [ -f "$target/bin/node" ]; then + echo -e " ${GREEN}✓${NC} Node.js ($platform) 已存在,跳过下载" + return + fi + echo -e " ${CYAN}↓${NC} 下载 Node.js $NODE_VERSION ($platform)..." + mkdir -p "$target" + local url="$NODE_MIRROR/$NODE_VERSION/node-$NODE_VERSION-$platform.tar.gz" + echo " $url" + curl -fSL "$url" | tar xz -C "$target" --strip-components=1 + if [ -f "$target/bin/node" ]; then + echo -e " ${GREEN}✓${NC} Node.js ($platform) 下载完成" + else + echo -e " ${RED}✗ Node.js ($platform) 下载失败${NC}" + exit 1 + fi + fi +} + +# Download current platform +download_node "$PLATFORM" "$NODE_DIR_NAME" + +# Download all platforms if requested +if [ "$ALL_PLATFORMS" = "true" ]; then + if [ "$PLATFORM" != "darwin-arm64" ]; then + download_node "darwin-arm64" "node-mac-arm64" + fi + if [ "$PLATFORM" != "darwin-x64" ]; then + download_node "darwin-x64" "node-mac-x64" + fi + download_node "win-x64" "node-win-x64" +fi + +# ---- 2. Install OpenClaw ---- +NODE_TARGET="$RUNTIME_DIR/$NODE_DIR_NAME" +NODE_BIN="$NODE_TARGET/bin/node" +NPM_BIN="$NODE_TARGET/bin/npm" + +if [ -d "$CORE_DIR/node_modules/openclaw" ]; then + echo -e " ${GREEN}✓${NC} OpenClaw 已安装,跳过" +else + echo -e " ${CYAN}↓${NC} 安装 OpenClaw..." + mkdir -p "$CORE_DIR" + "$NODE_BIN" "$NPM_BIN" install --prefix "$CORE_DIR" --registry="$MIRROR" + echo -e " ${GREEN}✓${NC} OpenClaw 安装完成" +fi + +# ---- 3. Install QQ Plugin ---- +if [ -d "$CORE_DIR/node_modules/@sliverp/qqbot" ]; then + echo -e " ${GREEN}✓${NC} QQ 插件已安装,跳过" +else + echo -e " ${CYAN}↓${NC} 安装 QQ 插件..." + "$NODE_BIN" "$NPM_BIN" install @sliverp/qqbot@latest --prefix "$CORE_DIR" --registry="$MIRROR" 2>/dev/null || true + echo -e " ${GREEN}✓${NC} QQ 插件安装完成" +fi + +# ---- 4. Install China-optimized skills ---- +SKILLS_SRC="$SCRIPT_DIR/skills" +SKILLS_TARGET="$CORE_DIR/node_modules/openclaw/skills" + +if [ -d "$SKILLS_SRC" ] && [ -d "$SKILLS_TARGET" ]; then + echo -e " ${CYAN}↓${NC} 安装中国优化技能..." + SKILL_COUNT=0 + for skill_dir in "$SKILLS_SRC"/*/; do + [ ! -d "$skill_dir" ] && continue + skill_name=$(basename "$skill_dir") + if [ ! -d "$SKILLS_TARGET/$skill_name" ]; then + cp -R "$skill_dir" "$SKILLS_TARGET/$skill_name" + SKILL_COUNT=$((SKILL_COUNT + 1)) + fi + done + echo -e " ${GREEN}✓${NC} 中国技能安装完成 (+$SKILL_COUNT 个)" +fi + +# ---- 5. Download toolkit (Node.js installers) ---- +if [ "$WITH_TOOLKIT" = "true" ]; then + TOOLKIT_DIR="$SCRIPT_DIR/toolkit" + mkdir -p "$TOOLKIT_DIR" + echo "" + echo -e " ${CYAN}↓${NC} 下载 Node.js 安装包到 toolkit/..." + + # Mac pkg + MAC_PKG="node-$NODE_VERSION.pkg" + if [ ! -f "$TOOLKIT_DIR/$MAC_PKG" ]; then + echo -e " 下载 $MAC_PKG..." + curl -fSL "$NODE_MIRROR/$NODE_VERSION/$MAC_PKG" -o "$TOOLKIT_DIR/$MAC_PKG" + echo -e " ${GREEN}✓${NC} $MAC_PKG" + else + echo -e " ${GREEN}✓${NC} $MAC_PKG 已存在" + fi + + # Windows msi + WIN_MSI="node-$NODE_VERSION-x64.msi" + if [ ! -f "$TOOLKIT_DIR/$WIN_MSI" ]; then + echo -e " 下载 $WIN_MSI..." + curl -fSL "$NODE_MIRROR/$NODE_VERSION/$WIN_MSI" -o "$TOOLKIT_DIR/$WIN_MSI" + echo -e " ${GREEN}✓${NC} $WIN_MSI" + else + echo -e " ${GREEN}✓${NC} $WIN_MSI 已存在" + fi +fi + +# ---- Done ---- +echo "" +echo -e "${GREEN}════════════════════════════════════════${NC}" +echo -e "${GREEN} ✅ 搭建完成!${NC}" +echo "" +echo -e " 启动方式:" +echo -e " Mac: 双击 ${CYAN}启动 U-Claw.command${NC}" +echo -e " Windows: 双击 ${CYAN}Windows-Start.bat${NC}" +echo "" +echo -e " 目录结构:" +echo -e " core/ ← OpenClaw + 依赖" +echo -e " runtime/ ← Node.js $NODE_VERSION" +echo -e " data/ ← 运行后自动生成" +echo "" +if [ "$ALL_PLATFORMS" != "true" ]; then + echo -e " ${CYAN}提示: 制作跨平台 U 盘请用 bash setup.sh --all-platforms${NC}" +fi +if [ "$WITH_TOOLKIT" != "true" ]; then + echo -e " ${CYAN}提示: 下载安装包到 toolkit/ 请用 bash setup.sh --with-toolkit${NC}" +fi +echo -e "${GREEN}════════════════════════════════════════${NC}" diff --git a/usb-release/skills/bilibili-helper/SKILL.md b/usb-release/skills/bilibili-helper/SKILL.md new file mode 100644 index 0000000..261dada --- /dev/null +++ b/usb-release/skills/bilibili-helper/SKILL.md @@ -0,0 +1,112 @@ +--- +name: bilibili-helper +description: "B站内容助手 - 视频标题描述优化、标签策略、封面设计建议、分区选择、评论互动" +metadata: { "openclaw": { "emoji": "📺" } } +--- + +# B站内容助手 + +帮助 UP 主优化视频标题、描述、标签和封面,提升视频在 B 站的推荐和互动表现。 + +## 功能概述 + +- **标题优化**: 符合 B 站用户口味的标题写法 +- **描述撰写**: 含时间轴、关键词、引导语的视频简介 +- **标签策略**: 精准标签 + 热门标签组合,提升推荐 +- **分区建议**: 根据内容推荐最佳投稿分区 +- **封面设计**: 封面构图、文字、配色建议 +- **评论互动**: 置顶评论话术,提升互动率 + +## 使用示例 + +### 写标题和描述 +``` +我做了一个"用AI写代码"的教程视频,帮我写标题和描述 +``` + +### 分区推荐 +``` +我的视频内容是游戏+编程结合,应该投哪个分区? +``` + +### 封面建议 +``` +视频主题是"大学生省钱攻略",帮我设计封面方案 +``` + +### 优化已有内容 +``` +这个视频播放量很低,帮我分析标题和标签有什么问题(附链接/截图) +``` + +## 标题公式 + +1. **疑问式**: "为什么XX?看完你就懂了" +2. **教程式**: "XX教程|从零开始手把手教学" +3. **测评式**: "花了XX元买了XX,值不值?" +4. **挑战式**: "挑战XX天只用XX" +5. **盘点式**: "XX年度十大XX盘点" +6. **震惊式**: "这也太XX了吧!"(B站经典体) + +## 描述模板 + +``` +【视频简介】 +一句话概括视频内容 + +【时间轴】 +00:00 开场 +01:23 第一部分 +05:00 第二部分 +08:30 总结 + +【相关链接】 +工具/资源链接 + +【关于我】 +一句话介绍 + 更新频率 + +三连支持一下吧~ 有问题评论区见! +``` + +## 分区选择指南 + +| 内容类型 | 推荐分区 | +|---------|---------| +| 编程教程 | 科技 → 计算机技术 | +| 日常 vlog | 生活 → 日常 | +| 游戏实况 | 游戏 → 单机/网游 | +| 知识科普 | 知识 → 社科人文/科学科普 | +| 美食制作 | 生活 → 美食圈 | +| AI/数码 | 科技 → 软件应用 | + +## 标签策略 + +- **核心标签**: 精确描述视频内容(2-3个) +- **分区热门**: 当前分区下的热门标签(2-3个) +- **全站热门**: B站当前热点话题(1-2个) +- **长尾标签**: 细分领域关键词(2-3个) +- 总计 8-12 个标签效果最佳 + +## 适用场景 + +- B站视频投稿前的标题/描述/标签优化 +- 分析低播放量视频的改进方向 +- 设计视频封面方案 +- 选择合适的投稿分区 +- 撰写置顶评论引导互动 + +## 不适用场景 + +- 写抖音短视频脚本(平台调性不同,请用 douyin-script) +- 视频剪辑指导(本技能专注文案优化) +- B站直播相关(直播与视频投稿逻辑不同) +- 需要实时查询B站热搜数据 + +## 封面设计要点 + +- **尺寸**: 16:10(推荐 1146x717) +- **文字**: 不超过 10 字,字体加粗加描边 +- **表情**: 人物表情夸张更吸引点击 +- **配色**: 高饱和度,与B站粉色/蓝色背景形成对比 +- **避免**: 过多文字、低分辨率、与内容无关的封面 diff --git a/usb-release/skills/china-search/SKILL.md b/usb-release/skills/china-search/SKILL.md new file mode 100644 index 0000000..9cfe220 --- /dev/null +++ b/usb-release/skills/china-search/SKILL.md @@ -0,0 +1,98 @@ +--- +name: china-search +description: "国内搜索引擎 - 百度、搜狗、Bing中国搜索,绕过GFW限制" +metadata: { "openclaw": { "emoji": "🔍" } } +--- + +# 国内搜索引擎助手 + +在无法访问 Google 的环境下,通过 curl 调用百度、搜狗、Bing 中国等国内搜索引擎获取信息。 + +## 功能概述 + +- **百度搜索**: 中文信息最全的搜索引擎 +- **搜狗搜索**: 微信公众号文章搜索利器 +- **Bing 中国**: 国际信息 + 国内可访问 +- **搜索优化**: 帮你构造更精准的搜索关键词 +- **结果整理**: 将搜索结果整理为结构化信息 + +## 搜索命令 + +### 百度搜索 +```bash +curl -s -L "https://www.baidu.com/s?wd=关键词" \ + -H "User-Agent: Mozilla/5.0" | head -200 +``` + +### 搜狗搜索(含微信文章) +```bash +# 网页搜索 +curl -s -L "https://www.sogou.com/web?query=关键词" \ + -H "User-Agent: Mozilla/5.0" + +# 微信文章搜索 +curl -s -L "https://weixin.sogou.com/weixin?query=关键词" \ + -H "User-Agent: Mozilla/5.0" +``` + +### Bing 中国搜索 +```bash +curl -s -L "https://cn.bing.com/search?q=关键词" \ + -H "User-Agent: Mozilla/5.0" +``` + +## 使用示例 + +### 搜索信息 +``` +帮我搜索"DeepSeek V3 发布时间和新特性" +``` + +### 搜微信文章 +``` +帮我在搜狗搜索最近关于"AI Agent"的微信公众号文章 +``` + +### 对比搜索 +``` +分别用百度和Bing搜索"2024年中国GDP",对比结果 +``` + +### 精准搜索 +``` +帮我搜索 site:zhihu.com "大模型部署"相关的知乎回答 +``` + +## 搜索技巧 + +| 语法 | 说明 | 示例 | +|-----|------|------| +| "" | 精确匹配 | "人工智能" | +| site: | 限定网站 | site:zhihu.com AI | +| filetype: | 限定文件类型 | filetype:pdf 机器学习 | +| - | 排除关键词 | 苹果 -手机 | +| intitle: | 标题含关键词 | intitle:教程 Python | + +## 适用场景 + +- 需要搜索中文互联网信息 +- Google 不可用时的替代方案 +- 专门搜索微信公众号文章 +- 需要搜索国内网站的特定内容 +- 查找百度百科、知乎等平台信息 + +## 不适用场景 + +- 需要搜索英文/国际信息(建议使用 WebSearch 工具) +- 需要实时热搜排行(搜索结果有延迟) +- 需要搜索被百度屏蔽的敏感内容 +- 需要大量爬取搜索结果(有反爬限制) + +## 注意事项 + +- curl 获取的是 HTML 原始内容,需要解析提取有用信息 +- 百度搜索有反爬机制,频繁请求可能被拦截 +- 搜狗微信搜索是查找公众号文章的最佳渠道 +- Bing 中国版内容审核较百度宽松 +- 建议添加 User-Agent 头部模拟浏览器访问 +- 部分搜索结果链接需要二次跳转才能获取真实 URL diff --git a/usb-release/skills/china-translate/SKILL.md b/usb-release/skills/china-translate/SKILL.md new file mode 100644 index 0000000..9bbc13c --- /dev/null +++ b/usb-release/skills/china-translate/SKILL.md @@ -0,0 +1,126 @@ +--- +name: china-translate +description: "中英互译 + 本地化 - 技术翻译、UI本地化、文化适配、避免机翻腔" +metadata: { "openclaw": { "emoji": "🌐" } } +--- + +# 中英互译 + 本地化助手 + +专业的中英双向翻译工具,专注技术文档翻译、产品本地化和文化适配,杜绝机翻腔。 + +## 功能概述 + +- **技术翻译**: 编程/AI/互联网领域的专业术语翻译 +- **UI 本地化**: 将英文界面文案翻译为符合中文习惯的表达 +- **文化适配**: 处理中西文化差异,避免直译造成的误解 +- **去机翻腔**: 将僵硬的机器翻译改写为自然流畅的中文 +- **术语表管理**: 保持项目内术语翻译的一致性 + +## 使用示例 + +### 技术文档翻译 +``` +把这段 API 文档翻译成中文,保留代码不翻译(附原文) +``` + +### UI 本地化 +``` +帮我把这些英文按钮文案翻译成中文: +- "Get Started" +- "Learn More" +- "Sign Up for Free" +``` + +### 去机翻腔 +``` +这段翻译读起来很别扭,帮我改成自然的中文表达(附译文) +``` + +### 中译英 +``` +帮我把这段产品介绍翻译成英文,目标读者是海外开发者 +``` + +## 翻译原则 + +### 核心准则 +1. **信**: 准确传达原文含义 +2. **达**: 表达通顺,符合目标语言习惯 +3. **雅**: 在准确的基础上追求优美 + +### 技术翻译规范 +- 代码、变量名、API 名称保持英文原样 +- 约定俗成的术语使用通用译法(见术语表) +- 首次出现的术语标注英文原文:机器学习(Machine Learning) +- 保留技术文档的格式和结构 + +## 常见术语对照表 + +| English | 中文(推荐) | 避免使用 | +|---------|------------|---------| +| Machine Learning | 机器学习 | 机械学习 | +| Artificial Intelligence | 人工智能 / AI | 人造智能 | +| Deploy | 部署 | 配置/展开 | +| Repository | 仓库 / 代码仓库 | 存储库 | +| Pull Request | PR / 合并请求 | 拉取请求 | +| Container | 容器 | 集装箱 | +| Middleware | 中间件 | 中间软件 | +| Callback | 回调 | 回叫 | +| Render | 渲染 | 呈现 | +| Token | Token / 令牌 | 代币(非区块链语境) | +| Prompt | 提示词 / Prompt | 提示语 | +| Fine-tune | 微调 | 精调 | + +## UI 本地化指南 + +### 按钮文案 +- "Submit" → "提交"(不是"递交") +- "Cancel" → "取消" +- "Get Started" → "立即开始" / "开始使用" +- "Learn More" → "了解更多" +- "Sign Up" → "注册"(不是"签到") + +### 提示信息 +- "Are you sure?" → "确定要执行此操作吗?" +- "Loading..." → "加载中..." +- "No results found" → "暂无结果" +- "Something went wrong" → "出了点问题,请稍后重试" + +### 注意事项 +- 中文 UI 不需要句号(按钮、标签) +- 中英文之间加半角空格: "使用 AI 生成" +- 数字使用半角: "共 3 个结果" +- 避免过长的中文按钮文案(尽量 4 字以内) + +## 机翻腔常见问题 + +| 机翻腔 | 自然表达 | +|-------|---------| +| "它是一个非常好的工具" | "这是个很好用的工具" | +| "你可以使用它来..." | "用它可以..." | +| "这将会帮助你..." | "这能帮你..." | +| "基于XXX" | "用XXX" / "通过XXX" | +| "被设计用来" | "专门用于" / "用来" | + +## 适用场景 + +- 翻译技术文档、README、API 文档 +- 产品界面中英文本地化 +- 改善机器翻译的输出质量 +- 保持项目术语翻译一致性 +- 写双语内容(如双语 README) + +## 不适用场景 + +- 翻译文学作品(需要更高的文学素养) +- 法律/医学等需要专业资质的翻译 +- 同声传译或实时翻译 +- 非中英语言对的翻译(如日语、韩语) + +## 提升翻译质量的技巧 + +1. 提供上下文:说明文档类型和目标读者 +2. 指定术语:如果有项目术语表,请提供 +3. 分段翻译:长文档分段处理效果更好 +4. 说明语域:正式文档 vs 营销文案 vs 技术博客 +5. 标注不翻译的部分:代码块、品牌名等 diff --git a/usb-release/skills/china-weather/SKILL.md b/usb-release/skills/china-weather/SKILL.md new file mode 100644 index 0000000..d2cf977 --- /dev/null +++ b/usb-release/skills/china-weather/SKILL.md @@ -0,0 +1,88 @@ +--- +name: china-weather +description: "中国城市天气查询 - 支持中文城市名、农历日期、wttr.in接口" +metadata: { "openclaw": { "emoji": "🌤️" } } +--- + +# 中国城市天气查询 + +通过 wttr.in 查询中国各城市天气信息,支持中文城市名输入,附带农历日期和生活建议。 + +## 功能概述 + +- **实时天气**: 通过 curl 调用 wttr.in 获取天气数据 +- **中文城市名**: 支持直接输入"深圳"、"北京"等中文名 +- **多日预报**: 支持当天及未来 3 天天气预报 +- **农历日期**: 自动附带当天农历日期信息 +- **生活指数**: 穿衣建议、出行提示、紫外线指数 + +## 查询方式 + +使用 Bash 工具执行以下命令格式: + +```bash +# 基础查询(中文输出) +curl -s "wttr.in/深圳?lang=zh" + +# 精简单行格式 +curl -s "wttr.in/深圳?format=3&lang=zh" + +# 仅今天的天气 +curl -s "wttr.in/深圳?0&lang=zh" + +# JSON 格式(便于解析) +curl -s "wttr.in/深圳?format=j1" +``` + +## 使用示例 + +### 查天气 +``` +深圳今天天气怎么样? +``` + +### 出行建议 +``` +明天要去杭州出差,需要带伞吗? +``` + +### 多城市对比 +``` +北京和上海这周末天气哪个好?想出去玩 +``` + +### 穿衣建议 +``` +广州现在多少度?穿什么衣服合适? +``` + +## 适用场景 + +- 快速查询国内任意城市天气 +- 出差/旅行前了解目的地天气 +- 需要穿衣或出行建议 +- 查看未来几天天气趋势 +- 终端环境下无法打开天气 App 时 + +## 不适用场景 + +- 需要精确到小时的天气预报(wttr.in 精度有限) +- 查询历史天气数据 +- 需要灾害预警等官方气象信息(请使用中国气象局官网) +- 查询海外城市天气(本技能优化了中国城市名映射) + +## 城市名映射 + +常见城市直接使用拼音或中文均可: +- 北京 → Beijing / 北京 +- 上海 → Shanghai / 上海 +- 深圳 → Shenzhen / 深圳 +- 广州 → Guangzhou / 广州 + +如遇查询失败,尝试使用城市拼音替代中文名。 + +## 注意事项 + +- wttr.in 为免费服务,偶尔可能响应较慢 +- 温度默认摄氏度,风速默认 km/h +- 数据来源为 WorldWeatherOnline,仅供参考 diff --git a/usb-release/skills/deepseek-helper/SKILL.md b/usb-release/skills/deepseek-helper/SKILL.md new file mode 100644 index 0000000..a589547 --- /dev/null +++ b/usb-release/skills/deepseek-helper/SKILL.md @@ -0,0 +1,69 @@ +--- +name: deepseek-helper +description: "DeepSeek API 助手 - 编程辅助、模型选择、API调用指南、定价信息" +metadata: { "openclaw": { "emoji": "🤖" } } +--- + +# DeepSeek API 助手 + +帮助用户高效使用 DeepSeek 系列模型,包括模型选择建议、API 调用示例、编程辅助和定价计算。 + +## 功能概述 + +- **模型选择指南**: deepseek-chat vs deepseek-coder 的使用场景对比 +- **API 调用示例**: 提供 Python、curl、Node.js 等语言的调用代码 +- **定价计算**: 根据 token 用量估算费用(输入 ¥1/百万tokens,输出 ¥2/百万tokens) +- **Prompt 优化**: 针对 DeepSeek 模型特性优化提示词 +- **错误排查**: 常见 API 错误码解读和解决方案 + +## 模型对比 + +| 模型 | 适用场景 | 上下文长度 | +|------|---------|-----------| +| deepseek-chat | 日常对话、文案写作、知识问答 | 32K | +| deepseek-coder | 代码生成、代码审查、技术文档 | 16K | +| deepseek-reasoner | 复杂推理、数学、逻辑分析 | 64K | + +## 使用示例 + +### 基础 API 调用 +``` +帮我写一个调用 DeepSeek API 的 Python 脚本,实现多轮对话 +``` + +### 模型选择 +``` +我要做一个客服机器人,应该用 deepseek-chat 还是 deepseek-coder? +``` + +### 费用估算 +``` +我每天大约处理 1000 条用户消息,平均每条 500 token,帮我算下月费用 +``` + +### 错误排查 +``` +调用 DeepSeek API 返回 429 错误,怎么处理? +``` + +## 适用场景 + +- 首次接入 DeepSeek API 的开发者 +- 需要在 deepseek-chat 和 deepseek-coder 之间做选择 +- 想要优化 API 调用成本 +- 排查 API 调用问题 +- 需要快速生成 API 调用代码片段 + +## 不适用场景 + +- 需要调用 OpenAI / Claude 等其他模型的 API(请使用对应工具) +- 需要实时获取 DeepSeek 最新公告(本技能基于已知信息) +- 需要部署私有化 DeepSeek 模型(涉及运维,超出范围) + +## 关键提示 + +- DeepSeek API 兼容 OpenAI 格式,base_url 改为 `https://api.deepseek.com` +- 国内访问无需翻墙,延迟低 +- 支持 function calling 和 JSON mode +- 建议使用 stream 模式提升用户体验 +- API Key 申请地址: https://platform.deepseek.com diff --git a/usb-release/skills/douyin-script/SKILL.md b/usb-release/skills/douyin-script/SKILL.md new file mode 100644 index 0000000..ffb04ae --- /dev/null +++ b/usb-release/skills/douyin-script/SKILL.md @@ -0,0 +1,100 @@ +--- +name: douyin-script +description: "抖音/快手短视频脚本 - 前3秒hook、脚本结构、热门音乐建议、话题标签策略" +metadata: { "openclaw": { "emoji": "🎬" } } +--- + +# 抖音/快手短视频脚本助手 + +帮你写出完播率高、互动强的短视频脚本,覆盖从选题到发布的全流程。 + +## 功能概述 + +- **前3秒 Hook**: 生成抓人眼球的开场白,降低划走率 +- **脚本结构**: Hook → 内容展开 → 反转/高潮 → CTA +- **时长控制**: 根据内容类型推荐最佳时长(15s/30s/60s) +- **话题标签**: 推荐热门和垂直话题标签组合 +- **BGM 建议**: 根据内容调性推荐背景音乐风格 + +## 脚本结构模板 + +### 15秒脚本(适合单一知识点) +``` +【0-3秒】Hook: 抛出反常识/痛点 +"你知道吗?90%的人洗脸方式都是错的" + +【3-10秒】核心内容: 快速讲解 +"正确的方式是...(配合画面演示)" + +【10-15秒】CTA: 引导互动 +"学会了吗?双击收藏,关注我学更多护肤知识" +``` + +### 60秒脚本(适合干货/故事) +``` +【0-3秒】Hook: 强烈的情绪/悬念 +【3-15秒】背景铺垫: 建立场景 +【15-40秒】内容展开: 核心信息/故事发展 +【40-50秒】反转/高潮: 意想不到的结论 +【50-60秒】CTA + 话题标签 +``` + +## 使用示例 + +### 写脚本 +``` +帮我写一个30秒的抖音脚本,主题是"程序员的一天",搞笑风格 +``` + +### 优化开头 +``` +我拍了个美食视频,帮我想5个前3秒的hook文案 +``` + +### 话题推荐 +``` +我要发一个健身教程视频,推荐话题标签和发布时间 +``` + +### 改编热门 +``` +最近"搭子文化"很火,帮我写一个相关的短视频脚本 +``` + +## 前3秒 Hook 公式 + +1. **反常识**: "你一直在做的XX其实是错的" +2. **数字冲击**: "只花了100块,效果比1000块的还好" +3. **悬念提问**: "猜猜这个东西是干什么的?" +4. **情绪共鸣**: "打工人看完都沉默了..." +5. **结果前置**: "最终效果太绝了!往下看做法" +6. **身份代入**: "如果你也是XX,一定要看完" + +## 话题标签策略 + +- **大话题(曝光)**: #抖音热门 #今日份分享(1-2个) +- **中话题(垂直)**: #健身打卡 #美食教程(2-3个) +- **小话题(精准)**: #深圳探店 #程序员日常(2-3个) +- 总计 5-8 个标签为最佳 + +## 适用场景 + +- 创作抖音/快手短视频脚本 +- 优化视频开头提升完播率 +- 为视频选择话题标签 +- 策划系列内容的选题方向 +- 将长内容改编为短视频脚本 + +## 不适用场景 + +- 写B站中长视频脚本(请用 bilibili-helper) +- 需要真实拍摄指导(本技能专注文案脚本) +- 直播话术(直播场景与短视频逻辑不同) +- 涉及虚假宣传或违规内容 + +## 发布建议 + +- **黄金时段**: 早7-9点、午12-14点、晚18-22点 +- **频率**: 日更或隔日更,保持账号活跃 +- **封面**: 竖屏 9:16,文字大且少(不超过8字) +- **合拍/合集**: 善用抖音合拍功能蹭热度 diff --git a/usb-release/skills/wechat-article/SKILL.md b/usb-release/skills/wechat-article/SKILL.md new file mode 100644 index 0000000..d9cab15 --- /dev/null +++ b/usb-release/skills/wechat-article/SKILL.md @@ -0,0 +1,106 @@ +--- +name: wechat-article +description: "微信公众号文章写作 - 文章结构、排版规范、阅读转化优化、封面建议" +metadata: { "openclaw": { "emoji": "💚" } } +--- + +# 微信公众号文章写作助手 + +帮助运营者写出高阅读、高转发的微信公众号文章,覆盖从选题到排版的全流程。 + +## 功能概述 + +- **文章结构**: 标题 → 引言 → 正文 → 总结 → 引导关注 +- **排版规范**: 符合微信阅读习惯的段落、字号、配色建议 +- **标题优化**: 生成符合微信生态的标题(主标题 + 副标题) +- **封面建议**: 头图尺寸(900x383)、配色、文字排版建议 +- **互动引导**: 点赞、在看、转发的 CTA 话术 + +## 文章结构模板 + +``` +【标题】控制在 30 字以内,前 15 字抓眼球 +【摘要】出现在分享卡片,控制在 54 字 + +【引言】1-2 段,建立共鸣或抛出问题 +(配图:与主题相关的首图) + +【正文】 +## 小标题一 +内容段落...(每段 3-5 行) + +## 小标题二 +内容段落... + +## 小标题三 +内容段落... + +【总结】回扣主题,升华观点 + +【尾部】 +觉得有收获?点个「在看」让更多人看到 👇 +关注我,每周分享 XX 干货 +``` + +## 使用示例 + +### 写完整文章 +``` +帮我写一篇公众号文章,主题是"为什么35岁是程序员的分水岭",3000字左右 +``` + +### 优化标题 +``` +文章主题是AI工具推荐,帮我写10个公众号标题 +``` + +### 改写排版 +``` +这篇文章内容不错但排版太密了,帮我优化成适合微信阅读的格式 +``` + +### 写引导语 +``` +帮我写一段文章开头,主题是教育焦虑,要能引起家长共鸣 +``` + +## 微信排版规范 + +- **正文字号**: 15-16px(推荐15px) +- **字间距**: 1-2px +- **行间距**: 1.75-2倍 +- **段间距**: 空一行 +- **两端缩进**: 16px(手机端留白) +- **配色**: 正文 #3f3f3f,强调 #007AFF 或品牌色 +- **图片**: 宽度 100%,JPG 格式,单张不超过 5MB + +## 标题技巧 + +1. **数字开头**: "3个方法/5分钟学会" +2. **疑问式**: "为什么XX?答案出乎意料" +3. **对比式**: "XX和XX的差距,在于这一点" +4. **紧迫感**: "再不XX就晚了" +5. **权威背书**: "XX专家/XX万人验证" + +## 适用场景 + +- 撰写公众号原创文章(干货、观点、故事等) +- 优化已有文章的标题和结构 +- 为文章设计排版方案 +- 写分享卡片的摘要文案 +- 设计文章尾部的关注引导 + +## 不适用场景 + +- 写小红书笔记(风格不同,请用 xiaohongshu-writer) +- 需要直接在微信编辑器排版(本技能输出 Markdown 格式) +- 涉及时政新闻等需要资质的内容 +- 需要真实数据支撑的行业报告(框架可用,数据需自备) + +## 提升阅读量的关键 + +- 标题决定打开率,前 15 字是关键 +- 首屏内容决定是否继续阅读 +- 文章长度建议 1500-3000 字(太长容易跳出) +- 每 300 字配一张图,打破阅读疲劳 +- 结尾的「在看」引导直接影响二次传播 diff --git a/usb-release/skills/weibo-poster/SKILL.md b/usb-release/skills/weibo-poster/SKILL.md new file mode 100644 index 0000000..6729416 --- /dev/null +++ b/usb-release/skills/weibo-poster/SKILL.md @@ -0,0 +1,118 @@ +--- +name: weibo-poster +description: "微博内容创作 - 140字优化、话题热搜、@提及策略、配图描述、发布时机" +metadata: { "openclaw": { "emoji": "🔴" } } +--- + +# 微博内容创作助手 + +帮你写出高转发、高互动的微博内容,掌握微博生态的流量密码。 + +## 功能概述 + +- **字数优化**: 140 字精炼表达,或长微博结构优化 +- **话题策略**: 热搜话题 + 垂直话题组合使用 +- **@提及**: 合理 @ 相关大V和官方账号增加曝光 +- **配图建议**: 图片数量(1/3/6/9宫格)和内容建议 +- **发布时机**: 根据目标人群推荐最佳发布时间 + +## 微博内容模板 + +### 短微博(140字以内) +``` +【观点/金句】一句话表达核心观点 +【补充说明】1-2句展开 +【话题标签】#话题一# #话题二# +【配图】建议搭配的图片类型 +``` + +### 长微博 +``` +【标题】简短有力 +【正文】分段落论述,每段 2-3 句 +【总结】一句话总结 +【话题 + CTA】#话题# + 转发/评论引导 +``` + +### 九宫格图文 +``` +【文案】简短描述 + 情绪表达 +【9张图片】内容规划和排列顺序建议 +【话题】相关话题标签 +``` + +## 使用示例 + +### 写微博 +``` +帮我写一条关于"AI取代人类工作"的微博,要有观点有态度 +``` + +### 蹭热搜 +``` +今天热搜是#XX事件#,帮我写一条相关微博 +``` + +### 产品推广 +``` +帮我写一条推广我新产品的微博,产品是XX,目标用户是XX +``` + +### 日常分享 +``` +帮我写一条记录深圳生活的微博,配九宫格照片描述 +``` + +## 140字写作技巧 + +- **先写后删**: 先完整表达,再精简到 140 字 +- **一条一观点**: 不要在一条微博里讲太多 +- **金句收尾**: 最后一句要值得被转发 +- **留白引发讨论**: 不要说太满,给评论区留空间 +- **善用符号**: |、/、→ 等符号节省字数 + +## 话题标签策略 + +| 类型 | 说明 | 示例 | +|-----|------|------| +| 热搜话题 | 当前微博热搜 | #热搜关键词# | +| 超话 | 垂直社区 | #程序员超话# | +| 自建话题 | 个人品牌 | #东升聊AI# | +| 节日话题 | 节日营销 | #春节# | + +## @提及策略 + +- @ 内容相关的行业大V(可能被转发) +- @ 官方媒体账号(适合新闻类内容) +- @ 品牌官方号(适合测评/反馈内容) +- 不要无意义 @ 过多人(容易被判定垃圾信息) + +## 配图建议 + +- **1张图**: 重点突出,适合海报/截图 +- **3张图**: 对比/过程展示 +- **6张图**: 故事叙述/多角度展示 +- **9张图**: 九宫格,视觉冲击力最强 +- **图片尺寸**: 建议 1080x1080 或 1080x1440 + +## 适用场景 + +- 日常微博内容创作 +- 蹭热搜话题获取曝光 +- 产品/活动的微博推广 +- 打造微博个人品牌 +- 写转发语增加传播力 + +## 不适用场景 + +- 写长文章(请用 wechat-article 或 zhihu-writer) +- 写短视频脚本(请用 douyin-script) +- 需要实时获取微博热搜数据 +- 微博投放广告的策略(涉及付费推广) + +## 发布时间建议 + +- **工作日**: 午休 12:00-13:00、下班后 18:00-20:00 +- **周末**: 上午 10:00-11:00、晚上 20:00-22:00 +- **热点事件**: 第一时间发布,抢占话题先机 +- **避开时段**: 凌晨 0:00-7:00(除非目标是夜猫子群体) diff --git a/usb-release/skills/xiaohongshu-writer/SKILL.md b/usb-release/skills/xiaohongshu-writer/SKILL.md new file mode 100644 index 0000000..37da3d9 --- /dev/null +++ b/usb-release/skills/xiaohongshu-writer/SKILL.md @@ -0,0 +1,91 @@ +--- +name: xiaohongshu-writer +description: "小红书笔记写作助手 - 标题优化、emoji策略、话题标签、封面文案、笔记结构" +metadata: { "openclaw": { "emoji": "📕" } } +--- + +# 小红书笔记写作助手 + +专业的小红书内容创作工具,帮你写出高互动、高收藏的爆款笔记。 + +## 功能概述 + +- **标题生成**: 符合小红书调性的吸睛标题(含数字、emoji、悬念) +- **正文结构**: hook 开头 → 干货内容 → CTA 引导收藏/关注 +- **Emoji 策略**: 段落间自然穿插 emoji,提升阅读体验 +- **话题标签**: 根据内容推荐热门 # 话题,提升曝光 +- **封面文案**: 适合做封面图的短文案建议 + +## 笔记结构模板 + +``` +【标题】数字 + 痛点/好奇心 + emoji +例: 打工人必看!5个让老板刮目相看的汇报技巧 💼 + +【开头 Hook】1-2句直击痛点,让人想继续看 +例: 每次汇报都紧张到手抖?其实你只是没掌握方法! + +【正文】分点罗列,每点 2-3 行 +1️⃣ 第一点... +2️⃣ 第二点... +(穿插个人经验/截图说明) + +【结尾 CTA】引导互动 +例: 觉得有用就 ❤️ 收藏起来慢慢看!有问题评论区见~ + +【话题标签】 +#职场干货 #汇报技巧 #打工人必看 +``` + +## 使用示例 + +### 写笔记 +``` +帮我写一篇小红书笔记,主题是"独居女生的10个安全tips" +``` + +### 优化标题 +``` +我写了篇关于护肤的笔记,帮我起5个爆款标题 +``` + +### 话题推荐 +``` +我要发一篇深圳美食探店笔记,推荐相关话题标签 +``` + +### 改写风格 +``` +这段文字太正式了,帮我改成小红书风格(附原文) +``` + +## 标题公式 + +1. **数字法**: "5个/10种/100元以内" + 关键词 +2. **反差法**: "月薪3千 vs 月薪3万的区别" +3. **身份法**: "作为XX人/XX年经验告诉你" +4. **测评法**: "亲测有效!" + 结果 +5. **合集法**: "XX合集|一篇搞定" + +## 适用场景 + +- 创作各类小红书图文笔记 +- 优化已有笔记的标题和结构 +- 生成适合做封面的文案 +- 为笔记选择合适的话题标签 +- 学习小红书爆款写作技巧 + +## 不适用场景 + +- 写微信公众号长文(风格不同,请用 wechat-article) +- 写知乎专业回答(调性不同,请用 zhihu-writer) +- 需要真实数据/测评结果(本技能生成文案框架,数据需自备) +- 违反小红书社区规范的内容(医疗、金融等敏感领域需谨慎) + +## 写作要点 + +- 每段不超过 3 行,保持移动端阅读舒适度 +- emoji 不要堆砌,每段 1-2 个即可 +- 话题标签 3-8 个为佳,混合大小话题 +- 封面文案控制在 10 字以内,字大醒目 +- 发布时间建议: 早7-9点、午12-14点、晚20-22点 diff --git a/usb-release/skills/zhihu-writer/SKILL.md b/usb-release/skills/zhihu-writer/SKILL.md new file mode 100644 index 0000000..44c7079 --- /dev/null +++ b/usb-release/skills/zhihu-writer/SKILL.md @@ -0,0 +1,111 @@ +--- +name: zhihu-writer +description: "知乎回答/文章写作 - 回答结构、专业语气、引用规范、话题关联、盐值优化" +metadata: { "openclaw": { "emoji": "📝" } } +--- + +# 知乎回答/文章写作助手 + +帮助创作者写出高赞、高收藏的知乎内容,包括问题回答和专栏文章。 + +## 功能概述 + +- **回答结构**: 先说结论 → 展开论证 → 总结升华 +- **专业语气**: 知乎特有的"专业但不装"的表达风格 +- **引用规范**: 数据来源标注、论文引用格式 +- **话题关联**: 推荐关联话题标签提升曝光 +- **盐值优化**: 内容质量建议,提升知乎盐值 + +## 回答结构模板 + +``` +【开头】直接回答问题 + 亮明立场(1-2句) +"作为一个做了5年XX的人,我的回答是:..." + +【分割线】 +--- + +【正文】分点论述,有理有据 +一、第一个论点 +论据 + 数据/案例支撑 +(可配图表增强说服力) + +二、第二个论点 +论据 + 个人经验 + +三、第三个论点 +论据 + 行业分析 + +【总结】回扣问题,给出实操建议 + +【引流】(可选) +更多XX内容可以关注我的专栏:XXX +``` + +## 使用示例 + +### 写回答 +``` +帮我回答知乎问题"普通人如何开始学习AI?",要专业但通俗 +``` + +### 写专栏文章 +``` +帮我写一篇知乎专栏文章,主题是"为什么我不建议用ChatGPT学编程" +``` + +### 优化回答 +``` +我的这个回答数据不好,帮我分析并改写(附原文) +``` + +### 蹭热点 +``` +最近DeepSeek很火,帮我写一个相关的知乎回答思路 +``` + +## 知乎写作风格指南 + +### 语气要点 +- **自信但不傲慢**: "以我的经验来看" 而非 "我告诉你们" +- **专业但易懂**: 技术术语需要解释,不要秀词汇量 +- **有态度但包容**: 可以有观点,但尊重不同立场 +- **真诚分享**: 多用个人经验和案例,少用空洞理论 + +### 格式要点 +- 段落清晰,善用加粗标注重点 +- 长回答用 h2/h3 分节 +- 数据和引用标明来源 +- 适当使用列表和表格整理信息 +- 配图要有信息量,不要纯装饰 + +## 盐值优化建议 + +- **内容质量**: 回答字数建议 500-3000 字,有干货 +- **原创度**: 避免复制粘贴,用自己的语言表达 +- **互动**: 回复评论,参与讨论 +- **领域专注**: 持续在 2-3 个话题下创作 +- **举报违规**: 适当举报,提升社区贡献分 + +## 适用场景 + +- 回答知乎热门问题获取曝光 +- 撰写知乎专栏原创文章 +- 优化已有回答提升排名 +- 建立知乎个人品牌 +- 通过知乎内容引流 + +## 不适用场景 + +- 写小红书风格的轻松内容(请用 xiaohongshu-writer) +- 写微博短内容(请用 weibo-poster) +- 知乎广告/软文(违反社区规范) +- 需要实时查询知乎热榜数据 + +## 高赞回答的共同特征 + +1. **开头抓人**: 第一句话就让人想读下去 +2. **有独特视角**: 不要重复其他高赞答案的观点 +3. **有实质内容**: 数据、案例、个人经验缺一不可 +4. **排版舒适**: 移动端阅读友好 +5. **结尾有力**: 回扣问题,留下思考空间 diff --git a/usb-release/启动 U-Claw.command b/usb-release/启动 U-Claw.command new file mode 100755 index 0000000..5a073cf --- /dev/null +++ b/usb-release/启动 U-Claw.command @@ -0,0 +1,183 @@ +#!/bin/bash +# ============================================================ +# U-Claw — 便携版启动器 (macOS) +# 双击此文件即可启动 OpenClaw +# ============================================================ +DIR="$(cd "$(dirname "$0")" && pwd)" +ARCH=$(uname -m) + +# --- Colors --- +RED='\033[0;31m'; GREEN='\033[0;32m'; YELLOW='\033[1;33m'; CYAN='\033[0;36m'; NC='\033[0m' + +echo "" +echo -e "${CYAN} 🦞 U-Claw — 便携版${NC}" +echo -e " ════════════════════════════════" +echo "" + +# --- Find Node.js --- +if [ "$ARCH" = "arm64" ]; then + NODE_BIN="$DIR/runtime/node-mac-arm64/bin/node" +else + NODE_BIN="$DIR/runtime/node-mac-x64/bin/node" +fi +[ ! -f "$NODE_BIN" ] && NODE_BIN="$(which node 2>/dev/null)" + +if [ -z "$NODE_BIN" ] || [ ! -f "$NODE_BIN" ]; then + echo -e "${RED} ✗ 未找到 Node.js,请确保 runtime/ 目录完整${NC}" + echo " 按回车退出..."; read; exit 1 +fi +NODE_VER=$("$NODE_BIN" --version 2>/dev/null) +echo -e " ${GREEN}✓${NC} Node.js: $NODE_VER ($ARCH)" + +# --- Remove macOS quarantine --- +if xattr -l "$NODE_BIN" 2>/dev/null | grep -q "com.apple.quarantine"; then + echo -e " ${YELLOW}移除 macOS 安全限制...${NC}" + xattr -rd com.apple.quarantine "$DIR" 2>/dev/null || true + echo -e " ${GREEN}✓${NC} 已移除" +fi + +# --- Find OpenClaw --- +CORE_DIR="$DIR/core" +OPENCLAW_MJS="$CORE_DIR/node_modules/openclaw/openclaw.mjs" +if [ ! -f "$OPENCLAW_MJS" ]; then + echo -e "${RED} ✗ 未找到 OpenClaw,请确保 core/ 目录完整${NC}" + echo " 按回车退出..."; read; exit 1 +fi +echo -e " ${GREEN}✓${NC} OpenClaw: 已就绪" + +# --- Setup portable data dir --- +DATA_DIR="$DIR/data" +export OPENCLAW_HOME="$DATA_DIR" +export OPENCLAW_STATE_DIR="$DATA_DIR/.openclaw" +export OPENCLAW_CONFIG_PATH="$DATA_DIR/.openclaw/openclaw.json" +mkdir -p "$DATA_DIR/.openclaw" "$DATA_DIR/memory" "$DATA_DIR/backups" "$DATA_DIR/logs" + +# --- Check if config needs setup (first run) --- +CONFIG_FILE="$DATA_DIR/.openclaw/openclaw.json" +NEEDS_CONFIG=false +if [ ! -f "$CONFIG_FILE" ]; then + NEEDS_CONFIG=true +else + if ! grep -qE '"apiKey"|"ZAI_API_KEY"|"providers"' "$CONFIG_FILE" 2>/dev/null; then + NEEDS_CONFIG=true + fi +fi + +# --- If first run, open Config GUI first --- +if [ "$NEEDS_CONFIG" = "true" ]; then + echo "" + echo -e " ${YELLOW}⚡ 首次运行,请先配置模型和 API Key${NC}" + echo -e " ${YELLOW} 正在打开配置页面...${NC}" + echo "" + + CONFIG_PORT=18780 + while lsof -i :$CONFIG_PORT >/dev/null 2>&1; do + CONFIG_PORT=$((CONFIG_PORT + 1)) + [ $CONFIG_PORT -gt 18785 ] && break + done + + "$NODE_BIN" -e " +const http = require('http'); +const fs = require('fs'); +const path = require('path'); +const configPath = '$CONFIG_FILE'; +const htmlPath = path.join('$DIR', 'Config.html'); + +const server = http.createServer((req, res) => { + if (req.method === 'GET' && (req.url === '/' || req.url === '/index.html')) { + res.writeHead(200, {'Content-Type': 'text/html; charset=utf-8'}); + res.end(fs.readFileSync(htmlPath, 'utf-8')); + } else if (req.method === 'GET' && req.url === '/api/config') { + try { + const cfg = fs.existsSync(configPath) ? JSON.parse(fs.readFileSync(configPath, 'utf-8')) : {}; + res.writeHead(200, {'Content-Type': 'application/json'}); + res.end(JSON.stringify(cfg)); + } catch(e) { + res.writeHead(200, {'Content-Type': 'application/json'}); + res.end('{}'); + } + } else if (req.method === 'POST' && req.url === '/api/config') { + let body = ''; + req.on('data', c => body += c); + req.on('end', () => { + try { + const cfg = JSON.parse(body); + fs.mkdirSync(path.dirname(configPath), {recursive: true}); + fs.writeFileSync(configPath, JSON.stringify(cfg, null, 2)); + res.writeHead(200, {'Content-Type': 'application/json'}); + res.end('{\"ok\":true}'); + } catch(e) { + res.writeHead(400, {'Content-Type': 'application/json'}); + res.end('{\"error\":\"' + e.message + '\"}'); + } + }); + } else if (req.method === 'POST' && req.url === '/api/done') { + res.writeHead(200, {'Content-Type': 'application/json'}); + res.end('{\"ok\":true}'); + setTimeout(() => { server.close(); process.exit(0); }, 300); + } else { + res.writeHead(404); res.end('Not Found'); + } +}); +server.listen($CONFIG_PORT, '127.0.0.1', () => { + console.log('Config server: http://127.0.0.1:$CONFIG_PORT'); +}); +" & + CONFIG_PID=$! + sleep 1 + open "http://127.0.0.1:$CONFIG_PORT/" + + echo -e " ${CYAN}等待配置完成...${NC}" + echo -e " (在浏览器中选择模型、填写 API Key,点击「保存并启动」)" + echo "" + wait $CONFIG_PID 2>/dev/null + echo -e " ${GREEN}✓${NC} 配置已保存" + echo "" +fi + +# --- Check dependencies --- +if [ ! -d "$CORE_DIR/node_modules" ]; then + echo -e " ${YELLOW}首次运行,安装依赖...${NC}" + NODE_DIR="$(dirname "$(dirname "$NODE_BIN")")" + cd "$CORE_DIR" + "$NODE_BIN" "$NODE_DIR/bin/npm" install --registry=https://registry.npmmirror.com 2>&1 + echo -e " ${GREEN}✓${NC} 依赖安装完成" + echo "" +fi + +# --- Find available port --- +PORT=18789 +while lsof -i :$PORT >/dev/null 2>&1; do + PORT=$((PORT + 1)) + [ $PORT -gt 18799 ] && echo -e "${RED} ✗ 没有可用端口 (18789-18799)${NC}" && exit 1 +done + +echo -e " ${CYAN}🚀 正在启动 OpenClaw...${NC}" +echo "" + +# --- Start OpenClaw gateway --- +cd "$CORE_DIR" +"$NODE_BIN" "$OPENCLAW_MJS" gateway run --allow-unconfigured --force --port $PORT & +GW_PID=$! + +# --- Wait for gateway, then open browser --- +for i in $(seq 1 30); do + sleep 0.5 + if curl -s -o /dev/null "http://127.0.0.1:$PORT/" 2>/dev/null; then + TOKEN=$("$NODE_BIN" -e "try{const c=JSON.parse(require('fs').readFileSync('$CONFIG_FILE','utf8'));console.log(c.gateway?.auth?.token||'uclaw')}catch(e){console.log('uclaw')}" 2>/dev/null) + open "http://127.0.0.1:$PORT/#token=$TOKEN" 2>/dev/null || true + break + fi +done + +TOKEN=$("$NODE_BIN" -e "try{const c=JSON.parse(require('fs').readFileSync('$CONFIG_FILE','utf8'));console.log(c.gateway?.auth?.token||'uclaw')}catch(e){console.log('uclaw')}" 2>/dev/null) +echo -e " ${GREEN}════════════════════════════════${NC}" +echo -e " ${GREEN}🦞 U-Claw 正在运行!${NC}" +echo -e " ${GREEN} 地址: http://127.0.0.1:$PORT/#token=$TOKEN${NC}" +echo "" +echo -e " ${YELLOW}按 Ctrl+C 停止服务${NC}" +echo -e " ${GREEN}════════════════════════════════${NC}" +echo "" + +trap "kill $GW_PID 2>/dev/null; echo ''; echo ' 🦞 U-Claw 已停止'; exit 0" INT TERM +wait $GW_PID diff --git a/usb-release/重新配置.command b/usb-release/重新配置.command new file mode 100755 index 0000000..e4a8c78 --- /dev/null +++ b/usb-release/重新配置.command @@ -0,0 +1,39 @@ +#!/bin/bash +# ============================================================ +# U-Claw — 重新配置 (macOS) +# 备份旧配置,删除后重新触发首次配置流程 +# ============================================================ +DIR="$(cd "$(dirname "$0")" && pwd)" + +RED='\033[0;31m'; GREEN='\033[0;32m'; YELLOW='\033[1;33m'; CYAN='\033[0;36m'; NC='\033[0m' + +echo "" +echo -e "${CYAN} 🦞 U-Claw — 重新配置${NC}" +echo -e " ════════════════════════════════" +echo "" + +DATA_DIR="$DIR/data" +CONFIG_FILE="$DATA_DIR/.openclaw/openclaw.json" +BACKUP_DIR="$DATA_DIR/backups" + +if [ ! -f "$CONFIG_FILE" ]; then + echo -e " ${YELLOW}没有找到配置文件,无需重置${NC}" + echo -e " 直接运行「启动 U-Claw.command」即可进入配置" + echo "" + read -p " 按回车退出..." + exit 0 +fi + +# Backup old config +mkdir -p "$BACKUP_DIR" +TIMESTAMP=$(date +%Y%m%d_%H%M%S) +cp "$CONFIG_FILE" "$BACKUP_DIR/openclaw_${TIMESTAMP}.json" +echo -e " ${GREEN}✓${NC} 旧配置已备份: backups/openclaw_${TIMESTAMP}.json" + +# Remove config to trigger first-run flow +rm "$CONFIG_FILE" +echo -e " ${GREEN}✓${NC} 配置已清除" +echo "" +echo -e " ${CYAN}请双击「启动 U-Claw.command」重新配置${NC}" +echo "" +read -p " 按回车退出..."