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,197 @@
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.installCommand = installCommand;
40
+ const chalk_1 = __importDefault(require("chalk"));
41
+ const ora_1 = __importDefault(require("ora"));
42
+ const path = __importStar(require("path"));
43
+ const fs = __importStar(require("fs-extra"));
44
+ const config_1 = require("../utils/config");
45
+ const git_1 = require("../utils/git");
46
+ const prompt_1 = require("../utils/prompt");
47
+ const conflict_1 = require("../utils/conflict");
48
+ const sync_record_1 = require("../utils/sync-record");
49
+ const diff_1 = require("../utils/diff");
50
+ const types_1 = require("../types");
51
+ const constants_1 = require("../constants");
52
+ /**
53
+ * 递归获取目录下所有文件的相对路径
54
+ */
55
+ async function getAllFilesRecursive(dir, baseDir = dir) {
56
+ const files = [];
57
+ const entries = await fs.readdir(dir, { withFileTypes: true });
58
+ for (const entry of entries) {
59
+ const fullPath = path.join(dir, entry.name);
60
+ if (entry.isDirectory()) {
61
+ const subFiles = await getAllFilesRecursive(fullPath, baseDir);
62
+ files.push(...subFiles);
63
+ }
64
+ else {
65
+ files.push(path.relative(baseDir, fullPath));
66
+ }
67
+ }
68
+ return files;
69
+ }
70
+ /**
71
+ * 安装配置
72
+ */
73
+ async function installCommand(teamName) {
74
+ const spinner = (0, ora_1.default)('正在准备安装配置...').start();
75
+ try {
76
+ // 确定要安装的团队
77
+ if (!teamName) {
78
+ teamName = await (0, config_1.getRegisteredTeam)();
79
+ if (!teamName) {
80
+ spinner.fail(chalk_1.default.red('未指定团队名称,且未注册团队。请先运行 register 命令或指定团队名称。'));
81
+ process.exit(1);
82
+ }
83
+ }
84
+ spinner.text = `正在安装 ${teamName} 配置...`;
85
+ // 获取仓库 URL
86
+ const repoUrl = await (0, config_1.getRepoUrl)();
87
+ // 选择配置级别
88
+ spinner.stop();
89
+ const { path: targetPath } = await (0, prompt_1.selectConfigLevel)();
90
+ spinner.start('正在克隆仓库...');
91
+ // 克隆仓库到临时目录
92
+ const tempDir = (0, git_1.createTempDir)();
93
+ try {
94
+ await (0, git_1.cloneRepo)(repoUrl, tempDir);
95
+ // 检查团队配置是否存在
96
+ const teamPath = path.join(tempDir, teamName);
97
+ if (!(await fs.pathExists(teamPath))) {
98
+ spinner.fail(chalk_1.default.red(`团队配置 "${teamName}" 不存在于远程仓库`));
99
+ process.exit(1);
100
+ }
101
+ spinner.text = '正在检测冲突...';
102
+ // 检测每个配置目录的冲突
103
+ const allConflicts = [];
104
+ // 记录用户对每个冲突文件的决策
105
+ const conflictResolutions = new Map();
106
+ for (const dir of constants_1.CONFIG_DIRS) {
107
+ const remoteDir = path.join(teamPath, dir);
108
+ const localDir = path.join(targetPath, dir);
109
+ if (await fs.pathExists(remoteDir)) {
110
+ const conflicts = await (0, conflict_1.detectConflicts)(localDir, remoteDir, targetPath, dir);
111
+ allConflicts.push(...conflicts.map(c => ({ ...c, dir })));
112
+ }
113
+ }
114
+ // 处理冲突
115
+ if (allConflicts.length > 0) {
116
+ spinner.stop();
117
+ console.log(chalk_1.default.yellow(`\n检测到 ${allConflicts.length} 个冲突文件:\n`));
118
+ for (const conflict of allConflicts) {
119
+ // 构建完整的相对路径(包含配置目录)
120
+ const fullRelativePath = path.join(conflict.dir, conflict.file);
121
+ if (conflict.type === types_1.ConflictType.RemoteDeleted) {
122
+ console.log(chalk_1.default.red(` - ${fullRelativePath} (远程已删除)`));
123
+ // 删除本地文件
124
+ await (0, conflict_1.deleteFile)(conflict.localPath);
125
+ }
126
+ else if (conflict.type === types_1.ConflictType.BothModified) {
127
+ console.log(chalk_1.default.yellow(` - ${fullRelativePath} (本地和远程都有修改)`));
128
+ // 交互式选择,提供差异展示功能
129
+ const resolution = await (0, prompt_1.selectConflictResolution)(fullRelativePath, async () => {
130
+ await (0, diff_1.showFileDiff)(conflict.localPath, conflict.remotePath, fullRelativePath);
131
+ });
132
+ conflictResolutions.set(fullRelativePath, resolution);
133
+ if (resolution === 'keep_local') {
134
+ console.log(chalk_1.default.gray(' 保留本地版本'));
135
+ }
136
+ else if (resolution === 'keep_remote') {
137
+ console.log(chalk_1.default.gray(' 使用远程版本'));
138
+ await (0, conflict_1.copyFile)(conflict.remotePath, conflict.localPath);
139
+ }
140
+ }
141
+ }
142
+ spinner.start('正在同步配置...');
143
+ }
144
+ // 复制配置文件
145
+ spinner.text = '正在复制配置文件...';
146
+ await fs.ensureDir(targetPath);
147
+ for (const dir of constants_1.CONFIG_DIRS) {
148
+ const remoteDir = path.join(teamPath, dir);
149
+ const localDir = path.join(targetPath, dir);
150
+ if (await fs.pathExists(remoteDir)) {
151
+ // 复制目录,但需要尊重用户的冲突解决决策
152
+ const files = await fs.readdir(remoteDir, { withFileTypes: true });
153
+ for (const file of files) {
154
+ const srcPath = path.join(remoteDir, file.name);
155
+ const destPath = path.join(localDir, file.name);
156
+ const fullRelativePath = path.join(dir, file.name);
157
+ // 检查用户对此文件的决策
158
+ const userResolution = conflictResolutions.get(fullRelativePath);
159
+ // 如果用户选择保留本地,跳过此文件
160
+ if (userResolution === 'keep_local') {
161
+ continue;
162
+ }
163
+ // 如果用户选择使用远程版本,或者文件不冲突,则复制
164
+ if (file.isDirectory()) {
165
+ await (0, conflict_1.copyDir)(srcPath, destPath);
166
+ }
167
+ else {
168
+ await (0, conflict_1.copyFile)(srcPath, destPath);
169
+ }
170
+ }
171
+ }
172
+ }
173
+ // 更新同步记录
174
+ spinner.text = '正在更新同步记录...';
175
+ const syncedFiles = [];
176
+ // 记录从远程同步的文件(扫描远程团队目录)
177
+ for (const dir of constants_1.CONFIG_DIRS) {
178
+ const remoteDir = path.join(teamPath, dir);
179
+ if (await fs.pathExists(remoteDir)) {
180
+ const files = await getAllFilesRecursive(remoteDir, teamPath);
181
+ syncedFiles.push(...files);
182
+ }
183
+ }
184
+ await (0, sync_record_1.updateSyncRecord)(targetPath, repoUrl, syncedFiles);
185
+ spinner.succeed(chalk_1.default.green(`成功安装配置到 ${targetPath}`));
186
+ }
187
+ finally {
188
+ await (0, git_1.cleanupTempDir)(tempDir);
189
+ }
190
+ }
191
+ catch (error) {
192
+ spinner.fail(chalk_1.default.red('安装失败'));
193
+ console.error(error);
194
+ process.exit(1);
195
+ }
196
+ }
197
+ //# sourceMappingURL=install.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"install.js","sourceRoot":"","sources":["../../src/commands/install.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * 发布配置
3
+ */
4
+ export declare function publishCommand(): Promise<void>;
5
+ //# sourceMappingURL=publish.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"publish.d.ts","sourceRoot":"","sources":["../../src/commands/publish.ts"],"names":[],"mappings":"AAqBA;;GAEG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CA8IpD"}
@@ -0,0 +1,172 @@
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.publishCommand = publishCommand;
40
+ const chalk_1 = __importDefault(require("chalk"));
41
+ const ora_1 = __importDefault(require("ora"));
42
+ const path = __importStar(require("path"));
43
+ const fs = __importStar(require("fs-extra"));
44
+ const config_1 = require("../utils/config");
45
+ const git_1 = require("../utils/git");
46
+ const prompt_1 = require("../utils/prompt");
47
+ const conflict_1 = require("../utils/conflict");
48
+ const constants_1 = require("../constants");
49
+ /**
50
+ * 发布配置
51
+ */
52
+ async function publishCommand() {
53
+ const spinner = (0, ora_1.default)('正在准备发布配置...').start();
54
+ try {
55
+ // 获取已注册的团队
56
+ const teamName = await (0, config_1.getRegisteredTeam)();
57
+ if (!teamName) {
58
+ spinner.fail(chalk_1.default.red('未注册团队。请先运行 register 命令。'));
59
+ process.exit(1);
60
+ }
61
+ // 获取仓库 URL
62
+ const repoUrl = await (0, config_1.getRepoUrl)();
63
+ // 获取 CardID(如果已配置)
64
+ const cardId = await (0, config_1.getCardId)();
65
+ // 判断仓库类型
66
+ const useGithubFlow = (0, git_1.isGithubRepo)(repoUrl);
67
+ const useGerritFlow = (0, git_1.isGerritRepo)(repoUrl);
68
+ // 如果是 GitHub 仓库,需要检查 Token
69
+ let githubToken;
70
+ if (useGithubFlow) {
71
+ githubToken = await (0, config_1.getGithubToken)();
72
+ if (!githubToken) {
73
+ spinner.stop();
74
+ console.log(chalk_1.default.yellow('GitHub 仓库需要 Token(用于创建 Pull Request)'));
75
+ console.log(chalk_1.default.gray('请访问 https://github.com/settings/tokens 创建 Token'));
76
+ console.log(chalk_1.default.gray('需要权限: repo\n'));
77
+ githubToken = await (0, prompt_1.inputPassword)('请输入 GitHub Token:');
78
+ await (0, config_1.setGithubToken)(githubToken);
79
+ spinner.start('正在准备发布...');
80
+ }
81
+ }
82
+ // 选择发布来源
83
+ spinner.stop();
84
+ const { path: sourcePath } = await (0, prompt_1.selectConfigLevel)();
85
+ spinner.start('正在检查配置...');
86
+ // 检查源路径是否存在
87
+ if (!(await fs.pathExists(sourcePath))) {
88
+ spinner.fail(chalk_1.default.red(`配置目录不存在: ${sourcePath}`));
89
+ process.exit(1);
90
+ }
91
+ // 克隆仓库到临时目录
92
+ spinner.text = '正在克隆仓库...';
93
+ const tempDir = (0, git_1.createTempDir)();
94
+ try {
95
+ await (0, git_1.cloneRepo)(repoUrl, tempDir);
96
+ // 创建新分支
97
+ const timestamp = Date.now();
98
+ const branchName = `update/${teamName}-${timestamp}`;
99
+ spinner.text = `正在创建分支 ${branchName}...`;
100
+ await (0, git_1.createBranch)(tempDir, branchName);
101
+ // 复制配置文件到团队目录
102
+ spinner.text = '正在复制配置文件...';
103
+ const teamPath = path.join(tempDir, teamName);
104
+ await fs.ensureDir(teamPath);
105
+ for (const dir of constants_1.CONFIG_DIRS) {
106
+ const sourceDir = path.join(sourcePath, dir);
107
+ const destDir = path.join(teamPath, dir);
108
+ if (await fs.pathExists(sourceDir)) {
109
+ await (0, conflict_1.copyDir)(sourceDir, destDir);
110
+ }
111
+ }
112
+ // 提交变更
113
+ spinner.text = '正在提交变更...';
114
+ const commitMessage = `Update ${teamName} configuration
115
+
116
+ Auto-generated commit from coding-config CLI
117
+ Timestamp: ${new Date().toISOString()}`;
118
+ await (0, git_1.commitChanges)(tempDir, commitMessage, repoUrl, cardId);
119
+ // 根据仓库类型选择推送方式
120
+ if (useGerritFlow) {
121
+ // Gerrit/iCode 流程:直接推送到 refs/for/master
122
+ spinner.text = '正在推送到远程并发起 Code Review...';
123
+ await (0, git_1.pushForReview)(tempDir, 'master');
124
+ spinner.succeed(chalk_1.default.green('发布成功!'));
125
+ console.log('');
126
+ console.log(chalk_1.default.cyan('已发起 Code Review,请到代码审查系统查看并审核。'));
127
+ console.log('');
128
+ console.log(chalk_1.default.yellow('等待审核通过后,其他成员可通过 install 命令获取更新。'));
129
+ }
130
+ else if (useGithubFlow && githubToken) {
131
+ // GitHub 流程:推送分支 + 创建 PR
132
+ spinner.text = '正在推送到远程...';
133
+ await (0, git_1.pushToRemote)(tempDir, branchName);
134
+ spinner.text = '正在创建 Pull Request...';
135
+ const prTitle = `Update ${teamName} configuration`;
136
+ const prBody = `## 配置更新
137
+
138
+ **团队:** ${teamName}
139
+ **时间:** ${new Date().toLocaleString()}
140
+ **来源:** ${sourcePath}
141
+
142
+ 此 PR 由 coding-config CLI 自动创建。
143
+
144
+ 请团队成员 Review 后合并。`;
145
+ const prUrl = await (0, git_1.createPullRequest)(repoUrl, branchName, prTitle, prBody, githubToken);
146
+ spinner.succeed(chalk_1.default.green('发布成功!'));
147
+ console.log('');
148
+ console.log(chalk_1.default.cyan('Pull Request URL:'), chalk_1.default.underline(prUrl));
149
+ console.log('');
150
+ console.log(chalk_1.default.yellow('请等待 Review 和合并后,其他成员可通过 install 命令获取更新。'));
151
+ }
152
+ else {
153
+ // 默认流程:只推送分支
154
+ spinner.text = '正在推送到远程...';
155
+ await (0, git_1.pushToRemote)(tempDir, branchName);
156
+ spinner.succeed(chalk_1.default.green('发布成功!'));
157
+ console.log('');
158
+ console.log(chalk_1.default.cyan(`已推送分支: ${branchName}`));
159
+ console.log(chalk_1.default.yellow('请手动创建 Pull Request 或 Code Review。'));
160
+ }
161
+ }
162
+ finally {
163
+ await (0, git_1.cleanupTempDir)(tempDir);
164
+ }
165
+ }
166
+ catch (error) {
167
+ spinner.fail(chalk_1.default.red('发布失败'));
168
+ console.error(error);
169
+ process.exit(1);
170
+ }
171
+ }
172
+ //# sourceMappingURL=publish.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"publish.js","sourceRoot":"","sources":["../../src/commands/publish.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * 注册团队配置
3
+ */
4
+ export declare function registerCommand(teamName: string): Promise<void>;
5
+ //# sourceMappingURL=register.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"register.d.ts","sourceRoot":"","sources":["../../src/commands/register.ts"],"names":[],"mappings":"AAmBA;;GAEG;AACH,wBAAsB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAgHrE"}
@@ -0,0 +1,110 @@
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.registerCommand = registerCommand;
7
+ const chalk_1 = __importDefault(require("chalk"));
8
+ const ora_1 = __importDefault(require("ora"));
9
+ const config_1 = require("../utils/config");
10
+ const git_1 = require("../utils/git");
11
+ const prompt_1 = require("../utils/prompt");
12
+ /**
13
+ * 注册团队配置
14
+ */
15
+ async function registerCommand(teamName) {
16
+ const spinner = (0, ora_1.default)('正在注册团队配置...').start();
17
+ try {
18
+ // 验证团队名称
19
+ if (!teamName || !teamName.trim()) {
20
+ spinner.fail('团队名称不能为空');
21
+ process.exit(1);
22
+ }
23
+ teamName = teamName.trim();
24
+ // 获取仓库 URL
25
+ const repoUrl = await (0, config_1.getRepoUrl)();
26
+ // 获取 CardID(如果已配置)
27
+ const cardId = await (0, config_1.getCardId)();
28
+ // 克隆仓库到临时目录验证团队是否存在
29
+ spinner.text = '正在验证团队配置...';
30
+ const tempDir = (0, git_1.createTempDir)();
31
+ try {
32
+ await (0, git_1.cloneRepo)(repoUrl, tempDir);
33
+ // 检查团队目录是否存在
34
+ const teamExists = await (0, git_1.checkTeamExists)(tempDir, teamName);
35
+ if (!teamExists) {
36
+ spinner.text = `团队 "${teamName}" 不存在,正在创建...`;
37
+ // 创建新分支
38
+ const branchName = `team/${teamName}/init`;
39
+ await (0, git_1.createBranch)(tempDir, branchName);
40
+ // 创建团队目录结构
41
+ await (0, git_1.createTeamDirectory)(tempDir, teamName);
42
+ // 提交变更(传入 repoUrl 和 cardId)
43
+ await (0, git_1.commitChanges)(tempDir, `feat: 初始化团队 ${teamName} 的配置目录结构`, repoUrl, cardId);
44
+ // 判断仓库类型并选择推送方式
45
+ const useGithubFlow = (0, git_1.isGithubRepo)(repoUrl);
46
+ const useGerritFlow = (0, git_1.isGerritRepo)(repoUrl);
47
+ if (useGerritFlow) {
48
+ // Gerrit/iCode 流程:推送到 refs/for/master
49
+ spinner.text = '正在推送到远程并发起 Code Review...';
50
+ await (0, git_1.pushForReview)(tempDir, 'master');
51
+ spinner.succeed(chalk_1.default.green(`成功创建团队 ${teamName} 并发起 Code Review`));
52
+ console.log('');
53
+ console.log(chalk_1.default.cyan('已推送到远程仓库,请到代码审查系统查看并审核。'));
54
+ console.log('');
55
+ }
56
+ else if (useGithubFlow) {
57
+ // GitHub 流程:推送分支 + 创建 PR
58
+ spinner.text = '正在推送到远程仓库...';
59
+ await (0, git_1.pushToRemote)(tempDir, branchName);
60
+ // 尝试创建 PR(如果配置了 Token)
61
+ try {
62
+ let githubToken = await (0, config_1.getGithubToken)();
63
+ if (!githubToken) {
64
+ spinner.stop();
65
+ console.log(chalk_1.default.yellow('GitHub 仓库需要 Token(用于创建 Pull Request)'));
66
+ console.log(chalk_1.default.gray('请访问 https://github.com/settings/tokens 创建 Token'));
67
+ console.log(chalk_1.default.gray('需要权限: repo\n'));
68
+ githubToken = await (0, prompt_1.inputPassword)('请输入 GitHub Token:');
69
+ await (0, config_1.setGithubToken)(githubToken);
70
+ spinner.start('正在创建 Pull Request...');
71
+ }
72
+ const prUrl = await (0, git_1.createPullRequest)(repoUrl, branchName, `初始化团队 ${teamName} 配置`, `自动创建团队 ${teamName} 的配置目录结构,包含以下目录:\n\n- commands/\n- hooks/\n- skills/\n- agents/\n\n请审核后合并。`, githubToken);
73
+ spinner.succeed(chalk_1.default.green(`成功创建团队并发起 Pull Request`));
74
+ console.log('');
75
+ console.log(chalk_1.default.cyan('Pull Request URL:'), chalk_1.default.underline(prUrl));
76
+ console.log('');
77
+ }
78
+ catch (prError) {
79
+ spinner.warn(chalk_1.default.yellow(`创建 Pull Request 失败,已推送分支 ${branchName}`));
80
+ console.error(chalk_1.default.red('错误:'), prError.message);
81
+ console.log(chalk_1.default.gray('请手动创建 Pull Request。'));
82
+ }
83
+ }
84
+ else {
85
+ // 默认流程:只推送分支
86
+ spinner.text = '正在推送到远程仓库...';
87
+ await (0, git_1.pushToRemote)(tempDir, branchName);
88
+ spinner.succeed(chalk_1.default.green(`已推送分支 ${branchName}`));
89
+ console.log('');
90
+ console.log(chalk_1.default.yellow('请手动创建 Pull Request 或 Code Review。'));
91
+ }
92
+ spinner.succeed(chalk_1.default.green(`成功创建并注册团队: ${teamName}`));
93
+ }
94
+ else {
95
+ spinner.succeed(chalk_1.default.green(`成功注册已存在的团队: ${teamName}`));
96
+ }
97
+ // 保存到配置
98
+ await (0, config_1.setRegisteredTeam)(teamName);
99
+ }
100
+ finally {
101
+ await (0, git_1.cleanupTempDir)(tempDir);
102
+ }
103
+ }
104
+ catch (error) {
105
+ spinner.fail(chalk_1.default.red('注册失败'));
106
+ console.error(error);
107
+ process.exit(1);
108
+ }
109
+ }
110
+ //# sourceMappingURL=register.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"register.js","sourceRoot":"","sources":["../../src/commands/register.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * 查看当前配置状态
3
+ */
4
+ export declare function statusCommand(): Promise<void>;
5
+ //# sourceMappingURL=status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAKA;;GAEG;AACH,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CA2DnD"}
@@ -0,0 +1,73 @@
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.statusCommand = statusCommand;
7
+ const chalk_1 = __importDefault(require("chalk"));
8
+ const config_1 = require("../utils/config");
9
+ const constants_1 = require("../constants");
10
+ const git_1 = require("../utils/git");
11
+ /**
12
+ * 查看当前配置状态
13
+ */
14
+ async function statusCommand() {
15
+ try {
16
+ const config = await (0, config_1.readConfig)();
17
+ console.log(chalk_1.default.bold('\n📋 Coding Config 状态\n'));
18
+ console.log(chalk_1.default.cyan('配置文件路径:'), constants_1.CONFIG_FILE);
19
+ console.log(chalk_1.default.cyan('个人配置目录:'), constants_1.PERSONAL_CLAUDE_DIR);
20
+ console.log('');
21
+ // 已注册团队
22
+ if (config.registeredTeam) {
23
+ console.log(chalk_1.default.green('✓'), chalk_1.default.cyan('已注册团队:'), chalk_1.default.bold(config.registeredTeam));
24
+ }
25
+ else {
26
+ console.log(chalk_1.default.yellow('!'), chalk_1.default.cyan('已注册团队:'), chalk_1.default.gray('未注册'));
27
+ }
28
+ // 仓库地址
29
+ console.log(chalk_1.default.cyan('仓库地址:'), config.repoUrl);
30
+ // 判断仓库类型
31
+ const isGerrit = (0, git_1.isGerritRepo)(config.repoUrl);
32
+ const isGitHub = (0, git_1.isGithubRepo)(config.repoUrl);
33
+ console.log('');
34
+ // iCafe CardID (Gerrit 仓库需要)
35
+ if (config.cardId) {
36
+ console.log(chalk_1.default.green('✓'), chalk_1.default.cyan('iCafe CardID:'), chalk_1.default.bold(config.cardId));
37
+ }
38
+ else {
39
+ if (isGerrit) {
40
+ console.log(chalk_1.default.red('✗'), chalk_1.default.cyan('iCafe CardID:'), chalk_1.default.gray('未设置'));
41
+ console.log(chalk_1.default.yellow(' ⚠️ 警告: Gerrit/iCode 仓库需要配置 CardID,否则可能无法发布配置'));
42
+ console.log(chalk_1.default.gray(' 提示: 运行'), chalk_1.default.cyan('coding-config config card-id <卡片ID>'), chalk_1.default.gray('进行配置'));
43
+ }
44
+ else {
45
+ console.log(chalk_1.default.gray('○'), chalk_1.default.cyan('iCafe CardID:'), chalk_1.default.gray('未设置 (非 Gerrit 仓库,无需配置)'));
46
+ }
47
+ }
48
+ // GitHub Token (GitHub 仓库需要)
49
+ if (config.githubToken) {
50
+ const maskedToken = config.githubToken.substring(0, 4) + '****' + config.githubToken.substring(config.githubToken.length - 4);
51
+ console.log(chalk_1.default.green('✓'), chalk_1.default.cyan('GitHub Token:'), maskedToken);
52
+ }
53
+ else {
54
+ if (isGitHub) {
55
+ console.log(chalk_1.default.red('✗'), chalk_1.default.cyan('GitHub Token:'), chalk_1.default.gray('未设置'));
56
+ console.log(chalk_1.default.yellow(' ⚠️ 警告: GitHub 仓库需要配置 Token 才能自动创建 PR'));
57
+ console.log(chalk_1.default.gray(' 提示: 运行'), chalk_1.default.cyan('coding-config config github-token <token>'), chalk_1.default.gray('进行配置'));
58
+ }
59
+ else if (isGerrit) {
60
+ console.log(chalk_1.default.gray('○'), chalk_1.default.cyan('GitHub Token:'), chalk_1.default.gray('未设置 (Gerrit 仓库,无需配置)'));
61
+ }
62
+ else {
63
+ console.log(chalk_1.default.yellow('!'), chalk_1.default.cyan('GitHub Token:'), chalk_1.default.gray('未设置'));
64
+ }
65
+ }
66
+ console.log('');
67
+ }
68
+ catch (error) {
69
+ console.error(chalk_1.default.red('获取状态失败:'), error);
70
+ process.exit(1);
71
+ }
72
+ }
73
+ //# sourceMappingURL=status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":";;;;;AAQA,sCA2DC;AAnED,kDAA0B;AAC1B,4CAA6C;AAC7C,4CAAgE;AAChE,sCAA0D;AAE1D;;GAEG;AACI,KAAK,UAAU,aAAa;IACjC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,IAAA,mBAAU,GAAE,CAAC;QAElC,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC,CAAC;QACnD,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,uBAAW,CAAC,CAAC;QAChD,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,+BAAmB,CAAC,CAAC;QACxD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAEhB,QAAQ;QACR,IAAI,MAAM,CAAC,cAAc,EAAE,CAAC;YAC1B,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,eAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,eAAK,CAAC,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC;QACzF,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,eAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,eAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;QAC1E,CAAC;QAED,OAAO;QACP,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;QAEjD,SAAS;QACT,MAAM,QAAQ,GAAG,IAAA,kBAAY,EAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAC9C,MAAM,QAAQ,GAAG,IAAA,kBAAY,EAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAE9C,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAEhB,6BAA6B;QAC7B,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YAClB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,eAAK,CAAC,IAAI,CAAC,eAAe,CAAC,EAAE,eAAK,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;QACxF,CAAC;aAAM,CAAC;YACN,IAAI,QAAQ,EAAE,CAAC;gBACb,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,eAAK,CAAC,IAAI,CAAC,eAAe,CAAC,EAAE,eAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;gBAC5E,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,MAAM,CAAC,iDAAiD,CAAC,CAAC,CAAC;gBAC7E,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,eAAK,CAAC,IAAI,CAAC,qCAAqC,CAAC,EAAE,eAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;YAC7G,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,eAAK,CAAC,IAAI,CAAC,eAAe,CAAC,EAAE,eAAK,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC,CAAC;YAClG,CAAC;QACH,CAAC;QAED,6BAA6B;QAC7B,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;YACvB,MAAM,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,MAAM,GAAG,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YAC9H,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,eAAK,CAAC,IAAI,CAAC,eAAe,CAAC,EAAE,WAAW,CAAC,CAAC;QAC1E,CAAC;aAAM,CAAC;YACN,IAAI,QAAQ,EAAE,CAAC;gBACb,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,eAAK,CAAC,IAAI,CAAC,eAAe,CAAC,EAAE,eAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;gBAC5E,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,MAAM,CAAC,yCAAyC,CAAC,CAAC,CAAC;gBACrE,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,eAAK,CAAC,IAAI,CAAC,2CAA2C,CAAC,EAAE,eAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;YACnH,CAAC;iBAAM,IAAI,QAAQ,EAAE,CAAC;gBACpB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,eAAK,CAAC,IAAI,CAAC,eAAe,CAAC,EAAE,eAAK,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC,CAAC;YAChG,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,eAAK,CAAC,IAAI,CAAC,eAAe,CAAC,EAAE,eAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;YACjF,CAAC;QACH,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAClB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,eAAK,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,KAAK,CAAC,CAAC;QAC3C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}