specrails-desktop 2.25.0 → 2.26.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.
Files changed (119) hide show
  1. package/client/dist/assets/{ActivityFeedPage-BGRTOOhT.js → ActivityFeedPage-1eXnoNAo.js} +1 -1
  2. package/client/dist/assets/{AgentBrowserCapture-DvDLxsUy.js → AgentBrowserCapture-BHW_6Vm0.js} +1 -1
  3. package/client/dist/assets/{AgentModeCodePane-DfwctjzN.js → AgentModeCodePane-C89SAJzI.js} +2 -2
  4. package/client/dist/assets/{AgentModeJobsPane-G3WrS-sE.js → AgentModeJobsPane-BG_4r4Dm.js} +1 -1
  5. package/client/dist/assets/{AgentsPage-DGFFijMC.js → AgentsPage-BrkWfc9s.js} +1 -1
  6. package/client/dist/assets/{AnalyticsPage-hoJmlEpk.js → AnalyticsPage-CMZRUPrT.js} +1 -1
  7. package/client/dist/assets/{BarChart-BEhAXVK-.js → BarChart-BtF3zJHa.js} +1 -1
  8. package/client/dist/assets/{CodePage-B4zB9DVC.js → CodePage-Cime5FRs.js} +1 -1
  9. package/client/dist/assets/{DesktopAnalyticsPage-CBX-Qpxd.js → DesktopAnalyticsPage-CSKHSBBF.js} +1 -1
  10. package/client/dist/assets/{DocsDialog-lTsnNdAM.js → DocsDialog-ClTq6Fzj.js} +1 -1
  11. package/client/dist/assets/{DocsPage-CkvdGroT.js → DocsPage-DTxfOpTu.js} +1 -1
  12. package/client/dist/assets/{ExportDropdown-Da98gR-P.js → ExportDropdown-Ho9zdPvK.js} +1 -1
  13. package/client/dist/assets/{IntegrationsPage-Cf9o4eZq.js → IntegrationsPage-DWNyo6jk.js} +1 -1
  14. package/client/dist/assets/{InteractiveJobComposer-C8N-Bbnn.js → InteractiveJobComposer-CYxXOKld.js} +1 -1
  15. package/client/dist/assets/{JobDetailModal-BZVwIIEx.js → JobDetailModal-DrNafHY5.js} +1 -1
  16. package/client/dist/assets/{JobDetailPage-CQewQ1zy.js → JobDetailPage-4VKw33GW.js} +1 -1
  17. package/client/dist/assets/{JobsPage-CB4wOxmE.js → JobsPage-cFr6wWaH.js} +1 -1
  18. package/client/dist/assets/{LoopBuilderPage-B9Y5gt08.js → LoopBuilderPage-Bk8zVvEX.js} +1 -1
  19. package/client/dist/assets/{LoopPreviewModal-kxQ5kV1t.js → LoopPreviewModal-XFSO2Vcs.js} +1 -1
  20. package/client/dist/assets/{LoopsPage-RysW-6sC.js → LoopsPage-DWMwDj9g.js} +1 -1
  21. package/client/dist/assets/{ProjectSettingsDialog-BHN5qsGT.js → ProjectSettingsDialog-DnSe_yWm.js} +1 -1
  22. package/client/dist/assets/{TemplatePreviewModal-DW6lZCIs.js → TemplatePreviewModal-B30-TY_v.js} +1 -1
  23. package/client/dist/assets/agent-6mhkV25_2.js +1 -0
  24. package/client/dist/assets/agent-BZqfQhI_.js +1 -0
  25. package/client/dist/assets/agent-Bjy1SlT5.js +1 -0
  26. package/client/dist/assets/agent-Bn6ZmjHj.js +1 -0
  27. package/client/dist/assets/{agent-G6Zn2gpr.js → agent-CRYdi9-t.js} +1 -1
  28. package/client/dist/assets/agent-D5QNn9np2.js +1 -0
  29. package/client/dist/assets/agent-DgFoLgrF2.js +1 -0
  30. package/client/dist/assets/agent-DgwPsxWQ.js +1 -0
  31. package/client/dist/assets/{brain-B9dkGuAN.js → brain-DcXkQwzO.js} +1 -1
  32. package/client/dist/assets/code-CwnBPPyA.js +1 -0
  33. package/client/dist/assets/{dashboard-4WX7agHF2.js → dashboard-CuGuy2__2.js} +1 -1
  34. package/client/dist/assets/{dashboard-IbEztmJ52.js → dashboard-CxP3TZ3I2.js} +1 -1
  35. package/client/dist/assets/{dashboard-5Z_esXIB.js → dashboard-DWHVfP7U.js} +1 -1
  36. package/client/dist/assets/{dashboard-DQ-po1MG2.js → dashboard-D_Pgs6QH2.js} +1 -1
  37. package/client/dist/assets/{dashboard-oqS7VRrK.js → dashboard-Dwnssayh.js} +1 -1
  38. package/client/dist/assets/{dashboard-ojWdDq6S.js → dashboard-S_pT1yxN.js} +1 -1
  39. package/client/dist/assets/{dashboard-zfoJcdFW.js → dashboard-tCxOFOxx.js} +1 -1
  40. package/client/dist/assets/{dashboard-nc-Raovv.js → dashboard-zefbBNyG.js} +1 -1
  41. package/client/dist/assets/{dist-js-BW5-IZTP.js → dist-js-6U6hyD6z.js} +1 -1
  42. package/client/dist/assets/{dist-js-Bbd7Wzdw.js → dist-js-BAWwLSIj.js} +1 -1
  43. package/client/dist/assets/index-DnkfABxY.js +156 -0
  44. package/client/dist/assets/index-cvOunQkD.css +2 -0
  45. package/client/dist/assets/{lib-EIkIPf26.js → lib-Bsny0zZp.js} +1 -1
  46. package/client/dist/assets/{loops-YYV2bwjd.js → loops-Brnx4Fji.js} +1 -1
  47. package/client/dist/assets/{loops-hXgncEpF2.js → loops-BvqQ-bHR2.js} +1 -1
  48. package/client/dist/assets/{loops-BvEenWBy.js → loops-CvOWsi5r.js} +1 -1
  49. package/client/dist/assets/{loops-DjOtVXRo.js → loops-D6D3XHjj.js} +1 -1
  50. package/client/dist/assets/{loops-HTHf-xu32.js → loops-DJNhp17p2.js} +1 -1
  51. package/client/dist/assets/{loops-kYbydDyN.js → loops-K5_HXfJa.js} +1 -1
  52. package/client/dist/assets/loops-LIgO_-eM.js +1 -0
  53. package/client/dist/assets/{loops-DNGiYKll2.js → loops-vhJdbcz92.js} +1 -1
  54. package/client/dist/assets/{settings-DZJeXoRV.js → settings-BWIf3vv4.js} +1 -1
  55. package/client/dist/assets/{settings-TNga5gIF2.js → settings-BhuXe7ek2.js} +1 -1
  56. package/client/dist/assets/{settings-D6qY9_UI.js → settings-DE8t6aYv.js} +1 -1
  57. package/client/dist/assets/{settings-BsJMsWGc.js → settings-DHd1lQ1k.js} +1 -1
  58. package/client/dist/assets/{settings-BOHOmHkb.js → settings-DTYQ5COE.js} +1 -1
  59. package/client/dist/assets/settings-DXgPh9-k.js +1 -0
  60. package/client/dist/assets/{settings-BlEA_7h02.js → settings-Dgv_q4qf2.js} +1 -1
  61. package/client/dist/assets/{settings-lFoaYT-s2.js → settings-FJXpJ3k92.js} +1 -1
  62. package/client/dist/assets/{setup-CmU6bTCV2.js → setup-cnqZsQSX2.js} +1 -1
  63. package/client/dist/assets/{upload-BCMl-nCg.js → upload-49vX83IZ.js} +1 -1
  64. package/client/dist/assets/{value-CG-amSq1.js → value-Bo8EiTZE.js} +1 -1
  65. package/client/dist/index.html +6 -6
  66. package/docs/agy-cli-provider-study.md +1 -1
  67. package/docs/codex.md +2 -2
  68. package/docs/gemini-cli-provider-study.md +2 -2
  69. package/docs/guide/de/pipeline/3-batch-implement-and-multi-feature.md +1 -1
  70. package/docs/guide/en/pipeline/3-batch-implement-and-multi-feature.md +1 -1
  71. package/docs/guide/es/pipeline/3-batch-implement-and-multi-feature.md +1 -1
  72. package/docs/guide/fr/pipeline/3-batch-implement-and-multi-feature.md +1 -1
  73. package/docs/guide/it/pipeline/3-batch-implement-and-multi-feature.md +1 -1
  74. package/docs/guide/ja/pipeline/3-batch-implement-and-multi-feature.md +1 -1
  75. package/docs/guide/pt/pipeline/3-batch-implement-and-multi-feature.md +1 -1
  76. package/docs/guide/pt/pipeline/5-the-loop-builder.md +1 -1
  77. package/docs/guide/zh/pipeline/3-batch-implement-and-multi-feature.md +1 -1
  78. package/docs/internals/api-reference.md +3 -3
  79. package/docs/internals/companion-rails-as-loops-contract.md +6 -6
  80. package/docs/internals/configuration.md +1 -1
  81. package/docs/internals/interactive-jobs.md +3 -3
  82. package/docs/internals/safe-pr-review-flow.md +1 -1
  83. package/docs/internals/visual-design-audit.md +2 -2
  84. package/docs/running-pipelines.md +1 -1
  85. package/package.json +1 -1
  86. package/server/dist/agent-chat-manager.js +16 -2
  87. package/server/dist/agent-chat-router.js +66 -1
  88. package/server/dist/agent-context-resolver.js +301 -0
  89. package/server/dist/agent-operator-prompt.js +14 -7
  90. package/server/dist/agent-store.js +24 -12
  91. package/server/dist/db.js +17 -17
  92. package/server/dist/desktop-db.js +6 -0
  93. package/server/dist/feature-flags.js +2 -2
  94. package/server/dist/index.js +1 -1
  95. package/server/dist/interactive-job-session.js +3 -3
  96. package/server/dist/loop-command-catalog.js +11 -11
  97. package/server/dist/loop-factory.js +7 -7
  98. package/server/dist/loop-graph.js +2 -2
  99. package/server/dist/loop-run-manager.js +1 -1
  100. package/server/dist/mcp/guide.js +8 -6
  101. package/server/dist/mcp/tools/rails.js +4 -3
  102. package/server/dist/mobile/mobile-router.js +1 -1
  103. package/server/dist/project-router-jobs.js +1 -1
  104. package/server/dist/project-router-loop-runs.js +1 -1
  105. package/server/dist/project-router-settings.js +5 -5
  106. package/server/dist/queue-manager.js +27 -27
  107. package/server/dist/rails-router.js +20 -20
  108. package/client/dist/assets/agent-4ARs0uac2.js +0 -1
  109. package/client/dist/assets/agent-C55wwsUX.js +0 -1
  110. package/client/dist/assets/agent-C_kqyrXo.js +0 -1
  111. package/client/dist/assets/agent-Df3lnHMu.js +0 -1
  112. package/client/dist/assets/agent-MQhun7cv.js +0 -1
  113. package/client/dist/assets/agent-NqlER4Yh2.js +0 -1
  114. package/client/dist/assets/agent-OTGI6t7e2.js +0 -1
  115. package/client/dist/assets/code-CqCcRThR.js +0 -1
  116. package/client/dist/assets/index-BtAks9nm.css +0 -2
  117. package/client/dist/assets/index-DC-REAcL.js +0 -155
  118. package/client/dist/assets/loops-CBiWd9Hf.js +0 -1
  119. package/client/dist/assets/settings-Mr7MnJbf.js +0 -1
@@ -1 +1 @@
1
- var e={railAdded:`Rail {{n}} ajouté`,railRemoved:`{{rail}} supprimé`,railLimitReached:`Limite de rails atteinte ({{max}} max.)`,railDeleteFailed:`Impossible de supprimer le rail — il contient des specs, est en cours d'exécution ou a une décision de PR en attente`,launchTicketsInFlight:`Une spec de ce rail est déjà traitée par une exécution active`,launchAllSummary_one:`{{count}} rail lancé en parallèle`,launchAllSummary_other:`{{count}} rails lancés en parallèle`,launchAllNoneEligible:`Aucun rail prêt à lancer — assignez d'abord des specs à un rail libre`,launchAllFailed:`Aucun rail n'a pu être lancé`,railCompleted:`Rail {{n}} terminé`,railFailed:`Rail {{n}} en échec — specs renvoyées vers Specs`,railEnded:`Rail {{n}} {{status}} — specs renvoyées vers Specs`,alreadyOnRail:`Déjà sur {{rail}}`,movedToRail:`Déplacé vers {{rail}}`,railRunningStopFirst:`{{rail}} est en cours d'exécution — arrêtez-le avant de le supprimer`,removedFromRail:`Retiré de {{rail}}`,queuedOnRail:`Mis en file sur {{rail}}`,queuedOnRailDescription:`Le rail est en cours d'exécution`,railStopped:`{{rail}} arrêté`,stopFailed:`Échec de l'arrêt du rail`,syncTicketsFailed:`Échec de la synchronisation des tickets du rail`,launchFailed:`Échec du lancement du rail`,launchNetworkError:`Erreur réseau au lancement du rail`,railLaunched:`{{rail}} lancé`,launchDescription_one:`{{mode}} avec {{count}} spec`,launchDescription_other:`{{mode}} avec {{count}} specs`,railWorktreeNeedsReview:`Rail {{n}} : la spec #{{ticket}} nécessite une revue après le merge`,railWorktreesNoGit:`Isolation par worktree indisponible : ce projet n'est pas un dépôt git — exécution en mode partagé.`,railWorktreesNoCommits:`Isolation par worktree indisponible : le dépôt n'a pas encore de commit — faites un commit initial puis relancez.`,railWorktreesError:`L'isolation par worktrees a échoué — cette exécution continue SANS le flux de revue par PR (pas de carte d'implémentation). Voir le détail de l'erreur ci-dessous.`,onReviewCannotMoveToRail:`Cette spec attend une revue de PR — résolvez d'abord la décision de la PR`,onReviewNotLaunchable:`Une spec de ce rail attend une revue de PR — résolvez la décision de la PR avant de lancer`},t={readyForReview:`Prêt pour la revue`,draftPr:`PR en brouillon`,branchPushed:`Branche poussée — PR en attente`,branchPushedHint:`La branche a été poussée mais la PR n'a pas pu être créée (GitHub CLI indisponible). Réessayez pour la créer.`,prReady:`PR prête`,prFailed:`PR en échec`,prFailedDetail:`PR en échec : {{detail}}`,createDegraded:`Impossible de publier la PR — {{detail}}. Réessayez une fois le problème résolu.`,createPr:`Créer la PR`,createPrTooltip:`→ {{base}}`,publish:`Publier`,publishTooltip:`Ouvre la PR en brouillon pour la relecture de l'équipe`,discard:`Abandonner`,discardTooltip:`Supprime les branches et renvoie les tickets vers Specs`,retryPr:`Réessayer la PR`,retry:`Réessayer`,checkMerge:`Vérifier le merge`,checkMergeTooltip:`Demande à GitHub si la PR a été fusionnée`,prLinkFallback:`PR`,openPrTitle:`Ouvrir la PR sur GitHub`,notMergedYet:`Pas encore fusionnée`,alreadyResolved:`Déjà résolue ailleurs`,ghFailed:`GitHub CLI a échoué : {{detail}}`,actionFailed:`Impossible d'appliquer la décision de la PR`,mergedToast:`PR fusionnée — tickets passés en Terminé`,discardedToast:`PR abandonnée — tickets renvoyés vers Specs`,decisionPending:`Ce rail a une décision de PR en attente — créez, publiez ou abandonnez-la avant de relancer`,discardConfirmTitle:`Abandonner cette livraison ?`,discardConfirmBody:`Les branches et worktrees du lancement seront supprimés et ses tickets retourneront vers Specs. Cette action est irréversible.`,mergeLocal:`Intégrer en local`,mergeLocalTooltip:`Fusionne les branches livrées dans {{base}} dans votre checkout local (sans GitHub)`,mergeLocalConfirmTitle:`Intégrer en local ?`,mergeLocalConfirmBody:`Les branches livrées seront fusionnées dans {{base}} dans votre checkout local. Votre checkout doit être sur {{base}} avec un arbre de travail propre.`,mergeLocalBlockedDirty:`Impossible d'intégrer : votre arbre de travail sur {{base}} contient des changements non commités. Commitez ou stashez-les, puis réessayez.`,mergeLocalBlockedBranch:`Impossible d'intégrer : votre checkout est sur {{current}}, pas sur {{base}}. Passez sur {{base}}, puis réessayez.`,mergeLocalFailed:`La fusion locale a échoué : {{detail}}`,mergedLocally:`Intégré dans {{base}} en local`},n={title:`Rails`,runningCount_one:`{{count}} en cours`,runningCount_other:`{{count}} en cours`,launchAll:`Tout lancer`,launchAllTitle:`Lance en parallèle tous les rails prêts — chaque exécution est isolée dans son propre worktree git`},r={skipRunning_one:`{{count}} déjà en cours`,skipRunning_other:`{{count}} déjà en cours`,skipEmpty_one:`{{count}} sans specs`,skipEmpty_other:`{{count}} sans specs`,skipPendingDecision_one:`{{count}} en attente d'une décision de PR`,skipPendingDecision_other:`{{count}} en attente d'une décision de PR`,skipOnReview_one:`{{count}} avec des specs en revue`,skipOnReview_other:`{{count}} avec des specs en revue`,skipInFlight_one:`{{count}} ignoré (spec déjà en cours)`,skipInFlight_other:`{{count}} ignorés (specs déjà en cours)`,failedCount_one:`{{count}} en échec`,failedCount_other:`{{count}} en échec`},i={title:`Lancer tous les rails`,railsCount_one:`{{count}} rail`,railsCount_other:`{{count}} rails`,specsCount_one:`{{count}} spec`,specsCount_other:`{{count}} specs`,isolationTitle:`Parallèle et isolé.`,isolationBody:`Chaque rail s'exécute dans son propre worktree git — les lancements simultanés n'entrent jamais en collision.`,pipelinesTitle_one:`{{count}} pipeline IA.`,pipelinesTitle_other:`{{count}} pipelines IA.`,pipelinesBody:`Un lancement par rail, chacun avec son mode, son moteur et son profil configurés.`,costTitle:`Coût multiplié.`,costBody:`Chaque rail génère sa propre exécution IA — la dépense augmente avec le nombre de rails.`,launch_one:`Lancer {{count}} rail`,launch_other:`Lancer {{count}} rails`},a={viewJobLog:`Voir le log du job`,log:`Log`,implement:`Implémenter`,batch:`Batch`,ultra:`Freestyle`,ultraTitle:`Freestyle — Claude implémente la spec en autonomie, sans pipeline`,loop:`Loop`,loopTitle:`Loop — exécute une boucle d'automatisation publiée sur les specs du rail`,pickLoop:`Choisir une boucle…`,effortTitle:`Effort de raisonnement`,stop:`Arrêter`,play:`Lancer`,failedRetry:`Job en échec — cliquez pour réessayer`,addSpecsFirst:`Ajoutez d'abord des specs à ce rail`,builtInLoops:`Intégrés`,customLoops:`Loops personnalisés`,worktreesMerged:`{{count}} fusionnés`,worktreesNeedsReview:`{{count}} à vérifier`,execSteps:`{{count}} étapes`,execLines:`{{count}} lignes`,openspec:`OpenSpec`},o={moveToSpecs:`Déplacer vers Specs`,deleteRail:`Supprimer {{label}}`,dropHere:`Déposer ici`,dropOnThisRail:`Déposer sur ce rail`,dragSpecsHere:`Glissez des specs ici`},s={title:`Lancer en mode Freestyle`,context_one:`{{rail}} · {{count}} spec`,context_other:`{{rail}} · {{count}} specs`,noPipelineTitle:`Pas de pipeline OpenSpec.`,noPipelineBody:`Le flux structuré architecte → développeur → reviewer est entièrement ignoré.`,autonomyTitle:`Autonomie native de Claude.`,autonomyBody:`Claude travaille seul avec ses agents natifs et des workflows dynamiques.`,costTitle:`Coût variable.`,costBody:`La dépense dépend de ce que Claude décide de faire — elle peut être plus élevée que prévu.`,continue:`Continuer`},c={fetchFailed:`Échec de la récupération des rails : {{status}}`},l={toasts:e,railPr:t,railsBoard:n,launchAll:r,launchAllDialog:i,railControls:a,railRow:o,ultracodeDialog:s,useRails:c};export{l as default,r as launchAll,i as launchAllDialog,a as railControls,t as railPr,o as railRow,n as railsBoard,e as toasts,s as ultracodeDialog,c as useRails};
1
+ var e={railAdded:`Rail {{n}} ajouté`,railRemoved:`{{rail}} supprimé`,railLimitReached:`Limite de rails atteinte ({{max}} max.)`,railDeleteFailed:`Impossible de supprimer le rail — il contient des specs, est en cours d'exécution ou a une décision de PR en attente`,launchTicketsInFlight:`Une spec de ce rail est déjà traitée par une exécution active`,launchAllSummary_one:`{{count}} rail lancé en parallèle`,launchAllSummary_other:`{{count}} rails lancés en parallèle`,launchAllNoneEligible:`Aucun rail prêt à lancer — assignez d'abord des specs à un rail libre`,launchAllFailed:`Aucun rail n'a pu être lancé`,railCompleted:`Rail {{n}} terminé`,railFailed:`Rail {{n}} en échec — specs renvoyées vers Specs`,railEnded:`Rail {{n}} {{status}} — specs renvoyées vers Specs`,alreadyOnRail:`Déjà sur {{rail}}`,movedToRail:`Déplacé vers {{rail}}`,railRunningStopFirst:`{{rail}} est en cours d'exécution — arrêtez-le avant de le supprimer`,removedFromRail:`Retiré de {{rail}}`,queuedOnRail:`Mis en file sur {{rail}}`,queuedOnRailDescription:`Le rail est en cours d'exécution`,railStopped:`{{rail}} arrêté`,stopFailed:`Échec de l'arrêt du rail`,syncTicketsFailed:`Échec de la synchronisation des tickets du rail`,launchFailed:`Échec du lancement du rail`,launchNetworkError:`Erreur réseau au lancement du rail`,railLaunched:`{{rail}} lancé`,launchDescription_one:`{{mode}} avec {{count}} spec`,launchDescription_other:`{{mode}} avec {{count}} specs`,railWorktreeNeedsReview:`Rail {{n}} : la spec #{{ticket}} nécessite une revue après le merge`,railWorktreesNoGit:`Isolation par worktree indisponible : ce projet n'est pas un dépôt git — exécution en mode partagé.`,railWorktreesNoCommits:`Isolation par worktree indisponible : le dépôt n'a pas encore de commit — faites un commit initial puis relancez.`,railWorktreesError:`L'isolation par worktrees a échoué — cette exécution continue SANS le flux de revue par PR (pas de carte d'implémentation). Voir le détail de l'erreur ci-dessous.`,onReviewCannotMoveToRail:`Cette spec attend une revue de PR — résolvez d'abord la décision de la PR`,onReviewNotLaunchable:`Une spec de ce rail attend une revue de PR — résolvez la décision de la PR avant de lancer`},t={readyForReview:`Prêt pour la revue`,draftPr:`PR en brouillon`,branchPushed:`Branche poussée — PR en attente`,branchPushedHint:`La branche a été poussée mais la PR n'a pas pu être créée (GitHub CLI indisponible). Réessayez pour la créer.`,prReady:`PR prête`,prFailed:`PR en échec`,prFailedDetail:`PR en échec : {{detail}}`,createDegraded:`Impossible de publier la PR — {{detail}}. Réessayez une fois le problème résolu.`,createPr:`Créer la PR`,createPrTooltip:`→ {{base}}`,publish:`Publier`,publishTooltip:`Ouvre la PR en brouillon pour la relecture de l'équipe`,discard:`Abandonner`,discardTooltip:`Supprime les branches et renvoie les tickets vers Specs`,retryPr:`Réessayer la PR`,retry:`Réessayer`,checkMerge:`Vérifier le merge`,checkMergeTooltip:`Demande à GitHub si la PR a été fusionnée`,prLinkFallback:`PR`,openPrTitle:`Ouvrir la PR sur GitHub`,notMergedYet:`Pas encore fusionnée`,alreadyResolved:`Déjà résolue ailleurs`,ghFailed:`GitHub CLI a échoué : {{detail}}`,actionFailed:`Impossible d'appliquer la décision de la PR`,mergedToast:`PR fusionnée — tickets passés en Terminé`,discardedToast:`PR abandonnée — tickets renvoyés vers Specs`,decisionPending:`Ce rail a une décision de PR en attente — créez, publiez ou abandonnez-la avant de relancer`,discardConfirmTitle:`Abandonner cette livraison ?`,discardConfirmBody:`Les branches et worktrees du lancement seront supprimés et ses tickets retourneront vers Specs. Cette action est irréversible.`,mergeLocal:`Intégrer en local`,mergeLocalTooltip:`Fusionne les branches livrées dans {{base}} dans votre checkout local (sans GitHub)`,mergeLocalConfirmTitle:`Intégrer en local ?`,mergeLocalConfirmBody:`Les branches livrées seront fusionnées dans {{base}} dans votre checkout local. Votre checkout doit être sur {{base}} avec un arbre de travail propre.`,mergeLocalBlockedDirty:`Impossible d'intégrer : votre arbre de travail sur {{base}} contient des changements non commités. Commitez ou stashez-les, puis réessayez.`,mergeLocalBlockedBranch:`Impossible d'intégrer : votre checkout est sur {{current}}, pas sur {{base}}. Passez sur {{base}}, puis réessayez.`,mergeLocalFailed:`La fusion locale a échoué : {{detail}}`,mergedLocally:`Intégré dans {{base}} en local`},n={title:`Rails`,runningCount_one:`{{count}} en cours`,runningCount_other:`{{count}} en cours`,launchAll:`Tout lancer`,launchAllTitle:`Lance en parallèle tous les rails prêts — chaque exécution est isolée dans son propre worktree git`},r={skipRunning_one:`{{count}} déjà en cours`,skipRunning_other:`{{count}} déjà en cours`,skipEmpty_one:`{{count}} sans specs`,skipEmpty_other:`{{count}} sans specs`,skipPendingDecision_one:`{{count}} en attente d'une décision de PR`,skipPendingDecision_other:`{{count}} en attente d'une décision de PR`,skipOnReview_one:`{{count}} avec des specs en revue`,skipOnReview_other:`{{count}} avec des specs en revue`,skipInFlight_one:`{{count}} ignoré (spec déjà en cours)`,skipInFlight_other:`{{count}} ignorés (specs déjà en cours)`,failedCount_one:`{{count}} en échec`,failedCount_other:`{{count}} en échec`},i={title:`Lancer tous les rails`,railsCount_one:`{{count}} rail`,railsCount_other:`{{count}} rails`,specsCount_one:`{{count}} spec`,specsCount_other:`{{count}} specs`,isolationTitle:`Parallèle et isolé.`,isolationBody:`Chaque rail s'exécute dans son propre worktree git — les lancements simultanés n'entrent jamais en collision.`,pipelinesTitle_one:`{{count}} pipeline IA.`,pipelinesTitle_other:`{{count}} pipelines IA.`,pipelinesBody:`Un lancement par rail, chacun avec son mode, son moteur et son profil configurés.`,costTitle:`Coût multiplié.`,costBody:`Chaque rail génère sa propre exécution IA — la dépense augmente avec le nombre de rails.`,launch_one:`Lancer {{count}} rail`,launch_other:`Lancer {{count}} rails`},a={viewJobLog:`Voir le log du job`,log:`Log`,implement:`Implémenter`,batch:`Batch`,freestyle:`Freestyle`,freestyleTitle:`Freestyle — Claude implémente la spec en autonomie, sans pipeline`,loop:`Loop`,loopTitle:`Loop — exécute une boucle d'automatisation publiée sur les specs du rail`,pickLoop:`Choisir une boucle…`,effortTitle:`Effort de raisonnement`,stop:`Arrêter`,play:`Lancer`,failedRetry:`Job en échec — cliquez pour réessayer`,addSpecsFirst:`Ajoutez d'abord des specs à ce rail`,builtInLoops:`Intégrés`,customLoops:`Loops personnalisés`,worktreesMerged:`{{count}} fusionnés`,worktreesNeedsReview:`{{count}} à vérifier`,execSteps:`{{count}} étapes`,execLines:`{{count}} lignes`,openspec:`OpenSpec`},o={moveToSpecs:`Déplacer vers Specs`,deleteRail:`Supprimer {{label}}`,dropHere:`Déposer ici`,dropOnThisRail:`Déposer sur ce rail`,dragSpecsHere:`Glissez des specs ici`},s={title:`Lancer en mode Freestyle`,context_one:`{{rail}} · {{count}} spec`,context_other:`{{rail}} · {{count}} specs`,noPipelineTitle:`Pas de pipeline OpenSpec.`,noPipelineBody:`Le flux structuré architecte → développeur → reviewer est entièrement ignoré.`,autonomyTitle:`Autonomie native de Claude.`,autonomyBody:`Claude travaille seul avec ses agents natifs et des workflows dynamiques.`,costTitle:`Coût variable.`,costBody:`La dépense dépend de ce que Claude décide de faire — elle peut être plus élevée que prévu.`,continue:`Continuer`},c={fetchFailed:`Échec de la récupération des rails : {{status}}`},l={toasts:e,railPr:t,railsBoard:n,launchAll:r,launchAllDialog:i,railControls:a,railRow:o,freestyleDialog:s,useRails:c};export{l as default,s as freestyleDialog,r as launchAll,i as launchAllDialog,a as railControls,t as railPr,o as railRow,n as railsBoard,e as toasts,c as useRails};
@@ -1 +1 @@
1
- import{u as e}from"./index-DC-REAcL.js";function t(e){if(e!==void 0){if(typeof e==`string`)return e;if(`ok`in e&&`cancel`in e)return{OkCancelCustom:[e.ok,e.cancel]};if(`yes`in e&&`no`in e&&`cancel`in e)return{YesNoCancelCustom:[e.yes,e.no,e.cancel]};if(`ok`in e)return{OkCustom:e.ok}}}async function n(t={}){return typeof t==`object`&&Object.freeze(t),await e(`plugin:dialog|open`,{options:t})}async function r(t={}){return typeof t==`object`&&Object.freeze(t),await e(`plugin:dialog|save`,{options:t})}async function i(n,r){return await e(`plugin:dialog|message`,{message:n,title:r?.title,kind:r?.kind,buttons:t(r?.buttons)})}async function a(e,t){let n=typeof t==`string`?{title:t}:t;return n&&!n.buttons&&n.okLabel&&(n.buttons={ok:n.okLabel}),i(e,n)}async function o(e,t){let n=typeof t==`string`?{title:t}:t,r=n?.okLabel||n?.cancelLabel,a=n?.okLabel??`Yes`;return await i(e,{title:n?.title,kind:n?.kind,buttons:r?{ok:a,cancel:n.cancelLabel??`No`}:`YesNo`})===a}async function s(e,t){let n=typeof t==`string`?{title:t}:t,r=n?.okLabel||n?.cancelLabel,a=n?.okLabel??`Ok`;return await i(e,{title:n?.title,kind:n?.kind,buttons:r?{ok:a,cancel:n.cancelLabel??`Cancel`}:`OkCancel`})===a}export{o as ask,s as confirm,a as message,n as open,r as save};
1
+ import{u as e}from"./index-DnkfABxY.js";function t(e){if(e!==void 0){if(typeof e==`string`)return e;if(`ok`in e&&`cancel`in e)return{OkCancelCustom:[e.ok,e.cancel]};if(`yes`in e&&`no`in e&&`cancel`in e)return{YesNoCancelCustom:[e.yes,e.no,e.cancel]};if(`ok`in e)return{OkCustom:e.ok}}}async function n(t={}){return typeof t==`object`&&Object.freeze(t),await e(`plugin:dialog|open`,{options:t})}async function r(t={}){return typeof t==`object`&&Object.freeze(t),await e(`plugin:dialog|save`,{options:t})}async function i(n,r){return await e(`plugin:dialog|message`,{message:n,title:r?.title,kind:r?.kind,buttons:t(r?.buttons)})}async function a(e,t){let n=typeof t==`string`?{title:t}:t;return n&&!n.buttons&&n.okLabel&&(n.buttons={ok:n.okLabel}),i(e,n)}async function o(e,t){let n=typeof t==`string`?{title:t}:t,r=n?.okLabel||n?.cancelLabel,a=n?.okLabel??`Yes`;return await i(e,{title:n?.title,kind:n?.kind,buttons:r?{ok:a,cancel:n.cancelLabel??`No`}:`YesNo`})===a}async function s(e,t){let n=typeof t==`string`?{title:t}:t,r=n?.okLabel||n?.cancelLabel,a=n?.okLabel??`Ok`;return await i(e,{title:n?.title,kind:n?.kind,buttons:r?{ok:a,cancel:n.cancelLabel??`Cancel`}:`OkCancel`})===a}export{o as ask,s as confirm,a as message,n as open,r as save};
@@ -1 +1 @@
1
- import{l as e,u as t}from"./index-DC-REAcL.js";var n=class{constructor(){this.eventListeners=Object.create(null)}addListener(e,t){return this.on(e,t)}removeListener(e,t){return this.off(e,t)}on(e,t){return e in this.eventListeners?this.eventListeners[e].push(t):this.eventListeners[e]=[t],this}once(e,t){let n=r=>{this.removeListener(e,n),t(r)};return this.addListener(e,n)}off(e,t){return e in this.eventListeners&&(this.eventListeners[e]=this.eventListeners[e].filter(e=>e!==t)),this}removeAllListeners(e){return e?delete this.eventListeners[e]:this.eventListeners=Object.create(null),this}emit(e,t){if(e in this.eventListeners){let n=this.eventListeners[e];for(let e of n)e(t);return!0}return!1}listenerCount(e){return e in this.eventListeners?this.eventListeners[e].length:0}prependListener(e,t){return e in this.eventListeners?this.eventListeners[e].unshift(t):this.eventListeners[e]=[t],this}prependOnceListener(e,t){let n=r=>{this.removeListener(e,n),t(r)};return this.prependListener(e,n)}},r=class{constructor(e){this.pid=e}async write(e){await t(`plugin:shell|stdin_write`,{pid:this.pid,buffer:e})}async kill(){await t(`plugin:shell|kill`,{cmd:`killChild`,pid:this.pid})}},i=class i extends n{constructor(e,t=[],r){super(),this.stdout=new n,this.stderr=new n,this.program=e,this.args=typeof t==`string`?[t]:t,this.options=r??{}}static create(e,t=[],n){return new i(e,t,n)}static sidecar(e,t=[],n){let r=new i(e,t,n);return r.options.sidecar=!0,r}async spawn(){let n=this.program,i=this.args,a=this.options;typeof i==`object`&&Object.freeze(i);let o=new e;return o.onmessage=e=>{switch(e.event){case`Error`:this.emit(`error`,e.payload);break;case`Terminated`:this.emit(`close`,e.payload);break;case`Stdout`:this.stdout.emit(`data`,e.payload);break;case`Stderr`:this.stderr.emit(`data`,e.payload);break}},await t(`plugin:shell|spawn`,{program:n,args:i,options:a,onEvent:o}).then(e=>new r(e))}async execute(){let e=this.program,n=this.args,r=this.options;return typeof n==`object`&&Object.freeze(n),await t(`plugin:shell|execute`,{program:e,args:n,options:r})}};async function a(e,n){await t(`plugin:shell|open`,{path:e,with:n})}export{r as Child,i as Command,n as EventEmitter,a as open};
1
+ import{l as e,u as t}from"./index-DnkfABxY.js";var n=class{constructor(){this.eventListeners=Object.create(null)}addListener(e,t){return this.on(e,t)}removeListener(e,t){return this.off(e,t)}on(e,t){return e in this.eventListeners?this.eventListeners[e].push(t):this.eventListeners[e]=[t],this}once(e,t){let n=r=>{this.removeListener(e,n),t(r)};return this.addListener(e,n)}off(e,t){return e in this.eventListeners&&(this.eventListeners[e]=this.eventListeners[e].filter(e=>e!==t)),this}removeAllListeners(e){return e?delete this.eventListeners[e]:this.eventListeners=Object.create(null),this}emit(e,t){if(e in this.eventListeners){let n=this.eventListeners[e];for(let e of n)e(t);return!0}return!1}listenerCount(e){return e in this.eventListeners?this.eventListeners[e].length:0}prependListener(e,t){return e in this.eventListeners?this.eventListeners[e].unshift(t):this.eventListeners[e]=[t],this}prependOnceListener(e,t){let n=r=>{this.removeListener(e,n),t(r)};return this.prependListener(e,n)}},r=class{constructor(e){this.pid=e}async write(e){await t(`plugin:shell|stdin_write`,{pid:this.pid,buffer:e})}async kill(){await t(`plugin:shell|kill`,{cmd:`killChild`,pid:this.pid})}},i=class i extends n{constructor(e,t=[],r){super(),this.stdout=new n,this.stderr=new n,this.program=e,this.args=typeof t==`string`?[t]:t,this.options=r??{}}static create(e,t=[],n){return new i(e,t,n)}static sidecar(e,t=[],n){let r=new i(e,t,n);return r.options.sidecar=!0,r}async spawn(){let n=this.program,i=this.args,a=this.options;typeof i==`object`&&Object.freeze(i);let o=new e;return o.onmessage=e=>{switch(e.event){case`Error`:this.emit(`error`,e.payload);break;case`Terminated`:this.emit(`close`,e.payload);break;case`Stdout`:this.stdout.emit(`data`,e.payload);break;case`Stderr`:this.stderr.emit(`data`,e.payload);break}},await t(`plugin:shell|spawn`,{program:n,args:i,options:a,onEvent:o}).then(e=>new r(e))}async execute(){let e=this.program,n=this.args,r=this.options;return typeof n==`object`&&Object.freeze(n),await t(`plugin:shell|execute`,{program:e,args:n,options:r})}};async function a(e,n){await t(`plugin:shell|open`,{path:e,with:n})}export{r as Child,i as Command,n as EventEmitter,a as open};