Skip to main content

Magicbox

dk — orchestrateur d'environnement de développement pour les services et archétypes DigitalKin.

Magicbox pilote Docker Compose à partir d'un profil YAML par scénario de dev. Une seule CLI (dk), un profil décrit ce que vous voulez faire tourner (front, services, infra, archétypes, kins) et comment (version distante, clone git, ou dépôt local), et Magicbox génère les composes, résout l'environnement, alloue les ports et démarre la stack — le tout stocké hors du repo, dans le dossier de config standard de votre OS.

PyPI Python License: MIT


Sommaire


Installation

Magicbox est un outil en ligne de commande : installez-le dans un environnement isolé avec uv ou pipx pour exposer la commande dk globalement (sans polluer votre Python système).

uv tool install magicbox-dk      # recommandé (uv)
# ou
pipx install magicbox-dk         # équivalent pipx

La CLI expose deux entrypoints équivalents : dk (court) et digitalkin. Python ≥ 3.10 requis, et un démon Docker avec le plugin Compose v2 en état de marche (dk doctor vérifie tout ça).

Mettre à jour ou désinstaller :

uv tool upgrade magicbox-dk      # ou: pipx upgrade magicbox-dk
uv tool uninstall magicbox-dk    # ou: pipx uninstall magicbox-dk

Tester sans installer globalement : uvx --from magicbox-dk dk --help. Installer une pré-release (.devN) : uv tool install "magicbox-dk==X.Y.Z.devN" (ou pipx install --pip-args=--pre magicbox-dk).

Complétion shell

dk --install-completion zsh      # ou bash ; puis ouvrir un nouveau terminal

Les noms avec espaces s'insèrent entre quotes ('ADA & SDK - Litmus'), la casse est ignorée, les aides sont alignées, et les services / clones proposés suivent le profil visé sur la ligne (-p, --id, profil positionnel). Complétion installée avec une version antérieure : relancez dk --install-completion zsh pour que le premier TAB d'un nouveau terminal complète (sinon il ne fait rien, les suivants marchent).

Depuis les sources (dev)

Le projet est géré avec uv :

uv sync                 # résout les dépendances depuis uv.lock
uv pip install -e .     # expose l'entrypoint `dk` en mode éditable

Démarrage rapide

dk init                  # bootstrap : structure utilisateur + profil « Default »
dk edit                  # édite le profil (menus interactifs)
dk prepare               # clone les remotes, génère les composes, écrit network.yml
dk start                 # régénère les <entry>.env (live) + docker compose up -d
dk status                # état des conteneurs, section par section
dk stop                  # docker compose stop (conteneurs conservés) + supprime les .env

Sans sous-commande, dk affiche le tableau de bord (profil actif, liste des profils, commandes clés).


Commandes

Le nom de profil est toujours optionnel : sans lui, la commande cible le profil actif (dk status dev cible ponctuellement dev). Quelques alias silencieux existent (up/run → start, down → stop, rm → delete, ls → list, info → show, ps → status, exec → shell, db → data, sync → pull, env → environnement, creds → credentials).

Cycle de vie

Commande Rôle
dk init Bootstrap : crée <config_root>/profiles, settings.yaml, un profil par défaut. Idempotent.
dk create [name] Crée un nouveau profil à partir du template profile.base.yaml.
dk delete <name> Supprime un profil, ses ressources Docker et son dossier, définitivement.
dk prepare [profile] Valide le YAML, clone les remotes, alloue les ports, génère les composes, écrit network.yml, seed la DB locale, build les images. -s/--service cible.
dk build [profile] L'étape build de prepare, seule (incrémental ; -s/--service, --force).
dk start [profile] Régénère les <entry>.env (live) + docker compose up -d + attend les healthchecks.
dk stop [profile] docker compose stop (conteneurs conservés) + supprime les .env. --remove = down. --all arrête toutes les stacks.
dk reboot [profile] Redémarre toute la magicbox du profil : stop puis start.
dk restart [service...] Recrée un ou plusieurs conteneurs précis (menu multi-sélection si vide). --rebuild/-b, --no-cache.
dk clean [profile] Tear-down Docker + purge images / clones / composes. --all pour tous, --env inclut le dossier env, --db la DB locale.
dk prune [profile] Vide les données de la DB SurrealDB locale (schéma conservé).
dk switch <name> Change le profil actif.

Édition

Commande Rôle
dk edit [profile] Éditeur interactif du profil (menus navigables) : front, back, infra, Core, archétypes, tools.
dk settings Édite les settings globaux (env globales, credentials, start, logs, dépôts, ports, timeouts, docker).
dk environnement Raccourci vers l'éditeur des variables d'env globales (globals.yaml).
dk credentials Édite les credentials infra partagés (SurrealDB logins / S3 accounts).
dk export [profile] Exporte un profil en .dkprofile portable (globales et credentials référencés inclus).
dk import <file> Recrée un profil depuis un .dkprofile.

Inspection & utilitaires

Commande Rôle
dk dashboard Tableau de bord : profil actif, liste des profils, commandes clés (défaut).
dk list Liste les profils avec marqueurs d'état. Supporte --json.
dk show [profile] Vue compacte de la config d'un profil. Supporte --json.
dk status État des conteneurs, section par section.
dk stats [profile] Versions et état technique du profil (paquets des modules, divergences, images, DB, ressources). --all, --quick, --json.
dk logs [service] Visualiseur de logs interactif (recherche, filtres, reload à chaud, --since), heures à l'heure locale.
dk shell [service] Ouvre un shell dans un conteneur du profil actif (/bin/bash, sinon /bin/sh).
dk data [profile] Gestion interactive du contenu de la DB SurrealDB locale.
dk pull [name...] git pull --ff-only sur les clones du profil actif (-p pour un autre profil).
dk validate [profile] Valide le YAML (Pydantic), sans effet de bord.
dk doctor Vérifie Docker, Compose, git, le cache BuildKit, la toolchain AMP et la structure utilisateur.
dk update Met à jour le CLI depuis PyPI (--check, --changelog, --migrate).
dk migrate Convertit les profils existants après un changement de schéma.
dk mcp Serveur MCP pour Claude Code (cf. Claude Code (MCP)).
dk --version Affiche la version de Magicbox.

Toutes les commandes (sauf init et doctor) s'arrêtent si la structure utilisateur n'existe pas — un message invite à lancer dk init.

Ajoutez -d (ou --debug) à n'importe quelle commande pour voir les étapes internes et les commandes docker/git exécutées (secrets masqués).


Organisation des fichiers (config_root)

Tout l'état côté utilisateur vit dans le dossier de config standard de l'OS :

OS config_root
macOS ~/Library/Application Support/digitalkin/
Linux ~/.config/digitalkin/
Windows %APPDATA%\digitalkin\
<config_root>/
├── profiles/<profile_id>/     ← un dossier par profil (profile_id = id court 6 hex)
│   ├── profile.yaml           ← la spec du profil (source de vérité)
│   ├── composes/              ← overrides docker-compose générés par `dk prepare` (+ état du build incrémental)
│   ├── env/                   ← env par entrée : <entry>.yml (source) + <entry>.env (aplati)
│   ├── repos/                 ← clones git du profil (un dossier par entrée git)
│   └── network.yml            ← host/port/url résolus de chaque service (généré par `dk prepare`)
├── cache/                     ← temporaire : fichiers de `dk mcp`, paquets sondés par image (`dk stats`)
├── settings.yaml              ← settings core (profil actif, ports, timeouts, docker, start)
├── globals.yaml               ← variables d'env globales, partagées entre profils
└── credentials.yaml           ← credentials infra partagés (surrealdb_logins + s3_accounts)

Points clés :

  • Les clones vivent dans chaque profil (<profile>/repos/) — deux profils qui pointent le même dépôt ne se partagent pas un clone potentiellement checkout sur des refs incompatibles. Supprimer un profil emporte ses clones.
  • L'env par entrée est scindé en deux fichiers :
    • <profile>/env/<entry>.yml — source de vérité, éditée via dk edit → Edit env. Catégorisée (secret / connection / other) + un bloc network: en lecture seule reflétant les adresses des autres services.
    • <profile>/env/<entry>.env — artefact transitoire régénéré par dk start (merge source + template + network.yml + globals + credentials + résolution Jinja), consommé comme env_file: par Compose, supprimé par dk stop.
  • Conséquence pratique : tout changement dans dk settings / dk edit est pris en compte au prochain dk start, sans re-lancer dk prepare.
  • dk clean purge composes/, repos/ et les .env aplatis ; il préserve les sources .yml (les secrets saisis survivent à un clean → prepare). Seuls dk clean --env ou dk delete suppriment tout le dossier env/.

Aucun secret irremplaçable ne vit ici : c'est de la config régénérable. Un rm -rf <config_root> suivi de dk init repart de zéro proprement.


Le profil

Un profil déclare un bloc méta (profile: — nom, description) puis les clés racine : frontend, back, infra, sdk, amp, archetypes, tools, kins. Voir profile.example.yaml pour un exemple complet.

Mode unifié — remote / git / dev

Chaque élément exécutable (frontend Horizon, back, archétypes, tools) porte un seul mode :

  • remote — utilise une version en prod / managée ; seul endpoint est requis (référence à une variable de connexion globale).
  • git — clone le dépôt et le build/run en local ; ref (branche). L'url est éditable pour les archétypes/tools ; pour les services et Horizon, le dépôt est prédéfini.
  • dev — version locale ; path (chemin vers le dépôt local).

Les entrées d'infra (redis, rabbitmq, surrealdb, s3) utilisent local / remote : local lance le conteneur préfabriqué, remote résout son adresse depuis settings.env.connection.<endpoint> (ou depuis le login / compte pour SurrealDB et S3). Le back est un monorepo : une source partagée, puis une app par conteneur (api, grpc-stream-worker, node-service-provider), chacune local ou remote.

Frontend, back et infra sont toujours actifs — c'est le mode qui décide local vs externe. Archetypes, tools et kins portent un enabled (désactivé : ni cloné, ni buildé, ni lancé).

Exemple

profile:
  name: Default
  description: Profil full-local (sauf DB)

frontend:
  type: horizon           # interface web (mode remote/git/dev)
  mode: git

back:
  mode: dev
  path: ~/dev/digitalkin/back
  surrealdb_login: Back Local
  s3_account: Local
  services:
    api: { mode: local }
    grpc-stream-worker: { mode: local }
    node-service-provider: { mode: remote, endpoint: node-service-provider }

infra:
  redis:     { mode: local }
  rabbitmq:  { mode: local }
  surrealdb: { mode: local }
  s3:        { mode: remote, endpoint: s3 }

sdk: { source: auto }     # Core partagé par tous les modules : auto / git / dev
amp: { source: auto }

archetypes:
  Template:
    mode: git
    url: git@github.com:DigitalKin-ai/template-archetype.git
    ref: dev
    module_id: modules:template

tools: {}
kins: {}

La validation est stricte (extra: forbid) — toute clé inconnue fait échouer dk prepare / dk validate. La façon recommandée d'éditer un profil reste dk edit.


Settings, globals & credentials

Trois fichiers, chargés ensemble en un seul modèle Pydantic Settings, réécrits par dk settings :

  • settings.yaml — settings core, éditables via dk settings :
    • Start — attach (est-ce que dk start suit les logs par défaut).
    • Logs — champs affichés par dk logs.
    • Dépôts — catalogues des dépôts git des archetypes / tools, dépôts prédéfinis du back et d'Horizon.
    • Ports — port hôte du front Horizon (frontend_host, défaut 5173) + plage d'allocation des archétypes (archetype_pool_start/_end, défaut 50050-50070).
    • Timeouts — poll/timeout des healthchecks, limite de restart, passes de résolution Jinja, timeout fetch git (les délais des commandes git / docker se règlent dans settings.yaml, section timeouts).
    • Docker — volume des certificats, fuseau des conteneurs (timezone) : auto (défaut) = celui de votre machine, UTC = comme la prod, ou un nom IANA (Europe/Paris). Pris en compte au prochain dk start pour l'infra, après dk prepare pour les modules, le back et Horizon. Les clés container_prefix / project_prefix d'un ancien settings.yaml sont ignorées (les noms Docker restent magicbox-<id du profil>).
  • globals.yaml — le bloc d'env globales (settings.env) : secret / connection / id / other partagés entre profils, consommables depuis n'importe quelle entrée via {{ globals.NOM }}. Éditable via dk environnement.
  • credentials.yaml — credentials infra partagés (surrealdb_logins + s3_accounts), référencés par les services par leur nom de profil. Éditable via dk credentials.

Les défauts sont codés en dur : les fichiers YAML n'ont besoin que de surcharger ce qui diffère.


Multi-profils

dk create dev            # crée un profil « dev » depuis le template
dk edit dev              # personnalise-le
dk prepare dev
dk switch dev            # en fait le profil actif

Surcharger le profil actif pour une seule commande : dk status dev, dk start dev, etc.


Claude Code (MCP)

dk mcp est un serveur MCP (stdio) : Claude Code pilote la magicbox comme un développeur, et parle aux kins comme un utilisateur du front. À brancher une fois :

claude mcp add magicbox --scope user -- dk mcp

(dk mcp lancé à la main dans un terminal affiche cette commande avec le chemin absolu de dk, utile si Claude Code ne voit pas le PATH du shell.)

Outils Rôle
profiles, profile, switch_profile, validate Profils ; profile donne aussi code : où modifier chaque entrée (dossier dev monté en direct, clone git géré).
prepare, build, start, stop, restart, reboot, pull Les commandes dk, sans terminal, en tâches de fond relevées par job (job_cancel = Ctrl+C).
config_set Édite le profil par chemins (archetypes/Ada/mode, back/ref, sdk/source…) et les variables d'un env/<entrée>.yml (valeur, lien de globale, défaut). Tout est validé avant d'écrire ; dry_run montre le diff.
status, logs État des conteneurs (JSON) ; logs de tous les conteneurs en une timeline, filtres niveau / regex, follow_s + until pour attendre un événement.
inspect, env, stats Diagnostic d'un conteneur (santé et journal des health-checks, code de sortie, OOM, montages, date de l'image) ; variables d'env avec leur origine et leur écart avec le dernier start (secrets masqués) ; CPU / mémoire.
versions Fiche dk stats en JSON compact : versions réellement chargées (SDK, AMP, paquets), divergences entre modules, sources git, images, base locale.
exec, reload, db_query, api_request Commande dans un conteneur (background pour les longues) ; reload à chaud des modules en dev ; SurrealQL sur la base locale ; appel authentifié à un endpoint de l'api locale.
kins, kin_missions, kin_send, kin_read, kin_files Conversations avec les kins via l'api locale (/v2/chat/stream, AG-UI) : texte, appels d'outils, erreurs ; kin_send joint des fichiers de tout type comme le trombone du chat ; kin_files liste et télécharge les fichiers d'une conversation.
  • Durée : un appel rend la main en moins de 50 s (l'app desktop coupe vers 60 s) ; une opération plus longue continue en fond (job, kin_read).
  • Une magicbox en cours n'est jamais arrêtée d'office : prepare / start / reboot refusent tant qu'une stack tourne, sauf stop_running: true — que Claude ne doit passer qu'avec votre accord.
  • Chat avec un kin : il faut la stack démarrée, l'app api en local et le /me/context collé au dk prepare. Magicbox crée alors une session Clerk de test pour cet utilisateur avec la CLERK_SECRET_KEY de l'api — possible uniquement sur une instance Clerk de développement (sk_test_…) ; l'id de session est gardé dans <profil>/.mcp-clerk-session.json, les tokens restent en mémoire.
  • Secrets : aucune sortie ne montre un secret de la magicbox. Toute réponse passe par un filtre qui remplace les valeurs connues (globales, credentials, variables sensibles des env/ et .env de tous les profils) et tout ce qui a l'allure d'un secret (CLE=… sensible, "apiKey": "…", Bearer …, JWT, sk_…, mot de passe d'URL) par ***. Limite : un secret transformé par une commande (exec … | base64) n'est pas reconnu. Le filtre ne couvre que le MCP : les outils de fichiers de Claude Code lisent toujours <config_root> si vous les y autorisez.
  • Fichiers des kins : kin_files télécharge dans un dossier temporaire (<config_root>/cache/mcp-files/), supprimé à la fin de la session dk mcp (et nettoyé au démarrage suivant si elle a été tuée).
  • config_set modifie votre profil : Claude doit vous annoncer ce qu'il change. Il refuse d'écrire pendant qu'un dk edit est ouvert sur ce profil (sa sauvegarde écraserait les changements).
  • Restent à vous, dans votre terminal : dk delete / clean / prune, et les réglages partagés entre profils (dk settings : globales, credentials). Les sorties rendues à Claude sont bornées ; le journal complet de chaque tâche est dans <config_root>/logs/mcp/.

Auth git

Magicbox délègue l'authentification au système : configurez votre credential helper (osxkeychain, gh, clé SSH dans ~/.ssh/config, …) avant de lancer dk prepare. Les URLs des profils ne contiennent jamais de secret.


Versioning & release

Le versionnage suit PEP 440 : major.minor.patch avec un pré-release .devN optionnel, piloté par bump-my-version (config dans .bumpversion.toml). Chaque bump met à jour pyproject.toml et uv.lock, puis commit + tag automatiquement (commit = true, tag = true).

Le binaire Homebrew de bump-my-version peut être cassé (interpréteur Python obsolète) — préfixe les commandes par uv run pour utiliser celui du venv.

Règle d'or : un .devN est toujours un pré-release de la prochaine version pas encore sortie (0.0.2.dev1 < 0.0.2). La base major.minor.patch ne fait que monter — on ne colle jamais un .dev sur une version déjà publiée.

Les cas

Cas Commande Exemple
Ouvrir un cycle dev (depuis une finale) bump patch | minor | major 0.0.1 → 0.0.2.dev1
Itérer en dev bump dev 0.0.2.dev1 → 0.0.2.dev2
Passer d'une dev à la release (finaliser) bump --new-version X.Y.Z 0.0.2.dev2 → 0.0.2

bump dev depuis une finale échoue (value 0 is lower than the first value 1) : c'est voulu (first_value = 1). Depuis une finale, on ouvre le cycle avec patch/minor/major, jamais dev. Et « finaliser » (retirer le .dev) se fait avec --new-version, car un compteur .dev ne peut pas redescendre à 0 tout seul.

Procédure complète (pour chaque version)

# 1. bump : édite pyproject.toml + uv.lock, commit + tag automatiques
uv run bump-my-version bump patch          # 0.0.1 → 0.0.2.dev1

# 2. pousse le commit ET son tag
git push --follow-tags origin main

# 3. crée la GitHub Release → déclenche la publication (.github/workflows/release.yml)
gh release create v0.0.2.dev1 --prerelease --generate-notes   # --prerelease pour un .dev

Exemple d'un cycle complet 0.0.1 → 0.0.2 :

uv run bump-my-version bump patch            # 0.0.1 → 0.0.2.dev1
git push --follow-tags origin main
gh release create v0.0.2.dev1 --prerelease --generate-notes

uv run bump-my-version bump dev              # 0.0.2.dev1 → 0.0.2.dev2
git push --follow-tags origin main
gh release create v0.0.2.dev2 --prerelease --generate-notes

uv run bump-my-version bump --new-version 0.0.2   # finalise : 0.0.2.dev2 → 0.0.2
git push --follow-tags origin main
gh release create v0.0.2 --generate-notes    # release finale (sans --prerelease)

bump-my-version show-bump affiche à tout moment les transitions possibles depuis la version courante.


Dépannage

Symptôme Remède
Dépendances / structure KO dk doctor — diagnostique Docker, Compose, git et la structure utilisateur.
Profil corrompu dk delete <profil> puis dk create.
Clones pollués dk clean <profil> puis dk prepare.
Reset complet rm -rf <config_root> puis dk init (aucun secret irremplaçable n'y vit).
Comprendre ce qui se passe Ajouter -d / --debug : étapes internes + commandes docker/git échoées.
Build BuildKit EOF (Colima) Souvent un OOM de la VM Colima — augmenter sa RAM.

License

MIT — © DigitalKin.

Metadata

Release files for magicbox-dk 1.15.2

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for magicbox-dk 1.15.2
File Size Uploaded Provenance
magicbox_dk-1.15.2.tar.gz 1.1 MB With provenance Details

Built distribution (wheel)

Table of built distributions (wheels) for magicbox-dk 1.15.2
File Interpreter ABI Platform
magicbox_dk-1.15.2-py3-none-any.whl Python 3 none any Details

Total release size: 1.8 MB

Release files / magicbox_dk-1.15.2.tar.gz

Download URL magicbox_dk-1.15.2.tar.gz
Size 1.1 MB
Tags Source
SHA-256 checksum
How to use checksums
197aa1942cfa1595db8ef7fc52110ea931191e0b811b9b42b8e65ad6ac42932c
BLAKE2b-256 checksum
How to use checksums
66cc3115f3b9fbe18c1d5a21beebc5dbaca70f3861d0f7ea75d76936c2b0451c
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 21, 2026.

Transparency log

Release files / magicbox_dk-1.15.2-py3-none-any.whl

Download URL magicbox_dk-1.15.2-py3-none-any.whl
Size 703.0 kB
Tags Python 3
SHA-256 checksum
How to use checksums
09d51b8113e2aeca28fda4b2542e60c331d1debfbf8a2572b27cd76ef2f2e541
BLAKE2b-256 checksum
How to use checksums
830884c141c1b5f094b4e39112fa415d275bdd19c13d75f71a231e9304a952a8
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 21, 2026.

Transparency log

Security for magicbox-dk 1.15.2

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

Full provenance

All 2 files in this release have been uploaded with provenance metadata.

Select from 2 files

Attestation for magicbox_dk-1.15.2.tar.gz

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 21, 2026.

Transparency log

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Release history Release notifications | RSS feed

This release

1.15.2 This release

2 release files Full provenance

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page