Le fichier qui décrit tout un projet capy : son nom, comment joindre le serveur (local, wifi ou internet), le chiffrement, et les fichiers du projet. Le serveur et le client le lisent avec capy.project(), et la commande cy lance ses scripts et ses fichiers, comme npm avec package.json.
Le serveur écoute sur le port 2388 ; le client appelle 127.0.0.1:2388. Pour qu'un autre ordi joigne le serveur, mets l'IP du serveur dans url (ex : "192.168.1.42:2388") dans le fichier du client.
Le serveur se connecte au relais sous le nom maison ; le client l'appelle par ce nom, depuis n'importe où. Toujours chiffré : "tls": false est refusé. Voir le guide de capy.network pour installer le relais.
Avec $CAPY_KEY, la vraie clé n'est jamais dans le fichier : tu peux mettre le projet sur GitHub ou l'envoyer à quelqu'un. Il lui suffira de mettre sa propre clé dans son ~/.zshrc.
Comme les scripts de package.json chez npm : tu donnes un nom à une commande du terminal, et cy NOM la lance, depuis le dossier du projet, où que tu sois.
> python3 -m unittest discover -s tests
....
Ran 4 tests in 0.012s
OK
La commande passe par le shell : &&, |, > et les $VARIABLES marchent comme dans le terminal.
python3 (ou python) au début est remplacé par le Python qui lance capy : pas de surprise entre deux Python installés.
cy au début ("start": "cy run") lance capy avec ce même Python, même si cy n'est pas dans le PATH.
Les arguments en plus sont ajoutés à la fin : cy test -k login lance … discover -s tests -k login.
Le script reçoit les infos du projet en variables d'environnement : CAPY_NAME, CAPY_MODE, CAPY_PROJECT (le dossier), et en mode local CAPY_HOST et CAPY_PORT.
Le code de sortie du script devient celui de cy : un script qui échoue fait échouer la commande.
cy scripts les liste. Dans le code : app.scripts et app.run_script("test").
💡Enchaîner des scripts
Un script peut en lancer d'autres : "check": "cy format && cy test".
🪤Des noms réservés
init, new, run, scripts et help sont des commandes de capy : un script ne peut pas s'appeler comme ça (capy le dit au chargement). Et si un script et un fichier de files ont le même nom, c'est le script qui gagne.
dans le dossier du script lancé (pas celui du terminal) ;
puis dans les dossiers au-dessus, jusqu'à la racine (comme git).
Un client/client.py ou un outils/admin.py trouvent donc le fichier du projet. cy, lui, part du dossier du terminal. Pour un autre fichier : capy.project("autre.json") ou capy.project("~/projets/jeu").
import capy
app = capy.project()
app.name, app.version, app.author, app.description # Les infos du projet
app.mode, app.host, app.port, app.tls # Comment le joindre
app.folder # Le dossier du projet
app.file("server") # Le chemin d'un fichier de "files"print(app.describe()) # Tout, en texte (comme cy)
server = app.server() # Côté serveur : déjà réglé
reponse = app.call("hello", nom="Izac") # Côté client : sans IP ni port
capy vérifie tout le fichier au chargement et dit quoi corriger :
Dans le fichier
Le message
"prot": 4000
clé 'prot' inconnue dans capy.config.json (tu voulais dire 'port' ?)
"port": "abc"
'port' doit être un nombre dans capy.config.json (reçu 'abc')
"tls": "peut-etre"
'tls' doit être true ou false dans capy.config.json (reçu 'peut-etre')
"url": "http://127.0.0.1"
capy ne parle pas HTTP, écris juste l'adresse dans capy.config.json (ex : '127.0.0.1')
"url": "127.0.0.1:9999" et "port": 2388
deux ports différents dans capy.config.json ('127.0.0.1:9999' et "port": 2388)
"host" et "url" ensemble
mets "host" ou "url" dans capy.config.json, pas les deux
mode local sans port
il manque "port" dans capy.config.json (ex : "port": 4000)
mode network sans relais
il manque "relay" dans capy.config.json (ex : "relay": "mon-vps.fr:3879")
"key": "$CAPY_KEY" sans la variable
la variable d'environnement CAPY_KEY n'existe pas (ajoute export CAPY_KEY='...' dans ~/.zshrc)
une virgule en trop
capy.config.json n'est pas du JSON valide (…)
🪤Le JSON n'accepte pas tout
Pas de virgule après le dernier élément, des guillemets doubles partout ("port", pas 'port'), et pas de commentaires. Avec le schéma (juste en dessous), VS Code souligne ces erreurs en rouge.
Ajoute la ligne "$schema" en haut du fichier : VS Code propose alors les clés, explique chacune au survol, et souligne les erreurs (mauvais mode, port en texte bizarre, clé inconnue…) pendant que tu écris.
**cy est la commande d'un projet capy : elle s'installe avec capy, et ne marche que dans un projet** (un dossier qui a un capy.config.json, ou un de ses sous-dossiers). Pour créer un projet, c'est capy new ou capy init.
📌cy, capy et python3 -m capy
cy sert dans un projet ; capy sert partout (créer un projet, capy domo, capy relay) et sait aussi tout ce que fait cy. Si une commande n'est pas trouvée (« command not found »), c'est que le dossier des commandes de pip n'est pas dans ton PATH : python3 -m capy … fait exactement la même chose que capy ….
Commande
Ce qu'elle fait
cy
montre le projet : nom, version, mode, adresse, fichiers (✓ s'ils existent)
capy new NOM [mode]
crée un dossier NOM avec capy.config.json, server.py, client.py
capy init [nom] [mode]
crée juste capy.config.json dans le dossier actuel
cy server / client / NOM
lance ce fichier de files (les arguments en plus lui sont passés)
cy run
serveur en fond + client, puis arrête le serveur
cy NOM [args…]
lance le script NOM de scripts (avant un fichier du même nom)
cy scripts
liste les scripts
cy call ACTION [nom=valeur…]
appelle une action du serveur du projet (local, wifi ou relais, selon le fichier)
capy cli / cy cli
le mode interactif : les commandes à la suite, avec historique et complétion (Tab)
capy version
la version de capy
capy call HÔTE:PORT ACTION [nom=valeur…]
appelle une action de n'importe quel serveur capy (--no-tls s'il est en clair)
capy wifi scan / capy wifi call NOM ACTION …
les serveurs du wifi : les lister, en appeler un
capy network call NOM ACTION … [--relay …] [--key …]
$ cy
mon-jeu v1.0 par Izac
Un petit jeu en réseau
mode local (127.0.0.1:2388)
tls oui (chiffré)
server server.py ✓
client client.py ✓
admin outils/admin.py ✗ introuvable
script start cy run
script test python3 -m unittest discover -s tests
fichier /Users/izac/projets/mon-jeu/capy.config.json
Exemples
Un projet complet : capy.config.json
On décrit le projet une fois (nom, version, port, adresse, chiffrement, fichiers…) ; serveur et client le lisent avec capy.project(), et cy lance ses scripts et ses fichiers (comme npm).
1. Créer le projet (modes : local, wifi ou network), puis tout lancer d'un coup
creer_le_projet.sh
capy new mon-jeu
cd mon-jeu
cy # Voir ce que capy a compris
# mon-jeu v1.0
# mode local (localhost:4000)
# tls oui (chiffré)
# server server.py ✓
# client client.py ✓
cy run # Serveur en fond + client, puis arrêt du serveur
# server │ API en écoute sur le port 4000, chiffrée (TLS) · empreinte : …
# Bonjour toi !
cy server # Ou chacun dans son terminal
cy client
2. Le serveur : pas de port écrit dans le code, il vient du fichier
serveur.py
import capy
app = capy.project() # Lit capy.config.json (à côté du script, ou dans un dossier au-dessus)
server = app.server() # capy.Server, capy.wifi.Server ou capy.network.Server selon "mode"@server.action("hello")
defhello(nom="monde"):
return {"message": f"Bonjour {nom} !"}
server.run()
3. Le client : pas d'IP, pas de port, pas de relais
capy.domo à distance : la maison devient un serveur capy
Sur l'ordi qui reste à la maison. Avec un capy.config.json, c'est son mode (local, wifi ou network) qui est utilisé : avec "relay", la maison est pilotable depuis tout internet. Sans, un serveur capy sur le port 4040.
Ailleurs : la télécommande, avec le même capy.config.json
telecommande.py
import capy.domo
maison = capy.domo.Remote() # Lit capy.config.jsonprint(maison.list()["devices"]) # Ce qu'il y a à la maison
maison["salon"].color("orange") # Mêmes méthodes qu'en local
maison.scene("film")
maison["tout"].off()