diff --git a/script/todo/dev_tools.py b/script/todo/dev_tools.py new file mode 100644 index 0000000..8d12450 --- /dev/null +++ b/script/todo/dev_tools.py @@ -0,0 +1,56 @@ +#!/usr/bin/env python3 +# © 2026 TechnoLibre (http://www.technolibre.ca) +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl) +"""Installateurs amont des outils de développement. + +Les mêmes outils se posent à DEUX endroits : sur l'hôte par le menu Shell, +et dans une VM par le déploiement QEMU. Une seule table les décrit, parce +que deux copies d'une URL dérivent dès que l'amont en change une, et que la +seconde copie est celle qu'on oublie. + +Chacun est un installateur amont plutôt qu'un paquet : aucun n'est présent +dans les dépôts des quatre familles que supporte ERPLibre, et celui qui l'est +y traîne d'une version. +""" + +# Proxy CLI qui réduit la consommation de tokens des assistants. +RTK_UPSTREAM = ( + "curl -fsSL https://raw.githubusercontent.com/rtk-ai/rtk/" + "refs/heads/master/install.sh | sh" +) + +# L'installateur amont pose un binaire statique. Il sert de recours parce +# que le paquet manque d'une partie des dépôts des plateformes supportées. +STARSHIP_URL = "https://starship.rs/install/install.sh" +STARSHIP_UPSTREAM = f"curl -sS {STARSHIP_URL} | sh" + +# Sans terminal — une pose par SSH dans une VM — l'installateur demande une +# confirmation que personne ne donnera. « -y » la donne d'avance. +STARSHIP_UPSTREAM_YES = f"curl -sS {STARSHIP_URL} | sh -s -- -y" + +# Ce que chaque shell écrit pour lancer starship. La ligne va en FIN de +# fichier : starship compose le prompt et doit passer après tout ce qui y +# touche. +STARSHIP_LINE = { + "bash": 'eval "$(starship init bash)"', + "zsh": 'eval "$(starship init zsh)"', + "fish": "starship init fish | source", +} + +# Les assistants posés par un installateur amont : le nom du binaire mène +# à (commande, répertoire d'installation). Le répertoire sert à garantir +# le PATH — un binaire posé hors des chemins du shell reste introuvable. +AGENTS = { + "claude": ( + "curl -fsSL https://claude.ai/install.sh | bash", + "~/.local/bin", + ), + "opencode": ( + "curl -fsSL https://opencode.ai/install | bash", + "~/.opencode/bin", + ), +} + +# L'agent posé quand rien n'est choisi. Le premier de la table ferait +# dépendre le défaut de l'ordre d'écriture d'un dictionnaire. +AGENT_DEFAUT = "claude" diff --git a/script/todo/todo.py b/script/todo/todo.py index f3c8430..e579ad1 100755 --- a/script/todo/todo.py +++ b/script/todo/todo.py @@ -26,7 +26,7 @@ sys.path.append(new_path) from script.config import config_file from script.execute import execute -from script.todo import todo_install, todo_prefs +from script.todo import dev_tools, todo_install, todo_prefs from script.todo.database_manager import DatabaseManager from script.todo.kdbx_manager import KdbxManager from script.todo.longtest_menu import LongTestMenuMixin @@ -2711,32 +2711,12 @@ class TODO( "fish": "~/.config/fish/config.fish", } - # Ce que chaque shell écrit pour lancer starship. La ligne va en FIN de - # fichier : starship compose le prompt et doit passer après tout ce qui y - # touche. - _STARSHIP_LINE = { - "bash": 'eval "$(starship init bash)"', - "zsh": 'eval "$(starship init zsh)"', - "fish": "starship init fish | source", - } - - # L'installateur amont pose un binaire statique. Il sert de recours parce - # que le paquet manque d'une partie des dépôts des plateformes supportées. - _STARSHIP_UPSTREAM = "curl -sS https://starship.rs/install/install.sh | sh" - - # Les assistants posés par un installateur amont : le nom du binaire mène - # à (commande, répertoire d'installation). Le répertoire sert à garantir - # le PATH — un binaire posé hors des chemins du shell reste introuvable. - _UPSTREAM_TOOLS = { - "claude": ( - "curl -fsSL https://claude.ai/install.sh | bash", - "~/.local/bin", - ), - "opencode": ( - "curl -fsSL https://opencode.ai/install | bash", - "~/.opencode/bin", - ), - } + # Ces quatre tables vivent dans dev_tools : le déploiement QEMU pose les + # mêmes outils DANS une VM, et deux copies d'une URL amont dérivent dès + # que l'une change. Les noms de classe restent, ils sont l'interface. + _STARSHIP_LINE = dev_tools.STARSHIP_LINE + _STARSHIP_UPSTREAM = dev_tools.STARSHIP_UPSTREAM + _UPSTREAM_TOOLS = dev_tools.AGENTS @staticmethod def _shell_name():