long-git-cli 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.
package/README.md ADDED
@@ -0,0 +1,72 @@
1
+ # Long CLI
2
+
3
+ 一个用于 Git tag 管理的命令行工具。
4
+
5
+ ## 安装
6
+
7
+ ```bash
8
+ npm install
9
+ npm run build
10
+ npm link
11
+ ```
12
+
13
+ ## 功能特性
14
+
15
+ - 只会对格式为 `test-v00.00.0000` 的有效 tag 进行版本叠加和推送,无效 tag 会自动跳过。
16
+ - 找不到有效 tag 时会输出提示并终止操作,不会创建新 tag。
17
+ - 生成新 tag 后会先输出新 tag 号,要求用户输入 `y/n` 确认,确认后才会创建和推送。
18
+ - 支持 `-p` 或 `--pass` 参数,跳过确认,直接创建并推送新 tag。
19
+ - 完全兼容 Bitbucket 仓库,拉取 tag 时自动处理 bitbucket 远程。
20
+
21
+ ## 使用方法
22
+
23
+ ### 自动打 tag(推荐)
24
+
25
+ ```bash
26
+ long tag
27
+ ```
28
+
29
+ - 会自动拉取远程 tag,筛选最新有效 tag,自动叠加版本号。
30
+ - 生成新 tag 后会要求你输入 `y/n` 进行确认。
31
+ - 输入 `y` 后才会创建并推送新 tag。
32
+ - 输入 `n` 或其他内容则取消操作。
33
+
34
+ ### 跳过确认,直接推送
35
+
36
+ ```bash
37
+ long tag -p
38
+ # 或
39
+ long tag --pass
40
+ ```
41
+
42
+ - 适用于对 tag 号非常了解、无需人工确认的场景。
43
+ - 直接创建并推送新 tag。
44
+
45
+ ### Tag 格式
46
+
47
+ 支持格式:`test-v00.00.0000`
48
+
49
+ 例如:
50
+ - 最新 tag:`test-v00.00.0001`
51
+ - 新 tag:`test-v00.00.0002`
52
+
53
+ ## 兼容性
54
+
55
+ - 支持 GitHub、Bitbucket、GitLab 等主流远程仓库。
56
+ - Bitbucket 仓库下会自动采用兼容的拉取方式。
57
+
58
+ ## 开发
59
+
60
+ ```bash
61
+ # 安装依赖
62
+ npm install
63
+
64
+ # 开发模式运行
65
+ npm run dev
66
+
67
+ # 构建
68
+ npm run build
69
+
70
+ # 运行构建后的版本
71
+ npm start
72
+ ```
@@ -0,0 +1,7 @@
1
+ /**
2
+ * 主要的 tag 命令处理函数
3
+ * 执行完整的 tag 创建流程:检查分支 -> 检测仓库 -> 拉取最新信息 -> 创建新 tag -> 推送
4
+ * @param skipPrompt 是否跳过确认,直接推送
5
+ */
6
+ export declare function tagCommand(skipPrompt?: boolean): Promise<void>;
7
+ //# sourceMappingURL=tag.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tag.d.ts","sourceRoot":"","sources":["../../src/commands/tag.ts"],"names":[],"mappings":"AAkCA;;;;GAIG;AACH,wBAAsB,UAAU,CAAC,UAAU,UAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CA4DlE"}
@@ -0,0 +1,349 @@
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.tagCommand = tagCommand;
7
+ const simple_git_1 = require("simple-git");
8
+ const chalk_1 = __importDefault(require("chalk"));
9
+ const readline_1 = __importDefault(require("readline"));
10
+ // Git 操作实例
11
+ const git = (0, simple_git_1.simpleGit)();
12
+ // 受保护的分支列表(不允许在这些分支上打 tag)
13
+ const PROTECTED_BRANCHES = ['master', 'main', 'release'];
14
+ // 支持的远程仓库类型
15
+ const REMOTE_TYPES = {
16
+ GITHUB: 'github',
17
+ BITBUCKET: 'bitbucket',
18
+ GITLAB: 'gitlab',
19
+ UNKNOWN: 'unknown'
20
+ };
21
+ /**
22
+ * 主要的 tag 命令处理函数
23
+ * 执行完整的 tag 创建流程:检查分支 -> 检测仓库 -> 拉取最新信息 -> 创建新 tag -> 推送
24
+ * @param skipPrompt 是否跳过确认,直接推送
25
+ */
26
+ async function tagCommand(skipPrompt = false) {
27
+ console.log(chalk_1.default.blue('🚀 开始自动打 tag...'));
28
+ try {
29
+ // 0. 检查当前分支是否受保护
30
+ const branch = await getCurrentBranch();
31
+ if (isProtectedBranch(branch)) {
32
+ console.log(chalk_1.default.red(`❌ 当前分支为 "${branch}",禁止在主分支(${PROTECTED_BRANCHES.join('、')})上打 tag!`));
33
+ console.log(chalk_1.default.yellow('💡 请切换到 feature、dev 或其他非主分支后再执行打 tag 操作。'));
34
+ return;
35
+ }
36
+ // 1. 检查是否在 Git 仓库中
37
+ await checkGitRepository();
38
+ // 2. 检测远程仓库类型
39
+ const remoteInfo = await detectRemoteType();
40
+ if (remoteInfo) {
41
+ console.log(chalk_1.default.blue(`🌐 检测到远程仓库: ${remoteInfo.type} (${remoteInfo.url})`));
42
+ }
43
+ // 3. 拉取最新的远程信息
44
+ await fetchLatestTags(remoteInfo);
45
+ // 4. 获取最新的有效 tag
46
+ const latestTag = await getLatestValidTag();
47
+ if (!latestTag) {
48
+ console.log(chalk_1.default.yellow('⚠️ 没有找到任何有效格式的 tag,已终止操作,不会创建新 tag。'));
49
+ return;
50
+ }
51
+ // 5. 解析当前 tag(此时一定是有效 tag)
52
+ const currentTagInfo = parseTag(latestTag);
53
+ console.log(chalk_1.default.green(`📋 当前最新有效 tag: ${latestTag}`));
54
+ // 6. 生成新版本号
55
+ const newTagInfo = incrementVersion(currentTagInfo);
56
+ const newTag = formatTag(newTagInfo);
57
+ console.log(chalk_1.default.blue(`🆕 新 tag: ${newTag}`));
58
+ // 7. 用户确认
59
+ if (!skipPrompt) {
60
+ const confirmed = await promptConfirm(`是否确认创建并推送新 tag: ${newTag}?(y/n): `);
61
+ if (!confirmed) {
62
+ console.log(chalk_1.default.yellow('🚫 已取消 tag 创建与推送。'));
63
+ return;
64
+ }
65
+ }
66
+ // 8. 创建并推送新 tag
67
+ await createAndPushTag(newTag, remoteInfo);
68
+ console.log(chalk_1.default.green('✅ Tag 创建并推送成功!'));
69
+ }
70
+ catch (error) {
71
+ const errorMessage = error instanceof Error ? error.message : String(error);
72
+ throw new Error(`Tag 操作失败: ${errorMessage}`);
73
+ }
74
+ }
75
+ /**
76
+ * 检查当前目录是否为有效的 Git 仓库
77
+ * @throws {Error} 如果不是 Git 仓库则抛出错误
78
+ */
79
+ async function checkGitRepository() {
80
+ try {
81
+ await git.status();
82
+ }
83
+ catch (error) {
84
+ throw new Error('当前目录不是 Git 仓库,请先初始化 Git 仓库');
85
+ }
86
+ }
87
+ /**
88
+ * 检测远程仓库类型(GitHub、Bitbucket、GitLab 等)
89
+ * @returns {Promise<RemoteInfo | null>} 远程仓库信息,如果没有配置远程仓库则返回 null
90
+ */
91
+ async function detectRemoteType() {
92
+ try {
93
+ const remotes = await git.getRemotes(true);
94
+ if (remotes.length === 0) {
95
+ return null;
96
+ }
97
+ const origin = remotes.find(remote => remote.name === 'origin');
98
+ if (!origin) {
99
+ return null;
100
+ }
101
+ const url = origin.refs.push || origin.refs.fetch;
102
+ if (!url) {
103
+ return null;
104
+ }
105
+ let type = REMOTE_TYPES.UNKNOWN;
106
+ if (url.includes('github.com')) {
107
+ type = REMOTE_TYPES.GITHUB;
108
+ }
109
+ else if (url.includes('bitbucket.org') || url.includes('bitbucket.com')) {
110
+ type = REMOTE_TYPES.BITBUCKET;
111
+ }
112
+ else if (url.includes('gitlab.com')) {
113
+ type = REMOTE_TYPES.GITLAB;
114
+ }
115
+ return {
116
+ name: origin.name,
117
+ url,
118
+ type
119
+ };
120
+ }
121
+ catch (error) {
122
+ console.log(chalk_1.default.yellow('⚠️ 无法检测远程仓库类型'));
123
+ return null;
124
+ }
125
+ }
126
+ /**
127
+ * 拉取最新的远程 tag 信息
128
+ * 如果拉取失败,会继续使用本地 tag 信息
129
+ * @param {RemoteInfo | null} remoteInfo - 远程仓库信息
130
+ */
131
+ async function fetchLatestTags(remoteInfo) {
132
+ console.log(chalk_1.default.blue('📥 拉取最新的远程信息...'));
133
+ try {
134
+ if (remoteInfo?.type === REMOTE_TYPES.BITBUCKET) {
135
+ // Bitbucket 推荐指定 origin
136
+ await git.fetch('origin', '--tags');
137
+ }
138
+ else {
139
+ await git.fetch(['--tags']);
140
+ }
141
+ }
142
+ catch (error) {
143
+ console.log(chalk_1.default.yellow('⚠️ 拉取远程信息失败,将使用本地 tag'));
144
+ }
145
+ }
146
+ /**
147
+ * 获取最新的有效 tag
148
+ * 只返回格式正确的 test-v00.00.0000 tag,按版本号排序返回最新的
149
+ * @returns {Promise<string | null>} 最新的有效 tag,如果没有则返回 null
150
+ */
151
+ async function getLatestValidTag() {
152
+ try {
153
+ const tags = await git.tags();
154
+ if (!tags || !Array.isArray(tags.all)) {
155
+ console.log(chalk_1.default.yellow('⚠️ 未能正确获取 tag 列表,tags:', tags));
156
+ return null;
157
+ }
158
+ // 只保留格式正确的 tag
159
+ const validTags = tags.all.filter(tag => {
160
+ try {
161
+ return !!parseTag(tag);
162
+ }
163
+ catch {
164
+ return false;
165
+ }
166
+ });
167
+ if (validTags.length === 0) {
168
+ return null;
169
+ }
170
+ validTags.sort((a, b) => {
171
+ const aInfo = parseTag(a);
172
+ const bInfo = parseTag(b);
173
+ return compareVersions(aInfo, bInfo);
174
+ });
175
+ return validTags[validTags.length - 1];
176
+ }
177
+ catch (error) {
178
+ console.log(chalk_1.default.red('❌ 获取 tag 列表失败,错误信息:'), error);
179
+ return null;
180
+ }
181
+ }
182
+ /**
183
+ * 解析 tag 字符串,提取版本号信息
184
+ * @param {string} tag - 要解析的 tag 字符串,格式为 test-v00.00.0000
185
+ * @returns {TagInfo} 解析后的 tag 信息对象
186
+ * @throws {Error} 如果 tag 格式不正确则抛出错误
187
+ */
188
+ function parseTag(tag) {
189
+ const match = tag.match(/^test-v(\d+)\.(\d+)\.(\d{4})$/);
190
+ if (!match) {
191
+ throw new Error(`无效的 tag 格式: ${tag},期望格式: test-v00.00.0000`);
192
+ }
193
+ return {
194
+ version: tag,
195
+ major: parseInt(match[1], 10),
196
+ minor: parseInt(match[2], 10),
197
+ patch: parseInt(match[3], 10),
198
+ build: parseInt(match[3], 10)
199
+ };
200
+ }
201
+ /**
202
+ * 递增版本号,将 build 和 patch 版本号加 1
203
+ * @param {TagInfo} tagInfo - 当前版本信息
204
+ * @returns {TagInfo} 递增后的版本信息
205
+ */
206
+ function incrementVersion(tagInfo) {
207
+ return {
208
+ ...tagInfo,
209
+ build: tagInfo.build + 1,
210
+ patch: tagInfo.build + 1
211
+ };
212
+ }
213
+ /**
214
+ * 格式化版本信息为 tag 字符串
215
+ * @param {TagInfo} tagInfo - 版本信息对象
216
+ * @returns {string} 格式化后的 tag 字符串
217
+ */
218
+ function formatTag(tagInfo) {
219
+ return `test-v${tagInfo.major.toString().padStart(2, '0')}.${tagInfo.minor.toString().padStart(2, '0')}.${tagInfo.build.toString().padStart(4, '0')}`;
220
+ }
221
+ /**
222
+ * 比较两个版本号的大小
223
+ * @param {TagInfo} a - 第一个版本信息
224
+ * @param {TagInfo} b - 第二个版本信息
225
+ * @returns {number} 比较结果:负数表示 a < b,0 表示相等,正数表示 a > b
226
+ */
227
+ function compareVersions(a, b) {
228
+ if (a.major !== b.major)
229
+ return a.major - b.major;
230
+ if (a.minor !== b.minor)
231
+ return a.minor - b.minor;
232
+ return a.build - b.build;
233
+ }
234
+ /**
235
+ * 创建初始 tag(当没有现有 tag 时调用)
236
+ * 创建 test-v00.00.0001 作为第一个 tag
237
+ */
238
+ async function createInitialTag() {
239
+ const initialTag = 'test-v00.00.0001';
240
+ console.log(chalk_1.default.blue(`🏷️ 创建初始 tag: ${initialTag}`));
241
+ try {
242
+ await git.addTag(initialTag);
243
+ console.log(chalk_1.default.green('✅ 初始 tag 创建成功'));
244
+ // 尝试推送,如果失败则只提示本地创建成功
245
+ await pushTagWithFallback();
246
+ }
247
+ catch (error) {
248
+ const errorMessage = error instanceof Error ? error.message : String(error);
249
+ throw new Error(`创建初始 tag 失败: ${errorMessage}`);
250
+ }
251
+ }
252
+ /**
253
+ * 创建并推送 tag
254
+ * @param {string} tag - 要创建的 tag 名称
255
+ * @param {RemoteInfo | null} remoteInfo - 远程仓库信息
256
+ */
257
+ async function createAndPushTag(tag, remoteInfo) {
258
+ console.log(chalk_1.default.blue(`🏷️ 创建 tag: ${tag}`));
259
+ try {
260
+ // 创建 tag
261
+ await git.addTag(tag);
262
+ console.log(chalk_1.default.green(`✅ Tag ${tag} 创建成功`));
263
+ // 尝试推送 tag
264
+ console.log(chalk_1.default.blue('📤 推送 tag 到远程仓库...'));
265
+ await pushTagWithFallback(remoteInfo);
266
+ }
267
+ catch (error) {
268
+ const errorMessage = error instanceof Error ? error.message : String(error);
269
+ throw new Error(`创建 tag 失败: ${errorMessage}`);
270
+ }
271
+ }
272
+ /**
273
+ * 推送 tag 到远程仓库,如果失败则给出友好提示
274
+ * @param {RemoteInfo | null} remoteInfo - 远程仓库信息
275
+ */
276
+ async function pushTagWithFallback(remoteInfo) {
277
+ try {
278
+ await git.pushTags();
279
+ console.log(chalk_1.default.green('✅ Tag 推送成功'));
280
+ // 根据远程仓库类型提供特定提示
281
+ if (remoteInfo) {
282
+ showRemoteSpecificTips(remoteInfo.type);
283
+ }
284
+ }
285
+ catch (pushError) {
286
+ console.log(chalk_1.default.yellow('⚠️ Tag 推送失败,但本地 tag 已创建成功'));
287
+ console.log(chalk_1.default.blue('💡 提示:如果需要推送到远程仓库,请先配置远程仓库'));
288
+ if (remoteInfo) {
289
+ console.log(chalk_1.default.blue(`🔧 当前远程仓库: ${remoteInfo.type} (${remoteInfo.url})`));
290
+ }
291
+ }
292
+ }
293
+ /**
294
+ * 根据远程仓库类型显示特定的提示信息
295
+ * @param {RemoteInfo['type']} remoteType - 远程仓库类型
296
+ */
297
+ function showRemoteSpecificTips(remoteType) {
298
+ switch (remoteType) {
299
+ case REMOTE_TYPES.BITBUCKET:
300
+ console.log(chalk_1.default.blue('🔗 你可以在 Bitbucket 上查看新创建的 tag'));
301
+ console.log(chalk_1.default.blue('💡 提示:在 Bitbucket 中,你可以在 "Tags" 页面查看所有 tag'));
302
+ break;
303
+ case REMOTE_TYPES.GITHUB:
304
+ console.log(chalk_1.default.blue('🔗 你可以在 GitHub 上查看新创建的 tag'));
305
+ console.log(chalk_1.default.blue('💡 提示:在 GitHub 中,你可以在 "Releases" 页面查看所有 tag'));
306
+ break;
307
+ case REMOTE_TYPES.GITLAB:
308
+ console.log(chalk_1.default.blue('🔗 你可以在 GitLab 上查看新创建的 tag'));
309
+ console.log(chalk_1.default.blue('💡 提示:在 GitLab 中,你可以在 "Repository > Tags" 页面查看所有 tag'));
310
+ break;
311
+ }
312
+ }
313
+ /**
314
+ * 获取当前分支名称
315
+ * @returns {Promise<string>} 当前分支名称
316
+ * @throws {Error} 如果无法获取分支名称则抛出错误
317
+ */
318
+ async function getCurrentBranch() {
319
+ const status = await git.status();
320
+ // status.current 可能为 null,做兼容处理
321
+ if (!status.current) {
322
+ throw new Error('无法获取当前分支名称,请确认已在有效的 git 分支上');
323
+ }
324
+ return status.current;
325
+ }
326
+ /**
327
+ * 检查分支是否为受保护分支
328
+ * @param {string} branch - 分支名称
329
+ * @returns {boolean} 如果是受保护分支则返回 true,否则返回 false
330
+ */
331
+ function isProtectedBranch(branch) {
332
+ return PROTECTED_BRANCHES.includes(branch);
333
+ }
334
+ /**
335
+ * 命令行确认
336
+ */
337
+ function promptConfirm(question) {
338
+ return new Promise((resolve) => {
339
+ const rl = readline_1.default.createInterface({
340
+ input: process.stdin,
341
+ output: process.stdout
342
+ });
343
+ rl.question(question, (answer) => {
344
+ rl.close();
345
+ resolve(answer.trim().toLowerCase() === 'y');
346
+ });
347
+ });
348
+ }
349
+ //# sourceMappingURL=tag.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tag.js","sourceRoot":"","sources":["../../src/commands/tag.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/dist/index.js ADDED
@@ -0,0 +1,30 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ var __importDefault = (this && this.__importDefault) || function (mod) {
4
+ return (mod && mod.__esModule) ? mod : { "default": mod };
5
+ };
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ const commander_1 = require("commander");
8
+ const tag_1 = require("./commands/tag");
9
+ const chalk_1 = __importDefault(require("chalk"));
10
+ const program = new commander_1.Command();
11
+ program
12
+ .name('long')
13
+ .description('一个用于 Git tag 管理的命令行工具')
14
+ .version('1.0.0');
15
+ // 注册 tag 命令
16
+ program
17
+ .command('tag')
18
+ .description('自动打 tag:拉取最新 tag,版本号 +1,打 tag 并推送')
19
+ .option('-p, --pass', '跳过 tag 号确认,直接创建并推送')
20
+ .action(async (options) => {
21
+ try {
22
+ await (0, tag_1.tagCommand)(options.pass);
23
+ }
24
+ catch (error) {
25
+ console.error(chalk_1.default.red('错误:'), error instanceof Error ? error.message : String(error));
26
+ process.exit(1);
27
+ }
28
+ });
29
+ program.parse();
30
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;AAEA,yCAAoC;AACpC,wCAA4C;AAC5C,kDAA0B;AAE1B,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,MAAM,CAAC;KACZ,WAAW,CAAC,uBAAuB,CAAC;KACpC,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,YAAY;AACZ,OAAO;KACJ,OAAO,CAAC,KAAK,CAAC;KACd,WAAW,CAAC,mCAAmC,CAAC;KAChD,MAAM,CAAC,YAAY,EAAE,oBAAoB,CAAC;KAC1C,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;IACxB,IAAI,CAAC;QACH,MAAM,IAAA,gBAAU,EAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACjC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,eAAK,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QACxF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,OAAO,CAAC,KAAK,EAAE,CAAC"}
package/package.json ADDED
@@ -0,0 +1,40 @@
1
+ {
2
+ "name": "long-git-cli",
3
+ "version": "1.0.0",
4
+ "description": "A CLI tool for Git tag management.",
5
+ "main": "dist/index.js",
6
+ "bin": {
7
+ "long": "dist/index.js"
8
+ },
9
+ "files": [
10
+ "dist",
11
+ "README.md",
12
+ "LICENSE"
13
+ ],
14
+ "scripts": {
15
+ "build": "tsc",
16
+ "dev": "ts-node src/index.ts",
17
+ "start": "node dist/index.js",
18
+ "clean": "rm -rf dist",
19
+ "prebuild": "npm run clean"
20
+ },
21
+ "keywords": ["cli", "git", "tag", "versioning", "bitbucket", "github", "automation"],
22
+ "author": "WenTao.Long <815473953@qq.com>",
23
+ "license": "MIT",
24
+ "engines": {
25
+ "node": ">=16.0.0"
26
+ },
27
+ "publishConfig": {
28
+ "access": "public"
29
+ },
30
+ "dependencies": {
31
+ "commander": "^11.1.0",
32
+ "simple-git": "^3.22.0",
33
+ "chalk": "^4.1.2"
34
+ },
35
+ "devDependencies": {
36
+ "@types/node": "^20.10.0",
37
+ "typescript": "^5.3.0",
38
+ "ts-node": "^10.9.0"
39
+ }
40
+ }