MIDDLEDAO · EBIN

ebin-cli — Commandes CLI eBin — crud add/ls/rm, nash, stop/status, inspect. — docs

ebin-cli — Commandes CLI

⚠️ ROUTAGE — DEUX CLI, DEUX RÔLES (09-28, ne pas confondre)

CLIBinaireRôle
**`ebin-cli`**`130-ebin/04-app/src/bin/ebin-cli.rs`**OFFICIEL** pour l'artefact `.ebin` composite (08-ebin) : CRUD strates + seal/unseal + `--layout`. LA définition canonique s'opère ICI.
**`middledao`**binaire runtime de la forge `1000-dev-evo` (evoBin MOE)runtime de la couche source (guardian, nash, opcodes, grilles MOE). Toujours réel — voir sections ci-dessous.

Commandes guardian (runtime `middledao` — forge evoBin MOE)

middledao                    # Démarrer le daemon (guardian)
middledao status             # Vérifier si actif → ✅ ou ⚪
middledao stop               # Arrêter (SIGTERM → SIGKILL)

Commandes READ-ONLY (sûres — exposition MCP directe)

# Guardian
middledao status             # Vérifier si actif → ✅ ou ⚪

# CRUD — lecture
middledao crud ls                           # Lire les missions (grille par défaut)
middledao crud ls path/to/grid.mdao        # Lire les missions (grille spécifique)

# CRUD — align (lecture+écriture, non destructif)
middledao crud align path/to/file.mdao     # Aligner un fichier sur 128B

# Inspect — visualiser arène
middledao inspect path/to/file.mdao

Sortie inspect :

📋 guardian.grid.mdao — 1024 slots (131072B)
│   128 │ NOP    │ 0x1000000000000001 │ REQUESTED │ v=0
│   256 │ ADD    │ 0x1000000000000002 │ IDLE      │ v=1 │ 30
📊 2/1024 slots actifs
# NASH — observation
middledao nash ps               # Voir processus
middledao nash logs             # Voir logs
middledao nash inspect myapp    # Inspecter grille

Commandes MUTATRICES (validation requise avant exposition MCP)

# Guardian
middledao stop               # Arrêter (SIGTERM → SIGKILL)

# CRUD — écriture / suppression
middledao crud add NOP                                    # Ajouter mission (grille par défaut)
middledao crud add ADD 100 200
middledao crud add TETRA 100 200 300 400
middledao crud add TSC
middledao crud add LINK 0x0003 100 200 300 400
middledao crud add --seg10 0x1000000000000001 NOP
middledao crud add path/to/grid.mdao ADD 10 20           # Ajouter sur grille spécifique
middledao crud rm 0x1000000000000001                      # Supprimer par spatial_id (hex)
middledao crud chain path/to/grid.mdao "texte"            # Chaîner des chambres
middledao crud reset path/to/grid.mdao 0                  # Reset un slot

# NASH — exécution / cycle de vie
middledao nash exec myapp       # Exécuter
middledao nash add myapp kvdb   # Créer app depuis template
middledao nash up               # Démarrer guardian (launchctl/systemd)
middledao nash down             # Arrêter guardian

Opcodes disponibles

NOP, ADD, SUB, MUL, AND, OR, XOR, SHL, SHR, ROTL, ROTR, MASK, SELECT, TETRA, EQ, LT, REBASE, LINK, TSC, ITER, GLITCH, MUTATE, CRUD_ADD, GATEWAY, NASH

Doctrine API par composant (absorbée d'api-bycomposant 09-23, arbitrage user)

**La spec suit le composant, jamais l'inverse.** Un composant auto-porteur = un dossier qui contient son code, SA spec `.ebin-api` et SA config (format eBin). L'app hôte ne possède rien : elle scanne, valide et sert.

✅ FÉDÉRÉ                              ❌ CENTRALISÉ
components/<nom>/                      40-specs/
├── <nom>.rs (code ≤300l)              ├── <nom>.ebin-api   ← serveur
├── <nom>.ebin-api (SA spec)           └── ...              central
├── config (SA config, format eBin)

**Conséquences** : ① Déplaçable (migre avec sa spec/config, rien à réécrire) ② L'app ne change jamais (ajouter = déposer le dossier + 1 ligne dans la strate app) ③ Le groupe aussi est fédéré.

**Le contrat hôte (validate, pas own)** : au boot, charger chaque spec → REJET du démarrage si invalide (log `SPEC REJETÉE`, pattern spec-loader midpress) ; routing `/api/<comp>/<endpoint>` dérivé des specs ; découverte `GET /api` (arbre), `GET /api/<comp>` (spec) ; pas de copie des specs côté moteur.

**Répartition code ↔ données (3 règles)** : ① données d'abord (le param existe-t-il dans la config du composant ? effet immédiat, 0 build) ② sinon la spec (étendre, déclaratif, semver) ③ moteur en dernier recours (capacité manquante seulement, extension servant de futures données).

**eBin-cli-crud et le miniCli par composant (vision user 09-23)** : un composant (ex. sidebar midPress) porte son propre miniCli et se modifie par commande `ebin-cli-crud` ultra-simplement — le composant est manipulable sans toucher à son code. Le moteur générique vit dans la famille ebin (ce skill + ebin-crud) ; les spécialisations par app vivent dans leurs skills (midPress : `mdao-api-maker`, instance coldInference : `coldinference-serve-api`).

ebin-cli create-container <art.ebin> # conteneur 08-ebin (header EBIN)

ebin-cli create <pool.ebin> # pool headerless (rétrocompatible)

ebin-cli add <p> <id> "<texte>" # id hex 0x.. ou décimal

ebin-cli set <p> <id> "<texte>" # modifie SANS recompiler (définition canonique)

ebin-cli rm <p> <id>

ebin-cli ls <p> [--layout midpress] # lecture sémantique via descripteur

ebin-cli get <p> <id> [--layout midpress]

froid (repos) — scellement + chiffrement

ebin-cli seal <src> <dst> # Zstd seul ; + EBIN_SEAL_KEY (hex 64 env) = ChaCha20-Poly1305

ebin-cli unseal <src> <dst> # auto-détection flags ; chiffré exige EBIN_SEAL_KEY

ebin-cli migrate <file> <old> <new> # déplacer un id (SEGx : nouvel_id = old<<6 si migration legacy) ; journal audit PAR LE MOTEUR

Release / production (09-29 — cratesgit adopté officiellement, canon skills 0647227)

- Tout release eBin suit le CONTRAT : tag annoté = build = push AU MÊME commit (tag sans artefact = chaîne morte, leçon 404) + `05-addins/crateServer/releases.toml` versionné (tag/forge_sha/targets) + sha relu au disque avant tout dépôt réseau (leçon anti-self-report).

- Branche de release = `cratesgit` (bare forge `130-ebin.git`, main = production, HEAD bare doit suivre). Double-arch : `darwin-arm64` (Mac) + `linux-x86_64` (S2 natif, jamais QEMU) — URL `https://crate.middledao.com/crates/ebin-cli/<forge_sha>/<target>/binary`.

- Publication crate cargo : index sparse `crate.middledao.com` (fichier PAR PAQUET, chemin 2+2 lettres `ap/ic/apicrud`, `eb/in/ebin`), cksum = sha256 du `.crate` relu ×2, consommateur = dep hybride `apicrud = { version = "0.1.0", registry = "middledao", path = "../../120-api-crud" }` + config source locale `04-app/.cargo/config.toml` (`[source.middledao]`, JAMAIS replace-with global). Preuve du 11:45 : cargo fetch + build réels d'un consommateur jetable — cksums vérifiés PAR CARGO.

Pièges enregistrés : load mmap REFUSE un conteneur scellé (déchiffrer = réécrire clair, jamais pendant mmap) ; sans clé, `unseal` refuse honnêtement (règle 14 — pas de secret deviné) ; nonce 12b dans header reserved[32..44], flags à 12..16 (COMPRESSED=0x1, ENCRYPTED=0x2) ; descripteur de layout : `StrateLayout::from_name` refuse tout nom inconnu (presets `ebin` content@40 / `midpress` content@48) — la sémantique est DÉCLARÉE, jamais déduite ni convertie.

Mapping futur MCP (notes)

CommandeType MCPValidation
`middledao status`tool read-onlyaucune
`middledao crud ls`tool read-onlyaucune
`middledao crud align`tool read-onlyaucune (non destructif)
`middledao inspect`tool read-onlyaucune
`middledao nash ps`tool read-onlyaucune
`middledao nash logs`tool read-onlyaucune
`middledao nash inspect`tool read-onlyaucune
`middledao stop`tool mutateurconfirmation requise
`middledao crud add`tool mutateurconfirmation requise
`middledao crud rm`tool mutateurconfirmation requise
`middledao crud reset`tool mutateurconfirmation requise
`middledao crud chain`tool mutateurconfirmation requise
`middledao nash exec`tool mutateurconfirmation requise
`middledao nash add`tool mutateurconfirmation requise
`middledao nash up`tool mutateurconfirmation requise
`middledao nash down`tool mutateurconfirmation requise
opcodes (liste)resourcelecture seule