fra00/a-isl-compile

Compile des spécifications A-ISL / ISL vers le dossier bin-<stack> en utilisant un agent de codage (sans isl-generator / Gemini / OpenAI payants). À utiliser UNIQUEMENT lorsque l'utilisateur demande explicitement de construire, compiler ou régénérer l'implémentation à partir des fichiers .isl.md après la phase de Spécification.

Qu'est-ce que a-isl-compile ?

Ce skill permet à un agent de codage (comme Claude Code, Cursor, GitHub Copilot) de compiler des fichiers de spécification A-ISL (.isl.md) en code implémenté dans des dossiers `bin-<stack>` (par exemple, `bin-react-js`, `bin-csharp`). Il suit un workflow à faible consommation de tokens : preflight, builder, puis une boucle `queue --next → packet → écriture du code → lock`. L'agent écrit lui-même chaque fichier d'implémentation à partir des paquets de compilation, sans recourir à des services externes payants. Le skill est strictement protégé par une porte utilisateur : il ne compile que sur demande explicite (par exemple, « compile », « build bin »), et refuse d'écrire dans les dossiers `bin-*` lors de discussions sur la spécification ou l'expérience utilisateur. Il supporte plusieurs stacks (react-js, blazor, winforms, csharp, python, python-fastapi) et gère la recompilation ciblée de certaines unités via l'option `--only`.

Compatible avec✓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 Développement et programmation skills: steipete/bluebubbles, steipete/eightctl, steipete/blucli · View all 6 →

Demander à votre IA préférée

Ouvre une nouvelle conversation avec cette compétence d'agent déjà préchargée.

Documentation

Compilation A-ISL (compilateur dans l'agent)

Vous émettez le dossier bin-<stackId>/ à partir de l'ISL (stack par défaut react-js → bin-react-js). Les CLIs Builder / queue / packet / lock / preflight sont autorisés. Les outils payants isl-generator / Gemini / OpenAI sont interdits.

Fonctionne avec n'importe quel agent de codage qui charge ce skill (Cursor, Claude Code, GitHub Copilot, …). Même runtime npm depuis la racine du dépôt.

Porte de demande utilisateur (non négociable)

La modification du dossier bin-* se fait uniquement via la compilation et uniquement sur demande explicite de l'utilisateur.

  1. Entrez dans ce skill / écrivez sous bin-* uniquement lorsque l'humain demande explicitement de compiler (par ex. "compile", "/a-isl-compile", "build bin", "regenerate implementation", "run compile for …").
  2. Les messages uniquement de spécification, les idées de fonctionnalités en langage naturel ou les ajustements UX sans demande explicite de compilation NE DOIVENT PAS déclencher d'écritures d'implémentation — envoyez-les à a-isl-spec-author (ou phase de Spécification) et arrêtez-vous.
  3. Ne compilez pas automatiquement après des modifications de Spec "parce que la démo se casserait" ou "pour terminer la boucle".
  4. Les dossiers d'implémentation sont mis à jour uniquement via ce workflow de Compilation (paquet → écriture → verrouillage). Ne traitez pas les correctifs ad-hoc sous bin-* comme le chemin A-ISL sauf si l'humain demande explicitement une exception ponctuelle.
  5. Si l'humain n'a pas demandé de compiler : refusez de modifier bin-* et dites qu'il a besoin d'une demande de compilation explicite.

Quand utiliser

  • L'humain a terminé la phase de Spécification et demande à construire/compiler/régénérer
  • Aligner les bin-<stack>/ d'un projet avec les *.isl.md mis à jour parce que l'humain a demandé la Compilation

Contraintes strictes

  1. N'exécutez pas de générateurs payants ou de clients API de génération de code.
  2. Vous écrivez chaque fichier d'implémentation sous le dossier bin de la stack à partir du targetPath du paquet (code complet, pas de stubs TODO).
  3. Mettre à jour gen-lock.json seul n'est pas une compilation — ne verrouillez qu'après de vraies écritures sous bin-<stack>/.
  4. Si l'ISL est ambigu ou contradictoire : arrêtez-vous et dites à l'utilisateur de retourner vers a-isl-spec-author. N'inventez pas d'exigences.
  5. N'ouvrez pas vendor/isl-spec/ pendant la Compilation (Agent de Spec uniquement), sauf demande explicite de l'utilisateur.
  6. Préférez une unité à la fois via queue --next + paquet léger. Ne chargez pas le JSON complet de la file d'attente ou le .build.md complet par défaut.

Dossier de sortie

Par défaut : bin-<stackId> à côté des specs (par ex. --stack react-js → bin-react-js). Remplacez avec --bin si nécessaire. Un même espace de travail peut contenir bin-react-js et bin-csharp côte à côte.

Workflow à faible consommation de tokens (par défaut)

preflight → builder (une fois) → boucle : queue --next → packet → [tests puis] écriture impl → (par lot) lock
         → (optionnel) npm run verify

0. Preflight (une fois)

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

Porte structurelle/graphe/lint uniquement — ne prouve pas la correction de l'implémentation. En cas d'échec, corrigez la Spec/lint avant de compiler.

1. Builder (une fois par lot)

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

L'ordre topologique se trouve dans build/build-manifest.json (propriété du script). Vous n'inventez pas l'ordre de compilation.

2. Unité suivante uniquement

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

Passez --stack <id> à chaque appel queue/packet dans la boucle (par défaut 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 (bibliothèque uniquement), python, python-fastapi. Optionnel --bin <path> remplace le dossier de sortie.

Recompilation ciblée — lorsque l'humain demande de régénérer une ou quelques unités (le verrouillage les ignorerait autrement) :

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

--only peut être répété. Tokens : nom de base de l'unité (dungeon), dungeon.isl.md, ou ./dungeon. Raison dans le JSON de la file : force-only. N'utilisez pas --force à l'échelle de l'espace de travail si seul un sous-ensemble est demandé.

Utilisez next.buildFile / next.targetPath. Si next est null, arrêtez-vous (file vide). Utilisez la file --json complète uniquement lorsque l'humain demande une vue d'ensemble.

3. Paquet léger (contexte par défaut)

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

Le paquet inclut : le markdown SOURCE pour cette unité, le chemin cible, le sous-ensemble de contraintes de stack, les chemins vers les fichiers de dépendance dans le même bin-<stack>/. Il exclut les blobs .ref.md intégrés.

Écrivez les fichiers à partir du paquet (voir ordre EXT-001 ci-dessous). Importez les modules de dépendance réels depuis les chemins listés.

3a. Recherche de déclaration de dépendance (EXT-002)

Lorsque vous avez besoin de la déclaration exacte d'un symbole de dépendance (méthode / fonction / type) avant d'écrire cette unité :

npm run lookup-decl -- --stack <id> --name <SpecOrCallName> --file <abs-or-rel-bin-path> [--workspace <project>]
# ou analysez un dossier bin (les fichiers générés *.test.* / *.Tests.cs sont ignorés sauf --include-tests) :
npm run lookup-decl -- --stack <id> --name <Name> --dir <bin-<stack>> --workspace <project>
  • Code de sortie 0 = trouvé, 2 = no_match, 3 = erreur d'utilisation / chemin / stack.
  • Lisez le JSON de sortie standard : utilisez candidates[selected] (signatureText, leadingContext, enclosingType, kind par candidat). N'inventez pas d'expressions régulières et n'ouvrez pas le fichier de dépendance complet pour rechercher des signatures.
  • Les motifs et callSymbol se trouvent dans la configuration de la stack (declaration-patterns.ts / stacks.config.ts) — le skill doit uniquement invoquer cette CLI.
  • Les chemins doivent se résoudre sous --workspace et un segment bin-* (échappement de lien symbolique → code 3).

3b. EXT-001 Tests générés (lorsque la Spec opte)

Scénarios éligibles à la vérification = Scénarios de Test avec à la fois `id: …` et - Call: … (voir docs/isl-agent-profile.md). L'Auteur de Spec décide ; n'importe quel rôle peut opter.

Par unité, même tour :

  1. Si SOURCE a ≥1 scénario éligible : écrasez le fichier de test généré d'abord (chemin = nom de base de l'impl + stack.verify.testSuffix sous le même bin-<stack>/, par ex. domain-sheet.test.js / domain-sheet.Tests.cs). Affirmez uniquement à partir des scénarios Spec + Signature ; mappez Call → symbole via stack.verify.callSymbol (as-is | pascal-case | snake-case dans stacks.config.ts). react-js Domaine/Logique : chaque Call DOIT être une exportation nommée ; les tests DOIVENT import { <Call> } from "./<file>" — jamais import Unit from …; Unit().<Call>(). Si l'espace de travail a bench/call-map.json, résolvez l'export depuis "<unit>.<Call>" et importez ce nom (même contrat que le score figé). N'inventez pas de cas pour les scénarios en prose uniquement ; n'ouvrez/ne modifiez pas le fichier d'impl avant que le fichier de test soit écrit.
  2. Écrivez ensuite l'impl à targetPath pour qu'elle satisfasse ces tests et le Contrat. react-js Domaine/Logique : export function <Call> / export const <Call> pour chaque Capacité ; INTERDIT l'export par défaut d'une fabrique encapsulant les capacités.
  3. Si zéro scénario éligible : écrivez l'impl uniquement ; supprimez un fichier de test généré précédemment pour cette unité s'il existe encore. Utilisez toujours des exports nommés de capacité pour Domaine/Logique.
  4. En cas d'échec de vérification : vous pouvez --only recompiler l'impl uniquement (conservez le fichier de test). NE DEVEZ PAS réécrire les tests pour les faire passer (y compris en changeant les imports nommés en fabriques par défaut). Si le scénario/Call/résultat attendu semble erroné → ARRÊTEZ-VOUS et envoyez l'humain vers a-isl-spec-author.
  5. Après un lot Domaine/Logique (ou autre éligible), vous pouvez suggérer npm run verify -- --root <project> --stack <id> ; n'exigez pas le vert pour verrouiller. Le verrouillage reste un cache de hash de build.

Recompilation complète de l'unité après modification de la Spec : régénérez le fichier de test entier à partir de la Spec actuelle, puis l'impl (pas une fusion avec les anciens tests).

4. Verrouillage (par lot si possible)

Après 1 à 5 écritures réussies :

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

5. Regroupement par agent selon la complexité (hygiène du contexte)

Une longue session d'agent qui compile plusieurs unités tend à sous-implanter les paquets ultérieurs ou volumineux (contexte rempli par les bins précédents). Préférez :

Type d'unitéComment compiler
Feuille / petiteMême agent, regroupez plusieurs queue --next → écriture → verrouillage
Lourde / hubNouvel agent / nouvelle discussion : --only <unit> → paquet → implémentez chaque capacité dans SOURCE → verrouillage
Réparation après revue/testNouvel agent + --only sur la/les unité(s) défaillante(s) uniquement

Traitez une unité comme lourde si l'une de ces conditions est vraie (indépendant de la stack) :

  • Longue SOURCE / nombreuses capacités #### dans un seul .isl.md
  • Fort fan-in : beaucoup d'autres unités la référencent, ou elle référence beaucoup de dépendances
  • Présentation ou Logique qui orchestre une grande partie du graphe (shell / façade / frontière de session)
  • Le paquet ou la compilation précédente de cette unité a un historique de Flux omis

Ne lancez pas un agent par feuille par défaut (coût). N'exécutez pas un grand espace de travail entier dans un seul agent sans vous rafraîchir sur les hubs.

Invite pour une unité lourde : racine du dépôt, --stack, --only <unit>, "implémentez chaque capacité dans SOURCE ; aucun Flux omis." Suivez agent-skills/a-isl-compile/SKILL.md (ou la copie hôte sous .cursor/skills, .claude/skills, ou .github/skills).

Table d'escalade (lorsque l'accès léger ne suffit pas)

SituationAction
Paquet OK, bins de dépendances existent, ISL clairLéger uniquement → écrire le fichier
Sortie du paquet / missingDependencyBinsARRÊTEZ-VOUS — corrigez la file/l'ordre ; n'inventez pas d'API
Besoin de la déclaration/signature exacte d'une dépendancenpm run lookup-decl (EXT-002) ; utilisez le JSON selected — n'inventez pas d'API
lookup-decl code 2 (no_match)Revérifiez le Call/nom Spec + chemin de dépendance ; n'inventez pas de signatures
Paquet incomplet / pas de marqueur SOURCELisez le fullBuildFile de cette unité une fois
ISL ambigu / contradictoireARRÊTEZ-VOUS → Agent de Spec ; pas de plongée dans vendor
L'humain demande un audit complet de reconstruction--force / file --json complète autorisée

Règles d'écriture par unité

En-tête sur chaque fichier généré :

/**
 * NE PAS MODIFIER CE FICHIER DIRECTEMENT
 * ---------------------------------------
 * Ce fichier a été généré par le compilateur ISL.
 * Source : <nom-de-base-du-.isl.md>
 * Modifiez le fichier ISL à la place.
 */

Suivez les règles de la stack (react-js par défaut). Implémentation complète — pas de stubs TODO.

Chemins

OutilEntrée
Preflightnpm run preflight -- --root <project>
Buildernpm run builder -- <project>
File suivantenpm run queue -- --root <project> --next
Paquetnpm run packet -- --root <project> --next
Verrouillagenpm run lock -- --root <project> --build-file <abs>...
Vérificationnpm run verify -- --root <project> [--stack <id>] [--only <unit>]
Recherche de déclaration`npm run lookup-decl -- --stack --name --file
Lintnpm run lint -- <file.isl.md>

Skills associés