@goodandready/dsh-russian-lang 0.2.24 → 0.2.26

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/README.md CHANGED
@@ -5,16 +5,16 @@
5
5
  <h3>Полная русская локализация, умная типографика и исправление раскладки клавиатуры для DeepSeek Harness</h3>
6
6
 
7
7
  <p align="center">
8
- <a href="https://www.npmjs.com/package/@goodandready/dsh-russian-lang"><img src="https://img.shields.io/badge/npm-v0.2.24-6366f1.svg?style=for-the-badge&labelColor=1e1b4b" alt="npm version"></a>
8
+ <a href="https://www.npmjs.com/package/@goodandready/dsh-russian-lang"><img src="https://img.shields.io/badge/npm-v0.2.25-6366f1.svg?style=for-the-badge&labelColor=1e1b4b" alt="npm version"></a>
9
9
  <a href="LICENSE"><img src="https://img.shields.io/badge/License-MIT-10b981.svg?style=for-the-badge&color=10b981&labelColor=064e3b" alt="license"></a>
10
10
  <a href="https://github.com/topics/dsh-plugin"><img src="https://img.shields.io/badge/DSH-Plugin-8b5cf6.svg?style=for-the-badge&labelColor=2e1065" alt="DSH Plugin"></a>
11
11
  <a href="https://nodejs.org"><img src="https://img.shields.io/badge/Node-20%2B-f59e0b.svg?style=for-the-badge&labelColor=451a03" alt="Node version"></a>
12
12
  </p>
13
13
 
14
14
  <p align="center">
15
- <img src="https://img.shields.io/badge/DSH-v0.1.5--rc.2%2B-blue.svg?style=for-the-badge&labelColor=1e1b4b" alt="DSH v0.1.6-alpha.1+">
15
+ <img src="https://img.shields.io/badge/DSH-v0.1.6--alpha.2%2B-blue.svg?style=for-the-badge&labelColor=1e1b4b" alt="DSH v0.1.6-alpha.2+">
16
16
  <img src="https://img.shields.io/badge/Покрытие-100%25-10b981.svg?style=for-the-badge&labelColor=064e3b" alt="Покрытие 100%">
17
- <img src="https://img.shields.io/badge/Ключей_UI-6808-6366f1.svg?style=for-the-badge&labelColor=1e1b4b" alt="6808 ключей">
17
+ <img src="https://img.shields.io/badge/Ключей_UI-8735-6366f1.svg?style=for-the-badge&labelColor=1e1b4b" alt="8735 ключей">
18
18
  <img src="https://img.shields.io/badge/Ручная_вычитка-100%25-0ea5e9.svg?style=for-the-badge&labelColor=082f49" alt="100% ручная вычитка">
19
19
  </p>
20
20
 
@@ -55,9 +55,9 @@ graph LR
55
55
  DSH[Web UI Интерфейс] --> Loader[Загрузчик локализации dsh-russian-lang]
56
56
  end
57
57
 
58
- subgraph TranslationLayer [Слой перевода и адаптации — 6808 ключей / 100% вычитано]
59
- Loader --> CoreDict[30+ Пространств имён ядра DSH / 1225 ключа]
60
- Loader --> PluginDict[30+ Плагинов экосистемы DSH / 5404 ключ]
58
+ subgraph TranslationLayer [Слой перевода и адаптации — 8735 ключей / 100% вычитано]
59
+ Loader --> CoreDict[49 Пространств имён ядра DSH / 2146 ключей]
60
+ Loader --> PluginDict[60+ Плагинов экосистемы DSH / 6589 ключей]
61
61
  Loader --> PluralEngine[Движок грамматических Plural-форм: 1/2/5]
62
62
  end
63
63
 
@@ -88,7 +88,7 @@ graph LR
88
88
 
89
89
  ## ✨ Полный обзор возможностей
90
90
 
91
- ### 1. 🌐 100% покрытие ядра DSH (30+ Пространств имён, 1225 ключа)
91
+ ### 1. 🌐 100% покрытие ядра DSH (49 Пространств имён, 2146 ключей)
92
92
  * **Диалоги и переписка (`conversation`)**: лента сообщений, ветки обсуждений, карточки вызова инструментов, статус генерации и рассуждений (thinking traces).
93
93
  * **Модели и провайдеры (`settings.models`)**: каталог моделей, параметры инференса, управление токенами и ключами API.
94
94
  * **Трейсы рассуждений (`trajectory`)**: детальные шаги, параметры вызовов инструментов, временные метки и визуализация размышлений модели.
@@ -97,9 +97,9 @@ graph LR
97
97
  * **Планировщик и инвентарь (`schedule.catalog`, `settings.pluginInventory`, `settings.plugins`)**: фоновые задания, периодичность, фильтры и каталог установленных плагинов.
98
98
  * **Права доступа и безопасность (`permission.access`, `plan`, `skill`)**: пресеты прав (полный доступ, только чтение, запись в рабочую область), выполнение планов и навыки.
99
99
 
100
- > **О качестве перевода.** Все **6808 ключей интерфейса (722 ядра + 5583 плагинов) переведены на 100% и вычитаны вручную**. Черновой машинный перевод полностью замещён проверенными формулировками (`draft = 0`). Перевод регулярно валидируется автоматическими линтерами целостности плейсхолдеров, проверкой соблюдения глоссария (`glossary.json`) и детекторами переполнения верстки. Нашли неточность — кнопка «Сообщить о проблеме перевода» в карточке настроек создаёт готовый issue.
100
+ > **О качестве перевода.** Все **8735 ключей интерфейса (2146 ядра + 6589 плагинов) переведены на 100% и вычитаны вручную**. Черновой машинный перевод полностью замещён проверенными формулировками (`draft = 0`). Перевод регулярно валидируется автоматическими линтерами целостности плейсхолдеров, проверкой соблюдения глоссария (`glossary.json`) и детекторами переполнения верстки. Нашли неточность — кнопка «Сообщить о проблеме перевода» в карточке настроек создаёт готовый issue.
101
101
 
102
- ### 2. 🧩 Встроенный перевод 30+ плагинов экосистемы DSH (5404 ключ)
102
+ ### 2. 🧩 Встроенный перевод 60+ плагинов экосистемы DSH (6589 ключей)
103
103
  Локализация автоматически распространяется на все ключевые плагины экосистемы DeepSeek Harness:
104
104
  * **`dsh-session-control`** — расширенное управление сессиями: закрепление диалогов, архив по периодам, просмотр расшифровок и фильтрация шума;
105
105
  * **`dsh-kanban` и `task-board`** — канбан-доски задач, карточки, чек-листы, дедлайны, критерии готовности (DoD) и шлюз приёмки (Acceptance Gate);
package/README.ru.md CHANGED
@@ -5,16 +5,16 @@
5
5
  <h3>Полная русская локализация, умная типографика и исправление раскладки клавиатуры для DeepSeek Harness</h3>
6
6
 
7
7
  <p align="center">
8
- <a href="https://www.npmjs.com/package/@goodandready/dsh-russian-lang"><img src="https://img.shields.io/badge/npm-v0.2.24-6366f1.svg?style=for-the-badge&labelColor=1e1b4b" alt="npm version"></a>
8
+ <a href="https://www.npmjs.com/package/@goodandready/dsh-russian-lang"><img src="https://img.shields.io/badge/npm-v0.2.25-6366f1.svg?style=for-the-badge&labelColor=1e1b4b" alt="npm version"></a>
9
9
  <a href="LICENSE"><img src="https://img.shields.io/badge/License-MIT-10b981.svg?style=for-the-badge&color=10b981&labelColor=064e3b" alt="license"></a>
10
10
  <a href="https://github.com/topics/dsh-plugin"><img src="https://img.shields.io/badge/DSH-Plugin-8b5cf6.svg?style=for-the-badge&labelColor=2e1065" alt="DSH Plugin"></a>
11
11
  <a href="https://nodejs.org"><img src="https://img.shields.io/badge/Node-20%2B-f59e0b.svg?style=for-the-badge&labelColor=451a03" alt="Node version"></a>
12
12
  </p>
13
13
 
14
14
  <p align="center">
15
- <img src="https://img.shields.io/badge/DSH-v0.1.5--rc.1%2B-blue.svg?style=for-the-badge&labelColor=1e1b4b" alt="DSH v0.1.5-rc.1+">
15
+ <img src="https://img.shields.io/badge/DSH-v0.1.6--alpha.2%2B-blue.svg?style=for-the-badge&labelColor=1e1b4b" alt="DSH v0.1.6-alpha.2+">
16
16
  <img src="https://img.shields.io/badge/Покрытие-100%25-10b981.svg?style=for-the-badge&labelColor=064e3b" alt="Покрытие 100%">
17
- <img src="https://img.shields.io/badge/Ключей_UI-6002-6366f1.svg?style=for-the-badge&labelColor=1e1b4b" alt="6002 ключей">
17
+ <img src="https://img.shields.io/badge/Ключей_UI-8735-6366f1.svg?style=for-the-badge&labelColor=1e1b4b" alt="8735 ключей">
18
18
  <img src="https://img.shields.io/badge/Ручная_вычитка-100%25-0ea5e9.svg?style=for-the-badge&labelColor=082f49" alt="100% ручная вычитка">
19
19
  </p>
20
20
 
@@ -55,9 +55,9 @@ graph LR
55
55
  DSH[Web UI Интерфейс] --> Loader[Загрузчик локализации dsh-russian-lang]
56
56
  end
57
57
 
58
- subgraph TranslationLayer [Слой перевода и адаптации — 6002 ключей / 100% вычитано]
59
- Loader --> CoreDict[30+ Пространств имён ядра DSH / 1225 ключа]
60
- Loader --> PluginDict[30+ Плагинов экосистемы DSH / 4777 ключ]
58
+ subgraph TranslationLayer [Слой перевода и адаптации — 8735 ключей / 100% вычитано]
59
+ Loader --> CoreDict[49 Пространств имён ядра DSH / 2146 ключей]
60
+ Loader --> PluginDict[60+ Плагинов экосистемы DSH / 6589 ключей]
61
61
  Loader --> PluralEngine[Движок грамматических Plural-форм: 1/2/5]
62
62
  end
63
63
 
@@ -88,7 +88,7 @@ graph LR
88
88
 
89
89
  ## ✨ Полный обзор возможностей
90
90
 
91
- ### 1. 🌐 100% покрытие ядра DSH (30+ Пространств имён, 1225 ключа)
91
+ ### 1. 🌐 100% покрытие ядра DSH (49 Пространств имён, 2146 ключей)
92
92
  * **Диалоги и переписка (`conversation`)**: лента сообщений, ветки обсуждений, карточки вызова инструментов, статус генерации и рассуждений (thinking traces).
93
93
  * **Модели и провайдеры (`settings.models`)**: каталог моделей, параметры инференса, управление токенами и ключами API.
94
94
  * **Трейсы рассуждений (`trajectory`)**: детальные шаги, параметры вызовов инструментов, временные метки и визуализация размышлений модели.
@@ -97,9 +97,9 @@ graph LR
97
97
  * **Планировщик и инвентарь (`schedule.catalog`, `settings.pluginInventory`, `settings.plugins`)**: фоновые задания, периодичность, фильтры и каталог установленных плагинов.
98
98
  * **Права доступа и безопасность (`permission.access`, `plan`, `skill`)**: пресеты прав (полный доступ, только чтение, запись в рабочую область), выполнение планов и навыки.
99
99
 
100
- > **О качестве перевода.** Все **6002 ключей интерфейса (722 ядра + 3989 плагинов) переведены на 100% и вычитаны вручную**. Черновой машинный перевод полностью замещён проверенными формулировками (`draft = 0`). Перевод регулярно валидируется автоматическими линтерами целостности плейсхолдеров, проверкой соблюдения глоссария (`glossary.json`) и детекторами переполнения верстки. Нашли неточность — кнопка «Сообщить о проблеме перевода» в карточке настроек создаёт готовый issue.
100
+ > **О качестве перевода.** Все **8735 ключей интерфейса (2146 ядра + 6589 плагинов) переведены на 100% и вычитаны вручную**. Черновой машинный перевод полностью замещён проверенными формулировками (`draft = 0`). Перевод регулярно валидируется автоматическими линтерами целостности плейсхолдеров, проверкой соблюдения глоссария (`glossary.json`) и детекторами переполнения верстки. Нашли неточность — кнопка «Сообщить о проблеме перевода» в карточке настроек создаёт готовый issue.
101
101
 
102
- ### 2. 🧩 Встроенный перевод 30+ плагинов экосистемы DSH (4777 ключ)
102
+ ### 2. 🧩 Встроенный перевод 60+ плагинов экосистемы DSH (6589 ключей)
103
103
  Локализация автоматически распространяется на все ключевые плагины экосистемы DeepSeek Harness:
104
104
  * **`dsh-session-control`** — расширенное управление сессиями: закрепление диалогов, архив по периодам, просмотр расшифровок и фильтрация шума;
105
105
  * **`dsh-kanban` и `task-board`** — канбан-доски задач, карточки, чек-листы, дедлайны, критерии готовности (DoD) и шлюз приёмки (Acceptance Gate);
package/lib/client.js CHANGED
@@ -525,6 +525,7 @@ const exportSessionToMarkdown = (session, options = {}) => {
525
525
  RU['russian-lang'] = {"cardTitle": "Русская локализация", "cardSub": "Язык интерфейса, типографика, раскладка", "badgeRu": "🟢 RU активен", "badgeEn": "⚪ EN активен", "badgeCoverage": "🟢 100% (7,902 ключа)", "badgeSmartUx": "⚡ Smart UX активен", "secLanguage": "🌐 Язык интерфейса", "secLanguageDesc": "Нативное переключение языка интерфейса DSH на русский без перезагрузки страницы.", "enabled": "Русский язык включён", "enabledDesc": "Переключает язык интерфейса DeepSeek Harness на русский.", "quickSwitchNote": "Быстрый переключатель RU ⇄ EN доступен в шапке сессии рядом с кнопками диалога.", "secTypography": "✍️ Умная типографика и ввод (Smart UX)", "secTypographyDesc": "Автоматическое улучшение текстов по нормам русской типографики во время диалога и набора.", "typography": "Типографика вывода", "typographyDesc": "Исправляет типографику ответов модели: кавычки-«ёлочки», тире («—») вместо дефисов, неразрывные пробелы после предлогов.", "yo": "Буква «ё»", "yoDesc": "Восстанавливать «ё» в частых словах (ещё, чёрный, идёт и др.), написанных через «е». Неоднозначные слова (все/всё) не трогаются.", "liveInput": "Живая типографика инпута", "liveInputDesc": "Автоматически заменять \"\" на «» и -- на — прямо во время набора промпта (код в бэктиках игнорируется).", "slashAliases": "Русские алиасы команд", "slashAliasesDesc": "Поддержка русских команд: /цель -> /goal, /сжать -> /compact, /план -> /plan, /справка -> /help, /память -> /memory.", "altLHintText": "Мгновенная конвертация раскладки текущего поля (ghbdtn ⇄ привет, /vjltkm ⇄ /model). В углу поля ввода также отображается метка раскладки.", "secAgentPrompt": "🤖 Системный промпт агента", "secAgentPromptDesc": "Официальная секция расширения DSH systemPrompt для ведения диалога на русском языке.", "agentPrompt": "Русский промпт агента", "agentPromptDesc": "Добавляет в системный промпт инструкцию отвечать по-русски в выбранном стиле.", "agentPromptPreset": "Стиль ответов агента", "presetExpert": "Технический эксперт (строгая терминология, чистый код)", "presetWriter": "Технический писатель (Markdown, таблицы, ГОСТ)", "presetConcise": "Лаконичный режим (кратко, без лишней воды)", "secUpdater": "🔄 Обновление языкового пакета", "secUpdaterDesc": "Проверка наличия новых релизов в реестре npm и обновление в один клик.", "updaterCurrent": "Текущая версия: v{version}", "updaterLatest": "Доступна новая версия: v{version}", "updaterUpToDate": "Установлена актуальная версия", "updaterChecking": "Проверка…", "updaterCheckBtn": "Проверить обновления", "updaterBtn": "Обновить до v{version} в 1 клик", "updaterUpdating": "Установка обновления…", "updaterSuccess": "✅ Плагин успешно обновлён! Перезапустите DSH для применения.", "updaterFailed": "❌ Не удалось проверить/обновить плагин. Проверьте сеть или логи сервера.", "badgeUpdateAvailable": "Доступно обновление", "badgeUpToDate": "Актуальная версия", "secTranslator": "🌐 Перевод сообщений ассистента", "secTranslatorDesc": "Настройка перевода ответов модели в чате на русский язык (локально в Docker или онлайн).", "translateEngine": "Движок перевода", "engineOff": "Выключен (по умолчанию, без сетевых вызовов)", "engineLocal": "Локальный LibreTranslate (приватно, ~600 МБ RAM)", "engineGoogle": "Google Translate (онлайн)", "googleWarn": "⚠️ Внимание: при онлайн-переводе текст сообщений ассистента передаётся на публичные серверы Google для перевода на лету. Не используйте для конфиденциальных данных.", "localStatusRunning": "🟢 Контейнер LibreTranslate активен", "localStatusStopped": "⚪ Контейнер LibreTranslate не запущен", "localStartBtn": "Запустить LibreTranslate в Docker (~600 МБ RAM)", "localStarting": "Запуск контейнера…", "localInfo": "LibreTranslate запускается изолированно в Docker на сервере, потребляет ~500–700 МБ RAM и переводит на 100% локально.", "secSupport": "📊 Покрытие экосистемы и поддержка", "secSupportDesc": "Словари синхронизированы с DSH v0.1.6-alpha.1. 100.0% UI-покрытие ядра и всех установленных плагинов (7,902 ключа) без черновых машинных переводов.", "statNamespaces": "Пространств имён", "statCoreKeys": "Ключей ядра", "statPluginKeys": "Ключей плагинов", "overridesCount": "Своих переопределений", "statusLoading": "Настройки загружаются…", "statusUnavailable": "Настройки недоступны на этом хосте", "translateTurn": "Перевести на русский", "reportIssue": "Сообщить о неточности перевода", "exportMdHint": "Экспорт диалога в Markdown доступен по кнопке [ 📥 MD ] в шапке сессии.", "translateTurnHint": "Перевод ответов ассистента на русский доступен по кнопке [ RU ↗ ] на блоках сообщений."}
526
526
 
527
527
  const SETTINGS_NS_NAME = 'russian-lang'
528
+ const ROW_CONFIG_KEY = '@goodandready/dsh-russian-lang#russian-lang'
528
529
 
529
530
  function apply(ctx) {
530
531
  const runtime = ctx.locale
@@ -1523,6 +1524,14 @@ const exportSessionToMarkdown = (session, options = {}) => {
1523
1524
  } catch (err) { console.warn('dsh-russian-lang: toggle failed', err) }
1524
1525
  }
1525
1526
  try {
1527
+ ctx.slots.inject('plugins.row.config', () =>
1528
+ ctx.slots.register({
1529
+ name: 'plugins.row.config',
1530
+ key: ROW_CONFIG_KEY,
1531
+ locale: SETTINGS_NS_NAME,
1532
+ inject: () => ({ scope, runtime, toggleRu }),
1533
+ }, SettingsCard),
1534
+ )
1526
1535
  ctx.slots.inject('settings.plugin.item', () =>
1527
1536
  ctx.slots.register({
1528
1537
  name: 'settings.plugin.item',
@@ -1691,7 +1700,7 @@ const exportSessionToMarkdown = (session, options = {}) => {
1691
1700
  const [loading, setLoading] = React.useState(false)
1692
1701
  const [open, setOpen] = React.useState(false)
1693
1702
  const [upStatus, setUpStatus] = React.useState({
1694
- currentVersion: '0.2.23',
1703
+ currentVersion: '0.2.25',
1695
1704
  latestVersion: undefined,
1696
1705
  updateAvailable: false
1697
1706
  })
@@ -1858,7 +1867,7 @@ const exportSessionToMarkdown = (session, options = {}) => {
1858
1867
  if (copyBtn) {
1859
1868
  copyBtn.addEventListener('click', (e) => {
1860
1869
  e.stopPropagation()
1861
- try { navigator.clipboard.writeText(displayText) } catch (err) { /* bestEffort */ void err; }
1870
+ try { navigator.clipboard.writeText(displayText) } catch (err) { /* bestEffort */ void e; }
1862
1871
  copyBtn.textContent = '✓ Скопировано'
1863
1872
  setTimeout(() => { copyBtn.textContent = '📋 Копировать' }, 2000)
1864
1873
  })
@@ -1971,11 +1980,17 @@ const exportSessionToMarkdown = (session, options = {}) => {
1971
1980
  const presetKey = value.agentPromptPreset || 'technical_expert'
1972
1981
  const presetInfo = typeof SYSTEM_PROMPT_PRESETS !== 'undefined' ? SYSTEM_PROMPT_PRESETS[presetKey] : null
1973
1982
 
1974
- return React.createElement('div', { className: 'rl-card' },
1983
+ if (props && props.view === 'summary') {
1984
+ return React.createElement('div', { className: 'rl-sub' }, statusLine || t('cardSub'))
1985
+ }
1986
+ const page = !!(props && props.view === 'page')
1987
+
1988
+ return React.createElement('div', { className: page ? 'rl-page-seat' : 'rl-card' },
1975
1989
  React.createElement('button', {
1976
1990
  type: 'button',
1977
1991
  className: 'rl-head',
1978
- 'aria-expanded': String(open),
1992
+ style: page ? { display: 'none' } : undefined,
1993
+ 'aria-expanded': page ? 'true' : String(open),
1979
1994
  onClick: () => setOpen(!open),
1980
1995
  },
1981
1996
  React.createElement('span', { className: 'rl-head-main' },
@@ -1990,7 +2005,7 @@ const exportSessionToMarkdown = (session, options = {}) => {
1990
2005
  React.createElement('span', {
1991
2006
  className: 'rl-chev' + (open ? ' rl-chev-open' : ''),
1992
2007
  }, React.createElement(Chevron, null))),
1993
- open && React.createElement('div', { className: 'rl-body' },
2008
+ (page || open) && React.createElement('div', { className: 'rl-body' },
1994
2009
  React.createElement('div', { className: 'rl-page' },
1995
2010
 
1996
2011
  React.createElement('div', { className: 'rl-section-card' },
@@ -2056,7 +2071,7 @@ const exportSessionToMarkdown = (session, options = {}) => {
2056
2071
  React.createElement('label', { className: 'rl-item-label' },
2057
2072
  checkbox(value.slashAliases !== false && ruActive,
2058
2073
  (ev) => {
2059
- try { scope.set('slashAliases', ev.target.checked) } catch (err) { /* bestEffort */ void err; }
2074
+ try { scope.set('slashAliases', ev.target.checked) } catch (err) { /* bestEffort */ void e; }
2060
2075
  }, !ruActive || disabled),
2061
2076
  t('slashAliases')
2062
2077
  )
@@ -2132,7 +2147,7 @@ const exportSessionToMarkdown = (session, options = {}) => {
2132
2147
  React.createElement('div', { style: { display: 'flex', justifyContent: 'space-between', alignItems: 'center', flexWrap: 'wrap', gap: '8px' } },
2133
2148
  React.createElement('div', null,
2134
2149
  React.createElement('div', { style: { fontWeight: 600, color: 'var(--dsw-alias-label-primary)' } },
2135
- t('updaterCurrent').replace('{version}', upStatus.currentVersion || '0.2.23')),
2150
+ t('updaterCurrent').replace('{version}', upStatus.currentVersion || '0.2.25')),
2136
2151
  upStatus.updateAvailable
2137
2152
  ? React.createElement('div', { style: { color: 'var(--dsw-alias-color-warning, #eab308)', marginTop: '2px', fontWeight: 500 } },
2138
2153
  t('updaterLatest').replace('{version}', upStatus.latestVersion || ''))
@@ -2245,7 +2260,7 @@ const exportSessionToMarkdown = (session, options = {}) => {
2245
2260
  ),
2246
2261
  React.createElement('div', { className: 'rl-actions-row' },
2247
2262
  React.createElement('a', {
2248
- href: makeIssueUrl({}, '0.2.23'),
2263
+ href: makeIssueUrl({}, '0.2.25'),
2249
2264
  target: '_blank',
2250
2265
  rel: 'noopener noreferrer',
2251
2266
  className: 'rl-btn rl-btn-primary'