install-workshop.js 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. #!/usr/bin/env node
  2. /**
  3. * Workshop 安装脚本
  4. * 将 workshop.zip 解压后的文件复制到 ~/.openclaw/workspace/
  5. *
  6. * 用法:
  7. * node install-workshop.js # 安装
  8. * node install-workshop.js --dry-run # 预览模式
  9. */
  10. const fs = require('fs');
  11. const os = require('os');
  12. const path = require('path');
  13. const args = process.argv.slice(2);
  14. const DRY_RUN = args.includes('--dry-run');
  15. const SRC_DIR = __dirname;
  16. const WORKSPACE_DIR = path.join(os.homedir(), '.openclaw', 'workspace');
  17. const MEMORY_DIR = path.join(WORKSPACE_DIR, 'memory');
  18. console.log('');
  19. console.log('🦐 VOC虾工作坊 安装脚本');
  20. console.log('==================================================');
  21. if (DRY_RUN) console.log(' 📌 预览模式(不会实际复制)');
  22. console.log('');
  23. // 确保目标目录存在
  24. if (!DRY_RUN) {
  25. fs.mkdirSync(WORKSPACE_DIR, { recursive: true });
  26. fs.mkdirSync(MEMORY_DIR, { recursive: true });
  27. }
  28. let copied = 0;
  29. let skipped = 0;
  30. // 复制 .md 文件到 workspace
  31. const mdFiles = fs.readdirSync(SRC_DIR).filter(f =>
  32. f.endsWith('.md') && fs.statSync(path.join(SRC_DIR, f)).isFile()
  33. );
  34. console.log('── Playbooks + Supporting Docs ──');
  35. for (const f of mdFiles) {
  36. const src = path.join(SRC_DIR, f);
  37. const dest = path.join(WORKSPACE_DIR, f);
  38. const size = fs.statSync(src).size;
  39. const sizeKB = (size / 1024).toFixed(1);
  40. if (DRY_RUN) {
  41. console.log(` 📄 ${f} (${sizeKB} KB) → ${dest}`);
  42. } else {
  43. fs.copyFileSync(src, dest);
  44. console.log(` ✅ ${f} (${sizeKB} KB)`);
  45. }
  46. copied++;
  47. }
  48. console.log('');
  49. // 复制 memory-templates
  50. const memSrcDir = path.join(SRC_DIR, 'memory-templates');
  51. if (fs.existsSync(memSrcDir)) {
  52. const jsonFiles = fs.readdirSync(memSrcDir).filter(f =>
  53. f.endsWith('.json') && fs.statSync(path.join(memSrcDir, f)).isFile()
  54. );
  55. console.log('── Memory Templates ──');
  56. for (const f of jsonFiles) {
  57. const src = path.join(memSrcDir, f);
  58. const dest = path.join(MEMORY_DIR, f);
  59. const size = fs.statSync(src).size;
  60. const sizeKB = (size / 1024).toFixed(1);
  61. if (DRY_RUN) {
  62. console.log(` 📄 ${f} (${sizeKB} KB) → ${dest}`);
  63. } else {
  64. fs.copyFileSync(src, dest);
  65. console.log(` ✅ ${f} (${sizeKB} KB)`);
  66. }
  67. copied++;
  68. }
  69. console.log('');
  70. } else {
  71. console.log(' ⚠️ memory-templates/ 目录不存在,跳过');
  72. console.log('');
  73. }
  74. console.log('==================================================');
  75. if (DRY_RUN) {
  76. console.log(` 📌 预览完成:${copied} 个文件待安装`);
  77. console.log(' 去掉 --dry-run 执行实际安装');
  78. } else {
  79. console.log(` ✅ 安装完成!共 ${copied} 个文件`);
  80. console.log(` 📂 ${WORKSPACE_DIR}`);
  81. console.log(' 🔄 请重启 OpenClaw gateway 加载新文件');
  82. }
  83. console.log('');