GitHub
Connect AI assistants to GitHub - manage repos, issues, PRs, and workflows through natural language.
Descripción del creador (original en inglés)
Find out why a TypeScript project is slow: measured analysis and before/after comparison.
Estos tres nunca se combinan en una sola puntuación: las opiniones, las mediciones y la popularidad son cosas distintas.
Todavía no escribimos un resumen sencillo para este. Abajo están los datos que leímos del registro.
Elige la app de IA que usas y copia la configuración.
Necesitas
¿Qué app usas?
Elige tu app arriba. La recordamos, así que la próxima vez el botón dirá “Instalar en …”.
Abre Claude Desktop → Settings → Developer → Edit Config y pega esto en claude_desktop_config.json
{
"mcpServers": {
"whyts": {
"command": "npx",
"args": [
"-y",
"whyts-mcp"
]
}
}
}Ejecuta esto en tu terminal
claude mcp add whyts -- npx -y whyts-mcpPégalo en .cursor/mcp.json de tu proyecto, o en ~/.cursor/mcp.json
{
"mcpServers": {
"whyts": {
"command": "npx",
"args": [
"-y",
"whyts-mcp"
]
}
}
}Tu navegador te pide permiso para abrir la app; luego la app muestra la configuración y te pide confirmar. Los valores de las claves quedan vacíos para que los completes tú.
Pégalo en .vscode/mcp.json de tu proyecto
{
"servers": {
"whyts": {
"type": "stdio",
"command": "npx",
"args": [
"-y",
"whyts-mcp"
]
}
}
}Tu navegador te pide permiso para abrir la app; luego la app muestra la configuración y te pide confirmar. Los valores de las claves quedan vacíos para que los completes tú.
Este se ejecuta en tu computadora, y ChatGPT solo puede conectarse a servidores en internet. Elige otra app.
Tu elección se guarda en una cookie en este dispositivo; no necesitas cuenta.
Esta configuración se genera a partir de la ficha del creador en el registro. Si el README dice otra cosa, sigue el README.
Se ejecuta en tu computadora; la lista de herramientas aparece en tu app de IA después de instalarlo.
Revisamos información que cualquiera puede ver; no hemos leído el código. Las revisiones que no aplican no se cuentan. · Revisado el 7 nov 2026
El nombre en el registro se verificó con la cuenta de GitHub musatoktas, dueña del repo
Todavía no hemos leído este repo en GitHub
Todavía no hemos leído este repo en GitHub
Este se ejecuta en tu computadora; no hay endpoint en internet
Se ejecuta en tu computadora y usa ajustes locales en su lugar
Se ejecuta en tu computadora; solo podemos leer listas de herramientas de endpoints en internet
Comparado con todos los servidores activos de esta categoría en el registro. Las estrellas solo cuentan cuando quien lo publica es dueño del repo.
Superó 1 de 1 revisiones básicas aplicables. No hemos leído el código. Antes de agregar una clave o un token, revisa qué acceso pide el servidor y usa una clave que tenga solo los permisos que necesitas.
El registro no indica ninguna clave obligatoria, aunque algunos servidores te piden iniciar sesión la primera vez que los usas.
Se ejecuta en tu computadora. Tu app de IA lo inicia cuando hace falta, y los datos no pasan por los servidores del creador (a menos que el propio servidor llame a un servicio en línea).
El repo de GitHub cambió por última vez –, y la última versión (0.8.10) llegó al registro hace 15 días.
Las apps compatibles con MCP, como Claude Desktop, Claude Code, Cursor y VS Code. También necesitas Node.js en tu computadora.
En la misma categoría: GitHub, Desktop Commander, Cloudflare MCP
Servidores de la misma categoría hechos por otros creadores, ordenados por estrellas.
Cómo leer una tarjeta:★ Estrellas de GitHubiTres pilares: reseñas · revisiones · usoiActualizado = fecha en que se publicó la última versión en el registroi
Connect AI assistants to GitHub - manage repos, issues, PRs, and workflows through natural language.
MCP server for terminal commands, file operations, and process management
Cloudflare MCP servers
Copiado tal cual del repo del creador. PopNx MCP no lo ha revisado ni lo respalda. Se quitaron HTML, imágenes y scripts. Los enlaces llevan fuera de este sitio.
Find out why your TypeScript project is slow.
A small CLI that turns compiler diagnostics, traces, and import relationships into evidence you can act on. It says where the check is slow, and for three known patterns it also says why and what to do. No account, API key, or LLM required.
npx whyts
Run it in the folder of your tsconfig.json. It runs the real compiler once and prints at most three actions. To prove that a type change helped, use npx whyts compare (see below). To give the same evidence to an AI coding agent, use claude mcp add --transport stdio whyts -- npx -y whyts-mcp.
Found with whyts: a 7.4 s type check that went to 0.06 s (TanStack Form) and vue-tsc going from 80 s to 0.56 s (Vue). See Real cases.
Requires Node.js 20+ and a TypeScript project with dependencies installed.
npx whyts --project .
For repeatable runs, pin a version: npx whyts@0.8.4 --project .
To run from a checkout:
git clone https://github.com/musatoktas/whyts.git
cd whyts npm ci --ignore-scripts npm run demo node src/cli.js --project /path/to/your/tsconfig.json
By default, whyts prints at most three actions and one summary line. Each action has a pattern, a location, a short remedy and a link. The image above is a recorded run. Use --verbose for the full report.
whyts 0.8.5 · TypeScript 5.9.3 · repro-project/tsconfig.json
Check 10.20s · Total 10.80s · 65 files · 1 compiler error · 2 findings in the full report. Use --verbose to see them.
Eight patterns have a remedy. Each one was seen in a real project before it was added.
| Pattern | Trace evidence | Remedy |
|---|---|---|
recursive-type-instantiation | A TS2589 error and the instantiateType_DepthLimit events. whyts finds the type alias that owns the type parameters at the limit, a reference cycle by name between aliases, and a type argument that refers to itself | Stop the expansion on a type that was visited, or add a depth limit |
partial-constraint | A TS2589 error at a type reference, and instantiateType_DepthLimit events inside a generic type. A type parameter of the referenced declaration has a constraint that gives that generic type fewer type arguments than it declares, so the omitted ones take their defaults | Give all type arguments in the constraint, for example any for each. If the constraint is in a dependency, tell its maintainers |
instantiation-expression | A TS2589 error at a type reference to a type alias whose body is a conditional type, such as ReturnType or Parameters. A type argument is an instantiation expression (typeof f ), and the instantiateType_DepthLimit events are not inside that alias | Write the conditional type in place, with the expression as the checked type. For ReturnType, the declared return type of f can be used instead |
builder-chain | A TS2589 error at the start of a chain of method calls, and instantiateType_DepthLimit events inside a class. The method called most often in the chain, followed back through variables, takes and returns that class, and is called at least 32 times | Build the calls as separate values of at most 32 calls each, and join them with the same method. Cutting the chain into variables does not help |
nested-declaration | A TS2589 error at a type or at the name of a declaration, and instantiateType_DepthLimit events inside a generic type. Through type aliases, interfaces and typeof, the type reaches a value whose written type in a declaration file nests that generic type at least 8 levels deep | Write the data type by hand as named interfaces, and annotate the value in its source with a type that names them. If the declaration is in a dependency, tell its maintainers |
callback-inference | A check chain whose focus is a call that took 200 ms or more, and recorded type comparisons and nested checks cover at most 25% of it. The trace has no event for type argument inference. The call gives no type arguments, a generic declaration of the callee has a parameter whose type uses its type parameters, and the argument for it is a function with its own type: a name of a function, or a function whose parameters all have types | In the declaration, wrap the whole parameter type (for a rest parameter, its element type) in NoInfer<...> (TypeScript 5.4 or later). At the call site, give the type argument, or pass an arrow function without parameter types. If the declaration is in a dependency, tell its maintainers |
variance-computation | getVariancesWorker events with the type id, the number of type parameters and the result. whyts reports the outermost events, the largest nested ones, and their union time | Reduce type parameters, simplify return types. An in or out annotation is not a guaranteed fix |
program-load | The program is big, and the check is not. The compiler counters (Total time, Check time, Memory used, parse and bind time) and the import graph. whyts reports the files from node_modules, the largest packages, the file that brings most of them, and the typeof import() references that bring them | Use a narrower entry point, or ask the maintainers of the package to move the references to an opt-in entry point. skipLibCheck does not help: it skips checking, not loading |
A program-load action looks like this (vuetify 4.2.4, a project that only has import { createVuetify } from "vuetify"; the lines are shortened):
1. [measured] Program load: 421 dependency files, vuetify has 407; Check time is 0.01s of 4.22s
Where: ../node_modules/vuetify/lib/framework.d.ts:1:1 The program has 480 files: 421 in node_modules (13.8 MB of source), 58 compiler library files and 1 of your own. ... Memory used 577 MB in the traced run. Largest packages by files: vuetify 407 (12 MB), @vuetify/v0 3 (0 MB), vue 2 (0 MB), ... 409 of them (11.9 MB) come only through 218 typeof import() type references in ../node_modules/vuetify/lib/framework.d.ts, to ../node_modules/vuetify/lib/components/index.d.ts (192), ... Shortest import chain: index.ts -> ../node_modules/vuetify/lib/framework.d.ts -> ../node_modules/vuetify/lib/components/index.d.ts Fix: Each typeof import() reference in ... loads its target for every project that imports the package. Ask the maintainers to move them to an opt-in entry point. skipLibCheck skips checking these files, not loading them. ...
Rules:
measured when the compiler recorded it (the error or the trace events). The name-based walk over type aliases is syntax only: it can miss a cycle that runs through imports it cannot match by name, or through a type that is not a declaration of the program.instantiateType_DepthLimit, getVariancesWorker). In TypeScript 7 they carry a checkerId, and whyts uses one checker, so the type ids stay unique.program-load pattern needs all of these: 200 files or more from node_modules, a Total time of 1 s or more, a Check time of at most 1 s and at most 10% of the Total time, and one file that alone brings 100 files or more (and 25% of the dependency files). The compiler library files and your own files do not count as dependency files. A project with a normal amount of its own code has a larger Check time and does not match. The counters come from the traced run, where Memory used is higher than in a plain run.program-load is a measurement of the program, not of the check. It does not say that removing the files makes the check faster: the check time of such a program is already small. It reads typeof import('pkg') in declaration files as an import. A file that is also brought by a regular import is not counted as brought only by those references.callback-inference is a match of the call shape and of the time that the trace does not explain. The trace has no event for inference, so whyts does not prove that inference is the cost. It reads only the syntax of the callee declarations and of the argument. It does not know which overload the compiler chose. A type parameter that is wrapped in NoInfer deep inside the parameter type still matches: in telegraf (#2016), that form did not change the time, and NoInfer around the whole element type did.whyts found the place in each case below. The tRPC fix is merged. The other fixes are open pull requests in those projects, so they are proposals until the maintainers merge them. The Vuetify row is a measurement in an issue, with no fix. Each number comes from my own measurement on the stated compiler version.
| Project | What whyts found | Result |
|---|---|---|
| tRPC (#6997) | TS2589 in Serialize (serialize.ts:35) when the type contains a recursive JSON type such as Prisma.JsonValue | A fix in PR #7660, merged on 2026-10-19. The repro had TS2589 on main and has no error with the fix. Instantiations went from 89,700 to 78,502. The type-check time of packages/server did not change (within noise) |
| TanStack Form (#1474) | TS2589 in DeepKeys: the type alias refers to itself through DeepKeyAndValueArray | A fix in PR #2422. Check time of the repro went from 7.4 s to 0.06 s (whyts compare, 10 runs, separated). form-core stayed within noise |
| TypeORM (#8559) | TS2589 in QueryDeepPartialEntity (QueryPartialEntity.ts:17) for types that contain themselves | A fix in PR #12943. whyts reports the diagnosis before the change and reports none after it |
| Vue (#14323) | defineModel with a defineEmits call signature that ends in void makes OverloadUnionRecursive (@vue/shared) run to the depth limit. It is 100% of the Check time | A fix in [PR #15851](https://githu
Solo se muestra el principio; lee el resto en el repo