git-fish-log 1.0.4 → 1.0.6
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-/345/225/260/345/227/246/347/211/210.md +17 -13
- package/README.md +204 -0
- package/dist/index.js +21 -2
- package/package.json +1 -1
|
@@ -91,25 +91,29 @@ fish -m
|
|
|
91
91
|
==================================================
|
|
92
92
|
|
|
93
93
|
📅 本月主要贡献占比 (基于 Commit Message 正则归类):
|
|
94
|
-
- 修 bug (fix) :[
|
|
95
|
-
- 新功能 (feat) :[
|
|
96
|
-
- 杂务与文档 (chore) :[
|
|
97
|
-
- 其他提交 (other) :[□□□□□□□□□□□□□□□] 2% (
|
|
94
|
+
- 修 bug (fix) :[■□□□□□□□□□□□□□□] 5% (4 次)
|
|
95
|
+
- 新功能 (feat) :[■■■■■■■■■■■■□□□] 79% (64 次)
|
|
96
|
+
- 杂务与文档 (chore) :[■■□□□□□□□□□□□□□] 14% (11 次)
|
|
97
|
+
- 其他提交 (other) :[□□□□□□□□□□□□□□□] 2% (2 次)
|
|
98
98
|
|
|
99
99
|
📅 每日摸鱼指数概览:
|
|
100
|
-
|
|
101
|
-
|
|
100
|
+
周一 周二 周三 周四 周五 周六 周日
|
|
101
|
+
5月1日 5月2日 5月3日
|
|
102
|
+
90% 90% 90%
|
|
102
103
|
|
|
103
|
-
|
|
104
|
-
90% 90%
|
|
104
|
+
5月4日 5月5日 5月6日 5月7日 5月8日 5月9日 5月10日
|
|
105
|
+
90% 90% 28% 90% 23% 19% 90%
|
|
105
106
|
|
|
106
|
-
|
|
107
|
-
|
|
107
|
+
5月11日 5月12日 5月13日 5月14日 5月15日 5月16日 5月17日
|
|
108
|
+
61% 39% 23% 90% 90% 90% 90%
|
|
108
109
|
|
|
109
|
-
|
|
110
|
-
|
|
110
|
+
5月18日 5月19日 5月20日 5月21日 5月22日 5月23日 5月24日
|
|
111
|
+
39% 43% 38% 28% 25% 90% 90%
|
|
111
112
|
|
|
112
|
-
|
|
113
|
+
5月25日 5月26日 5月27日 5月28日 5月29日 5月30日 5月31日
|
|
114
|
+
61% 28% 35% 34% 20% 90% 90%
|
|
115
|
+
|
|
116
|
+
🔥 爆肝王: 5月9日 → 摸鱼指数 19% 🔥 爆肝战神 🧱 勤恳搬砖人
|
|
113
117
|
|
|
114
118
|
--------------------------------------------------
|
|
115
119
|
🤖 锐评:
|
package/README.md
CHANGED
|
@@ -32,3 +32,207 @@
|
|
|
32
32
|
* `token`: 你的 GitLab 个人/项目访问令牌 (PAT),需有 `read_api` 或 `api` 权限。
|
|
33
33
|
* `host`: 可选。私有部署的 GitLab 域名(如 `https://gitlab.mycompany.com`),缺省默认使用 `https://gitlab.com`。
|
|
34
34
|
* `name`: 可选。给该数据源指定的别名(如 `my-company`),缺省时自动使用 host 域名作为别名。若别名已存在则会覆盖更新。
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
## 📖 CLI 命令行示例
|
|
39
|
+
|
|
40
|
+
### 1. 基础摸鱼周报(or 月报)
|
|
41
|
+
```bash
|
|
42
|
+
fish
|
|
43
|
+
```
|
|
44
|
+
默认展示**本周**(周一零点至周日 23:59)的所有提交记录以及每日的摸鱼指数统计。
|
|
45
|
+
```bash
|
|
46
|
+
==================================================
|
|
47
|
+
🐟 FISH - 本周 Git 摸鱼周报
|
|
48
|
+
==================================================
|
|
49
|
+
|
|
50
|
+
📅 本周提交详情:
|
|
51
|
+
周一:0 次 | 🐟 摸鱼指数: 90% (终极摸鱼 🎣) 🏷 🐟 今日暂无代码活动
|
|
52
|
+
周二:2 次 | 🐟 摸鱼指数: 51% (正常营业 💻) | 1个项目 (项目名称)
|
|
53
|
+
周三:0 次 | 🐟 摸鱼指数: 90% (终极摸鱼 🎣) 🏷 🐟 今日暂无代码活动
|
|
54
|
+
周四:未到
|
|
55
|
+
周五:未到
|
|
56
|
+
|
|
57
|
+
--------------------------------------------------
|
|
58
|
+
☕ 最快乐的日子:周一、周三 | 🐟 摸鱼指数:90%
|
|
59
|
+
--------------------------------------------------
|
|
60
|
+
📊 本周均值:🐟 摸鱼 77%
|
|
61
|
+
--------------------------------------------------
|
|
62
|
+
🤖 锐评:
|
|
63
|
+
看来本周的项目进入了‘养精蓄锐’阶段——手机太好玩,或者床太暖和。摸鱼技巧已达炉火纯青之境。
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
### 2. 月度报告与工作分类
|
|
67
|
+
```bash
|
|
68
|
+
fish --month
|
|
69
|
+
# 或
|
|
70
|
+
fish -m
|
|
71
|
+
```
|
|
72
|
+
查看本月的所有 Commit 分类(Bug 修复、新功能、杂务文档、其他)占比图以及大月度 锐评。
|
|
73
|
+
```bash
|
|
74
|
+
==================================================
|
|
75
|
+
🐟 FISH - 本月 Git 摸鱼月报
|
|
76
|
+
==================================================
|
|
77
|
+
|
|
78
|
+
📅 本月主要贡献占比 (基于 Commit Message 正则归类):
|
|
79
|
+
- 修 bug (fix) :[■□□□□□□□□□□□□□□] 5% (4 次)
|
|
80
|
+
- 新功能 (feat) :[■■■■■■■■■■■■□□□] 79% (64 次)
|
|
81
|
+
- 杂务与文档 (chore) :[■■□□□□□□□□□□□□□] 14% (11 次)
|
|
82
|
+
- 其他提交 (other) :[□□□□□□□□□□□□□□□] 2% (2 次)
|
|
83
|
+
|
|
84
|
+
📅 每日摸鱼指数概览:
|
|
85
|
+
周一 周二 周三 周四 周五 周六 周日
|
|
86
|
+
5月1日 5月2日 5月3日
|
|
87
|
+
90% 90% 90%
|
|
88
|
+
|
|
89
|
+
5月4日 5月5日 5月6日 5月7日 5月8日 5月9日 5月10日
|
|
90
|
+
90% 90% 28% 90% 23% 19% 90%
|
|
91
|
+
|
|
92
|
+
5月11日 5月12日 5月13日 5月14日 5月15日 5月16日 5月17日
|
|
93
|
+
61% 39% 23% 90% 90% 90% 90%
|
|
94
|
+
|
|
95
|
+
5月18日 5月19日 5月20日 5月21日 5月22日 5月23日 5月24日
|
|
96
|
+
39% 43% 38% 28% 25% 90% 90%
|
|
97
|
+
|
|
98
|
+
5月25日 5月26日 5月27日 5月28日 5月29日 5月30日 5月31日
|
|
99
|
+
61% 28% 35% 34% 20% 90% 90%
|
|
100
|
+
|
|
101
|
+
🔥 爆肝王: 5月9日 → 摸鱼指数 19% 🔥 爆肝战神 🧱 勤恳搬砖人
|
|
102
|
+
|
|
103
|
+
--------------------------------------------------
|
|
104
|
+
🤖 锐评:
|
|
105
|
+
本月 Feat 占比高达 62%。新功能一项接一项,开发火力全开,业务线因你而飞速前进!
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
### 3. 横向项目爆肝排行
|
|
109
|
+
```bash
|
|
110
|
+
fish --project
|
|
111
|
+
# 或
|
|
112
|
+
fish -p
|
|
113
|
+
```
|
|
114
|
+
对目前配置监控的多个项目按照 Commit 数量进行降序排行,并配有幽默的地位标识。
|
|
115
|
+
```bash
|
|
116
|
+
fish -w 1 -p
|
|
117
|
+
```
|
|
118
|
+
```bash
|
|
119
|
+
==================================================
|
|
120
|
+
🐟 FISH - 项目爆肝排行 (上周)
|
|
121
|
+
==================================================
|
|
122
|
+
|
|
123
|
+
📊 对应时段项目爆肝排行 (2026/6/15 ~ 2026/6/21)
|
|
124
|
+
1. 项目名称: 13 次提交 (主力搬砖地 🧱)
|
|
125
|
+
2. 项目名称: 3 次提交 (偶尔上去点一下 🐟)
|
|
126
|
+
3. 项目名称: 2 次提交 (边缘挂机项目 💤)
|
|
127
|
+
4. 项目名称: 1 次提交 (测完就跑,纯粹路过 🚬)
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
### 4. 24 小时黄金提交时间段图表
|
|
131
|
+
```bash
|
|
132
|
+
fish --time
|
|
133
|
+
# 或
|
|
134
|
+
fish -t
|
|
135
|
+
```
|
|
136
|
+
以水平柱状图形象打印 24 小时中你提交代码的波峰和波谷,包含个性化的时段说明。
|
|
137
|
+
```bash
|
|
138
|
+
fish -w 1 -t
|
|
139
|
+
```
|
|
140
|
+
```bash
|
|
141
|
+
==================================================
|
|
142
|
+
🐟 FISH - 黄金工作时间段分析 (24小时分布) (上周)
|
|
143
|
+
==================================================
|
|
144
|
+
|
|
145
|
+
🕒 对应时段 24 小时 commit 频次分布图:
|
|
146
|
+
00:00 | [ ] 0 次
|
|
147
|
+
01:00 | [ ] 0 次
|
|
148
|
+
02:00 | [ ] 0 次
|
|
149
|
+
03:00 | [ ] 0 次
|
|
150
|
+
04:00 | [ ] 0 次
|
|
151
|
+
05:00 | [ ] 0 次
|
|
152
|
+
06:00 | [ ] 0 次
|
|
153
|
+
07:00 | [ ] 0 次
|
|
154
|
+
08:00 | [ ] 0 次
|
|
155
|
+
09:00 | [██████ ] 3 次 (上午表演型选手 🚀)
|
|
156
|
+
10:00 | [██████████████████████████ ] 12 次 (上午表演型选手 🚀)
|
|
157
|
+
11:00 | [██████████████████████████████] 14 次 (正常人类工作时间 ✅)
|
|
158
|
+
12:00 | [██ ] 1 次 (干饭是第一生产力 🍚)
|
|
159
|
+
13:00 | [█████████████ ] 6 次 (干饭是第一生产力 🍚)
|
|
160
|
+
14:00 | [█████████████ ] 6 次 (午后灵魂出窍者 👻)
|
|
161
|
+
15:00 | [██████████████████████████████] 14 次 (CPU 重启中 🔄)
|
|
162
|
+
16:00 | [███████████████████ ] 9 次 (临近下班突然勤奋 🤔)
|
|
163
|
+
17:00 | [██████████████████████████████] 14 次 (临近下班突然勤奋 🤔)
|
|
164
|
+
18:00 | [████ ] 2 次 (自愿(被迫)加班人 💪)
|
|
165
|
+
19:00 | [ ] 0 次
|
|
166
|
+
20:00 | [ ] 0 次
|
|
167
|
+
21:00 | [ ] 0 次
|
|
168
|
+
22:00 | [ ] 0 次
|
|
169
|
+
23:00 | [ ] 0 次
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
### 5. 幽灵提交检测
|
|
173
|
+
```bash
|
|
174
|
+
fish --ghost
|
|
175
|
+
# 或
|
|
176
|
+
fish -g
|
|
177
|
+
```
|
|
178
|
+
检测本周在 00:00 - 05:00 期间生成的 Commit,如有发现,会触发防猝死警告与尖锐吐槽。
|
|
179
|
+
```bash
|
|
180
|
+
==================================================
|
|
181
|
+
🐟 FISH - 幽灵提交检测 (深夜 00:00 ~ 05:00)
|
|
182
|
+
==================================================
|
|
183
|
+
|
|
184
|
+
🎉 恭喜!本时间段内未检测到任何深夜幽灵提交。
|
|
185
|
+
你的发际线十分安全,大福报已被无情拒收,睡眠健康得分:100 分!
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
### 6. 报告时间偏移与远程源筛选 (通用选项)
|
|
189
|
+
在运行任何报告命令时,都可以配合以下选项:
|
|
190
|
+
- **`-w, --weeks-ago <number>`**:查看之前某周/某月的报告(默认 `0` 表示本周/本月,`1` 表示上周/上月,`2` 表示上上周/上上月,以此类推)。
|
|
191
|
+
```bash
|
|
192
|
+
# 查看上周的摸鱼周报
|
|
193
|
+
fish -w 1
|
|
194
|
+
# 查看两个月前的摸鱼月报
|
|
195
|
+
fish -m 2
|
|
196
|
+
```
|
|
197
|
+
- **`-s, --source <source>`**:指定要查询的 GitLab 远程数据源,支持填别名或序号(例如 `1`, `2`)。如不填默认查询首个配置。
|
|
198
|
+
```bash
|
|
199
|
+
# 查询别名为 company-gitlab 的源在上周的数据
|
|
200
|
+
fish -w 1 -s company-gitlab
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
---
|
|
204
|
+
|
|
205
|
+
### 7. 项目与 GitLab 配置管理命令 (`fish config`)
|
|
206
|
+
- **列出当前配置的所有监控项目与 GitLab 源**:
|
|
207
|
+
```bash
|
|
208
|
+
fish config list
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
- **【划重点】配置/新增 GitLab 远程扫描源(支持多数据源管理)**:
|
|
212
|
+
```bash
|
|
213
|
+
fish config gitlab <token> [host] [name]
|
|
214
|
+
```
|
|
215
|
+
* `token`: 你的 GitLab 个人/项目访问令牌 (PAT),需有 `read_api` 或 `api` 权限。
|
|
216
|
+
* `host`: 可选。私有部署的 GitLab 域名(如 `https://gitlab.mycompany.com`),缺省默认使用 `https://gitlab.com`。
|
|
217
|
+
* `name`: 可选。给该数据源指定的别名(如 `my-company`),缺省时自动使用 host 域名作为别名。若别名已存在则会覆盖更新。
|
|
218
|
+
- **清除 GitLab 远程扫描配置**:
|
|
219
|
+
```bash
|
|
220
|
+
# 清除指定的某一个 GitLab 配置(支持写序号或别名)
|
|
221
|
+
fish config gitlab-clear <name_or_index>
|
|
222
|
+
|
|
223
|
+
# 清除所有的 GitLab 配置并关闭远程扫描
|
|
224
|
+
fish config gitlab-clear
|
|
225
|
+
```
|
|
226
|
+
|
|
227
|
+
- **手动添加一个本地 Git 仓库**:
|
|
228
|
+
```bash
|
|
229
|
+
fish config add <path_to_repo>
|
|
230
|
+
```
|
|
231
|
+
- **从监控列表中移除一个仓库**:
|
|
232
|
+
```bash
|
|
233
|
+
fish config remove <path_to_repo>
|
|
234
|
+
```
|
|
235
|
+
- **自动扫描指定目录下的一级子目录,批量添加 Git 仓库**:
|
|
236
|
+
```bash
|
|
237
|
+
fish config scan <root_path>
|
|
238
|
+
```
|
package/dist/index.js
CHANGED
|
@@ -949,6 +949,16 @@ function getTagCriticsFromDays(days) {
|
|
|
949
949
|
|
|
950
950
|
// src/index.ts
|
|
951
951
|
var program = new Command();
|
|
952
|
+
function getCliVersion() {
|
|
953
|
+
try {
|
|
954
|
+
const packageJson = JSON.parse(
|
|
955
|
+
fs2.readFileSync(new URL("../package.json", import.meta.url), "utf8")
|
|
956
|
+
);
|
|
957
|
+
return packageJson.version || "0.0.0";
|
|
958
|
+
} catch {
|
|
959
|
+
return "0.0.0";
|
|
960
|
+
}
|
|
961
|
+
}
|
|
952
962
|
var SPINNER_FRAMES = ["\u{1F41F} ", " \u{1F420} ", " \u{1F421} ", " \u{1F988} ", " \u{1F419} ", " \u{1F991} "];
|
|
953
963
|
function showLoading(message) {
|
|
954
964
|
let frameIdx = 0;
|
|
@@ -1307,15 +1317,24 @@ async function runMonthlyReport(monthsAgo, source) {
|
|
|
1307
1317
|
console.log("\n" + chalk.cyan.bold("\u{1F4C5} \u6BCF\u65E5\u6478\u9C7C\u6307\u6570\u6982\u89C8\uFF1A"));
|
|
1308
1318
|
const monthLabel = `${targetDate.getMonth() + 1}\u6708`;
|
|
1309
1319
|
const COL_WIDTH = 8;
|
|
1320
|
+
const weekHeaders = ["\u5468\u4E00", "\u5468\u4E8C", "\u5468\u4E09", "\u5468\u56DB", "\u5468\u4E94", "\u5468\u516D", "\u5468\u65E5"];
|
|
1321
|
+
const firstDay = new Date(targetDate.getFullYear(), targetDate.getMonth(), 1);
|
|
1322
|
+
const firstDayOffset = (firstDay.getDay() + 6) % 7;
|
|
1310
1323
|
const lines = [];
|
|
1311
1324
|
let dateRow = "";
|
|
1312
1325
|
let fishRow = "";
|
|
1326
|
+
lines.push(chalk.gray(weekHeaders.map((d) => visualPad(d, COL_WIDTH)).join("").trimEnd()));
|
|
1327
|
+
for (let i = 0; i < firstDayOffset; i++) {
|
|
1328
|
+
dateRow += visualPad("", COL_WIDTH);
|
|
1329
|
+
fishRow += visualPad("", COL_WIDTH);
|
|
1330
|
+
}
|
|
1313
1331
|
for (const d of stats.dailyIndices) {
|
|
1314
1332
|
const dateRaw = `${monthLabel}${d.day}\u65E5`;
|
|
1315
1333
|
const fishRaw = `${d.fish}%`;
|
|
1334
|
+
const columnIndex = (firstDayOffset + d.day - 1) % 7;
|
|
1316
1335
|
dateRow += visualPad(dateRaw, COL_WIDTH);
|
|
1317
1336
|
fishRow += visualPad(fishRaw, COL_WIDTH);
|
|
1318
|
-
if (
|
|
1337
|
+
if (columnIndex === 6 || d === stats.dailyIndices[stats.dailyIndices.length - 1]) {
|
|
1319
1338
|
lines.push(chalk.gray(dateRow.trimEnd()));
|
|
1320
1339
|
fishRow = colorizeFishRow(fishRow);
|
|
1321
1340
|
lines.push(fishRow);
|
|
@@ -1456,7 +1475,7 @@ async function runGhostReport(weeksAgo, source) {
|
|
|
1456
1475
|
console.log(chalk.red("\u547D\u662F\u81EA\u5DF1\u7684\uFF0C\u5927\u798F\u62A5\u7559\u7ED9\u8001\u677F\u5427\uFF01\u8D76\u7D27\u7761\u89C9\uFF0C\u4FDD\u547D\u8981\u7D27\uFF01\n"));
|
|
1457
1476
|
}
|
|
1458
1477
|
}
|
|
1459
|
-
program.name("fish").description("\u{1F41F} Git \u6478\u9C7C & \u7206\u809D\u5206\u6790\u5668 CLI").version(
|
|
1478
|
+
program.name("fish").description("\u{1F41F} Git \u6478\u9C7C & \u7206\u809D\u5206\u6790\u5668 CLI").version(getCliVersion()).option("-m, --month [monthsAgo]", "\u67E5\u770B\u6478\u9C7C/\u7206\u809D\u6708\u62A5 (\u9ED8\u8BA4 0 \u4E3A\u672C\u6708\uFF0C1 \u4E3A\u4E0A\u6708\uFF0C2 \u4E3A\u4E0A\u4E0A\u6708...)").option("-p, --project", "\u67E5\u770B\u9879\u76EE\u7206\u809D\u6392\u884C").option("-t, --time", "\u67E5\u770B\u9EC4\u91D1\u6478\u9C7C\u65F6\u95F4\u6BB5 analysis (24\u5C0F\u65F6\u5206\u5E03)").option("-g, --ghost", "\u68C0\u6D4B\u6DF1\u591C\u5E7D\u7075\u63D0\u4EA4").option("-w, --weeks-ago <number>", "\u67E5\u8BE2\u51E0\u5468\u524D/\u6708\u524D\u7684\u62A5\u544A (\u9ED8\u8BA4 0\uFF0C\u5373\u672C\u5468/\u672C\u6708)", "0").option("-s, --source <source>", "\u9009\u62E9\u8981\u67E5\u8BE2\u7684 GitLab \u6570\u636E\u6E90 (\u5E8F\u53F7\u6216\u522B\u540D/host)").action(async (options) => {
|
|
1460
1479
|
const weeksAgo = parseInt(options.weeksAgo || "0", 10);
|
|
1461
1480
|
const source = options.source;
|
|
1462
1481
|
if (options.month !== void 0 && options.project) {
|