dsh-gitbash-shell 0.35.3 → 0.36.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/CHANGELOG.md CHANGED
@@ -3,6 +3,15 @@
3
3
  > 倒序排列,新版本条目在最上面。条目格式:`## vX.Y.Z — YYYY-MM-DD` + 类型(feat / fix / docs / chore)+ 要点 + 相关链接。
4
4
  > 纪律见 AGENTS.md「变更记录纪律」:发版前先更新本文件并随版本提交;事故复盘、复现与真机验证记录也记在这里。
5
5
 
6
+ ## v0.36.0 — 2026-10-13
7
+
8
+ **类型**:feat(设置卡分组重排;用户反馈「一排按钮不知道分类」)。
9
+
10
+ - **七分区语义分组**:此前 9 个开关一锅炖在「路径方言」分区里(方言、终端接管、Git 行尾、bash 路径混排),行内工具区连标题都没有。重排为按功能域的七个分区,显示顺序即用户决策顺序:**模式**(变体开关)→ **行内工具**(gitbash_pwsh、gb_*——补上标题)→ **路径方言**(瘦身,纯翻译层 6 开关)→ **执行器**(新分区:Git 行尾 + Git Bash 路径——找「为什么 diff 飘红」或填 bash 路径不用再滚过六个翻译开关)→ **终端**(新建终端接管 + 侧栏接管)→ **终端工具**(win32 工具链,原样)→ **插件联动**(新合并分区:去重开关 + python 后端两个席位一个标题)。
11
+ - **词典**:新增 `sec.inline`/`sec.executor`/`sec.peer` × 21 语言;`sec.terminal` 文案从「侧栏终端」改为「终端」(该分区现在装的是两个终端接管开关)。合计 21 门逐键对齐(冒烟键集断言全过)。
12
+ - **冒烟**:117 项(116 过 + 1 跳)。新增「client card: the body groups switches into seven labelled sections」——锁七分区定义齐全、body 挂载顺序、方言区不再吞执行器/终端行、行内工具区有标题。
13
+ - 功能面零变化:所有开关的字段名、写入通道(configForms)、默认值全部原样,纯布局重组。
14
+
6
15
  ## v0.35.3 — 2026-10-12
7
16
 
8
17
  **类型**:fix(issue [#18](https://github.com/KannaKuron/dsh-gitbash-shell/issues/18) 三个独立根因;Windows 真机 v0.35.0 四面全灭)。
package/dsh.plugin.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "id": "dsh-external/dsh-gitbash-shell",
3
- "version": "0.35.3",
3
+ "version": "0.36.0",
4
4
  "main": "./src/index.js",
5
5
  "description": "Windows 全模式 Git Bash:用 Git for Windows bash 替换 PowerShell 执行器;官方四个模式经行内工具补位直接获得 Git Bash(v0.35.0,默认),四个 *·Git Bash 变体 preset 可开关;附带 gitbash_pwsh(系统 PowerShell 7)与 gb_* FastCtx 文件工具,检测到 dsh-ops 自动让位。联动:dsh-ptc-cordis-preset(PTC 创造模式带 Git Bash 行且可去重)+ dsh-better-sidebar(终端标签自动切 Git Bash)。",
6
6
  "engines": {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dsh-gitbash-shell",
3
- "version": "0.35.3",
3
+ "version": "0.36.0",
4
4
  "description": "Windows 上让 agent 的每条 shell 命令改经 Git for Windows bash 执行;物化四个内置预设的 Git Bash 变体,统一 MSYS 盘根路径方言,侧栏终端接管可开关。· Run every agent shell command through Git for Windows bash on Windows; materialize Git Bash variants of the built-in presets, unify the MSYS drive-root path dialect, and adopt the sidebar terminal behind a switch.",
5
5
  "type": "module",
6
6
  "repository": {
package/src/client.js CHANGED
@@ -76,8 +76,11 @@ window.__ModuleLoader__.load({
76
76
  "switch.off": "停用",
77
77
  "error": "写入失败",
78
78
  "hint": "启用后:所有工具(bash 命令与 workdir、read/write/edit/read_image/glob/grep 与 present 的路径参数)统一使用 MSYS 盘根 POSIX 路径(/c/Users/...);bash 的原生习惯——~ 家目录、/tmp 临时目录、/dev/null、/usr 等——在所有工具中同样有效(与 Git Bash 挂载表一致),路径参数由宿主自动翻译,模型无感。停用后恢复 dsh 原生行为(文件工具用 Windows 路径)。bash 始终是 Git Bash,不受此开关影响。",
79
+ "sec.inline": "行内工具",
80
+ "sec.executor": "执行器",
81
+ "sec.peer": "插件联动",
79
82
  "sec.dialect": "路径方言",
80
- "sec.terminal": "侧栏终端",
83
+ "sec.terminal": "终端",
81
84
  "mnts.label": "虚拟路径挂载",
82
85
  "mnts.hint": "bash 的原生路径习惯——~ 家目录、/tmp、/usr 等——按 Git Bash 挂载表在所有工具解析;关闭则仅 /c/ 盘根形式。",
83
86
  "errs.label": "报错路径翻译",
@@ -150,8 +153,11 @@ window.__ModuleLoader__.load({
150
153
  "switch.off": "Disable",
151
154
  "error": "write failed",
152
155
  "hint": "Enabled: every tool (bash commands and workdir, read/write/edit/read_image/glob/grep and present path arguments) uses MSYS drive-root POSIX paths (/c/Users/...); bash-native habits — the ~ home shorthand, /tmp, /dev/null, /usr — resolve in every tool exactly as bash itself resolves them, and the host translates the path fields automatically. Disabled restores dsh-native behavior (Windows paths for file tools). Bash is always Git Bash while the plugin is installed; this switch only governs the cross-tool path dialect.",
156
+ "sec.inline": "Inline tools",
157
+ "sec.executor": "Executor",
158
+ "sec.peer": "Plugin integrations",
153
159
  "sec.dialect": "Path dialect",
154
- "sec.terminal": "Sidebar terminal",
160
+ "sec.terminal": "Terminal",
155
161
  "mnts.label": "Virtual path mounts",
156
162
  "mnts.hint": "Bash-native habits — ~ home, /tmp, /usr — resolve through the Git Bash mount table in every tool; off = /c/ drive roots only.",
157
163
  "errs.label": "Error-path translation",
@@ -234,8 +240,11 @@ window.__ModuleLoader__.load({
234
240
  "switch.off": "تعطيل",
235
241
  "error": "فشل الكتابة",
236
242
  "hint": "عند التفعيل: تستخدم كل الأدوات (أوامر bash و workdir، ومعاملات المسار في read/write/edit/read_image/glob/grep و present) مسارات POSIX من جذر قرص MSYS (/c/Users/...)؛ وعادات bash الأصلية — ~ للمجلد الرئيسي و /tmp و /dev/null و /usr — تعمل في كل أداة تمامًا كما تحلّها bash نفسها، ويتولّى المضيف ترجمة حقول المسار تلقائيًا. عند التعطيل يعود السلوك الأصلي لـ dsh (مسارات Windows لأدوات الملفات). يبقى bash دائمًا Git Bash ما دامت الإضافة مثبَّتة؛ هذا المفتاح لا يحكم سوى لهجة المسارات بين الأدوات.",
243
+ "sec.inline": "الأدوات المضمنة",
244
+ "sec.executor": "المنفّذ",
245
+ "sec.peer": "تكامل الإضافات",
237
246
  "sec.dialect": "لهجة المسارات",
238
- "sec.terminal": "طرفية الشريط الجانبي",
247
+ "sec.terminal": "الطرفية",
239
248
  "mnts.label": "التركيبات الافتراضية للمسارات",
240
249
  "mnts.hint": "عادات bash الأصلية — ~ و /tmp و /usr — تُحل عبر جدول تحميلات Git Bash في كل أداة؛ الإيقاف يعني جذور الأقراص /c/ فقط.",
241
250
  "errs.label": "ترجمة مسارات الأخطاء",
@@ -308,8 +317,11 @@ window.__ModuleLoader__.load({
308
317
  "switch.off": "Deaktivieren",
309
318
  "error": "Schreiben fehlgeschlagen",
310
319
  "hint": "Aktiviert: Alle Tools (bash-Befehle und workdir sowie Pfadargumente von read/write/edit/read_image/glob/grep und present) verwenden POSIX-Pfade ab der MSYS-Laufwerkswurzel (/c/Users/...); bash-eigene Gewohnheiten — ~ für das Home-Verzeichnis, /tmp, /dev/null, /usr — funktionieren in jedem Tool genau so, wie bash sie selbst auflöst, und der Host übersetzt die Pfadfelder automatisch. Deaktiviert stellt das dsh-native Verhalten wieder her (Windows-Pfade für Dateitools). Bash ist bei installiertem Plugin immer Git Bash; dieser Schalter steuert nur den Pfaddialekt zwischen den Tools.",
320
+ "sec.inline": "Inline-Werkzeuge",
321
+ "sec.executor": "Executor",
322
+ "sec.peer": "Plugin-Integrationen",
311
323
  "sec.dialect": "Pfaddialekt",
312
- "sec.terminal": "Seitenleisten-Terminal",
324
+ "sec.terminal": "Terminal",
313
325
  "mnts.label": "Virtuelle Pfad-Mounts",
314
326
  "mnts.hint": "Bash-eigene Gewohnheiten — ~ Home, /tmp, /usr — werden über die Git-Bash-Mount-Tabelle in jedem Tool aufgelöst; aus = nur /c/-Laufwerkswurzeln.",
315
327
  "errs.label": "Fehlerpfad-Übersetzung",
@@ -382,8 +394,11 @@ window.__ModuleLoader__.load({
382
394
  "switch.off": "Désactiver",
383
395
  "error": "échec de l'écriture",
384
396
  "hint": "Activé : tous les outils (commandes bash et workdir, arguments de chemin de read/write/edit/read_image/glob/grep et de present) utilisent des chemins POSIX à racine de lecteur MSYS (/c/Users/...) ; les habitudes natives de bash — ~ pour le dossier personnel, /tmp, /dev/null, /usr — fonctionnent dans chaque outil exactement comme bash les résout lui-même, et l'hôte traduit les champs de chemin automatiquement. Désactivé rétablit le comportement natif de dsh (chemins Windows pour les outils de fichiers). Bash reste toujours Git Bash tant que le plugin est installé ; ce commutateur ne régit que le dialecte de chemins entre outils.",
397
+ "sec.inline": "Outils en ligne",
398
+ "sec.executor": "Exécuteur",
399
+ "sec.peer": "Intégrations de plugins",
385
400
  "sec.dialect": "Dialecte de chemins",
386
- "sec.terminal": "Terminal latéral",
401
+ "sec.terminal": "Terminal",
387
402
  "mnts.label": "Montages de chemins virtuels",
388
403
  "mnts.hint": "Les habitudes natives de bash — ~ home, /tmp, /usr — se résolvent via la table de montages de Git Bash dans chaque outil ; désactivé = racines /c/ uniquement.",
389
404
  "errs.label": "Traduction des chemins d'erreur",
@@ -456,8 +471,11 @@ window.__ModuleLoader__.load({
456
471
  "switch.off": "अक्षम करें",
457
472
  "error": "लिखना विफल रहा",
458
473
  "hint": "सक्षम होने पर: सभी टूल (bash कमांड और workdir, तथा read/write/edit/read_image/glob/grep और present के पथ तर्क) MSYS ड्राइव-रूट POSIX पथ (/c/Users/...) का उपयोग करते हैं; bash की मूल आदतें — होम के लिए ~, /tmp, /dev/null, /usr — हर टूल में ठीक वैसे काम करती हैं जैसे bash स्वयं उन्हें हल करता है, और होस्ट पथ फ़ील्ड स्वतः अनुवादित करता है। अक्षम करने पर dsh का मूल व्यवहार बहाल होता है (फ़ाइल टूल के लिए Windows पथ)। जब तक प्लगइन इंस्टॉल है bash हमेशा Git Bash रहता है; यह स्विच केवल टूल के बीच पथ शैली नियंत्रित करता है।",
474
+ "sec.inline": "इनलाइन टूल्स",
475
+ "sec.executor": "एक्ज़ीक्यूटर",
476
+ "sec.peer": "प्लगइन एकीकरण",
459
477
  "sec.dialect": "पथ बोली",
460
- "sec.terminal": "साइडबार टर्मिनल",
478
+ "sec.terminal": "टर्मिनल",
461
479
  "mnts.label": "वर्चुअल पथ माउंट",
462
480
  "mnts.hint": "bash की मूल आदतें — ~ होम, /tmp, /usr — हर टूल में Git Bash माउंट तालिका से हल होती हैं; बंद = केवल /c/ ड्राइव-रूट।",
463
481
  "errs.label": "त्रुटि-पथ अनुवाद",
@@ -530,8 +548,11 @@ window.__ModuleLoader__.load({
530
548
  "switch.off": "Nonaktifkan",
531
549
  "error": "gagal menulis",
532
550
  "hint": "Saat aktif: semua alat (perintah bash dan workdir, serta argumen path read/write/edit/read_image/glob/grep dan present) memakai path POSIX berakar drive MSYS (/c/Users/...); kebiasaan asli bash — ~ untuk direktori home, /tmp, /dev/null, /usr — bekerja di setiap alat persis seperti bash sendiri menyelesaikannya, dan host menerjemahkan bidang path secara otomatis. Saat nonaktif, perilaku asli dsh dipulihkan (path Windows untuk alat berkas). Bash selalu Git Bash selama plugin terpasang; sakelar ini hanya mengatur dialek path antaralat.",
551
+ "sec.inline": "Alat inline",
552
+ "sec.executor": "Eksekutor",
553
+ "sec.peer": "Integrasi plugin",
533
554
  "sec.dialect": "Dialek path",
534
- "sec.terminal": "Terminal sidebar",
555
+ "sec.terminal": "Terminal",
535
556
  "mnts.label": "Mount path virtual",
536
557
  "mnts.hint": "Kebiasaan asli bash — ~ home, /tmp, /usr — diselesaikan lewat tabel mount Git Bash di setiap alat; nonaktif = hanya akar drive /c/.",
537
558
  "errs.label": "Terjemahan path error",
@@ -604,8 +625,11 @@ window.__ModuleLoader__.load({
604
625
  "switch.off": "Disattiva",
605
626
  "error": "scrittura non riuscita",
606
627
  "hint": "Attivato: tutti gli strumenti (comandi bash e workdir, argomenti di percorso di read/write/edit/read_image/glob/grep e di present) usano percorsi POSIX con radice di unità MSYS (/c/Users/...); le abitudini native di bash — ~ per la home, /tmp, /dev/null, /usr — funzionano in ogni strumento esattamente come le risolve bash stesso, e l'host traduce automaticamente i campi di percorso. Disattivato ripristina il comportamento nativo di dsh (percorsi Windows per gli strumenti per i file). Bash resta sempre Git Bash finché il plugin è installato; questo interruttore governa solo il dialetto dei percorsi tra gli strumenti.",
628
+ "sec.inline": "Strumenti inline",
629
+ "sec.executor": "Esecutore",
630
+ "sec.peer": "Integrazioni plugin",
607
631
  "sec.dialect": "Dialetto dei percorsi",
608
- "sec.terminal": "Terminale laterale",
632
+ "sec.terminal": "Terminale",
609
633
  "mnts.label": "Mount di percorsi virtuali",
610
634
  "mnts.hint": "Le abitudini native di bash — ~ home, /tmp, /usr — si risolvono tramite la tabella di mount di Git Bash in ogni strumento; off = solo radici /c/.",
611
635
  "errs.label": "Traduzione dei percorsi d'errore",
@@ -678,8 +702,11 @@ window.__ModuleLoader__.load({
678
702
  "switch.off": "無効にする",
679
703
  "error": "書き込みに失敗しました",
680
704
  "hint": "有効にすると、すべてのツール(bash コマンドと workdir、read/write/edit/read_image/glob/grep と present のパス引数)が MSYS ドライブルートの POSIX パス(/c/Users/...)を使います。bash のネイティブな習慣——ホームの ~、/tmp、/dev/null、/usr——も、bash 自身が解決するのとまったく同じようにすべてのツールで動作し、パスフィールドはホストが自動的に変換します。無効にすると dsh 本来の動作(ファイルツールは Windows パス)に戻ります。bash はプラグインがインストールされている限り常に Git Bash で、このスイッチの影響を受けません。",
705
+ "sec.inline": "インラインツール",
706
+ "sec.executor": "実行エンジン",
707
+ "sec.peer": "プラグイン連携",
681
708
  "sec.dialect": "パス方言",
682
- "sec.terminal": "サイドバーターミナル",
709
+ "sec.terminal": "端末",
683
710
  "mnts.label": "仮想パスマウント",
684
711
  "mnts.hint": "bash 固有の習慣——~ ホーム、/tmp、/usr——は Git Bash のマウントテーブルで全ツールに解決;オフなら /c/ ドライブルートのみ。",
685
712
  "errs.label": "エラーパス翻訳",
@@ -752,8 +779,11 @@ window.__ModuleLoader__.load({
752
779
  "switch.off": "사용 안 함",
753
780
  "error": "쓰기 실패",
754
781
  "hint": "켜면 모든 도구(bash 명령과 workdir, read/write/edit/read_image/glob/grep 및 present의 경로 인수)가 MSYS 드라이브 루트 POSIX 경로(/c/Users/...)를 사용합니다. bash 고유 습관——홈의 ~, /tmp, /dev/null, /usr——도 bash 자신이 해석하는 그대로 모든 도구에서 작동하며 호스트가 경로 필드를 자동 변환합니다. 끄면 dsh 기본 동작(파일 도구에 Windows 경로 사용)으로 돌아갑니다. 플러그인이 설치되어 있는 동안 bash는 항상 Git Bash이며 이 스위치의 영향을 받지 않습니다.",
782
+ "sec.inline": "인라인 도구",
783
+ "sec.executor": "실행기",
784
+ "sec.peer": "플러그인 연동",
755
785
  "sec.dialect": "경로 방언",
756
- "sec.terminal": "사이드바 터미널",
786
+ "sec.terminal": "터미널",
757
787
  "mnts.label": "가상 경로 마운트",
758
788
  "mnts.hint": "bash 고유 습관——~ 홈, /tmp, /usr——은 Git Bash 마운트 테이블로 모든 도구에서 해석; 끄면 /c/ 드라이브 루트만.",
759
789
  "errs.label": "오류 경로 번역",
@@ -826,8 +856,11 @@ window.__ModuleLoader__.load({
826
856
  "switch.off": "Uitschakelen",
827
857
  "error": "schrijven mislukt",
828
858
  "hint": "Ingeschakeld: alle tools (bash-opdrachten en workdir, padargumenten van read/write/edit/read_image/glob/grep en present) gebruiken POSIX-paden vanaf de MSYS-schijfwortel (/c/Users/...); bash-eigen gewoonten — ~ voor de home-map, /tmp, /dev/null, /usr — werken in elke tool precies zoals bash ze zelf oplost, en de host vertaalt de padvelden automatisch. Uitgeschakeld herstelt het oorspronkelijke dsh-gedrag (Windows-paden voor bestandstools). Bash is altijd Git Bash zolang de plugin is geïnstalleerd; deze schakelaar bepaalt alleen het paddialect tussen de tools.",
859
+ "sec.inline": "Inline tools",
860
+ "sec.executor": "Executor",
861
+ "sec.peer": "Plug-in-integraties",
829
862
  "sec.dialect": "Paddialect",
830
- "sec.terminal": "Zijbalkterminal",
863
+ "sec.terminal": "Terminal",
831
864
  "mnts.label": "Virtuele pad-mounts",
832
865
  "mnts.hint": "Bash-eigen gewoonten — ~ home, /tmp, /usr — lossen op via de Git Bash-mount tabel in elke tool; uit = alleen /c/-schijfwortels.",
833
866
  "errs.label": "Foutpad-vertaling",
@@ -900,8 +933,11 @@ window.__ModuleLoader__.load({
900
933
  "switch.off": "Wyłącz",
901
934
  "error": "zapis nie powiódł się",
902
935
  "hint": "Po włączeniu: wszystkie narzędzia (polecenia bash i workdir, argumenty ścieżek w read/write/edit/read_image/glob/grep i w present) używają ścieżek POSIX od korzenia dysku MSYS (/c/Users/...); natywne nawyki basha — ~ dla katalogu domowego, /tmp, /dev/null, /usr — działają w każdym narzędziu dokładnie tak, jak rozwiązuje je sam bash, a host automatycznie tłumaczy pola ścieżek. Wyłączenie przywraca natywne zachowanie dsh (ścieżki Windows dla narzędzi plikowych). Bash jest zawsze Git Bash, dopóki wtyczka jest zainstalowana; ten przełącznik reguluje wyłącznie dialekt ścieżek między narzędziami.",
936
+ "sec.inline": "Narzędzia wbudowane",
937
+ "sec.executor": "Egzekutor",
938
+ "sec.peer": "Integracje wtyczek",
903
939
  "sec.dialect": "Dialekt ścieżek",
904
- "sec.terminal": "Terminal boczny",
940
+ "sec.terminal": "Terminal",
905
941
  "mnts.label": "Wirtualne montowanie ścieżek",
906
942
  "mnts.hint": "Natywne nawyki basha — ~ home, /tmp, /usr — rozwiązują się przez tablicę montowań Git Bash w każdym narzędziu; wył. = tylko korzenie /c/.",
907
943
  "errs.label": "Tłumaczenie ścieżek błędów",
@@ -974,8 +1010,11 @@ window.__ModuleLoader__.load({
974
1010
  "switch.off": "Desativar",
975
1011
  "error": "falha ao gravar",
976
1012
  "hint": "Ativada: todas as ferramentas (comandos bash e workdir, argumentos de caminho de read/write/edit/read_image/glob/grep e de present) usam caminhos POSIX a partir da raiz da unidade MSYS (/c/Users/...); os hábitos nativos do bash — ~ para a pasta pessoal, /tmp, /dev/null, /usr — funcionam em cada ferramenta exatamente como o próprio bash os resolve, e o host traduz os campos de caminho automaticamente. Desativada restaura o comportamento nativo do dsh (caminhos Windows para as ferramentas de arquivo). O bash é sempre Git Bash enquanto o plugin estiver instalado; este interruptor rege apenas o dialeto de caminhos entre ferramentas.",
1013
+ "sec.inline": "Ferramentas inline",
1014
+ "sec.executor": "Executor",
1015
+ "sec.peer": "Integrações de plugins",
977
1016
  "sec.dialect": "Dialeto de caminhos",
978
- "sec.terminal": "Terminal lateral",
1017
+ "sec.terminal": "Terminal",
979
1018
  "mnts.label": "Montagens de caminhos virtuais",
980
1019
  "mnts.hint": "Hábitos nativos do bash — ~ home, /tmp, /usr — resolvem pela tabela de montagens do Git Bash em cada ferramenta; desligado = só raízes /c/.",
981
1020
  "errs.label": "Tradução de caminhos de erro",
@@ -1048,8 +1087,11 @@ window.__ModuleLoader__.load({
1048
1087
  "switch.off": "Выключить",
1049
1088
  "error": "не удалось записать",
1050
1089
  "hint": "Включено: все инструменты (команды bash и workdir, аргументы путей read/write/edit/read_image/glob/grep и present) используют POSIX-пути от корня диска MSYS (/c/Users/...); собственные привычки bash — ~ для домашнего каталога, /tmp, /dev/null, /usr — работают в каждом инструменте ровно так, как их разрешает сам bash, а хост автоматически преобразует поля путей. Выключение возвращает исходное поведение dsh (пути Windows для файловых инструментов). Пока плагин установлен, bash всегда остаётся Git Bash; этот переключатель управляет только диалектом путей между инструментами.",
1090
+ "sec.inline": "Встроенные инструменты",
1091
+ "sec.executor": "Исполнитель",
1092
+ "sec.peer": "Интеграции плагинов",
1051
1093
  "sec.dialect": "Диалект путей",
1052
- "sec.terminal": "Терминал боковой панели",
1094
+ "sec.terminal": "Терминал",
1053
1095
  "mnts.label": "Виртуальные монтирования путей",
1054
1096
  "mnts.hint": "Собственные привычки bash — ~ домашний, /tmp, /usr — разрешаются через таблицу монтирований Git Bash в каждом инструменте; выкл = только корни /c/.",
1055
1097
  "errs.label": "Перевод путей в ошибках",
@@ -1122,8 +1164,11 @@ window.__ModuleLoader__.load({
1122
1164
  "switch.off": "Inaktivera",
1123
1165
  "error": "skrivning misslyckades",
1124
1166
  "hint": "Aktiverad: alla verktyg (bash-kommandon och workdir, sökvägsargument för read/write/edit/read_image/glob/grep och present) använder POSIX-sökvägar från MSYS-enhetsroten (/c/Users/...); bash egna vanor — ~ för hemkatalogen, /tmp, /dev/null, /usr — fungerar i varje verktyg exakt som bash själv löser dem, och värden översätter sökvägsfälten automatiskt. Inaktiverad återställer dsh:s ursprungliga beteende (Windows-sökvägar för filverktygen). Bash är alltid Git Bash så länge insticksprogrammet är installerat; den här växeln styr bara sökvägsdialekten mellan verktygen.",
1167
+ "sec.inline": "Inline-verktyg",
1168
+ "sec.executor": "Exekutor",
1169
+ "sec.peer": "Plugin-integrationer",
1125
1170
  "sec.dialect": "Sökvägsdialekt",
1126
- "sec.terminal": "Sidopanelsterminal",
1171
+ "sec.terminal": "Terminal",
1127
1172
  "mnts.label": "Virtuella sökvägsmonteringar",
1128
1173
  "mnts.hint": "Bash egna vanor — ~ hem, /tmp, /usr — löses via Git Bash monteringstabell i varje verktyg; av = endast /c/-enhetsrötter.",
1129
1174
  "errs.label": "Felsökvägsöversättning",
@@ -1196,8 +1241,11 @@ window.__ModuleLoader__.load({
1196
1241
  "switch.off": "ปิดใช้งาน",
1197
1242
  "error": "เขียนไม่สำเร็จ",
1198
1243
  "hint": "เมื่อเปิดใช้งาน: เครื่องมือทั้งหมด (คำสั่ง bash และ workdir รวมถึงอาร์กิวเมนต์พาธของ read/write/edit/read_image/glob/grep และ present) ใช้พาธ POSIX จากรากไดรฟ์ของ MSYS (/c/Users/...); พฤติกรรมดั้งเดิมของ bash — ~ สำหรับโฮม, /tmp, /dev/null, /usr — ทำงานในทุกเครื่องมือเหมือนที่ bash แก้เองพอดี และโฮสต์แปลฟิลด์พาธให้อัตโนมัติ เมื่อปิดใช้งานจะกลับสู่พฤติกรรมดั้งเดิมของ dsh (เครื่องมือจัดการไฟล์ใช้พาธ Windows) bash เป็น Git Bash เสมอเมื่อติดตั้งปลั๊กอินนี้ สวิตช์นี้ควบคุมเฉพาะรูปแบบพาธระหว่างเครื่องมือเท่านั้น",
1244
+ "sec.inline": "เครื่องมือแบบ inline",
1245
+ "sec.executor": "ตัวรัน",
1246
+ "sec.peer": "การเชื่อมต่อปลั๊กอิน",
1199
1247
  "sec.dialect": "ภาษาถิ่นเส้นทาง",
1200
- "sec.terminal": "เทอร์มินัลแถบข้าง",
1248
+ "sec.terminal": "เทอร์มินัล",
1201
1249
  "mnts.label": "จุดเมานต์เส้นทางเสมือน",
1202
1250
  "mnts.hint": "พฤติกรรมดั้งเดิมของ bash — ~ โฮม, /tmp, /usr — แก้ผ่านตารางเมานต์ของ Git Bash ในทุกเครื่องมือ; ปิด = เฉพาะรากไดรฟ์ /c/",
1203
1251
  "errs.label": "การแปลเส้นทางในข้อผิดพลาด",
@@ -1270,8 +1318,11 @@ window.__ModuleLoader__.load({
1270
1318
  "switch.off": "Devre dışı bırak",
1271
1319
  "error": "yazma başarısız",
1272
1320
  "hint": "Etkinleştirildiğinde: tüm araçlar (bash komutları ve workdir ile read/write/edit/read_image/glob/grep ve present yol bağımsız değişkenleri) MSYS sürücü kökünden POSIX yolları (/c/Users/...) kullanır; bash'e özgü alışkanlıklar — ev için ~, /tmp, /dev/null, /usr — her araçta tam bash'in kendisinin çözdüğü gibi çalışır ve ana süreç yol alanlarını otomatik olarak çevirir. Devre dışı bırakıldığında dsh yerel davranışına döner (dosya araçları için Windows yolları). Eklenti kurulu olduğu sürece bash her zaman Git Bash olarak kalır; bu anahtar yalnızca araçlar arası yol lehçesini yönetir.",
1321
+ "sec.inline": "Satır içi araçlar",
1322
+ "sec.executor": "Yürütücü",
1323
+ "sec.peer": "Eklenti entegrasyonları",
1273
1324
  "sec.dialect": "Yol lehçesi",
1274
- "sec.terminal": "Kenar çubuğu terminali",
1325
+ "sec.terminal": "Terminal",
1275
1326
  "mnts.label": "Sanal yol bağlamaları",
1276
1327
  "mnts.hint": "Bash'e özgü alışkanlıklar — ~ ev, /tmp, /usr — her araçta Git Bash bağlama tablosuyla çözülür; kapalı = yalnızca /c/ sürücü kökleri.",
1277
1328
  "errs.label": "Hata yolu çevirisi",
@@ -1344,8 +1395,11 @@ window.__ModuleLoader__.load({
1344
1395
  "switch.off": "Tắt",
1345
1396
  "error": "ghi thất bại",
1346
1397
  "hint": "Khi bật: mọi công cụ (lệnh bash và workdir, tham số đường dẫn của read/write/edit/read_image/glob/grep và present) dùng đường dẫn POSIX từ gốc ổ đĩa MSYS (/c/Users/...); thói quen gốc của bash — ~ cho thư mục home, /tmp, /dev/null, /usr — hoạt động trong mọi công cụ đúng như chính bash giải quyết chúng, và máy chủ tự động chuyển đổi trường đường dẫn. Khi tắt, hành vi gốc của dsh được khôi phục (công cụ tệp dùng đường dẫn Windows). bash luôn là Git Bash khi plugin được cài đặt; công tắc này chỉ điều khiển phương ngữ đường dẫn giữa các công cụ.",
1398
+ "sec.inline": "Công cụ nội tuyến",
1399
+ "sec.executor": "Trình thực thi",
1400
+ "sec.peer": "Tích hợp plugin",
1347
1401
  "sec.dialect": "Phương ngữ đường dẫn",
1348
- "sec.terminal": "Terminal thanh bên",
1402
+ "sec.terminal": "Terminal",
1349
1403
  "mnts.label": "Gán đường dẫn ảo",
1350
1404
  "mnts.hint": "Thói quen gốc của bash — ~ home, /tmp, /usr — được giải qua bảng gán của Git Bash trong mọi công cụ; tắt = chỉ gốc ổ /c/.",
1351
1405
  "errs.label": "Dịch đường dẫn lỗi",
@@ -1418,8 +1472,11 @@ window.__ModuleLoader__.load({
1418
1472
  "switch.off": "停用",
1419
1473
  "error": "寫入失敗",
1420
1474
  "hint": "啟用後:所有工具(bash 指令同 workdir、read/write/edit/read_image/glob/grep 同 present 嘅路徑參數)統一使用 MSYS 磁碟根 POSIX 路徑(/c/Users/...);bash 原生習慣——~ 家目錄、/tmp、/dev/null、/usr——喺所有工具一樣有效(同 Git Bash 掛載表一致),路徑參數由宿主自動翻譯,模型無感。停用後回復 dsh 原生行為(檔案工具用 Windows 路徑)。bash 永遠係 Git Bash,唔受呢個開關影響。",
1475
+ "sec.inline": "行內工具",
1476
+ "sec.executor": "執行器",
1477
+ "sec.peer": "外掛聯動",
1421
1478
  "sec.dialect": "路徑方言",
1422
- "sec.terminal": "側欄終端",
1479
+ "sec.terminal": "終端機",
1423
1480
  "mnts.label": "虛擬路徑掛載",
1424
1481
  "mnts.hint": "bash 原生習慣——~ 家目錄、/tmp、/usr——按 Git Bash 掛載表喺所有工具解析;關閉就只剩 /c/ 磁碟根。",
1425
1482
  "errs.label": "報錯路徑翻譯",
@@ -1492,8 +1549,11 @@ window.__ModuleLoader__.load({
1492
1549
  "switch.off": "停用",
1493
1550
  "error": "寫入失敗",
1494
1551
  "hint": "啟用後:所有工具(bash 指令同 workdir、read/write/edit/read_image/glob/grep 同 present 嘅路徑參數)統一使用 MSYS 磁碟根 POSIX 路徑(/c/Users/...);bash 原生習慣——~ 家目錄、/tmp、/dev/null、/usr——喺所有工具一樣有效(同 Git Bash 掛載表一致),路徑參數由宿主自動翻譯,模型無感。停用後回復 dsh 原生行為(檔案工具用 Windows 路徑)。bash 永遠係 Git Bash,唔受呢個開關影響。",
1552
+ "sec.inline": "行內工具",
1553
+ "sec.executor": "執行器",
1554
+ "sec.peer": "外掛聯動",
1495
1555
  "sec.dialect": "路徑方言",
1496
- "sec.terminal": "側欄終端",
1556
+ "sec.terminal": "終端機",
1497
1557
  "mnts.label": "虛擬路徑掛載",
1498
1558
  "mnts.hint": "bash 原生習慣——~ 家目錄、/tmp、/usr——按 Git Bash 掛載表喺所有工具解析;關閉就只剩 /c/ 磁碟根。",
1499
1559
  "errs.label": "報錯路徑翻譯",
@@ -1566,8 +1626,11 @@ window.__ModuleLoader__.load({
1566
1626
  "switch.off": "停用",
1567
1627
  "error": "寫入失敗",
1568
1628
  "hint": "啟用後:所有工具(bash 指令與 workdir,以及 read/write/edit/read_image/glob/grep 與 present 的路徑參數)統一使用 MSYS 磁碟根 POSIX 路徑(/c/Users/...);bash 原生習慣——~ 家目錄、/tmp、/dev/null、/usr——在所有工具同樣有效(與 Git Bash 掛載表一致),路徑參數由宿主自動轉譯,模型無感。停用後恢復 dsh 原生行為(檔案工具使用 Windows 路徑)。bash 一律是 Git Bash,不受此開關影響。",
1629
+ "sec.inline": "行內工具",
1630
+ "sec.executor": "執行器",
1631
+ "sec.peer": "外掛聯動",
1569
1632
  "sec.dialect": "路徑方言",
1570
- "sec.terminal": "側欄終端機",
1633
+ "sec.terminal": "終端機",
1571
1634
  "mnts.label": "虛擬路徑掛載",
1572
1635
  "mnts.hint": "bash 原生習慣——~ 家目錄、/tmp、/usr——按 Git Bash 掛載表在所有工具解析;關閉則僅 /c/ 磁碟根。",
1573
1636
  "errs.label": "報錯路徑翻譯",
@@ -2068,15 +2131,17 @@ window.__ModuleLoader__.load({
2068
2131
  E("button", { type: "button", className: "gb-segBtn" + (!subagents ? " gb-segActive" : ""), onClick: function () { if (subagents) writeField("subagentDialect", false); } }, t("switch.off")),
2069
2132
  ),
2070
2133
  E("p", { className: "gb-hint" }, t("sub.hint")),
2071
- E("div", { className: "gb-row" },
2072
- E("span", { className: "gb-rowLabel" }, t("term.label") + ":"),
2073
- E("span", { className: "gb-rowValue" }, winshell ? t("state.on") : t("state.off")),
2074
- ),
2075
- E("div", { className: "gb-seg" },
2076
- E("button", { type: "button", className: "gb-segBtn" + (winshell ? " gb-segActive" : ""), onClick: function () { if (!winshell) writeField("autoTerminalShell", true); } }, t("switch.on")),
2077
- E("button", { type: "button", className: "gb-segBtn" + (!winshell ? " gb-segActive" : ""), onClick: function () { if (winshell) writeField("autoTerminalShell", false); } }, t("switch.off")),
2078
2134
  ),
2079
- E("p", { className: "gb-hint" }, t("term.hint")),
2135
+ );
2136
+
2137
+ /* ── executor section (v0.36.0 regroup) ───────────────────────────
2138
+ The binary layer: WHICH bash runs and the git line-ending policy
2139
+ the executor injects. Split out of the dialect section — users
2140
+ hunting "why is my diff all red" or pasting a bash path should
2141
+ not scroll through six translation switches to find it. */
2142
+ var executorSection = E("div", { className: "gb-section" },
2143
+ E("div", { className: "gb-sectionTitle" }, t("sec.executor")),
2144
+ E("div", { className: "gb-stack" },
2080
2145
  E("div", { className: "gb-row" },
2081
2146
  E("span", { className: "gb-rowLabel" }, t("eol.label") + ":"),
2082
2147
  E("span", { className: "gb-rowValue" }, eolOn ? t("state.on") : t("state.off")),
@@ -2086,20 +2151,20 @@ window.__ModuleLoader__.load({
2086
2151
  E("button", { type: "button", className: "gb-segBtn" + (!eolOn ? " gb-segActive" : ""), onClick: function () { if (eolOn) writeField("gitAutocrlf", false); } }, t("switch.off")),
2087
2152
  ),
2088
2153
  E("p", { className: "gb-hint" }, t("eol.hint")),
2089
- E("div", { className: "gb-row" },
2090
- E("span", { className: "gb-rowLabel" }, t("bash.label") + ":"),
2091
- ),
2092
- E("div", { className: "gb-seg" },
2093
- E("input", { className: "gb-input", type: "text", spellCheck: false, placeholder: "C:/Program Files/Git/bin/bash.exe", value: bashDraft, onChange: function (e) { setBashDraft(e.target.value); setBashSaved(false); } }),
2094
- E("button", {
2095
- type: "button",
2096
- className: "gb-saveBtn" + (bashSaved ? " gb-saved" : ""),
2097
- onClick: function () {
2098
- setBashSaved(false);
2099
- writeField("bashPath", bashDraft.trim()).then(function (accepted) { setBashSaved(accepted === true); });
2100
- },
2101
- }, bashSaved ? t("bash.saved") : t("bash.save")),
2102
- ),
2154
+ E("div", { className: "gb-row" },
2155
+ E("span", { className: "gb-rowLabel" }, t("bash.label") + ":"),
2156
+ ),
2157
+ E("div", { className: "gb-seg" },
2158
+ E("input", { className: "gb-input", type: "text", spellCheck: false, placeholder: "C:/Program Files/Git/bin/bash.exe", value: bashDraft, onChange: function (e) { setBashDraft(e.target.value); setBashSaved(false); } }),
2159
+ E("button", {
2160
+ type: "button",
2161
+ className: "gb-saveBtn" + (bashSaved ? " gb-saved" : ""),
2162
+ onClick: function () {
2163
+ setBashSaved(false);
2164
+ writeField("bashPath", bashDraft.trim()).then(function (accepted) { setBashSaved(accepted === true); });
2165
+ },
2166
+ }, bashSaved ? t("bash.saved") : t("bash.save")),
2167
+ ),
2103
2168
  E("p", { className: "gb-hint" }, t("bash.hint")),
2104
2169
  ),
2105
2170
  );
@@ -2107,6 +2172,15 @@ window.__ModuleLoader__.load({
2107
2172
  var terminalSection = E("div", { className: "gb-section" },
2108
2173
  E("div", { className: "gb-sectionTitle" }, t("sec.terminal")),
2109
2174
  E("div", { className: "gb-stack" },
2175
+ E("div", { className: "gb-row" },
2176
+ E("span", { className: "gb-rowLabel" }, t("term.label") + ":"),
2177
+ E("span", { className: "gb-rowValue" }, winshell ? t("state.on") : t("state.off")),
2178
+ ),
2179
+ E("div", { className: "gb-seg" },
2180
+ E("button", { type: "button", className: "gb-segBtn" + (winshell ? " gb-segActive" : ""), onClick: function () { if (!winshell) writeField("autoTerminalShell", true); } }, t("switch.on")),
2181
+ E("button", { type: "button", className: "gb-segBtn" + (!winshell ? " gb-segActive" : ""), onClick: function () { if (winshell) writeField("autoTerminalShell", false); } }, t("switch.off")),
2182
+ ),
2183
+ E("p", { className: "gb-hint" }, t("term.hint")),
2110
2184
  E("div", { className: "gb-row" },
2111
2185
  E("span", { className: "gb-rowLabel" }, t("adopt.label") + ":"),
2112
2186
  E("span", { className: "gb-rowValue" }, adopt ? t("state.on") : t("state.off")),
@@ -2143,6 +2217,7 @@ window.__ModuleLoader__.load({
2143
2217
  );
2144
2218
 
2145
2219
  var inlineSection = E("div", { className: "gb-section" },
2220
+ E("div", { className: "gb-sectionTitle" }, t("sec.inline")),
2146
2221
  E("div", { className: "gb-stack" },
2147
2222
  E("div", { className: "gb-row" },
2148
2223
  E("span", { className: "gb-rowLabel" }, t("pwsh.label") + ":"),
@@ -2170,20 +2245,13 @@ window.__ModuleLoader__.load({
2170
2245
  if (peer && typeof peer.getSnapshot === "function") peerSnap = peer.getSnapshot();
2171
2246
  } catch (error_) { /* keep unavailable */ }
2172
2247
 
2173
- var dedupeSection = peerSnap.status === "ready" ? E("div", { className: "gb-section" },
2174
- E("div", { className: "gb-sectionTitle" }, t("sec.dedupe")),
2175
- E("div", { className: "gb-stack" },
2176
- E("div", { className: "gb-row" },
2177
- E("span", { className: "gb-rowLabel" }, t("dedupe.label") + ":"),
2178
- E("span", { className: "gb-rowValue" }, dedupe ? t("state.on") : t("state.off")),
2179
- ),
2180
- E("div", { className: "gb-seg" },
2181
- E("button", { type: "button", className: "gb-segBtn" + (dedupe ? " gb-segActive" : ""), onClick: function () { if (!dedupe) writeField("suppressPeerCordis", true); } }, t("switch.on")),
2182
- E("button", { type: "button", className: "gb-segBtn" + (!dedupe ? " gb-segActive" : ""), onClick: function () { if (dedupe) writeField("suppressPeerCordis", false); } }, t("switch.off")),
2183
- ),
2184
- E("p", { className: "gb-hint" }, t("dedupe.hint")),
2185
- ),
2186
- ) : null;
2248
+ /* ── plugin integrations (v0.36.0 regroup) ────────────────────────
2249
+ Both peer rows now share ONE section: they are the same
2250
+ relationship (dsh-ptc-cordis-preset) seen from two seats. The
2251
+ section itself is assembled after the python computations
2252
+ below; the dedupe VALUE lives on OUR row (the peer card binds
2253
+ the same field through configForms) while the python VALUE
2254
+ lives on the PEER's row. */
2187
2255
 
2188
2256
  /* Python row (v0.26.0): the SECOND seat of the PEER's switch. Unlike
2189
2257
  the dedupe row above, the value does NOT live on our row — the
@@ -2223,21 +2291,32 @@ window.__ModuleLoader__.load({
2223
2291
  }
2224
2292
  }
2225
2293
 
2226
- var pythonSection = pythonOffered ? E("div", { className: "gb-section" },
2227
- E("div", { className: "gb-sectionTitle" }, t("sec.python")),
2294
+ /* The merged integrations section: dedupe row + python row under one
2295
+ heading (v0.36.0). Exists only while the peer serves its row. */
2296
+ var peerSection = peerSnap.status === "ready" ? E("div", { className: "gb-section" },
2297
+ E("div", { className: "gb-sectionTitle" }, t("sec.peer")),
2228
2298
  E("div", { className: "gb-stack" },
2229
2299
  E("div", { className: "gb-row" },
2300
+ E("span", { className: "gb-rowLabel" }, t("dedupe.label") + ":"),
2301
+ E("span", { className: "gb-rowValue" }, dedupe ? t("state.on") : t("state.off")),
2302
+ ),
2303
+ E("div", { className: "gb-seg" },
2304
+ E("button", { type: "button", className: "gb-segBtn" + (dedupe ? " gb-segActive" : ""), onClick: function () { if (!dedupe) writeField("suppressPeerCordis", true); } }, t("switch.on")),
2305
+ E("button", { type: "button", className: "gb-segBtn" + (!dedupe ? " gb-segActive" : ""), onClick: function () { if (dedupe) writeField("suppressPeerCordis", false); } }, t("switch.off")),
2306
+ ),
2307
+ E("p", { className: "gb-hint" }, t("dedupe.hint")),
2308
+ pythonOffered ? E("div", { className: "gb-row" },
2230
2309
  E("span", { className: "gb-rowLabel" }, t("python.label") + ":"),
2231
2310
  E("span", { className: "gb-rowValue" }, pythonOn
2232
2311
  ? (pythonDegraded ? t("python.on") + " · " + t("python.degraded") : t("python.on"))
2233
2312
  : t("python.off")),
2234
- ),
2235
- winHost ? null : E("div", { className: "gb-seg" },
2313
+ ) : null,
2314
+ pythonOffered && !winHost ? E("div", { className: "gb-seg" },
2236
2315
  E("button", { type: "button", className: "gb-segBtn" + (pythonOn ? " gb-segActive" : ""), onClick: function () { if (!pythonOn) writePython(true); } }, t("switch.on")),
2237
2316
  E("button", { type: "button", className: "gb-segBtn" + (!pythonOn ? " gb-segActive" : ""), onClick: function () { if (pythonOn) writePython(false); } }, t("switch.off")),
2238
- ),
2239
- E("p", { className: "gb-hint" }, t("python.hint")),
2240
- winHost ? E("p", { className: "gb-error" }, t("python.blocked")) : null,
2317
+ ) : null,
2318
+ pythonOffered ? E("p", { className: "gb-hint" }, t("python.hint")) : null,
2319
+ pythonOffered && winHost ? E("p", { className: "gb-error" }, t("python.blocked")) : null,
2241
2320
  pythonDegraded ? E("p", { className: "gb-error" }, t("python.degraded")) : null,
2242
2321
  ),
2243
2322
  ) : null;
@@ -2436,13 +2515,13 @@ window.__ModuleLoader__.load({
2436
2515
  );
2437
2516
 
2438
2517
  var bodyContent = E("div", { className: "gb-body" },
2439
- dialectSection,
2440
2518
  modeSection,
2441
2519
  inlineSection,
2520
+ dialectSection,
2521
+ executorSection,
2442
2522
  terminalSection,
2443
2523
  toolsSection,
2444
- dedupeSection,
2445
- pythonSection,
2524
+ peerSection,
2446
2525
  error ? E("p", { className: "gb-error" }, error) : null,
2447
2526
  );
2448
2527