179 lines
4.9 KiB
TypeScript
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);
|
|
});
|