palabre 0.1.5 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -13,10 +13,12 @@ import { formatAgentPrompt } from "./prompt.js";
13
13
  import { runNewWizard } from "./new.js";
14
14
  import { listPresetNames, resolvePreset } from "./presets.js";
15
15
  import { createConsoleRenderer } from "./renderers/console.js";
16
+ import { createNdjsonRenderer } from "./renderers/ndjson.js";
16
17
  import { runDebate } from "./orchestrator.js";
17
18
  import { writeDebateMarkdown } from "./output.js";
18
19
  import { applySourceUpdate, formatUpdateInstructions, getUpdateInfo } from "./update.js";
19
20
  import { createSessionContext } from "./session.js";
21
+ /** Point d'entrée principal du CLI Palabre. Dispatche vers la commande appropriée selon les arguments. */
20
22
  async function main() {
21
23
  const parsed = parseArgs(process.argv.slice(2));
22
24
  if (parsed.command === "version" || parsed.flags.version) {
@@ -129,12 +131,16 @@ async function main() {
129
131
  printPromptPreview(config, options);
130
132
  return;
131
133
  }
132
- const renderer = createConsoleRenderer(options.plainOutput);
134
+ const renderer = createRendererFromFlags(parsed.flags, options.plainOutput);
133
135
  context.warnings.forEach((warning) => renderer.warning(warning));
134
136
  const result = await runDebate(config, options, renderer);
135
137
  const outputPath = await writeDebateMarkdown(config.outputDir ?? ".", result.options, result.messages, result.summary, result.stopReason);
136
138
  renderer.done(outputPath);
137
139
  }
140
+ /**
141
+ * Exécute la commande `agents` : charge la config et affiche les agents déclarés avec leur état de détection.
142
+ * @param flags - Flags parsés depuis la ligne de commande.
143
+ */
138
144
  async function runAgentsCommand(flags) {
139
145
  const configPath = optionalString(flags.config) ?? await resolveDefaultConfigPath();
140
146
  if (!(await configExists(configPath))) {
@@ -144,6 +150,10 @@ async function runAgentsCommand(flags) {
144
150
  const discovery = await discoverLocalTools();
145
151
  printAgents(configPath, config, discovery);
146
152
  }
153
+ /**
154
+ * Exécute la commande `config` : wizard interactif ou mise à jour directe des paramètres par défaut.
155
+ * @param flags - Flags parsés depuis la ligne de commande.
156
+ */
147
157
  async function runConfigCommand(flags) {
148
158
  const configPath = optionalString(flags.config) ?? await resolveDefaultConfigPath();
149
159
  if (!(await configExists(configPath))) {
@@ -203,9 +213,18 @@ async function runConfigCommand(flags) {
203
213
  }
204
214
  await runConfigWizard(configPath, config);
205
215
  }
216
+ /**
217
+ * Renvoie `true` si la valeur représente une désactivation explicite (ex. "none", "0", "disabled").
218
+ * @param value - Chaîne saisie par l'utilisateur.
219
+ */
206
220
  function isNoneValue(value) {
207
221
  return ["0", "none", "aucun", "disabled", "désactivé", "desactive"].includes(value.trim().toLowerCase());
208
222
  }
223
+ /**
224
+ * Formate les paramètres par défaut en une ligne lisible pour les messages console.
225
+ * @param defaults - Objet `defaults` de la config Palabre.
226
+ * @returns Chaîne résumant la paire d'agents, le nombre de réponses et l'agent de synthèse.
227
+ */
209
228
  function formatDefaultsForMessage(defaults) {
210
229
  const pair = defaults.agentA && defaults.agentB
211
230
  ? `agents: ${defaults.agentA} <-> ${defaults.agentB}`
@@ -213,11 +232,26 @@ function formatDefaultsForMessage(defaults) {
213
232
  const summary = defaults.summaryAgent ? `synthèse: ${defaults.summaryAgent}` : "synthèse: agent B";
214
233
  return `${pair}, réponses: ${turnsOrDefault(defaults.turns)}, ${summary}`;
215
234
  }
235
+ /**
236
+ * Lève une erreur si `agentName` n'est pas déclaré dans la config.
237
+ * @param config - Config chargée.
238
+ * @param agentName - Nom de l'agent à vérifier.
239
+ * @param fieldName - Nom du champ (utilisé dans le message d'erreur).
240
+ */
216
241
  function assertKnownAgent(config, agentName, fieldName) {
217
242
  if (!config.agents[agentName]) {
218
243
  throw new Error(`Agent inconnu pour ${fieldName}: ${agentName}. Agents disponibles: ${Object.keys(config.agents).join(", ")}.`);
219
244
  }
220
245
  }
246
+ /**
247
+ * Résout le nom d'un agent selon la priorité : flag CLI > preset > défaut config.
248
+ * Lève une erreur si aucune source ne fournit de valeur.
249
+ * @param label - Libellé humain utilisé dans le message d'erreur (ex. "agent A").
250
+ * @param explicitValue - Valeur passée via flag CLI.
251
+ * @param presetValue - Valeur issue du preset sélectionné.
252
+ * @param defaultValue - Valeur issue des défauts de la config.
253
+ * @returns Nom de l'agent résolu.
254
+ */
221
255
  function resolveAgentName(label, explicitValue, presetValue, defaultValue) {
222
256
  const resolved = optionalString(explicitValue) ?? presetValue ?? defaultValue;
223
257
  if (!resolved) {
@@ -225,6 +259,11 @@ function resolveAgentName(label, explicitValue, presetValue, defaultValue) {
225
259
  }
226
260
  return resolved;
227
261
  }
262
+ /**
263
+ * Affiche un aperçu du prompt du premier tour sans appeler aucun agent (flag `--show-prompt`).
264
+ * @param config - Config chargée.
265
+ * @param options - Options du débat résolues.
266
+ */
228
267
  function printPromptPreview(config, options) {
229
268
  const agentConfig = config.agents[options.agentA];
230
269
  if (!agentConfig) {
@@ -250,9 +289,56 @@ function printPromptPreview(config, options) {
250
289
  console.log("");
251
290
  console.log("Note: seuls les prompts du premier tour sont exacts sans exécuter les agents. Les tours suivants incluent le transcript réel.");
252
291
  }
292
+ /**
293
+ * Extrait une chaîne non vide depuis une valeur de flag, ou renvoie `undefined`.
294
+ * @param value - Valeur brute issue du parseur de flags.
295
+ */
253
296
  function optionalString(value) {
254
297
  return typeof value === "string" && value.trim() ? value : undefined;
255
298
  }
299
+ /** Liste des kinds de renderer acceptés par `--renderer`. */
300
+ const SUPPORTED_RENDERERS = ["auto", "pretty", "plain", "ndjson"];
301
+ /**
302
+ * Instancie le renderer en fonction des flags CLI.
303
+ *
304
+ * Précédence :
305
+ * 1. `--renderer <kind>` (canonique).
306
+ * 2. `--json` (alias pour `--renderer ndjson`).
307
+ * 3. `--plain` (rétro-compatible, équivalent `--renderer plain`).
308
+ * 4. par défaut : `auto` (pretty si TTY, plain sinon, hérité de `createConsoleRenderer`).
309
+ *
310
+ * Lève si la valeur de `--renderer` n'est pas dans `SUPPORTED_RENDERERS`.
311
+ */
312
+ function createRendererFromFlags(flags, plainOutputFallback) {
313
+ const explicit = optionalString(flags.renderer);
314
+ if (explicit) {
315
+ if (!SUPPORTED_RENDERERS.includes(explicit)) {
316
+ throw new Error(`Renderer inconnu: ${explicit}. Valeurs supportées: ${SUPPORTED_RENDERERS.join(", ")}.`);
317
+ }
318
+ const kind = explicit;
319
+ switch (kind) {
320
+ case "ndjson":
321
+ return createNdjsonRenderer();
322
+ case "plain":
323
+ return createConsoleRenderer(true);
324
+ case "pretty":
325
+ return createConsoleRenderer(false);
326
+ case "auto":
327
+ return createConsoleRenderer(plainOutputFallback);
328
+ }
329
+ }
330
+ if (flags.json) {
331
+ return createNdjsonRenderer();
332
+ }
333
+ return createConsoleRenderer(plainOutputFallback);
334
+ }
335
+ /**
336
+ * Parse `process.argv` en une structure typée `ParsedArgs`.
337
+ * Gère les flags courts (-h, -v, -s, -t, -a), les flags longs (--topic, --agent-a…),
338
+ * les flags multi-valeurs (--files, --context, --set-defaults) et les positionnels.
339
+ * @param args - Tableau d'arguments (généralement `process.argv.slice(2)`).
340
+ * @returns Commande détectée, indicateur d'explicitation et map de flags.
341
+ */
256
342
  function parseArgs(args) {
257
343
  const flags = {};
258
344
  let command = "run";
@@ -352,6 +438,12 @@ function parseArgs(args) {
352
438
  }
353
439
  return { command, commandExplicit, flags };
354
440
  }
441
+ /**
442
+ * Détecte si une valeur ressemble à une faute de frappe d'une commande connue
443
+ * (même première lettre et distance de Levenshtein ≤ 2).
444
+ * @param value - Token saisi par l'utilisateur.
445
+ * @param commands - Ensemble des commandes valides.
446
+ */
355
447
  function isLikelyCommandTypo(value, commands) {
356
448
  const normalized = value.toLowerCase();
357
449
  for (const command of commands) {
@@ -361,6 +453,12 @@ function isLikelyCommandTypo(value, commands) {
361
453
  }
362
454
  return false;
363
455
  }
456
+ /**
457
+ * Calcule la distance de Levenshtein entre deux chaînes (insertions, suppressions, substitutions).
458
+ * @param left - Première chaîne.
459
+ * @param right - Deuxième chaîne.
460
+ * @returns Distance entière ≥ 0.
461
+ */
364
462
  function levenshteinDistance(left, right) {
365
463
  const previous = Array.from({ length: right.length + 1 }, (_, index) => index);
366
464
  for (let leftIndex = 0; leftIndex < left.length; leftIndex += 1) {
@@ -376,6 +474,14 @@ function levenshteinDistance(left, right) {
376
474
  }
377
475
  return previous[right.length] ?? 0;
378
476
  }
477
+ /**
478
+ * Interprète les arguments positionnels pour la commande `run` :
479
+ * premier positionnel = preset si connu, sinon sujet complet concaténé.
480
+ * @param positionals - Arguments positionnels extraits du parseur.
481
+ * @param flags - Map de flags à muter si un preset ou un sujet est détecté.
482
+ * @param presets - Ensemble des noms de presets valides.
483
+ * @param commandExplicit - `true` si l'utilisateur a tapé `palabre run` explicitement.
484
+ */
379
485
  function applyRunPositionals(positionals, flags, presets, commandExplicit) {
380
486
  if (positionals.length === 0) {
381
487
  return;
@@ -393,6 +499,10 @@ function applyRunPositionals(positionals, flags, presets, commandExplicit) {
393
499
  }
394
500
  flags.topic ??= positionals.join(" ");
395
501
  }
502
+ /**
503
+ * Normalise un nom de flag long en son alias canonique (ex. `subject` → `topic`).
504
+ * @param value - Nom brut extrait après `--`.
505
+ */
396
506
  function normalizeFlagName(value) {
397
507
  const aliases = {
398
508
  s: "topic",
@@ -401,6 +511,10 @@ function normalizeFlagName(value) {
401
511
  };
402
512
  return aliases[value] ?? value;
403
513
  }
514
+ /**
515
+ * Indique si un flag long nécessite une valeur suivante (lève une erreur si absente).
516
+ * @param value - Nom canonique du flag (sans `--`).
517
+ */
404
518
  function requiresFlagValue(value) {
405
519
  return new Set([
406
520
  "agent-a",
@@ -416,12 +530,18 @@ function requiresFlagValue(value) {
416
530
  "turns"
417
531
  ]).has(value);
418
532
  }
533
+ /** Lit la version depuis `package.json` adjacent au bundle compilé. */
419
534
  async function getPackageVersion() {
420
535
  const packageJsonPath = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "..", "package.json");
421
536
  const raw = await readFile(packageJsonPath, "utf8");
422
537
  const packageJson = JSON.parse(raw);
423
538
  return packageJson.version ?? "0.0.0";
424
539
  }
540
+ /**
541
+ * Normalise une valeur de flag multi-valeur en tableau de chaînes.
542
+ * @param value - Valeur brute (tableau, chaîne unique ou absent).
543
+ * @returns Tableau de chaînes, vide si la valeur n'est pas applicable.
544
+ */
425
545
  function getStringListFlag(value) {
426
546
  if (Array.isArray(value)) {
427
547
  return value;
@@ -431,11 +551,22 @@ function getStringListFlag(value) {
431
551
  }
432
552
  return [];
433
553
  }
554
+ /**
555
+ * Écrit les avertissements de contexte sur `stderr`.
556
+ * @param warnings - Messages d'avertissement issus du chargement des fichiers de contexte.
557
+ */
434
558
  function printContextWarnings(warnings) {
435
559
  for (const warning of warnings) {
436
560
  process.stderr.write(`Warning: ${warning}\n`);
437
561
  }
438
562
  }
563
+ /**
564
+ * Ajoute dans `config.agents` les agents détectés localement mais absents de la config.
565
+ * Mute `config` directement ; l'appelant est responsable de persister la config.
566
+ * @param config - Config Palabre à compléter.
567
+ * @param discovery - Résultat de la découverte locale des outils.
568
+ * @returns Noms des agents nouvellement ajoutés.
569
+ */
439
570
  function syncDetectedAgents(config, discovery) {
440
571
  const discoveredConfig = createConfigFromDiscovery(discovery);
441
572
  const missingAgents = findDetectedMissingAgents(config, discovery);
@@ -444,6 +575,11 @@ function syncDetectedAgents(config, discovery) {
444
575
  }
445
576
  return missingAgents;
446
577
  }
578
+ /**
579
+ * Renvoie les noms des agents détectés localement qui ne sont pas encore dans `config.agents`.
580
+ * @param config - Config Palabre existante.
581
+ * @param discovery - Résultat de la découverte locale des outils.
582
+ */
447
583
  function findDetectedMissingAgents(config, discovery) {
448
584
  const detectedAgents = [
449
585
  discovery.codex.available ? "codex" : undefined,
@@ -454,6 +590,12 @@ function findDetectedMissingAgents(config, discovery) {
454
590
  ].filter((agent) => Boolean(agent));
455
591
  return detectedAgents.filter((agentName) => !config.agents[agentName]);
456
592
  }
593
+ /**
594
+ * Affiche la liste des agents déclarés avec leur type, rôle, état de détection et défauts.
595
+ * @param configPath - Chemin du fichier de config (affiché en en-tête).
596
+ * @param config - Config Palabre chargée.
597
+ * @param discovery - Résultat de la découverte locale des outils.
598
+ */
457
599
  function printAgents(configPath, config, discovery) {
458
600
  const entries = Object.entries(config.agents).sort(([left], [right]) => left.localeCompare(right));
459
601
  console.log(`Config: ${configPath}`);
@@ -472,6 +614,11 @@ function printAgents(configPath, config, discovery) {
472
614
  console.log("");
473
615
  console.log(`Défauts: ${config.defaults?.agentA ?? "aucun"} <-> ${config.defaults?.agentB ?? "aucun"}, réponses: ${turnsOrDefault(config.defaults?.turns)}, synthèse: ${config.defaults?.summaryAgent ?? "agent B"}`);
474
616
  }
617
+ /**
618
+ * Renvoie un libellé indiquant si l'agent est agent A, agent B ou agent de synthèse par défaut.
619
+ * @param name - Nom de l'agent.
620
+ * @param config - Config Palabre contenant les défauts.
621
+ */
475
622
  function formatAgentDefaults(name, config) {
476
623
  const labels = [];
477
624
  if (config.defaults?.agentA === name)
@@ -482,12 +629,23 @@ function formatAgentDefaults(name, config) {
482
629
  labels.push("synthèse par défaut");
483
630
  return labels.join(", ");
484
631
  }
632
+ /**
633
+ * Renvoie une ligne de détails pour un agent : commande CLI ou modèle Ollama.
634
+ * @param agentConfig - Configuration de l'agent.
635
+ */
485
636
  function formatAgentDetails(agentConfig) {
486
637
  if (agentConfig.type === "ollama") {
487
638
  return `modèle: ${agentConfig.model}`;
488
639
  }
489
640
  return `commande: ${agentConfig.command}${agentConfig.model ? ` | modèle: ${agentConfig.model}` : ""}`;
490
641
  }
642
+ /**
643
+ * Renvoie le statut de détection d'un agent sous forme de chaîne lisible.
644
+ * Pour Ollama, vérifie la disponibilité du serveur et la présence du modèle.
645
+ * @param name - Nom de l'agent dans la config.
646
+ * @param agentConfig - Configuration de l'agent.
647
+ * @param discovery - Résultat de la découverte locale des outils.
648
+ */
491
649
  function formatAgentDetection(name, agentConfig, discovery) {
492
650
  if (agentConfig.type === "ollama") {
493
651
  if (!discovery.ollama.available) {
@@ -500,6 +658,13 @@ function formatAgentDetection(name, agentConfig, discovery) {
500
658
  const detection = cliDetectionForAgent(name, agentConfig, discovery);
501
659
  return detection.available ? `détecté (${detection.command})` : "non détecté";
502
660
  }
661
+ /**
662
+ * Résout l'entrée de détection correspondant à un agent CLI dans le résultat de découverte.
663
+ * Renvoie un objet `{ available: true }` pour les agents CLI non reconnus (considérés disponibles).
664
+ * @param name - Nom de l'agent dans la config.
665
+ * @param agentConfig - Configuration de l'agent.
666
+ * @param discovery - Résultat de la découverte locale des outils.
667
+ */
503
668
  function cliDetectionForAgent(name, agentConfig, discovery) {
504
669
  const command = normalizeCommandName(agentConfig.type === "cli" ? agentConfig.command : name);
505
670
  if (command === "codex")
@@ -512,9 +677,18 @@ function cliDetectionForAgent(name, agentConfig, discovery) {
512
677
  return discovery.opencode;
513
678
  return { available: true, command: agentConfig.type === "cli" ? agentConfig.command : name };
514
679
  }
680
+ /**
681
+ * Extrait le nom de base d'une commande en supprimant le chemin et l'extension Windows éventuelle.
682
+ * @param command - Chemin ou nom de commande brut (ex. `C:\bin\claude.cmd`).
683
+ */
515
684
  function normalizeCommandName(command) {
516
685
  return path.basename(command).replace(/\.(cmd|exe|ps1|bat)$/i, "").toLowerCase();
517
686
  }
687
+ /**
688
+ * Affiche le récapitulatif de détection locale après `palabre init`.
689
+ * @param discovery - Résultat de la découverte locale des outils.
690
+ * @param config - Config générée à partir de la découverte.
691
+ */
518
692
  function printInitDiscovery(discovery, config) {
519
693
  console.log("");
520
694
  console.log("Détection locale:");
@@ -526,11 +700,19 @@ function printInitDiscovery(discovery, config) {
526
700
  console.log("");
527
701
  console.log(`Défauts: ${config.defaults?.agentA ?? "codex"} <-> ${config.defaults?.agentB ?? "ollama-local"}`);
528
702
  }
703
+ /**
704
+ * Formate le statut de détection d'un outil CLI (disponible ou non).
705
+ * @param detection - Résultat de détection d'un outil CLI.
706
+ */
529
707
  function formatCommandDetection(detection) {
530
708
  return detection.available
531
709
  ? `détecté (${detection.command})`
532
710
  : "non détecté";
533
711
  }
712
+ /**
713
+ * Formate le statut de détection d'Ollama : commande absente, serveur injoignable ou modèles disponibles.
714
+ * @param detection - Résultat de détection d'Ollama.
715
+ */
534
716
  function formatOllamaDetection(detection) {
535
717
  if (!detection.available) {
536
718
  return detection.commandAvailable
@@ -540,90 +722,138 @@ function formatOllamaDetection(detection) {
540
722
  const modelCount = detection.models.length;
541
723
  return `détectée (${modelCount} modèle${modelCount > 1 ? "s" : ""})`;
542
724
  }
725
+ /** Affiche le texte d'aide complet sur `stdout`. */
543
726
  function printHelp() {
544
- console.log(`
545
- PALABRE
546
-
547
- Usage rapide:
548
- palabre new
549
- Assistant interactif pour choisir les agents, le sujet et les options.
550
- palabre run -s "Sujet"
551
- Lance avec les agents par défaut de la config.
552
- palabre claude-gemini "Sujet" -t 4
553
- Lance avec un preset et un sujet positionnel.
554
-
555
- Commandes:
556
- palabre init [--local]
557
- Crée une config et détecte Codex, Claude, Gemini, OpenCode et Ollama.
558
- palabre agents [--config <path>]
559
- Liste les agents déclarés dans la config et leur détection locale.
560
- palabre config
561
- Assistant pour définir ou supprimer les paramètres par défaut.
562
- palabre config --set-defaults <agentA> <agentB> [-t <n>] [--summary-agent <name>]
563
- Définit les agents par défaut, et optionnellement les réponses et la synthèse.
564
- palabre config -t <n>
565
- Définit seulement le nombre de réponses par défaut.
566
- palabre config --summary-agent <name|none>
567
- Définit ou retire seulement l'agent de synthèse par défaut.
568
- palabre config --clear-defaults
569
- Supprime les paramètres par défaut.
570
- palabre doctor [--config <path>]
571
- Vérifie la config et les outils locaux.
572
- palabre update [--apply]
573
- Affiche ou exécute les étapes de mise à jour d'un checkout git.
574
- palabre help
575
- Affiche cette aide. Identique à -h ou --help.
576
- palabre version
577
- Affiche la version. Identique à -v ou --version.
578
-
579
- Notation:
580
- [option] signifie facultatif. Ne tape pas les crochets.
581
- <valeur> signifie qu'il faut remplacer ce texte par ta valeur.
582
-
583
- Options générales:
584
- -h, --help Affiche cette aide
585
- -v, --version Affiche la version
586
- -a Liste les agents. Identique à palabre agents
587
- --config <path> Chemin vers un fichier de config explicite
588
- --plain Utilise le rendu console simple sans habillage TUI
589
-
590
- Sujet et lancement:
591
- -s, --subject <text> Sujet du débat, option recommandée
592
- --topic <text> Alias compatible de --subject
593
- --agent-a <name> Premier agent
594
- --agent-b <name> Second agent
595
- --preset <name> Preset de paire d'agents. Exemples: codex-claude, claude-gemini
596
- -t, --turns <number> Nombre total de réponses (1 à 20)
597
- --no-early-stop Désactive l'arrêt anticipé si les agents sont clairement d'accord
598
-
599
- Modèles:
600
- --model-a <model> Modèle brut transmis à l'agent A
601
- --model-b <model> Modèle brut transmis à l'agent B
602
- --pull-models Autorise Ollama à télécharger un modèle manquant
603
-
604
- Synthèse:
605
- --summary-agent <name> Agent utilisé pour produire la synthèse finale
606
- --summary-model <model> Modèle brut transmis à l'agent de synthèse
607
- --no-summary Désactive la synthèse finale
608
-
609
- Contexte:
610
- --files <paths...> Fichiers texte à injecter explicitement dans le contexte
611
- --context <paths...> Scanne fichiers/dossiers texte en respectant les limites de contexte
612
- --show-prompt Affiche le prompt du premier tour sans appeler d'agent
613
-
614
- Configuration:
615
- --local Avec init/setup, crée ./palabre.config.json
616
- --set-defaults <a b> Avec config, définit les agents par défaut
617
- --summary-agent <name> Avec config, définit l'agent de synthèse par défaut
618
- --summary-agent none Avec config, retire l'agent de synthèse par défaut
619
- --clear-defaults Avec config, supprime les paramètres par défaut
620
- --sync-agents Avec config, ajoute les agents détectés manquants
621
-
622
- Mise à jour:
623
- --apply Avec update, exécute les étapes de mise à jour
624
-
625
- Presets disponibles:
626
- ${listPresetNames().join(", ")}
727
+ console.log(`
728
+ PALABRE
729
+ _____________________________________________
730
+
731
+ Usage rapide:
732
+
733
+ palabre init
734
+ Crée une config globale et détecte les agents AI disponibles sur la machine.
735
+
736
+ palabre agents
737
+ Affiche les agents déclarés dans la config.
738
+
739
+ palabre config
740
+ Assistant pour définir ou supprimer les paramètres par défaut.
741
+
742
+ palabre new
743
+ Assistant interactif pour choisir les agents, le sujet et les options.
744
+
745
+ palabre claude-gemini "Sujet" -t 4
746
+ Lance avec un preset et un sujet positionnel.
747
+
748
+ palabre "Sujet"
749
+ Lance le débat avec paramètres par défaut de la config.
750
+
751
+ _____________________________________________
752
+
753
+
754
+ Commandes:
755
+
756
+ palabre init [--local]
757
+ Crée une config locale et détecte Codex, Claude, Gemini, OpenCode et Ollama.
758
+
759
+ palabre agents [--config <path>]
760
+ Liste les agents déclarés dans la config et leur détection locale.
761
+
762
+ palabre config
763
+ Assistant pour définir ou supprimer les paramètres par défaut.
764
+
765
+ palabre config --set-defaults <agentA> <agentB> [-t <n>] [--summary-agent <name>]
766
+ Définit les agents par défaut, et optionnellement les réponses et la synthèse.
767
+
768
+ palabre config -t <n>
769
+ Définit seulement le nombre de réponses par défaut.
770
+
771
+ palabre config --summary-agent <name|none>
772
+ Définit ou retire seulement l'agent de synthèse par défaut.
773
+
774
+ palabre config --clear-defaults
775
+ Supprime les paramètres par défaut.
776
+
777
+ palabre doctor [--config <path>]
778
+ Vérifie la config et les outils locaux.
779
+
780
+ palabre update [--apply]
781
+ Affiche ou exécute les étapes de mise à jour d'un checkout git.
782
+
783
+ palabre help
784
+ Affiche cette aide. Identique à -h ou --help.
785
+
786
+ palabre version
787
+ Affiche la version. Identique à -v ou --version.
788
+
789
+ _____________________________________________
790
+
791
+
792
+ Notation:
793
+
794
+ [option] signifie facultatif. Ne tape pas les crochets.
795
+ <valeur> signifie qu'il faut remplacer ce texte par ta valeur.
796
+
797
+ Options générales:
798
+
799
+ -h, --help Affiche cette aide
800
+ -v, --version Affiche la version
801
+ -a, --agents Liste les agents. Identique à palabre agents
802
+ --config <path> Chemin vers un fichier de config explicite
803
+ --plain Utilise le rendu console simple sans habillage TUI
804
+ --json Émet un événement NDJSON par ligne sur stdout (alias de --renderer ndjson)
805
+ --renderer <kind> Force le renderer : auto | pretty | plain | ndjson
806
+
807
+ Sujet et lancement:
808
+
809
+ -s, --subject <text> Sujet du débat, option recommandée
810
+ --topic <text> Alias compatible de --subject
811
+ --agent-a <name> Premier agent
812
+ --agent-b <name> Second agent
813
+ --preset <name> Preset de paire d'agents. Exemples: codex-claude, claude-gemini
814
+ -t, --turns <number> Nombre total de réponses (1 à 20)
815
+ --no-early-stop Désactive l'arrêt anticipé si les agents sont clairement d'accord
816
+
817
+ Modèles:
818
+
819
+ --model-a <model> Modèle brut transmis à l'agent A
820
+ --model-b <model> Modèle brut transmis à l'agent B
821
+ --pull-models Autorise Ollama à télécharger un modèle manquant
822
+
823
+ Synthèse:
824
+
825
+ --summary-agent <name> Agent utilisé pour produire la synthèse finale
826
+ --summary-model <model> Modèle brut transmis à l'agent de synthèse
827
+ --no-summary Désactive la synthèse finale
828
+
829
+ Contexte:
830
+
831
+ --files <paths...> Fichiers texte à injecter explicitement dans le contexte
832
+ --context <paths...> Scanne fichiers/dossiers texte en respectant les limites de contexte
833
+ --show-prompt Affiche le prompt du premier tour sans appeler d'agent
834
+
835
+ Configuration:
836
+
837
+ --local Avec init/setup, crée ./palabre.config.json
838
+ --set-defaults <a b> Avec config, définit les agents par défaut
839
+ --summary-agent <name> Avec config, définit l'agent de synthèse par défaut
840
+ --summary-agent none Avec config, retire l'agent de synthèse par défaut
841
+ --clear-defaults Avec config, supprime les paramètres par défaut
842
+ --sync-agents Avec config, ajoute les agents détectés manquants
843
+
844
+ Mise à jour:
845
+
846
+ --apply Avec update, exécute les étapes de mise à jour
847
+
848
+ _____________________________________________
849
+
850
+
851
+ Presets disponibles:
852
+
853
+ ${listPresetNames().join(", ")}
854
+
855
+ _____________________________________________
856
+
627
857
  `);
628
858
  }
629
859
  main().catch((error) => {