pet-terminal 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 (147) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +268 -0
  3. package/dist/commands/care.d.ts +3 -0
  4. package/dist/commands/care.d.ts.map +1 -0
  5. package/dist/commands/care.js +103 -0
  6. package/dist/commands/care.js.map +1 -0
  7. package/dist/commands/clean.d.ts +3 -0
  8. package/dist/commands/clean.d.ts.map +1 -0
  9. package/dist/commands/clean.js +105 -0
  10. package/dist/commands/clean.js.map +1 -0
  11. package/dist/commands/feed.d.ts +3 -0
  12. package/dist/commands/feed.d.ts.map +1 -0
  13. package/dist/commands/feed.js +106 -0
  14. package/dist/commands/feed.js.map +1 -0
  15. package/dist/commands/git.d.ts +3 -0
  16. package/dist/commands/git.d.ts.map +1 -0
  17. package/dist/commands/git.js +138 -0
  18. package/dist/commands/git.js.map +1 -0
  19. package/dist/commands/heal.d.ts +3 -0
  20. package/dist/commands/heal.d.ts.map +1 -0
  21. package/dist/commands/heal.js +106 -0
  22. package/dist/commands/heal.js.map +1 -0
  23. package/dist/commands/init.d.ts +3 -0
  24. package/dist/commands/init.d.ts.map +1 -0
  25. package/dist/commands/init.js +89 -0
  26. package/dist/commands/init.js.map +1 -0
  27. package/dist/commands/inventory.d.ts +3 -0
  28. package/dist/commands/inventory.d.ts.map +1 -0
  29. package/dist/commands/inventory.js +113 -0
  30. package/dist/commands/inventory.js.map +1 -0
  31. package/dist/commands/play.d.ts +3 -0
  32. package/dist/commands/play.d.ts.map +1 -0
  33. package/dist/commands/play.js +110 -0
  34. package/dist/commands/play.js.map +1 -0
  35. package/dist/commands/shop.d.ts +3 -0
  36. package/dist/commands/shop.d.ts.map +1 -0
  37. package/dist/commands/shop.js +197 -0
  38. package/dist/commands/shop.js.map +1 -0
  39. package/dist/commands/sleep.d.ts +3 -0
  40. package/dist/commands/sleep.d.ts.map +1 -0
  41. package/dist/commands/sleep.js +48 -0
  42. package/dist/commands/sleep.js.map +1 -0
  43. package/dist/commands/status.d.ts +3 -0
  44. package/dist/commands/status.d.ts.map +1 -0
  45. package/dist/commands/status.js +98 -0
  46. package/dist/commands/status.js.map +1 -0
  47. package/dist/commands/sync.d.ts +3 -0
  48. package/dist/commands/sync.d.ts.map +1 -0
  49. package/dist/commands/sync.js +66 -0
  50. package/dist/commands/sync.js.map +1 -0
  51. package/dist/commands/tutorial.d.ts +3 -0
  52. package/dist/commands/tutorial.d.ts.map +1 -0
  53. package/dist/commands/tutorial.js +210 -0
  54. package/dist/commands/tutorial.js.map +1 -0
  55. package/dist/core/auto-care.d.ts +63 -0
  56. package/dist/core/auto-care.d.ts.map +1 -0
  57. package/dist/core/auto-care.js +295 -0
  58. package/dist/core/auto-care.js.map +1 -0
  59. package/dist/core/config.d.ts +89 -0
  60. package/dist/core/config.d.ts.map +1 -0
  61. package/dist/core/config.js +195 -0
  62. package/dist/core/config.js.map +1 -0
  63. package/dist/core/database.d.ts +29 -0
  64. package/dist/core/database.d.ts.map +1 -0
  65. package/dist/core/database.js +81 -0
  66. package/dist/core/database.js.map +1 -0
  67. package/dist/core/inventory.d.ts +63 -0
  68. package/dist/core/inventory.d.ts.map +1 -0
  69. package/dist/core/inventory.js +140 -0
  70. package/dist/core/inventory.js.map +1 -0
  71. package/dist/core/level-system.d.ts +32 -0
  72. package/dist/core/level-system.d.ts.map +1 -0
  73. package/dist/core/level-system.js +76 -0
  74. package/dist/core/level-system.js.map +1 -0
  75. package/dist/core/pet.d.ts +123 -0
  76. package/dist/core/pet.d.ts.map +1 -0
  77. package/dist/core/pet.js +781 -0
  78. package/dist/core/pet.js.map +1 -0
  79. package/dist/core/shop.d.ts +93 -0
  80. package/dist/core/shop.d.ts.map +1 -0
  81. package/dist/core/shop.js +205 -0
  82. package/dist/core/shop.js.map +1 -0
  83. package/dist/core/time-decay.d.ts +30 -0
  84. package/dist/core/time-decay.d.ts.map +1 -0
  85. package/dist/core/time-decay.js +149 -0
  86. package/dist/core/time-decay.js.map +1 -0
  87. package/dist/core/welcome.d.ts +31 -0
  88. package/dist/core/welcome.d.ts.map +1 -0
  89. package/dist/core/welcome.js +180 -0
  90. package/dist/core/welcome.js.map +1 -0
  91. package/dist/index.d.ts +3 -0
  92. package/dist/index.d.ts.map +1 -0
  93. package/dist/index.js +80 -0
  94. package/dist/index.js.map +1 -0
  95. package/dist/monitor/git-monitor.d.ts +90 -0
  96. package/dist/monitor/git-monitor.d.ts.map +1 -0
  97. package/dist/monitor/git-monitor.js +342 -0
  98. package/dist/monitor/git-monitor.js.map +1 -0
  99. package/dist/types/auto-care.d.ts +86 -0
  100. package/dist/types/auto-care.d.ts.map +1 -0
  101. package/dist/types/auto-care.js +15 -0
  102. package/dist/types/auto-care.js.map +1 -0
  103. package/dist/types/config.d.ts +42 -0
  104. package/dist/types/config.d.ts.map +1 -0
  105. package/dist/types/config.js +24 -0
  106. package/dist/types/config.js.map +1 -0
  107. package/dist/types/git.d.ts +68 -0
  108. package/dist/types/git.d.ts.map +1 -0
  109. package/dist/types/git.js +14 -0
  110. package/dist/types/git.js.map +1 -0
  111. package/dist/types/items.d.ts +41 -0
  112. package/dist/types/items.d.ts.map +1 -0
  113. package/dist/types/items.js +286 -0
  114. package/dist/types/items.js.map +1 -0
  115. package/dist/types/pet.d.ts +42 -0
  116. package/dist/types/pet.d.ts.map +1 -0
  117. package/dist/types/pet.js +16 -0
  118. package/dist/types/pet.js.map +1 -0
  119. package/dist/types/species.d.ts +30 -0
  120. package/dist/types/species.d.ts.map +1 -0
  121. package/dist/types/species.js +164 -0
  122. package/dist/types/species.js.map +1 -0
  123. package/dist/types/stats.d.ts +22 -0
  124. package/dist/types/stats.d.ts.map +1 -0
  125. package/dist/types/stats.js +18 -0
  126. package/dist/types/stats.js.map +1 -0
  127. package/dist/types/time.d.ts +30 -0
  128. package/dist/types/time.d.ts.map +1 -0
  129. package/dist/types/time.js +79 -0
  130. package/dist/types/time.js.map +1 -0
  131. package/dist/ui/ascii-art.d.ts +4 -0
  132. package/dist/ui/ascii-art.d.ts.map +1 -0
  133. package/dist/ui/ascii-art.js +170 -0
  134. package/dist/ui/ascii-art.js.map +1 -0
  135. package/dist/ui/display.d.ts +11 -0
  136. package/dist/ui/display.d.ts.map +1 -0
  137. package/dist/ui/display.js +93 -0
  138. package/dist/ui/display.js.map +1 -0
  139. package/dist/ui/help.d.ts +17 -0
  140. package/dist/ui/help.d.ts.map +1 -0
  141. package/dist/ui/help.js +280 -0
  142. package/dist/ui/help.js.map +1 -0
  143. package/dist/ui/progress-bar.d.ts +9 -0
  144. package/dist/ui/progress-bar.d.ts.map +1 -0
  145. package/dist/ui/progress-bar.js +57 -0
  146. package/dist/ui/progress-bar.js.map +1 -0
  147. package/package.json +61 -0
@@ -0,0 +1,76 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.LevelSystem = void 0;
4
+ class LevelSystem {
5
+ /**
6
+ * Calculate total XP required for a given level
7
+ * Formula: 100 * level * 1.5^(level-1)
8
+ */
9
+ static getXPForLevel(level) {
10
+ if (level <= 0)
11
+ return 0;
12
+ if (level === 1)
13
+ return 0;
14
+ return Math.floor(100 * level * Math.pow(1.5, level - 1));
15
+ }
16
+ /**
17
+ * Calculate XP needed to reach the next level
18
+ */
19
+ static getXPToNextLevel(currentLevel, currentXP) {
20
+ const nextLevel = currentLevel + 1;
21
+ const requiredXP = this.getXPForLevel(nextLevel);
22
+ return Math.max(0, requiredXP - currentXP);
23
+ }
24
+ /**
25
+ * Get the progress percentage towards the next level
26
+ */
27
+ static getLevelProgress(currentLevel, currentXP) {
28
+ const currentLevelBaseXP = this.getXPForLevel(currentLevel);
29
+ const nextLevelBaseXP = this.getXPForLevel(currentLevel + 1);
30
+ const xpInRange = nextLevelBaseXP - currentLevelBaseXP;
31
+ const xpProgress = currentXP - currentLevelBaseXP;
32
+ if (xpInRange <= 0)
33
+ return 100;
34
+ return Math.min(100, Math.round((xpProgress / xpInRange) * 100));
35
+ }
36
+ /**
37
+ * Check if the given XP is enough for a level up
38
+ */
39
+ static checkLevelUp(currentLevel, newXP) {
40
+ return newXP >= this.getXPForLevel(currentLevel + 1);
41
+ }
42
+ /**
43
+ * Calculate the new level after gaining XP
44
+ */
45
+ static calculateNewLevel(currentLevel, newXP) {
46
+ let newLevel = currentLevel;
47
+ while (this.checkLevelUp(newLevel, newXP)) {
48
+ newLevel++;
49
+ }
50
+ return newLevel;
51
+ }
52
+ /**
53
+ * Get the level title/rank
54
+ */
55
+ static getLevelTitle(level) {
56
+ if (level <= 5)
57
+ return 'Baby';
58
+ if (level <= 10)
59
+ return 'Young';
60
+ if (level <= 20)
61
+ return 'Adult';
62
+ if (level <= 30)
63
+ return 'Expert';
64
+ if (level <= 50)
65
+ return 'Master';
66
+ return 'Legend';
67
+ }
68
+ /**
69
+ * Get max stats bonus based on level
70
+ */
71
+ static getStatBonus(level) {
72
+ return Math.floor(level / 5) * 5;
73
+ }
74
+ }
75
+ exports.LevelSystem = LevelSystem;
76
+ //# sourceMappingURL=level-system.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"level-system.js","sourceRoot":"","sources":["../../src/core/level-system.ts"],"names":[],"mappings":";;;AAAA,MAAa,WAAW;IACtB;;;OAGG;IACH,MAAM,CAAC,aAAa,CAAC,KAAa;QAChC,IAAI,KAAK,IAAI,CAAC;YAAE,OAAO,CAAC,CAAC;QACzB,IAAI,KAAK,KAAK,CAAC;YAAE,OAAO,CAAC,CAAC;QAC1B,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC;IAC5D,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,gBAAgB,CAAC,YAAoB,EAAE,SAAiB;QAC7D,MAAM,SAAS,GAAG,YAAY,GAAG,CAAC,CAAC;QACnC,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;QACjD,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,UAAU,GAAG,SAAS,CAAC,CAAC;IAC7C,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,gBAAgB,CAAC,YAAoB,EAAE,SAAiB;QAC7D,MAAM,kBAAkB,GAAG,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC;QAC5D,MAAM,eAAe,GAAG,IAAI,CAAC,aAAa,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC;QAC7D,MAAM,SAAS,GAAG,eAAe,GAAG,kBAAkB,CAAC;QACvD,MAAM,UAAU,GAAG,SAAS,GAAG,kBAAkB,CAAC;QAElD,IAAI,SAAS,IAAI,CAAC;YAAE,OAAO,GAAG,CAAC;QAC/B,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,UAAU,GAAG,SAAS,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;IACnE,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,YAAY,CAAC,YAAoB,EAAE,KAAa;QACrD,OAAO,KAAK,IAAI,IAAI,CAAC,aAAa,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC;IACvD,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,iBAAiB,CAAC,YAAoB,EAAE,KAAa;QAC1D,IAAI,QAAQ,GAAG,YAAY,CAAC;QAC5B,OAAO,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,KAAK,CAAC,EAAE,CAAC;YAC1C,QAAQ,EAAE,CAAC;QACb,CAAC;QACD,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,aAAa,CAAC,KAAa;QAChC,IAAI,KAAK,IAAI,CAAC;YAAE,OAAO,MAAM,CAAC;QAC9B,IAAI,KAAK,IAAI,EAAE;YAAE,OAAO,OAAO,CAAC;QAChC,IAAI,KAAK,IAAI,EAAE;YAAE,OAAO,OAAO,CAAC;QAChC,IAAI,KAAK,IAAI,EAAE;YAAE,OAAO,QAAQ,CAAC;QACjC,IAAI,KAAK,IAAI,EAAE;YAAE,OAAO,QAAQ,CAAC;QACjC,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,YAAY,CAAC,KAAa;QAC/B,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;IACnC,CAAC;CACF;AArED,kCAqEC"}
@@ -0,0 +1,123 @@
1
+ import { PetData } from '../types/pet';
2
+ import { PetSpecies, MoodState } from '../types/species';
3
+ import { PetStats, ActionResult } from '../types/stats';
4
+ import { TimeSyncResult } from '../types/time';
5
+ import { Database } from './database';
6
+ import { Inventory } from './inventory';
7
+ import { CoinReason } from './shop';
8
+ import { GitProcessResult } from '../types/git';
9
+ export declare class Pet {
10
+ private data;
11
+ private db;
12
+ private timeDecay;
13
+ private synced;
14
+ private inventory;
15
+ private constructor();
16
+ static loadOrCreate(db: Database): Promise<Pet>;
17
+ static createNew(db: Database, name: string, species: PetSpecies): PetData;
18
+ feed(): ActionResult;
19
+ play(): ActionResult;
20
+ clean(): ActionResult;
21
+ sleep(): ActionResult;
22
+ heal(): ActionResult;
23
+ getData(): Readonly<PetData>;
24
+ getCurrentMood(): MoodState;
25
+ getLevelProgress(): number;
26
+ getXPToNextLevel(): number;
27
+ getLevelTitle(): string;
28
+ /**
29
+ * Sync time and apply stat decay based on elapsed time
30
+ * Returns the sync result if changes were applied, null if no significant time passed
31
+ */
32
+ syncTime(): TimeSyncResult | null;
33
+ /**
34
+ * Get hours passed since last update
35
+ */
36
+ getHoursSinceUpdate(): number;
37
+ /**
38
+ * Check if pet needs care (has critical stats)
39
+ */
40
+ needsCare(): boolean;
41
+ save(): void;
42
+ getInventory(): Inventory;
43
+ useItem(itemId: string): ActionResult;
44
+ addItem(itemId: string, quantity?: number): void;
45
+ hasItem(itemId: string): boolean;
46
+ /**
47
+ * Get current coin balance
48
+ */
49
+ getCoins(): number;
50
+ /**
51
+ * Earn coins from an activity
52
+ * @param amount - Number of coins earned
53
+ * @param reason - Source of coins (feed, play, git_commit, etc.)
54
+ */
55
+ earnCoins(amount: number, reason: CoinReason): void;
56
+ /**
57
+ * Spend coins (returns true if successful)
58
+ * @param amount - Number of coins to spend
59
+ */
60
+ spendCoins(amount: number): boolean;
61
+ /**
62
+ * Get coins earned today
63
+ */
64
+ getTodayCoins(): number;
65
+ /**
66
+ * Get total lifetime coins earned
67
+ */
68
+ getTotalCoinsEarned(): number;
69
+ /**
70
+ * Get current Git streak
71
+ */
72
+ getGitStreak(): number;
73
+ /**
74
+ * Get total Git commits rewarded
75
+ */
76
+ getGitCommitCount(): number;
77
+ /**
78
+ * Get last rewarded commit hash
79
+ */
80
+ getLastGitCommit(): string | undefined;
81
+ /**
82
+ * Check and reward new Git commits
83
+ * Returns a GitProcessResult with details of what was rewarded
84
+ */
85
+ checkGitCommits(): Promise<GitProcessResult>;
86
+ /**
87
+ * Process a single Git commit and return the reward details
88
+ */
89
+ private processGitCommit;
90
+ /**
91
+ * Calculate stat bonuses from Git commits
92
+ * Philosophy: Writing code = being with your pet
93
+ */
94
+ private calculateGitStatBonus;
95
+ /**
96
+ * Update Git streak based on commit dates
97
+ */
98
+ private updateGitStreak;
99
+ /**
100
+ * Calculate streak bonus coins
101
+ */
102
+ private calculateStreakBonus;
103
+ /**
104
+ * Format date as YYYY-MM-DD
105
+ */
106
+ private formatDate;
107
+ /**
108
+ * Get auto-care suggestions based on pet state
109
+ */
110
+ getSuggestions(): string[];
111
+ /**
112
+ * Apply stat change directly (for Git commit bonuses, etc.)
113
+ * This bypasses the normal action flow for internal stat adjustments
114
+ */
115
+ applyStatDirectly(stat: keyof PetStats, value: number): void;
116
+ private performAction;
117
+ private applyStatChanges;
118
+ private addExperience;
119
+ private calculateMood;
120
+ private updateMood;
121
+ private updateInteraction;
122
+ }
123
+ //# sourceMappingURL=pet.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pet.d.ts","sourceRoot":"","sources":["../../src/core/pet.ts"],"names":[],"mappings":"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"}