git-fish-log 1.0.8 → 1.0.10

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.
@@ -48,6 +48,18 @@ npm link
48
48
  * `host`: 可选。私有部署的 GitLab 域名(如 `https://gitlab.mycompany.com`),缺省默认使用 `https://gitlab.com`。
49
49
  * `name`: 可选。给该数据源指定的别名(如 `my-company`),缺省时自动使用 host 域名作为别名。若别名已存在则会覆盖更新。
50
50
 
51
+ ## 🆕 v1.0.10 更新内容
52
+
53
+ - **月报新增爆肝王 & 摸鱼王排行榜**:与周报一致的计算法则,从当月数据中找出摸鱼指数最低(最努力)和最高(最会摸鱼)的日子,多日并列时一起显示。统计时自动排除周末与法定节假日(调休上班日不算休息日),但如果休息日有提交记录则视为加班纳入统计。
54
+ - **月报新增摸鱼指数均值(除休息日)**:基于排除无提交休息日后的数据重新计算月均摸鱼指数,更准确反映实际工作日的摸鱼水平。同时月报锐评的阈值判断也同步改为基于此调整后均值,避免被周末/节假日的 95 分拉高。
55
+ - **周报「最努力的日子」排除周末**:周末的提交记录统一归类到「最痛苦的日子」,不再同时出现在「最努力」中,逻辑更合理。
56
+ - **周报项目名称始终显示**:去掉了 `-P` 条件限制,每日提交详情中的项目名称默认直接展示。
57
+ - **修复月报 `isWeekend` 参数**:`analyzeMonthly` 原来写死 `false`,导致周末的摸鱼指数计算缺少 +5 工作分加成,现已根据实际日期正确计算。
58
+
59
+ ## 🆕 v1.0.9 更新内容
60
+
61
+ - **月报新增节假日与调休标记**:每日摸鱼指数概览中,法定节假日日期后追加绿色圆点 `•`,法定调休上班日(周末补班)追加红色叹号 `!`,一眼分辨哪天是假日、哪天在还债。内置 2025-2026 年中国法定节假日数据,周末自动识别。
62
+
51
63
  ## 🆕 v1.0.8 更新内容
52
64
 
53
65
  - **摸鱼指数算法 v2 重设计**:引入「有效 Commit」概念(单次增删 ≥ 20 行),天然过滤格式化/小修复;代码行数改用 log₁₀ 压缩并降权至 10%,工作时长+时间分布合计占 50% 权重,摸鱼/爆肝判断更贴合直觉。详情见下方「算法说明」章节。
@@ -106,23 +118,22 @@ fish -m
106
118
 
107
119
  📅 每日摸鱼指数概览:
108
120
  周一 周二 周三 周四 周五 周六 周日
109
- 5月1日 5月2日 5月3日
110
- 90% 90% 90%
121
+ 6月1日 6月2日 6月3日 6月4日 6月5日 6月6日 6月7日
122
+ 67% 50% 48% 76% 95% 95% 95%
111
123
 
112
- 54555月6日 57 58 59 510
113
- 90% 90% 28% 90% 23% 19% 90%
124
+ 6869610日 6月11 612 613 614
125
+ 78% 78% 38% 47% 38% 95% 95%
114
126
 
115
- 511512513514515日 516日 517日
116
- 61% 39% 23% 90% 90% 90% 90%
127
+ 615616617618619日•620日•621日•
128
+ 57% 77% 42% 64% 95% 95% 95%
117
129
 
118
- 518519520521522523524
119
- 39% 43% 38% 28% 25% 90% 90%
120
-
121
- 5月25日 5月26日 5月27日 5月28日 5月29日 5月30日 5月31日
122
- 61% 28% 35% 34% 20% 90% 90%
123
-
124
- 🔥 爆肝王: 5月9日 → 摸鱼指数 19% 🔥 爆肝战神 🧱 勤恳搬砖人
130
+ 622623624625626627628
131
+ 95% 51% 95% 95% 78% 95% 95%
125
132
 
133
+ 🏆 爆肝王:6月11日 | 🐟 摸鱼指数:38%
134
+ ☕ 摸鱼王:6月26日 | 🐟 摸鱼指数:78%
135
+ --------------------------------------------------
136
+ 📊 本月均值:🐟 摸鱼指数 60%
126
137
  --------------------------------------------------
127
138
  🤖 锐评:
128
139
  本月 Feat 占比高达 62%。新功能一项接一项,开发火力全开,业务线因你而飞速前进!
package/README.md CHANGED
@@ -33,6 +33,17 @@
33
33
  * `host`: 可选。私有部署的 GitLab 域名(如 `https://gitlab.mycompany.com`),缺省默认使用 `https://gitlab.com`。
34
34
  * `name`: 可选。给该数据源指定的别名(如 `my-company`),缺省时自动使用 host 域名作为别名。若别名已存在则会覆盖更新。
35
35
 
36
+ ## 🆕 v1.0.10 更新内容
37
+
38
+ - **月报新增爆肝王 & 摸鱼王排行榜**:与周报一致的计算法则,从当月数据中找出摸鱼指数最低(最努力)和最高(最会摸鱼)的日子,多日并列时一起显示。统计时自动排除周末与法定节假日(调休上班日不算休息日),但如果休息日有提交记录则视为加班纳入统计。
39
+ - **月报新增摸鱼指数均值(除休息日)**:基于排除无提交休息日后的数据重新计算月均摸鱼指数,更准确反映实际工作日的摸鱼水平。同时月报锐评的阈值判断也同步改为基于此调整后均值,避免被周末/节假日的 95 分拉高。
40
+ - **周报「最努力的日子」排除周末**:周末的提交记录统一归类到「最痛苦的日子」,不再同时出现在「最努力」中,逻辑更合理。
41
+ - **周报项目名称始终显示**:去掉了 `-P` 条件限制,每日提交详情中的项目名称默认直接展示。
42
+ - **修复月报 `isWeekend` 参数**:`analyzeMonthly` 原来写死 `false`,导致周末的摸鱼指数计算缺少 +5 工作分加成,现已根据实际日期正确计算。
43
+
44
+ ## 🆕 v1.0.9 更新内容
45
+
46
+ - **月报新增节假日与调休标记**:每日摸鱼指数概览中,法定节假日日期后追加绿色圆点 `•`,法定调休上班日(周末补班)追加红色叹号 `!`,一眼分辨哪天是假日、哪天在还债。内置 2025-2026 年中国法定节假日数据,周末自动识别。
36
47
 
37
48
  ## 🆕 v1.0.8 更新内容
38
49
 
@@ -105,8 +116,10 @@ fish -m
105
116
  5月25日 5月26日 5月27日 5月28日 5月29日 5月30日 5月31日
106
117
  61% 28% 35% 34% 20% 90% 90%
107
118
 
108
- 🔥 爆肝王: 5月9日 摸鱼指数 19% 🔥 爆肝战神 🧱 勤恳搬砖人
109
-
119
+ 🏆 爆肝王:5月9日 | 🐟 摸鱼指数:19%
120
+ ☕ 摸鱼王:5月26日 | 🐟 摸鱼指数:28%
121
+ --------------------------------------------------
122
+ 📊 本月均值:🐟 摸鱼指数 49%
110
123
  --------------------------------------------------
111
124
  🤖 锐评:
112
125
  本月 Feat 占比高达 62%。新功能一项接一项,开发火力全开,业务线因你而飞速前进!
package/dist/index.js CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  // src/index.ts
4
4
  import { Command } from "commander";
5
- import chalk2 from "chalk";
5
+ import chalk from "chalk";
6
6
  import fs2 from "fs";
7
7
  import path3 from "path";
8
8
 
@@ -791,7 +791,9 @@ async function analyzeMonthly(projectPaths, now = /* @__PURE__ */ new Date(), so
791
791
  for (let d = 1; d <= maxDay; d++) {
792
792
  const dateStr = `${since.getFullYear()}-${since.getMonth() + 1}-${d}`;
793
793
  const dayCommits = commitsByDateStr[dateStr] || [];
794
- const indices = calculateDayIndices(dayCommits, false);
794
+ const dayDate = new Date(since.getFullYear(), since.getMonth(), d);
795
+ const isWeekend = dayDate.getDay() === 0 || dayDate.getDay() === 6;
796
+ const indices = calculateDayIndices(dayCommits, isWeekend);
795
797
  totalFish += indices.fish;
796
798
  totalHardworking += indices.hardworking;
797
799
  totalNightOwl += indices.nightOwl;
@@ -848,88 +850,59 @@ async function getGhostCommits(projectPaths, since, until, source) {
848
850
  }
849
851
 
850
852
  // src/critic.ts
851
- import chalk from "chalk";
852
853
  var SLACK_HIGH_CRITIQUES = [
853
- "\u672C\u5468\u6478\u9C7C\u6307\u6570\u62C9\u6EE1\uFF01\u770B\u6765\u662F\u5728\u6DF1\u5EA6\u8D2F\u5F7B\u2018\u52B3\u9038\u7ED3\u5408\u2019\u7684\u6700\u9AD8\u751F\u4EA7\u529B\u539F\u5219\uFF0C\u8FDE\u4E0B\u5468\u4E2D\u5348\u5403\u4EC0\u4E48\u3001\u4E0B\u5348\u8336\u9009\u54EA\u5BB6\u90FD\u89C4\u5212\u5F97\u4E95\u4E95\u6709\u6761\uFF0C\u677E\u5F1B\u611F\u76F4\u63A5\u62C9\u6EE1\u3002",
854
- "\u4F60\u7684 Commit \u5217\u8868\u5E72\u51C0\u5F97\u50CF\u521A\u6D17\u8FC7\u7684\u8138\uFF0C\u6E05\u723D\u65E0\u591A\u4F59\u63D0\u4EA4\u3002\u77ED\u6682\u84C4\u529B\u84C4\u52BF\u5F85\u53D1\u4E5F\u662F\u4E00\u79CD\u9AD8\u6548\u8282\u594F\uFF0C\u5750\u7B49\u4E0B\u5468\u4F60\u618B\u597D\u7684\u5927\u62DB\u96C6\u4E2D\u7206\u53D1\uFF01",
855
- "\u770B\u6765\u672C\u5468\u7684\u9879\u76EE\u8FDB\u5165\u4E86\u4E13\u5C5E\u2018\u517B\u7CBE\u84C4\u9510\u2019\u7F13\u51B2\u9636\u6BB5\u2014\u2014\u8981\u4E48\u624B\u673A\u77ED\u89C6\u9891\u592A\u4E0A\u5934\uFF0C\u8981\u4E48\u5348\u4F11\u5C0F\u5E8A\u592A\u8FC7\u6696\u548C\uFF0C\u677E\u5F1B\u6478\u9C7C\u6280\u5DE7\u5DF2\u7136\u7EC3\u81F3\u7089\u706B\u7EAF\u9752\u4E4B\u5883\u3002",
856
- "\u4F60\u7684\u63D0\u4EA4\u9891\u7387\u50CF\u6781\u4E86\u9000\u6F6E\u540E\u7684\u6C99\u6EE9\uFF0C\u6574\u7247Git\u8BB0\u5F55\u6BEB\u65E0\u6CE2\u6F9C\uFF0C\u5B89\u9759\u5F97\u4E0D\u50CF\u8BDD\u3002\u5EFA\u8BAE\u4E0B\u5468\u7A0D\u5FAE\u591A\u52A8\u52A8\u624B\u6307\uFF0C\u8BA9\u6C89\u5BC2\u8BB8\u4E45\u7684Git\u8D21\u732E\u56FE\u6807\u91CD\u65B0\u4EAE\u8D77\u6765\u3002",
857
- "\u8FD9\u63D0\u4EA4\u6B21\u6570\u5C48\u6307\u53EF\u6570\uFF0C\u4E24\u53EA\u624B\u90FD\u80FD\u8F7B\u677E\u6570\u5B8C\u3002\u770B\u6765\u662F\u5728\u8DF5\u884C\u2018\u4E0D\u5199\u4EE3\u7801\u5C31\u6CA1\u6709bug\u2019\u7684\u81F3\u9AD8\u9632\u5B88\u6CD5\u5219\uFF0C\u5168\u7A0B\u4E3B\u6253\u4E00\u4E2A\u96F6\u51FA\u9519\u3001\u7A33\u5B57\u5F53\u5934\u3002",
858
- "\u672C\u5468\u5DE5\u4F5C\u91CF\u8F7B\u677E\u62FF\u634F\uFF0C\u5C11\u91CF\u63D0\u4EA4\u5C31\u5B8C\u6210\u5168\u90E8\u65E2\u5B9A\u4EFB\u52A1\uFF0C\u9AD8\u6548\u5B8C\u5DE5\u540E\u5B89\u5FC3\u653E\u7A7A\u5145\u7535\uFF0C\u61C2\u5206\u5BF8\u4F1A\u4F11\u606F\uFF0C\u624D\u662F\u957F\u4E45\u9AD8\u6548\u5DE5\u4F5C\u7684\u6B63\u786E\u6253\u5F00\u65B9\u5F0F\u3002",
859
- "Git\u9875\u9762\u4E00\u7247\u6E05\u51C0\uFF0C\u6CA1\u6709\u5BC6\u96C6\u8FED\u4EE3\u75D5\u8FF9\uFF0C\u4E0D\u7528\u8FFD\u8D76\u8FDB\u5EA6\u7684\u4E00\u5468\u5C5E\u5B9E\u8212\u670D\u3002\u597D\u597D\u8C03\u6574\u72B6\u6001\uFF0C\u7B49\u9700\u6C42\u96C6\u4E2D\u5230\u6765\u65F6\u518D\u5168\u529B\u51B2\u523A\u4E5F\u4E0D\u8FDF\u3002"
854
+ "\u672C\u5468\u6478\u9C7C\u6307\u6570\u62C9\u6EE1\uFF0C\u677E\u5F1B\u611F\u76F4\u63A5\u6EA2\u51FA\u5C4F\u5E55\u3002\u52B3\u9038\u7ED3\u5408\u8FD9\u5757\uFF0C\u4F60\u7B97\u662F\u73A9\u660E\u767D\u4E86\u3002",
855
+ "Commit \u5217\u8868\u6E05\u723D\u5F97\u50CF\u521A\u683C\u5F0F\u5316\u8FC7\u7684\u786C\u76D8\u3002",
856
+ "\u672C\u5468\u9879\u76EE\u8FDB\u5165\u4E86'\u517B\u7CBE\u84C4\u9510'\u7F13\u51B2\u9636\u6BB5\uFF0C\u6478\u9C7C\u6280\u5DE7\u5DF2\u81FB\u5316\u5883\u3002",
857
+ "\u63D0\u4EA4\u9891\u7387\u5E73\u7F13\u5982\u5FC3\u7535\u56FE\uFF0C\u7A33\u5B9A\uFF0C\u5C31\u662F\u6709\u70B9\u592A\u5E73\u4E86\u3002",
858
+ "\u63D0\u4EA4\u6B21\u6570\u4E24\u53EA\u624B\u6570\u5F97\u8FC7\u6765\u3002'\u4E0D\u5199\u4EE3\u7801\u5C31\u6CA1\u6709bug'\uFF01\u903B\u8F91\u81EA\u6D3D\uFF0C\u65E0\u6CD5\u53CD\u9A73\u3002",
859
+ "\u5C11\u91CF\u63D0\u4EA4\u641E\u5B9A\u5168\u90E8\u4EFB\u52A1\uFF0C\u9AD8\u6548\u6536\u5DE5\u540E\u5B89\u5FC3\u653E\u7A7A\u3002\u61C2\u4F11\u606F\u7684\u4EBA\uFF0C\u624D\u61C2\u957F\u4E45\u3002",
860
+ "Git\u9875\u9762\u4E00\u7247\u6E05\u51C0\uFF0C\u6CA1\u6709\u8FED\u4EE3\u75D5\u8FF9\uFF0C\u4E0D\u7528\u8FFD\u8D76\u8FDB\u5EA6\u7684\u4E00\u5468\uFF0C\u8212\u670D\u5F97\u8BA9\u4EBA\u5AC9\u5992\u3002"
860
861
  ];
861
862
  var SLACK_LOW_CRITIQUES = [
862
- "\u672C\u5468\u7206\u809D\u6307\u6570\u76F4\u63A5\u7206\u8868\uFF01\u770B\u5230\u4F60\u5BC6\u5BC6\u9EBB\u9EBB\u5806\u53E0\u6210\u7247\u7684\u63D0\u4EA4\u8BB0\u5F55\uFF0C\u9694\u58C1\u6D4B\u8BD5\u5C0F\u59D0\u59D0\u770B\u4E86\u90FD\u9ED8\u9ED8\u7EA2\u4E86\u773C\u7736\uFF0C\u8FDE\u5E38\u5E74\u670D\u5F79\u7684\u952E\u76D8\u90FD\u5728\u4E3A\u4F60\u7684\u9AD8\u5F3A\u5EA6\u8F93\u51FA\u957F\u9E23\u81F4\u656C\u3002",
863
- "\u4F60\u8FD9\u5468\u62FC\u5C3D\u5168\u529B\u57CB\u5934\u6DF1\u8015\uFF0C\u4EE3\u7801\u5E93\u7684\u534A\u58C1\u6C5F\u5C71\u51E0\u4E4E\u90FD\u662F\u4F60\u4E00\u624B\u6253\u4E0B\u6765\u7684\u3002\u5FD9\u5B8C\u8FD9\u9635\u5B50\u4E00\u5B9A\u8981\u7ED9\u81EA\u5DF1\u5B89\u6392\u4E00\u676F\u51B0\u5976\u8336\uFF0C\u597D\u597D\u7292\u52B3\u8F9B\u82E6\u4ED8\u51FA\u7684\u81EA\u5DF1\uFF01",
864
- "\u5144\u5F1F\uFF0C\u4F60\u672C\u5468\u6709\u6548\u5DE5\u65F6\u76F4\u63A5\u62C9\u6EE1\uFF0C\u4ECE\u65E9\u5230\u665A\u4E0D\u505C\u8FED\u4EE3\u3002\u8BB0\u5F97\u9002\u65F6\u505C\u4E0B\u6B47\u4E00\u6B47\uFF0C\u4EE3\u7801\u5199\u9519\u53EF\u4EE5\u56DE\u6EDA\u91CD\u5199\uFF0C\u4F46\u8EAB\u4F53\u6CA1\u6709\u64A4\u9500\u952E\uFF0C\u62BD\u7A7A\u597D\u597D\u4F11\u606F\u8C03\u517B\u3002",
865
- "\u75AF\u72C2\u642C\u7816\uFF0C\u809D\u5929\u809D\u5730\u4E0D\u505C\u6B47\u3002\u4E0D\u6B62\u5728\u548C\u622A\u6B62\u65F6\u95F4\u75AF\u72C2\u8D5B\u8DD1\uFF0C\u66F4\u662F\u4EC5\u51ED\u4E00\u5DF1\u4E4B\u529B\uFF0C\u4E00\u70B9\u70B9\u586B\u5E73\u56E2\u961F\u524D\u671F\u5806\u79EF\u7684\u5404\u7C7B\u5386\u53F2\u6280\u672F\u5751\uFF0C\u771F\u7684\u8F9B\u82E6\u4E86\uFF01",
866
- "\u8FDE\u7EED\u4E0D\u95F4\u65AD\u7684\u63D0\u4EA4\u6570\u91CF\u591A\u5230\u8BA9\u4EBA\u770B\u7740\u90FD\u5FC3\u75BC\u3002\u9879\u76EE\u662F\u957F\u7EBF\u6301\u4E45\u6218\uFF0C\u8EAB\u4F53\u624D\u662F\u81EA\u5DF1\u7684\u672C\u94B1\uFF0C\u4E0D\u7528\u4E00\u5473\u900F\u652F\u81EA\u5DF1\uFF0C\u7559\u70B9\u7CBE\u529B\u7EC6\u6C34\u957F\u6D41\u7A33\u6B65\u8FED\u4EE3\u3002",
867
- "\u5168\u5929\u5728\u7EBF\u6301\u7EED\u8F93\u51FA\uFF0C\u5927\u5C0F\u9700\u6C42\u3001\u7D27\u6025\u8FED\u4EE3\u4E00\u624B\u5305\u63FD\uFF0C\u56E2\u961F\u8FDB\u5EA6\u5168\u9760\u4F60\u515C\u5E95\u652F\u6491\u3002\u9AD8\u5F3A\u5EA6\u5DE5\u4F5C\u4E4B\u4F59\u8BB0\u5F97\u591A\u8D77\u8EAB\u8D70\u52A8\uFF0C\u591A\u559D\u6C34\uFF0C\u522B\u4E00\u76F4\u4E45\u5750\u4E0D\u52A8\u3002",
868
- "\u6574\u5468\u5168\u7A0B\u9AD8\u8D1F\u8377\u8F93\u51FA\uFF0C\u63D0\u4EA4\u8BB0\u5F55\u65AD\u5C42\u9886\u5148\u5168\u961F\uFF0C\u4E3A\u9879\u76EE\u63A8\u8FDB\u7ACB\u4E0B\u5927\u529F\u3002\u5DE5\u4F5C\u518D\u91CD\u8981\u4E5F\u8981\u517C\u987E\u4F5C\u606F\uFF0C\u9002\u5EA6\u653E\u677E\u624D\u80FD\u4FDD\u6301\u957F\u4E45\u7A33\u5B9A\u7684\u5F00\u53D1\u72B6\u6001\u3002"
863
+ "\u8FD9\u5468\u4EE3\u7801\u5E93\u7684\u534A\u58C1\u6C5F\u5C71\u662F\u4F60\u6253\u4E0B\u6765\u7684\u3002\u5FD9\u5B8C\u8BB0\u5F97\u7ED9\u81EA\u5DF1\u70B9\u676F\u51B0\u5976\u8336\uFF0C\u4F60\u503C\u5F97\u3002",
864
+ "\u6709\u6548\u5DE5\u65F6\u62C9\u6EE1\uFF0C\u4ECE\u65E9\u8FED\u4EE3\u5230\u665A\u3002\u4EE3\u7801\u80FD\u56DE\u6EDA\uFF0C\u8EAB\u4F53\u4E0D\u80FD\u2014\u2014\u62BD\u7A7A\u6B47\u6B47\u3002",
865
+ "\u9AD8\u5F3A\u5EA6\u642C\u7816\u4E0D\u505C\u6B47\uFF0C\u4E0D\u6B62\u5728\u8D76 deadline\uFF0C\u8FD8\u5728\u9ED8\u9ED8\u586B\u56E2\u961F\u7684\u5386\u53F2\u5751\u3002\u8F9B\u82E6\u4E86\u3002",
866
+ "\u63D0\u4EA4\u6570\u91CF\u591A\u5230\u5FC3\u75BC\u3002\u9879\u76EE\u662F\u6301\u4E45\u6218\uFF0C\u8EAB\u4F53\u624D\u662F\u672C\u91D1\uFF0C\u7559\u70B9\u4F59\u91CF\u3002",
867
+ "\u5168\u5929\u5728\u7EBF\u6301\u7EED\u8F93\u51FA\uFF0C\u5927\u5C0F\u9700\u6C42\u4E00\u624B\u5305\u63FD\uFF0C\u56E2\u961F\u8FDB\u5EA6\u6709\u4F60\u515C\u5E95\u3002\u8BB0\u5F97\u591A\u559D\u6C34\uFF0C\u591A\u8D70\u52A8\u3002",
868
+ "\u6574\u5468\u9AD8\u8D1F\u8377\u8F93\u51FA\uFF01\u5DE5\u4F5C\u518D\u91CD\u8981\uFF0C\u4E5F\u522B\u628A\u8EAB\u4F53\u5F53\u4E00\u6B21\u6027\u8017\u6750\u3002"
869
869
  ];
870
870
  var GHOST_CRITIQUES = [
871
- "\u3010\u5E7D\u7075\u63D0\u4EA4\u9884\u8B66\u3011\u51CC\u6668\u65F6\u5206\u7684Commit\u6CDB\u7740\u6E05\u51B7\u5FAE\u5149\u3002\u9002\u5EA6\u6DF1\u591C\u653B\u575A\u6CA1\u95EE\u9898\uFF0C\u4F46\u7761\u89C9\u540C\u6837\u662F\u7A0B\u5E8F\u5458\u5FC5\u5907\u56DE\u8840\u6280\u80FD\uFF0C\u5199\u5B8C\u8D76\u7D27\u5B58\u76D8\u4F11\u606F\u5427\u3002",
872
- "\u534A\u591C\u4E09\u66F4\u8FD8\u5728\u6301\u7EED\u63A8\u9001\u4EE3\u7801\uFF0C\u597D\u5947\u4F60\u662F\u5728\u548C\u6D77\u5916\u65F6\u533A\u7684\u5F00\u53D1\u540C\u6B65\u5BF9\u6218\uFF0C\u8FD8\u662F\u72EC\u4EAB\u4E07\u7C41\u4FF1\u5BC2\u7684\u6DF1\u591C\uFF0C\u4EAB\u53D7\u65E0\u4EBA\u6253\u6270\u7684\u7EDD\u4F73\u7075\u611F\u7206\u53D1\u65F6\u523B\uFF1F",
873
- "\u96F6\u70B9\u8FC7\u540E\u5927\u91CF\u63D0\u4EA4\u8BB0\u5F55\u88AB\u7CFB\u7EDF\u68C0\u6D4B\u6355\u83B7\uFF01\u4F60\u71AC\u591C\u653B\u575A\u7684\u62FC\u547D\u67B6\u52BF\uFF0C\u4E00\u5FC3\u60F3\u7528\u6DF1\u591C\u7075\u611F\u7A33\u4F4F\u9879\u76EE\u8FDB\u5EA6\uFF0C\u4F46\u518D\u5FD9\u788C\u4E5F\u8981\u8BB0\u5F97\u7ED9\u8EAB\u4F53\u5145\u8DB3\u5145\u7535\u65F6\u95F4\u3002",
874
- "\u522B\u518D\u901A\u5BB5\u786C\u809D\u5566\uFF0C\u6DF1\u591C\u8FD8\u5728\u53CD\u590D\u63D0\u4EA4\u8C03\u8BD5\uFF0C\u8FDE7x24\u8FD0\u884C\u7684CI\u673A\u5668\u4EBA\u90FD\u5FCD\u4E0D\u4F4F\u60F3\u5F39\u7A97\u529D\u4F60\u65E9\u70B9\u4F11\u606F\uFF0C\u8D76\u7D27\u4FDD\u5B58\u4EE3\u7801\u4E0B\u7EBF\uFF0C\u68A6\u91CC\u6CA1\u6709\u96BE\u7F20bug\u3002",
875
- "\u4E13\u5C5E\u51CC\u6668\u4E0A\u5206\u7684\u5E7D\u7075\u5F00\u53D1\u8005\uFF0C\u767D\u5929\u5FD9\u4E8E\u5404\u7C7B\u6C9F\u901A\u7410\u4E8B\uFF0C\u53EA\u80FD\u6DF1\u591C\u6C89\u4E0B\u5FC3\u68B3\u7406\u590D\u6742\u903B\u8F91\u3002\u4F46\u957F\u671F\u71AC\u591C\u635F\u8017\u7CBE\u529B\uFF0C\u5C3D\u91CF\u522B\u5929\u5929\u71AC\u5230\u540E\u534A\u591C\u3002",
876
- "\u5BC2\u9759\u6DF1\u591C\u72EC\u5B88\u5DE5\u4F4D\u6572\u4EE3\u7801\uFF0C\u6BCF\u4E00\u6761\u51CC\u6668\u63D0\u4EA4\u90FD\u662F\u4E3A\u89E3\u51B3\u5361\u70B9\u7684\u4ED8\u51FA\uFF0C\u8FD9\u4EFD\u4E13\u6CE8\u503C\u5F97\u80AF\u5B9A\uFF0C\u53EA\u662F\u4FEE\u4ED9\u9891\u7387\u522B\u592A\u9AD8\uFF0C\u4FDD\u8BC1\u57FA\u7840\u7761\u7720\u624D\u4E0D\u5BB9\u6613\u6389\u94FE\u5B50\u3002",
877
- "\u522B\u4EBA\u65E9\u5DF2\u8FDB\u5165\u68A6\u4E61\uFF0C\u53EA\u6709\u4F60\u7684Git\u8BB0\u5F55\u8FD8\u5728\u6301\u7EED\u66F4\u65B0\uFF0C\u6DF1\u591C\u5B89\u9759\u73AF\u5883\u786E\u5B9E\u9002\u5408\u5543\u786C\u9AA8\u5934\uFF0C\u8BB0\u5F97\u8BBE\u7F6E\u5B9A\u65F6\u63D0\u9192\uFF0C\u5230\u70B9\u51C6\u65F6\u653E\u4E0B\u7535\u8111\u4F11\u606F\u3002"
878
- ];
879
- var CATEGORY_FIX_CRITIQUES = [
880
- "\u4F60\u5DF2\u7136\u6210\u4E3A\u56E2\u961F\u4E13\u5C5E\u2018\u804C\u4E1A\u6551\u706B\u961F\u957F\u2019\uFF0C\u6574\u65E5\u6CE1\u5728\u4EE3\u7801\u5E93\u91CC\u8003\u53E4\u6EAF\u6E90\u3001\u7EBF\u4E0A\u7D27\u6025\u6551\u706B\uFF0C\u7CFB\u7EDF\u5E73\u7A33\u8FD0\u884C\u7684\u7A33\u5B9A\u9632\u7EBF\uFF0C\u5168\u7A0B\u5168\u9760\u4F60\u6B7B\u6B7B\u5B88\u4F4F\u3002",
881
- "\u672C\u6708\u6838\u5FC3\u5DE5\u4F5C\u96C6\u4E2D\u4FEE\u590DBug\uFF0C\u4FEE\u590D\u7C7B\u63D0\u4EA4\u5360\u6BD4\u9AD8\u8FBE %PERCENT%%\u3002\u4E00\u70B9\u70B9\u6E05\u7406\u9648\u5E74\u6280\u672F\u503A\uFF0C\u626B\u6E05\u7CFB\u7EDF\u9690\u85CF\u9690\u60A3\uFF0C\u540C\u65F6\u4E3A\u540E\u7EED\u5F00\u53D1\u540C\u4E8B\u94FA\u5E73\u987A\u7545\u9053\u8DEF\u3002",
882
- "\u6BCF\u65E5\u5FAA\u73AF\u5F00\u542Ffix\u4FEE\u590D\u6A21\u5F0F\uFF0C\u672C\u6708\u7CFB\u7EDF\u7A33\u5B9A\u5EA6\u5168\u9760\u4F60\u5728\u7EBF\u503C\u5B88\u515C\u5E95\uFF0C\u9ED8\u9ED8\u5904\u7406\u5404\u7C7B\u7A81\u53D1\u5F02\u5E38\uFF0C\u662F\u85CF\u5728\u4EE3\u7801\u80CC\u540E\u65E0\u4EBA\u7559\u610F\u7684\u5E55\u540E\u82F1\u96C4\u3002",
883
- "\u5F53\u4E4B\u65E0\u6127\u4EE3\u7801\u5E93\u6E05\u9053\u592B\u3001\u7EC8\u6781Bug\u7EC8\u7ED3\u8005\u3002\u6BCF\u4FEE\u590D\u4E00\u5904\u5F02\u5E38\u6F0F\u6D1E\uFF0C\u7CFB\u7EDF\u8FD0\u884C\u9690\u60A3\u5C31\u5C11\u4E00\u5206\uFF0C\u6574\u4E2A\u9879\u76EE\u7684\u8FD0\u884C\u5B89\u5168\u611F\u76F4\u63A5\u62C9\u6EE1\u3002",
884
- "\u5927\u534A\u7CBE\u529B\u90FD\u6295\u5165\u6545\u969C\u4FEE\u590D\u4E0E\u95EE\u9898\u515C\u5E95\uFF0C\u4E3B\u52A8\u627F\u63A5\u5404\u7C7B\u68D8\u624B\u7EBF\u4E0A\u95EE\u9898\uFF0C\u5E2E\u56E2\u961F\u89C4\u907F\u5927\u91CF\u7EBF\u4E0A\u98CE\u9669\uFF0C\u7E41\u7410\u67AF\u71E5\u7684\u4FEE\u590D\u5DE5\u4F5C\u5168\u9760\u4F60\u625B\u4E0B\u3002",
885
- "\u4E13\u6CE8\u515C\u5E95\u7EF4\u7A33\u4E00\u6574\u6708\uFF0C\u6BD4\u8D77\u65B0\u589E\u529F\u80FD\u66F4\u5728\u610F\u7CFB\u7EDF\u7A33\u5B9A\uFF0C\u65E0\u6570\u7EC6\u788E\u5C0Fbug\u88AB\u9010\u4E00\u6E05\u96F6\uFF0C\u6709\u4F60\u5728\uFF0C\u5927\u5BB6\u8FED\u4EE3\u65B0\u9700\u6C42\u65F6\u90FD\u683C\u5916\u5B89\u5FC3\u3002",
886
- "\u957F\u671F\u6DF1\u8015\u95EE\u9898\u4FEE\u590D\u8D5B\u9053\uFF0C\u8010\u5FC3\u8FFD\u6EAF\u6BCF\u4E00\u5904\u62A5\u9519\u6839\u6E90\uFF0C\u4E0D\u6577\u884D\u4E0D\u7CCA\u5F04\uFF0C\u7528\u4E00\u6B21\u6B21fix\u7B51\u7262\u9879\u76EE\u5E95\u5C42\u7A33\u5B9A\u6027\uFF0C\u4F4E\u8C03\u5374\u4E0D\u53EF\u6216\u7F3A\u3002"
887
- ];
888
- var CATEGORY_FEAT_CRITIQUES = [
889
- "\u672C\u6708\u65B0\u589E\u529F\u80FDFeat\u63D0\u4EA4\u5360\u6BD4\u9AD8\u8FBE %PERCENT%%\uFF0C\u5168\u65B0\u9700\u6C42\u4E00\u9879\u63A5\u4E00\u9879\u843D\u5730\uFF0C\u5F00\u53D1\u706B\u529B\u5168\u7A0B\u62C9\u6EE1\uFF0C\u6574\u6761\u4E1A\u52A1\u7EBF\u90FD\u56E0\u4E3A\u4F60\u7684\u8F93\u51FA\u98DE\u901F\u5411\u524D\u63A8\u8FDB\uFF01",
890
- "\u6807\u51C6\u65B0\u529F\u80FD\u72C2\u9B54\u672C\u4EBA\uFF01\u4E0D\u505C\u627F\u63A5\u843D\u5730\u5404\u7C7B\u5168\u65B0\u9700\u6C42\u4E0E\u4E1A\u52A1\u6A21\u5757\uFF0C\u4EE3\u7801\u8F93\u51FA\u91CF\u76F4\u63A5\u62C9\u6EE1\uFF0C\u95F2\u6687\u4E4B\u4F59\u4E5F\u53EF\u4EE5\u56DE\u5934\u7B80\u5355\u6253\u78E8\u7EC6\u8282\u4F18\u5316\u4F53\u9A8C\u3002\u8F9B\u82E6\u4F60\u6301\u7EED\u9AD8\u5F3A\u5EA6\u5F00\u53D1\uFF01",
891
- "\u75AF\u72C2\u6301\u7EED\u8F93\u51FAfeature\u65B0\u529F\u80FD\uFF0C\u9879\u76EE\u4EE3\u7801\u5E93\u7684\u4E1A\u52A1\u8FB9\u754C\u88AB\u4F60\u4E00\u6B21\u6B21\u5411\u5916\u62D3\u5BBD\uFF0C\u6562\u4E8E\u5F00\u62D3\u65B0\u4E1A\u52A1\u573A\u666F\uFF0C\u59A5\u59A5\u56E2\u961F\u91CC\u7684\u529F\u80FD\u5F00\u62D3\u5148\u950B\u3002",
892
- "\u6574\u6708\u4E3B\u653B\u65B0\u6A21\u5757\u3001\u65B0\u6D41\u7A0B\u5F00\u53D1\uFF0C\u6E90\u6E90\u4E0D\u65AD\u4EA4\u4ED8\u53EF\u7528\u65B0\u80FD\u529B\uFF0C\u4E1A\u52A1\u62D3\u5C55\u5168\u9760\u4F60\u652F\u6491\uFF0C\u5F00\u62D3\u521B\u65B0\u80FD\u529B\u62C9\u6EE1\uFF0C\u5FD9\u5B8C\u53EF\u4EE5\u9002\u5F53\u653E\u7F13\u8282\u594F\u4F11\u6574\u4E00\u4E0B\u3002",
893
- "\u51E0\u4E4E\u5927\u534A\u63D0\u4EA4\u90FD\u7528\u4E8E\u642D\u5EFA\u5168\u65B0\u4E1A\u52A1\u529F\u80FD\uFF0C\u4E3B\u52A8\u5543\u4E0B\u590D\u6742\u65B0\u9700\u6C42\uFF0C\u4E0D\u65AD\u4E30\u5BCC\u4EA7\u54C1\u80FD\u529B\uFF0C\u56E2\u961F\u4E1A\u52A1\u7248\u56FE\u7684\u6269\u5F20\u79BB\u4E0D\u5F00\u4F60\u7684\u5168\u529B\u8F93\u51FA\u3002",
894
- "\u4EE5\u642D\u5EFA\u65B0\u529F\u80FD\u4E3A\u6838\u5FC3\u5F00\u53D1\u4E3B\u7EBF\uFF0C\u4ECE0\u52301\u642D\u5EFA\u5404\u7C7B\u4E1A\u52A1\u6A21\u5757\uFF0C\u843D\u5730\u6548\u7387\u51FA\u4F17\uFF0C\u6E90\u6E90\u4E0D\u65AD\u4E3A\u4EA7\u54C1\u6CE8\u5165\u65B0\u80FD\u529B\uFF0C\u5F00\u62D3\u578B\u5F00\u53D1\u9009\u624B\u8BA4\u8BC1\u3002",
895
- "\u4E13\u6CE8\u521B\u65B0\u4E1A\u52A1\u8FED\u4EE3\uFF0C\u5404\u7C7B\u65B0\u9700\u6C42\u5FEB\u901F\u843D\u5730\u4E0A\u7EBF\uFF0C\u6301\u7EED\u7ED9\u4EA7\u54C1\u53E0\u52A0\u65B0\u7279\u6027\uFF0C\u63A8\u8FDB\u4E1A\u52A1\u589E\u957F\u529F\u4E0D\u53EF\u6CA1\uFF0C\u957F\u671F\u9AD8\u5F3A\u5EA6\u5F00\u53D1\u8BB0\u5F97\u52B3\u9038\u7ED3\u5408\u3002"
896
- ];
897
- var CATEGORY_CHORE_CRITIQUES = [
898
- "\u65E5\u5E38\u7EF4\u62A4Chore\u3001\u6587\u6863Docs\u7C7B\u63D0\u4EA4\u5360\u6BD4 %PERCENT%%\u3002\u5B8C\u6574\u6210\u719F\u7684\u9879\u76EE\u4E0D\u6B62\u4F9D\u9760\u4E1A\u52A1\u4EE3\u7801\uFF0C\u66F4\u9700\u8981\u6709\u4EBA\u6C89\u6DC0\u6E05\u6670\u6587\u6863\u89C4\u8303\uFF0C\u524D\u4EBA\u7EC6\u81F4\u8015\u8018\uFF0C\u540E\u4EBA\u5F00\u53D1\u624D\u80FD\u5C11\u8D70\u5F2F\u8DEF\u3002",
899
- "\u6BCF\u65E5\u57CB\u5934\u4FEE\u6539\u914D\u7F6E\u6587\u4EF6\u3001\u5B8C\u5584\u6CE8\u91CA\u6587\u6863\u3001\u7EDF\u4E00\u4EE3\u7801\u683C\u5F0F\u5316\uFF0C\u4F60\u582A\u79F0\u4EE3\u7801\u5E93\u4E13\u5C5E\u56ED\u4E01\u3002\u8FD9\u7C7B\u5DE5\u4F5C\u770B\u4F3C\u4E0D\u8D77\u773C\uFF0C\u5374\u80FD\u6301\u7EED\u7EF4\u62A4\u9879\u76EE\u5065\u5EB7\u5EA6\u4E0E\u4EE3\u7801\u53EF\u8BFB\u6027\u3002",
900
- "Chore\u4E0E\u6587\u6863\u7C7B\u63D0\u4EA4\u5360\u6BD4\u5341\u5206\u7A81\u51FA\uFF0C\u9879\u76EE\u80FD\u591F\u957F\u671F\u7A33\u5B9A\u8FED\u4EE3\u8FD0\u884C\uFF0C\u79BB\u4E0D\u5F00\u8FD9\u4E9B\u4F4E\u8C03\u7410\u788E\u3001\u5374\u8D77\u5230\u5173\u952E\u652F\u6491\u4F5C\u7528\u7684\u65E5\u5E38\u7EF4\u62A4\u5DE5\u4F5C\u3002",
901
- "\u4E3B\u52A8\u5305\u63FD\u9879\u76EE\u6742\u9879\u7EF4\u62A4\u5DE5\u4F5C\uFF1A\u66F4\u65B0\u90E8\u7F72\u914D\u7F6E\u3001\u8865\u5168\u63A5\u53E3\u6587\u6863\u3001\u7EDF\u4E00\u4EE3\u7801\u683C\u5F0F\uFF0C\u9ED8\u9ED8\u4F18\u5316\u56E2\u961F\u534F\u4F5C\u73AF\u5883\uFF0C\u51CF\u5C11\u6240\u6709\u4EBA\u540E\u7EED\u5F00\u53D1\u6C9F\u901A\u6210\u672C\u3002",
902
- "\u4E0D\u8FFD\u9010\u4EAE\u773C\u65B0\u529F\u80FD\u5F00\u53D1\uFF0C\u6DF1\u8015\u9879\u76EE\u57FA\u7840\u7EF4\u62A4\u5DE5\u4F5C\uFF0C\u89C4\u6574\u76EE\u5F55\u3001\u8865\u5145\u8BF4\u660E\u3001\u7EDF\u4E00\u89C4\u8303\uFF0C\u4E00\u70B9\u70B9\u964D\u4F4E\u9879\u76EE\u7EF4\u62A4\u6210\u672C\uFF0C\u662F\u56E2\u961F\u9690\u6027\u57FA\u77F3\u3002",
903
- "\u628A\u4F18\u5316\u5DE5\u7A0B\u73AF\u5883\u3001\u5B8C\u5584\u9879\u76EE\u6587\u6863\u5F53\u6210\u65E5\u5E38\uFF0C\u6301\u7EED\u89C4\u6574\u4EE3\u7801\u5E93\u98CE\u8C8C\uFF0C\u7410\u788E\u91CD\u590D\u7684\u7EF4\u62A4\u5DE5\u4F5C\u8010\u5FC3\u5B8C\u6210\uFF0C\u5927\u5E45\u63D0\u5347\u6574\u4E2A\u56E2\u961F\u7684\u534F\u4F5C\u6548\u7387\u3002",
904
- "\u4E13\u6CE8\u9879\u76EE\u57FA\u5EFA\u7EF4\u62A4\u8D5B\u9053\uFF0C\u5404\u7C7B\u914D\u7F6E\u3001\u6587\u6863\u3001\u683C\u5F0F\u5316\u8C03\u6574\u4E00\u624B\u5305\u529E\uFF0C\u9ED8\u9ED8\u4F18\u5316\u5F00\u53D1\u73AF\u5883\uFF0C\u770B\u4F3C\u5E73\u6DE1\u7684\u63D0\u4EA4\uFF0C\u5B9E\u5219\u957F\u671F\u9020\u798F\u5168\u4F53\u5F00\u53D1\u4EBA\u5458\u3002"
871
+ "\u3010\u5E7D\u7075\u63D0\u4EA4\u9884\u8B66\u3011\u51CC\u6668\u7684 Commit \u6CDB\u7740\u6E05\u51B7\u7684\u5149\u3002\u9002\u5EA6\u71AC\u591C\u53EF\u4EE5\uFF0C\u4F46\u7761\u89C9\u4E5F\u662F\u6838\u5FC3\u6280\u80FD\u3002",
872
+ "\u534A\u591C\u8FD8\u5728 push\uFF0C\u662F\u8DDF\u540C\u4E8B\u5BF9\u7EBF\uFF0C\u8FD8\u662F\u5355\u7EAF\u4EAB\u53D7\u51CC\u6668\u65E0\u4EBA\u6253\u6270\u7684\u7075\u611F\u7206\u53D1\uFF1F",
873
+ "\u96F6\u70B9\u8FC7\u540E\u5927\u91CF\u63D0\u4EA4\u88AB\u6355\u83B7\uFF01\u71AC\u591C\u7A33\u4F4F\u8FDB\u5EA6\u7684\u6837\u5B50\u5F88\u62FC\uFF0C\u4F46\u8EAB\u4F53\u4E5F\u9700\u8981\u5145\u7535\u3002",
874
+ "\u8FD8\u5728\u901A\u5BB5\u786C\u809D\uFF1FCI \u673A\u5668\u4EBA\u90FD\u60F3\u4E0B\u73ED\u4E86\uFF0C\u5199\u5B8C\u8D76\u7D27\u5B58\u76D8\u4F11\u606F\u3002",
875
+ "\u51CC\u6668\u4E13\u5C5E\u5F00\u53D1\u8005\uFF0C\u767D\u5929\u88AB\u7410\u4E8B\u7F20\u8EAB\uFF0C\u53EA\u80FD\u6DF1\u591C\u5543\u786C\u9AA8\u5934\u3002\u957F\u671F\u71AC\u591C\u4F24\u7684\u662F\u4F60\u81EA\u5DF1\u3002",
876
+ "\u6DF1\u591C\u72EC\u5B88\u5DE5\u4F4D\uFF0C\u6BCF\u6761\u51CC\u6668\u63D0\u4EA4\u90FD\u662F\u5361\u70B9\u7684\u4EE3\u4EF7\u3002\u4E13\u6CE8\u503C\u5F97\u80AF\u5B9A\uFF0C\u4F46\u522B\u5929\u5929\u4FEE\u4ED9\u3002",
877
+ "\u522B\u4EBA\u5DF2\u5165\u68A6\u4E61\uFF0C\u4F60\u7684 Git \u8FD8\u5728\u66F4\u65B0\u3002\u6DF1\u591C\u9002\u5408\u653B\u575A\uFF0C\u8BB0\u5F97\u8BBE\u4E2A\u95F9\u949F\uFF0C\u5230\u70B9\u4E0B\u7EBF\u3002"
905
878
  ];
906
879
  var GENERAL_CRITIQUES = [
907
- "\u4F60\u7684\u6574\u5468\u63D0\u4EA4\u66F2\u7EBF\u5E73\u7F13\u5982\u6807\u51C6\u5FC3\u7535\u56FE\uFF0C\u6CE2\u52A8\u53EA\u96C6\u4E2D\u5728\u6668\u4F1A\u7ED3\u675F\u524D\u3001\u6BCF\u65E5\u4E0B\u73ED\u524D\u4E24\u4E2A\u8282\u70B9\uFF0C\u5B8C\u7F8E\u62FF\u634F\u4E13\u5C5E\u81EA\u5DF1\u7684\u5DE5\u4F5C\u4F11\u606F\u5F8B\u52A8\uFF0C\u677E\u5F1B\u53C8\u9AD8\u6548\u3002",
908
- "\u672C\u5468\u63D0\u4EA4\u65F6\u95F4\u5206\u5E03\u7279\u5F81\u9C9C\u660E\uFF0C\u4E0A\u5348\u5B89\u9759\u6C89\u6DC0\u68B3\u7406\u601D\u8DEF\u9759\u5982\u5904\u5B50\uFF0C\u4E0B\u5348\u96C6\u4E2D\u53D1\u529B\u75AF\u72C2\u8F93\u51FA\u52A8\u5982\u8131\u5154\uFF0C\u7CBE\u51C6\u9501\u5B9A\u9002\u914D\u81EA\u8EAB\u7684\u9AD8\u6548\u7387\u5DE5\u4F5C\u65F6\u6BB5\u3002",
909
- "\u7FFB\u770B\u4F60\u7684\u5B8C\u6574Git Log\uFF0C\u5B9B\u5982\u6B23\u8D4F\u4E00\u4F4D\u9876\u7EA7\u8282\u594F\u5927\u5E08\u7684\u4F5C\u54C1\u3002\u4E0D\u75BE\u4E0D\u5F90\u3001\u5F20\u5F1B\u6709\u5EA6\uFF0C\u5076\u5C14\u843D\u7B14\u63D0\u4EA4\u8FED\u4EE3\uFF0C\u5374\u603B\u80FD\u6070\u5230\u597D\u5904\u5B8C\u7F8E\u5B8C\u6210\u5168\u90E8\u5DE5\u4F5C\u3002",
910
- "\u672C\u5468\u63D0\u4EA4\u6570\u636E\u5747\u8861\u7A33\u5B9A\uFF0C\u6BCF\u65E5\u7EF4\u6301\u5E73\u7A33\u5747\u5300\u7684\u8F93\u51FA\u8282\u594F\uFF0C\u4E0D\u4F1A\u67D0\u5929\u7206\u809D\u3001\u67D0\u5929\u7A7A\u767D\uFF0C\u7A33\u624E\u7A33\u6253\u6301\u7EED\u63A8\u8FDB\u4EFB\u52A1\uFF0C\u662F\u56E2\u961F\u6700\u8BA9\u4EBA\u5B89\u5FC3\u7684\u5B9A\u6D77\u795E\u9488\u3002",
911
- "\u5F00\u53D1\u8282\u594F\u5F20\u5F1B\u6709\u5EA6\uFF0C\u4E0D\u4F1A\u4E00\u5473\u731B\u51B2\u900F\u652F\u7CBE\u529B\uFF0C\u4E5F\u4E0D\u4F1A\u505C\u6EDE\u62D6\u5EF6\u8FDB\u5EA6\uFF0C\u6BCF\u65E5\u7A33\u5B9A\u4EA7\u51FA\u5C11\u91CF\u6709\u6548\u63D0\u4EA4\uFF0C\u7EC6\u6C34\u957F\u6D41\u7A33\u6B65\u5B8C\u6210\u5168\u90E8\u6708\u5EA6\u89C4\u5212\u4EFB\u52A1\u3002",
912
- "\u62E5\u6709\u72EC\u4E00\u65E0\u4E8C\u7684\u5F00\u53D1\u65F6\u95F4\u89C4\u5F8B\uFF0C\u61C2\u5F97\u62C6\u5206\u5DE5\u4F5C\u91CF\u5747\u5300\u5206\u644A\u5230\u6BCF\u4E00\u5929\uFF0C\u62D2\u7EDD\u7A81\u51FB\u8D76\u5DE5\uFF0C\u5E73\u7F13\u7A33\u5B9A\u7684\u8F93\u51FA\u6A21\u5F0F\uFF0C\u6781\u5927\u964D\u4F4E\u81EA\u8EAB\u5DE5\u4F5C\u538B\u529B\u3002",
913
- "Git\u5386\u53F2\u8282\u594F\u5341\u5206\u8212\u670D\uFF0C\u65E0\u6781\u7AEF\u5FFD\u591A\u5FFD\u5C11\u7684\u60C5\u51B5\uFF0C\u957F\u671F\u4FDD\u6301\u5747\u8861\u5F00\u53D1\u72B6\u6001\uFF0C\u65E2\u80FD\u4FDD\u8BC1\u5DE5\u4F5C\u63A8\u8FDB\uFF0C\u4E5F\u4E0D\u4F1A\u8BA9\u81EA\u5DF1\u9677\u5165\u6301\u7EED\u9AD8\u5F3A\u5EA6\u5185\u8017\u3002"
880
+ "\u6574\u5468\u63D0\u4EA4\u66F2\u7EBF\u5E73\u7F13\u89C4\u5F8B\uFF0C\u6CE2\u52A8\u96C6\u4E2D\u5728\u6668\u4F1A\u524D\u3001\u4E0B\u73ED\u524D\u3002\u62FF\u634F\u4E86\u81EA\u5DF1\u7684\u8282\u594F\uFF0C\u677E\u5F1B\u53C8\u9AD8\u6548\u3002",
881
+ "\u63D0\u4EA4\u65F6\u95F4\u7279\u5F81\u9C9C\u660E\uFF1A\u4E0A\u5348\u9759\u5982\u5904\u5B50\u6C89\u6DC0\u601D\u8DEF\uFF0C\u4E0B\u5348\u52A8\u5982\u8131\u5154\u96C6\u4E2D\u8F93\u51FA\u3002\u7CBE\u51C6\u9501\u5B9A\u9AD8\u6548\u65F6\u6BB5\u3002",
882
+ "Git Log \u50CF\u9876\u7EA7\u8C03\u5EA6\u5927\u5E08\u7684\u4F5C\u54C1\uFF0C\u4E0D\u75BE\u4E0D\u5F90\u3001\u5F20\u5F1B\u6709\u5EA6\u3002\u5076\u5C14\u843D\u5B50\uFF0C\u5374\u6070\u5230\u597D\u5904\u5B8C\u6210\u5168\u90E8\u3002",
883
+ "\u63D0\u4EA4\u6570\u636E\u5747\u8861\u7A33\u5B9A\uFF0C\u6BCF\u65E5\u5747\u5300\u8F93\u51FA\uFF0C\u4E0D\u7206\u809D\u4E0D\u7A7A\u767D\u3002\u7A33\u624E\u7A33\u6253\uFF0C\u662F\u56E2\u961F\u6700\u5B89\u5FC3\u7684\u5B9A\u6D77\u795E\u9488\u3002",
884
+ "\u8282\u594F\u5F20\u5F1B\u6709\u5EA6\uFF0C\u4E0D\u731B\u51B2\u4E0D\u62D6\u5EF6\u3002\u6BCF\u65E5\u7A33\u5B9A\u4EA7\u51FA\u5C11\u91CF\u6709\u6548\u63D0\u4EA4\uFF0C\u7EC6\u6C34\u957F\u6D41\u5B8C\u6210\u89C4\u5212\u3002",
885
+ "\u5F00\u53D1\u65F6\u95F4\u89C4\u5F8B\uFF0C\u61C2\u5F97\u62C6\u5206\u5DE5\u4F5C\u91CF\u5747\u5300\u5206\u644A\u3002\u62D2\u7EDD\u7A81\u51FB\uFF0C\u5E73\u7F13\u8F93\u51FA\uFF0C\u6709\u6548\u964D\u4F4E\u81EA\u8EAB\u538B\u529B\u3002",
886
+ "Git \u5386\u53F2\u8282\u594F\u8212\u670D\uFF0C\u65E0\u6781\u7AEF\u6CE2\u52A8\u3002\u957F\u671F\u5747\u8861\u5F00\u53D1\uFF0C\u4FDD\u8BC1\u63A8\u8FDB\uFF0C\u4E5F\u4E0D\u9677\u5165\u6301\u7EED\u5185\u8017\u3002"
914
887
  ];
915
888
  var TAG_FISH_MASTER_CRITIQUES = [
916
- "\u6478\u9C7C\u5B97\u5E08\u79F0\u53F7\u5DF2\u89E3\u9501\uFF01\u628A\u52B3\u9038\u7ED3\u5408\u53D1\u6325\u5230\u4E86\u6781\u81F4\uFF0C\u8868\u9762\u7A33\u5982\u6CF0\u5C71\u6572\u4EE3\u7801\uFF0C\u5B9E\u9645\u4E0A\u8111\u6D77\u91CC\u5DF2\u7ECF\u628A\u5468\u672B\u51FA\u884C\u3001\u4E0B\u5348\u8336\u6E05\u5355\u5168\u90E8\u89C4\u5212\u5B8C\u6BD5\uFF0C\u677E\u5F1B\u611F\u76F4\u63A5\u62C9\u6EE1\u3002",
917
- "\u6478\u9C7C\u5B97\u5E08\uFF0C\u6CD5\u529B\u65E0\u8FB9\uFF01\u80FD\u628A\u6BCF\u65E5\u751F\u4EA7\u529B\u7CBE\u786E\u63A7\u5236\u5728\u521A\u521A\u597D\u7684\u8212\u9002\u5708\uFF0C\u4E0D\u591A\u4E0D\u5C11\u521A\u597D\u8FBE\u6807\uFF0C\u8FD9\u4EFD\u6536\u653E\u81EA\u5982\u7684\u804C\u573A\u5E73\u8861\u672F\uFF0C\u5C5E\u5B9E\u662F\u8BA9\u4EBA\u7FA1\u6155\u7684\u9876\u7EA7\u804C\u573A\u8D85\u80FD\u529B\u3002",
918
- "\u606D\u559C\u83B7\u5F97\u300E\u6478\u9C7C\u5B97\u5E08\u300F\u6210\u5C31\uFF01Git \u7684\u7A7A\u767D\u7559\u767D\u662F\u4F60\u7684\u4E13\u5C5E\u901A\u884C\u8BC1\uFF0C\u5DE5\u4F5C\u8282\u594F\u62FF\u634F\u5F97\u6070\u5230\u597D\u5904\uFF0C\u8BE5\u4EA7\u51FA\u65F6\u4E0D\u6389\u94FE\u5B50\uFF0C\u8BE5\u653E\u677E\u65F6\u7EDD\u4E0D\u5185\u8017\uFF0C\u5B8C\u7F8E\u8282\u594F\u5927\u5E08\u975E\u4F60\u83AB\u5C5E\u3002",
889
+ "\u6478\u9C7C\u5B97\u5E08\u79F0\u53F7\u5DF2\u89E3\u9501\uFF01\u628A\u52B3\u9038\u7ED3\u5408\u53D1\u6325\u5230\u4E86\u6781\u81F4\uFF0C\u9AD8\u6548\u5B8C\u6210\u672C\u804C\u5DE5\u4F5C\u4E4B\u4F59\uFF0C\u5468\u672B\u51FA\u884C\u3001\u4E0B\u5348\u8336\u6E05\u5355\u65E9\u5DF2\u89C4\u5212\u5B8C\u6BD5\uFF0C\u677E\u5F1B\u611F\u76F4\u63A5\u62C9\u6EE1\u3002",
890
+ "\u6478\u9C7C\u5B97\u5E08\uFF0C\u6CD5\u529B\u65E0\u8FB9\uFF01\u80FD\u628A\u6BCF\u65E5\u751F\u4EA7\u529B\u7CBE\u786E\u63A7\u5236\u5728\u521A\u521A\u597D\u7684\u5E73\u8861\u70B9\uFF0C\u4E0D\u591A\u4E0D\u5C11\u521A\u597D\u8FBE\u6807\uFF0C\u8FD9\u4EFD\u6536\u653E\u81EA\u5982\u7684\u804C\u573A\u5E73\u8861\u672F\uFF0C\u662F\u8BA9\u4EBA\u7FA1\u6155\u7684\u9876\u7EA7\u804C\u573A\u8D85\u80FD\u529B\u3002",
891
+ "\u606D\u559C\u83B7\u5F97\u300E\u6478\u9C7C\u5B97\u5E08\u300F\u6210\u5C31\uFF01Git \u7684\u7559\u767D\u662F\u4F60\u7684\u4E13\u5C5E\u901A\u884C\u8BC1\uFF0C\u5DE5\u4F5C\u8282\u594F\u62FF\u634F\u5F97\u6070\u5230\u597D\u5904\uFF0C\u8BE5\u4EA7\u51FA\u65F6\u4E0D\u6389\u94FE\u5B50\uFF0C\u8BE5\u653E\u677E\u65F6\u7EDD\u4E0D\u5185\u8017\uFF0C\u5B8C\u7F8E\u8282\u594F\u638C\u63A7\u8005\u975E\u4F60\u83AB\u5C5E\u3002",
919
892
  "\u9876\u7EA7\u6478\u9C7C\u5B97\u5E08\u767B\u573A\uFF01\u4E0A\u73ED\u72B6\u6001\u677E\u5F1B\u6709\u5EA6\uFF0C\u4EFB\u52A1\u6309\u65F6\u843D\u5730\u7EDD\u4E0D\u62D6\u6C93\uFF0C\u5176\u4F59\u65F6\u95F4\u5B89\u5FC3\u653E\u7A7A\u5145\u7535\uFF0C\u61C2\u5F97\u9002\u65F6\u653E\u677E\u624D\u80FD\u957F\u4E45\u4FDD\u6301\u9AD8\u6548\uFF0C\u667A\u6167\u6253\u5DE5\u4EBA\u6A21\u677F\u6709\u4E86\u3002",
920
- "\u522B\u4EBA\u5185\u5377\u57CB\u5934\u731B\u6572\uFF0C\u4F60\u4ECE\u5BB9\u7A33\u6B65\u5B8C\u6210\u672C\u804C\uFF0C\u6478\u9C7C\u5B97\u5E08\u7684\u7CBE\u9AD3\u4E0D\u662F\u6446\u70C2\uFF0C\u800C\u662F\u9AD8\u6548\u5B8C\u5DE5\u540E\u5B89\u5FC3\u4EAB\u53D7\u95F2\u6687\uFF0C\u5E73\u8861\u5DE5\u4F5C\u4E0E\u751F\u6D3B\u8FD9\u5757\u88AB\u4F60\u73A9\u660E\u767D\u4E86\u3002"
893
+ "\u522B\u4EBA\u5306\u5FD9\u57CB\u5934\u731B\u6572\uFF0C\u4F60\u4ECE\u5BB9\u7A33\u6B65\u5B8C\u6210\u672C\u804C\uFF0C\u6478\u9C7C\u5B97\u5E08\u7684\u7CBE\u9AD3\u4E0D\u662F\u6446\u70C2\uFF0C\u800C\u662F\u9AD8\u6548\u5B8C\u5DE5\u540E\u5B89\u5FC3\u4EAB\u53D7\u95F2\u6687\uFF0C\u5E73\u8861\u5DE5\u4F5C\u4E0E\u751F\u6D3B\u8FD9\u5757\u88AB\u4F60\u73A9\u660E\u767D\u4E86\u3002"
921
894
  ];
922
895
  var TAG_VOLUME_KING_CRITIQUES = [
923
- "\u7206\u809D\u6218\u795E\uFF0C\u6050\u6016\u5982\u65AF\uFF01\u4F60\u7684 Git \u65F6\u95F4\u7EBF\u5BC6\u5BC6\u9EBB\u9EBB\u6EE1\u5F97\u50CF\u6625\u8FD0\u706B\u8F66\u7AD9\uFF0C\u5168\u5929\u4E0D\u95F4\u65AD\u6301\u7EED\u8F93\u51FA\uFF0C\u5EFA\u8BAE\u7ED9\u952E\u76D8\u914D\u4E2A\u4E13\u5C5E\u610F\u5916\u9669\uFF0C\u957F\u671F\u9AD8\u5F3A\u5EA6\u8F93\u51FA\u771F\u7684\u8F9B\u82E6\u4E86\uFF01",
896
+ "\u7206\u809D\u6218\u795E\uFF0C\u6050\u6016\u5982\u65AF\uFF01\u4F60\u7684 Git \u65F6\u95F4\u7EBF\u5BC6\u5BC6\u9EBB\u9EBB\uFF0C\u63D0\u4EA4\u5BC6\u5EA6\u60CA\u4EBA\uFF0C\u5168\u5929\u4E0D\u95F4\u65AD\u6301\u7EED\u8F93\u51FA\uFF0C\u5EFA\u8BAE\u7ED9\u952E\u76D8\u653E\u4E2A\u5047\uFF0C\u957F\u671F\u9AD8\u5F3A\u5EA6\u8F93\u51FA\u771F\u7684\u8F9B\u82E6\u4E86\uFF01",
924
897
  "\u7206\u809D\u6218\u795E\u5C31\u4F4D\uFF01\u5355\u4EBA\u4EA7\u51FA\u76F4\u63A5\u9876\u8D77\u534A\u652F\u5C0F\u961F\u7684\u5DE5\u4F5C\u91CF\uFF0C\u5BC6\u5BC6\u9EBB\u9EBB\u7684\u63D0\u4EA4\u8BB0\u5F55\u8089\u773C\u53EF\u89C1\uFF0C\u98DE\u901F\u6572\u51FB\u7684\u952E\u76D8\u90FD\u5FEB\u6572\u51FA\u6B8B\u5F71\uFF0C\u656C\u4E1A\u7A0B\u5EA6\u76F4\u63A5\u62C9\u6EE1\u3002",
925
- "\u522B\u4EBA\u4E0B\u73ED\u4F11\u606F\u8FFD\u5267\uFF0C\u4F60\u5728\u6301\u7EED commit\uFF1B\u522B\u4EBA\u6DF1\u591C\u5B89\u7A33\u7761\u89C9\uFF0C\u4F60\u8FD8\u5728\u8FDC\u7A0B push \u8FED\u4EE3\u3002\u5B9E\u6253\u5B9E\u7206\u809D\u6218\u795E\u5F53\u4E4B\u65E0\u6127\uFF01\u4F46\u7A0B\u5E8F\u7A33\u5B9A\u8FD0\u884C\u7684\u524D\u63D0\uFF0C\u662F\u4F60\u4E5F\u8981\u597D\u597D\u5403\u996D\u4F11\u606F\u3002",
898
+ "\u522B\u4EBA\u4E0B\u73ED\u4F11\u606F\u8FFD\u5267\uFF0C\u4F60\u5728\u6301\u7EED commit\uFF1B\u522B\u4EBA\u6DF1\u591C\u5B89\u7A33\u7761\u89C9\uFF0C\u4F60\u8FD8\u5728\u8FDC\u7A0B push \u8FED\u4EE3\u3002\u7206\u809D\u6218\u795E\u5F53\u4E4B\u65E0\u6127\uFF01\u4F46\u7A0B\u5E8F\u7A33\u5B9A\u8FD0\u884C\u7684\u540C\u65F6\uFF0C\u4F60\u4E5F\u8981\u597D\u597D\u5403\u996D\u4F11\u606F\u3002",
926
899
  "\u5168\u65F6\u6BB5\u5728\u7EBF\u7206\u809D\u9009\u624B\u4E0A\u7EBF\uFF0C\u4ECE\u65E9\u5230\u665A\u6301\u7EED\u66F4\u65B0\u8FED\u4EE3\uFF0C\u6BCF\u4E00\u6761\u63D0\u4EA4\u8BB0\u5F55\u90FD\u662F\u9ED8\u9ED8\u4ED8\u51FA\u7684\u8BC1\u660E\uFF0C\u56E2\u961F\u79BB\u4E0D\u5F00\u4F60\u7684\u5F3A\u529B\u8F93\u51FA\uFF0C\u8BB0\u5F97\u62BD\u7A7A\u7AD9\u8D77\u6765\u6D3B\u52A8\u8EAB\u4F53\u3001\u591A\u559D\u6E29\u6C34\u3002",
927
900
  "\u63D0\u4EA4\u91CF\u65AD\u5C42\u9886\u5148\u5168\u573A\u7684\u7206\u809D\u5927\u4F6C\uFF0C\u5927\u5C0F\u9700\u6C42\u7EDF\u7EDF\u5305\u63FD\u843D\u5730\uFF0C\u4E3A\u9879\u76EE\u63A8\u8FDB\u7ACB\u4E0B\u6C57\u9A6C\u529F\u52B3\uFF0C\u9AD8\u5F3A\u5EA6\u8F93\u51FA\u56FA\u7136\u503C\u5F97\u79F0\u8D5E\uFF0C\u5343\u4E07\u4E0D\u8981\u957F\u671F\u900F\u652F\u81EA\u5DF1\u7684\u8EAB\u4F53\u54E6\u3002"
928
901
  ];
929
902
  var TAG_NIGHT_OWL_CRITIQUES = [
930
- "\u6DF1\u591C\u4FEE\u4ED9\u8005\uFF0C\u6CD5\u529B\u65E0\u8FB9\uFF01\u51CC\u6668\u5B89\u9759\u65F6\u6BB5\u6572\u51FA\u7684\u4EE3\u7801\u81EA\u5E26\u987A\u6ED1buff\uFF0C\u65E0\u4EBA\u6253\u6270\u7684\u6DF1\u591C\u7075\u611F\u7206\u53D1\uFF0C\u8FDECI\u6D41\u6C34\u7EBF\u8DD1\u901A\u7684\u901F\u5EA6\u90FD\u4EFF\u4F5B\u53D8\u5FEB\u4E86\u4E0D\u5C11\u3002",
931
- "\u6210\u4E3A\u6DF1\u591C\u4FEE\u4ED9\u8005\u610F\u5473\u7740\u4F60\u7684\u4E13\u5C5E\u9EC4\u91D1\u5DE5\u4F5C\u65F6\u6BB5\u9501\u5B9A 00:00 ~ 05:00\u3002\u767D\u5929\u5DE5\u4F4D\u6C89\u6DC0\u68B3\u7406\u9700\u6C42\u79EF\u6512\u7075\u611F\uFF0C\u6DF1\u591C\u72EC\u5904\u65F6\u75AF\u72C2\u8F93\u51FA\u843D\u5730\uFF0C\u663C\u591C\u53CC\u5DE5\u4F5C\u6A21\u5F0F\u65E0\u7F1D\u81EA\u7531\u5207\u6362\u3002",
932
- "\u4FEE\u4ED9\u5927\u80FD\u5B9E\u9524\uFF01\u4E00\u6761\u6761\u51CC\u6668Git\u8BB0\u5F55\u9ED8\u9ED8\u89C1\u8BC1\u4F60\u7684\u575A\u6301\u4E0E\u4E13\u6CE8\uFF0C\u6DF1\u591C\u5B89\u9759\u73AF\u5883\u66F4\u5BB9\u6613\u7406\u6E05\u590D\u6742\u903B\u8F91\u3002\u4E0D\u8FC7\u9002\u5EA6\u4FEE\u4ED9\u53EF\u4EE5\uFF0C\u4E00\u5B9A\u8981\u9884\u7559\u5145\u8DB3\u7761\u7720\u65F6\u95F4\u6062\u590D\u7CBE\u529B\u3002",
903
+ "\u6DF1\u591C\u4FEE\u4ED9\u8005\uFF0C\u6CD5\u529B\u65E0\u8FB9\uFF01\u51CC\u6668\u5B89\u9759\u65F6\u6BB5\u6572\u51FA\u7684\u4EE3\u7801\u81EA\u5E26\u4E13\u6CE8\u52A0\u6210\uFF0C\u65E0\u4EBA\u6253\u6270\u7684\u6DF1\u591C\u7075\u611F\u7206\u53D1\uFF0C\u8FDE\u601D\u8DEF\u8FD0\u8F6C\u7684\u901F\u5EA6\u90FD\u4EFF\u4F5B\u53D8\u5FEB\u4E86\u4E0D\u5C11\u3002",
904
+ "\u6DF1\u591C\u4FEE\u4ED9\u8005\u7684\u4E13\u5C5E\u9EC4\u91D1\u5DE5\u4F5C\u65F6\u6BB5\u9501\u5B9A 00:00 ~ 05:00\u3002\u767D\u5929\u5DE5\u4F4D\u6C89\u6DC0\u68B3\u7406\u9700\u6C42\u79EF\u6512\u7075\u611F\uFF0C\u6DF1\u591C\u72EC\u5904\u65F6\u96C6\u4E2D\u8F93\u51FA\u843D\u5730\uFF0C\u663C\u591C\u53CC\u65F6\u6BB5\u6A21\u5F0F\u65E0\u7F1D\u81EA\u7531\u5207\u6362\u3002",
905
+ "\u4FEE\u4ED9\u5927\u80FD\u8BA4\u8BC1\uFF01\u4E00\u6761\u6761\u51CC\u6668Git\u8BB0\u5F55\u9ED8\u9ED8\u89C1\u8BC1\u4F60\u7684\u575A\u6301\u4E0E\u4E13\u6CE8\uFF0C\u6DF1\u591C\u5B89\u9759\u73AF\u5883\u66F4\u5BB9\u6613\u7406\u6E05\u590D\u6742\u903B\u8F91\u3002\u4E0D\u8FC7\u9002\u5EA6\u4FEE\u4ED9\u5373\u53EF\uFF0C\u8BB0\u5F97\u9884\u7559\u5145\u8DB3\u7761\u7720\u65F6\u95F4\u6062\u590D\u7CBE\u529B\u3002",
933
906
  "\u504F\u7231\u6DF1\u591C\u72EC\u5904\u7F16\u7801\u7684\u4FEE\u4ED9\u9009\u624B\uFF0C\u4E07\u7C41\u4FF1\u5BC2\u7684\u65F6\u5019\u601D\u8DEF\u683C\u5916\u6E05\u6670\uFF0C\u5F88\u591A\u68D8\u624B\u96BE\u9898\u90FD\u5728\u51CC\u6668\u88AB\u4F60\u9010\u4E2A\u653B\u514B\uFF0C\u9AD8\u6548\u591C\u95F4\u9009\u624B\u8BA4\u8BC1\uFF0C\u522B\u957F\u671F\u71AC\u5230\u5929\u5149\u624D\u4F11\u606F\u3002",
934
907
  "\u767D\u65E5\u5904\u7406\u6C9F\u901A\u7410\u4E8B\uFF0C\u6DF1\u591C\u6C89\u6D78\u5F0F\u4E13\u6CE8\u7F16\u7801\uFF0C\u6DF1\u591C\u4FEE\u4ED9\u6A21\u5F0F\u9002\u914D\u5EA6\u6EE1\u5206\uFF0C\u9760\u7740\u6DF1\u591C\u5B89\u9759\u73AF\u5883\u653B\u514B\u5927\u91CF\u96BE\u70B9\uFF0C\u8BB0\u5F97\u5B9A\u65F6\u653E\u4E0B\u7535\u8111\uFF0C\u4FDD\u8BC1\u5145\u8DB3\u7761\u7720\u517B\u62A4\u8EAB\u4F53\u3002"
935
908
  ];
@@ -941,86 +914,57 @@ var TAG_BUILDER_CRITIQUES = [
941
914
  "\u65E5\u590D\u4E00\u65E5\u7A33\u5B9A\u8F93\u51FA\u7684\u57FA\u5EFA\u9009\u624B\uFF0C\u5927\u5C0F\u7410\u788E\u4E1A\u52A1\u9700\u6C42\u5168\u90E8\u59A5\u5584\u627F\u63A5\uFF0C\u505A\u4E8B\u7EC6\u81F4\u9760\u8C31\u4E0D\u51FA\u7EB0\u6F0F\uFF0C\u56E2\u961F\u57FA\u77F3\u822C\u7684\u5B58\u5728\uFF0C\u4F60\u7684\u8E0F\u5B9E\u4ED8\u51FA\u6240\u6709\u4EBA\u90FD\u770B\u5728\u773C\u91CC\u3002"
942
915
  ];
943
916
  var TAG_BURST_CODER_CRITIQUES = [
944
- "\u4E00\u628A\u68AD\u54C8\u578B\u7A0B\u5E8F\u5458\u767B\u573A\uFF01\u5355\u6B21\u8D85\u5927\u7BC7\u5E45Git Diff\u76F4\u63A5\u62C9\u6EE1\uFF0C\u8D1F\u8D23review\u7684\u540C\u4E8B\u9ED8\u9ED8\u6CE1\u4E0A\u4E00\u676F\u70ED\u8336\uFF0C\u51C6\u5907\u9759\u4E0B\u5FC3\u7EC6\u7EC6\u54C1\u8BFB\u4F60\u4E00\u6B21\u6027\u843D\u5730\u7684\u5B8C\u6574\u903B\u8F91\u3002",
945
- "\u4E00\u628A\u68AD\u54C8\u786C\u6838\u73A9\u5BB6\uFF01\u6574\u5957\u9700\u6C42\u903B\u8F91\u5168\u90E8\u6574\u5408\u8FDB\u5355\u6B21commit\u4E00\u6B21\u6027\u4EA4\u4ED8\uFF0C\u5B8C\u6574\u65B9\u6848\u65E9\u5728\u8111\u6D77\u4E2D\u6784\u601D\u6210\u578B\uFF0C\u76F4\u63A5\u4E00\u6CE2\u4E1D\u6ED1Rush-B\u5B8C\u6574\u843D\u5730\uFF0C\u6548\u7387\u60CA\u4EBA\u3002",
917
+ "\u4E00\u628A\u68AD\u54C8\u578B\u7A0B\u5E8F\u5458\u767B\u573A\uFF01\u5355\u6B21\u8D85\u5927\u7BC7\u5E45Git Diff\u76F4\u63A5\u62C9\u6EE1\uFF0C\u8D1F\u8D23review\u7684\u540C\u4E8B\u53EF\u4EE5\u6CE1\u4E0A\u4E00\u676F\u70ED\u8336\uFF0C\u51C6\u5907\u9759\u5FC3\u7814\u8BFB\u4F60\u4E00\u6B21\u6027\u843D\u5730\u7684\u5B8C\u6574\u903B\u8F91\u3002",
918
+ "\u4E00\u628A\u68AD\u54C8\u786C\u6838\u73A9\u5BB6\uFF01\u6574\u5957\u9700\u6C42\u903B\u8F91\u5168\u90E8\u6574\u5408\u8FDB\u5355\u6B21commit\u4E00\u6B21\u6027\u4EA4\u4ED8\uFF0C\u5B8C\u6574\u65B9\u6848\u65E9\u5728\u8111\u6D77\u4E2D\u6784\u601D\u6210\u578B\uFF0C\u76F4\u63A5\u4E00\u6CE2\u4E1D\u6ED1\u63A8\u8FDB\u5B8C\u6574\u843D\u5730\uFF0C\u6548\u7387\u60CA\u4EBA\u3002",
946
919
  "\u4E00\u628A\u68AD\u54C8\u4EE3\u7801\u827A\u672F\u5BB6\uFF01\u4F60\u7684\u6BCF\u4E00\u6B21\u63D0\u4EA4\u90FD\u50CF\u4E00\u7BC7\u5185\u5BB9\u5B8C\u6574\u903B\u8F91\u95ED\u73AF\u7684\u4E2D\u7BC7\u6280\u672F\u6587\u7A3F\uFF0C\u5E73\u65F6\u5C11\u6709\u96F6\u6563\u5C0F\u6539\u52A8\uFF0C\u4E00\u65E6\u51FA\u624B\u4FBF\u662F\u5B8C\u6574\u529F\u80FD\u5927\u66F4\u65B0\uFF0C\u4E0D\u9E23\u5219\u5DF2\u4E00\u9E23\u60CA\u4EBA\u3002",
947
- "\u4E60\u60EF\u6574\u4F53\u6784\u601D\u5B8C\u6574\u518D\u7EDF\u4E00\u63D0\u4EA4\u7684\u68AD\u54C8\u5927\u4F6C\uFF0C\u7701\u53BB\u9891\u7E41\u788E\u7247\u5316\u63D0\u4EA4\uFF0C\u6574\u5957\u529F\u80FD\u4E00\u6B21\u6027\u843D\u5730\uFF0C\u903B\u8F91\u8FDE\u8D2F\u5B8C\u6574\uFF0C\u552F\u4E00\u5C0F\u7F3A\u70B9\u5C31\u662F\u8BC4\u5BA1\u9636\u6BB5\u9700\u8981\u591A\u82B1\u4E00\u70B9\u65F6\u95F4\u7814\u8BFB\u3002",
920
+ "\u4E60\u60EF\u6574\u4F53\u6784\u601D\u5B8C\u6574\u518D\u7EDF\u4E00\u63D0\u4EA4\u7684\u68AD\u54C8\u5927\u4F6C\uFF0C\u7701\u53BB\u9891\u7E41\u788E\u7247\u5316\u63D0\u4EA4\uFF0C\u6574\u5957\u529F\u80FD\u4E00\u6B21\u6027\u843D\u5730\uFF0C\u903B\u8F91\u8FDE\u8D2F\u5B8C\u6574\uFF0C\u8BC4\u5BA1\u9636\u6BB5\u9700\u8981\u591A\u82B1\u4E00\u70B9\u65F6\u95F4\u7814\u8BFB\uFF0C\u4F46\u903B\u8F91\u8FDE\u8D2F\u5B8C\u6574\u503C\u5F97\u6295\u5165\u3002",
948
921
  "\u4E00\u6B21\u6027\u641E\u5B9A\u6574\u5957\u4E1A\u52A1\u6A21\u5757\u7684\u68AD\u54C8\u5927\u795E\uFF0C\u64C5\u957F\u5168\u76D8\u68B3\u7406\u9700\u6C42\u540E\u96C6\u4E2D\u8F93\u51FA\uFF0C\u7701\u53BB\u53CD\u590D\u62C6\u5206\u63D0\u4EA4\u7684\u7E41\u7410\uFF0C\u5927\u5C40\u89C2\u62C9\u6EE1\uFF0C\u582A\u79F0\u5B8C\u6574\u9700\u6C42\u4E00\u6B21\u6027\u4EA4\u4ED8\u6807\u6746\u3002"
949
922
  ];
950
923
  var TAG_PPT_ARCHITECT_CRITIQUES = [
951
- "\u67B6\u6784\u5E08\u98CE\u8303\u9690\u85CF\u6210\u5C31\u89E3\u9501\uFF01\u63D0\u4EA4\u6B21\u6570\u9891\u7E41\u4F46\u5355\u8F6E\u6539\u52A8\u7CBE\u7B80\u514B\u5236\uFF0C\u4F60\u7684Git\u5386\u53F2\u8BB0\u5F55\u50CF\u5145\u6EE1\u4EEA\u5F0F\u611F\u7684\u6280\u672F\u827A\u672F\u54C1\uFF0C\u91CD\u5FC3\u5168\u653E\u5728\u68B3\u7406\u9879\u76EE\u903B\u8F91\u3001\u4F18\u5316\u6574\u4F53\u67B6\u6784\u3002",
952
- "\u606D\u559C\u83B7\u5F97\u300E\u4F18\u96C5\u67B6\u6784\u5E08\u300F\u79F0\u53F7\uFF01\u6BCF\u4E00\u6761commit\u90FD\u5E26\u7740\u6E05\u6670\u89C4\u6574\u7684\u91CD\u6784\u601D\u8DEF\uFF0C\u4E8E\u65E0\u5F62\u4E4B\u4E2D\u68B3\u7406\u4F18\u5316\u9879\u76EE\u7ED3\u6784\uFF0Cdiff\u6539\u52A8\u8F7B\u76C8\u7CBE\u7B80\uFF0C\u5374\u5BF9\u6574\u4F53\u67B6\u6784\u8D77\u5230\u81F3\u5173\u91CD\u8981\u7684\u4F18\u5316\u4F5C\u7528\u3002",
953
- "\u4E13\u6CE8\u67B6\u6784\u4F18\u5316\u7684\u4F18\u96C5\u5927\u4F6C\uFF0C\u4E0D\u5806\u780C\u5197\u4F59\u4E1A\u52A1\u4EE3\u7801\uFF0C\u4E13\u6CE8\u8C03\u6574\u9879\u76EE\u5206\u5C42\u3001\u89C4\u8303\u8C03\u7528\u903B\u8F91\uFF0C\u6BCF\u6B21\u5C0F\u63D0\u4EA4\u90FD\u5728\u6F5C\u79FB\u9ED8\u5316\u4F18\u5316\u9879\u76EE\u5E95\u5C42\u7ED3\u6784\uFF0C\u8FDC\u89C1\u5341\u8DB3\u3002",
954
- "\u4EE3\u7801\u4E16\u754C\u7684\u89C4\u5212\u8BBE\u8BA1\u5E08\uFF0C\u9891\u7E41\u5FAE\u8C03\u9879\u76EE\u7ED3\u6784\u4E0E\u5206\u5C42\u903B\u8F91\uFF0C\u6BD4\u8D77\u5806\u780C\u529F\u80FD\u66F4\u770B\u91CD\u9879\u76EE\u957F\u671F\u53EF\u7EF4\u62A4\u6027\uFF0C\u7EC6\u788E\u63D0\u4EA4\u80CC\u540E\u90FD\u662F\u5BF9\u67B6\u6784\u957F\u8FDC\u53D1\u5C55\u7684\u6DF1\u5EA6\u8003\u91CF\u3002",
955
- "\u4EE5\u91CD\u6784\u4F18\u5316\u4E3A\u6838\u5FC3\u5DE5\u4F5C\u7684\u67B6\u6784\u80FD\u624B\uFF0C\u8F7B\u91CF\u9AD8\u9891\u63D0\u4EA4\u6301\u7EED\u6253\u78E8\u9879\u76EE\u9AA8\u67B6\uFF0C\u9ED8\u9ED8\u89C4\u907F\u540E\u7EED\u8FED\u4EE3\u9690\u60A3\uFF0C\u773C\u5149\u653E\u5F97\u957F\u8FDC\uFF0C\u662F\u56E2\u961F\u7684\u6280\u672F\u89C4\u5212\u6838\u5FC3\u4EBA\u7269\u3002"
924
+ "\u67B6\u6784\u5E08\u98CE\u8303\u9690\u85CF\u6210\u5C31\u89E3\u9501\uFF01\u63D0\u4EA4\u6B21\u6570\u9891\u7E41\u4F46\u5355\u8F6E\u6539\u52A8\u7CBE\u7B80\u514B\u5236\uFF0C\u4F60\u7684Git\u5386\u53F2\u8BB0\u5F55\u50CF\u7CBE\u5FC3\u7F16\u6392\u7684\u6280\u672F\u827A\u672F\u54C1\uFF0C\u91CD\u5FC3\u653E\u5728\u68B3\u7406\u9879\u76EE\u903B\u8F91\u3001\u4F18\u5316\u6574\u4F53\u67B6\u6784\u3002",
925
+ "\u606D\u559C\u83B7\u5F97\u300E\u4F18\u96C5\u67B6\u6784\u5E08\u300F\u79F0\u53F7\uFF01\u6BCF\u4E00\u6761commit\u90FD\u5E26\u7740\u6E05\u6670\u89C4\u6574\u7684\u91CD\u6784\u601D\u8DEF\uFF0C\u5728\u65E0\u5F62\u4E4B\u4E2D\u68B3\u7406\u4F18\u5316\u9879\u76EE\u7ED3\u6784\uFF0Cdiff\u6539\u52A8\u8F7B\u76C8\u7CBE\u7B80\uFF0C\u5374\u5BF9\u6574\u4F53\u67B6\u6784\u8D77\u5230\u81F3\u5173\u91CD\u8981\u7684\u4F18\u5316\u4F5C\u7528\u3002",
926
+ "\u4E13\u6CE8\u67B6\u6784\u4F18\u5316\u7684\u4F18\u96C5\u5927\u4F6C\uFF0C\u4E0D\u5806\u780C\u5197\u4F59\u4E1A\u52A1\u4EE3\u7801\uFF0C\u4E13\u6CE8\u8C03\u6574\u9879\u76EE\u5206\u5C42\u3001\u89C4\u8303\u8C03\u7528\u903B\u8F91\uFF0C\u6BCF\u6B21\u5C0F\u63D0\u4EA4\u90FD\u5728\u6F5C\u79FB\u9ED8\u5316\u4F18\u5316\u9879\u76EE\u5E95\u5C42\u7ED3\u6784\uFF0C\u773C\u5149\u957F\u8FDC\u3002",
927
+ "\u4EE3\u7801\u4E16\u754C\u7684\u89C4\u5212\u8BBE\u8BA1\u5E08\uFF0C\u9891\u7E41\u5FAE\u8C03\u9879\u76EE\u7ED3\u6784\u4E0E\u5206\u5C42\u903B\u8F91\uFF0C\u6BD4\u8D77\u589E\u91CF\u529F\u80FD\u66F4\u770B\u91CD\u9879\u76EE\u957F\u671F\u53EF\u7EF4\u62A4\u6027\uFF0C\u7EC6\u788E\u63D0\u4EA4\u80CC\u540E\u90FD\u662F\u5BF9\u67B6\u6784\u957F\u8FDC\u53D1\u5C55\u7684\u6DF1\u5EA6\u8003\u91CF\u3002",
928
+ "\u4EE5\u91CD\u6784\u4F18\u5316\u4E3A\u6838\u5FC3\u5DE5\u4F5C\u7684\u67B6\u6784\u80FD\u624B\uFF0C\u8F7B\u91CF\u9AD8\u9891\u63D0\u4EA4\u6301\u7EED\u6253\u78E8\u9879\u76EE\u9AA8\u67B6\uFF0C\u9ED8\u9ED8\u89C4\u907F\u540E\u7EED\u8FED\u4EE3\u9690\u60A3\uFF0C\u773C\u5149\u653E\u5F97\u957F\u8FDC\uFF0C\u662F\u56E2\u961F\u6280\u672F\u89C4\u5212\u7684\u91CD\u8981\u63A8\u624B\u3002"
956
929
  ];
957
930
  var TAG_FORMAT_MASTER_CRITIQUES = [
958
- "\u683C\u5F0F\u5316\u5927\u5E08\u9690\u85CF\u6210\u5C31\u89E3\u9501\uFF01\u7D2F\u8BA1\u63D0\u4EA4\u5341\u4F59\u6B21\uFF0C\u4EE3\u7801\u6539\u52A8\u884C\u6570\u4E0D\u8DB3\u4E09\u5341\u884C\u2014\u2014\u4F60\u5BF9\u4EE3\u7801\u89C4\u8303\u4E0E\u6574\u6D01\u5EA6\u6709\u7740\u6781\u81F4\u6D01\u7656\uFF0C\u7EC6\u5FAE\u8C03\u6574\u76F4\u63A5\u8BA9\u6574\u4E2A\u9879\u76EE\u4EE3\u7801\u5E93\u7115\u7136\u4E00\u65B0\u3002",
959
- "\u683C\u5F0F\u5316\u5927\u5E08\u5B9E\u9524\uFF01\u6570\u5341\u6B21\u63D0\u4EA4\u5168\u90E8\u805A\u7126\u8C03\u6574\u7A7A\u683C\u3001\u8865\u5145\u6CE8\u91CA\u3001\u7EDF\u4E00\u7F29\u8FDB\u89C4\u8303\uFF0C\u4E0D\u6C42\u65B0\u589E\u5927\u91CF\u529F\u80FD\u4EE3\u7801\uFF0C\u4E00\u5FC3\u62C9\u9AD8\u4EE3\u7801\u5E93\u6574\u4F53\u989C\u503C\uFF0C\u5927\u5E45\u63D0\u5347\u540E\u7EED\u9605\u8BFB\u53EF\u8BFB\u6027\uFF01",
960
- "\u6267\u7740\u4E8E\u4EE3\u7801\u6574\u6D01\u5EA6\u7684\u89C4\u8303\u5B88\u62A4\u8005\uFF0C\u4E0D\u653E\u8FC7\u4EFB\u4F55\u4E00\u5904\u7F29\u8FDB\u3001\u7A7A\u683C\u3001\u6CE8\u91CA\u7455\u75B5\uFF0C\u53CD\u590D\u63D0\u4EA4\u5FAE\u8C03\u7EDF\u4E00\u9879\u76EE\u7F16\u7801\u98CE\u683C\uFF0C\u8BA9\u6240\u6709\u4EBA\u63A5\u624B\u4EE3\u7801\u65F6\u90FD\u80FD\u770B\u5F97\u6E05\u6670\u987A\u7545\u3002",
931
+ "\u683C\u5F0F\u5316\u5927\u5E08\u9690\u85CF\u6210\u5C31\u89E3\u9501\uFF01\u7D2F\u8BA1\u63D0\u4EA4\u591A\u6B21\uFF0C\u4EE3\u7801\u6539\u52A8\u884C\u6570\u5BE5\u5BE5\u2014\u2014\u4F60\u5BF9\u4EE3\u7801\u89C4\u8303\u4E0E\u6574\u6D01\u5EA6\u6709\u7740\u6781\u81F4\u8FFD\u6C42\uFF0C\u7EC6\u5FAE\u8C03\u6574\u76F4\u63A5\u8BA9\u6574\u4E2A\u9879\u76EE\u4EE3\u7801\u5E93\u7115\u7136\u4E00\u65B0\u3002",
932
+ "\u683C\u5F0F\u5316\u5927\u5E08\u5B9E\u9524\uFF01\u591A\u6B21\u63D0\u4EA4\u5168\u90E8\u805A\u7126\u8C03\u6574\u7A7A\u683C\u3001\u8865\u5145\u6CE8\u91CA\u3001\u7EDF\u4E00\u7F29\u8FDB\u89C4\u8303\uFF0C\u4E0D\u6C42\u65B0\u589E\u5927\u91CF\u529F\u80FD\u4EE3\u7801\uFF0C\u4E00\u5FC3\u62C9\u9AD8\u4EE3\u7801\u5E93\u6574\u4F53\u989C\u503C\uFF0C\u5927\u5E45\u63D0\u5347\u540E\u7EED\u9605\u8BFB\u53EF\u8BFB\u6027\uFF01",
933
+ "\u6267\u7740\u4E8E\u4EE3\u7801\u6574\u6D01\u5EA6\u7684\u89C4\u8303\u5B88\u62A4\u8005\uFF0C\u4E0D\u653E\u8FC7\u4EFB\u4F55\u4E00\u5904\u7F29\u8FDB\u3001\u7A7A\u683C\u3001\u6CE8\u91CA\u7455\u75B5\uFF0C\u53CD\u590D\u63D0\u4EA4\u5FAE\u8C03\u7EDF\u4E00\u9879\u76EE\u7F16\u7801\u98CE\u683C\uFF0C\u8BA9\u540C\u4E8B\u63A5\u624B\u4EE3\u7801\u65F6\u90FD\u80FD\u770B\u5F97\u6E05\u6670\u987A\u7545\u3002",
961
934
  "\u4EE3\u7801\u989C\u503C\u7BA1\u7406\u5458\u4E0A\u7EBF\uFF0C\u6BD4\u8D77\u65B0\u589E\u4E1A\u52A1\u529F\u80FD\uFF0C\u66F4\u5728\u610F\u6574\u4F53\u4EE3\u7801\u98CE\u683C\u7EDF\u4E00\u89C4\u6574\uFF0C\u7EC6\u788E\u7684\u89C4\u8303\u5316\u8C03\u6574\u65E5\u79EF\u6708\u7D2F\uFF0C\u5927\u5E45\u964D\u4F4E\u56E2\u961F\u540E\u7EED\u534F\u4F5C\u9605\u8BFB\u6210\u672C\u3002",
962
935
  "\u6781\u81F4\u7EC6\u8282\u63A7\u683C\u5F0F\u5316\u5927\u4F6C\uFF0C\u6BCF\u4E00\u5904\u6392\u7248\u3001\u6CE8\u91CA\u3001\u7B26\u53F7\u90FD\u4E25\u683C\u9075\u5FAA\u7EDF\u4E00\u6807\u51C6\uFF0C\u4E00\u6B21\u6B21\u7EC6\u5FAE\u63D0\u4EA4\u6253\u78E8\u9879\u76EE\u4EE3\u7801\u98CE\u8C8C\uFF0C\u5B8C\u7F8E\u6CBB\u6108\u6240\u6709\u4EBA\u7684\u4EE3\u7801\u5F3A\u8FEB\u75C7\u3002"
963
936
  ];
964
937
  var TAG_GIT_CHATTER_CRITIQUES = [
965
- "Git \u8BB0\u5F55\u8FBE\u4EBA\u9690\u85CF\u6210\u5C31\uFF01\u5341\u51E0\u6B21\u62C6\u5206\u63D0\u4EA4\uFF0C\u5E73\u5747\u5355\u6B21\u6539\u52A8\u4E0D\u8DB3\u4E24\u884C\u4EE3\u7801\u2014\u2014\u4F60\u5B8C\u5168\u5728\u7528Git\u7248\u672C\u5E93\u5B9E\u65F6\u8BB0\u5F55\u7F16\u7801\u5FC3\u8DEF\u5386\u7A0B\uFF0C\u6781\u81F4\u7EC6\u9897\u7C92\u5EA6\u62C6\u5206\uFF0C\u540E\u7EED\u7248\u672C\u56DE\u6EDA\u8C03\u8BD5\u6BEB\u65E0\u538B\u529B\uFF01",
966
- "Git \u8BB0\u5F55\u8FBE\u4EBA\u8BA4\u8BC1\uFF01\u628A\u6BCF\u4E00\u5C0F\u6B65\u6539\u52A8\u90FD\u62C6\u5206\u4E3A\u72EC\u7ACBcommit\uFF0C\u7EC6\u7C92\u5EA6\u62C6\u5206\u5982\u540C\u5B9E\u65F6\u7F16\u5199\u5F00\u53D1\u65E5\u5FD7\uFF0C\u8C03\u8BD5\u3001\u56DE\u6EDA\u3001\u5B9A\u4F4D\u95EE\u9898\u65F6\u4E00\u76EE\u4E86\u7136\uFF0C\u4EE3\u7801\u8FFD\u8E2A\u96BE\u5EA6\u76F4\u63A5\u51CF\u534A\u3002",
938
+ "Git \u8BB0\u5F55\u8FBE\u4EBA\u9690\u85CF\u6210\u5C31\uFF01\u591A\u6B21\u62C6\u5206\u63D0\u4EA4\uFF0C\u5E73\u5747\u5355\u6B21\u6539\u52A8\u7CBE\u7B80\u81F3\u6781\u2014\u2014\u4F60\u50CF\u662F\u5728\u7528Git\u7248\u672C\u5E93\u5B9E\u65F6\u8BB0\u5F55\u7F16\u7801\u601D\u8DEF\uFF0C\u6781\u81F4\u7EC6\u9897\u7C92\u5EA6\u62C6\u5206\uFF0C\u540E\u7EED\u7248\u672C\u56DE\u6EDA\u8C03\u8BD5\u6BEB\u65E0\u538B\u529B\uFF01",
939
+ "Git \u8BB0\u5F55\u8FBE\u4EBA\u8BA4\u8BC1\uFF01\u628A\u6BCF\u4E00\u5C0F\u6B65\u6539\u52A8\u90FD\u62C6\u5206\u4E3A\u72EC\u7ACBcommit\uFF0C\u7EC6\u7C92\u5EA6\u62C6\u5206\u5982\u540C\u5B9E\u65F6\u7F16\u5199\u5F00\u53D1\u65E5\u5FD7\uFF0C\u8C03\u8BD5\u3001\u56DE\u6EDA\u3001\u5B9A\u4F4D\u95EE\u9898\u65F6\u4E00\u76EE\u4E86\u7136\uFF0C\u4EE3\u7801\u8FFD\u8E2A\u96BE\u5EA6\u5927\u5E45\u964D\u4F4E\u3002",
967
940
  "\u6781\u81F4\u7EC6\u5206\u63D0\u4EA4\u4E60\u60EF\u7684\u7EC6\u81F4\u9009\u624B\uFF0C\u4EFB\u4F55\u5FAE\u5C0F\u6539\u52A8\u5355\u72EC\u8BB0\u5F55\uFF0C\u4E0D\u6015\u63D0\u4EA4\u6570\u91CF\u591A\uFF0C\u53EA\u6C42\u6BCF\u4E00\u6B65\u6539\u52A8\u6E05\u6670\u53EF\u8FFD\u6EAF\uFF0C\u6392\u67E5\u7EBF\u4E0Abug\u65F6\u8FD9\u4EFD\u7EC6\u81F4\u80FD\u7701\u4E0B\u5927\u91CF\u6392\u67E5\u65F6\u95F4\u3002",
968
941
  "\u5F00\u53D1\u8FC7\u7A0B\u53EF\u89C6\u5316\u5927\u5E08\uFF0C\u5C06\u65B0\u589E\u3001\u4FEE\u6539\u3001\u4FEE\u590D\u5168\u90E8\u62C6\u5206\u4E3A\u72EC\u7ACB\u8BB0\u5F55\uFF0CGit\u5386\u53F2\u6E05\u6670\u8BB0\u5F55\u6BCF\u4E00\u6B65\u5F00\u53D1\u601D\u8DEF\uFF0C\u534F\u4F5C\u8C03\u8BD5\u65F6\u80FD\u5FEB\u901F\u770B\u61C2\u4EE3\u7801\u8FED\u4EE3\u5168\u8FC7\u7A0B\uFF0C\u534F\u4F5C\u4F53\u9A8C\u62C9\u6EE1\u3002",
969
942
  "\u504F\u7231\u5C0F\u6B65\u5FEB\u8DD1\u5F0F\u7F16\u7801\u7684\u7EC6\u5FC3\u5F00\u53D1\u8005\uFF0C\u4E00\u70B9\u6539\u52A8\u4E00\u6B21\u63D0\u4EA4\uFF0C\u62D2\u7EDD\u5927\u6BB5\u6DF7\u5408\u4FEE\u6539\uFF0C\u7248\u672C\u5386\u53F2\u5E72\u51C0\u901A\u900F\uFF0C\u662F\u56E2\u961F\u91CC\u65B9\u4FBF\u534F\u540C\u6392\u9519\u7684\u4F18\u8D28\u5F00\u53D1\u6A21\u677F\u3002"
970
943
  ];
971
944
  var TAG_NIGHT_ASSASSIN_CRITIQUES = [
972
- "\u6DF1\u591C\u523A\u5BA2\u9690\u85CF\u6210\u5C31\uFF01\u4FEE\u4ED9\u71AC\u591C\u6307\u6570\u76F4\u63A5\u7206\u8868\uFF0C\u4F46\u6BCF\u6B21\u63D0\u4EA4\u5185\u5BB9\u6781\u5EA6\u7CBE\u70BC\u9AD8\u6548\u2014\u2014\u4E13\u6311\u591C\u6DF1\u4EBA\u9759\u7684\u6DF1\u591C\u4E0A\u7EBF\uFF0C\u6084\u65E0\u58F0\u606F\u641E\u5B9A\u6838\u5FC3\u963B\u585Ebug\uFF0C\u4E8B\u6210\u4E4B\u540E\u6DF1\u85CF\u529F\u4E0E\u540D\u65E0\u4EBA\u77E5\u6653\u3002",
973
- "\u6DF1\u591C\u523A\u5BA2\u767B\u573A\uFF01\u5BE5\u5BE5\u6570\u6B21\u9AD8\u8D28\u91CF\u63D0\u4EA4\u5168\u90E8\u8BDE\u751F\u4E8E\u51CC\u6668\u65F6\u6BB5\uFF0C\u767D\u5929\u4F4E\u8C03\u6C89\u6DC0\u4E0D\u5F20\u626C\uFF0C\u6DF1\u591C\u51FA\u624B\u4E00\u51FB\u5FC5\u6740\u89E3\u51B3\u5173\u952E\u96BE\u9898\uFF0C\u663C\u591C\u53CD\u5DEE\u62C9\u6EE1\uFF0C\u53CC\u9762\u6781\u5BA2\u4EBA\u751F\u5C5E\u5B9E\u7CBE\u5F69\u3002",
945
+ "\u6DF1\u591C\u523A\u5BA2\u9690\u85CF\u6210\u5C31\uFF01\u4FEE\u4ED9\u71AC\u591C\u6307\u6570\u76F4\u63A5\u7206\u8868\uFF0C\u4F46\u6BCF\u6B21\u63D0\u4EA4\u5185\u5BB9\u7CBE\u70BC\u9AD8\u6548\u2014\u2014\u4E13\u6311\u591C\u6DF1\u4EBA\u9759\u7684\u6DF1\u591C\u4E0A\u7EBF\uFF0C\u6084\u65E0\u58F0\u606F\u641E\u5B9A\u6838\u5FC3\u963B\u585Ebug\uFF0C\u4E8B\u6210\u4E4B\u540E\u6DF1\u85CF\u529F\u4E0E\u540D\u3002",
946
+ "\u6DF1\u591C\u523A\u5BA2\u767B\u573A\uFF01\u5C11\u91CF\u9AD8\u8D28\u91CF\u63D0\u4EA4\u5168\u90E8\u8BDE\u751F\u4E8E\u51CC\u6668\u65F6\u6BB5\uFF0C\u767D\u5929\u4F4E\u8C03\u6C89\u6DC0\u4E0D\u5F20\u626C\uFF0C\u6DF1\u591C\u51FA\u624B\u7CBE\u51C6\u89E3\u51B3\u5173\u952E\u96BE\u9898\uFF0C\u663C\u591C\u53CD\u5DEE\u62C9\u6EE1\uFF0C\u53CC\u9762\u6781\u5BA2\u4EBA\u751F\u76F8\u5F53\u7CBE\u5F69\u3002",
974
947
  "\u4E13\u5C5E\u6DF1\u591C\u4E0A\u7EBF\u7684bug\u6740\u624B\uFF0C\u907F\u5F00\u767D\u5929\u5608\u6742\u6C9F\u901A\u65F6\u6BB5\uFF0C\u51CC\u6668\u5B89\u9759\u73AF\u5883\u7CBE\u51C6\u5B9A\u4F4D\u6838\u5FC3\u6545\u969C\uFF0C\u5C11\u91CF\u7CBE\u70BC\u6539\u52A8\u76F4\u63A5\u6839\u6CBB\u7591\u96BE\u95EE\u9898\uFF0C\u4F4E\u8C03\u89E3\u51B3\u56E2\u961F\u68D8\u624B\u5361\u70B9\u3002",
975
- "\u767D\u5929\u4F4E\u8C03\u5904\u7406\u65E5\u5E38\u7410\u4E8B\uFF0C\u6DF1\u591C\u5316\u8EAB\u4EE3\u7801\u523A\u5BA2\u7CBE\u51C6\u653B\u575A\u963B\u585E\u9879\u76EE\u7684\u6838\u5FC3\u96BE\u9898\uFF0C\u4E0D\u591A\u505A\u5197\u4F59\u6539\u52A8\uFF0C\u4E00\u62DB\u4E00\u5F0F\u76F4\u51FB\u95EE\u9898\u6839\u6E90\uFF0C\u9AD8\u6548\u53C8\u4F4E\u8C03\u3002",
976
- "\u64C5\u957F\u5229\u7528\u51CC\u6668\u5B89\u9759\u7A97\u53E3\u89E3\u51B3\u987D\u56FA\u7EBF\u4E0A\u95EE\u9898\uFF0C\u6781\u5C11\u65E0\u6548\u63D0\u4EA4\uFF0C\u6BCF\u4E00\u6B21\u6DF1\u591C\u66F4\u65B0\u90FD\u76F4\u51FB\u6838\u5FC3\u75DB\u70B9\uFF0C\u9ED8\u9ED8\u626B\u6E05\u9879\u76EE\u8FED\u4EE3\u8DEF\u4E0A\u7684\u5404\u7C7B\u969C\u788D\u3002"
948
+ "\u767D\u5929\u4F4E\u8C03\u5904\u7406\u65E5\u5E38\u7410\u4E8B\uFF0C\u6DF1\u591C\u5316\u8EAB\u4EE3\u7801\u523A\u5BA2\u7CBE\u51C6\u653B\u575A\u963B\u585E\u9879\u76EE\u7684\u6838\u5FC3\u96BE\u9898\uFF0C\u6CA1\u6709\u65E0\u6548\u63D0\u4EA4\uFF0C\u4E00\u62DB\u4E00\u5F0F\u76F4\u51FB\u95EE\u9898\u6839\u6E90\uFF0C\u9AD8\u6548\u53C8\u4F4E\u8C03\u3002",
949
+ "\u64C5\u957F\u5229\u7528\u51CC\u6668\u5B89\u9759\u7A97\u53E3\u89E3\u51B3\u987D\u56FA\u7EBF\u4E0A\u95EE\u9898\uFF0C\u6CA1\u6709\u65E0\u6548\u63D0\u4EA4\uFF0C\u6BCF\u4E00\u6B21\u6DF1\u591C\u66F4\u65B0\u90FD\u76F4\u51FB\u6838\u5FC3\u75DB\u70B9\uFF0C\u9ED8\u9ED8\u626B\u6E05\u9879\u76EE\u8FED\u4EE3\u8DEF\u4E0A\u7684\u5404\u7C7B\u969C\u788D\u3002"
977
950
  ];
978
951
  var TAG_DONKEY_CRITIQUES = [
979
- "\u5168\u80FD\u6218\u795E\u9690\u85CF\u6210\u5C31\u89E3\u9501\uFF01\u5468\u672B\u6301\u7EED\u7206\u809D\u8FED\u4EE3 + \u65E5\u5E38\u6DF1\u591C\u4FEE\u4ED9\u653B\u575A\u53CCbuff\u53E0\u52A0\u3002Git\u5B8C\u6574\u7559\u5B58\u4E86\u4F60\u6BCF\u4E00\u4EFD\u8F9B\u82E6\u4ED8\u51FA\uFF0C\u4F46\u4E5F\u771F\u5FC3\u5E0C\u671B\u4F60\u522B\u957F\u671F\u900F\u652F\uFF0C\u7559\u51FA\u65F6\u95F4\u597D\u597D\u7167\u987E\u81EA\u5DF1\u3002",
952
+ "\u5168\u80FD\u6218\u795E\u9690\u85CF\u6210\u5C31\u89E3\u9501\uFF01\u5468\u672B\u6301\u7EED\u7206\u809D\u8FED\u4EE3 + \u65E5\u5E38\u6DF1\u591C\u4FEE\u4ED9\u653B\u575A\u53CC\u6A21\u5F0F\u53E0\u52A0\u3002Git\u8BB0\u5F55\u4E86\u4F60\u6BCF\u4E00\u4EFD\u8F9B\u82E6\u4ED8\u51FA\uFF0C\u4F46\u4E5F\u8BB0\u5F97\u522B\u957F\u671F\u900F\u652F\uFF0C\u7559\u51FA\u65F6\u95F4\u597D\u597D\u7167\u987E\u81EA\u5DF1\u3002",
980
953
  "\u5468\u672B\u4F11\u606F\u65F6\u6BB5\u3001\u4E07\u7C41\u4FF1\u5BC2\u7684\u6DF1\u591C\u90FD\u7559\u4E0B\u4E86\u4F60\u7684\u4EE3\u7801\u63D0\u4EA4\u8DB3\u8FF9\uFF0C\u8D23\u4EFB\u5FC3\u4E0E\u5403\u82E6\u8010\u52B3\u5C5E\u6027\u76F4\u63A5\u62C9\u6EE1\u3002\u5168\u529B\u4E3A\u9879\u76EE\u51B2\u950B\u7684\u540C\u65F6\uFF0C\u52A1\u5FC5\u7559\u51FA\u7A7A\u95F2\u65F6\u95F4\u597D\u597D\u751F\u6D3B\u653E\u677E\u3002",
981
- "\u5168\u5E74\u65E0\u4F11\u5F0F\u5168\u80FD\u6253\u5DE5\u4EBA\uFF0C\u5DE5\u4F5C\u65E5\u71AC\u591C\u653B\u575A\u3001\u5468\u672B\u4E3B\u52A8\u8865\u5168\u8FED\u4EE3\uFF0C\u9879\u76EE\u4EFB\u4F55\u65F6\u6BB5\u7F3A\u4EBA\u515C\u5E95\u603B\u6709\u4F60\uFF0C\u4ED8\u51FA\u503C\u5F97\u6240\u6709\u4EBA\u8BA4\u53EF\uFF0C\u5207\u8BB0\u52B3\u9038\u7ED3\u5408\u4E0D\u8981\u8FC7\u5EA6\u52B3\u7D2F\u3002",
982
- "\u517C\u987E\u6DF1\u591C\u653B\u575A\u4E0E\u5468\u672B\u8865\u8FED\u4EE3\u7684\u5168\u80FD\u515C\u5E95\u9009\u624B\uFF0C\u53EA\u8981\u9879\u76EE\u6709\u7D27\u6025\u9700\u6C42\u968F\u65F6\u80FD\u4E0A\u7EBF\u5904\u7406\uFF0C\u625B\u4E0B\u5927\u91CF\u989D\u5916\u5DE5\u4F5C\u91CF\uFF0C\u5728\u62FC\u547D\u63A8\u8FDB\u8FDB\u5EA6\u7684\u540C\u65F6\u8BB0\u5F97\u591A\u4F11\u606F\u8C03\u517B\u8EAB\u5FC3\u3002",
954
+ "\u5168\u5E74\u65E0\u4F11\u5F0F\u5168\u80FD\u9009\u624B\uFF0C\u5DE5\u4F5C\u65E5\u71AC\u591C\u653B\u575A\u3001\u5468\u672B\u4E3B\u52A8\u8865\u5168\u8FED\u4EE3\uFF0C\u9879\u76EE\u4EFB\u4F55\u65F6\u6BB5\u7F3A\u4EBA\u515C\u5E95\u603B\u6709\u4F60\uFF0C\u4ED8\u51FA\u503C\u5F97\u6240\u6709\u4EBA\u8BA4\u53EF\uFF0C\u5207\u8BB0\u52B3\u9038\u7ED3\u5408\u4E0D\u8981\u8FC7\u5EA6\u52B3\u7D2F\u3002",
955
+ "\u517C\u987E\u6DF1\u591C\u653B\u575A\u4E0E\u5468\u672B\u8865\u8FED\u4EE3\u7684\u5168\u80FD\u515C\u5E95\u9009\u624B\uFF0C\u9879\u76EE\u6709\u7D27\u6025\u9700\u6C42\u65F6\u603B\u80FD\u4E0A\u7EBF\u5904\u7406\uFF0C\u627F\u62C5\u5927\u91CF\u989D\u5916\u5DE5\u4F5C\u91CF\uFF0C\u5728\u62FC\u547D\u63A8\u8FDB\u8FDB\u5EA6\u7684\u540C\u65F6\u8BB0\u5F97\u591A\u4F11\u606F\u8C03\u517B\u8EAB\u5FC3\u3002",
983
956
  "\u5168\u5929\u5019\u5F85\u547D\u7684\u9879\u76EE\u5B88\u62A4\u8005\uFF0C\u4E0D\u5206\u5DE5\u4F5C\u65E5\u4F11\u606F\u65E5\u3001\u4E0D\u5206\u767D\u663C\u6DF1\u591C\uFF0C\u968F\u65F6\u4E0A\u7EBF\u89E3\u51B3\u8FED\u4EE3\u5361\u70B9\uFF0C\u9AD8\u5F3A\u5EA6\u4ED8\u51FA\u503C\u5F97\u70B9\u8D5E\uFF0C\u4E00\u5B9A\u8981\u7ED9\u81EA\u5DF1\u7559\u51FA\u653E\u677E\u4F11\u606F\u7684\u4E13\u5C5E\u65F6\u95F4\u3002"
984
957
  ];
985
958
  var TAG_FISH_IMMORTAL_CRITIQUES = [
986
- "\u6478\u9C7C\u4ED9\u4EBA\u9690\u85CF\u6210\u5C31\uFF01\u6478\u9C7C\u677E\u5F1B\u6307\u6570\u7A81\u783495%\uFF0C\u5355\u65E5\u63D0\u4EA40-1\u6B21\u5373\u53EF\u5B8C\u6210\u5168\u90E8\u672C\u804C\u5DE5\u4F5C\u2014\u2014\u65E9\u5DF2\u8D85\u8D8A\u666E\u901A\u6D45\u5C42\u6478\u9C7C\uFF0C\u62B5\u8FBE\u65E0\u4E3A\u800C\u6CBB\u3001\u65E0\u62DB\u80DC\u6709\u62DB\u7684\u804C\u573A\u81F3\u9AD8\u5883\u754C\u3002",
987
- "\u6478\u9C7C\u4ED9\u4EBA\uFF0C\u5883\u754C\u65E9\u5DF2\u8D85\u8131\u51E1\u4EBA\uFF01\u6BCF\u65E5\u4EC5\u9700\u5BE5\u5BE5\u4E00\u6B21\u8F7B\u91CF\u63D0\u4EA4\uFF0C\u6DE1\u5B9A\u677E\u5F1B\u7387\u9AD8\u8FBE95%\u4EE5\u4E0A\uFF0C\u7528\u6700\u5C11\u7684\u64CD\u4F5C\u7A33\u7A33\u7EF4\u6301\u4E1A\u52A1\u6B63\u5E38\u8FD0\u8F6C\uFF0C\u59A5\u59A5\u4E16\u5916\u804C\u573A\u9AD8\u4EBA\u3002",
959
+ "\u6478\u9C7C\u4ED9\u4EBA\u9690\u85CF\u6210\u5C31\uFF01\u6478\u9C7C\u677E\u5F1B\u6307\u6570\u62C9\u6EE1\uFF0C\u5355\u65E5\u63D0\u4EA40-1\u6B21\u5373\u53EF\u5B8C\u6210\u5168\u90E8\u672C\u804C\u5DE5\u4F5C\u2014\u2014\u65E9\u5DF2\u8D85\u8D8A\u666E\u901A\u6D45\u5C42\u6478\u9C7C\uFF0C\u62B5\u8FBE\u4EE5\u7B80\u9A6D\u7E41\u3001\u65E0\u62DB\u80DC\u6709\u62DB\u7684\u804C\u573A\u81F3\u9AD8\u5883\u754C\u3002",
960
+ "\u6478\u9C7C\u4ED9\u4EBA\uFF0C\u5883\u754C\u5DF2\u7136\u4E0D\u540C\u51E1\u54CD\uFF01\u6BCF\u65E5\u4EC5\u9700\u5BE5\u5BE5\u4E00\u6B21\u8F7B\u91CF\u63D0\u4EA4\uFF0C\u6DE1\u5B9A\u677E\u5F1B\u7387\u6781\u9AD8\uFF0C\u7528\u6700\u5C11\u7684\u63D0\u4EA4\u7A33\u7A33\u7EF4\u6301\u4E1A\u52A1\u6B63\u5E38\u8FD0\u8F6C\uFF0C\u59A5\u59A5\u4E16\u5916\u804C\u573A\u9AD8\u4EBA\u3002",
988
961
  "\u53C2\u900F\u804C\u573A\u5E73\u8861\u4E4B\u9053\u7684\u6478\u9C7C\u4ED9\u4EBA\uFF0C\u8D85\u9AD8\u6548\u7387\u5FEB\u901F\u5B8C\u6210\u5F53\u65E5\u5168\u90E8\u4EFB\u52A1\uFF0C\u5269\u4F59\u65F6\u95F4\u5B89\u5FC3\u653E\u7A7A\u5145\u7535\uFF0C\u4E0D\u7528\u5185\u5377\u6D88\u8017\u81EA\u5DF1\uFF0C\u9AD8\u6548\u5B8C\u6210\u672C\u804C\u5C31\u662F\u6700\u9AD8\u7EA7\u7684\u6478\u9C7C\u667A\u6167\u3002",
989
962
  "\u6781\u7B80\u5DE5\u4F5C\u6D41\u4ED9\u4EBA\uFF0C\u5C11\u91CF\u64CD\u4F5C\u5C31\u80FD\u7A33\u59A5\u4EA4\u4ED8\u5168\u90E8\u5DE5\u4F5C\u5185\u5BB9\uFF0C\u4ECE\u4E0D\u76F2\u76EE\u6D88\u8017\u65F6\u95F4\u5185\u5377\uFF0C\u61C2\u5F97\u9AD8\u6548\u5B8C\u5DE5\u3001\u9002\u5EA6\u653E\u677E\uFF0C\u628A\u5DE5\u4F5C\u751F\u6D3B\u5E73\u8861\u62FF\u634F\u5230\u6781\u81F4\u3002",
990
- "\u522B\u4EBA\u82B1\u8D39\u4E00\u6574\u5929\u53CD\u590D\u8017\u5728\u5DE5\u4F4D\uFF0C\u4F60\u77ED\u65F6\u9AD8\u6548\u5B8C\u6210\u5168\u90E8\u9700\u6C42\uFF0C\u5176\u4F59\u65F6\u95F4\u4ECE\u5BB9\u81EA\u5728\u4F11\u6574\uFF0C\u6478\u9C7C\u4ED9\u4EBA\u7684\u6838\u5FC3\u4ECE\u6765\u4E0D\u662F\u6446\u70C2\uFF0C\u662F\u8D85\u9AD8\u5DE5\u4F5C\u6548\u7387\u5E26\u6765\u7684\u677E\u5F1B\u81EA\u7531\u3002"
963
+ "\u522B\u4EBA\u82B1\u8D39\u4E00\u6574\u5929\u5FD9\u788C\u5728\u5DE5\u4F4D\uFF0C\u4F60\u77ED\u65F6\u9AD8\u6548\u5B8C\u6210\u5168\u90E8\u9700\u6C42\uFF0C\u5176\u4F59\u65F6\u95F4\u4ECE\u5BB9\u81EA\u5728\u4F11\u6574\uFF0C\u6478\u9C7C\u4ED9\u4EBA\u7684\u6838\u5FC3\u4ECE\u6765\u4E0D\u662F\u6446\u70C2\uFF0C\u662F\u8D85\u9AD8\u5DE5\u4F5C\u6548\u7387\u5E26\u6765\u7684\u677E\u5F1B\u81EA\u7531\u3002"
991
964
  ];
992
- var TAG_COLOR_MAP = {
993
- "\u6478\u9C7C\u5B97\u5E08": chalk.green,
994
- "\u7206\u809D\u6218\u795E": chalk.red.bold,
995
- "\u6DF1\u591C\u4FEE\u4ED9\u8005": chalk.red,
996
- "\u52E4\u6073\u642C\u7816\u4EBA": chalk.yellow,
997
- "\u4E00\u628A\u68AD\u54C8\u578B\u7A0B\u5E8F\u5458": chalk.magenta,
998
- "PPT \u67B6\u6784\u5E08": chalk.blue,
999
- "\u683C\u5F0F\u5316\u5927\u5E08": chalk.cyan,
1000
- "Git \u804A\u5929\u8FBE\u4EBA": chalk.greenBright,
1001
- "\u6DF1\u591C\u523A\u5BA2": chalk.redBright,
1002
- "\u751F\u4EA7\u961F\u7684\u9A74": chalk.yellowBright,
1003
- "\u6478\u9C7C\u4ED9\u4EBA": chalk.green.bold
1004
- };
1005
- function colorizeCriticTags(text) {
1006
- const sortedKeys = Object.keys(TAG_COLOR_MAP).sort((a, b) => b.length - a.length);
1007
- let result = text;
1008
- for (const key of sortedKeys) {
1009
- const colorFn = TAG_COLOR_MAP[key];
1010
- const escaped = key.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
1011
- const regex = new RegExp(`\u300E?${escaped}\u300F?`, "g");
1012
- result = result.replace(regex, (match) => {
1013
- if (match.startsWith("\u300E") && match.endsWith("\u300F")) {
1014
- return "\u300E" + colorFn(key) + "\u300F";
1015
- }
1016
- return colorFn(match);
1017
- });
1018
- }
1019
- return result;
1020
- }
1021
965
  function getRandomItem(arr) {
1022
966
  const idx = Math.floor(Math.random() * arr.length);
1023
- return colorizeCriticTags(arr[idx]);
967
+ return arr[idx];
1024
968
  }
1025
969
  function getAICritic(weeklyStats) {
1026
970
  const parts = [];
@@ -1044,30 +988,17 @@ function getAICritic(weeklyStats) {
1044
988
  }
1045
989
  return parts.join("\n\n");
1046
990
  }
1047
- function getAICriticForMonth(monthlyStats) {
991
+ function getAICriticForMonth(monthlyStats, adjustedFish) {
1048
992
  const parts = [];
1049
993
  if (monthlyStats.ghostCommitsCount > 3) {
1050
994
  parts.push(getRandomItem(GHOST_CRITIQUES));
1051
995
  }
1052
- const { fix, feat, chore, other } = monthlyStats.categories;
1053
- const total = fix + feat + chore + other;
1054
- if (total > 0) {
1055
- const fixPct = Math.round(fix / total * 100);
1056
- const featPct = Math.round(feat / total * 100);
1057
- const chorePct = Math.round(chore / total * 100);
1058
- if (fixPct >= 50) {
1059
- parts.push(getRandomItem(CATEGORY_FIX_CRITIQUES).replace("%PERCENT%%", `${fixPct}%`));
1060
- } else if (featPct >= 50) {
1061
- parts.push(getRandomItem(CATEGORY_FEAT_CRITIQUES).replace("%PERCENT%%", `${featPct}%`));
1062
- } else if (chorePct >= 40) {
1063
- parts.push(getRandomItem(CATEGORY_CHORE_CRITIQUES).replace("%PERCENT%%", `${chorePct}%`));
1064
- }
1065
- }
996
+ const fish = adjustedFish ?? monthlyStats.averageFish;
1066
997
  if (monthlyStats.totalCommits === 0) {
1067
998
  parts.push("\u672C\u6708\u63D0\u4EA4\u6B21\u6570\u4E3A 0\uFF01\u4F60\u6210\u529F\u5730\u5728\u516C\u53F8\u84B8\u53D1\u4E86\u4E00\u4E2A\u6708\uFF0C\u62FF\u5230\u4E86\u5168\u989D\u5DE5\u8D44\u3002\u5EFA\u8BAE\u4F60\u4E0B\u4E2A\u6708\u7EE7\u7EED\u4FDD\u6301\u4F4E\u8C03\uFF0C\u4E0D\u8981\u8BA9 HR \u6CE8\u610F\u5230\u4F60\u3002");
1068
- } else if (monthlyStats.averageFish >= 70) {
999
+ } else if (fish >= 70) {
1069
1000
  parts.push(getRandomItem(SLACK_HIGH_CRITIQUES));
1070
- } else if (monthlyStats.averageFish <= 35) {
1001
+ } else if (fish <= 35) {
1071
1002
  parts.push(getRandomItem(SLACK_LOW_CRITIQUES));
1072
1003
  }
1073
1004
  if (parts.length === 0) {
@@ -1113,6 +1044,104 @@ function getTagCriticsFromDays(days) {
1113
1044
  return critics;
1114
1045
  }
1115
1046
 
1047
+ // src/holiday.ts
1048
+ var holiday_in_law = {
1049
+ "2025-01-01": { "type": "holiday", "name": "\u5143\u65E6" },
1050
+ "2025-01-26": { "type": "workday", "name": "\u6625\u8282\u8C03\u4F11\u73ED" },
1051
+ "2025-01-28": { "type": "holiday", "name": "\u6625\u8282" },
1052
+ "2025-01-29": { "type": "holiday", "name": "\u6625\u8282" },
1053
+ "2025-01-30": { "type": "holiday", "name": "\u6625\u8282" },
1054
+ "2025-01-31": { "type": "holiday", "name": "\u6625\u8282" },
1055
+ "2025-02-01": { "type": "holiday", "name": "\u6625\u8282" },
1056
+ "2025-02-02": { "type": "holiday", "name": "\u6625\u8282" },
1057
+ "2025-02-03": { "type": "holiday", "name": "\u6625\u8282" },
1058
+ "2025-02-04": { "type": "holiday", "name": "\u6625\u8282" },
1059
+ "2025-02-08": { "type": "workday", "name": "\u6625\u8282\u8C03\u4F11\u73ED" },
1060
+ "2025-04-04": { "type": "holiday", "name": "\u6E05\u660E\u8282" },
1061
+ "2025-04-05": { "type": "holiday", "name": "\u6E05\u660E\u8282" },
1062
+ "2025-04-06": { "type": "holiday", "name": "\u6E05\u660E\u8282" },
1063
+ "2025-04-27": { "type": "workday", "name": "\u52B3\u52A8\u8282\u8C03\u4F11\u73ED" },
1064
+ "2025-05-01": { "type": "holiday", "name": "\u52B3\u52A8\u8282" },
1065
+ "2025-05-02": { "type": "holiday", "name": "\u52B3\u52A8\u8282" },
1066
+ "2025-05-03": { "type": "holiday", "name": "\u52B3\u52A8\u8282" },
1067
+ "2025-05-04": { "type": "holiday", "name": "\u52B3\u52A8\u8282" },
1068
+ "2025-05-05": { "type": "holiday", "name": "\u52B3\u52A8\u8282" },
1069
+ "2025-05-31": { "type": "holiday", "name": "\u7AEF\u5348\u8282" },
1070
+ "2025-06-01": { "type": "holiday", "name": "\u7AEF\u5348\u8282" },
1071
+ "2025-06-02": { "type": "holiday", "name": "\u7AEF\u5348\u8282" },
1072
+ "2025-09-28": { "type": "workday", "name": "\u56FD\u5E86\u8282\u8C03\u4F11\u73ED" },
1073
+ "2025-10-01": { "type": "holiday", "name": "\u56FD\u5E86\u8282" },
1074
+ "2025-10-02": { "type": "holiday", "name": "\u56FD\u5E86\u8282" },
1075
+ "2025-10-03": { "type": "holiday", "name": "\u56FD\u5E86\u8282" },
1076
+ "2025-10-04": { "type": "holiday", "name": "\u56FD\u5E86\u8282" },
1077
+ "2025-10-05": { "type": "holiday", "name": "\u56FD\u5E86\u8282" },
1078
+ "2025-10-06": { "type": "holiday", "name": "\u4E2D\u79CB\u8282" },
1079
+ "2025-10-07": { "type": "holiday", "name": "\u56FD\u5E86\u8282" },
1080
+ "2025-10-08": { "type": "holiday", "name": "\u56FD\u5E86\u8282" },
1081
+ "2025-10-11": { "type": "workday", "name": "\u56FD\u5E86\u8282\u8C03\u4F11\u73ED" },
1082
+ "2026-01-01": { "type": "holiday", "name": "\u5143\u65E6" },
1083
+ "2026-01-02": { "type": "holiday", "name": "\u5143\u65E6" },
1084
+ "2026-01-03": { "type": "holiday", "name": "\u5143\u65E6" },
1085
+ "2026-01-04": { "type": "workday", "name": "\u5143\u65E6\u8C03\u4F11\u73ED" },
1086
+ "2026-02-14": { "type": "workday", "name": "\u6625\u8282\u8C03\u4F11\u73ED" },
1087
+ "2026-02-15": { "type": "holiday", "name": "\u6625\u8282" },
1088
+ "2026-02-16": { "type": "holiday", "name": "\u6625\u8282" },
1089
+ "2026-02-17": { "type": "holiday", "name": "\u6625\u8282" },
1090
+ "2026-02-18": { "type": "holiday", "name": "\u6625\u8282" },
1091
+ "2026-02-19": { "type": "holiday", "name": "\u6625\u8282" },
1092
+ "2026-02-20": { "type": "holiday", "name": "\u6625\u8282" },
1093
+ "2026-02-21": { "type": "holiday", "name": "\u6625\u8282" },
1094
+ "2026-02-22": { "type": "holiday", "name": "\u6625\u8282" },
1095
+ "2026-02-23": { "type": "holiday", "name": "\u6625\u8282" },
1096
+ "2026-02-28": { "type": "workday", "name": "\u6625\u8282\u8C03\u4F11\u73ED" },
1097
+ "2026-04-04": { "type": "holiday", "name": "\u6E05\u660E\u8282" },
1098
+ "2026-04-05": { "type": "holiday", "name": "\u6E05\u660E\u8282" },
1099
+ "2026-04-06": { "type": "holiday", "name": "\u6E05\u660E\u8282" },
1100
+ "2026-05-01": { "type": "holiday", "name": "\u52B3\u52A8\u8282" },
1101
+ "2026-05-02": { "type": "holiday", "name": "\u52B3\u52A8\u8282" },
1102
+ "2026-05-03": { "type": "holiday", "name": "\u52B3\u52A8\u8282" },
1103
+ "2026-05-04": { "type": "holiday", "name": "\u52B3\u52A8\u8282" },
1104
+ "2026-05-05": { "type": "holiday", "name": "\u52B3\u52A8\u8282" },
1105
+ "2026-05-09": { "type": "workday", "name": "\u52B3\u52A8\u8282\u8C03\u4F11\u73ED" },
1106
+ "2026-06-19": { "type": "holiday", "name": "\u7AEF\u5348\u8282" },
1107
+ "2026-06-20": { "type": "holiday", "name": "\u7AEF\u5348\u8282" },
1108
+ "2026-06-21": { "type": "holiday", "name": "\u7AEF\u5348\u8282" },
1109
+ "2026-09-20": { "type": "workday", "name": "\u56FD\u5E86\u8282\u8C03\u4F11\u73ED" },
1110
+ "2026-09-25": { "type": "holiday", "name": "\u4E2D\u79CB\u8282" },
1111
+ "2026-09-26": { "type": "holiday", "name": "\u4E2D\u79CB\u8282" },
1112
+ "2026-09-27": { "type": "holiday", "name": "\u4E2D\u79CB\u8282" },
1113
+ "2026-10-01": { "type": "holiday", "name": "\u56FD\u5E86\u8282" },
1114
+ "2026-10-02": { "type": "holiday", "name": "\u56FD\u5E86\u8282" },
1115
+ "2026-10-03": { "type": "holiday", "name": "\u56FD\u5E86\u8282" },
1116
+ "2026-10-04": { "type": "holiday", "name": "\u56FD\u5E86\u8282" },
1117
+ "2026-10-05": { "type": "holiday", "name": "\u56FD\u5E86\u8282" },
1118
+ "2026-10-06": { "type": "holiday", "name": "\u56FD\u5E86\u8282" },
1119
+ "2026-10-07": { "type": "holiday", "name": "\u56FD\u5E86\u8282" },
1120
+ "2026-10-10": { "type": "workday", "name": "\u56FD\u5E86\u8282\u8C03\u4F11\u73ED" }
1121
+ };
1122
+ function formatDateKey(date) {
1123
+ const y = date.getFullYear();
1124
+ const m = String(date.getMonth() + 1).padStart(2, "0");
1125
+ const d = String(date.getDate()).padStart(2, "0");
1126
+ return `${y}-${m}-${d}`;
1127
+ }
1128
+ function isHoliday(date) {
1129
+ const key = formatDateKey(date);
1130
+ return holiday_in_law[key]?.type === "holiday";
1131
+ }
1132
+ function isCompensatoryWorkday(date) {
1133
+ const key = formatDateKey(date);
1134
+ return holiday_in_law[key]?.type === "workday";
1135
+ }
1136
+ function isRestDay(date) {
1137
+ if (isHoliday(date)) return true;
1138
+ const dayOfWeek = date.getDay();
1139
+ if (dayOfWeek === 0 || dayOfWeek === 6) {
1140
+ return !isCompensatoryWorkday(date);
1141
+ }
1142
+ return false;
1143
+ }
1144
+
1116
1145
  // src/index.ts
1117
1146
  var program = new Command();
1118
1147
  function getCliVersion() {
@@ -1130,7 +1159,7 @@ function showLoading(message) {
1130
1159
  let frameIdx = 0;
1131
1160
  process.stdout.write("\x1B[?25l");
1132
1161
  const timer = setInterval(() => {
1133
- process.stdout.write(`\r${chalk2.cyan(SPINNER_FRAMES[frameIdx])} ${chalk2.yellow(message)} `);
1162
+ process.stdout.write(`\r${chalk.cyan(SPINNER_FRAMES[frameIdx])} ${chalk.yellow(message)} `);
1134
1163
  frameIdx = (frameIdx + 1) % SPINNER_FRAMES.length;
1135
1164
  }, 150);
1136
1165
  return {
@@ -1145,57 +1174,57 @@ function showLoading(message) {
1145
1174
  };
1146
1175
  }
1147
1176
  function printBanner(title) {
1148
- console.log(chalk2.cyan.bold("\n" + "=".repeat(50)));
1149
- console.log(chalk2.blue.bold(` \u{1F41F} FISH - ${title}`));
1150
- console.log(chalk2.cyan.bold("=".repeat(50) + "\n"));
1177
+ console.log(chalk.cyan.bold("\n" + "=".repeat(50)));
1178
+ console.log(chalk.blue.bold(` \u{1F41F} FISH - ${title}`));
1179
+ console.log(chalk.cyan.bold("=".repeat(50) + "\n"));
1151
1180
  }
1152
1181
  function formatSlackIndex(fish) {
1153
1182
  if (fish >= 90) {
1154
- return chalk2.green(`${fish}% (\u7EC8\u6781\u6478\u9C7C \u{1F3A3})`);
1183
+ return chalk.green(`${fish}% (\u7EC8\u6781\u6478\u9C7C \u{1F3A3})`);
1155
1184
  } else if (fish >= 70) {
1156
- return chalk2.green(`${fish}% (\u5408\u7406\u5212\u6C34 \u2615)`);
1185
+ return chalk.green(`${fish}% (\u5408\u7406\u5212\u6C34 \u2615)`);
1157
1186
  } else if (fish >= 40) {
1158
- return chalk2.yellow(`${fish}% (\u6B63\u5E38\u8425\u4E1A \u{1F4BB})`);
1187
+ return chalk.yellow(`${fish}% (\u6B63\u5E38\u8425\u4E1A \u{1F4BB})`);
1159
1188
  } else {
1160
- return chalk2.red(`${fish}% (\u706B\u529B\u5168\u5F00 \u{1F525})`);
1189
+ return chalk.red(`${fish}% (\u706B\u529B\u5168\u5F00 \u{1F525})`);
1161
1190
  }
1162
1191
  }
1163
1192
  function formatNightOwlIndex(nightOwl) {
1164
1193
  if (nightOwl >= 60) {
1165
- return chalk2.red.bold(`${nightOwl}% (\u4FEE\u4ED9\u5927\u4F6C \u{1F9D9})`);
1194
+ return chalk.red.bold(`${nightOwl}% (\u4FEE\u4ED9\u5927\u4F6C \u{1F9D9})`);
1166
1195
  } else if (nightOwl >= 30) {
1167
- return chalk2.red(`${nightOwl}% (\u591C\u732B\u51FA\u6CA1 \u{1F989})`);
1196
+ return chalk.red(`${nightOwl}% (\u591C\u732B\u51FA\u6CA1 \u{1F989})`);
1168
1197
  } else if (nightOwl >= 10) {
1169
- return chalk2.yellow(`${nightOwl}% (\u5076\u5C14\u71AC\u591C \u{1F319})`);
1198
+ return chalk.yellow(`${nightOwl}% (\u5076\u5C14\u71AC\u591C \u{1F319})`);
1170
1199
  } else {
1171
1200
  return "";
1172
1201
  }
1173
1202
  }
1174
1203
  function formatOvertimeIndex(fish) {
1175
1204
  if (fish >= 80) {
1176
- return chalk2.green(`${fish}% (\u5468\u672B\u6478\u9C7C \u{1F3A3})`);
1205
+ return chalk.green(`${fish}% (\u5468\u672B\u6478\u9C7C \u{1F3A3})`);
1177
1206
  } else if (fish >= 50) {
1178
- return chalk2.yellow(`${fish}% (\u8F7B\u5FAE\u52A0\u73ED \u{1F319})`);
1207
+ return chalk.yellow(`${fish}% (\u8F7B\u5FAE\u52A0\u73ED \u{1F319})`);
1179
1208
  } else if (fish >= 20) {
1180
- return chalk2.red(`${fish}% (\u5468\u672B\u7206\u809D \u{1F525})`);
1209
+ return chalk.red(`${fish}% (\u5468\u672B\u7206\u809D \u{1F525})`);
1181
1210
  } else {
1182
- return chalk2.red.bold(`${fish}% (\u7EC8\u6781\u7206\u809D \u2620\uFE0F)`);
1211
+ return chalk.red.bold(`${fish}% (\u7EC8\u6781\u7206\u809D \u2620\uFE0F)`);
1183
1212
  }
1184
1213
  }
1185
1214
  function formatCodeVolume(totalLines) {
1186
1215
  if (totalLines <= 0) return "";
1187
1216
  if (totalLines >= 1e3) {
1188
- return chalk2.red.bold(`${totalLines}\u884C (\u4EE3\u7801\u6838\u7206 \u2622\uFE0F)`);
1217
+ return chalk.red.bold(`${totalLines}\u884C (\u4EE3\u7801\u6838\u7206 \u2622\uFE0F)`);
1189
1218
  } else if (totalLines >= 500) {
1190
- return chalk2.magenta(`${totalLines}\u884C (\u642C\u7816\u72C2\u9B54 \u{1F69A})`);
1219
+ return chalk.magenta(`${totalLines}\u884C (\u642C\u7816\u72C2\u9B54 \u{1F69A})`);
1191
1220
  } else if (totalLines >= 200) {
1192
- return chalk2.yellow(`${totalLines}\u884C (\u5927\u578B\u6539\u52A8 \u{1F9F1})`);
1221
+ return chalk.yellow(`${totalLines}\u884C (\u5927\u578B\u6539\u52A8 \u{1F9F1})`);
1193
1222
  } else if (totalLines >= 80) {
1194
- return chalk2.cyan(`${totalLines}\u884C (\u6B63\u5E38\u8425\u4E1A \u{1F4E6})`);
1223
+ return chalk.cyan(`${totalLines}\u884C (\u6B63\u5E38\u8425\u4E1A \u{1F4E6})`);
1195
1224
  } else if (totalLines >= 20) {
1196
- return chalk2.green(`${totalLines}\u884C (\u7F1D\u7F1D\u8865\u8865 \u{1F527})`);
1225
+ return chalk.green(`${totalLines}\u884C (\u7F1D\u7F1D\u8865\u8865 \u{1F527})`);
1197
1226
  } else {
1198
- return chalk2.gray(`${totalLines}\u884C (\u5C0F\u4FEE\u5C0F\u8865 \u270F\uFE0F)`);
1227
+ return chalk.gray(`${totalLines}\u884C (\u5C0F\u4FEE\u5C0F\u8865 \u270F\uFE0F)`);
1199
1228
  }
1200
1229
  }
1201
1230
  function getPersonalityTag(day) {
@@ -1203,18 +1232,18 @@ function getPersonalityTag(day) {
1203
1232
  }
1204
1233
  function colorizeTags(tagStr) {
1205
1234
  const colorMap = {
1206
- "\u{1F41F} \u6478\u9C7C\u5B97\u5E08": chalk2.green,
1207
- "\u{1F525} \u7206\u809D\u6218\u795E": chalk2.red.bold,
1208
- "\u{1F319} \u6DF1\u591C\u4FEE\u4ED9\u8005": chalk2.red,
1209
- "\u{1F9F1} \u52E4\u6073\u642C\u7816\u4EBA": chalk2.yellow,
1210
- "\u{1F4A5} \u4E00\u628A\u68AD\u54C8\u578B\u7A0B\u5E8F\u5458": chalk2.magenta,
1211
- "\u{1F3F7}\uFE0F PPT \u67B6\u6784\u5E08": chalk2.blue,
1212
- "\u{1F3F7}\uFE0F \u683C\u5F0F\u5316\u5927\u5E08": chalk2.cyan,
1213
- "\u{1F4AC} Git \u804A\u5929\u8FBE\u4EBA": chalk2.greenBright,
1214
- "\u{1F319} \u6DF1\u591C\u523A\u5BA2": chalk2.redBright,
1215
- "\u{1F434} \u751F\u4EA7\u961F\u7684\u9A74": chalk2.yellowBright,
1216
- "\u{1F41F} \u6478\u9C7C\u4ED9\u4EBA": chalk2.green.bold,
1217
- "\u{1F41F} \u4ECA\u65E5\u6682\u65E0\u4EE3\u7801\u6D3B\u52A8": chalk2.green
1235
+ "\u{1F41F} \u6478\u9C7C\u5B97\u5E08": chalk.green,
1236
+ "\u{1F525} \u7206\u809D\u6218\u795E": chalk.red.bold,
1237
+ "\u{1F319} \u6DF1\u591C\u4FEE\u4ED9\u8005": chalk.red,
1238
+ "\u{1F9F1} \u52E4\u6073\u642C\u7816\u4EBA": chalk.yellow,
1239
+ "\u{1F4A5} \u4E00\u628A\u68AD\u54C8\u578B\u7A0B\u5E8F\u5458": chalk.magenta,
1240
+ "\u{1F3F7}\uFE0F PPT \u67B6\u6784\u5E08": chalk.blue,
1241
+ "\u{1F3F7}\uFE0F \u683C\u5F0F\u5316\u5927\u5E08": chalk.cyan,
1242
+ "\u{1F4AC} Git \u804A\u5929\u8FBE\u4EBA": chalk.greenBright,
1243
+ "\u{1F319} \u6DF1\u591C\u523A\u5BA2": chalk.redBright,
1244
+ "\u{1F434} \u751F\u4EA7\u961F\u7684\u9A74": chalk.yellowBright,
1245
+ "\u{1F41F} \u6478\u9C7C\u4ED9\u4EBA": chalk.green.bold,
1246
+ "\u{1F41F} \u4ECA\u65E5\u6682\u65E0\u4EE3\u7801\u6D3B\u52A8": chalk.green
1218
1247
  };
1219
1248
  const sortedKeys = Object.keys(colorMap).sort((a, b) => b.length - a.length);
1220
1249
  let result = tagStr;
@@ -1252,11 +1281,11 @@ function colorizeFishRow(row) {
1252
1281
  if (isNaN(val)) {
1253
1282
  result += chunk;
1254
1283
  } else if (val >= 80) {
1255
- result += chalk2.green(chunk);
1284
+ result += chalk.green(chunk);
1256
1285
  } else if (val >= 40) {
1257
- result += chalk2.yellow(chunk);
1286
+ result += chalk.yellow(chunk);
1258
1287
  } else {
1259
- result += chalk2.red(chunk);
1288
+ result += chalk.red(chunk);
1260
1289
  }
1261
1290
  }
1262
1291
  return result;
@@ -1277,61 +1306,61 @@ function randomPick(arr) {
1277
1306
  return arr[Math.floor(Math.random() * arr.length)];
1278
1307
  }
1279
1308
  var COMMENT_POOLS = {
1280
- "0-2": { color: chalk2.red, tags: [
1309
+ "0-2": { color: chalk.red, tags: [
1281
1310
  "\u670D\u52A1\u5668\u548C\u4F60\uFF0C\u603B\u5F97\u6709\u4E00\u4E2A\u7761\u89C9 \u{1F635}\u200D\u{1F4AB}",
1282
1311
  "\u591C\u732B\u4FEE\u4ED9 \u{1F9D9}",
1283
1312
  "\u8FD9\u63D0\u4EA4\u4E0D\u50CF\u5DE5\u4F5C\uFF0C\u50CF\u62A5\u590D\u4EE3\u7801 \u{1F608}",
1284
1313
  "\u6DF1\u591C\u4FEE\u4ED9\u578B\u7A0B\u5E8F\u5458 \u{1F319}"
1285
1314
  ] },
1286
- "3-5": { color: chalk2.redBright, tags: [
1315
+ "3-5": { color: chalk.redBright, tags: [
1287
1316
  "\u960E\u738B\uFF1A\u600E\u4E48\u53C8\u662F\u4F60\uFF1F\u{1F47B}",
1288
1317
  "\u751F\u7269\u949F\u5DF2\u9635\u4EA1 \u2620\uFE0F",
1289
1318
  "\u54E5\uFF0C\u4F60\u662F\u4F4F\u516C\u53F8\u4E86\u5417 \u{1F3E2}",
1290
1319
  "\u9E21\u9E23\u5373\u8D77\u578B\u725B\u9A6C \u{1F414}"
1291
1320
  ] },
1292
- "6-8": { color: chalk2.gray, tags: [
1321
+ "6-8": { color: chalk.gray, tags: [
1293
1322
  "\u9E21\u90FD\u6CA1\u8D77\uFF0C\u4F60\u5148\u4E0A\u73ED\u4E86 \u{1F414}",
1294
1323
  "\u5929\u9009\u725B\u9A6C\u5DF2\u4E0A\u7EBF \u{1F402}",
1295
1324
  "\u7206\u809D\u542F\u52A8\u6210\u529F \u{1F680}",
1296
1325
  "\u65E9\u8D77\u7684 commit \u6709 bug \u5403 \u{1F41B}"
1297
1326
  ] },
1298
- "9-11": { color: chalk2.yellow, tags: [
1327
+ "9-11": { color: chalk.yellow, tags: [
1299
1328
  "\u5047\u88C5\u5F88\u5FD9\uFF0C\u5176\u5B9E\u5728\u7B49\u5348\u996D \u{1F371}",
1300
1329
  "\u6668\u95F4coding \u2615",
1301
1330
  "\u6B63\u5E38\u4EBA\u7C7B\u5DE5\u4F5C\u65F6\u95F4 \u2705",
1302
1331
  "\u4E0A\u5348\u8868\u6F14\u578B\u9009\u624B \u{1F680}"
1303
1332
  ] },
1304
- "12-13": { color: chalk2.green, tags: [
1333
+ "12-13": { color: chalk.green, tags: [
1305
1334
  "\u5DE5\u4F4D\u5403\u996D\uFF0C\u7075\u9B42\u7EED\u547D \u{1F50B}",
1306
1335
  "\u5E72\u996D\u662F\u7B2C\u4E00\u751F\u4EA7\u529B \u{1F35A}",
1307
1336
  "\u4E00\u8FB9\u5403\u996D\u4E00\u8FB9 commit \u{1F35C}",
1308
1337
  "\u5E72\u996D\u7EED\u547D\u578B\u5DE5\u7A0B\u5E08 \u{1F371}"
1309
1338
  ] },
1310
- "14-15": { color: chalk2.cyan, tags: [
1339
+ "14-15": { color: chalk.cyan, tags: [
1311
1340
  "\u5348\u7761\u672A\u9192\uFF0C\u4EBA\u5DF2\u5F00\u5DE5 \u{1F62A}",
1312
1341
  "CPU \u91CD\u542F\u4E2D \u{1F504}",
1313
1342
  // '午觉没睡成,拿代码出气 💢',
1314
1343
  "\u5348\u540E\u7075\u9B42\u51FA\u7A8D\u8005 \u{1F47B}"
1315
1344
  ] },
1316
- "16-17": { color: chalk2.cyanBright, tags: [
1345
+ "16-17": { color: chalk.cyanBright, tags: [
1317
1346
  "\u5F00\u59CB\u601D\u8003\u4ECA\u665A\u5403\u4EC0\u4E48 \u{1F373}",
1318
1347
  "\u7075\u9B42\u5DF2\u4E0B\u73ED \u{1F47B}",
1319
1348
  "\u4E34\u8FD1\u4E0B\u73ED\u7A81\u7136\u52E4\u594B \u{1F914}",
1320
1349
  "\u7B49\u4E0B\u73ED\u89C2\u5BDF\u5458 \u{1F375}"
1321
1350
  ] },
1322
- "18-20": { color: chalk2.magenta, tags: [
1351
+ "18-20": { color: chalk.magenta, tags: [
1323
1352
  "\u52A0\u73ED\u662F\u4E0D\u53EF\u80FD\u4E3B\u52A8\u52A0\u73ED\u7684 \u{1F4BC}",
1324
1353
  "\u5DE5\u4F4D\u5C01\u5370\u89E3\u9664 \u{1F513}",
1325
1354
  "\u767D\u5929\u5728\u5F00\u4F1A\uFF0C\u665A\u4E0A\u771F\u5E72\u6D3B \u{1F4BB}",
1326
1355
  "\u81EA\u613F\uFF08\u88AB\u8FEB\uFF09\u52A0\u73ED\u4EBA \u{1F4AA}"
1327
1356
  ] },
1328
- "21-22": { color: chalk2.magentaBright, tags: [
1357
+ "21-22": { color: chalk.magentaBright, tags: [
1329
1358
  "\u8001\u677F\u4E0B\u73ED\u4E86\uFF0C\u4F60\u8FD8\u6CA1\u4E0B\u7EBF \u{1F62D}",
1330
1359
  "\u52A0\u73ED\u4ED9\u4EBA\u6E21\u52AB\u4E2D \u26A1",
1331
1360
  "\u4ECA\u65E5\u6700\u540E\u4E00\u4E2A commit\uFF08\u9A97\u81EA\u5DF1\uFF09\u{1F921}",
1332
1361
  "\u5927\u798F\u62A5\u65F6\u95F4 \u{1F525}"
1333
1362
  ] },
1334
- "23": { color: chalk2.red, tags: [
1363
+ "23": { color: chalk.red, tags: [
1335
1364
  "\u4EE3\u7801\u548C\u5934\u53D1\u4E00\u8D77\u6389\u5149\u4E2D \u{1F9D1}\u200D\u{1F9B2}",
1336
1365
  "\u4ECA\u65E5 KPI\uFF1A\u6D3B\u7740\u5C31\u884C \u{1F60C}",
1337
1366
  "\u7761\u5427\uFF0CGit \u4E0D\u4F1A\u8DD1 \u{1F6CC}",
@@ -1368,11 +1397,11 @@ async function runWeeklyReport(weeksAgo, source, showProjects = false) {
1368
1397
  const config = readConfig();
1369
1398
  const hasGitLab = config.gitlabToken || config.gitlabs && config.gitlabs.length > 0;
1370
1399
  if (!hasGit && config.projects.length === 0 && !hasGitLab) {
1371
- console.log(chalk2.yellow(`\u26A0 \u63D0\u793A: \u5F53\u524D\u5DE5\u4F5C\u76EE\u5F55\u4E0D\u662F\u4E00\u4E2A Git \u4ED3\u5E93\u3002`));
1372
- console.log(chalk2.gray(`\u4F60\u53EF\u4EE5\u901A\u8FC7\u4EE5\u4E0B\u547D\u4EE4\u914D\u7F6E\u9879\u76EE\u6216 GitLab\uFF1A`));
1373
- console.log(` ${chalk2.cyan("fish config add <path>")} - \u624B\u52A8\u6DFB\u52A0\u672C\u5730\u4ED3\u5E93`);
1374
- console.log(` ${chalk2.cyan("fish config scan <dir>")} - \u81EA\u52A8\u626B\u63CF\u76EE\u5F55\u4E0B\u6240\u6709\u4ED3\u5E93`);
1375
- console.log(` ${chalk2.cyan("fish config gitlab <token> [host] [name]")} - \u914D\u7F6E GitLab \u4EE4\u724C\u4EE5\u8FDC\u7A0B\u540C\u6B65\u6240\u6709\u9879\u76EE
1400
+ console.log(chalk.yellow(`\u26A0 \u63D0\u793A: \u5F53\u524D\u5DE5\u4F5C\u76EE\u5F55\u4E0D\u662F\u4E00\u4E2A Git \u4ED3\u5E93\u3002`));
1401
+ console.log(chalk.gray(`\u4F60\u53EF\u4EE5\u901A\u8FC7\u4EE5\u4E0B\u547D\u4EE4\u914D\u7F6E\u9879\u76EE\u6216 GitLab\uFF1A`));
1402
+ console.log(` ${chalk.cyan("fish config add <path>")} - \u624B\u52A8\u6DFB\u52A0\u672C\u5730\u4ED3\u5E93`);
1403
+ console.log(` ${chalk.cyan("fish config scan <dir>")} - \u81EA\u52A8\u626B\u63CF\u76EE\u5F55\u4E0B\u6240\u6709\u4ED3\u5E93`);
1404
+ console.log(` ${chalk.cyan("fish config gitlab <token> [host] [name]")} - \u914D\u7F6E GitLab \u4EE4\u724C\u4EE5\u8FDC\u7A0B\u540C\u6B65\u6240\u6709\u9879\u76EE
1376
1405
  `);
1377
1406
  }
1378
1407
  }
@@ -1385,7 +1414,7 @@ async function runWeeklyReport(weeksAgo, source, showProjects = false) {
1385
1414
  const loading = showLoading("\u6B63\u5728\u6478\u904D\u6240\u6709\u4ED3\u5E93...");
1386
1415
  const stats = await analyzeWeekly(projects, targetDate, source);
1387
1416
  loading.stop();
1388
- console.log(chalk2.cyan.bold("\u{1F4C5} \u672C\u5468\u63D0\u4EA4\u8BE6\u60C5\uFF1A"));
1417
+ console.log(chalk.cyan.bold("\u{1F4C5} \u672C\u5468\u63D0\u4EA4\u8BE6\u60C5\uFF1A"));
1389
1418
  stats.days.forEach((day, idx) => {
1390
1419
  const isWeekend = idx >= 5;
1391
1420
  const isFuture = idx > currentDayOfWeek;
@@ -1393,10 +1422,10 @@ async function runWeeklyReport(weeksAgo, source, showProjects = false) {
1393
1422
  return;
1394
1423
  }
1395
1424
  if (isFuture && day.commitsCount === 0) {
1396
- console.log(` ${day.dayName}\uFF1A${chalk2.gray("\u672A\u5230")}`);
1425
+ console.log(` ${day.dayName}\uFF1A${chalk.gray("\u672A\u5230")}`);
1397
1426
  } else {
1398
- const projStr = day.projects.length > 0 ? ` | ${day.projects.length}\u4E2A\u9879\u76EE${showProjects ? ` (${day.projects.join(", ")})` : ""}` : "";
1399
- const commitStr = day.commitsCount > 0 ? chalk2.white.bold(`${day.commitsCount} \u6B21`) : "0 \u6B21";
1427
+ const projStr = day.projects.length > 0 ? ` | ${day.projects.length}\u4E2A\u9879\u76EE (${day.projects.join(", ")})` : "";
1428
+ const commitStr = day.commitsCount > 0 ? chalk.white.bold(`${day.commitsCount} \u6B21`) : "0 \u6B21";
1400
1429
  const indices = [];
1401
1430
  if (isWeekend) {
1402
1431
  indices.push(`\u{1F4BC} \u52A0\u73ED\u6307\u6570: ${formatOvertimeIndex(day.fish)}`);
@@ -1417,19 +1446,17 @@ async function runWeeklyReport(weeksAgo, source, showProjects = false) {
1417
1446
  console.log(` ${day.dayName}\uFF1A${commitStr}${extraIndices}${projStr}${branchStr}${tagStr}`);
1418
1447
  }
1419
1448
  });
1420
- console.log("\n" + chalk2.gray("-".repeat(50)));
1449
+ console.log("\n" + chalk.gray("-".repeat(50)));
1421
1450
  if (stats.totalCommits > 0) {
1422
1451
  const activeDays = stats.days.filter((_, idx) => idx <= currentDayOfWeek);
1423
- const workingDays = activeDays.filter((d) => d.commitsCount > 0);
1452
+ const workingDays = activeDays.filter((d) => d.commitsCount > 0 && d.dayName !== "\u5468\u516D" && d.dayName !== "\u5468\u65E5");
1424
1453
  if (workingDays.length > 0) {
1425
1454
  const minFish = Math.min(...workingDays.map((d) => d.fish));
1426
1455
  const mostProductiveDays = workingDays.filter((d) => d.fish === minFish);
1427
1456
  if (minFish <= 40 && mostProductiveDays.length > 0) {
1428
1457
  const names = mostProductiveDays.map((d) => d.dayName).join("\u3001");
1429
1458
  const sample = mostProductiveDays[0];
1430
- const isWeekend = sample.dayName === "\u5468\u516D" || sample.dayName === "\u5468\u65E5";
1431
- const label = isWeekend ? "\u{1F4BC} \u52A0\u73ED\u6307\u6570" : "\u{1F41F} \u6478\u9C7C\u6307\u6570";
1432
- console.log(`\u{1F3C6} ${chalk2.red.bold("\u6700\u52AA\u529B\u7684\u65E5\u5B50")}\uFF1A${names} | ${label}\uFF1A${sample.fish}%`);
1459
+ console.log(`\u{1F3C6} ${chalk.red.bold("\u6700\u52AA\u529B\u7684\u65E5\u5B50")}\uFF1A${names} | \u{1F41F} \u6478\u9C7C\u6307\u6570\uFF1A${sample.fish}%`);
1433
1460
  }
1434
1461
  }
1435
1462
  const weekdayDays = activeDays.filter((d) => d.dayName !== "\u5468\u516D" && d.dayName !== "\u5468\u65E5");
@@ -1443,7 +1470,7 @@ async function runWeeklyReport(weeksAgo, source, showProjects = false) {
1443
1470
  if (maxFish >= 70 && filteredHappyDays.length > 0) {
1444
1471
  const names = filteredHappyDays.map((d) => d.dayName).join("\u3001");
1445
1472
  const sample = filteredHappyDays[0];
1446
- console.log(`\u2615 ${chalk2.green.bold("\u6700\u5FEB\u4E50\u7684\u65E5\u5B50")}\uFF1A${names} | \u{1F41F} \u6478\u9C7C\u6307\u6570\uFF1A${sample.fish}%`);
1473
+ console.log(`\u2615 ${chalk.green.bold("\u6700\u5FEB\u4E50\u7684\u65E5\u5B50")}\uFF1A${names} | \u{1F41F} \u6478\u9C7C\u6307\u6570\uFF1A${sample.fish}%`);
1447
1474
  }
1448
1475
  }
1449
1476
  const weekendDays = activeDays.filter((d) => d.commitsCount > 0 && (d.dayName === "\u5468\u516D" || d.dayName === "\u5468\u65E5"));
@@ -1452,16 +1479,16 @@ async function runWeeklyReport(weeksAgo, source, showProjects = false) {
1452
1479
  const painfulDays = weekendDays.filter((d) => d.fish === minFish);
1453
1480
  const names = painfulDays.map((d) => d.dayName).join("\u3001");
1454
1481
  const sample = painfulDays[0];
1455
- console.log(`\u{1F62D} ${chalk2.magenta.bold("\u6700\u75DB\u82E6\u7684\u65E5\u5B50")}\uFF1A${names} | \u{1F4BC} \u52A0\u73ED\u6307\u6570\uFF1A${sample.fish}%`);
1482
+ console.log(`\u{1F62D} ${chalk.magenta.bold("\u6700\u75DB\u82E6\u7684\u65E5\u5B50")}\uFF1A${names} | \u{1F4BC} \u52A0\u73ED\u6307\u6570\uFF1A${sample.fish}%`);
1456
1483
  }
1457
- console.log(chalk2.gray("-".repeat(50)));
1484
+ console.log(chalk.gray("-".repeat(50)));
1458
1485
  const avgNightStr = stats.averageNightOwl > 0 ? ` | \u{1F319} \u4FEE\u4ED9: ${stats.averageNightOwl}%` : "";
1459
- console.log(chalk2.cyan.bold(`\u{1F4CA} \u672C\u5468\u5747\u503C\uFF1A\u{1F41F} \u6478\u9C7C\u6307\u6570 ${stats.averageFish}%${avgNightStr}`));
1460
- console.log(chalk2.gray("-".repeat(50)));
1461
- console.log(`\u{1F916} ${chalk2.magenta.bold("\u9510\u8BC4")}\uFF1A`);
1462
- console.log(chalk2.white(getAICritic(stats)));
1486
+ console.log(chalk.cyan.bold(`\u{1F4CA} \u672C\u5468\u5747\u503C\uFF1A\u{1F41F} \u6478\u9C7C\u6307\u6570 ${stats.averageFish}%${avgNightStr}`));
1487
+ console.log(chalk.gray("-".repeat(50)));
1488
+ console.log(`\u{1F916} ${chalk.magenta.bold("\u9510\u8BC4")}\uFF1A`);
1489
+ console.log(chalk.white(getAICritic(stats)));
1463
1490
  } else {
1464
- console.log(chalk2.yellow("\u{1F4A1} \u672C\u65F6\u95F4\u6BB5\u5185\u4F60\u8FD8\u6CA1\u63D0\u4EA4\u8FC7\u4EFB\u4F55\u4EE3\u7801\uFF01\u5B8C\u7F8E\u7684\u85AA\u6C34\u5C0F\u5077\u3002\u6216\u8005\u68C0\u67E5\u4F60\u7684\u914D\u7F6E\u5427\uFF01"));
1491
+ console.log(chalk.yellow("\u{1F4A1} \u672C\u65F6\u95F4\u6BB5\u5185\u4F60\u8FD8\u6CA1\u63D0\u4EA4\u8FC7\u4EFB\u4F55\u4EE3\u7801\uFF01\u5B8C\u7F8E\u7684\u85AA\u6C34\u5C0F\u5077\u3002\u6216\u8005\u68C0\u67E5\u4F60\u7684\u914D\u7F6E\u5427\uFF01"));
1465
1492
  }
1466
1493
  console.log("");
1467
1494
  }
@@ -1481,26 +1508,26 @@ async function runMonthlyReport(monthsAgo, source) {
1481
1508
  const stats = await analyzeMonthly(projects, targetDate, source);
1482
1509
  loading.stop();
1483
1510
  if (stats.totalCommits === 0) {
1484
- console.log(chalk2.yellow("\u{1F4A1} \u672C\u6708\u5728\u6B64\u4ED3\u5E93\u6682\u672A\u53D1\u73B0\u4EFB\u4F55 Git \u63D0\u4EA4\u6570\u636E\u3002\n"));
1511
+ console.log(chalk.yellow("\u{1F4A1} \u672C\u6708\u5728\u6B64\u4ED3\u5E93\u6682\u672A\u53D1\u73B0\u4EFB\u4F55 Git \u63D0\u4EA4\u6570\u636E\u3002\n"));
1485
1512
  return;
1486
1513
  }
1487
1514
  const { fix, feat, chore, other } = stats.categories;
1488
1515
  const total = fix + feat + chore + other;
1489
- console.log(chalk2.cyan.bold("\u{1F4C5} \u672C\u6708\u4E3B\u8981\u8D21\u732E\u5360\u6BD4 (\u57FA\u4E8E Commit Message \u6B63\u5219\u5F52\u7C7B)\uFF1A"));
1516
+ console.log(chalk.cyan.bold("\u{1F4C5} \u672C\u6708\u4E3B\u8981\u8D21\u732E\u5360\u6BD4 (\u57FA\u4E8E Commit Message \u6B63\u5219\u5F52\u7C7B)\uFF1A"));
1490
1517
  function drawRow(label, count, colorFn) {
1491
1518
  const percentage = total > 0 ? Math.round(count / total * 100) : 0;
1492
1519
  const barWidth = 15;
1493
1520
  const filled = Math.round(percentage / 100 * barWidth);
1494
1521
  const empty = barWidth - filled;
1495
- const barStr = colorFn("\u25A0".repeat(filled)) + chalk2.gray("\u25A1".repeat(empty));
1496
- console.log(` - ${label}\uFF1A[${barStr}] ${chalk2.bold(percentage + "%")} (${count} \u6B21)`);
1522
+ const barStr = colorFn("\u25A0".repeat(filled)) + chalk.gray("\u25A1".repeat(empty));
1523
+ console.log(` - ${label}\uFF1A[${barStr}] ${chalk.bold(percentage + "%")} (${count} \u6B21)`);
1497
1524
  }
1498
- drawRow("\u4FEE bug (fix) ", fix, chalk2.red);
1499
- drawRow("\u65B0\u529F\u80FD (feat) ", feat, chalk2.green);
1500
- drawRow("\u6742\u52A1\u4E0E\u6587\u6863 (chore) ", chore, chalk2.yellow);
1501
- drawRow("\u5176\u4ED6\u63D0\u4EA4 (other) ", other, chalk2.gray);
1525
+ drawRow("\u4FEE bug (fix) ", fix, chalk.red);
1526
+ drawRow("\u65B0\u529F\u80FD (feat) ", feat, chalk.green);
1527
+ drawRow("\u6742\u52A1\u4E0E\u6587\u6863 (chore) ", chore, chalk.yellow);
1528
+ drawRow("\u5176\u4ED6\u63D0\u4EA4 (other) ", other, chalk.gray);
1502
1529
  if (stats.dailyIndices && stats.dailyIndices.length > 0) {
1503
- console.log("\n" + chalk2.cyan.bold("\u{1F4C5} \u6BCF\u65E5\u6478\u9C7C\u6307\u6570\u6982\u89C8\uFF1A"));
1530
+ console.log("\n" + chalk.cyan.bold("\u{1F4C5} \u6BCF\u65E5\u6478\u9C7C\u6307\u6570\u6982\u89C8\uFF1A"));
1504
1531
  const monthLabel = `${targetDate.getMonth() + 1}\u6708`;
1505
1532
  const COL_WIDTH = 8;
1506
1533
  const weekHeaders = ["\u5468\u4E00", "\u5468\u4E8C", "\u5468\u4E09", "\u5468\u56DB", "\u5468\u4E94", "\u5468\u516D", "\u5468\u65E5"];
@@ -1509,7 +1536,7 @@ async function runMonthlyReport(monthsAgo, source) {
1509
1536
  const lines = [];
1510
1537
  let dateRow = "";
1511
1538
  let fishRow = "";
1512
- lines.push(chalk2.gray(weekHeaders.map((d) => visualPad(d, COL_WIDTH)).join("").trimEnd()));
1539
+ lines.push(chalk.gray(weekHeaders.map((d) => visualPad(d, COL_WIDTH)).join("").trimEnd()));
1513
1540
  for (let i = 0; i < firstDayOffset; i++) {
1514
1541
  dateRow += visualPad("", COL_WIDTH);
1515
1542
  fishRow += visualPad("", COL_WIDTH);
@@ -1518,10 +1545,23 @@ async function runMonthlyReport(monthsAgo, source) {
1518
1545
  const dateRaw = `${monthLabel}${d.day}\u65E5`;
1519
1546
  const fishRaw = `${d.fish}%`;
1520
1547
  const columnIndex = (firstDayOffset + d.day - 1) % 7;
1521
- dateRow += visualPad(dateRaw, COL_WIDTH);
1548
+ const dateObj = new Date(targetDate.getFullYear(), targetDate.getMonth(), d.day);
1549
+ let suffix = "";
1550
+ let suffixPlain = "";
1551
+ if (isHoliday(dateObj)) {
1552
+ suffix = chalk.green("\u2022");
1553
+ suffixPlain = "\u2022";
1554
+ } else if (isCompensatoryWorkday(dateObj)) {
1555
+ suffix = chalk.red("!");
1556
+ suffixPlain = "!";
1557
+ }
1558
+ const plainText = dateRaw + suffixPlain;
1559
+ const vw = visualWidth(plainText);
1560
+ const padding = vw < COL_WIDTH ? " ".repeat(COL_WIDTH - vw) : "";
1561
+ dateRow += dateRaw + suffix + padding;
1522
1562
  fishRow += visualPad(fishRaw, COL_WIDTH);
1523
1563
  if (columnIndex === 6 || d === stats.dailyIndices[stats.dailyIndices.length - 1]) {
1524
- lines.push(chalk2.gray(dateRow.trimEnd()));
1564
+ lines.push(chalk.gray(dateRow.trimEnd()));
1525
1565
  fishRow = colorizeFishRow(fishRow);
1526
1566
  lines.push(fishRow);
1527
1567
  lines.push("");
@@ -1533,23 +1573,43 @@ async function runMonthlyReport(monthsAgo, source) {
1533
1573
  for (const l of lines) {
1534
1574
  console.log(` ${l}`);
1535
1575
  }
1536
- const dailyWithCommits = stats.dailyIndices.filter((d) => d.commitsCount > 0);
1537
- if (dailyWithCommits.length > 0) {
1538
- const mostFish = [...dailyWithCommits].sort((a, b) => b.fish - a.fish)[0];
1539
- const mostWork = [...dailyWithCommits].sort((a, b) => a.fish - b.fish)[0];
1540
- if (mostFish.fish >= 75) {
1541
- console.log(chalk2.green(`
1542
- \u{1F3A3} \u6478\u9C7C\u738B: ${monthLabel}${mostFish.day}\u65E5 \u2192 \u6478\u9C7C\u6307\u6570 ${mostFish.fish}%` + (mostFish.tags.length > 0 ? ` ${mostFish.tags.join(" ")}` : "")));
1576
+ }
1577
+ let adjustedAvgFish;
1578
+ if (stats.dailyIndices && stats.dailyIndices.length > 0) {
1579
+ const activeDailyIndices = stats.dailyIndices.filter((d) => {
1580
+ const dateObj = new Date(targetDate.getFullYear(), targetDate.getMonth(), d.day);
1581
+ if (isRestDay(dateObj) && d.commitsCount === 0) return false;
1582
+ return true;
1583
+ });
1584
+ if (activeDailyIndices.length > 0) {
1585
+ const minFish = Math.min(...activeDailyIndices.map((d) => d.fish));
1586
+ const mostProductive = activeDailyIndices.filter((d) => d.fish === minFish);
1587
+ if (minFish <= 40 && mostProductive.length > 0) {
1588
+ const names = mostProductive.map((d) => `${d.day}\u65E5`).join("\u3001");
1589
+ const monthLabel = `${targetDate.getMonth() + 1}\u6708`;
1590
+ console.log(`
1591
+ \u{1F3C6} ${chalk.red.bold("\u7206\u809D\u738B")}\uFF1A${monthLabel}${names} | \u{1F41F} \u6478\u9C7C\u6307\u6570\uFF1A${minFish}%`);
1543
1592
  }
1544
- if (mostWork.fish <= 40) {
1545
- console.log(chalk2.red(`
1546
- \u{1F525} \u7206\u809D\u738B: ${monthLabel}${mostWork.day}\u65E5 \u2192 \u6478\u9C7C\u6307\u6570 ${mostWork.fish}%` + (mostWork.tags.length > 0 ? ` ${mostWork.tags.join(" ")}` : "")));
1593
+ const maxFish = Math.max(...activeDailyIndices.map((d) => d.fish));
1594
+ const mostSlacky = activeDailyIndices.filter((d) => d.fish === maxFish);
1595
+ const filteredSlacky = mostSlacky.filter(
1596
+ (d) => d.fish !== minFish || activeDailyIndices.length === 0
1597
+ );
1598
+ if (maxFish >= 70 && filteredSlacky.length > 0) {
1599
+ const names = filteredSlacky.map((d) => `${d.day}\u65E5`).join("\u3001");
1600
+ const monthLabel = `${targetDate.getMonth() + 1}\u6708`;
1601
+ console.log(`\u2615 ${chalk.green.bold("\u6478\u9C7C\u738B")}\uFF1A${monthLabel}${names} | \u{1F41F} \u6478\u9C7C\u6307\u6570\uFF1A${maxFish}%`);
1547
1602
  }
1603
+ adjustedAvgFish = Math.round(
1604
+ activeDailyIndices.reduce((sum, d) => sum + d.fish, 0) / activeDailyIndices.length
1605
+ );
1606
+ console.log("" + chalk.gray("-".repeat(50)));
1607
+ console.log(chalk.cyan.bold(`\u{1F4CA} \u672C\u6708\u5747\u503C\uFF1A\u{1F41F} \u6478\u9C7C\u6307\u6570 ${adjustedAvgFish}%`));
1548
1608
  }
1549
1609
  }
1550
- console.log("\n" + chalk2.gray("-".repeat(50)));
1551
- console.log(`\u{1F916} ${chalk2.magenta.bold("\u9510\u8BC4")}\uFF1A`);
1552
- console.log(chalk2.white(getAICriticForMonth(stats)));
1610
+ console.log(chalk.gray("-".repeat(50)));
1611
+ console.log(`\u{1F916} ${chalk.magenta.bold("\u9510\u8BC4")}\uFF1A`);
1612
+ console.log(chalk.white(getAICriticForMonth(stats, adjustedAvgFish)));
1553
1613
  console.log("");
1554
1614
  }
1555
1615
  async function runProjectReport(weeksAgo, source, isMonth = false) {
@@ -1570,10 +1630,10 @@ async function runProjectReport(weeksAgo, source, isMonth = false) {
1570
1630
  const loading = showLoading("\u6B63\u5728\u7EDF\u8BA1\u9879\u76EE\u7206\u809D\u7A0B\u5EA6...");
1571
1631
  const stats = isMonth ? await analyzeMonthly(projects, targetDate, source) : await analyzeWeekly(projects, targetDate, source);
1572
1632
  loading.stop();
1573
- console.log(chalk2.cyan.bold(`\u{1F4CA} \u5BF9\u5E94\u65F6\u6BB5\u9879\u76EE\u7206\u809D\u6392\u884C (${since.toLocaleDateString()} ~ ${until.toLocaleDateString()})`));
1633
+ console.log(chalk.cyan.bold(`\u{1F4CA} \u5BF9\u5E94\u65F6\u6BB5\u9879\u76EE\u7206\u809D\u6392\u884C (${since.toLocaleDateString()} ~ ${until.toLocaleDateString()})`));
1574
1634
  const ranked = stats.projectsRanked;
1575
1635
  if (ranked.length === 0) {
1576
- console.log(chalk2.gray(" \u672C\u65F6\u6BB5\u6682\u65E0\u9879\u76EE\u63D0\u4EA4\u6570\u636E\u3002"));
1636
+ console.log(chalk.gray(" \u672C\u65F6\u6BB5\u6682\u65E0\u9879\u76EE\u63D0\u4EA4\u6570\u636E\u3002"));
1577
1637
  } else {
1578
1638
  const totalCommits = ranked.reduce((sum, p) => sum + p.count, 0);
1579
1639
  let hasPrimaryProject = false;
@@ -1583,21 +1643,21 @@ async function runProjectReport(weeksAgo, source, isMonth = false) {
1583
1643
  let suffix;
1584
1644
  if (ratio >= 0.5 || N >= 30) {
1585
1645
  if (!hasPrimaryProject) {
1586
- suffix = chalk2.red(" (\u4E3B\u529B\u642C\u7816\u5730 \u{1F9F1})");
1646
+ suffix = chalk.red(" (\u4E3B\u529B\u642C\u7816\u5730 \u{1F9F1})");
1587
1647
  hasPrimaryProject = true;
1588
1648
  } else {
1589
- suffix = chalk2.red(" (\u9B42\u5F52\u4E4B\u5904\uFF0C\u4EE3\u7801\u5728\u8FD9\u5BB6\u5C31\u5728 \u{1F3E0})");
1649
+ suffix = chalk.red(" (\u9B42\u5F52\u4E4B\u5904\uFF0C\u4EE3\u7801\u5728\u8FD9\u5BB6\u5C31\u5728 \u{1F3E0})");
1590
1650
  }
1591
1651
  } else if (ratio >= 0.2 || N >= 14) {
1592
- suffix = chalk2.magenta(" (\u591A\u7EBF\u7A0B\u5206\u51FA\u6765\u7684\u6253\u5DE5\u9B42 \u{1F9F5})");
1652
+ suffix = chalk.magenta(" (\u591A\u7EBF\u7A0B\u5206\u51FA\u6765\u7684\u6253\u5DE5\u9B42 \u{1F9F5})");
1593
1653
  } else if (ratio >= 0.15 || N >= 5) {
1594
- suffix = chalk2.yellow(" (\u5076\u5C14\u4E0A\u53BB\u70B9\u4E00\u4E0B \u{1F41F})");
1654
+ suffix = chalk.yellow(" (\u5076\u5C14\u4E0A\u53BB\u70B9\u4E00\u4E0B \u{1F41F})");
1595
1655
  } else if (N === 1) {
1596
- suffix = chalk2.cyan(" (\u6D4B\u5B8C\u5C31\u8DD1\uFF0C\u7EAF\u7CB9\u8DEF\u8FC7 \u{1F6AC})");
1656
+ suffix = chalk.cyan(" (\u6D4B\u5B8C\u5C31\u8DD1\uFF0C\u7EAF\u7CB9\u8DEF\u8FC7 \u{1F6AC})");
1597
1657
  } else {
1598
- suffix = chalk2.gray(" (\u8FB9\u7F18\u6302\u673A\u9879\u76EE \u{1F4A4})");
1658
+ suffix = chalk.gray(" (\u8FB9\u7F18\u6302\u673A\u9879\u76EE \u{1F4A4})");
1599
1659
  }
1600
- console.log(` ${idx + 1}. ${chalk2.bold.white(proj.name)}: ${chalk2.cyan(N + " \u6B21\u63D0\u4EA4")}${suffix}`);
1660
+ console.log(` ${idx + 1}. ${chalk.bold.white(proj.name)}: ${chalk.cyan(N + " \u6B21\u63D0\u4EA4")}${suffix}`);
1601
1661
  });
1602
1662
  }
1603
1663
  console.log("");
@@ -1622,14 +1682,14 @@ async function runTimeReport(offset, source, isMonth) {
1622
1682
  loading.stop();
1623
1683
  const maxCount = Math.max(...hours.map((h) => h.count));
1624
1684
  const barScale = maxCount > 0 ? 30 / maxCount : 1;
1625
- console.log(chalk2.cyan.bold(`\u{1F552} \u5BF9\u5E94\u65F6\u6BB5 24 \u5C0F\u65F6 commit \u9891\u6B21\u5206\u5E03\u56FE\uFF1A`));
1685
+ console.log(chalk.cyan.bold(`\u{1F552} \u5BF9\u5E94\u65F6\u6BB5 24 \u5C0F\u65F6 commit \u9891\u6B21\u5206\u5E03\u56FE\uFF1A`));
1626
1686
  hours.forEach(({ hour, count }) => {
1627
1687
  const barLength = Math.round(count * barScale);
1628
1688
  const barStr = "\u2588".repeat(barLength);
1629
1689
  const hourStr = String(hour).padStart(2, "0") + ":00";
1630
1690
  let tag = count > 0 ? getHourTag(hour) : "";
1631
- const barColorStr = count > 0 ? chalk2.blue(barStr.padEnd(30, " ")) : chalk2.gray("".padEnd(30, " "));
1632
- console.log(` ${chalk2.bold.cyan(hourStr)} | [${barColorStr}] ${chalk2.white(count + " \u6B21")}${tag}`);
1691
+ const barColorStr = count > 0 ? chalk.blue(barStr.padEnd(30, " ")) : chalk.gray("".padEnd(30, " "));
1692
+ console.log(` ${chalk.bold.cyan(hourStr)} | [${barColorStr}] ${chalk.white(count + " \u6B21")}${tag}`);
1633
1693
  });
1634
1694
  console.log("");
1635
1695
  }
@@ -1646,19 +1706,19 @@ async function runGhostReport(weeksAgo, source) {
1646
1706
  const ghosts = await getGhostCommits(projects, since, until, source);
1647
1707
  loading.stop();
1648
1708
  if (ghosts.length === 0) {
1649
- console.log(chalk2.green.bold("\u{1F389} \u606D\u559C\uFF01\u672C\u65F6\u95F4\u6BB5\u5185\u672A\u68C0\u6D4B\u5230\u4EFB\u4F55\u6DF1\u591C\u5E7D\u7075\u63D0\u4EA4\u3002"));
1650
- console.log(chalk2.white("\u4F60\u7684\u53D1\u9645\u7EBF\u5341\u5206\u5B89\u5168\uFF0C\u5927\u798F\u62A5\u5DF2\u88AB\u65E0\u60C5\u62D2\u6536\uFF0C\u7761\u7720\u5065\u5EB7\u5F97\u5206\uFF1A100 \u5206\uFF01\n"));
1709
+ console.log(chalk.green.bold("\u{1F389} \u606D\u559C\uFF01\u672C\u65F6\u95F4\u6BB5\u5185\u672A\u68C0\u6D4B\u5230\u4EFB\u4F55\u6DF1\u591C\u5E7D\u7075\u63D0\u4EA4\u3002"));
1710
+ console.log(chalk.white("\u4F60\u7684\u53D1\u9645\u7EBF\u5341\u5206\u5B89\u5168\uFF0C\u5927\u798F\u62A5\u5DF2\u88AB\u65E0\u60C5\u62D2\u6536\uFF0C\u7761\u7720\u5065\u5EB7\u5F97\u5206\uFF1A100 \u5206\uFF01\n"));
1651
1711
  } else {
1652
- console.log(chalk2.red.bold(`\u26A0\uFE0F \u8B66\u544A\uFF1A\u672C\u65F6\u95F4\u6BB5\u5185\u5171\u68C0\u6D4B\u5230 ${ghosts.length} \u6B21\u6DF1\u591C\u5E7D\u7075\u63D0\u4EA4\uFF01`));
1653
- console.log(chalk2.gray("\u6DF1\u591C\u7684 Commit \u95EA\u70C1\u7740\u7EFF\u5149\uFF0C\u6BCF\u4E00\u884C\u90FD\u662F\u7ED9\u8001\u677F\u5E93\u91CC\u5357\u52A0\u6CB9\u7684\u6C57\u6C34\u3002"));
1654
- console.log(chalk2.gray("-".repeat(50)));
1712
+ console.log(chalk.red.bold(`\u26A0\uFE0F \u8B66\u544A\uFF1A\u672C\u65F6\u95F4\u6BB5\u5185\u5171\u68C0\u6D4B\u5230 ${ghosts.length} \u6B21\u6DF1\u591C\u5E7D\u7075\u63D0\u4EA4\uFF01`));
1713
+ console.log(chalk.gray("\u6DF1\u591C\u7684 Commit \u95EA\u70C1\u7740\u7EFF\u5149\uFF0C\u6BCF\u4E00\u884C\u90FD\u662F\u7ED9\u8001\u677F\u5E93\u91CC\u5357\u52A0\u6CB9\u7684\u6C57\u6C34\u3002"));
1714
+ console.log(chalk.gray("-".repeat(50)));
1655
1715
  ghosts.forEach((c) => {
1656
- console.log(` - [${chalk2.yellow(c.project)}] ${chalk2.cyan(c.date.slice(0, 19).replace("T", " "))} (${chalk2.gray(c.hash)})`);
1657
- console.log(` \u{1F4AC} ${chalk2.italic.white(c.message)}`);
1716
+ console.log(` - [${chalk.yellow(c.project)}] ${chalk.cyan(c.date.slice(0, 19).replace("T", " "))} (${chalk.gray(c.hash)})`);
1717
+ console.log(` \u{1F4AC} ${chalk.italic.white(c.message)}`);
1658
1718
  });
1659
- console.log(chalk2.gray("-".repeat(50)));
1660
- console.log(`\u{1F916} ${chalk2.magenta.bold("\u9510\u8BC4")}\uFF1A`);
1661
- console.log(chalk2.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"));
1719
+ console.log(chalk.gray("-".repeat(50)));
1720
+ console.log(`\u{1F916} ${chalk.magenta.bold("\u9510\u8BC4")}\uFF1A`);
1721
+ 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"));
1662
1722
  }
1663
1723
  }
1664
1724
  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("-P, --show-projects", "\u663E\u793A\u5177\u4F53\u9879\u76EE\u540D\u79F0\uFF08\u9ED8\u8BA4\u9690\u85CF\uFF09").option("-s, --source <source>", "\u9009\u62E9\u8981\u67E5\u8BE2\u7684 GitLab \u6570\u636E\u6E90 (\u5E8F\u53F7\u6216\u522B\u540D/host)").action(async (options) => {
@@ -1687,45 +1747,45 @@ var configCmd = program.command("config").description("\u7BA1\u7406\u76D1\u63A7\
1687
1747
  configCmd.command("add <path>").description("\u624B\u52A8\u6DFB\u52A0\u4E00\u4E2A\u672C\u5730 Git \u4ED3\u5E93\u8DEF\u5F84").action((projPath) => {
1688
1748
  const res = addProject(projPath);
1689
1749
  if (res.success) {
1690
- console.log(chalk2.green(`\u2714 ${res.message}`));
1750
+ console.log(chalk.green(`\u2714 ${res.message}`));
1691
1751
  } else {
1692
- console.log(chalk2.red(`\u2718 ${res.message}`));
1752
+ console.log(chalk.red(`\u2718 ${res.message}`));
1693
1753
  }
1694
1754
  });
1695
1755
  configCmd.command("remove <path>").description("\u4ECE\u914D\u7F6E\u4E2D\u79FB\u9664\u4E00\u4E2A\u9879\u76EE\u8DEF\u5F84").action((projPath) => {
1696
1756
  const res = removeProject(projPath);
1697
1757
  if (res.success) {
1698
- console.log(chalk2.green(`\u2714 ${res.message}`));
1758
+ console.log(chalk.green(`\u2714 ${res.message}`));
1699
1759
  } else {
1700
- console.log(chalk2.red(`\u2718 ${res.message}`));
1760
+ console.log(chalk.red(`\u2718 ${res.message}`));
1701
1761
  }
1702
1762
  });
1703
1763
  configCmd.command("list").description("\u5217\u51FA\u5F53\u524D\u6240\u6709\u76D1\u63A7\u7684\u9879\u76EE\u4E0E GitLab \u914D\u7F6E").action(() => {
1704
1764
  const config = readConfig();
1705
- console.log(chalk2.cyan.bold("\n\u{1F4C1} \u5F53\u524D\u76D1\u63A7\u7684\u672C\u5730\u9879\u76EE\u5217\u8868:"));
1765
+ console.log(chalk.cyan.bold("\n\u{1F4C1} \u5F53\u524D\u76D1\u63A7\u7684\u672C\u5730\u9879\u76EE\u5217\u8868:"));
1706
1766
  if (config.projects.length === 0) {
1707
- console.log(chalk2.gray(` (\u76EE\u524D\u672A\u914D\u7F6E\u672C\u5730\u9879\u76EE\uFF0C\u82E5\u65E0 GitLab \u8FDC\u7A0B\u5219\u9ED8\u8BA4\u626B\u63CF\u5F53\u524D\u76EE\u5F55: ${process.cwd()})`));
1767
+ console.log(chalk.gray(` (\u76EE\u524D\u672A\u914D\u7F6E\u672C\u5730\u9879\u76EE\uFF0C\u82E5\u65E0 GitLab \u8FDC\u7A0B\u5219\u9ED8\u8BA4\u626B\u63CF\u5F53\u524D\u76EE\u5F55: ${process.cwd()})`));
1708
1768
  } else {
1709
1769
  config.projects.forEach((p, idx) => {
1710
- console.log(` ${idx + 1}. ${chalk2.white(p)}`);
1770
+ console.log(` ${idx + 1}. ${chalk.white(p)}`);
1711
1771
  });
1712
1772
  }
1713
- console.log(chalk2.cyan.bold("\n\u{1F98A} \u5F53\u524D\u914D\u7F6E\u7684 GitLab \u8FDC\u7A0B\u6E90:"));
1773
+ console.log(chalk.cyan.bold("\n\u{1F98A} \u5F53\u524D\u914D\u7F6E\u7684 GitLab \u8FDC\u7A0B\u6E90:"));
1714
1774
  const gitlabs = config.gitlabs || [];
1715
1775
  if (gitlabs.length === 0) {
1716
- console.log(chalk2.gray(" (\u5C1A\u672A\u914D\u7F6E\u4EFB\u4F55 GitLab \u8FDC\u7A0B\u6E90)"));
1776
+ console.log(chalk.gray(" (\u5C1A\u672A\u914D\u7F6E\u4EFB\u4F55 GitLab \u8FDC\u7A0B\u6E90)"));
1717
1777
  } else {
1718
1778
  gitlabs.forEach((g, idx) => {
1719
- console.log(` ${idx + 1}. ${chalk2.bold.white(g.name)} | Host: ${chalk2.gray(g.host)}`);
1779
+ console.log(` ${idx + 1}. ${chalk.bold.white(g.name)} | Host: ${chalk.gray(g.host)}`);
1720
1780
  });
1721
1781
  }
1722
1782
  console.log("");
1723
1783
  });
1724
1784
  configCmd.command("scan <dir>").description("\u81EA\u52A8\u626B\u63CF\u6307\u5B9A\u76EE\u5F55\u4E0B\u7684\u6240\u6709 Git \u4ED3\u5E93\u5E76\u6279\u91CF\u6DFB\u52A0").action((dir) => {
1725
- console.log(chalk2.cyan(`\u{1F50D} \u6B63\u5728\u626B\u63CF\u76EE\u5F55 ${dir} \u4E0B of Git \u4ED3\u5E93...`));
1785
+ console.log(chalk.cyan(`\u{1F50D} \u6B63\u5728\u626B\u63CF\u76EE\u5F55 ${dir} \u4E0B of Git \u4ED3\u5E93...`));
1726
1786
  const repos = scanDirectory(dir);
1727
1787
  if (repos.length === 0) {
1728
- console.log(chalk2.yellow(`\u26A0 \u672A\u5728 ${dir} \u4E0B\u53D1\u73B0\u4EFB\u4F55 Git \u4ED3\u5E93\u3002`));
1788
+ console.log(chalk.yellow(`\u26A0 \u672A\u5728 ${dir} \u4E0B\u53D1\u73B0\u4EFB\u4F55 Git \u4ED3\u5E93\u3002`));
1729
1789
  return;
1730
1790
  }
1731
1791
  const config = readConfig();
@@ -1738,26 +1798,26 @@ configCmd.command("scan <dir>").description("\u81EA\u52A8\u626B\u63CF\u6307\u5B9
1738
1798
  }
1739
1799
  if (addedCount > 0) {
1740
1800
  writeConfig(config);
1741
- console.log(chalk2.green(`\u2714 \u6210\u529F\u53D1\u73B0\u5E76\u6DFB\u52A0\u4E86 ${addedCount} \u4E2A\u65B0 Git \u4ED3\u5E93\uFF1A`));
1742
- repos.forEach((r) => console.log(` - ${chalk2.gray(r)}`));
1801
+ console.log(chalk.green(`\u2714 \u6210\u529F\u53D1\u73B0\u5E76\u6DFB\u52A0\u4E86 ${addedCount} \u4E2A\u65B0 Git \u4ED3\u5E93\uFF1A`));
1802
+ repos.forEach((r) => console.log(` - ${chalk.gray(r)}`));
1743
1803
  } else {
1744
- console.log(chalk2.yellow(`\u26A0 \u626B\u63CF\u5230\u4E86 ${repos.length} \u4E2A\u4ED3\u5E93\uFF0C\u4F46\u90FD\u5DF2\u5728\u76D1\u63A7\u914D\u7F6E\u4E2D\u3002`));
1804
+ console.log(chalk.yellow(`\u26A0 \u626B\u63CF\u5230\u4E86 ${repos.length} \u4E2A\u4ED3\u5E93\uFF0C\u4F46\u90FD\u5DF2\u5728\u76D1\u63A7\u914D\u7F6E\u4E2D\u3002`));
1745
1805
  }
1746
1806
  });
1747
1807
  configCmd.command("gitlab <token> [host] [name]").description("\u914D\u7F6E GitLab \u4E2A\u4EBA\u8BBF\u95EE\u4EE4\u724C(PAT)\u3001Host \u4E0E\u522B\u540D\uFF0C\u5F00\u542F GitLab \u8FDC\u7A0B\u626B\u63CF").action((token, host, name) => {
1748
1808
  setGitLabConfig(token, host, name);
1749
- console.log(chalk2.green(`\u2714 \u5DF2\u6210\u529F\u914D\u7F6E\u5E76\u4FDD\u5B58 GitLab \u8BBF\u95EE\u6E90\u3002`));
1809
+ console.log(chalk.green(`\u2714 \u5DF2\u6210\u529F\u914D\u7F6E\u5E76\u4FDD\u5B58 GitLab \u8BBF\u95EE\u6E90\u3002`));
1750
1810
  const targetHost = host || "https://gitlab.com";
1751
1811
  const targetName = name || targetHost.replace(/^https?:\/\//, "").replace(/\/$/, "");
1752
- console.log(chalk2.gray(`\u522B\u540D (Name): ${targetName}`));
1753
- console.log(chalk2.gray(`\u5730\u5740 (Host): ${targetHost}`));
1812
+ console.log(chalk.gray(`\u522B\u540D (Name): ${targetName}`));
1813
+ console.log(chalk.gray(`\u5730\u5740 (Host): ${targetHost}`));
1754
1814
  });
1755
1815
  configCmd.command("gitlab-clear [name_or_index]").description("\u6E05\u9664\u6307\u5B9A\u6216\u6240\u6709\u7684 GitLab \u8FDC\u7A0B\u626B\u63CF\u914D\u7F6E").action((nameOrIndex) => {
1756
1816
  clearGitLabConfig(nameOrIndex);
1757
1817
  if (nameOrIndex) {
1758
- console.log(chalk2.green(`\u2714 \u5DF2\u6E05\u9664\u6307\u5B9A\u7684 GitLab \u8BBF\u95EE\u914D\u7F6E [${nameOrIndex}]\u3002`));
1818
+ console.log(chalk.green(`\u2714 \u5DF2\u6E05\u9664\u6307\u5B9A\u7684 GitLab \u8BBF\u95EE\u914D\u7F6E [${nameOrIndex}]\u3002`));
1759
1819
  } else {
1760
- console.log(chalk2.green(`\u2714 \u5DF2\u6E05\u9664\u6240\u6709 GitLab \u8BBF\u95EE\u914D\u7F6E\u3002\u5DF2\u5173\u95ED GitLab \u8FDC\u7A0B\u626B\u63CF\u3002`));
1820
+ console.log(chalk.green(`\u2714 \u5DF2\u6E05\u9664\u6240\u6709 GitLab \u8BBF\u95EE\u914D\u7F6E\u3002\u5DF2\u5173\u95ED GitLab \u8FDC\u7A0B\u626B\u63CF\u3002`));
1761
1821
  }
1762
1822
  });
1763
1823
  program.parse(process.argv);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "git-fish-log",
3
- "version": "1.0.8",
3
+ "version": "1.0.10",
4
4
  "description": "🐟 Git 摸鱼 & 爆肝分析器 CLI — 给你的提交记录生成摸鱼指数和锐评",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",