UNPKG

autosnippet

Version:

Extract code patterns into a knowledge base for AI coding assistants

84 lines (83 loc) 3.11 kB
/** * UpgradeService — IDE 集成升级服务 * * 当 AutoSnippet 发布新版本后,老用户执行 `asd upgrade` 即可更新所有 IDE 集成文件。 * 底层委托 FileDeployer 按 MANIFEST 定义的策略执行,确保与 SetupService 使用同一套部署逻辑。 * * 额外职责: * - Skills 路径迁移(.autosnippet/skills/ → AutoSnippet/skills/) */ import { execSync } from 'node:child_process'; import { existsSync, mkdirSync, readdirSync } from 'node:fs'; import { join, resolve } from 'node:path'; import { DEFAULT_KNOWLEDGE_BASE_DIR } from '../shared/ProjectMarkers.js'; import { FileDeployer } from './deploy/FileDeployer.js'; export class UpgradeService { projectRoot; projectName; constructor(options) { this.projectRoot = resolve(options.projectRoot); this.projectName = this.projectRoot.split('/').pop() || ''; } async run({ skillsOnly = false, mcpOnly = false } = {}) { const deployer = new FileDeployer({ projectRoot: this.projectRoot, force: false, }); let filter; if (skillsOnly) { filter = ['skills']; } else if (mcpOnly) { filter = ['mcp']; } const { deployed, skipped, errors } = deployer.deployAll('upgrade', { filter }); if (errors.length > 0) { for (const { id, error } of errors) { console.error(` ⚠ ${id}: ${error}`); } } // Skills 路径迁移(一次性操作,不属于文件部署) if (!skillsOnly && !mcpOnly) { this._migrateSkillsPath(); } return { deployed, skipped, errors }; } /* ═══ Skills 路径迁移 ═══════════════════════════════ */ _migrateSkillsPath() { const oldSkillsDir = join(this.projectRoot, '.autosnippet', 'skills'); const newSkillsDir = join(this.projectRoot, DEFAULT_KNOWLEDGE_BASE_DIR, 'skills'); if (!existsSync(oldSkillsDir)) { return; } if (!existsSync(join(this.projectRoot, DEFAULT_KNOWLEDGE_BASE_DIR))) { return; } try { mkdirSync(newSkillsDir, { recursive: true }); const entries = readdirSync(oldSkillsDir, { withFileTypes: true }); let migrated = 0; for (const entry of entries) { if (!entry.isDirectory()) { continue; } const src = join(oldSkillsDir, entry.name); const dest = join(newSkillsDir, entry.name); if (existsSync(dest)) { continue; } // 复制目录 execSync(`cp -r "${src}" "${dest}"`, { stdio: 'pipe' }); migrated++; } if (migrated > 0) { } else { } } catch (e) { console.error(` ❌ 迁移失败: ${e.message}`); } } } export default UpgradeService;