Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Conception de la CLI — lexique et options

Objectif : un lexique qu’un nouvel utilisateur comprend sans glossaire, et des options qui corrigent ce qui manquait toujours aux utilisateurs de repo/west.

Lexique (canonique depuis la v0.1)

TermeSignificationRemplace / rejeté
repoun dépôt Git dans l’espace de travail ([repo.NAME])brick (alias accepté), project (jargon de l’outil repo)
stackune composition nommée de dépôts ([stack.NAME], repos = [...])product (alias accepté)
overlaysurcharges nommées par dépôt appliquées au moment du verrouillageprofile, variant
changesetune fonctionnalité répartie sur N dépôts (branche + PR/MR)topic, issue
groupétiquette libre sur un dépôt, utilisée pour filtrer les commandesconservé de l’outil repo, désormais réellement câblé
revce que vous demandez : branche, tag ou SHA — le type est détecté automatiquementrevision, refspec
lock / pinSHA résolu dans haw.lockfreeze (renommage prévu : haw pin / haw unpin)
driftHEAD diffère du SHA verrouillé

Les anciennes orthographes (brick, product, bricks, --product, --bricks) sont interprétées indéfiniment comme des alias ; la sérialisation et la documentation n’utilisent que les nouveaux termes.

Verbes (commandes)

Règle : un verbe devinable par action, proche de git, sans jargon. Les anciens noms sont conservés comme alias masqués pour que rien ne casse.

VerbeFaitAlias (accepté)
haw init <path>amorcer un espace de travail à partir d’un manifeste
haw syncmatérialiser l’arborescence selon haw.lock (écrit le lockfile s’il est absent)
haw treeafficher l’arborescence stack → dépôtgraph
haw statusétat de la flotte : branche, head, modifications, dérive par dépôtst
haw run '<cmd>'exécuter une commande dans chaque dépôt, en parallèle (positionnel)forall (with -c)
haw lockrésoudre la rev de chaque dépôt → SHA dans haw.lock
haw pinépingler haw.lock sur les checkouts actuels (sans réseau)freeze
haw unpinrestaurer haw.lock sur les revs du manifesteunfreeze
haw switch <stack>enregistrer une stack comme courante et la synchroniser
haw repo add|remove|listmodifier les dépôts du manifestebrick
haw stack add|remove|listmodifier les stacks du manifesteproduct
haw change start|status|listworkflow de fonctionnalité inter-dépôts (changeset)
haw grep <pat>diffuser un grep sur chaque dépôt
haw verifybarrière de dérive — code de sortie 3 si l’arborescence diverge de haw.lock
haw buildexécuter la commande build du manifeste de chaque dépôt sur toute la flotte
haw testexécuter la commande test du manifeste de chaque dépôt sur toute la flotte
haw hooks installinstaller les hooks de cycle de vie depuis .haw/hooks/
haw evidenceregrouper SBOM / provenance / signatures dans haw-evidence.tar.gz
haw publish <files> --to <registry>téléverser des artefacts vers un registre privé (voir DISTRIBUTION.md)
haw import --from <west.yml|default.xml>convertir un manifeste west / Google-repo en haw.toml
haw merge plan|resolve|status|cleanup|abortfusion collaborative parallèle (par tranche)
haw completions <shell>afficher un script de complétion shell sur stdout
haw plugins new|list|installgénérer, découvrir et installer des plugins haw-<name>
haw (no args) / haw dashouvrir le cockpit TUItui

haw run prend la commande en argument positionnel (haw run 'git fetch') ; -c/--command fonctionne toujours via l’alias forall. Lancer haw sans sous-commande ouvre le tableau de bord (comme htop, k9s).

Gestion des revs (conviviale par défaut)

  • Un seul champ : rev = "main" | "v6.1.2" | "<40-hex sha>". Pas de clé type = ; le type est détecté (refs/heads > tag pelé > tag > SHA complet).
  • Affichage : les SHA sont affichés sur 8 caractères partout ; haw.lock stocke les 40 complets.
  • Jamais détaché : les revs de branche sont extraites sur une branche du même nom, les tags/SHA sur haw/<rev>.

Groupes (implémentés)

  • groups = ["firmware", "ci"] sur un dépôt.
  • haw sync --group firmware, haw status --group ci, haw forall --group firmware -c ... (répétable ; filtre vide = tout ; un filtre exclut les dépôts sans groupe).
  • Les groupes sont enregistrés dans haw.lock afin que le filtrage fonctionne hors ligne.

Grille des options

OptionCommandesRemarque
--stack <S>sync, treealias --product ; défaut : dernier switch, sinon la seule stack
--overlay <O>lock, sync*, treerépétable, le dernier l’emporte ; *sync uniquement lors de la génération du lockfile
--group <G>sync, status, runrépétable
--repos a,bchange startalias --bricks
--slug <S>repo addchemin du dépôt sous --remote (alias --repo) ; avec --remote, pas --url
-j, --jobs <N>sync, switch, rundéfaut min(cœurs, 8)
--recurse-submodulessynccloner/mettre à jour les sous-modules git de chaque dépôt, épinglés au superprojet
--skip-branchchange startadopter les branches actuelles (RepoFleet)
--branch <B>change startdéfaut change/<id>

Raccourcis clavier de la TUI

style k9s/lazygit, priorité au clavier. Trois mécanismes portent tout :

  • les chiffres 17 changent de vue (depuis n’importe quelle vue liste de premier niveau),
  • a ouvre les actions contextuelles de la vue courante (un menu de style lazygit),
  • : est la barre de commande pour le reste — ses verbes reflètent la CLI (apprenez-en un, connaissez les deux).

Les données se chargent sur un worker en arrière-plan — l’interface ne se bloque jamais. La grille de la flotte se rafraîchit automatiquement toutes les ~5 s au repos (jamais pendant que vous saisissez, dans un overlay, une confirmation, ou lorsqu’une tâche est en cours) ; F5 / ctrl-r rafraîchissent à la demande.

Global (figé — ces touches signifient la même chose dans chaque vue)

ToucheAction
/ or k/jdéplacer le curseur (dans un détail : faire défiler d’une ligne)
enterexplorer en détail (stack → flotte → détail dépôt/PR/CI) · confirmer une invite y/n
esc / b / effacer un filtre actif, sinon revenir d’un niveau
qquitter · ctrl-c forcer la sortie
/filtrer la grille en flou (en direct, insensible à la casse : /knlkernel)
:barre de commande (reflète les verbes de la CLI, voir ci-dessous)
?overlay d’aide
F5 / ctrl-rrafraîchir maintenant
ctrl-d / ctrl-udemi-page bas / haut · PageUp / PageDown page entière
ggoto — quitter et afficher le chemin du dépôt sous le curseur (cd "$(haw dash)")
wbasculer le mode veille — rafraîchir automatiquement la flotte et la vue PR/CI ouverte
spacemarquer / démarquer le dépôt sous le curseur (Fleet et Changeset uniquement ; affiché sous forme de )

Sauts de vue (17) — depuis n’importe quelle vue liste

ToucheVuealias :
1flotte:fleet
2changesets:changesets
3PR/MR:prs
4exécutions CI:ci
5arbre:tree
6gouvernance:governance
7plugins:plugins

Les chiffres sont inertes dans les vues de défilement/détail (détail dépôt/PR/CI, fichiers, grep) — sautez depuis une liste. Le tri (</>/.) s’applique aux tables Fleet, PR/MR et CI.

Vue Fleet

ToucheAction
ssync — les dépôts marqués s’il y en a, sinon le dépôt sous le curseur, sinon la stack
spacemarquer / démarquer le dépôt sous le curseur (affiché sous forme de )
rexécuter une commande — sur les dépôts marqués s’il y en a, sinon sur toute la flotte
pfiltre problèmes uniquement (⚠ modifié / dérive / en retard / manquant)
xouvrir un shell dans le dépôt sous le curseur (quitte le cockpit)
fparcourir les fichiers du dépôt sous le curseur (disque local ou forge)
!exécuter une commande shell dans le dépôt sous le curseur (dans sa vue détail)
enterexplorer le détail git du dépôt sous le curseur (branche, SHA, statut, log, diffstat, remotes)

Le changement de stack, le lock et le git-fetch sont passés dans la barre de commande : :stack (sélecteur) / :stack NAME, :lock, :fetch. L’épinglage du lockfile se fait avec p dans la vue Stacks (ou :pin).

Les marques persistent entre les vues Fleet et Changeset ; lorsque des marques sont posées, s (sync) et r/:run n’agissent que sur l’ensemble marqué.

Vue PR/MR de la flotte (3) et vue CI (4)

ToucheAction
enterexplorer en détail — PR/MR : relecteurs, vérifications, corps, url · exécution CI : jobs, étapes, conclusion
amenu d’actions — PR/MR : m fusionner · a approuver · c checkout (chacune demande y/n)
dlire le diff de la PR/MR (défilable)
llire les logs de l’exécution/pipeline CI (défilables)
fparcourir les fichiers modifiés de la PR/MR (vue fichiers-PR)
oouvrir la ligne sous le curseur dans votre navigateur
< > .trier la table
b / escretour

a (actions) et d sont également disponibles depuis le détail d’une PR/MR. Le rechargement se fait désormais simplement avec F5 / ctrl-r.

Vue Fichiers (f depuis un dépôt)

Un navigateur en lecture seule : visualisez ou sélectionnez un fichier à n’importe quelle ref, sur le disque local ou la forge (GitHub / GitLab / Bitbucket). Il n’indexe/ne committe jamais — il ne fait que lire. Deux modes partagent le même contexte dépôt / ref / portée et basculent avec T : une liste plate d’un seul répertoire (par défaut) et un arbre navigable et extensible.

ToucheAction
enterouvrir un répertoire, ou afficher le contenu d’un fichier (défilable)
Tbasculer vers la vue arbre (et revenir)
rsélecteur de ref — lire les fichiers À LA DATE d’une branche / tag / SHA choisi
eéditer le fichier sous le curseur dans $EDITOR (fichiers locaux uniquement)
Rbasculer entre l’arbre du disque local et la vue forge
b / escremonter d’un répertoire, puis revenir à la flotte
xouvrir un shell dans le dépôt

Vue Arbre (T depuis Fichiers)

ToucheAction
enter / déplier le répertoire (ou ouvrir le fichier) sous le curseur
replier le répertoire (ou sauter à son parent et le replier)
rsélecteur de ref (identique à Fichiers)
Trevenir à la liste plate
Rbasculer local ⇄ forge
b / escrevenir à la flotte

L’arbre récupère une fois tous les chemins de fichiers du dépôt à la ref active, puis se déplie/replie côté client. Les répertoires repliés affichent , dépliés ; les fichiers sont indentés sous leurs parents.

Sélecteur de ref (r dans l’un ou l’autre mode)

r ouvre une fenêtre listant les branches puis les tags du dépôt (j/k + enter pour choisir), plus une ligne de saisie pour taper une ref arbitraire ou un SHA de commit. Sélectionner une ref recharge la vue courante À LA DATE de cette ref (la liste plate se réenracine à la racine du dépôt ; l’arbre récupère à nouveau ses chemins). Le titre du panneau affiche honnêtement la ref active : @ main, @ v1.0.0, @ a1b2c3d, ou @ HEAD (local) / @ default (distant) lorsqu’aucune n’est épinglée. Les refs locales proviennent de git for-each-ref / git ls-tree / git show <ref>:<path> ; les refs et arbres de la forge proviennent de l’API REST de chaque forge.

e suspend le cockpit, confie le TTY courant à $VISUAL/$EDITOR (avec repli sur nvim/vim/vi) sur le chemin absolu du fichier, puis reprend et recharge la liste. Il est refusé sur la vue forge (R) et sur les répertoires ; si le dépôt n’est pas sur le disque, il propose de synchroniser.

Vue Erreurs, vue Plugins, vue Gouvernance

Accédez-y depuis une vue liste (Erreurs via :errors/:err, Plugins via 7/:plugins, Gouvernance via 6/:governance). Dans Gouvernance, o ouvre l’artefact du plugin sous le curseur (SBOM / provenance / …). Le rechargement se fait avec F5 / ctrl-r ; b / esc reviennent en arrière.

Vue Changeset

ToucheAction
nnouveau changeset
spacesélectionner / désélectionner un dépôt
amenu d’actions — r demander des PR/MR liées entre elles (sélectionnées, ou toutes si aucune) · l intégrer dans l’ordre des dépendances (chacune demande y/n)
galler au dépôt sous le curseur

Menu d’actions (a)

a ouvre une fenêtre actions encadrée listant les actions contextuelles de la vue courante, chacune avec sa sous-touche. Appuyer sur une sous-touche listée déclenche cette action — les actions d’écriture conservent leur barrière de confirmation y/n. esc (ou toute touche non listée) annule. Les vues sans action le signalent.

Barre de commande (:)

Les verbes reflètent la CLI, et la ligne d’état affiche la commande exacte que chacun exécute, de sorte que la TUI sert aussi à découvrir la CLI.

CommandeAction
:stackouvrir le sélecteur de changement de stack (alias :stacks)
:stack NAME / :switch NAMEbasculer vers une stack
:lockcommitter le lockfile (résoudre les revs → SHA)
:fetchgit fetch sur le dépôt sous le curseur
:errors / :errvue erreurs — échecs collectés sur toute la flotte
:fleet / :changesets / :treesauts de vue (identique à 1 / 2 / 5)
:prs / :civues PR/MR / CI à l’échelle de la flotte (identique à 3 / 4)
:governance / :pluginsvue gouvernance / plugins (identique à 6 / 7)
:syncsynchroniser la stack courante
:run CMDexécuter une commande (sur les dépôts marqués dans Fleet, sinon sur la flotte)
:build / :test / :verifybuild / test / vérification de dérive sur la flotte
:pin / :locképingler les HEAD / committer le lockfile
:change [ID | start ID | land ID | request ID]workflow de changeset
:merge [cleanup <repo> | abort <repo>]lister / sceller / abandonner les fusions en cours
:grep <pat>diffuser un grep sur chaque dépôt
:sh CMDexécuter une commande shell dans le dépôt sous le curseur
:problemsbasculer le filtre problèmes uniquement (⚠ modifié/dérive/en retard/manquant)
:watchbasculer le rafraîchissement automatique en veille (identique à w)
:<repo>déplacer le curseur de la flotte vers un dépôt dont le nom correspond
:theme [NAME]changer de thème en direct (sans argument, ouvre le sélecteur de thèmes ; le thème choisi est persisté)
:editor [CMD]définir l’éditeur de la touche e (sans argument, ouvre un sélecteur des éditeurs du PATH ; persiste)
:compactbasculer l’en-tête replié sur une ligne (persiste)
:helpoverlay d’aide

Thèmes / skins

Sept habillages intégrés : classic, catppuccin (par défaut), dracula, nord, gruvbox, solarized, monochrome. classic est un habillage neutre en ANSI 16 couleurs qui se lit aussi bien sur les terminaux clairs que sombres. :theme sans argument ouvre un sélecteur interactif (mettant en évidence l’habillage actif) ; appuyer sur enter applique l’habillage en direct et le persiste dans [ui].theme de la configuration. :theme <name> change (et persiste) toujours directement.

Configuration utilisateur — ~/.config/haw/config.toml

Optionnel. Un fichier absent, une table partielle ou une clé inconnue retombent tous sur des valeurs par défaut raisonnables (le cockpit n’échoue jamais en cas d’absence). HAW_CONFIG remplace le chemin.

[ui]
theme = "classic"        # startup theme (a built-in name)
editor = "nvim"          # editor for the `e` key
compact_header = false   # start with the header collapsed
refresh_secs = 5         # idle auto-refresh cadence (clamped 2–60)

[keys]                   # remap a SAFE subset of action keys (single chars)
sync = "s"               # remappable: sync, goto, run, shell, files, problems, watch
goto = "g"

Priorité :

  • Thème : NO_COLOR (non vide) → monochrome ; sinon HAW_THEME (env) s’il nomme un thème intégré ; sinon [ui].theme ; sinon le catppuccin par défaut.
  • Éditeur : $VISUAL$EDITOR (l’env l’emporte toujours) → [ui].editor → le premier de nvim/vim/vi sur le PATHvi.

Raccourcis personnalisés ([keys])

Chaque entrée associe un nom d’action à un unique caractère de touche. Seul un sous-ensemble sûr est remappable — sync, goto, run, shell, files, problems, watch. Les globales gelées (j, k, :, /, ?, q, b, space, g, w, et les sauts de vue par chiffres 17) ne peuvent jamais être la cible d’un remap ; un remap qui vise une globale, duplique un autre remap, entre en collision avec une touche d’action par défaut ou n’est pas un unique caractère est ignoré avec un avertissement au démarrage. Quand un remap est actif, les indices de l’en-tête montrent la touche active pour rester honnêtes. La touche par défaut d’origine continue de fonctionner aussi (un remap ajoute, ne retire jamais).

Livré depuis la rédaction de cette conception

  • haw pin / haw unpin (alias freeze/unfreeze).
  • --label <L> sur change start, transmis aux PR/MR lors de change request.
  • clé forge = "github" | "gitlab" sur [remote.X] pour les hôtes que l’heuristique d’URL ne détecte pas.
  • deps = [...] sur un dépôt — change land fusionne dans un ordre topologique stable.
  • haw verify, haw sync --locked, --format json sur status/tree, code de sortie 3 en cas de dérive.
  • haw build / haw test (commandes par dépôt dans le manifeste), hooks de cycle de vie dans .haw/hooks/, haw hooks install, haw evidence, plugins haw-<name>.
  • Nuance de lexique : --slug sur repo add accepte --repo comme alias ; haw run prend la commande en argument positionnel (forall -c fonctionne toujours).
  • Dans la TUI, g (goto) quitte et affiche le chemin du dépôt — cd "$(haw dash)" — au lieu de lancer un shell imbriqué.
  • TUI : rafraîchissement automatique en direct au repos (~5 s), filtre flou / (nucleo), tri par colonne (</>/.), marques + s/r en lot, détails pour les dépôts/PR/exécutions CI, le menu d’actions a (fusionner / approuver / checkout dans PR/MR ; demander-PR / intégrer dans Changeset), la vue gouvernance à l’échelle de la flotte (6), le navigateur de fichiers (f) avec un arbre navigable (T), un sélecteur de ref (r) et l’édition locale (e), et sept thèmes dont classic (HAW_THEME, NO_COLOR, :theme en direct avec un sélecteur interactif).
  • Fichier de configuration de la TUI ~/.config/haw/config.toml : [ui] thème de démarrage / éditeur / compact_header / refresh_secs, plus [keys] raccourcis personnalisés pour un sous-ensemble sûr de touches d’action. Les sélecteurs interactifs :theme / :editor persistent un choix ; :compact bascule l’en-tête replié.

Prévu (pas encore implémenté)

  • Commodités liées aux tags : haw lock --as-of <tag> ; haw status indiquant le type de rev (branch/tag/sha).
  • haw auth login — flux OAuth par appareil + trousseau du système d’exploitation (voir ARCHITECTURE DR-14).
  • TUI : prise en charge de la souris.