@umang-boss/claudemon 1.1.0 → 1.1.2

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.md CHANGED
@@ -15,41 +15,62 @@ fill your Pokedex -- all while you code.
15
15
  - **Level up & evolve** -- Charmander -> Charmeleon -> Charizard
16
16
  - **Wild encounters** -- Pokemon appear based on your coding activity
17
17
  - **Catch 'em all** -- fill your 151-entry Pokedex
18
- - **Achievements** -- 18 milestones to unlock
18
+ - **Achievements** -- 17 milestones to unlock
19
19
  - **Legendary quests** -- multi-step challenges for Articuno, Zapdos, Moltres, Mewtwo, Mew
20
20
  - **Colored terminal sprites** -- hand-crafted pixel art in your terminal
21
+ - **Status line** -- sprite + name + model + buddy speech on the prompt line
21
22
  - **Type personalities** -- 15 unique reaction styles
23
+ - **Nickname your Pokemon** -- give them custom names
22
24
 
23
- ## Quick Start
25
+ ## Install
24
26
 
25
27
  ```bash
26
- # Install
27
- bun run cli/install.ts
28
-
29
- # Start a new Claude Code session, then:
30
- /buddy # Pick your starter
31
- /buddy show # See your Pokemon
32
- /buddy pet # Bond with your companion
33
- /buddy stats # Detailed stats
34
- /buddy evolve # Check evolution status
35
- /buddy catch # Catch wild Pokemon
36
- /buddy party # Manage your party
37
- /buddy pokedex # Track your collection
38
- /buddy achievements # View progress
39
- /buddy legendary # Legendary quest chains
28
+ npx @umang-boss/claudemon install
40
29
  ```
41
30
 
31
+ That's it! Start a new Claude Code session and type `/buddy`.
32
+
33
+ **Requirements:** Node.js 18+ (Bun optional, auto-detected for faster startup)
34
+
35
+ ### Other CLI Commands
36
+
37
+ ```bash
38
+ npx @umang-boss/claudemon doctor # Check installation health
39
+ npx @umang-boss/claudemon update # Re-register after updates
40
+ npx @umang-boss/claudemon uninstall # Remove (preserves save data)
41
+ ```
42
+
43
+ ## Commands
44
+
45
+ Once installed, use `/buddy` in Claude Code:
46
+
47
+ | Command | What it does |
48
+ |---------|-------------|
49
+ | `/buddy` | Show your Pokemon |
50
+ | `/buddy pet` | Bond with your buddy (+XP, +happiness) |
51
+ | `/buddy stats` | Detailed stat breakdown |
52
+ | `/buddy rename Sparky` | Give a nickname |
53
+ | `/buddy rename` | Reset to species name |
54
+ | `/buddy evolve` | Check/trigger evolution |
55
+ | `/buddy catch` | Catch wild Pokemon |
56
+ | `/buddy catch confirm` | Throw a Pokeball! |
57
+ | `/buddy party` | View party (6 max) |
58
+ | `/buddy switch 2` | Switch active Pokemon |
59
+ | `/buddy pokedex` | Track your 151 collection |
60
+ | `/buddy achievements` | View progress |
61
+ | `/buddy legendary` | Legendary quest chains |
62
+ | `/buddy hide` | Hide sprite from status line |
63
+ | `/buddy unhide` | Show sprite |
64
+
42
65
  ## How It Works
43
66
 
44
67
  Claudemon runs as an MCP (Model Context Protocol) server alongside Claude Code.
45
68
  It uses hooks to detect your coding activity and award XP automatically.
46
69
 
47
- ### Architecture
48
-
49
70
  ```
50
71
  Claude Code -> MCP Server (Claudemon)
51
72
  -> Hooks (PostToolUse, Stop, UserPromptSubmit)
52
- -> Status Line (name + level + XP bar)
73
+ -> Status Line (sprite + name + model + speech)
53
74
  -> /buddy Skill (slash commands)
54
75
  ```
55
76
 
@@ -70,10 +91,10 @@ Claude Code -> MCP Server (Claudemon)
70
91
  ### Evolution
71
92
 
72
93
  Pokemon evolve at the same levels as the original Gen 1 games:
73
- - Level-based: Charmander -> Charmeleon (L16) -> Charizard (L36)
74
- - Badge-based: Pikachu -> Raichu (Spark Badge -- 200 commits)
75
- - Collaboration: Kadabra -> Alakazam (10 PRs merged)
76
- - Stat-based: Eevee -> Flareon/Vaporeon/Jolteon (dominant coding stat)
94
+ - **Level-based:** Charmander -> Charmeleon (L16) -> Charizard (L36)
95
+ - **Badge-based:** Pikachu -> Raichu (Spark Badge -- 200 commits)
96
+ - **Collaboration:** Kadabra -> Alakazam (10 PRs merged)
97
+ - **Stat-based:** Eevee -> Flareon/Vaporeon/Jolteon (dominant coding stat)
77
98
 
78
99
  ### Badges
79
100
 
@@ -85,73 +106,66 @@ Pokemon evolve at the same levels as the original Gen 1 games:
85
106
  | Lunar Badge | 30-day streak | Moon Stone evolutions |
86
107
  | Growth Badge | Edit 500 files | Leaf Stone evolutions |
87
108
 
88
- ### Trainer Titles
109
+ ### Wild Encounters
89
110
 
90
- Your title progresses as your Pokemon levels up:
111
+ As you code, wild Pokemon appear based on your activity:
112
+ - Fixing bugs -> Bug/Poison types
113
+ - Writing tests -> Fighting/Normal types
114
+ - Large refactors -> Psychic/Dragon types
115
+ - Build/compile -> Fire/Rock types
91
116
 
92
- | Level | Title |
93
- |-------|-------|
94
- | 1 | Bug Catcher |
95
- | 6 | Youngster |
96
- | 11 | Hiker |
97
- | 21 | Ace Trainer |
98
- | 31 | Cooltrainer |
99
- | 41 | Veteran |
100
- | 51 | Elite Four |
101
- | 61 | Champion |
102
- | 76 | Pokemon Master |
103
- | 91 | Professor |
117
+ Encounters trigger roughly every 500 XP earned. Use `/buddy catch` to try catching them!
104
118
 
105
- ## CLI Tools
119
+ ### Legendary Quests
106
120
 
107
- ```bash
108
- # Install Claudemon into Claude Code
109
- bun run cli/install.ts
121
+ 5 multi-step quest chains for legendary Pokemon:
122
+ - **Articuno** -- The Ice Bird of Endurance (100-day streak)
123
+ - **Zapdos** -- The Thunder of Testing (1000 tests passed)
124
+ - **Moltres** -- The Flame of Debugging (500 bugs fixed)
125
+ - **Mewtwo** -- The Ultimate Creation (140 Pokedex entries)
126
+ - **Mew** -- The Myth (365-day coding streak)
127
+
128
+ ## Status Line
110
129
 
111
- # Uninstall (preserves your save data)
112
- bun run cli/uninstall.ts
130
+ The status line shows your Pokemon sprite on the right side of the input prompt:
113
131
 
114
- # Diagnose installation issues
115
- bun run cli/doctor.ts
116
132
  ```
133
+ *Pikachu hums softly* Pikachu Lv.10
134
+ Opus 4.6 [colored sprite]
135
+ [colored sprite]
136
+ [colored sprite]
137
+ ```
138
+
139
+ - Buddy speech rotates every 30 seconds (zero API cost -- hardcoded messages)
140
+ - Model name from Claude Code
141
+ - `/buddy hide` to toggle sprite visibility
117
142
 
118
143
  ## Development
119
144
 
120
145
  ```bash
121
- # Run the MCP server directly
122
- bun run server
146
+ # Clone and install
147
+ git clone https://github.com/umang-dabhi/claudemon.git
148
+ cd claudemon
149
+ bun install
123
150
 
124
- # Run tests
151
+ # Run tests (309 tests)
125
152
  bun test
126
153
 
127
154
  # Type checking
128
155
  bun run typecheck
129
156
 
130
- # Format code
157
+ # Format
131
158
  bun run format
132
- ```
133
-
134
- ### Project Structure
135
159
 
136
- ```
137
- src/
138
- engine/ # Game logic: XP, evolution, encounters, stats
139
- gamification/ # Achievements, milestones, legendary quests
140
- server/ # MCP server and tool handlers
141
- sprites/ # Terminal sprite rendering
142
- state/ # Save state management
143
- cli/ # Install, uninstall, doctor scripts
144
- hooks/ # PostToolUse, Stop, UserPromptSubmit shell scripts
145
- skills/buddy/ # /buddy slash command definition
146
- sprites/full/ # 151 colored terminal sprite files
147
- statusline/ # Status bar shell script
148
- tests/ # Test suites
160
+ # Build for npm (compiles TS to JS)
161
+ npm run build
149
162
  ```
150
163
 
151
164
  ## Requirements
152
165
 
153
- - [Claude Code](https://claude.ai/code) v2.1.80+
154
- - [Bun](https://bun.sh) v1.0+
166
+ - [Claude Code](https://claude.ai/code)
167
+ - Node.js 18+ (or [Bun](https://bun.sh) for faster startup)
168
+ - `jq` for status line (`sudo apt install jq` on Ubuntu)
155
169
 
156
170
  ## Disclaimer
157
171
 
package/cli/install.ts CHANGED
@@ -34,15 +34,22 @@ import {
34
34
  async function checkPrerequisites(): Promise<boolean> {
35
35
  let allGood = true;
36
36
 
37
- // Check bun (sanity)
37
+ // Check runtime (bun preferred, node works too)
38
38
  try {
39
- const result = spawnSync("bun", ["--version"], { stdio: "pipe" });
40
- if (result.error) throw result.error;
41
- const output = result.stdout?.toString().trim();
42
- ok(`Bun runtime: v${output}`);
39
+ const bunResult = spawnSync("bun", ["--version"], { stdio: "pipe" });
40
+ if (!bunResult.error) {
41
+ ok(`Bun runtime: v${bunResult.stdout?.toString().trim()} (fast mode)`);
42
+ } else {
43
+ throw new Error("no bun");
44
+ }
43
45
  } catch {
44
- fail("Bun runtime not found. Install from https://bun.sh");
45
- allGood = false;
46
+ const nodeResult = spawnSync("node", ["--version"], { stdio: "pipe" });
47
+ if (!nodeResult.error) {
48
+ ok(`Node.js runtime: ${nodeResult.stdout?.toString().trim()}`);
49
+ } else {
50
+ fail("No runtime found. Install Node.js 18+ from https://nodejs.org");
51
+ allGood = false;
52
+ }
46
53
  }
47
54
 
48
55
  // Check Claude Code directory
package/cli/update.ts CHANGED
@@ -42,13 +42,20 @@ async function checkPrerequisites(): Promise<boolean> {
42
42
  let allGood = true;
43
43
 
44
44
  try {
45
- const result = spawnSync("bun", ["--version"], { stdio: "pipe" });
46
- if (result.error) throw result.error;
47
- const output = result.stdout?.toString().trim();
48
- ok(`Bun runtime: v${output}`);
45
+ const bunResult = spawnSync("bun", ["--version"], { stdio: "pipe" });
46
+ if (!bunResult.error) {
47
+ ok(`Bun runtime: v${bunResult.stdout?.toString().trim()} (fast mode)`);
48
+ } else {
49
+ throw new Error("no bun");
50
+ }
49
51
  } catch {
50
- fail("Bun runtime not found.");
51
- allGood = false;
52
+ const nodeResult = spawnSync("node", ["--version"], { stdio: "pipe" });
53
+ if (!nodeResult.error) {
54
+ ok(`Node.js runtime: ${nodeResult.stdout?.toString().trim()}`);
55
+ } else {
56
+ fail("No runtime found. Install Node.js 18+");
57
+ allGood = false;
58
+ }
52
59
  }
53
60
 
54
61
  try {
@@ -11,17 +11,25 @@ import { ok, fail, readJson, writeJson, CLAUDE_DIR, CLAUDE_CONFIG, CLAUDE_SETTIN
11
11
  // ── Step 1: Check Prerequisites ──────────────────────────────
12
12
  async function checkPrerequisites() {
13
13
  let allGood = true;
14
- // Check bun (sanity)
14
+ // Check runtime (bun preferred, node works too)
15
15
  try {
16
- const result = spawnSync("bun", ["--version"], { stdio: "pipe" });
17
- if (result.error)
18
- throw result.error;
19
- const output = result.stdout?.toString().trim();
20
- ok(`Bun runtime: v${output}`);
16
+ const bunResult = spawnSync("bun", ["--version"], { stdio: "pipe" });
17
+ if (!bunResult.error) {
18
+ ok(`Bun runtime: v${bunResult.stdout?.toString().trim()} (fast mode)`);
19
+ }
20
+ else {
21
+ throw new Error("no bun");
22
+ }
21
23
  }
22
24
  catch {
23
- fail("Bun runtime not found. Install from https://bun.sh");
24
- allGood = false;
25
+ const nodeResult = spawnSync("node", ["--version"], { stdio: "pipe" });
26
+ if (!nodeResult.error) {
27
+ ok(`Node.js runtime: ${nodeResult.stdout?.toString().trim()}`);
28
+ }
29
+ else {
30
+ fail("No runtime found. Install Node.js 18+ from https://nodejs.org");
31
+ allGood = false;
32
+ }
25
33
  }
26
34
  // Check Claude Code directory
27
35
  try {
@@ -17,15 +17,23 @@ import { ok, fail, info, readJson, writeJson, CLAUDE_DIR, CLAUDE_CONFIG, CLAUDE_
17
17
  async function checkPrerequisites() {
18
18
  let allGood = true;
19
19
  try {
20
- const result = spawnSync("bun", ["--version"], { stdio: "pipe" });
21
- if (result.error)
22
- throw result.error;
23
- const output = result.stdout?.toString().trim();
24
- ok(`Bun runtime: v${output}`);
20
+ const bunResult = spawnSync("bun", ["--version"], { stdio: "pipe" });
21
+ if (!bunResult.error) {
22
+ ok(`Bun runtime: v${bunResult.stdout?.toString().trim()} (fast mode)`);
23
+ }
24
+ else {
25
+ throw new Error("no bun");
26
+ }
25
27
  }
26
28
  catch {
27
- fail("Bun runtime not found.");
28
- allGood = false;
29
+ const nodeResult = spawnSync("node", ["--version"], { stdio: "pipe" });
30
+ if (!nodeResult.error) {
31
+ ok(`Node.js runtime: ${nodeResult.stdout?.toString().trim()}`);
32
+ }
33
+ else {
34
+ fail("No runtime found. Install Node.js 18+");
35
+ allGood = false;
36
+ }
29
37
  }
30
38
  try {
31
39
  await access(CLAUDE_DIR, fsConstants.F_OK);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@umang-boss/claudemon",
3
- "version": "1.1.0",
3
+ "version": "1.1.2",
4
4
  "description": "Pokemon Gen 1 coding companion for Claude Code — Gotta code 'em all!",
5
5
  "type": "module",
6
6
  "main": "dist/src/server/index.js",