git-fish-log 1.0.6 → 1.0.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  // src/index.ts
4
4
  import { Command } from "commander";
5
- import chalk from "chalk";
5
+ import chalk2 from "chalk";
6
6
  import fs2 from "fs";
7
7
  import path3 from "path";
8
8
 
@@ -201,63 +201,90 @@ function formatLocalDate(date) {
201
201
  const s = String(date.getSeconds()).padStart(2, "0");
202
202
  return `${Y}-${M}-${D} ${h}:${m}:${s}`;
203
203
  }
204
+ function cleanBranchRef(refName) {
205
+ if (!refName) return "unknown";
206
+ return refName.replace(/^refs\/heads\//, "").replace(/^refs\/remotes\/[^/]+\//, "").replace(/^HEAD -> /, "").replace(/^refs\//, "");
207
+ }
208
+ function shellQuote(value) {
209
+ return `"${value.replace(/(["\\$`])/g, "\\$1")}"`;
210
+ }
211
+ function getBranchRefs(projectPath) {
212
+ try {
213
+ const stdout = execSync('git for-each-ref --format="%(refname)" refs/heads refs/remotes', {
214
+ cwd: projectPath,
215
+ encoding: "utf8"
216
+ });
217
+ const seen = /* @__PURE__ */ new Set();
218
+ return stdout.replace(/\r/g, "").split("\n").map((ref) => ref.trim()).filter((ref) => ref && !/\/HEAD$/.test(ref)).map((ref) => ({ ref, name: cleanBranchRef(ref) })).filter(({ name }) => name && name !== "unknown").filter(({ name }) => {
219
+ if (seen.has(name)) return false;
220
+ seen.add(name);
221
+ return true;
222
+ });
223
+ } catch {
224
+ return [];
225
+ }
226
+ }
204
227
  function getCommitsForProject(projectPath, since, until) {
205
228
  const projectName = path2.basename(projectPath);
206
229
  const email = getUserEmail(projectPath);
207
230
  const sinceStr = formatLocalDate(since);
208
231
  const untilStr = formatLocalDate(until);
209
- let authorArg = "";
210
- if (email) {
211
- authorArg = `--author="${email.replace(/"/g, '\\"')}"`;
212
- }
232
+ const authorArg = email ? ` --author=${shellQuote(email)}` : "";
213
233
  const delimiter = "|||";
214
234
  const formatStr = `%aI${delimiter}%an${delimiter}%ae${delimiter}%h${delimiter}%s`;
215
- const cmd = `git log --all --since="${sinceStr}" --until="${untilStr}" ${authorArg} --pretty=format:"${formatStr}" --shortstat --date=iso-strict`;
216
- try {
217
- const stdout = execSync(cmd, {
218
- cwd: projectPath,
219
- maxBuffer: 20 * 1024 * 1024,
220
- // 20MB buffer for large repos
221
- encoding: "utf8"
222
- });
223
- if (!stdout.trim()) {
224
- return [];
225
- }
226
- const lines = stdout.split("\n").map((l) => l.trim());
227
- const results = [];
228
- let currentCommit = null;
229
- for (const line of lines) {
230
- if (line.length === 0) continue;
231
- if (line.includes(delimiter)) {
232
- if (currentCommit) {
233
- results.push(currentCommit);
235
+ const branchRefs = getBranchRefs(projectPath);
236
+ const refsToScan = branchRefs.length > 0 ? branchRefs : [{ ref: "--all", name: "unknown" }];
237
+ const results = [];
238
+ for (const branch of refsToScan) {
239
+ const refArg = branch.ref === "--all" ? "--all" : shellQuote(branch.ref);
240
+ const cmd = `git log ${refArg} --since=${shellQuote(sinceStr)} --until=${shellQuote(untilStr)}${authorArg} --pretty=format:${shellQuote(formatStr)} --shortstat --date=iso-strict`;
241
+ try {
242
+ const stdout = execSync(cmd, {
243
+ cwd: projectPath,
244
+ maxBuffer: 20 * 1024 * 1024,
245
+ // 20MB buffer for large repos
246
+ encoding: "utf8"
247
+ });
248
+ if (!stdout.trim()) {
249
+ continue;
250
+ }
251
+ const lines = stdout.replace(/\r/g, "").split("\n");
252
+ let currentCommit = null;
253
+ for (const line of lines) {
254
+ if (line.trim().length === 0) continue;
255
+ if (line.includes(delimiter)) {
256
+ if (currentCommit) {
257
+ results.push(currentCommit);
258
+ }
259
+ const parts = line.split(delimiter);
260
+ const [date, name, authorEmail, hash, ...msgParts] = parts;
261
+ const message = msgParts.join(delimiter);
262
+ currentCommit = {
263
+ project: projectName,
264
+ hash: hash || "",
265
+ date: date || "",
266
+ message: message || "",
267
+ authorName: name || "",
268
+ authorEmail: authorEmail || "",
269
+ additions: 0,
270
+ deletions: 0,
271
+ branch: branch.name,
272
+ branches: branch.name !== "unknown" ? [branch.name] : []
273
+ };
274
+ } else if (currentCommit) {
275
+ const insMatch = line.match(/(\d+)\s+insertions?\(\+\)/);
276
+ const delMatch = line.match(/(\d+)\s+deletions?\(-\)/);
277
+ currentCommit.additions = insMatch ? parseInt(insMatch[1], 10) : 0;
278
+ currentCommit.deletions = delMatch ? parseInt(delMatch[1], 10) : 0;
234
279
  }
235
- const parts = line.split(delimiter);
236
- const [date, name, authorEmail, hash, message] = parts;
237
- currentCommit = {
238
- project: projectName,
239
- hash: hash || "",
240
- date: date || "",
241
- message: message || "",
242
- authorName: name || "",
243
- authorEmail: authorEmail || "",
244
- additions: 0,
245
- deletions: 0
246
- };
247
- } else if (currentCommit) {
248
- const insMatch = line.match(/(\d+)\s+insertions?\(\+\)/);
249
- const delMatch = line.match(/(\d+)\s+deletions?\(-\)/);
250
- currentCommit.additions = insMatch ? parseInt(insMatch[1], 10) : 0;
251
- currentCommit.deletions = delMatch ? parseInt(delMatch[1], 10) : 0;
252
280
  }
281
+ if (currentCommit) {
282
+ results.push(currentCommit);
283
+ }
284
+ } catch {
253
285
  }
254
- if (currentCommit) {
255
- results.push(currentCommit);
256
- }
257
- return results;
258
- } catch (e) {
259
- return [];
260
286
  }
287
+ return results;
261
288
  }
262
289
  function getLocalGitIdentity() {
263
290
  const emails = [];
@@ -380,27 +407,45 @@ async function fetchGitLabCommits(since, until, source) {
380
407
  const untilStr = until.toISOString();
381
408
  const commitPromises = projects.map(async (project) => {
382
409
  try {
383
- const commitsUrl = `${cleanHost}/api/v4/projects/${project.id}/repository/commits?since=${sinceStr}&until=${untilStr}&per_page=100&all=true`;
384
- const commitsRes = await gitLabFetch(commitsUrl, { "PRIVATE-TOKEN": token });
385
- if (!commitsRes.ok) {
386
- return [];
387
- }
388
- const commits = await commitsRes.json();
389
410
  const localIdentity = getLocalGitIdentity();
390
- const userCommits = commits.filter((c) => {
411
+ const isUserCommit = (c) => {
391
412
  const authorEmail = c.author_email.toLowerCase();
392
413
  const authorName = c.author_name.toLowerCase();
393
414
  const matchesGitLab = authorEmail === lowerEmail || authorName === lowerName || authorName === lowerUsername;
394
415
  const matchesLocal = localIdentity.emails.includes(authorEmail) || localIdentity.names.includes(authorName);
395
416
  return matchesGitLab || matchesLocal;
396
- });
417
+ };
418
+ let branchNames = [];
419
+ try {
420
+ const branchesUrl = `${cleanHost}/api/v4/projects/${project.id}/repository/branches?per_page=100`;
421
+ const branchesRes = await gitLabFetch(branchesUrl, { "PRIVATE-TOKEN": token });
422
+ if (branchesRes.ok) {
423
+ const branches = await branchesRes.json();
424
+ branchNames = branches.map((b) => b.name).filter(Boolean);
425
+ }
426
+ } catch {
427
+ }
428
+ const branchCommitResults = branchNames.length > 0 ? await Promise.all(branchNames.map(async (branchName) => {
429
+ const commitsUrl = `${cleanHost}/api/v4/projects/${project.id}/repository/commits?ref_name=${encodeURIComponent(branchName)}&since=${sinceStr}&until=${untilStr}&per_page=100`;
430
+ const commitsRes = await gitLabFetch(commitsUrl, { "PRIVATE-TOKEN": token });
431
+ if (!commitsRes.ok) return [];
432
+ const commits = await commitsRes.json();
433
+ return commits.filter(isUserCommit).map((c) => ({ commit: c, branchName }));
434
+ })) : await (async () => {
435
+ const commitsUrl = `${cleanHost}/api/v4/projects/${project.id}/repository/commits?since=${sinceStr}&until=${untilStr}&per_page=100&all=true`;
436
+ const commitsRes = await gitLabFetch(commitsUrl, { "PRIVATE-TOKEN": token });
437
+ if (!commitsRes.ok) return [];
438
+ const commits = await commitsRes.json();
439
+ return [commits.filter(isUserCommit).map((c) => ({ commit: c, branchName: "gitlab" }))];
440
+ })();
441
+ const userCommits = branchCommitResults.flat();
397
442
  if (userCommits.length === 0) return [];
398
443
  const statsResults = [];
399
444
  const batchSize = 8;
400
445
  for (let i = 0; i < userCommits.length; i += batchSize) {
401
446
  const batch = userCommits.slice(i, i + batchSize);
402
447
  const batchResults = await Promise.all(
403
- batch.map(async (c) => {
448
+ batch.map(async ({ commit: c, branchName }) => {
404
449
  let adds = 0;
405
450
  let dels = 0;
406
451
  try {
@@ -423,7 +468,9 @@ async function fetchGitLabCommits(since, until, source) {
423
468
  authorName: c.author_name,
424
469
  authorEmail: c.author_email,
425
470
  additions: adds,
426
- deletions: dels
471
+ deletions: dels,
472
+ branch: branchName,
473
+ branches: [branchName]
427
474
  };
428
475
  })
429
476
  );
@@ -501,12 +548,14 @@ function calculateDayIndices(commits, isWeekend = false) {
501
548
  const N = commits.length;
502
549
  if (N === 0) {
503
550
  return {
504
- fish: 90,
505
- hardworking: 10,
551
+ fish: 95,
552
+ hardworking: 5,
506
553
  nightOwl: 0,
507
554
  builder: 0,
508
555
  burst: 0,
509
556
  density: 0,
557
+ codeVolume: 0,
558
+ totalLines: 0,
510
559
  tags: ["\u{1F41F} \u4ECA\u65E5\u6682\u65E0\u4EE3\u7801\u6D3B\u52A8"]
511
560
  };
512
561
  }
@@ -515,6 +564,7 @@ function calculateDayIndices(commits, isWeekend = false) {
515
564
  let totalAdditions = 0;
516
565
  let totalDeletions = 0;
517
566
  let nightCount = 0;
567
+ const hourSet = /* @__PURE__ */ new Set();
518
568
  for (const commit of commits) {
519
569
  const parsed = parseGitISODate(commit.date);
520
570
  const fh = parsed.hour + parsed.minute / 60 + parsed.second / 3600;
@@ -523,40 +573,44 @@ function calculateDayIndices(commits, isWeekend = false) {
523
573
  if (parsed.hour >= 0 && parsed.hour <= 5) nightCount++;
524
574
  totalAdditions += commit.additions;
525
575
  totalDeletions += commit.deletions;
576
+ hourSet.add(parsed.hour);
526
577
  }
527
578
  const S = Math.max(0.1, latest - earliest);
528
579
  const L = totalAdditions + totalDeletions;
529
- const avgLines = L / Math.max(N, 1);
530
- const D = N / (S + 1);
531
- const commitScore = Math.min(100, Math.log2(N + 1) * 25);
532
- const spanScore = Math.min(100, Math.sqrt(S) * 25);
533
- const lineScore = Math.min(100, Math.log2(L + 1) * 12);
534
- const densityScore = N <= 1 ? 0 : Math.min(100, D * 50);
535
- const nightScore = Math.min(100, nightCount * 30);
536
- let hardworking = commitScore * 0.3 + lineScore * 0.3 + densityScore * 0.2 + spanScore * 0.2;
580
+ const activeHours = hourSet.size;
581
+ let Neff = 0;
582
+ for (const commit of commits) {
583
+ const cl = commit.additions + commit.deletions;
584
+ if (cl >= 20) {
585
+ Neff++;
586
+ }
587
+ }
588
+ const commitScore = Math.min(100, Math.log2(Neff + 1) * 20);
589
+ const spanScore = Math.min(100, Math.sqrt(S) * 22);
590
+ const spreadScore = Math.min(100, activeHours * 12);
591
+ const lineBonus = Math.min(100, Math.log10(L + 1) * 25);
592
+ const nightBonus = nightCount > 0 ? 5 : 0;
593
+ let workScore = commitScore * 0.35 + spanScore * 0.3 + spreadScore * 0.2 + lineBonus * 0.1 + nightBonus;
537
594
  if (isWeekend && N > 0) {
538
- hardworking += 8;
595
+ workScore += 5;
539
596
  }
540
- hardworking = Math.min(100, Math.round(hardworking));
597
+ const hardworking = Math.min(100, Math.round(workScore));
541
598
  const fish = Math.max(1, 100 - hardworking);
542
- const nightOwl = nightCount === 0 ? 0 : Math.min(100, Math.round(
543
- nightScore * 0.7 + spanScore * 0.3
544
- ));
545
- const builder = Math.min(100, Math.round(
546
- lineScore * 0.7 + commitScore * 0.3
547
- ));
548
- const burst = Math.min(100, Math.round(
549
- Math.log2(avgLines + 1) * 12
550
- ));
599
+ const nightScore = Math.min(100, nightCount * 30);
600
+ const nightOwl = nightCount === 0 ? 0 : Math.min(100, Math.round(nightScore * 0.7 + spanScore * 0.3));
601
+ const builder = Math.min(100, Math.round(lineBonus * 0.6 + commitScore * 0.4));
602
+ const codeVolume = Math.min(100, Math.max(0, Math.round(51.3 * Math.log10(L + 50) - 79.5)));
603
+ const displayAvgLines = Math.round(L / Math.max(N, 1));
604
+ const burst = Math.min(100, Math.round(Math.log2(displayAvgLines + 1) * 12));
551
605
  const tags = [];
552
606
  if (fish >= 80) tags.push("\u{1F41F} \u6478\u9C7C\u5B97\u5E08");
553
607
  if (hardworking >= 80) tags.push("\u{1F525} \u7206\u809D\u6218\u795E");
554
608
  if (nightOwl >= 80) tags.push("\u{1F319} \u6DF1\u591C\u4FEE\u4ED9\u8005");
555
609
  if (builder >= 80) tags.push("\u{1F9F1} \u52E4\u6073\u642C\u7816\u4EBA");
556
- if (burst >= 80 && N <= 2) tags.push(`\u{1F4A5} \u4E00\u628A\u68AD\u54C8\u578B\u7A0B\u5E8F\u5458 (\u5747${Math.round(avgLines)}\u884C/\u6B21)`);
557
- if (commitScore >= 70 && lineScore <= 15) tags.push("\u{1F3F7}\uFE0F PPT \u67B6\u6784\u5E08");
610
+ if (burst >= 80 && N <= 2) tags.push(`\u{1F4A5} \u4E00\u628A\u68AD\u54C8\u578B\u7A0B\u5E8F\u5458 (\u5747${displayAvgLines}\u884C/\u6B21)`);
611
+ if (N >= 8 && Neff <= 1 && L <= 50) tags.push("\u{1F3F7}\uFE0F PPT \u67B6\u6784\u5E08");
558
612
  if (N >= 10 && L <= 30) tags.push("\u{1F3F7}\uFE0F \u683C\u5F0F\u5316\u5927\u5E08");
559
- if (N >= 15 && avgLines <= 2) tags.push("\u{1F3F7}\uFE0F Git \u804A\u5929\u8FBE\u4EBA");
613
+ if (N >= 15 && L / N <= 2) tags.push("\u{1F3F7}\uFE0F Git \u804A\u5929\u8FBE\u4EBA");
560
614
  if (nightOwl >= 80 && N <= 3) tags.push("\u{1F3F7}\uFE0F \u6DF1\u591C\u523A\u5BA2");
561
615
  if (hardworking >= 90 && nightOwl >= 70 && isWeekend) tags.push("\u{1F3F7}\uFE0F \u751F\u4EA7\u961F\u7684\u9A74");
562
616
  if (fish >= 95 && N <= 1) tags.push("\u{1F3F7}\uFE0F \u6478\u9C7C\u4ED9\u4EBA");
@@ -566,7 +620,9 @@ function calculateDayIndices(commits, isWeekend = false) {
566
620
  nightOwl,
567
621
  builder,
568
622
  burst,
569
- density: Math.round(Math.min(100, densityScore)),
623
+ density: Math.round(spreadScore),
624
+ codeVolume,
625
+ totalLines: L,
570
626
  tags
571
627
  };
572
628
  }
@@ -581,11 +637,23 @@ async function getAllCommits(projectPaths, since, until, source) {
581
637
  all = all.concat(gitlabCommits);
582
638
  } catch {
583
639
  }
584
- const seen = /* @__PURE__ */ new Set();
640
+ const seen = /* @__PURE__ */ new Map();
585
641
  const unique = [];
586
642
  for (const c of all) {
587
- if (!seen.has(c.hash)) {
588
- seen.add(c.hash);
643
+ const key = `${c.project}:${c.hash}`;
644
+ const branches = c.branches && c.branches.length > 0 ? c.branches : c.branch && c.branch !== "unknown" ? [c.branch] : [];
645
+ const existing = seen.get(key);
646
+ if (existing) {
647
+ const mergedBranches = /* @__PURE__ */ new Set([
648
+ ...existing.branches || (existing.branch && existing.branch !== "unknown" ? [existing.branch] : []),
649
+ ...branches
650
+ ]);
651
+ existing.branches = Array.from(mergedBranches);
652
+ existing.branch = existing.branches[0] || existing.branch;
653
+ } else {
654
+ c.branches = Array.from(new Set(branches));
655
+ c.branch = c.branches[0] || c.branch;
656
+ seen.set(key, c);
589
657
  unique.push(c);
590
658
  }
591
659
  }
@@ -605,6 +673,12 @@ async function analyzeWeekly(projectPaths, now = /* @__PURE__ */ new Date(), sou
605
673
  const dayCommits = commitsByDay[idx];
606
674
  const projects = Array.from(new Set(dayCommits.map((c) => c.project)));
607
675
  const indices = calculateDayIndices(dayCommits, idx >= 5);
676
+ const branches = new Set(
677
+ dayCommits.flatMap((c) => {
678
+ const commitBranches = c.branches && c.branches.length > 0 ? c.branches : c.branch && c.branch !== "unknown" ? [c.branch] : [];
679
+ return commitBranches.map((branch) => `${c.project}:${branch}`);
680
+ })
681
+ );
608
682
  return {
609
683
  dayName: name,
610
684
  commitsCount: dayCommits.length,
@@ -615,6 +689,9 @@ async function analyzeWeekly(projectPaths, now = /* @__PURE__ */ new Date(), sou
615
689
  builder: indices.builder,
616
690
  burst: indices.burst,
617
691
  density: indices.density,
692
+ codeVolume: indices.codeVolume,
693
+ totalLines: indices.totalLines,
694
+ branchCount: branches.size,
618
695
  tags: indices.tags
619
696
  };
620
697
  });
@@ -656,12 +733,14 @@ async function analyzeWeekly(projectPaths, now = /* @__PURE__ */ new Date(), sou
656
733
  const sumNightOwl = activeDays.reduce((acc, d) => acc + d.nightOwl, 0);
657
734
  const sumBuilder = activeDays.reduce((acc, d) => acc + d.builder, 0);
658
735
  const sumBurst = activeDays.reduce((acc, d) => acc + d.burst, 0);
736
+ const sumCodeVolume = activeDays.reduce((acc, d) => acc + d.codeVolume, 0);
659
737
  const activeCount = activeDays.length || 1;
660
738
  const averageFish = Math.round(sumFish / activeCount);
661
739
  const averageHardworking = Math.round(sumHardworking / activeCount);
662
740
  const averageNightOwl = Math.round(sumNightOwl / activeCount);
663
741
  const averageBuilder = Math.round(sumBuilder / activeCount);
664
742
  const averageBurst = Math.round(sumBurst / activeCount);
743
+ const averageCodeVolume = Math.round(sumCodeVolume / activeCount);
665
744
  return {
666
745
  days,
667
746
  totalCommits: commits.length,
@@ -673,6 +752,7 @@ async function analyzeWeekly(projectPaths, now = /* @__PURE__ */ new Date(), sou
673
752
  averageNightOwl,
674
753
  averageBuilder,
675
754
  averageBurst,
755
+ averageCodeVolume,
676
756
  ghostCommitsCount: ghostCount
677
757
  };
678
758
  }
@@ -706,6 +786,7 @@ async function analyzeMonthly(projectPaths, now = /* @__PURE__ */ new Date(), so
706
786
  let totalNightOwl = 0;
707
787
  let totalBuilder = 0;
708
788
  let totalBurst = 0;
789
+ let totalCodeVolume = 0;
709
790
  const dailyIndices = [];
710
791
  for (let d = 1; d <= maxDay; d++) {
711
792
  const dateStr = `${since.getFullYear()}-${since.getMonth() + 1}-${d}`;
@@ -716,6 +797,7 @@ async function analyzeMonthly(projectPaths, now = /* @__PURE__ */ new Date(), so
716
797
  totalNightOwl += indices.nightOwl;
717
798
  totalBuilder += indices.builder;
718
799
  totalBurst += indices.burst;
800
+ totalCodeVolume += indices.codeVolume;
719
801
  dailyIndices.push({
720
802
  day: d,
721
803
  commitsCount: dayCommits.length,
@@ -723,6 +805,8 @@ async function analyzeMonthly(projectPaths, now = /* @__PURE__ */ new Date(), so
723
805
  hardworking: indices.hardworking,
724
806
  nightOwl: indices.nightOwl,
725
807
  burst: indices.burst,
808
+ codeVolume: indices.codeVolume,
809
+ totalLines: indices.totalLines,
726
810
  tags: indices.tags
727
811
  });
728
812
  }
@@ -731,6 +815,7 @@ async function analyzeMonthly(projectPaths, now = /* @__PURE__ */ new Date(), so
731
815
  const averageNightOwl = Math.round(totalNightOwl / maxDay);
732
816
  const averageBuilder = Math.round(totalBuilder / maxDay);
733
817
  const averageBurst = Math.round(totalBurst / maxDay);
818
+ const averageCodeVolume = Math.round(totalCodeVolume / maxDay);
734
819
  return {
735
820
  totalCommits: commits.length,
736
821
  categories,
@@ -741,6 +826,7 @@ async function analyzeMonthly(projectPaths, now = /* @__PURE__ */ new Date(), so
741
826
  averageNightOwl,
742
827
  averageBuilder,
743
828
  averageBurst,
829
+ averageCodeVolume,
744
830
  dailyIndices
745
831
  };
746
832
  }
@@ -762,100 +848,179 @@ async function getGhostCommits(projectPaths, since, until, source) {
762
848
  }
763
849
 
764
850
  // src/critic.ts
851
+ import chalk from "chalk";
765
852
  var SLACK_HIGH_CRITIQUES = [
766
- "\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\u90FD\u89C4\u5212\u5F97\u4E95\u4E95\u6709\u6761\u3002",
767
- "\u4F60\u7684 Commit \u5217\u8868\u5E72\u51C0\u5F97\u50CF\u521A\u6D17\u8FC7\u7684\u8138\u3002\u84C4\u52BF\u5F85\u53D1\u4E5F\u662F\u4E00\u79CD\u8282\u594F\uFF0C\u671F\u5F85\u4F60\u4E0B\u5468\u79EF\u6512\u7684\u5927\u62DB\uFF01",
768
- "\u770B\u6765\u672C\u5468\u7684\u9879\u76EE\u8FDB\u5165\u4E86\u2018\u517B\u7CBE\u84C4\u9510\u2019\u9636\u6BB5\u2014\u2014\u624B\u673A\u592A\u597D\u73A9\uFF0C\u6216\u8005\u5E8A\u592A\u6696\u548C\u3002\u6478\u9C7C\u6280\u5DE7\u5DF2\u8FBE\u7089\u706B\u7EAF\u9752\u4E4B\u5883\u3002",
769
- "\u4F60\u7684\u63D0\u4EA4\u9891\u7387\u50CF\u6781\u4E86\u9000\u6F6E\u540E\u7684\u6C99\u6EE9\uFF0C\u6BEB\u65E0\u6CE2\u6F9C\u3002\u5EFA\u8BAE\u4E0B\u5468\u7A0D\u5FAE\u52A8\u52A8\u624B\u6307\uFF0C\u8BA9 Git \u56FE\u6807\u91CD\u65B0\u4EAE\u8D77\u6765\u3002",
770
- "\u8FD9\u63D0\u4EA4\u6B21\u6570\uFF0C\u4E24\u53EA\u624B\u90FD\u6570\u5F97\u8FC7\u6765\u3002\u770B\u6765\u662F\u5728\u8DF5\u884C\u2018\u4E0D\u5199\u4EE3\u7801\u5C31\u6CA1\u6709 bug\u2019\u7684\u81F3\u9AD8\u9632\u7EBF\uFF0C\u4E3B\u6253\u4E00\u4E2A\u7A33\u5B57\u5F53\u5934\u3002"
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"
771
860
  ];
772
861
  var SLACK_LOW_CRITIQUES = [
773
- "\u672C\u5468\u7206\u809D\u6307\u6570\u7206\u8868\uFF01\u770B\u5230\u4F60\u8FD9\u5BC6\u5BC6\u9EBB\u9EBB\u7684\u63D0\u4EA4\u8BB0\u5F55\uFF0C\u9694\u58C1\u6D4B\u8BD5\u5C0F\u59D0\u59D0\u7684\u773C\u5708\u7EA2\u4E86\uFF0C\u8FDE\u4F60\u7684\u952E\u76D8\u90FD\u5728\u4E3A\u4F60\u957F\u9E23\u3002",
774
- "\u4F60\u8FD9\u4E48\u62FC\u547D\u5DE5\u4F5C\uFF0C\u4EE3\u7801\u5E93\u7684\u534A\u58C1\u6C5F\u5C71\u90FD\u662F\u4F60\u6253\u4E0B\u6765\u7684\u3002\u4E0B\u5468\u5FC5\u987B\u5B89\u6392\u4E00\u676F\u5976\u8336\uFF0C\u597D\u597D\u7292\u52B3\u4E00\u4E0B\u81EA\u5DF1\uFF01",
775
- "\u5144\u5F1F\uFF0C\u4F60\u8FD9\u5468\u7684\u5DE5\u65F6\u76F4\u63A5\u62C9\u6EE1\u4E86\u3002\u5EFA\u8BAE\u7ED9\u81EA\u5DF1\u653E\u4E2A\u5047\uFF0C\u4EE3\u7801\u53EF\u4EE5\u660E\u5929\u5199\uFF0C\u8EAB\u4F53\u53EF\u6CA1\u6709\u64A4\u9500\u952E\uFF0C\u597D\u597D\u4F11\u606F\u4E00\u4E0B\u3002",
776
- "\u75AF\u72C2\u642C\u7816\uFF0C\u809D\u5929\u809D\u5730\u3002\u4E0D\u4EC5\u5728\u8DDF\u65F6\u95F4\u8D5B\u8DD1\uFF0C\u66F4\u662F\u5728\u7528\u4E00\u5DF1\u4E4B\u529B\u5E2E\u56E2\u961F\u586B\u5E73\u524D\u671F\u7684\u5404\u79CD\u6280\u672F\u5751\uFF0C\u8F9B\u82E6\u4E86\uFF01",
777
- "\u63D0\u4EA4\u6B21\u6570\u591A\u5230\u8BA9\u4EBA\u5FC3\u75BC\u3002\u9879\u76EE\u662F\u957F\u671F\u7684\uFF0C\u8EAB\u4F53\u662F\u81EA\u5DF1\u7684\u3002\u7559\u70B9\u529B\u6C14\uFF0C\u4E0B\u5468\u6211\u4EEC\u7EE7\u7EED\u7EC6\u6C34\u957F\u6D41\u3002"
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"
778
869
  ];
779
870
  var GHOST_CRITIQUES = [
780
- "\u3010\u5E7D\u7075\u63D0\u4EA4\u9884\u8B66\u3011\u6DF1\u591C\u7684 Commit \u95EA\u70C1\u7740\u7EFF\u5149\u3002\u4E0D\u8FC7\u4FEE\u4ED9\u5F52\u4FEE\u4ED9\uFF0C\u7761\u89C9\u4E5F\u662F\u7A0B\u5E8F\u5458\u7684\u91CD\u8981\u6280\u80FD\uFF0C\u5FEB\u53BB\u4F11\u606F\u5427\u3002",
781
- "\u534A\u591C\u4E09\u66F4\u8FD8\u5728\u63D0\u4EA4\u4EE3\u7801\uFF0C\u4F60\u662F\u5728\u548C\u5730\u7403\u53E6\u4E00\u7AEF\u7684\u7A0B\u5E8F\u5458\u6253\u65F6\u5DEE\u6218\uFF0C\u8FD8\u662F\u5728\u4EAB\u53D7\u6DF1\u591C\u65E0\u6253\u6270\u7684\u7075\u611F\u7206\u53D1\uFF1F",
782
- "\u6DF1\u591C 12 \u70B9\u540E\u7684\u63D0\u4EA4\u88AB\u68C0\u6D4B\u5230\uFF01\u4F60\u8FD9\u62FC\u547D\u7684\u67B6\u52BF\uFF0C\u662F\u5728\u7528\u6DF1\u591C\u7684\u7075\u611F\u4E3A\u9879\u76EE\u4FDD\u9A7E\u62A4\u822A\uFF0C\u4F46\u4E5F\u522B\u5FD8\u4E86\u7ED9\u8EAB\u4F53\u5145\u5145\u7535\u3002",
783
- "\u522B\u809D\u4E86\u522B\u809D\u4E86\uFF0C\u6DF1\u591C\u8FD8\u5728\u63D0\u4EA4\uFF0C\u8FDE CI \u673A\u5668\u4EBA\u90FD\u60F3\u529D\u4F60\u65E9\u70B9\u7761\uFF0C\u5FEB\u5B58\u76D8\u4E0B\u73ED\uFF0C\u68A6\u91CC\u6CA1\u6709 bug\u3002"
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"
784
878
  ];
785
879
  var CATEGORY_FIX_CRITIQUES = [
786
- "\u4F60\u5DF2\u7ECF\u6210\u4E3A\u56E2\u961F\u7684\u2018\u804C\u4E1A\u6551\u706B\u961F\u957F\u2019\uFF0C\u5929\u5929\u5728\u4EE3\u7801\u5E93\u91CC\u8003\u53E4\u548C\u6551\u706B\uFF0C\u56E2\u961F\u7684\u7A33\u5B9A\u9632\u7EBF\u5168\u9760\u4F60\u6B7B\u5B88\u3002",
787
- "\u672C\u6708\u4E3B\u8981\u5DE5\u4F5C\u662F\u4FEE Bug\uFF0C\u5360\u6BD4\u9AD8\u8FBE %PERCENT%%\u3002\u662F\u5728\u4E00\u70B9\u70B9\u507F\u8FD8\u6280\u672F\u503A\uFF0C\u4E5F\u662F\u5728\u7ED9\u540E\u6765\u7684\u4EBA\u94FA\u5E73\u9053\u8DEF\u3002",
788
- "\u5929\u5929\u90FD\u5728 fix\uFF0C\u770B\u6765\u8FD9\u4E2A\u6708\u7684\u7CFB\u7EDF\u7A33\u5B9A\u6027\u5168\u9760\u4F60\u5728\u7EBF\u5B88\u62A4\u4E86\uFF0C\u59A5\u59A5\u7684\u5E55\u540E\u82F1\u96C4\u3002",
789
- "\u4EE3\u7801\u5E93\u7684\u6E05\u9053\u592B\uFF0CBug \u7EC8\u7ED3\u8005\u3002\u6BCF\u4FEE\u6389\u4E00\u4E2A\u95EE\u9898\uFF0C\u7CFB\u7EDF\u5C31\u5C11\u4E00\u5206\u9690\u60A3\uFF0C\u5B89\u5168\u611F\u76F4\u63A5\u62C9\u6EE1\u3002"
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"
790
887
  ];
791
888
  var CATEGORY_FEAT_CRITIQUES = [
792
- "\u672C\u6708 Feat \u5360\u6BD4\u9AD8\u8FBE %PERCENT%%\u3002\u65B0\u529F\u80FD\u4E00\u9879\u63A5\u4E00\u9879\uFF0C\u5F00\u53D1\u706B\u529B\u5168\u5F00\uFF0C\u4E1A\u52A1\u7EBF\u56E0\u4F60\u800C\u98DE\u901F\u524D\u8FDB\uFF01",
793
- "\u65B0\u529F\u80FD\u72C2\u9B54\uFF01\u4E0D\u505C\u5730\u63A8\u8FDB\u9700\u6C42\u548C\u65B0\u4E1A\u52A1\u3002\u8F93\u51FA\u62C9\u6EE1\u7684\u540C\u65F6\uFF0C\u4E5F\u522B\u5FD8\u4E86\u5076\u5C14\u56DE\u5934\u6253\u78E8\u4E00\u4E0B\u7EC6\u8282\u3002Btw\uFF1A\u4F60\u8F9B\u82E6\u5566\uFF01",
794
- "\u75AF\u72C2\u8F93\u51FA feature\uFF01\u4EE3\u7801\u5E93\u7684\u8FB9\u754C\u53C8\u88AB\u4F60\u5411\u5916\u62D3\u5C55\u4E86\u4E00\u5708\uFF0C\u59A5\u59A5\u7684\u5F00\u62D3\u5148\u950B\u3002"
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"
795
896
  ];
796
897
  var CATEGORY_CHORE_CRITIQUES = [
797
- "Chore/Docs \u5360\u4E86 %PERCENT%%\u3002\u597D\u7684\u9879\u76EE\u4E0D\u4EC5\u9700\u8981\u4EE3\u7801\uFF0C\u66F4\u9700\u8981\u6709\u4EBA\u628A\u6587\u6863\u6C89\u6DC0\u4E0B\u6765\uFF0C\u524D\u4EBA\u683D\u6811\u540E\u4EBA\u4E58\u51C9\u3002",
798
- "\u5929\u5929\u90FD\u5728\u6539\u914D\u7F6E\u3001\u4FEE\u6587\u6863\u3001\u683C\u5F0F\u5316\u4EE3\u7801\u3002\u4F60\u7B80\u76F4\u662F\u4EE3\u7801\u5E93\u7684\u4F18\u79C0\u56ED\u4E01\uFF0C\u8FD9\u4E9B\u5DE5\u4F5C\u867D\u7136\u4F4E\u8C03\uFF0C\u5374\u8BA9\u9879\u76EE\u53D8\u5F97\u66F4\u5065\u5EB7\u3001\u66F4\u6613\u8BFB\u3002",
799
- "Chore/Docs \u5360\u6BD4\u60CA\u4EBA\uFF0C\u9879\u76EE\u7684\u957F\u671F\u7A33\u5B9A\u8FD0\u884C\uFF0C\u79BB\u4E0D\u5F00\u8FD9\u4E9B\u770B\u4F3C\u4E0D\u8D77\u773C\u4F46\u6781\u4E3A\u5173\u952E\u7684\u7EF4\u62A4\u5DE5\u4F5C\u3002"
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"
800
905
  ];
801
906
  var GENERAL_CRITIQUES = [
802
- "\u4F60\u7684\u63D0\u4EA4\u66F2\u7EBF\u50CF\u5FC3\u7535\u56FE\u4E00\u6837\u5E73\u7F13\uFF0C\u57FA\u672C\u4E0A\u53EA\u5728\u5F00\u4F1A\u524D\u548C\u4E0B\u73ED\u524D\u6709\u6CE2\u52A8\u3002\u5B8C\u7F8E\u5730\u638C\u63E1\u4E86\u5DE5\u4F5C\u4E0E\u4F11\u606F\u7684\u5F8B\u52A8\u3002",
803
- "\u672C\u5468\u7684\u63D0\u4EA4\u96C6\u4E2D\u5728\u7279\u5B9A\u65F6\u95F4\u6BB5\u3002\u4E0A\u5348\u9759\u5982\u5904\u5B50\uFF0C\u4E0B\u5348\u52A8\u5982\u8131\u5154\u3002\u5B8C\u7F8E\u627E\u5230\u4E86\u5C5E\u4E8E\u81EA\u5DF1\u7684\u9AD8\u6548\u7387\u8282\u594F\u3002",
804
- "\u770B\u7740\u4F60\u7684 Git Log\uFF0C\u6211\u4EFF\u4F5B\u770B\u5230\u4E86\u4E00\u4F4D\u8282\u594F\u5927\u5E08\u3002\u4E0D\u7D27\u4E0D\u6162\uFF0C\u5076\u5C14\u843D\u7B14\uFF0C\u5374\u603B\u662F\u6070\u5230\u597D\u5904\u5730\u628A\u5DE5\u4F5C\u5B8C\u6210\u5F97\u65E0\u53EF\u6311\u5254\u3002",
805
- "\u4F60\u8FD9\u661F\u671F\u7684\u63D0\u4EA4\u6570\u636E\u975E\u5E38\u5747\u8861\u2014\u2014\u6BCF\u5929\u90FD\u4FDD\u6301\u7740\u5E73\u7A33\u7684\u8F93\u51FA\u8282\u594F\u3002\u7A33\u624E\u7A33\u6253\uFF0C\u4F60\u5C31\u662F\u56E2\u961F\u91CC\u7684\u5B9A\u6D77\u795E\u9488\u3002"
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"
806
914
  ];
807
915
  var TAG_FISH_MASTER_CRITIQUES = [
808
- "\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\uFF0C\u5B9E\u9645\u4E0A\u8111\u6D77\u91CC\u5DF2\u7ECF\u628A\u5047\u671F\u89C4\u5212\u505A\u597D\u4E86\u3002",
809
- "\u6478\u9C7C\u5B97\u5E08\uFF0C\u6CD5\u529B\u65E0\u8FB9\uFF01\u80FD\u628A\u751F\u4EA7\u529B\u7CBE\u786E\u63A7\u5236\u5728\u521A\u521A\u597D\u7684\u8212\u9002\u5708\uFF0C\u4E5F\u662F\u4E00\u79CD\u8BA9\u4EBA\u7FA1\u6155\u7684\u804C\u573A\u8D85\u80FD\u529B\u3002",
810
- "\u606D\u559C\u83B7\u5F97\u300E\u6478\u9C7C\u5B97\u5E08\u300F\u6210\u5C31\uFF01Git \u7684\u7559\u767D\u662F\u4F60\u7684\u901A\u884C\u8BC1\uFF0C\u5B8C\u7F8E\u7684\u8282\u594F\u5927\u5E08\u5C31\u662F\u4F60\u3002"
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",
919
+ "\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"
811
921
  ];
812
922
  var TAG_VOLUME_KING_CRITIQUES = [
813
- "\u7206\u809D\u6218\u795E\uFF0C\u6050\u6016\u5982\u65AF\uFF01\u4F60\u7684 Git \u65F6\u95F4\u7EBF\u5DF2\u7ECF\u6EE1\u5F97\u50CF\u6625\u8FD0\u706B\u8F66\u7AD9\uFF0C\u5EFA\u8BAE\u7ED9\u952E\u76D8\u4E70\u4E2A\u610F\u5916\u9669\uFF0C\u8F9B\u82E6\u4E86\uFF01",
814
- "\u7206\u809D\u6218\u795E\u5C31\u4F4D\uFF01\u4E00\u4E2A\u4EBA\u9876\u8D77\u4E00\u4E2A\u56E2\u961F\u7684\u4EA7\u51FA\uFF0C\u8FD9\u4E2A\u63D0\u4EA4\u91CF\uFF0C\u611F\u89C9\u4F60\u7684\u624B\u6307\u5DF2\u7ECF\u6572\u51FA\u4E86\u6B8B\u5F71\u3002",
815
- "\u522B\u4EBA\u5728\u4F11\u606F\uFF0C\u4F60\u5728 commit\uFF1B\u522B\u4EBA\u5728\u7761\u89C9\uFF0C\u4F60\u8FD8\u5728 push\u3002\u7206\u809D\u6218\u795E\u5C31\u662F\u4F60\uFF01\u4E0D\u8FC7\u522B\u5FD8\u4E86\uFF0C\u7A0B\u5E8F\u8981\u8DD1\uFF0C\u4EBA\u4E5F\u8981\u597D\u597D\u4F11\u606F\u3002"
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",
924
+ "\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",
926
+ "\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
+ "\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"
816
928
  ];
817
929
  var TAG_NIGHT_OWL_CRITIQUES = [
818
- "\u6DF1\u591C\u4FEE\u4ED9\u8005\uFF0C\u6CD5\u529B\u65E0\u8FB9\uFF01\u51CC\u6668\u7684\u4EE3\u7801\u95EA\u70C1\u7740\u72EC\u7279\u7684\u5149\u8292\uFF0C\u8FDE CI \u8DD1\u901A\u8FC7\u53BB\u7684\u901F\u5EA6\u90FD\u53D8\u5FEB\u4E86\u3002",
819
- "\u6210\u4E3A\u6DF1\u591C\u4FEE\u4ED9\u8005\u610F\u5473\u7740\u4F60\u7684\u6700\u4F73\u5DE5\u4F5C\u65F6\u6BB5\u662F 00:00 ~ 05:00\u3002\u767D\u5929\u5728\u5DE5\u4F4D\u79EF\u6512\u7075\u611F\uFF0C\u665A\u4E0A\u5728\u952E\u76D8\u4E0A\u75AF\u72C2\u8F93\u51FA\uFF0C\u53CC\u91CD\u9891\u7387\u65E0\u7F1D\u5207\u6362\u3002",
820
- "\u4FEE\u4ED9\u5927\u80FD\uFF01\u51CC\u6668\u7684 Git \u8BB0\u5F55\u89C1\u8BC1\u4E86\u4F60\u7684\u575A\u6301\u4E0E\u6267\u7740\u3002\u4E0D\u8FC7\u4FEE\u4ED9\u5F52\u4FEE\u4ED9\uFF0C\u8BB0\u5F97\u7ED9\u81EA\u5DF1\u7559\u8DB3\u7761\u7720\u65F6\u95F4\u3002"
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",
933
+ "\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
+ "\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"
821
935
  ];
822
936
  var TAG_BUILDER_CRITIQUES = [
823
- "\u52E4\u6073\u642C\u7816\u4EBA\uFF0C\u8E0F\u5B9E\u5982\u8001\u9EC4\u725B\uFF01\u6BCF\u4E00\u884C\u4EE3\u7801\u90FD\u662F\u4F60\u7528\u624B\u6572\u51FA\u6765\u7684\uFF0C\u7A33\u624E\u7A33\u6253\uFF0C\u662F\u6574\u4E2A\u9879\u76EE\u6700\u575A\u5B9E\u7684\u5E95\u5EA7\u3002",
824
- "\u642C\u7816\u4EBA\u642C\u7816\u9B42\uFF0C\u4EE3\u7801\u57FA\u5EFA\u5168\u9760\u52E4\u3002\u4F60\u8FD9\u4E2A\u6708\u7684\u4EE3\u7801\u91CF\uFF0C\u5DF2\u7ECF\u9ED8\u9ED8\u4E3A\u9879\u76EE\u780C\u8D77\u4E86\u4E00\u5EA7\u9AD8\u5899\u3002",
825
- "\u52E4\u6073\u642C\u7816\uFF0C\u7A33\u5982\u6CF0\u5C71\u3002\u4E0D\u662F\u6700\u7231\u79C0\u6280\u5DE7\u7684\u90A3\u4E2A\uFF0C\u4F46\u7EDD\u5BF9\u662F\u56E2\u961F\u91CC\u6700\u8BA9\u4EBA\u653E\u5FC3\u7684\u90A3\u9897\u87BA\u4E1D\u9489\u3002\u7EE7\u7EED\u52A0\u6CB9\uFF01"
937
+ "\u52E4\u6073\u642C\u7816\u4EBA\uFF0C\u8E0F\u5B9E\u5982\u8001\u9EC4\u725B\uFF01\u9879\u76EE\u91CC\u6BCF\u4E00\u884C\u843D\u5730\u53EF\u7528\u7684\u4EE3\u7801\u90FD\u662F\u4F60\u4EB2\u624B\u9010\u884C\u6572\u5199\uFF0C\u505A\u4E8B\u7A33\u624E\u7A33\u6253\u4E0D\u6295\u673A\u53D6\u5DE7\uFF0C\u662F\u652F\u6491\u6574\u4E2A\u9879\u76EE\u7A33\u5B9A\u8FD0\u884C\u6700\u575A\u5B9E\u7684\u5E95\u5C42\u5E95\u5EA7\u3002",
938
+ "\u642C\u7816\u4EBA\u642C\u7816\u9B42\uFF0C\u9879\u76EE\u4EE3\u7801\u57FA\u5EFA\u5168\u9760\u52E4\u6073\u642D\u5EFA\u3002\u672C\u6708\u7A33\u5B9A\u6301\u7EED\u8F93\u51FA\u5927\u91CF\u4E1A\u52A1\u4EE3\u7801\uFF0C\u4E00\u6B65\u4E00\u4E2A\u811A\u5370\u9ED8\u9ED8\u4E3A\u9879\u76EE\u7B51\u8D77\u7A33\u56FA\u529F\u80FD\u9AD8\u5899\uFF0C\u9760\u8C31\u7A0B\u5EA6\u62C9\u6EE1\u3002",
939
+ "\u52E4\u6073\u642C\u7816\uFF0C\u7A33\u5982\u6CF0\u5C71\u3002\u4E0D\u8FFD\u9010\u82B1\u54E8\u70AB\u6280\u7684\u5199\u6CD5\uFF0C\u4E13\u6CE8\u5B8C\u6210\u843D\u5730\u53EF\u7528\u7684\u4E1A\u52A1\u903B\u8F91\uFF0C\u662F\u56E2\u961F\u91CC\u6240\u6709\u4EBA\u90FD\u653E\u5FC3\u6258\u4ED8\u9700\u6C42\u7684\u5B9A\u5FC3\u87BA\u4E1D\u9489\uFF0C\u811A\u8E0F\u5B9E\u5730\u7EE7\u7EED\u95EA\u95EA\u53D1\u5149\uFF01",
940
+ "\u4F4E\u8C03\u52A1\u5B9E\u7684\u8D44\u6DF1\u642C\u7816\u9009\u624B\uFF0C\u4E0D\u62A2\u98CE\u5934\u4E0D\u641E\u82B1\u6D3B\uFF0C\u4E13\u6CE8\u592F\u5B9E\u57FA\u7840\u4E1A\u52A1\u80FD\u529B\uFF0C\u6240\u6709\u7E41\u6742\u57FA\u7840\u9700\u6C42\u90FD\u80FD\u7A33\u59A5\u4EA4\u4ED8\uFF0C\u9879\u76EE\u7A33\u5B9A\u8FD0\u884C\u79BB\u4E0D\u5F00\u4F60\u7684\u9ED8\u9ED8\u8015\u8018\u3002",
941
+ "\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"
826
942
  ];
827
943
  var TAG_BURST_CODER_CRITIQUES = [
828
- "\u4E00\u628A\u68AD\u54C8\u578B\u7A0B\u5E8F\u5458\uFF01\u8981\u4E48\u4E0D\u5199\uFF0C\u4E00\u5199\u5C31\u662F\u51E0\u5343\u884C\u3002\u4F60\u7684\u5927\u62DB\u5F0F Git Diff \u8BA9 reviewer \u9ED8\u9ED8\u6CE1\u4E86\u4E00\u676F\u5496\u5561\u51C6\u5907\u7EC6\u7EC6\u54C1\u5473\u3002",
829
- "\u4E00\u628A\u68AD\u54C8\u73A9\u5BB6\uFF01\u5168\u90E8\u9700\u6C42\u4E00\u4E2A commit \u641E\u5B9A\uFF0C\u4EE3\u7801\u5728\u4F60\u7684\u8111\u6D77\u91CC\u65E9\u5DF2\u6210\u578B\uFF0C\u76F4\u63A5\u6765\u4E86\u4E00\u6CE2\u5B8C\u7F8E\u7684 Rush-B \u843D\u5730\u3002",
830
- "\u4E00\u628A\u68AD\u54C8\u827A\u672F\u5BB6\uFF01\u4F60\u7684\u6BCF\u6B21\u63D0\u4EA4\u90FD\u662F\u4E00\u7BC7\u5185\u5BB9\u4E30\u5BCC\u7684\u4E2D\u7BC7\u5C0F\u8BF4\uFF0C\u4E0D\u9E23\u5219\u5DF2\uFF0C\u4E00\u9E23\u60CA\u4EBA\u3002"
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",
946
+ "\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",
948
+ "\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"
831
949
  ];
832
950
  var TAG_PPT_ARCHITECT_CRITIQUES = [
833
- "\u67B6\u6784\u5E08\u98CE\u8303\u9690\u85CF\u6210\u5C31\u89E3\u9501\uFF01\u63D0\u4EA4\u591A\u3001\u6539\u52A8\u5C11\uFF0C\u4F60\u7684 Git \u5386\u53F2\u5C31\u50CF\u4E00\u90E8\u5145\u6EE1\u4EEA\u5F0F\u611F\u7684\u827A\u672F\u54C1\uFF0C\u91CD\u5728\u68B3\u7406\u903B\u8F91\u4E0E\u7ED3\u6784\u3002",
834
- "\u606D\u559C\u83B7\u5F97\u300E\u4F18\u96C5\u67B6\u6784\u5E08\u300F\u79F0\u53F7\uFF01\u6BCF\u4E2A commit \u90FD\u5E26\u7740\u6E05\u6670\u7684\u601D\u8DEF\uFF0C\u91CD\u6784\u4E8E\u65E0\u5F62\u4E4B\u4E2D\uFF0Cdiff \u8F7B\u76C8\u5374\u81F3\u5173\u91CD\u8981\u3002"
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"
835
956
  ];
836
957
  var TAG_FORMAT_MASTER_CRITIQUES = [
837
- "\u683C\u5F0F\u5316\u5927\u5E08\u9690\u85CF\u6210\u5C31\u89E3\u9501\uFF01\u63D0\u4EA4\u4E86 10 \u6B21\uFF0C\u6539\u4E86\u4E0D\u5230 30 \u884C\u2014\u2014\u4F60\u5BF9\u4EE3\u7801\u6D01\u7656\u7684\u575A\u6301\uFF0C\u8BA9\u6574\u4E2A\u9879\u76EE\u7115\u7136\u4E00\u65B0\u3002",
838
- "\u683C\u5F0F\u5316\u5927\u5E08\uFF01\u51E0\u5341\u6B21\u63D0\u4EA4\u5168\u662F\u6539\u7A7A\u683C\u3001\u52A0\u6CE8\u91CA\u3001\u8C03\u7F29\u8FDB\u3002\u4EE3\u7801\u5E93\u7684\u989C\u503C\u88AB\u4F60\u62C9\u5230\u4E86\u5DC5\u5CF0\uFF0C\u53EF\u8BFB\u6027\u5927\u5927\u63D0\u5347\uFF01"
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",
961
+ "\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
+ "\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"
839
963
  ];
840
964
  var TAG_GIT_CHATTER_CRITIQUES = [
841
- "Git \u8BB0\u5F55\u8FBE\u4EBA\u9690\u85CF\u6210\u5C31\uFF0115 \u6B21\u63D0\u4EA4\uFF0C\u5E73\u5747\u6BCF\u6B21\u4E0D\u5230 2 \u884C\u2014\u2014\u4F60\u662F\u5728\u7528 Git \u8BB0\u5F55\u81EA\u5DF1\u7684\u5FC3\u8DEF\u5386\u7A0B\u5417\uFF1F\u7EC6\u9897\u7C92\u5EA6\u7684\u63D0\u4EA4\u8BA9\u7248\u672C\u56DE\u6EDA\u6BEB\u65E0\u538B\u529B\uFF01",
842
- "Git \u8BB0\u5F55\u8FBE\u4EBA\uFF01\u628A commit \u5206\u62C6\u5F97\u6781\u5176\u7EC6\u817B\uFF0C\u5C31\u50CF\u5728\u5199\u5B9E\u65F6\u65E5\u5FD7\u3002\u8FD9\u79CD\u9AD8\u9891\u5FAE\u8C03\u7684\u4E60\u60EF\uFF0C\u8BA9\u4EE3\u7801\u8FFD\u8E2A\u53D8\u5F97\u7B80\u5355\u660E\u4E86\u3002"
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",
967
+ "\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
+ "\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
+ "\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"
843
970
  ];
844
971
  var TAG_NIGHT_ASSASSIN_CRITIQUES = [
845
- "\u6DF1\u591C\u523A\u5BA2\u9690\u85CF\u6210\u5C31\uFF01\u4FEE\u4ED9\u6307\u6570\u7206\u8868\u4F46\u63D0\u4EA4\u6781\u5176\u7CBE\u70BC\u2014\u2014\u4F60\u662F\u534A\u591C\u9876\u7740\u591C\u8272\u5077\u5077\u4E0A\u7EBF\u641E\u5B9A\u6838\u5FC3 bug\uFF0C\u6DF1\u85CF\u529F\u4E0E\u540D\u3002",
846
- "\u6DF1\u591C\u523A\u5BA2\uFF01\u5BE5\u5BE5\u51E0\u6B21\u63D0\u4EA4\u5168\u5728\u51CC\u6668\uFF0C\u767D\u5929\u95ED\u76EE\u517B\u795E\uFF0C\u534A\u591C\u4E00\u51FB\u5FC5\u6740\uFF0C\u53CC\u9762\u6781\u5BA2\u4EBA\u751F\u5C5E\u5B9E\u7CBE\u5F69\u3002"
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",
974
+ "\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"
847
977
  ];
848
978
  var TAG_DONKEY_CRITIQUES = [
849
- "\u5168\u80FD\u6218\u795E\u9690\u85CF\u6210\u5C31\u89E3\u9501\uFF01\u5468\u672B\u7206\u809D + \u6DF1\u591C\u4FEE\u4ED9\u3002Git \u5DF2\u7ECF\u8BB0\u4F4F\u4E86\u4F60\u7684\u6BCF\u4E00\u5206\u52AA\u529B\u4E0E\u4ED8\u51FA\uFF0C\u4F46\u4E5F\u5E0C\u671B\u4F60\u522B\u5FD8\u4E86\u597D\u597D\u7167\u987E\u81EA\u5DF1\u3002",
850
- "\u5468\u672B\u548C\u6DF1\u591C\u90FD\u7559\u4E0B\u4E86\u4F60\u7684\u8DB3\u8FF9\uFF0C\u8FD9\u4EFD\u8D23\u4EFB\u611F\u4E0E\u575A\u6301\u5DF2\u7ECF\u62C9\u6EE1\u3002\u8F9B\u82E6\u4ED8\u51FA\u7684\u540C\u65F6\uFF0C\u4E5F\u8BF7\u4E00\u5B9A\u8981\u7559\u51FA\u65F6\u95F4\u597D\u597D\u751F\u6D3B\u3002"
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",
980
+ "\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",
983
+ "\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"
851
984
  ];
852
985
  var TAG_FISH_IMMORTAL_CRITIQUES = [
853
- "\u6478\u9C7C\u4ED9\u4EBA\u9690\u85CF\u6210\u5C31\uFF01\u6478\u9C7C\u6307\u6570\u7A81\u7834 95%\uFF0C\u4E00\u5929\u53EA\u63D0\u4EA4 0 \u6216 1 \u6B21\u2014\u2014\u4F60\u5DF2\u7ECF\u8D85\u8D8A\u4E86\u666E\u901A\u7684\u6478\u9C7C\uFF0C\u8FBE\u5230\u4E86\u65E0\u62DB\u80DC\u6709\u62DB\u7684\u65E0\u4E3A\u5883\u754C\u3002",
854
- "\u6478\u9C7C\u4ED9\u4EBA\uFF0C\u5883\u754C\u5DF2\u8D85\u51E1\u4EBA\uFF01\u5BE5\u5BE5\u4E00\u6B21\u63D0\u4EA4\uFF0C\u9AD8\u8FBE 95%+ \u7684\u6DE1\u5B9A\u7387\u3002\u7528\u6700\u5C11\u7684\u52A8\u4F5C\u7EF4\u6301\u7CFB\u7EDF\u7684\u8FD0\u8F6C\uFF0C\u4E0D\u6127\u662F\u4E16\u5916\u9AD8\u4EBA\u3002"
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",
988
+ "\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
+ "\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"
855
991
  ];
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
+ }
856
1021
  function getRandomItem(arr) {
857
1022
  const idx = Math.floor(Math.random() * arr.length);
858
- return arr[idx];
1023
+ return colorizeCriticTags(arr[idx]);
859
1024
  }
860
1025
  function getAICritic(weeklyStats) {
861
1026
  const parts = [];
@@ -871,6 +1036,7 @@ function getAICritic(weeklyStats) {
871
1036
  }
872
1037
  const tagCritics = getTagCriticsFromDays(weeklyStats.days);
873
1038
  if (tagCritics.length > 0) {
1039
+ parts.push("\u2500".repeat(50));
874
1040
  parts.push(...tagCritics.slice(0, 2));
875
1041
  }
876
1042
  if (parts.length === 0) {
@@ -964,7 +1130,7 @@ function showLoading(message) {
964
1130
  let frameIdx = 0;
965
1131
  process.stdout.write("\x1B[?25l");
966
1132
  const timer = setInterval(() => {
967
- process.stdout.write(`\r${chalk.cyan(SPINNER_FRAMES[frameIdx])} ${chalk.yellow(message)} `);
1133
+ process.stdout.write(`\r${chalk2.cyan(SPINNER_FRAMES[frameIdx])} ${chalk2.yellow(message)} `);
968
1134
  frameIdx = (frameIdx + 1) % SPINNER_FRAMES.length;
969
1135
  }, 150);
970
1136
  return {
@@ -979,41 +1145,57 @@ function showLoading(message) {
979
1145
  };
980
1146
  }
981
1147
  function printBanner(title) {
982
- console.log(chalk.cyan.bold("\n" + "=".repeat(50)));
983
- console.log(chalk.blue.bold(` \u{1F41F} FISH - ${title}`));
984
- console.log(chalk.cyan.bold("=".repeat(50) + "\n"));
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"));
985
1151
  }
986
1152
  function formatSlackIndex(fish) {
987
1153
  if (fish >= 90) {
988
- return chalk.green(`${fish}% (\u7EC8\u6781\u6478\u9C7C \u{1F3A3})`);
1154
+ return chalk2.green(`${fish}% (\u7EC8\u6781\u6478\u9C7C \u{1F3A3})`);
989
1155
  } else if (fish >= 70) {
990
- return chalk.green(`${fish}% (\u5408\u7406\u5212\u6C34 \u2615)`);
1156
+ return chalk2.green(`${fish}% (\u5408\u7406\u5212\u6C34 \u2615)`);
991
1157
  } else if (fish >= 40) {
992
- return chalk.yellow(`${fish}% (\u6B63\u5E38\u8425\u4E1A \u{1F4BB})`);
1158
+ return chalk2.yellow(`${fish}% (\u6B63\u5E38\u8425\u4E1A \u{1F4BB})`);
993
1159
  } else {
994
- return chalk.red(`${fish}% (\u706B\u529B\u5168\u5F00 \u{1F525})`);
1160
+ return chalk2.red(`${fish}% (\u706B\u529B\u5168\u5F00 \u{1F525})`);
995
1161
  }
996
1162
  }
997
1163
  function formatNightOwlIndex(nightOwl) {
998
1164
  if (nightOwl >= 60) {
999
- return chalk.red.bold(`${nightOwl}% (\u4FEE\u4ED9\u5927\u4F6C \u{1F9D9})`);
1165
+ return chalk2.red.bold(`${nightOwl}% (\u4FEE\u4ED9\u5927\u4F6C \u{1F9D9})`);
1000
1166
  } else if (nightOwl >= 30) {
1001
- return chalk.red(`${nightOwl}% (\u591C\u732B\u51FA\u6CA1 \u{1F989})`);
1167
+ return chalk2.red(`${nightOwl}% (\u591C\u732B\u51FA\u6CA1 \u{1F989})`);
1002
1168
  } else if (nightOwl >= 10) {
1003
- return chalk.yellow(`${nightOwl}% (\u5076\u5C14\u71AC\u591C \u{1F319})`);
1169
+ return chalk2.yellow(`${nightOwl}% (\u5076\u5C14\u71AC\u591C \u{1F319})`);
1004
1170
  } else {
1005
1171
  return "";
1006
1172
  }
1007
1173
  }
1008
1174
  function formatOvertimeIndex(fish) {
1009
1175
  if (fish >= 80) {
1010
- return chalk.green(`${fish}% (\u5468\u672B\u6478\u9C7C \u{1F3A3})`);
1176
+ return chalk2.green(`${fish}% (\u5468\u672B\u6478\u9C7C \u{1F3A3})`);
1011
1177
  } else if (fish >= 50) {
1012
- return chalk.yellow(`${fish}% (\u8F7B\u5FAE\u52A0\u73ED \u{1F319})`);
1178
+ return chalk2.yellow(`${fish}% (\u8F7B\u5FAE\u52A0\u73ED \u{1F319})`);
1013
1179
  } else if (fish >= 20) {
1014
- return chalk.red(`${fish}% (\u5468\u672B\u7206\u809D \u{1F525})`);
1180
+ return chalk2.red(`${fish}% (\u5468\u672B\u7206\u809D \u{1F525})`);
1181
+ } else {
1182
+ return chalk2.red.bold(`${fish}% (\u7EC8\u6781\u7206\u809D \u2620\uFE0F)`);
1183
+ }
1184
+ }
1185
+ function formatCodeVolume(totalLines) {
1186
+ if (totalLines <= 0) return "";
1187
+ if (totalLines >= 1e3) {
1188
+ return chalk2.red.bold(`${totalLines}\u884C (\u4EE3\u7801\u6838\u7206 \u2622\uFE0F)`);
1189
+ } else if (totalLines >= 500) {
1190
+ return chalk2.magenta(`${totalLines}\u884C (\u642C\u7816\u72C2\u9B54 \u{1F69A})`);
1191
+ } else if (totalLines >= 200) {
1192
+ return chalk2.yellow(`${totalLines}\u884C (\u5927\u578B\u6539\u52A8 \u{1F9F1})`);
1193
+ } else if (totalLines >= 80) {
1194
+ return chalk2.cyan(`${totalLines}\u884C (\u6B63\u5E38\u8425\u4E1A \u{1F4E6})`);
1195
+ } else if (totalLines >= 20) {
1196
+ return chalk2.green(`${totalLines}\u884C (\u7F1D\u7F1D\u8865\u8865 \u{1F527})`);
1015
1197
  } else {
1016
- return chalk.red.bold(`${fish}% (\u7EC8\u6781\u7206\u809D \u2620\uFE0F)`);
1198
+ return chalk2.gray(`${totalLines}\u884C (\u5C0F\u4FEE\u5C0F\u8865 \u270F\uFE0F)`);
1017
1199
  }
1018
1200
  }
1019
1201
  function getPersonalityTag(day) {
@@ -1021,18 +1203,18 @@ function getPersonalityTag(day) {
1021
1203
  }
1022
1204
  function colorizeTags(tagStr) {
1023
1205
  const colorMap = {
1024
- "\u{1F41F} \u6478\u9C7C\u5B97\u5E08": chalk.green,
1025
- "\u{1F525} \u7206\u809D\u6218\u795E": chalk.red.bold,
1026
- "\u{1F319} \u6DF1\u591C\u4FEE\u4ED9\u8005": chalk.red,
1027
- "\u{1F9F1} \u52E4\u6073\u642C\u7816\u4EBA": chalk.yellow,
1028
- "\u{1F4A5} \u4E00\u628A\u68AD\u54C8\u578B\u7A0B\u5E8F\u5458": chalk.magenta,
1029
- "\u{1F3F7}\uFE0F PPT \u67B6\u6784\u5E08": chalk.blue,
1030
- "\u{1F3F7}\uFE0F \u683C\u5F0F\u5316\u5927\u5E08": chalk.cyan,
1031
- "\u{1F3F7}\uFE0F Git \u804A\u5929\u8FBE\u4EBA": chalk.greenBright,
1032
- "\u{1F3F7}\uFE0F \u6DF1\u591C\u523A\u5BA2": chalk.redBright,
1033
- "\u{1F3F7}\uFE0F \u751F\u4EA7\u961F\u7684\u9A74": chalk.yellowBright,
1034
- "\u{1F3F7}\uFE0F \u6478\u9C7C\u4ED9\u4EBA": chalk.green.bold,
1035
- "\u{1F41F} \u4ECA\u65E5\u6682\u65E0\u4EE3\u7801\u6D3B\u52A8": chalk.green
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
1036
1218
  };
1037
1219
  const sortedKeys = Object.keys(colorMap).sort((a, b) => b.length - a.length);
1038
1220
  let result = tagStr;
@@ -1070,11 +1252,11 @@ function colorizeFishRow(row) {
1070
1252
  if (isNaN(val)) {
1071
1253
  result += chunk;
1072
1254
  } else if (val >= 80) {
1073
- result += chalk.green(chunk);
1074
- } else if (val >= 50) {
1075
- result += chalk.yellow(chunk);
1255
+ result += chalk2.green(chunk);
1256
+ } else if (val >= 40) {
1257
+ result += chalk2.yellow(chunk);
1076
1258
  } else {
1077
- result += chalk.red(chunk);
1259
+ result += chalk2.red(chunk);
1078
1260
  }
1079
1261
  }
1080
1262
  return result;
@@ -1095,61 +1277,61 @@ function randomPick(arr) {
1095
1277
  return arr[Math.floor(Math.random() * arr.length)];
1096
1278
  }
1097
1279
  var COMMENT_POOLS = {
1098
- "0-2": { color: chalk.red, tags: [
1280
+ "0-2": { color: chalk2.red, tags: [
1099
1281
  "\u670D\u52A1\u5668\u548C\u4F60\uFF0C\u603B\u5F97\u6709\u4E00\u4E2A\u7761\u89C9 \u{1F635}\u200D\u{1F4AB}",
1100
1282
  "\u591C\u732B\u4FEE\u4ED9 \u{1F9D9}",
1101
1283
  "\u8FD9\u63D0\u4EA4\u4E0D\u50CF\u5DE5\u4F5C\uFF0C\u50CF\u62A5\u590D\u4EE3\u7801 \u{1F608}",
1102
1284
  "\u6DF1\u591C\u4FEE\u4ED9\u578B\u7A0B\u5E8F\u5458 \u{1F319}"
1103
1285
  ] },
1104
- "3-5": { color: chalk.redBright, tags: [
1286
+ "3-5": { color: chalk2.redBright, tags: [
1105
1287
  "\u960E\u738B\uFF1A\u600E\u4E48\u53C8\u662F\u4F60\uFF1F\u{1F47B}",
1106
1288
  "\u751F\u7269\u949F\u5DF2\u9635\u4EA1 \u2620\uFE0F",
1107
1289
  "\u54E5\uFF0C\u4F60\u662F\u4F4F\u516C\u53F8\u4E86\u5417 \u{1F3E2}",
1108
1290
  "\u9E21\u9E23\u5373\u8D77\u578B\u725B\u9A6C \u{1F414}"
1109
1291
  ] },
1110
- "6-8": { color: chalk.gray, tags: [
1292
+ "6-8": { color: chalk2.gray, tags: [
1111
1293
  "\u9E21\u90FD\u6CA1\u8D77\uFF0C\u4F60\u5148\u4E0A\u73ED\u4E86 \u{1F414}",
1112
1294
  "\u5929\u9009\u725B\u9A6C\u5DF2\u4E0A\u7EBF \u{1F402}",
1113
1295
  "\u7206\u809D\u542F\u52A8\u6210\u529F \u{1F680}",
1114
1296
  "\u65E9\u8D77\u7684 commit \u6709 bug \u5403 \u{1F41B}"
1115
1297
  ] },
1116
- "9-11": { color: chalk.yellow, tags: [
1298
+ "9-11": { color: chalk2.yellow, tags: [
1117
1299
  "\u5047\u88C5\u5F88\u5FD9\uFF0C\u5176\u5B9E\u5728\u7B49\u5348\u996D \u{1F371}",
1118
1300
  "\u6668\u95F4coding \u2615",
1119
1301
  "\u6B63\u5E38\u4EBA\u7C7B\u5DE5\u4F5C\u65F6\u95F4 \u2705",
1120
1302
  "\u4E0A\u5348\u8868\u6F14\u578B\u9009\u624B \u{1F680}"
1121
1303
  ] },
1122
- "12-13": { color: chalk.green, tags: [
1304
+ "12-13": { color: chalk2.green, tags: [
1123
1305
  "\u5DE5\u4F4D\u5403\u996D\uFF0C\u7075\u9B42\u7EED\u547D \u{1F50B}",
1124
1306
  "\u5E72\u996D\u662F\u7B2C\u4E00\u751F\u4EA7\u529B \u{1F35A}",
1125
1307
  "\u4E00\u8FB9\u5403\u996D\u4E00\u8FB9 commit \u{1F35C}",
1126
1308
  "\u5E72\u996D\u7EED\u547D\u578B\u5DE5\u7A0B\u5E08 \u{1F371}"
1127
1309
  ] },
1128
- "14-15": { color: chalk.cyan, tags: [
1310
+ "14-15": { color: chalk2.cyan, tags: [
1129
1311
  "\u5348\u7761\u672A\u9192\uFF0C\u4EBA\u5DF2\u5F00\u5DE5 \u{1F62A}",
1130
1312
  "CPU \u91CD\u542F\u4E2D \u{1F504}",
1131
1313
  // '午觉没睡成,拿代码出气 💢',
1132
1314
  "\u5348\u540E\u7075\u9B42\u51FA\u7A8D\u8005 \u{1F47B}"
1133
1315
  ] },
1134
- "16-17": { color: chalk.cyanBright, tags: [
1316
+ "16-17": { color: chalk2.cyanBright, tags: [
1135
1317
  "\u5F00\u59CB\u601D\u8003\u4ECA\u665A\u5403\u4EC0\u4E48 \u{1F373}",
1136
1318
  "\u7075\u9B42\u5DF2\u4E0B\u73ED \u{1F47B}",
1137
1319
  "\u4E34\u8FD1\u4E0B\u73ED\u7A81\u7136\u52E4\u594B \u{1F914}",
1138
1320
  "\u7B49\u4E0B\u73ED\u89C2\u5BDF\u5458 \u{1F375}"
1139
1321
  ] },
1140
- "18-20": { color: chalk.magenta, tags: [
1322
+ "18-20": { color: chalk2.magenta, tags: [
1141
1323
  "\u52A0\u73ED\u662F\u4E0D\u53EF\u80FD\u4E3B\u52A8\u52A0\u73ED\u7684 \u{1F4BC}",
1142
1324
  "\u5DE5\u4F4D\u5C01\u5370\u89E3\u9664 \u{1F513}",
1143
1325
  "\u767D\u5929\u5728\u5F00\u4F1A\uFF0C\u665A\u4E0A\u771F\u5E72\u6D3B \u{1F4BB}",
1144
1326
  "\u81EA\u613F\uFF08\u88AB\u8FEB\uFF09\u52A0\u73ED\u4EBA \u{1F4AA}"
1145
1327
  ] },
1146
- "21-22": { color: chalk.magentaBright, tags: [
1328
+ "21-22": { color: chalk2.magentaBright, tags: [
1147
1329
  "\u8001\u677F\u4E0B\u73ED\u4E86\uFF0C\u4F60\u8FD8\u6CA1\u4E0B\u7EBF \u{1F62D}",
1148
1330
  "\u52A0\u73ED\u4ED9\u4EBA\u6E21\u52AB\u4E2D \u26A1",
1149
1331
  "\u4ECA\u65E5\u6700\u540E\u4E00\u4E2A commit\uFF08\u9A97\u81EA\u5DF1\uFF09\u{1F921}",
1150
1332
  "\u5927\u798F\u62A5\u65F6\u95F4 \u{1F525}"
1151
1333
  ] },
1152
- "23": { color: chalk.red, tags: [
1334
+ "23": { color: chalk2.red, tags: [
1153
1335
  "\u4EE3\u7801\u548C\u5934\u53D1\u4E00\u8D77\u6389\u5149\u4E2D \u{1F9D1}\u200D\u{1F9B2}",
1154
1336
  "\u4ECA\u65E5 KPI\uFF1A\u6D3B\u7740\u5C31\u884C \u{1F60C}",
1155
1337
  "\u7761\u5427\uFF0CGit \u4E0D\u4F1A\u8DD1 \u{1F6CC}",
@@ -1170,7 +1352,7 @@ function getHourTag(hour) {
1170
1352
  else pool = COMMENT_POOLS["23"];
1171
1353
  return pool.color(` (${randomPick(pool.tags)})`);
1172
1354
  }
1173
- async function runWeeklyReport(weeksAgo, source) {
1355
+ async function runWeeklyReport(weeksAgo, source, showProjects = false) {
1174
1356
  const projects = getProjects();
1175
1357
  let timeTag = "";
1176
1358
  if (weeksAgo === 1) timeTag = " \u4E0A\u5468";
@@ -1186,11 +1368,11 @@ async function runWeeklyReport(weeksAgo, source) {
1186
1368
  const config = readConfig();
1187
1369
  const hasGitLab = config.gitlabToken || config.gitlabs && config.gitlabs.length > 0;
1188
1370
  if (!hasGit && config.projects.length === 0 && !hasGitLab) {
1189
- console.log(chalk.yellow(`\u26A0 \u63D0\u793A: \u5F53\u524D\u5DE5\u4F5C\u76EE\u5F55\u4E0D\u662F\u4E00\u4E2A Git \u4ED3\u5E93\u3002`));
1190
- console.log(chalk.gray(`\u4F60\u53EF\u4EE5\u901A\u8FC7\u4EE5\u4E0B\u547D\u4EE4\u914D\u7F6E\u9879\u76EE\u6216 GitLab\uFF1A`));
1191
- console.log(` ${chalk.cyan("fish config add <path>")} - \u624B\u52A8\u6DFB\u52A0\u672C\u5730\u4ED3\u5E93`);
1192
- console.log(` ${chalk.cyan("fish config scan <dir>")} - \u81EA\u52A8\u626B\u63CF\u76EE\u5F55\u4E0B\u6240\u6709\u4ED3\u5E93`);
1193
- console.log(` ${chalk.cyan("fish config gitlab <token> [host] [name]")} - \u914D\u7F6E GitLab \u4EE4\u724C\u4EE5\u8FDC\u7A0B\u540C\u6B65\u6240\u6709\u9879\u76EE
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
1194
1376
  `);
1195
1377
  }
1196
1378
  }
@@ -1203,7 +1385,7 @@ async function runWeeklyReport(weeksAgo, source) {
1203
1385
  const loading = showLoading("\u6B63\u5728\u6478\u904D\u6240\u6709\u4ED3\u5E93...");
1204
1386
  const stats = await analyzeWeekly(projects, targetDate, source);
1205
1387
  loading.stop();
1206
- console.log(chalk.cyan.bold("\u{1F4C5} \u672C\u5468\u63D0\u4EA4\u8BE6\u60C5\uFF1A"));
1388
+ console.log(chalk2.cyan.bold("\u{1F4C5} \u672C\u5468\u63D0\u4EA4\u8BE6\u60C5\uFF1A"));
1207
1389
  stats.days.forEach((day, idx) => {
1208
1390
  const isWeekend = idx >= 5;
1209
1391
  const isFuture = idx > currentDayOfWeek;
@@ -1211,27 +1393,31 @@ async function runWeeklyReport(weeksAgo, source) {
1211
1393
  return;
1212
1394
  }
1213
1395
  if (isFuture && day.commitsCount === 0) {
1214
- console.log(` ${day.dayName}\uFF1A${chalk.gray("\u672A\u5230")}`);
1396
+ console.log(` ${day.dayName}\uFF1A${chalk2.gray("\u672A\u5230")}`);
1215
1397
  } else {
1216
- const projStr = day.projects.length > 0 ? ` | ${day.projects.length}\u4E2A\u9879\u76EE (${day.projects.join(", ")})` : "";
1217
- const commitStr = day.commitsCount > 0 ? chalk.white.bold(`${day.commitsCount} \u6B21`) : "0 \u6B21";
1398
+ const projStr = day.projects.length > 0 ? ` | ${day.projects.length}\u4E2A\u9879\u76EE${showProjects ? ` (${day.projects.join(", ")})` : ""}` : "";
1399
+ const commitStr = day.commitsCount > 0 ? chalk2.white.bold(`${day.commitsCount} \u6B21`) : "0 \u6B21";
1218
1400
  const indices = [];
1219
1401
  if (isWeekend) {
1220
1402
  indices.push(`\u{1F4BC} \u52A0\u73ED\u6307\u6570: ${formatOvertimeIndex(day.fish)}`);
1221
1403
  } else {
1222
1404
  indices.push(`\u{1F41F} \u6478\u9C7C\u6307\u6570: ${formatSlackIndex(day.fish)}`);
1223
1405
  }
1406
+ if (day.totalLines > 0) {
1407
+ indices.push(`\u{1F9F1} \u4EE3\u7801\u91CF: ${formatCodeVolume(day.totalLines)}`);
1408
+ }
1224
1409
  if (day.nightOwl >= 10) {
1225
1410
  const nightStr = formatNightOwlIndex(day.nightOwl);
1226
1411
  if (nightStr) indices.push(`\u{1F319} \u4FEE\u4ED9\u6307\u6570: ${nightStr}`);
1227
1412
  }
1228
1413
  const extraIndices = indices.length > 0 ? ` | ${indices.join(" | ")}` : "";
1414
+ const branchStr = day.branchCount > 0 ? ` | \u{1F33F} ${day.branchCount}\u4E2A\u5206\u652F` : "";
1229
1415
  const tag = getPersonalityTag(day);
1230
1416
  const tagStr = tag ? ` \u{1F3F7} ${colorizeTags(tag)}` : "";
1231
- console.log(` ${day.dayName}\uFF1A${commitStr}${extraIndices}${projStr}${tagStr}`);
1417
+ console.log(` ${day.dayName}\uFF1A${commitStr}${extraIndices}${projStr}${branchStr}${tagStr}`);
1232
1418
  }
1233
1419
  });
1234
- console.log("\n" + chalk.gray("-".repeat(50)));
1420
+ console.log("\n" + chalk2.gray("-".repeat(50)));
1235
1421
  if (stats.totalCommits > 0) {
1236
1422
  const activeDays = stats.days.filter((_, idx) => idx <= currentDayOfWeek);
1237
1423
  const workingDays = activeDays.filter((d) => d.commitsCount > 0);
@@ -1243,7 +1429,7 @@ async function runWeeklyReport(weeksAgo, source) {
1243
1429
  const sample = mostProductiveDays[0];
1244
1430
  const isWeekend = sample.dayName === "\u5468\u516D" || sample.dayName === "\u5468\u65E5";
1245
1431
  const label = isWeekend ? "\u{1F4BC} \u52A0\u73ED\u6307\u6570" : "\u{1F41F} \u6478\u9C7C\u6307\u6570";
1246
- console.log(`\u{1F3C6} ${chalk.red.bold("\u6700\u52AA\u529B\u7684\u65E5\u5B50")}\uFF1A${names} | ${label}\uFF1A${sample.fish}%`);
1432
+ console.log(`\u{1F3C6} ${chalk2.red.bold("\u6700\u52AA\u529B\u7684\u65E5\u5B50")}\uFF1A${names} | ${label}\uFF1A${sample.fish}%`);
1247
1433
  }
1248
1434
  }
1249
1435
  const weekdayDays = activeDays.filter((d) => d.dayName !== "\u5468\u516D" && d.dayName !== "\u5468\u65E5");
@@ -1257,7 +1443,7 @@ async function runWeeklyReport(weeksAgo, source) {
1257
1443
  if (maxFish >= 70 && filteredHappyDays.length > 0) {
1258
1444
  const names = filteredHappyDays.map((d) => d.dayName).join("\u3001");
1259
1445
  const sample = filteredHappyDays[0];
1260
- console.log(`\u2615 ${chalk.green.bold("\u6700\u5FEB\u4E50\u7684\u65E5\u5B50")}\uFF1A${names} | \u{1F41F} \u6478\u9C7C\u6307\u6570\uFF1A${sample.fish}%`);
1446
+ console.log(`\u2615 ${chalk2.green.bold("\u6700\u5FEB\u4E50\u7684\u65E5\u5B50")}\uFF1A${names} | \u{1F41F} \u6478\u9C7C\u6307\u6570\uFF1A${sample.fish}%`);
1261
1447
  }
1262
1448
  }
1263
1449
  const weekendDays = activeDays.filter((d) => d.commitsCount > 0 && (d.dayName === "\u5468\u516D" || d.dayName === "\u5468\u65E5"));
@@ -1266,16 +1452,16 @@ async function runWeeklyReport(weeksAgo, source) {
1266
1452
  const painfulDays = weekendDays.filter((d) => d.fish === minFish);
1267
1453
  const names = painfulDays.map((d) => d.dayName).join("\u3001");
1268
1454
  const sample = painfulDays[0];
1269
- console.log(`\u{1F62D} ${chalk.magenta.bold("\u6700\u75DB\u82E6\u7684\u65E5\u5B50")}\uFF1A${names} | \u{1F4BC} \u52A0\u73ED\u6307\u6570\uFF1A${sample.fish}%`);
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}%`);
1270
1456
  }
1271
- console.log(chalk.gray("-".repeat(50)));
1457
+ console.log(chalk2.gray("-".repeat(50)));
1272
1458
  const avgNightStr = stats.averageNightOwl > 0 ? ` | \u{1F319} \u4FEE\u4ED9: ${stats.averageNightOwl}%` : "";
1273
- console.log(chalk.dim(`\u{1F4CA} \u672C\u5468\u5747\u503C\uFF1A\u{1F41F} \u6478\u9C7C ${stats.averageFish}%${avgNightStr}`));
1274
- console.log(chalk.gray("-".repeat(50)));
1275
- console.log(`\u{1F916} ${chalk.magenta.bold("\u9510\u8BC4")}\uFF1A`);
1276
- console.log(chalk.white(getAICritic(stats)));
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)));
1277
1463
  } else {
1278
- 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"));
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"));
1279
1465
  }
1280
1466
  console.log("");
1281
1467
  }
@@ -1295,26 +1481,26 @@ async function runMonthlyReport(monthsAgo, source) {
1295
1481
  const stats = await analyzeMonthly(projects, targetDate, source);
1296
1482
  loading.stop();
1297
1483
  if (stats.totalCommits === 0) {
1298
- 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"));
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"));
1299
1485
  return;
1300
1486
  }
1301
1487
  const { fix, feat, chore, other } = stats.categories;
1302
1488
  const total = fix + feat + chore + other;
1303
- console.log(chalk.cyan.bold("\u{1F4C5} \u672C\u6708\u4E3B\u8981\u8D21\u732E\u5360\u6BD4 (\u57FA\u4E8E Commit Message \u6B63\u5219\u5F52\u7C7B)\uFF1A"));
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"));
1304
1490
  function drawRow(label, count, colorFn) {
1305
1491
  const percentage = total > 0 ? Math.round(count / total * 100) : 0;
1306
1492
  const barWidth = 15;
1307
1493
  const filled = Math.round(percentage / 100 * barWidth);
1308
1494
  const empty = barWidth - filled;
1309
- const barStr = colorFn("\u25A0".repeat(filled)) + chalk.gray("\u25A1".repeat(empty));
1310
- console.log(` - ${label}\uFF1A[${barStr}] ${chalk.bold(percentage + "%")} (${count} \u6B21)`);
1495
+ const barStr = colorFn("\u25A0".repeat(filled)) + chalk2.gray("\u25A1".repeat(empty));
1496
+ console.log(` - ${label}\uFF1A[${barStr}] ${chalk2.bold(percentage + "%")} (${count} \u6B21)`);
1311
1497
  }
1312
- drawRow("\u4FEE bug (fix) ", fix, chalk.red);
1313
- drawRow("\u65B0\u529F\u80FD (feat) ", feat, chalk.green);
1314
- drawRow("\u6742\u52A1\u4E0E\u6587\u6863 (chore) ", chore, chalk.yellow);
1315
- drawRow("\u5176\u4ED6\u63D0\u4EA4 (other) ", other, chalk.gray);
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);
1316
1502
  if (stats.dailyIndices && stats.dailyIndices.length > 0) {
1317
- console.log("\n" + chalk.cyan.bold("\u{1F4C5} \u6BCF\u65E5\u6478\u9C7C\u6307\u6570\u6982\u89C8\uFF1A"));
1503
+ console.log("\n" + chalk2.cyan.bold("\u{1F4C5} \u6BCF\u65E5\u6478\u9C7C\u6307\u6570\u6982\u89C8\uFF1A"));
1318
1504
  const monthLabel = `${targetDate.getMonth() + 1}\u6708`;
1319
1505
  const COL_WIDTH = 8;
1320
1506
  const weekHeaders = ["\u5468\u4E00", "\u5468\u4E8C", "\u5468\u4E09", "\u5468\u56DB", "\u5468\u4E94", "\u5468\u516D", "\u5468\u65E5"];
@@ -1323,7 +1509,7 @@ async function runMonthlyReport(monthsAgo, source) {
1323
1509
  const lines = [];
1324
1510
  let dateRow = "";
1325
1511
  let fishRow = "";
1326
- lines.push(chalk.gray(weekHeaders.map((d) => visualPad(d, COL_WIDTH)).join("").trimEnd()));
1512
+ lines.push(chalk2.gray(weekHeaders.map((d) => visualPad(d, COL_WIDTH)).join("").trimEnd()));
1327
1513
  for (let i = 0; i < firstDayOffset; i++) {
1328
1514
  dateRow += visualPad("", COL_WIDTH);
1329
1515
  fishRow += visualPad("", COL_WIDTH);
@@ -1335,7 +1521,7 @@ async function runMonthlyReport(monthsAgo, source) {
1335
1521
  dateRow += visualPad(dateRaw, COL_WIDTH);
1336
1522
  fishRow += visualPad(fishRaw, COL_WIDTH);
1337
1523
  if (columnIndex === 6 || d === stats.dailyIndices[stats.dailyIndices.length - 1]) {
1338
- lines.push(chalk.gray(dateRow.trimEnd()));
1524
+ lines.push(chalk2.gray(dateRow.trimEnd()));
1339
1525
  fishRow = colorizeFishRow(fishRow);
1340
1526
  lines.push(fishRow);
1341
1527
  lines.push("");
@@ -1352,18 +1538,18 @@ async function runMonthlyReport(monthsAgo, source) {
1352
1538
  const mostFish = [...dailyWithCommits].sort((a, b) => b.fish - a.fish)[0];
1353
1539
  const mostWork = [...dailyWithCommits].sort((a, b) => a.fish - b.fish)[0];
1354
1540
  if (mostFish.fish >= 75) {
1355
- console.log(chalk.green(`
1541
+ console.log(chalk2.green(`
1356
1542
  \u{1F3A3} \u6478\u9C7C\u738B: ${monthLabel}${mostFish.day}\u65E5 \u2192 \u6478\u9C7C\u6307\u6570 ${mostFish.fish}%` + (mostFish.tags.length > 0 ? ` ${mostFish.tags.join(" ")}` : "")));
1357
1543
  }
1358
1544
  if (mostWork.fish <= 40) {
1359
- console.log(chalk.red(`
1545
+ console.log(chalk2.red(`
1360
1546
  \u{1F525} \u7206\u809D\u738B: ${monthLabel}${mostWork.day}\u65E5 \u2192 \u6478\u9C7C\u6307\u6570 ${mostWork.fish}%` + (mostWork.tags.length > 0 ? ` ${mostWork.tags.join(" ")}` : "")));
1361
1547
  }
1362
1548
  }
1363
1549
  }
1364
- console.log("\n" + chalk.gray("-".repeat(50)));
1365
- console.log(`\u{1F916} ${chalk.magenta.bold("\u9510\u8BC4")}\uFF1A`);
1366
- console.log(chalk.white(getAICriticForMonth(stats)));
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)));
1367
1553
  console.log("");
1368
1554
  }
1369
1555
  async function runProjectReport(weeksAgo, source, isMonth = false) {
@@ -1384,10 +1570,10 @@ async function runProjectReport(weeksAgo, source, isMonth = false) {
1384
1570
  const loading = showLoading("\u6B63\u5728\u7EDF\u8BA1\u9879\u76EE\u7206\u809D\u7A0B\u5EA6...");
1385
1571
  const stats = isMonth ? await analyzeMonthly(projects, targetDate, source) : await analyzeWeekly(projects, targetDate, source);
1386
1572
  loading.stop();
1387
- console.log(chalk.cyan.bold(`\u{1F4CA} \u5BF9\u5E94\u65F6\u6BB5\u9879\u76EE\u7206\u809D\u6392\u884C (${since.toLocaleDateString()} ~ ${until.toLocaleDateString()})`));
1573
+ console.log(chalk2.cyan.bold(`\u{1F4CA} \u5BF9\u5E94\u65F6\u6BB5\u9879\u76EE\u7206\u809D\u6392\u884C (${since.toLocaleDateString()} ~ ${until.toLocaleDateString()})`));
1388
1574
  const ranked = stats.projectsRanked;
1389
1575
  if (ranked.length === 0) {
1390
- console.log(chalk.gray(" \u672C\u65F6\u6BB5\u6682\u65E0\u9879\u76EE\u63D0\u4EA4\u6570\u636E\u3002"));
1576
+ console.log(chalk2.gray(" \u672C\u65F6\u6BB5\u6682\u65E0\u9879\u76EE\u63D0\u4EA4\u6570\u636E\u3002"));
1391
1577
  } else {
1392
1578
  const totalCommits = ranked.reduce((sum, p) => sum + p.count, 0);
1393
1579
  let hasPrimaryProject = false;
@@ -1397,21 +1583,21 @@ async function runProjectReport(weeksAgo, source, isMonth = false) {
1397
1583
  let suffix;
1398
1584
  if (ratio >= 0.5 || N >= 30) {
1399
1585
  if (!hasPrimaryProject) {
1400
- suffix = chalk.red(" (\u4E3B\u529B\u642C\u7816\u5730 \u{1F9F1})");
1586
+ suffix = chalk2.red(" (\u4E3B\u529B\u642C\u7816\u5730 \u{1F9F1})");
1401
1587
  hasPrimaryProject = true;
1402
1588
  } else {
1403
- suffix = chalk.red(" (\u9B42\u5F52\u4E4B\u5904\uFF0C\u4EE3\u7801\u5728\u8FD9\u5BB6\u5C31\u5728 \u{1F3E0})");
1589
+ suffix = chalk2.red(" (\u9B42\u5F52\u4E4B\u5904\uFF0C\u4EE3\u7801\u5728\u8FD9\u5BB6\u5C31\u5728 \u{1F3E0})");
1404
1590
  }
1405
1591
  } else if (ratio >= 0.2 || N >= 14) {
1406
- suffix = chalk.magenta(" (\u591A\u7EBF\u7A0B\u5206\u51FA\u6765\u7684\u6253\u5DE5\u9B42 \u{1F9F5})");
1592
+ suffix = chalk2.magenta(" (\u591A\u7EBF\u7A0B\u5206\u51FA\u6765\u7684\u6253\u5DE5\u9B42 \u{1F9F5})");
1407
1593
  } else if (ratio >= 0.15 || N >= 5) {
1408
- suffix = chalk.yellow(" (\u5076\u5C14\u4E0A\u53BB\u70B9\u4E00\u4E0B \u{1F41F})");
1594
+ suffix = chalk2.yellow(" (\u5076\u5C14\u4E0A\u53BB\u70B9\u4E00\u4E0B \u{1F41F})");
1409
1595
  } else if (N === 1) {
1410
- suffix = chalk.cyan(" (\u6D4B\u5B8C\u5C31\u8DD1\uFF0C\u7EAF\u7CB9\u8DEF\u8FC7 \u{1F6AC})");
1596
+ suffix = chalk2.cyan(" (\u6D4B\u5B8C\u5C31\u8DD1\uFF0C\u7EAF\u7CB9\u8DEF\u8FC7 \u{1F6AC})");
1411
1597
  } else {
1412
- suffix = chalk.gray(" (\u8FB9\u7F18\u6302\u673A\u9879\u76EE \u{1F4A4})");
1598
+ suffix = chalk2.gray(" (\u8FB9\u7F18\u6302\u673A\u9879\u76EE \u{1F4A4})");
1413
1599
  }
1414
- console.log(` ${idx + 1}. ${chalk.bold.white(proj.name)}: ${chalk.cyan(N + " \u6B21\u63D0\u4EA4")}${suffix}`);
1600
+ console.log(` ${idx + 1}. ${chalk2.bold.white(proj.name)}: ${chalk2.cyan(N + " \u6B21\u63D0\u4EA4")}${suffix}`);
1415
1601
  });
1416
1602
  }
1417
1603
  console.log("");
@@ -1436,14 +1622,14 @@ async function runTimeReport(offset, source, isMonth) {
1436
1622
  loading.stop();
1437
1623
  const maxCount = Math.max(...hours.map((h) => h.count));
1438
1624
  const barScale = maxCount > 0 ? 30 / maxCount : 1;
1439
- console.log(chalk.cyan.bold(`\u{1F552} \u5BF9\u5E94\u65F6\u6BB5 24 \u5C0F\u65F6 commit \u9891\u6B21\u5206\u5E03\u56FE\uFF1A`));
1625
+ console.log(chalk2.cyan.bold(`\u{1F552} \u5BF9\u5E94\u65F6\u6BB5 24 \u5C0F\u65F6 commit \u9891\u6B21\u5206\u5E03\u56FE\uFF1A`));
1440
1626
  hours.forEach(({ hour, count }) => {
1441
1627
  const barLength = Math.round(count * barScale);
1442
1628
  const barStr = "\u2588".repeat(barLength);
1443
1629
  const hourStr = String(hour).padStart(2, "0") + ":00";
1444
1630
  let tag = count > 0 ? getHourTag(hour) : "";
1445
- const barColorStr = count > 0 ? chalk.blue(barStr.padEnd(30, " ")) : chalk.gray("".padEnd(30, " "));
1446
- console.log(` ${chalk.bold.cyan(hourStr)} | [${barColorStr}] ${chalk.white(count + " \u6B21")}${tag}`);
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}`);
1447
1633
  });
1448
1634
  console.log("");
1449
1635
  }
@@ -1460,22 +1646,22 @@ async function runGhostReport(weeksAgo, source) {
1460
1646
  const ghosts = await getGhostCommits(projects, since, until, source);
1461
1647
  loading.stop();
1462
1648
  if (ghosts.length === 0) {
1463
- 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"));
1464
- 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"));
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"));
1465
1651
  } else {
1466
- 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`));
1467
- 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"));
1468
- console.log(chalk.gray("-".repeat(50)));
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)));
1469
1655
  ghosts.forEach((c) => {
1470
- console.log(` - [${chalk.yellow(c.project)}] ${chalk.cyan(c.date.slice(0, 19).replace("T", " "))} (${chalk.gray(c.hash)})`);
1471
- console.log(` \u{1F4AC} ${chalk.italic.white(c.message)}`);
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)}`);
1472
1658
  });
1473
- console.log(chalk.gray("-".repeat(50)));
1474
- console.log(`\u{1F916} ${chalk.magenta.bold("\u9510\u8BC4")}\uFF1A`);
1475
- console.log(chalk.red("\u547D\u662F\u81EA\u5DF1\u7684\uFF0C\u5927\u798F\u62A5\u7559\u7ED9\u8001\u677F\u5427\uFF01\u8D76\u7D27\u7761\u89C9\uFF0C\u4FDD\u547D\u8981\u7D27\uFF01\n"));
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"));
1476
1662
  }
1477
1663
  }
1478
- program.name("fish").description("\u{1F41F} Git \u6478\u9C7C & \u7206\u809D\u5206\u6790\u5668 CLI").version(getCliVersion()).option("-m, --month [monthsAgo]", "\u67E5\u770B\u6478\u9C7C/\u7206\u809D\u6708\u62A5 (\u9ED8\u8BA4 0 \u4E3A\u672C\u6708\uFF0C1 \u4E3A\u4E0A\u6708\uFF0C2 \u4E3A\u4E0A\u4E0A\u6708...)").option("-p, --project", "\u67E5\u770B\u9879\u76EE\u7206\u809D\u6392\u884C").option("-t, --time", "\u67E5\u770B\u9EC4\u91D1\u6478\u9C7C\u65F6\u95F4\u6BB5 analysis (24\u5C0F\u65F6\u5206\u5E03)").option("-g, --ghost", "\u68C0\u6D4B\u6DF1\u591C\u5E7D\u7075\u63D0\u4EA4").option("-w, --weeks-ago <number>", "\u67E5\u8BE2\u51E0\u5468\u524D/\u6708\u524D\u7684\u62A5\u544A (\u9ED8\u8BA4 0\uFF0C\u5373\u672C\u5468/\u672C\u6708)", "0").option("-s, --source <source>", "\u9009\u62E9\u8981\u67E5\u8BE2\u7684 GitLab \u6570\u636E\u6E90 (\u5E8F\u53F7\u6216\u522B\u540D/host)").action(async (options) => {
1664
+ 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) => {
1479
1665
  const weeksAgo = parseInt(options.weeksAgo || "0", 10);
1480
1666
  const source = options.source;
1481
1667
  if (options.month !== void 0 && options.project) {
@@ -1494,52 +1680,52 @@ program.name("fish").description("\u{1F41F} Git \u6478\u9C7C & \u7206\u809D\u520
1494
1680
  } else if (options.ghost) {
1495
1681
  await runGhostReport(weeksAgo, source);
1496
1682
  } else {
1497
- await runWeeklyReport(weeksAgo, source);
1683
+ await runWeeklyReport(weeksAgo, source, options.showProjects);
1498
1684
  }
1499
1685
  });
1500
1686
  var configCmd = program.command("config").description("\u7BA1\u7406\u76D1\u63A7\u7684\u9879\u76EE\u8DEF\u5F84\u4E0E GitLab \u51ED\u8BC1");
1501
1687
  configCmd.command("add <path>").description("\u624B\u52A8\u6DFB\u52A0\u4E00\u4E2A\u672C\u5730 Git \u4ED3\u5E93\u8DEF\u5F84").action((projPath) => {
1502
1688
  const res = addProject(projPath);
1503
1689
  if (res.success) {
1504
- console.log(chalk.green(`\u2714 ${res.message}`));
1690
+ console.log(chalk2.green(`\u2714 ${res.message}`));
1505
1691
  } else {
1506
- console.log(chalk.red(`\u2718 ${res.message}`));
1692
+ console.log(chalk2.red(`\u2718 ${res.message}`));
1507
1693
  }
1508
1694
  });
1509
1695
  configCmd.command("remove <path>").description("\u4ECE\u914D\u7F6E\u4E2D\u79FB\u9664\u4E00\u4E2A\u9879\u76EE\u8DEF\u5F84").action((projPath) => {
1510
1696
  const res = removeProject(projPath);
1511
1697
  if (res.success) {
1512
- console.log(chalk.green(`\u2714 ${res.message}`));
1698
+ console.log(chalk2.green(`\u2714 ${res.message}`));
1513
1699
  } else {
1514
- console.log(chalk.red(`\u2718 ${res.message}`));
1700
+ console.log(chalk2.red(`\u2718 ${res.message}`));
1515
1701
  }
1516
1702
  });
1517
1703
  configCmd.command("list").description("\u5217\u51FA\u5F53\u524D\u6240\u6709\u76D1\u63A7\u7684\u9879\u76EE\u4E0E GitLab \u914D\u7F6E").action(() => {
1518
1704
  const config = readConfig();
1519
- console.log(chalk.cyan.bold("\n\u{1F4C1} \u5F53\u524D\u76D1\u63A7\u7684\u672C\u5730\u9879\u76EE\u5217\u8868:"));
1705
+ console.log(chalk2.cyan.bold("\n\u{1F4C1} \u5F53\u524D\u76D1\u63A7\u7684\u672C\u5730\u9879\u76EE\u5217\u8868:"));
1520
1706
  if (config.projects.length === 0) {
1521
- 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()})`));
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()})`));
1522
1708
  } else {
1523
1709
  config.projects.forEach((p, idx) => {
1524
- console.log(` ${idx + 1}. ${chalk.white(p)}`);
1710
+ console.log(` ${idx + 1}. ${chalk2.white(p)}`);
1525
1711
  });
1526
1712
  }
1527
- console.log(chalk.cyan.bold("\n\u{1F98A} \u5F53\u524D\u914D\u7F6E\u7684 GitLab \u8FDC\u7A0B\u6E90:"));
1713
+ console.log(chalk2.cyan.bold("\n\u{1F98A} \u5F53\u524D\u914D\u7F6E\u7684 GitLab \u8FDC\u7A0B\u6E90:"));
1528
1714
  const gitlabs = config.gitlabs || [];
1529
1715
  if (gitlabs.length === 0) {
1530
- console.log(chalk.gray(" (\u5C1A\u672A\u914D\u7F6E\u4EFB\u4F55 GitLab \u8FDC\u7A0B\u6E90)"));
1716
+ console.log(chalk2.gray(" (\u5C1A\u672A\u914D\u7F6E\u4EFB\u4F55 GitLab \u8FDC\u7A0B\u6E90)"));
1531
1717
  } else {
1532
1718
  gitlabs.forEach((g, idx) => {
1533
- console.log(` ${idx + 1}. ${chalk.bold.white(g.name)} | Host: ${chalk.gray(g.host)}`);
1719
+ console.log(` ${idx + 1}. ${chalk2.bold.white(g.name)} | Host: ${chalk2.gray(g.host)}`);
1534
1720
  });
1535
1721
  }
1536
1722
  console.log("");
1537
1723
  });
1538
1724
  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) => {
1539
- console.log(chalk.cyan(`\u{1F50D} \u6B63\u5728\u626B\u63CF\u76EE\u5F55 ${dir} \u4E0B of Git \u4ED3\u5E93...`));
1725
+ console.log(chalk2.cyan(`\u{1F50D} \u6B63\u5728\u626B\u63CF\u76EE\u5F55 ${dir} \u4E0B of Git \u4ED3\u5E93...`));
1540
1726
  const repos = scanDirectory(dir);
1541
1727
  if (repos.length === 0) {
1542
- console.log(chalk.yellow(`\u26A0 \u672A\u5728 ${dir} \u4E0B\u53D1\u73B0\u4EFB\u4F55 Git \u4ED3\u5E93\u3002`));
1728
+ console.log(chalk2.yellow(`\u26A0 \u672A\u5728 ${dir} \u4E0B\u53D1\u73B0\u4EFB\u4F55 Git \u4ED3\u5E93\u3002`));
1543
1729
  return;
1544
1730
  }
1545
1731
  const config = readConfig();
@@ -1552,26 +1738,26 @@ configCmd.command("scan <dir>").description("\u81EA\u52A8\u626B\u63CF\u6307\u5B9
1552
1738
  }
1553
1739
  if (addedCount > 0) {
1554
1740
  writeConfig(config);
1555
- console.log(chalk.green(`\u2714 \u6210\u529F\u53D1\u73B0\u5E76\u6DFB\u52A0\u4E86 ${addedCount} \u4E2A\u65B0 Git \u4ED3\u5E93\uFF1A`));
1556
- repos.forEach((r) => console.log(` - ${chalk.gray(r)}`));
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)}`));
1557
1743
  } else {
1558
- 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`));
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`));
1559
1745
  }
1560
1746
  });
1561
1747
  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) => {
1562
1748
  setGitLabConfig(token, host, name);
1563
- console.log(chalk.green(`\u2714 \u5DF2\u6210\u529F\u914D\u7F6E\u5E76\u4FDD\u5B58 GitLab \u8BBF\u95EE\u6E90\u3002`));
1749
+ console.log(chalk2.green(`\u2714 \u5DF2\u6210\u529F\u914D\u7F6E\u5E76\u4FDD\u5B58 GitLab \u8BBF\u95EE\u6E90\u3002`));
1564
1750
  const targetHost = host || "https://gitlab.com";
1565
1751
  const targetName = name || targetHost.replace(/^https?:\/\//, "").replace(/\/$/, "");
1566
- console.log(chalk.gray(`\u522B\u540D (Name): ${targetName}`));
1567
- console.log(chalk.gray(`\u5730\u5740 (Host): ${targetHost}`));
1752
+ console.log(chalk2.gray(`\u522B\u540D (Name): ${targetName}`));
1753
+ console.log(chalk2.gray(`\u5730\u5740 (Host): ${targetHost}`));
1568
1754
  });
1569
1755
  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) => {
1570
1756
  clearGitLabConfig(nameOrIndex);
1571
1757
  if (nameOrIndex) {
1572
- console.log(chalk.green(`\u2714 \u5DF2\u6E05\u9664\u6307\u5B9A\u7684 GitLab \u8BBF\u95EE\u914D\u7F6E [${nameOrIndex}]\u3002`));
1758
+ console.log(chalk2.green(`\u2714 \u5DF2\u6E05\u9664\u6307\u5B9A\u7684 GitLab \u8BBF\u95EE\u914D\u7F6E [${nameOrIndex}]\u3002`));
1573
1759
  } else {
1574
- 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`));
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`));
1575
1761
  }
1576
1762
  });
1577
1763
  program.parse(process.argv);