@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 +81 -67
- package/cli/install.ts +14 -7
- package/cli/update.ts +13 -6
- package/dist/cli/install.js +16 -8
- package/dist/cli/update.js +15 -7
- package/package.json +1 -1
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
|
+
- **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
|
-
##
|
|
25
|
+
## Install
|
|
24
26
|
|
|
25
27
|
```bash
|
|
26
|
-
|
|
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 +
|
|
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
|
|
74
|
-
- Badge-based
|
|
75
|
-
- Collaboration
|
|
76
|
-
- Stat-based
|
|
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
|
-
###
|
|
109
|
+
### Wild Encounters
|
|
89
110
|
|
|
90
|
-
|
|
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
|
-
|
|
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
|
-
|
|
119
|
+
### Legendary Quests
|
|
106
120
|
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
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
|
-
|
|
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
|
-
#
|
|
122
|
-
|
|
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
|
|
157
|
+
# Format
|
|
131
158
|
bun run format
|
|
132
|
-
```
|
|
133
|
-
|
|
134
|
-
### Project Structure
|
|
135
159
|
|
|
136
|
-
|
|
137
|
-
|
|
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)
|
|
154
|
-
- [Bun](https://bun.sh)
|
|
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
|
|
37
|
+
// Check runtime (bun preferred, node works too)
|
|
38
38
|
try {
|
|
39
|
-
const
|
|
40
|
-
if (
|
|
41
|
-
|
|
42
|
-
|
|
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
|
-
|
|
45
|
-
|
|
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
|
|
46
|
-
if (
|
|
47
|
-
|
|
48
|
-
|
|
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
|
-
|
|
51
|
-
|
|
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 {
|
package/dist/cli/install.js
CHANGED
|
@@ -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
|
|
14
|
+
// Check runtime (bun preferred, node works too)
|
|
15
15
|
try {
|
|
16
|
-
const
|
|
17
|
-
if (
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
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
|
-
|
|
24
|
-
|
|
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 {
|
package/dist/cli/update.js
CHANGED
|
@@ -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
|
|
21
|
-
if (
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
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
|
-
|
|
28
|
-
|
|
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);
|