CommunityProgramación y desarrollogithub.com

fra00/a-isl-compile

Compila especificaciones A-ISL / ISL a bin-<stack>/ usando un agente de codificación (sin isl-generator / Gemini / OpenAI de pago). Usar SOLO cuando el usuario pida explícitamente compilar, construir o regenerar la implementación desde archivos .isl.md después de la fase de Especificación.

¿Qué es a-isl-compile?

Este skill permite a un agente de codificación (como Claude Code, Cursor, GitHub Copilot o Codex) compilar especificaciones A-ISL (archivos .isl.md) en implementaciones reales dentro de directorios bin-<stack>/, sin depender de servicios de pago como isl-generator, Gemini u OpenAI. El flujo de trabajo típico incluye: preflight, builder, queue --next, packet, escritura de archivos de implementación y lock. El agente escribe el código completo (sin marcadores TODO) siguiendo las reglas de la pila (por defecto react-js → bin-react-js/). La compilación solo se activa cuando el humano lo solicita explícitamente después de la fase de Especificación (Spec), evitando escrituras automáticas no autorizadas en bin-*/. También soporta recompilaciones dirigidas con --only, consulta de declaraciones de dependencias mediante lookup-decl, y generación de pruebas unitarias cuando las escenarios de prueba lo permiten. El skill prioriza el uso eficiente de tokens procesando una unidad a la vez con paquetes ligeros y recomendando agentes frescos para unidades pesadas o de alta complejidad.

Compatible con✓Claude Code✓Codex CLI✓Cursor✓Gemini CLI
npx skills add https://github.com/fra00/a-isl-agents/tree/HEAD/.cursor/skills/a-isl-compile

Installed? Explore more Programación y desarrollo skills: steipete/bluebubbles, steipete/eightctl, steipete/blucli · View all 6 →

Preguntar en tu IA favorita

Abre un nuevo chat con esta habilidad de agente ya precargada.

Documentación

A-ISL Compile (compilador dentro del agente)

Emites archivos bin-<stackId>/ desde ISL (pila por defecto react-js → bin-react-js). Están permitidos los CLIs builder / queue / packet / lock / preflight. El uso de isl-generator / Gemini / OpenAI de pago está prohibido.

Funciona con cualquier agente de codificación que cargue este skill (Cursor, Claude Code, GitHub Copilot, …). Mismo runtime npm desde la raíz del repositorio.

Puerta de solicitud del usuario (no negociable)

La modificación de bin solo se realiza mediante compile y solo, por supuesto, a petición del usuario.

  1. Entra en este skill / escribe bajo bin-* solo cuando el humano pida explícitamente compilar (ej: "compila", "/a-isl-compile", "build bin", "regenerate implementation", "run compile for …").
  2. Mensajes solo de especificación, ideas de funcionalidades en lenguaje natural o ajustes de UX sin una solicitud explícita de compilación NO DEBEN desencadenar escrituras de implementación — envíalos a a-isl-spec-author (o fase de Spec) y detente.
  3. No compiles automáticamente después de ediciones de Spec "porque la demo se rompería" o "para completar el ciclo".
  4. Las carpetas de implementación se actualizan solo a través de este flujo de trabajo Compile (packet → write → lock). No trates parches ad-hoc bajo bin-* como la ruta A-ISL a menos que el humano pida explícitamente una excepción única.
  5. Si el humano no ha pedido compilar: rechaza editar bin-* y dile que necesita una solicitud explícita de compilación.

Cuándo usarlo

  • El humano terminó la fase Spec y pide construir/compilar/regenerar
  • Alinear el bin-<stack>/ de un proyecto con los *.isl.md actualizados porque el humano solicitó Compile

Restricciones estrictas

  1. No ejecutes generadores de pago o clientes de codegen API.
  2. Tú escribes cada archivo de implementación bajo el directorio bin de la pila desde el targetPath del packet (código completo, sin stubs TODO).
  3. Actualizar gen-lock.json solo no es compilación — solo haz lock después de escrituras reales bajo bin-<stack>/.
  4. Si ISL es ambiguo o contradictorio: detente e indica al usuario que vuelva a a-isl-spec-author. No inventes requisitos.
  5. No abras vendor/isl-spec/ durante Compile (solo Spec Agent), a menos que el usuario lo pida explícitamente.
  6. Prefiere una unidad a la vez mediante queue --next + packet ligero. No cargues el JSON completo de la cola o el .build.md completo por defecto.

Directorio de salida

Por defecto: bin-<stackId> junto a las especificaciones (ej: --stack react-js → bin-react-js). Sobrescribir con --bin si es necesario. El mismo espacio de trabajo puede contener bin-react-js y bin-csharp uno al lado del otro.

Flujo de trabajo de bajo consumo de tokens (por defecto)

preflight → builder (una vez) → bucle: queue --next → packet → [tests luego] write impl → (batch) lock
         → (opcional) npm run verify

0. Preflight (una vez)

npm run preflight -- --root examples/connect-four-workspace

Solo puerta estructural/gráfico/lint — no prueba la corrección de la implementación. Si falla, corrige Spec/lint antes de compilar.

1. Builder (una vez por lote)

npm run builder -- examples/connect-four-workspace

El orden topológico vive en build/build-manifest.json (propiedad del script). No inventes el orden de compilación.

2. Solo la siguiente unidad

npm run queue -- --root examples/connect-four-workspace --next

Pasa --stack <id> en cada llamada queue/packet en el bucle (por defecto react-js → bin-react-js/):

npm run queue  -- --root <project> --next --stack blazor
npm run packet -- --root <project> --next --stack blazor

Ids: react-js, blazor, winforms, csharp (solo biblioteca), python, python-fastapi. Opcional --bin <path> sobrescribe la carpeta de salida.

Recompilación dirigida — cuando el humano pide regenerar una o unas pocas unidades (el lock las saltaría si no):

npm run queue  -- --root <project> --next --only dungeon --stack react-js
npm run packet -- --root <project> --next --only dungeon --stack react-js
# o packet por nombre:
npm run packet -- --root <project> --only dungeon --stack react-js

--only puede repetirse. Tokens: nombre base de la unidad (dungeon), dungeon.isl.md, o ./dungeon. Razón en JSON de cola: force-only. No uses --force a nivel de workspace cuando solo se solicita un subconjunto.

Usa next.buildFile / next.targetPath. Si next es null, detente (cola vacía). Usa el queue completo --json solo cuando el humano pide una vista general.

3. Packet ligero (contexto por defecto)

npm run packet -- --root examples/connect-four-workspace --build-file "<abs.build.md>"
# o
npm run packet -- --root examples/connect-four-workspace --next

El packet incluye: SOURCE markdown para esta unidad, ruta objetivo, subconjunto de restricciones de pila, rutas a archivos de dependencia en el mismo bin-<stack>/. Excluye blobs inline .ref.md.

Escribe archivos desde el packet (ver orden EXT-001 abajo). Importa módulos de dependencia reales desde las rutas listadas.

3a. Búsqueda de declaración de dependencia (EXT-002)

Cuando necesites la declaración exacta de un símbolo de dependencia (método / función / tipo) antes de escribir esta unidad:

npm run lookup-decl -- --stack <id> --name <NombreSpecOCall> --file <ruta-abs-o-rel-bin> [--workspace <project>]
# o escanea una carpeta bin (archivos generados *.test.* / *.Tests.cs se saltan a menos que --include-tests):
npm run lookup-decl -- --stack <id> --name <Nombre> --dir <bin-<stack>> --workspace <project>
  • Salida 0 = acierto, 2 = no_match, 3 = error de uso / ruta / pila.
  • Lee stdout JSON: usa candidates[selected] (signatureText, leadingContext, enclosingType, kind por candidato). No inventes expresiones regulares ni abras todo el archivo de dependencia para buscar firmas.
  • Los patrones y callSymbol viven en la configuración de la pila (declaration-patterns.ts / stacks.config.ts) — el skill debe solo invocar este CLI.
  • Las rutas deben resolverse bajo --workspace y un segmento bin-* (escape de symlink → salida 3).

3b. EXT-001 Pruebas generadas (cuando Spec opta por ello)

Escenarios verificables = Escenarios de Prueba con tanto `id: …` como - Call: … (ver docs/isl-agent-profile.md). El Autor de Spec decide; cualquier rol puede optar.

Por unidad, mismo turno:

  1. Si SOURCE tiene ≥1 escenario elegible: sobrescribe el archivo de prueba generado primero (ruta = nombre base de impl + stack.verify.testSuffix bajo el mismo bin-<stack>/, ej: domain-sheet.test.js / domain-sheet.Tests.cs). Afirma solo desde escenarios de Spec + Firma; mapea Call → símbolo vía stack.verify.callSymbol (as-is | pascal-case | snake-case en stacks.config.ts). react-js Domain/Logic: cada Call DEBE ser una exportación nombrada; las pruebas DEBEN import { <Call> } from "./<file>" — nunca import Unit from …; Unit().<Call>(). Si el workspace tiene bench/call-map.json, resuelve export desde "<unidad>.<Call>" e importa ese nombre (mismo contrato que score congelado). No inventes casos para escenarios solo en prosa; no abras/edites el archivo de impl antes de escribir el archivo de prueba.
  2. Luego escribe la impl en targetPath para que satisfaga esas pruebas y el Contrato. react-js Domain/Logic: export function <Call> / export const <Call> para cada Capacidad; PROHIBIDO exportar por defecto una fábrica que envuelva capacidades.
  3. Si cero escenarios elegibles: solo escribe impl; elimina un archivo de prueba generado previamente para esa unidad si aún existe. Sigue usando exportaciones de capacidad nombradas para Domain/Logic.
  4. Si la verificación falla: puedes --only recompilar solo impl (mantén el archivo de prueba). NO DEBES reescribir pruebas para que pasen (incluyendo cambiar imports nombrados por fábricas por defecto). Si el escenario/Call/esperado parece incorrecto → DETENTE y envía al humano a a-isl-spec-author.
  5. Después de un lote de Domain/Logic (u otro elegible), puedes sugerir npm run verify -- --root <project> --stack <id>; no exijas verde para hacer lock. Lock sigue siendo un caché de hash de build.

Recompilación completa de unidad después de cambio de Spec: regenera el archivo de prueba completo desde el Spec actual, luego la impl (no una fusión con pruebas antiguas).

4. Lock (lote cuando sea posible)

Después de 1–5 escrituras exitosas:

npm run lock -- --root examples/connect-four-workspace --build-file "<abs1>" --build-file "<abs2>"

5. Agrupación por complejidad (higiene de contexto)

Una sesión larga de agente que compila muchas unidades tiende a subimplementar las últimas o paquetes grandes (contexto lleno de bins anteriores). Prefiere:

Tipo de unidadCómo compilar
Hoja / pequeñaMismo agente, lote de varios queue --next → write → lock
Pesada / hubAgente fresco / nuevo chat: --only <unidad> → packet → implementa cada capacidad en SOURCE → lock
Reparación después de revisión/playtestAgente fresco + --only en la(s) unidad(es) que fallan solamente

Trata una unidad como pesada si se cumple alguna de estas (independiente de la pila):

  • SOURCE largo / muchas capacidades #### en un .isl.md
  • Alto fan-in: muchas otras unidades la Referencian, o Referencia muchos deps
  • Presentación o Lógica que orquesta una gran parte del grafo (shell / facade / sesión límite)
  • El packet o compilación previa de esa unidad tiene historial de Flows omitidos

No generes un agente por hoja por defecto (costo). No ejecutes todo un workspace grande en un solo agente sin refrescar en hubs.

Indicación para una unidad pesada: raíz del repo, --stack, --only <unidad>, "implementa cada capacidad en SOURCE; sin Flows omitidos." Sigue agent-skills/a-isl-compile/SKILL.md (o la copia host bajo .cursor/skills, .claude/skills, o .github/skills).

Tabla de escalada (cuando el acceso ligero no es suficiente)

SituaciónAcción
Packet ok, bins de dep existen, ISL claroSolo ligero → escribe archivo
Salida de packet / missingDependencyBinsDETENTE — corrige cola/orden; no inventes APIs
Necesitas declaración/firma exacta de un depnpm run lookup-decl (EXT-002); usa JSON selected — no inventes APIs
lookup-decl salida 2 (no_match)Revisa Spec Call/nombre + ruta del dep; no inventes firmas
Packet incompleto / sin marcador SOURCELee el fullBuildFile de esta unidad una vez
ISL ambiguo / contradictorioDETENTE → Spec Agent; sin inmersión en vendor
Humano solicita auditoría de reconstrucción completa--force / queue completo --json permitido

Reglas de escritura por unidad

Encabezado en cada archivo generado:

/**
 * DO NOT EDIT THIS FILE DIRECTLY
 * ----------------------------------
 * This file was generated by ISL Compiler.
 * Source: <nombre-base-del-.isl.md>
 * Edita el archivo ISL en su lugar.
 */

Sigue las reglas de la pila (react-js por defecto). Implementación completa — sin stubs TODO.

Rutas

HerramientaEntrada
Preflightnpm run preflight -- --root <project>
Buildernpm run builder -- <project>
Queue nextnpm run queue -- --root <project> --next
Packetnpm run packet -- --root <project> --next
Locknpm run lock -- --root <project> --build-file <abs>…
Verifynpm run verify -- --root <project> [--stack <id>] [--only <unit>]
Lookup decl`npm run lookup-decl -- --stack --name --file
Lintnpm run lint -- <file.isl.md>

Skills relacionados