autosnippet
Version:
Extract code patterns into a knowledge base for AI coding assistants
107 lines (106 loc) • 3.98 kB
TypeScript
/**
* FileDeployer — 统一文件部署引擎
*
* 根据 FileManifest 中的策略,部署文件到用户项目。
* SetupService 和 UpgradeService 共享此引擎,消除所有重复代码。
*
* 策略实现:
* overwrite — mkdirSync + copyFileSync
* overwrite-dir — 递归复制目录中的所有文件
* signature-safe — safeCopyFile(签名匹配才覆盖)
* create-only — 仅在文件不存在时复制
* merge-json — 读取现有 JSON,合并 autosnippet 键,写回
* merge-gitignore — 增量追加缺失规则 + 迁移旧格式
* backup-overwrite — 备份旧文件再覆盖
* inject-marker — 在 <!-- autosnippet:begin/end --> 标记间注入
* generate — 调用自定义生成函数
*/
/** Manifest entry type */
interface ManifestEntry {
id: string;
src?: string;
dest: string | null;
strategy: string;
on: string;
category?: string;
jsonKey?: string;
chmod?: boolean;
generate?: string;
fallback?: string;
resolveDest?: string;
cleanup?: string[];
requireDir?: string;
}
export declare class FileDeployer {
force: boolean;
projectName: string;
projectRoot: string;
/** @param {{ projectRoot: string, force?: boolean }} options */
constructor({ projectRoot, force }: {
projectRoot: string;
force?: boolean;
});
/**
* 部署所有适用的文件
* @param options 可选过滤部署的 category
* @returns > }}
*/
deployAll(mode: 'setup' | 'upgrade', { filter }?: {
filter?: string[];
}): {
deployed: string[];
skipped: string[];
errors: {
id: string;
error: string;
}[];
};
/** 按 category 部署 */
deployCategory(category: string, mode: 'setup' | 'upgrade'): {
deployed: string[];
skipped: string[];
errors: {
id: string;
error: string;
}[];
};
/**
* @param entry Manifest 条目
* @returns 是否实际写入了文件
*/
_deployOne(entry: ManifestEntry, mode: 'setup' | 'upgrade'): boolean;
/** overwrite — AutoSnippet 完全拥有,始终覆盖 */
_strategyOverwrite(entry: ManifestEntry): boolean;
/** overwrite-dir — 递归覆盖目录 */
_strategyOverwriteDir(entry: ManifestEntry): boolean;
/** signature-safe — 有 AutoSnippet 签名才覆盖 */
_strategySignatureSafe(entry: ManifestEntry, mode: 'setup' | 'upgrade'): boolean;
/** create-only — 仅在不存在时创建 */
_strategyCreateOnly(entry: ManifestEntry): boolean;
/** merge-json — 读取现有 JSON,合并 autosnippet 键 */
_strategyMergeJson(entry: ManifestEntry): boolean;
/**
* merge-gitignore — section-based 管理
*
* 设计:用 BEGIN/END 标记包裹 AutoSnippet 规则块,整块替换。
* - 首次:追加 section 到文件末尾
* - 升级:替换已有 section(规则变更自动生效)
* - 迁移:清理旧版逐行追加的散落规则
*/
_strategyMergeGitignore(_entry: ManifestEntry): boolean;
/** backup-overwrite — 备份旧文件后覆盖 */
_strategyBackupOverwrite(entry: ManifestEntry): boolean;
/** inject-marker — 在 autosnippet:begin/end 标记间注入 */
_strategyInjectMarker(entry: ManifestEntry): boolean;
/** generate — 自定义生成逻辑 */
_strategyGenerate(entry: ManifestEntry): boolean;
_generators: Record<string, (this: FileDeployer) => boolean | void>;
_resolvers: Record<string, (this: FileDeployer) => string | null>;
/** 递归复制目录 */
_copyDirRecursive(srcDir: string, destDir: string, chmod?: boolean): boolean;
/** chmod +x */
_chmodExec(filePath: string): void;
/** 异步触发 Cursor Delivery Pipeline */
_triggerCursorDeliveryAsync(): Promise<void>;
}
export default FileDeployer;