Skip to main content
Glama
README.md
# Enma Daio — moteur de classement et de conseil de destination (MCP)

Enma Daio apprend l'organisation de vos dossiers, mémorise des règles de
classement validées, et propose une destination pour chaque contenu. Il s'expose
en **serveur MCP stdio** (n'importe quel harnais compatible MCP : Claude Code,
Codex, OpenCode, Cursor…) et en **interface web locale**.

**Mode conseil** : Enma propose, le harnais exécute l'écriture. Enma ne crée ni
n'écrit aucun fichier de contenu. Ce n'est **pas** un garde-fou de sécurité : un
harnais disposant d'un shell peut écrire sans passer par Enma.

## Fonctionnalités

- **Scan + index** (`Mister Popo`) : parcourt l'arborescence, indexe les chemins
  (borné : 120 000 entrées, profondeur 8, 16 Mio/fichier, budget 600 s).
- **Apprentissage** : déduit des règles candidates depuis l'index (dossier à forte
  concentration d'un type → destination proposée), seuil 50 fichiers, types
  binaires et dossiers massifs exclus.
- **Résolution** : chaîne de priorité `instruction ponctuelle > règle projet >
  gabarit > héritage`, avec consultation de l'index en secours.
- **Serveur MCP stdio** : 4 outils (`resoudre_destination`, `memoriser_regle`,
  `lister_regles`, `proposer_regle`).
- **Interface web locale** (`enma web`) : état, arborescence repliable, règles
  proposées (tuile compacte), dossiers scannés (ajout/retrait), planification.
- **Planificateur** (`Karin`) : scan périodique en fond (LaunchAgent
  `com.enmadaio.karin`), fréquence réglable.

## Installation

Aucune dépendance obligatoire (bibliothèque standard Python uniquement).
Python ≥ 3.10 requis.

```bash
pip install git+https://github.com/Edsorel75019/enma-daio   # ou : pip install .
enma install-opencode                                # pièces OpenCode (plugins, tool, permissions)
```

Deux points d'entrée : `enma` (CLI) et `enma-serve` (serveur MCP).
`enma uninstall-opencode` restaure l'état antérieur.

## Configuration

Fichier `enma-catalogue.json` (chemin via `ENMA_CATALOGUE`) :

```json
{
  "racines": ["/Volumes/ULYSSE/Atelier"],
  "zones_interdites": ["/Volumes/ULYSSE/Atelier/secrets"],
  "zones_confirmation": ["…/commun/decisions", "…/commun/etat"],
  "exclusions_noms": ["node_modules", "__pycache__", ".git", ".venv", "caches", ".local", "cache"]
}
```

- **racines** : dossiers à observer. **zones_interdites** : jamais lues/scannées/
  cibles. **zones_confirmation** : proposées avec confirmation. **exclusions_noms** :
  dossiers techniques ignorés partout.

Variables d'environnement : `ENMA_CATALOGUE`, `ENMA_STORE` (règles),
`ENMA_INDEX` (index), `ENMA_REJETS` (candidats rejetés).

## Branchement MCP

Exemple OpenCode (`opencode.json`, section `mcp`) :

```json
{
  "mcp": {
    "enma": {
      "type": "local",
      "command": ["/Users/sorel/Library/Python/3.14/bin/enma-serve"],
      "environment": {
        "ENMA_CATALOGUE": "…/Enma_Daio/enma-catalogue.json",
        "ENMA_STORE": "…/Enma_Daio/enma-regles.json",
        "ENMA_INDEX": "…/Enma_Daio/enma-scan-index.json"
      },
      "enabled": true
    }
  }
}
```

Claude Code (`mcpServers`) et Codex (`[mcp_servers.enma]`) déclarent le même
serveur stdio.

## Convention de vocabulaire (inscrite dans Atelier/AGENTS.md)

« solliciter Enma Daio », « demander à Enma Daio », « réveiller Enma Daio »,
« solliciter le portier » = appeler l'outil MCP `resoudre_destination`.

## Utilisation en ligne de commande

```bash
enma scan       # observer les racines (Mister Popo)
enma web        # interface web locale (Enma Daio)
enma resoudre --projet atlas --type-contenu compte-rendu
enma memoriser --projet atlas --type-contenu compte-rendu --destination projets/atlas/rapports/
enma lister
```

## Interface web

`enma web` ouvre `http://127.0.0.1:PORT`. Le serveur n'écoute **que 127.0.0.1**,
avec un jeton local (mutations refusées sans lui). Sections : présentation
(Enma Daio, Mister Popo, Karin), mode d'emploi, état, dossiers scannés
(ajout via panneau natif, retrait), règles proposées (tuile compacte + filtre +
pagination), arborescence repliable, règles mémorisées.

## Tests

```bash
python3 tests/run.py    # 42 tests, stdlib uniquement
```

## Limites

- Mode conseil, pas de confinement OS.
- Ne connaît pas le contenu des fichiers (seulement l'arborescence et les règles).
- Pas de publication GitHub (décision Sorel : test local d'abord).

## Documentation

- [MODE-EMPLOI.md](MODE-EMPLOI.md) — usage quotidien.
- [NOTICE-FONCTIONNEMENT.md](NOTICE-FONCTIONNEMENT.md) — architecture et protocole.
- [PASSATION.md](PASSATION.md) — état complet et reprise du projet.
- [ENMA-DAIO-TECHNIQUE.md](ENMA-DAIO-TECHNIQUE.md) — fiche technique façon GitHub.

## Licence

MIT.

TDQS

B3.3/5.0

Scored across 4 tools

Disambiguation5/5

Each tool serves a distinct function: resolving a destination, memorizing/modifying rules, listing rules, and proposing new rules based on observations. There is no overlap or ambiguity between them.

Naming Consistency5/5

All tool names follow a consistent pattern of infinitive verb + underscore + noun in French (e.g., resoudre_destination, memoriser_regle). The style is uniform and predictable.

Tool Count5/5

With 4 tools, the set is well-scoped for a rule-based classification system. Each tool addresses a core need (resolution, rule management, listing, and suggestion) without unnecessary bloat.

Completeness3/5

The main workflows are covered (resolve, create/update, list, propose), but there is no delete operation for rules. This is a notable gap that could hinder rule maintenance, though agents might work around it by modifying rules instead.

Maintenance

ActivityMaintained
ResponsivenessNo issues