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/README-/345/225/260/345/227/246/347/211/210.md +171 -33
- package/README.md +9 -2
- package/dist/index.js +449 -263
- package/package.json +48 -48
package/dist/index.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
// src/index.ts
|
|
4
4
|
import { Command } from "commander";
|
|
5
|
-
import
|
|
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
|
-
|
|
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
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
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
|
|
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:
|
|
505
|
-
hardworking:
|
|
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
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
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
|
-
|
|
595
|
+
workScore += 5;
|
|
539
596
|
}
|
|
540
|
-
hardworking = Math.min(100, Math.round(
|
|
597
|
+
const hardworking = Math.min(100, Math.round(workScore));
|
|
541
598
|
const fish = Math.max(1, 100 - hardworking);
|
|
542
|
-
const
|
|
543
|
-
|
|
544
|
-
));
|
|
545
|
-
const
|
|
546
|
-
|
|
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${
|
|
557
|
-
if (
|
|
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 &&
|
|
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(
|
|
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
|
|
640
|
+
const seen = /* @__PURE__ */ new Map();
|
|
585
641
|
const unique = [];
|
|
586
642
|
for (const c of all) {
|
|
587
|
-
|
|
588
|
-
|
|
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\
|
|
768
|
-
"\u770B\u6765\u672C\u5468\u7684\u9879\u76EE\u8FDB\u5165\u4E86\u2018\u517B\u7CBE\u84C4\u9510\u2019\u9636\u6BB5\u2014\u2014\u624B\u673A\u592A\
|
|
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
|
|
770
|
-
"\u8FD9\u63D0\u4EA4\u6B21\u6570\uFF0C\u4E24\u53EA\u624B\u90FD\
|
|
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\
|
|
774
|
-
"\u4F60\u8FD9\
|
|
775
|
-
"\u5144\u5F1F\uFF0C\u4F60\
|
|
776
|
-
"\u75AF\u72C2\u642C\u7816\uFF0C\u809D\u5929\u809D\u5730\u3002\u4E0D\
|
|
777
|
-
"\u63D0\u4EA4\
|
|
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\
|
|
781
|
-
"\u534A\u591C\u4E09\u66F4\u8FD8\u5728\
|
|
782
|
-
"\
|
|
783
|
-
"\u522B\
|
|
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\
|
|
787
|
-
"\u672C\u6708\
|
|
788
|
-
"\
|
|
789
|
-
"\u4EE3\u7801\u5E93\
|
|
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
|
|
793
|
-
"\u65B0\u529F\u80FD\u72C2\u9B54\uFF01\u4E0D\u505C\u5730\
|
|
794
|
-
"\u75AF\u72C2\u8F93\
|
|
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
|
-
"
|
|
798
|
-
"\
|
|
799
|
-
"Chore
|
|
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\
|
|
803
|
-
"\u672C\u5468\
|
|
804
|
-
"\u770B\
|
|
805
|
-
"\
|
|
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\
|
|
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\
|
|
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\
|
|
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\
|
|
814
|
-
"\u7206\u809D\u6218\u795E\u5C31\u4F4D\uFF01\
|
|
815
|
-
"\u522B\u4EBA\
|
|
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\
|
|
819
|
-
"\u6210\u4E3A\u6DF1\u591C\u4FEE\u4ED9\u8005\u610F\u5473\u7740\u4F60\u7684\
|
|
820
|
-
"\u4FEE\u4ED9\u5927\u80FD\uFF01\u51CC\
|
|
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\
|
|
824
|
-
"\u642C\u7816\u4EBA\u642C\u7816\u9B42\uFF0C\u4EE3\u7801\u57FA\u5EFA\u5168\u9760\u52E4\
|
|
825
|
-
"\u52E4\u6073\u642C\u7816\uFF0C\u7A33\u5982\u6CF0\u5C71\u3002\u4E0D\
|
|
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\
|
|
829
|
-
"\u4E00\u628A\u68AD\u54C8\u73A9\u5BB6\uFF01\
|
|
830
|
-
"\u4E00\u628A\u68AD\u54C8\u827A\u672F\u5BB6\uFF01\u4F60\u7684\u6BCF\u6B21\u63D0\u4EA4\u90FD\
|
|
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\
|
|
834
|
-
"\u606D\u559C\u83B7\u5F97\u300E\u4F18\u96C5\u67B6\u6784\u5E08\u300F\u79F0\u53F7\uFF01\u6BCF\
|
|
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\
|
|
838
|
-
"\u683C\u5F0F\u5316\u5927\u5E08\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\
|
|
842
|
-
"Git \u8BB0\u5F55\u8FBE\u4EBA\uFF01\u628A
|
|
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\
|
|
846
|
-
"\u6DF1\u591C\u523A\u5BA2\uFF01\u5BE5\u5BE5\
|
|
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
|
|
850
|
-
"\u5468\u672B\
|
|
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\
|
|
854
|
-
"\u6478\u9C7C\u4ED9\u4EBA\uFF0C\u5883\u754C\u5DF2\u8D85\u51E1\u4EBA\uFF01\u5BE5\u5BE5\u4E00\u6B21\u63D0\u4EA4\uFF0C\
|
|
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${
|
|
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(
|
|
983
|
-
console.log(
|
|
984
|
-
console.log(
|
|
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
|
|
1154
|
+
return chalk2.green(`${fish}% (\u7EC8\u6781\u6478\u9C7C \u{1F3A3})`);
|
|
989
1155
|
} else if (fish >= 70) {
|
|
990
|
-
return
|
|
1156
|
+
return chalk2.green(`${fish}% (\u5408\u7406\u5212\u6C34 \u2615)`);
|
|
991
1157
|
} else if (fish >= 40) {
|
|
992
|
-
return
|
|
1158
|
+
return chalk2.yellow(`${fish}% (\u6B63\u5E38\u8425\u4E1A \u{1F4BB})`);
|
|
993
1159
|
} else {
|
|
994
|
-
return
|
|
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
|
|
1165
|
+
return chalk2.red.bold(`${nightOwl}% (\u4FEE\u4ED9\u5927\u4F6C \u{1F9D9})`);
|
|
1000
1166
|
} else if (nightOwl >= 30) {
|
|
1001
|
-
return
|
|
1167
|
+
return chalk2.red(`${nightOwl}% (\u591C\u732B\u51FA\u6CA1 \u{1F989})`);
|
|
1002
1168
|
} else if (nightOwl >= 10) {
|
|
1003
|
-
return
|
|
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
|
|
1176
|
+
return chalk2.green(`${fish}% (\u5468\u672B\u6478\u9C7C \u{1F3A3})`);
|
|
1011
1177
|
} else if (fish >= 50) {
|
|
1012
|
-
return
|
|
1178
|
+
return chalk2.yellow(`${fish}% (\u8F7B\u5FAE\u52A0\u73ED \u{1F319})`);
|
|
1013
1179
|
} else if (fish >= 20) {
|
|
1014
|
-
return
|
|
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
|
|
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":
|
|
1025
|
-
"\u{1F525} \u7206\u809D\u6218\u795E":
|
|
1026
|
-
"\u{1F319} \u6DF1\u591C\u4FEE\u4ED9\u8005":
|
|
1027
|
-
"\u{1F9F1} \u52E4\u6073\u642C\u7816\u4EBA":
|
|
1028
|
-
"\u{1F4A5} \u4E00\u628A\u68AD\u54C8\u578B\u7A0B\u5E8F\u5458":
|
|
1029
|
-
"\u{1F3F7}\uFE0F PPT \u67B6\u6784\u5E08":
|
|
1030
|
-
"\u{1F3F7}\uFE0F \u683C\u5F0F\u5316\u5927\u5E08":
|
|
1031
|
-
"\u{
|
|
1032
|
-
"\u{
|
|
1033
|
-
"\u{
|
|
1034
|
-
"\u{
|
|
1035
|
-
"\u{1F41F} \u4ECA\u65E5\u6682\u65E0\u4EE3\u7801\u6D3B\u52A8":
|
|
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 +=
|
|
1074
|
-
} else if (val >=
|
|
1075
|
-
result +=
|
|
1255
|
+
result += chalk2.green(chunk);
|
|
1256
|
+
} else if (val >= 40) {
|
|
1257
|
+
result += chalk2.yellow(chunk);
|
|
1076
1258
|
} else {
|
|
1077
|
-
result +=
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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(
|
|
1190
|
-
console.log(
|
|
1191
|
-
console.log(` ${
|
|
1192
|
-
console.log(` ${
|
|
1193
|
-
console.log(` ${
|
|
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(
|
|
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${
|
|
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 ?
|
|
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" +
|
|
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} ${
|
|
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 ${
|
|
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} ${
|
|
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(
|
|
1457
|
+
console.log(chalk2.gray("-".repeat(50)));
|
|
1272
1458
|
const avgNightStr = stats.averageNightOwl > 0 ? ` | \u{1F319} \u4FEE\u4ED9: ${stats.averageNightOwl}%` : "";
|
|
1273
|
-
console.log(
|
|
1274
|
-
console.log(
|
|
1275
|
-
console.log(`\u{1F916} ${
|
|
1276
|
-
console.log(
|
|
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(
|
|
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(
|
|
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(
|
|
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)) +
|
|
1310
|
-
console.log(` - ${label}\uFF1A[${barStr}] ${
|
|
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,
|
|
1313
|
-
drawRow("\u65B0\u529F\u80FD (feat) ", feat,
|
|
1314
|
-
drawRow("\u6742\u52A1\u4E0E\u6587\u6863 (chore) ", chore,
|
|
1315
|
-
drawRow("\u5176\u4ED6\u63D0\u4EA4 (other) ", other,
|
|
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" +
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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" +
|
|
1365
|
-
console.log(`\u{1F916} ${
|
|
1366
|
-
console.log(
|
|
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(
|
|
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(
|
|
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 =
|
|
1586
|
+
suffix = chalk2.red(" (\u4E3B\u529B\u642C\u7816\u5730 \u{1F9F1})");
|
|
1401
1587
|
hasPrimaryProject = true;
|
|
1402
1588
|
} else {
|
|
1403
|
-
suffix =
|
|
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 =
|
|
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 =
|
|
1594
|
+
suffix = chalk2.yellow(" (\u5076\u5C14\u4E0A\u53BB\u70B9\u4E00\u4E0B \u{1F41F})");
|
|
1409
1595
|
} else if (N === 1) {
|
|
1410
|
-
suffix =
|
|
1596
|
+
suffix = chalk2.cyan(" (\u6D4B\u5B8C\u5C31\u8DD1\uFF0C\u7EAF\u7CB9\u8DEF\u8FC7 \u{1F6AC})");
|
|
1411
1597
|
} else {
|
|
1412
|
-
suffix =
|
|
1598
|
+
suffix = chalk2.gray(" (\u8FB9\u7F18\u6302\u673A\u9879\u76EE \u{1F4A4})");
|
|
1413
1599
|
}
|
|
1414
|
-
console.log(` ${idx + 1}. ${
|
|
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(
|
|
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 ?
|
|
1446
|
-
console.log(` ${
|
|
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(
|
|
1464
|
-
console.log(
|
|
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(
|
|
1467
|
-
console.log(
|
|
1468
|
-
console.log(
|
|
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(` - [${
|
|
1471
|
-
console.log(` \u{1F4AC} ${
|
|
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(
|
|
1474
|
-
console.log(`\u{1F916} ${
|
|
1475
|
-
console.log(
|
|
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(
|
|
1690
|
+
console.log(chalk2.green(`\u2714 ${res.message}`));
|
|
1505
1691
|
} else {
|
|
1506
|
-
console.log(
|
|
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(
|
|
1698
|
+
console.log(chalk2.green(`\u2714 ${res.message}`));
|
|
1513
1699
|
} else {
|
|
1514
|
-
console.log(
|
|
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(
|
|
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(
|
|
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}. ${
|
|
1710
|
+
console.log(` ${idx + 1}. ${chalk2.white(p)}`);
|
|
1525
1711
|
});
|
|
1526
1712
|
}
|
|
1527
|
-
console.log(
|
|
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(
|
|
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}. ${
|
|
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(
|
|
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(
|
|
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(
|
|
1556
|
-
repos.forEach((r) => console.log(` - ${
|
|
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(
|
|
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(
|
|
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(
|
|
1567
|
-
console.log(
|
|
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(
|
|
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(
|
|
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);
|