|
| 1 | +# Inicio Rápido — Construcción desde el Código Fuente |
| 2 | + |
| 3 | +> **Resumen (TL;DR)**: Una reconstrucción completa requiere **Bun** (no Node.js) por sus |
| 4 | +> intrínsecos de tiempo de compilación (`feature()`, `MACRO`, `bun:bundle`). Una construcción |
| 5 | +> de "mejor esfuerzo" con **esbuild** llega al ~95 % del camino, pero necesita correcciones |
| 6 | +> manuales para unos 108 módulos protegidos por flags de funciones. |
| 7 | +
|
| 8 | +## Opción A: Ejecutar el CLI pre-construido (Recomendado) |
| 9 | + |
| 10 | +El paquete npm ya contiene un archivo `cli.js` compilado: |
| 11 | + |
| 12 | +```bash |
| 13 | +cd /ruta/al/directorio/ # donde residen package.json y cli.js |
| 14 | +node cli.js --version # → 2.1.88 (Claude Code) |
| 15 | +node cli.js -p "Hola Claude" # Modo no interactivo |
| 16 | +``` |
| 17 | + |
| 18 | +**Autenticación requerida**: Establece la variable `ANTHROPIC_API_KEY` o ejecuta `node cli.js login`. |
| 19 | + |
| 20 | +## Opción B: Construir desde el Código Fuente (Mejor Esfuerzo) |
| 21 | + |
| 22 | +### Requisitos previos |
| 23 | + |
| 24 | +```bash |
| 25 | +node --version # >= 18 |
| 26 | +npm --version # >= 9 |
| 27 | +``` |
| 28 | + |
| 29 | +### Pasos |
| 30 | + |
| 31 | +1. **Instalar dependencias de construcción**: |
| 32 | + ```bash |
| 33 | + npm install --save-dev esbuild |
| 34 | + ``` |
| 35 | + |
| 36 | +2. **Ejecutar el script de construcción**: |
| 37 | + ```bash |
| 38 | + node scripts/build.mjs |
| 39 | + ``` |
| 40 | + |
| 41 | +3. **Si tiene éxito, ejecuta el resultado**: |
| 42 | + ```bash |
| 43 | + node dist/cli.js --version |
| 44 | + ``` |
| 45 | + |
| 46 | +### Qué hace el script de construcción |
| 47 | + |
| 48 | +| Fase | Acción | |
| 49 | +|-------|--------| |
| 50 | +| **1. Copia** | `src/` → `build-src/` (el original no se toca) | |
| 51 | +| **2. Transformación** | `feature('X')` → `false` (habilita la eliminación de código muerto) | |
| 52 | +| **2b. Transformación** | `MACRO.VERSION` → `'2.1.88'` (inyección de versión en tiempo de compilación) | |
| 53 | +| **2c. Transformación** | `import from 'bun:bundle'` → importación simulada (stub) | |
| 54 | +| **3. Entrada** | Crea un envoltorio que inyecta las globales de MACRO | |
| 55 | +| **4. Empaquetado** | esbuild con creación iterativa de stubs para los módulos faltantes | |
| 56 | + |
| 57 | +### Problemas Conocidos |
| 58 | + |
| 59 | +El código fuente utiliza **intrínsecos de tiempo de compilación de Bun** que no pueden replicarse completamente con esbuild: |
| 60 | + |
| 61 | +1. **`feature('FLAG')` de `bun:bundle`**: Bun resuelve esto en tiempo de compilación como `true`/`false` y elimina las ramas muertas. Nuestra transformación lo reemplaza con `false`, pero esbuild aún intenta resolver los `require()` dentro de esas ramas. |
| 62 | + |
| 63 | +2. **`MACRO.X`**: El `--define` de Bun los reemplaza en tiempo de compilación. Nosotros usamos el reemplazo de cadenas, que funciona en la mayoría de los casos, pero puede fallar en expresiones complejas. |
| 64 | + |
| 65 | +3. **108 módulos faltantes**: Estos son módulos internos protegidos por flags (daemon, asistente de puente, colapso de contexto, etc.) que no existen en el código fuente publicado. Normalmente son eliminados por Bun como código muerto, pero esbuild no puede eliminarlos porque las llamadas a `require()` siguen presentes sintácticamente. |
| 66 | + |
| 67 | +4. **`bun:ffi`**: Utilizado para el soporte de proxies nativos. Se ha simulado (stubbed). |
| 68 | + |
| 69 | +5. **TypeScript `import type` de archivos generados**: Algunos archivos de tipos generados no están en el código fuente publicado. |
| 70 | + |
| 71 | +### Para corregir los problemas restantes |
| 72 | + |
| 73 | +1. **Verifica qué falta todavía**: |
| 74 | + ```bash |
| 75 | + npx esbuild build-src/entry.ts --bundle --platform=node \ |
| 76 | + --packages=external --external:'bun:*' \ |
| 77 | + --log-level=error --log-limit=0 --outfile=/dev/null 2>&1 | \ |
| 78 | + grep "Could not resolve" | sort -u |
| 79 | + ``` |
| 80 | + |
| 81 | +2. **Crea stubs para cada módulo faltante en `build-src/src/`**: |
| 82 | + - Para JS/TS: crea un archivo que exporte funciones vacías. |
| 83 | + - Para texto: crea un archivo vacío. |
| 84 | + |
| 85 | +3. **Vuelve a ejecutar**: |
| 86 | + ```bash |
| 87 | + node scripts/build.mjs |
| 88 | + ``` |
| 89 | + |
| 90 | +## Opción C: Construir con Bun (Reconstrucción Completa — Requiere Acceso Interno) |
| 91 | + |
| 92 | +```bash |
| 93 | +# Instalar Bun |
| 94 | +curl -fsSL https://bun.sh/install | bash |
| 95 | + |
| 96 | +# La construcción real utiliza el empaquetador de Bun con flags de hito: |
| 97 | +# bun build src/entrypoints/cli.tsx \ |
| 98 | +# --define:feature='(flag) => flag === "SOME_FLAG"' \ |
| 99 | +# --define:MACRO.VERSION='"2.1.88"' \ |
| 100 | +# --target=bun \ |
| 101 | +# --outfile=dist/cli.js |
| 102 | + |
| 103 | +# Sin embargo, la configuración de construcción interna no se incluye en el |
| 104 | +# paquete publicado. Necesitarías acceso al repositorio interno de Anthropic. |
| 105 | +``` |
| 106 | + |
| 107 | +## Estructura del Proyecto |
| 108 | + |
| 109 | +``` |
| 110 | +claude-code-2.1.88/ |
| 111 | +├── src/ # Código fuente TypeScript original (1,884 archivos, 512K LOC) |
| 112 | +├── stubs/ # Stubs de construcción para intrínsecos de Bun |
| 113 | +│ ├── bun-bundle.ts # stub de feature() → siempre devuelve false |
| 114 | +│ ├── macros.ts # Constantes de versión MACRO |
| 115 | +│ └── global.d.ts # Declaraciones de tipos globales |
| 116 | +├── scripts/ |
| 117 | +│ └── build.mjs # Script de construcción (basado en esbuild) |
| 118 | +├── node_modules/ # 192 dependencias npm |
| 119 | +├── vendor/ # Stubs de código fuente de módulos nativos |
| 120 | +├── build-src/ # Creado por el script de construcción (copia transformada) |
| 121 | +└── dist/ # Resultado de la construcción (creado por build.mjs) |
| 122 | +``` |
0 commit comments