specrails-desktop 2.26.1 → 2.26.2

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 (64) hide show
  1. package/client/dist/assets/{ActivityFeedPage-C1LftFSE.js → ActivityFeedPage-bDe4VitF.js} +1 -1
  2. package/client/dist/assets/{AgentBrowserCapture-B5prW-V0.js → AgentBrowserCapture-DQyeEm2V.js} +1 -1
  3. package/client/dist/assets/{AgentModeCodePane-b6UmdjwB.js → AgentModeCodePane-Ci39DcOo.js} +2 -2
  4. package/client/dist/assets/{AgentModeJobsPane-DW3Wj5oi.js → AgentModeJobsPane-C-g1WNVG.js} +1 -1
  5. package/client/dist/assets/{AgentsPage-DBMnhdlq.js → AgentsPage-BWgglK7V.js} +1 -1
  6. package/client/dist/assets/{AnalyticsPage-DjFf1OxU.js → AnalyticsPage-Da21wWWw.js} +1 -1
  7. package/client/dist/assets/{BarChart-nmDbbUiR.js → BarChart-BiLTq3uC.js} +1 -1
  8. package/client/dist/assets/{CodePage-DHd46Sm7.js → CodePage-BUcAp7SC.js} +1 -1
  9. package/client/dist/assets/{DesktopAnalyticsPage-ee0bpk-F.js → DesktopAnalyticsPage-COkzgMmd.js} +1 -1
  10. package/client/dist/assets/{DocsDialog-CGUzB1zX.js → DocsDialog-PZHMN18B.js} +1 -1
  11. package/client/dist/assets/{DocsPage-96iws84I.js → DocsPage-D3fChfkj.js} +1 -1
  12. package/client/dist/assets/{ExportDropdown-Dzk2Lkxw.js → ExportDropdown-DDhJH-Jr.js} +1 -1
  13. package/client/dist/assets/{IntegrationsPage-Bta2lAhq.js → IntegrationsPage-F87uxxVH.js} +1 -1
  14. package/client/dist/assets/{InteractiveJobComposer-B9S_ZGJS.js → InteractiveJobComposer-DqDCiCa0.js} +1 -1
  15. package/client/dist/assets/{JobDetailModal-DhrwU2z0.js → JobDetailModal-BWJR60fi.js} +1 -1
  16. package/client/dist/assets/{JobDetailPage-BnhoXkql.js → JobDetailPage-CjWE_jyd.js} +1 -1
  17. package/client/dist/assets/{JobsPage-BBT9fyhg.js → JobsPage-LmnXkyCa.js} +1 -1
  18. package/client/dist/assets/{LoopBuilderPage-5ucN9Hq9.js → LoopBuilderPage-DsLLrtHa.js} +1 -1
  19. package/client/dist/assets/{LoopPreviewModal-wKAts-Wf.js → LoopPreviewModal-C-fDEgnu.js} +1 -1
  20. package/client/dist/assets/{LoopsPage-COyxf6Pa.js → LoopsPage-DDNO9h9T.js} +1 -1
  21. package/client/dist/assets/{ProjectSettingsDialog-CcToBI-Z.js → ProjectSettingsDialog-CX854C8e.js} +1 -1
  22. package/client/dist/assets/{TemplatePreviewModal-_Dy6ceXg.js → TemplatePreviewModal-DcHFbLA8.js} +1 -1
  23. package/client/dist/assets/{agent-Cg49-TGZ.js → agent-BI6vr-To.js} +1 -1
  24. package/client/dist/assets/{agent-DgDtg-0Y2.js → agent-BUGXI3Ok2.js} +1 -1
  25. package/client/dist/assets/{agent-DolxzTol.js → agent-Bph_-xt7.js} +1 -1
  26. package/client/dist/assets/{agent-Bxb9RRNW.js → agent-Bvy2Csyd.js} +1 -1
  27. package/client/dist/assets/{agent-gFi-qvxO2.js → agent-Bwkyg2oX2.js} +1 -1
  28. package/client/dist/assets/{agent-_tfCgFUk.js → agent-CLCyDaZh.js} +1 -1
  29. package/client/dist/assets/{agent-DwDR2Exf2.js → agent-Cqs14QMr2.js} +1 -1
  30. package/client/dist/assets/{agent-BmH52J4j.js → agent-DJ0EBUuP.js} +1 -1
  31. package/client/dist/assets/{brain-BJ2Gd98j.js → brain-BBNUUrUI.js} +1 -1
  32. package/client/dist/assets/dashboard-BjjS1OrL.js +1 -0
  33. package/client/dist/assets/dashboard-Bk6oSk1H2.js +1 -0
  34. package/client/dist/assets/dashboard-BrH-GdOg2.js +1 -0
  35. package/client/dist/assets/dashboard-BurhUI8_.js +1 -0
  36. package/client/dist/assets/dashboard-C6w0rICe.js +1 -0
  37. package/client/dist/assets/dashboard-CAUnfDQL2.js +1 -0
  38. package/client/dist/assets/dashboard-C_ljpeYO.js +1 -0
  39. package/client/dist/assets/dashboard-D6OqDdj6.js +1 -0
  40. package/client/dist/assets/{dist-js-CXAsO0Z8.js → dist-js-BxjTIvdT.js} +1 -1
  41. package/client/dist/assets/{dist-js-D7smLA35.js → dist-js-DdP_Gl3p.js} +1 -1
  42. package/client/dist/assets/index-Dw1N2-ci.js +156 -0
  43. package/client/dist/assets/{lib-BIHmUkcn.js → lib-BviHZ_gK.js} +1 -1
  44. package/client/dist/assets/{upload-xdQuJvXN.js → upload-CRuuzzvp.js} +1 -1
  45. package/client/dist/assets/{value-Bk2f9AUg.js → value-CIr5hDMt.js} +1 -1
  46. package/client/dist/index.html +3 -3
  47. package/package.json +1 -1
  48. package/server/dist/mcp/tools/rails.js +2 -0
  49. package/server/dist/pr-publisher.js +17 -15
  50. package/server/dist/project-git.js +57 -0
  51. package/server/dist/rail-isolated-launch.js +22 -2
  52. package/server/dist/rail-pr-decision.js +69 -1
  53. package/server/dist/rail-worktree-release.js +25 -0
  54. package/server/dist/rail-worktrees-store.js +2 -2
  55. package/server/dist/rails-router.js +89 -9
  56. package/client/dist/assets/dashboard-90r0QcUc2.js +0 -1
  57. package/client/dist/assets/dashboard-B0C6mJP-.js +0 -1
  58. package/client/dist/assets/dashboard-BOx0FR1L2.js +0 -1
  59. package/client/dist/assets/dashboard-BcjUOLJr.js +0 -1
  60. package/client/dist/assets/dashboard-C27kNpjn.js +0 -1
  61. package/client/dist/assets/dashboard-DJAj2EbH.js +0 -1
  62. package/client/dist/assets/dashboard-DNd1Gobs.js +0 -1
  63. package/client/dist/assets/dashboard-DZWrDAYm2.js +0 -1
  64. package/client/dist/assets/index-B3ejvKSt.js +0 -156
@@ -0,0 +1 @@
1
+ var e={railAdded:`Rail {{n}} añadido`,railRemoved:`{{rail}} eliminado`,railLimitReached:`Límite de rails alcanzado ({{max}} máx.)`,railDeleteFailed:`No se pudo eliminar el rail — tiene specs, está en ejecución o tiene una decisión de PR pendiente`,launchTicketsInFlight:`Una spec de este rail ya está siendo trabajada por una ejecución activa`,launchAllSummary_one:`{{count}} rail lanzado en paralelo`,launchAllSummary_other:`{{count}} rails lanzados en paralelo`,launchAllNoneEligible:`No hay rails listos para lanzar — asigna specs a un rail libre primero`,launchAllFailed:`No se pudo lanzar ningún rail`,railCompleted:`Rail {{n}} completado`,railFailed:`Rail {{n}} fallido — las specs han vuelto a Specs`,railEnded:`Rail {{n}} {{status}} — las specs han vuelto a Specs`,alreadyOnRail:`Ya está en {{rail}}`,movedToRail:`Movida a {{rail}}`,railRunningStopFirst:`{{rail}} está en ejecución — detenlo antes de eliminarlo`,removedFromRail:`Quitada de {{rail}}`,queuedOnRail:`En cola en {{rail}}`,queuedOnRailDescription:`El rail está en ejecución`,railStopped:`{{rail}} detenido`,stopFailed:`No se pudo detener el rail`,syncTicketsFailed:`No se pudieron sincronizar los tickets del rail`,launchFailed:`No se pudo lanzar el rail`,launchNetworkError:`Error de red al lanzar el rail`,railLaunched:`{{rail}} lanzado`,launchDescription_one:`{{mode}} con {{count}} spec`,launchDescription_other:`{{mode}} con {{count}} specs`,railWorktreeNeedsReview:`Rail {{n}}: la spec #{{ticket}} necesita revisión tras el merge`,railWorktreesNoGit:`Aislamiento por worktrees no disponible: el proyecto no es un repositorio git — ejecutando en modo compartido.`,railWorktreesNoCommits:`Aislamiento por worktrees no disponible: el repositorio aún no tiene commits — haz un commit inicial y relanza.`,railWorktreesError:`La aislación por worktrees falló — este run continúa SIN el flujo de revisión por PR (sin tarjeta de implementación). Mira el detalle del error abajo.`,onReviewCannotMoveToRail:`Esta spec está pendiente de revisión de PR — resuelve primero la decisión de la PR`,onReviewNotLaunchable:`Una spec de este rail está pendiente de revisión de PR — resuelve la decisión de la PR antes de lanzar`},t={readyForReview:`Listo para revisión`,draftPr:`PR en borrador`,branchPushed:`Rama subida — PR pendiente`,branchPushedHint:`La rama se subió pero no se pudo crear la PR (GitHub CLI no disponible). Reintenta para crearla.`,iteratingPr:`Actualizando PR`,prReady:`PR lista`,prFailed:`PR fallida`,prFailedDetail:`PR fallida: {{detail}}`,createDegraded:`No se pudo publicar la PR — {{detail}}. Reintenta cuando esté resuelto.`,createPr:`Crear PR`,createPrTooltip:`→ {{base}}`,publish:`Publicar`,publishTooltip:`Abre la PR en borrador para la revisión del equipo`,checkout:`Checkout`,checkoutTooltip:`Cambia la carpeta principal del proyecto a {{branch}}`,checkoutSuccess:`Checkout en {{branch}}`,checkoutFailed:`No se pudo hacer checkout de la rama de la PR`,discard:`Descartar`,discardTooltip:`Elimina las ramas y devuelve los tickets a Specs`,retryPr:`Reintentar PR`,retry:`Reintentar`,checkMerge:`Comprobar merge`,checkMergeTooltip:`Consulta a GitHub si ya se ha hecho merge de la PR`,prLinkFallback:`PR`,openPrTitle:`Abrir la PR en GitHub`,notMergedYet:`Aún sin merge`,alreadyResolved:`Ya resuelta en otro sitio`,ghFailed:`GitHub CLI falló: {{detail}}`,actionFailed:`No se pudo aplicar la decisión de la PR`,mergedToast:`Merge de la PR completado — los tickets han pasado a Hecho`,discardedToast:`PR descartada — los tickets han vuelto a Specs`,decisionPending:`Este rail tiene una decisión de PR pendiente — créala, publícala o descártala antes de relanzar`,discardConfirmTitle:`¿Descartar esta entrega?`,discardConfirmBody:`Se eliminarán las ramas y worktrees del lanzamiento y sus tickets volverán a Specs. Esta acción no se puede deshacer.`,mergeLocal:`Integrar en local`,mergeLocalTooltip:`Fusiona las ramas entregadas en {{base}} en tu checkout local (sin necesidad de GitHub)`,mergeLocalConfirmTitle:`¿Integrar en local?`,mergeLocalConfirmBody:`Las ramas entregadas se fusionarán en {{base}} en tu checkout local. Tu checkout debe estar en {{base}} con el árbol de trabajo limpio.`,mergeLocalBlockedDirty:`No se puede integrar: tu árbol de trabajo en {{base}} tiene cambios sin commitear. Haz commit o stash y reintenta.`,mergeLocalBlockedBranch:`No se puede integrar: tu checkout está en {{current}}, no en {{base}}. Cambia a {{base}} y reintenta.`,mergeLocalFailed:`La fusión local falló: {{detail}}`,mergedLocally:`Integrado en {{base}} en local`},n={title:`Rails`,runningCount_one:`{{count}} en ejecución`,runningCount_other:`{{count}} en ejecución`,launchAll:`Lanzar todos`,launchAllTitle:`Lanza en paralelo todos los rails listos — cada ejecución se aísla en su propio worktree de git`},r={skipRunning_one:`{{count}} ya en ejecución`,skipRunning_other:`{{count}} ya en ejecución`,skipEmpty_one:`{{count}} sin specs`,skipEmpty_other:`{{count}} sin specs`,skipPendingDecision_one:`{{count}} con decisión de PR pendiente`,skipPendingDecision_other:`{{count}} con decisión de PR pendiente`,skipOnReview_one:`{{count}} con specs en revisión`,skipOnReview_other:`{{count}} con specs en revisión`,skipInFlight_one:`{{count}} omitido (spec ya en curso)`,skipInFlight_other:`{{count}} omitidos (specs ya en curso)`,failedCount_one:`{{count}} fallido`,failedCount_other:`{{count}} fallidos`},i={title:`Lanzar todos los rails`,railsCount_one:`{{count}} rail`,railsCount_other:`{{count}} rails`,specsCount_one:`{{count}} spec`,specsCount_other:`{{count}} specs`,isolationTitle:`Paralelo y aislado.`,isolationBody:`Cada rail se ejecuta en su propio worktree de git — los lanzamientos simultáneos nunca colisionan.`,pipelinesTitle_one:`{{count}} pipeline de IA.`,pipelinesTitle_other:`{{count}} pipelines de IA.`,pipelinesBody:`Un lanzamiento por rail, cada uno con su modo, motor y perfil configurados.`,costTitle:`Coste multiplicado.`,costBody:`Cada rail genera su propia ejecución de IA — el gasto escala con el número de rails.`,launch_one:`Lanzar {{count}} rail`,launch_other:`Lanzar {{count}} rails`},a={viewJobLog:`Ver log del job`,log:`Log`,implement:`Implement`,batch:`Batch`,freestyle:`Freestyle`,freestyleTitle:`Freestyle — Claude implementa la spec de forma autónoma, sin pipeline`,loop:`Loop`,loopTitle:`Loop — ejecuta un bucle de automatización publicado sobre las specs del rail`,pickLoop:`Elige un bucle…`,effortTitle:`Esfuerzo de razonamiento`,stop:`Detener`,play:`Iniciar`,failedRetry:`El job ha fallado — haz clic para reintentar`,addSpecsFirst:`Añade primero specs a este rail`,builtInLoops:`Integrados`,customLoops:`Loops personalizados`,worktreesMerged:`{{count}} fusionados`,worktreesNeedsReview:`{{count}} a revisar`,execSteps:`{{count}} pasos`,execLines:`{{count}} líneas`,openspec:`OpenSpec`},o={moveToSpecs:`Mover a Specs`,deleteRail:`Eliminar {{label}}`,dropHere:`Suelta aquí`,dropOnThisRail:`Suelta en este rail`,dragSpecsHere:`Arrastra specs aquí`},s={title:`Lanzar en modo Freestyle`,context_one:`{{rail}} · {{count}} spec`,context_other:`{{rail}} · {{count}} specs`,noPipelineTitle:`Sin pipeline de OpenSpec.`,noPipelineBody:`El flujo estructurado architect → developer → reviewer se omite por completo.`,autonomyTitle:`Autonomía nativa de Claude.`,autonomyBody:`Claude trabaja por su cuenta con agentes nativos y flujos dinámicos.`,costTitle:`Coste variable.`,costBody:`El gasto depende de lo que Claude decida hacer — puede ser mayor de lo esperado.`,continue:`Continuar`},c={fetchFailed:`No se pudieron obtener los 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};
@@ -0,0 +1 @@
1
+ var e={railAdded:`Rail {{n}} hinzugefügt`,railRemoved:`{{rail}} entfernt`,railLimitReached:`Rail-Limit erreicht (max. {{max}})`,railDeleteFailed:`Rail konnte nicht entfernt werden – es enthält Specs, läuft gerade oder hat eine ausstehende PR-Entscheidung`,launchTicketsInFlight:`Eine Spec dieses Rails wird bereits von einem aktiven Lauf bearbeitet`,launchAllSummary_one:`{{count}} Rail parallel gestartet`,launchAllSummary_other:`{{count}} Rails parallel gestartet`,launchAllNoneEligible:`Keine Rails startbereit – weise zuerst Specs einem freien Rail zu`,launchAllFailed:`Es konnte kein Rail gestartet werden`,railCompleted:`Rail {{n}} abgeschlossen`,railFailed:`Rail {{n}} fehlgeschlagen – Specs zurück in Specs`,railEnded:`Rail {{n}} {{status}} – Specs zurück in Specs`,alreadyOnRail:`Bereits auf {{rail}}`,movedToRail:`Auf {{rail}} verschoben`,railRunningStopFirst:`{{rail}} läuft – vor dem Entfernen stoppen`,removedFromRail:`Von {{rail}} entfernt`,queuedOnRail:`Auf {{rail}} eingereiht`,queuedOnRailDescription:`Rail läuft gerade`,railStopped:`{{rail}} gestoppt`,stopFailed:`Rail konnte nicht gestoppt werden`,syncTicketsFailed:`Rail-Tickets konnten nicht synchronisiert werden`,launchFailed:`Rail konnte nicht gestartet werden`,launchNetworkError:`Netzwerkfehler beim Starten des Rails`,railLaunched:`{{rail}} gestartet`,launchDescription_one:`{{mode}} mit {{count}} Spec`,launchDescription_other:`{{mode}} mit {{count}} Specs`,railWorktreeNeedsReview:`Rail {{n}}: Spec #{{ticket}} muss nach dem Merge geprüft werden`,railWorktreesNoGit:`Worktree-Isolation nicht verfügbar: Dieses Projekt ist kein Git-Repository — Ausführung im gemeinsamen Modus.`,railWorktreesNoCommits:`Worktree-Isolation nicht verfügbar: Das Repository hat noch keine Commits — erstelle einen ersten Commit und starte neu.`,railWorktreesError:`Worktree-Isolation fehlgeschlagen — dieser Lauf läuft OHNE den PR-Review-Flow weiter (keine Implementierungskarte). Siehe Fehlerdetail unten.`,onReviewCannotMoveToRail:`Diese Spec wartet auf die PR-Prüfung — löse zuerst die PR-Entscheidung`,onReviewNotLaunchable:`Eine Spec auf diesem Rail wartet auf die PR-Prüfung — löse die PR-Entscheidung vor dem Start`},t={readyForReview:`Bereit zur Prüfung`,draftPr:`Entwurfs-PR`,branchPushed:`Branch gepusht — PR ausstehend`,branchPushedHint:`Der Branch wurde gepusht, aber die PR konnte nicht erstellt werden (GitHub CLI nicht verfügbar). Erneut versuchen, um sie zu erstellen.`,iteratingPr:`PR wird aktualisiert`,prReady:`PR bereit`,prFailed:`PR fehlgeschlagen`,prFailedDetail:`PR fehlgeschlagen: {{detail}}`,createDegraded:`PR konnte nicht veröffentlicht werden — {{detail}}. Nach Behebung erneut versuchen.`,createPr:`PR erstellen`,createPrTooltip:`→ {{base}}`,publish:`Veröffentlichen`,publishTooltip:`Öffnet den Entwurfs-PR für das Review des Teams`,checkout:`Checkout`,checkoutTooltip:`Den Hauptordner des Projekts auf {{branch}} auschecken`,checkoutSuccess:`{{branch}} ausgecheckt`,checkoutFailed:`PR-Branch konnte nicht ausgecheckt werden`,discard:`Verwerfen`,discardTooltip:`Verwirft die Branches und schickt die Tickets zurück zu Specs`,retryPr:`PR erneut versuchen`,retry:`Erneut versuchen`,checkMerge:`Merge prüfen`,checkMergeTooltip:`Bei GitHub nachfragen, ob die PR gemergt wurde`,prLinkFallback:`PR`,openPrTitle:`PR auf GitHub öffnen`,notMergedYet:`Noch nicht gemergt`,alreadyResolved:`Bereits anderweitig erledigt`,ghFailed:`GitHub CLI fehlgeschlagen: {{detail}}`,actionFailed:`PR-Entscheidung konnte nicht angewendet werden`,mergedToast:`PR gemergt — Tickets nach Fertig verschoben`,discardedToast:`PR verworfen — Tickets zurück in Specs`,decisionPending:`Dieser Rail hat eine ausstehende PR-Entscheidung — erstelle, veröffentliche oder verwirf sie, bevor du neu startest`,discardConfirmTitle:`Diese Lieferung verwerfen?`,discardConfirmBody:`Die Branches und Worktrees des Launches werden verworfen und die Tickets kehren zurück zu Specs. Das kann nicht rückgängig gemacht werden.`,mergeLocal:`Lokal integrieren`,mergeLocalTooltip:`Führt die gelieferten Branches lokal in {{base}} zusammen (ohne GitHub)`,mergeLocalConfirmTitle:`Lokal integrieren?`,mergeLocalConfirmBody:`Die gelieferten Branches werden lokal in {{base}} zusammengeführt. Dein Checkout muss auf {{base}} stehen und sauber sein.`,mergeLocalBlockedDirty:`Integration nicht möglich: dein Arbeitsverzeichnis auf {{base}} hat uncommittete Änderungen. Committe oder stashe sie und versuche es erneut.`,mergeLocalBlockedBranch:`Integration nicht möglich: dein Checkout steht auf {{current}}, nicht auf {{base}}. Wechsle zu {{base}} und versuche es erneut.`,mergeLocalFailed:`Lokaler Merge fehlgeschlagen: {{detail}}`,mergedLocally:`Lokal in {{base}} integriert`},n={title:`Rails`,runningCount_one:`{{count}} läuft`,runningCount_other:`{{count}} laufen`,launchAll:`Alle starten`,launchAllTitle:`Startet alle startbereiten Rails parallel – jeder Lauf ist in seinem eigenen Git-Worktree isoliert`},r={skipRunning_one:`{{count}} läuft bereits`,skipRunning_other:`{{count}} laufen bereits`,skipEmpty_one:`{{count}} ohne Specs`,skipEmpty_other:`{{count}} ohne Specs`,skipPendingDecision_one:`{{count}} wartet auf eine PR-Entscheidung`,skipPendingDecision_other:`{{count}} warten auf eine PR-Entscheidung`,skipOnReview_one:`{{count}} mit Specs im Review`,skipOnReview_other:`{{count}} mit Specs im Review`,skipInFlight_one:`{{count}} übersprungen (Spec bereits in Arbeit)`,skipInFlight_other:`{{count}} übersprungen (Specs bereits in Arbeit)`,failedCount_one:`{{count}} fehlgeschlagen`,failedCount_other:`{{count}} fehlgeschlagen`},i={title:`Alle Rails starten`,railsCount_one:`{{count}} Rail`,railsCount_other:`{{count}} Rails`,specsCount_one:`{{count}} Spec`,specsCount_other:`{{count}} Specs`,isolationTitle:`Parallel und isoliert.`,isolationBody:`Jedes Rail läuft in seinem eigenen Git-Worktree – gleichzeitige Starts kollidieren nie.`,pipelinesTitle_one:`{{count}} KI-Pipeline.`,pipelinesTitle_other:`{{count}} KI-Pipelines.`,pipelinesBody:`Ein Start pro Rail, jeweils mit dem konfigurierten Modus, Engine und Profil.`,costTitle:`Vervielfachte Kosten.`,costBody:`Jedes Rail erzeugt seinen eigenen KI-Lauf – die Ausgaben skalieren mit der Anzahl der Rails.`,launch_one:`{{count}} Rail starten`,launch_other:`{{count}} Rails starten`},a={viewJobLog:`Job-Log anzeigen`,log:`Log`,implement:`Implement`,batch:`Batch`,freestyle:`Freestyle`,freestyleTitle:`Freestyle – Claude implementiert die Spec autonom, ohne Pipeline`,loop:`Loop`,loopTitle:`Loop – eine veröffentlichte Automatisierungsschleife gegen die Specs des Rails ausführen`,pickLoop:`Schleife auswählen…`,effortTitle:`Denkaufwand`,stop:`Stopp`,play:`Start`,failedRetry:`Job fehlgeschlagen – zum Wiederholen klicken`,addSpecsFirst:`Füge zuerst Specs zu diesem Rail hinzu`,builtInLoops:`Integriert`,customLoops:`Eigene Loops`,worktreesMerged:`{{count}} zusammengeführt`,worktreesNeedsReview:`{{count}} zu prüfen`,execSteps:`{{count}} Schritte`,execLines:`{{count}} Zeilen`,openspec:`OpenSpec`},o={moveToSpecs:`Nach Specs verschieben`,deleteRail:`{{label}} löschen`,dropHere:`Hier ablegen`,dropOnThisRail:`Auf diesem Rail ablegen`,dragSpecsHere:`Specs hierher ziehen`},s={title:`Im Freestyle-Modus starten`,context_one:`{{rail}} · {{count}} Spec`,context_other:`{{rail}} · {{count}} Specs`,noPipelineTitle:`Keine OpenSpec-Pipeline.`,noPipelineBody:`Der strukturierte Flow Architect → Developer → Reviewer wird komplett übersprungen.`,autonomyTitle:`Native Claude-Autonomie.`,autonomyBody:`Claude arbeitet eigenständig mit nativen Agenten und dynamischen Workflows.`,costTitle:`Variable Kosten.`,costBody:`Die Ausgaben hängen davon ab, was Claude entscheidet – sie können höher ausfallen als erwartet.`,continue:`Weiter`},c={fetchFailed:`Rails konnten nicht geladen werden: {{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};
@@ -0,0 +1 @@
1
+ var e={railAdded:`Rail {{n}} adicionado`,railRemoved:`{{rail}} removido`,railLimitReached:`Limite de rails atingido ({{max}} máx.)`,railDeleteFailed:`Não foi possível remover o rail — ele contém specs, está em execução ou tem uma decisão de PR pendente`,launchTicketsInFlight:`Uma spec deste rail já está sendo trabalhada por uma execução ativa`,launchAllSummary_one:`{{count}} rail lançado em paralelo`,launchAllSummary_other:`{{count}} rails lançados em paralelo`,launchAllNoneEligible:`Nenhum rail pronto para lançar — atribua specs a um rail livre primeiro`,launchAllFailed:`Nenhum rail pôde ser lançado`,railCompleted:`Rail {{n}} concluído`,railFailed:`Rail {{n}} falhou — specs devolvidas a Specs`,railEnded:`Rail {{n}} {{status}} — specs devolvidas a Specs`,alreadyOnRail:`Já está em {{rail}}`,movedToRail:`Movido para {{rail}}`,railRunningStopFirst:`{{rail}} está em execução — pare-o antes de remover`,removedFromRail:`Removido de {{rail}}`,queuedOnRail:`Em fila em {{rail}}`,queuedOnRailDescription:`O rail está atualmente em execução`,railStopped:`{{rail}} parado`,stopFailed:`Falha ao parar o rail`,syncTicketsFailed:`Falha ao sincronizar os tickets do rail`,launchFailed:`Falha ao lançar o rail`,launchNetworkError:`Erro de rede ao lançar o rail`,railLaunched:`{{rail}} lançado`,launchDescription_one:`{{mode}} com {{count}} spec`,launchDescription_other:`{{mode}} com {{count}} specs`,railWorktreeNeedsReview:`Rail {{n}}: a spec #{{ticket}} precisa de revisão após o merge`,railWorktreesNoGit:`Isolamento por worktree indisponível: este projeto não é um repositório git — executando em modo compartilhado.`,railWorktreesNoCommits:`Isolamento por worktree indisponível: o repositório ainda não tem commits — faça um commit inicial e relance.`,railWorktreesError:`O isolamento por worktrees falhou — esta execução continua SEM o fluxo de revisão por PR (sem cartão de implementação). Veja o detalhe do erro abaixo.`,onReviewCannotMoveToRail:`Esta spec aguarda revisão da PR — resolva primeiro a decisão da PR`,onReviewNotLaunchable:`Uma spec deste rail aguarda revisão da PR — resolva a decisão da PR antes de lançar`},t={readyForReview:`Pronto para revisão`,draftPr:`PR em rascunho`,branchPushed:`Ramo enviado — PR pendente`,branchPushedHint:`O ramo foi enviado mas não foi possível criar a PR (GitHub CLI indisponível). Tente novamente para a criar.`,iteratingPr:`A atualizar PR`,prReady:`PR pronta`,prFailed:`PR falhou`,prFailedDetail:`PR falhou: {{detail}}`,createDegraded:`Não foi possível publicar a PR — {{detail}}. Tente novamente quando estiver resolvido.`,createPr:`Criar PR`,createPrTooltip:`→ {{base}}`,publish:`Publicar`,publishTooltip:`Abre a PR em rascunho para a revisão da equipa`,checkout:`Checkout`,checkoutTooltip:`Fazer checkout de {{branch}} na pasta principal do projeto`,checkoutSuccess:`Checkout feito em {{branch}}`,checkoutFailed:`Não foi possível fazer checkout do ramo da PR`,discard:`Descartar`,discardTooltip:`Elimina os ramos e devolve os tickets a Specs`,retryPr:`Tentar PR novamente`,retry:`Tentar novamente`,checkMerge:`Verificar merge`,checkMergeTooltip:`Pergunta ao GitHub se já foi feito merge da PR`,prLinkFallback:`PR`,openPrTitle:`Abrir a PR no GitHub`,notMergedYet:`Ainda sem merge`,alreadyResolved:`Já resolvida noutro lugar`,ghFailed:`GitHub CLI falhou: {{detail}}`,actionFailed:`Não foi possível aplicar a decisão da PR`,mergedToast:`Merge da PR concluído — tickets movidos para Concluído`,discardedToast:`PR descartada — tickets devolvidos a Specs`,decisionPending:`Este rail tem uma decisão de PR pendente — crie, publique ou descarte-a antes de relançar`,discardConfirmTitle:`Descartar esta entrega?`,discardConfirmBody:`Os ramos e worktrees do lançamento serão eliminados e os seus tickets voltarão a Specs. Esta ação não pode ser anulada.`,mergeLocal:`Integrar localmente`,mergeLocalTooltip:`Faz merge dos branches entregues em {{base}} no seu checkout local (sem GitHub)`,mergeLocalConfirmTitle:`Integrar localmente?`,mergeLocalConfirmBody:`Os branches entregues serão mesclados em {{base}} no seu checkout local. Seu checkout deve estar em {{base}} com a árvore de trabalho limpa.`,mergeLocalBlockedDirty:`Não é possível integrar: sua árvore de trabalho em {{base}} tem mudanças sem commit. Faça commit ou stash e tente de novo.`,mergeLocalBlockedBranch:`Não é possível integrar: seu checkout está em {{current}}, não em {{base}}. Mude para {{base}} e tente de novo.`,mergeLocalFailed:`O merge local falhou: {{detail}}`,mergedLocally:`Integrado em {{base}} localmente`},n={title:`Rails`,runningCount_one:`{{count}} em execução`,runningCount_other:`{{count}} em execução`,launchAll:`Lançar todos`,launchAllTitle:`Lança em paralelo todos os rails prontos — cada execução é isolada em seu próprio worktree do git`},r={skipRunning_one:`{{count}} já em execução`,skipRunning_other:`{{count}} já em execução`,skipEmpty_one:`{{count}} sem specs`,skipEmpty_other:`{{count}} sem specs`,skipPendingDecision_one:`{{count}} aguardando uma decisão de PR`,skipPendingDecision_other:`{{count}} aguardando uma decisão de PR`,skipOnReview_one:`{{count}} com specs em revisão`,skipOnReview_other:`{{count}} com specs em revisão`,skipInFlight_one:`{{count}} ignorado (spec já em andamento)`,skipInFlight_other:`{{count}} ignorados (specs já em andamento)`,failedCount_one:`{{count}} falhou`,failedCount_other:`{{count}} falharam`},i={title:`Lançar todos os rails`,railsCount_one:`{{count}} rail`,railsCount_other:`{{count}} rails`,specsCount_one:`{{count}} spec`,specsCount_other:`{{count}} specs`,isolationTitle:`Paralelo e isolado.`,isolationBody:`Cada rail roda em seu próprio worktree do git — lançamentos simultâneos nunca colidem.`,pipelinesTitle_one:`{{count}} pipeline de IA.`,pipelinesTitle_other:`{{count}} pipelines de IA.`,pipelinesBody:`Um lançamento por rail, cada um com seu modo, motor e perfil configurados.`,costTitle:`Custo multiplicado.`,costBody:`Cada rail gera sua própria execução de IA — o gasto escala com o número de rails.`,launch_one:`Lançar {{count}} rail`,launch_other:`Lançar {{count}} rails`},a={viewJobLog:`Ver log do job`,log:`Log`,implement:`Implementar`,batch:`Batch`,freestyle:`Freestyle`,freestyleTitle:`Freestyle — o Claude implementa a spec de forma autónoma, sem pipeline`,loop:`Loop`,loopTitle:`Loop — execute um loop de automação publicado nas specs do rail`,pickLoop:`Escolha um loop…`,effortTitle:`Esforço de raciocínio`,stop:`Parar`,play:`Iniciar`,failedRetry:`O job falhou — clique para repetir`,addSpecsFirst:`Adicione primeiro specs a este rail`,builtInLoops:`Integrados`,customLoops:`Loops personalizados`,worktreesMerged:`{{count}} mesclados`,worktreesNeedsReview:`{{count}} para revisar`,execSteps:`{{count}} passos`,execLines:`{{count}} linhas`,openspec:`OpenSpec`},o={moveToSpecs:`Mover para Specs`,deleteRail:`Eliminar {{label}}`,dropHere:`Largar aqui`,dropOnThisRail:`Largar neste rail`,dragSpecsHere:`Arraste specs para aqui`},s={title:`Lançar em modo Freestyle`,context_one:`{{rail}} · {{count}} spec`,context_other:`{{rail}} · {{count}} specs`,noPipelineTitle:`Sem pipeline OpenSpec.`,noPipelineBody:`O fluxo estruturado architect → developer → reviewer é totalmente ignorado.`,autonomyTitle:`Autonomia nativa do Claude.`,autonomyBody:`O Claude trabalha por conta própria com agentes nativos e workflows dinâmicos.`,costTitle:`Custo variável.`,costBody:`O gasto depende do que o Claude decidir fazer — pode ser superior ao esperado.`,continue:`Continuar`},c={fetchFailed:`Falha ao obter os 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{l as e,u as t}from"./index-B3ejvKSt.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-Dw1N2-ci.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 +1 @@
1
- import{u as e}from"./index-B3ejvKSt.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-Dw1N2-ci.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};