dsh-eslat 0.0.0-stage → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 dsh-locale-es-labels contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md CHANGED
@@ -1,3 +1,203 @@
1
- # Temporary Holding Version
1
+ # dsh-eslat · EsLat
2
2
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
3
+ > **English summary** — **EsLat** is a [DeepSeek Harness](https://github.com/deepseek-ai/DeepSeek-Harness)
4
+ > language bundle that translates the **whole web GUI** into neutral **Latin American Spanish**:
5
+ > 1,615 labels across all 36 client namespaces shipped by DSH 0.2.0-rc.2 — conversation, sidebar,
6
+ > settings, trajectory, tool calls, status summaries, dialogs, errors and empty states. Nothing is
7
+ > left falling back to English. Install with `dsh plugin add dsh-eslat`, or from the **Plugins** page
8
+ > in the sidebar. Revert to English with Settings → *Idioma* → English. Full documentation below is
9
+ > in Spanish.
10
+
11
+ Traducción completa al **español neutro de Latinoamérica** de la interfaz web de DSH. Es un paquete
12
+ de idioma: registra el idioma `es` y un diccionario para **cada** namespace que el cliente de DSH
13
+ publica, de modo que la interfaz entera —no solo las herramientas— aparece en español.
14
+
15
+ ```
16
+ Conversación → Escribe un mensaje o una tarea, / para comandos, @ para archivos o sesiones
17
+ Barra lateral → Espacios de trabajo · Sesiones · Archivar · Fijar · Cambiar nombre
18
+ Ajustes → Configuración · Apariencia · Permisos · Tamaño de letra · Atajos
19
+ Trayectoria → Turnos · Llamadas · Solicitudes · Mediciones · Uso de tokens
20
+ Herramientas → Leer / Escribir / Editar / Buscar en el contenido / PowerShell / Crear subagente
21
+ Estados → En ejecución / Preparando la llamada / Fallida / Detenida
22
+ Resúmenes → Leyendo archivos · Completado en 12 s · Se leyeron archivos y se ejecutaron comandos
23
+ ```
24
+
25
+ ## Instalación
26
+
27
+ Es un **bundle** de DSH (`dsh.bundle.patch`), así que se instala como cualquier otro plugin.
28
+
29
+ ### Desde npm
30
+
31
+ ```
32
+ dsh plugin add dsh-eslat
33
+ ```
34
+
35
+ o en la interfaz web: barra lateral → **Plugins** → **Add plugin** → escribe el nombre del paquete →
36
+ **Install**. El diálogo acepta también una dirección Git, un tarball o una ruta local absoluta.
37
+
38
+ ### Desde un tarball
39
+
40
+ Sin cuenta de npm y sin permisos de compilación: el tarball trae la mitad Cliente ya construida.
41
+
42
+ ```
43
+ dsh plugin add ./dsh-eslat-2.0.0.tgz
44
+ ```
45
+
46
+ ### Desde un repositorio Git
47
+
48
+ ```
49
+ dsh plugin add github:Amador-Aguilar/dsh-eslat
50
+ ```
51
+
52
+ Este paquete **no necesita `prepare` ni autorizar scripts de compilación**: el bundle del navegador
53
+ (`lib/client.js`) se publica construido, no se genera al instalar.
54
+
55
+ ### En este equipo (desarrollo)
56
+
57
+ En el perfil `desktop` está instalado desde el registro (`"dsh-eslat": "^2.0.0"`). Para probar
58
+ cambios locales sin publicar, instálalo desde la ruta del proyecto con el gestor de plugins: queda
59
+ como `link:` y los cambios de `src/` + `node tools/build.mjs` se aplican al recargar la página.
60
+
61
+ ## Activación
62
+
63
+ Al montarse, el plugin registra el idioma y sus diccionarios, y selecciona **Español** una sola vez,
64
+ sustituyendo únicamente el idioma por defecto (`en`). Después:
65
+
66
+ | Situación | Qué ocurre |
67
+ |---|---|
68
+ | La interfaz estaba en inglés (por defecto) | Pasa a Español; toda la interfaz cambia |
69
+ | Ya estaba en chino u otro idioma elegido | No se toca nada: solo sustituye el idioma por defecto |
70
+ | El usuario cambia a otro idioma en Configuración → Idioma | Se respeta para siempre; el plugin no vuelve a forzar el español |
71
+ | Un shell nativo vuelve a anunciar su idioma por defecto | El plugin recupera el español, porque la elección no fue del usuario |
72
+
73
+ La memoria de esa decisión vive en `localStorage` del navegador (`dsh-eslat:activation`). Si el
74
+ almacenamiento no está disponible, el plugin selecciona español en cada carga cuando la interfaz está
75
+ en inglés.
76
+
77
+ **Para volver atrás:** Configuración → General → *Idioma* → English. Para desinstalarlo, página
78
+ **Plugins**.
79
+
80
+ ## Cobertura
81
+
82
+ **1.615 de 1.615 claves (100 %) en 36 de 36 namespaces.** La verificación por clave lo garantiza y
83
+ falla si alguna falta.
84
+
85
+ | Grupo | Namespaces | Claves |
86
+ |---|---|---:|
87
+ | Conversación y chat | `conversation` 367 · `chat` 186 | 553 |
88
+ | Trayectoria y entregables | `trajectory` 192 · `deliverables` 60 | 252 |
89
+ | Navegación y paneles | `workspace` 112 · `sidebarRight` 34 · `sidebarBrowser` 19 · `sidebarFiles` 11 · `sidebarDocumentPreview` 11 · `sidebar` 5 · `sidebarTerminal` 1 | 193 |
90
+ | Ajustes y preferencias | `settings` 34 · `shortcuts` 28 · `permission.access` 17 · `settings.permission` 12 · `settings.theme` 9 | 100 |
91
+ | Tareas y automatización | `schedule.manager` 133 · `job` 39 · `workflowRun` 18 · `schedule.catalog` 16 | 206 |
92
+ | Herramientas y agentes | `cordis` 51 · `subagent` 39 · `model` 23 · `slash.menu` 9 · `skill` 8 | 130 |
93
+ | Comandos y diálogos | `question` 31 · `command` 28 · `feedback` 20 · `plan` 17 · `goal` 12 · `approval` 1 | 109 |
94
+ | Base compartida | `common` 41 · `open-in-app` 15 · `reference` 11 · `documentMarkdown` 4 · `settings.locale` 1 | 72 |
95
+
96
+ ## Dialecto
97
+
98
+ Español neutro de Latinoamérica, con estas decisiones aplicadas en todo el paquete:
99
+
100
+ | Se usa | En lugar de |
101
+ |---|---|
102
+ | Configuración | Ajustes |
103
+ | presiona / haz clic | pulsa / pincha |
104
+ | agregar | añadir |
105
+ | computadora, celular | ordenador, móvil |
106
+ | archivo | fichero |
107
+ | costo | coste |
108
+ | `dd/mm/aaaa`, millar con punto (`1.615`) | formato inglés |
109
+
110
+ Términos que se mantienen: `Bash`, `PowerShell`, `JSON`, `ZIP`, `TTFT`, `tok/s`, `Markdown`,
111
+ `Cordis`, `sandbox`, `preset` y los nombres de modelos.
112
+
113
+ `test/verify.mjs` incluye un **guardián de dialecto**: falla si reaparece un lexema peninsular
114
+ (`ordenador`, `fichero`, `puls…`, `añad…`, `vosotros`, `móvil`, `coger`, `pinch…`, `zumo`, `patata`,
115
+ `coche`).
116
+
117
+ ## Identidad del plugin
118
+
119
+ | Capa | Valor | Dónde se define |
120
+ |---|---|---|
121
+ | Nombre visible | **EsLat** | `locale/{en,es}.json` → `meta.title` |
122
+ | Nombre técnico (npm y **id del módulo del navegador**) | `dsh-eslat` | `package.json` → `name` |
123
+ | Icono | «Es» sobre «Lat»: degradado azul + cian, 36×36 | `icon.svg` |
124
+ | Autor | Amador Aguilar (`@amador_aguilar` en npm, `Amador-Aguilar` en GitHub) | `package.json` → `author` |
125
+ | Repositorio | [github.com/Amador-Aguilar/dsh-eslat](https://github.com/Amador-Aguilar/dsh-eslat) | `package.json` → `repository` |
126
+
127
+ La autoría formal la registra npm al publicar (`npm owner ls dsh-eslat`); la tarjeta de Plugins solo
128
+ muestra icono, título y descripción.
129
+
130
+ ## Estructura
131
+
132
+ ```
133
+ package.json manifiesto: dsh.bundle.patch + dsh.client (platform web)
134
+ cordis.patch.yml capa de parche del bundle: inserta la fila eslat
135
+ lib/index.js mitad Host: inerte, solo mantiene el paquete en el árbol del Loader
136
+ lib/client.js mitad Cliente construida (generada) — todo el comportamiento vive aquí
137
+ lib/client.js.map source map de identidad del bundle
138
+ locale/{en,es}.json título y descripción del plugin en la página Plugins
139
+ icon.svg icono de la tarjeta (36×36, convención de DSH)
140
+ src/<namespace>.es.json un diccionario por namespace; añadir cobertura es añadir un archivo
141
+ src/language.json definición del idioma: id, etiqueta y respaldo
142
+ tools/build.mjs construye lib/client.js y su map a partir de src/
143
+ tools/extract-shipped-keys.mjs descubre los namespaces de DSH y regenera la instantánea de claves
144
+ test/verify.mjs claves, marcadores, dialecto, frescura del bundle y requisitos de publicación
145
+ test/smoke.mjs ejecuta la mitad Cliente contra dobles de prueba
146
+ test/shipped-en.json instantánea de los diccionarios ingleses de DSH 0.2.0-rc.2
147
+ ```
148
+
149
+ Solo se publica la primera mitad: `src/`, `tools/` y `test/` son material del repositorio.
150
+
151
+ ### Por qué la mitad Cliente es un archivo construido
152
+
153
+ DSH sirve cada plugin del navegador como un bundle *lazy-CJS* ya construido: el host lee
154
+ `exports["./client"]` y el navegador evalúa el archivo, que debe estar en la forma del cargador de
155
+ módulos (`window.__ModuleLoader__.load({ id, factory })`) y no puede importar nada, porque el
156
+ protocolo no admite `require` relativos entre bundles. Por eso los diccionarios viven en `src/` y se
157
+ incorporan al bundle generado.
158
+
159
+ ## Desarrollo
160
+
161
+ ```powershell
162
+ node tools/build.mjs # regenera lib/client.js y su map
163
+ node test/verify.mjs # claves, marcadores, dialecto, frescura, publicación
164
+ node test/verify.mjs --strict # además exige cobertura 100 %
165
+ node test/smoke.mjs # comportamiento de la mitad Cliente
166
+ node tools/extract-shipped-keys.mjs # re-descubre los namespaces de la imagen instalada
167
+ ```
168
+
169
+ `verify` distingue **errores** (clave inexistente, marcador `{…}` que no cuadra, bundle obsoleto,
170
+ lexema peninsular) de **cobertura pendiente**, que informa; `--strict` la exige y es lo que corre
171
+ `prepublishOnly`.
172
+
173
+ `test/shipped-en.json` es una instantánea extraída de DSH `0.2.0-rc.2`. Si una versión futura
174
+ renombra o añade claves, `node tools/extract-shipped-keys.mjs` refresca la instantánea y `verify`
175
+ dice exactamente qué falta.
176
+
177
+ ## Publicar
178
+
179
+ `prepublishOnly` encadena build + `verify --strict` + smoke, así que no puede salir una versión con
180
+ cobertura incompleta.
181
+
182
+ ```powershell
183
+ npm run verify # build + verificación + pruebas
184
+ npm publish # con OTP: npm publish --otp=123456
185
+ ```
186
+
187
+ Requisitos que `verify` comprueba: `dsh.bundle.patch` presente, la fila del patch con el nombre del
188
+ paquete, `name`/`version` válidos, mitad Cliente construida y en `files`, `engines.dsh`, licencia y
189
+ `prepublishOnly`.
190
+
191
+ ## Limitaciones
192
+
193
+ - **Claves atadas a una versión** — la verificación está anclada a DSH `0.2.0-rc.2`. Una clave
194
+ renombrada aguas arriba revierte esa etiqueta al inglés hasta que se actualice el diccionario; el
195
+ extractor y el verificador lo detectan.
196
+ - **Los datos no se traducen** — rutas de archivos, descripciones de comandos, resúmenes derivados de
197
+ los argumentos de cada herramienta y la respuesta del modelo siguen en el idioma en que lleguen.
198
+ - **Enumeraciones de tres o más elementos** — DSH une los resúmenes cerrados con un separador fijo,
199
+ sin ranura para la conjunción final, así que una lista de tres sale con comas en lugar de «y».
200
+ - **Sin reglas de plural propias** — se usan las ranuras `.one`/`.other` que DSH consulta; `es`
201
+ comparte con `en` la regla singular/plural.
202
+ - **Sin configuración** — el plugin no declara esquema: activarlo o desactivarlo en la página Plugins
203
+ es el único mando.
@@ -0,0 +1,9 @@
1
+ # Bundle patch layer for dsh-eslat (EsLat): applied after the dsh-base and
2
+ # dsh-web-app layers, before this profile's own cordis.patch.yml.
3
+ #
4
+ # One row: the Spanish label pack. Its host half is an inert entry that keeps
5
+ # the package in the Loader tree; the browser half arrives through the
6
+ # package's `dsh.client` declaration (exports["./client"]).
7
+ - insert:
8
+ - id: eslat
9
+ name: 'dsh-eslat'
package/icon.svg ADDED
@@ -0,0 +1,14 @@
1
+ <svg width="36" height="36" viewBox="0 0 36 36" fill="none" xmlns="http://www.w3.org/2000/svg">
2
+ <!-- EsLat, stacked: "Es" above "Lat" in the same palette — blue gradient over cyan accent.
3
+ textLength pins each line to an exact width and text-anchor keeps both centred, so the
4
+ stack neither clips nor drifts when the host resolves a different sans-serif (an <img>
5
+ cannot load webfonts). -->
6
+ <text x="18" y="17" text-anchor="middle" font-family="Inter, 'Segoe UI', system-ui, -apple-system, Arial, sans-serif" font-size="14" font-weight="800" letter-spacing="-0.3" textLength="17" lengthAdjust="spacingAndGlyphs" fill="url(#eslat-es)">Es</text>
7
+ <text x="18" y="29" text-anchor="middle" font-family="Inter, 'Segoe UI', system-ui, -apple-system, Arial, sans-serif" font-size="11" font-weight="700" letter-spacing="0.1" textLength="16.5" lengthAdjust="spacingAndGlyphs" fill="#45D9E7">Lat</text>
8
+ <defs>
9
+ <linearGradient id="eslat-es" x1="9.5" y1="7" x2="26.5" y2="18" gradientUnits="userSpaceOnUse">
10
+ <stop stop-color="#7AC2FF"/>
11
+ <stop offset="1" stop-color="#4A65E8"/>
12
+ </linearGradient>
13
+ </defs>
14
+ </svg>