Commandes et palette
Palette, raccourci, menu, barre d'outils, console et script convergent tous vers K.commands.execute(). La zone et la capacité y sont vérifiées une fois pour toutes, ce qui laisse un seul fichier à relire pour savoir ce qui peut s'exécuter et sous quelles conditions.
Objet commande
| Champ | Type | Description |
|---|---|---|
| id | string | Requis. Une commande sans identifiant lève. |
| title | {fr, en} ou clé | Résolu par K.resolveTitle(). |
| handler | function | (args, context). Synchrone ou promesse. Absent si declarative. |
| category | string | Regroupement dans la palette et le panneau Actions. |
| capability | string | Capacité requise. Le cœur en est exempt. |
| zone | string | 'local' réserve la commande au mode développeur. |
| when | function | Reçoit le service de contexte. Une exception vaut false. |
| keybinding | string | Combinaison suggérée. La liaison effective vit dans une table séparée. |
| quickAccess | bool | Proposée dans la section d'accès rapide. |
| declarative | bool | Déclarée par manifeste, handler absent jusqu'à l'activation. |
Clés de contexte
Le magasin de contexte est un reflet de l'état courant contre lequel s'évaluent les prédicats. Il est ouvert : n'importe quelle vue peut poser une clé par K.context.set(), et les prédicats peuvent la lire.
| Clé posée par le noyau | Valeur |
|---|---|
| kernel.zone | distribution ou local. |
| shell.ready | Booléen. Posée par shell-dock.js quand les docks sont montés. |
Séquence de dispatch
| # | Contrôle | Rejet |
|---|---|---|
| 1 | Résolution de l'identifiant. | Commande inconnue: <id> |
| 2 | Zone. | Commande réservée à la zone locale |
| 3 | Capacité, sauf pour le cœur. | Capacité refusée: <cap> |
| 4 | Prédicat when. | Commande indisponible dans ce contexte |
| 5 | Réveil de la source, si dormante. | L'erreur d'activation est propagée. |
| 6 | Présence du handler après activation. | Commande sans gestionnaire après activation |
| 7 | command.before, handler, command.after. | Tout échec émet command.error et rejette. |
Le réveil vient avant la résolution du handler : une commande déclarée par manifeste n'a pas encore de handler, c'est l'activation de sa source qui l'installe.
Lister ce qui est disponible
Surcharger une commande
K.commands.override(id, wrapper) enveloppe une commande sans toucher à l'original. La libération du jeton restaure exactement l'état antérieur. C'est le motif retenu pour les extensions du CRM, et la primitive sur laquelle reposent les personnalisations qui doivent survivre à une mise à jour du cœur.
La palette
Ctrl + Shift + P → core.palette.open
La palette appelle K.commands.list() à chaque ouverture : elle n'affiche donc que les commandes disponibles dans le contexte courant, avec leur catégorie et leur raccourci. Une commande apportée par un plugin chargé en cours de session y figure sans redémarrage.
Figure 1 : Palette de commandes, filtrée à la frappe.
Pourquoi une commande est absente
| Cause | Vérification |
|---|---|
| Zone local hors mode développeur. | K.get('command', id).zone |
| Capacité non accordée à la source. | K.get('command', id).capability, puis le fournisseur de capacités. |
| Prédicat when faux. | K.context.all(), puis relire le prédicat. |
| Source non inscrite. | K.get('command', id) rend null. |
Journal des actions
Le panneau Journal s'alimente sur command.before, command.after et command.error, ainsi que sur les lignes écrites par K.log(). Il capte également la console.