install.js 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. #!/usr/bin/env node
  2. const fs = require('fs');
  3. const path = require('path');
  4. const os = require('os');
  5. function parseArgs(argv) {
  6. const args = { dryRun: false, list: false };
  7. for (let i = 0; i < argv.length; i++) {
  8. const token = argv[i];
  9. if (token === '--dry-run') args.dryRun = true;
  10. if (token === '--list') args.list = true;
  11. }
  12. return args;
  13. }
  14. function ensureDir(dirPath) {
  15. fs.mkdirSync(dirPath, { recursive: true });
  16. }
  17. function copyRecursive(src, dest, dryRun) {
  18. const stat = fs.statSync(src);
  19. if (stat.isDirectory()) {
  20. ensureDir(dest);
  21. for (const name of fs.readdirSync(src)) {
  22. copyRecursive(path.join(src, name), path.join(dest, name), dryRun);
  23. }
  24. return;
  25. }
  26. ensureDir(path.dirname(dest));
  27. if (!dryRun) fs.copyFileSync(src, dest);
  28. }
  29. function listSkills(skillsDir) {
  30. return fs.readdirSync(skillsDir)
  31. .filter(name => fs.existsSync(path.join(skillsDir, name, 'SKILL.md')))
  32. .sort();
  33. }
  34. function main() {
  35. const args = parseArgs(process.argv.slice(2));
  36. const suiteRoot = __dirname;
  37. const skillsDir = path.join(suiteRoot, 'skills');
  38. const skills = listSkills(skillsDir);
  39. const openclawRoot = path.join(os.homedir(), '.openclaw');
  40. const targetSkillsRoot = path.join(openclawRoot, 'skills');
  41. const targetWorkspaceRoot = path.join(openclawRoot, 'workspace', 'industry-trend-intelligence');
  42. if (args.list) {
  43. console.log(skills.join('\n'));
  44. return;
  45. }
  46. console.log(`${args.dryRun ? '[DRY-RUN] ' : ''}Installing industry-trend-intelligence`);
  47. for (const skill of skills) {
  48. const src = path.join(skillsDir, skill);
  49. const dest = path.join(targetSkillsRoot, skill);
  50. console.log(`skill: ${skill} -> ${dest}`);
  51. copyRecursive(src, dest, args.dryRun);
  52. }
  53. const workspaceItems = [
  54. 'README.md',
  55. 'deployment.md',
  56. 'openclaw-startup.md',
  57. 'skill-package-manifest.json',
  58. 'docs',
  59. 'memory-templates',
  60. 'scripts',
  61. 'install.js'
  62. ];
  63. for (const item of workspaceItems) {
  64. const src = path.join(suiteRoot, item);
  65. if (!fs.existsSync(src)) continue;
  66. const dest = path.join(targetWorkspaceRoot, item);
  67. console.log(`workspace: ${item} -> ${dest}`);
  68. copyRecursive(src, dest, args.dryRun);
  69. }
  70. console.log(args.dryRun ? 'Dry run finished.' : 'Install finished. Restart OpenClaw to reload skills.');
  71. }
  72. if (require.main === module) {
  73. try {
  74. main();
  75. } catch (error) {
  76. console.error(error && error.stack ? error.stack : String(error));
  77. process.exit(1);
  78. }
  79. }