Aller au contenu

Référence scripting

Verbes CLI, sélecteurs, méthodes JSON-RPC, frames d'événements, clés de configuration, specs workspace, specs flow, outils MCP, hooks et codes de sortie pour l'automatisation Paneflow.

Cette page est la référence compacte de Scripting et automatisation. Elle nomme la surface publique qu'un script humain ou un LLM peut citer exactement.

Verbes CLI

Le binaire paneflow intercepte ces verbes et quitte avant le démarrage de la GUI. Les verbes inconnus sortent avec le code d'usage 2 au lieu de lancer l'application silencieusement.

VerbeMéthode principale ou moteurÉcrit dans les panneaux ?Usage
ls [--human]surface.listNonListe les panneaux de l'espace de travail actif
read <target>surface.readNonLit le scrollback d'un panneau
search <target> <pattern>surface.searchNonRecherche dans le scrollback d'un panneau
ps [--json]fleet.listNonListe les agents détectés dans les espaces de travail
status <target> [--json]surface.statusNonLit l'état agent d'un panneau
newworkspace.createNonCrée un espace de travail
select <index>workspace.selectNonSélectionne un espace de travail
split <h|v>surface.splitNonDivise un panneau
focus <target>surface.focusNonFocalise un panneau et son espace de travail
send <target> <text>surface.send_textGatePrépare ou soumet du texte
key <target> <keystroke>surface.send_keystrokeGateEnvoie une touche non soumettante
wait --match <sel>surface.read, events.subscribeNonBloque jusqu'à une regex, l'idle ou les deux
watch [--surface <sel>] [--type <event>]events.subscribeNonStreame les événements de cycle de vie et de surface
up <file>Moteur de spec workspacePréremplissage uniquementCrée un espace de travail déclaratif
flow run <file>Moteur flowGate pour les étapes qui soumettentLance un DAG multi-agent local

Alias acceptés par le CLI : list_panes mappe vers ls, read_pane vers read et search_pane vers search.

Sélecteurs

SélecteurExempleNotes
Id numériquepaneflow read 42Matche exactement surface_id
Nompaneflow status backendMeilleur sélecteur pour des scripts durables
cmdline:<substr>paneflow read cmdline:viteargv foreground complet sur Linux, nom d'exécutable sur macOS et Windows
cwd:<path>paneflow read cwd:/home/me/apiMatche le répertoire de travail du panneau

Un sélecteur qui ne matche rien ou plusieurs panneaux sort avec le code 3, sauf pour les commandes qui acceptent explicitement plusieurs matches comme send --broadcast, wait --any et wait --all.

Codes de sortie

CodeSens
0Succès
1Échec runtime : instance inaccessible, panneau fermé, gate refusé ou erreur handler
2Erreur d'usage CLI
3Cible introuvable ou ambiguë
4Timeout de wait ou timeout de ready flow

Gates d'écriture

La lecture est autorisée par défaut. Les écritures sont séparées par capacité :

OpérationGate
send sans --submitPANEFLOW_IPC_SCRIPTING=1 ou ai_unrestricted
send --submitPANEFLOW_IPC_SCRIPTING=1 ou ai_unrestricted
keyPANEFLOW_IPC_SCRIPTING=1
Étape flow avec submit = trueCapacité scripting reportée par system.capabilities

send n'ajoute pas de carriage return sauf si --submit est présent. key rejette les touches qui soumettent comme enter, ctrl-m et ctrl-j. Un seul payload surface.send_text est limité à 64 KiB.

Clés de configuration pertinentes :

CléDéfautSens
ai_unrestrictedfalseAutorise une automatisation IA de confiance à soumettre du texte sans gate d'environnement
ai_injection_fencetrueEnveloppe le texte surface.read dans une enveloppe terminal non fiable
submit_paste_delay_ms70Délai de base entre bracketed paste et le carriage return de soumission
terminal.envaucunVariables d'environnement injectées dans les nouveaux terminaux

Champs de lecture

paneflow read <target> --json et surface.read brut retournent :

ChampSens
textTexte du scrollback, fenced par défaut
linesNombre de lignes retournées
total_linesNombre total de lignes retenues
eofIndique si la lecture a atteint la ligne retenue la plus ancienne
output_generationCompteur monotone avancé par la sortie du panneau

Défauts et limites : lines vaut 200 par défaut et est clampé entre 1 et 4000. offset part de la fin du buffer. Un offset hors limites est une erreur invalid-params.

Le paramètre JSON-RPC fenced utilise ai_injection_fence par défaut. Le flag CLI --raw passe fenced: false.

Champs d'état agent

paneflow ps --json retourne {"agents":[...]}. paneflow status <target> --json retourne un objet de statut.

ChampSens
pidId de processus agent, quand connu
toolFamille d'agent comme claude, codex, opencode ou gemini
statethinking, waiting_for_input, finished, errored, stalled, idle ou unknown_running
hookedIndique si les événements de hook de cycle de vie sont attachés
reasonRaison de détection, dont no_hook
surface_idId de panneau
surface_nameNom de panneau
workspaceIndex d'espace de travail
active_tool_nameOutil en cours dans l'agent
messagePrompt ou permission en attente
last_resultRésumé du dernier tour, quand disponible
waiting_msTemps passé à attendre une entrée
idle_msTemps depuis la dernière activité observée
output_generationCompteur de sortie du panneau, sur status

Une flotte vide est {"agents":[]} avec le code de sortie 0. Un panneau sans agent suivi retourne l'état idle, pas une erreur.

Spec workspace

paneflow up <file> lit une spec workspace TOML.

Champ top-levelTypeDéfautNotes
namestring"Workspace"Titre de l'espace de travail
layoutstring"even_h"even_h, even_v, main_vertical ou tiled
port_baseinteger3000Base pour l'allocation ${port_offset}
[[panes]]arrayrequisUne entrée par panneau
Champ de panneauTypeDéfautNotes
cwdstringaucunDoit exister après expansion et canonicalization
agentstringaucunNom de launcher agent, mutuellement exclusif avec command
commandstringaucunCommande brute, mutuellement exclusive avec agent
promptstringaucunPrérempli dans l'entrée d'un agent, jamais soumis par up
focusboolfalseDonne le focus initial à ce panneau
envtableaucunFusionné par-dessus terminal.env, supporte ${port_offset}
namestringaucunNom de sélecteur stable
worktreestringaucunNom de branche pour un worktree géré sous <repo>.worktrees/
copy_envbooltrueCopie les fichiers .env* gitignored dans le worktree
setupstringaucunCommande lancée avant le démarrage
setup_timeout_secsinteger300Timeout de setup
worktree_teardownstring"auto"auto supprime les worktrees propres à la fermeture, keep les conserve

${port_offset} ne se substitue que dans les valeurs env. Les clés inconnues sont des erreurs. La création d'espace de travail valide les chemins avant de créer les panneaux.

Spec flow

paneflow flow run <file> lit une spec flow TOML et l'exécute contre l'instance Paneflow courante.

ChampTypeNotes
idstringId d'étape requis et unique
needsarrayDépendances ; sur foreach, attend toutes les instances
foreacharrayFan-out, une instance par item
paneinline tableSpawn un panneau avec les champs de panneau workspace
sendinline table{ target, text, submit? }, exige une dépendance
readytable{ pattern, timeout_secs? }, barrière regex
capturetable{ var, lines }, capture 1 à 500 lignes après ready
submitboolSoumet un prompt de panneau spawné, exige un accès scripting

Variables :

VariablePortée
${item}Étapes foreach : cwd, name, worktree, env, send.target, ready.pattern, prompts et textes
${var}Valeurs capturées dans send.text et pane.prompt soumis
${var.<item>}Captures d'un groupe foreach

Le runner valide les clés inconnues, dépendances manquantes, cycles de dépendances, regex invalides, captures indéfinies, budget de panneaux et timeouts manquants avant exécution. Ctrl-C arrête la boucle d'orchestration ; les panneaux créés restent dans Paneflow.

Connexion JSON-RPC

PropriétéValeur
Endpoint Linux$XDG_RUNTIME_DIR/paneflow/paneflow.sock
Endpoint macOSRépertoire runtime utilisateur, même nom de socket Paneflow
Endpoint Windows\\.\pipe\paneflow
FramingJSON-RPC 2.0 délimité par lignes
Modèle de requêteUne requête par connexion, sauf events.subscribe
Confiance localeMême utilisateur uniquement ; pas de listener réseau, pas de token, pas de TLS
BackpressureCap de connexions et files d'événements bornées retournent des erreurs structurées ou des frames dropped

Sondez les capacités au runtime :

bash
printf '%s\n' '{"jsonrpc":"2.0","method":"system.capabilities","params":{},"id":1}' \
| nc -U "$PANEFLOW_SOCKET_PATH"

Méthodes JSON-RPC

MéthodeParamsRetour ou notes
system.ping-Check de vivacité
system.capabilities-{scripting, methods[]}
system.identify-{name, version, protocol}
workspace.list-Espaces de travail avec indexes et titres
workspace.current-Espace de travail actif
workspace.createname?, cwd?, layout?Crée un espace de travail
workspace.selectindexChange d'espace de travail
workspace.closeindex?Ferme un espace de travail
workspace.upname, layout, panes[]Spawn déclaratif utilisé par up et les racines flow
workspace.restore_layoutlayoutApplique un arbre layout
surface.list-{surfaces:[{surface_id,name,title,cwd,cmd,workspace}]}
surface.readsurface_id, lines?, offset?, fenced?Scrollback et output_generation
surface.searchsurface_id, pattern, max_matches?Matches substring case-insensitive
surface.renamesurface_id, nameRenomme ou efface le nom d'un panneau
surface.focussurface_idFocalise le panneau et l'espace de travail
surface.statussurface_idÉtat agent pour un panneau
surface.send_textsurface_id, text, submit?, paste?Écriture PTY gate
surface.send_keystrokesurface_id, keystrokeTouche non soumettante gate par env
surface.splitdirection, surface_id?, cwd?, command?, prompt?, env?, name?, managed_worktree?Divise un panneau
fleet.list-Snapshot read-only de la flotte
events.subscribesurfaces?, types?Stream d'événements persistant délimité par lignes
ai.session_startpayload hookTélémétrie de cycle de vie
ai.prompt_submitpayload hookTélémétrie de cycle de vie
ai.tool_usepayload hookTélémétrie de cycle de vie
ai.notificationpayload hookTélémétrie de cycle de vie
ai.stoppayload hookTélémétrie de cycle de vie
ai.exitpayload hookTélémétrie de cycle de vie
ai.session_endpayload hookTélémétrie de cycle de vie

Les échecs structurés utilisent des enveloppes JSON-RPC error : -32602 invalid params, -32601 méthode gate, -32001 permission et -32000 backpressure. Certaines erreurs de validation legacy arrivent encore comme {"error":"..."} dans result ; les clients doivent traiter les deux formes comme des échecs.

Événements

paneflow watch et events.subscribe brut émettent du JSON délimité par lignes. La première frame accuse réception de l'abonnement.

Type d'événementSens
subscribedAbonnement confirmé
ai.session_startLa session agent démarre
ai.prompt_submitUn prompt est soumis
ai.tool_useL'agent reporte l'usage d'un outil
ai.notificationL'agent demande une entrée ou une permission
ai.stopLe tour agent s'arrête
ai.exitLe processus agent sort
ai.session_endLa session agent se ferme
surface_changedLe output_generation du panneau a avancé
heartbeatKeepalive idle
droppedLe subscriber a pris du retard et des événements ont été supprimés

Après une frame dropped, resynchronisez avec paneflow ps --json ou paneflow status <target> --json.

Pont MCP

paneflow-mcp est un serveur MCP stdio read-only au-dessus du même socket Paneflow.

OutilParamsRetour
list_panes-Panneaux avec surface_id, name, title, cwd, cmd, workspace
read_panetarget, lines?, offset?Texte de scrollback
search_panetarget, pattern, max_matches?Lignes correspondantes

Il n'a aucun outil pour taper, soumettre, focaliser ou diviser des panneaux. La sortie terminal retournée est fenced comme donnée non fiable.

Hooks de cycle de vie

paneflow-ai-hook lit le JSON d'événement sur stdin, poste une frame JSON-RPC ai.*, puis sort avec 0 afin qu'une instance Paneflow arrêtée ne casse pas l'agent. Cette surface de hook alimente le statut, les notifications, ps, status et watch.

paneflow hooks setup persistant est limité à Claude Code. Codex utilise des hooks de shim par lancement. Les agents sans surface de hook fonctionnent quand même, mais leur état peut être limité à la détection de processus.

Liens associés