fra00/a-isl-compile

Compilar especificações A-ISL / ISL para bin-<stack> usando um agente de codificação (sem usar isl-generator / Gemini / OpenAI pagos). Use SOMENTE quando o usuário pedir explicitamente para construir, compilar ou regenerar a implementação a partir de .isl.md após a fase de Spec. Prefira preflight, queue --next e pacotes leves; o agente escreve os arquivos em bin-<stack>. Nunca compile sem solicitação após Spec ou conversa de UX.

O que é a-isl-compile?

Esta habilidade permite que um agente de codificação (como Claude Code, Cursor, GitHub Copilot) compile especificações A-ISL/ISL em implementações reais dentro do diretório `bin-<stack>`, sem depender de geradores pagos (isl-generator, Gemini, OpenAI). Ela é acionada exclusivamente por solicitação explícita do usuário (por exemplo, "compila", "/a-isl-compile") e nunca automaticamente após a fase de Spec ou durante conversas de UX. O fluxo de trabalho segue uma sequência otimizada para baixo consumo de tokens: preflight → builder → loop com queue --next e packet leve → escrita de arquivos → lock, suportando múltiplos stacks (react-js, blazor, winforms, csharp, python, python-fastapi). A habilidade também gerencia testes gerados, consulta de declarações de dependências via CLI (lookup-decl) e quebra de unidades pesadas em agentes separados para evitar subimplementação. Se o ISL for ambíguo ou houver erros, o agente para e solicita que o usuário retorne ao agente de especificação (a-isl-spec-author).

Funciona com✓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 Programação e Desenvolvimento skills: steipete/bluebubbles, steipete/eightctl, steipete/blucli · View all 6 →

Perguntar na sua IA favorita

Abre um novo chat com esta habilidade de agente já pré-carregada.

Documentação

A-ISL Compile (compilador no agente)

Você gera bin-<stackId> a partir de ISL (stack padrão react-js → bin-react-js). CLIs Builder / queue / packet / lock / preflight são permitidos. isl-generator / Gemini / OpenAI pagos são proibidos.

Funciona com qualquer agente de codificação que carregue esta habilidade (Cursor, Claude Code, GitHub Copilot, …). Mesmo runtime npm a partir da raiz do repositório.

Portão de solicitação do usuário (não negociável)

La modifica alla bin viene fatta solo tramite compile e solo ovviamente su richiesta dell'utente.

  1. Entre nesta habilidade / escreva em bin-* apenas quando o humano pedir explicitamente para compilar (ex: compila, /a-isl-compile, "build bin", "regenerate implementation", "run compile for …").
  2. Mensagens apenas de Spec, ideias de funcionalidades em linguagem natural ou ajustes de UX sem uma solicitação explícita de compilação NÃO DEVEM acionar escrita de implementação — envie-os para a-isl-spec-author (ou fase de Spec) e pare.
  3. Não compile automaticamente após edições de Spec "porque a demo quebraria" ou "para finalizar o ciclo".
  4. As pastas de implementação são atualizadas apenas através deste fluxo de Compile (packet → write → lock). Não trate patches avulsos em bin-* como o caminho A-ISL, a menos que o humano peça explicitamente uma exceção única.
  5. Se o humano não pediu para compilar: recuse-se a editar bin-* e diga que eles precisam de uma solicitação explícita de compilação.

Quando usar

  • Humano terminou a fase de Spec e pede para construir/compilar/regenerar
  • Alinhar o bin-<stack>/ de um projeto com *.isl.md atualizados porque o humano solicitou Compile

Restrições rígidas

  1. Não execute geradores pagos ou clientes de codegen de API.
  2. Você escreve cada arquivo de implementação sob o diretório bin do stack a partir do targetPath do pacote (código completo, sem stubs TODO).
  3. Atualizar gen-lock.json sozinho não é compilação — apenas lock após escritas reais em bin-<stack>/.
  4. Se o ISL for ambíguo ou contraditório: pare e diga ao usuário para retornar a a-isl-spec-author. Não invente requisitos.
  5. Não abra vendor/isl-spec/ durante o Compile (apenas Spec Agent), a menos que o usuário peça explicitamente.
  6. Prefira uma unidade por vez via queue --next + pacote leve. Não carregue o JSON completo da fila ou o .build.md completo por padrão.

Diretório de saída

Padrão: bin-<stackId> ao lado das especificações (ex: --stack react-js → bin-react-js). Substitua com --bin se necessário. O mesmo workspace pode conter bin-react-js e bin-csharp lado a lado.

Fluxo de trabalho de baixo token (padrão)

preflight → builder (uma vez) → loop: queue --next → packet → [tests então] write impl → (batch) lock
         → (opcional) npm run verify

0. Preflight (uma vez)

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

Apenas portão estrutural/grafo/lint — não prova a correção da implementação. Se falhar, corrija Spec/lint antes de compilar.

1. Builder (uma vez por lote)

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

A ordem topológica está em build/build-manifest.json (de propriedade do script). Você não inventa a ordem de compilação.

2. Apenas próxima unidade

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

Passe --stack <id> em todas as chamadas queue/packet no loop (padrão 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 (apenas biblioteca), python, python-fastapi. Opcional --bin <path> substitui a pasta de saída.

Recompilação direcionada — quando o humano pede para regenerar uma ou algumas unidades (o lock as pularia):

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

--only pode ser repetido. Tokens: nome base da unidade (dungeon), dungeon.isl.md, ou ./dungeon. Razão no JSON da fila: force-only. Não use --force em todo o workspace quando apenas um subconjunto é solicitado.

Use next.buildFile / next.targetPath. Se next for null, pare (fila vazia). Use fila --json completa apenas quando o humano pedir uma visão geral.

3. Pacote leve (contexto padrão)

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

O pacote inclui: markdown SOURCE para esta unidade, caminho de destino, subconjunto de restrição de stack, caminhos para arquivos de dependência no mesmo bin-<stack>/. Exclui blobs .ref.md inline.

Escreva arquivos a partir do pacote (veja ordem EXT-001 abaixo). Importe módulos de dependência reais dos caminhos listados.

3a. Consulta de declaração de dependência (EXT-002)

Quando você precisar da declaração exata de um símbolo de dependência (método / função / tipo) antes de escrever esta unidade:

npm run lookup-decl -- --stack <id> --name <SpecOrCallName> --file <abs-or-rel-bin-path> [--workspace <project>]
# ou escaneie uma pasta bin (arquivos *.test.* / *.Tests.cs gerados são ignorados a menos que --include-tests):
npm run lookup-decl -- --stack <id> --name <Name> --dir <bin-<stack>> --workspace <project>
  • Saída 0 = encontrado, 2 = no_match, 3 = erro de uso / caminho / stack.
  • Leia o JSON stdout: use candidates[selected] (signatureText, leadingContext, enclosingType, kind por candidato). Não invente regexes ou abra o arquivo de dep inteiro para caçar assinaturas.
  • Padrões e callSymbol estão na configuração do stack (declaration-patterns.ts / stacks.config.ts) — a habilidade deve apenas invocar esta CLI.
  • Os caminhos devem ser resolvidos sob --workspace e um segmento bin-* (escape de symlink → saída 3).

3b. EXT-001 Testes gerados (quando Spec opta por participar)

Cenários verificáveis = Cenários de Teste com ambos `id: …` e - Call: … (veja docs/isl-agent-profile.md). O Autor de Spec decide; qualquer função pode optar por participar.

Por unidade, no mesmo turno:

  1. Se SOURCE tem ≥1 cenário elegível: substitua o arquivo de teste gerado primeiro (caminho = nome base da impl + stack.verify.testSuffix sob o mesmo bin-<stack>/, ex: domain-sheet.test.js / domain-sheet.Tests.cs). Afirme apenas a partir de cenários Spec + Assinatura; mapeie Call → símbolo via stack.verify.callSymbol (as-is | pascal-case | snake-case em stacks.config.ts). react-js Domain/Logic: cada Call DEVE ser uma exportação nomeada; testes DEVEM import { <Call> } from "./<file>" — nunca import Unit from …; Unit().<Call>(). Se o workspace tem bench/call-map.json, resolva export de "<unit>.<Call>" e importe esse nome (mesmo contrato do score congelado). Não invente casos para cenários só em prosa; não abra/edite o arquivo de impl antes do arquivo de teste ser escrito.
  2. Em seguida, escreva a impl em targetPath de modo que satisfaça esses testes e o Contrato. react-js Domain/Logic: export function <Call> / export const <Call> para cada Capability; PROIBIDO factory de exportação padrão encapsulando capabilities.
  3. Se zero cenários elegíveis: escreva apenas a impl; delete um arquivo de teste gerado anteriormente para essa unidade se ainda existir. Ainda use exportações nomeadas de capability para Domain/Logic.
  4. Em caso de falha de verify: você pode recompilar com --only apenas a impl (mantenha o arquivo de teste). NÃO DEVE reescrever testes para fazê-los passar (incluindo mudar imports nomeados para factories padrão). Se o cenário/Call/esperado parecer errado → PARE e envie o humano para a-isl-spec-author.
  5. Após um lote de Domain/Logic (ou outro elegível), você pode sugerir npm run verify -- --root <project> --stack <id>; não exija verde para fazer lock. Lock permanece um cache de hash de build.

Recompilação completa da unidade após mudança de Spec: regenere o arquivo de teste inteiro a partir do Spec atual, depois a impl (não uma mesclagem com testes antigos).

4. Lock (lote quando possível)

Após 1–5 escritas bem-sucedidas:

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

5. Agrupamento por complexidade (higiene de contexto)

Uma longa sessão de agente que compila muitas unidades tende a subimplementar unidades posteriores ou grandes pacotes (contexto preenchido com bins anteriores). Prefira:

Tipo de unidadeComo compilar
Folha / pequenaMesmo agente, lote vários queue --next → escreva → lock
Pesada / hubAgente novo / novo chat: --only <unit> → packet → implemente todas as capabilities em SOURCE → lock
Reparo após revisão/playtestAgente novo + --only na(s) unidade(s) com falha apenas

Trate uma unidade como pesada se qualquer uma destas condições for verdadeira (independente de stack):

  • SOURCE longo / muitas capabilities #### em um .isl.md
  • Alto fan-in: muitas outras unidades a Referenciam, ou ela Referencia muitas deps
  • Apresentação ou Lógica que orquestra uma grande parte do grafo (shell / facade / session boundary)
  • Packet ou compilação anterior dessa unidade tem histórico de Flows omitidos

Não crie um agente por folha por padrão (custo). Não execute um workspace grande inteiro em um agente sem atualizar nos hubs.

Prompt para uma unidade pesada: raiz do repositório, --stack, --only <unit>, "implemente toda capability em SOURCE; nenhum Flow omitido." Siga agent-skills/a-isl-compile/SKILL.md (ou a cópia do host em .cursor/skills, .claude/skills, ou .github/skills).

Tabela de escalação (quando o acesso leve não é suficiente)

SituaçãoAção
Packet ok, bins de dep existem, ISL claroApenas leve → escreva arquivo
Packet saída / missingDependencyBinsPARE — corrija fila/ordem; não invente APIs
Precisa da declaração/assinatura exata de uma depnpm run lookup-decl (EXT-002); use selected do JSON — não invente APIs
lookup-decl saída 2 (no_match)Re-verifique Spec Call/nome + caminho da dep; não invente assinaturas
Packet incompleto / sem marcador SOURCELeia o fullBuildFile desta unidade uma vez
ISL ambíguo / contraditórioPARE → Spec Agent; nenhum mergulho em vendor
Humano solicita auditoria completa de rebuild--force / fila completa --json permitido

Regras de escrita por unidade

Cabeçalho em cada arquivo gerado:

/**
 * DO NOT EDIT THIS FILE DIRECTLY
 * ----------------------------------
 * This file was generated by ISL Compiler.
 * Source: <basename-of-.isl.md>
 * Edit the ISL file instead.
 */

Siga as regras do stack (react-js padrão). Implementação completa — sem stubs TODO.

Caminhos

FerramentaEntrada
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>

Habilidades Relacionadas