cli-pet 1.0.0

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.
Files changed (71) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +150 -0
  3. package/dist/art/animations.d.ts +4 -0
  4. package/dist/art/animations.d.ts.map +1 -0
  5. package/dist/art/animations.js +26 -0
  6. package/dist/art/animations.js.map +1 -0
  7. package/dist/art/ascii.d.ts +4 -0
  8. package/dist/art/ascii.d.ts.map +1 -0
  9. package/dist/art/ascii.js +291 -0
  10. package/dist/art/ascii.js.map +1 -0
  11. package/dist/art/colors.d.ts +26 -0
  12. package/dist/art/colors.d.ts.map +1 -0
  13. package/dist/art/colors.js +57 -0
  14. package/dist/art/colors.js.map +1 -0
  15. package/dist/commands/adopt.d.ts +2 -0
  16. package/dist/commands/adopt.d.ts.map +1 -0
  17. package/dist/commands/adopt.js +104 -0
  18. package/dist/commands/adopt.js.map +1 -0
  19. package/dist/commands/feed.d.ts +2 -0
  20. package/dist/commands/feed.d.ts.map +1 -0
  21. package/dist/commands/feed.js +61 -0
  22. package/dist/commands/feed.js.map +1 -0
  23. package/dist/commands/play.d.ts +2 -0
  24. package/dist/commands/play.d.ts.map +1 -0
  25. package/dist/commands/play.js +85 -0
  26. package/dist/commands/play.js.map +1 -0
  27. package/dist/commands/stats.d.ts +2 -0
  28. package/dist/commands/stats.d.ts.map +1 -0
  29. package/dist/commands/stats.js +64 -0
  30. package/dist/commands/stats.js.map +1 -0
  31. package/dist/commands/status.d.ts +2 -0
  32. package/dist/commands/status.d.ts.map +1 -0
  33. package/dist/commands/status.js +27 -0
  34. package/dist/commands/status.js.map +1 -0
  35. package/dist/commands/tips.d.ts +2 -0
  36. package/dist/commands/tips.d.ts.map +1 -0
  37. package/dist/commands/tips.js +87 -0
  38. package/dist/commands/tips.js.map +1 -0
  39. package/dist/github/activity.d.ts +3 -0
  40. package/dist/github/activity.d.ts.map +1 -0
  41. package/dist/github/activity.js +115 -0
  42. package/dist/github/activity.js.map +1 -0
  43. package/dist/github/analyzer.d.ts +5 -0
  44. package/dist/github/analyzer.d.ts.map +1 -0
  45. package/dist/github/analyzer.js +23 -0
  46. package/dist/github/analyzer.js.map +1 -0
  47. package/dist/index.d.ts +3 -0
  48. package/dist/index.d.ts.map +1 -0
  49. package/dist/index.js +100 -0
  50. package/dist/index.js.map +1 -0
  51. package/dist/pet/engine.d.ts +8 -0
  52. package/dist/pet/engine.d.ts.map +1 -0
  53. package/dist/pet/engine.js +193 -0
  54. package/dist/pet/engine.js.map +1 -0
  55. package/dist/pet/persistence.d.ts +8 -0
  56. package/dist/pet/persistence.d.ts.map +1 -0
  57. package/dist/pet/persistence.js +28 -0
  58. package/dist/pet/persistence.js.map +1 -0
  59. package/dist/pet/types.d.ts +44 -0
  60. package/dist/pet/types.d.ts.map +1 -0
  61. package/dist/pet/types.js +15 -0
  62. package/dist/pet/types.js.map +1 -0
  63. package/dist/utils/config.d.ts +2 -0
  64. package/dist/utils/config.d.ts.map +1 -0
  65. package/dist/utils/config.js +33 -0
  66. package/dist/utils/config.js.map +1 -0
  67. package/dist/utils/display.d.ts +7 -0
  68. package/dist/utils/display.d.ts.map +1 -0
  69. package/dist/utils/display.js +83 -0
  70. package/dist/utils/display.js.map +1 -0
  71. package/package.json +55 -0
@@ -0,0 +1,104 @@
1
+ // Adopt command — interactive pet adoption
2
+ import chalk from 'chalk';
3
+ import { createNewPet } from '../pet/engine.js';
4
+ import { savePet, hasPet, saveGitHubUsername } from '../pet/persistence.js';
5
+ import { SPECIES_NAMES } from '../pet/types.js';
6
+ import { renderTitle, renderPetStatus } from '../utils/display.js';
7
+ import { typeWriter, fadeIn } from '../art/animations.js';
8
+ import { resolveGitHubUsername } from '../utils/config.js';
9
+ import * as readline from 'readline';
10
+ function askQuestion(rl, question) {
11
+ return new Promise((resolve) => {
12
+ rl.question(question, (answer) => resolve(answer.trim()));
13
+ });
14
+ }
15
+ export async function adoptCommand() {
16
+ const rl = readline.createInterface({
17
+ input: process.stdin,
18
+ output: process.stdout,
19
+ });
20
+ try {
21
+ console.log(renderTitle());
22
+ console.log();
23
+ if (hasPet()) {
24
+ await typeWriter(chalk.yellow('⚠ You already have a pet! Use "cli-pet status" to check on them.'));
25
+ await typeWriter(chalk.dim('If you want to adopt a new pet, your current pet will be replaced.'));
26
+ const confirm = await askQuestion(rl, chalk.bold('\nContinue? (y/N): '));
27
+ if (confirm.toLowerCase() !== 'y') {
28
+ console.log(chalk.green('\nGreat! Your pet is waiting for you. 🐾'));
29
+ rl.close();
30
+ return;
31
+ }
32
+ console.log();
33
+ }
34
+ await typeWriter('🏠 Welcome to the cli-pet Adoption Center!');
35
+ console.log();
36
+ // Show available species
37
+ await fadeIn([
38
+ chalk.bold('Available pets:'),
39
+ '',
40
+ ` ${chalk.cyan('1.')} ${SPECIES_NAMES.cat} — Purrs when your CI is green`,
41
+ ` ${chalk.cyan('2.')} ${SPECIES_NAMES.dog} — Fetches your GitHub notifications`,
42
+ ` ${chalk.cyan('3.')} ${SPECIES_NAMES.dragon} — Breathes fire on failing tests`,
43
+ ` ${chalk.cyan('4.')} ${SPECIES_NAMES.octocat} — The ultimate GitHub companion`,
44
+ '',
45
+ ], 60);
46
+ const speciesMap = {
47
+ '1': 'cat', '2': 'dog', '3': 'dragon', '4': 'octocat',
48
+ 'cat': 'cat', 'dog': 'dog', 'dragon': 'dragon', 'octocat': 'octocat',
49
+ };
50
+ let species;
51
+ while (!species) {
52
+ const choice = await askQuestion(rl, chalk.bold('Choose your pet (1-4): '));
53
+ species = speciesMap[choice.toLowerCase()];
54
+ if (!species) {
55
+ console.log(chalk.red('Please enter 1, 2, 3, or 4'));
56
+ }
57
+ }
58
+ // Name the pet
59
+ let name = '';
60
+ while (!name) {
61
+ name = await askQuestion(rl, chalk.bold(`\nName your ${species}: `));
62
+ if (!name) {
63
+ console.log(chalk.red('Your pet needs a name!'));
64
+ }
65
+ }
66
+ // GitHub username
67
+ console.log();
68
+ const detectedUsername = resolveGitHubUsername();
69
+ let username = detectedUsername;
70
+ if (detectedUsername) {
71
+ await typeWriter(`🔗 Detected GitHub user: ${chalk.cyan(detectedUsername)}`);
72
+ const confirm = await askQuestion(rl, chalk.bold('Is this correct? (Y/n): '));
73
+ if (confirm.toLowerCase() === 'n') {
74
+ username = await askQuestion(rl, chalk.bold('Enter your GitHub username: '));
75
+ }
76
+ }
77
+ else {
78
+ username = await askQuestion(rl, chalk.bold('Enter your GitHub username: '));
79
+ }
80
+ if (username) {
81
+ saveGitHubUsername(username);
82
+ }
83
+ // Create and save the pet
84
+ const pet = createNewPet(name, species);
85
+ savePet(pet);
86
+ console.log();
87
+ await typeWriter(`🎉 Congratulations! You adopted ${chalk.bold(name)} the ${species}!`);
88
+ console.log();
89
+ console.log(renderPetStatus(pet));
90
+ console.log();
91
+ await fadeIn([
92
+ chalk.dim('Tips:'),
93
+ chalk.dim(' • cli-pet status — Check on your pet'),
94
+ chalk.dim(' • cli-pet feed — Feed with your GitHub activity'),
95
+ chalk.dim(' • cli-pet play — Play a mini-game'),
96
+ chalk.dim(' • cli-pet stats — See detailed GitHub stats'),
97
+ chalk.dim(' • cli-pet tips — Get coding tips from your pet'),
98
+ ], 40);
99
+ }
100
+ finally {
101
+ rl.close();
102
+ }
103
+ }
104
+ //# sourceMappingURL=adopt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adopt.js","sourceRoot":"","sources":["../../src/commands/adopt.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function feedCommand(): Promise<void>;
2
+ //# sourceMappingURL=feed.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"feed.d.ts","sourceRoot":"","sources":["../../src/commands/feed.ts"],"names":[],"mappings":"AAUA,wBAAsB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CA6DjD"}
@@ -0,0 +1,61 @@
1
+ // Feed command — fetch GitHub activity and feed the pet
2
+ import chalk from 'chalk';
3
+ import ora from 'ora';
4
+ import { loadPet, savePet, getGitHubUsername } from '../pet/persistence.js';
5
+ import { applyDecay, applyActivity, analyzeActivity } from '../pet/engine.js';
6
+ import { fetchGitHubActivity } from '../github/activity.js';
7
+ import { renderPetStatus, renderActivityReport, renderError } from '../utils/display.js';
8
+ import { celebrate } from '../art/animations.js';
9
+ export async function feedCommand() {
10
+ let pet = loadPet();
11
+ if (!pet) {
12
+ console.log(renderError('No pet found! Run "cli-pet adopt" to get started.'));
13
+ return;
14
+ }
15
+ // Apply decay first
16
+ pet = applyDecay(pet);
17
+ const spinner = ora({
18
+ text: chalk.cyan('Fetching your GitHub activity...'),
19
+ spinner: 'dots',
20
+ }).start();
21
+ try {
22
+ const username = getGitHubUsername() || undefined;
23
+ const activity = await fetchGitHubActivity(username);
24
+ spinner.succeed(chalk.green('GitHub activity fetched!'));
25
+ console.log();
26
+ // Analyze and apply activity
27
+ const impact = analyzeActivity(activity);
28
+ // If pet is dead, revive with reduced stats
29
+ if (!pet.isAlive) {
30
+ console.log(chalk.yellow('🏥 Reviving your pet...'));
31
+ pet = {
32
+ ...pet,
33
+ isAlive: true,
34
+ stats: { hunger: 20, health: 20, happiness: 20, energy: 20 },
35
+ };
36
+ }
37
+ const updatedPet = applyActivity(pet, impact);
38
+ updatedPet.totalCommits += activity.recentCommits;
39
+ updatedPet.totalPRs += activity.recentPRsMerged;
40
+ updatedPet.streak = activity.streakDays;
41
+ savePet(updatedPet);
42
+ // Show activity report
43
+ console.log(renderActivityReport(impact.messages));
44
+ // Celebrate level ups
45
+ const levelsGained = updatedPet.level - pet.level;
46
+ if (levelsGained > 0) {
47
+ console.log();
48
+ console.log(chalk.bold.magenta(` 🎊 LEVEL UP! ${pet.name} is now level ${updatedPet.level}!`));
49
+ await celebrate();
50
+ }
51
+ // Show updated status
52
+ console.log();
53
+ console.log(renderPetStatus(updatedPet));
54
+ console.log();
55
+ }
56
+ catch (error) {
57
+ spinner.fail(chalk.red('Failed to fetch GitHub activity'));
58
+ console.log(renderError(error.message || 'Unknown error'));
59
+ }
60
+ }
61
+ //# sourceMappingURL=feed.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"feed.js","sourceRoot":"","sources":["../../src/commands/feed.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function playCommand(): Promise<void>;
2
+ //# sourceMappingURL=play.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"play.d.ts","sourceRoot":"","sources":["../../src/commands/play.ts"],"names":[],"mappings":"AAeA,wBAAsB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAkFjD"}
@@ -0,0 +1,85 @@
1
+ // Play command — mini terminal game with the pet
2
+ import chalk from 'chalk';
3
+ import { loadPet, savePet } from '../pet/persistence.js';
4
+ import { applyDecay } from '../pet/engine.js';
5
+ import { renderPetStatus, renderError, renderSuccess } from '../utils/display.js';
6
+ import { typeWriter } from '../art/animations.js';
7
+ import * as readline from 'readline';
8
+ function askQuestion(rl, question) {
9
+ return new Promise((resolve) => {
10
+ rl.question(question, (answer) => resolve(answer.trim()));
11
+ });
12
+ }
13
+ export async function playCommand() {
14
+ let pet = loadPet();
15
+ if (!pet) {
16
+ console.log(renderError('No pet found! Run "cli-pet adopt" to get started.'));
17
+ return;
18
+ }
19
+ pet = applyDecay(pet);
20
+ if (!pet.isAlive) {
21
+ console.log(renderError(`${pet.name} has fainted! Run "cli-pet feed" to revive them first.`));
22
+ return;
23
+ }
24
+ if (pet.stats.energy < 10) {
25
+ console.log(renderError(`${pet.name} is too tired to play! Let them rest or feed them first.`));
26
+ return;
27
+ }
28
+ const rl = readline.createInterface({
29
+ input: process.stdin,
30
+ output: process.stdout,
31
+ });
32
+ try {
33
+ console.log();
34
+ await typeWriter(`🎮 ${pet.name} wants to play "Guess the Number"!`);
35
+ console.log();
36
+ const target = Math.floor(Math.random() * 20) + 1;
37
+ let attempts = 0;
38
+ const maxAttempts = 5;
39
+ let won = false;
40
+ console.log(chalk.dim(` ${pet.name} is thinking of a number between 1 and 20...`));
41
+ console.log(chalk.dim(` You have ${maxAttempts} attempts!`));
42
+ console.log();
43
+ while (attempts < maxAttempts && !won) {
44
+ attempts++;
45
+ const guess = await askQuestion(rl, chalk.bold(` Attempt ${attempts}/${maxAttempts} — Your guess: `));
46
+ const num = parseInt(guess, 10);
47
+ if (isNaN(num) || num < 1 || num > 20) {
48
+ console.log(chalk.red(' Please enter a number between 1 and 20!'));
49
+ attempts--;
50
+ continue;
51
+ }
52
+ if (num === target) {
53
+ won = true;
54
+ console.log();
55
+ console.log(renderSuccess(`🎉 Correct! ${pet.name} is impressed!`));
56
+ }
57
+ else if (num < target) {
58
+ const hints = ['Higher!', 'Go up!', 'Too low!', 'Nope, higher!'];
59
+ console.log(chalk.yellow(` ${pet.name}: "${hints[Math.floor(Math.random() * hints.length)]} 📈"`));
60
+ }
61
+ else {
62
+ const hints = ['Lower!', 'Go down!', 'Too high!', 'Nope, lower!'];
63
+ console.log(chalk.yellow(` ${pet.name}: "${hints[Math.floor(Math.random() * hints.length)]} 📉"`));
64
+ }
65
+ }
66
+ if (!won) {
67
+ console.log();
68
+ console.log(chalk.yellow(` ${pet.name}: "The answer was ${target}! Better luck next time! 😅"`));
69
+ }
70
+ // Update pet stats based on game result
71
+ pet.stats.happiness = Math.min(100, pet.stats.happiness + (won ? 15 : 5));
72
+ pet.stats.energy = Math.max(0, pet.stats.energy - 10);
73
+ pet.mood = won ? 'playing' : pet.mood;
74
+ pet.lastPlayed = new Date().toISOString();
75
+ pet.xp += won ? 15 : 5;
76
+ savePet(pet);
77
+ console.log();
78
+ console.log(renderPetStatus(pet));
79
+ console.log();
80
+ }
81
+ finally {
82
+ rl.close();
83
+ }
84
+ }
85
+ //# sourceMappingURL=play.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"play.js","sourceRoot":"","sources":["../../src/commands/play.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function statsCommand(): Promise<void>;
2
+ //# sourceMappingURL=stats.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stats.d.ts","sourceRoot":"","sources":["../../src/commands/stats.ts"],"names":[],"mappings":"AAUA,wBAAsB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CA4DlD"}
@@ -0,0 +1,64 @@
1
+ // Stats command — detailed GitHub activity breakdown
2
+ import chalk from 'chalk';
3
+ import ora from 'ora';
4
+ import boxen from 'boxen';
5
+ import { loadPet, getGitHubUsername } from '../pet/persistence.js';
6
+ import { fetchGitHubActivity } from '../github/activity.js';
7
+ import { renderError } from '../utils/display.js';
8
+ import { colors } from '../art/colors.js';
9
+ export async function statsCommand() {
10
+ const pet = loadPet();
11
+ if (!pet) {
12
+ console.log(renderError('No pet found! Run "cli-pet adopt" to get started.'));
13
+ return;
14
+ }
15
+ const spinner = ora({
16
+ text: chalk.cyan('Fetching GitHub stats...'),
17
+ spinner: 'dots',
18
+ }).start();
19
+ try {
20
+ const username = getGitHubUsername() || undefined;
21
+ const activity = await fetchGitHubActivity(username);
22
+ spinner.succeed(chalk.green('Stats loaded!'));
23
+ console.log();
24
+ const ciEmoji = activity.ciSuccessRate >= 0.9 ? '💚' :
25
+ activity.ciSuccessRate >= 0.5 ? '🟡' : '🔴';
26
+ const ciPercent = Math.round(activity.ciSuccessRate * 100);
27
+ const streakEmoji = activity.streakDays >= 7 ? '🔥' :
28
+ activity.streakDays >= 3 ? '✨' : '💪';
29
+ const content = [
30
+ colors.highlight(`📊 GitHub Activity for ${username || 'you'}`),
31
+ '',
32
+ ` 🔄 Recent Commits (7d): ${chalk.bold(String(activity.recentCommits))}`,
33
+ ` 📝 Today's Commits: ${chalk.bold(String(activity.totalCommitsToday))}`,
34
+ ` 🔀 PRs Merged (7d): ${chalk.bold(String(activity.recentPRsMerged))}`,
35
+ ` 👀 PRs Reviewed (7d): ${chalk.bold(String(activity.recentPRsReviewed))}`,
36
+ ` ${ciEmoji} CI Success Rate: ${chalk.bold(`${ciPercent}%`)}`,
37
+ ` ${streakEmoji} Coding Streak: ${chalk.bold(`${activity.streakDays} day(s)`)}`,
38
+ '',
39
+ colors.muted('─'.repeat(40)),
40
+ '',
41
+ colors.highlight(`🐾 ${pet.name}'s Lifetime Stats`),
42
+ '',
43
+ ` 📈 Total Commits Fed: ${chalk.bold(String(pet.totalCommits))}`,
44
+ ` 🔀 Total PRs Fed: ${chalk.bold(String(pet.totalPRs))}`,
45
+ ` ⭐ Current Level: ${colors.level(`Lv.${pet.level}`)}`,
46
+ ` ✨ Current XP: ${colors.xp(`${pet.xp}/100`)}`,
47
+ ` 🎂 Pet Age: ${chalk.bold(`${Math.floor((Date.now() - new Date(pet.birthDate).getTime()) / (1000 * 60 * 60 * 24))} day(s)`)}`,
48
+ ` 🔥 Best Streak: ${chalk.bold(`${pet.streak} day(s)`)}`,
49
+ ].join('\n');
50
+ console.log(boxen(content, {
51
+ padding: 1,
52
+ borderStyle: 'round',
53
+ borderColor: 'cyan',
54
+ title: '📈 GitHub Stats & Pet Progress',
55
+ titleAlignment: 'center',
56
+ }));
57
+ console.log();
58
+ }
59
+ catch (error) {
60
+ spinner.fail(chalk.red('Failed to fetch stats'));
61
+ console.log(renderError(error.message || 'Unknown error'));
62
+ }
63
+ }
64
+ //# sourceMappingURL=stats.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stats.js","sourceRoot":"","sources":["../../src/commands/stats.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function statusCommand(): Promise<void>;
2
+ //# sourceMappingURL=status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAOA,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAsBnD"}
@@ -0,0 +1,27 @@
1
+ // Status command — show pet status with ASCII art
2
+ import chalk from 'chalk';
3
+ import { loadPet, savePet } from '../pet/persistence.js';
4
+ import { applyDecay } from '../pet/engine.js';
5
+ import { renderPetStatus, renderError } from '../utils/display.js';
6
+ export async function statusCommand() {
7
+ const pet = loadPet();
8
+ if (!pet) {
9
+ console.log(renderError('No pet found! Run "cli-pet adopt" to get started.'));
10
+ return;
11
+ }
12
+ // Apply time-based decay
13
+ const updatedPet = applyDecay(pet);
14
+ savePet(updatedPet);
15
+ console.log();
16
+ console.log(renderPetStatus(updatedPet));
17
+ console.log();
18
+ if (!updatedPet.isAlive) {
19
+ console.log(chalk.red.bold(' ⚠ Your pet has fainted! Run "cli-pet feed" to revive them!'));
20
+ console.log();
21
+ }
22
+ else if (updatedPet.stats.hunger < 30) {
23
+ console.log(chalk.yellow(' 💡 Tip: Run "cli-pet feed" to check GitHub activity and feed your pet!'));
24
+ console.log();
25
+ }
26
+ }
27
+ //# sourceMappingURL=status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAAA,kDAAkD;AAElD,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAEnE,MAAM,CAAC,KAAK,UAAU,aAAa;IACjC,MAAM,GAAG,GAAG,OAAO,EAAE,CAAC;IACtB,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,mDAAmD,CAAC,CAAC,CAAC;QAC9E,OAAO;IACT,CAAC;IAED,yBAAyB;IACzB,MAAM,UAAU,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;IACnC,OAAO,CAAC,UAAU,CAAC,CAAC;IAEpB,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC,CAAC;IACzC,OAAO,CAAC,GAAG,EAAE,CAAC;IAEd,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC;QACxB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,8DAA8D,CAAC,CAAC,CAAC;QAC5F,OAAO,CAAC,GAAG,EAAE,CAAC;IAChB,CAAC;SAAM,IAAI,UAAU,CAAC,KAAK,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;QACxC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,0EAA0E,CAAC,CAAC,CAAC;QACtG,OAAO,CAAC,GAAG,EAAE,CAAC;IAChB,CAAC;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function tipsCommand(): Promise<void>;
2
+ //# sourceMappingURL=tips.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tips.d.ts","sourceRoot":"","sources":["../../src/commands/tips.ts"],"names":[],"mappings":"AAgEA,wBAAsB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAmCjD"}
@@ -0,0 +1,87 @@
1
+ // Tips command — coding tips based on activity patterns
2
+ import chalk from 'chalk';
3
+ import ora from 'ora';
4
+ import boxen from 'boxen';
5
+ import { loadPet, getGitHubUsername } from '../pet/persistence.js';
6
+ import { fetchGitHubActivity } from '../github/activity.js';
7
+ import { renderError } from '../utils/display.js';
8
+ function generateTips(activity, petName) {
9
+ const tips = [];
10
+ // Commit frequency tips
11
+ if (activity.recentCommits === 0) {
12
+ tips.push(`💡 ${petName} says: "Start with a small commit today! Even a README update counts. The hardest part is starting." 🚀`);
13
+ }
14
+ else if (activity.recentCommits < 5) {
15
+ tips.push(`💡 ${petName} says: "Try breaking your work into smaller, atomic commits. It makes code review easier and keeps me well-fed!" 🍕`);
16
+ }
17
+ else if (activity.recentCommits > 20) {
18
+ tips.push(`💡 ${petName} says: "Wow, you're on fire! Make sure each commit has a clear message. Future you will thank present you!" 🔥`);
19
+ }
20
+ // CI tips
21
+ if (activity.ciSuccessRate < 0.5) {
22
+ tips.push(`🏥 ${petName} says: "Your CI is struggling! Try running tests locally before pushing. My health depends on it!" 💚`);
23
+ }
24
+ else if (activity.ciSuccessRate < 0.8) {
25
+ tips.push(`🔧 ${petName} says: "CI could be greener! Consider adding pre-commit hooks to catch issues early." 🪝`);
26
+ }
27
+ else if (activity.ciSuccessRate >= 0.95) {
28
+ tips.push(`⭐ ${petName} says: "Almost perfect CI! You're a testing champion! Keep it up!" 🏆`);
29
+ }
30
+ // PR tips
31
+ if (activity.recentPRsMerged === 0 && activity.recentCommits > 5) {
32
+ tips.push(`🔀 ${petName} says: "You're committing but not merging PRs. Consider opening a PR to get feedback on your work!" 👀`);
33
+ }
34
+ if (activity.recentPRsReviewed === 0) {
35
+ tips.push(`👥 ${petName} says: "Try reviewing a teammate's PR today. Code review is a two-way street — and I love teamwork!" 🤝`);
36
+ }
37
+ // Streak tips
38
+ if (activity.streakDays === 0) {
39
+ tips.push(`📅 ${petName} says: "Start a coding streak today! Even 15 minutes of coding a day builds momentum." ⚡`);
40
+ }
41
+ else if (activity.streakDays >= 7) {
42
+ tips.push(`🔥 ${petName} says: "Amazing ${activity.streakDays}-day streak! But remember: rest is productive too. Take breaks!" 😌`);
43
+ }
44
+ // General tips (always include at least one)
45
+ const generalTips = [
46
+ `🌟 ${petName} says: "Write code that your future self will thank you for. Clear names > clever tricks."`,
47
+ `📚 ${petName} says: "Read someone else's open source code today. It's the fastest way to learn new patterns!"`,
48
+ `🧪 ${petName} says: "When in doubt, write a test first. TDD is like feeding me vegetables — good for both of us!"`,
49
+ `🎯 ${petName} says: "Focus on one thing at a time. Context switching is the enemy of deep work."`,
50
+ `🌿 ${petName} says: "Keep your branches short-lived. Long-lived branches are where merge conflicts breed!"`,
51
+ `📝 ${petName} says: "Document your 'why', not just your 'what'. Code tells you how; comments tell you why."`,
52
+ ];
53
+ tips.push(generalTips[Math.floor(Math.random() * generalTips.length)]);
54
+ return tips;
55
+ }
56
+ export async function tipsCommand() {
57
+ const pet = loadPet();
58
+ if (!pet) {
59
+ console.log(renderError('No pet found! Run "cli-pet adopt" to get started.'));
60
+ return;
61
+ }
62
+ const spinner = ora({
63
+ text: chalk.cyan(`${pet.name} is analyzing your coding patterns...`),
64
+ spinner: 'dots',
65
+ }).start();
66
+ try {
67
+ const username = getGitHubUsername() || undefined;
68
+ const activity = await fetchGitHubActivity(username);
69
+ spinner.succeed(chalk.green(`${pet.name} has some advice!`));
70
+ console.log();
71
+ const tips = generateTips(activity, pet.name);
72
+ const content = tips.map((tip) => ` ${tip}`).join('\n\n');
73
+ console.log(boxen(content, {
74
+ padding: 1,
75
+ borderStyle: 'round',
76
+ borderColor: 'magenta',
77
+ title: `🧠 ${pet.name}'s Coding Tips`,
78
+ titleAlignment: 'center',
79
+ }));
80
+ console.log();
81
+ }
82
+ catch (error) {
83
+ spinner.fail(chalk.red('Failed to generate tips'));
84
+ console.log(renderError(error.message || 'Unknown error'));
85
+ }
86
+ }
87
+ //# sourceMappingURL=tips.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tips.js","sourceRoot":"","sources":["../../src/commands/tips.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { GitHubActivity } from '../pet/types.js';
2
+ export declare function fetchGitHubActivity(username?: string): Promise<GitHubActivity>;
3
+ //# sourceMappingURL=activity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"activity.d.ts","sourceRoot":"","sources":["../../src/github/activity.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAqBjD,wBAAsB,mBAAmB,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAwHpF"}
@@ -0,0 +1,115 @@
1
+ // GitHub activity fetcher — uses gh CLI or Octokit
2
+ import { Octokit } from '@octokit/rest';
3
+ import { execSync } from 'child_process';
4
+ function getGitHubToken() {
5
+ // Try gh CLI first
6
+ try {
7
+ const token = execSync('gh auth token', { encoding: 'utf8', stdio: ['pipe', 'pipe', 'pipe'] }).trim();
8
+ if (token)
9
+ return token;
10
+ }
11
+ catch { }
12
+ // Try environment variable
13
+ if (process.env.GITHUB_TOKEN)
14
+ return process.env.GITHUB_TOKEN;
15
+ if (process.env.GH_TOKEN)
16
+ return process.env.GH_TOKEN;
17
+ return null;
18
+ }
19
+ function getAuthenticatedUsername(octokit) {
20
+ return octokit.rest.users.getAuthenticated().then((res) => res.data.login);
21
+ }
22
+ export async function fetchGitHubActivity(username) {
23
+ const token = getGitHubToken();
24
+ if (!token) {
25
+ throw new Error('GitHub authentication required!\n' +
26
+ 'Please authenticate using one of:\n' +
27
+ ' • gh auth login (recommended)\n' +
28
+ ' • Set GITHUB_TOKEN environment variable');
29
+ }
30
+ const octokit = new Octokit({ auth: token });
31
+ // Get the authenticated user if username not provided
32
+ const user = username || await getAuthenticatedUsername(octokit);
33
+ const now = new Date();
34
+ const oneDayAgo = new Date(now.getTime() - 24 * 60 * 60 * 1000);
35
+ const oneWeekAgo = new Date(now.getTime() - 7 * 24 * 60 * 60 * 1000);
36
+ // Fetch recent events
37
+ const [eventsRes] = await Promise.all([
38
+ octokit.rest.activity.listPublicEventsForUser({
39
+ username: user,
40
+ per_page: 100,
41
+ }).catch(() => ({ data: [] })),
42
+ ]);
43
+ const events = eventsRes.data;
44
+ // Count commits (PushEvents in last 7 days)
45
+ const pushEvents = events.filter((e) => e.type === 'PushEvent' && new Date(e.created_at) >= oneWeekAgo);
46
+ const recentCommits = pushEvents.reduce((sum, e) => sum + (e.payload?.commits?.length || 0), 0);
47
+ // Count today's commits
48
+ const todayPushEvents = events.filter((e) => e.type === 'PushEvent' && new Date(e.created_at) >= oneDayAgo);
49
+ const totalCommitsToday = todayPushEvents.reduce((sum, e) => sum + (e.payload?.commits?.length || 0), 0);
50
+ // Count merged PRs (PullRequestEvent with action=closed and merged)
51
+ const prEvents = events.filter((e) => e.type === 'PullRequestEvent' &&
52
+ e.payload?.action === 'closed' &&
53
+ e.payload?.pull_request?.merged &&
54
+ new Date(e.created_at) >= oneWeekAgo);
55
+ const recentPRsMerged = prEvents.length;
56
+ // Count PR reviews
57
+ const reviewEvents = events.filter((e) => e.type === 'PullRequestReviewEvent' && new Date(e.created_at) >= oneWeekAgo);
58
+ const recentPRsReviewed = reviewEvents.length;
59
+ // Calculate CI success rate from recent status/check events
60
+ // Use a simpler heuristic: ratio of successful workflow runs
61
+ let ciSuccessRate = 0.8; // default optimistic
62
+ try {
63
+ // Try to find repos with recent activity
64
+ const repos = [...new Set(events.map((e) => e.repo?.name).filter(Boolean))].slice(0, 3);
65
+ let totalRuns = 0;
66
+ let successRuns = 0;
67
+ for (const repoFull of repos) {
68
+ const [owner, repo] = repoFull.split('/');
69
+ try {
70
+ const runs = await octokit.rest.actions.listWorkflowRunsForRepo({
71
+ owner,
72
+ repo,
73
+ per_page: 10,
74
+ created: `>=${oneWeekAgo.toISOString().split('T')[0]}`,
75
+ });
76
+ for (const run of runs.data.workflow_runs) {
77
+ totalRuns++;
78
+ if (run.conclusion === 'success')
79
+ successRuns++;
80
+ }
81
+ }
82
+ catch { }
83
+ }
84
+ if (totalRuns > 0) {
85
+ ciSuccessRate = successRuns / totalRuns;
86
+ }
87
+ }
88
+ catch { }
89
+ // Calculate streak (consecutive days with activity)
90
+ const activityDates = new Set(events.map((e) => new Date(e.created_at).toISOString().split('T')[0]));
91
+ let streakDays = 0;
92
+ const checkDate = new Date(now);
93
+ for (let i = 0; i < 30; i++) {
94
+ const dateStr = checkDate.toISOString().split('T')[0];
95
+ if (activityDates.has(dateStr)) {
96
+ streakDays++;
97
+ }
98
+ else if (i > 0) {
99
+ break; // streak broken
100
+ }
101
+ checkDate.setDate(checkDate.getDate() - 1);
102
+ }
103
+ const lastEvent = events[0];
104
+ const lastActivityDate = lastEvent ? lastEvent.created_at : now.toISOString();
105
+ return {
106
+ recentCommits,
107
+ recentPRsMerged,
108
+ recentPRsReviewed,
109
+ ciSuccessRate,
110
+ streakDays,
111
+ totalCommitsToday,
112
+ lastActivityDate,
113
+ };
114
+ }
115
+ //# sourceMappingURL=activity.js.map