pokegent 2.0.1 → 2.0.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 +109 -101
- package/dist/index.js +40 -4
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -5,163 +5,171 @@
|
|
|
5
5
|
|
|
6
6
|
[](https://nodejs.org)
|
|
7
7
|
[](https://github.com/vadimdemedes/ink)
|
|
8
|
-
[](LICENSE)
|
|
9
8
|
<br>
|
|
10
9
|
[](https://github.com/shafiqimtiaz/pokegent/releases)
|
|
11
10
|
[](https://github.com/shafiqimtiaz/pokegent)
|
|
12
11
|
|
|
13
|
-
Terminal dashboard that
|
|
12
|
+
Terminal dashboard that scans and monitors your Pokémon AI coding ecosystem — 16 Pokémon species (CLI) detectors, TMs/HMs (MCP) discovery, movepool usage charts, PP burn metrics, and a shareable HTML Trainer Card.
|
|
14
13
|
|
|
15
|
-
[Features](#features) • [Installation](#installation) • [Usage](#usage) • [
|
|
14
|
+
[Features](#features) • [Installation](#installation) • [Usage](#usage) • [Scoring](#scoring) • [Privacy](#privacy)
|
|
16
15
|
|
|
17
16
|
</div>
|
|
18
17
|
|
|
19
|
-
Pokégent is a Node.js TUI that scans your local machine to give you a live picture of your Pokémon AI tooling landscape. It detects running AI processes as Pokémon,
|
|
18
|
+
Pokégent is a Node.js TUI that scans your local machine to give you a live picture of your Pokémon AI tooling landscape. It detects running AI processes as active Pokémon, discovers installed TMs/HMs (MCP servers), tallies movepool (model) usage from history, and measures PP burn rates (tokens) — all locally, with zero outbound network requests.
|
|
20
19
|
|
|
21
20
|
> [!NOTE]
|
|
22
|
-
> Pokégent runs entirely locally.
|
|
21
|
+
> Pokégent runs entirely locally. It reads the process table, configuration directories, and local log files on your machine to render the results in your terminal. No telemetry, no network calls.
|
|
22
|
+
|
|
23
|
+
---
|
|
23
24
|
|
|
24
25
|
## Features
|
|
25
26
|
|
|
26
|
-
- **16 Pokémon
|
|
27
|
-
- **TM/HM (MCP)
|
|
28
|
-
- **Movepool
|
|
29
|
-
- **PP
|
|
30
|
-
- **Trainer
|
|
31
|
-
- **7 Trainer
|
|
32
|
-
- **
|
|
33
|
-
|
|
34
|
-
|
|
27
|
+
- **16 Pokémon Species Detectors** — Scans for running AI platforms represented as Pokémon (Mewtwo, Pikachu, Eevee, Gengar, Snorlax, Charizard, etc.).
|
|
28
|
+
- **TM/HM (MCP) Discovery** — Aggregates installed tool servers from standard config paths (Claude, Cursor, OpenCode, n8n, etc.).
|
|
29
|
+
- **Movepool Frequency Charts** — Analyzes shell history and log files for model name patterns, rendering horizontal ASCII bars.
|
|
30
|
+
- **PP Burn Analytics** — Measures battles (sessions), PP velocity (tokens/min), input/output splits, and estimated token costs.
|
|
31
|
+
- **Trainer Level Scoring** — Calculates a score from 0-1000 across your active roster, moves, and items.
|
|
32
|
+
- **7 Trainer Badges** — Earn badges like `Pokédex Master`, `Blast Burn`, or `Thunder Shock` based on your setup.
|
|
33
|
+
- **HTML Trainer Card** — Generates a self-contained, GameBoy-style HTML card featuring animated showdown sprites for active Pokémon.
|
|
34
|
+
|
|
35
|
+
---
|
|
35
36
|
|
|
36
37
|
## Installation
|
|
37
38
|
|
|
39
|
+
You can run and install Pokégent using the following methods:
|
|
40
|
+
|
|
41
|
+
### 1. Run directly (Zero Install)
|
|
42
|
+
The quickest way to run Pokégent is using `npx`:
|
|
38
43
|
```bash
|
|
39
|
-
# Run directly with npx (zero install)
|
|
40
44
|
npx pokegent
|
|
45
|
+
```
|
|
41
46
|
|
|
42
|
-
|
|
47
|
+
### 2. Global Installation
|
|
48
|
+
To install Pokégent globally on your system:
|
|
49
|
+
```bash
|
|
43
50
|
npm install -g pokegent
|
|
44
51
|
```
|
|
52
|
+
Once installed, you can start the TUI dashboard by typing:
|
|
53
|
+
```bash
|
|
54
|
+
pokegent
|
|
55
|
+
```
|
|
45
56
|
|
|
46
|
-
|
|
47
|
-
|
|
57
|
+
### 3. Build & Run from Source (Local Development)
|
|
58
|
+
If you want to run or modify the code locally:
|
|
48
59
|
```bash
|
|
49
|
-
#
|
|
50
|
-
|
|
60
|
+
# Clone the repository
|
|
61
|
+
git clone https://github.com/shafiqimtiaz/pokegent.git
|
|
62
|
+
cd pokegent
|
|
51
63
|
|
|
52
|
-
#
|
|
53
|
-
|
|
64
|
+
# Install dependencies
|
|
65
|
+
npm install
|
|
54
66
|
|
|
55
|
-
#
|
|
56
|
-
|
|
67
|
+
# Build the project (compiles TypeScript to dist/index.js)
|
|
68
|
+
npm run build
|
|
57
69
|
|
|
58
|
-
#
|
|
59
|
-
|
|
70
|
+
# Start the dashboard
|
|
71
|
+
npm start
|
|
60
72
|
|
|
61
|
-
#
|
|
62
|
-
|
|
73
|
+
# Run with demo mock data
|
|
74
|
+
node dist/index.js --demo
|
|
63
75
|
```
|
|
64
76
|
|
|
65
|
-
|
|
77
|
+
---
|
|
66
78
|
|
|
67
|
-
|
|
68
|
-
|-----|--------|
|
|
69
|
-
| `q` | Quit the application |
|
|
70
|
-
| `r` | Force an immediate refresh |
|
|
71
|
-
| `s` | Share card (copy markdown to clipboard) |
|
|
72
|
-
| `h` | Generate HTML card |
|
|
73
|
-
|
|
74
|
-
## Share your setup
|
|
75
|
-
|
|
76
|
-
The viral mechanic: **press `s` to copy a markdown card to clipboard, or `h` to generate an HTML file.**
|
|
79
|
+
## Usage
|
|
77
80
|
|
|
78
|
-
|
|
81
|
+
Run Pokégent with optional flags to generate reports or export data:
|
|
79
82
|
|
|
80
83
|
```bash
|
|
81
|
-
|
|
82
|
-
|
|
84
|
+
# Start TUI dashboard with live local scans
|
|
85
|
+
pokegent
|
|
83
86
|
|
|
84
|
-
|
|
87
|
+
# Start TUI dashboard in demo mode (with realistic mock data)
|
|
88
|
+
pokegent --demo
|
|
85
89
|
|
|
86
|
-
|
|
90
|
+
# Generate a markdown Trainer Card and copy it to the clipboard
|
|
91
|
+
pokegent --share
|
|
87
92
|
|
|
88
|
-
|
|
89
|
-
|
|
93
|
+
# Export stats as a GameBoy-style HTML card file (pokegent.html)
|
|
94
|
+
pokegent --html
|
|
95
|
+
|
|
96
|
+
# Export scanned data in raw JSON format
|
|
97
|
+
pokegent --json
|
|
90
98
|
```
|
|
91
99
|
|
|
92
|
-
|
|
100
|
+
### Keyboard Shortcuts (TUI Mode)
|
|
101
|
+
|
|
102
|
+
| Key | Action |
|
|
103
|
+
|-----|--------|
|
|
104
|
+
| `q` | Quit Pokégent |
|
|
105
|
+
| `r` | Force an immediate scan refresh |
|
|
106
|
+
| `s` | Share setup (copies markdown card to clipboard) |
|
|
107
|
+
| `h` | Generate HTML Trainer Card (`pokegent.html`) |
|
|
108
|
+
|
|
109
|
+
---
|
|
93
110
|
|
|
94
111
|
## Scoring
|
|
95
112
|
|
|
96
|
-
Your
|
|
113
|
+
Your roster, moves, and items get scored up to 1000 points:
|
|
97
114
|
|
|
98
115
|
| Dimension | Max Points | How |
|
|
99
116
|
|-----------|-----------|-----|
|
|
100
|
-
| Pokémon
|
|
101
|
-
| TMs & HMs (MCP) | 200 | 10 per server (cap 15) + 1 per tool (cap 50) |
|
|
102
|
-
| Movepool
|
|
103
|
-
| PP
|
|
104
|
-
|
|
105
|
-
### Rarity
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
117
|
+
| **Pokémon Running** | 350 pts | 75 pts per active Pokémon (cap 4) + 50 pts bonus for 3+ simultaneous |
|
|
118
|
+
| **TMs & HMs (MCP)** | 200 pts | 10 pts per server (cap 15) + 1 pt per tool/move (cap 50) |
|
|
119
|
+
| **Movepool Diversity** | 200 pts | 30 pts per unique model (cap 5) + 50 pts for using 3+ providers |
|
|
120
|
+
| **PP Velocity + Battles** | 250 pts | Velocity levels + session/battle count |
|
|
121
|
+
|
|
122
|
+
### Rarity Tiers
|
|
123
|
+
|
|
124
|
+
Based on your score, you are assigned a Trainer Tier:
|
|
125
|
+
- **900+** — 🌟 MYTHICAL CHAMPION (Top 1%)
|
|
126
|
+
- **750+** — 💎 SHINY LEGENDARY (Top 5%)
|
|
127
|
+
- **600+** — 🥇 POKÉMON MASTER (Top 15%)
|
|
128
|
+
- **400+** — 🥈 GYM LEADER (Top 35%)
|
|
129
|
+
- **200+** — 🥉 ELITE TRAINER (Top 60%)
|
|
130
|
+
- **<200** — 🌱 BEGINNER TRAINER (Rookie level)
|
|
131
|
+
|
|
132
|
+
---
|
|
115
133
|
|
|
116
134
|
## What gets scanned
|
|
117
135
|
|
|
118
136
|
<details>
|
|
119
|
-
<summary><strong>16 Pokémon
|
|
120
|
-
|
|
121
|
-
| Pokémon | CLI Platform | Process
|
|
122
|
-
|
|
123
|
-
| Mewtwo | Claude Code | `claude*` | `~/.claude` |
|
|
124
|
-
| Venusaur | Codex | `codex*` | `~/.codex` |
|
|
125
|
-
| Blastoise | GitHub Copilot CLI | `copilot*` | `~/.copilot` |
|
|
126
|
-
| Pikachu | Gemini CLI | `gemini*` | `~/.gemini` |
|
|
127
|
-
| Eevee | Cursor | `cursor` | `~/.cursor` |
|
|
128
|
-
| Charizard | Amp | `amp*` | `~/.amp` |
|
|
129
|
-
| Charmander | Cline | — | `~/.cline
|
|
130
|
-
| Gengar | Roo Code | `roo*` | `~/.roo` |
|
|
131
|
-
| Snorlax | Kilo Code | `kilo*` | `~/.kilo` |
|
|
132
|
-
| Zubat | Kiro | `kiro` | `~/.kiro` |
|
|
133
|
-
| Jigglypuff | Crush | — | `~/.crush` |
|
|
134
|
-
| Ditto | OpenCode | `opencode` | `~/.opencode` |
|
|
135
|
-
| Machamp | Factory Droid | `factory-droid` | `~/.factory-droid` |
|
|
136
|
-
| Rayquaza | Antigravity | `antigravity*` | `~/.antigravity` |
|
|
137
|
-
| Lapras | Kimi CLI | `kimi*` | `~/.kimi` |
|
|
138
|
-
| Dragonite | Qwen Code | `qwen*` | `~/.qwen` |
|
|
137
|
+
<summary><strong>16 Pokémon Species & CLI Mappings</strong></summary>
|
|
138
|
+
|
|
139
|
+
| Pokémon | CLI Platform | Process keyword | Config path |
|
|
140
|
+
|---------|--------------|-----------------|-------------|
|
|
141
|
+
| **Mewtwo** | Claude Code | `claude*` | `~/.claude` |
|
|
142
|
+
| **Venusaur** | Codex | `codex*` | `~/.codex` |
|
|
143
|
+
| **Blastoise** | GitHub Copilot CLI | `copilot*` | `~/.copilot` |
|
|
144
|
+
| **Pikachu** | Gemini CLI | `gemini*` | `~/.gemini` |
|
|
145
|
+
| **Eevee** | Cursor | `cursor` | `~/.cursor` |
|
|
146
|
+
| **Charizard** | Amp | `amp*` | `~/.amp` |
|
|
147
|
+
| **Charmander** | Cline | — | `~/.cline` |
|
|
148
|
+
| **Gengar** | Roo Code | `roo*` | `~/.roo` |
|
|
149
|
+
| **Snorlax** | Kilo Code | `kilo*` | `~/.kilo` |
|
|
150
|
+
| **Zubat** | Kiro | `kiro` | `~/.kiro` |
|
|
151
|
+
| **Jigglypuff** | Crush | — | `~/.crush` |
|
|
152
|
+
| **Ditto** | OpenCode | `opencode` | `~/.opencode` |
|
|
153
|
+
| **Machamp** | Factory Droid | `factory-droid` | `~/.factory-droid` |
|
|
154
|
+
| **Rayquaza** | Antigravity | `antigravity*` | `~/.antigravity` |
|
|
155
|
+
| **Lapras** | Kimi CLI | `kimi*` | `~/.kimi` |
|
|
156
|
+
| **Dragonite** | Qwen Code | `qwen*` | `~/.qwen` |
|
|
139
157
|
|
|
140
158
|
</details>
|
|
141
159
|
|
|
142
160
|
<details>
|
|
143
|
-
<summary><strong>Scanned
|
|
161
|
+
<summary><strong>Scanned Moves & Models (19 patterns)</strong></summary>
|
|
144
162
|
|
|
145
|
-
|
|
163
|
+
Scans for occurrences of the following model families in your local history and logs:
|
|
164
|
+
- `claude-4-opus`, `claude-4-sonnet`, `claude-3.7-sonnet`, `claude-3.5-sonnet`, `claude-3-haiku`
|
|
165
|
+
- `gpt-4.1`, `gpt-4o`, `gpt-4-turbo`, `o4-mini`, `o3`, `o3-mini`, `o3-pro`
|
|
166
|
+
- `gemini-2.5-pro`, `gemini-2.5-flash`, `gemini-2.0-flash`
|
|
167
|
+
- `deepseek-v3`, `deepseek-r1`, `qwen-3`, `llama-4`
|
|
146
168
|
|
|
147
169
|
</details>
|
|
148
170
|
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
- **[Ink](https://github.com/vadimdemedes/ink)** — React for CLI. Provides the TUI framework.
|
|
152
|
-
- **[ps-list](https://github.com/sindresorhus/ps-list)** — Cross-platform process listing.
|
|
153
|
-
- **Node.js 18+** — All scanning logic uses built-in modules (`fs`, `path`, `child_process`).
|
|
154
|
-
|
|
155
|
-
## Running from source
|
|
156
|
-
|
|
157
|
-
```bash
|
|
158
|
-
git clone https://github.com/shafiqimtiaz/pokegent.git
|
|
159
|
-
cd pokegent
|
|
160
|
-
npm install
|
|
161
|
-
npx tsx src/index.ts --demo
|
|
162
|
-
npx tsx src/index.ts
|
|
163
|
-
```
|
|
171
|
+
---
|
|
164
172
|
|
|
165
173
|
## Privacy
|
|
166
174
|
|
|
167
|
-
Pokégent runs 100% locally. No data leaves your machine. No telemetry. No analytics. No network requests.
|
|
175
|
+
Pokégent runs 100% locally. No data leaves your machine. No telemetry. No analytics. No outbound network requests are made during scanning. All log file parsing, process checking, and configuration scans happen entirely on your computer.
|
package/dist/index.js
CHANGED
|
@@ -11331,7 +11331,7 @@ function mockBurn2() {
|
|
|
11331
11331
|
}
|
|
11332
11332
|
|
|
11333
11333
|
// src/cli.tsx
|
|
11334
|
-
import { useState, useEffect, useCallback } from "react";
|
|
11334
|
+
import { useState, useEffect, useCallback, useRef } from "react";
|
|
11335
11335
|
import { Box, Text, useApp, useInput } from "ink";
|
|
11336
11336
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
11337
11337
|
function Dashboard({ demo }) {
|
|
@@ -11343,7 +11343,11 @@ function Dashboard({ demo }) {
|
|
|
11343
11343
|
const [scoreResult, setScoreResult] = useState(null);
|
|
11344
11344
|
const [scanTime, setScanTime] = useState(0);
|
|
11345
11345
|
const [lastMessage, setLastMessage] = useState("");
|
|
11346
|
+
const scanningRef = useRef(false);
|
|
11346
11347
|
const runScan = useCallback(async () => {
|
|
11348
|
+
if (scanningRef.current)
|
|
11349
|
+
return;
|
|
11350
|
+
scanningRef.current = true;
|
|
11347
11351
|
const t0 = Date.now();
|
|
11348
11352
|
try {
|
|
11349
11353
|
let c, m, mo, b;
|
|
@@ -11369,12 +11373,18 @@ function Dashboard({ demo }) {
|
|
|
11369
11373
|
setScanTime((Date.now() - t0) / 1e3);
|
|
11370
11374
|
} catch (err) {
|
|
11371
11375
|
setLastMessage(`Scan error: ${err}`);
|
|
11376
|
+
} finally {
|
|
11377
|
+
scanningRef.current = false;
|
|
11372
11378
|
}
|
|
11373
11379
|
}, [demo]);
|
|
11374
11380
|
useEffect(() => {
|
|
11375
|
-
|
|
11376
|
-
|
|
11377
|
-
|
|
11381
|
+
let timeoutId;
|
|
11382
|
+
async function tick() {
|
|
11383
|
+
await runScan();
|
|
11384
|
+
timeoutId = setTimeout(tick, REFRESH_INTERVAL);
|
|
11385
|
+
}
|
|
11386
|
+
tick();
|
|
11387
|
+
return () => clearTimeout(timeoutId);
|
|
11378
11388
|
}, [runScan]);
|
|
11379
11389
|
useInput((input, key) => {
|
|
11380
11390
|
if (input === "q")
|
|
@@ -11394,6 +11404,32 @@ function Dashboard({ demo }) {
|
|
|
11394
11404
|
setTimeout(() => setLastMessage(""), 3e3);
|
|
11395
11405
|
}
|
|
11396
11406
|
});
|
|
11407
|
+
if (clis.length === 0) {
|
|
11408
|
+
return /* @__PURE__ */ jsxs(Box, { flexDirection: "column", padding: 1, children: [
|
|
11409
|
+
/* @__PURE__ */ jsx(Box, { justifyContent: "space-between", marginBottom: 1, children: /* @__PURE__ */ jsxs(Text, { bold: true, color: "cyan", children: [
|
|
11410
|
+
APP_TITLE,
|
|
11411
|
+
" ",
|
|
11412
|
+
/* @__PURE__ */ jsxs(Text, { color: "gray", children: [
|
|
11413
|
+
"v",
|
|
11414
|
+
VERSION
|
|
11415
|
+
] })
|
|
11416
|
+
] }) }),
|
|
11417
|
+
/* @__PURE__ */ jsxs(Box, { marginTop: 2, marginBottom: 2, flexDirection: "column", gap: 1, children: [
|
|
11418
|
+
/* @__PURE__ */ jsx(Text, { bold: true, color: "yellow", children: "\u25D3 Scanning Pok\xE9mon coding ecosystem..." }),
|
|
11419
|
+
/* @__PURE__ */ jsx(Text, { color: "gray", children: "(First live scan takes a few seconds to recursively search local logs & history)" })
|
|
11420
|
+
] }),
|
|
11421
|
+
/* @__PURE__ */ jsxs(Box, { marginTop: 1, justifyContent: "space-between", children: [
|
|
11422
|
+
/* @__PURE__ */ jsxs(Text, { color: "gray", children: [
|
|
11423
|
+
/* @__PURE__ */ jsx(Text, { color: "green", children: "\u25CF LIVE" }),
|
|
11424
|
+
" \u2502 Scan: ",
|
|
11425
|
+
scanTime.toFixed(1),
|
|
11426
|
+
"s \u2502 ",
|
|
11427
|
+
(/* @__PURE__ */ new Date()).toLocaleTimeString()
|
|
11428
|
+
] }),
|
|
11429
|
+
/* @__PURE__ */ jsx(Text, { color: "gray", children: "q quit" })
|
|
11430
|
+
] })
|
|
11431
|
+
] });
|
|
11432
|
+
}
|
|
11397
11433
|
const running = clis.filter((c) => c.state === "RUNNING");
|
|
11398
11434
|
const totalTools = mcp.reduce((sum, t) => sum + t.toolCount, 0);
|
|
11399
11435
|
return /* @__PURE__ */ jsxs(Box, { flexDirection: "column", padding: 1, children: [
|