@loicngr/kobo 1.11.30 → 1.11.31

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 (105) hide show
  1. package/AGENTS.md +6 -1
  2. package/CHANGELOG.md +4 -0
  3. package/package.json +1 -1
  4. package/src/client/dist/pwa/assets/ActivityFeed-BCol76S5.js +8 -0
  5. package/src/client/dist/pwa/assets/{ActivityFeed-C6XSxdJ0.css → ActivityFeed-Bakgvay6.css} +1 -1
  6. package/src/client/dist/pwa/assets/ChangelogPage-DKJkFiU_.css +1 -0
  7. package/src/client/dist/pwa/assets/ChangelogPage-DoMrJJ63.js +1 -0
  8. package/src/client/dist/pwa/assets/{ClosePopup-CvV-0nzX.js → ClosePopup-BCS9Zmcz.js} +1 -1
  9. package/src/client/dist/pwa/assets/{ComparisonPanel-BmUrmK4m.js → ComparisonPanel-CxxMJ1J0.js} +2 -2
  10. package/src/client/dist/pwa/assets/CreatePage-50kxfzEj.js +2 -0
  11. package/src/client/dist/pwa/assets/CreatePage-DZ13xLQW.css +1 -0
  12. package/src/client/dist/pwa/assets/DashboardPage-DsWn5cWl.css +1 -0
  13. package/src/client/dist/pwa/assets/DashboardPage-NYpPmHOn.js +1 -0
  14. package/src/client/dist/pwa/assets/{DiffViewer-aMjhTpVF.js → DiffViewer-CUNiYtb6.js} +4 -4
  15. package/src/client/dist/pwa/assets/DocumentsPanel-ezV8L7at.js +1 -0
  16. package/src/client/dist/pwa/assets/DrawerToggleButton-DjG7OouG.js +1 -0
  17. package/src/client/dist/pwa/assets/GitPanel-CybZSVa0.js +3 -0
  18. package/src/client/dist/pwa/assets/{GitPanel-DVs5BCU-.css → GitPanel-DhjMYZMq.css} +1 -1
  19. package/src/client/dist/pwa/assets/HealthPage-CFZ-tdKK.css +1 -0
  20. package/src/client/dist/pwa/assets/HealthPage-ClDddgmP.js +1 -0
  21. package/src/client/dist/pwa/assets/{MainLayout-DxYQV-Ni.css → MainLayout-BUTz2ks4.css} +1 -1
  22. package/src/client/dist/pwa/assets/MainLayout-flztOHf_.js +2 -0
  23. package/src/client/dist/pwa/assets/{QBtnDropdown-pyNCwmSZ.js → QBtnDropdown-BEnM7WGO.js} +1 -1
  24. package/src/client/dist/pwa/assets/QDrawer-Bn8KqLJR.js +1 -0
  25. package/src/client/dist/pwa/assets/SchedulePanel-BcbLXsgt.js +1 -0
  26. package/src/client/dist/pwa/assets/SearchPage-B2TBhpc7.js +1 -0
  27. package/src/client/dist/pwa/assets/SearchPage-CVgRa025.css +1 -0
  28. package/src/client/dist/pwa/assets/{SettingsPage-DHFMKY_1.css → SettingsPage-CDA54yPx.css} +1 -1
  29. package/src/client/dist/pwa/assets/SettingsPage-CEeU5wHr.js +10 -0
  30. package/src/client/dist/pwa/assets/{TerminalPanel-Dv_1sNtU.js → TerminalPanel-CUbhouGK.js} +10 -10
  31. package/src/client/dist/pwa/assets/TouchPan-DTG8xcJW.js +1 -0
  32. package/src/client/dist/pwa/assets/TourReplayButton-CdLG2sf6.js +1 -0
  33. package/src/client/dist/pwa/assets/WorkspaceAttentionLabels-DKEErIht.js +1 -0
  34. package/src/client/dist/pwa/assets/WorkspacePage-CDpYwmH9.js +4 -0
  35. package/src/client/dist/pwa/assets/{WorkspacePage-3rwxkeew.css → WorkspacePage-D3-AEaPN.css} +1 -1
  36. package/src/client/dist/pwa/assets/{build-path-tree-Cx5bCcQs.js → build-path-tree-D-NmwzvG.js} +1 -1
  37. package/src/client/dist/pwa/assets/{de-BUPxnXau.js → de-s-OCM5GV.js} +1 -1
  38. package/src/client/dist/pwa/assets/{documents-CN6TlZH7.js → documents-CHf7b-Vo.js} +1 -1
  39. package/src/client/dist/pwa/assets/{editor.api-vup96nzB.js → editor.api-CnC2GWxt.js} +1 -1
  40. package/src/client/dist/pwa/assets/{efforts-BcV6XR1p.js → efforts-DZpgeo-z.js} +1 -1
  41. package/src/client/dist/pwa/assets/engineFeatures-CAVTTYFB.js +1 -0
  42. package/src/client/dist/pwa/assets/{es-DMnEKZ17.js → es-Db2oG1GY.js} +1 -1
  43. package/src/client/dist/pwa/assets/expand-template-Df6JeLIj.js +1 -0
  44. package/src/client/dist/pwa/assets/{format-DSh3Ghaw.js → format-Ub88nHdg.js} +1 -1
  45. package/src/client/dist/pwa/assets/{fr-BTolHkCj.js → fr-u2YnnwUr.js} +1 -1
  46. package/src/client/dist/pwa/assets/{freemarker2-BdMCo-ui.js → freemarker2-6Bw8swVv.js} +1 -1
  47. package/src/client/dist/pwa/assets/{handlebars-CVUpmZRG.js → handlebars-CXP7UvsN.js} +1 -1
  48. package/src/client/dist/pwa/assets/{html-B9nx87id.js → html-CiH7-LQ8.js} +1 -1
  49. package/src/client/dist/pwa/assets/{i18n-B_ietr0X.js → i18n-CINLKqOi.js} +1 -1
  50. package/src/client/dist/pwa/assets/index-CVfEYP1z.js +18 -0
  51. package/src/client/dist/pwa/assets/{it-BPFSv6Pp.js → it-BormzXPk.js} +1 -1
  52. package/src/client/dist/pwa/assets/{javascript-B0F3ZRYP.js → javascript-aN8WMuyC.js} +1 -1
  53. package/src/client/dist/pwa/assets/{liquid-C2jkK9Te.js → liquid-E1ySUvbU.js} +1 -1
  54. package/src/client/dist/pwa/assets/{mdx-B9CyGsGZ.js → mdx-BZOOfxw4.js} +1 -1
  55. package/src/client/dist/pwa/assets/{monaco-contributions-BZH2_u8S.js → monaco-contributions-DAArJoqj.js} +1 -1
  56. package/src/client/dist/pwa/assets/monaco.contribution-BqMfO6zF.js +2 -0
  57. package/src/client/dist/pwa/assets/{network-auth-CXNehcyv.js → network-auth-CgMRbbZI.js} +1 -1
  58. package/src/client/dist/pwa/assets/{notify-theme-DzIPRvEu.js → notify-theme-DDdNd09b.js} +1 -1
  59. package/src/client/dist/pwa/assets/pending-diff-open-2y1wCUC0.js +1 -0
  60. package/src/client/dist/pwa/assets/permissionModes-BKhOcXIS.js +36 -0
  61. package/src/client/dist/pwa/assets/{project-color-D8UVi4-G.js → project-color-DGnqx7Qm.js} +1 -1
  62. package/src/client/dist/pwa/assets/{python-D6494OxU.js → python-DLPkE6OM.js} +1 -1
  63. package/src/client/dist/pwa/assets/{razor-uuwEcrBe.js → razor-Co08h7m7.js} +1 -1
  64. package/src/client/dist/pwa/assets/{render-chat-markdown-BTcSOgEc.js → render-chat-markdown-BtqSDXpK.js} +1 -1
  65. package/src/client/dist/pwa/assets/{typescript-umL7JrOg.js → typescript-Cr3657Zk.js} +1 -1
  66. package/src/client/dist/pwa/assets/use-is-mobile-B-DI_sOv.js +1 -0
  67. package/src/client/dist/pwa/assets/use-tours-DoXhHOdJ.js +2 -0
  68. package/src/client/dist/pwa/assets/{workspace-templates-CkKJmfTo.js → workspace-templates-DAalrm3k.js} +1 -1
  69. package/src/client/dist/pwa/assets/{xml-Nu9IP_9Z.js → xml-i8zBw4bC.js} +1 -1
  70. package/src/client/dist/pwa/assets/{yaml-D_Py0JsF.js → yaml-Cc6X0dyF.js} +1 -1
  71. package/src/client/dist/pwa/index.html +1 -2
  72. package/src/client/dist/pwa/sw.js +1 -1
  73. package/src/client/dist/pwa/assets/ActivityFeed-Cx1rS3ci.js +0 -8
  74. package/src/client/dist/pwa/assets/ChangelogPage-2OaGEKe9.js +0 -1
  75. package/src/client/dist/pwa/assets/ChangelogPage-D_WOVByV.css +0 -1
  76. package/src/client/dist/pwa/assets/CreatePage-C0uUaDXT.css +0 -1
  77. package/src/client/dist/pwa/assets/CreatePage-Hp3O5al9.js +0 -2
  78. package/src/client/dist/pwa/assets/DashboardPage-BqgK4lAf.css +0 -1
  79. package/src/client/dist/pwa/assets/DashboardPage-Mgx1FG2b.js +0 -1
  80. package/src/client/dist/pwa/assets/DocumentsPanel-Cdr5b21_.js +0 -1
  81. package/src/client/dist/pwa/assets/DrawerToggleButton-VEVxQ39S.js +0 -1
  82. package/src/client/dist/pwa/assets/GitPanel-DUJ15ikk.js +0 -3
  83. package/src/client/dist/pwa/assets/HealthPage-BbqLoFQj.css +0 -1
  84. package/src/client/dist/pwa/assets/HealthPage-v_jKOByf.js +0 -1
  85. package/src/client/dist/pwa/assets/MainLayout-jRXQQzPm.js +0 -2
  86. package/src/client/dist/pwa/assets/QPage-RpDxx5ah.js +0 -1
  87. package/src/client/dist/pwa/assets/QSpace-D3PNLwa4.js +0 -1
  88. package/src/client/dist/pwa/assets/SchedulePanel-DBc1j1k3.js +0 -1
  89. package/src/client/dist/pwa/assets/SearchPage-CWca6d5o.js +0 -1
  90. package/src/client/dist/pwa/assets/SearchPage-DdWM01rq.css +0 -1
  91. package/src/client/dist/pwa/assets/SettingsPage-qKa3e6W-.js +0 -10
  92. package/src/client/dist/pwa/assets/TouchPan-DPBRkGyO.js +0 -1
  93. package/src/client/dist/pwa/assets/WorkspaceAttentionLabels-CevQAXwk.js +0 -1
  94. package/src/client/dist/pwa/assets/WorkspacePage-CEwILZ6V.js +0 -4
  95. package/src/client/dist/pwa/assets/debounce-CDIE7CV6.js +0 -1
  96. package/src/client/dist/pwa/assets/engineFeatures-D9IQa3bt.js +0 -1
  97. package/src/client/dist/pwa/assets/expand-template-Cxl3iYaV.js +0 -1
  98. package/src/client/dist/pwa/assets/index-BePGTdV0.js +0 -18
  99. package/src/client/dist/pwa/assets/layout-DE4C3CX3.js +0 -1
  100. package/src/client/dist/pwa/assets/monaco.contribution--NRhv52L.js +0 -2
  101. package/src/client/dist/pwa/assets/pending-diff-open-DoKaz8uO.js +0 -1
  102. package/src/client/dist/pwa/assets/permissionModes-D58HKBN0.js +0 -36
  103. package/src/client/dist/pwa/assets/use-onboarding-BE2bb17E.js +0 -2
  104. package/src/client/dist/pwa/assets/use-quasar-0nZoDKhp.js +0 -1
  105. /package/src/client/dist/pwa/assets/{use-onboarding-CTZuBZOi.css → use-tours-CTZuBZOi.css} +0 -0
@@ -8,7 +8,7 @@ KOBO_WORKSPACE_ID — id Kōbō del workspace (estable tras renombrar)
8
8
  KOBO_WORKSPACE_NAME — nombre visible del workspace
9
9
  KOBO_FORGE — forge resuelta: github / gitlab / none
10
10
  KOBO_PR_NUMBER — número de PR/MR en la forge resuelta (vacío si no hay ninguna abierta)`,"settings.changeSourceBranchScript.placeholder":`#!/usr/bin/env bash
11
- # tu script — usa $KOBO_NEW_BASE / $KOBO_OLD_BASE / $KOBO_WORKING_BRANCH …`,"settings.changeSourceBranchScript.resetDefault":`Restablecer al predeterminado de Kōbō`,"settings.changeSourceBranchScript.replaceConfirmTitle":`¿Restablecer el script?`,"settings.changeSourceBranchScript.replaceConfirm":`Tus modificaciones se reemplazarán por el script predeterminado de Kōbō. ¿Continuar?`,"settings.cleanupScriptHint":`Script de shell ejecutado en el worktree después de cada sesión del agente. En modo auto-loop solo se ejecuta cuando todas las tareas están terminadas. Dejar vacío para desactivar.`,"settings.cleanupScriptPlaceholder":`p. ej. eliminar archivos temporales, detener contenedores…`,"settings.cleanupScriptMode":`Cuándo ejecutar`,"settings.cleanupScriptMode.idle":`Después de cada sesión — aunque queden tareas`,"settings.cleanupScriptMode.noTasks":`Solo cuando no queda ninguna tarea de Kōbō`,"settings.cleanupScriptOnlyOnChanges":`Ejecutar solo si se modificaron, añadieron o eliminaron archivos`,"settings.cleanupScriptMode.inherit":`Heredar la configuración global`,"settings.taskPromptTemplate":`Prompt de tarea`,"settings.taskPromptTemplatePlaceholder":`Prompt insertado automáticamente en la descripción de la tarea…`,"settings.taskPromptTemplateHint":`Se inyecta automáticamente en la descripción de la tarea en la página de creación cuando este proyecto está seleccionado. Si no se modifica, se reemplaza al cambiar de proyecto; en cuanto lo editas, se conserva tu texto.`,"settings.setupScriptPlaceholder":`npm install`,"settings.setupScriptHint":`Se ejecuta con bash en el worktree después de su creación, antes de que el agente inicie. No necesita shebang. Si falla, el workspace se establece en error. Timeout: 5 minutos.`,"settings.e2e.title":`Tests E2E`,"settings.e2e.framework":`Framework`,"settings.e2e.frameworkNone":`Ninguno`,"settings.e2e.frameworkOther":`Otro`,"settings.e2e.skill":`Skill (opcional)`,"settings.e2e.skillPlaceholder":`p. ej. cypress-tester`,"settings.e2e.prompt":`Guía personalizada (opcional)`,"settings.e2e.promptPlaceholder":`p. ej. usar el patrón page-object, apuntar a data-testid`,"settings.e2e.helpText":`Cuando está configurado, el agente de grooming auto-loop inserta subtareas E2E para funciones UI.`,"settings.finalization.title":`Finalización del auto-loop`,"settings.finalization.helpText":`Opcional: un prompt que el agente ejecuta como la última iteración del auto-loop. Típicamente usado para controles de calidad finales (lint, typecheck, tests). La fase de grooming creará una tarea con prefijo [FINAL] que usará este prompt.`,"settings.finalization.prompt":`Prompt de finalización`,"settings.finalization.promptPlaceholder":`p. ej. Ejecuta npm run lint y npm test, luego marca esta tarea como hecha.`,"settings.editorCommand":`Comando del editor`,"settings.editorCommandPlaceholder":`code, phpstorm, subl, vim...`,"settings.editorCommandHint":`Comando para abrir el worktree en su editor. La ruta del worktree se pasa como argumento.`,"settings.fileManagerCommand":`Comando del explorador de archivos`,"settings.fileManagerCommandPlaceholder":`xdg-open, open, nautilus, dolphin, explorer...`,"settings.fileManagerCommandHint":`Comando para abrir el worktree en su explorador de archivos. La ruta del worktree se pasa como argumento. Déjalo vacío para ocultar el botón.`,"settings.terminalCommand":`Comando de terminal`,"settings.terminalCommandHint":`Comando para abrir tu terminal en el worktree. Marcador {path} opcional para el directorio.`,"settings.terminalCommandPlaceholder":`kitty · alacritty · gnome-terminal --working-directory={path}`,"settings.mcpSelection":`Selección MCP de Claude`,"settings.mcpAutoSelect":`Auto (primer MCP activo que coincide)`,"settings.notionMcp":`Clave MCP de Notion`,"settings.sentryMcp":`Clave MCP de Sentry`,"settings.mcpSelectionHint":`Las entradas activas se leen desde ~/.claude.json. Deja Auto para usar el comportamiento por defecto.`,"settings.configuredProjects":`Proyectos configurados`,"settings.noProjects":`No hay proyectos configurados`,"settings.addProject":`Añadir proyecto`,"settings.copyFrom":`Copiar ajustes desde`,"settings.copyFromPlaceholder":`(ninguno — partir de los valores por defecto)`,"settings.copyFromHint":`Copia todos los ajustes excepto path, nombre y rama fuente.`,"settings.copyFromConfirmTitle":`¿Sobrescribir los valores actuales?`,"settings.copyFromConfirm":`Se sobrescribirán los valores del formulario con los ajustes de «{project}». ¿Continuar?`,"settings.newProject":`Nuevo proyecto`,"settings.editProject":`Editar proyecto`,"settings.onboardingTitle":`Visita guiada`,"settings.onboardingHint":`Vuelve a ver la presentación de los elementos principales de la interfaz.`,"settings.onboardingReplay":`Volver a ver la visita guiada`,"onboarding.list.title":`Espacios de trabajo`,"onboarding.list.description":`Cada misión vive en su propio espacio — un git worktree, una rama y una sesión de agente dedicados. Todos aparecen aquí.`,"onboarding.create.title":`Crear un espacio de trabajo`,"onboarding.create.description":`Haz clic en + para iniciar una nueva misión — desde un ticket de Notion, una incidencia de Sentry o desde cero.`,"onboarding.search.title":`Búsqueda`,"onboarding.search.description":`Filtra tus espacios de trabajo por nombre, o busca en el historial de conversaciones de los agentes.`,"onboarding.health.title":`Estado`,"onboarding.health.description":`Comprueba el estado de Kōbō: base de datos, agentes activos, integraciones, copias de seguridad.`,"onboarding.changelog.title":`Novedades`,"onboarding.changelog.description":`Consulta las últimas versiones de Kōbō: nuevas funciones, correcciones, cambios de comportamiento. Aparece un indicador cuando hay una versión sin leer.`,"onboarding.settings.title":`Ajustes`,"onboarding.settings.description":`Modelos, scripts de ciclo de vida, integraciones, voz — toda la configuración de Kōbō está aquí. Haz clic en Siguiente para recorrer cada sección.`,"onboarding.settings-general.title":`General`,"onboarding.settings-general.description":`Idioma de la interfaz, proyecto por defecto y comportamiento global aplicado a cada nuevo workspace.`,"onboarding.settings-agents.title":`Agentes y modelos`,"onboarding.settings-agents.description":`Elige el motor por defecto — Claude Code o Codex —, el modelo y el modo de permisos de los agentes.`,"onboarding.settings-skills.title":`Skills`,"onboarding.settings-skills.description":`Elige la suite de skills que cargan los agentes: el preajuste recomendado o tu selección personalizada.`,"onboarding.settings-prompts.title":`Prompts`,"onboarding.settings-prompts.description":`Plantilla de descripción de PR y otros textos de prompt reutilizables por los agentes.`,"onboarding.settings-scripts.title":`Scripts`,"onboarding.settings-scripts.description":`Scripts de ciclo de vida ejecutados en cleanup, archivado y setup del workspace — globales o por proyecto.`,"onboarding.settings-notion.title":`Notion`,"onboarding.settings-notion.description":`Conecta tu token de integración de Notion para importar tickets como misiones de workspace.`,"onboarding.settings-sentry.title":`Sentry`,"onboarding.settings-sentry.description":`Importar una issue de Sentry como fuente de verdad de un workspace.`,"onboarding.settings-forge.title":`Forge`,"onboarding.settings-forge.description":`Elige GitHub, GitLab o ninguna, por proyecto. Kōbō usa tu propia CLI gh / glab — no incluye credenciales.`,"onboarding.settings-voice.title":`Voz`,"onboarding.settings-voice.description":`Dictado por voz: actívalo, elige el modelo Whisper y gestiona el runtime de reconocimiento de voz local.`,"onboarding.settings-notifications.title":`Notificaciones`,"onboarding.settings-notifications.description":`Notificaciones de sonido y de navegador para eventos y cambios de estado de los agentes.`,"onboarding.settings-worktrees.title":`Worktrees`,"onboarding.settings-worktrees.description":`Prefijos de rama Git y la carpeta donde se crean los worktrees de los workspaces.`,"onboarding.settings-worktrees-purge.title":`Liberar espacio en disco automáticamente`,"onboarding.settings-worktrees-purge.description":"Activa este toggle para que Kōbō elimine la carpeta worktree (a menudo cientos de MB de node_modules / vendor) en cuanto una PR se mergea. El historial de chat y los metadatos de la PR se conservan. Puedes recrear el worktree más tarde con `gh pr checkout <pr>` — Kōbō detecta automáticamente la restauración en menos de 30 segundos y reactiva el workspace.","onboarding.settings-projects.title":`Proyectos`,"onboarding.settings-projects.description":`Registra los repositorios en los que trabajas. Haz clic en «Añadir un proyecto» para apuntar Kōbō a un repositorio local — cada workspace se dirige a uno de estos proyectos.`,"onboarding.settings-templates.title":`Plantillas`,"onboarding.settings-templates.description":`Tu biblioteca de plantillas de prompt reutilizables — elige una para rellenar el brief al crear un workspace.`,"onboarding.settings-export.title":`Importar / Exportar`,"onboarding.settings-export.description":`Respalda o comparte tu configuración de Kōbō, y exporta los datos de los workspaces a un archivo.`,"onboarding.firstWorkspace.title":`Crea tu primer workspace`,"onboarding.firstWorkspace.description":`De eso se trata: una misión, un worktree, un agente. Abre la página de creación para empezar.`,"onboarding.next":`Siguiente`,"onboarding.prev":`Atrás`,"onboarding.done":`Hecho`,"onboarding.exitConfirm":`¿Salir del recorrido guiado? Puedes repetirlo en cualquier momento desde Ajustes.`,"settings.projectGroup.identity":`Identidad`,"settings.projectGroup.defaults":`Valores predeterminados`,"settings.projectGroup.prompts":`Prompts`,"settings.projectGroup.scripts":`Scripts`,"settings.projectPath":`Ruta del proyecto`,"settings.projectPathPlaceholder":`/ruta/al/proyecto`,"settings.displayName":`Nombre para mostrar`,"settings.displayNamePlaceholder":`Mi proyecto`,"settings.defaultSourceBranch":`Rama fuente por defecto`,"settings.defaultModel.project":`Modelo por defecto`,"settings.skipPermissions.project":`Omitir solicitudes de permisos`,"settings.prPromptTemplate.project":`Plantilla de prompt PR`,"settings.prPromptPlaceholder.project":`Instrucciones específicas del proyecto para la creación de PRs...`,"settings.reviewPromptTemplate.project":`Plantilla de prompt de revisión`,"settings.ciFixPromptTemplate.project":`Plantilla de prompt «Reparar CI»`,"settings.gitConventions.project":`Convenciones Git (por proyecto)`,"settings.gitConventionsEmpty":`Dejar vacío para usar las convenciones globales.`,"settings.notionStatus":`Estado ticket Notion`,"settings.notionStatusProperty":`Nombre de la propiedad`,"settings.notionStatusPropertyPlaceholder":`État, Status...`,"settings.notionInProgressStatus":`Valor a establecer`,"settings.notionInProgressStatusPlaceholder":`En progreso, In progress...`,"settings.notionStatusHint":`Cuando se crea un workspace con un ticket Notion, la propiedad especificada se establece a este valor. Ambos campos son obligatorios. Dejar vacío para desactivar.`,"settings.notionAssignee":`Asignación Notion`,"settings.notionAssigneeHint":`Cuando se crea un workspace con un ticket Notion, el usuario autenticado en el MCP de Notion se añade a esta propiedad People — solo si aún no tiene un asignado. Dejar vacío para desactivar.`,"settings.notionAssigneeProperty":`Nombre de la propiedad`,"settings.notionAssigneePropertyPlaceholder":`Desarrolladores, Assignees...`,"settings.notionUserId":`Tu UUID de Notion`,"settings.notionUserIdPlaceholder":`135d872b-594c-8126-9604-00024ad6e5b5`,"settings.notionUserIdHint":`Selecciona tu cuenta en la lista. Notion rechaza la asignación de bots en propiedades People — este campo es obligatorio para activar la auto-asignación.`,"settings.notionUsersRefresh":`Refrescar`,"settings.notionUsersLoading":`Cargando usuarios de Notion…`,"settings.notionUsersLoadFailed":`Error al cargar la lista: {error}`,"settings.notionUsersManualFallback":`Lista no disponible — pega tu UUID de Notion manualmente.`,"settings.devServer":`Servidor de desarrollo`,"settings.devServerStart":`Script de inicio`,"settings.devServerStartPlaceholder":`npm run dev`,"settings.devServerStop":`Script de parada`,"settings.devServerStopPlaceholder":`Opcional — el proceso se cerrará automáticamente si está vacío`,"settings.selectProject":`Selecciona un proyecto o añade uno nuevo`,"settings.projectPathRequired":`La ruta del proyecto es obligatoria.`,"settings.useGlobal":`Usar global`,"settings.saved":`Ajustes globales guardados.`,"settings.unsavedChanges":`Cambios sin guardar`,"settings.nav.general":`General`,"settings.nav.agents":`Agentes`,"settings.nav.skills":`Skills`,"settings.nav.prompts":`Prompts`,"settings.nav.scripts":`Scripts`,"settings.nav.workspaceTemplates":`Plantillas de workspace`,"workspaceTemplates.title":`Plantillas de workspace`,"workspaceTemplates.hint":`Preajustes guardados del formulario de creación. Elige uno en la página de creación; para modificarlo, cárgalo allí, ajústalo y guárdalo de nuevo con el mismo nombre.`,"workspaceTemplates.empty":`Todavía no hay plantillas. Rellena el formulario de creación y usa «Guardar como plantilla».`,"workspaceTemplates.anyProject":`Cualquier proyecto`,"workspaceTemplates.rename":`Renombrar`,"workspaceTemplates.renameTitle":`Renombrar la plantilla`,"workspaceTemplates.deleteConfirm":`¿Eliminar la plantilla «{name}»?`,"workspaceTemplates.deleted":`Plantilla «{name}» eliminada`,"settings.nav.notion":`Notion`,"settings.nav.forge":`Forge`,"settings.bitbucketCommunity":`Bitbucket Community`,"settings.bitbucketCommunityHint":`Las credenciales se guardan localmente y solo las usa bkt.`,"settings.bitbucketUsername":`Correo de Atlassian`,"settings.bitbucketToken":`Token API de Bitbucket`,"settings.nav.sentry":`Sentry`,"settings.nav.voice":`Voz`,"settings.nav.notifications":`Notificaciones`,"settings.nav.worktrees":`Worktrees`,"settings.nav.export":`Exportar`,"settings.openNav":`Abrir la navegación`,"settings.saveError":`Error al guardar los ajustes.`,"settings.projectSaved":`Proyecto guardado.`,"settings.projectSaveError":`Error al guardar el proyecto.`,"settings.projectDeleted":`Proyecto eliminado.`,"settings.deleteProjectConfirmTitle":`¿Eliminar proyecto?`,"settings.deleteProjectConfirmMessage":`¿Quitar «{name}» de tus proyectos? Esto solo elimina sus ajustes de Kōbō — tu código y tus worktrees no se modifican.`,"settings.projectDeleteError":`Error al eliminar el proyecto.`,"templates.title":`Plantillas`,"templates.newTemplate":`Nueva plantilla`,"templates.editTemplate":`Editar plantilla`,"templates.deleteTemplate":`Eliminar plantilla`,"templates.deleteConfirm":`¿Eliminar la plantilla '/{slug}'?`,"templates.deleteConfirmMessage":`Esta acción no se puede deshacer.`,"templates.slug":`Slug`,"templates.slugHint":`Minúsculas, dígitos, guiones. Máx. 64 caracteres.`,"templates.slugInvalid":`El slug solo puede contener minúsculas, dígitos y guiones`,"templates.slugDuplicate":`Ya existe una plantilla con este slug`,"templates.description":`Descripción`,"templates.descriptionHint":`Etiqueta corta mostrada en el dropdown.`,"templates.descriptionRequired":`La descripción es obligatoria`,"templates.contentRequired":`El contenido es obligatorio`,"templates.content":`Contenido`,"templates.contentHint":`Contenido de la plantilla. Usa {variable_name} para las sustituciones.`,"templates.availableVars":`Variables disponibles`,"templates.filePath":`Archivo: {path}`,"templates.empty":`Aún no hay plantillas.`,"templates.createFailed":`Error al crear la plantilla`,"templates.updateFailed":`Error al actualizar la plantilla`,"templates.deleteFailed":`Error al eliminar la plantilla`,"templates.save":`Guardar`,"templates.create":`Crear`,"templates.reloadDefaults":`Recargar plantillas predeterminadas`,"templates.reloadDefaultsHint":`Solo añade las plantillas predeterminadas que faltan. Las plantillas existentes (modificadas o no) nunca se sobrescriben.`,"templates.reloadDefaultsConfirmMessage":`Esta acción añadirá a la lista las plantillas predeterminadas que falten. Las plantillas existentes — incluidas las que hayas personalizado — no se tocarán. Si quieres restaurar una plantilla predeterminada que has modificado, elimínala primero y vuelve a ejecutar esta acción.`,"templates.reloadDefaultsSuccess":`{added} añadida(s), {kept} conservada(s)`,"templates.reloadDefaultsFailed":`Error al recargar las plantillas predeterminadas`,"templates.resetToDefault":`Restablecer al valor predeterminado`,"templates.resetConfirmTitle":`¿Restablecer la plantilla al valor predeterminado?`,"templates.resetConfirmMessage":`Esto sobrescribe tus cambios locales en /{slug} con el predeterminado. No se puede deshacer.`,"templates.resetSuccess":`Plantilla /{slug} restablecida al predeterminado`,"templates.resetFailed":`Error al restablecer la plantilla`,"chatInput.dropdownSkills":`Skills de Claude`,"chatInput.dropdownKobo":`Comandos Kōbō`,"chatInput.dropdownTemplates":`Plantillas`,"documents.title":`Documentos`,"documents.empty":`No se encontraron documentos`,"documents.refresh":`Actualizar`,"documents.back":`Volver`,"documents.loadFailed":`Error al cargar el documento`,"git.title":`Git`,"git.outputDialogTitle":`Git informó de un error`,"git.statsFailed":`No se pudo leer el estado de git`,"git.section.repository":`Repositorio`,"git.section.changes":`Cambios`,"git.section.pullRequest":`Pull request`,"git.section.actions":`Acciones`,"git.actions.more":`Más`,"git.localOnly":`solo local`,"git.pushed":`pushed`,"git.unpushed":`{count} sin push`,"git.commits":`{count} commit | {count} commits`,"git.commits.loading":`Cargando commits…`,"git.commits.empty":`Sin commits en esta rama`,"git.commits.pushed":`Pusheado`,"git.commits.unpushed":`Sin pushear`,"git.commits.clickToAppend":`click para agregar SHA al chat`,"git.commits.diffThisCommit":`Diff de este commit (vs padre)`,"git.compareCommits":`Comparar commits…`,"git.files":`{count} archivo | {count} archivos`,"git.staged":`{count} staged`,"git.modified":`{count} modificados`,"git.untracked":`{count} sin seguimiento`,"git.workingTreeEmpty":`Sin cambios sin confirmar`,"git.fileStaged":`Preparado`,"git.fileModified":`Modificado`,"git.fileUntracked":`Sin seguimiento`,"git.push":`Push`,"git.forcePush":`Force push`,"git.forcePushToggle":`Force push (--force-with-lease)`,"git.forcePushHint":`Más seguro que --force: el push se rechaza si el remoto tiene commits que no has visto. Úsalo tras un rebase o amend de commits ya pusheados.`,"git.branchForcePushed":`Rama force-pushed`,"git.pull":`Pull`,"git.pullNoUpstream":`No hay upstream para esta rama — hazle push primero para habilitar Pull.`,"git.sync":`Sync`,"git.createPrNoRemote":`Push la rama primero`,"git.viewRequest":`Ver {request}`,"git.createRequest":`Crear {request}`,"git.changeRequestBase":`Cambiar la rama base de la {request}`,"git.forgeCliMissing":`{cli} no está instalado — instálalo para usar las funciones de {request}`,"git.forgeNotAuthenticated":`No autenticado — ejecuta {cli} auth login`,"settings.forge":`Forge`,"settings.forge.auto":`Detección automática`,"settings.forge.github":`GitHub`,"settings.forge.gitlab":`GitLab`,"settings.forge.bitbucketCommunity":`Bitbucket Community (bkt)`,"settings.forge.none":`Ninguna`,"git.pullConfirmTitle":`¿Pull la rama?`,"git.pullConfirmMessage":`Pull {branch} desde el remoto (solo fast-forward).`,"git.branchPulled":`Rama actualizada`,"git.pullFailed":`Error al hacer pull`,"git.renameBranch":`Renombrar rama`,"git.renameBranchPrompt":"Renombrar `{branch}` a:","git.renameBranchSuccess":"Rama renombrada a `{branch}`","git.renameBranchFailed":`Error al renombrar la rama`,"git.renameBranchExists":"La rama `{branch}` ya existe localmente o en origin","git.diff":`Diff`,"git.diffReview":`Diff`,"git.diffReviewTooltip":`Abre el visor de diff en modo Review — comentarios en línea + envío por lotes al agente`,"pr.baseChanged":`Base de la PR cambiada: {oldBase} → {newBase}`,"pr.openPr":`Abrir PR`,"pr.openWorkspace":`Abrir el workspace`,"pr.dismiss":`Cerrar`,"git.rebase":`Rebase`,"git.rebaseConfirmTitle":`¿Rebase de la rama?`,"git.rebaseConfirmMessage":`Rebase sobre {branch}. Pueden surgir conflictos.`,"git.rebaseSuccess":`Rebase completado`,"git.rebaseFailed":`Rebase fallido`,"git.merge":`Merge`,"git.fetch":`Fetch`,"git.fetchSuccess":`Repositorio actualizado`,"git.fetchFailed":`Fallo al hacer fetch: {error}`,"git.mergeConfirmTitle":`¿Fusionar la rama?`,"git.mergeConfirmMessage":`Fusionar {branch} en esta rama. Puede haber conflictos.`,"git.mergeSuccess":`Merge completado`,"git.mergeFailed":`Merge fallido`,"git.commitFailed":`Commit fallido`,"git.commitChanges":`Confirmar cambios`,"git.commitDialogTitle":`Confirmar cambios sin confirmar`,"git.commitDialogDescription":`Escribe tu mensaje o pide al agente que revise y cree el commit.`,"git.commitMessage":`Mensaje de commit`,"git.commitManual":`Confirmar`,"git.commitWithAgent":`Pedir al agente`,"git.commitAgentSuccess":`Solicitud de commit enviada al agente`,"git.discardFailed":`Descarte fallido`,"git.conflictTitleMerge":`Conflictos de merge detectados`,"git.conflictTitleRebase":`Conflictos de rebase detectados`,"git.operationPausedTitle":`Operación Git para continuar`,"git.operationPausedSubtitle":`No hay archivos en conflicto. Git solo espera que continúes la operación.`,"git.conflictSubtitle":`{count} archivo(s) con conflictos. Elige cómo continuar.`,"git.conflictAbortConfirmTitle":`¿Descartar la resolución del conflicto?`,"git.conflictAbortConfirmMessage":`Todo lo que has resuelto en este {op} se descarta y el worktree vuelve a su estado anterior. Es irreversible.`,"git.conflictAbort":`Abortar`,"git.conflictContinue":`Continuar`,"git.conflictContinued":`Operación Git continuada`,"git.conflictResolveWithAgent":`Pedir al agente que resuelva`,"git.conflictAborted":`Operación abortada`,"git.conflictHandoffSuccess":`El agente está resolviendo los conflictos`,"git.dirtyTitleRebase":`Cambios sin confirmar bloquean el rebase`,"git.dirtyTitleMerge":`Cambios sin confirmar bloquean el merge`,"git.dirtyTitlePull":`Cambios sin confirmar bloquean el pull`,"git.dirtySubtitle":`{modified} modificado(s), {staged} preparado(s), {untracked} sin seguimiento. Elige cómo continuar.`,"git.dirtyStash":`Stash y reintentar`,"git.dirtyCommit":`Commit primero`,"git.dirtyCommitPlaceholder":`Mensaje del commit`,"git.dirtyCommitConfirm":`Commit y reintentar`,"git.dirtyDiscard":`Descartar cambios`,"git.dirtyDiscardConfirmTitle":`¿Descartar todos los cambios sin confirmar?`,"git.dirtyDiscardConfirmMessage":`Los cambios con seguimiento se perderán (git reset --hard). Los archivos sin seguimiento se conservan. Acción irreversible.`,"git.pushConfirmTitle":`¿Pushar la rama?`,"git.pushConfirmMessage":`Pushar {branch} al remoto.`,"git.pushConfirmMessagePrefix":`Pushar la rama`,"git.pushConfirmMessageSuffix":`al remoto.`,"git.changePrBaseTitle":`Cambiar rama base`,"git.changePrBaseMessage":`Ingrese la nueva rama destino para el {request}.`,"git.changePrBaseSuccess":`Rama base de la {request} actualizada`,"git.changePrBaseFailed":`No se pudo cambiar la rama base de la {request}`,"git.mergeRequest":`Fusionar {request}`,"git.mergeRequestConfirmTitle":`¿Fusionar {request}?`,"git.mergeRequestConfirmMessage":`Esto fusionará la {request} abierta en su rama de destino.`,"git.mergeRequestSuccess":`{request} fusionada`,"git.mergeRequestFailed":`No se pudo fusionar {request}`,"git.deleteRemoteBranch":`Eliminar rama remota`,"git.deleteRemoteBranchTitle":`¿Eliminar rama remota?`,"git.deleteRemoteBranchMessage":`La solicitud se fusionó. ¿Eliminar la rama remota {branch}?`,"git.deleteRemoteBranchSuccess":`Rama remota {branch} eliminada`,"git.deleteRemoteBranchFailed":`No se pudo eliminar la rama remota`,"git.changeSourceBranch":`Cambiar la rama de origen`,"git.changeSourceBranchTitle":`Cambiar la rama de origen`,"git.changeSourceBranchMessage":`Elige la nueva rama de origen. La rama de trabajo se reconstruirá encima.`,"git.changeSourceBranchDone":`Rama de origen cambiada a {branch}`,"git.changeSourceBranchAligned":`Rama de origen cambiada a {branch} (la rama no tenía commits propios)`,"git.changeSourceBranchTooMany":`La rama tiene demasiados commits propios ({n}) — rebásala manualmente`,"git.changeSourceBranchDirty":`Haz commit o stash de tus cambios antes de cambiar la rama de origen`,"git.changeSourceBranchAgentRunning":`Detén el agente antes de cambiar la rama de origen`,"git.changeSourceBranchErrorTitle":`Error al cambiar la rama de origen`,"git.changeSourceBranchErrorOngoing":`Una operación {op} sigue en curso en el worktree. Cancélala para volver a un estado limpio.`,"git.changeSourceBranchErrorAbort":`Cancelar la operación`,"git.changeSourceBranchLoading":`Cambiando la rama de origen…`,"git.changeSourceForcePushTitle":`¿Forzar el push de la rama reescrita?`,"git.changeSourceForcePushMessage":`El historial de la rama se reescribió. ¿Hacer force-push al remoto con --force-with-lease?`,"git.changeSourceForcePushDone":`Rama enviada con force-push`,"git.openEditor":`Abrir en editor`,"git.openEditorFailed":`No se pudo abrir el editor`,"git.branchPushed":`Rama enviada`,"git.pushFirst":`La rama no está en el remoto. Haz Push primero.`,"git.unpushedCommits":`Los commits locales no están enviados. Haz Push primero.`,"git.from":`desde`,"git.aheadBehindTooltip":`{ahead} commits por delante, {behind} por detrás de {source}`,"git.divergence.title":`Divergencia de rama`,"git.divergence.subtitle":`vs {source}`,"git.divergence.ahead":`↑ {count} por delante`,"git.divergence.behind":`↓ {count} por detrás`,"git.divergence.empty.ahead":`Sin commits por delante.`,"git.divergence.empty.behind":`Sin commits por detrás.`,"git.divergence.close":`Cerrar`,"git.divergence.loading":`Cargando commits…`,"git.divergence.failed":`No se pudo cargar la divergencia`,"git.divergence.retry":`Reintentar`,"git.prCreated":`{request} #{n} creada`,"git.pr.author":`Autor`,"git.pr.reviewers":`Revisores`,"git.pr.assignees":`Asignados`,"git.pr.labels":`Etiquetas`,"git.pr.changesRequestedBadge":`Cambios solicitados`,"git.pr.approvedBadge":`Aprobada`,"git.pr.ci.passed":`CI OK`,"git.pr.ci.failed":`CI fallida`,"git.pr.ci.pending":`CI en curso`,"git.pr.ci.failedCount":`{n} fallido(s)`,"git.pr.ci.pendingCount":`{n} en curso`,"git.pr.ci.passedCount":`{n} OK`,"git.pr.ci.skippedCount":`{n} omitido(s)`,"git.pr.ci.showPassed":`Mostrar {n} jobs OK`,"git.pr.ci.hidePassed":`Ocultar los jobs OK`,"toast.prChangesRequested":`Se solicitaron cambios en la PR #{n}`,"toast.prApproved":`La PR #{n} ha sido aprobada`,"toast.prReadyToMerge":`La PR #{n} está lista para merge`,"toast.prCiFailed":`La CI de la PR #{n} ha fallado`,"toast.prCiRecovered":`La CI de la PR #{n} se ha recuperado`,"toast.prMergeConflict":`La PR #{n} tiene conflictos de merge`,"toast.prMerged":`La PR #{n} se ha fusionado`,"devServer.title":`Servidor de desarrollo`,"devServer.noWorkspace":`Ningún workspace seleccionado`,"devServer.notConfigured":`No configurado —`,"devServer.goToSettings":`Ajustes`,"devServer.logs":`Logs`,"devServer.running":`En ejecución`,"devServer.starting":`Iniciando`,"devServer.stopping":`Deteniendo`,"devServer.error":`Error`,"devServer.stopped":`Detenido`,"devServer.unknown":`Desconocido`,"devServer.containers":`{count} contenedor | {count} contenedores`,"devServer.logDialog.title":`Logs del servidor de desarrollo`,"devServer.logDialog.empty":`No hay logs disponibles`,"notion.title":`Notion`,"tasks.title":`Tareas`,"notion.addTask":`Añadir tarea`,"notion.noUrl":`Sin URL de Notion`,"notion.subtasks":`{done}/{total} subtareas`,"notion.noTasks":`Sin tareas`,"notion.newTask":`Nueva tarea... (Enter para añadir, Esc para cancelar)`,"acceptance.title":`Criterios de aceptación`,"acceptance.addCriterion":`Añadir criterio`,"acceptance.newCriterion":`Nuevo criterio... (Enter para añadir, Esc para cancelar)`,"acceptance.empty":`Sin criterios de aceptación`,"tasks.askProgress":`Pedir al agente que revise el progreso`,"agentTodos.title":`Tareas del agente`,"agentTodos.empty":`Sin tareas del agente`,"subagents.title":`Sub-agentes`,"subagents.empty":`Aún no hay actividad de sub-agentes`,"subagents.tools":`{count} herramientas`,"subagents.running":`En ejecución: `,"stats.resetsAt":`Reset {value}`,"stats.usageBucket":`Bucket de uso {n}`,"quotaFooter.lastUpdated":`Última actualización: {time}`,"quotaFooter.empty":`Cargando…`,"quotaFooter.popover.title":`Uso de Claude Code`,"quotaFooter.popover.refreshNow":`Actualizar`,"quotaFooter.popover.resetsIn":`Se reinicia a las {value}`,"quotaFooter.popover.unauthenticated":`Auth requerida`,"quotaFooter.popover.unauthenticatedHint":`Ejecuta "claude" una vez para autenticarte.`,"quotaFooter.popover.error":`Error`,"quotaFooter.bucket.fiveHour":`5 horas`,"quotaFooter.bucket.sevenDay":`7 días`,"agent.error.spawn_failed":`No se pudo iniciar el agente`,"agent.error.parse_error":`No se pudo analizar un mensaje del agente`,"agent.error.rate_limit":`Límite de tasa alcanzado`,"agent.error.resume_failed":`Sesión no encontrada — iniciando sesión nueva`,"agent.error.other":`Error del agente`,"quotaBackoff.banner.title":`Reanudación automática a las {time}`,"quotaBackoff.banner.transientTitle":`Reanudación automática tras interrupción a las {time}`,"quotaBackoff.resumeNow":`Reanudar ahora`,"quotaBackoff.banner.tooltip":`Cuota de Claude agotada. El auto-loop se reanudará automáticamente cuando la cuota se restablezca a las {resets_at}.`,"quotaBackoff.banner.cancel":`Cancelar reanudación`,"quotaBackoff.cancelled":`Reanudación automática cancelada — puedes reanudar manualmente cuando quieras`,"rateLimitType.fiveHour":`Sesión 5h`,"rateLimitType.sevenDay":`Semanal`,"tooltip.addTask":`Añadir tarea`,"tooltip.removeTask":`Eliminar tarea`,"tooltip.addCriterion":`Añadir criterio`,"tooltip.removeCriterion":`Eliminar criterio`,"tooltip.startDevServer":`Iniciar servidor de desarrollo`,"tooltip.stopDevServer":`Detener servidor de desarrollo`,"tooltip.closeDiffViewer":`Cerrar visor de diff`,"tooltip.refreshLogs":`Actualizar logs`,"tooltip.closeDialog":`Cerrar`,"tooltip.refreshGitStats":`Actualizar estadísticas Git`,"tooltip.removeImage":`Eliminar imagen`,"tooltip.sendMessage":`Enviar mensaje`,"tools.title":`Herramientas`,"tools.runSetupScript":`Volver a ejecutar script de setup`,"tools.runSetupScriptTooltip":`Ejecutar el script de setup del proyecto en el worktree`,"tools.runSetupScriptConfirm":`¿Volver a ejecutar el script de setup en este workspace? Los artefactos existentes pueden ser sobrescritos.`,"tools.runSetupScriptBusy":`No se puede volver a ejecutar el setup mientras el agente está trabajando.`,"tools.noSetupScript":`Ningún script de setup configurado —`,"tools.setupScriptSuccess":`Script de setup completado con éxito.`,"tools.setupScriptFailed":`Falló el script de setup.`,"tools.openNotion":`Abrir en Notion`,"tools.openSentry":`Abrir en Sentry`,"tools.review":`Revisar cambios`,"tools.reviewTooltip":`Pedir al agente que revise los cambios de esta rama`,"tools.reviewBusy":`Agente ocupado — espera a que esté libre`,"tools.fixCi":`Reparar CI`,"tools.fixCiTooltip":`Pedir al agente que diagnostique y arregle los jobs de CI que fallan`,"tools.fixCiLaunched":`Acción «Reparar CI» enviada al agente`,"tools.fixCiFailed":`No se pudo lanzar la acción «Reparar CI»`,"tools.openFileManager":`Abrir en el explorador de archivos`,"tools.openFileManagerTooltip":`Abrir la carpeta del worktree en tu explorador de archivos configurado`,"tools.openFileManagerFailed":`No se pudo abrir el explorador de archivos`,"tools.openTerminal":`Abrir en terminal`,"tools.openTerminalTooltip":`Abrir el worktree en tu terminal configurada`,"tools.openTerminalFailed":`No se pudo abrir la terminal`,"review.title":`Iniciar revisión`,"review.subtitle":`Pide al agente que revise tus cambios y dé feedback.`,"review.additionalInstructions":`Instrucciones adicionales (opcional)`,"review.additionalInstructionsPlaceholder":`Añade instrucciones específicas para la revisión…`,"review.newSession":`Nueva sesión`,"review.newSessionHint":`Inicia una sesión nueva en vez de continuar la actual.`,"review.start":`Iniciar revisión`,"review.cancel":`Cancelar`,"review.launched":`Revisión iniciada`,"review.failed":`No se pudo iniciar la revisión`,"diff.title":`Diff`,"diff.side":`Lado a lado`,"diff.inline":`En línea`,"diff.hideUnchanged":`Ocultar código sin cambios`,"diff.showUnchanged":`Mostrar código sin cambios`,"diff.showUntracked":`Mostrar archivos no rastreados`,"diff.hideUntracked":`Ocultar archivos no rastreados`,"diff.rollbackToRemote":`Restaurar a la versión remota`,"diff.rollbackConfirm":`¿Restaurar {path} a su versión remota (origin)? Los cambios locales en este archivo se perderán.`,"diff.rollbackConfirmOk":`Restaurar`,"diff.rollbackDone":`Archivo restaurado a la versión remota`,"diff.rollbackDoneRemote":`Archivo restaurado a la versión remota`,"diff.rollbackDoneHead":`Cambios locales descartados (archivo restaurado al último commit)`,"diff.rollbackDoneDeleted":`Archivo no rastreado eliminado`,"diff.deleteUntracked":`Eliminar archivo no rastreado`,"diff.deleteUntrackedConfirm":`¿Eliminar definitivamente {path}? Este archivo no está rastreado por git — su contenido se perderá.`,"diff.deleteUntrackedConfirmOk":`Eliminar`,"diff.rollbackFailed":`Falló el rollback`,"diff.rollbackFailedDetail":`Rollback fallido: {error}`,"diff.modeInspect":`Editar`,"diff.modeReview":`Review`,"diff.addComment":`Añadir comentario`,"diff.replyComment":`Responder`,"diff.editComment":`Editar`,"diff.deleteComment":`Eliminar`,"diff.deleteCommentConfirm":`¿Eliminar este comentario?`,"diff.commentPlaceholder":`Escribe un comentario de revisión… (Markdown soportado)`,"diff.reviewDraft":`Borrador de revisión`,"diff.reviewEmpty":`Aún no hay comentarios — pasa el cursor sobre una línea del diff y haz clic en + para añadir uno.`,"diff.reviewGlobalPlaceholder":`Mensaje general de revisión (opcional)`,"diff.submitReview":`Enviar revisión ({n})`,"diff.reviewSubmitted":`Revisión enviada al agente`,"diff.reviewSubmitFailed":`No se pudo enviar la revisión: {error}`,"diff.scopeBranch":`Branch`,"diff.scopeUnpushed":`Sin pushear`,"diff.noChanges":`Sin cambios`,"diff.searchFiles":`Buscar archivos…`,"diff.noFileMatch":`Ningún archivo coincide`,"diff.selectFile":`Selecciona un archivo para ver el diff`,"diff.fileLoadFailed":`No se pudo cargar este diff`,"diff.fileLoadFailedHint":`El archivo en disco está intacto — solo falló la carga del diff.`,"diff.fileListLoadFailed":`No se pudo cargar la lista de archivos`,"diff.fileListLoadFailedHint":`Es un fallo de la petición, no una rama sin cambios.`,"diff.addToChat":`Añadir al chat`,"diff.compareTitle":`Comparar commits`,"diff.compareFrom":`Desde`,"diff.compareTo":`Hasta`,"diff.compareSubmit":`Comparar`,"diff.compareSourceBase":`{branch} (base de la rama)`,"diff.commitsReadOnly":`solo lectura`,"diffViewer.save":`Guardar`,"diffViewer.savedAt":`Guardado`,"diffViewer.saveFailed":`Error al guardar`,"diffViewer.saveFailedDetail":`Error al guardar: {error}`,"diffViewer.unsavedChanges.title":`Cambios sin guardar`,"diffViewer.unsavedChanges.message":`Tienes cambios sin guardar. ¿Qué quieres hacer?`,"diffViewer.unsavedChanges.save":`Guardar`,"diffViewer.unsavedChanges.cancel":`Cancelar`,"diffViewer.conflict.title":`Archivo modificado en disco`,"diffViewer.conflict.message":`El archivo fue modificado fuera de Kōbō desde que lo abriste.`,"diffViewer.conflict.reload":`Recargar (descartar cambios locales)`,"diffViewer.conflict.keep":`Mantener los míos`,"diffViewer.conflict.overwrite":`Sobrescribir de todos modos`,"diffViewer.conflict.overwriteHint":`Reemplaza el archivo del disco por tu versión. El otro cambio se pierde.`,"diffViewer.conflict.keepHint":`Mantiene tus cambios en el editor y adopta la nueva firma del disco, para que el próximo guardado funcione.`,"diffViewer.saveBlocked":`El agente está en marcha — detenlo para guardar tus cambios.`,"diffViewer.unsavedBanner":`Cambios sin guardar. Detén el agente para guardarlos.`,"diffViewer.closeConfirm.title":`Cambios sin guardar`,"diffViewer.closeConfirm.message":`Este archivo tiene cambios que nunca se guardaron. Cerrar el visor de diferencias los descarta.`,"diffViewer.closeConfirm.discard":`Cerrar sin guardar`,"diffViewer.criteriaRail":`Checklist de revisión`,"diffViewer.criteriaRailShow":`Mostrar la checklist de revisión`,"diffViewer.criteriaRailHide":`Ocultar la checklist de revisión`,"diffViewer.fileTreeShow":`Mostrar el árbol de archivos`,"diffViewer.fileTreeHide":`Ocultar el árbol de archivos`,"diffViewer.closeConfirm.saveAndClose":`Guardar y cerrar`,"diffViewer.agentRunning":`El agente está activo — detenlo para editar`,"diffViewer.fileDeleted":`Archivo eliminado`,"notification.agentFinished":`{name} — Agente terminado`,"notification.agentQuestion":`{name} — El agente hace una pregunta`,"notification.awaitingReminder":`{name} - sigue esperándote ({minutes} min)`,"notification.agentPermissionRequest":`{name} — El agente solicita un permiso`,"notification.autoLoopCompleted":`{name} — Auto-loop completado`,"notification.autoLoopWaitingForSlot":`{name} - El auto-loop espera un slot de agente libre ({running}/{limit} en curso)`,"notification.autoLoopStalled":`{name} — Auto-loop bloqueado (sin progreso)`,"notification.autoLoopError":`{name} — Auto-loop detenido por error`,"notification.autoLoopAwaitingClarification":`{name} — Auto-loop en pausa, esperando tu aclaración`,"notification.autoLoopPermissionOverridden":`{name} — Auto-loop forzó el modo plan a bypass`,"notification.agentError":`{name} — Error del agente`,"contextMenu.rename":`Renombrar`,"contextMenu.editDescription":`Editar la descripción`,"contextMenu.copyPath":`Copiar ruta del worktree`,"contextMenu.openEditor":`Abrir en editor`,"contextMenu.openFileManager":`Abrir en el explorador de archivos`,"contextMenu.unarchiveDisabledPurged":"El worktree se ha borrado del disco. Recréalo manualmente (`gh pr checkout` o `git worktree add`) — Kōbō detecta la restauración en menos de 30 s y reactiva el workspace automáticamente.","workspaceList.unarchiveBlockedPurged":"No se puede desarchivar: el worktree ya no existe en el disco. Recréalo manualmente (`gh pr checkout` o `git worktree add`) — Kōbō lo detecta en menos de 30 s y reactiva el workspace.","contextMenu.purgeWorktree":`Liberar espacio en disco (borrar worktree)`,"contextMenu.purgeWorktreeTooltip":`Borra el worktree del disco para recuperar espacio — el historial de mensajes y sesiones se conserva. Archiva automáticamente el workspace.`,"contextMenu.purgeWorktreeDialogTitle":`¿Liberar espacio en disco?`,"contextMenu.purgeWorktreeDialogMessage":`La carpeta del worktree de «{name}» será eliminada del disco. El historial de mensajes y sesiones se conserva. El workspace se archivará automáticamente. Esta acción no se puede deshacer en la versión actual.`,"contextMenu.purgeWorktreeDialogConfirm":`Borrar el worktree`,"contextMenu.purgeWorktreeSuccess":`Worktree borrado — espacio en disco recuperado.`,"settings.autoPurgeOnPrMerged":`Borrar worktree al mergear la PR`,"settings.autoPurgeOnPrMergedHint":`Cuando está activado, el worktree se borra del disco en cuanto se mergea la PR (además del archivado automático). El historial de mensajes se conserva.`,"settings.autoLoopMaxRetries":`Máximo de reintentos automáticos`,"settings.awaitingUserReminder":`Recordatorio de pregunta sin responder`,"settings.awaitingUserReminderHint":`Minutos que un workspace puede esperar tu respuesta antes de que Kōbō te avise, y luego en cada intervalo siguiente. 0 lo desactiva.`,"settings.localeLoadFailed":`No se pudo cargar ese idioma; se mantiene el actual.`,"settings.autoLoopMaxRetriesHint":`Detiene el bucle automático tras este número de errores de cuota o de servidor temporales.`,"settings.retentionTitle":`Retención del historial de conversación (desactivada por defecto)`,"settings.retentionWarning":`Activar esta opción elimina definitivamente de la base de datos el historial de conversación de los agentes, empezando por todo lo que ya sea más antiguo que la ventana. Los eventos eliminados no se pueden recuperar.`,"settings.retentionHint":`Se ejecuta una vez al arrancar el servidor. Los workspaces, tareas, sesiones, branches y worktrees nunca se tocan — solo la salida registrada de los agentes.`,"settings.retentionDaysLabel":`Eliminar eventos más antiguos de (días)`,"settings.retentionDaysHint":`0 — el valor por defecto — conserva todos los eventos indefinidamente. Indica un valor para activar la retención.`,"settings.retentionKeepLabel":`Eventos siempre conservados por workspace`,"settings.retentionKeepHint":`Los eventos más recientes de cada workspace sobreviven sea cual sea su antigüedad, para que un workspace antiguo pero aún abierto conserve un historial legible. Sugerido: 5000.`,"settings.retentionDisabledHint":`Retención desactivada: nunca se eliminará nada.`,"settings.retentionConfirmTitle":`¿Eliminar definitivamente el historial de conversación?`,"settings.retentionConfirmMessage":`Conservar solo {days} día(s) de historial eliminará definitivamente, en el próximo arranque del servidor, {count} de los {total} eventos de agente registrados — incluido todo lo que ya sea más antiguo. Es irreversible. ¿Continuar?`,"settings.retentionConfirmMessageUnknown":`Conservar solo {days} día(s) de historial eliminará definitivamente, en el próximo arranque del servidor, todos los eventos de agente más antiguos — incluido todo lo ya acumulado. No se ha podido calcular el volumen exacto. Es irreversible. ¿Continuar?`,"settings.purgeDocsTitle":`Cómo funciona el borrado — restauración y permisos`,"settings.purgeDocsRestoreTitle":`Restaurar un worktree borrado (detección automática)`,"settings.purgeDocsRestoreIntro":`Un workspace borrado conserva su historial de chat y los metadatos de la PR, pero la carpeta worktree ya no existe. Recréala manualmente con uno de estos comandos — Kōbō detecta la reaparición de la carpeta en menos de 30 segundos y reactiva automáticamente el workspace (desarchivar + limpiar flag de borrado):`,"settings.purgeDocsRestoreCommands":`# GitHub (con CLI gh):
11
+ # tu script — usa $KOBO_NEW_BASE / $KOBO_OLD_BASE / $KOBO_WORKING_BRANCH …`,"settings.changeSourceBranchScript.resetDefault":`Restablecer al predeterminado de Kōbō`,"settings.changeSourceBranchScript.replaceConfirmTitle":`¿Restablecer el script?`,"settings.changeSourceBranchScript.replaceConfirm":`Tus modificaciones se reemplazarán por el script predeterminado de Kōbō. ¿Continuar?`,"settings.cleanupScriptHint":`Script de shell ejecutado en el worktree después de cada sesión del agente. En modo auto-loop solo se ejecuta cuando todas las tareas están terminadas. Dejar vacío para desactivar.`,"settings.cleanupScriptPlaceholder":`p. ej. eliminar archivos temporales, detener contenedores…`,"settings.cleanupScriptMode":`Cuándo ejecutar`,"settings.cleanupScriptMode.idle":`Después de cada sesión — aunque queden tareas`,"settings.cleanupScriptMode.noTasks":`Solo cuando no queda ninguna tarea de Kōbō`,"settings.cleanupScriptOnlyOnChanges":`Ejecutar solo si se modificaron, añadieron o eliminaron archivos`,"settings.cleanupScriptMode.inherit":`Heredar la configuración global`,"settings.taskPromptTemplate":`Prompt de tarea`,"settings.taskPromptTemplatePlaceholder":`Prompt insertado automáticamente en la descripción de la tarea…`,"settings.taskPromptTemplateHint":`Se inyecta automáticamente en la descripción de la tarea en la página de creación cuando este proyecto está seleccionado. Si no se modifica, se reemplaza al cambiar de proyecto; en cuanto lo editas, se conserva tu texto.`,"settings.setupScriptPlaceholder":`npm install`,"settings.setupScriptHint":`Se ejecuta con bash en el worktree después de su creación, antes de que el agente inicie. No necesita shebang. Si falla, el workspace se establece en error. Timeout: 5 minutos.`,"settings.e2e.title":`Tests E2E`,"settings.e2e.framework":`Framework`,"settings.e2e.frameworkNone":`Ninguno`,"settings.e2e.frameworkOther":`Otro`,"settings.e2e.skill":`Skill (opcional)`,"settings.e2e.skillPlaceholder":`p. ej. cypress-tester`,"settings.e2e.prompt":`Guía personalizada (opcional)`,"settings.e2e.promptPlaceholder":`p. ej. usar el patrón page-object, apuntar a data-testid`,"settings.e2e.helpText":`Cuando está configurado, el agente de grooming auto-loop inserta subtareas E2E para funciones UI.`,"settings.finalization.title":`Finalización del auto-loop`,"settings.finalization.helpText":`Opcional: un prompt que el agente ejecuta como la última iteración del auto-loop. Típicamente usado para controles de calidad finales (lint, typecheck, tests). La fase de grooming creará una tarea con prefijo [FINAL] que usará este prompt.`,"settings.finalization.prompt":`Prompt de finalización`,"settings.finalization.promptPlaceholder":`p. ej. Ejecuta npm run lint y npm test, luego marca esta tarea como hecha.`,"settings.editorCommand":`Comando del editor`,"settings.editorCommandPlaceholder":`code, phpstorm, subl, vim...`,"settings.editorCommandHint":`Comando para abrir el worktree en su editor. La ruta del worktree se pasa como argumento.`,"settings.fileManagerCommand":`Comando del explorador de archivos`,"settings.fileManagerCommandPlaceholder":`xdg-open, open, nautilus, dolphin, explorer...`,"settings.fileManagerCommandHint":`Comando para abrir el worktree en su explorador de archivos. La ruta del worktree se pasa como argumento. Déjalo vacío para ocultar el botón.`,"settings.terminalCommand":`Comando de terminal`,"settings.terminalCommandHint":`Comando para abrir tu terminal en el worktree. Marcador {path} opcional para el directorio.`,"settings.terminalCommandPlaceholder":`kitty · alacritty · gnome-terminal --working-directory={path}`,"settings.mcpSelection":`Selección MCP de Claude`,"settings.mcpAutoSelect":`Auto (primer MCP activo que coincide)`,"settings.notionMcp":`Clave MCP de Notion`,"settings.sentryMcp":`Clave MCP de Sentry`,"settings.mcpSelectionHint":`Las entradas activas se leen desde ~/.claude.json. Deja Auto para usar el comportamiento por defecto.`,"settings.configuredProjects":`Proyectos configurados`,"settings.noProjects":`No hay proyectos configurados`,"settings.addProject":`Añadir proyecto`,"settings.copyFrom":`Copiar ajustes desde`,"settings.copyFromPlaceholder":`(ninguno — partir de los valores por defecto)`,"settings.copyFromHint":`Copia todos los ajustes excepto path, nombre y rama fuente.`,"settings.copyFromConfirmTitle":`¿Sobrescribir los valores actuales?`,"settings.copyFromConfirm":`Se sobrescribirán los valores del formulario con los ajustes de «{project}». ¿Continuar?`,"settings.newProject":`Nuevo proyecto`,"settings.editProject":`Editar proyecto`,"help.title":`Ayuda`,"help.tours":`Visitas guiadas`,"help.steps":`{n} paso | {n} pasos`,"help.resetAll":`Restablecer todas las visitas`,"help.resetAllHint":`Inicia ahora la visita de inicio; cada pantalla repetirá la suya al abrirla de nuevo.`,"help.status.unseen":`no vista`,"help.status.partial":`en parte`,"help.status.seen":`vista`,"help.replayThis":`Repetir la visita de esta pantalla`,"tours.next":`Siguiente`,"tours.prev":`Atrás`,"tours.done":`Terminar`,"tours.exitConfirm":`¿Salir del recorrido guiado? Puedes repetirlo en cualquier momento desde el menú Ayuda.`,"tours.home.title":`Orientarse`,"tours.home.list.title":`Workspaces`,"tours.home.list.description":`Cada misión vive aquí con su estado. Los badges señalan una CI fallida, una review que pide cambios o una PR lista para merge.`,"tours.home.create.title":`Crear un workspace`,"tours.home.create.description":`Un workspace es un worktree de Git, una rama y una sesión de agente para una tarea.`,"tours.home.search.title":`Búsqueda`,"tours.home.search.description":`Filtra la lista por nombre. El icono de búsqueda de arriba abre la búsqueda de texto completo en las conversaciones de los agentes.`,"tours.home.dashboard.title":`Panel`,"tours.home.dashboard.description":`Una tabla con todos los workspaces activos: estado, atención, PR, diff, actividad y la fiabilidad de los motores.`,"tours.home.health.title":`Salud y changelog`,"tours.home.health.description":`Comprueba la base de datos, los runtimes y los agentes activos. El botón de al lado lista lo que cambió en cada versión.`,"tours.home.settings.title":`Ajustes`,"tours.home.settings.description":`Motores, integraciones, automatización, worktrees y proyectos. Ahora crea tu primer workspace.`,"tours.create.title":`Crear un workspace`,"tours.create.project.title":`Proyecto y rama`,"tours.create.project.description":`Elige el proyecto y la rama de la que parte el worktree.`,"tours.create.mission.title":`Misión`,"tours.create.mission.description":`Describe la tarea, o impórtala desde una página de Notion o una issue de Sentry.`,"tours.create.template.title":`Templates`,"tours.create.template.description":`Aplica un preset guardado, o guarda este formulario como preset. «Duplicar» en una tarjeta de workspace abre este formulario ya rellenado.`,"tours.create.engine.title":`Motor y modelo`,"tours.create.engine.description":`Claude Code o Codex, el modelo, el esfuerzo de razonamiento y lo que el agente puede hacer sin preguntar.`,"tours.create.brainstorm.title":`Brainstorm en otro modelo`,"tours.create.brainstorm.description":`Ejecuta la primera sesión de brainstorming en otro modelo y vuelve al principal para las iteraciones.`,"tours.create.autoloop.title":`Auto-loop`,"tours.create.autoloop.description":`Deja que el agente encadene sesiones hasta terminar todas las tareas, o hasta que se estanque.`,"tours.create.comparison.title":`Comparar dos motores`,"tours.create.comparison.description":`Crea dos workspaces gemelos sobre la misma tarea y compara sus commits, tareas y actividad.`,"tours.workspace.title":`Dentro de un workspace`,"tours.workspace.chat.title":`Conversación`,"tours.workspace.chat.description":`La salida del agente, en directo: mensajes, llamadas a herramientas, preguntas y errores.`,"tours.workspace.input.title":`Hablar con el agente`,"tours.workspace.input.description":`Envía un mensaje, usa slash commands, dicta por voz o adjunta archivos.`,"tours.workspace.selectors.title":`Ajustes de sesión`,"tours.workspace.selectors.description":`Cambia el modelo, el esfuerzo, el modo de permisos y el auto-loop para la próxima sesión.`,"tours.workspace.status.title":`Estado`,"tours.workspace.status.description":`El estado de la sesión actual; detenla aquí cuando haga falta.`,"tours.workspace.git.title":`Git`,"tours.workspace.git.description":`Commits, diff, push, rebase y la PR de esta rama.`,"tours.workspace.tasks.title":`Tareas`,"tours.workspace.tasks.description":`Lo que el agente planea hacer, y los criterios de aceptación que debe cumplir.`,"tours.workspace.timeline.title":`Cronología`,"tours.workspace.timeline.description":`Todas las sesiones de este workspace; abre una anterior para releerla.`,"tours.workspace.subagents.title":`Subagentes`,"tours.workspace.subagents.description":`Sigue los subagentes que lanzó el agente, con su progreso en directo.`,"tours.workspace.documents.title":`Documentos`,"tours.workspace.documents.description":`Planes y archivos que escribió el agente, consultables sin salir del chat.`,"tours.workspace.schedule.title":`Programación`,"tours.workspace.schedule.description":`Wake-ups y crons que relanzan el agente más tarde.`,"tours.workspace.terminal.title":`Terminal`,"tours.workspace.terminal.description":`Una shell dentro del worktree, sin salir de Kōbō.`,"tours.gitPr.title":`Pull request`,"tours.gitPr.panel.title":`Estado de la PR`,"tours.gitPr.panel.description":`Resultado de la CI, decisión de la review y reviewers, actualizados cada 30 segundos.`,"tours.gitPr.actions.title":`Acciones Git`,"tours.gitPr.actions.description":`Push, pull, rebase o cambiar la rama base. Durante un conflicto, un botón deja que el agente lo resuelva.`,"tours.gitPr.attention.title":`Badges de atención`,"tours.gitPr.attention.description":`La tarjeta muestra una CI fallida, cambios solicitados o una PR lista para merge.`,"tours.settings.title":`Ajustes`,"tours.settings.engines.title":`Motores y modelos`,"tours.settings.engines.description":`Modelo, esfuerzo y modo de permisos por defecto para cada motor.`,"tours.settings.integrations.title":`Integraciones`,"tours.settings.integrations.description":`Notion, Sentry y la forge (GitHub o GitLab) que proporciona las PR.`,"tours.settings.automation.title":`Automatización`,"tours.settings.automation.description":`Scripts de setup y cleanup, lifecycle hooks, templates de prompts, templates de workspace y skills.`,"tours.settings.worktrees.title":`Worktrees`,"tours.settings.worktrees.description":`Dónde viven los worktrees, cuánto tiempo se conservan los ya fusionados, y la purga automática.`,"tours.settings.projects.title":`Proyectos`,"tours.settings.projects.description":`Los proyectos registrados y sus ajustes específicos por proyecto.`,"tours.settings.misc.title":`General, voz, notificaciones, exportación`,"tours.settings.misc.description":`Idioma, acceso a la red, dictado, sonidos y notificaciones del navegador, y una exportación completa de tus ajustes.`,"tours.dashboard.title":`Panel`,"tours.dashboard.overview.title":`Visión general`,"tours.dashboard.overview.description":`Todos los workspaces activos en una tabla; haz clic en una fila para abrirla.`,"tours.dashboard.reliability.title":`Fiabilidad de los motores`,"tours.dashboard.reliability.description":`Sesiones, errores y duraciones por motor y modelo.`,"tours.health.title":`Salud`,"tours.health.checks.title":`Comprobaciones`,"tours.health.checks.description":`Entorno, base de datos, runtimes, workspaces y sesiones.`,"tours.health.active.title":`Estado activo`,"tours.health.active.description":`Los back-offs de cuota, los wake-ups pendientes y los auto-loops en curso en este momento.`,"tours.search.title":`Búsqueda`,"tours.search.input.title":`Consulta`,"tours.search.input.description":`Coincide con nombres de workspaces y conversaciones de agentes.`,"tours.search.archived.title":`Archivados`,"tours.search.archived.description":`Incluir los workspaces archivados en los resultados.`,"tours.changelog.title":`Novedades`,"tours.changelog.list.title":`Versiones`,"tours.changelog.list.description":`Lo que cambió en cada versión, la más reciente primero.`,"settings.projectGroup.identity":`Identidad`,"settings.projectGroup.defaults":`Valores predeterminados`,"settings.projectGroup.prompts":`Prompts`,"settings.projectGroup.scripts":`Scripts`,"settings.projectPath":`Ruta del proyecto`,"settings.projectPathPlaceholder":`/ruta/al/proyecto`,"settings.displayName":`Nombre para mostrar`,"settings.displayNamePlaceholder":`Mi proyecto`,"settings.defaultSourceBranch":`Rama fuente por defecto`,"settings.defaultModel.project":`Modelo por defecto`,"settings.skipPermissions.project":`Omitir solicitudes de permisos`,"settings.prPromptTemplate.project":`Plantilla de prompt PR`,"settings.prPromptPlaceholder.project":`Instrucciones específicas del proyecto para la creación de PRs...`,"settings.reviewPromptTemplate.project":`Plantilla de prompt de revisión`,"settings.ciFixPromptTemplate.project":`Plantilla de prompt «Reparar CI»`,"settings.gitConventions.project":`Convenciones Git (por proyecto)`,"settings.gitConventionsEmpty":`Dejar vacío para usar las convenciones globales.`,"settings.notionStatus":`Estado ticket Notion`,"settings.notionStatusProperty":`Nombre de la propiedad`,"settings.notionStatusPropertyPlaceholder":`État, Status...`,"settings.notionInProgressStatus":`Valor a establecer`,"settings.notionInProgressStatusPlaceholder":`En progreso, In progress...`,"settings.notionStatusHint":`Cuando se crea un workspace con un ticket Notion, la propiedad especificada se establece a este valor. Ambos campos son obligatorios. Dejar vacío para desactivar.`,"settings.notionAssignee":`Asignación Notion`,"settings.notionAssigneeHint":`Cuando se crea un workspace con un ticket Notion, el usuario autenticado en el MCP de Notion se añade a esta propiedad People — solo si aún no tiene un asignado. Dejar vacío para desactivar.`,"settings.notionAssigneeProperty":`Nombre de la propiedad`,"settings.notionAssigneePropertyPlaceholder":`Desarrolladores, Assignees...`,"settings.notionUserId":`Tu UUID de Notion`,"settings.notionUserIdPlaceholder":`135d872b-594c-8126-9604-00024ad6e5b5`,"settings.notionUserIdHint":`Selecciona tu cuenta en la lista. Notion rechaza la asignación de bots en propiedades People — este campo es obligatorio para activar la auto-asignación.`,"settings.notionUsersRefresh":`Refrescar`,"settings.notionUsersLoading":`Cargando usuarios de Notion…`,"settings.notionUsersLoadFailed":`Error al cargar la lista: {error}`,"settings.notionUsersManualFallback":`Lista no disponible — pega tu UUID de Notion manualmente.`,"settings.devServer":`Servidor de desarrollo`,"settings.devServerStart":`Script de inicio`,"settings.devServerStartPlaceholder":`npm run dev`,"settings.devServerStop":`Script de parada`,"settings.devServerStopPlaceholder":`Opcional — el proceso se cerrará automáticamente si está vacío`,"settings.selectProject":`Selecciona un proyecto o añade uno nuevo`,"settings.projectPathRequired":`La ruta del proyecto es obligatoria.`,"settings.useGlobal":`Usar global`,"settings.saved":`Ajustes globales guardados.`,"settings.unsavedChanges":`Cambios sin guardar`,"settings.nav.general":`General`,"settings.nav.agents":`Agentes`,"settings.nav.skills":`Skills`,"settings.nav.prompts":`Prompts`,"settings.nav.scripts":`Scripts`,"settings.nav.workspaceTemplates":`Plantillas de workspace`,"workspaceTemplates.title":`Plantillas de workspace`,"workspaceTemplates.hint":`Preajustes guardados del formulario de creación. Elige uno en la página de creación; para modificarlo, cárgalo allí, ajústalo y guárdalo de nuevo con el mismo nombre.`,"workspaceTemplates.empty":`Todavía no hay plantillas. Rellena el formulario de creación y usa «Guardar como plantilla».`,"workspaceTemplates.anyProject":`Cualquier proyecto`,"workspaceTemplates.rename":`Renombrar`,"workspaceTemplates.renameTitle":`Renombrar la plantilla`,"workspaceTemplates.deleteConfirm":`¿Eliminar la plantilla «{name}»?`,"workspaceTemplates.deleted":`Plantilla «{name}» eliminada`,"settings.nav.notion":`Notion`,"settings.nav.forge":`Forge`,"settings.bitbucketCommunity":`Bitbucket Community`,"settings.bitbucketCommunityHint":`Las credenciales se guardan localmente y solo las usa bkt.`,"settings.bitbucketUsername":`Correo de Atlassian`,"settings.bitbucketToken":`Token API de Bitbucket`,"settings.nav.sentry":`Sentry`,"settings.nav.voice":`Voz`,"settings.nav.notifications":`Notificaciones`,"settings.nav.worktrees":`Worktrees`,"settings.nav.export":`Exportar`,"settings.help.general":`Idioma, acceso a la red y los valores por defecto que hereda cada proyecto.`,"settings.help.agents":`Modelo, esfuerzo y modo de permisos por defecto para cada motor.`,"settings.help.skills":`Qué suites de skills se le indica usar al agente.`,"settings.help.prompts":`Textos de prompt reutilizables: descripción de PR, review, corrección de CI, finalización.`,"settings.help.scripts":`Scripts de setup, limpieza y cambio de rama origen, además de los hooks de ciclo de vida.`,"settings.help.notion":`Importar una página de Notion como fuente de verdad de un workspace.`,"settings.help.sentry":`Crear un workspace a partir de una issue de Sentry.`,"settings.help.forge":`CLI de GitHub o GitLab usada para PRs y merge requests.`,"settings.help.voice":`Dictado y push-to-talk.`,"settings.help.notifications":`Sonidos, notificaciones del navegador y recordatorio de preguntas sin responder.`,"settings.help.worktrees":`Dónde se crean los worktrees, retención y borrado automático.`,"settings.help.projects":`Proyectos registrados y sus ajustes específicos por proyecto.`,"settings.help.templates":`Plantillas de prompt expandidas en la entrada del chat.`,"settings.help.workspaceTemplates":`Presets guardados del formulario de creación.`,"settings.help.export":`Exportar e importar todos los ajustes como JSON.`,"settings.openNav":`Abrir la navegación`,"settings.saveError":`Error al guardar los ajustes.`,"settings.projectSaved":`Proyecto guardado.`,"settings.projectSaveError":`Error al guardar el proyecto.`,"settings.projectDeleted":`Proyecto eliminado.`,"settings.deleteProjectConfirmTitle":`¿Eliminar proyecto?`,"settings.deleteProjectConfirmMessage":`¿Quitar «{name}» de tus proyectos? Esto solo elimina sus ajustes de Kōbō — tu código y tus worktrees no se modifican.`,"settings.projectDeleteError":`Error al eliminar el proyecto.`,"templates.title":`Plantillas`,"templates.newTemplate":`Nueva plantilla`,"templates.editTemplate":`Editar plantilla`,"templates.deleteTemplate":`Eliminar plantilla`,"templates.deleteConfirm":`¿Eliminar la plantilla '/{slug}'?`,"templates.deleteConfirmMessage":`Esta acción no se puede deshacer.`,"templates.slug":`Slug`,"templates.slugHint":`Minúsculas, dígitos, guiones. Máx. 64 caracteres.`,"templates.slugInvalid":`El slug solo puede contener minúsculas, dígitos y guiones`,"templates.slugDuplicate":`Ya existe una plantilla con este slug`,"templates.description":`Descripción`,"templates.descriptionHint":`Etiqueta corta mostrada en el dropdown.`,"templates.descriptionRequired":`La descripción es obligatoria`,"templates.contentRequired":`El contenido es obligatorio`,"templates.content":`Contenido`,"templates.contentHint":`Contenido de la plantilla. Usa {variable_name} para las sustituciones.`,"templates.availableVars":`Variables disponibles`,"templates.filePath":`Archivo: {path}`,"templates.empty":`Aún no hay plantillas.`,"templates.createFailed":`Error al crear la plantilla`,"templates.updateFailed":`Error al actualizar la plantilla`,"templates.deleteFailed":`Error al eliminar la plantilla`,"templates.save":`Guardar`,"templates.create":`Crear`,"templates.reloadDefaults":`Recargar plantillas predeterminadas`,"templates.reloadDefaultsHint":`Solo añade las plantillas predeterminadas que faltan. Las plantillas existentes (modificadas o no) nunca se sobrescriben.`,"templates.reloadDefaultsConfirmMessage":`Esta acción añadirá a la lista las plantillas predeterminadas que falten. Las plantillas existentes — incluidas las que hayas personalizado — no se tocarán. Si quieres restaurar una plantilla predeterminada que has modificado, elimínala primero y vuelve a ejecutar esta acción.`,"templates.reloadDefaultsSuccess":`{added} añadida(s), {kept} conservada(s)`,"templates.reloadDefaultsFailed":`Error al recargar las plantillas predeterminadas`,"templates.resetToDefault":`Restablecer al valor predeterminado`,"templates.resetConfirmTitle":`¿Restablecer la plantilla al valor predeterminado?`,"templates.resetConfirmMessage":`Esto sobrescribe tus cambios locales en /{slug} con el predeterminado. No se puede deshacer.`,"templates.resetSuccess":`Plantilla /{slug} restablecida al predeterminado`,"templates.resetFailed":`Error al restablecer la plantilla`,"chatInput.dropdownSkills":`Skills de Claude`,"chatInput.dropdownKobo":`Comandos Kōbō`,"chatInput.dropdownTemplates":`Plantillas`,"documents.title":`Documentos`,"documents.empty":`No se encontraron documentos`,"documents.refresh":`Actualizar`,"documents.back":`Volver`,"documents.loadFailed":`Error al cargar el documento`,"git.title":`Git`,"git.outputDialogTitle":`Git informó de un error`,"git.statsFailed":`No se pudo leer el estado de git`,"git.section.repository":`Repositorio`,"git.section.changes":`Cambios`,"git.section.pullRequest":`Pull request`,"git.section.actions":`Acciones`,"git.actions.more":`Más`,"git.localOnly":`solo local`,"git.pushed":`pushed`,"git.unpushed":`{count} sin push`,"git.commits":`{count} commit | {count} commits`,"git.commits.loading":`Cargando commits…`,"git.commits.empty":`Sin commits en esta rama`,"git.commits.pushed":`Pusheado`,"git.commits.unpushed":`Sin pushear`,"git.commits.clickToAppend":`click para agregar SHA al chat`,"git.commits.diffThisCommit":`Diff de este commit (vs padre)`,"git.compareCommits":`Comparar commits…`,"git.files":`{count} archivo | {count} archivos`,"git.staged":`{count} staged`,"git.modified":`{count} modificados`,"git.untracked":`{count} sin seguimiento`,"git.workingTreeEmpty":`Sin cambios sin confirmar`,"git.fileStaged":`Preparado`,"git.fileModified":`Modificado`,"git.fileUntracked":`Sin seguimiento`,"git.push":`Push`,"git.forcePush":`Force push`,"git.forcePushToggle":`Force push (--force-with-lease)`,"git.forcePushHint":`Más seguro que --force: el push se rechaza si el remoto tiene commits que no has visto. Úsalo tras un rebase o amend de commits ya pusheados.`,"git.branchForcePushed":`Rama force-pushed`,"git.pull":`Pull`,"git.pullNoUpstream":`No hay upstream para esta rama — hazle push primero para habilitar Pull.`,"git.sync":`Sync`,"git.createPrNoRemote":`Push la rama primero`,"git.viewRequest":`Ver {request}`,"git.createRequest":`Crear {request}`,"git.changeRequestBase":`Cambiar la rama base de la {request}`,"git.forgeCliMissing":`{cli} no está instalado — instálalo para usar las funciones de {request}`,"git.forgeNotAuthenticated":`No autenticado — ejecuta {cli} auth login`,"settings.forge":`Forge`,"settings.forge.auto":`Detección automática`,"settings.forge.github":`GitHub`,"settings.forge.gitlab":`GitLab`,"settings.forge.bitbucketCommunity":`Bitbucket Community (bkt)`,"settings.forge.none":`Ninguna`,"git.pullConfirmTitle":`¿Pull la rama?`,"git.pullConfirmMessage":`Pull {branch} desde el remoto (solo fast-forward).`,"git.branchPulled":`Rama actualizada`,"git.pullFailed":`Error al hacer pull`,"git.renameBranch":`Renombrar rama`,"git.renameBranchPrompt":"Renombrar `{branch}` a:","git.renameBranchSuccess":"Rama renombrada a `{branch}`","git.renameBranchFailed":`Error al renombrar la rama`,"git.renameBranchExists":"La rama `{branch}` ya existe localmente o en origin","git.diff":`Diff`,"git.diffReview":`Diff`,"git.diffReviewTooltip":`Abre el visor de diff en modo Review — comentarios en línea + envío por lotes al agente`,"pr.baseChanged":`Base de la PR cambiada: {oldBase} → {newBase}`,"pr.openPr":`Abrir PR`,"pr.openWorkspace":`Abrir el workspace`,"pr.dismiss":`Cerrar`,"git.rebase":`Rebase`,"git.rebaseConfirmTitle":`¿Rebase de la rama?`,"git.rebaseConfirmMessage":`Rebase sobre {branch}. Pueden surgir conflictos.`,"git.rebaseSuccess":`Rebase completado`,"git.rebaseFailed":`Rebase fallido`,"git.merge":`Merge`,"git.fetch":`Fetch`,"git.fetchSuccess":`Repositorio actualizado`,"git.fetchFailed":`Fallo al hacer fetch: {error}`,"git.mergeConfirmTitle":`¿Fusionar la rama?`,"git.mergeConfirmMessage":`Fusionar {branch} en esta rama. Puede haber conflictos.`,"git.mergeSuccess":`Merge completado`,"git.mergeFailed":`Merge fallido`,"git.commitFailed":`Commit fallido`,"git.commitChanges":`Confirmar cambios`,"git.commitDialogTitle":`Confirmar cambios sin confirmar`,"git.commitDialogDescription":`Escribe tu mensaje o pide al agente que revise y cree el commit.`,"git.commitMessage":`Mensaje de commit`,"git.commitManual":`Confirmar`,"git.commitWithAgent":`Pedir al agente`,"git.commitAgentSuccess":`Solicitud de commit enviada al agente`,"git.discardFailed":`Descarte fallido`,"git.conflictTitleMerge":`Conflictos de merge detectados`,"git.conflictTitleRebase":`Conflictos de rebase detectados`,"git.operationPausedTitle":`Operación Git para continuar`,"git.operationPausedSubtitle":`No hay archivos en conflicto. Git solo espera que continúes la operación.`,"git.conflictSubtitle":`{count} archivo(s) con conflictos. Elige cómo continuar.`,"git.conflictAbortConfirmTitle":`¿Descartar la resolución del conflicto?`,"git.conflictAbortConfirmMessage":`Todo lo que has resuelto en este {op} se descarta y el worktree vuelve a su estado anterior. Es irreversible.`,"git.conflictAbort":`Abortar`,"git.conflictContinue":`Continuar`,"git.conflictContinued":`Operación Git continuada`,"git.conflictResolveWithAgent":`Pedir al agente que resuelva`,"git.conflictAborted":`Operación abortada`,"git.conflictHandoffSuccess":`El agente está resolviendo los conflictos`,"git.dirtyTitleRebase":`Cambios sin confirmar bloquean el rebase`,"git.dirtyTitleMerge":`Cambios sin confirmar bloquean el merge`,"git.dirtyTitlePull":`Cambios sin confirmar bloquean el pull`,"git.dirtySubtitle":`{modified} modificado(s), {staged} preparado(s), {untracked} sin seguimiento. Elige cómo continuar.`,"git.dirtyStash":`Stash y reintentar`,"git.dirtyCommit":`Commit primero`,"git.dirtyCommitPlaceholder":`Mensaje del commit`,"git.dirtyCommitConfirm":`Commit y reintentar`,"git.dirtyDiscard":`Descartar cambios`,"git.dirtyDiscardConfirmTitle":`¿Descartar todos los cambios sin confirmar?`,"git.dirtyDiscardConfirmMessage":`Los cambios con seguimiento se perderán (git reset --hard). Los archivos sin seguimiento se conservan. Acción irreversible.`,"git.pushConfirmTitle":`¿Pushar la rama?`,"git.pushConfirmMessage":`Pushar {branch} al remoto.`,"git.pushConfirmMessagePrefix":`Pushar la rama`,"git.pushConfirmMessageSuffix":`al remoto.`,"git.changePrBaseTitle":`Cambiar rama base`,"git.changePrBaseMessage":`Ingrese la nueva rama destino para el {request}.`,"git.changePrBaseSuccess":`Rama base de la {request} actualizada`,"git.changePrBaseFailed":`No se pudo cambiar la rama base de la {request}`,"git.mergeRequest":`Fusionar {request}`,"git.mergeRequestConfirmTitle":`¿Fusionar {request}?`,"git.mergeRequestConfirmMessage":`Esto fusionará la {request} abierta en su rama de destino.`,"git.mergeRequestSuccess":`{request} fusionada`,"git.mergeRequestFailed":`No se pudo fusionar {request}`,"git.deleteRemoteBranch":`Eliminar rama remota`,"git.deleteRemoteBranchTitle":`¿Eliminar rama remota?`,"git.deleteRemoteBranchMessage":`La solicitud se fusionó. ¿Eliminar la rama remota {branch}?`,"git.deleteRemoteBranchSuccess":`Rama remota {branch} eliminada`,"git.deleteRemoteBranchFailed":`No se pudo eliminar la rama remota`,"git.changeSourceBranch":`Cambiar la rama de origen`,"git.changeSourceBranchTitle":`Cambiar la rama de origen`,"git.changeSourceBranchMessage":`Elige la nueva rama de origen. La rama de trabajo se reconstruirá encima.`,"git.changeSourceBranchDone":`Rama de origen cambiada a {branch}`,"git.changeSourceBranchAligned":`Rama de origen cambiada a {branch} (la rama no tenía commits propios)`,"git.changeSourceBranchTooMany":`La rama tiene demasiados commits propios ({n}) — rebásala manualmente`,"git.changeSourceBranchDirty":`Haz commit o stash de tus cambios antes de cambiar la rama de origen`,"git.changeSourceBranchAgentRunning":`Detén el agente antes de cambiar la rama de origen`,"git.changeSourceBranchErrorTitle":`Error al cambiar la rama de origen`,"git.changeSourceBranchErrorOngoing":`Una operación {op} sigue en curso en el worktree. Cancélala para volver a un estado limpio.`,"git.changeSourceBranchErrorAbort":`Cancelar la operación`,"git.changeSourceBranchLoading":`Cambiando la rama de origen…`,"git.changeSourceForcePushTitle":`¿Forzar el push de la rama reescrita?`,"git.changeSourceForcePushMessage":`El historial de la rama se reescribió. ¿Hacer force-push al remoto con --force-with-lease?`,"git.changeSourceForcePushDone":`Rama enviada con force-push`,"git.openEditor":`Abrir en editor`,"git.openEditorFailed":`No se pudo abrir el editor`,"git.branchPushed":`Rama enviada`,"git.pushFirst":`La rama no está en el remoto. Haz Push primero.`,"git.unpushedCommits":`Los commits locales no están enviados. Haz Push primero.`,"git.from":`desde`,"git.aheadBehindTooltip":`{ahead} commits por delante, {behind} por detrás de {source}`,"git.divergence.title":`Divergencia de rama`,"git.divergence.subtitle":`vs {source}`,"git.divergence.ahead":`↑ {count} por delante`,"git.divergence.behind":`↓ {count} por detrás`,"git.divergence.empty.ahead":`Sin commits por delante.`,"git.divergence.empty.behind":`Sin commits por detrás.`,"git.divergence.close":`Cerrar`,"git.divergence.loading":`Cargando commits…`,"git.divergence.failed":`No se pudo cargar la divergencia`,"git.divergence.retry":`Reintentar`,"git.prCreated":`{request} #{n} creada`,"git.pr.author":`Autor`,"git.pr.reviewers":`Revisores`,"git.pr.assignees":`Asignados`,"git.pr.labels":`Etiquetas`,"git.pr.changesRequestedBadge":`Cambios solicitados`,"git.pr.approvedBadge":`Aprobada`,"git.pr.ci.passed":`CI OK`,"git.pr.ci.failed":`CI fallida`,"git.pr.ci.pending":`CI en curso`,"git.pr.ci.failedCount":`{n} fallido(s)`,"git.pr.ci.pendingCount":`{n} en curso`,"git.pr.ci.passedCount":`{n} OK`,"git.pr.ci.skippedCount":`{n} omitido(s)`,"git.pr.ci.showPassed":`Mostrar {n} jobs OK`,"git.pr.ci.hidePassed":`Ocultar los jobs OK`,"toast.prChangesRequested":`Se solicitaron cambios en la PR #{n}`,"toast.prApproved":`La PR #{n} ha sido aprobada`,"toast.prReadyToMerge":`La PR #{n} está lista para merge`,"toast.prCiFailed":`La CI de la PR #{n} ha fallado`,"toast.prCiRecovered":`La CI de la PR #{n} se ha recuperado`,"toast.prMergeConflict":`La PR #{n} tiene conflictos de merge`,"toast.prMerged":`La PR #{n} se ha fusionado`,"devServer.title":`Servidor de desarrollo`,"devServer.noWorkspace":`Ningún workspace seleccionado`,"devServer.notConfigured":`No configurado —`,"devServer.goToSettings":`Ajustes`,"devServer.logs":`Logs`,"devServer.running":`En ejecución`,"devServer.starting":`Iniciando`,"devServer.stopping":`Deteniendo`,"devServer.error":`Error`,"devServer.stopped":`Detenido`,"devServer.unknown":`Desconocido`,"devServer.containers":`{count} contenedor | {count} contenedores`,"devServer.logDialog.title":`Logs del servidor de desarrollo`,"devServer.logDialog.empty":`No hay logs disponibles`,"notion.title":`Notion`,"tasks.title":`Tareas`,"notion.addTask":`Añadir tarea`,"notion.noUrl":`Sin URL de Notion`,"notion.subtasks":`{done}/{total} subtareas`,"notion.noTasks":`Sin tareas`,"notion.newTask":`Nueva tarea... (Enter para añadir, Esc para cancelar)`,"acceptance.title":`Criterios de aceptación`,"acceptance.addCriterion":`Añadir criterio`,"acceptance.newCriterion":`Nuevo criterio... (Enter para añadir, Esc para cancelar)`,"acceptance.empty":`Sin criterios de aceptación`,"tasks.askProgress":`Pedir al agente que revise el progreso`,"agentTodos.title":`Tareas del agente`,"agentTodos.empty":`Sin tareas del agente`,"subagents.title":`Sub-agentes`,"subagents.empty":`Aún no hay actividad de sub-agentes`,"subagents.tools":`{count} herramientas`,"subagents.running":`En ejecución: `,"stats.resetsAt":`Reset {value}`,"stats.usageBucket":`Bucket de uso {n}`,"quotaFooter.lastUpdated":`Última actualización: {time}`,"quotaFooter.empty":`Cargando…`,"quotaFooter.popover.title":`Uso de Claude Code`,"quotaFooter.popover.refreshNow":`Actualizar`,"quotaFooter.popover.resetsIn":`Se reinicia a las {value}`,"quotaFooter.popover.unauthenticated":`Auth requerida`,"quotaFooter.popover.unauthenticatedHint":`Ejecuta "claude" una vez para autenticarte.`,"quotaFooter.popover.error":`Error`,"quotaFooter.bucket.fiveHour":`5 horas`,"quotaFooter.bucket.sevenDay":`7 días`,"agent.error.spawn_failed":`No se pudo iniciar el agente`,"agent.error.parse_error":`No se pudo analizar un mensaje del agente`,"agent.error.rate_limit":`Límite de tasa alcanzado`,"agent.error.resume_failed":`Sesión no encontrada — iniciando sesión nueva`,"agent.error.other":`Error del agente`,"quotaBackoff.banner.title":`Reanudación automática a las {time}`,"quotaBackoff.banner.transientTitle":`Reanudación automática tras interrupción a las {time}`,"quotaBackoff.resumeNow":`Reanudar ahora`,"quotaBackoff.banner.tooltip":`Cuota de Claude agotada. El auto-loop se reanudará automáticamente cuando la cuota se restablezca a las {resets_at}.`,"quotaBackoff.banner.cancel":`Cancelar reanudación`,"quotaBackoff.cancelled":`Reanudación automática cancelada — puedes reanudar manualmente cuando quieras`,"rateLimitType.fiveHour":`Sesión 5h`,"rateLimitType.sevenDay":`Semanal`,"tooltip.addTask":`Añadir tarea`,"tooltip.removeTask":`Eliminar tarea`,"tooltip.addCriterion":`Añadir criterio`,"tooltip.removeCriterion":`Eliminar criterio`,"tooltip.startDevServer":`Iniciar servidor de desarrollo`,"tooltip.stopDevServer":`Detener servidor de desarrollo`,"tooltip.closeDiffViewer":`Cerrar visor de diff`,"tooltip.refreshLogs":`Actualizar logs`,"tooltip.closeDialog":`Cerrar`,"tooltip.refreshGitStats":`Actualizar estadísticas Git`,"tooltip.removeImage":`Eliminar imagen`,"tooltip.sendMessage":`Enviar mensaje`,"tools.title":`Herramientas`,"tools.runSetupScript":`Volver a ejecutar script de setup`,"tools.runSetupScriptTooltip":`Ejecutar el script de setup del proyecto en el worktree`,"tools.runSetupScriptConfirm":`¿Volver a ejecutar el script de setup en este workspace? Los artefactos existentes pueden ser sobrescritos.`,"tools.runSetupScriptBusy":`No se puede volver a ejecutar el setup mientras el agente está trabajando.`,"tools.noSetupScript":`Ningún script de setup configurado —`,"tools.setupScriptSuccess":`Script de setup completado con éxito.`,"tools.setupScriptFailed":`Falló el script de setup.`,"tools.openNotion":`Abrir en Notion`,"tools.openSentry":`Abrir en Sentry`,"tools.review":`Revisar cambios`,"tools.reviewTooltip":`Pedir al agente que revise los cambios de esta rama`,"tools.reviewBusy":`Agente ocupado — espera a que esté libre`,"tools.fixCi":`Reparar CI`,"tools.fixCiTooltip":`Pedir al agente que diagnostique y arregle los jobs de CI que fallan`,"tools.fixCiLaunched":`Acción «Reparar CI» enviada al agente`,"tools.fixCiFailed":`No se pudo lanzar la acción «Reparar CI»`,"tools.openFileManager":`Abrir en el explorador de archivos`,"tools.openFileManagerTooltip":`Abrir la carpeta del worktree en tu explorador de archivos configurado`,"tools.openFileManagerFailed":`No se pudo abrir el explorador de archivos`,"tools.openTerminal":`Abrir en terminal`,"tools.openTerminalTooltip":`Abrir el worktree en tu terminal configurada`,"tools.openTerminalFailed":`No se pudo abrir la terminal`,"review.title":`Iniciar revisión`,"review.subtitle":`Pide al agente que revise tus cambios y dé feedback.`,"review.additionalInstructions":`Instrucciones adicionales (opcional)`,"review.additionalInstructionsPlaceholder":`Añade instrucciones específicas para la revisión…`,"review.newSession":`Nueva sesión`,"review.newSessionHint":`Inicia una sesión nueva en vez de continuar la actual.`,"review.start":`Iniciar revisión`,"review.cancel":`Cancelar`,"review.launched":`Revisión iniciada`,"review.failed":`No se pudo iniciar la revisión`,"diff.title":`Diff`,"diff.side":`Lado a lado`,"diff.inline":`En línea`,"diff.hideUnchanged":`Ocultar código sin cambios`,"diff.showUnchanged":`Mostrar código sin cambios`,"diff.showUntracked":`Mostrar archivos no rastreados`,"diff.hideUntracked":`Ocultar archivos no rastreados`,"diff.rollbackToRemote":`Restaurar a la versión remota`,"diff.rollbackConfirm":`¿Restaurar {path} a su versión remota (origin)? Los cambios locales en este archivo se perderán.`,"diff.rollbackConfirmOk":`Restaurar`,"diff.rollbackDone":`Archivo restaurado a la versión remota`,"diff.rollbackDoneRemote":`Archivo restaurado a la versión remota`,"diff.rollbackDoneHead":`Cambios locales descartados (archivo restaurado al último commit)`,"diff.rollbackDoneDeleted":`Archivo no rastreado eliminado`,"diff.deleteUntracked":`Eliminar archivo no rastreado`,"diff.deleteUntrackedConfirm":`¿Eliminar definitivamente {path}? Este archivo no está rastreado por git — su contenido se perderá.`,"diff.deleteUntrackedConfirmOk":`Eliminar`,"diff.rollbackFailed":`Falló el rollback`,"diff.rollbackFailedDetail":`Rollback fallido: {error}`,"diff.modeInspect":`Editar`,"diff.modeReview":`Review`,"diff.addComment":`Añadir comentario`,"diff.replyComment":`Responder`,"diff.editComment":`Editar`,"diff.deleteComment":`Eliminar`,"diff.deleteCommentConfirm":`¿Eliminar este comentario?`,"diff.commentPlaceholder":`Escribe un comentario de revisión… (Markdown soportado)`,"diff.reviewDraft":`Borrador de revisión`,"diff.reviewEmpty":`Aún no hay comentarios — pasa el cursor sobre una línea del diff y haz clic en + para añadir uno.`,"diff.reviewGlobalPlaceholder":`Mensaje general de revisión (opcional)`,"diff.submitReview":`Enviar revisión ({n})`,"diff.reviewSubmitted":`Revisión enviada al agente`,"diff.reviewSubmitFailed":`No se pudo enviar la revisión: {error}`,"diff.scopeBranch":`Branch`,"diff.scopeUnpushed":`Sin pushear`,"diff.noChanges":`Sin cambios`,"diff.searchFiles":`Buscar archivos…`,"diff.noFileMatch":`Ningún archivo coincide`,"diff.selectFile":`Selecciona un archivo para ver el diff`,"diff.fileLoadFailed":`No se pudo cargar este diff`,"diff.fileLoadFailedHint":`El archivo en disco está intacto — solo falló la carga del diff.`,"diff.fileListLoadFailed":`No se pudo cargar la lista de archivos`,"diff.fileListLoadFailedHint":`Es un fallo de la petición, no una rama sin cambios.`,"diff.addToChat":`Añadir al chat`,"diff.compareTitle":`Comparar commits`,"diff.compareFrom":`Desde`,"diff.compareTo":`Hasta`,"diff.compareSubmit":`Comparar`,"diff.compareSourceBase":`{branch} (base de la rama)`,"diff.commitsReadOnly":`solo lectura`,"diffViewer.save":`Guardar`,"diffViewer.savedAt":`Guardado`,"diffViewer.saveFailed":`Error al guardar`,"diffViewer.saveFailedDetail":`Error al guardar: {error}`,"diffViewer.unsavedChanges.title":`Cambios sin guardar`,"diffViewer.unsavedChanges.message":`Tienes cambios sin guardar. ¿Qué quieres hacer?`,"diffViewer.unsavedChanges.save":`Guardar`,"diffViewer.unsavedChanges.cancel":`Cancelar`,"diffViewer.conflict.title":`Archivo modificado en disco`,"diffViewer.conflict.message":`El archivo fue modificado fuera de Kōbō desde que lo abriste.`,"diffViewer.conflict.reload":`Recargar (descartar cambios locales)`,"diffViewer.conflict.keep":`Mantener los míos`,"diffViewer.conflict.overwrite":`Sobrescribir de todos modos`,"diffViewer.conflict.overwriteHint":`Reemplaza el archivo del disco por tu versión. El otro cambio se pierde.`,"diffViewer.conflict.keepHint":`Mantiene tus cambios en el editor y adopta la nueva firma del disco, para que el próximo guardado funcione.`,"diffViewer.saveBlocked":`El agente está en marcha — detenlo para guardar tus cambios.`,"diffViewer.unsavedBanner":`Cambios sin guardar. Detén el agente para guardarlos.`,"diffViewer.closeConfirm.title":`Cambios sin guardar`,"diffViewer.closeConfirm.message":`Este archivo tiene cambios que nunca se guardaron. Cerrar el visor de diferencias los descarta.`,"diffViewer.closeConfirm.discard":`Cerrar sin guardar`,"diffViewer.criteriaRail":`Checklist de revisión`,"diffViewer.criteriaRailShow":`Mostrar la checklist de revisión`,"diffViewer.criteriaRailHide":`Ocultar la checklist de revisión`,"diffViewer.fileTreeShow":`Mostrar el árbol de archivos`,"diffViewer.fileTreeHide":`Ocultar el árbol de archivos`,"diffViewer.closeConfirm.saveAndClose":`Guardar y cerrar`,"diffViewer.agentRunning":`El agente está activo — detenlo para editar`,"diffViewer.fileDeleted":`Archivo eliminado`,"notification.agentFinished":`{name} — Agente terminado`,"notification.agentQuestion":`{name} — El agente hace una pregunta`,"notification.awaitingReminder":`{name} - sigue esperándote ({minutes} min)`,"notification.agentPermissionRequest":`{name} — El agente solicita un permiso`,"notification.autoLoopCompleted":`{name} — Auto-loop completado`,"notification.autoLoopWaitingForSlot":`{name} - El auto-loop espera un slot de agente libre ({running}/{limit} en curso)`,"notification.autoLoopStalled":`{name} — Auto-loop bloqueado (sin progreso)`,"notification.autoLoopError":`{name} — Auto-loop detenido por error`,"notification.autoLoopAwaitingClarification":`{name} — Auto-loop en pausa, esperando tu aclaración`,"notification.autoLoopPermissionOverridden":`{name} — Auto-loop forzó el modo plan a bypass`,"notification.agentError":`{name} — Error del agente`,"contextMenu.rename":`Renombrar`,"contextMenu.editDescription":`Editar la descripción`,"contextMenu.copyPath":`Copiar ruta del worktree`,"contextMenu.openEditor":`Abrir en editor`,"contextMenu.openFileManager":`Abrir en el explorador de archivos`,"contextMenu.unarchiveDisabledPurged":"El worktree se ha borrado del disco. Recréalo manualmente (`gh pr checkout` o `git worktree add`) — Kōbō detecta la restauración en menos de 30 s y reactiva el workspace automáticamente.","workspaceList.unarchiveBlockedPurged":"No se puede desarchivar: el worktree ya no existe en el disco. Recréalo manualmente (`gh pr checkout` o `git worktree add`) — Kōbō lo detecta en menos de 30 s y reactiva el workspace.","contextMenu.purgeWorktree":`Liberar espacio en disco (borrar worktree)`,"contextMenu.purgeWorktreeTooltip":`Borra el worktree del disco para recuperar espacio — el historial de mensajes y sesiones se conserva. Archiva automáticamente el workspace.`,"contextMenu.purgeWorktreeDialogTitle":`¿Liberar espacio en disco?`,"contextMenu.purgeWorktreeDialogMessage":`La carpeta del worktree de «{name}» será eliminada del disco. El historial de mensajes y sesiones se conserva. El workspace se archivará automáticamente. Esta acción no se puede deshacer en la versión actual.`,"contextMenu.purgeWorktreeDialogConfirm":`Borrar el worktree`,"contextMenu.purgeWorktreeSuccess":`Worktree borrado — espacio en disco recuperado.`,"settings.autoPurgeOnPrMerged":`Borrar worktree al mergear la PR`,"settings.autoPurgeOnPrMergedHint":`Cuando está activado, el worktree se borra del disco en cuanto se mergea la PR (además del archivado automático). El historial de mensajes se conserva.`,"settings.autoLoopMaxRetries":`Máximo de reintentos automáticos`,"settings.awaitingUserReminder":`Recordatorio de pregunta sin responder`,"settings.awaitingUserReminderHint":`Minutos que un workspace puede esperar tu respuesta antes de que Kōbō te avise, y luego en cada intervalo siguiente. 0 lo desactiva.`,"settings.localeLoadFailed":`No se pudo cargar ese idioma; se mantiene el actual.`,"settings.autoLoopMaxRetriesHint":`Detiene el bucle automático tras este número de errores de cuota o de servidor temporales.`,"settings.retentionTitle":`Retención del historial de conversación (desactivada por defecto)`,"settings.retentionWarning":`Activar esta opción elimina definitivamente de la base de datos el historial de conversación de los agentes, empezando por todo lo que ya sea más antiguo que la ventana. Los eventos eliminados no se pueden recuperar.`,"settings.retentionHint":`Se ejecuta una vez al arrancar el servidor. Los workspaces, tareas, sesiones, branches y worktrees nunca se tocan — solo la salida registrada de los agentes.`,"settings.retentionDaysLabel":`Eliminar eventos más antiguos de (días)`,"settings.retentionDaysHint":`0 — el valor por defecto — conserva todos los eventos indefinidamente. Indica un valor para activar la retención.`,"settings.retentionKeepLabel":`Eventos siempre conservados por workspace`,"settings.retentionKeepHint":`Los eventos más recientes de cada workspace sobreviven sea cual sea su antigüedad, para que un workspace antiguo pero aún abierto conserve un historial legible. Sugerido: 5000.`,"settings.retentionDisabledHint":`Retención desactivada: nunca se eliminará nada.`,"settings.retentionConfirmTitle":`¿Eliminar definitivamente el historial de conversación?`,"settings.retentionConfirmMessage":`Conservar solo {days} día(s) de historial eliminará definitivamente, en el próximo arranque del servidor, {count} de los {total} eventos de agente registrados — incluido todo lo que ya sea más antiguo. Es irreversible. ¿Continuar?`,"settings.retentionConfirmMessageUnknown":`Conservar solo {days} día(s) de historial eliminará definitivamente, en el próximo arranque del servidor, todos los eventos de agente más antiguos — incluido todo lo ya acumulado. No se ha podido calcular el volumen exacto. Es irreversible. ¿Continuar?`,"settings.purgeDocsTitle":`Cómo funciona el borrado — restauración y permisos`,"settings.purgeDocsRestoreTitle":`Restaurar un worktree borrado (detección automática)`,"settings.purgeDocsRestoreIntro":`Un workspace borrado conserva su historial de chat y los metadatos de la PR, pero la carpeta worktree ya no existe. Recréala manualmente con uno de estos comandos — Kōbō detecta la reaparición de la carpeta en menos de 30 segundos y reactiva automáticamente el workspace (desarchivar + limpiar flag de borrado):`,"settings.purgeDocsRestoreCommands":`# GitHub (con CLI gh):
12
12
  gh pr checkout [número-pr] --recurse-submodules
13
13
 
14
14
  # O directamente con git (funciona en GitHub aunque la rama se haya borrado):
@@ -0,0 +1 @@
1
+ import{B as e,C as t,wt as n,yt as r}from"./reactivity.esm-bundler-DtSZKRQB.js";import{$ as i,A as a,B as o,Bt as s,Rt as c,U as l,V as u,W as d,Wt as f,Z as p,fn as m,j as h,st as g,ut as _,vt as v,w as y,yn as b}from"./runtime-dom.esm-bundler-DgevF6KV.js";import{n as x}from"./vue-i18n-DtajJy_8.js";import{I as S,M as C,S as w,X as T,Z as E,b as D,c as O,l as k,y as ee}from"./QBtn-B7WFdfmy.js";import{a as A,i as j}from"./pinia-ClsyLh3i.js";import{tt as M}from"./index-CVfEYP1z.js";import{v as N}from"./permissionModes-BKhOcXIS.js";import{o as P}from"./use-tours-DoXhHOdJ.js";import{a as F,i as I,n as L,o as R,r as z,s as B}from"./efforts-DZpgeo-z.js";function V(e){e.keyCode===32&&T(e)}var H=E({name:`StepHeader`,props:{stepper:{},step:{},goToPanel:Function},setup(e,{attrs:n}){let{proxy:{$q:r}}=g(),i=t(null),a=o(()=>e.stepper.modelValue===e.step.name),s=o(()=>{let t=e.step.disable;return t===!0||t===``}),c=o(()=>{let t=e.step.error;return t===!0||t===``}),l=o(()=>{let t=e.step.done;return!s.value&&(t===!0||t===``)}),u=o(()=>{let t=e.step.headerNav;return!s.value&&e.stepper.headerNav&&(t===!0||t===``||t===void 0)}),d=o(()=>e.step.prefix&&(!a.value||e.stepper.activeIcon===`none`)&&(!c.value||e.stepper.errorIcon===`none`)&&(!l.value||e.stepper.doneIcon===`none`)),f=o(()=>{let t=e.step.icon||e.stepper.inactiveIcon;if(a.value){let n=e.step.activeIcon||e.stepper.activeIcon;return n===`none`?t:n||r.iconSet.stepper.active}if(c.value){let n=e.step.errorIcon||e.stepper.errorIcon;return n===`none`?t:n||r.iconSet.stepper.error}if(!s.value&&l.value){let n=e.step.doneIcon||e.stepper.doneIcon;return n===`none`?t:n||r.iconSet.stepper.done}return t}),p=o(()=>{let t=c.value?e.step.errorColor||e.stepper.errorColor:void 0;if(a.value){let n=e.step.activeColor||e.stepper.activeColor||e.step.color;return n===void 0?t:n}return t===void 0?!s.value&&l.value?e.step.doneColor||e.stepper.doneColor||e.step.color||e.stepper.inactiveColor:e.step.color||e.stepper.inactiveColor:t}),m=o(()=>`q-stepper__tab col-grow flex items-center no-wrap relative-position`+(p.value===void 0?``:` text-${p.value}`)+(c.value?` q-stepper__tab--error q-stepper__tab--error-with-`+(d.value?`prefix`:`icon`):``)+(a.value?` q-stepper__tab--active`:``)+(l.value?` q-stepper__tab--done`:``)+(u.value?` q-stepper__tab--navigation q-focusable q-hoverable`:``)+(s.value?` q-stepper__tab--disabled`:``)),h=o(()=>e.stepper.headerNav&&u.value);function v(){i.value?.focus({preventScroll:!0}),a.value||e.goToPanel(e.step.name)}function y(t){[13,32].includes(t.keyCode)&&(a.value||e.goToPanel(e.step.name),T(t))}return()=>{let t={class:m.value};u.value&&(t.onClick=v,t.onKeydown=V,t.onKeyup=y,t.role=`button`,t[`aria-current`]=a.value?`step`:void 0,Object.assign(t,s.value?{tabindex:-1,"aria-disabled":`true`}:{tabindex:n.tabindex||0}));let r=[_(`div`,{class:`q-focus-helper`,tabindex:-1,ref:i}),_(`div`,{class:`q-stepper__dot row flex-center q-stepper__line relative-position`},[_(`span`,{class:`row flex-center`},[d.value?e.step.prefix:_(k,{name:f.value})])])];if(e.step.title!==void 0&&e.step.title!==null){let t=[_(`div`,{class:`q-stepper__title`},e.step.title)];e.step.caption!==void 0&&e.step.caption!==null&&t.push(_(`div`,{class:`q-stepper__caption`},e.step.caption)),r.push(_(`div`,{class:`q-stepper__label q-stepper__line relative-position`},t))}return b(_(`div`,t,r),[[O,h.value]])}}});function U(e){return _(`div`,{class:`q-stepper__step-content`},[_(`div`,{class:`q-stepper__step-inner`},w(e.default))])}var W={setup(e,{slots:t}){return()=>U(t)}},G=E({name:`QStep`,props:{...z,icon:String,color:String,title:{type:String,required:!0},caption:String,prefix:[String,Number],doneIcon:String,doneColor:String,activeIcon:String,activeColor:String,errorIcon:String,errorColor:String,headerNav:{type:Boolean,default:!0},done:Boolean,error:Boolean,onScroll:[Function,Array]},setup(e,{slots:n,emit:r}){let{proxy:{$q:i}}=g(),a=v(S,C);if(a===C)return console.error(`QStep needs to be a child of QStepper`),C;let{getCache:s}=R(),c=t(null),l=o(()=>a.value.modelValue===e.name),u=o(()=>!i.platform.is.ios&&i.platform.is.chrome||!l.value||!a.value.vertical?{}:{onScroll(t){let{target:n}=t;n.scrollTop>0&&(n.scrollTop=0),e.onScroll!==void 0&&r(`scroll`,t)}}),d=o(()=>typeof e.name==`string`||typeof e.name==`number`?e.name:String(e.name));function f(){let e=a.value.vertical;return e&&a.value.keepAlive?_(h,a.value.keepAliveProps.value,l.value?[_(a.value.needsUniqueKeepAliveWrapper.value?s(d.value,()=>({...W,name:d.value})):W,{key:d.value},n.default)]:void 0):!e||l.value?U(n):void 0}return()=>_(`div`,{ref:c,class:`q-stepper__step`,role:`tabpanel`,...u.value},a.value.vertical?[_(H,{stepper:a.value,step:e,goToPanel:a.value.goToPanel}),a.value.animated?_(N,f):f()]:[f()])}}),te=/(-\w)/g;function K(e){let t={};for(let n in e){let r=n.replace(te,e=>e[1].toUpperCase());t[r]=e[n]}return t}var q=E({name:`QStepper`,props:{...A,...F,flat:Boolean,bordered:Boolean,alternativeLabels:Boolean,headerNav:Boolean,contracted:Boolean,headerClass:String,inactiveColor:String,inactiveIcon:String,doneIcon:String,doneColor:String,activeIcon:String,activeColor:String,errorIcon:String,errorColor:String},emits:I,setup(e,{slots:t}){let n=g(),r=j(e,n.proxy.$q),{updatePanelsList:i,isValidPanelName:a,updatePanelIndex:c,getPanelContent:l,getPanels:u,panelDirectives:d,goToPanel:f,keepAliveProps:p,needsUniqueKeepAliveWrapper:m}=L();s(S,o(()=>({goToPanel:f,keepAliveProps:p,needsUniqueKeepAliveWrapper:m,...e})));let h=o(()=>`q-stepper q-stepper--${e.vertical?`vertical`:`horizontal`}`+(e.flat?` q-stepper--flat`:``)+(e.bordered?` q-stepper--bordered`:``)+(r.value?` q-stepper--dark q-dark`:``)),v=o(()=>`q-stepper__header row items-stretch justify-between q-stepper__header--${e.alternativeLabels?`alternative`:`standard`}-labels`+(e.bordered||!e.flat?` q-stepper__header--border`:``)+(e.contracted?` q-stepper__header--contracted`:``)+(e.headerClass===void 0?``:` ${e.headerClass}`));function y(){let n=w(t.message,[]);if(e.vertical){a(e.modelValue)&&c();let r=_(`div`,{class:`q-stepper__content`},w(t.default));return n===void 0?[r]:n.concat(r)}return[_(`div`,{class:v.value},u().map(t=>{let n=K(t.props);return _(H,{key:n.name,stepper:e,step:n,goToPanel:f})})),n,ee(`div`,{class:`q-stepper__content q-panel-parent`},l(),`cont`,e.swipeable,()=>d.value)]}return()=>(i(t),_(`div`,{class:h.value},D(t.navigation,y())))}}),J={class:`slash-suggestions rounded-borders`},Y={class:`slash-section-header`},X=[`onMousedown`],Z={class:`slash-name text-caption`},Q={class:`slash-section-header`},ne=[`onMousedown`],re={class:`slash-name text-caption`},ie={key:0,class:`slash-description text-caption text-kobo-3 q-ml-xs`},ae={class:`slash-section-header`},oe=[`onMousedown`],$={class:`slash-name text-caption`},se={key:0,class:`slash-description text-caption text-kobo-3 q-ml-xs`},ce=P(i({__name:`SlashSuggestionsPopup`,props:{groupedDropdown:{},flatDropdown:{},selectedIndex:{}},emits:[`select`],setup(t,{emit:i}){let{t:o}=x(),s=i;function m(e){let t=B[`/${e}`];if(!t)return``;let n=t.descriptionKey,r=o(n);return r===n?``:r}return(i,h)=>(c(),d(`div`,J,[t.groupedDropdown.skills.length>0?(c(),d(a,{key:0},[u(`div`,Y,n(e(o)(`chatInput.dropdownSkills`)),1),(c(!0),d(a,null,f(t.groupedDropdown.skills,e=>(c(),d(`div`,{key:`skill-${e.name}`,class:r([`slash-item row items-center q-px-sm q-py-xs cursor-pointer`,{"slash-item--active":t.flatDropdown.indexOf(e)===t.selectedIndex}]),onMousedown:y(t=>s(`select`,e),[`prevent`])},[p(k,{name:`bolt`,size:`12px`,color:`primary`,class:`q-mr-xs`}),u(`span`,Z,n(e.name),1)],42,X))),128))],64)):l(``,!0),t.groupedDropdown.kobo.length>0?(c(),d(a,{key:1},[u(`div`,Q,n(e(o)(`chatInput.dropdownKobo`)),1),(c(!0),d(a,null,f(t.groupedDropdown.kobo,e=>(c(),d(`div`,{key:`kobo-${e.name}`,class:r([`slash-item row items-center q-px-sm q-py-xs cursor-pointer`,{"slash-item--active":t.flatDropdown.indexOf(e)===t.selectedIndex}]),onMousedown:y(t=>s(`select`,e),[`prevent`])},[p(k,{name:`terminal`,size:`12px`,color:`teal-4`,class:`q-mr-xs`}),u(`span`,re,`/`+n(e.name),1),m(e.name)?(c(),d(`span`,ie,`— `+n(m(e.name)),1)):l(``,!0)],42,ne))),128))],64)):l(``,!0),t.groupedDropdown.templates.length>0?(c(),d(a,{key:2},[u(`div`,ae,n(e(o)(`chatInput.dropdownTemplates`)),1),(c(!0),d(a,null,f(t.groupedDropdown.templates,e=>(c(),d(`div`,{key:`tpl-${e.name}`,class:r([`slash-item row items-center q-px-sm q-py-xs cursor-pointer`,{"slash-item--active":t.flatDropdown.indexOf(e)===t.selectedIndex}]),onMousedown:y(t=>s(`select`,e),[`prevent`])},[p(k,{name:`description`,size:`12px`,color:`amber-4`,class:`q-mr-xs`}),u(`span`,$,`/`+n(e.name),1),e.description?(c(),d(`span`,se,`— `+n(e.description),1)):l(``,!0)],42,oe))),128))],64)):l(``,!0)]))}}),[[`__scopeId`,`data-v-931c9d69`]]);function le(e,n,r={}){let i=M(),a=t([]),s=t(!1),c=t(``),l=t(0),u=0;async function d(){let e=Date.now();if(!(e-u<5e3&&a.value.length>0)){u=e;try{let e=await fetch(`/api/skills`);e.ok&&(a.value=await e.json())}catch{}}}function f(){let t=n();if(!t)return null;let r=t.selectionStart??e.value.length,i=e.value.slice(0,r).match(/\/([\w:.-]*)$/);return i?i[1]:null}async function p(){let e=f();e===null?s.value=!1:(await d(),c.value=e,s.value=!0,l.value=0)}function h(){s.value=!1}function g(t){let r=n();if(!r){e.value=t;return}let i=r.selectionStart??e.value.length,a=e.value.slice(0,i),o=e.value.slice(i),s=a.match(/\/[\w:.-]*$/);if(!s){e.value=t;return}let c=s.index??i;e.value=e.value.slice(0,c)+t+o}let _=o(()=>{let e=c.value.toLowerCase(),t=t=>e===``||t.toLowerCase().includes(e);return{skills:a.value.filter(e=>t(e)).map(e=>({type:`skill`,name:e})),kobo:r.excludeKoboCommands?[]:Object.keys(B).map(e=>e.replace(/^\//,``)).filter(e=>t(e)).map(e=>({type:`kobo`,name:e})),templates:i.templates.filter(e=>t(e.slug)).map(e=>({type:`template`,name:e.slug,description:e.description}))}}),v=o(()=>[..._.value.skills,..._.value.kobo,..._.value.templates]);return m(()=>v.value.length,e=>{if(e===0){l.value=0;return}l.value>=e&&(l.value=e-1)}),{skills:a,showSkills:s,skillFilter:c,selectedSkillIndex:l,groupedDropdown:_,flatDropdown:v,fetchSkills:d,detectSlashFragment:p,replaceFragmentWith:g,closeDropdown:h}}function ue(e,t){return e.replace(/\{(\w+)\}/g,(e,n)=>{let r=t[n];return r==null?e:String(r)})}function de(e){let t={};return e.workspace&&(t.workspace_name=e.workspace.name,t.working_branch=e.workspace.workingBranch,t.source_branch=e.workspace.sourceBranch,t.project_path=e.workspace.projectPath,t.worktree_path=e.workspace.worktreePath??`${e.workspace.projectPath}/.worktrees/${e.workspace.workingBranch}`),e.gitStats&&(t.commit_count=e.gitStats.commitCount,t.unpushed_count=e.gitStats.unpushedCount,t.files_changed=e.gitStats.filesChanged,t.insertions=e.gitStats.insertions,t.deletions=e.gitStats.deletions,e.gitStats.prNumber!=null&&(t.pr_number=e.gitStats.prNumber),e.gitStats.prUrl&&(t.pr_url=e.gitStats.prUrl),e.gitStats.prState&&(t.pr_state=e.gitStats.prState)),e.sessionName&&(t.session_name=e.sessionName),t}export{q as a,ce as i,ue as n,G as o,le as r,de as t};
@@ -1,4 +1,4 @@
1
- import{Q as e,_t as t}from"./index-BePGTdV0.js";var n;function r(e){if(e.length===0)throw Error(`Invalid tail call`);return[e.slice(0,e.length-1),e[e.length-1]]}function i(e,t,n=(e,t)=>e===t){if(e===t)return!0;if(!e||!t||e.length!==t.length)return!1;for(let r=0,i=e.length;r<i;r++)if(!n(e[r],t[r]))return!1;return!0}function a(e,t){let n=e.length-1;t<n&&(e[t]=e[n]),e.pop()}function o(e,t,n){return s(e.length,r=>n(e[r],t))}function s(e,t){let n=0,r=e-1;for(;n<=r;){let e=(n+r)/2|0,i=t(e);if(i<0)n=e+1;else if(i>0)r=e-1;else return e}return-(n+1)}function c(e,t,n){if(e|=0,e>=t.length)throw TypeError(`invalid index`);let r=t[Math.floor(t.length*Math.random())],i=[],a=[],o=[];for(let e of t){let t=n(e,r);t<0?i.push(e):t>0?a.push(e):o.push(e)}return e<i.length?c(e,i,n):e<i.length+o.length?o[0]:c(e-(i.length+o.length),a,n)}function l(e,t){let n=[],r;for(let i of e.slice(0).sort(t))!r||t(r[0],i)!==0?(r=[i],n.push(r)):r.push(i);return n}function*u(e,t){let n,r;for(let i of e)r!==void 0&&t(r,i)?n.push(i):(n&&(yield n),n=[i]),r=i;n&&(yield n)}function d(e,t){for(let n=0;n<=e.length;n++)t(n===0?void 0:e[n-1],n===e.length?void 0:e[n])}function f(e,t){for(let n=0;n<e.length;n++)t(n===0?void 0:e[n-1],e[n],n+1===e.length?void 0:e[n+1])}function p(e){return e.filter(e=>!!e)}function m(e){let t=0;for(let n=0;n<e.length;n++)e[n]&&(e[t]=e[n],t+=1);e.length=t}function h(e){return!Array.isArray(e)||e.length===0}function g(e){return Array.isArray(e)&&e.length>0}function _(e,t=e=>e){let n=new Set;return e.filter(e=>{let r=t(e);return!n.has(r)&&(n.add(r),!0)})}function v(e,t){let n=typeof t==`number`?e:0;typeof t==`number`?n=e:(n=0,t=e);let r=[];if(n<=t)for(let e=n;e<t;e++)r.push(e);else for(let e=n;e>t;e--)r.push(e);return r}function y(e,t,n){let r=e.slice(0,t),i=e.slice(t);return r.concat(n,i)}function b(e,t){let n=e.indexOf(t);n>-1&&(e.splice(n,1),e.unshift(t))}function x(e,t){let n=e.indexOf(t);n>-1&&(e.splice(n,1),e.push(t))}function S(e,t){for(let n of t)e.push(n)}function C(e,t){let n=[];for(let r of e){let e=t(r);e!==void 0&&n.push(e)}return n}function w(e){return Array.isArray(e)?e:[e]}function ee(e,t,n){let r=ne(e,t),i=e.length,a=n.length;e.length=i+a;for(let t=i-1;t>=r;t--)e[t+a]=e[t];for(let t=0;t<a;t++)e[t+r]=n[t]}function te(e,t,n,r){let i=ne(e,t),a=e.splice(i,n);return a===void 0&&(a=[]),ee(e,i,r),a}function ne(e,t){return t<0?Math.max(t+e.length,0):Math.min(t,e.length)}var re;(function(e){function t(e){return e<0}e.isLessThan=t;function n(e){return e<=0}e.isLessThanOrEqual=n;function r(e){return e>0}e.isGreaterThan=r;function i(e){return e===0}e.isNeitherLessOrGreaterThan=i,e.greaterThan=1,e.lessThan=-1,e.neitherLessOrGreaterThan=0})(re||={});function ie(e,t){return(n,r)=>t(e(n),e(r))}function ae(...e){return(t,n)=>{for(let r of e){let e=r(t,n);if(!re.isNeitherLessOrGreaterThan(e))return e}return re.neitherLessOrGreaterThan}}var oe=(e,t)=>e-t,se=(e,t)=>oe(+!!e,+!!t);function ce(e){return(t,n)=>-e(t,n)}function le(e){return(t,n)=>t===void 0?n===void 0?re.neitherLessOrGreaterThan:re.lessThan:n===void 0?re.greaterThan:e(t,n)}var ue=class{constructor(e){this.firstIdx=0,this.items=e,this.lastIdx=this.items.length-1}get length(){return this.lastIdx-this.firstIdx+1}takeWhile(e){let t=this.firstIdx;for(;t<this.items.length&&e(this.items[t]);)t++;let n=t===this.firstIdx?null:this.items.slice(this.firstIdx,t);return this.firstIdx=t,n}peek(){if(this.length!==0)return this.items[this.firstIdx]}dequeue(){let e=this.items[this.firstIdx];return this.firstIdx++,e}takeCount(e){let t=this.items.slice(this.firstIdx,this.firstIdx+e);return this.firstIdx+=e,t}},de=class e{constructor(e){this.iterate=e}toArray(){let e=[];return this.iterate(t=>(e.push(t),!0)),e}filter(t){return new e(e=>this.iterate(n=>!t(n)||e(n)))}map(t){return new e(e=>this.iterate(n=>e(t(n))))}findLast(e){let t;return this.iterate(n=>(e(n)&&(t=n),!0)),t}findLastMaxBy(e){let t,n=!0;return this.iterate(r=>((n||re.isGreaterThan(e(r,t)))&&(n=!1,t=r),!0)),t}};n=de,n.empty=new n(e=>{});var fe=class e{constructor(e){this._indexMap=e}static createSortPermutation(t,n){let r=Array.from(t.keys()).sort((e,r)=>n(t[e],t[r]));return new e(r)}apply(e){return e.map((t,n)=>e[this._indexMap[n]])}inverse(){let t=this._indexMap.slice();for(let e=0;e<this._indexMap.length;e++)t[this._indexMap[e]]=e;return new e(t)}};function pe(e){return e.reduce((e,t)=>e+t,0)}var me=new class{constructor(){this.listeners=[],this.unexpectedErrorHandler=function(e){setTimeout(()=>{throw e.stack?Ee.isErrorNoTelemetry(e)?new Ee(e.message+`
1
+ import{Q as e,_t as t}from"./index-CVfEYP1z.js";var n;function r(e){if(e.length===0)throw Error(`Invalid tail call`);return[e.slice(0,e.length-1),e[e.length-1]]}function i(e,t,n=(e,t)=>e===t){if(e===t)return!0;if(!e||!t||e.length!==t.length)return!1;for(let r=0,i=e.length;r<i;r++)if(!n(e[r],t[r]))return!1;return!0}function a(e,t){let n=e.length-1;t<n&&(e[t]=e[n]),e.pop()}function o(e,t,n){return s(e.length,r=>n(e[r],t))}function s(e,t){let n=0,r=e-1;for(;n<=r;){let e=(n+r)/2|0,i=t(e);if(i<0)n=e+1;else if(i>0)r=e-1;else return e}return-(n+1)}function c(e,t,n){if(e|=0,e>=t.length)throw TypeError(`invalid index`);let r=t[Math.floor(t.length*Math.random())],i=[],a=[],o=[];for(let e of t){let t=n(e,r);t<0?i.push(e):t>0?a.push(e):o.push(e)}return e<i.length?c(e,i,n):e<i.length+o.length?o[0]:c(e-(i.length+o.length),a,n)}function l(e,t){let n=[],r;for(let i of e.slice(0).sort(t))!r||t(r[0],i)!==0?(r=[i],n.push(r)):r.push(i);return n}function*u(e,t){let n,r;for(let i of e)r!==void 0&&t(r,i)?n.push(i):(n&&(yield n),n=[i]),r=i;n&&(yield n)}function d(e,t){for(let n=0;n<=e.length;n++)t(n===0?void 0:e[n-1],n===e.length?void 0:e[n])}function f(e,t){for(let n=0;n<e.length;n++)t(n===0?void 0:e[n-1],e[n],n+1===e.length?void 0:e[n+1])}function p(e){return e.filter(e=>!!e)}function m(e){let t=0;for(let n=0;n<e.length;n++)e[n]&&(e[t]=e[n],t+=1);e.length=t}function h(e){return!Array.isArray(e)||e.length===0}function g(e){return Array.isArray(e)&&e.length>0}function _(e,t=e=>e){let n=new Set;return e.filter(e=>{let r=t(e);return!n.has(r)&&(n.add(r),!0)})}function v(e,t){let n=typeof t==`number`?e:0;typeof t==`number`?n=e:(n=0,t=e);let r=[];if(n<=t)for(let e=n;e<t;e++)r.push(e);else for(let e=n;e>t;e--)r.push(e);return r}function y(e,t,n){let r=e.slice(0,t),i=e.slice(t);return r.concat(n,i)}function b(e,t){let n=e.indexOf(t);n>-1&&(e.splice(n,1),e.unshift(t))}function x(e,t){let n=e.indexOf(t);n>-1&&(e.splice(n,1),e.push(t))}function S(e,t){for(let n of t)e.push(n)}function C(e,t){let n=[];for(let r of e){let e=t(r);e!==void 0&&n.push(e)}return n}function w(e){return Array.isArray(e)?e:[e]}function ee(e,t,n){let r=ne(e,t),i=e.length,a=n.length;e.length=i+a;for(let t=i-1;t>=r;t--)e[t+a]=e[t];for(let t=0;t<a;t++)e[t+r]=n[t]}function te(e,t,n,r){let i=ne(e,t),a=e.splice(i,n);return a===void 0&&(a=[]),ee(e,i,r),a}function ne(e,t){return t<0?Math.max(t+e.length,0):Math.min(t,e.length)}var re;(function(e){function t(e){return e<0}e.isLessThan=t;function n(e){return e<=0}e.isLessThanOrEqual=n;function r(e){return e>0}e.isGreaterThan=r;function i(e){return e===0}e.isNeitherLessOrGreaterThan=i,e.greaterThan=1,e.lessThan=-1,e.neitherLessOrGreaterThan=0})(re||={});function ie(e,t){return(n,r)=>t(e(n),e(r))}function ae(...e){return(t,n)=>{for(let r of e){let e=r(t,n);if(!re.isNeitherLessOrGreaterThan(e))return e}return re.neitherLessOrGreaterThan}}var oe=(e,t)=>e-t,se=(e,t)=>oe(+!!e,+!!t);function ce(e){return(t,n)=>-e(t,n)}function le(e){return(t,n)=>t===void 0?n===void 0?re.neitherLessOrGreaterThan:re.lessThan:n===void 0?re.greaterThan:e(t,n)}var ue=class{constructor(e){this.firstIdx=0,this.items=e,this.lastIdx=this.items.length-1}get length(){return this.lastIdx-this.firstIdx+1}takeWhile(e){let t=this.firstIdx;for(;t<this.items.length&&e(this.items[t]);)t++;let n=t===this.firstIdx?null:this.items.slice(this.firstIdx,t);return this.firstIdx=t,n}peek(){if(this.length!==0)return this.items[this.firstIdx]}dequeue(){let e=this.items[this.firstIdx];return this.firstIdx++,e}takeCount(e){let t=this.items.slice(this.firstIdx,this.firstIdx+e);return this.firstIdx+=e,t}},de=class e{constructor(e){this.iterate=e}toArray(){let e=[];return this.iterate(t=>(e.push(t),!0)),e}filter(t){return new e(e=>this.iterate(n=>!t(n)||e(n)))}map(t){return new e(e=>this.iterate(n=>e(t(n))))}findLast(e){let t;return this.iterate(n=>(e(n)&&(t=n),!0)),t}findLastMaxBy(e){let t,n=!0;return this.iterate(r=>((n||re.isGreaterThan(e(r,t)))&&(n=!1,t=r),!0)),t}};n=de,n.empty=new n(e=>{});var fe=class e{constructor(e){this._indexMap=e}static createSortPermutation(t,n){let r=Array.from(t.keys()).sort((e,r)=>n(t[e],t[r]));return new e(r)}apply(e){return e.map((t,n)=>e[this._indexMap[n]])}inverse(){let t=this._indexMap.slice();for(let e=0;e<this._indexMap.length;e++)t[this._indexMap[e]]=e;return new e(t)}};function pe(e){return e.reduce((e,t)=>e+t,0)}var me=new class{constructor(){this.listeners=[],this.unexpectedErrorHandler=function(e){setTimeout(()=>{throw e.stack?Ee.isErrorNoTelemetry(e)?new Ee(e.message+`
2
2
 
3
3
  `+e.stack):Error(e.message+`
4
4
 
@@ -8,7 +8,7 @@ KOBO_WORKSPACE_ID — id Kōbō du workspace (stable après renommage)
8
8
  KOBO_WORKSPACE_NAME — nom affiché du workspace
9
9
  KOBO_FORGE — forge résolue : github / gitlab / none
10
10
  KOBO_PR_NUMBER — numéro de PR/MR sur la forge résolue (vide si aucune ouverte)`,"settings.changeSourceBranchScript.placeholder":`#!/usr/bin/env bash
11
- # ton script — utilise $KOBO_NEW_BASE / $KOBO_OLD_BASE / $KOBO_WORKING_BRANCH …`,"settings.changeSourceBranchScript.resetDefault":`Réinitialiser au défaut Kōbō`,"settings.changeSourceBranchScript.replaceConfirmTitle":`Réinitialiser le script ?`,"settings.changeSourceBranchScript.replaceConfirm":`Tes modifications seront remplacées par le script Kōbō par défaut. Continuer ?`,"settings.cleanupScriptHint":`Script shell exécuté dans le worktree après chaque fin de session de l'agent. En mode auto-loop, il ne s'exécute qu'une fois toutes les tâches terminées. Laisser vide pour désactiver.`,"settings.cleanupScriptPlaceholder":`ex. supprimer des fichiers temporaires, arrêter des conteneurs…`,"settings.cleanupScriptMode":`Quand l'exécuter`,"settings.cleanupScriptMode.idle":`À chaque fin de session — même s'il reste des tâches`,"settings.cleanupScriptMode.noTasks":`Uniquement quand plus aucune tâche Kōbō`,"settings.cleanupScriptOnlyOnChanges":`Lancer uniquement si des fichiers ont été modifiés, ajoutés ou supprimés`,"settings.cleanupScriptMode.inherit":`Hériter du réglage global`,"settings.taskPromptTemplate":`Prompt de tâche`,"settings.taskPromptTemplatePlaceholder":`Prompt inséré automatiquement dans la description de tâche…`,"settings.taskPromptTemplateHint":`Injecté automatiquement dans la description de tâche sur la page de création quand ce projet est sélectionné. S'il n'est pas modifié, il est remplacé en changeant de projet ; dès que vous l'éditez, votre texte est conservé.`,"settings.setupScriptPlaceholder":`npm install`,"settings.setupScriptHint":`Exécuté avec bash dans le worktree après sa création, avant le démarrage de l'agent. Pas besoin de shebang. En cas d'échec, le workspace passe en erreur. Timeout : 5 minutes.`,"settings.e2e.title":`Tests E2E`,"settings.e2e.framework":`Framework`,"settings.e2e.frameworkNone":`Aucun`,"settings.e2e.frameworkOther":`Autre`,"settings.e2e.skill":`Skill (optionnel)`,"settings.e2e.skillPlaceholder":`ex : cypress-tester`,"settings.e2e.prompt":`Guidance personnalisée (optionnel)`,"settings.e2e.promptPlaceholder":`ex : utiliser le page-object, cibler les data-testid`,"settings.e2e.helpText":`Quand configuré, l'agent de grooming auto-loop insère des sous-tâches E2E pour les fonctionnalités UI.`,"settings.finalization.title":`Finalisation de l'auto-loop`,"settings.finalization.helpText":`Optionnel : un prompt que l'agent exécute lors de la toute dernière itération de l'auto-loop. Typiquement utilisé pour les contrôles qualité finaux (lint, typecheck, tests). L'étape de grooming créera une tâche préfixée [FINAL] qui utilisera ce prompt.`,"settings.finalization.prompt":`Prompt de finalisation`,"settings.finalization.promptPlaceholder":`ex. Lance npm run lint et npm test, puis marque cette tâche comme terminée.`,"settings.editorCommand":`Commande éditeur`,"settings.editorCommandPlaceholder":`code, phpstorm, subl, vim...`,"settings.editorCommandHint":`Commande utilisée pour ouvrir le worktree dans votre éditeur. Le chemin du worktree est passé en argument.`,"settings.fileManagerCommand":`Commande explorateur de fichiers`,"settings.fileManagerCommandPlaceholder":`xdg-open, open, nautilus, dolphin, explorer...`,"settings.fileManagerCommandHint":`Commande utilisée pour ouvrir le worktree dans votre explorateur de fichiers. Le chemin du worktree est passé en argument. Laissez vide pour masquer le bouton.`,"settings.terminalCommand":`Commande du terminal`,"settings.terminalCommandHint":`Commande pour lancer le terminal dans le worktree. Placeholder {path} optionnel pour le répertoire.`,"settings.terminalCommandPlaceholder":`kitty · alacritty · gnome-terminal --working-directory={path}`,"settings.mcpSelection":`Sélection MCP Claude`,"settings.mcpAutoSelect":`Auto (premier MCP actif correspondant)`,"settings.notionMcp":`Clé MCP Notion`,"settings.sentryMcp":`Clé MCP Sentry`,"settings.mcpSelectionHint":`Les entrées actives sont lues depuis ~/.claude.json. Laisser Auto pour utiliser le comportement par défaut.`,"settings.configuredProjects":`Projets configurés`,"settings.noProjects":`Aucun projet configuré`,"settings.addProject":`Ajouter un projet`,"settings.copyFrom":`Copier les settings depuis`,"settings.copyFromPlaceholder":`(aucun — partir des valeurs par défaut)`,"settings.copyFromHint":`Copie tous les settings sauf le path, le nom affiché et la branche source.`,"settings.copyFromConfirmTitle":`Écraser les valeurs actuelles ?`,"settings.copyFromConfirm":`Cela écrasera les valeurs du formulaire avec les settings de « {project} ». Continuer ?`,"settings.newProject":`Nouveau projet`,"settings.editProject":`Modifier le projet`,"settings.onboardingTitle":`Visite guidée`,"settings.onboardingHint":`Revois la présentation des principaux éléments de l’interface.`,"settings.onboardingReplay":`Revoir la visite guidée`,"onboarding.list.title":`Espaces de travail`,"onboarding.list.description":`Chaque mission vit dans son propre espace — un git worktree, une branche et une session d’agent dédiés. Ils s’affichent tous ici.`,"onboarding.create.title":`Créer un espace de travail`,"onboarding.create.description":`Clique sur + pour lancer une nouvelle mission — depuis un ticket Notion, une issue Sentry, ou de zéro.`,"onboarding.search.title":`Recherche`,"onboarding.search.description":`Filtre tes espaces de travail par nom, ou cherche dans l’historique des conversations d’agents.`,"onboarding.health.title":`Santé`,"onboarding.health.description":`Vérifie l’état de Kōbō : base de données, agents actifs, intégrations, sauvegardes.`,"onboarding.changelog.title":`Nouveautés`,"onboarding.changelog.description":`Consulte les dernières évolutions de Kōbō : nouvelles fonctionnalités, correctifs, changements de comportement. Une pastille apparaît lorsqu'une release n'a pas encore été lue.`,"onboarding.settings.title":`Paramètres`,"onboarding.settings.description":`Modèles, scripts de cycle de vie, intégrations, voix — toute la configuration de Kōbō est ici. Cliquez sur Suivant pour parcourir chaque section.`,"onboarding.settings-general.title":`Général`,"onboarding.settings-general.description":`Langue de l’interface, projet par défaut et comportement global appliqué à chaque nouveau workspace.`,"onboarding.settings-agents.title":`Agents et modèles`,"onboarding.settings-agents.description":`Choisissez le moteur par défaut — Claude Code ou Codex —, le modèle et le mode de permission des agents.`,"onboarding.settings-skills.title":`Skills`,"onboarding.settings-skills.description":`Choisissez la suite de skills chargée par les agents : le préréglage recommandé ou votre sélection personnalisée.`,"onboarding.settings-prompts.title":`Prompts`,"onboarding.settings-prompts.description":`Modèle de description de PR et autres textes de prompt réutilisables par les agents.`,"onboarding.settings-scripts.title":`Scripts`,"onboarding.settings-scripts.description":`Scripts de cycle de vie exécutés au cleanup, à l’archivage et au setup d’un workspace — globaux ou par projet.`,"onboarding.settings-notion.title":`Notion`,"onboarding.settings-notion.description":`Connectez votre token d’intégration Notion pour importer des tickets comme missions de workspace.`,"onboarding.settings-sentry.title":`Sentry`,"onboarding.settings-sentry.description":`Importer une issue Sentry comme source de vérité d’un workspace.`,"onboarding.settings-forge.title":`Forge`,"onboarding.settings-forge.description":`Choisis GitHub, GitLab ou aucune, par projet. Kōbō pilote ta propre CLI gh / glab — il n’embarque aucun identifiant.`,"onboarding.settings-voice.title":`Voix`,"onboarding.settings-voice.description":`Dictée vocale : activez-la, choisissez le modèle Whisper et gérez le runtime de reconnaissance vocale local.`,"onboarding.settings-notifications.title":`Notifications`,"onboarding.settings-notifications.description":`Notifications sonores et navigateur pour les événements et changements d’état des agents.`,"onboarding.settings-worktrees.title":`Worktrees`,"onboarding.settings-worktrees.description":`Préfixes de branche Git et dossier où sont créés les worktrees des workspaces.`,"onboarding.settings-worktrees-purge.title":`Libérer l'espace disque automatiquement`,"onboarding.settings-worktrees-purge.description":"Active ce toggle pour que Kōbō supprime le dossier worktree (souvent plusieurs centaines de Mo de node_modules / vendor) dès qu'une PR est mergée. L'historique de chat et les métadonnées PR sont conservés. Tu peux recréer le worktree plus tard avec `gh pr checkout <pr>` — Kōbō détecte automatiquement la restauration dans les 30 secondes et réactive le workspace.","onboarding.settings-projects.title":`Projets`,"onboarding.settings-projects.description":`Enregistrez les dépôts sur lesquels vous travaillez. Cliquez sur « Ajouter un projet » pour pointer Kōbō vers un dépôt local — chaque workspace cible l’un de ces projets.`,"onboarding.settings-templates.title":`Modèles`,"onboarding.settings-templates.description":`Votre bibliothèque de modèles de prompt réutilisables — choisissez-en un pour pré-remplir le brief à la création d’un workspace.`,"onboarding.settings-export.title":`Import / Export`,"onboarding.settings-export.description":`Sauvegardez ou partagez la configuration de Kōbō, et exportez les données des workspaces dans un fichier.`,"onboarding.firstWorkspace.title":`Crée ton premier workspace`,"onboarding.firstWorkspace.description":`C’est tout l’objet de l’outil : une mission, un worktree, un agent. Ouvre la page de création pour démarrer.`,"onboarding.next":`Suivant`,"onboarding.prev":`Précédent`,"onboarding.done":`Terminé`,"onboarding.exitConfirm":`Quitter la visite guidée ? Vous pourrez la relancer à tout moment depuis les Paramètres.`,"settings.projectGroup.identity":`Identité`,"settings.projectGroup.defaults":`Valeurs par défaut`,"settings.projectGroup.prompts":`Prompts`,"settings.projectGroup.scripts":`Scripts`,"settings.projectPath":`Chemin du projet`,"settings.projectPathPlaceholder":`/chemin/vers/le/projet`,"settings.displayName":`Nom affiché`,"settings.displayNamePlaceholder":`Mon projet`,"settings.defaultSourceBranch":`Branche source par défaut`,"settings.defaultModel.project":`Modèle par défaut`,"settings.skipPermissions.project":`Ignorer les invites de permission`,"settings.prPromptTemplate.project":`Modèle de prompt PR`,"settings.prPromptPlaceholder.project":`Instructions spécifiques au projet pour la création de PR...`,"settings.reviewPromptTemplate.project":`Modèle de prompt de review`,"settings.ciFixPromptTemplate.project":`Modèle de prompt « Fix CI »`,"settings.gitConventions.project":`Conventions Git (projet)`,"settings.gitConventionsEmpty":`Laisser vide pour utiliser les conventions globales.`,"settings.notionStatus":`Statut ticket Notion`,"settings.notionStatusProperty":`Nom de la propriété`,"settings.notionStatusPropertyPlaceholder":`État, Status...`,"settings.notionInProgressStatus":`Valeur à définir`,"settings.notionInProgressStatusPlaceholder":`En cours, In progress...`,"settings.notionStatusHint":`Quand un workspace est créé avec un ticket Notion, la propriété spécifiée est mise à cette valeur. Les deux champs sont requis. Laisser vide pour désactiver.`,"settings.notionAssignee":`Assignation Notion`,"settings.notionAssigneeHint":`Quand un workspace est créé avec un ticket Notion, l'utilisateur authentifié sur le MCP Notion est ajouté à cette propriété People — uniquement si elle n'a pas déjà d'assigné. Laisser vide pour désactiver.`,"settings.notionAssigneeProperty":`Nom de la propriété`,"settings.notionAssigneePropertyPlaceholder":`Développeurs, Assignees...`,"settings.notionUserId":`Ton UUID Notion`,"settings.notionUserIdPlaceholder":`135d872b-594c-8126-9604-00024ad6e5b5`,"settings.notionUserIdHint":`Sélectionne ton compte dans la liste. Notion refuse l'assignation d'un bot — ce champ est obligatoire pour activer l'auto-assignation.`,"settings.notionUsersRefresh":`Rafraîchir`,"settings.notionUsersLoading":`Chargement des utilisateurs Notion…`,"settings.notionUsersLoadFailed":`Impossible de récupérer la liste : {error}`,"settings.notionUsersManualFallback":`Liste indisponible — colle ton UUID Notion manuellement.`,"settings.devServer":`Serveur de dev`,"settings.devServerStart":`Script de démarrage`,"settings.devServerStartPlaceholder":`npm run dev`,"settings.devServerStop":`Script d'arrêt`,"settings.devServerStopPlaceholder":`Optionnel — le processus sera tué automatiquement si vide`,"settings.selectProject":`Sélectionnez un projet ou ajoutez-en un nouveau`,"settings.useGlobal":`Utiliser le global`,"settings.saved":`Paramètres généraux enregistrés.`,"settings.unsavedChanges":`Modifications non enregistrées`,"settings.nav.general":`Général`,"settings.nav.agents":`Agents`,"settings.nav.skills":`Skills`,"settings.nav.prompts":`Prompts`,"settings.nav.scripts":`Scripts`,"settings.nav.workspaceTemplates":`Templates de workspace`,"workspaceTemplates.title":`Templates de workspace`,"workspaceTemplates.hint":`Préréglages enregistrés du formulaire de création. Choisissez-en un sur la page de création ; pour en modifier un, chargez-le là, ajustez, puis réenregistrez-le sous le même nom.`,"workspaceTemplates.empty":`Aucun template pour l'instant. Remplissez le formulaire de création et utilisez « Enregistrer comme template ».`,"workspaceTemplates.anyProject":`Tout projet`,"workspaceTemplates.rename":`Renommer`,"workspaceTemplates.renameTitle":`Renommer le template`,"workspaceTemplates.deleteConfirm":`Supprimer le template « {name} » ?`,"workspaceTemplates.deleted":`Template « {name} » supprimé`,"settings.nav.notion":`Notion`,"settings.nav.forge":`Forge`,"settings.bitbucketCommunity":`Bitbucket Community`,"settings.bitbucketCommunityHint":`Les identifiants restent locaux et sont utilisés uniquement par bkt.`,"settings.bitbucketUsername":`E-mail Atlassian`,"settings.bitbucketToken":`Token API Bitbucket`,"settings.nav.sentry":`Sentry`,"settings.nav.voice":`Voix`,"settings.nav.notifications":`Notifications`,"settings.nav.worktrees":`Worktrees`,"settings.nav.export":`Export`,"settings.openNav":`Ouvrir la navigation`,"settings.saveError":`Erreur lors de l'enregistrement des paramètres.`,"settings.projectSaved":`Projet enregistré.`,"settings.projectSaveError":`Erreur lors de l'enregistrement du projet.`,"settings.projectDeleted":`Projet supprimé.`,"settings.deleteProjectConfirmTitle":`Supprimer le projet ?`,"settings.deleteProjectConfirmMessage":`Retirer « {name} » de vos projets ? Cela supprime uniquement ses réglages Kōbō — votre code et vos worktrees ne sont pas touchés.`,"settings.projectDeleteError":`Erreur lors de la suppression du projet.`,"settings.projectPathRequired":`Le chemin du projet est requis.`,"templates.title":`Modèles`,"templates.newTemplate":`Nouveau modèle`,"templates.editTemplate":`Modifier le modèle`,"templates.deleteTemplate":`Supprimer le modèle`,"templates.deleteConfirm":`Supprimer le modèle '/{slug}' ?`,"templates.deleteConfirmMessage":`Cette action est irréversible.`,"templates.slug":`Slug`,"templates.slugHint":`Lettres minuscules, chiffres, tirets. Max 64 caractères.`,"templates.slugInvalid":`Le slug ne peut contenir que des lettres minuscules, chiffres et tirets`,"templates.slugDuplicate":`Un modèle avec ce slug existe déjà`,"templates.description":`Description`,"templates.descriptionHint":`Libellé court affiché dans le dropdown.`,"templates.descriptionRequired":`La description est requise`,"templates.contentRequired":`Le contenu est requis`,"templates.content":`Contenu`,"templates.contentHint":`Contenu du modèle. Utilise {variable_name} pour les substitutions.`,"templates.availableVars":`Variables disponibles`,"templates.filePath":`Fichier : {path}`,"templates.empty":`Aucun modèle pour l'instant.`,"templates.createFailed":`Échec de la création du modèle`,"templates.updateFailed":`Échec de la modification du modèle`,"templates.deleteFailed":`Échec de la suppression du modèle`,"templates.save":`Enregistrer`,"templates.create":`Créer`,"templates.reloadDefaults":`Recharger les modèles par défaut`,"templates.reloadDefaultsHint":`Ajoute uniquement les modèles par défaut manquants. Les modèles existants (même modifiés) ne sont jamais écrasés.`,"templates.reloadDefaultsConfirmMessage":`Cette action ajoute les modèles par défaut absents de la liste. Les modèles existants — y compris ceux que tu as modifiés — ne seront pas touchés. Si tu veux récupérer la version d'origine d'un modèle modifié, supprime-le d'abord puis relance cette action.`,"templates.reloadDefaultsSuccess":`{added} ajouté(s), {kept} conservé(s)`,"templates.reloadDefaultsFailed":`Échec du rechargement des modèles par défaut`,"templates.resetToDefault":`Réinitialiser au défaut`,"templates.resetConfirmTitle":`Réinitialiser le template au défaut ?`,"templates.resetConfirmMessage":`Cela écrase vos modifications locales de /{slug} par le défaut intégré. Action irréversible.`,"templates.resetSuccess":`Template /{slug} réinitialisé au défaut`,"templates.resetFailed":`Échec de la réinitialisation du template`,"chatInput.dropdownSkills":`Skills Claude`,"chatInput.dropdownKobo":`Commandes Kōbō`,"chatInput.dropdownTemplates":`Modèles`,"documents.title":`Documents`,"documents.empty":`Aucun document trouvé`,"documents.refresh":`Actualiser`,"documents.back":`Retour`,"documents.loadFailed":`Échec du chargement du document`,"git.title":`Git`,"git.outputDialogTitle":`Git a signalé une erreur`,"git.statsFailed":`L’état git n’a pas pu être lu`,"git.section.repository":`Dépôt`,"git.section.changes":`Modifications`,"git.section.pullRequest":`Pull request`,"git.section.actions":`Actions`,"git.actions.more":`Plus`,"git.localOnly":`local uniquement`,"git.pushed":`pushé`,"git.unpushed":`{count} non pushé`,"git.commits":`{count} commit | {count} commits`,"git.commits.loading":`Chargement des commits…`,"git.commits.empty":`Aucun commit sur cette branche`,"git.commits.pushed":`Pushé`,"git.commits.unpushed":`Non pushé`,"git.commits.clickToAppend":`clique pour ajouter le SHA au chat`,"git.commits.diffThisCommit":`Diff de ce commit (vs parent)`,"git.compareCommits":`Comparer des commits…`,"git.files":`{count} fichier | {count} fichiers`,"git.staged":`{count} indexé`,"git.modified":`{count} modifié`,"git.untracked":`{count} non suivi`,"git.workingTreeEmpty":`Aucune modification non commitée`,"git.fileStaged":`Indexé`,"git.fileModified":`Modifié`,"git.fileUntracked":`Non suivi`,"git.push":`Push`,"git.forcePush":`Force push`,"git.forcePushToggle":`Force push (--force-with-lease)`,"git.forcePushHint":`Plus sûr que --force : le push est rejeté si le remote a des commits que tu n’as pas vus. À utiliser après un rebase ou un amend de commits déjà push.`,"git.branchForcePushed":`Branche force-pushée`,"git.pull":`Pull`,"git.pullNoUpstream":`Pas d'upstream pour cette branche — push-la d'abord pour activer Pull.`,"git.sync":`Sync`,"git.createPrNoRemote":`Push la branche d'abord`,"git.viewRequest":`Voir la {request}`,"git.createRequest":`Créer une {request}`,"git.changeRequestBase":`Changer la branche cible de la {request}`,"git.forgeCliMissing":`{cli} n'est pas installé — installez-le pour les fonctions {request}`,"git.forgeNotAuthenticated":`Non authentifié — exécutez {cli} auth login`,"settings.forge":`Forge`,"settings.forge.auto":`Détection automatique`,"settings.forge.github":`GitHub`,"settings.forge.gitlab":`GitLab`,"settings.forge.bitbucketCommunity":`Bitbucket Community (bkt)`,"settings.forge.none":`Aucune`,"git.pullConfirmTitle":`Pull la branche ?`,"git.pullConfirmMessage":`Pull {branch} depuis la remote (fast-forward uniquement).`,"git.branchPulled":`Branche pull`,"git.pullFailed":`Échec du pull`,"git.renameBranch":`Renommer la branche`,"git.renameBranchPrompt":"Renommer `{branch}` en :","git.renameBranchSuccess":"Branche renommée en `{branch}`","git.renameBranchFailed":`Échec du renommage`,"git.renameBranchExists":"La branche `{branch}` existe déjà (locale ou sur origin)","git.diff":`Diff`,"git.diffReview":`Diff`,"git.diffReviewTooltip":`Ouvre le diff viewer en mode Review — commentaires inline + soumission groupée à l'agent`,"pr.baseChanged":`Base de la PR modifiée : {oldBase} → {newBase}`,"pr.openPr":`Ouvrir la PR`,"pr.openWorkspace":`Ouvrir le workspace`,"pr.dismiss":`Fermer`,"git.rebase":`Rebase`,"git.rebaseConfirmTitle":`Rebase la branche ?`,"git.rebaseConfirmMessage":`Rebase sur {branch}. Des conflits peuvent survenir.`,"git.rebaseSuccess":`Rebase terminé`,"git.rebaseFailed":`Rebase échoué`,"git.merge":`Merge`,"git.fetch":`Fetch`,"git.fetchSuccess":`Dépôt récupéré`,"git.fetchFailed":`Échec du fetch : {error}`,"git.mergeConfirmTitle":`Fusionner la branche ?`,"git.mergeConfirmMessage":`Fusionner {branch} dans cette branche. Des conflits sont possibles.`,"git.mergeSuccess":`Merge terminé`,"git.mergeFailed":`Merge échoué`,"git.commitFailed":`Commit échoué`,"git.commitChanges":`Committer les modifications`,"git.commitDialogTitle":`Committer les modifications non commitées`,"git.commitDialogDescription":`Saisissez votre message ou demandez à l’agent d’inspecter et de créer le commit.`,"git.commitMessage":`Message de commit`,"git.commitManual":`Committer`,"git.commitWithAgent":`Demander à l’agent`,"git.commitAgentSuccess":`Demande de commit envoyée à l’agent`,"git.discardFailed":`Abandon échoué`,"git.conflictTitleMerge":`Conflits de merge détectés`,"git.conflictTitleRebase":`Conflits de rebase détectés`,"git.operationPausedTitle":`Opération Git à poursuivre`,"git.operationPausedSubtitle":`Aucun fichier en conflit. Git attend simplement que tu poursuives l’opération.`,"git.conflictSubtitle":`{count} fichier(s) en conflit. Choisis comment continuer.`,"git.conflictAbortConfirmTitle":`Abandonner la résolution du conflit ?`,"git.conflictAbortConfirmMessage":`Tout ce que tu as résolu dans ce {op} est jeté et le worktree revient à son état d’avant. C’est irréversible.`,"git.conflictAbort":`Abandonner`,"git.conflictContinue":`Continuer`,"git.conflictContinued":`Opération Git poursuivie`,"git.conflictResolveWithAgent":`Demander à l'agent de résoudre`,"git.conflictAborted":`Opération abandonnée`,"git.conflictHandoffSuccess":`L'agent résout les conflits`,"git.dirtyTitleRebase":`Des modifications non commitées bloquent le rebase`,"git.dirtyTitleMerge":`Des modifications non commitées bloquent le merge`,"git.dirtyTitlePull":`Des modifications non commitées bloquent le pull`,"git.dirtySubtitle":`{modified} modifié(s), {staged} indexé(s), {untracked} non suivi(s). Choisis comment continuer.`,"git.dirtyStash":`Stash & réessayer`,"git.dirtyCommit":`Commit d'abord`,"git.dirtyCommitPlaceholder":`Message de commit`,"git.dirtyCommitConfirm":`Commit & réessayer`,"git.dirtyDiscard":`Abandonner les modifs`,"git.dirtyDiscardConfirmTitle":`Abandonner toutes les modifications non commitées ?`,"git.dirtyDiscardConfirmMessage":`Les modifications suivies seront perdues (git reset --hard). Les fichiers non suivis sont conservés. Action irréversible.`,"git.pushConfirmTitle":`Pusher la branche ?`,"git.pushConfirmMessage":`Pusher {branch} vers le dépôt distant.`,"git.pushConfirmMessagePrefix":`Pusher la branche`,"git.pushConfirmMessageSuffix":`vers le dépôt distant.`,"git.changePrBaseTitle":`Changer la branche cible`,"git.changePrBaseMessage":`Entrez la nouvelle branche cible pour la {request}.`,"git.changePrBaseSuccess":`Branche cible de la {request} mise à jour`,"git.changePrBaseFailed":`Impossible de changer la branche cible de la {request}`,"git.mergeRequest":`Fusionner la {request}`,"git.mergeRequestConfirmTitle":`Fusionner la {request} ?`,"git.mergeRequestConfirmMessage":`Cette action fusionne la {request} ouverte dans sa branche cible.`,"git.mergeRequestSuccess":`{request} fusionnée`,"git.mergeRequestFailed":`Impossible de fusionner la {request}`,"git.deleteRemoteBranch":`Supprimer la branche distante`,"git.deleteRemoteBranchTitle":`Supprimer la branche distante ?`,"git.deleteRemoteBranchMessage":`La demande a été fusionnée. Supprimer la branche distante {branch} ?`,"git.deleteRemoteBranchSuccess":`Branche distante {branch} supprimée`,"git.deleteRemoteBranchFailed":`Impossible de supprimer la branche distante`,"git.changeSourceBranch":`Changer la branche source`,"git.changeSourceBranchTitle":`Changer la branche source`,"git.changeSourceBranchMessage":`Choisis la nouvelle branche source. La branche de travail sera reconstruite par-dessus.`,"git.changeSourceBranchDone":`Branche source changée vers {branch}`,"git.changeSourceBranchAligned":`Branche source changée vers {branch} (la branche n'avait aucun commit propre)`,"git.changeSourceBranchTooMany":`La branche a trop de commits propres ({n}) — rebase-la manuellement`,"git.changeSourceBranchDirty":`Commit ou stash tes changements avant de changer la branche source`,"git.changeSourceBranchAgentRunning":`Arrête l'agent avant de changer la branche source`,"git.changeSourceBranchErrorTitle":`Échec du changement de branche source`,"git.changeSourceBranchErrorOngoing":`Une opération {op} est encore en cours sur le worktree. Annule-la pour revenir à un état propre.`,"git.changeSourceBranchErrorAbort":`Annuler l'opération`,"git.changeSourceBranchLoading":`Changement de la branche source…`,"git.changeSourceForcePushTitle":`Force-push de la branche réécrite ?`,"git.changeSourceForcePushMessage":`L'historique de la branche a été réécrit. La force-pusher vers le remote avec --force-with-lease ?`,"git.changeSourceForcePushDone":`Branche force-pushée`,"git.openEditor":`Ouvrir dans l'éditeur`,"git.openEditorFailed":`Impossible d'ouvrir l'éditeur`,"git.branchPushed":`Branche pushée`,"git.pushFirst":`La branche n'est pas sur le dépôt distant. Cliquez d'abord sur Push.`,"git.unpushedCommits":`Les commits locaux ne sont pas pushés. Cliquez d'abord sur Push.`,"git.from":`depuis`,"git.aheadBehindTooltip":`{ahead} commits en avance, {behind} en retard sur {source}`,"git.divergence.title":`Divergence de branche`,"git.divergence.subtitle":`vs {source}`,"git.divergence.ahead":`↑ {count} en avance`,"git.divergence.behind":`↓ {count} en retard`,"git.divergence.empty.ahead":`Aucun commit en avance.`,"git.divergence.empty.behind":`Aucun commit en retard.`,"git.divergence.close":`Fermer`,"git.divergence.loading":`Chargement des commits…`,"git.divergence.failed":`Échec du chargement de la divergence`,"git.divergence.retry":`Réessayer`,"git.prCreated":`{request} #{n} créée`,"git.pr.author":`Auteur`,"git.pr.reviewers":`Relecteurs`,"git.pr.assignees":`Assignés`,"git.pr.labels":`Labels`,"git.pr.changesRequestedBadge":`Modifications demandées`,"git.pr.approvedBadge":`Approuvée`,"git.pr.ci.passed":`CI OK`,"git.pr.ci.failed":`CI en échec`,"git.pr.ci.pending":`CI en cours`,"git.pr.ci.failedCount":`{n} en échec`,"git.pr.ci.pendingCount":`{n} en cours`,"git.pr.ci.passedCount":`{n} OK`,"git.pr.ci.skippedCount":`{n} ignoré(s)`,"git.pr.ci.showPassed":`Afficher les {n} jobs réussis`,"git.pr.ci.hidePassed":`Masquer les jobs réussis`,"toast.prChangesRequested":`Des modifications ont été demandées sur la PR #{n}`,"toast.prApproved":`La PR #{n} a été approuvée`,"toast.prReadyToMerge":`La PR #{n} est prête à merger`,"toast.prCiFailed":`La CI de la PR #{n} est en échec`,"toast.prCiRecovered":`La CI de la PR #{n} est rétablie`,"toast.prMergeConflict":`La PR #{n} a un conflit de merge`,"toast.prMerged":`La PR #{n} a été mergée`,"devServer.title":`Serveur de dev`,"devServer.noWorkspace":`Aucun espace de travail sélectionné`,"devServer.notConfigured":`Non configuré —`,"devServer.goToSettings":`Paramètres`,"devServer.logs":`Logs`,"devServer.running":`En cours`,"devServer.starting":`Démarrage`,"devServer.stopping":`Arrêt`,"devServer.error":`Erreur`,"devServer.stopped":`Arrêté`,"devServer.unknown":`Inconnu`,"devServer.containers":`{count} conteneur | {count} conteneurs`,"devServer.logDialog.title":`Logs du serveur de dev`,"devServer.logDialog.empty":`Aucun log disponible`,"notion.title":`Notion`,"tasks.title":`Tâches`,"notion.addTask":`Ajouter une tâche`,"notion.noUrl":`Aucune URL Notion`,"notion.subtasks":`{done}/{total} sous-tâches`,"notion.noTasks":`Aucune tâche`,"notion.newTask":`Nouvelle tâche... (Entrée pour ajouter, Échap pour annuler)`,"acceptance.title":`Critères d'acceptation`,"acceptance.addCriterion":`Ajouter un critère`,"acceptance.newCriterion":`Nouveau critère... (Entrée pour ajouter, Échap pour annuler)`,"acceptance.empty":`Aucun critère d'acceptation`,"tasks.askProgress":`Demander à l'agent de vérifier sa progression`,"agentTodos.title":`Todos de l'agent`,"agentTodos.empty":`Aucun todo de l'agent`,"subagents.title":`Sub-agents`,"subagents.empty":`Aucune activité de sub-agent`,"subagents.tools":`{count} outils`,"subagents.running":`En cours : `,"stats.resetsAt":`Reset {value}`,"stats.usageBucket":`Quota {n}`,"quotaFooter.lastUpdated":`Dernière mise à jour : {time}`,"quotaFooter.empty":`Chargement…`,"quotaFooter.popover.title":`Utilisation Claude Code`,"quotaFooter.popover.refreshNow":`Rafraîchir`,"quotaFooter.popover.resetsIn":`Réinitialise à {value}`,"quotaFooter.popover.unauthenticated":`Auth requise`,"quotaFooter.popover.unauthenticatedHint":`Lancez "claude" une fois pour vous authentifier.`,"quotaFooter.popover.error":`Erreur`,"quotaFooter.bucket.fiveHour":`5 heures`,"quotaFooter.bucket.sevenDay":`7 jours`,"agent.error.spawn_failed":`Échec du lancement de l'agent`,"agent.error.parse_error":`Impossible d'analyser un message de l'agent`,"agent.error.rate_limit":`Limite de débit atteinte`,"agent.error.resume_failed":`Session introuvable — démarrage en session fraîche`,"agent.error.other":`Erreur de l'agent`,"quotaBackoff.banner.title":`Reprise auto à {time}`,"quotaBackoff.banner.transientTitle":`Reprise auto après interruption à {time}`,"quotaBackoff.resumeNow":`Reprendre maintenant`,"quotaBackoff.banner.tooltip":`Quota Claude épuisé. L'auto-loop reprendra automatiquement quand le quota se libère à {resets_at}.`,"quotaBackoff.banner.cancel":`Annuler la reprise`,"quotaBackoff.cancelled":`Reprise auto annulée — tu peux relancer manuellement à tout moment`,"rateLimitType.fiveHour":`Session 5h`,"rateLimitType.sevenDay":`Hebdo`,"tooltip.addTask":`Ajouter une tâche`,"tooltip.removeTask":`Supprimer la tâche`,"tooltip.addCriterion":`Ajouter un critère`,"tooltip.removeCriterion":`Supprimer le critère`,"tooltip.startDevServer":`Démarrer le serveur de dev`,"tooltip.stopDevServer":`Arrêter le serveur de dev`,"tooltip.closeDiffViewer":`Fermer le diff`,"tooltip.refreshLogs":`Actualiser les logs`,"tooltip.closeDialog":`Fermer`,"tooltip.refreshGitStats":`Actualiser les stats Git`,"tooltip.removeImage":`Supprimer l'image`,"tooltip.sendMessage":`Envoyer le message`,"tools.title":`Outils`,"tools.runSetupScript":`Relancer le script de setup`,"tools.runSetupScriptTooltip":`Exécuter le script de setup du projet dans le worktree`,"tools.runSetupScriptConfirm":`Relancer le script de setup dans cette tâche ? Les artefacts existants peuvent être écrasés.`,"tools.runSetupScriptBusy":`Impossible de relancer le setup pendant que l'agent travaille.`,"tools.noSetupScript":`Aucun script de setup configuré —`,"tools.setupScriptSuccess":`Script de setup terminé avec succès.`,"tools.setupScriptFailed":`Échec du script de setup.`,"tools.openNotion":`Ouvrir dans Notion`,"tools.openSentry":`Ouvrir dans Sentry`,"tools.review":`Reviewer les changes`,"tools.reviewTooltip":`Demander à l'agent de reviewer les changes de cette branche`,"tools.reviewBusy":`Agent occupé — attends qu'il soit idle`,"tools.fixCi":`Réparer la CI`,"tools.fixCiTooltip":`Demander à l'agent de diagnostiquer et corriger les jobs CI en échec`,"tools.fixCiLaunched":`Action « Fix CI » envoyée à l'agent`,"tools.fixCiFailed":`Échec du lancement de l'action « Fix CI »`,"tools.openFileManager":`Ouvrir dans l'explorateur de fichiers`,"tools.openFileManagerTooltip":`Ouvrir le dossier du worktree dans votre explorateur de fichiers configuré`,"tools.openFileManagerFailed":`Échec de l'ouverture de l'explorateur de fichiers`,"tools.openTerminal":`Ouvrir dans un terminal`,"tools.openTerminalTooltip":`Ouvrir le worktree dans le terminal configuré`,"tools.openTerminalFailed":`Échec de l'ouverture du terminal`,"review.title":`Lancer une review`,"review.subtitle":`Demande à l'agent de reviewer tes changes et de te faire des retours.`,"review.additionalInstructions":`Instructions supplémentaires (optionnel)`,"review.additionalInstructionsPlaceholder":`Ajoute des instructions spécifiques pour la review…`,"review.newSession":`Nouvelle session`,"review.newSessionHint":`Démarre une nouvelle session d'agent au lieu de continuer la courante.`,"review.start":`Lancer la review`,"review.cancel":`Annuler`,"review.launched":`Review lancée`,"review.failed":`Échec du lancement de la review`,"diff.title":`Diff`,"diff.side":`Côte à côte`,"diff.inline":`En ligne`,"diff.hideUnchanged":`Masquer le code inchangé`,"diff.showUnchanged":`Afficher le code inchangé`,"diff.showUntracked":`Afficher les fichiers non suivis`,"diff.hideUntracked":`Masquer les fichiers non suivis`,"diff.rollbackToRemote":`Revenir à la version distante`,"diff.rollbackConfirm":`Restaurer {path} à sa version distante (origin) ? Les modifications locales sur ce fichier seront perdues.`,"diff.rollbackConfirmOk":`Rollback`,"diff.rollbackDone":`Fichier restauré à la version distante`,"diff.rollbackDoneRemote":`Fichier restauré à la version distante`,"diff.rollbackDoneHead":`Modifications locales annulées (fichier restauré au dernier commit)`,"diff.rollbackDoneDeleted":`Fichier non suivi supprimé`,"diff.deleteUntracked":`Supprimer le fichier non suivi`,"diff.deleteUntrackedConfirm":`Supprimer définitivement {path} ? Ce fichier n'est pas suivi par git — son contenu sera perdu.`,"diff.deleteUntrackedConfirmOk":`Supprimer`,"diff.rollbackFailed":`Échec du rollback`,"diff.rollbackFailedDetail":`Échec du rollback : {error}`,"diff.modeInspect":`Édition`,"diff.modeReview":`Review`,"diff.addComment":`Ajouter un commentaire`,"diff.replyComment":`Répondre`,"diff.editComment":`Modifier`,"diff.deleteComment":`Supprimer`,"diff.deleteCommentConfirm":`Supprimer ce commentaire ?`,"diff.commentPlaceholder":`Écris un commentaire de revue… (Markdown accepté)`,"diff.reviewDraft":`Brouillon de revue`,"diff.reviewEmpty":`Aucun commentaire — survole une ligne dans le diff et clique + pour en ajouter un.`,"diff.reviewGlobalPlaceholder":`Ajoute un message global de revue (optionnel)`,"diff.submitReview":`Soumettre la revue ({n})`,"diff.reviewSubmitted":`Revue soumise à l'agent`,"diff.reviewSubmitFailed":`Échec de la soumission : {error}`,"diff.scopeBranch":`Branche`,"diff.scopeUnpushed":`Non pushé`,"diff.noChanges":`Aucun changement`,"diff.searchFiles":`Rechercher des fichiers…`,"diff.noFileMatch":`Aucun fichier correspondant`,"diff.selectFile":`Sélectionnez un fichier pour voir le diff`,"diff.fileLoadFailed":`Ce diff n’a pas pu être chargé`,"diff.fileLoadFailedHint":`Le fichier sur le disque est intact — seul le chargement du diff a échoué.`,"diff.fileListLoadFailed":`La liste des fichiers n’a pas pu être chargée`,"diff.fileListLoadFailedHint":`Il s’agit d’un échec de requête, pas d’une branche sans modification.`,"diff.addToChat":`Ajouter au chat`,"diff.compareTitle":`Comparer des commits`,"diff.compareFrom":`De`,"diff.compareTo":`À`,"diff.compareSubmit":`Comparer`,"diff.compareSourceBase":`{branch} (base de la branche)`,"diff.commitsReadOnly":`lecture seule`,"diffViewer.save":`Enregistrer`,"diffViewer.savedAt":`Enregistré`,"diffViewer.saveFailed":`Échec de l’enregistrement`,"diffViewer.saveFailedDetail":`Échec de l’enregistrement : {error}`,"diffViewer.unsavedChanges.title":`Modifications non enregistrées`,"diffViewer.unsavedChanges.message":`Tu as des modifications non enregistrées. Que veux-tu faire ?`,"diffViewer.unsavedChanges.save":`Enregistrer`,"diffViewer.unsavedChanges.cancel":`Annuler`,"diffViewer.conflict.title":`Fichier modifié sur le disque`,"diffViewer.conflict.message":`Le fichier a été modifié hors de Kōbō depuis que tu l’as ouvert.`,"diffViewer.conflict.reload":`Recharger (perdre les modifs locales)`,"diffViewer.conflict.keep":`Garder les miennes`,"diffViewer.conflict.overwrite":`Écraser quand même`,"diffViewer.conflict.overwriteHint":`Remplace le fichier sur le disque par ta version. L’autre modification est perdue.`,"diffViewer.conflict.keepHint":`Garde tes modifications dans l’éditeur et adopte la nouvelle signature du disque, pour que la prochaine sauvegarde fonctionne.`,"diffViewer.saveBlocked":`L’agent tourne — arrête-le pour enregistrer tes modifications.`,"diffViewer.unsavedBanner":`Modifications non enregistrées. Arrête l’agent pour les sauvegarder.`,"diffViewer.closeConfirm.title":`Modifications non enregistrées`,"diffViewer.closeConfirm.message":`Ce fichier contient des modifications jamais enregistrées. Fermer le visualiseur de diff les perdra.`,"diffViewer.closeConfirm.discard":`Fermer sans enregistrer`,"diffViewer.criteriaRail":`Checklist de revue`,"diffViewer.criteriaRailShow":`Afficher la checklist de revue`,"diffViewer.criteriaRailHide":`Masquer la checklist de revue`,"diffViewer.fileTreeShow":`Afficher l’arbre des fichiers`,"diffViewer.fileTreeHide":`Masquer l’arbre des fichiers`,"diffViewer.closeConfirm.saveAndClose":`Enregistrer et fermer`,"diffViewer.agentRunning":`L’agent tourne — arrête-le pour éditer`,"diffViewer.fileDeleted":`Fichier supprimé`,"notification.agentFinished":`{name} — Agent terminé`,"notification.agentQuestion":`{name} — L'agent te pose une question`,"notification.awaitingReminder":`{name} - attend toujours votre réponse ({minutes} min)`,"notification.agentPermissionRequest":`{name} — L'agent demande une permission`,"notification.autoLoopCompleted":`{name} — Auto-loop terminé`,"notification.autoLoopWaitingForSlot":`{name} - L'auto-loop attend un slot d'agent libre ({running}/{limit} en cours)`,"notification.autoLoopStalled":`{name} — Auto-loop bloqué (aucun progrès)`,"notification.autoLoopError":`{name} — Auto-loop arrêté sur erreur`,"notification.autoLoopAwaitingClarification":`{name} — Auto-loop en pause, en attente de votre précision`,"notification.autoLoopPermissionOverridden":`{name} — Auto-loop a forcé le mode plan en bypass`,"notification.agentError":`{name} — Erreur agent`,"contextMenu.rename":`Renommer`,"contextMenu.editDescription":`Modifier la description`,"contextMenu.copyPath":`Copier le chemin du worktree`,"contextMenu.openEditor":`Ouvrir dans l'éditeur`,"contextMenu.openFileManager":`Ouvrir dans l'explorateur de fichiers`,"contextMenu.unarchiveDisabledPurged":"Le worktree a été supprimé du disque. Recrée-le manuellement (`gh pr checkout` ou `git worktree add`) — Kōbō détecte la restauration dans les 30 s et réactive le workspace automatiquement.","workspaceList.unarchiveBlockedPurged":"Impossible de désarchiver : le worktree n'existe plus sur le disque. Recrée-le manuellement (`gh pr checkout` ou `git worktree add`) — Kōbō le détecte dans les 30 s et réactive le workspace.","contextMenu.purgeWorktree":`Libérer l'espace disque (supprimer le worktree)`,"contextMenu.purgeWorktreeTooltip":`Supprime le worktree du disque pour récupérer de l'espace — l'historique des messages et sessions est conservé. Archive automatiquement le workspace.`,"contextMenu.purgeWorktreeDialogTitle":`Libérer l'espace disque ?`,"contextMenu.purgeWorktreeDialogMessage":`Le dossier worktree de « {name} » va être supprimé du disque. L'historique des messages et sessions est conservé. Le workspace sera archivé automatiquement. Cette action ne peut pas être annulée dans la version actuelle.`,"contextMenu.purgeWorktreeDialogConfirm":`Supprimer le worktree`,"contextMenu.purgeWorktreeSuccess":`Worktree supprimé — espace disque récupéré.`,"settings.autoPurgeOnPrMerged":`Purger le worktree quand la PR est mergée`,"settings.autoPurgeOnPrMergedHint":`Quand activé, le worktree est supprimé du disque dès que la PR est mergée (en plus de l'archivage auto). L'historique des messages est conservé.`,"settings.autoLoopMaxRetries":`Nombre maximal de nouvelles tentatives`,"settings.awaitingUserReminder":`Rappel de question sans réponse`,"settings.awaitingUserReminderHint":`Minutes pendant lesquelles un workspace peut attendre votre réponse avant que Kōbō ne vous relance, puis à chaque intervalle suivant. 0 désactive.`,"settings.localeLoadFailed":`Impossible de charger cette langue ; la langue actuelle est conservée.`,"settings.autoLoopMaxRetriesHint":`Arrête l'auto-loop après ce nombre d'erreurs de quota ou d'erreurs serveur temporaires.`,"settings.retentionTitle":`Rétention de l'historique de conversation (désactivée par défaut)`,"settings.retentionWarning":`Activer cette option supprime définitivement de la base l'historique de conversation des agents, à commencer par tout ce qui est déjà plus vieux que la fenêtre. Les événements supprimés sont irrécupérables.`,"settings.retentionHint":`Exécutée une fois au démarrage du serveur. Les workspaces, tâches, sessions, branches et worktrees ne sont jamais touchés — seule la sortie enregistrée des agents l'est.`,"settings.retentionDaysLabel":`Supprimer les événements plus vieux que (jours)`,"settings.retentionDaysHint":`0 — la valeur par défaut — conserve tous les événements indéfiniment. Renseignez une valeur pour activer la rétention.`,"settings.retentionKeepLabel":`Événements toujours conservés par workspace`,"settings.retentionKeepHint":`Les événements les plus récents de chaque workspace survivent quel que soit leur âge, pour qu'un workspace ancien mais toujours ouvert garde un historique lisible. Suggéré : 5000.`,"settings.retentionDisabledHint":`Rétention désactivée : rien ne sera jamais supprimé.`,"settings.retentionConfirmTitle":`Supprimer définitivement de l'historique de conversation ?`,"settings.retentionConfirmMessage":`Ne conserver que {days} jour(s) d'historique supprimera définitivement, au prochain démarrage du serveur, {count} des {total} événements d'agent enregistrés — y compris tout ce qui est déjà plus ancien. C'est irréversible. Continuer ?`,"settings.retentionConfirmMessageUnknown":`Ne conserver que {days} jour(s) d'historique supprimera définitivement, au prochain démarrage du serveur, tous les événements d'agent plus anciens — y compris tout ce qui est déjà accumulé. Le volume exact n'a pas pu être calculé. C'est irréversible. Continuer ?`,"settings.purgeDocsTitle":`Comment ça marche — restauration & permissions`,"settings.purgeDocsRestoreTitle":`Restaurer un worktree purgé (détection automatique)`,"settings.purgeDocsRestoreIntro":`Un workspace purgé conserve son historique de chat et les métadonnées de la PR, mais le dossier worktree n'existe plus. Recrée-le manuellement avec l'une de ces commandes — Kōbō détecte la réapparition du dossier dans les 30 secondes et réactive automatiquement le workspace (désarchive + clear flag purge) :`,"settings.purgeDocsRestoreCommands":`# GitHub (via le CLI gh) :
11
+ # ton script — utilise $KOBO_NEW_BASE / $KOBO_OLD_BASE / $KOBO_WORKING_BRANCH …`,"settings.changeSourceBranchScript.resetDefault":`Réinitialiser au défaut Kōbō`,"settings.changeSourceBranchScript.replaceConfirmTitle":`Réinitialiser le script ?`,"settings.changeSourceBranchScript.replaceConfirm":`Tes modifications seront remplacées par le script Kōbō par défaut. Continuer ?`,"settings.cleanupScriptHint":`Script shell exécuté dans le worktree après chaque fin de session de l'agent. En mode auto-loop, il ne s'exécute qu'une fois toutes les tâches terminées. Laisser vide pour désactiver.`,"settings.cleanupScriptPlaceholder":`ex. supprimer des fichiers temporaires, arrêter des conteneurs…`,"settings.cleanupScriptMode":`Quand l'exécuter`,"settings.cleanupScriptMode.idle":`À chaque fin de session — même s'il reste des tâches`,"settings.cleanupScriptMode.noTasks":`Uniquement quand plus aucune tâche Kōbō`,"settings.cleanupScriptOnlyOnChanges":`Lancer uniquement si des fichiers ont été modifiés, ajoutés ou supprimés`,"settings.cleanupScriptMode.inherit":`Hériter du réglage global`,"settings.taskPromptTemplate":`Prompt de tâche`,"settings.taskPromptTemplatePlaceholder":`Prompt inséré automatiquement dans la description de tâche…`,"settings.taskPromptTemplateHint":`Injecté automatiquement dans la description de tâche sur la page de création quand ce projet est sélectionné. S'il n'est pas modifié, il est remplacé en changeant de projet ; dès que vous l'éditez, votre texte est conservé.`,"settings.setupScriptPlaceholder":`npm install`,"settings.setupScriptHint":`Exécuté avec bash dans le worktree après sa création, avant le démarrage de l'agent. Pas besoin de shebang. En cas d'échec, le workspace passe en erreur. Timeout : 5 minutes.`,"settings.e2e.title":`Tests E2E`,"settings.e2e.framework":`Framework`,"settings.e2e.frameworkNone":`Aucun`,"settings.e2e.frameworkOther":`Autre`,"settings.e2e.skill":`Skill (optionnel)`,"settings.e2e.skillPlaceholder":`ex : cypress-tester`,"settings.e2e.prompt":`Guidance personnalisée (optionnel)`,"settings.e2e.promptPlaceholder":`ex : utiliser le page-object, cibler les data-testid`,"settings.e2e.helpText":`Quand configuré, l'agent de grooming auto-loop insère des sous-tâches E2E pour les fonctionnalités UI.`,"settings.finalization.title":`Finalisation de l'auto-loop`,"settings.finalization.helpText":`Optionnel : un prompt que l'agent exécute lors de la toute dernière itération de l'auto-loop. Typiquement utilisé pour les contrôles qualité finaux (lint, typecheck, tests). L'étape de grooming créera une tâche préfixée [FINAL] qui utilisera ce prompt.`,"settings.finalization.prompt":`Prompt de finalisation`,"settings.finalization.promptPlaceholder":`ex. Lance npm run lint et npm test, puis marque cette tâche comme terminée.`,"settings.editorCommand":`Commande éditeur`,"settings.editorCommandPlaceholder":`code, phpstorm, subl, vim...`,"settings.editorCommandHint":`Commande utilisée pour ouvrir le worktree dans votre éditeur. Le chemin du worktree est passé en argument.`,"settings.fileManagerCommand":`Commande explorateur de fichiers`,"settings.fileManagerCommandPlaceholder":`xdg-open, open, nautilus, dolphin, explorer...`,"settings.fileManagerCommandHint":`Commande utilisée pour ouvrir le worktree dans votre explorateur de fichiers. Le chemin du worktree est passé en argument. Laissez vide pour masquer le bouton.`,"settings.terminalCommand":`Commande du terminal`,"settings.terminalCommandHint":`Commande pour lancer le terminal dans le worktree. Placeholder {path} optionnel pour le répertoire.`,"settings.terminalCommandPlaceholder":`kitty · alacritty · gnome-terminal --working-directory={path}`,"settings.mcpSelection":`Sélection MCP Claude`,"settings.mcpAutoSelect":`Auto (premier MCP actif correspondant)`,"settings.notionMcp":`Clé MCP Notion`,"settings.sentryMcp":`Clé MCP Sentry`,"settings.mcpSelectionHint":`Les entrées actives sont lues depuis ~/.claude.json. Laisser Auto pour utiliser le comportement par défaut.`,"settings.configuredProjects":`Projets configurés`,"settings.noProjects":`Aucun projet configuré`,"settings.addProject":`Ajouter un projet`,"settings.copyFrom":`Copier les settings depuis`,"settings.copyFromPlaceholder":`(aucun — partir des valeurs par défaut)`,"settings.copyFromHint":`Copie tous les settings sauf le path, le nom affiché et la branche source.`,"settings.copyFromConfirmTitle":`Écraser les valeurs actuelles ?`,"settings.copyFromConfirm":`Cela écrasera les valeurs du formulaire avec les settings de « {project} ». Continuer ?`,"settings.newProject":`Nouveau projet`,"settings.editProject":`Modifier le projet`,"help.title":`Aide`,"help.tours":`Visites guidées`,"help.steps":`{n} étape | {n} étapes`,"help.resetAll":`Réinitialiser toutes les visites`,"help.resetAllHint":`Relance l'accueil ; chaque écran rejouera sa visite à la prochaine ouverture.`,"help.status.unseen":`non vue`,"help.status.partial":`en partie`,"help.status.seen":`vue`,"help.replayThis":`Rejouer la visite de cet écran`,"tours.next":`Suivant`,"tours.prev":`Précédent`,"tours.done":`Terminé`,"tours.exitConfirm":`Quitter la visite guidée ? Vous pourrez la relancer à tout moment depuis le menu Aide.`,"tours.home.title":`S'orienter`,"tours.home.list.title":`Workspaces`,"tours.home.list.description":`Chaque mission vit ici avec son statut. Les badges signalent une CI en échec, une review demandant des changements ou une PR prête à merger.`,"tours.home.create.title":`Créer un workspace`,"tours.home.create.description":`Un workspace, c'est un worktree Git, une branche et une session d'agent pour une tâche.`,"tours.home.search.title":`Recherche`,"tours.home.search.description":`Filtrez la liste par nom. L'icône de recherche en haut ouvre la recherche plein texte dans les conversations des agents.`,"tours.home.dashboard.title":`Tableau de bord`,"tours.home.dashboard.description":`Un tableau pour tous les workspaces actifs : statut, attention, PR, diff, activité, plus la fiabilité des moteurs.`,"tours.home.health.title":`Santé et changelog`,"tours.home.health.description":`Vérifiez la base de données, les runtimes et les agents actifs. Le bouton voisin liste ce qui a changé à chaque version.`,"tours.home.settings.title":`Paramètres`,"tours.home.settings.description":`Moteurs, intégrations, automatisation, worktrees et projets. Créez maintenant votre premier workspace.`,"tours.create.title":`Créer un workspace`,"tours.create.project.title":`Projet et branche`,"tours.create.project.description":`Choisissez le projet et la branche de départ du worktree.`,"tours.create.mission.title":`Mission`,"tours.create.mission.description":`Décrivez la tâche, ou importez-la depuis une page Notion ou une issue Sentry.`,"tours.create.template.title":`Templates`,"tours.create.template.description":`Appliquez un preset enregistré, ou enregistrez ce formulaire comme preset. « Dupliquer » sur une carte de workspace ouvre ce formulaire prérempli.`,"tours.create.engine.title":`Moteur et modèle`,"tours.create.engine.description":`Claude Code ou Codex, le modèle, l'effort de raisonnement et ce que l'agent peut faire sans demander.`,"tours.create.brainstorm.title":`Brainstorm sur un autre modèle`,"tours.create.brainstorm.description":`Lancez la première session de brainstorming sur un autre modèle, puis revenez au modèle principal pour les itérations.`,"tours.create.autoloop.title":`Auto-loop`,"tours.create.autoloop.description":`Laissez l'agent enchaîner les sessions jusqu'à ce que toutes les tâches soient faites, ou qu'il stagne.`,"tours.create.comparison.title":`Comparer deux moteurs`,"tours.create.comparison.description":`Créez deux workspaces jumeaux sur la même tâche et comparez leurs commits, tâches et activité.`,"tours.workspace.title":`Dans un workspace`,"tours.workspace.chat.title":`Conversation`,"tours.workspace.chat.description":`La sortie de l'agent, en direct : messages, appels d'outils, questions et erreurs.`,"tours.workspace.input.title":`Parler à l'agent`,"tours.workspace.input.description":`Envoyez un message, utilisez les slash commands, dictez à la voix ou joignez des fichiers.`,"tours.workspace.selectors.title":`Réglages de session`,"tours.workspace.selectors.description":`Changez le modèle, l'effort, le mode de permission et l'auto-loop pour la prochaine session.`,"tours.workspace.status.title":`Statut`,"tours.workspace.status.description":`L'état de la session en cours ; arrêtez-la ici si besoin.`,"tours.workspace.git.title":`Git`,"tours.workspace.git.description":`Commits, diff, push, rebase et la PR de cette branche.`,"tours.workspace.tasks.title":`Tâches`,"tours.workspace.tasks.description":`Ce que l'agent prévoit de faire, et les critères d'acceptation à respecter.`,"tours.workspace.timeline.title":`Chronologie`,"tours.workspace.timeline.description":`Toutes les sessions de ce workspace ; ouvrez-en une plus ancienne pour la relire.`,"tours.workspace.subagents.title":`Sous-agents`,"tours.workspace.subagents.description":`Suivez les sous-agents lancés par l'agent, avec leur progression en direct.`,"tours.workspace.documents.title":`Documents`,"tours.workspace.documents.description":`Plans et fichiers écrits par l'agent, consultables sans quitter le chat.`,"tours.workspace.schedule.title":`Programmation`,"tours.workspace.schedule.description":`Réveils et crons qui relancent l'agent plus tard.`,"tours.workspace.terminal.title":`Terminal`,"tours.workspace.terminal.description":`Un shell dans le worktree, sans quitter Kōbō.`,"tours.gitPr.title":`Pull request`,"tours.gitPr.panel.title":`Statut de la PR`,"tours.gitPr.panel.description":`Résultat de la CI, décision de review et reviewers, rafraîchis toutes les 30 secondes.`,"tours.gitPr.actions.title":`Actions Git`,"tours.gitPr.actions.description":`Push, pull, rebase ou changement de branche de base. Pendant un conflit, un bouton laisse l'agent le résoudre.`,"tours.gitPr.attention.title":`Badges d'attention`,"tours.gitPr.attention.description":`La carte affiche une CI en échec, des changements demandés ou une PR prête à merger.`,"tours.settings.title":`Paramètres`,"tours.settings.engines.title":`Moteurs et modèles`,"tours.settings.engines.description":`Modèle, effort et mode de permission par défaut pour chaque moteur.`,"tours.settings.integrations.title":`Intégrations`,"tours.settings.integrations.description":`Notion, Sentry et la forge (GitHub ou GitLab) qui fournit les PR.`,"tours.settings.automation.title":`Automatisation`,"tours.settings.automation.description":`Scripts de setup et de cleanup, hooks de cycle de vie, templates de prompts, templates de workspace et skills.`,"tours.settings.worktrees.title":`Worktrees`,"tours.settings.worktrees.description":`Où vivent les worktrees, combien de temps garder ceux qui sont mergés, et la purge automatique.`,"tours.settings.projects.title":`Projets`,"tours.settings.projects.description":`Les projets enregistrés et leurs surcharges par projet.`,"tours.settings.misc.title":`Général, voix, notifications, export`,"tours.settings.misc.description":`Langue, accès réseau, dictée, sons et notifications navigateur, et un export complet de vos réglages.`,"tours.dashboard.title":`Tableau de bord`,"tours.dashboard.overview.title":`Vue d'ensemble`,"tours.dashboard.overview.description":`Tous les workspaces actifs dans un tableau ; cliquez sur une ligne pour l'ouvrir.`,"tours.dashboard.reliability.title":`Fiabilité des moteurs`,"tours.dashboard.reliability.description":`Sessions, erreurs et durées par moteur et par modèle.`,"tours.health.title":`Santé`,"tours.health.checks.title":`Vérifications`,"tours.health.checks.description":`Environnement, base de données, runtimes, workspaces et sessions.`,"tours.health.active.title":`État actif`,"tours.health.active.description":`Les back-offs de quota, les réveils en attente et les auto-loops en cours en ce moment.`,"tours.search.title":`Recherche`,"tours.search.input.title":`Requête`,"tours.search.input.description":`Recherche dans les noms de workspaces et les conversations des agents.`,"tours.search.archived.title":`Archivés`,"tours.search.archived.description":`Inclure les workspaces archivés dans les résultats.`,"tours.changelog.title":`Nouveautés`,"tours.changelog.list.title":`Versions`,"tours.changelog.list.description":`Ce qui a changé à chaque version, la plus récente en premier.`,"settings.projectGroup.identity":`Identité`,"settings.projectGroup.defaults":`Valeurs par défaut`,"settings.projectGroup.prompts":`Prompts`,"settings.projectGroup.scripts":`Scripts`,"settings.projectPath":`Chemin du projet`,"settings.projectPathPlaceholder":`/chemin/vers/le/projet`,"settings.displayName":`Nom affiché`,"settings.displayNamePlaceholder":`Mon projet`,"settings.defaultSourceBranch":`Branche source par défaut`,"settings.defaultModel.project":`Modèle par défaut`,"settings.skipPermissions.project":`Ignorer les invites de permission`,"settings.prPromptTemplate.project":`Modèle de prompt PR`,"settings.prPromptPlaceholder.project":`Instructions spécifiques au projet pour la création de PR...`,"settings.reviewPromptTemplate.project":`Modèle de prompt de review`,"settings.ciFixPromptTemplate.project":`Modèle de prompt « Fix CI »`,"settings.gitConventions.project":`Conventions Git (projet)`,"settings.gitConventionsEmpty":`Laisser vide pour utiliser les conventions globales.`,"settings.notionStatus":`Statut ticket Notion`,"settings.notionStatusProperty":`Nom de la propriété`,"settings.notionStatusPropertyPlaceholder":`État, Status...`,"settings.notionInProgressStatus":`Valeur à définir`,"settings.notionInProgressStatusPlaceholder":`En cours, In progress...`,"settings.notionStatusHint":`Quand un workspace est créé avec un ticket Notion, la propriété spécifiée est mise à cette valeur. Les deux champs sont requis. Laisser vide pour désactiver.`,"settings.notionAssignee":`Assignation Notion`,"settings.notionAssigneeHint":`Quand un workspace est créé avec un ticket Notion, l'utilisateur authentifié sur le MCP Notion est ajouté à cette propriété People — uniquement si elle n'a pas déjà d'assigné. Laisser vide pour désactiver.`,"settings.notionAssigneeProperty":`Nom de la propriété`,"settings.notionAssigneePropertyPlaceholder":`Développeurs, Assignees...`,"settings.notionUserId":`Ton UUID Notion`,"settings.notionUserIdPlaceholder":`135d872b-594c-8126-9604-00024ad6e5b5`,"settings.notionUserIdHint":`Sélectionne ton compte dans la liste. Notion refuse l'assignation d'un bot — ce champ est obligatoire pour activer l'auto-assignation.`,"settings.notionUsersRefresh":`Rafraîchir`,"settings.notionUsersLoading":`Chargement des utilisateurs Notion…`,"settings.notionUsersLoadFailed":`Impossible de récupérer la liste : {error}`,"settings.notionUsersManualFallback":`Liste indisponible — colle ton UUID Notion manuellement.`,"settings.devServer":`Serveur de dev`,"settings.devServerStart":`Script de démarrage`,"settings.devServerStartPlaceholder":`npm run dev`,"settings.devServerStop":`Script d'arrêt`,"settings.devServerStopPlaceholder":`Optionnel — le processus sera tué automatiquement si vide`,"settings.selectProject":`Sélectionnez un projet ou ajoutez-en un nouveau`,"settings.useGlobal":`Utiliser le global`,"settings.saved":`Paramètres généraux enregistrés.`,"settings.unsavedChanges":`Modifications non enregistrées`,"settings.nav.general":`Général`,"settings.nav.agents":`Agents`,"settings.nav.skills":`Skills`,"settings.nav.prompts":`Prompts`,"settings.nav.scripts":`Scripts`,"settings.nav.workspaceTemplates":`Templates de workspace`,"workspaceTemplates.title":`Templates de workspace`,"workspaceTemplates.hint":`Préréglages enregistrés du formulaire de création. Choisissez-en un sur la page de création ; pour en modifier un, chargez-le là, ajustez, puis réenregistrez-le sous le même nom.`,"workspaceTemplates.empty":`Aucun template pour l'instant. Remplissez le formulaire de création et utilisez « Enregistrer comme template ».`,"workspaceTemplates.anyProject":`Tout projet`,"workspaceTemplates.rename":`Renommer`,"workspaceTemplates.renameTitle":`Renommer le template`,"workspaceTemplates.deleteConfirm":`Supprimer le template « {name} » ?`,"workspaceTemplates.deleted":`Template « {name} » supprimé`,"settings.nav.notion":`Notion`,"settings.nav.forge":`Forge`,"settings.bitbucketCommunity":`Bitbucket Community`,"settings.bitbucketCommunityHint":`Les identifiants restent locaux et sont utilisés uniquement par bkt.`,"settings.bitbucketUsername":`E-mail Atlassian`,"settings.bitbucketToken":`Token API Bitbucket`,"settings.nav.sentry":`Sentry`,"settings.nav.voice":`Voix`,"settings.nav.notifications":`Notifications`,"settings.nav.worktrees":`Worktrees`,"settings.nav.export":`Export`,"settings.help.general":`Langue, accès réseau et valeurs par défaut dont hérite chaque projet.`,"settings.help.agents":`Modèle, effort et mode de permission par défaut pour chaque moteur.`,"settings.help.skills":`Les suites de skills que l'agent est invité à utiliser.`,"settings.help.prompts":`Textes de prompt réutilisables : description de PR, review, correction CI, finalisation.`,"settings.help.scripts":`Scripts de setup, de nettoyage et de changement de branche source, plus les hooks de cycle de vie.`,"settings.help.notion":`Importer une page Notion comme source de vérité d'un workspace.`,"settings.help.sentry":`Créer un workspace à partir d'une issue Sentry.`,"settings.help.forge":`CLI GitHub ou GitLab utilisée pour les PR et merge requests.`,"settings.help.voice":`Dictée et push-to-talk.`,"settings.help.notifications":`Sons, notifications navigateur et rappel des questions sans réponse.`,"settings.help.worktrees":`Où les worktrees sont créés, rétention et purge automatique.`,"settings.help.projects":`Projets enregistrés et leurs surcharges par projet.`,"settings.help.templates":`Templates de prompt développés dans la zone de saisie du chat.`,"settings.help.workspaceTemplates":`Presets enregistrés du formulaire de création.`,"settings.help.export":`Exporter et importer tous les paramètres en JSON.`,"settings.openNav":`Ouvrir la navigation`,"settings.saveError":`Erreur lors de l'enregistrement des paramètres.`,"settings.projectSaved":`Projet enregistré.`,"settings.projectSaveError":`Erreur lors de l'enregistrement du projet.`,"settings.projectDeleted":`Projet supprimé.`,"settings.deleteProjectConfirmTitle":`Supprimer le projet ?`,"settings.deleteProjectConfirmMessage":`Retirer « {name} » de vos projets ? Cela supprime uniquement ses réglages Kōbō — votre code et vos worktrees ne sont pas touchés.`,"settings.projectDeleteError":`Erreur lors de la suppression du projet.`,"settings.projectPathRequired":`Le chemin du projet est requis.`,"templates.title":`Modèles`,"templates.newTemplate":`Nouveau modèle`,"templates.editTemplate":`Modifier le modèle`,"templates.deleteTemplate":`Supprimer le modèle`,"templates.deleteConfirm":`Supprimer le modèle '/{slug}' ?`,"templates.deleteConfirmMessage":`Cette action est irréversible.`,"templates.slug":`Slug`,"templates.slugHint":`Lettres minuscules, chiffres, tirets. Max 64 caractères.`,"templates.slugInvalid":`Le slug ne peut contenir que des lettres minuscules, chiffres et tirets`,"templates.slugDuplicate":`Un modèle avec ce slug existe déjà`,"templates.description":`Description`,"templates.descriptionHint":`Libellé court affiché dans le dropdown.`,"templates.descriptionRequired":`La description est requise`,"templates.contentRequired":`Le contenu est requis`,"templates.content":`Contenu`,"templates.contentHint":`Contenu du modèle. Utilise {variable_name} pour les substitutions.`,"templates.availableVars":`Variables disponibles`,"templates.filePath":`Fichier : {path}`,"templates.empty":`Aucun modèle pour l'instant.`,"templates.createFailed":`Échec de la création du modèle`,"templates.updateFailed":`Échec de la modification du modèle`,"templates.deleteFailed":`Échec de la suppression du modèle`,"templates.save":`Enregistrer`,"templates.create":`Créer`,"templates.reloadDefaults":`Recharger les modèles par défaut`,"templates.reloadDefaultsHint":`Ajoute uniquement les modèles par défaut manquants. Les modèles existants (même modifiés) ne sont jamais écrasés.`,"templates.reloadDefaultsConfirmMessage":`Cette action ajoute les modèles par défaut absents de la liste. Les modèles existants — y compris ceux que tu as modifiés — ne seront pas touchés. Si tu veux récupérer la version d'origine d'un modèle modifié, supprime-le d'abord puis relance cette action.`,"templates.reloadDefaultsSuccess":`{added} ajouté(s), {kept} conservé(s)`,"templates.reloadDefaultsFailed":`Échec du rechargement des modèles par défaut`,"templates.resetToDefault":`Réinitialiser au défaut`,"templates.resetConfirmTitle":`Réinitialiser le template au défaut ?`,"templates.resetConfirmMessage":`Cela écrase vos modifications locales de /{slug} par le défaut intégré. Action irréversible.`,"templates.resetSuccess":`Template /{slug} réinitialisé au défaut`,"templates.resetFailed":`Échec de la réinitialisation du template`,"chatInput.dropdownSkills":`Skills Claude`,"chatInput.dropdownKobo":`Commandes Kōbō`,"chatInput.dropdownTemplates":`Modèles`,"documents.title":`Documents`,"documents.empty":`Aucun document trouvé`,"documents.refresh":`Actualiser`,"documents.back":`Retour`,"documents.loadFailed":`Échec du chargement du document`,"git.title":`Git`,"git.outputDialogTitle":`Git a signalé une erreur`,"git.statsFailed":`L’état git n’a pas pu être lu`,"git.section.repository":`Dépôt`,"git.section.changes":`Modifications`,"git.section.pullRequest":`Pull request`,"git.section.actions":`Actions`,"git.actions.more":`Plus`,"git.localOnly":`local uniquement`,"git.pushed":`pushé`,"git.unpushed":`{count} non pushé`,"git.commits":`{count} commit | {count} commits`,"git.commits.loading":`Chargement des commits…`,"git.commits.empty":`Aucun commit sur cette branche`,"git.commits.pushed":`Pushé`,"git.commits.unpushed":`Non pushé`,"git.commits.clickToAppend":`clique pour ajouter le SHA au chat`,"git.commits.diffThisCommit":`Diff de ce commit (vs parent)`,"git.compareCommits":`Comparer des commits…`,"git.files":`{count} fichier | {count} fichiers`,"git.staged":`{count} indexé`,"git.modified":`{count} modifié`,"git.untracked":`{count} non suivi`,"git.workingTreeEmpty":`Aucune modification non commitée`,"git.fileStaged":`Indexé`,"git.fileModified":`Modifié`,"git.fileUntracked":`Non suivi`,"git.push":`Push`,"git.forcePush":`Force push`,"git.forcePushToggle":`Force push (--force-with-lease)`,"git.forcePushHint":`Plus sûr que --force : le push est rejeté si le remote a des commits que tu n’as pas vus. À utiliser après un rebase ou un amend de commits déjà push.`,"git.branchForcePushed":`Branche force-pushée`,"git.pull":`Pull`,"git.pullNoUpstream":`Pas d'upstream pour cette branche — push-la d'abord pour activer Pull.`,"git.sync":`Sync`,"git.createPrNoRemote":`Push la branche d'abord`,"git.viewRequest":`Voir la {request}`,"git.createRequest":`Créer une {request}`,"git.changeRequestBase":`Changer la branche cible de la {request}`,"git.forgeCliMissing":`{cli} n'est pas installé — installez-le pour les fonctions {request}`,"git.forgeNotAuthenticated":`Non authentifié — exécutez {cli} auth login`,"settings.forge":`Forge`,"settings.forge.auto":`Détection automatique`,"settings.forge.github":`GitHub`,"settings.forge.gitlab":`GitLab`,"settings.forge.bitbucketCommunity":`Bitbucket Community (bkt)`,"settings.forge.none":`Aucune`,"git.pullConfirmTitle":`Pull la branche ?`,"git.pullConfirmMessage":`Pull {branch} depuis la remote (fast-forward uniquement).`,"git.branchPulled":`Branche pull`,"git.pullFailed":`Échec du pull`,"git.renameBranch":`Renommer la branche`,"git.renameBranchPrompt":"Renommer `{branch}` en :","git.renameBranchSuccess":"Branche renommée en `{branch}`","git.renameBranchFailed":`Échec du renommage`,"git.renameBranchExists":"La branche `{branch}` existe déjà (locale ou sur origin)","git.diff":`Diff`,"git.diffReview":`Diff`,"git.diffReviewTooltip":`Ouvre le diff viewer en mode Review — commentaires inline + soumission groupée à l'agent`,"pr.baseChanged":`Base de la PR modifiée : {oldBase} → {newBase}`,"pr.openPr":`Ouvrir la PR`,"pr.openWorkspace":`Ouvrir le workspace`,"pr.dismiss":`Fermer`,"git.rebase":`Rebase`,"git.rebaseConfirmTitle":`Rebase la branche ?`,"git.rebaseConfirmMessage":`Rebase sur {branch}. Des conflits peuvent survenir.`,"git.rebaseSuccess":`Rebase terminé`,"git.rebaseFailed":`Rebase échoué`,"git.merge":`Merge`,"git.fetch":`Fetch`,"git.fetchSuccess":`Dépôt récupéré`,"git.fetchFailed":`Échec du fetch : {error}`,"git.mergeConfirmTitle":`Fusionner la branche ?`,"git.mergeConfirmMessage":`Fusionner {branch} dans cette branche. Des conflits sont possibles.`,"git.mergeSuccess":`Merge terminé`,"git.mergeFailed":`Merge échoué`,"git.commitFailed":`Commit échoué`,"git.commitChanges":`Committer les modifications`,"git.commitDialogTitle":`Committer les modifications non commitées`,"git.commitDialogDescription":`Saisissez votre message ou demandez à l’agent d’inspecter et de créer le commit.`,"git.commitMessage":`Message de commit`,"git.commitManual":`Committer`,"git.commitWithAgent":`Demander à l’agent`,"git.commitAgentSuccess":`Demande de commit envoyée à l’agent`,"git.discardFailed":`Abandon échoué`,"git.conflictTitleMerge":`Conflits de merge détectés`,"git.conflictTitleRebase":`Conflits de rebase détectés`,"git.operationPausedTitle":`Opération Git à poursuivre`,"git.operationPausedSubtitle":`Aucun fichier en conflit. Git attend simplement que tu poursuives l’opération.`,"git.conflictSubtitle":`{count} fichier(s) en conflit. Choisis comment continuer.`,"git.conflictAbortConfirmTitle":`Abandonner la résolution du conflit ?`,"git.conflictAbortConfirmMessage":`Tout ce que tu as résolu dans ce {op} est jeté et le worktree revient à son état d’avant. C’est irréversible.`,"git.conflictAbort":`Abandonner`,"git.conflictContinue":`Continuer`,"git.conflictContinued":`Opération Git poursuivie`,"git.conflictResolveWithAgent":`Demander à l'agent de résoudre`,"git.conflictAborted":`Opération abandonnée`,"git.conflictHandoffSuccess":`L'agent résout les conflits`,"git.dirtyTitleRebase":`Des modifications non commitées bloquent le rebase`,"git.dirtyTitleMerge":`Des modifications non commitées bloquent le merge`,"git.dirtyTitlePull":`Des modifications non commitées bloquent le pull`,"git.dirtySubtitle":`{modified} modifié(s), {staged} indexé(s), {untracked} non suivi(s). Choisis comment continuer.`,"git.dirtyStash":`Stash & réessayer`,"git.dirtyCommit":`Commit d'abord`,"git.dirtyCommitPlaceholder":`Message de commit`,"git.dirtyCommitConfirm":`Commit & réessayer`,"git.dirtyDiscard":`Abandonner les modifs`,"git.dirtyDiscardConfirmTitle":`Abandonner toutes les modifications non commitées ?`,"git.dirtyDiscardConfirmMessage":`Les modifications suivies seront perdues (git reset --hard). Les fichiers non suivis sont conservés. Action irréversible.`,"git.pushConfirmTitle":`Pusher la branche ?`,"git.pushConfirmMessage":`Pusher {branch} vers le dépôt distant.`,"git.pushConfirmMessagePrefix":`Pusher la branche`,"git.pushConfirmMessageSuffix":`vers le dépôt distant.`,"git.changePrBaseTitle":`Changer la branche cible`,"git.changePrBaseMessage":`Entrez la nouvelle branche cible pour la {request}.`,"git.changePrBaseSuccess":`Branche cible de la {request} mise à jour`,"git.changePrBaseFailed":`Impossible de changer la branche cible de la {request}`,"git.mergeRequest":`Fusionner la {request}`,"git.mergeRequestConfirmTitle":`Fusionner la {request} ?`,"git.mergeRequestConfirmMessage":`Cette action fusionne la {request} ouverte dans sa branche cible.`,"git.mergeRequestSuccess":`{request} fusionnée`,"git.mergeRequestFailed":`Impossible de fusionner la {request}`,"git.deleteRemoteBranch":`Supprimer la branche distante`,"git.deleteRemoteBranchTitle":`Supprimer la branche distante ?`,"git.deleteRemoteBranchMessage":`La demande a été fusionnée. Supprimer la branche distante {branch} ?`,"git.deleteRemoteBranchSuccess":`Branche distante {branch} supprimée`,"git.deleteRemoteBranchFailed":`Impossible de supprimer la branche distante`,"git.changeSourceBranch":`Changer la branche source`,"git.changeSourceBranchTitle":`Changer la branche source`,"git.changeSourceBranchMessage":`Choisis la nouvelle branche source. La branche de travail sera reconstruite par-dessus.`,"git.changeSourceBranchDone":`Branche source changée vers {branch}`,"git.changeSourceBranchAligned":`Branche source changée vers {branch} (la branche n'avait aucun commit propre)`,"git.changeSourceBranchTooMany":`La branche a trop de commits propres ({n}) — rebase-la manuellement`,"git.changeSourceBranchDirty":`Commit ou stash tes changements avant de changer la branche source`,"git.changeSourceBranchAgentRunning":`Arrête l'agent avant de changer la branche source`,"git.changeSourceBranchErrorTitle":`Échec du changement de branche source`,"git.changeSourceBranchErrorOngoing":`Une opération {op} est encore en cours sur le worktree. Annule-la pour revenir à un état propre.`,"git.changeSourceBranchErrorAbort":`Annuler l'opération`,"git.changeSourceBranchLoading":`Changement de la branche source…`,"git.changeSourceForcePushTitle":`Force-push de la branche réécrite ?`,"git.changeSourceForcePushMessage":`L'historique de la branche a été réécrit. La force-pusher vers le remote avec --force-with-lease ?`,"git.changeSourceForcePushDone":`Branche force-pushée`,"git.openEditor":`Ouvrir dans l'éditeur`,"git.openEditorFailed":`Impossible d'ouvrir l'éditeur`,"git.branchPushed":`Branche pushée`,"git.pushFirst":`La branche n'est pas sur le dépôt distant. Cliquez d'abord sur Push.`,"git.unpushedCommits":`Les commits locaux ne sont pas pushés. Cliquez d'abord sur Push.`,"git.from":`depuis`,"git.aheadBehindTooltip":`{ahead} commits en avance, {behind} en retard sur {source}`,"git.divergence.title":`Divergence de branche`,"git.divergence.subtitle":`vs {source}`,"git.divergence.ahead":`↑ {count} en avance`,"git.divergence.behind":`↓ {count} en retard`,"git.divergence.empty.ahead":`Aucun commit en avance.`,"git.divergence.empty.behind":`Aucun commit en retard.`,"git.divergence.close":`Fermer`,"git.divergence.loading":`Chargement des commits…`,"git.divergence.failed":`Échec du chargement de la divergence`,"git.divergence.retry":`Réessayer`,"git.prCreated":`{request} #{n} créée`,"git.pr.author":`Auteur`,"git.pr.reviewers":`Relecteurs`,"git.pr.assignees":`Assignés`,"git.pr.labels":`Labels`,"git.pr.changesRequestedBadge":`Modifications demandées`,"git.pr.approvedBadge":`Approuvée`,"git.pr.ci.passed":`CI OK`,"git.pr.ci.failed":`CI en échec`,"git.pr.ci.pending":`CI en cours`,"git.pr.ci.failedCount":`{n} en échec`,"git.pr.ci.pendingCount":`{n} en cours`,"git.pr.ci.passedCount":`{n} OK`,"git.pr.ci.skippedCount":`{n} ignoré(s)`,"git.pr.ci.showPassed":`Afficher les {n} jobs réussis`,"git.pr.ci.hidePassed":`Masquer les jobs réussis`,"toast.prChangesRequested":`Des modifications ont été demandées sur la PR #{n}`,"toast.prApproved":`La PR #{n} a été approuvée`,"toast.prReadyToMerge":`La PR #{n} est prête à merger`,"toast.prCiFailed":`La CI de la PR #{n} est en échec`,"toast.prCiRecovered":`La CI de la PR #{n} est rétablie`,"toast.prMergeConflict":`La PR #{n} a un conflit de merge`,"toast.prMerged":`La PR #{n} a été mergée`,"devServer.title":`Serveur de dev`,"devServer.noWorkspace":`Aucun espace de travail sélectionné`,"devServer.notConfigured":`Non configuré —`,"devServer.goToSettings":`Paramètres`,"devServer.logs":`Logs`,"devServer.running":`En cours`,"devServer.starting":`Démarrage`,"devServer.stopping":`Arrêt`,"devServer.error":`Erreur`,"devServer.stopped":`Arrêté`,"devServer.unknown":`Inconnu`,"devServer.containers":`{count} conteneur | {count} conteneurs`,"devServer.logDialog.title":`Logs du serveur de dev`,"devServer.logDialog.empty":`Aucun log disponible`,"notion.title":`Notion`,"tasks.title":`Tâches`,"notion.addTask":`Ajouter une tâche`,"notion.noUrl":`Aucune URL Notion`,"notion.subtasks":`{done}/{total} sous-tâches`,"notion.noTasks":`Aucune tâche`,"notion.newTask":`Nouvelle tâche... (Entrée pour ajouter, Échap pour annuler)`,"acceptance.title":`Critères d'acceptation`,"acceptance.addCriterion":`Ajouter un critère`,"acceptance.newCriterion":`Nouveau critère... (Entrée pour ajouter, Échap pour annuler)`,"acceptance.empty":`Aucun critère d'acceptation`,"tasks.askProgress":`Demander à l'agent de vérifier sa progression`,"agentTodos.title":`Todos de l'agent`,"agentTodos.empty":`Aucun todo de l'agent`,"subagents.title":`Sub-agents`,"subagents.empty":`Aucune activité de sub-agent`,"subagents.tools":`{count} outils`,"subagents.running":`En cours : `,"stats.resetsAt":`Reset {value}`,"stats.usageBucket":`Quota {n}`,"quotaFooter.lastUpdated":`Dernière mise à jour : {time}`,"quotaFooter.empty":`Chargement…`,"quotaFooter.popover.title":`Utilisation Claude Code`,"quotaFooter.popover.refreshNow":`Rafraîchir`,"quotaFooter.popover.resetsIn":`Réinitialise à {value}`,"quotaFooter.popover.unauthenticated":`Auth requise`,"quotaFooter.popover.unauthenticatedHint":`Lancez "claude" une fois pour vous authentifier.`,"quotaFooter.popover.error":`Erreur`,"quotaFooter.bucket.fiveHour":`5 heures`,"quotaFooter.bucket.sevenDay":`7 jours`,"agent.error.spawn_failed":`Échec du lancement de l'agent`,"agent.error.parse_error":`Impossible d'analyser un message de l'agent`,"agent.error.rate_limit":`Limite de débit atteinte`,"agent.error.resume_failed":`Session introuvable — démarrage en session fraîche`,"agent.error.other":`Erreur de l'agent`,"quotaBackoff.banner.title":`Reprise auto à {time}`,"quotaBackoff.banner.transientTitle":`Reprise auto après interruption à {time}`,"quotaBackoff.resumeNow":`Reprendre maintenant`,"quotaBackoff.banner.tooltip":`Quota Claude épuisé. L'auto-loop reprendra automatiquement quand le quota se libère à {resets_at}.`,"quotaBackoff.banner.cancel":`Annuler la reprise`,"quotaBackoff.cancelled":`Reprise auto annulée — tu peux relancer manuellement à tout moment`,"rateLimitType.fiveHour":`Session 5h`,"rateLimitType.sevenDay":`Hebdo`,"tooltip.addTask":`Ajouter une tâche`,"tooltip.removeTask":`Supprimer la tâche`,"tooltip.addCriterion":`Ajouter un critère`,"tooltip.removeCriterion":`Supprimer le critère`,"tooltip.startDevServer":`Démarrer le serveur de dev`,"tooltip.stopDevServer":`Arrêter le serveur de dev`,"tooltip.closeDiffViewer":`Fermer le diff`,"tooltip.refreshLogs":`Actualiser les logs`,"tooltip.closeDialog":`Fermer`,"tooltip.refreshGitStats":`Actualiser les stats Git`,"tooltip.removeImage":`Supprimer l'image`,"tooltip.sendMessage":`Envoyer le message`,"tools.title":`Outils`,"tools.runSetupScript":`Relancer le script de setup`,"tools.runSetupScriptTooltip":`Exécuter le script de setup du projet dans le worktree`,"tools.runSetupScriptConfirm":`Relancer le script de setup dans cette tâche ? Les artefacts existants peuvent être écrasés.`,"tools.runSetupScriptBusy":`Impossible de relancer le setup pendant que l'agent travaille.`,"tools.noSetupScript":`Aucun script de setup configuré —`,"tools.setupScriptSuccess":`Script de setup terminé avec succès.`,"tools.setupScriptFailed":`Échec du script de setup.`,"tools.openNotion":`Ouvrir dans Notion`,"tools.openSentry":`Ouvrir dans Sentry`,"tools.review":`Reviewer les changes`,"tools.reviewTooltip":`Demander à l'agent de reviewer les changes de cette branche`,"tools.reviewBusy":`Agent occupé — attends qu'il soit idle`,"tools.fixCi":`Réparer la CI`,"tools.fixCiTooltip":`Demander à l'agent de diagnostiquer et corriger les jobs CI en échec`,"tools.fixCiLaunched":`Action « Fix CI » envoyée à l'agent`,"tools.fixCiFailed":`Échec du lancement de l'action « Fix CI »`,"tools.openFileManager":`Ouvrir dans l'explorateur de fichiers`,"tools.openFileManagerTooltip":`Ouvrir le dossier du worktree dans votre explorateur de fichiers configuré`,"tools.openFileManagerFailed":`Échec de l'ouverture de l'explorateur de fichiers`,"tools.openTerminal":`Ouvrir dans un terminal`,"tools.openTerminalTooltip":`Ouvrir le worktree dans le terminal configuré`,"tools.openTerminalFailed":`Échec de l'ouverture du terminal`,"review.title":`Lancer une review`,"review.subtitle":`Demande à l'agent de reviewer tes changes et de te faire des retours.`,"review.additionalInstructions":`Instructions supplémentaires (optionnel)`,"review.additionalInstructionsPlaceholder":`Ajoute des instructions spécifiques pour la review…`,"review.newSession":`Nouvelle session`,"review.newSessionHint":`Démarre une nouvelle session d'agent au lieu de continuer la courante.`,"review.start":`Lancer la review`,"review.cancel":`Annuler`,"review.launched":`Review lancée`,"review.failed":`Échec du lancement de la review`,"diff.title":`Diff`,"diff.side":`Côte à côte`,"diff.inline":`En ligne`,"diff.hideUnchanged":`Masquer le code inchangé`,"diff.showUnchanged":`Afficher le code inchangé`,"diff.showUntracked":`Afficher les fichiers non suivis`,"diff.hideUntracked":`Masquer les fichiers non suivis`,"diff.rollbackToRemote":`Revenir à la version distante`,"diff.rollbackConfirm":`Restaurer {path} à sa version distante (origin) ? Les modifications locales sur ce fichier seront perdues.`,"diff.rollbackConfirmOk":`Rollback`,"diff.rollbackDone":`Fichier restauré à la version distante`,"diff.rollbackDoneRemote":`Fichier restauré à la version distante`,"diff.rollbackDoneHead":`Modifications locales annulées (fichier restauré au dernier commit)`,"diff.rollbackDoneDeleted":`Fichier non suivi supprimé`,"diff.deleteUntracked":`Supprimer le fichier non suivi`,"diff.deleteUntrackedConfirm":`Supprimer définitivement {path} ? Ce fichier n'est pas suivi par git — son contenu sera perdu.`,"diff.deleteUntrackedConfirmOk":`Supprimer`,"diff.rollbackFailed":`Échec du rollback`,"diff.rollbackFailedDetail":`Échec du rollback : {error}`,"diff.modeInspect":`Édition`,"diff.modeReview":`Review`,"diff.addComment":`Ajouter un commentaire`,"diff.replyComment":`Répondre`,"diff.editComment":`Modifier`,"diff.deleteComment":`Supprimer`,"diff.deleteCommentConfirm":`Supprimer ce commentaire ?`,"diff.commentPlaceholder":`Écris un commentaire de revue… (Markdown accepté)`,"diff.reviewDraft":`Brouillon de revue`,"diff.reviewEmpty":`Aucun commentaire — survole une ligne dans le diff et clique + pour en ajouter un.`,"diff.reviewGlobalPlaceholder":`Ajoute un message global de revue (optionnel)`,"diff.submitReview":`Soumettre la revue ({n})`,"diff.reviewSubmitted":`Revue soumise à l'agent`,"diff.reviewSubmitFailed":`Échec de la soumission : {error}`,"diff.scopeBranch":`Branche`,"diff.scopeUnpushed":`Non pushé`,"diff.noChanges":`Aucun changement`,"diff.searchFiles":`Rechercher des fichiers…`,"diff.noFileMatch":`Aucun fichier correspondant`,"diff.selectFile":`Sélectionnez un fichier pour voir le diff`,"diff.fileLoadFailed":`Ce diff n’a pas pu être chargé`,"diff.fileLoadFailedHint":`Le fichier sur le disque est intact — seul le chargement du diff a échoué.`,"diff.fileListLoadFailed":`La liste des fichiers n’a pas pu être chargée`,"diff.fileListLoadFailedHint":`Il s’agit d’un échec de requête, pas d’une branche sans modification.`,"diff.addToChat":`Ajouter au chat`,"diff.compareTitle":`Comparer des commits`,"diff.compareFrom":`De`,"diff.compareTo":`À`,"diff.compareSubmit":`Comparer`,"diff.compareSourceBase":`{branch} (base de la branche)`,"diff.commitsReadOnly":`lecture seule`,"diffViewer.save":`Enregistrer`,"diffViewer.savedAt":`Enregistré`,"diffViewer.saveFailed":`Échec de l’enregistrement`,"diffViewer.saveFailedDetail":`Échec de l’enregistrement : {error}`,"diffViewer.unsavedChanges.title":`Modifications non enregistrées`,"diffViewer.unsavedChanges.message":`Tu as des modifications non enregistrées. Que veux-tu faire ?`,"diffViewer.unsavedChanges.save":`Enregistrer`,"diffViewer.unsavedChanges.cancel":`Annuler`,"diffViewer.conflict.title":`Fichier modifié sur le disque`,"diffViewer.conflict.message":`Le fichier a été modifié hors de Kōbō depuis que tu l’as ouvert.`,"diffViewer.conflict.reload":`Recharger (perdre les modifs locales)`,"diffViewer.conflict.keep":`Garder les miennes`,"diffViewer.conflict.overwrite":`Écraser quand même`,"diffViewer.conflict.overwriteHint":`Remplace le fichier sur le disque par ta version. L’autre modification est perdue.`,"diffViewer.conflict.keepHint":`Garde tes modifications dans l’éditeur et adopte la nouvelle signature du disque, pour que la prochaine sauvegarde fonctionne.`,"diffViewer.saveBlocked":`L’agent tourne — arrête-le pour enregistrer tes modifications.`,"diffViewer.unsavedBanner":`Modifications non enregistrées. Arrête l’agent pour les sauvegarder.`,"diffViewer.closeConfirm.title":`Modifications non enregistrées`,"diffViewer.closeConfirm.message":`Ce fichier contient des modifications jamais enregistrées. Fermer le visualiseur de diff les perdra.`,"diffViewer.closeConfirm.discard":`Fermer sans enregistrer`,"diffViewer.criteriaRail":`Checklist de revue`,"diffViewer.criteriaRailShow":`Afficher la checklist de revue`,"diffViewer.criteriaRailHide":`Masquer la checklist de revue`,"diffViewer.fileTreeShow":`Afficher l’arbre des fichiers`,"diffViewer.fileTreeHide":`Masquer l’arbre des fichiers`,"diffViewer.closeConfirm.saveAndClose":`Enregistrer et fermer`,"diffViewer.agentRunning":`L’agent tourne — arrête-le pour éditer`,"diffViewer.fileDeleted":`Fichier supprimé`,"notification.agentFinished":`{name} — Agent terminé`,"notification.agentQuestion":`{name} — L'agent te pose une question`,"notification.awaitingReminder":`{name} - attend toujours votre réponse ({minutes} min)`,"notification.agentPermissionRequest":`{name} — L'agent demande une permission`,"notification.autoLoopCompleted":`{name} — Auto-loop terminé`,"notification.autoLoopWaitingForSlot":`{name} - L'auto-loop attend un slot d'agent libre ({running}/{limit} en cours)`,"notification.autoLoopStalled":`{name} — Auto-loop bloqué (aucun progrès)`,"notification.autoLoopError":`{name} — Auto-loop arrêté sur erreur`,"notification.autoLoopAwaitingClarification":`{name} — Auto-loop en pause, en attente de votre précision`,"notification.autoLoopPermissionOverridden":`{name} — Auto-loop a forcé le mode plan en bypass`,"notification.agentError":`{name} — Erreur agent`,"contextMenu.rename":`Renommer`,"contextMenu.editDescription":`Modifier la description`,"contextMenu.copyPath":`Copier le chemin du worktree`,"contextMenu.openEditor":`Ouvrir dans l'éditeur`,"contextMenu.openFileManager":`Ouvrir dans l'explorateur de fichiers`,"contextMenu.unarchiveDisabledPurged":"Le worktree a été supprimé du disque. Recrée-le manuellement (`gh pr checkout` ou `git worktree add`) — Kōbō détecte la restauration dans les 30 s et réactive le workspace automatiquement.","workspaceList.unarchiveBlockedPurged":"Impossible de désarchiver : le worktree n'existe plus sur le disque. Recrée-le manuellement (`gh pr checkout` ou `git worktree add`) — Kōbō le détecte dans les 30 s et réactive le workspace.","contextMenu.purgeWorktree":`Libérer l'espace disque (supprimer le worktree)`,"contextMenu.purgeWorktreeTooltip":`Supprime le worktree du disque pour récupérer de l'espace — l'historique des messages et sessions est conservé. Archive automatiquement le workspace.`,"contextMenu.purgeWorktreeDialogTitle":`Libérer l'espace disque ?`,"contextMenu.purgeWorktreeDialogMessage":`Le dossier worktree de « {name} » va être supprimé du disque. L'historique des messages et sessions est conservé. Le workspace sera archivé automatiquement. Cette action ne peut pas être annulée dans la version actuelle.`,"contextMenu.purgeWorktreeDialogConfirm":`Supprimer le worktree`,"contextMenu.purgeWorktreeSuccess":`Worktree supprimé — espace disque récupéré.`,"settings.autoPurgeOnPrMerged":`Purger le worktree quand la PR est mergée`,"settings.autoPurgeOnPrMergedHint":`Quand activé, le worktree est supprimé du disque dès que la PR est mergée (en plus de l'archivage auto). L'historique des messages est conservé.`,"settings.autoLoopMaxRetries":`Nombre maximal de nouvelles tentatives`,"settings.awaitingUserReminder":`Rappel de question sans réponse`,"settings.awaitingUserReminderHint":`Minutes pendant lesquelles un workspace peut attendre votre réponse avant que Kōbō ne vous relance, puis à chaque intervalle suivant. 0 désactive.`,"settings.localeLoadFailed":`Impossible de charger cette langue ; la langue actuelle est conservée.`,"settings.autoLoopMaxRetriesHint":`Arrête l'auto-loop après ce nombre d'erreurs de quota ou d'erreurs serveur temporaires.`,"settings.retentionTitle":`Rétention de l'historique de conversation (désactivée par défaut)`,"settings.retentionWarning":`Activer cette option supprime définitivement de la base l'historique de conversation des agents, à commencer par tout ce qui est déjà plus vieux que la fenêtre. Les événements supprimés sont irrécupérables.`,"settings.retentionHint":`Exécutée une fois au démarrage du serveur. Les workspaces, tâches, sessions, branches et worktrees ne sont jamais touchés — seule la sortie enregistrée des agents l'est.`,"settings.retentionDaysLabel":`Supprimer les événements plus vieux que (jours)`,"settings.retentionDaysHint":`0 — la valeur par défaut — conserve tous les événements indéfiniment. Renseignez une valeur pour activer la rétention.`,"settings.retentionKeepLabel":`Événements toujours conservés par workspace`,"settings.retentionKeepHint":`Les événements les plus récents de chaque workspace survivent quel que soit leur âge, pour qu'un workspace ancien mais toujours ouvert garde un historique lisible. Suggéré : 5000.`,"settings.retentionDisabledHint":`Rétention désactivée : rien ne sera jamais supprimé.`,"settings.retentionConfirmTitle":`Supprimer définitivement de l'historique de conversation ?`,"settings.retentionConfirmMessage":`Ne conserver que {days} jour(s) d'historique supprimera définitivement, au prochain démarrage du serveur, {count} des {total} événements d'agent enregistrés — y compris tout ce qui est déjà plus ancien. C'est irréversible. Continuer ?`,"settings.retentionConfirmMessageUnknown":`Ne conserver que {days} jour(s) d'historique supprimera définitivement, au prochain démarrage du serveur, tous les événements d'agent plus anciens — y compris tout ce qui est déjà accumulé. Le volume exact n'a pas pu être calculé. C'est irréversible. Continuer ?`,"settings.purgeDocsTitle":`Comment ça marche — restauration & permissions`,"settings.purgeDocsRestoreTitle":`Restaurer un worktree purgé (détection automatique)`,"settings.purgeDocsRestoreIntro":`Un workspace purgé conserve son historique de chat et les métadonnées de la PR, mais le dossier worktree n'existe plus. Recrée-le manuellement avec l'une de ces commandes — Kōbō détecte la réapparition du dossier dans les 30 secondes et réactive automatiquement le workspace (désarchive + clear flag purge) :`,"settings.purgeDocsRestoreCommands":`# GitHub (via le CLI gh) :
12
12
  gh pr checkout [numéro-pr] --recurse-submodules
13
13
 
14
14
  # Ou directement via git (fonctionne sur GitHub même après suppression de la branche) :