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.
@@ -91,25 +91,29 @@ fish -m
91
91
  ==================================================
92
92
 
93
93
  📅 本月主要贡献占比 (基于 Commit Message 正则归类):
94
- - 修 bug (fix) :[■■■□□□□□□□□□□□□] 18% (10 次)
95
- - 新功能 (feat) :[■■■■■■■■■□□□□□□] 62% (34 次)
96
- - 杂务与文档 (chore) :[■■■□□□□□□□□□□□□] 18% (10 次)
97
- - 其他提交 (other) :[□□□□□□□□□□□□□□□] 2% (1 次)
94
+ - 修 bug (fix) :[■□□□□□□□□□□□□□□] 5% (4 次)
95
+ - 新功能 (feat) :[■■■■■■■■■■■■□□□] 79% (64 次)
96
+ - 杂务与文档 (chore) :[■■□□□□□□□□□□□□□] 14% (11 次)
97
+ - 其他提交 (other) :[□□□□□□□□□□□□□□□] 2% (2 次)
98
98
 
99
99
  📅 每日摸鱼指数概览:
100
- 6月1日 6月2日 6月3日 6月4日 6月5日 6月6日 6月7日
101
- 36% 40% 90% 38% 90% 90% 90%
100
+ 周一 周二 周三 周四 周五 周六 周日
101
+ 5月1日 5月2日 5月3日
102
+ 90% 90% 90%
102
103
 
103
- 6869日 6月10 611 612 613 614
104
- 90% 90% 20% 34% 11% 90% 90%
104
+ 54555月6日 57 58 59 510
105
+ 90% 90% 28% 90% 23% 19% 90%
105
106
 
106
- 615616617618619620621
107
- 32% 38% 23% 35% 90% 90% 90%
107
+ 511512513514515516517
108
+ 61% 39% 23% 90% 90% 90% 90%
108
109
 
109
- 6月22日 6月23日 6月24日
110
- 90% 51% 90%
110
+ 518日 5月19日 5月20日 5月21日 5月22日 5月23日 5月24日
111
+ 39% 43% 38% 28% 25% 90% 90%
111
112
 
112
- 🔥 爆肝王: 612 摸鱼指数 11% 🔥 爆肝战神 🧱 勤恳搬砖人
113
+ 5月25日 5月26日 5275月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 (d.day % 7 === 0 || d === stats.dailyIndices[stats.dailyIndices.length - 1]) {
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("1.0.0").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) => {
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) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "git-fish-log",
3
- "version": "1.0.4",
3
+ "version": "1.0.6",
4
4
  "description": "🐟 Git 摸鱼 & 爆肝分析器 CLI — 给你的提交记录生成摸鱼指数和 AI 锐评",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",