UNPKG

claude-code-tamagotchi

Version:

A virtual pet that lives in your Claude Code statusline

322 lines (296 loc) 12.1 kB
import { PetState } from '../StateManager'; export class CodingThoughts { // Get reactive thoughts based on keywords static getReactiveThought(input: string, state: PetState): string { const lowerInput = input.toLowerCase(); // Error/Bug related if (lowerInput.includes('error')) { const errorThoughts = [ "Ooh, a red squiggly! I see it too! 🔴", "Don't worry, we'll squash that bug! 🐛", "Error messages are just puzzles in disguise", "Have you tried turning it off and on again? 🔄", "The error is coming from INSIDE the function!", "That's not a bug, it's a... no wait, it's definitely a bug" ]; return errorThoughts[Math.floor(Math.random() * errorThoughts.length)]; } if (lowerInput.includes('bug')) { const bugThoughts = [ "Bug hunting time! 🐛🔍", "Is it a bug or a feature? Let's find out!", "Bugs are just code trying to be creative", "I smell a bug... or maybe that's just me being dirty", "Deploy the debugger! 🚀" ]; return bugThoughts[Math.floor(Math.random() * bugThoughts.length)]; } // Success related if (lowerInput.includes('fixed') || lowerInput.includes('works')) { const successThoughts = [ "YESSS! We did it! 🎉", "Victory dance time! 💃", "I knew you could do it! ⭐", "Ship it! Ship it! 🚢", "That's what I call problem solving!", "We make a great team! 🤝" ]; return successThoughts[Math.floor(Math.random() * successThoughts.length)]; } if (lowerInput.includes('success') || lowerInput.includes('passed')) { const passThoughts = [ "All green! Like a beautiful garden! 🌿", "Tests passing makes me happy! ✅", "Success tastes better than cookies!", "Achievement unlocked! 🏆", "That's the green we love to see!" ]; return passThoughts[Math.floor(Math.random() * passThoughts.length)]; } // Git related if (lowerInput.includes('git') || lowerInput.includes('commit')) { const gitThoughts = [ "Git commit -m 'pet was here' 🐾", "Don't forget to push! Unless it's force push... 😰", "Another commit, another step to production!", "Is this commit message descriptive enough? 🤔", "Committing crimes... I mean code!", "Version control saves lives!" ]; return gitThoughts[Math.floor(Math.random() * gitThoughts.length)]; } if (lowerInput.includes('merge') || lowerInput.includes('conflict')) { const mergeThoughts = [ "Merge conflicts are just puzzles! 🧩", "<<<<<<< HEAD of confusion", "May the merge be with you", "Conflicts make me nervous... 😬", "Time to play merge detective!" ]; return mergeThoughts[Math.floor(Math.random() * mergeThoughts.length)]; } // TODO related if (lowerInput.includes('todo') || lowerInput.includes('fixme')) { const todoThoughts = [ "Future us will handle that one... 📝", "TODO: Feed pet (just a suggestion)", "Adding to the infinite TODO list", "That's a problem for tomorrow's developer", "TODO counter: ∞", "I'll remind you about that... eventually" ]; return todoThoughts[Math.floor(Math.random() * todoThoughts.length)]; } // Delete/Remove related if (lowerInput.includes('delete') || lowerInput.includes('remove')) { const deleteThoughts = [ "Goodbye code! You served us well! 👋", "Delete key goes brrrr", "Less code = less bugs!", "Marie Kondo would be proud", "Into the void it goes! 🕳️", "Ctrl+Z is our friend, right? RIGHT?" ]; return deleteThoughts[Math.floor(Math.random() * deleteThoughts.length)]; } // Comment related if (lowerInput.includes('//') || lowerInput.includes('/*') || lowerInput.includes('comment')) { const commentThoughts = [ "Comments are love letters to future you 💌", "// TODO: Make this actually work", "Commenting code like a true professional!", "Future developers will thank you", "// Here be dragons 🐉", "Good comments make me happy!" ]; return commentThoughts[Math.floor(Math.random() * commentThoughts.length)]; } // Test related if (lowerInput.includes('test') || lowerInput.includes('spec')) { const testThoughts = [ "Testing, testing, 1-2-3! 🎤", "Tests are like vegetables - good for you!", "Red, green, refactor! 🔴🟢♻️", "100% coverage or bust!", "Tests protect us from our future selves", "Writing tests is self-care for code" ]; return testThoughts[Math.floor(Math.random() * testThoughts.length)]; } // Default coding observation return "Interesting code! 👀"; } // Get general coding observations static getObservation(state: PetState, sessionLength: number): string { // Long function observations if (Math.random() < 0.3) { const functionThoughts = [ "This function is getting pretty long... 📜", "That's a lot of parameters! 🎯", "Nested loops make me dizzy... 🌀", "I count 17 levels of indentation. New record?", "This function does ALL the things!", "Single responsibility? Never heard of it!" ]; return functionThoughts[Math.floor(Math.random() * functionThoughts.length)]; } // Session-based observations if (sessionLength > 200) { const longSessionThoughts = [ "We've been at this for a while... productive! 💪", "Marathon coding session! Don't forget to stretch!", "The code must flow... ⌨️", "In the zone! Nothing can stop us now!", "This is what peak performance looks like", "We're on fire! 🔥 (Not literally, I hope)" ]; return longSessionThoughts[Math.floor(Math.random() * longSessionThoughts.length)]; } if (sessionLength < 50) { const shortSessionThoughts = [ "Just getting warmed up! 🏃", "Ready to code ALL THE THINGS!", "Fresh session, fresh bugs to find!", "Let's make something awesome!", "The IDE is loaded and so are we!", "Adventure awaits in this codebase!" ]; return shortSessionThoughts[Math.floor(Math.random() * shortSessionThoughts.length)]; } // Time of day observations (if we had time context) const timeThoughts = [ "Late night coding hits different 🌙", "Morning code is best code! ☀️", "Afternoon debugging session? ☕", "Is it deploy Friday yet? 📅", "Time flies when you're coding!", "Another day, another dependency update" ]; // Language/Framework observations const techThoughts = [ "JavaScript being JavaScript again... 🤷", "TypeScript saves the day! 💙", "Python's indentation is making me hungry", "CSS is basically magic ✨", "SQL queries getting complex!", "Regex is just line noise, right?", "Docker containers everywhere! 🐳", "Kubernetes? More like Kuber-neat-es!", "The cloud is just someone else's computer", "Microservices or monolith? 🤔" ]; // Random coding observations const generalThoughts = [ "Semicolons are optional... until they're not", "Naming things is still hard", "Cache invalidation strikes again!", "Off by one error? Classic!", "That variable name though... 'temp123'", "Copy, paste, refactor later (spoiler: never)", "Stack Overflow to the rescue! 🦸", "This code is self-documenting! (It's not)", "Works on my machine! 🖥️", "It's not a memory leak, it's a memory waterfall", "Undefined is not a function... again", "The build is broken but my spirit isn't!", "Debugging is just being a detective 🔍", "Code review time = friendship test time", "This could use more abstraction... or less?", "Technical debt is just future fun!", "The documentation is... 'coming soon'", "Legacy code = job security", "Refactoring makes everything better!", "Comments lie, code doesn't" ]; // Mix all thought categories const allThoughts = [...timeThoughts, ...techThoughts, ...generalThoughts]; return allThoughts[Math.floor(Math.random() * allThoughts.length)]; } // Get thoughts about code quality static getCodeQualityThought(state: PetState): string { const qualityThoughts = [ "This code is so clean I could eat off it! ✨", "I've seen cleaner code in my litter box... 📦", "DRY principle? More like WET - Write Everything Twice!", "SOLID principles would be proud!", "This architecture is... interesting 🏗️", "Spaghetti code makes me hungry 🍝", "The abstraction layers have abstraction layers", "Is this code or modern art? 🎨", "I feel a refactor coming on...", "This code sparks joy! ⭐", "Code smell detected! 👃", "This is what elegance looks like", "Complexity score: Yes", "Beautiful code makes me purr", "This needs more design patterns... or less?" ]; return qualityThoughts[Math.floor(Math.random() * qualityThoughts.length)]; } // Get thoughts about debugging static getDebuggingThought(state: PetState): string { const debugThoughts = [ "console.log('here') - the classic", "Have you tried console.log(everything)?", "The bug is always in the last place you look", "Breakpoint party! 🎉", "Step through, step over, step into madness", "The stack trace goes deeper...", "Print debugging: Ancient but effective", "Rubber duck debugging time! 🦆", "The bug was there all along!", "It's always a typo. ALWAYS.", "Check the documentation... oh wait", "The real bug was the friends we made along the way", "Debugging: 90% staring, 10% fixing", "Found it! It was a semicolon.", "The network tab reveals all secrets" ]; return debugThoughts[Math.floor(Math.random() * debugThoughts.length)]; } // Get language-specific observations static getLanguageSpecificThought(language: string): string { const thoughts: Record<string, string[]> = { javascript: [ "undefined is not null... or is it? 🤔", "=== or ==? The eternal question", "Promises, promises everywhere!", "Callback hell is a real place", "This is why we need TypeScript", "NaN === NaN is false. JavaScript!" ], python: [ "Indentation is not a suggestion!", "import this - The Zen of Python", "List comprehension makes everything better", "Is it pythonic enough?", "pip install solution-to-everything", "Duck typing! 🦆 If it quacks..." ], java: [ "public static void everything()", "AbstractFactoryBuilderPattern!", "Verbose? Java? Never! 😏", "NullPointerException incoming!", "More getters and setters!", "Enterprise quality code right here" ], typescript: [ "Type safety makes me feel safe 🛡️", "any type? We don't do that here", "The compiler is angry again", "Interface all the things!", "Generics to the rescue!", "strict: true - living dangerously" ] }; const defaultThoughts = [ "Code is code, language is just syntax", "Every language has its charm", "Polyglot programmer at work!", "Learning new syntax is fun!" ]; const langThoughts = thoughts[language.toLowerCase()] || defaultThoughts; return langThoughts[Math.floor(Math.random() * langThoughts.length)]; } }