coding-config 1.0.0

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 (66) hide show
  1. package/README.md +194 -0
  2. package/dist/cli.d.ts +3 -0
  3. package/dist/cli.d.ts.map +1 -0
  4. package/dist/cli.js +70 -0
  5. package/dist/cli.js.map +1 -0
  6. package/dist/commands/config.d.ts +21 -0
  7. package/dist/commands/config.d.ts.map +1 -0
  8. package/dist/commands/config.js +212 -0
  9. package/dist/commands/config.js.map +1 -0
  10. package/dist/commands/install.d.ts +5 -0
  11. package/dist/commands/install.d.ts.map +1 -0
  12. package/dist/commands/install.js +197 -0
  13. package/dist/commands/install.js.map +1 -0
  14. package/dist/commands/publish.d.ts +5 -0
  15. package/dist/commands/publish.d.ts.map +1 -0
  16. package/dist/commands/publish.js +172 -0
  17. package/dist/commands/publish.js.map +1 -0
  18. package/dist/commands/register.d.ts +5 -0
  19. package/dist/commands/register.d.ts.map +1 -0
  20. package/dist/commands/register.js +110 -0
  21. package/dist/commands/register.js.map +1 -0
  22. package/dist/commands/status.d.ts +5 -0
  23. package/dist/commands/status.d.ts.map +1 -0
  24. package/dist/commands/status.js +73 -0
  25. package/dist/commands/status.js.map +1 -0
  26. package/dist/constants.d.ts +32 -0
  27. package/dist/constants.d.ts.map +1 -0
  28. package/dist/constants.js +70 -0
  29. package/dist/constants.js.map +1 -0
  30. package/dist/index.d.ts +14 -0
  31. package/dist/index.d.ts.map +1 -0
  32. package/dist/index.js +39 -0
  33. package/dist/index.js.map +1 -0
  34. package/dist/types/index.d.ts +85 -0
  35. package/dist/types/index.d.ts.map +1 -0
  36. package/dist/types/index.js +14 -0
  37. package/dist/types/index.js.map +1 -0
  38. package/dist/utils/config.d.ts +50 -0
  39. package/dist/utils/config.d.ts.map +1 -0
  40. package/dist/utils/config.js +166 -0
  41. package/dist/utils/config.js.map +1 -0
  42. package/dist/utils/conflict.d.ts +25 -0
  43. package/dist/utils/conflict.d.ts.map +1 -0
  44. package/dist/utils/conflict.js +183 -0
  45. package/dist/utils/conflict.js.map +1 -0
  46. package/dist/utils/diff.d.ts +8 -0
  47. package/dist/utils/diff.d.ts.map +1 -0
  48. package/dist/utils/diff.js +152 -0
  49. package/dist/utils/diff.js.map +1 -0
  50. package/dist/utils/git.d.ts +73 -0
  51. package/dist/utils/git.d.ts.map +1 -0
  52. package/dist/utils/git.js +259 -0
  53. package/dist/utils/git.js.map +1 -0
  54. package/dist/utils/merge.d.ts +21 -0
  55. package/dist/utils/merge.d.ts.map +1 -0
  56. package/dist/utils/merge.js +273 -0
  57. package/dist/utils/merge.js.map +1 -0
  58. package/dist/utils/prompt.d.ts +27 -0
  59. package/dist/utils/prompt.d.ts.map +1 -0
  60. package/dist/utils/prompt.js +183 -0
  61. package/dist/utils/prompt.js.map +1 -0
  62. package/dist/utils/sync-record.d.ts +30 -0
  63. package/dist/utils/sync-record.d.ts.map +1 -0
  64. package/dist/utils/sync-record.js +151 -0
  65. package/dist/utils/sync-record.js.map +1 -0
  66. package/package.json +47 -0
@@ -0,0 +1,183 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.selectConfigLevel = selectConfigLevel;
40
+ exports.selectConflictResolution = selectConflictResolution;
41
+ exports.confirm = confirm;
42
+ exports.inputText = inputText;
43
+ exports.inputPassword = inputPassword;
44
+ const inquirer_1 = __importDefault(require("inquirer"));
45
+ const path = __importStar(require("path"));
46
+ const constants_1 = require("../constants");
47
+ /**
48
+ * 选择配置级别
49
+ */
50
+ async function selectConfigLevel() {
51
+ const { level } = await inquirer_1.default.prompt([
52
+ {
53
+ type: 'rawlist',
54
+ name: 'level',
55
+ message: '请选择配置级别:',
56
+ choices: [
57
+ { name: `个人级 (${constants_1.PERSONAL_CLAUDE_DIR})`, value: 'personal' },
58
+ { name: '项目级 (当前目录或指定路径)', value: 'project' },
59
+ ],
60
+ },
61
+ ]);
62
+ if (level === 'personal') {
63
+ return {
64
+ level: 'personal',
65
+ path: constants_1.PERSONAL_CLAUDE_DIR,
66
+ };
67
+ }
68
+ // 项目级,询问路径
69
+ const { useCurrentDir } = await inquirer_1.default.prompt([
70
+ {
71
+ type: 'confirm',
72
+ name: 'useCurrentDir',
73
+ message: '使用当前目录吗?',
74
+ default: true,
75
+ },
76
+ ]);
77
+ if (useCurrentDir) {
78
+ return {
79
+ level: 'project',
80
+ path: path.join(process.cwd(), '.claude'),
81
+ };
82
+ }
83
+ const { customPath } = await inquirer_1.default.prompt([
84
+ {
85
+ type: 'input',
86
+ name: 'customPath',
87
+ message: '请输入配置目录路径:',
88
+ validate: (input) => {
89
+ if (!input.trim()) {
90
+ return '路径不能为空';
91
+ }
92
+ return true;
93
+ },
94
+ },
95
+ ]);
96
+ return {
97
+ level: 'project',
98
+ path: path.join(customPath.trim(), '.claude'),
99
+ };
100
+ }
101
+ /**
102
+ * 选择冲突解决策略
103
+ * @param file 文件名
104
+ * @param showDiffCallback 可选的差异展示回调函数
105
+ */
106
+ async function selectConflictResolution(file, showDiffCallback) {
107
+ // 如果提供了差异展示回调,先询问是否查看差异
108
+ if (showDiffCallback) {
109
+ const { viewDiff } = await inquirer_1.default.prompt([
110
+ {
111
+ type: 'confirm',
112
+ name: 'viewDiff',
113
+ message: `是否查看文件差异?`,
114
+ default: true,
115
+ },
116
+ ]);
117
+ if (viewDiff) {
118
+ await showDiffCallback();
119
+ }
120
+ }
121
+ const { resolution } = await inquirer_1.default.prompt([
122
+ {
123
+ type: 'rawlist',
124
+ name: 'resolution',
125
+ message: `文件 "${file}" 在本地和远程都有修改,如何处理?`,
126
+ choices: [
127
+ { name: '保留本地版本', value: 'keep_local' },
128
+ { name: '保留远程版本', value: 'keep_remote' },
129
+ ],
130
+ },
131
+ ]);
132
+ return resolution;
133
+ }
134
+ /**
135
+ * 确认操作
136
+ */
137
+ async function confirm(message, defaultValue = false) {
138
+ const { confirmed } = await inquirer_1.default.prompt([
139
+ {
140
+ type: 'confirm',
141
+ name: 'confirmed',
142
+ message,
143
+ default: defaultValue,
144
+ },
145
+ ]);
146
+ return confirmed;
147
+ }
148
+ /**
149
+ * 输入文本
150
+ */
151
+ async function inputText(message, defaultValue, validate) {
152
+ const { text } = await inquirer_1.default.prompt([
153
+ {
154
+ type: 'input',
155
+ name: 'text',
156
+ message,
157
+ default: defaultValue,
158
+ validate,
159
+ },
160
+ ]);
161
+ return text;
162
+ }
163
+ /**
164
+ * 输入密码(GitHub Token)
165
+ */
166
+ async function inputPassword(message) {
167
+ const { password } = await inquirer_1.default.prompt([
168
+ {
169
+ type: 'password',
170
+ name: 'password',
171
+ message,
172
+ mask: '*',
173
+ validate: (input) => {
174
+ if (!input.trim()) {
175
+ return '不能为空';
176
+ }
177
+ return true;
178
+ },
179
+ },
180
+ ]);
181
+ return password;
182
+ }
183
+ //# sourceMappingURL=prompt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt.js","sourceRoot":"","sources":["../../src/utils/prompt.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ import { SyncRecord } from '../types';
2
+ /**
3
+ * 读取指定路径的同步记录
4
+ * @param targetPath 目标路径(如 ~/.claude 或 /project/.claude)
5
+ */
6
+ export declare function readSyncRecord(targetPath: string): Promise<SyncRecord | null>;
7
+ /**
8
+ * 更新指定路径的同步记录
9
+ * @param targetPath 目标路径(如 ~/.claude 或 /project/.claude)
10
+ * @param repoUrl 远程仓库地址
11
+ * @param syncedFiles 已同步的文件列表(相对路径)
12
+ */
13
+ export declare function updateSyncRecord(targetPath: string, repoUrl: string, syncedFiles: string[]): Promise<void>;
14
+ /**
15
+ * 检查文件是否在指定路径的同步记录中
16
+ * @param targetPath 目标路径
17
+ * @param filePath 文件相对路径
18
+ */
19
+ export declare function isFileSynced(targetPath: string, filePath: string): Promise<boolean>;
20
+ /**
21
+ * 获取指定路径的所有已同步文件列表
22
+ * @param targetPath 目标路径
23
+ */
24
+ export declare function getSyncedFiles(targetPath: string): Promise<string[]>;
25
+ /**
26
+ * 清除指定路径的同步记录
27
+ * @param targetPath 目标路径(如果不提供,清除所有记录)
28
+ */
29
+ export declare function clearSyncRecord(targetPath?: string): Promise<void>;
30
+ //# sourceMappingURL=sync-record.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync-record.d.ts","sourceRoot":"","sources":["../../src/utils/sync-record.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAuB,MAAM,UAAU,CAAC;AA8C3D;;;GAGG;AACH,wBAAsB,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAInF;AAED;;;;;GAKG;AACH,wBAAsB,gBAAgB,CACpC,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,MAAM,EAAE,GACpB,OAAO,CAAC,IAAI,CAAC,CAYf;AAED;;;;GAIG;AACH,wBAAsB,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAMzF;AAED;;;GAGG;AACH,wBAAsB,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAG1E;AAED;;;GAGG;AACH,wBAAsB,eAAe,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAiBxE"}
@@ -0,0 +1,151 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.readSyncRecord = readSyncRecord;
37
+ exports.updateSyncRecord = updateSyncRecord;
38
+ exports.isFileSynced = isFileSynced;
39
+ exports.getSyncedFiles = getSyncedFiles;
40
+ exports.clearSyncRecord = clearSyncRecord;
41
+ const fs = __importStar(require("fs-extra"));
42
+ const path = __importStar(require("path"));
43
+ /**
44
+ * 同步记录文件路径
45
+ */
46
+ const SYNC_RECORD_FILE = path.join(process.env.HOME || process.env.USERPROFILE || '', '.coding-config', 'sync-record.json');
47
+ /**
48
+ * 读取所有同步记录
49
+ */
50
+ async function readAllSyncRecords() {
51
+ try {
52
+ if (await fs.pathExists(SYNC_RECORD_FILE)) {
53
+ const data = await fs.readFile(SYNC_RECORD_FILE, 'utf-8');
54
+ return JSON.parse(data);
55
+ }
56
+ }
57
+ catch (error) {
58
+ console.error('读取同步记录失败:', error);
59
+ }
60
+ return {};
61
+ }
62
+ /**
63
+ * 写入所有同步记录
64
+ */
65
+ async function writeAllSyncRecords(records) {
66
+ try {
67
+ await fs.ensureDir(path.dirname(SYNC_RECORD_FILE));
68
+ await fs.writeFile(SYNC_RECORD_FILE, JSON.stringify(records, null, 2), 'utf-8');
69
+ }
70
+ catch (error) {
71
+ console.error('写入同步记录失败:', error);
72
+ throw error;
73
+ }
74
+ }
75
+ /**
76
+ * 规范化路径(解析为绝对路径)
77
+ */
78
+ function normalizePath(targetPath) {
79
+ return path.resolve(targetPath);
80
+ }
81
+ /**
82
+ * 读取指定路径的同步记录
83
+ * @param targetPath 目标路径(如 ~/.claude 或 /project/.claude)
84
+ */
85
+ async function readSyncRecord(targetPath) {
86
+ const normalizedPath = normalizePath(targetPath);
87
+ const allRecords = await readAllSyncRecords();
88
+ return allRecords[normalizedPath] || null;
89
+ }
90
+ /**
91
+ * 更新指定路径的同步记录
92
+ * @param targetPath 目标路径(如 ~/.claude 或 /project/.claude)
93
+ * @param repoUrl 远程仓库地址
94
+ * @param syncedFiles 已同步的文件列表(相对路径)
95
+ */
96
+ async function updateSyncRecord(targetPath, repoUrl, syncedFiles) {
97
+ const normalizedPath = normalizePath(targetPath);
98
+ const allRecords = await readAllSyncRecords();
99
+ const record = {
100
+ lastSyncTime: new Date().toISOString(),
101
+ syncedFiles,
102
+ repoUrl,
103
+ };
104
+ allRecords[normalizedPath] = record;
105
+ await writeAllSyncRecords(allRecords);
106
+ }
107
+ /**
108
+ * 检查文件是否在指定路径的同步记录中
109
+ * @param targetPath 目标路径
110
+ * @param filePath 文件相对路径
111
+ */
112
+ async function isFileSynced(targetPath, filePath) {
113
+ const record = await readSyncRecord(targetPath);
114
+ if (!record) {
115
+ return false;
116
+ }
117
+ return record.syncedFiles.includes(filePath);
118
+ }
119
+ /**
120
+ * 获取指定路径的所有已同步文件列表
121
+ * @param targetPath 目标路径
122
+ */
123
+ async function getSyncedFiles(targetPath) {
124
+ const record = await readSyncRecord(targetPath);
125
+ return record?.syncedFiles || [];
126
+ }
127
+ /**
128
+ * 清除指定路径的同步记录
129
+ * @param targetPath 目标路径(如果不提供,清除所有记录)
130
+ */
131
+ async function clearSyncRecord(targetPath) {
132
+ try {
133
+ if (targetPath) {
134
+ // 清除指定路径的记录
135
+ const normalizedPath = normalizePath(targetPath);
136
+ const allRecords = await readAllSyncRecords();
137
+ delete allRecords[normalizedPath];
138
+ await writeAllSyncRecords(allRecords);
139
+ }
140
+ else {
141
+ // 清除所有记录
142
+ if (await fs.pathExists(SYNC_RECORD_FILE)) {
143
+ await fs.remove(SYNC_RECORD_FILE);
144
+ }
145
+ }
146
+ }
147
+ catch (error) {
148
+ console.error('清除同步记录失败:', error);
149
+ }
150
+ }
151
+ //# sourceMappingURL=sync-record.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync-record.js","sourceRoot":"","sources":["../../src/utils/sync-record.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,47 @@
1
+ {
2
+ "name": "coding-config",
3
+ "version": "1.0.0",
4
+ "description": "CLI tool for managing and syncing coding configurations across teams",
5
+ "main": "dist/index.js",
6
+ "bin": {
7
+ "coding-config": "dist/cli.js"
8
+ },
9
+ "scripts": {
10
+ "build": "tsc",
11
+ "dev": "tsx src/cli.ts",
12
+ "test": "NODE_OPTIONS='--max-old-space-size=4096' jest",
13
+ "test:watch": "NODE_OPTIONS='--max-old-space-size=4096' jest --watch",
14
+ "test:coverage": "NODE_OPTIONS='--max-old-space-size=4096' jest --coverage",
15
+ "prepublishOnly": "npm run build",
16
+ "clean": "rm -rf dist"
17
+ },
18
+ "keywords": [
19
+ "claude",
20
+ "config",
21
+ "cli",
22
+ "team",
23
+ "configuration"
24
+ ],
25
+ "author": "",
26
+ "license": "MIT",
27
+ "dependencies": {
28
+ "@octokit/rest": "^22.0.1",
29
+ "chalk": "^5.6.2",
30
+ "commander": "^14.0.2",
31
+ "fs-extra": "^11.3.3",
32
+ "inquirer": "^13.1.0",
33
+ "ora": "^9.0.0",
34
+ "simple-git": "^3.30.0",
35
+ "trash": "^10.0.1"
36
+ },
37
+ "devDependencies": {
38
+ "@types/fs-extra": "^11.0.4",
39
+ "@types/inquirer": "^9.0.9",
40
+ "@types/jest": "^30.0.0",
41
+ "@types/node": "^25.0.3",
42
+ "jest": "^29.7.0",
43
+ "ts-jest": "^29.4.6",
44
+ "tsx": "^4.21.0",
45
+ "typescript": "^5.9.3"
46
+ }
47
+ }