long-git-cli 1.0.0 → 1.0.2

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 (48) hide show
  1. package/README.md +63 -45
  2. package/dist/commands/commit.d.ts +5 -0
  3. package/dist/commands/commit.d.ts.map +1 -0
  4. package/dist/commands/commit.js +133 -0
  5. package/dist/commands/commit.js.map +1 -0
  6. package/dist/commands/tag.d.ts +3 -3
  7. package/dist/commands/tag.d.ts.map +1 -1
  8. package/dist/commands/tag.js +76 -276
  9. package/dist/commands/tag.js.map +1 -1
  10. package/dist/constants.d.ts +6 -0
  11. package/dist/constants.d.ts.map +1 -0
  12. package/dist/constants.js +16 -0
  13. package/dist/constants.js.map +1 -0
  14. package/dist/index.js +9 -1
  15. package/dist/index.js.map +1 -1
  16. package/dist/types.d.ts +13 -0
  17. package/dist/types.d.ts.map +1 -0
  18. package/dist/types.js +3 -0
  19. package/dist/types.js.map +1 -0
  20. package/dist/utils/error.d.ts +7 -0
  21. package/dist/utils/error.d.ts.map +1 -0
  22. package/dist/utils/error.js +21 -0
  23. package/dist/utils/error.js.map +1 -0
  24. package/dist/utils/git-remote.d.ts +22 -0
  25. package/dist/utils/git-remote.d.ts.map +1 -0
  26. package/dist/utils/git-remote.js +77 -0
  27. package/dist/utils/git-remote.js.map +1 -0
  28. package/dist/utils/git.d.ts +29 -0
  29. package/dist/utils/git.d.ts.map +1 -0
  30. package/dist/utils/git.js +129 -0
  31. package/dist/utils/git.js.map +1 -0
  32. package/dist/utils/loading.d.ts +14 -0
  33. package/dist/utils/loading.d.ts.map +1 -0
  34. package/dist/utils/loading.js +33 -0
  35. package/dist/utils/loading.js.map +1 -0
  36. package/dist/utils/message.d.ts +8 -0
  37. package/dist/utils/message.d.ts.map +1 -0
  38. package/dist/utils/message.js +36 -0
  39. package/dist/utils/message.js.map +1 -0
  40. package/dist/utils/prompt.d.ts +22 -0
  41. package/dist/utils/prompt.d.ts.map +1 -0
  42. package/dist/utils/prompt.js +63 -0
  43. package/dist/utils/prompt.js.map +1 -0
  44. package/dist/utils/tag.d.ts +10 -0
  45. package/dist/utils/tag.d.ts.map +1 -0
  46. package/dist/utils/tag.js +41 -0
  47. package/dist/utils/tag.js.map +1 -0
  48. package/package.json +18 -6
package/README.md CHANGED
@@ -1,72 +1,90 @@
1
1
  # Long CLI
2
2
 
3
- 一个用于 Git tag 管理的命令行工具。
3
+ 一个支持 Bitbucket/GitHub/GitLab 的 Git tag/commit 自动化命令行工具,基于 TypeScript,结构高度可扩展。
4
4
 
5
5
  ## 安装
6
6
 
7
+ ```bash
8
+ npm install -g long-git-cli
9
+ ```
10
+
11
+ 或本地开发:
7
12
  ```bash
8
13
  npm install
9
14
  npm run build
10
15
  npm link
11
16
  ```
12
17
 
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(推荐)
18
+ ## 支持命令
24
19
 
20
+ ### 自动打 tag
25
21
  ```bash
26
22
  long tag
27
23
  ```
24
+ - 拉取最新 tag,自动递增(格式:`test-v00.00.0000`)
25
+ - 检查分支(禁止在 master/main/release 上打 tag)
26
+ - 自动推送到远程仓库(Bitbucket/GitHub/GitLab 均支持)
27
+ - 友好提示 tag 结果
28
28
 
29
- - 会自动拉取远程 tag,筛选最新有效 tag,自动叠加版本号。
30
- - 生成新 tag 后会要求你输入 `y/n` 进行确认。
31
- - 输入 `y` 后才会创建并推送新 tag。
32
- - 输入 `n` 或其他内容则取消操作。
33
-
34
- ### 跳过确认,直接推送
35
-
29
+ ### 规范化 commit 并 push
36
30
  ```bash
37
- long tag -p
38
- # 或
39
- long tag --pass
31
+ long commit
40
32
  ```
33
+ - 自动 git add .
34
+ - 打印所有将要提交的文件,需用户确认
35
+ - 交互式收集 commit 信息(类型、范围、说明、描述、脚注,参考 Angular/commitizen 规范)
36
+ - 生成规范化 commit message
37
+ - commit 后再次确认,自动 push
38
+ - 支持 Bitbucket/GitHub/GitLab,push 后友好提示
41
39
 
42
- - 适用于对 tag 号非常了解、无需人工确认的场景。
43
- - 直接创建并推送新 tag。
44
-
45
- ### Tag 格式
46
40
 
47
- 支持格式:`test-v00.00.0000`
48
41
 
49
- 例如:
50
- - 最新 tag:`test-v00.00.0001`
51
- - 新 tag:`test-v00.00.0002`
42
+ ## 交互流程示例
52
43
 
53
- ## 兼容性
54
-
55
- - 支持 GitHub、Bitbucket、GitLab 等主流远程仓库。
56
- - Bitbucket 仓库下会自动采用兼容的拉取方式。
44
+ #### long tag
45
+ ```
46
+ 🚀 开始自动打 tag...
47
+ 📥 拉取最新的远程信息...
48
+ 📋 当前最新 tag: test-v00.00.0001
49
+ 🆕 新 tag: test-v00.00.0002
50
+ 🏷️ 创建 tag: test-v00.00.0002
51
+ ✅ Tag test-v00.00.0002 创建成功
52
+ 📤 推送 tag 到远程仓库...
53
+ ✅ Tag 推送成功
54
+ 🔗 你可以在 Bitbucket 上查看新创建的 tag
55
+ 💡 提示:在 Bitbucket 中,你可以在 "Tags" 页面查看所有 tag
56
+ ✅ Tag 创建并推送成功!
57
+ ```
57
58
 
58
- ## 开发
59
+ #### long commit
60
+ ```
61
+ 📝 本次将要提交的文件:
62
+ src/commands/commit.ts
63
+ 请确认以上文件是否全部需要提交? (Y/n)
64
+ 请选择提交类型(必选): feat
65
+ 影响范围(可选,如模块名,直接回车跳过):core
66
+ 简短说明(必填,建议50字以内):支持交互式 commit
67
+ 详细描述(可选,直接回车跳过):
68
+ 脚注(如 BREAKING CHANGE/关联 issue,可选,直接回车跳过):
69
+
70
+ 🚩 即将提交以下内容:
71
+ 提交文件:
72
+ src/commands/commit.ts
73
+ 提交注释:
74
+ feat(core): 支持交互式 commit
75
+ 请确认是否提交并 push? (Y/n)
76
+ ✅ commit 成功!
77
+ 🚀 push 成功!
78
+ 🔗 你可以在 Bitbucket 上查看新创建的内容
79
+ 💡 提示:在 Bitbucket 中,你可以在 "Commits" 页面查看
80
+ ```
59
81
 
60
- ```bash
61
- # 安装依赖
62
- npm install
82
+ ## 扩展性说明
63
83
 
64
- # 开发模式运行
65
- npm run dev
84
+ - 所有 git 操作、tag 处理、交互、常量、类型均已抽取为公共模块
85
+ - 新增命令/支持更多平台/自定义交互,只需在 utils/constants/types 里维护
86
+ - 代码高度解耦,便于单元测试和团队协作
66
87
 
67
- # 构建
68
- npm run build
88
+ ## 贡献
69
89
 
70
- # 运行构建后的版本
71
- npm start
72
- ```
90
+ 欢迎提 issue 或 PR,或根据自身需求 fork 扩展!
@@ -0,0 +1,5 @@
1
+ /**
2
+ * 交互式规范化 commit 并 push
3
+ */
4
+ export declare function commitCommand(): Promise<void>;
5
+ //# sourceMappingURL=commit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commit.d.ts","sourceRoot":"","sources":["../../src/commands/commit.ts"],"names":[],"mappings":"AAyBA;;GAEG;AACH,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAqGnD"}
@@ -0,0 +1,133 @@
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.commitCommand = commitCommand;
37
+ const simple_git_1 = require("simple-git");
38
+ const git_remote_1 = require("../utils/git-remote");
39
+ const git_1 = require("../utils/git");
40
+ const constants_1 = require("../constants");
41
+ const prompt = __importStar(require("../utils/prompt"));
42
+ const message_1 = require("../utils/message");
43
+ const git = (0, simple_git_1.simpleGit)();
44
+ /**
45
+ * 交互式规范化 commit 并 push
46
+ */
47
+ async function commitCommand() {
48
+ try {
49
+ // 0. 检查是否在 Git 仓库中
50
+ await (0, git_1.checkGitRepository)();
51
+ // 1. 检查分支保护
52
+ const branch = await (0, git_1.getCurrentBranch)();
53
+ if (constants_1.PROTECTED_BRANCHES.includes(branch)) {
54
+ (0, message_1.printError)(`当前分支为 "${branch}",禁止在主分支(${constants_1.PROTECTED_BRANCHES.join("、")})上 commit!`);
55
+ return;
56
+ }
57
+ // 2. pull(不加 --rebase)
58
+ try {
59
+ await (0, git_1.pullWithLoading)();
60
+ }
61
+ catch (e) {
62
+ (0, message_1.printErrorMessage)("", e);
63
+ return;
64
+ }
65
+ // 3. 检查暂存区文件
66
+ let stagedFiles = await (0, git_1.checkHasStagedFiles)();
67
+ // 检查未暂存的修改和未跟踪文件
68
+ const unstagedChanges = await (0, git_1.checkHasUnstagedChanges)();
69
+ if (stagedFiles.length === 0 && !unstagedChanges.hasChanges) {
70
+ (0, message_1.printWarning)("没有需要提交的内容。");
71
+ return;
72
+ }
73
+ if (stagedFiles.length === 0) {
74
+ // 没有暂存文件,自动 add .
75
+ await (0, git_1.addAllFiles)();
76
+ stagedFiles = await (0, git_1.checkHasStagedFiles)();
77
+ }
78
+ else {
79
+ if (stagedFiles.length > 0) {
80
+ // 暂存区有文件,检查是否有未add的文件
81
+ if (unstagedChanges.hasChanges) {
82
+ (0, message_1.printWarning)("检测到还有未 add 的文件:");
83
+ unstagedChanges.notAdded.forEach((f) => console.log(" " + f));
84
+ unstagedChanges.modified.forEach((f) => console.log(" " + f));
85
+ const addMore = await prompt.confirm("是否将这些文件也一并 add?");
86
+ if (addMore) {
87
+ await (0, git_1.addAllFiles)();
88
+ stagedFiles = await (0, git_1.checkHasStagedFiles)();
89
+ }
90
+ }
91
+ }
92
+ }
93
+ // 如果暂存区没有文件,直接进入注释输入和确认流程
94
+ // 4. 交互式收集 commit 信息
95
+ const type = await prompt.select("请选择提交类型(必选):", constants_1.commitTypes);
96
+ const scope = await prompt.input("影响范围(可选,如模块名,直接回车跳过):");
97
+ const subject = await prompt.input("简短说明(必填,建议50字以内):", (input) => !!input.trim() || "提交说明不能为空");
98
+ const body = await prompt.input("详细描述(可选,直接回车跳过):");
99
+ const footer = await prompt.input("脚注(如 BREAKING CHANGE/关联 issue,可选,直接回车跳过):");
100
+ // 5. 生成规范化 commit message
101
+ const message = (0, git_1.formatCommitMessage)(type, subject, scope, body, footer);
102
+ // 6. 打印将要提交的文件和注释,询问用户是否 commit 并 push
103
+ (0, message_1.printInfo)("\n🚩 即将提交以下内容:");
104
+ if (stagedFiles.length > 0) {
105
+ (0, message_1.printFileList)("提交文件:", stagedFiles);
106
+ }
107
+ else {
108
+ (0, message_1.printWarning)("没有文件将被提交(空 commit)");
109
+ }
110
+ (0, message_1.printInfo)("\n提交注释:");
111
+ console.log("\x1b[33m%s\x1b[0m", message);
112
+ const confirmCommit = await prompt.confirm("请确认是否 commit 并 push?");
113
+ if (!confirmCommit) {
114
+ (0, message_1.printWarning)("❌ 已终止提交。");
115
+ return;
116
+ }
117
+ // 7. commit
118
+ await git.commit(message);
119
+ (0, message_1.printSuccess)("commit 成功!");
120
+ // 8. push
121
+ await (0, git_1.pushCurrentBranch)();
122
+ (0, message_1.printSuccess)("push 成功!");
123
+ // 9. 远程仓库友好提示
124
+ const remoteInfo = await (0, git_remote_1.detectRemoteType)();
125
+ if (remoteInfo) {
126
+ (0, git_remote_1.showRemoteSpecificTips)(remoteInfo.type);
127
+ }
128
+ }
129
+ catch (error) {
130
+ (0, message_1.printErrorMessage)("提交或推送失败:", error);
131
+ }
132
+ }
133
+ //# sourceMappingURL=commit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commit.js","sourceRoot":"","sources":["../../src/commands/commit.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * 主要的 tag 命令处理函数
3
- * 执行完整的 tag 创建流程:检查分支 -> 检测仓库 -> 拉取最新信息 -> 创建新 tag -> 推送
4
- * @param skipPrompt 是否跳过确认,直接推送
5
3
  */
6
- export declare function tagCommand(skipPrompt?: boolean): Promise<void>;
4
+ export declare function tagCommand(options?: {
5
+ pass?: boolean;
6
+ }): Promise<void>;
7
7
  //# sourceMappingURL=tag.d.ts.map
@@ -1 +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"}
1
+ {"version":3,"file":"tag.d.ts","sourceRoot":"","sources":["../../src/commands/tag.ts"],"names":[],"mappings":"AAgBA;;GAEG;AACH,wBAAsB,UAAU,CAAC,OAAO,CAAC,EAAE;IAAE,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAiD5E"}