a4d63cd768
Backend Go (web/server.go) que sirve un chat single-page y, por cada mensaje, lanza claude_pipe --stream como subprocess y reenvia sus eventos NDJSON (text_delta + result) al navegador via Server-Sent Events. Frontend vanilla (web/index.html), sin frameworks ni node_modules. Prueba el stack completo end to end a traves de una surface real: captura PTY -> vt_render -> parse_claude_tui (con fix del spinner) -> delta de streaming -> chat en vivo. Cada mensaje es una sesion claude one-shot (sin memoria entre turnos). Playground del padre, no indexado.
68 lines
2.6 KiB
Markdown
68 lines
2.6 KiB
Markdown
# claude_pipe — artifact probe (playground)
|
||
|
||
Herramienta desechable para auditar la calidad del parseo de la TUI que hace
|
||
`claude_pipe`. No se indexa, no tiene `app.md`, vive dentro de `apps/claude_pipe/`
|
||
y se mueve con su sub-repo.
|
||
|
||
## Qué comprueba
|
||
|
||
Por cada prompt, lanza el binario `claude_pipe` en modo one-shot y en modo
|
||
`--stream`, y busca:
|
||
|
||
1. **Artefactos** que se cuelan del render en la respuesta parseada: caracteres de
|
||
caja (`╭│╰`), reglas horizontales (`────`), fragmentos de la status bar
|
||
(`CTX:`, `IN:`, `$…`, `← for agents`), la línea meta `✻ Crunched`, el prompt
|
||
`❯`, el carácter de reemplazo `�`, palabras pegadas (>40 chars sin espacio), o
|
||
el prompt repetido literalmente.
|
||
2. **Consistencia del streaming**: la concatenación de los `text_delta` debe
|
||
reconstruir el `result` final. Si no, la heurística de prefijo perdió o duplicó
|
||
texto bajo reflow.
|
||
3. **(Opcional, `--ref`)** discrepancia contra `claude -p` real para el mismo
|
||
prompt (normalizado por espacios). claude no es determinista, así que solo los
|
||
prompts triviales se espera que coincidan exactamente.
|
||
|
||
Sale con código 2 si encuentra artefactos o inconsistencias (para poder usarlo
|
||
como gate).
|
||
|
||
## Cómo lanzarlo
|
||
|
||
```bash
|
||
cd apps/claude_pipe
|
||
CGO_ENABLED=1 go build -tags fts5 -o claude_pipe . # asegúrate de tener el binario
|
||
|
||
cd playground
|
||
|
||
# Set de prompts por defecto, sin comparar con claude -p
|
||
go run artifact_probe.go --root /home/enmanuel/fn_registry
|
||
|
||
# Comparando además contra `claude -p` real (gasta llamadas reales)
|
||
go run artifact_probe.go --root /home/enmanuel/fn_registry --ref
|
||
|
||
# Un solo prompt custom
|
||
go run artifact_probe.go --root /home/enmanuel/fn_registry --prompt "tu prompt aqui"
|
||
```
|
||
|
||
`--root` debe ser un repo cuyos MCP de claude ya estén aprobados, para que la TUI
|
||
no muestre el diálogo de arranque.
|
||
|
||
## Chat en el navegador (`web/`)
|
||
|
||
Un chat web que prueba todo el stack end to end: backend Go con SSE que lanza
|
||
`claude_pipe --stream` por cada mensaje y reenvía los `text_delta` al navegador,
|
||
frontend chat vanilla (sin frameworks, sin node_modules).
|
||
|
||
```bash
|
||
cd apps/claude_pipe
|
||
CGO_ENABLED=1 go build -tags fts5 -o claude_pipe . # binario con el fix del spinner
|
||
|
||
cd playground
|
||
go run ./web # http://localhost:8099
|
||
# o con flags:
|
||
go run ./web --port 8099 --root /home/enmanuel/fn_registry --warmup 4s --idle 4s --max 120s
|
||
```
|
||
|
||
Abre `http://localhost:8099` y escribe. Cada mensaje es una sesión `claude` nueva
|
||
(sin memoria entre turnos: `claude_pipe` es one-shot). Hay ~8s de `warmup`+`idle`
|
||
antes de la primera respuesta. La respuesta se reconstruye desde la TUI parseada,
|
||
ya sin el spinner de carga.
|