ArchLang

Planos de planta como código: compila, describe, lint, valida, repara y finaliza planos ArchLang (.arch), un DSL determinista de código abierto que renderiza a SVG, DXF o PDF. Se ejecuta localmente a través de stdio, sin clave de API.

Documentación

ArchLang

Planos de planta como código — texto adentro, un dibujo arquitectónico preciso afuera.

Un DSL determinista y compilador para planos de planta: escribe (o haz que un LLM escriba) código fuente .arch y se compila a SVG/DXF/PDF con linting y validación geométrica — diferenciable, controlable por versiones, reproducible. Código abierto (MIT). Cero dependencias, y construido para que un agente de IA pueda verificar su propio plano sin mirar una imagen.

npm CI Node Runtime deps License Stars Sponsor

▶ Playground en vivo · 📖 Documentación · ⌨ Referencia CLI · 📦 npm · 🧩 VS Code

Úsalo desde tu agente de codificación

npx skills add ChanMeng666/archlang                      # the ArchLang skill, for any agent that reads skills
claude mcp add archlang -- npx -y @chanmeng666/archlang-mcp   # or the MCP server (Claude Code shown)
/plugin marketplace add ChanMeng666/archlang                # or, inside Claude Code: the skills + MCP server as one plugin (plugins/archlang)
/plugin install archlang@archlang

Claude Desktop: cada GitHub Release trae el servidor MCP como una extensión .mcpb de un clic (archlang-mcp-<version>.mcpb), construida por npm run build:mcpb.

Luego pide en lenguaje natural; el agente escribe el .arch, lo compila y lo verifica con lint y describe:

  • "Diseña un apartamento de un dormitorio de unos 54 m²: una sala/cocina de 32 m², un dormitorio de 10 m² y un baño de 10 m², con la puerta principal en la pared norte."
  • "Dibuja una casa de dos plantas y dos dormitorios, de 8 m × 6 m, con una escalera que conecte los pisos, y dame un SVG por planta."
  • "Exporta ese plano como DXF."

Consulta planos de planta que los agentes escribieron a partir de resúmenes de un párrafo, cada uno con su resumen y su código fuente.

[!IMPORTANT]

🤖 Léelo con tu agente de IA — no lo leas a mano.

Este repositorio está escrito priorizando al agente. Apunta Claude Code, GitHub Copilot, Cursor o cualquier agente hacia él: "Lee el README y AGENTS.md, luego ayúdame a ejecutar / ampliar esto." La estructura + AGENTS.md están optimizadas para la comprensión del agente.

👀 Míralo

Aquí hay un programa completo, y debajo el dibujo real al que se compila — no una maqueta. Ni una sola coordenada coloca una puerta, una ventana o un mueble: cada abertura está fijada a una distancia a lo largo de una pared nombrada, cada accesorio se resuelve contra una habitación o una pared, y el baño y el dormitorio se distribuyen mediante un strip. site { street north } nombra las dos fachadas sobre las que gira el plano — la puerta principal da al callejón, el acristalamiento da al jardín.

# A one-bedroom laneway cottage — 49 m² that reads as one program.
#
# Nothing here is positioned by hand. Every opening is pinned to a run distance along a
# named wall (`on <wall> at <pos>`), every fixture resolves against a room or a wall
# (`in <room> anchor …`, `against wall …`), and the bath/bedroom pair is laid out by
# `strip`. `site { street north }` names the two facades the plan turns on: the door
# faces the lane, the glass faces the garden.
plan "Laneway House" {
  units mm
  grid 50            # partitions are 100 thick, so a `flush` fixture lands on a …50
  north up
  dims auto all
  site { street north }

  wall id=w_lane   exterior  thickness 200 { (0,0) (7500,0) }
  wall id=w_east   exterior  thickness 200 { (7500,0) (7500,6500) }
  wall id=w_garden exterior  thickness 200 { (0,6500) (7500,6500) }
  wall id=w_west   exterior  thickness 200 { (0,0) (0,6500) }
  wall id=w_hall   partition thickness 100 { (4200,0) (4200,6500) }
  wall id=w_bath   partition thickness 100 { (4200,2500) (7500,2500) }

  room id=r_live at (0,0) size 4200x6500 label "Living / Kitchen" uses living kitchen
  strip down at (4200,0) gap 0 width 3300 {
    room id=r_bath size 2500 label "Bath"    uses bath
    room id=r_bed  size 4000 label "Bedroom" uses bedroom
  }

  door id=d_front  on w_lane at 2100 width 900 hinge near start swing into r_live
  door id=d_garden sliding on w_garden at 2700 width 1800 slide left
  door id=d_bed    on w_hall at 5600 width 800 hinge left swing into r_bed
  # `w_hall` is walked lane→garden, so `slide right` sends the panel down the solid wall
  # below the jamb; `slide left` would aim it at 500 mm and trip `W_POCKET_RUN`.
  door id=d_bath   pocket on w_hall at 900 width 800 slide right

  window on w_west   at 2400 width 1200
  window on w_garden at 700  width 1000
  window on w_garden at 5850 width 1600
  window on w_east   at 1500 width 600

  furniture fridge       against wall w_west offset 400  in r_live
  furniture stove        against wall w_west offset 1200 in r_live
  furniture kitchen_sink against wall w_west offset 2000 in r_live
  furniture table  in r_live centered size 1300x900 label "Table"
  furniture sofa   in r_live anchor bottom-left flush inset 250 size 900x2000  label "Sofa"
  furniture bed    in r_bed  anchor bottom-right flush inset 250 size 1500x2000 label "Bed"
  furniture robe   in r_bed  anchor top-left     flush inset 200 size 1800x600  label "Wardrobe"
  furniture shower in r_bath anchor top-right    flush size 900x900
  furniture wc     in r_bath anchor bottom-left  flush size 400x700
  furniture basin  in r_bath anchor bottom-right flush size 600x450

  title { project "Laneway House" drawn_by "ArchLang" date "2026-08-16" }
}
The floor plan the program above compiles to — click to open it in the live playground

↑ arch compile laneway-house.arch — ese programa, renderizado. Las paredes se unen y se traman solas, las puertas abatibles dibujan sus propios arcos de giro, las hojas correderas y empotradas dibujan paneles en su lugar (una puerta empotrada no tiene arco, porque no tiene giro), y dims auto all mide el edificio que se le dio.

▶ Haz clic en el dibujo — abre el playground en vivo con este plano exacto ya cargado. Cambia un número y míralo redibujar; el compilador se ejecuta en tu navegador, nada se envía a un servidor.

¿Por qué un enlace y no una inserción en vivo? ArchLang sí incluye un visor incrustable — pero el saneador de Markdown de GitHub elimina <iframe> (vuelve como texto escapado, exactamente como <script>), así que ningún README en GitHub puede alojar uno. La inserción funciona en cualquier lugar donde GitHub no esté: consulta Incrusta un plano en cualquier lugar. Fuente: examples/laneway-house.arch.

🌟 Introducción

ArchLang es un pequeño lenguaje declarativo para planos de planta. Declaras un plano — paredes, habitaciones, puertas, ventanas, muebles — y el compilador renderiza un SVG limpio y profesional (también DXF, PDF, PNG y un plano ASCII sin dependencias). Funciona como Typst y LaTeX para documentos: el código fuente es lo que conservas, y el dibujo es lo que el compilador hace con él.

Las coordenadas son milímetros enteros, por lo que la salida es determinista: el mismo código fuente siempre produce bytes idénticos, y cambiar un número cambia exactamente una cosa. "Haz el dormitorio 1 m más ancho" es un diff de un número — no un nuevo render de una imagen rasterizada que redibuja silenciosamente también la cocina.

El compilador es TypeScript puro con cero dependencias en tiempo de ejecución y es isomórfico — el mismo código se ejecuta en Node y en el navegador, por eso el playground es completamente del lado del cliente.

ArchLang es el motor de planos de planta detrás de ArchCanvas, un agente de diseño con IA — pero es independiente y útil en cualquier aplicación o script.

💡 Por qué es diferente

La mayoría de las herramientas de "planos de planta con IA" generan una imagen. Una imagen no se puede verificar, comparar ni razonar — y ni el modelo ni tú pueden saber si el baño es realmente accesible.

ArchLang genera un programa y luego te permite interrogarlo como hechos:

Generación de imágenes rasterizadasArchLang
Salidapíxelesun programa .arch → SVG / DXF / PDF / PNG / TXT
Editar "ensanchar el dormitorio"re-generar toda la imagencambiar un número
Misma entrada dos vecesimagen diferentesalida byte-idéntica
"¿Es accesible el baño?"mirarlo y adivinararch describe --json → grafo de acceso
"¿Coincide con el resumen?"inspeccionarlo visualmentearch validate --intent → código de salida
Sintaxis incorrecta—errores devueltos como datos, cada uno con su propio fix

Esa última fila es todo el diseño: compile() nunca lanza excepciones. Devuelve diagnostics con rangos de bytes y una corrección aplicable por máquina, que es lo que hace posible un bucle de autocorrección ajustado.

🤖 El bucle del agente

Un agente puede crear un plano, corregirse a sí mismo y confirmar que el plano coincide con el resumen sin renderizar una imagen en absoluto — que es lo que hace que ArchLang sea barato de manejar desde un modelo solo de texto.

flowchart TD
    B([Brief]) --> S["<b>arch context</b> — the whole language, one call"]
    S --> W["Write <b>.arch</b>"]
    W --> C{"<b>arch compile --json</b>"}
    C -->|"ok: false"| F["<b>arch fix</b><br/><i>each diagnostic carries its own fix</i>"]
    F --> C
    C -->|"ok: true"| D["<b>arch describe --json</b><br/><i>rooms · areas · adjacency · access graph</i>"]
    D --> V{"<b>arch validate --intent</b><br/><i>does it meet the brief?</i>"}
    V -->|"no"| G["<b>arch suggest</b><br/><i>candidate door / window statements</i>"]
    G --> W
    V -->|"yes"| O([SVG · DXF · PDF · PNG])

    style B fill:#ede7f6,stroke:#6b3ae0,color:#1a1a1a
    style O fill:#e8f5e9,stroke:#2e7d32,color:#1a1a1a
    style C fill:#fff8e1,stroke:#7a6000,color:#1a1a1a
    style V fill:#fff8e1,stroke:#7a6000,color:#1a1a1a
    style D fill:#e8f5e9,stroke:#2e7d32,color:#1a1a1a
    style F fill:#fdecea,stroke:#b3261e,color:#1a1a1a
    style G fill:#fdecea,stroke:#b3261e,color:#1a1a1a

Arranque en frío con un comando. arch context imprime todo el contexto del agente — especificación del lenguaje, habilidad de flujo de trabajo, referencia CLI y cada código de diagnóstico — como un documento listo para prompt de sistema (el mismo llms-full.txt que sirve el sitio de documentación).

npx @chanmeng666/archlang context                       # EVERYTHING: spec + skill + CLI + error catalog
npx @chanmeng666/archlang context --section errors      # …or one section of it (the catalog alone: 60 KB → 13 KB)
npx @chanmeng666/archlang spec                          # just the language, one page (~2k tokens)
npx @chanmeng666/archlang help describe                 # one command, with worked examples
npx @chanmeng666/archlang compile plan.arch --json      # render → { ok, diagnostics, summary }
npx @chanmeng666/archlang fix plan.arch --dry-run       # the exact unified diff it would write, applying nothing
npx @chanmeng666/archlang describe plan.arch --json     # VERIFY, without an image
npx @chanmeng666/archlang validate plan.arch --strict   # the ship gate

Cada comando acepta --json (resultado en stdout, mensajes en stderr) con códigos de salida deterministas (0 ok · 2 error de código fuente del usuario · 1 IO · 3 uso) — y un error tipográfico gana ese 3: arch lint --jsn exits 3 with ¿quisiste decir --json? rather than quietly reading --jsn como nombre de archivo, y arch comple sugiere compile.

Un manifiesto, sin desviaciones. La ayuda por comando (arch <cmd> --help), el analizador de banderas y la referencia CLI generada se renderizan desde el mismo manifiesto — por eso no pueden anunciar una bandera que un comando no acepta. arch manifest --json es ese manifiesto como datos, y arch <cmd> --help es la forma económica de leer una fila de él.

Las lecturas están limitadas, por lo que un plano grande no puede inundar una ventana de contexto: describe --select/--room, lint|validate --code/--severity, context --section. Filtrar lo que lees nunca cambia lo que determina — el código de salida siempre sopesa cada diagnóstico. Y como arch fix reescribe tu código fuente, imprime primero el diff unificado y acepta --backup.

Consulta SKILL.md.

Artefactos nativos de máquina — Plan JSON, una gramática GBNF, un esquema de intención y un servidor MCP opcional
ArtefactoUso
/plan.schema.jsonEmite JSON estructurado, compílalo con arch compile --from-json
/archlang.gbnfRestringe un modelo local a salida analizable
/intent.schema.jsonEscribe el resumen como contrato; valídalo con validate --intent
/llms-full.txtEl paquete de contexto completo (arch context)

Servidor MCP (opcional). @chanmeng666/archlang-mcp es un shim de Protocolo de Contexto de Modelo stdio sobre la biblioteca, listado en el registro oficial como io.github.ChanMeng666/archlang-mcp:

claude mcp add archlang -- npx -y @chanmeng666/archlang-mcp

Prefiere la CLI cuando tu agente tenga un shell — una CLI no cuesta nada en la ventana de contexto hasta que se llama, mientras que un esquema de herramienta MCP permanece allí permanentemente. El servidor existe para que los hosts nativos de MCP puedan descubrir ArchLang. El núcleo sigue siendo de cero dependencias; el SDK vive solo en ese paquete (ADR 0012).

En CI: .github/actions/arch-render renderiza cada bloque ```arch en tu Markdown a imágenes en un solo paso.

✨ Características

Dibuja como un arquitecto, no como un trazador

Paredes con tramado poché (por material), arcos de giro de puertas, acristalamiento de ventanas, áreas de habitaciones calculadas, líneas de cota, capas, grosores de línea, una flecha de norte, una barra de escala y un bloque de título. Símbolos dibujados reales para cada tipo de mueble catalogado — 129 palabras en 83 familias, los accesorios de baño y cocina, los muebles de habitación y el jardín junto a ellos, cada uno con el detalle que lo hace legible a escala de plano (consulta Muebles y Accesorios, o los ejemplos furnished-flat y garden-house) — más las dos solo de dibujo anotaciones que un plano necesita por encima y por debajo del corte: roof overhang 600 coloca una línea de alero discontinua alrededor del edificio (un desplazamiento a inglete exacto del anillo de paredes, en cualquier ángulo), y void coloca un hueco de escalera o un atrio en la planta. Y dims auto sintetiza las cadenas de cotas por ti.

Verifica la solidez arquitectónica, no solo la sintaxis

arch lint codifica conocimiento profesional tácito: un baño accesible solo a través de un dormitorio, una habitación húmeda que no está completamente encerrada por paredes, una puerta cuyo giro golpea muebles u otra puerta, un dormitorio sin ventanas, una habitación inaccesible, una puerta demasiado estrecha, un baño/cocina sin accesorios y una habitación cuyo uso fue meramente inferido de una etiqueta indirecta (W_ALIAS_MATCH — con una corrección que fija el uses explícito). Todo ajustable mediante el conjunto de reglas.

Modela cómo una persona realmente camina por el plano

arch describe ejecuta una cuadrícula de navegación con espacio libre erosionado: distancia de caminata por habitación, el punto más estrecho en el camino de entrada y cuán tortuosa es la ruta — con lint de asesoramiento para una caminata demasiado ajustada (W_PATH_TOO_NARROW) o indirecta (W_CIRCUITOUS_PATH), y un arch compile --overlay circulation opt-in que dibuja las rutas sobre el plano.

Hechos y consejos — nunca un auto-organizador invisible (ADR 0005). arch repair es el único corrector explícito: empuja los muebles fuera de paredes, puertas y arcos de giro, y emite un registro de cambios que revisas. arch finish es el paso de finalización explícito: amuebla las habitaciones que no contienen muebles (ADR 0025), luego agrega el paper, scale, dims auto, title, schedule rooms y legend que a un plano le faltan (ADR 0024). No elimina nada.

Los errores son datos, y muchos llevan una corrección aplicable por máquina
`compile()` **nunca lanza excepciones** ante una fuente defectuosa — *devuelve* `diagnostics` con intervalos de bytes, un código catalogado `E_*`/`W_*` y un `fix`. Cuando la edición es mecánica, el diagnóstico también incluye `fixes` aplicables que `arch fix` aplica por ti. `--error-svg` incluso convierte un plan que *no* compilará en una tarjeta de error autodescriptiva que un agente puede consultar.
Paramétrico, programable y aún determinista

Valores, aritmética, arreglos, for/if/while y funciones puras — además de colocación relacional (right-of / below / …) y franjas de habitaciones, resueltas mediante aritmética topológica determinista, no un optimizador. Todo se expande en tiempo de compilación: sin runtime, sin reloj, sin E/S. Sufijos opcionales de unidades métricas (4m / 40cm / 20mm) se convierten exactamente a milímetros en tiempo de lexing.

Cinco formatos de salida · SVG accesible · herramientas de nivel IDE

SVG, DXF y un plano ASCII en TXT con cero dependencias; PDF (vectorial, texto seleccionable) y PNG (raster determinista) mediante complementos opcionales de carga diferida que la instalación predeterminada nunca trae. arch compile --accessible sella el SVG con <title>/<desc> + role="img" (--acc-id-prefix renombra esos ids, para que varios planos compartan una página). Añade el annotate de la biblioteca junto a él — compile(src, { annotate: true, accessible: true }), una opción que la CLI no expone — y cada habitación, abertura y mobiliario se convierte en un control nombrado y enfocable (data-arch-primary, role="button", aria-label). Lo que el integrador aún controla — el tab stop móvil, el estado de selección y quitar los controles para una renderización de solo lectura — está en la referencia del lenguaje, con las limitaciones conocidas de lectores de pantalla junto a ello.

Un LSP completo (hover, autocompletado, ir a definición, renombrar, ayuda de firmas), un formateador arch fmt, un catálogo arch explain <CODE>, una CLI autodocumentada (arch <cmd> --help, renderizada desde el manifiesto, con ejemplos prácticos incluidos) y una extensión de VS Code.

🚀 Inicio rápido

npx @chanmeng666/archlang new -o plan.arch          # scaffold a starter plan
npx @chanmeng666/archlang compile plan.arch -o plan.svg

O instálalo:

npm install @chanmeng666/archlang

Como biblioteca (cero dependencias, funciona en Node y en el navegador):

import { compile } from "@chanmeng666/archlang";

const { svg, diagnostics } = compile(`
plan "Tiny" {
  units mm
  grid 50
  wall exterior thickness 200 { (0,0) (4000,0) (4000,3000) (0,3000) close }
  room id=r at (0,0) size 4000x3000 label "Studio"
  door at (2000,3000) width 900 wall exterior hinge left swing in
  window at (0,1500) width 1200 wall exterior
}`);

// compile() never throws — errors come back as data, each with a span and a fix.
if (diagnostics.some((d) => d.severity === "error")) console.error(diagnostics);
else writeFileSync("tiny.svg", svg);

También exportado, todo puro: describe() (hechos), lint() (solidez), validateIntent() + projectSubscores() (¿coincide con el brief?), repair(), applyFixes(), suggestTopology(), renderAscii(), toDxf() y el núcleo LSP (completion, hover, …).

Desarrolla este repositorio
npm install          # one install bootstraps every workspace
npm run build        # build the library + CLI into dist/
npm run check        # typecheck + lint + the full test suite
npm run check:drift  # every generated artifact must match its source
npm run playground:dev   # build the core, then open the playground

🖼️ Galería

Cada uno de estos es un ejemplo real y compilado de examples/ — y cada dibujo en esta página está generado desde su fuente por npm run gen:example-svgs, así que una imagen aquí nunca puede desviarse del compilador que la creó. Haz clic en un dibujo para abrirlo en el playground, o en el nombre para ver la fuente.

La pieza central — todo el lenguaje en una sola hoja: orientación site, un polígono como rincón de lectura y una suite principal en forma de L, un arco de bahía curvado, los cinco tipos de puertas, un hueco de escalera compartido, un vacío sobre el salón de doble altura, un alero de techo y un par de baños en suite reflejados compuestos desde un único component. Cada habitación es accesible, cada puerta despeja y las tres advertencias que arch lint aún genera se dejan a propósito y se explican en la fuente.

El plano del sitio — el mismo lenguaje aplicado a todo lo que está FUERA de la línea de muro: un límite de parcela topografiado, nueve outdoor de materiales de suelo desde césped hasta piscina, un fence publicado alrededor del agua, un garage con el sexto tipo de puerta y catorce familias de mobiliario exterior desde los contenedores hasta el trampolín. El suelo se dibuja y se mide, pero enfáticamente no es área de piso.

Studio one-bedroom flat
studio
El buque insignia: cocina y baño equipados,
un baño cerrado desde un pasillo central.
Limpio de lint y sin imports.
Two-bedroom flat
two-bed
Una vivienda más grande: corredor central,
cinco habitaciones, ventanas en tres muros exteriores.
Attached one-bedroom flat
attached
Sin coordenadas calculadas a mano en absoluto:
franjas, aberturas en muro, anclajes.
Bungalow with sliding, pocket and bifold doors
bungalow
El vocabulario de puertas: correderas, de bolsillo
y abatibles — paneles, no arcos.
Hexagonal pavilion of six wedge-shaped galleries
hexagon-pavilion
Seis habitaciones poligonales alrededor de una rotonda circular:
room … polygon se encuentra con room circle.
A terrace of four mirrored houses
terrace-row
Un component, placed cuatro veces —
reflejados en pares, anchos desde un arreglo let.
Public library on an A2 sheet at 1:200
library
Un edificio público en una hoja real:
A2 a 1:200, ejes, cuadro y leyenda.
Station concourse on an A2 sheet at 1:200
transit-hall
Un vestíbulo: lados de pago y no pago,
una serie generada de torniquetes y quioscos.
Aquarium with a curved drum on an A2 sheet
aquarium
Arcos verdaderos, una habitación circular y áreas
exactas de πR² — nunca facetados a ningún zoom.
City Museum
museum
La hoja más grande del corpus:
A1 a 1:200, galerías, recepción y cafetería.
Gallery L
gallery-l
El buque insignia de habitaciones poligonales, amueblado
y probado contra `theme presentation`.
Workshop (materials)
materials
Anulaciones de `style` por elemento — materiales
de muro y rellenos de trama, amueblado.

Y uno que está aquí por su mobiliario — el catálogo de símbolos dibujados en un solo plano, desde el anillo del asiento del inodoro hasta el riel colgante del armario. Veintiséis tipos; ninguno lleva un label, y la mayoría tampoco lleva size:

Dos más, dibujados en una hoja más pequeña — el mismo lenguaje, dispuesto a una escala fija dentro de un borde A3 con título en lugar de ajustarse a su propio dibujo:

Courtyard house wrapped round an open court
courtyard-house
Un anillo de habitaciones alrededor de un patio abierto —
el caso donde la cara exterior de una ventana
no es el lado que su cuadro delimitador sugiere.
Three-storey townhouse, ground floor
townhouse
Tres plantas en un solo archivo (planta baja
mostrada) — bloques level, un hueco de
escalera, un dibujo por página.
Two-storey house
two-storey
Un vacío sobre la galería de la planta baja,
y aleros en la planta superior.
Tiny House
tiny-house
Puertas de granero y abatibles en una carcasa de 7,2 x 3 m,
ahora con aleros — roof overhang.

También en examples/ — todo el corpus, por lo que está ahí para mostrar:

La galería de documentación renderiza todos ellos en vivo y editables en el navegador.

🎬 Escaparate

Los ejemplos anteriores enseñan el lenguaje. El Escaparate es lo que sucede cuando lo aplicas a edificios reales y a famosos ficticios: la West Wing (cuyo Despacho Oval es un verdadero arc, no un polígono facetado), la Villa La Rotonda de Palladio (un cuarto, placed cuatro veces), Bag End, de_dust2, The Skeld, 742 Evergreen Terrace, el anexo de Dunder Mifflin. Cada uno son unas pocas docenas de líneas de código fuente que puedes abrir en el playground y recompilar.

Merece la pena verlos tanto por lo que el compilador dice sobre ellos como por los dibujos: arch lint informa de un W_NO_ENTRANCE real en de_dust2 — un cuarto de siglo de ocupación continua, logrado enteramente mediante generación — y revisa un apartamento de ferrocarril de 2.950 $ al mes en doce avisos repartidos en nueve códigos.

The West Wing, first floor Villa La Rotonda, piano nobile de_dust2 drawn as a building

archlang.uk/showcase para el conjunto seleccionado · ChanMeng666/archlang-showcase para el código fuente de cada plano y la historia que hay detrás.

🏗️ Cómo funciona

ArchLang es un pipeline de compilador. El texto fuente se convierte en un Scene IR neutral respecto al backend, y cada backend es un serializador puro de esa escena — por eso añadir un formato nunca toca el lenguaje.

flowchart TD
    SRC["<b>.arch</b> source"] --> LEX["<b>lexer</b><br/><i>hand-written → tokens with byte spans</i>"]
    LEX --> PAR["<b>parser</b><br/><i>recursive descent → AST · recovers, never throws</i>"]
    PAR --> IR["<b>resolve()</b><br/><i>expand scripting · grid-snap<br/>relational placement · host openings</i>"]

    IR -->|"render"| SCN["<b>toScene()</b><br/><i>wall union · hatches · page</i>"]
    IR -->|"read back"| DESC["<b>describe() · lint() · validateIntent()</b><br/><i>the SAME resolved plan, as FACTS —<br/>no rendering required</i>"]

    SCN --> SVG["<b>SVG</b><br/><sub>zero-dep</sub>"]
    SCN --> DXF["<b>DXF</b><br/><sub>zero-dep</sub>"]
    SCN --> TXT["<b>TXT</b><br/><sub>zero-dep</sub>"]
    SCN --> PDF["<b>PDF</b><br/><sub>optional</sub>"]
    SCN --> PNG["<b>PNG</b><br/><sub>optional</sub>"]

    DESC --> FACTS(["rooms · areas · adjacency<br/>access graph · intent score"])

    style SRC fill:#ede7f6,stroke:#6b3ae0,color:#1a1a1a
    style IR fill:#eceef2,stroke:#464d59,color:#1a1a1a
    style SCN fill:#eceef2,stroke:#464d59,color:#1a1a1a
    style DESC fill:#e8f5e9,stroke:#2e7d32,color:#1a1a1a
    style FACTS fill:#e8f5e9,stroke:#2e7d32,color:#1a1a1a
    style SVG fill:#fbfbfc,stroke:#464d59,color:#1a1a1a
    style DXF fill:#fbfbfc,stroke:#464d59,color:#1a1a1a
    style TXT fill:#fbfbfc,stroke:#464d59,color:#1a1a1a
    style PDF fill:#fbfbfc,stroke:#8a8f98,color:#1a1a1a
    style PNG fill:#fbfbfc,stroke:#8a8f98,color:#1a1a1a

La rama punteada es el punto clave: describe, lint y la comprobación de intención leen el mismo plan resuelto que el renderizador — así que lo que un agente verifica es exactamente lo que se dibuja, y no cuesta ni un píxel comprobarlo.

compile() es puro, síncrono y determinista — sin E/S, sin Date.now(), sin Math.random(). El único lugar donde se permiten las APIs de Node es la CLI; todo lo demás recibe su entorno a través de una costura World. Consulta AGENTS.md y los ADRs.

📦 Ecosistema

Paquete / superficieQué es
@chanmeng666/archlangEl núcleo: compilador, CLI, análisis. Cero dependencias en tiempo de ejecución, isomórfico.
@chanmeng666/archlang-mcpServidor MCP stdio opcional (el SDK está en cuarentena aquí).
Extensión de VS CodeSintaxis + diagnóstico en vivo, información al pasar el cursor, autocompletado, renombrado.
PlaygroundEditor en el cliente: vista previa, describir, lint, puntuación de intención, aplicar corrección, incrustar.
Sitio de documentaciónGuía, referencia, referencia de CLI, ADRs, ejemplos en vivo.
🤗 DatasetTrayectorias de reparación sintéticas y autoverificables + pares de autoría. CC0.
Acción de GitHubRenderiza los bloques ```arch en el Markdown de cualquier repositorio.

Incrusta un plano en cualquier lugar

Un plano en vivo y editable en cualquier blog, wiki o página de documentación — un <iframe>, sin paso de compilación, nada enviado a un servidor (el código fuente viaja en el hash #z= comprimido, así que la página es autocontenida):

<iframe src="https://playground.archlang.uk/embed.html#z=…" width="720" height="480"></iframe>

El botón Embed del playground genera el fragmento. Parámetros opcionales: editable=1 (mostrar un editor compacto que se re-renderiza mientras escribes) y theme=blueprint|dark|mono|presentation.

Pero no en GitHub. El saneador de Markdown de GitHub elimina <iframe> — se renderiza como texto escapado, igual que <script> — así que un README (aquí o en cualquier lugar de github.com) no puede alojar un embed en vivo, sin importar cómo se escriba. Los sustitutos honestos que GitHub sí permite son los que este README usa: un SVG estático que el compilador realmente produjo, enlazado a un permalink del playground que abre el mismo plano en vivo. En el sitio de documentación, donde el saneador no aplica, cada plano es en vivo y editable en su lugar.

📚 Documentación

  • 📖 Sitio de documentación — guía, referencia, catálogo de errores, ADRs y una galería de ejemplos en vivo y editable. Cada bloque ```arch en una página de documentación es en sí mismo un plano editable.
  • ⌨ Referencia de CLI — cada comando, bandera y código de salida (generado desde el manifiesto, así que no puede quedarse desactualizado).
  • spec.llm.md — el lenguaje completo en una página (~2k tokens) para agentes de IA; también arch spec.
  • SKILL.md — la habilidad del agente: el bucle spec → compile → fix → describe → validate.
  • Referencia del lenguaje · Catálogo de errores · El contrato de intención · ADRs
  • AGENTS.md — orientación para agentes de IA que trabajan en este repositorio.
  • Notas de versión — cada versión, incluido lo que cambia para el código que incrusta o analiza la salida. Instaladas, están en node_modules/@chanmeng666/archlang/CHANGELOG.md; la sección de cada etiqueta es también su Release de GitHub.

🤝 Contribuciones

¡Las contribuciones son bienvenidas! Por favor, lee la Guía de contribución y nuestro Código de conducta. Usa las plantillas de issue y pull-request cuando abras una.

❤️ Soporte y patrocinio

📄 Licencia

Publicado bajo la licencia MIT.


Chan Meng

Chan Meng
¿Necesitas una aplicación personalizada como esta? Yo las construyo — hablemos.

Email Chan Meng Chan Meng on GitHub