install.mjs 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. #!/usr/bin/env node
  2. /**
  3. * install.mjs —— 把 fmode-code-agent 技能装到用户级/工作区级 .claude/skills/。
  4. *
  5. * 用法:
  6. * node install.mjs install [--force] # 装到 ~/.claude/skills/fmode-code-agent/
  7. * node install.mjs workspace [--force] # 装到 ./.claude/skills/fmode-code-agent/
  8. * node install.mjs rules [dir] [--force] # 等价于 install-rules.mjs
  9. */
  10. import { mkdirSync, writeFileSync, existsSync, readFileSync } from 'node:fs';
  11. import { join, dirname, resolve } from 'node:path';
  12. import { fileURLToPath } from 'node:url';
  13. import { homedir } from 'node:os';
  14. import { execFileSync } from 'node:child_process';
  15. const __dirname = dirname(fileURLToPath(import.meta.url));
  16. const skillSrc = resolve(__dirname, '..');
  17. const args = process.argv.slice(2);
  18. const cmd = args[0] || 'install';
  19. const force = args.includes('--force');
  20. if (cmd === 'rules') {
  21. const dir = args.find((a) => a && !a.startsWith('-') && a !== 'rules') || '.';
  22. execFileSync(process.execPath, [join(__dirname, 'install-rules.mjs'), dir, ...(force ? ['--force'] : [])], { stdio: 'inherit' });
  23. process.exit(0);
  24. }
  25. const base = cmd === 'workspace' ? join(process.cwd(), '.claude') : join(homedir(), '.claude');
  26. const dest = join(base, 'skills', 'fmode-code-agent');
  27. mkdirSync(dest, { recursive: true });
  28. const files = ['SKILL.md', 'README.md', 'package.json', 'skill-package-manifest.json'];
  29. let n = 0;
  30. for (const f of files) {
  31. const s = join(skillSrc, f);
  32. if (!existsSync(s)) continue;
  33. const d = join(dest, f);
  34. if (existsSync(d) && !force) { console.log(' · 跳过(已存在)', f); continue; }
  35. writeFileSync(d, readFileSync(s)); n++;
  36. }
  37. console.log(`已安装 fmode-code-agent → ${dest}(${n} 个文件)`);
  38. console.log('提示:再跑 `node install-rules.mjs <项目目录>` 可把规则写进具体项目。');