Le manifeste (module.toml)

Le fichier module.toml à la racine décrit votre module au core : identité, processus, port, routes, entrées de barre latérale et événements.

Exemple complet #

[module]
id           = "calendar"        # alphanumérique + '-' + '_'
display_name = "Calendar"
version      = "0.1.0"
description  = "Calendriers, événements, CalDAV…"
author       = "Kubuno Contributors"
license      = "AGPL-3.0"
homepage_url = "https://github.com/kubuno/kubuno"  # optionnel
runtime      = "rust"             # rust | python | node | binary
dependencies = []                  # ids d'autres modules requis
internal     = false               # true : module d'infrastructure, masqué de l'administration
settings_path = "/calendar/settings"  # optionnel

[process]
entrypoint = "kubuno-calendar"     # nom de l'exécutable
args       = []

[server]
host = "127.0.0.1"
port = 3102                        # port dédié du module (le core est sur 8080)

[routes]
patterns = [
    { method = "*", path = "/*" },
]

[[sidebar_items]]
id       = "calendar"
label    = "Calendar"
icon     = "Calendar"             # nom d'icône Lucide
path     = "/calendar"
position = 20                      # ordre de tri
section  = "main"                  # main | secondary

[events]
subscribed = ["UserDeleted", "ContactUpdated"]
publishes  = ["EventCreated", "EventUpdated", "EventDeleted"]

# Réglages rendus par la console d'administration du core — donc cherchables,
# héritables et journalisés dans l'audit, ce qu'une page maison n'obtient pas.
[[setting_groups]]
id       = "access"
label    = "Accès et restrictions"
icon     = "ShieldCheck"
position = 30

[[settings]]
key     = "allow_downloads"
scope   = "global"                 # global | overridable | user
group   = "access"
type    = "bool"                   # bool | int | string | enum
default = true
label   = "Téléchargement des fichiers"
description = "Désactivé, la lecture reste entière ; seul le fichier d'origine est refusé."

Les sections #

SectionRôle
[module]Identité : id, display_name, version, runtime, licence.
[process]Exécutable lancé par le superviseur du core (entrypoint + args).
[server]host et port sur lesquels le module écoute en local.
[routes]Motifs de routes que le core proxifiera vers le module.
[[sidebar_items]]Entrées de la barre latérale (icône Lucide, position, section).
[events]Événements subscribed (reçus) et publishes (émis).
[[setting_groups]]Regroupe les réglages en sections de la console d'administration (id, label, icône, position).
[[settings]]Réglages déclarés : scope (global, overridable par unité organisationnelle, ou user), type, valeur par défaut et libellés.
Note

Déclarer un réglage plutôt que d'écrire votre propre page le rend cherchable dans la console, héritable par unité organisationnelle et traçable dans le journal d'audit — trois choses qu'une vue maison n'obtient pas.

Note

Le manifeste est aussi un garde-fou de compatibilité : la version est confrontée à celle attendue par le core, et côté frontend le module déclare son sdkVersion.