Débutant
🧠 Fondamentaux
10 XP
0 personnes ont réussi
CLI basique avec Click
Tu demarres un projet ambitieux : construire ton propre Mini Claude Code. Un assistant IA en ligne de commande qui peut lire tes fichiers, ecrire du code, l'executer et corriger ses erreurs. Le genre d'outil que tu utilises peut-etre deja au quotidien, et que tu vas comprendre de l'interieur en le reconstruisant brique par brique.
Premiere etape : creer le squelette du CLI. Avant de parler a un LLM, avant de lire des fichiers, il faut que ton programme sache recevoir une commande de l'utilisateur et y reagir. C'est la fondation de tout.
En Python, le standard pour creer des CLI professionnels s'appelle Click. C'est la librairie utilisee par Flask, Celery, et des centaines d'outils de production. Elle remplace avantageusement argparse (trop verbeux) et sys.argv (trop primitif).
Pour l'installer :
pip install click rich
Click fonctionne avec des decorateurs. Tu decores une fonction avec @click.command() et elle devient une commande CLI. Pour ajouter un argument :
Pour ce premier exercice, on ne va pas encore utiliser Click directement dans le sandbox (il faut un terminal pour ca). A la place, tu vas ecrire la fonction qui sera au coeur de ton CLI : une fonction traiter_commande(texte) qui prend le texte saisi par l'utilisateur et renvoie un dictionnaire avec la commande parsee.
La fonction doit gerer trois cas :
Si le texte commence par / c'est une commande speciale. Extrais le nom de la commande (sans le /) et les arguments eventuels. Si le texte est vide ou ne contient que des espaces, renvoie une erreur. Sinon, c'est un prompt pour le LLM.
r = traiter_commande("explique-moi les decorateurs")
assert r["type"] == "prompt", f"Un texte normal doit etre de type 'prompt', pas '{r['type']}'"
assert r["contenu"] == "explique-moi les decorateurs"
r1 = traiter_commande("")
assert r1["type"] == "erreur", "Un texte vide doit retourner une erreur"
r2 = traiter_commande(" ")
assert r2["type"] == "erreur", "Un texte avec que des espaces doit retourner une erreur"
+ 0 tests cachés
Indices (3 disponibles)
Solution officielle
def traiter_commande(texte):
texte_strip = texte.strip()
if not texte_strip:
return {"type": "erreur", "message": "Commande vide"}
if texte_strip.startswith("/"):
parties = texte_strip[1:].split()
nom = parties[0]
args = parties[1:]
return {"type": "commande", "nom": nom, "args": args}
return {"type": "prompt", "contenu": texte_strip}