template-syncer 1.0.3 → 1.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (54) hide show
  1. package/README.md +146 -55
  2. package/bin/syn.js +37 -83
  3. package/lib/index.d.ts +4 -116
  4. package/lib/index.d.ts.map +1 -1
  5. package/lib/index.js +14 -1045
  6. package/lib/index.js.map +1 -1
  7. package/lib/package.json +15 -12
  8. package/lib/syncer.d.ts +65 -0
  9. package/lib/syncer.d.ts.map +1 -0
  10. package/lib/syncer.js +413 -0
  11. package/lib/syncer.js.map +1 -0
  12. package/lib/types.d.ts +95 -32
  13. package/lib/types.d.ts.map +1 -1
  14. package/lib/ui/index.d.ts +4 -0
  15. package/lib/ui/index.d.ts.map +1 -0
  16. package/lib/ui/index.js +11 -0
  17. package/lib/ui/index.js.map +1 -0
  18. package/lib/ui/logger.d.ts +26 -0
  19. package/lib/ui/logger.d.ts.map +1 -0
  20. package/lib/ui/logger.js +60 -0
  21. package/lib/ui/logger.js.map +1 -0
  22. package/lib/ui/prompts.d.ts +48 -0
  23. package/lib/ui/prompts.d.ts.map +1 -0
  24. package/lib/ui/prompts.js +202 -0
  25. package/lib/ui/prompts.js.map +1 -0
  26. package/lib/ui/tree.d.ts +10 -0
  27. package/lib/ui/tree.d.ts.map +1 -0
  28. package/lib/ui/tree.js +130 -0
  29. package/lib/ui/tree.js.map +1 -0
  30. package/lib/utils/categorizer.d.ts +24 -0
  31. package/lib/utils/categorizer.d.ts.map +1 -0
  32. package/lib/utils/categorizer.js +201 -0
  33. package/lib/utils/categorizer.js.map +1 -0
  34. package/lib/utils/git.d.ts +37 -0
  35. package/lib/utils/git.d.ts.map +1 -0
  36. package/lib/utils/git.js +98 -0
  37. package/lib/utils/git.js.map +1 -0
  38. package/lib/utils/index.d.ts +6 -0
  39. package/lib/utils/index.d.ts.map +1 -0
  40. package/lib/utils/index.js +14 -0
  41. package/lib/utils/index.js.map +1 -0
  42. package/lib/utils/merger.d.ts +40 -0
  43. package/lib/utils/merger.d.ts.map +1 -0
  44. package/lib/utils/merger.js +223 -0
  45. package/lib/utils/merger.js.map +1 -0
  46. package/lib/utils/platform.d.ts +44 -0
  47. package/lib/utils/platform.d.ts.map +1 -0
  48. package/lib/utils/platform.js +169 -0
  49. package/lib/utils/platform.js.map +1 -0
  50. package/lib/utils/scanner.d.ts +40 -0
  51. package/lib/utils/scanner.d.ts.map +1 -0
  52. package/lib/utils/scanner.js +222 -0
  53. package/lib/utils/scanner.js.map +1 -0
  54. package/package.json +15 -12
package/lib/types.d.ts CHANGED
@@ -1,35 +1,103 @@
1
- export interface FileConfig {
1
+ /**
2
+ * 文件信息
3
+ */
4
+ export interface FileInfo {
5
+ /** 相对路径 */
2
6
  path: string;
3
- fullPath?: string;
4
- type: FileType;
7
+ /** 绝对路径 */
8
+ fullPath: string;
9
+ /** 文件大小 */
10
+ size: number;
11
+ /** 是否为二进制文件 */
12
+ isBinary: boolean;
13
+ /** 文件分类 */
5
14
  category: string;
6
- description?: string;
15
+ /** 显示图标 */
16
+ icon: string;
17
+ }
18
+ /**
19
+ * 文件变更信息
20
+ */
21
+ export interface FileChange extends FileInfo {
22
+ /** 变更状态 */
23
+ status: 'new' | 'modified' | 'deleted';
24
+ /** 模板文件路径 */
25
+ templatePath: string;
26
+ /** 当前文件路径 */
27
+ currentPath: string;
28
+ /** 是否选中 */
7
29
  selected: boolean;
8
- exists?: boolean;
9
- isNew?: boolean;
10
- status?: 'new' | 'modified' | 'unchanged';
11
- templatePath?: string;
12
- currentPath?: string;
13
- icon?: string;
14
- }
15
- export type FileType = 'js' | 'json' | 'yaml' | 'text' | 'vue' | 'react' | 'angular' | 'svelte' | 'css' | 'image' | 'config';
16
- export interface TemplateSyncerOptions {
17
- tempDir?: string;
18
- templateRepo?: string;
30
+ }
31
+ /**
32
+ * 同步器配置选项
33
+ */
34
+ export interface SyncerOptions {
35
+ /** 模板仓库 URL */
36
+ repo?: string;
37
+ /** 分支名称 */
19
38
  branch?: string;
39
+ /** 临时目录 */
40
+ tempDir?: string;
41
+ /** 详细输出 */
20
42
  verbose?: boolean;
21
- filesToProcess?: FileConfig[];
43
+ /** 自定义忽略模式 */
44
+ ignore?: string[];
45
+ /** 自定义文件分类规则 */
46
+ categories?: CategoryRule[];
47
+ /** 自定义合并策略 */
48
+ mergers?: Record<string, MergeStrategy>;
49
+ /** 同步规则 */
50
+ rules?: SyncRules;
51
+ }
52
+ /**
53
+ * 同步规则配置
54
+ */
55
+ export interface SyncRules {
56
+ /** 删除本地独有文件 */
57
+ deleteOrphans?: boolean;
58
+ /** 删除匹配这些模式的本地独有文件 */
59
+ deletePatterns?: string[];
60
+ /** 保护这些文件不被删除 */
61
+ protectPatterns?: string[];
62
+ /** 同步前自动备份 */
63
+ autoBackup?: boolean;
64
+ /** 默认合并策略 */
65
+ defaultMergeStrategy?: MergeStrategy;
22
66
  }
23
- export interface FileTypeConfig {
24
- type: FileType;
67
+ /**
68
+ * 持久化配置
69
+ */
70
+ export interface SyncConfig {
71
+ repo?: string;
72
+ branch?: string;
73
+ ignore?: string[];
74
+ categories?: CategoryRule[];
75
+ mergers?: Record<string, MergeStrategy>;
76
+ /** 同步规则 */
77
+ rules?: SyncRules;
78
+ lastSync?: string;
79
+ }
80
+ /**
81
+ * 文件分类规则
82
+ */
83
+ export interface CategoryRule {
84
+ /** 匹配模式 (glob 或正则) */
85
+ match: string;
86
+ /** 分类名称 */
25
87
  category: string;
88
+ /** 显示图标 */
26
89
  icon: string;
90
+ /** 优先级 (越高越优先) */
91
+ priority?: number;
27
92
  }
28
- export interface ProcessResult {
29
- applied: boolean;
30
- message: string;
31
- }
32
- export interface BatchResults {
93
+ /**
94
+ * 合并策略
95
+ */
96
+ export type MergeStrategy = 'overwrite' | 'skip' | 'smart' | 'ask';
97
+ /**
98
+ * 批量操作结果
99
+ */
100
+ export interface BatchResult {
33
101
  success: string[];
34
102
  skipped: string[];
35
103
  failed: Array<{
@@ -37,18 +105,13 @@ export interface BatchResults {
37
105
  error: string;
38
106
  }>;
39
107
  }
108
+ /**
109
+ * 推荐操作
110
+ */
40
111
  export interface Recommendation {
41
112
  priority: 'high' | 'medium' | 'low';
42
113
  title: string;
43
114
  description: string;
44
- impact: string;
45
- files: FileConfig[];
46
- }
47
- export interface SyncConfig {
48
- templateRepo?: string;
49
- branch?: string;
50
- filesToProcess?: FileConfig[];
51
- ignorePatterns?: string[];
52
- [key: string]: any;
115
+ files: FileChange[];
53
116
  }
54
117
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,QAAQ,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,KAAK,GAAG,UAAU,GAAG,WAAW,CAAC;IAC1C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,MAAM,QAAQ,GAAG,IAAI,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,KAAK,GAAG,OAAO,GAAG,SAAS,GAAG,QAAQ,GAAG,KAAK,GAAG,OAAO,GAAG,QAAQ,CAAC;AAE7H,MAAM,WAAW,qBAAqB;IACpC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,cAAc,CAAC,EAAE,UAAU,EAAE,CAAC;CAC/B;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,QAAQ,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,MAAM,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAChD;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;IACpC,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,UAAU,EAAE,CAAC;CACrB;AAED,MAAM,WAAW,UAAU;IACzB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,cAAc,CAAC,EAAE,UAAU,EAAE,CAAC;IAC9B,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export { prompts } from './prompts';
2
+ export { logger } from './logger';
3
+ export { formatFileTree, formatGroupedTree } from './tree';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ui/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,QAAQ,CAAC"}
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.formatGroupedTree = exports.formatFileTree = exports.logger = exports.prompts = void 0;
4
+ var prompts_1 = require("./prompts");
5
+ Object.defineProperty(exports, "prompts", { enumerable: true, get: function () { return prompts_1.prompts; } });
6
+ var logger_1 = require("./logger");
7
+ Object.defineProperty(exports, "logger", { enumerable: true, get: function () { return logger_1.logger; } });
8
+ var tree_1 = require("./tree");
9
+ Object.defineProperty(exports, "formatFileTree", { enumerable: true, get: function () { return tree_1.formatFileTree; } });
10
+ Object.defineProperty(exports, "formatGroupedTree", { enumerable: true, get: function () { return tree_1.formatGroupedTree; } });
11
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/ui/index.ts"],"names":[],"mappings":";;;AAAA,qCAAoC;AAA3B,kGAAA,OAAO,OAAA;AAChB,mCAAkC;AAAzB,gGAAA,MAAM,OAAA;AACf,+BAA2D;AAAlD,sGAAA,cAAc,OAAA;AAAE,yGAAA,iBAAiB,OAAA"}
@@ -0,0 +1,26 @@
1
+ import type { BatchResult } from '../types';
2
+ /**
3
+ * 日志工具
4
+ */
5
+ export declare const logger: {
6
+ info(message: string): void;
7
+ success(message: string): void;
8
+ warn(message: string): void;
9
+ error(message: string): void;
10
+ step(message: string): void;
11
+ file(icon: string, path: string, status: string): void;
12
+ /**
13
+ * 显示操作摘要
14
+ */
15
+ summary(result: BatchResult): void;
16
+ /**
17
+ * 显示推荐列表
18
+ */
19
+ recommendations(recs: Array<{
20
+ priority: string;
21
+ title: string;
22
+ description: string;
23
+ files: unknown[];
24
+ }>): void;
25
+ };
26
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/ui/logger.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAE5C;;GAEG;AACH,eAAO,MAAM,MAAM;kBACH,MAAM,GAAG,IAAI;qBAIV,MAAM,GAAG,IAAI;kBAIhB,MAAM,GAAG,IAAI;mBAIZ,MAAM,GAAG,IAAI;kBAId,MAAM,GAAG,IAAI;eAIhB,MAAM,QAAQ,MAAM,UAAU,MAAM,GAAG,IAAI;IAItD;;OAEG;oBACa,WAAW,GAAG,IAAI;IAqBlC;;OAEG;0BACmB,KAAK,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,OAAO,EAAE,CAAA;KAAE,CAAC,GAAG,IAAI;CAW/G,CAAC"}
@@ -0,0 +1,60 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.logger = void 0;
4
+ const chalk = require('chalk');
5
+ /**
6
+ * 日志工具
7
+ */
8
+ exports.logger = {
9
+ info(message) {
10
+ console.log(chalk.blue(message));
11
+ },
12
+ success(message) {
13
+ console.log(chalk.green(`✅ ${message}`));
14
+ },
15
+ warn(message) {
16
+ console.log(chalk.yellow(`⚠️ ${message}`));
17
+ },
18
+ error(message) {
19
+ console.log(chalk.red(`❌ ${message}`));
20
+ },
21
+ step(message) {
22
+ console.log(`📋 ${message}`);
23
+ },
24
+ file(icon, path, status) {
25
+ console.log(`${icon} ${path} - ${status}`);
26
+ },
27
+ /**
28
+ * 显示操作摘要
29
+ */
30
+ summary(result) {
31
+ console.log('\n' + '='.repeat(50));
32
+ console.log('📊 操作摘要');
33
+ console.log('='.repeat(50));
34
+ console.log(`✅ 成功: ${result.success.length} 个文件`);
35
+ result.success.forEach(f => console.log(` • ${f}`));
36
+ if (result.skipped.length > 0) {
37
+ console.log(`⏭️ 跳过: ${result.skipped.length} 个文件`);
38
+ result.skipped.forEach(f => console.log(` • ${f}`));
39
+ }
40
+ if (result.failed.length > 0) {
41
+ console.log(`❌ 失败: ${result.failed.length} 个文件`);
42
+ result.failed.forEach(f => console.log(` • ${f.path}: ${f.error}`));
43
+ }
44
+ console.log('='.repeat(50) + '\n');
45
+ },
46
+ /**
47
+ * 显示推荐列表
48
+ */
49
+ recommendations(recs) {
50
+ console.log('\n📊 批量处理推荐:\n');
51
+ for (const rec of recs) {
52
+ const icon = rec.priority === 'high' ? '🔴' : rec.priority === 'medium' ? '🟡' : '🟢';
53
+ console.log(`${icon} ${rec.title}`);
54
+ console.log(` ${rec.description}`);
55
+ console.log(` 文件数: ${rec.files.length}`);
56
+ console.log('');
57
+ }
58
+ }
59
+ };
60
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/ui/logger.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,48 @@
1
+ import type { FileChange, Recommendation } from '../types';
2
+ /**
3
+ * 交互式提示工具
4
+ */
5
+ export declare const prompts: {
6
+ /**
7
+ * 输入模板仓库 URL
8
+ */
9
+ inputRepo(): Promise<string>;
10
+ /**
11
+ * 选择分支
12
+ */
13
+ selectBranch(branches: string[]): Promise<string>;
14
+ /**
15
+ * 选择处理方式
16
+ */
17
+ selectAction(): Promise<"category" | "individual" | "all" | "cancel">;
18
+ /**
19
+ * 按分类选择文件
20
+ */
21
+ selectByCategory(changes: FileChange[]): Promise<FileChange[]>;
22
+ /**
23
+ * 逐一选择文件
24
+ */
25
+ selectIndividually(changes: FileChange[]): Promise<FileChange[]>;
26
+ /**
27
+ * 确认操作
28
+ */
29
+ confirm(message: string, defaultValue?: boolean): Promise<boolean>;
30
+ /**
31
+ * 选择推荐操作
32
+ */
33
+ selectRecommendations(recommendations: Recommendation[]): Promise<Recommendation[]>;
34
+ /**
35
+ * 初始化配置向导
36
+ */
37
+ initConfig(): Promise<{
38
+ repo: string;
39
+ branch: string;
40
+ ignore: string[];
41
+ verbose: boolean;
42
+ }>;
43
+ /**
44
+ * 显示变更统计
45
+ */
46
+ showChangeSummary(changes: FileChange[]): void;
47
+ };
48
+ //# sourceMappingURL=prompts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompts.d.ts","sourceRoot":"","sources":["../../src/ui/prompts.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAK3D;;GAEG;AACH,eAAO,MAAM,OAAO;IAClB;;OAEG;iBACgB,OAAO,CAAC,MAAM,CAAC;IAUlC;;OAEG;2BAC0B,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IAiBvD;;OAEG;oBACmB,OAAO,CAAC,UAAU,GAAG,YAAY,GAAG,KAAK,GAAG,QAAQ,CAAC;IAe3E;;OAEG;8BAC6B,UAAU,EAAE,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IAuCpE;;OAEG;gCAC+B,UAAU,EAAE,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IAwBtE;;OAEG;qBACoB,MAAM,2BAAwB,OAAO,CAAC,OAAO,CAAC;IAUrE;;OAEG;2CAC0C,cAAc,EAAE,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAiBzF;;OAEG;kBACiB,OAAO,CAAC;QAC1B,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,EAAE,MAAM,EAAE,CAAC;QACjB,OAAO,EAAE,OAAO,CAAC;KAClB,CAAC;IAiCF;;OAEG;+BACwB,UAAU,EAAE,GAAG,IAAI;CAK/C,CAAC"}
@@ -0,0 +1,202 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.prompts = void 0;
7
+ const inquirer_1 = __importDefault(require("inquirer"));
8
+ const tree_1 = require("./tree");
9
+ const chalk = require('chalk');
10
+ /**
11
+ * 交互式提示工具
12
+ */
13
+ exports.prompts = {
14
+ /**
15
+ * 输入模板仓库 URL
16
+ */
17
+ async inputRepo() {
18
+ const { repo } = await inquirer_1.default.prompt([{
19
+ type: 'input',
20
+ name: 'repo',
21
+ message: '请输入模板仓库 URL:',
22
+ validate: (input) => input.trim() ? true : '仓库 URL 不能为空'
23
+ }]);
24
+ return repo;
25
+ },
26
+ /**
27
+ * 选择分支
28
+ */
29
+ async selectBranch(branches) {
30
+ if (branches.length === 0)
31
+ return 'main';
32
+ if (branches.length === 1)
33
+ return branches[0];
34
+ const { branch } = await inquirer_1.default.prompt([{
35
+ type: 'list',
36
+ name: 'branch',
37
+ message: '请选择分支:',
38
+ choices: branches.map(b => ({
39
+ name: b === 'main' || b === 'master' ? `${b} (默认)` : b,
40
+ value: b
41
+ })),
42
+ default: branches.find(b => b === 'main') || branches.find(b => b === 'master') || branches[0]
43
+ }]);
44
+ return branch;
45
+ },
46
+ /**
47
+ * 选择处理方式
48
+ */
49
+ async selectAction() {
50
+ const { action } = await inquirer_1.default.prompt([{
51
+ type: 'list',
52
+ name: 'action',
53
+ message: '选择处理方式:',
54
+ choices: [
55
+ { name: '📋 按分类选择', value: 'category' },
56
+ { name: '📝 逐一选择', value: 'individual' },
57
+ { name: '✅ 全部应用', value: 'all' },
58
+ { name: '❌ 取消', value: 'cancel' }
59
+ ]
60
+ }]);
61
+ return action;
62
+ },
63
+ /**
64
+ * 按分类选择文件
65
+ */
66
+ async selectByCategory(changes) {
67
+ // 按分类分组
68
+ const categories = new Map();
69
+ for (const file of changes) {
70
+ const list = categories.get(file.category) || [];
71
+ list.push(file);
72
+ categories.set(file.category, list);
73
+ }
74
+ const selected = [];
75
+ for (const [category, files] of categories) {
76
+ const icon = files[0].icon;
77
+ const newCount = files.filter(f => f.status === 'new').length;
78
+ const modCount = files.filter(f => f.status === 'modified').length;
79
+ const delCount = files.filter(f => f.status === 'deleted').length;
80
+ let stats = `${files.length} 个文件`;
81
+ const parts = [];
82
+ if (newCount > 0)
83
+ parts.push(`新增: ${newCount}`);
84
+ if (modCount > 0)
85
+ parts.push(`修改: ${modCount}`);
86
+ if (delCount > 0)
87
+ parts.push(`删除: ${delCount}`);
88
+ if (parts.length > 0)
89
+ stats += `, ${parts.join(', ')}`;
90
+ const { include } = await inquirer_1.default.prompt([{
91
+ type: 'confirm',
92
+ name: 'include',
93
+ message: `${icon} ${category} (${stats})`,
94
+ default: delCount === 0 // 有删除操作时默认不选中
95
+ }]);
96
+ if (include) {
97
+ selected.push(...files);
98
+ }
99
+ }
100
+ return selected;
101
+ },
102
+ /**
103
+ * 逐一选择文件
104
+ */
105
+ async selectIndividually(changes) {
106
+ const statusText = (status) => {
107
+ switch (status) {
108
+ case 'new': return '新增';
109
+ case 'modified': return '修改';
110
+ case 'deleted': return '删除';
111
+ default: return status;
112
+ }
113
+ };
114
+ const { selected } = await inquirer_1.default.prompt([{
115
+ type: 'checkbox',
116
+ name: 'selected',
117
+ message: '选择要处理的文件:',
118
+ choices: changes.map(file => ({
119
+ name: `${file.icon} ${file.path} (${statusText(file.status)})`,
120
+ value: file,
121
+ checked: file.status !== 'deleted' // 删除操作默认不选中
122
+ })),
123
+ pageSize: 15
124
+ }]);
125
+ return selected;
126
+ },
127
+ /**
128
+ * 确认操作
129
+ */
130
+ async confirm(message, defaultValue = true) {
131
+ const { confirmed } = await inquirer_1.default.prompt([{
132
+ type: 'confirm',
133
+ name: 'confirmed',
134
+ message,
135
+ default: defaultValue
136
+ }]);
137
+ return confirmed;
138
+ },
139
+ /**
140
+ * 选择推荐操作
141
+ */
142
+ async selectRecommendations(recommendations) {
143
+ const { selected } = await inquirer_1.default.prompt([{
144
+ type: 'checkbox',
145
+ name: 'selected',
146
+ message: '选择要执行的操作:',
147
+ choices: recommendations.map(rec => {
148
+ const icon = rec.priority === 'high' ? '🔴' : rec.priority === 'medium' ? '🟡' : '🟢';
149
+ return {
150
+ name: `${icon} ${rec.title} (${rec.files.length} 个文件)`,
151
+ value: rec,
152
+ checked: rec.priority === 'high'
153
+ };
154
+ })
155
+ }]);
156
+ return selected;
157
+ },
158
+ /**
159
+ * 初始化配置向导
160
+ */
161
+ async initConfig() {
162
+ return inquirer_1.default.prompt([
163
+ {
164
+ type: 'input',
165
+ name: 'repo',
166
+ message: '默认模板仓库 URL:',
167
+ default: ''
168
+ },
169
+ {
170
+ type: 'input',
171
+ name: 'branch',
172
+ message: '默认分支 (留空则每次询问):',
173
+ default: ''
174
+ },
175
+ {
176
+ type: 'checkbox',
177
+ name: 'ignore',
178
+ message: '额外忽略的文件:',
179
+ choices: [
180
+ { name: '.env.local', value: '.env.local', checked: false },
181
+ { name: 'README.md', value: 'README.md', checked: false },
182
+ { name: '.vscode/', value: '.vscode/**', checked: false }
183
+ ]
184
+ },
185
+ {
186
+ type: 'confirm',
187
+ name: 'verbose',
188
+ message: '默认启用详细输出?',
189
+ default: false
190
+ }
191
+ ]);
192
+ },
193
+ /**
194
+ * 显示变更统计
195
+ */
196
+ showChangeSummary(changes) {
197
+ console.log(`\n发现 ${chalk.bold(changes.length)} 个文件需要处理:\n`);
198
+ console.log((0, tree_1.formatGroupedTree)(changes));
199
+ console.log('');
200
+ }
201
+ };
202
+ //# sourceMappingURL=prompts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../src/ui/prompts.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { FileChange } from '../types';
2
+ /**
3
+ * 生成文件树字符串
4
+ */
5
+ export declare function formatFileTree(files: FileChange[]): string;
6
+ /**
7
+ * 按分类分组并生成树
8
+ */
9
+ export declare function formatGroupedTree(files: FileChange[]): string;
10
+ //# sourceMappingURL=tree.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tree.d.ts","sourceRoot":"","sources":["../../src/ui/tree.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AA+F3C;;GAEG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,UAAU,EAAE,GAAG,MAAM,CAO1D;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,UAAU,EAAE,GAAG,MAAM,CA8C7D"}