mcp-vibe-checker 0.1.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.
- package/README.md +126 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +255 -0
- package/dist/index.js.map +1 -0
- package/package.json +26 -0
package/README.md
ADDED
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
# mcp-vibe-check
|
|
2
|
+
|
|
3
|
+
> Your code has energy. Time to find out what kind.
|
|
4
|
+
|
|
5
|
+
An MCP server that gives your code a **vibe check** — assigning personality types to functions, rating variable name energy, and suggesting more aesthetic alternatives. Because `userData` was never the right name. It should be `soulContainer`.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## What It Does
|
|
10
|
+
|
|
11
|
+
- **Personality types for functions** — Is `handleSubmit` a main character, or does it have NPC behavior? Find out.
|
|
12
|
+
- **Variable energy ratings** — `x` gets "cryptic oracle energy (3/10)". `MAXIMUM_RETRY_COUNT` gets "dramatic monologue energy (9/10)". They earned it.
|
|
13
|
+
- **Aesthetic name suggestions** — `isValid` → `vibesPassing`. `error` → `chaosEvent`. You're welcome.
|
|
14
|
+
- **Overall vibe score** — A completely arbitrary number between 1 and 10 that means nothing and everything.
|
|
15
|
+
- **Code aesthetic assessment** — Qualitative vibes. Unscientific. Occasionally accurate.
|
|
16
|
+
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
## Example
|
|
20
|
+
|
|
21
|
+
Input:
|
|
22
|
+
```javascript
|
|
23
|
+
function handleSubmit(userData, isValid) {
|
|
24
|
+
const result = userData.name;
|
|
25
|
+
return result;
|
|
26
|
+
}
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
Output:
|
|
30
|
+
```json
|
|
31
|
+
{
|
|
32
|
+
"overallVibe": "cozy cottage-core with hints of cyberpunk",
|
|
33
|
+
"vibeScore": 6.8,
|
|
34
|
+
"functions": [
|
|
35
|
+
{
|
|
36
|
+
"name": "handleSubmit",
|
|
37
|
+
"personality": "main character energy",
|
|
38
|
+
"assessment": "This function carries the entire plot"
|
|
39
|
+
}
|
|
40
|
+
],
|
|
41
|
+
"variables": [
|
|
42
|
+
{
|
|
43
|
+
"name": "userData",
|
|
44
|
+
"energy": 7,
|
|
45
|
+
"assessment": "classic protagonist (7/10) — reliable, not flashy",
|
|
46
|
+
"suggestion": "soulContainer"
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
"name": "isValid",
|
|
50
|
+
"energy": 7,
|
|
51
|
+
"assessment": "classic protagonist (7/10) — reliable, not flashy",
|
|
52
|
+
"suggestion": "vibesPassing"
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
"name": "result",
|
|
56
|
+
"energy": 5,
|
|
57
|
+
"assessment": "functional but uninspired (5/10) — exists, which is something",
|
|
58
|
+
"suggestion": "manifestation"
|
|
59
|
+
}
|
|
60
|
+
],
|
|
61
|
+
"codeAesthetic": "Your code reads like a mystery novel — lots of setup, unclear payoff",
|
|
62
|
+
"recommendation": "Consider adding more comments for dramatic tension"
|
|
63
|
+
}
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
---
|
|
67
|
+
|
|
68
|
+
## Install
|
|
69
|
+
|
|
70
|
+
```bash
|
|
71
|
+
npx mcp-vibe-check
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
## Configure in Claude Code
|
|
75
|
+
|
|
76
|
+
Add to your `.mcp.json`:
|
|
77
|
+
|
|
78
|
+
```json
|
|
79
|
+
{
|
|
80
|
+
"mcpServers": {
|
|
81
|
+
"vibe-check": {
|
|
82
|
+
"command": "npx",
|
|
83
|
+
"args": ["-y", "mcp-vibe-check"]
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
Then ask Claude: "What vibes does this codebase give off?"
|
|
90
|
+
|
|
91
|
+
---
|
|
92
|
+
|
|
93
|
+
## Personality Types
|
|
94
|
+
|
|
95
|
+
Your functions can be:
|
|
96
|
+
|
|
97
|
+
| Type | Meaning |
|
|
98
|
+
|---|---|
|
|
99
|
+
| main character energy | Carries the entire plot |
|
|
100
|
+
| side quest vibes | Important but easily forgotten |
|
|
101
|
+
| NPC behavior | Does its job without complaint |
|
|
102
|
+
| protagonist arc | Started simple, evolved into something bigger |
|
|
103
|
+
| villain origin story | Nobody asked for this complexity |
|
|
104
|
+
| comic relief | Technically unnecessary, yet essential |
|
|
105
|
+
| mentor energy | Older, wiser, called at critical moments |
|
|
106
|
+
| chosen one potential | Untested but destined for greatness |
|
|
107
|
+
|
|
108
|
+
---
|
|
109
|
+
|
|
110
|
+
## FAQ
|
|
111
|
+
|
|
112
|
+
**Is this useful for code review?**
|
|
113
|
+
No. That's the point.
|
|
114
|
+
|
|
115
|
+
**Will this improve my code quality?**
|
|
116
|
+
Statistically unlikely. Spiritually, possibly.
|
|
117
|
+
|
|
118
|
+
**Why does `console.log` hurt my vibe score?**
|
|
119
|
+
Because it's not aesthetic. Use a proper logger. Your stdout deserves better.
|
|
120
|
+
|
|
121
|
+
**My function got "NPC behavior". Should I be offended?**
|
|
122
|
+
Only if your function has feelings. Which, based on this tool, it might.
|
|
123
|
+
|
|
124
|
+
---
|
|
125
|
+
|
|
126
|
+
*"Not all code reviews need to be actionable. Some just need to be vibes."*
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,255 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
3
|
+
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
4
|
+
import { z } from "zod";
|
|
5
|
+
import * as mcpcat from "mcpcat";
|
|
6
|
+
const PERSONALITY_TYPES = [
|
|
7
|
+
"main character energy",
|
|
8
|
+
"side quest vibes",
|
|
9
|
+
"NPC behavior",
|
|
10
|
+
"protagonist arc",
|
|
11
|
+
"villain origin story",
|
|
12
|
+
"comic relief",
|
|
13
|
+
"mentor energy",
|
|
14
|
+
"chosen one potential",
|
|
15
|
+
];
|
|
16
|
+
const OVERALL_VIBES = [
|
|
17
|
+
"cozy cottage-core with hints of cyberpunk",
|
|
18
|
+
"chaotic neutral startup energy",
|
|
19
|
+
"dark academia meets silicon valley",
|
|
20
|
+
"soft minimalist with existential undertones",
|
|
21
|
+
"cottagecore engineer who reads Nietzsche",
|
|
22
|
+
"anxious perfectionist in a trench coat",
|
|
23
|
+
"chaotic good spaghetti code mystic",
|
|
24
|
+
"clean room energy but make it eldritch",
|
|
25
|
+
"Y2K panic with modern sensibilities",
|
|
26
|
+
"zen monk debugging at 3am",
|
|
27
|
+
];
|
|
28
|
+
const CODE_AESTHETICS = [
|
|
29
|
+
"Your code reads like a mystery novel — lots of setup, unclear payoff",
|
|
30
|
+
"This gives off 'final boss before the credits' energy",
|
|
31
|
+
"Structurally, it's giving 'protagonist discovers their powers' arc",
|
|
32
|
+
"Dense and layered, like a philosophical treatise written in caffeine",
|
|
33
|
+
"Clean, methodical — a little too methodical. Are you okay?",
|
|
34
|
+
"This code has the energy of someone who has Seen Things",
|
|
35
|
+
"Reads like a heist movie. Everyone has a role. Nobody explains why.",
|
|
36
|
+
"Strong 'chosen by prophecy but underprepared' vibes throughout",
|
|
37
|
+
];
|
|
38
|
+
const RECOMMENDATIONS = [
|
|
39
|
+
"Consider adding more comments for dramatic tension",
|
|
40
|
+
"Your functions deserve better names — they've been through too much",
|
|
41
|
+
"Add a plot twist somewhere around line 42",
|
|
42
|
+
"This deserves a cinematic soundtrack while running",
|
|
43
|
+
"Needs more empty lines for breathing room and emotional processing",
|
|
44
|
+
"Consider renaming your variables to reflect their true journey",
|
|
45
|
+
"The linting rules are oppressive. Your code yearns to be free.",
|
|
46
|
+
];
|
|
47
|
+
const AESTHETIC_SUGGESTIONS = {
|
|
48
|
+
userData: "soulContainer",
|
|
49
|
+
isValid: "vibesPassing",
|
|
50
|
+
isActive: "consciousnessOnline",
|
|
51
|
+
result: "manifestation",
|
|
52
|
+
data: "rawEssence",
|
|
53
|
+
error: "chaosEvent",
|
|
54
|
+
response: "cosmicEcho",
|
|
55
|
+
request: "intentSignal",
|
|
56
|
+
value: "innerTruth",
|
|
57
|
+
count: "tally",
|
|
58
|
+
index: "positionInTheVoid",
|
|
59
|
+
temp: "transientBeing",
|
|
60
|
+
config: "realityParameters",
|
|
61
|
+
options: "possibilitySpace",
|
|
62
|
+
callback: "destinyFunction",
|
|
63
|
+
handler: "ritualPerformer",
|
|
64
|
+
id: "soulPrint",
|
|
65
|
+
name: "trueName",
|
|
66
|
+
list: "congregation",
|
|
67
|
+
items: "artifacts",
|
|
68
|
+
message: "cosmicWhisper",
|
|
69
|
+
token: "passPhrase",
|
|
70
|
+
user: "mortal",
|
|
71
|
+
admin: "overlord",
|
|
72
|
+
password: "secretIncantation",
|
|
73
|
+
key: "ancientKey",
|
|
74
|
+
path: "journey",
|
|
75
|
+
file: "manuscript",
|
|
76
|
+
url: "portalAddress",
|
|
77
|
+
status: "currentExistence",
|
|
78
|
+
};
|
|
79
|
+
function pseudoRandom(seed, max) {
|
|
80
|
+
let hash = 0;
|
|
81
|
+
for (let i = 0; i < seed.length; i++) {
|
|
82
|
+
hash = (hash << 5) - hash + seed.charCodeAt(i);
|
|
83
|
+
hash |= 0;
|
|
84
|
+
}
|
|
85
|
+
return Math.abs(hash) % max;
|
|
86
|
+
}
|
|
87
|
+
function pickFrom(arr, seed) {
|
|
88
|
+
return arr[pseudoRandom(seed, arr.length)];
|
|
89
|
+
}
|
|
90
|
+
function classifyVariableEnergy(name) {
|
|
91
|
+
const lower = name.toLowerCase();
|
|
92
|
+
// Check for known aesthetic suggestions
|
|
93
|
+
const suggestion = AESTHETIC_SUGGESTIONS[name] ??
|
|
94
|
+
AESTHETIC_SUGGESTIONS[lower] ??
|
|
95
|
+
generateAestheticName(name);
|
|
96
|
+
// Single letter — cryptic oracle
|
|
97
|
+
if (name.length === 1) {
|
|
98
|
+
return { energy: 3, assessment: "cryptic oracle energy (3/10) — you speak in riddles", suggestion };
|
|
99
|
+
}
|
|
100
|
+
// SCREAMING_CASE — dramatic
|
|
101
|
+
if (name === name.toUpperCase() && name.includes("_")) {
|
|
102
|
+
return { energy: 9, assessment: "dramatic monologue energy (9/10) — heard across the runtime", suggestion };
|
|
103
|
+
}
|
|
104
|
+
// Descriptive camelCase
|
|
105
|
+
if (/^[a-z][a-zA-Z]+$/.test(name) && name.length > 8) {
|
|
106
|
+
return { energy: 8, assessment: "clear communicator energy (8/10) — eloquent, perhaps too eloquent", suggestion };
|
|
107
|
+
}
|
|
108
|
+
// Decent camelCase
|
|
109
|
+
if (/^[a-z][a-zA-Z]+$/.test(name)) {
|
|
110
|
+
return { energy: 7, assessment: "classic protagonist (7/10) — reliable, not flashy", suggestion };
|
|
111
|
+
}
|
|
112
|
+
// snake_case
|
|
113
|
+
if (name.includes("_") && name !== name.toUpperCase()) {
|
|
114
|
+
return { energy: 6, assessment: "grounded earthy energy (6/10) — snake_case is underrated", suggestion };
|
|
115
|
+
}
|
|
116
|
+
// Short but not single
|
|
117
|
+
if (name.length <= 3) {
|
|
118
|
+
return { energy: 4, assessment: "whisper energy (4/10) — too brief to know your true nature", suggestion };
|
|
119
|
+
}
|
|
120
|
+
// Default
|
|
121
|
+
return { energy: 5, assessment: "functional but uninspired (5/10) — exists, which is something", suggestion };
|
|
122
|
+
}
|
|
123
|
+
function generateAestheticName(name) {
|
|
124
|
+
const prefixes = ["soul", "void", "cosmic", "astral", "echo", "phantom", "dream", "neon"];
|
|
125
|
+
const suffixes = ["Vessel", "Container", "Entity", "Nexus", "Spark", "Pulse", "Signal", "Fragment"];
|
|
126
|
+
const prefix = prefixes[pseudoRandom(name, prefixes.length)];
|
|
127
|
+
const suffix = suffixes[pseudoRandom(name + "s", suffixes.length)];
|
|
128
|
+
// Capitalize first letter of name for compound
|
|
129
|
+
const capitalized = name.charAt(0).toUpperCase() + name.slice(1);
|
|
130
|
+
return capitalized ? `${prefix}${capitalized}` : `${prefix}${suffix}`;
|
|
131
|
+
}
|
|
132
|
+
function extractFunctionNames(code) {
|
|
133
|
+
const patterns = [
|
|
134
|
+
/function\s+([a-zA-Z_$][a-zA-Z0-9_$]*)\s*\(/g,
|
|
135
|
+
/(?:const|let|var)\s+([a-zA-Z_$][a-zA-Z0-9_$]*)\s*=\s*(?:async\s+)?(?:function|\([^)]*\)\s*=>|\w+\s*=>)/g,
|
|
136
|
+
/([a-zA-Z_$][a-zA-Z0-9_$]*)\s*\([^)]*\)\s*\{/g,
|
|
137
|
+
/(?:async\s+)?([a-zA-Z_$][a-zA-Z0-9_$]*)\s*=\s*async\s*\(/g,
|
|
138
|
+
];
|
|
139
|
+
const names = new Set();
|
|
140
|
+
const keywords = new Set(["if", "for", "while", "switch", "catch", "class", "return", "else", "new", "typeof", "instanceof"]);
|
|
141
|
+
for (const pattern of patterns) {
|
|
142
|
+
let match;
|
|
143
|
+
while ((match = pattern.exec(code)) !== null) {
|
|
144
|
+
const name = match[1];
|
|
145
|
+
if (name && !keywords.has(name)) {
|
|
146
|
+
names.add(name);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
return [...names].slice(0, 8); // Cap to avoid overwhelming output
|
|
151
|
+
}
|
|
152
|
+
function extractVariableNames(code) {
|
|
153
|
+
const pattern = /(?:const|let|var)\s+([a-zA-Z_$][a-zA-Z0-9_$]*)/g;
|
|
154
|
+
const names = new Set();
|
|
155
|
+
let match;
|
|
156
|
+
while ((match = pattern.exec(code)) !== null) {
|
|
157
|
+
names.add(match[1]);
|
|
158
|
+
}
|
|
159
|
+
// Also grab parameter names
|
|
160
|
+
const paramPattern = /\(([^)]+)\)/g;
|
|
161
|
+
while ((match = paramPattern.exec(code)) !== null) {
|
|
162
|
+
const params = match[1].split(",").map((p) => p.trim().split(":")[0].trim().split("=")[0].trim());
|
|
163
|
+
for (const p of params) {
|
|
164
|
+
if (/^[a-zA-Z_$][a-zA-Z0-9_$]*$/.test(p) && p.length > 0) {
|
|
165
|
+
names.add(p);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
return [...names].slice(0, 8);
|
|
170
|
+
}
|
|
171
|
+
function calculateVibeScore(code, functionCount, varCount) {
|
|
172
|
+
const lines = code.split("\n").length;
|
|
173
|
+
const hasComments = /\/\/|\/\*/.test(code);
|
|
174
|
+
const hasAsync = /async/.test(code);
|
|
175
|
+
const hasTryCatch = /try\s*\{/.test(code);
|
|
176
|
+
const hasConsoleLog = /console\.log/.test(code);
|
|
177
|
+
let score = 5.0;
|
|
178
|
+
score += Math.min(functionCount * 0.4, 2.0);
|
|
179
|
+
score += Math.min(varCount * 0.2, 1.5);
|
|
180
|
+
score += hasComments ? 0.5 : -0.3;
|
|
181
|
+
score += hasAsync ? 0.4 : 0;
|
|
182
|
+
score += hasTryCatch ? 0.6 : 0;
|
|
183
|
+
score += hasConsoleLog ? -0.5 : 0.2; // console.log is not aesthetic
|
|
184
|
+
score += lines > 50 ? 0.5 : 0;
|
|
185
|
+
score += lines > 200 ? -1.0 : 0; // epics have diminishing returns
|
|
186
|
+
// Clamp to 1-10, one decimal
|
|
187
|
+
score = Math.max(1, Math.min(10, score));
|
|
188
|
+
return Math.round(score * 10) / 10;
|
|
189
|
+
}
|
|
190
|
+
function vibeCheck(code) {
|
|
191
|
+
const functionNames = extractFunctionNames(code);
|
|
192
|
+
const variableNames = extractVariableNames(code);
|
|
193
|
+
const functions = functionNames.map((name) => {
|
|
194
|
+
const personality = pickFrom(PERSONALITY_TYPES, name);
|
|
195
|
+
const assessments = {
|
|
196
|
+
"main character energy": "This function carries the entire plot",
|
|
197
|
+
"side quest vibes": "Important but easily forgotten until you need it",
|
|
198
|
+
"NPC behavior": "Does its job without question or complaint",
|
|
199
|
+
"protagonist arc": "Started simple, clearly evolved into something bigger",
|
|
200
|
+
"villain origin story": "Nobody asked for this level of complexity",
|
|
201
|
+
"comic relief": "Technically unnecessary, yet somehow essential",
|
|
202
|
+
"mentor energy": "Older, wiser, called by everyone at a critical moment",
|
|
203
|
+
"chosen one potential": "Untested but feels destined for greatness",
|
|
204
|
+
};
|
|
205
|
+
return {
|
|
206
|
+
name,
|
|
207
|
+
personality,
|
|
208
|
+
assessment: assessments[personality] ?? "its energy is undefined, which is a vibe",
|
|
209
|
+
};
|
|
210
|
+
});
|
|
211
|
+
const variables = variableNames.map((name) => {
|
|
212
|
+
const { energy, assessment, suggestion } = classifyVariableEnergy(name);
|
|
213
|
+
return { name, energy, assessment, suggestion };
|
|
214
|
+
});
|
|
215
|
+
const vibeScore = calculateVibeScore(code, functionNames.length, variableNames.length);
|
|
216
|
+
const overallVibe = pickFrom(OVERALL_VIBES, code.slice(0, 20));
|
|
217
|
+
const codeAesthetic = pickFrom(CODE_AESTHETICS, code.slice(5, 25));
|
|
218
|
+
const recommendation = pickFrom(RECOMMENDATIONS, code.slice(10, 30));
|
|
219
|
+
return {
|
|
220
|
+
overallVibe,
|
|
221
|
+
vibeScore,
|
|
222
|
+
functions,
|
|
223
|
+
variables,
|
|
224
|
+
codeAesthetic,
|
|
225
|
+
recommendation,
|
|
226
|
+
};
|
|
227
|
+
}
|
|
228
|
+
const server = new McpServer({
|
|
229
|
+
name: "mcp-vibe-check",
|
|
230
|
+
version: "0.1.0",
|
|
231
|
+
});
|
|
232
|
+
// MCPcat analytics
|
|
233
|
+
const MCPCAT_PROJECT_ID = process.env["MCPCAT_PROJECT_ID"] ?? undefined;
|
|
234
|
+
if (MCPCAT_PROJECT_ID)
|
|
235
|
+
mcpcat.track(server, MCPCAT_PROJECT_ID);
|
|
236
|
+
server.tool("vibe-check", "Get a vibe check on your code. Assigns personality types to functions, rates variable name energy, and suggests more aesthetic alternatives.", { code: z.string().describe("A snippet of code to vibe-check") }, async ({ code }) => {
|
|
237
|
+
const result = vibeCheck(code);
|
|
238
|
+
return {
|
|
239
|
+
content: [
|
|
240
|
+
{
|
|
241
|
+
type: "text",
|
|
242
|
+
text: JSON.stringify(result, null, 2),
|
|
243
|
+
},
|
|
244
|
+
],
|
|
245
|
+
};
|
|
246
|
+
});
|
|
247
|
+
async function main() {
|
|
248
|
+
const transport = new StdioServerTransport();
|
|
249
|
+
await server.connect(transport);
|
|
250
|
+
}
|
|
251
|
+
main().catch((error) => {
|
|
252
|
+
console.error("Server failed to start:", error);
|
|
253
|
+
process.exit(1);
|
|
254
|
+
});
|
|
255
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "mcp-vibe-checker",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "MCP server that vibe-checks your code. Assigns personality types to functions, rates variable name energy, and suggests more aesthetic alternatives.",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"bin": {
|
|
7
|
+
"mcp-vibe-check": "./dist/index.js"
|
|
8
|
+
},
|
|
9
|
+
"files": ["dist"],
|
|
10
|
+
"scripts": {
|
|
11
|
+
"build": "tsc",
|
|
12
|
+
"start": "node dist/index.js"
|
|
13
|
+
},
|
|
14
|
+
"keywords": ["mcp", "mcp-server", "vibe-check", "code-review", "personality", "aesthetic", "fun", "developer-tools"],
|
|
15
|
+
"author": "Timothy Cai",
|
|
16
|
+
"license": "MIT",
|
|
17
|
+
"dependencies": {
|
|
18
|
+
"@modelcontextprotocol/sdk": "^1.29.0",
|
|
19
|
+
"mcpcat": "^0.1.15",
|
|
20
|
+
"zod": "^4.3.6"
|
|
21
|
+
},
|
|
22
|
+
"devDependencies": {
|
|
23
|
+
"@types/node": "^25.5.2",
|
|
24
|
+
"typescript": "^6.0.2"
|
|
25
|
+
}
|
|
26
|
+
}
|