git-fish-log 1.0.8 → 1.0.9

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,10 @@ npm link
48
48
  * `host`: 可选。私有部署的 GitLab 域名(如 `https://gitlab.mycompany.com`),缺省默认使用 `https://gitlab.com`。
49
49
  * `name`: 可选。给该数据源指定的别名(如 `my-company`),缺省时自动使用 host 域名作为别名。若别名已存在则会覆盖更新。
50
50
 
51
+ ## 🆕 v1.0.9 更新内容
52
+
53
+ - **月报新增节假日与调休标记**:每日摸鱼指数概览中,法定节假日日期后追加绿色圆点 `•`,法定调休上班日(周末补班)追加红色叹号 `!`,一眼分辨哪天是假日、哪天在还债。内置 2025-2026 年中国法定节假日数据,周末自动识别。
54
+
51
55
  ## 🆕 v1.0.8 更新内容
52
56
 
53
57
  - **摸鱼指数算法 v2 重设计**:引入「有效 Commit」概念(单次增删 ≥ 20 行),天然过滤格式化/小修复;代码行数改用 log₁₀ 压缩并降权至 10%,工作时长+时间分布合计占 50% 权重,摸鱼/爆肝判断更贴合直觉。详情见下方「算法说明」章节。
@@ -106,22 +110,17 @@ fish -m
106
110
 
107
111
  📅 每日摸鱼指数概览:
108
112
  周一 周二 周三 周四 周五 周六 周日
109
- 5月1日 5月2日 5月3日
110
- 90% 90% 90%
111
-
112
- 5月4日 5月5日 5月6日 5月7日 5月8日 5月9日 5月10日
113
- 90% 90% 28% 90% 23% 19% 90%
114
-
115
- 5月11日 5月12日 5月13日 5月14日 5月15日 5月16日 5月17日
116
- 61% 39% 23% 90% 90% 90% 90%
113
+ 6月1日 6月2日 6月3日 6月4日 6月5日 6月6日 6月7日
114
+ 67% 50% 48% 76% 95% 95% 95%
117
115
 
118
- 518 519 520521522523524
119
- 39% 43% 38% 28% 25% 90% 90%
116
+ 68 69 610611612613614
117
+ 78% 78% 38% 47% 38% 95% 95%
120
118
 
121
- 525526527528529日 530日 531日
122
- 61% 28% 35% 34% 20% 90% 90%
119
+ 615616617618619日•620日•621日•
120
+ 57% 77% 42% 64% 95% 95% 95%
123
121
 
124
- 🔥 爆肝王: 59 摸鱼指数 19% 🔥 爆肝战神 🧱 勤恳搬砖人
122
+ 6月22日 6月23日 6246月25日 6月26日 6月27日 6月28日
123
+ 95% 51% 95% 95% 78% 95% 95%
125
124
 
126
125
  --------------------------------------------------
127
126
  🤖 锐评:
package/README.md CHANGED
@@ -33,6 +33,9 @@
33
33
  * `host`: 可选。私有部署的 GitLab 域名(如 `https://gitlab.mycompany.com`),缺省默认使用 `https://gitlab.com`。
34
34
  * `name`: 可选。给该数据源指定的别名(如 `my-company`),缺省时自动使用 host 域名作为别名。若别名已存在则会覆盖更新。
35
35
 
36
+ ## 🆕 v1.0.9 更新内容
37
+
38
+ - **月报新增节假日与调休标记**:每日摸鱼指数概览中,法定节假日日期后追加绿色圆点 `•`,法定调休上班日(周末补班)追加红色叹号 `!`,一眼分辨哪天是假日、哪天在还债。内置 2025-2026 年中国法定节假日数据,周末自动识别。
36
39
 
37
40
  ## 🆕 v1.0.8 更新内容
38
41
 
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
 
@@ -848,88 +848,59 @@ async function getGhostCommits(projectPaths, since, until, source) {
848
848
  }
849
849
 
850
850
  // src/critic.ts
851
- import chalk from "chalk";
852
851
  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"
852
+ "\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",
853
+ "Commit \u5217\u8868\u6E05\u723D\u5F97\u50CF\u521A\u683C\u5F0F\u5316\u8FC7\u7684\u786C\u76D8\u3002",
854
+ "\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",
855
+ "\u63D0\u4EA4\u9891\u7387\u5E73\u7F13\u5982\u5FC3\u7535\u56FE\uFF0C\u7A33\u5B9A\uFF0C\u5C31\u662F\u6709\u70B9\u592A\u5E73\u4E86\u3002",
856
+ "\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",
857
+ "\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",
858
+ "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
859
  ];
861
860
  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"
861
+ "\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",
862
+ "\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",
863
+ "\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",
864
+ "\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",
865
+ "\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",
866
+ "\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
867
  ];
870
868
  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"
869
+ "\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",
870
+ "\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",
871
+ "\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",
872
+ "\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",
873
+ "\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",
874
+ "\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",
875
+ "\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
876
  ];
906
877
  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"
878
+ "\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",
879
+ "\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",
880
+ "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",
881
+ "\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",
882
+ "\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",
883
+ "\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",
884
+ "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
885
  ];
915
886
  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",
887
+ "\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",
888
+ "\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",
889
+ "\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
890
  "\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"
891
+ "\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
892
  ];
922
893
  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",
894
+ "\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
895
  "\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",
896
+ "\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
897
  "\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
898
  "\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
899
  ];
929
900
  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",
901
+ "\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",
902
+ "\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",
903
+ "\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
904
  "\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
905
  "\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
906
  ];
@@ -941,86 +912,57 @@ var TAG_BUILDER_CRITIQUES = [
941
912
  "\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
913
  ];
943
914
  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",
915
+ "\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",
916
+ "\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
917
  "\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",
918
+ "\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
919
  "\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
920
  ];
950
921
  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"
922
+ "\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",
923
+ "\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",
924
+ "\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",
925
+ "\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",
926
+ "\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
927
  ];
957
928
  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",
929
+ "\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",
930
+ "\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",
931
+ "\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
932
  "\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
933
  "\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
934
  ];
964
935
  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",
936
+ "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",
937
+ "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
938
  "\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
939
  "\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
940
  "\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
941
  ];
971
942
  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",
943
+ "\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",
944
+ "\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
945
  "\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"
946
+ "\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",
947
+ "\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
948
  ];
978
949
  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",
950
+ "\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
951
  "\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",
952
+ "\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",
953
+ "\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
954
  "\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
955
  ];
985
956
  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",
957
+ "\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",
958
+ "\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
959
  "\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
960
  "\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"
961
+ "\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
962
  ];
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
963
  function getRandomItem(arr) {
1022
964
  const idx = Math.floor(Math.random() * arr.length);
1023
- return colorizeCriticTags(arr[idx]);
965
+ return arr[idx];
1024
966
  }
1025
967
  function getAICritic(weeklyStats) {
1026
968
  const parts = [];
@@ -1049,20 +991,6 @@ function getAICriticForMonth(monthlyStats) {
1049
991
  if (monthlyStats.ghostCommitsCount > 3) {
1050
992
  parts.push(getRandomItem(GHOST_CRITIQUES));
1051
993
  }
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
- }
1066
994
  if (monthlyStats.totalCommits === 0) {
1067
995
  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
996
  } else if (monthlyStats.averageFish >= 70) {
@@ -1113,6 +1041,96 @@ function getTagCriticsFromDays(days) {
1113
1041
  return critics;
1114
1042
  }
1115
1043
 
1044
+ // src/holiday.ts
1045
+ var holiday_in_law = {
1046
+ "2025-01-01": { "type": "holiday", "name": "\u5143\u65E6" },
1047
+ "2025-01-26": { "type": "workday", "name": "\u6625\u8282\u8C03\u4F11\u73ED" },
1048
+ "2025-01-28": { "type": "holiday", "name": "\u6625\u8282" },
1049
+ "2025-01-29": { "type": "holiday", "name": "\u6625\u8282" },
1050
+ "2025-01-30": { "type": "holiday", "name": "\u6625\u8282" },
1051
+ "2025-01-31": { "type": "holiday", "name": "\u6625\u8282" },
1052
+ "2025-02-01": { "type": "holiday", "name": "\u6625\u8282" },
1053
+ "2025-02-02": { "type": "holiday", "name": "\u6625\u8282" },
1054
+ "2025-02-03": { "type": "holiday", "name": "\u6625\u8282" },
1055
+ "2025-02-04": { "type": "holiday", "name": "\u6625\u8282" },
1056
+ "2025-02-08": { "type": "workday", "name": "\u6625\u8282\u8C03\u4F11\u73ED" },
1057
+ "2025-04-04": { "type": "holiday", "name": "\u6E05\u660E\u8282" },
1058
+ "2025-04-05": { "type": "holiday", "name": "\u6E05\u660E\u8282" },
1059
+ "2025-04-06": { "type": "holiday", "name": "\u6E05\u660E\u8282" },
1060
+ "2025-04-27": { "type": "workday", "name": "\u52B3\u52A8\u8282\u8C03\u4F11\u73ED" },
1061
+ "2025-05-01": { "type": "holiday", "name": "\u52B3\u52A8\u8282" },
1062
+ "2025-05-02": { "type": "holiday", "name": "\u52B3\u52A8\u8282" },
1063
+ "2025-05-03": { "type": "holiday", "name": "\u52B3\u52A8\u8282" },
1064
+ "2025-05-04": { "type": "holiday", "name": "\u52B3\u52A8\u8282" },
1065
+ "2025-05-05": { "type": "holiday", "name": "\u52B3\u52A8\u8282" },
1066
+ "2025-05-31": { "type": "holiday", "name": "\u7AEF\u5348\u8282" },
1067
+ "2025-06-01": { "type": "holiday", "name": "\u7AEF\u5348\u8282" },
1068
+ "2025-06-02": { "type": "holiday", "name": "\u7AEF\u5348\u8282" },
1069
+ "2025-09-28": { "type": "workday", "name": "\u56FD\u5E86\u8282\u8C03\u4F11\u73ED" },
1070
+ "2025-10-01": { "type": "holiday", "name": "\u56FD\u5E86\u8282" },
1071
+ "2025-10-02": { "type": "holiday", "name": "\u56FD\u5E86\u8282" },
1072
+ "2025-10-03": { "type": "holiday", "name": "\u56FD\u5E86\u8282" },
1073
+ "2025-10-04": { "type": "holiday", "name": "\u56FD\u5E86\u8282" },
1074
+ "2025-10-05": { "type": "holiday", "name": "\u56FD\u5E86\u8282" },
1075
+ "2025-10-06": { "type": "holiday", "name": "\u4E2D\u79CB\u8282" },
1076
+ "2025-10-07": { "type": "holiday", "name": "\u56FD\u5E86\u8282" },
1077
+ "2025-10-08": { "type": "holiday", "name": "\u56FD\u5E86\u8282" },
1078
+ "2025-10-11": { "type": "workday", "name": "\u56FD\u5E86\u8282\u8C03\u4F11\u73ED" },
1079
+ "2026-01-01": { "type": "holiday", "name": "\u5143\u65E6" },
1080
+ "2026-01-02": { "type": "holiday", "name": "\u5143\u65E6" },
1081
+ "2026-01-03": { "type": "holiday", "name": "\u5143\u65E6" },
1082
+ "2026-01-04": { "type": "workday", "name": "\u5143\u65E6\u8C03\u4F11\u73ED" },
1083
+ "2026-02-14": { "type": "workday", "name": "\u6625\u8282\u8C03\u4F11\u73ED" },
1084
+ "2026-02-15": { "type": "holiday", "name": "\u6625\u8282" },
1085
+ "2026-02-16": { "type": "holiday", "name": "\u6625\u8282" },
1086
+ "2026-02-17": { "type": "holiday", "name": "\u6625\u8282" },
1087
+ "2026-02-18": { "type": "holiday", "name": "\u6625\u8282" },
1088
+ "2026-02-19": { "type": "holiday", "name": "\u6625\u8282" },
1089
+ "2026-02-20": { "type": "holiday", "name": "\u6625\u8282" },
1090
+ "2026-02-21": { "type": "holiday", "name": "\u6625\u8282" },
1091
+ "2026-02-22": { "type": "holiday", "name": "\u6625\u8282" },
1092
+ "2026-02-23": { "type": "holiday", "name": "\u6625\u8282" },
1093
+ "2026-02-28": { "type": "workday", "name": "\u6625\u8282\u8C03\u4F11\u73ED" },
1094
+ "2026-04-04": { "type": "holiday", "name": "\u6E05\u660E\u8282" },
1095
+ "2026-04-05": { "type": "holiday", "name": "\u6E05\u660E\u8282" },
1096
+ "2026-04-06": { "type": "holiday", "name": "\u6E05\u660E\u8282" },
1097
+ "2026-05-01": { "type": "holiday", "name": "\u52B3\u52A8\u8282" },
1098
+ "2026-05-02": { "type": "holiday", "name": "\u52B3\u52A8\u8282" },
1099
+ "2026-05-03": { "type": "holiday", "name": "\u52B3\u52A8\u8282" },
1100
+ "2026-05-04": { "type": "holiday", "name": "\u52B3\u52A8\u8282" },
1101
+ "2026-05-05": { "type": "holiday", "name": "\u52B3\u52A8\u8282" },
1102
+ "2026-05-09": { "type": "workday", "name": "\u52B3\u52A8\u8282\u8C03\u4F11\u73ED" },
1103
+ "2026-06-19": { "type": "holiday", "name": "\u7AEF\u5348\u8282" },
1104
+ "2026-06-20": { "type": "holiday", "name": "\u7AEF\u5348\u8282" },
1105
+ "2026-06-21": { "type": "holiday", "name": "\u7AEF\u5348\u8282" },
1106
+ "2026-09-20": { "type": "workday", "name": "\u56FD\u5E86\u8282\u8C03\u4F11\u73ED" },
1107
+ "2026-09-25": { "type": "holiday", "name": "\u4E2D\u79CB\u8282" },
1108
+ "2026-09-26": { "type": "holiday", "name": "\u4E2D\u79CB\u8282" },
1109
+ "2026-09-27": { "type": "holiday", "name": "\u4E2D\u79CB\u8282" },
1110
+ "2026-10-01": { "type": "holiday", "name": "\u56FD\u5E86\u8282" },
1111
+ "2026-10-02": { "type": "holiday", "name": "\u56FD\u5E86\u8282" },
1112
+ "2026-10-03": { "type": "holiday", "name": "\u56FD\u5E86\u8282" },
1113
+ "2026-10-04": { "type": "holiday", "name": "\u56FD\u5E86\u8282" },
1114
+ "2026-10-05": { "type": "holiday", "name": "\u56FD\u5E86\u8282" },
1115
+ "2026-10-06": { "type": "holiday", "name": "\u56FD\u5E86\u8282" },
1116
+ "2026-10-07": { "type": "holiday", "name": "\u56FD\u5E86\u8282" },
1117
+ "2026-10-10": { "type": "workday", "name": "\u56FD\u5E86\u8282\u8C03\u4F11\u73ED" }
1118
+ };
1119
+ function formatDateKey(date) {
1120
+ const y = date.getFullYear();
1121
+ const m = String(date.getMonth() + 1).padStart(2, "0");
1122
+ const d = String(date.getDate()).padStart(2, "0");
1123
+ return `${y}-${m}-${d}`;
1124
+ }
1125
+ function isHoliday(date) {
1126
+ const key = formatDateKey(date);
1127
+ return holiday_in_law[key]?.type === "holiday";
1128
+ }
1129
+ function isCompensatoryWorkday(date) {
1130
+ const key = formatDateKey(date);
1131
+ return holiday_in_law[key]?.type === "workday";
1132
+ }
1133
+
1116
1134
  // src/index.ts
1117
1135
  var program = new Command();
1118
1136
  function getCliVersion() {
@@ -1130,7 +1148,7 @@ function showLoading(message) {
1130
1148
  let frameIdx = 0;
1131
1149
  process.stdout.write("\x1B[?25l");
1132
1150
  const timer = setInterval(() => {
1133
- process.stdout.write(`\r${chalk2.cyan(SPINNER_FRAMES[frameIdx])} ${chalk2.yellow(message)} `);
1151
+ process.stdout.write(`\r${chalk.cyan(SPINNER_FRAMES[frameIdx])} ${chalk.yellow(message)} `);
1134
1152
  frameIdx = (frameIdx + 1) % SPINNER_FRAMES.length;
1135
1153
  }, 150);
1136
1154
  return {
@@ -1145,57 +1163,57 @@ function showLoading(message) {
1145
1163
  };
1146
1164
  }
1147
1165
  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"));
1166
+ console.log(chalk.cyan.bold("\n" + "=".repeat(50)));
1167
+ console.log(chalk.blue.bold(` \u{1F41F} FISH - ${title}`));
1168
+ console.log(chalk.cyan.bold("=".repeat(50) + "\n"));
1151
1169
  }
1152
1170
  function formatSlackIndex(fish) {
1153
1171
  if (fish >= 90) {
1154
- return chalk2.green(`${fish}% (\u7EC8\u6781\u6478\u9C7C \u{1F3A3})`);
1172
+ return chalk.green(`${fish}% (\u7EC8\u6781\u6478\u9C7C \u{1F3A3})`);
1155
1173
  } else if (fish >= 70) {
1156
- return chalk2.green(`${fish}% (\u5408\u7406\u5212\u6C34 \u2615)`);
1174
+ return chalk.green(`${fish}% (\u5408\u7406\u5212\u6C34 \u2615)`);
1157
1175
  } else if (fish >= 40) {
1158
- return chalk2.yellow(`${fish}% (\u6B63\u5E38\u8425\u4E1A \u{1F4BB})`);
1176
+ return chalk.yellow(`${fish}% (\u6B63\u5E38\u8425\u4E1A \u{1F4BB})`);
1159
1177
  } else {
1160
- return chalk2.red(`${fish}% (\u706B\u529B\u5168\u5F00 \u{1F525})`);
1178
+ return chalk.red(`${fish}% (\u706B\u529B\u5168\u5F00 \u{1F525})`);
1161
1179
  }
1162
1180
  }
1163
1181
  function formatNightOwlIndex(nightOwl) {
1164
1182
  if (nightOwl >= 60) {
1165
- return chalk2.red.bold(`${nightOwl}% (\u4FEE\u4ED9\u5927\u4F6C \u{1F9D9})`);
1183
+ return chalk.red.bold(`${nightOwl}% (\u4FEE\u4ED9\u5927\u4F6C \u{1F9D9})`);
1166
1184
  } else if (nightOwl >= 30) {
1167
- return chalk2.red(`${nightOwl}% (\u591C\u732B\u51FA\u6CA1 \u{1F989})`);
1185
+ return chalk.red(`${nightOwl}% (\u591C\u732B\u51FA\u6CA1 \u{1F989})`);
1168
1186
  } else if (nightOwl >= 10) {
1169
- return chalk2.yellow(`${nightOwl}% (\u5076\u5C14\u71AC\u591C \u{1F319})`);
1187
+ return chalk.yellow(`${nightOwl}% (\u5076\u5C14\u71AC\u591C \u{1F319})`);
1170
1188
  } else {
1171
1189
  return "";
1172
1190
  }
1173
1191
  }
1174
1192
  function formatOvertimeIndex(fish) {
1175
1193
  if (fish >= 80) {
1176
- return chalk2.green(`${fish}% (\u5468\u672B\u6478\u9C7C \u{1F3A3})`);
1194
+ return chalk.green(`${fish}% (\u5468\u672B\u6478\u9C7C \u{1F3A3})`);
1177
1195
  } else if (fish >= 50) {
1178
- return chalk2.yellow(`${fish}% (\u8F7B\u5FAE\u52A0\u73ED \u{1F319})`);
1196
+ return chalk.yellow(`${fish}% (\u8F7B\u5FAE\u52A0\u73ED \u{1F319})`);
1179
1197
  } else if (fish >= 20) {
1180
- return chalk2.red(`${fish}% (\u5468\u672B\u7206\u809D \u{1F525})`);
1198
+ return chalk.red(`${fish}% (\u5468\u672B\u7206\u809D \u{1F525})`);
1181
1199
  } else {
1182
- return chalk2.red.bold(`${fish}% (\u7EC8\u6781\u7206\u809D \u2620\uFE0F)`);
1200
+ return chalk.red.bold(`${fish}% (\u7EC8\u6781\u7206\u809D \u2620\uFE0F)`);
1183
1201
  }
1184
1202
  }
1185
1203
  function formatCodeVolume(totalLines) {
1186
1204
  if (totalLines <= 0) return "";
1187
1205
  if (totalLines >= 1e3) {
1188
- return chalk2.red.bold(`${totalLines}\u884C (\u4EE3\u7801\u6838\u7206 \u2622\uFE0F)`);
1206
+ return chalk.red.bold(`${totalLines}\u884C (\u4EE3\u7801\u6838\u7206 \u2622\uFE0F)`);
1189
1207
  } else if (totalLines >= 500) {
1190
- return chalk2.magenta(`${totalLines}\u884C (\u642C\u7816\u72C2\u9B54 \u{1F69A})`);
1208
+ return chalk.magenta(`${totalLines}\u884C (\u642C\u7816\u72C2\u9B54 \u{1F69A})`);
1191
1209
  } else if (totalLines >= 200) {
1192
- return chalk2.yellow(`${totalLines}\u884C (\u5927\u578B\u6539\u52A8 \u{1F9F1})`);
1210
+ return chalk.yellow(`${totalLines}\u884C (\u5927\u578B\u6539\u52A8 \u{1F9F1})`);
1193
1211
  } else if (totalLines >= 80) {
1194
- return chalk2.cyan(`${totalLines}\u884C (\u6B63\u5E38\u8425\u4E1A \u{1F4E6})`);
1212
+ return chalk.cyan(`${totalLines}\u884C (\u6B63\u5E38\u8425\u4E1A \u{1F4E6})`);
1195
1213
  } else if (totalLines >= 20) {
1196
- return chalk2.green(`${totalLines}\u884C (\u7F1D\u7F1D\u8865\u8865 \u{1F527})`);
1214
+ return chalk.green(`${totalLines}\u884C (\u7F1D\u7F1D\u8865\u8865 \u{1F527})`);
1197
1215
  } else {
1198
- return chalk2.gray(`${totalLines}\u884C (\u5C0F\u4FEE\u5C0F\u8865 \u270F\uFE0F)`);
1216
+ return chalk.gray(`${totalLines}\u884C (\u5C0F\u4FEE\u5C0F\u8865 \u270F\uFE0F)`);
1199
1217
  }
1200
1218
  }
1201
1219
  function getPersonalityTag(day) {
@@ -1203,18 +1221,18 @@ function getPersonalityTag(day) {
1203
1221
  }
1204
1222
  function colorizeTags(tagStr) {
1205
1223
  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
1224
+ "\u{1F41F} \u6478\u9C7C\u5B97\u5E08": chalk.green,
1225
+ "\u{1F525} \u7206\u809D\u6218\u795E": chalk.red.bold,
1226
+ "\u{1F319} \u6DF1\u591C\u4FEE\u4ED9\u8005": chalk.red,
1227
+ "\u{1F9F1} \u52E4\u6073\u642C\u7816\u4EBA": chalk.yellow,
1228
+ "\u{1F4A5} \u4E00\u628A\u68AD\u54C8\u578B\u7A0B\u5E8F\u5458": chalk.magenta,
1229
+ "\u{1F3F7}\uFE0F PPT \u67B6\u6784\u5E08": chalk.blue,
1230
+ "\u{1F3F7}\uFE0F \u683C\u5F0F\u5316\u5927\u5E08": chalk.cyan,
1231
+ "\u{1F4AC} Git \u804A\u5929\u8FBE\u4EBA": chalk.greenBright,
1232
+ "\u{1F319} \u6DF1\u591C\u523A\u5BA2": chalk.redBright,
1233
+ "\u{1F434} \u751F\u4EA7\u961F\u7684\u9A74": chalk.yellowBright,
1234
+ "\u{1F41F} \u6478\u9C7C\u4ED9\u4EBA": chalk.green.bold,
1235
+ "\u{1F41F} \u4ECA\u65E5\u6682\u65E0\u4EE3\u7801\u6D3B\u52A8": chalk.green
1218
1236
  };
1219
1237
  const sortedKeys = Object.keys(colorMap).sort((a, b) => b.length - a.length);
1220
1238
  let result = tagStr;
@@ -1252,11 +1270,11 @@ function colorizeFishRow(row) {
1252
1270
  if (isNaN(val)) {
1253
1271
  result += chunk;
1254
1272
  } else if (val >= 80) {
1255
- result += chalk2.green(chunk);
1273
+ result += chalk.green(chunk);
1256
1274
  } else if (val >= 40) {
1257
- result += chalk2.yellow(chunk);
1275
+ result += chalk.yellow(chunk);
1258
1276
  } else {
1259
- result += chalk2.red(chunk);
1277
+ result += chalk.red(chunk);
1260
1278
  }
1261
1279
  }
1262
1280
  return result;
@@ -1277,61 +1295,61 @@ function randomPick(arr) {
1277
1295
  return arr[Math.floor(Math.random() * arr.length)];
1278
1296
  }
1279
1297
  var COMMENT_POOLS = {
1280
- "0-2": { color: chalk2.red, tags: [
1298
+ "0-2": { color: chalk.red, tags: [
1281
1299
  "\u670D\u52A1\u5668\u548C\u4F60\uFF0C\u603B\u5F97\u6709\u4E00\u4E2A\u7761\u89C9 \u{1F635}\u200D\u{1F4AB}",
1282
1300
  "\u591C\u732B\u4FEE\u4ED9 \u{1F9D9}",
1283
1301
  "\u8FD9\u63D0\u4EA4\u4E0D\u50CF\u5DE5\u4F5C\uFF0C\u50CF\u62A5\u590D\u4EE3\u7801 \u{1F608}",
1284
1302
  "\u6DF1\u591C\u4FEE\u4ED9\u578B\u7A0B\u5E8F\u5458 \u{1F319}"
1285
1303
  ] },
1286
- "3-5": { color: chalk2.redBright, tags: [
1304
+ "3-5": { color: chalk.redBright, tags: [
1287
1305
  "\u960E\u738B\uFF1A\u600E\u4E48\u53C8\u662F\u4F60\uFF1F\u{1F47B}",
1288
1306
  "\u751F\u7269\u949F\u5DF2\u9635\u4EA1 \u2620\uFE0F",
1289
1307
  "\u54E5\uFF0C\u4F60\u662F\u4F4F\u516C\u53F8\u4E86\u5417 \u{1F3E2}",
1290
1308
  "\u9E21\u9E23\u5373\u8D77\u578B\u725B\u9A6C \u{1F414}"
1291
1309
  ] },
1292
- "6-8": { color: chalk2.gray, tags: [
1310
+ "6-8": { color: chalk.gray, tags: [
1293
1311
  "\u9E21\u90FD\u6CA1\u8D77\uFF0C\u4F60\u5148\u4E0A\u73ED\u4E86 \u{1F414}",
1294
1312
  "\u5929\u9009\u725B\u9A6C\u5DF2\u4E0A\u7EBF \u{1F402}",
1295
1313
  "\u7206\u809D\u542F\u52A8\u6210\u529F \u{1F680}",
1296
1314
  "\u65E9\u8D77\u7684 commit \u6709 bug \u5403 \u{1F41B}"
1297
1315
  ] },
1298
- "9-11": { color: chalk2.yellow, tags: [
1316
+ "9-11": { color: chalk.yellow, tags: [
1299
1317
  "\u5047\u88C5\u5F88\u5FD9\uFF0C\u5176\u5B9E\u5728\u7B49\u5348\u996D \u{1F371}",
1300
1318
  "\u6668\u95F4coding \u2615",
1301
1319
  "\u6B63\u5E38\u4EBA\u7C7B\u5DE5\u4F5C\u65F6\u95F4 \u2705",
1302
1320
  "\u4E0A\u5348\u8868\u6F14\u578B\u9009\u624B \u{1F680}"
1303
1321
  ] },
1304
- "12-13": { color: chalk2.green, tags: [
1322
+ "12-13": { color: chalk.green, tags: [
1305
1323
  "\u5DE5\u4F4D\u5403\u996D\uFF0C\u7075\u9B42\u7EED\u547D \u{1F50B}",
1306
1324
  "\u5E72\u996D\u662F\u7B2C\u4E00\u751F\u4EA7\u529B \u{1F35A}",
1307
1325
  "\u4E00\u8FB9\u5403\u996D\u4E00\u8FB9 commit \u{1F35C}",
1308
1326
  "\u5E72\u996D\u7EED\u547D\u578B\u5DE5\u7A0B\u5E08 \u{1F371}"
1309
1327
  ] },
1310
- "14-15": { color: chalk2.cyan, tags: [
1328
+ "14-15": { color: chalk.cyan, tags: [
1311
1329
  "\u5348\u7761\u672A\u9192\uFF0C\u4EBA\u5DF2\u5F00\u5DE5 \u{1F62A}",
1312
1330
  "CPU \u91CD\u542F\u4E2D \u{1F504}",
1313
1331
  // '午觉没睡成,拿代码出气 💢',
1314
1332
  "\u5348\u540E\u7075\u9B42\u51FA\u7A8D\u8005 \u{1F47B}"
1315
1333
  ] },
1316
- "16-17": { color: chalk2.cyanBright, tags: [
1334
+ "16-17": { color: chalk.cyanBright, tags: [
1317
1335
  "\u5F00\u59CB\u601D\u8003\u4ECA\u665A\u5403\u4EC0\u4E48 \u{1F373}",
1318
1336
  "\u7075\u9B42\u5DF2\u4E0B\u73ED \u{1F47B}",
1319
1337
  "\u4E34\u8FD1\u4E0B\u73ED\u7A81\u7136\u52E4\u594B \u{1F914}",
1320
1338
  "\u7B49\u4E0B\u73ED\u89C2\u5BDF\u5458 \u{1F375}"
1321
1339
  ] },
1322
- "18-20": { color: chalk2.magenta, tags: [
1340
+ "18-20": { color: chalk.magenta, tags: [
1323
1341
  "\u52A0\u73ED\u662F\u4E0D\u53EF\u80FD\u4E3B\u52A8\u52A0\u73ED\u7684 \u{1F4BC}",
1324
1342
  "\u5DE5\u4F4D\u5C01\u5370\u89E3\u9664 \u{1F513}",
1325
1343
  "\u767D\u5929\u5728\u5F00\u4F1A\uFF0C\u665A\u4E0A\u771F\u5E72\u6D3B \u{1F4BB}",
1326
1344
  "\u81EA\u613F\uFF08\u88AB\u8FEB\uFF09\u52A0\u73ED\u4EBA \u{1F4AA}"
1327
1345
  ] },
1328
- "21-22": { color: chalk2.magentaBright, tags: [
1346
+ "21-22": { color: chalk.magentaBright, tags: [
1329
1347
  "\u8001\u677F\u4E0B\u73ED\u4E86\uFF0C\u4F60\u8FD8\u6CA1\u4E0B\u7EBF \u{1F62D}",
1330
1348
  "\u52A0\u73ED\u4ED9\u4EBA\u6E21\u52AB\u4E2D \u26A1",
1331
1349
  "\u4ECA\u65E5\u6700\u540E\u4E00\u4E2A commit\uFF08\u9A97\u81EA\u5DF1\uFF09\u{1F921}",
1332
1350
  "\u5927\u798F\u62A5\u65F6\u95F4 \u{1F525}"
1333
1351
  ] },
1334
- "23": { color: chalk2.red, tags: [
1352
+ "23": { color: chalk.red, tags: [
1335
1353
  "\u4EE3\u7801\u548C\u5934\u53D1\u4E00\u8D77\u6389\u5149\u4E2D \u{1F9D1}\u200D\u{1F9B2}",
1336
1354
  "\u4ECA\u65E5 KPI\uFF1A\u6D3B\u7740\u5C31\u884C \u{1F60C}",
1337
1355
  "\u7761\u5427\uFF0CGit \u4E0D\u4F1A\u8DD1 \u{1F6CC}",
@@ -1368,11 +1386,11 @@ async function runWeeklyReport(weeksAgo, source, showProjects = false) {
1368
1386
  const config = readConfig();
1369
1387
  const hasGitLab = config.gitlabToken || config.gitlabs && config.gitlabs.length > 0;
1370
1388
  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
1389
+ console.log(chalk.yellow(`\u26A0 \u63D0\u793A: \u5F53\u524D\u5DE5\u4F5C\u76EE\u5F55\u4E0D\u662F\u4E00\u4E2A Git \u4ED3\u5E93\u3002`));
1390
+ console.log(chalk.gray(`\u4F60\u53EF\u4EE5\u901A\u8FC7\u4EE5\u4E0B\u547D\u4EE4\u914D\u7F6E\u9879\u76EE\u6216 GitLab\uFF1A`));
1391
+ console.log(` ${chalk.cyan("fish config add <path>")} - \u624B\u52A8\u6DFB\u52A0\u672C\u5730\u4ED3\u5E93`);
1392
+ console.log(` ${chalk.cyan("fish config scan <dir>")} - \u81EA\u52A8\u626B\u63CF\u76EE\u5F55\u4E0B\u6240\u6709\u4ED3\u5E93`);
1393
+ 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
1394
  `);
1377
1395
  }
1378
1396
  }
@@ -1385,7 +1403,7 @@ async function runWeeklyReport(weeksAgo, source, showProjects = false) {
1385
1403
  const loading = showLoading("\u6B63\u5728\u6478\u904D\u6240\u6709\u4ED3\u5E93...");
1386
1404
  const stats = await analyzeWeekly(projects, targetDate, source);
1387
1405
  loading.stop();
1388
- console.log(chalk2.cyan.bold("\u{1F4C5} \u672C\u5468\u63D0\u4EA4\u8BE6\u60C5\uFF1A"));
1406
+ console.log(chalk.cyan.bold("\u{1F4C5} \u672C\u5468\u63D0\u4EA4\u8BE6\u60C5\uFF1A"));
1389
1407
  stats.days.forEach((day, idx) => {
1390
1408
  const isWeekend = idx >= 5;
1391
1409
  const isFuture = idx > currentDayOfWeek;
@@ -1393,10 +1411,10 @@ async function runWeeklyReport(weeksAgo, source, showProjects = false) {
1393
1411
  return;
1394
1412
  }
1395
1413
  if (isFuture && day.commitsCount === 0) {
1396
- console.log(` ${day.dayName}\uFF1A${chalk2.gray("\u672A\u5230")}`);
1414
+ console.log(` ${day.dayName}\uFF1A${chalk.gray("\u672A\u5230")}`);
1397
1415
  } else {
1398
1416
  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";
1417
+ const commitStr = day.commitsCount > 0 ? chalk.white.bold(`${day.commitsCount} \u6B21`) : "0 \u6B21";
1400
1418
  const indices = [];
1401
1419
  if (isWeekend) {
1402
1420
  indices.push(`\u{1F4BC} \u52A0\u73ED\u6307\u6570: ${formatOvertimeIndex(day.fish)}`);
@@ -1417,7 +1435,7 @@ async function runWeeklyReport(weeksAgo, source, showProjects = false) {
1417
1435
  console.log(` ${day.dayName}\uFF1A${commitStr}${extraIndices}${projStr}${branchStr}${tagStr}`);
1418
1436
  }
1419
1437
  });
1420
- console.log("\n" + chalk2.gray("-".repeat(50)));
1438
+ console.log("\n" + chalk.gray("-".repeat(50)));
1421
1439
  if (stats.totalCommits > 0) {
1422
1440
  const activeDays = stats.days.filter((_, idx) => idx <= currentDayOfWeek);
1423
1441
  const workingDays = activeDays.filter((d) => d.commitsCount > 0);
@@ -1429,7 +1447,7 @@ async function runWeeklyReport(weeksAgo, source, showProjects = false) {
1429
1447
  const sample = mostProductiveDays[0];
1430
1448
  const isWeekend = sample.dayName === "\u5468\u516D" || sample.dayName === "\u5468\u65E5";
1431
1449
  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}%`);
1450
+ console.log(`\u{1F3C6} ${chalk.red.bold("\u6700\u52AA\u529B\u7684\u65E5\u5B50")}\uFF1A${names} | ${label}\uFF1A${sample.fish}%`);
1433
1451
  }
1434
1452
  }
1435
1453
  const weekdayDays = activeDays.filter((d) => d.dayName !== "\u5468\u516D" && d.dayName !== "\u5468\u65E5");
@@ -1443,7 +1461,7 @@ async function runWeeklyReport(weeksAgo, source, showProjects = false) {
1443
1461
  if (maxFish >= 70 && filteredHappyDays.length > 0) {
1444
1462
  const names = filteredHappyDays.map((d) => d.dayName).join("\u3001");
1445
1463
  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}%`);
1464
+ console.log(`\u2615 ${chalk.green.bold("\u6700\u5FEB\u4E50\u7684\u65E5\u5B50")}\uFF1A${names} | \u{1F41F} \u6478\u9C7C\u6307\u6570\uFF1A${sample.fish}%`);
1447
1465
  }
1448
1466
  }
1449
1467
  const weekendDays = activeDays.filter((d) => d.commitsCount > 0 && (d.dayName === "\u5468\u516D" || d.dayName === "\u5468\u65E5"));
@@ -1452,16 +1470,16 @@ async function runWeeklyReport(weeksAgo, source, showProjects = false) {
1452
1470
  const painfulDays = weekendDays.filter((d) => d.fish === minFish);
1453
1471
  const names = painfulDays.map((d) => d.dayName).join("\u3001");
1454
1472
  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}%`);
1473
+ 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
1474
  }
1457
- console.log(chalk2.gray("-".repeat(50)));
1475
+ console.log(chalk.gray("-".repeat(50)));
1458
1476
  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)));
1477
+ console.log(chalk.cyan.bold(`\u{1F4CA} \u672C\u5468\u5747\u503C\uFF1A\u{1F41F} \u6478\u9C7C\u6307\u6570 ${stats.averageFish}%${avgNightStr}`));
1478
+ console.log(chalk.gray("-".repeat(50)));
1479
+ console.log(`\u{1F916} ${chalk.magenta.bold("\u9510\u8BC4")}\uFF1A`);
1480
+ console.log(chalk.white(getAICritic(stats)));
1463
1481
  } 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"));
1482
+ 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
1483
  }
1466
1484
  console.log("");
1467
1485
  }
@@ -1481,26 +1499,26 @@ async function runMonthlyReport(monthsAgo, source) {
1481
1499
  const stats = await analyzeMonthly(projects, targetDate, source);
1482
1500
  loading.stop();
1483
1501
  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"));
1502
+ 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
1503
  return;
1486
1504
  }
1487
1505
  const { fix, feat, chore, other } = stats.categories;
1488
1506
  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"));
1507
+ 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
1508
  function drawRow(label, count, colorFn) {
1491
1509
  const percentage = total > 0 ? Math.round(count / total * 100) : 0;
1492
1510
  const barWidth = 15;
1493
1511
  const filled = Math.round(percentage / 100 * barWidth);
1494
1512
  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)`);
1513
+ const barStr = colorFn("\u25A0".repeat(filled)) + chalk.gray("\u25A1".repeat(empty));
1514
+ console.log(` - ${label}\uFF1A[${barStr}] ${chalk.bold(percentage + "%")} (${count} \u6B21)`);
1497
1515
  }
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);
1516
+ drawRow("\u4FEE bug (fix) ", fix, chalk.red);
1517
+ drawRow("\u65B0\u529F\u80FD (feat) ", feat, chalk.green);
1518
+ drawRow("\u6742\u52A1\u4E0E\u6587\u6863 (chore) ", chore, chalk.yellow);
1519
+ drawRow("\u5176\u4ED6\u63D0\u4EA4 (other) ", other, chalk.gray);
1502
1520
  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"));
1521
+ console.log("\n" + chalk.cyan.bold("\u{1F4C5} \u6BCF\u65E5\u6478\u9C7C\u6307\u6570\u6982\u89C8\uFF1A"));
1504
1522
  const monthLabel = `${targetDate.getMonth() + 1}\u6708`;
1505
1523
  const COL_WIDTH = 8;
1506
1524
  const weekHeaders = ["\u5468\u4E00", "\u5468\u4E8C", "\u5468\u4E09", "\u5468\u56DB", "\u5468\u4E94", "\u5468\u516D", "\u5468\u65E5"];
@@ -1509,7 +1527,7 @@ async function runMonthlyReport(monthsAgo, source) {
1509
1527
  const lines = [];
1510
1528
  let dateRow = "";
1511
1529
  let fishRow = "";
1512
- lines.push(chalk2.gray(weekHeaders.map((d) => visualPad(d, COL_WIDTH)).join("").trimEnd()));
1530
+ lines.push(chalk.gray(weekHeaders.map((d) => visualPad(d, COL_WIDTH)).join("").trimEnd()));
1513
1531
  for (let i = 0; i < firstDayOffset; i++) {
1514
1532
  dateRow += visualPad("", COL_WIDTH);
1515
1533
  fishRow += visualPad("", COL_WIDTH);
@@ -1518,10 +1536,23 @@ async function runMonthlyReport(monthsAgo, source) {
1518
1536
  const dateRaw = `${monthLabel}${d.day}\u65E5`;
1519
1537
  const fishRaw = `${d.fish}%`;
1520
1538
  const columnIndex = (firstDayOffset + d.day - 1) % 7;
1521
- dateRow += visualPad(dateRaw, COL_WIDTH);
1539
+ const dateObj = new Date(targetDate.getFullYear(), targetDate.getMonth(), d.day);
1540
+ let suffix = "";
1541
+ let suffixPlain = "";
1542
+ if (isHoliday(dateObj)) {
1543
+ suffix = chalk.green("\u2022");
1544
+ suffixPlain = "\u2022";
1545
+ } else if (isCompensatoryWorkday(dateObj)) {
1546
+ suffix = chalk.red("!");
1547
+ suffixPlain = "!";
1548
+ }
1549
+ const plainText = dateRaw + suffixPlain;
1550
+ const vw = visualWidth(plainText);
1551
+ const padding = vw < COL_WIDTH ? " ".repeat(COL_WIDTH - vw) : "";
1552
+ dateRow += dateRaw + suffix + padding;
1522
1553
  fishRow += visualPad(fishRaw, COL_WIDTH);
1523
1554
  if (columnIndex === 6 || d === stats.dailyIndices[stats.dailyIndices.length - 1]) {
1524
- lines.push(chalk2.gray(dateRow.trimEnd()));
1555
+ lines.push(chalk.gray(dateRow.trimEnd()));
1525
1556
  fishRow = colorizeFishRow(fishRow);
1526
1557
  lines.push(fishRow);
1527
1558
  lines.push("");
@@ -1533,23 +1564,10 @@ async function runMonthlyReport(monthsAgo, source) {
1533
1564
  for (const l of lines) {
1534
1565
  console.log(` ${l}`);
1535
1566
  }
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(" ")}` : "")));
1543
- }
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(" ")}` : "")));
1547
- }
1548
- }
1549
1567
  }
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)));
1568
+ console.log("\n" + chalk.gray("-".repeat(50)));
1569
+ console.log(`\u{1F916} ${chalk.magenta.bold("\u9510\u8BC4")}\uFF1A`);
1570
+ console.log(chalk.white(getAICriticForMonth(stats)));
1553
1571
  console.log("");
1554
1572
  }
1555
1573
  async function runProjectReport(weeksAgo, source, isMonth = false) {
@@ -1570,10 +1588,10 @@ async function runProjectReport(weeksAgo, source, isMonth = false) {
1570
1588
  const loading = showLoading("\u6B63\u5728\u7EDF\u8BA1\u9879\u76EE\u7206\u809D\u7A0B\u5EA6...");
1571
1589
  const stats = isMonth ? await analyzeMonthly(projects, targetDate, source) : await analyzeWeekly(projects, targetDate, source);
1572
1590
  loading.stop();
1573
- console.log(chalk2.cyan.bold(`\u{1F4CA} \u5BF9\u5E94\u65F6\u6BB5\u9879\u76EE\u7206\u809D\u6392\u884C (${since.toLocaleDateString()} ~ ${until.toLocaleDateString()})`));
1591
+ console.log(chalk.cyan.bold(`\u{1F4CA} \u5BF9\u5E94\u65F6\u6BB5\u9879\u76EE\u7206\u809D\u6392\u884C (${since.toLocaleDateString()} ~ ${until.toLocaleDateString()})`));
1574
1592
  const ranked = stats.projectsRanked;
1575
1593
  if (ranked.length === 0) {
1576
- console.log(chalk2.gray(" \u672C\u65F6\u6BB5\u6682\u65E0\u9879\u76EE\u63D0\u4EA4\u6570\u636E\u3002"));
1594
+ console.log(chalk.gray(" \u672C\u65F6\u6BB5\u6682\u65E0\u9879\u76EE\u63D0\u4EA4\u6570\u636E\u3002"));
1577
1595
  } else {
1578
1596
  const totalCommits = ranked.reduce((sum, p) => sum + p.count, 0);
1579
1597
  let hasPrimaryProject = false;
@@ -1583,21 +1601,21 @@ async function runProjectReport(weeksAgo, source, isMonth = false) {
1583
1601
  let suffix;
1584
1602
  if (ratio >= 0.5 || N >= 30) {
1585
1603
  if (!hasPrimaryProject) {
1586
- suffix = chalk2.red(" (\u4E3B\u529B\u642C\u7816\u5730 \u{1F9F1})");
1604
+ suffix = chalk.red(" (\u4E3B\u529B\u642C\u7816\u5730 \u{1F9F1})");
1587
1605
  hasPrimaryProject = true;
1588
1606
  } else {
1589
- suffix = chalk2.red(" (\u9B42\u5F52\u4E4B\u5904\uFF0C\u4EE3\u7801\u5728\u8FD9\u5BB6\u5C31\u5728 \u{1F3E0})");
1607
+ suffix = chalk.red(" (\u9B42\u5F52\u4E4B\u5904\uFF0C\u4EE3\u7801\u5728\u8FD9\u5BB6\u5C31\u5728 \u{1F3E0})");
1590
1608
  }
1591
1609
  } else if (ratio >= 0.2 || N >= 14) {
1592
- suffix = chalk2.magenta(" (\u591A\u7EBF\u7A0B\u5206\u51FA\u6765\u7684\u6253\u5DE5\u9B42 \u{1F9F5})");
1610
+ suffix = chalk.magenta(" (\u591A\u7EBF\u7A0B\u5206\u51FA\u6765\u7684\u6253\u5DE5\u9B42 \u{1F9F5})");
1593
1611
  } else if (ratio >= 0.15 || N >= 5) {
1594
- suffix = chalk2.yellow(" (\u5076\u5C14\u4E0A\u53BB\u70B9\u4E00\u4E0B \u{1F41F})");
1612
+ suffix = chalk.yellow(" (\u5076\u5C14\u4E0A\u53BB\u70B9\u4E00\u4E0B \u{1F41F})");
1595
1613
  } else if (N === 1) {
1596
- suffix = chalk2.cyan(" (\u6D4B\u5B8C\u5C31\u8DD1\uFF0C\u7EAF\u7CB9\u8DEF\u8FC7 \u{1F6AC})");
1614
+ suffix = chalk.cyan(" (\u6D4B\u5B8C\u5C31\u8DD1\uFF0C\u7EAF\u7CB9\u8DEF\u8FC7 \u{1F6AC})");
1597
1615
  } else {
1598
- suffix = chalk2.gray(" (\u8FB9\u7F18\u6302\u673A\u9879\u76EE \u{1F4A4})");
1616
+ suffix = chalk.gray(" (\u8FB9\u7F18\u6302\u673A\u9879\u76EE \u{1F4A4})");
1599
1617
  }
1600
- console.log(` ${idx + 1}. ${chalk2.bold.white(proj.name)}: ${chalk2.cyan(N + " \u6B21\u63D0\u4EA4")}${suffix}`);
1618
+ console.log(` ${idx + 1}. ${chalk.bold.white(proj.name)}: ${chalk.cyan(N + " \u6B21\u63D0\u4EA4")}${suffix}`);
1601
1619
  });
1602
1620
  }
1603
1621
  console.log("");
@@ -1622,14 +1640,14 @@ async function runTimeReport(offset, source, isMonth) {
1622
1640
  loading.stop();
1623
1641
  const maxCount = Math.max(...hours.map((h) => h.count));
1624
1642
  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`));
1643
+ console.log(chalk.cyan.bold(`\u{1F552} \u5BF9\u5E94\u65F6\u6BB5 24 \u5C0F\u65F6 commit \u9891\u6B21\u5206\u5E03\u56FE\uFF1A`));
1626
1644
  hours.forEach(({ hour, count }) => {
1627
1645
  const barLength = Math.round(count * barScale);
1628
1646
  const barStr = "\u2588".repeat(barLength);
1629
1647
  const hourStr = String(hour).padStart(2, "0") + ":00";
1630
1648
  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}`);
1649
+ const barColorStr = count > 0 ? chalk.blue(barStr.padEnd(30, " ")) : chalk.gray("".padEnd(30, " "));
1650
+ console.log(` ${chalk.bold.cyan(hourStr)} | [${barColorStr}] ${chalk.white(count + " \u6B21")}${tag}`);
1633
1651
  });
1634
1652
  console.log("");
1635
1653
  }
@@ -1646,19 +1664,19 @@ async function runGhostReport(weeksAgo, source) {
1646
1664
  const ghosts = await getGhostCommits(projects, since, until, source);
1647
1665
  loading.stop();
1648
1666
  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"));
1667
+ 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"));
1668
+ 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
1669
  } 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)));
1670
+ 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`));
1671
+ 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"));
1672
+ console.log(chalk.gray("-".repeat(50)));
1655
1673
  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)}`);
1674
+ console.log(` - [${chalk.yellow(c.project)}] ${chalk.cyan(c.date.slice(0, 19).replace("T", " "))} (${chalk.gray(c.hash)})`);
1675
+ console.log(` \u{1F4AC} ${chalk.italic.white(c.message)}`);
1658
1676
  });
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"));
1677
+ console.log(chalk.gray("-".repeat(50)));
1678
+ console.log(`\u{1F916} ${chalk.magenta.bold("\u9510\u8BC4")}\uFF1A`);
1679
+ 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
1680
  }
1663
1681
  }
1664
1682
  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 +1705,45 @@ var configCmd = program.command("config").description("\u7BA1\u7406\u76D1\u63A7\
1687
1705
  configCmd.command("add <path>").description("\u624B\u52A8\u6DFB\u52A0\u4E00\u4E2A\u672C\u5730 Git \u4ED3\u5E93\u8DEF\u5F84").action((projPath) => {
1688
1706
  const res = addProject(projPath);
1689
1707
  if (res.success) {
1690
- console.log(chalk2.green(`\u2714 ${res.message}`));
1708
+ console.log(chalk.green(`\u2714 ${res.message}`));
1691
1709
  } else {
1692
- console.log(chalk2.red(`\u2718 ${res.message}`));
1710
+ console.log(chalk.red(`\u2718 ${res.message}`));
1693
1711
  }
1694
1712
  });
1695
1713
  configCmd.command("remove <path>").description("\u4ECE\u914D\u7F6E\u4E2D\u79FB\u9664\u4E00\u4E2A\u9879\u76EE\u8DEF\u5F84").action((projPath) => {
1696
1714
  const res = removeProject(projPath);
1697
1715
  if (res.success) {
1698
- console.log(chalk2.green(`\u2714 ${res.message}`));
1716
+ console.log(chalk.green(`\u2714 ${res.message}`));
1699
1717
  } else {
1700
- console.log(chalk2.red(`\u2718 ${res.message}`));
1718
+ console.log(chalk.red(`\u2718 ${res.message}`));
1701
1719
  }
1702
1720
  });
1703
1721
  configCmd.command("list").description("\u5217\u51FA\u5F53\u524D\u6240\u6709\u76D1\u63A7\u7684\u9879\u76EE\u4E0E GitLab \u914D\u7F6E").action(() => {
1704
1722
  const config = readConfig();
1705
- console.log(chalk2.cyan.bold("\n\u{1F4C1} \u5F53\u524D\u76D1\u63A7\u7684\u672C\u5730\u9879\u76EE\u5217\u8868:"));
1723
+ console.log(chalk.cyan.bold("\n\u{1F4C1} \u5F53\u524D\u76D1\u63A7\u7684\u672C\u5730\u9879\u76EE\u5217\u8868:"));
1706
1724
  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()})`));
1725
+ 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
1726
  } else {
1709
1727
  config.projects.forEach((p, idx) => {
1710
- console.log(` ${idx + 1}. ${chalk2.white(p)}`);
1728
+ console.log(` ${idx + 1}. ${chalk.white(p)}`);
1711
1729
  });
1712
1730
  }
1713
- console.log(chalk2.cyan.bold("\n\u{1F98A} \u5F53\u524D\u914D\u7F6E\u7684 GitLab \u8FDC\u7A0B\u6E90:"));
1731
+ console.log(chalk.cyan.bold("\n\u{1F98A} \u5F53\u524D\u914D\u7F6E\u7684 GitLab \u8FDC\u7A0B\u6E90:"));
1714
1732
  const gitlabs = config.gitlabs || [];
1715
1733
  if (gitlabs.length === 0) {
1716
- console.log(chalk2.gray(" (\u5C1A\u672A\u914D\u7F6E\u4EFB\u4F55 GitLab \u8FDC\u7A0B\u6E90)"));
1734
+ console.log(chalk.gray(" (\u5C1A\u672A\u914D\u7F6E\u4EFB\u4F55 GitLab \u8FDC\u7A0B\u6E90)"));
1717
1735
  } else {
1718
1736
  gitlabs.forEach((g, idx) => {
1719
- console.log(` ${idx + 1}. ${chalk2.bold.white(g.name)} | Host: ${chalk2.gray(g.host)}`);
1737
+ console.log(` ${idx + 1}. ${chalk.bold.white(g.name)} | Host: ${chalk.gray(g.host)}`);
1720
1738
  });
1721
1739
  }
1722
1740
  console.log("");
1723
1741
  });
1724
1742
  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...`));
1743
+ console.log(chalk.cyan(`\u{1F50D} \u6B63\u5728\u626B\u63CF\u76EE\u5F55 ${dir} \u4E0B of Git \u4ED3\u5E93...`));
1726
1744
  const repos = scanDirectory(dir);
1727
1745
  if (repos.length === 0) {
1728
- console.log(chalk2.yellow(`\u26A0 \u672A\u5728 ${dir} \u4E0B\u53D1\u73B0\u4EFB\u4F55 Git \u4ED3\u5E93\u3002`));
1746
+ console.log(chalk.yellow(`\u26A0 \u672A\u5728 ${dir} \u4E0B\u53D1\u73B0\u4EFB\u4F55 Git \u4ED3\u5E93\u3002`));
1729
1747
  return;
1730
1748
  }
1731
1749
  const config = readConfig();
@@ -1738,26 +1756,26 @@ configCmd.command("scan <dir>").description("\u81EA\u52A8\u626B\u63CF\u6307\u5B9
1738
1756
  }
1739
1757
  if (addedCount > 0) {
1740
1758
  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)}`));
1759
+ console.log(chalk.green(`\u2714 \u6210\u529F\u53D1\u73B0\u5E76\u6DFB\u52A0\u4E86 ${addedCount} \u4E2A\u65B0 Git \u4ED3\u5E93\uFF1A`));
1760
+ repos.forEach((r) => console.log(` - ${chalk.gray(r)}`));
1743
1761
  } 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`));
1762
+ 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
1763
  }
1746
1764
  });
1747
1765
  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
1766
  setGitLabConfig(token, host, name);
1749
- console.log(chalk2.green(`\u2714 \u5DF2\u6210\u529F\u914D\u7F6E\u5E76\u4FDD\u5B58 GitLab \u8BBF\u95EE\u6E90\u3002`));
1767
+ console.log(chalk.green(`\u2714 \u5DF2\u6210\u529F\u914D\u7F6E\u5E76\u4FDD\u5B58 GitLab \u8BBF\u95EE\u6E90\u3002`));
1750
1768
  const targetHost = host || "https://gitlab.com";
1751
1769
  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}`));
1770
+ console.log(chalk.gray(`\u522B\u540D (Name): ${targetName}`));
1771
+ console.log(chalk.gray(`\u5730\u5740 (Host): ${targetHost}`));
1754
1772
  });
1755
1773
  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
1774
  clearGitLabConfig(nameOrIndex);
1757
1775
  if (nameOrIndex) {
1758
- console.log(chalk2.green(`\u2714 \u5DF2\u6E05\u9664\u6307\u5B9A\u7684 GitLab \u8BBF\u95EE\u914D\u7F6E [${nameOrIndex}]\u3002`));
1776
+ console.log(chalk.green(`\u2714 \u5DF2\u6E05\u9664\u6307\u5B9A\u7684 GitLab \u8BBF\u95EE\u914D\u7F6E [${nameOrIndex}]\u3002`));
1759
1777
  } 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`));
1778
+ 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
1779
  }
1762
1780
  });
1763
1781
  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.9",
4
4
  "description": "🐟 Git 摸鱼 & 爆肝分析器 CLI — 给你的提交记录生成摸鱼指数和锐评",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",