Skip to content

Commit b6b7d42

Browse files
Patch76claude
andauthored
fix: pin the English tool texts that translations are written against (#2064)
* fix: pin the English tool texts that translations are written against en.json leaves `tools` empty — English for the 87 titles and descriptions comes from the tool definitions at runtime — so those 174 strings lived in no catalog, and locale_source_baseline.json never hashed them. Editing a docstring moved the English out from under every locale with nothing going red, which is the exact failure the baseline exists to prevent for the four surfaces it already covered. It has happened twice. ha_dev_manage_settings gained "and the Tools/Policies/Backups surfaces", ha_report_issue gained "and templates". de, ru and zh-Hans were written before those edits and still describe the old behaviour; fr was written after and copied the older wording from a sibling catalog, which no timestamp comparison can see. Walking the history of the generated site/src/data/tools.json shows these are the only two English tool texts that have moved at all since the first catalog landed, so the eight entries fixed here are the whole backlog rather than a sample of it. english_sources now hashes the tool texts as their own surface: 174 rendered strings plus the six docstring renderings that differ from their FEATURE_GATED_TOOLS stub, because a setting decides which of the two the UI shows and either can move. Everything else about the baseline is unchanged, and scripts/update_locale_baseline.py regenerated it. The eight translations are assembled from vocabulary already in the repo rather than invented: each locale's own tab labels supply the surface names, and its existing tool descriptions supply the word for templates and the sentence form each catalog uses — infinitive in ru, third person in de and fr, verb-first in zh-Hans. The wording was cross-checked against Home Assistant's own shipped UI catalogs, which agree on every term except one: HA calls the backup panel "Резервное копирование" while this catalog says "Резервные копии". That difference is left alone; it is a noun-versus-gerund choice a Russian speaker should make, not a drift fix. * test: hash the summary paragraph, not the displayed first line The tool descriptions went into the baseline as the settings UI row renders them — settings.js cuts the docstring at the first newline, then at 120 characters — so any part of a summary that wraps onto a second line stayed unpinned. It is one tool of the 87: ha_config_set_helper wraps "(28 types, unified interface)." off its first line, and zh-Hans is the catalog that translates that clause. The count could have moved to 30 with the Chinese still saying 28 and nothing going red, which is the failure this baseline exists to prevent. Hashing the summary paragraph instead closes it and changes exactly one recorded hash; the other 86 tools have their whole summary on the first line already. The copy checks keep comparing against the displayed line, because a paste is of what was on screen. Verified by injection: editing the clause to "(30 types, unified interface)." reddens test_translations_are_checked_against_current_english naming ha_config_set_helper.description, and the same edit against the previous commit passes. * fix: complete the report-issue titles and the displayed-text check Three catalogs advertised one of that tool's two paths. `ha_report_issue` is "Report Issue or Feedback" in English, while de, fr and ru named the problem half only — an incomplete translation rather than drift the baseline missed, and pinning the title would have frozen it in place. The paste check compared a translated value against the description's full first line, while settings.js renders that line cut at 120 characters. For the two descriptions that outrun the cut, ha_get_state at 130 and ha_search at 171, a paste of exactly what was on screen therefore byte-differed from the text it was pasted from and passed. `_english_tool_texts` now models both halves of the cut. Two guards for discriminations the pin relies on and nothing checked: one fails once no summary paragraph outruns its first physical line, the other once a feature-gated tool whose stub equals its parsed first line starts wrapping its summary — the case where the else arm would pin text the UI never shows. The `(docstring)` suffix becomes `(parsed)`, which is what it means for `ha_config_set_yaml.title`: a `title=` kwarg, not a docstring. German `Bereiche` becomes `Abschnitte`, this catalog's word for a settings section — `Bereich` is how it renders a Home Assistant area. AGENTS.md now states that a tool docstring is one of the English strings the Translations section governs, which was written entirely about catalog files. Both guards verified by injection: making `_summary_paragraph` return the first line reddens the first, and giving ha_read_file a wrapping summary reddens the second naming that tool. The 120-character cut was verified the same way — a pasted on-screen ha_get_state description is flagged with it and passes without it. Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com> * test: cut the gated stub to the width its row shows `_render_stub` feeds a feature-gated tool's stub through the same `description` field a docstring goes through, so settings.js applies the same 120-character cut to it. `_english_tool_texts` cut the docstring branch only, leaving the stub compared at a width the row never renders. No stub reaches 120 characters today — the longest is 84 — so this moves no hash and changes no comparison; it stops the two branches from modelling different things. The gated-stub guard now measures "the summary wraps" against the physical first line rather than the cut one, matching its sibling: a wrap is a property of the docstring, not of the display width. Both guards re-verified by injection after the change, and the regenerated baseline is byte-identical. Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
1 parent 559448f commit b6b7d42

7 files changed

Lines changed: 343 additions & 15 deletions

File tree

AGENTS.md

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -759,6 +759,15 @@ each translation was written against, because key parity cannot see a string
759759
whose meaning changed: #1993 flipped a policy string from ALL-match to
760760
ANY-match and left the Chinese text asserting the opposite.
761761

762+
**A tool docstring is one of those English strings.** `en.json` ships `tools`
763+
empty, so the English a `tools` entry translates is read from the tool
764+
definition in `src/ha_mcp/tools/` — the `title=` kwarg and the summary
765+
paragraph of the docstring, or the `FEATURE_GATED_TOOLS` stub where a gated
766+
tool shows one instead. Editing
767+
that summary therefore moves the English out from under five catalogs and goes
768+
red here, in the PR that edits it, rather than leaving every locale describing
769+
the old behaviour.
770+
762771
The Webhook Proxy add-on and its bundled integration stay **English-only by
763772
decision** — not worth the upkeep. The test records that, so any other new
764773
catalog directory fails until it is either translated everywhere or listed as

src/ha_mcp/settings_ui/locales/de.json

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -550,7 +550,7 @@
550550
},
551551
"ha_dev_manage_settings": {
552552
"title": "Server-Einstellungen verwalten (dev)",
553-
"description": "Ändert ha-mcp-Einstellungen direkt im Entwicklermodus."
553+
"description": "Verwaltet die ha-mcp-Servereinstellungen und die Abschnitte Tools/Richtlinien/Backups (Entwicklermodus)."
554554
},
555555
"ha_get_device": {
556556
"title": "Gerät abrufen",
@@ -789,8 +789,8 @@
789789
"description": "Wertet ein Jinja2-Template mit der Home-Assistant-Engine aus."
790790
},
791791
"ha_report_issue": {
792-
"title": "Problem melden",
793-
"description": "Sammelt Diagnosen für einen Fehlerbericht oder Feedback."
792+
"title": "Problem melden oder Feedback geben",
793+
"description": "Liefert Diagnoseinformationen und Vorlagen für Fehlerberichte oder Feedback."
794794
},
795795
"ha_get_zone": {
796796
"title": "Zonen abrufen",

src/ha_mcp/settings_ui/locales/fr.json

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -550,7 +550,7 @@
550550
},
551551
"ha_dev_manage_settings": {
552552
"title": "Gérer les paramètres du serveur (dev)",
553-
"description": "Modifie directement les paramètres ha-mcp en mode développeur."
553+
"description": "Gère les paramètres du serveur ha-mcp et les sections Outils/Politiques/Sauvegardes (mode développeur)."
554554
},
555555
"ha_get_device": {
556556
"title": "Obtenir l'appareil",
@@ -789,8 +789,8 @@
789789
"description": "Évalue un modèle Jinja2 avec le moteur Home Assistant."
790790
},
791791
"ha_report_issue": {
792-
"title": "Signaler un problème",
793-
"description": "Recueille les diagnostics pour un rapport de bogue ou un retour d'information."
792+
"title": "Signaler un problème ou envoyer un retour",
793+
"description": "Fournit des informations de diagnostic et des modèles pour signaler un problème ou envoyer un retour."
794794
},
795795
"ha_get_zone": {
796796
"title": "Obtenir les zones",

src/ha_mcp/settings_ui/locales/ru.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -479,7 +479,7 @@
479479
"ha_config_set_dashboard": {"title": "Создать или изменить панель", "description": "Создать новую или обновить существующую панель Home Assistant."},
480480
"ha_config_set_dashboard_resource": {"title": "Задать ресурс панели", "description": "Создать или обновить ресурс панели из кода или внешнего URL."},
481481
"ha_dev_manage_server": {"title": "Управлять MCP-сервером (dev)", "description": "Управлять запущенным сервером ha-mcp в режиме разработчика."},
482-
"ha_dev_manage_settings": {"title": "Управлять настройками сервера (dev)", "description": "Напрямую изменять настройки ha-mcp в режиме разработчика."},
482+
"ha_dev_manage_settings": {"title": "Управлять настройками сервера (dev)", "description": "Управлять настройками сервера ha-mcp и разделами «Инструменты», «Политики безопасности», «Резервные копии» (режим разработчика)."},
483483
"ha_get_device": {"title": "Получить устройство", "description": "Получить сведения об устройствах, включая Zigbee, Z-Wave и Matter."},
484484
"ha_remove_device": {"title": "Удалить устройство", "description": "Удалить осиротевшее устройство из реестра Home Assistant."},
485485
"ha_set_device": {"title": "Изменить устройство", "description": "Обновить имя, зону, метки и другие свойства устройства."},
@@ -539,7 +539,7 @@
539539
"ha_remove_todo_item": {"title": "Удалить задачу", "description": "Удалить задачу из списка дел Home Assistant."},
540540
"ha_set_todo_item": {"title": "Создать или изменить задачу", "description": "Создать новую или обновить задачу в списке дел."},
541541
"ha_eval_template": {"title": "Вычислить шаблон", "description": "Вычислить Jinja2-шаблон с помощью движка Home Assistant."},
542-
"ha_report_issue": {"title": "Сообщить о проблеме", "description": "Собрать диагностику для отчёта об ошибке или обратной связи."},
542+
"ha_report_issue": {"title": "Сообщить о проблеме или отправить отзыв", "description": "Получить диагностические сведения и шаблоны для отчёта об ошибке или обратной связи."},
543543
"ha_get_zone": {"title": "Получить зоны", "description": "Показать все географические зоны или сведения об одной зоне."},
544544
"ha_remove_zone": {"title": "Удалить зону", "description": "Удалить географическую зону Home Assistant."},
545545
"ha_set_zone": {"title": "Создать или изменить зону", "description": "Создать новую или обновить географическую зону Home Assistant."}

src/ha_mcp/settings_ui/locales/zh-Hans.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -490,7 +490,7 @@
490490
},
491491
"ha_report_issue": {
492492
"title": "报告问题或反馈",
493-
"description": "收集诊断信息以提交问题报告或反馈"
493+
"description": "获取诊断信息和用于提交问题报告或反馈的模板"
494494
},
495495
"ha_config_get_calendar_events": {
496496
"title": "获取日历事件",
@@ -586,7 +586,7 @@
586586
},
587587
"ha_dev_manage_settings": {
588588
"title": "管理服务器设置(开发者)",
589-
"description": "直接管理 ha-mcp 服务器设置(开发者模式)。"
589+
"description": "管理 ha-mcp 服务器设置以及“工具”/“工具安全策略”/“备份”页面(开发者模式)。"
590590
},
591591
"ha_dev_manage_server": {
592592
"title": "管理 MCP 服务器(开发者)",

tests/src/unit/locale_source_baseline.json

Lines changed: 182 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,188 @@
182182
"configuration.verify_ssl.description": "f7da6ad6ed2f93d1",
183183
"configuration.verify_ssl.name": "b5a42c87a2f2def2"
184184
},
185+
"settings UI tool titles and descriptions": {
186+
"ha_bulk_control.description": "387d4ed7116097e3",
187+
"ha_bulk_control.title": "190bca20de2f1453",
188+
"ha_call_event.description": "12e6ed8f553d1408",
189+
"ha_call_event.title": "a387066396d34c39",
190+
"ha_call_service.description": "84cb1198577c60b3",
191+
"ha_call_service.title": "d4972c7cbdf02589",
192+
"ha_config_delete_dashboard.description": "8b317bc0887bad8e",
193+
"ha_config_delete_dashboard.title": "d1534bc866402d63",
194+
"ha_config_delete_dashboard_resource.description": "6fa48aa44cbbe9ca",
195+
"ha_config_delete_dashboard_resource.title": "2a2c433fdd354574",
196+
"ha_config_get_automation.description": "9e6dd9ab06735341",
197+
"ha_config_get_automation.title": "af4a53803d0f5669",
198+
"ha_config_get_calendar_events.description": "d5bd458f93bd002b",
199+
"ha_config_get_calendar_events.title": "27ff0c5e3717652d",
200+
"ha_config_get_category.description": "d8c1839f95761f49",
201+
"ha_config_get_category.title": "bffaa3e7e9ff776d",
202+
"ha_config_get_dashboard.description": "ecc5416bf7eecdd0",
203+
"ha_config_get_dashboard.title": "6beacbd4a64fb980",
204+
"ha_config_get_label.description": "2b477940c613dfac",
205+
"ha_config_get_label.title": "2c4087261bc05295",
206+
"ha_config_get_scene.description": "1e6ecf8ff63edc16",
207+
"ha_config_get_scene.title": "5276861c95b6ff37",
208+
"ha_config_get_script.description": "701ded70f7484789",
209+
"ha_config_get_script.title": "a60b9c6c5580888c",
210+
"ha_config_get_yaml.description": "a013708e3387c037",
211+
"ha_config_get_yaml.description (parsed)": "90565082b9a86541",
212+
"ha_config_get_yaml.title": "5d28192cf5347f7d",
213+
"ha_config_list_dashboard_resources.description": "f94702be3d92b966",
214+
"ha_config_list_dashboard_resources.title": "0be6e1e3619b1a55",
215+
"ha_config_list_groups.description": "89dc939dccce56f1",
216+
"ha_config_list_groups.title": "90f498b0a0bb4d37",
217+
"ha_config_list_helpers.description": "c7c393786080f87e",
218+
"ha_config_list_helpers.title": "18f4715f708d3c23",
219+
"ha_config_remove_automation.description": "85826ea0bf238fe5",
220+
"ha_config_remove_automation.title": "117124f5f2e46917",
221+
"ha_config_remove_calendar_event.description": "088c357160202397",
222+
"ha_config_remove_calendar_event.title": "0fffc60ff9a63800",
223+
"ha_config_remove_category.description": "7bc50d16723e7d33",
224+
"ha_config_remove_category.title": "b933ad92d2b6118d",
225+
"ha_config_remove_group.description": "25a32c92a343b2aa",
226+
"ha_config_remove_group.title": "9bd301e8905145c5",
227+
"ha_config_remove_label.description": "84f92cff6f6c238b",
228+
"ha_config_remove_label.title": "5ef2ed74031c0d53",
229+
"ha_config_remove_scene.description": "7ac27f802ff4bf4f",
230+
"ha_config_remove_scene.title": "2f3e2b8cf41a8e8c",
231+
"ha_config_remove_script.description": "9ff186eebe40f529",
232+
"ha_config_remove_script.title": "da272fc8a2d83b1b",
233+
"ha_config_set_automation.description": "5a03af00fd40aa70",
234+
"ha_config_set_automation.title": "fa4dd9829953e8c3",
235+
"ha_config_set_calendar_event.description": "a4175b012ffa3df5",
236+
"ha_config_set_calendar_event.title": "b2524c68b2f716b8",
237+
"ha_config_set_category.description": "37cfa0cb43c3e038",
238+
"ha_config_set_category.title": "3fb808e352f31c67",
239+
"ha_config_set_dashboard.description": "fba214864a08f835",
240+
"ha_config_set_dashboard.title": "c024fbd91b38a335",
241+
"ha_config_set_dashboard_resource.description": "9ada7c5ca0ddc0b2",
242+
"ha_config_set_dashboard_resource.title": "af331cb18e4fe3d4",
243+
"ha_config_set_group.description": "d2e4e23ad266ff07",
244+
"ha_config_set_group.title": "3a0142e4e8142c5e",
245+
"ha_config_set_helper.description": "4643b704ddedec21",
246+
"ha_config_set_helper.title": "1b7e4b0dd4292fc8",
247+
"ha_config_set_label.description": "1275fc40f9541cd7",
248+
"ha_config_set_label.title": "6535f8c94a624e30",
249+
"ha_config_set_scene.description": "c87735076ad6f62f",
250+
"ha_config_set_scene.title": "d8fb041ca0ecfd52",
251+
"ha_config_set_script.description": "7f91f69c18551205",
252+
"ha_config_set_script.title": "96c8cd0cc316517a",
253+
"ha_config_set_yaml.description": "0ff1f8ed1ed3431d",
254+
"ha_config_set_yaml.description (parsed)": "3e3b58435e467c8d",
255+
"ha_config_set_yaml.title": "7fd880cb59aba371",
256+
"ha_config_set_yaml.title (parsed)": "7ba7fd3361c68c99",
257+
"ha_delete_file.description": "db17dce1f3af40f6",
258+
"ha_delete_file.description (parsed)": "207283b4421b1c91",
259+
"ha_delete_file.title": "e1e5fe2043bd3003",
260+
"ha_dev_manage_server.description": "67dd412bd6e9cc99",
261+
"ha_dev_manage_server.title": "75b8873d3fd57ebd",
262+
"ha_dev_manage_settings.description": "bc70a0167bd4664d",
263+
"ha_dev_manage_settings.title": "01f5baef30656b27",
264+
"ha_eval_template.description": "2c68f7351b2696b6",
265+
"ha_eval_template.title": "95c41aa00509c0b1",
266+
"ha_get_addon.description": "c5aa23962092e9ed",
267+
"ha_get_addon.title": "d480bc41a5bbb41a",
268+
"ha_get_automation_traces.description": "c614cf5261c9d4a7",
269+
"ha_get_automation_traces.title": "ea9223fa5156dac4",
270+
"ha_get_blueprint.description": "e79011ef0adb2d3d",
271+
"ha_get_blueprint.title": "8815e4e4a549a441",
272+
"ha_get_camera_image.description": "6bcbe41edd6adbcb",
273+
"ha_get_camera_image.title": "d37c27c11d587850",
274+
"ha_get_dashboard_screenshot.description": "765881d3de2b0f4e",
275+
"ha_get_dashboard_screenshot.title": "71406e9773c5091f",
276+
"ha_get_device.description": "0862b5101322e6f9",
277+
"ha_get_device.title": "2b0de73e67ffd224",
278+
"ha_get_entity.description": "2a231fb397767055",
279+
"ha_get_entity.title": "b45fa0a3f7336193",
280+
"ha_get_entity_exposure.description": "99a81cfc7b96a30f",
281+
"ha_get_entity_exposure.title": "8b6e7a2d595c35dc",
282+
"ha_get_hacs_info.description": "7081a8cbfee4bf39",
283+
"ha_get_hacs_info.title": "90cd63432e3cd07e",
284+
"ha_get_history.description": "1c60812a1472f711",
285+
"ha_get_history.title": "733f3bced52102ae",
286+
"ha_get_integration.description": "6a4ce14b7679d1aa",
287+
"ha_get_integration.title": "401f9da0a9245eaa",
288+
"ha_get_logs.description": "24879e9b17469232",
289+
"ha_get_logs.title": "f8eec17b7014bad2",
290+
"ha_get_operation_status.description": "24400f873a53a367",
291+
"ha_get_operation_status.title": "da9421d4d0060026",
292+
"ha_get_overview.description": "99615a64e3fe6421",
293+
"ha_get_overview.title": "29fea93257774ed5",
294+
"ha_get_state.description": "1c08533d780f28ad",
295+
"ha_get_state.title": "bd66bc891a50e1a2",
296+
"ha_get_system_health.description": "2417e2a8735bc896",
297+
"ha_get_system_health.title": "974211e1ec579e02",
298+
"ha_get_todo.description": "7bef59bc7f4591f3",
299+
"ha_get_todo.title": "33c95385f3ec4bad",
300+
"ha_get_zone.description": "00a28e389ec1f3a1",
301+
"ha_get_zone.title": "4d3f8587f60088f8",
302+
"ha_import_blueprint.description": "76840fddcdda38c8",
303+
"ha_import_blueprint.title": "06965a3a7777d158",
304+
"ha_list_files.description": "a27efdac3a411ad5",
305+
"ha_list_files.description (parsed)": "5741646e06bbc9a0",
306+
"ha_list_files.title": "3ab99410333f6cfe",
307+
"ha_list_floors_areas.description": "1c1039a7f6b0220d",
308+
"ha_list_floors_areas.title": "021a324dfe12f1ff",
309+
"ha_list_services.description": "6134a8712d232b6a",
310+
"ha_list_services.title": "adf19e0a4adc195c",
311+
"ha_manage_addon.description": "8eb592f6fcf2743f",
312+
"ha_manage_addon.title": "fe41453c7e364189",
313+
"ha_manage_backup.description": "710fe0b0a022443b",
314+
"ha_manage_backup.title": "27453f0f8a6fe48f",
315+
"ha_manage_custom_tool.description": "2d11294916b08404",
316+
"ha_manage_custom_tool.description (parsed)": "17e6987cfd85fe0d",
317+
"ha_manage_custom_tool.title": "608a0065a471cdef",
318+
"ha_manage_energy_prefs.description": "4a35a74f842a9bc1",
319+
"ha_manage_energy_prefs.title": "c7972fa209551faa",
320+
"ha_manage_hacs.description": "7304221f871c99e7",
321+
"ha_manage_hacs.title": "89133d319e5c723e",
322+
"ha_manage_pipeline.description": "0dcb88eb7b6a5333",
323+
"ha_manage_pipeline.title": "f3d098a7f07d762f",
324+
"ha_manage_radio.description": "687614bb176863e5",
325+
"ha_manage_radio.title": "d3652e3015043e14",
326+
"ha_manage_theme.description": "dc3486b249ee7541",
327+
"ha_manage_theme.title": "bbd7cc9b1ccae800",
328+
"ha_manage_updates.description": "2817b1e7b6351e97",
329+
"ha_manage_updates.title": "67e75eabd230e0a9",
330+
"ha_read_file.description": "ba58369170e20ea9",
331+
"ha_read_file.title": "fb9b615c6b482637",
332+
"ha_reload_core.description": "b0d5fdbcae77df01",
333+
"ha_reload_core.title": "ba94c7af815af3e1",
334+
"ha_remove_area_or_floor.description": "fa94b6736ba94fe5",
335+
"ha_remove_area_or_floor.title": "04ddbf264fa33fe7",
336+
"ha_remove_device.description": "238310aca64b2a66",
337+
"ha_remove_device.title": "ff1be38ef77e59ee",
338+
"ha_remove_entity.description": "527a3c6b48da227f",
339+
"ha_remove_entity.title": "80737ebedb1b140a",
340+
"ha_remove_helpers_integrations.description": "5fc1934068cd4ade",
341+
"ha_remove_helpers_integrations.title": "71083f9458c3fa4c",
342+
"ha_remove_todo_item.description": "6f6a491ef57afa55",
343+
"ha_remove_todo_item.title": "933e6852dfe873e1",
344+
"ha_remove_zone.description": "2db5dff5b5551e3b",
345+
"ha_remove_zone.title": "589352bbb6c2571b",
346+
"ha_report_issue.description": "1dbf25d2c2446aab",
347+
"ha_report_issue.title": "57f1a5769847a69b",
348+
"ha_restart.description": "c69f717cedf3639f",
349+
"ha_restart.title": "891201143db59eb4",
350+
"ha_search.description": "c159533226ed4970",
351+
"ha_search.title": "49c266baaaa70981",
352+
"ha_set_area_or_floor.description": "7bd888c56f1efd77",
353+
"ha_set_area_or_floor.title": "d032f7c5cee00c4f",
354+
"ha_set_device.description": "b1f06dedc0bd7f96",
355+
"ha_set_device.title": "ad1a0c3ff512be01",
356+
"ha_set_entity.description": "8b8bf5ab3191abbf",
357+
"ha_set_entity.title": "80157db7ff1b868d",
358+
"ha_set_integration.description": "ac5ee695ffeef5ce",
359+
"ha_set_integration.title": "a86d452343e3bb4f",
360+
"ha_set_todo_item.description": "f2d74959003ae95c",
361+
"ha_set_todo_item.title": "0510f2eaaf39e38f",
362+
"ha_set_zone.description": "289a61496ac6cfbb",
363+
"ha_set_zone.title": "c8801b98d9cbb605",
364+
"ha_write_file.description": "daa1c68dc53febd4",
365+
"ha_write_file.title": "d78cd87c20261047"
366+
},
185367
"src/ha_mcp/settings_ui/locales": {
186368
"messages.accessibility.colors.accent": "a5c6fb18c9af89b2",
187369
"messages.accessibility.colors.background": "ea2b8a878841df59",

0 commit comments

Comments
 (0)