Files
zclaw_openfang/scripts/setup.ts
2026-03-12 00:23:42 +08:00

179 lines
4.9 KiB
TypeScript

/**
* ZCLAW Setup Script
*
* First-time setup for ZCLAW:
* 1. Check if OpenClaw is installed
* 2. Copy default config files to ~/.openclaw/
* 3. Register ZCLAW custom plugins
* 4. Create workspace directory
*/
import { execSync, exec } from 'child_process';
import * as fs from 'fs';
import * as path from 'path';
const OPENCLAW_HOME = process.env.OPENCLAW_HOME || path.join(
process.env.HOME || process.env.USERPROFILE || '',
'.openclaw'
);
const ZCLAW_ROOT = path.resolve(__dirname, '..');
function log(msg: string) {
console.log(`[ZCLAW Setup] ${msg}`);
}
function error(msg: string) {
console.error(`[ZCLAW Setup] ❌ ${msg}`);
}
function success(msg: string) {
console.log(`[ZCLAW Setup] ✅ ${msg}`);
}
// Step 1: Check OpenClaw installation
function checkOpenClaw(): boolean {
try {
const version = execSync('openclaw --version', { encoding: 'utf-8' }).trim();
success(`OpenClaw found: ${version}`);
return true;
} catch {
error('OpenClaw not found. Please install it first:');
console.log(' Windows: iwr -useb https://openclaw.ai/install.ps1 | iex');
console.log(' macOS/Linux: curl -fsSL https://openclaw.ai/install.sh | bash');
console.log(' npm: npm install -g openclaw@latest');
return false;
}
}
// Step 2: Copy default config
function setupConfig() {
const configDir = OPENCLAW_HOME;
const configFile = path.join(configDir, 'openclaw.json');
// Create directory
fs.mkdirSync(configDir, { recursive: true });
// Copy default config if no config exists
if (!fs.existsSync(configFile)) {
const defaultConfig = fs.readFileSync(
path.join(ZCLAW_ROOT, 'config', 'openclaw.default.json'),
'utf-8'
);
// Update plugin paths to absolute paths
const config = JSON.parse(defaultConfig);
if (config.plugins?.load?.paths) {
config.plugins.load.paths = config.plugins.load.paths.map((p: string) =>
path.resolve(ZCLAW_ROOT, p)
);
}
if (config.skills?.load?.extraDirs) {
config.skills.load.extraDirs = config.skills.load.extraDirs.map((p: string) =>
path.resolve(ZCLAW_ROOT, p)
);
}
fs.writeFileSync(configFile, JSON.stringify(config, null, 2), 'utf-8');
success(`Config written to ${configFile}`);
} else {
log(`Config already exists at ${configFile}, skipping`);
}
// Copy bootstrap files
const bootstrapFiles = ['SOUL.md', 'AGENTS.md', 'IDENTITY.md', 'USER.md'];
const workspaceDir = path.join(configDir, 'zclaw-workspace');
fs.mkdirSync(workspaceDir, { recursive: true });
for (const file of bootstrapFiles) {
const src = path.join(ZCLAW_ROOT, 'config', file);
const dest = path.join(workspaceDir, file);
if (fs.existsSync(src) && !fs.existsSync(dest)) {
fs.copyFileSync(src, dest);
success(`Bootstrap file copied: ${file}`);
}
}
}
// Step 3: Register plugins
function registerPlugins() {
const pluginDirs = ['zclaw-chinese-models', 'zclaw-feishu', 'zclaw-ui'];
for (const plugin of pluginDirs) {
const pluginPath = path.join(ZCLAW_ROOT, 'plugins', plugin);
if (fs.existsSync(pluginPath)) {
try {
// Use openclaw plugins install -l (link mode) for development
execSync(`openclaw plugins install -l "${pluginPath}"`, {
encoding: 'utf-8',
stdio: 'pipe'
});
success(`Plugin linked: ${plugin}`);
} catch (err: any) {
// Plugin might already be registered, or command format different
log(`Plugin ${plugin} registration note: ${err.message?.split('\n')[0] || 'check manually'}`);
}
}
}
}
// Step 4: Create workspace
function setupWorkspace() {
const workspace = path.join(OPENCLAW_HOME, 'zclaw-workspace');
const dirs = ['skills', 'output', 'context'];
for (const dir of dirs) {
const fullPath = path.join(workspace, dir);
fs.mkdirSync(fullPath, { recursive: true });
}
success(`Workspace ready at ${workspace}`);
}
// Main
async function main() {
console.log('');
console.log('🦞 ZCLAW Setup');
console.log('─'.repeat(40));
console.log('');
// Step 1
log('Checking OpenClaw installation...');
const hasOpenClaw = checkOpenClaw();
if (!hasOpenClaw) {
console.log('');
console.log('Install OpenClaw first, then re-run this setup.');
process.exit(1);
}
// Step 2
console.log('');
log('Setting up configuration...');
setupConfig();
// Step 3
console.log('');
log('Registering plugins...');
registerPlugins();
// Step 4
console.log('');
log('Setting up workspace...');
setupWorkspace();
console.log('');
console.log('─'.repeat(40));
success('ZCLAW setup complete!');
console.log('');
console.log('Next steps:');
console.log(' 1. Configure API keys: openclaw configure');
console.log(' 2. Start gateway: openclaw gateway');
console.log(' 3. Launch ZCLAW desktop: cd desktop && pnpm tauri dev');
console.log('');
}
main().catch((err) => {
error(`Setup failed: ${err.message}`);
process.exit(1);
});