Domscribe
Mapeo de DOM a código fuente en tiempo de compilación para agentes de codificación
Documentación
Domscribe
Los agentes de codificación con IA editan tus archivos fuente a ciegas: no pueden ver tu frontend en ejecución, y tu frontend no puede indicarles dónde buscar.
Domscribe conecta ambas direcciones: haz clic en un elemento del DOM para decirle a tu agente qué cambiar, o deja que tu agente consulte cualquier ubicación del código fuente para ver exactamente cómo se ve en vivo en el navegador. IDs estables en tiempo de compilación, contexto de ejecución profundo (props, estado, DOM), independiente del framework, compatible con cualquier agente MCP. Cero impacto en producción.
Primeros pasos
npx domscribe init
El asistente de configuración te guía por dos pasos:
- Conecta tu agente de codificación — selecciona tu agente (Claude Code, Copilot, Gemini, Kiro u otros) y el asistente instala el plugin automáticamente.
- Añádelo a tu aplicación — selecciona tu framework y bundler, el asistente instala el paquete correcto y te muestra el fragmento de configuración que debes añadir.
Eso es todo. Inicia tu servidor de desarrollo y estarás listo.
¿Prefieres configurar todo manualmente o necesitas un control más preciso? Consulta las instrucciones de configuración manual a continuación.
Características
Código → UI: Deja que el agente vea el navegador
Tu agente llama a domscribe.query.bySource con una ruta de archivo y un número de línea, y recibe la instantánea del DOM en vivo, las props actuales, el estado del componente y los atributos renderizados, directamente desde el navegador en ejecución. No se necesita interacción humana.
[!TIP] Los agentes no consultan el estado de ejecución espontáneamente; indícales explícitamente: "Arregla el color del botón: usa domscribe para comprobar qué clases CSS tiene antes de cambiar nada." Tu servidor de desarrollo debe estar en ejecución con la página objetivo abierta en el navegador.
UI → Código: Señala y di
Haz clic en cualquier elemento de la superposición del navegador, describe el cambio en lenguaje natural y envíalo. Domscribe captura la ubicación del elemento en el código fuente, el contexto de ejecución y tu instrucción como anotación. El agente la reclama, navega al archivo y la línea exactos, e implementa el cambio. La superposición muestra la respuesta del agente en tiempo real mediante WebSocket.
Más
- 🎯 IDs estables en tiempo de compilación — atributos
data-dsdeterministas inyectados mediante AST, estables en HMR y fast refresh - 🧩 Independiente del framework — React 18-19, Vue 3, Next.js 15-16, Nuxt 3+, con una interfaz de adaptadores extensible
- 📦 Cualquier bundler — Vite 5-7, Webpack 5, Turbopack
- 🔍 Captura de ejecución profunda — props en vivo, estado e instantáneas del DOM mediante recorrido de fibras de React e inspección de VNodes de Vue
- 🛡️ Cero impacto en producción — toda la instrumentación se elimina en las compilaciones de producción, garantizado en CI
- 🔒 Redacción de PII — correos electrónicos, tokens y patrones sensibles se eliminan automáticamente antes de salir del navegador
- 📁 Las anotaciones viven en tu repositorio — se almacenan como archivos JSON en
.domscribe/annotations/, expuestos mediante APIs REST que MCP envuelve para el acceso del agente - 📡 Retroalimentación en tiempo real — el relé WebSocket envía las respuestas del agente a la superposición del navegador a medida que ocurren
Configuración manual
[!NOTE]
npx domscribe initmaneja ambos pasos a continuación automáticamente. Usa la configuración manual solo si necesitas un control más preciso.
Domscribe tiene dos lados: lado de la aplicación (plugins de bundler + framework) y lado del agente (MCP para tu agente de codificación). Ambos son necesarios para el flujo de trabajo completo.
Lado de la aplicación — Añádelo a tu bundler
Next.js (15 + 16) — npm install -D @domscribe/next
// next.config.ts
import type { NextConfig } from 'next';
import { withDomscribe } from '@domscribe/next';
const nextConfig: NextConfig = {};
export default withDomscribe()(nextConfig);
Nuxt 3+ — npm install -D @domscribe/nuxt
// nuxt.config.ts
export default defineNuxtConfig({
modules: ['@domscribe/nuxt'],
});
React 18–19 — npm install -D @domscribe/react
Plugin de Vite:
// vite.config.ts
import { defineConfig } from 'vite';
import react from '@vitejs/plugin-react';
import { domscribe } from '@domscribe/react/vite';
export default defineConfig({
plugins: [react(), domscribe()],
});
Plugin de Webpack:
// webpack.config.js
const { DomscribeWebpackPlugin } = require('@domscribe/react/webpack');
const isDevelopment = process.env.NODE_ENV !== 'production';
module.exports = {
module: {
rules: [
{
test: /\.[jt]sx?$/,
exclude: /node_modules/,
enforce: 'pre',
use: [
{
loader: '@domscribe/transform/webpack-loader',
options: { enabled: isDevelopment },
},
],
},
],
},
plugins: [
new DomscribeWebpackPlugin({
enabled: isDevelopment,
overlay: true,
}),
],
};
Vue 3+ — npm install -D @domscribe/vue
Plugin de Vite:
// vite.config.ts
import { defineConfig } from 'vite';
import vue from '@vitejs/plugin-vue';
import { domscribe } from '@domscribe/vue/vite';
export default defineConfig({
plugins: [vue(), domscribe()],
});
Plugin de Webpack:
// webpack.config.js
const { DomscribeWebpackPlugin } = require('@domscribe/vue/webpack');
const isDevelopment = process.env.NODE_ENV !== 'production';
module.exports = {
module: {
rules: [
{
test: /\.[jt]sx?$/,
exclude: /node_modules/,
enforce: 'pre',
use: [
{
loader: '@domscribe/transform/webpack-loader',
options: { enabled: isDevelopment },
},
],
},
],
},
plugins: [
new DomscribeWebpackPlugin({
enabled: isDevelopment,
overlay: true,
}),
],
};
Cualquier framework — npm install -D @domscribe/transform (solo mapeo DOM→código fuente, sin captura de ejecución)
Plugin de Vite:
// vite.config.ts
import { defineConfig } from 'vite';
import { domscribe } from '@domscribe/transform/plugins/vite';
export default defineConfig({
plugins: [domscribe()],
});
Plugin de Webpack:
// webpack.config.js
const {
DomscribeWebpackPlugin,
} = require('@domscribe/transform/plugins/webpack');
const isDevelopment = process.env.NODE_ENV !== 'production';
module.exports = {
module: {
rules: [
{
test: /\.[jt]sx?$/,
exclude: /node_modules/,
enforce: 'pre',
use: [
{
loader: '@domscribe/transform/webpack-loader',
options: { enabled: isDevelopment },
},
],
},
],
},
plugins: [
new DomscribeWebpackPlugin({
enabled: isDevelopment,
overlay: true,
}),
],
};
Ejemplos funcionales: Consulta
packages/domscribe-test-fixtures/fixtures/para configuraciones completas de aplicaciones en cada combinación de framework y bundler compatible.
Para opciones de configuración del plugin, consulta el README de @domscribe/transform.
Monorepos
Si tu aplicación frontend está en un subdirectorio (p. ej., apps/web), pasa --app-root durante la inicialización:
npx domscribe init --app-root apps/web
O ejecuta npx domscribe init y sigue las indicaciones: el asistente pregunta si estás en un monorepo.
Esto crea un domscribe.config.json en la raíz de tu repositorio que indica a todas las herramientas de Domscribe dónde está tu aplicación. Los comandos CLI (serve, stop, status) y las conexiones MCP del agente resuelven automáticamente la raíz de la aplicación desde esta configuración, sin necesidad de banderas adicionales.
Lado del agente — Conecta tu agente de codificación
Domscribe expone 12 herramientas y 4 prompts mediante MCP. Los plugins del agente incluyen la configuración MCP y un archivo de habilidades que enseña al agente a usar las herramientas de manera efectiva.
Claude Code
claude plugin marketplace add patchorbit/domscribe
claude plugin install domscribe@domscribe
GitHub Copilot
copilot plugin install patchorbit/domscribe
Gemini CLI
gemini extensions install https://github.com/patchorbit/domscribe
Amazon Kiro
Abre el panel de Powers → Añadir power desde GitHub → introduce https://github.com/patchorbit/domscribe/tree/main/domscribe-power.
Cursor
Cualquier agente (Skills y MCP)
Instala las skills de Domscribe:
npx skills add patchorbit/domscribe
Luego añade esta configuración MCP a tu agente:
{
"mcpServers": {
"domscribe": {
"type": "stdio",
"command": "npx",
"args": ["-y", "@domscribe/mcp"]
}
}
}
Cómo funciona
1. Inyección. El plugin del bundler analiza cada archivo fuente, inyecta IDs data-ds estables en HMR mediante xxhash64 y registra cada mapeo en .domscribe/manifest.jsonl.
2. Captura. Los adaptadores de framework (recorrido de fibras de React, inspección de VNodes de Vue) extraen props en vivo, estado y metadatos del componente. La interfaz de superposición te permite hacer clic en cualquier elemento y ver su contexto completo.
3. Relé. Un daemon Fastify en localhost conecta el navegador y tu agente mediante REST, WebSocket y MCP stdio. Un bloqueo de archivo evita instancias duplicadas entre reinicios del servidor de desarrollo.
4. Agente. Tu agente de codificación se conecta mediante MCP para consultar por código fuente (ver cómo se ve cualquier línea en vivo) o procesar anotaciones (reclamar, implementar y responder a solicitudes de cambio de la UI).
Comparación
| Característica | Domscribe | Stagewise | DevInspector MCP | React Grab | Frontman |
|---|---|---|---|---|---|
| IDs estables en tiempo de compilación | ✅ data-ds mediante AST | ❌ En tiempo de ejecución (CDP) | ❌ Sin IDs estables | ❌ _debugSource | ❌ Introspección de framework en tiempo de ejecución |
| Manifiesto DOM→código fuente | ✅ JSONL, solo añadido | ❌ | ❌ | ❌ | ❌ |
| Consulta de código→DOM en vivo | ✅ El agente consulta el código fuente, obtiene el estado en vivo | ❌ | ❌ | ❌ | ❌ |
| Props/estado en tiempo de ejecución | ✅ Recorrido de fibras + VNodes | ⚠️ Superficial | ⚠️ Nivel DOM + evaluación JS | ❌ Solo HTML + nombres de componentes | ⚠️ Solo props (APIs de framework) |
| Multi-framework | ✅ React · Vue · Next.js · Nuxt · extensible | ⚠️ Solo React | ✅ React + Vue + Svelte + Solid + Preact | ❌ Solo React | ⚠️ Next.js + Astro + Vite |
| Multi-bundler | ✅ Vite + Webpack + Turbopack | ❌ N/D (navegador Electron) | ✅ Vite + Webpack + Turbopack | ❌ N/D | ❌ Middleware de servidor de desarrollo |
| Herramientas MCP | ✅ 12 herramientas + 4 prompts | ❌ Protocolo propietario (Karton) | ✅ 9 herramientas | ⚠️ Complemento ligero | ❌ Solo MCP interno |
| Independiente del agente | ✅ Cualquier cliente MCP | ❌ Agente Electron incluido | ✅ | ✅ | ❌ Agente Elixir incluido |
| Selector de elementos en la aplicación | ✅ Shadow DOM de Lit | ✅ Selector de navegador integrado | ✅ Barra de inspector | ✅ Captura al pasar el cursor | ✅ Interfaz de chat |
| Mapeo de código fuente | ✅ Determinista (IDs AST) | ⚠️ Inferido por IA | ⚠️ Inyectado por AST (no estable) | ⚠️ _debugSource (se necesita solución alternativa) | ⚠️ Introspección de framework en tiempo de ejecución |
| Licencia | ✅ MIT | ⚠️ AGPL | ✅ MIT | ✅ MIT | ⚠️ Apache + AGPL |
Ningún competidor combina IDs estables en tiempo de compilación, captura de ejecución profunda, consultas bidireccionales código fuente↔DOM y una superficie de herramientas MCP de forma independiente del framework.
Herramientas MCP
La superficie orientada al agente — herramientas, prompts, esquemas de cableado y envoltura de errores — se enumera a continuación como un índice legible por humanos.
| Herramienta | Descripción |
|---|---|
domscribe.query.bySource | Consulta un archivo fuente + línea y obtén contexto de runtime en vivo (props, estado, instantánea del DOM) |
domscribe.manifest.query | Busca entradas del manifiesto por ruta de archivo, nombre de componente o ID de elemento |
domscribe.manifest.stats | Estadísticas de cobertura del manifiesto (recuento de entradas, recuento de archivos, recuento de componentes, tasa de aciertos de caché) |
domscribe.resolve | Resuelve un ID de elemento data-ds a su ubicación de origen (archivo, línea, columna, componente) |
domscribe.resolve.batch | Resuelve múltiples IDs de elemento en una sola llamada |
domscribe.annotation.process | Reclama atómicamente la siguiente anotación en cola (previene conflictos concurrentes de agentes) |
domscribe.annotation.respond | Adjunta la respuesta del agente y transiciona a PROCESSED |
domscribe.annotation.updateStatus | Transiciona manualmente el estado de la anotación |
domscribe.annotation.get | Recupera la anotación por ID |
domscribe.annotation.list | Lista anotaciones con opciones de estado/filtro |
domscribe.annotation.search | Búsqueda de texto completo en el contenido de las anotaciones |
domscribe.verify.baseline | Captura una instantánea de estilo/geometría previa a la edición de un elemento renderizado |
domscribe.verify.afterEdit | Compara el elemento con la línea base — veredicto determinista + deltas por propiedad |
domscribe.status | Salud del daemon de retransmisión, estadísticas del manifiesto, recuentos de cola |
Consulta el @domscribe/mcp README para ver esquemas detallados de herramientas, formatos de respuesta y definiciones de prompts.
Paquetes
| Paquete | Descripción |
|---|---|
@domscribe/core | Esquemas Zod, sistema de errores RFC 7807, generación de IDs, redacción de PII, constantes |
@domscribe/manifest | Manifiesto JSONL de solo anexión, IDStabilizer (xxhash64), BatchWriter, ManifestCompactor |
@domscribe/relay | Servidor Fastify HTTP/WS, adaptador MCP stdio, ciclo de vida de anotaciones |
@domscribe/transform | Inyección AST independiente del analizador (Acorn, Babel, VueSFC), plugins de bundler |
@domscribe/runtime | ElementTracker, ContextCapturer, BridgeDispatch del lado del navegador |
@domscribe/overlay | Componentes web Lit (shadow DOM), selector de elementos, UI de anotaciones |
@domscribe/react | Recorrido de fibras de React, extracción de props/estado, plugins de Vite + Webpack |
@domscribe/vue | Resolución de VNode de Vue 3, soporte de Composition + Options API, plugins de Vite + Webpack |
@domscribe/next | Envoltorio de configuración withDomscribe() para Next.js 15 + 16 |
@domscribe/nuxt | Módulo Nuxt 3+ con retransmisión automática y plugin de runtime |
domscribe | Binario CLI (domscribe serve, status, stop, init, mcp) |
@domscribe/mcp | Binario de servidor MCP independiente (domscribe-mcp) |
@domscribe/test-fixtures | Integración de caja negra + suite e2e (no publicada) |
Contribuciones
pnpm install
nx run-many -t build test lint typecheck
Las convenciones están en .claude/rules/. Se aceptan PRs.
