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.
Sommaire
- Installation
- Démarrage rapide
- Concepts
- Commandes
- Organisation des fichiers (
config_root) - Le profil
- Settings, globals & credentials
- Multi-profils
- Auth git
- Versioning & release
- Dépannage
- License
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"(oupipx install --pip-args=--pre magicbox-dk).
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/stats → 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 logs [service] |
Visualiseur de logs interactif (recherche, filtres, reload à chaud, --since). |
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. |
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 --version |
Affiche la version de Magicbox. |
Toutes les commandes (sauf
initetdoctor) s'arrêtent si la structure utilisateur n'existe pas — un message invite à lancerdk 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`
│ ├── 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`)
├── 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 viadk edit → Edit env. Catégorisée (secret / connection / other) + un blocnetwork:en lecture seule reflétant les adresses des autres services.<profile>/env/<entry>.env— artefact transitoire régénéré pardk start(merge source + template +network.yml+ globals + credentials + résolution Jinja), consommé commeenv_file:par Compose, supprimé pardk stop.
- Conséquence pratique : tout changement dans
dk settings/dk editest pris en compte au prochaindk start, sans re-lancerdk prepare. dk cleanpurgecomposes/,repos/et les.envaplatis ; il préserve les sources.yml(les secrets saisis survivent à unclean→prepare). Seulsdk clean --envoudk deletesuppriment tout le dossierenv/.
Aucun secret irremplaçable ne vit ici : c'est de la config régénérable. Un
rm -rf <config_root>suivi dedk initrepart 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 ; seulendpointest requis (référence à une variable de connexion globale).git— clone le dépôt et le build/run en local ;ref(branche). L'urlest é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
modequi décide local vs externe. Archetypes, tools et kins portent unenabled(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 viadk settings:- Start —
attach(est-ce quedk startsuit 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éfaut5173) + plage d'allocation des archétypes (archetype_pool_start/_end, défaut50050-50070). - Timeouts — poll/timeout des healthchecks, limite de restart, passes de résolution Jinja, timeout fetch git.
- Docker — préfixes de nom conteneur/projet, montages de volumes.
- Start —
globals.yaml— le bloc d'env globales (settings.env) :secret/connection/id/otherpartagés entre profils, consommables depuis n'importe quelle entrée via{{ globals.NOM }}. Éditable viadk environnement.credentials.yaml— credentials infra partagés (surrealdb_logins+s3_accounts), référencés par les services par leur nom de profil. Éditable viadk 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.
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-versionpeut être cassé (interpréteur Python obsolète) — préfixe les commandes paruv runpour 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 devdepuis 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 avecpatch/minor/major, jamaisdev. Et « finaliser » (retirer le.dev) se fait avec--new-version, car un compteur.devne 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.12.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| magicbox_dk-1.12.0.tar.gz | 525.0 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| magicbox_dk-1.12.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 927.3 kB
Release files / magicbox_dk-1.12.0.tar.gz
| Download URL | magicbox_dk-1.12.0.tar.gz |
|---|---|
| Size | 525.0 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
f6e49254f95d9e315ea2638245a45bed14563d7c84f71428e9b4cf909dc0b2ad
|
|
BLAKE2b-256 checksum How to use checksums |
9efa31a306c875c94de0b44e33ba3cc010f43f8615b80c8a384a4edb240bdbd8
|
| 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 Sep 9, 2026.
Transparency logRelease files / magicbox_dk-1.12.0-py3-none-any.whl
| Download URL | magicbox_dk-1.12.0-py3-none-any.whl |
|---|---|
| Size | 402.4 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
8571a1f075e76d580c41def351a6ca6ac8c767b4868a0f7aefd777bd15173683
|
|
BLAKE2b-256 checksum How to use checksums |
60a9f30c3b19f1cce968c169f0961ed99d95e4fdb643385a4dfea3b226dd5a28
|
| 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 Sep 9, 2026.
Transparency log