dsh-gitbash-shell 0.44.0 → 0.45.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 +9 -0
- package/README.md +12 -0
- package/README_EN.md +18 -0
- package/dsh.plugin.json +1 -1
- package/package.json +1 -1
- package/src/client.js +80 -0
- package/src/index.js +12 -0
- package/src/shell.js +49 -3
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
|
+
## [0.45.0] — 2026-10-28
|
|
7
|
+
|
|
8
|
+
### feat:bash 初始化脚本 `initScript`(BASH_ENV;issue #37 的 fnm/nvm 场景)
|
|
9
|
+
|
|
10
|
+
- **背景(issue #37,@cwt9562)**:反馈「执行 bash 时没执行 `~/.bash_profile`,行为近似 `bash -c`」。调查确认这是 `bash -c` 的 POSIX 语义、与官方严格一致(官方 tool-bash 描述原文即 `bash -c`,bash-local/bash-sandbox 都是 `['bash','-c',command]`),不是缺陷;`-lc` 会 `cd $HOME`、重排 PATH、把 profile 输出混进 stdout。对方确认真实诉求是 **fnm(类似 nvm)初始化** ⇒ 用 bash 自己的非交互钩子 `BASH_ENV` 解决,既达到目的又不引入登录 shell 的副作用。
|
|
11
|
+
- **新增设置**:`initScript`(字符串,默认 `''` = 从不设置,行为逐字节不变)。填写后,本插件每次执行 bash 命令都把 `BASH_ENV=<路径>` 合并进受信任的 `dshEnv` 层 —— `execute` / `run` / `start` 三个入口都合并(不是只覆盖新宿主);`~` 展开为家目录,粘贴带来的首尾引号会被去掉。两个边界写进设置卡与 README:脚本的 stdout 会混进命令输出(勿在脚本里 `echo`);bash 对不存在的 `BASH_ENV` 静默忽略,填错看起来像「没启用」。
|
|
12
|
+
- **设置卡**:执行器分区新增「bash 初始化脚本」输入行,与「Git Bash 路径」同款草稿/保存语义(草稿按 scope 绑定、只对提交它的那份草稿报告已保存);21 门词典补 `init.label` / `init.hint`。
|
|
13
|
+
- **测试(338 项:337 pass + 1 平台 skip)**:新增 `the bash init script rides BASH_ENV` —— schema 形状、三个入口都合并、未设置时 spec 不变、`~`/引号展开、与 Linux 行尾 env 合并而非覆盖、`describe()` 抛错降级、设置卡渲染与写键;hooks 计数测试 +1(草稿水合)。
|
|
14
|
+
|
|
6
15
|
## [0.44.0] — 2026-10-28
|
|
7
16
|
|
|
8
17
|
### feat:跟随 dsh 0.2.2-alpha.2 的工具执行器架构(executor 行、subagent 模型键、assemble 事件收窄、promoted 文案精简)
|
package/README.md
CHANGED
|
@@ -204,6 +204,18 @@ dsh-ptc-cordis-preset 报告它的 `PTC 创造模式` 已经是 Git Bash 版。
|
|
|
204
204
|
default: ptc-cordis # 或 standard-gitbash / minimal-gitbash
|
|
205
205
|
```
|
|
206
206
|
|
|
207
|
+
### bash 初始化脚本:`initScript`(默认空 = 不启用,v0.45.0,issue #37)
|
|
208
|
+
|
|
209
|
+
```yaml
|
|
210
|
+
- id: gitbash-shell
|
|
211
|
+
config:
|
|
212
|
+
initScript: "~/.dsh/bash-env.sh" # 默认 "";填一个脚本路径即可
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
填写后,本插件每次执行 bash 命令都会把它作为 `BASH_ENV` 传给 Git Bash —— 这是 bash 自己为**非交互 shell** 准备的钩子:`bash -c` 会先 source 它,而且没有 `-l`(登录 shell)的任何副作用(`cd $HOME`、PATH 重排、profile 输出混进 stdout 都不会发生)。典型用途是 fnm / nvm 这类需要初始化的 node 管理器:在脚本里写一行 `eval "$(fnm env)"`,`node` / `npm` 就会在每条工具命令里可见。
|
|
216
|
+
|
|
217
|
+
两点边界:①脚本自身打印的任何内容都会混进命令输出,请不要在脚本里 `echo`;②路径必须存在——bash 对不存在的 `BASH_ENV` 静默忽略,所以填错的效果看起来和"没启用"一样。`~` 会展开为家目录。
|
|
218
|
+
|
|
207
219
|
## bash 从哪里来:解析链与失败引导(v0.28.0,issue #11;懒化与 exec-path 层 v0.33.0,issue #13)
|
|
208
220
|
|
|
209
221
|
`bashPath` **默认留空 = 自动探测**;解析顺序就是契约:
|
package/README_EN.md
CHANGED
|
@@ -197,6 +197,24 @@ registry `InstallPath` → the registry `Path`. Resolution is re-read live per
|
|
|
197
197
|
consumer (never frozen at boot, v0.33.0), and only Git for Windows' own bash
|
|
198
198
|
counts — WSL / MSYS2 / Cygwin are refused with guidance, never substituted.
|
|
199
199
|
|
|
200
|
+
### Bash init script: `initScript` (empty = off, v0.45.0, issue #37)
|
|
201
|
+
|
|
202
|
+
```yaml
|
|
203
|
+
- id: gitbash-shell
|
|
204
|
+
config:
|
|
205
|
+
initScript: "~/.dsh/bash-env.sh" # default ""; point it at a script
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
When set, every bash command this plugin runs gets it as `BASH_ENV` — bash's own hook
|
|
209
|
+
for **non-interactive** shells, so `bash -c` sources it first with none of `-l`'s side
|
|
210
|
+
effects (no `cd $HOME`, no PATH reordering, no profile output in stdout). The reported
|
|
211
|
+
use case is fnm / nvm-style node managers: put `eval "$(fnm env)"` in that file and
|
|
212
|
+
`node` / `npm` become visible to every tool call.
|
|
213
|
+
|
|
214
|
+
Two boundaries: whatever the script prints lands in the command's output (do not `echo`
|
|
215
|
+
in it), and the file must exist — bash silently ignores a missing `BASH_ENV`, so a typo
|
|
216
|
+
behaves exactly like "not set". `~` expands to the home directory.
|
|
217
|
+
|
|
200
218
|
## Cooperation with dsh-ptc-cordis-preset
|
|
201
219
|
|
|
202
220
|
This plugin publishes a `gitBash` host capability (`{ active, bashPath }`,
|
package/dsh.plugin.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"id": "dsh-external/dsh-gitbash-shell",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.45.0",
|
|
4
4
|
"main": "./src/index.js",
|
|
5
5
|
"description": "Windows 全模式 Git Bash:自带 bash 工具(私有 Git Bash 执行器实例,官方 PowerShell 执行器原样保留),官方四个模式经行内工具补位直接获得 Git Bash(v0.35.0 起;v0.39.0 起不再替换宿主执行器),四个 *·Git Bash 变体 preset 可开关;官方 pwsh 工具默认隐藏、开关可见(真 PowerShell);附带 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.
|
|
3
|
+
"version": "0.45.0",
|
|
4
4
|
"description": "Windows 上给 agent 一个真正的 Git Bash 命令工具:私有 Git Bash 执行器实例(官方 PowerShell 执行器原样保留),统一 MSYS 盘根路径方言,官方 pwsh 工具默认隐藏可开关,物化四个内置预设的 Git Bash 变体,侧栏终端接管可开关。· Give agents a real Git Bash tool on Windows: a private Git Bash executor instance (the official PowerShell executor stays untouched), a unified MSYS drive-root path dialect, an opt-in official pwsh tool, and four Git Bash preset variants.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"repository": {
|
package/src/client.js
CHANGED
|
@@ -107,6 +107,8 @@ window.__ModuleLoader__.load({
|
|
|
107
107
|
"bash.saveFailed": "保存未生效:宿主拒绝了这次写入 —— 确认路径存在且是 Git for Windows 的 bash,或查看宿主日志",
|
|
108
108
|
"bash.save": "保存",
|
|
109
109
|
"bash.saved": "已保存",
|
|
110
|
+
"init.label": "bash 初始化脚本",
|
|
111
|
+
"init.hint": "留空不启用:填一个脚本路径后,本插件每次执行 bash 命令都会按 bash 自己的 BASH_ENV 机制先 source 它——适合 fnm / nvm 这类需要初始化的工具(写入 eval \"$(fnm env)\" 即可让 node/npm 在每条命令里可见)。脚本里的输出会混进命令输出,请勿在脚本里 echo。改动立即生效,无需重启。",
|
|
110
112
|
"adopt.label": "接管侧栏终端",
|
|
111
113
|
"adopt.hint": "开启时把 dsh-better-sidebar 的终端 shell 写成 Git Bash(默认开启);关闭后恢复接管前的值,已手动改过的终端设置不会被碰。模型侧的 bash 工具不受此开关影响——那由插件本体提供。",
|
|
112
114
|
"sec.dedupe": "与 PTC 创造模式去重",
|
|
@@ -193,6 +195,8 @@ window.__ModuleLoader__.load({
|
|
|
193
195
|
"bash.saveFailed": "The save did not take effect: the host refused the write — check that the path exists and points at Git for Windows’ bash, or read the host log",
|
|
194
196
|
"bash.save": "Save",
|
|
195
197
|
"bash.saved": "Saved",
|
|
198
|
+
"init.label": "Bash init script",
|
|
199
|
+
"init.hint": "Empty = off. Point this at a script and every bash command this plugin runs sources it first, through bash's own BASH_ENV hook — the right place for fnm/nvm initialisation (write eval \"$(fnm env)\" there and node/npm become visible to every command). Anything the script prints lands in the command's output, so do not echo in it. Applies immediately, no restart.",
|
|
196
200
|
"adopt.label": "Adopt sidebar terminal",
|
|
197
201
|
"adopt.hint": "On (default) writes Git Bash into dsh-better-sidebar's terminal shell; turning it off restores the pre-adoption value and never touches a manually chosen one. The model-side bash tool is unaffected — the plugin itself provides that.",
|
|
198
202
|
"sec.dedupe": "Dedupe with PTC creation mode",
|
|
@@ -289,6 +293,8 @@ window.__ModuleLoader__.load({
|
|
|
289
293
|
"bash.saveFailed": "لم يُطبَّق الحفظ: رفض المضيف هذه الكتابة — تحقق من وجود المسار وأنه bash الخاص بـ Git for Windows، أو راجع سجل المضيف",
|
|
290
294
|
"bash.save": "حفظ",
|
|
291
295
|
"bash.saved": "تم الحفظ",
|
|
296
|
+
"init.label": "سكربت تهيئة bash",
|
|
297
|
+
"init.hint": "فارغ = معطّل. عند إدخال مسار سكربت، يقوم كل أمر bash تشغّله الإضافة بتحميله أولًا عبر آلية BASH_ENV الأصلية في bash — المكان المناسب لتهيئة fnm/nvm (اكتب فيه eval \"$(fnm env)\" ليظهر node/npm في كل أمر). أي إخراج من السكربت يظهر ضمن مخرجات الأمر، لذا لا تستخدم echo فيه. يسري فورًا دون إعادة تشغيل.",
|
|
292
298
|
"adopt.label": "تبنّي طرفية الشريط الجانبي",
|
|
293
299
|
"adopt.hint": "عند التفعيل (افتراضي) تُكتب Git Bash كـ shell لطرفية dsh-better-sidebar؛ وعند التعطيل تُستعاد القيمة السابقة ولا تُلمس القيمة المختارة يدويًا أبدًا. أداة bash الخاصة بالنموذج لا تتأثر — الإضافة نفسها توفرها.",
|
|
294
300
|
"sec.dedupe": "إزالة التكرار مع وضع PTC الإبداعي",
|
|
@@ -375,6 +381,8 @@ window.__ModuleLoader__.load({
|
|
|
375
381
|
"bash.saveFailed": "Speichern ohne Wirkung: Der Host hat den Schreibvorgang abgelehnt — prüfe, ob der Pfad existiert und zu Git for Windows gehört, oder lies das Host-Protokoll",
|
|
376
382
|
"bash.save": "Speichern",
|
|
377
383
|
"bash.saved": "Gespeichert",
|
|
384
|
+
"init.label": "Bash-Init-Skript",
|
|
385
|
+
"init.hint": "Leer = aus. Mit einem Skriptpfad lädt jeder von diesem Plugin ausgeführte Bash-Befehl es zuerst über die BASH_ENV-Mechanik von bash — der richtige Ort für fnm/nvm-Initialisierung (dort eval \"$(fnm env)\" eintragen, dann ist node/npm bei jedem Befehl sichtbar). Ausgaben des Skripts landen in der Befehlsausgabe, daher kein echo darin. Gilt sofort, kein Neustart nötig.",
|
|
378
386
|
"adopt.label": "Sidebar-Terminal übernehmen",
|
|
379
387
|
"adopt.hint": "Ein (Standard) schreibt Git Bash als Shell des dsh-better-sidebar-Terminals; Aus stellt den vorherigen Wert wieder her und fasst nie eine manuell gewählte Einstellung an. Das bash-Werkzeug des Modells bleibt unberührt — das liefert das Plugin selbst.",
|
|
380
388
|
"sec.dedupe": "Deduplizierung mit dem PTC-Kreativmodus",
|
|
@@ -461,6 +469,8 @@ window.__ModuleLoader__.load({
|
|
|
461
469
|
"bash.saveFailed": "L’enregistrement n’a pas pris effet : l’hôte a refusé l’écriture — vérifiez que le chemin existe et correspond au bash de Git for Windows, ou consultez le journal de l’hôte",
|
|
462
470
|
"bash.save": "Enregistrer",
|
|
463
471
|
"bash.saved": "Enregistré",
|
|
472
|
+
"init.label": "Script d'initialisation bash",
|
|
473
|
+
"init.hint": "Vide = désactivé. Indiquez un chemin de script : chaque commande bash lancée par ce plugin le sourcera d'abord via le mécanisme BASH_ENV natif de bash — l'endroit idéal pour l'initialisation de fnm/nvm (y écrire eval \"$(fnm env)\" rend node/npm visible à chaque commande). Ce que le script imprime s'ajoute à la sortie de la commande : n'y mettez pas d'echo. Prise en compte immédiate, sans redémarrage.",
|
|
464
474
|
"adopt.label": "Adopter le terminal latéral",
|
|
465
475
|
"adopt.hint": "Activé (par défaut) : écrit Git Bash comme shell du terminal dsh-better-sidebar ; désactivé : restaure la valeur davant et ne touche jamais un choix manuel. Loutil bash du modèle nest pas concerné — le plugin le fournit lui-même.",
|
|
466
476
|
"sec.dedupe": "Dédoublonnage avec le mode création PTC",
|
|
@@ -547,6 +557,8 @@ window.__ModuleLoader__.load({
|
|
|
547
557
|
"bash.saveFailed": "सहेजना लागू नहीं हुआ: होस्ट ने यह लेखन अस्वीकार किया — जाँचें कि पाथ मौजूद है और Git for Windows का bash है, या होस्ट लॉग देखें",
|
|
548
558
|
"bash.save": "सहेजें",
|
|
549
559
|
"bash.saved": "सहेजा गया",
|
|
560
|
+
"init.label": "bash प्रारंभ स्क्रिप्ट",
|
|
561
|
+
"init.hint": "खाली = बंद। स्क्रिप्ट का पथ दें तो यह प्लगइन जो भी bash कमांड चलाएगा, वह पहले इसे bash के मूल BASH_ENV तंत्र से source करेगा — fnm/nvm इनिशियलाइज़ेशन के लिए सही जगह (वहाँ eval \"$(fnm env)\" लिखें, फिर हर कमांड में node/npm दिखेंगे)। स्क्रिप्ट का कोई भी आउटपुट कमांड के आउटपुट में जुड़ जाएगा, इसलिए उसमें echo न करें। बदलाव तुरंत लागू होता है, पुनः आरंभ की ज़रूरत नहीं।",
|
|
550
562
|
"adopt.label": "साइडबार टर्मिनल अपनाएँ",
|
|
551
563
|
"adopt.hint": "चालू (डिफ़ॉल्ट) होने पर dsh-better-sidebar के टर्मिनल में Git Bash लिखा जाता है; बंद करने पर पहले वाली मान बहाल होती है और मैन्युअल चुनी गई सेटिंग कभी नहीं छुई जाती। मॉडल का bash टूल अप्रभावित रहता है — वह प्लगइन स्वयं देता है।",
|
|
552
564
|
"sec.dedupe": "PTC क्रिएशन मोड के साथ डुप्लीकेट हटाना",
|
|
@@ -633,6 +645,8 @@ window.__ModuleLoader__.load({
|
|
|
633
645
|
"bash.saveFailed": "Penyimpanan tidak berlaku: host menolak penulisan ini — pastikan path ada dan menunjuk ke bash Git for Windows, atau baca log host",
|
|
634
646
|
"bash.save": "Simpan",
|
|
635
647
|
"bash.saved": "Tersimpan",
|
|
648
|
+
"init.label": "Skrip inisialisasi bash",
|
|
649
|
+
"init.hint": "Kosong = nonaktif. Isi path skrip dan setiap perintah bash dari plugin ini akan memuatnya lebih dulu lewat mekanisme BASH_ENV bawaan bash — tempat tepat untuk inisialisasi fnm/nvm (tulis eval \"$(fnm env)\" di sana agar node/npm terlihat di setiap perintah). Apa pun yang dicetak skrip ikut masuk ke keluaran perintah, jadi jangan memakai echo di dalamnya. Berlaku segera, tanpa restart.",
|
|
636
650
|
"adopt.label": "Adopsi terminal sidebar",
|
|
637
651
|
"adopt.hint": "Nyala (bawaan) menulis Git Bash sebagai shell terminal dsh-better-sidebar; dimatikan memulihkan nilai sebelumnya dan tidak pernah menyentuh pilihan manual. Alat bash sisi model tak terpengaruh — plugin sendiri yang menyediakannya.",
|
|
638
652
|
"sec.dedupe": "Deduplikasi dengan mode kreatif PTC",
|
|
@@ -719,6 +733,8 @@ window.__ModuleLoader__.load({
|
|
|
719
733
|
"bash.saveFailed": "Salvataggio non applicato: l’host ha rifiutato la scrittura — verifica che il percorso esista e sia la bash di Git for Windows, oppure leggi il log dell’host",
|
|
720
734
|
"bash.save": "Salva",
|
|
721
735
|
"bash.saved": "Salvato",
|
|
736
|
+
"init.label": "Script di inizializzazione bash",
|
|
737
|
+
"init.hint": "Vuoto = disattivato. Indica un percorso di script e ogni comando bash eseguito da questo plugin lo caricherà prima tramite il meccanismo BASH_ENV nativo di bash — il posto giusto per l'inizializzazione di fnm/nvm (scrivi lì eval \"$(fnm env)\" e node/npm sarà visibile a ogni comando). Qualsiasi output dello script finisce nell'output del comando: non usare echo al suo interno. Ha effetto immediato, senza riavvio.",
|
|
722
738
|
"adopt.label": "Adotta il terminale laterale",
|
|
723
739
|
"adopt.hint": "Attivo (predefinito) imposta Git Bash come shell del terminale di dsh-better-sidebar; disattivo ripristina il valore precedente e non tocca mai una scelta manuale. Lo strumento bash del modello non è interessato — lo fornisce il plugin stesso.",
|
|
724
740
|
"sec.dedupe": "Deduplicazione con la modalità creazione PTC",
|
|
@@ -805,6 +821,8 @@ window.__ModuleLoader__.load({
|
|
|
805
821
|
"bash.saveFailed": "保存が反映されません:ホストがこの書き込みを拒否しました —— パスが存在し Git for Windows の bash か確認するか、ホストログを見てください",
|
|
806
822
|
"bash.save": "保存",
|
|
807
823
|
"bash.saved": "保存済み",
|
|
824
|
+
"init.label": "bash 初期化スクリプト",
|
|
825
|
+
"init.hint": "空 = 無効。スクリプトのパスを入れると、このプラグインが実行するすべての bash コマンドが bash 標準の BASH_ENV 機構で最初にそれを読み込みます — fnm / nvm の初期化に最適な場所です(そこに eval \"$(fnm env)\" と書けば、どのコマンドでも node/npm が見えるようになります)。スクリプトの出力はコマンドの出力に混ざるので、中で echo しないでください。再起動不要で即時反映されます。",
|
|
808
826
|
"adopt.label": "サイドバーターミナルを引き継ぐ",
|
|
809
827
|
"adopt.hint": "オン(既定)では dsh-better-sidebar のターミナルシェルに Git Bash を書き込みます。オフにすると以前の値へ戻し、手動で選択した設定には決して触れません。モデル側の bash ツールには影響しません——それはプラグイン本体が提供します。",
|
|
810
828
|
"sec.dedupe": "PTC 創造モードとの重複排除",
|
|
@@ -891,6 +909,8 @@ window.__ModuleLoader__.load({
|
|
|
891
909
|
"bash.saveFailed": "저장이 반영되지 않았습니다: 호스트가 이 쓰기를 거부했습니다 — 경로가 존재하고 Git for Windows의 bash인지 확인하거나 호스트 로그를 보세요",
|
|
892
910
|
"bash.save": "저장",
|
|
893
911
|
"bash.saved": "저장됨",
|
|
912
|
+
"init.label": "bash 초기화 스크립트",
|
|
913
|
+
"init.hint": "비우면 꺼짐. 스크립트 경로를 넣으면 이 플러그인이 실행하는 모든 bash 명령이 bash 고유의 BASH_ENV 메커니즘으로 먼저 이 파일을 source 합니다 — fnm/nvm 초기화에 맞는 자리입니다(거기에 eval \"$(fnm env)\"를 적으면 모든 명령에서 node/npm이 보입니다). 스크립트가 출력하는 내용은 명령 출력에 섞이므로 echo를 넣지 마세요. 재시작 없이 즉시 적용됩니다.",
|
|
894
914
|
"adopt.label": "사이드바 터미널 인수",
|
|
895
915
|
"adopt.hint": "켜짐(기본)이면 dsh-better-sidebar 터미널 셸에 Git Bash를 기록하고, 끄면 이전 값을 복원하며 수동으로 고른 설정은 절대 건드리지 않습니다. 모델 측 bash 도구에는 영향이 없습니다 — 플러그인이 직접 제공합니다.",
|
|
896
916
|
"sec.dedupe": "PTC 창조 모드와 중복 제거",
|
|
@@ -977,6 +997,8 @@ window.__ModuleLoader__.load({
|
|
|
977
997
|
"bash.saveFailed": "Opslaan had geen effect: de host weigerde deze schrijfactie — controleer of het pad bestaat en naar Git for Windows’ bash wijst, of lees het hostlogboek",
|
|
978
998
|
"bash.save": "Opslaan",
|
|
979
999
|
"bash.saved": "Opgeslagen",
|
|
1000
|
+
"init.label": "bash-initialisatiescript",
|
|
1001
|
+
"init.hint": "Leeg = uit. Vul een scriptpad in en elke bash-opdracht die deze plug-in uitvoert, laadt het eerst via het eigen BASH_ENV-mechanisme van bash — de juiste plek voor fnm/nvm-initialisatie (zet daar eval \"$(fnm env)\" en node/npm is bij elke opdracht zichtbaar). Wat het script print komt in de uitvoer van de opdracht terecht, dus geen echo erin. Geldt direct, zonder herstart.",
|
|
980
1002
|
"adopt.label": "Zijbalkterminal overnemen",
|
|
981
1003
|
"adopt.hint": "Aan (standaard) schrijft Git Bash als shell van de dsh-better-sidebar-terminal; uit herstelt de vorige waarde en raakt nooit een handmatige keuze aan. De bash-tool van het model blijft buiten beschouwing — die levert de plugin zelf.",
|
|
982
1004
|
"sec.dedupe": "Deduplicatie met de PTC-creatiemodus",
|
|
@@ -1063,6 +1085,8 @@ window.__ModuleLoader__.load({
|
|
|
1063
1085
|
"bash.saveFailed": "Zapis nie został zastosowany: host odrzucił ten zapis — sprawdź, czy ścieżka istnieje i wskazuje bash Git for Windows, albo przeczytaj log hosta",
|
|
1064
1086
|
"bash.save": "Zapisz",
|
|
1065
1087
|
"bash.saved": "Zapisano",
|
|
1088
|
+
"init.label": "Skrypt inicjalizacyjny bash",
|
|
1089
|
+
"init.hint": "Puste = wyłączone. Wskaż ścieżkę skryptu, a każde polecenie bash uruchamiane przez tę wtyczkę najpierw go wczyta przez natywny mechanizm BASH_ENV basha — właściwe miejsce na inicjalizację fnm/nvm (wpisz tam eval \"$(fnm env)\", a node/npm będzie widoczny w każdym poleceniu). Cokolwiek skrypt wypisze, trafi do wyjścia polecenia, więc nie używaj w nim echo. Działa od razu, bez restartu.",
|
|
1066
1090
|
"adopt.label": "Przejmij terminal boczny",
|
|
1067
1091
|
"adopt.hint": "Włączony (domyślnie) zapisuje Git Bash jako shell terminala dsh-better-sidebar; wyłączony przywraca poprzednią wartość i nigdy nie narusza ręcznie wybranego ustawienia. Narzędzie bash po stronie modelu jest nietknięte — zapewnia je sama wtyczka.",
|
|
1068
1092
|
"sec.dedupe": "Deduplikacja z trybem tworzenia PTC",
|
|
@@ -1149,6 +1173,8 @@ window.__ModuleLoader__.load({
|
|
|
1149
1173
|
"bash.saveFailed": "A gravação não teve efeito: o anfitrião recusou esta escrita — confirme que o caminho existe e é o bash do Git for Windows, ou veja o registo do anfitrião",
|
|
1150
1174
|
"bash.save": "Salvar",
|
|
1151
1175
|
"bash.saved": "Salvo",
|
|
1176
|
+
"init.label": "Script de inicialização do bash",
|
|
1177
|
+
"init.hint": "Vazio = desligado. Informe um caminho de script e todo comando bash executado por este plugin o carregará primeiro pelo mecanismo BASH_ENV nativo do bash — o lugar certo para inicialização de fnm/nvm (escreva eval \"$(fnm env)\" nele e node/npm fica visível em todo comando). Qualquer saída do script vai para a saída do comando, então não use echo nele. Vale na hora, sem reiniciar.",
|
|
1152
1178
|
"adopt.label": "Adotar o terminal lateral",
|
|
1153
1179
|
"adopt.hint": "Ligado (padrão) grava o Git Bash como shell do terminal do dsh-better-sidebar; desligado restaura o valor anterior e nunca altera uma escolha manual. A ferramenta bash do modelo não é afetada — o próprio plug-in a fornece.",
|
|
1154
1180
|
"sec.dedupe": "Desduplicação com o modo de criação PTC",
|
|
@@ -1235,6 +1261,8 @@ window.__ModuleLoader__.load({
|
|
|
1235
1261
|
"bash.saveFailed": "Сохранение не применилось: хост отклонил эту запись — проверьте, что путь существует и указывает на bash из Git for Windows, или посмотрите журнал хоста",
|
|
1236
1262
|
"bash.save": "Сохранить",
|
|
1237
1263
|
"bash.saved": "Сохранено",
|
|
1264
|
+
"init.label": "Скрипт инициализации bash",
|
|
1265
|
+
"init.hint": "Пусто = выключено. Укажите путь к скрипту — и каждая команда bash, запускаемая этим плагином, сначала загрузит его через штатный механизм BASH_ENV bash — подходящее место для инициализации fnm/nvm (впишите туда eval \"$(fnm env)\", и node/npm будет виден в каждой команде). Всё, что скрипт печатает, попадает в вывод команды, поэтому не используйте в нём echo. Действует сразу, без перезапуска.",
|
|
1238
1266
|
"adopt.label": "Перехватывать терминал боковой панели",
|
|
1239
1267
|
"adopt.hint": "Включено (по умолчанию): Git Bash записывается как shell терминала dsh-better-sidebar; выключено — восстанавливается прежнее значение, вручную выбранные настройки не трогаются. Инструмент bash у модели не затронут — его предоставляет сам плагин.",
|
|
1240
1268
|
"sec.dedupe": "Удаление дубликата с творческим режимом PTC",
|
|
@@ -1321,6 +1349,8 @@ window.__ModuleLoader__.load({
|
|
|
1321
1349
|
"bash.saveFailed": "Sparandet slog inte igenom: värden avvisade skrivningen — kontrollera att sökvägen finns och är Git for Windows bash, eller läs värdens logg",
|
|
1322
1350
|
"bash.save": "Spara",
|
|
1323
1351
|
"bash.saved": "Sparat",
|
|
1352
|
+
"init.label": "bash-initieringsskript",
|
|
1353
|
+
"init.hint": "Tomt = av. Ange en sökväg till ett skript så läser varje bash-kommando som pluginets kör in det först via bash egen BASH_ENV-mekanism — rätt plats för fnm/nvm-initiering (skriv eval \"$(fnm env)\" där så blir node/npm synligt i varje kommando). Allt skriptet skriver hamnar i kommandots utdata, så använd inte echo i det. Gäller direkt, ingen omstart.",
|
|
1324
1354
|
"adopt.label": "Överta sidolistterminal",
|
|
1325
1355
|
"adopt.hint": "På (standard) skriver Git Bash som terminal-shell i dsh-better-sidebar; av återställer det tidigare värdet och rör aldrig ett manuellt val. Modellens bash-verktyg påverkas inte — det tillhandahålls av pluginet självt.",
|
|
1326
1356
|
"sec.dedupe": "Deduplicering med PTC-skaparläget",
|
|
@@ -1407,6 +1437,8 @@ window.__ModuleLoader__.load({
|
|
|
1407
1437
|
"bash.saveFailed": "การบันทึกไม่เกิดผล: โฮสต์ปฏิเสธการเขียนนี้ — ตรวจสอบว่าพาธมีอยู่และเป็น bash ของ Git for Windows หรือดูบันทึกของโฮสต์",
|
|
1408
1438
|
"bash.save": "บันทึก",
|
|
1409
1439
|
"bash.saved": "บันทึกแล้ว",
|
|
1440
|
+
"init.label": "สคริปต์เริ่มต้น bash",
|
|
1441
|
+
"init.hint": "เว้นว่าง = ปิด เมื่อใส่พาทสคริปต์ ทุกคำสั่ง bash ที่ปลั๊กอินนี้รันจะโหลดสคริปต์นั้นก่อนผ่านกลไก BASH_ENV ของ bash เอง — จุดที่เหมาะสำหรับการเริ่มต้น fnm/nvm (เขียน eval \"$(fnm env)\" ไว้ในนั้น แล้ว node/npm จะมองเห็นได้ในทุกคำสั่ง) ข้อความที่สคริปต์พิมพ์จะปนไปกับเอาต์พุตของคำสั่ง จึงอย่าใช้ echo ในสคริปต์ มีผลทันที ไม่ต้องรีสตาร์ต",
|
|
1410
1442
|
"adopt.label": "รับช่วงเทอร์มินัลแถบข้าง",
|
|
1411
1443
|
"adopt.hint": "เปิด (ค่าเริ่มต้น) จะเขียน Git Bash เป็น shell ของเทอร์มินัล dsh-better-sidebar; ปิดแล้วคืนค่าเดิมและไม่แตะการตั้งค่าที่เลือกเอง เครื่องมือ bash ของโมเดลไม่กระทบ — ปลั๊กอินจัดหาเอง",
|
|
1412
1444
|
"sec.dedupe": "ตัดรายการซ้ำกับโหมดสร้างสรรค์ PTC",
|
|
@@ -1493,6 +1525,8 @@ window.__ModuleLoader__.load({
|
|
|
1493
1525
|
"bash.saveFailed": "Kaydetme etkili olmadı: ana makine bu yazmayı reddetti — yolun var olduğunu ve Git for Windows bash’i olduğunu doğrulayın ya da host günlüğüne bakın",
|
|
1494
1526
|
"bash.save": "Kaydet",
|
|
1495
1527
|
"bash.saved": "Kaydedildi",
|
|
1528
|
+
"init.label": "bash başlatma betiği",
|
|
1529
|
+
"init.hint": "Boş = kapalı. Bir betik yolu girin; bu eklentinin çalıştırdığı her bash komutu önce onu bash'in kendi BASH_ENV mekanizmasıyla yükler — fnm/nvm başlatması için doğru yer (oraya eval \"$(fnm env)\" yazın, node/npm her komutta görünür olur). Betiğin yazdırdığı her şey komut çıktısına karışır, bu yüzden içinde echo kullanmayın. Yeniden başlatma gerekmeden hemen geçerli olur.",
|
|
1496
1530
|
"adopt.label": "Kenar çubuğu terminalini devral",
|
|
1497
1531
|
"adopt.hint": "Açık (varsayılan) Git Bashi dsh-better-sidebar terminalinin shelli olarak yazar; kapalı önceki değeri geri getirir ve elle seçilmiş bir ayara asla dokunmaz. Model tarafındaki bash aracı etkilenmez — onu eklentinin kendisi sağlar.",
|
|
1498
1532
|
"sec.dedupe": "PTC yaratma moduyla yinelenen kaydı kaldırma",
|
|
@@ -1579,6 +1613,8 @@ window.__ModuleLoader__.load({
|
|
|
1579
1613
|
"bash.saveFailed": "Lưu không có hiệu lực: máy chủ đã từ chối lần ghi này — kiểm tra đường dẫn tồn tại và là bash của Git for Windows, hoặc xem nhật ký máy chủ",
|
|
1580
1614
|
"bash.save": "Lưu",
|
|
1581
1615
|
"bash.saved": "Đã lưu",
|
|
1616
|
+
"init.label": "Tập lệnh khởi tạo bash",
|
|
1617
|
+
"init.hint": "Để trống = tắt. Nhập đường dẫn tập lệnh và mọi lệnh bash do tiện ích này chạy sẽ nạp nó trước qua cơ chế BASH_ENV của chính bash — nơi phù hợp để khởi tạo fnm/nvm (ghi eval \"$(fnm env)\" vào đó để node/npm hiển thị trong mọi lệnh). Bất cứ gì tập lệnh in ra sẽ lẫn vào đầu ra của lệnh, nên đừng dùng echo trong đó. Có hiệu lực ngay, không cần khởi động lại.",
|
|
1582
1618
|
"adopt.label": "Tiếp nhận terminal thanh bên",
|
|
1583
1619
|
"adopt.hint": "Bật (mặc định) ghi Git Bash làm shell terminal của dsh-better-sidebar; tắt khôi phục giá trị trước đó và không bao giờ đụng tới lựa chọn thủ công. Công cụ bash phía mô hình không bị ảnh hưởng — chính plugin cung cấp nó.",
|
|
1584
1620
|
"sec.dedupe": "Loại bỏ trùng lặp với chế độ sáng tạo PTC",
|
|
@@ -1665,6 +1701,8 @@ window.__ModuleLoader__.load({
|
|
|
1665
1701
|
"bash.saveFailed": "保存未生效:宿主拒絕咗今次寫入 —— 確認路徑存在而且係 Git for Windows 嘅 bash,或者睇宿主日誌",
|
|
1666
1702
|
"bash.save": "儲存",
|
|
1667
1703
|
"bash.saved": "已儲存",
|
|
1704
|
+
"init.label": "bash 初始化腳本",
|
|
1705
|
+
"init.hint": "留空不啟用:填一個腳本路徑後,本外掛每次執行 bash 命令都會按 bash 自己的 BASH_ENV 機制先 source 它——適合 fnm / nvm 這類需要初始化的工具(寫入 eval \"$(fnm env)\" 即可讓 node/npm 在每條命令裡可見)。腳本裡的輸出會混進命令輸出,請勿在腳本裡 echo。改動立即生效,無需重啟。",
|
|
1668
1706
|
"adopt.label": "接管側欄終端",
|
|
1669
1707
|
"adopt.hint": "開啟(預設)會把 dsh-better-sidebar 的終端 shell 寫成 Git Bash;關閉後還原接管前的值,手動改過的設定永不被碰。模型側的 bash 工具不受影響——由插件本身提供。",
|
|
1670
1708
|
"sec.dedupe": "與 PTC 創造模式去重",
|
|
@@ -1751,6 +1789,8 @@ window.__ModuleLoader__.load({
|
|
|
1751
1789
|
"bash.saveFailed": "保存未生效:宿主拒絕咗今次寫入 —— 確認路徑存在而且係 Git for Windows 嘅 bash,或者睇宿主日誌",
|
|
1752
1790
|
"bash.save": "儲存",
|
|
1753
1791
|
"bash.saved": "已儲存",
|
|
1792
|
+
"init.label": "bash 初始化腳本",
|
|
1793
|
+
"init.hint": "留空不啟用:填一個腳本路徑後,本外掛每次執行 bash 命令都會按 bash 自己的 BASH_ENV 機制先 source 它——適合 fnm / nvm 這類需要初始化的工具(寫入 eval \"$(fnm env)\" 即可讓 node/npm 在每條命令裡可見)。腳本裡的輸出會混進命令輸出,請勿在腳本裡 echo。改動立即生效,無需重啟。",
|
|
1754
1794
|
"adopt.label": "接管側欄終端",
|
|
1755
1795
|
"adopt.hint": "開啟(預設)會把 dsh-better-sidebar 的終端 shell 寫成 Git Bash;關閉後還原接管前的值,手動改過的設定永不被碰。模型側的 bash 工具不受影響——由插件本身提供。",
|
|
1756
1796
|
"sec.dedupe": "與 PTC 創造模式去重",
|
|
@@ -1837,6 +1877,8 @@ window.__ModuleLoader__.load({
|
|
|
1837
1877
|
"bash.saveFailed": "儲存未生效:宿主拒絕了這次寫入 —— 確認路徑存在且為 Git for Windows 的 bash,或查看宿主日誌",
|
|
1838
1878
|
"bash.save": "儲存",
|
|
1839
1879
|
"bash.saved": "已儲存",
|
|
1880
|
+
"init.label": "bash 初始化腳本",
|
|
1881
|
+
"init.hint": "留空不啟用:填一個腳本路徑後,此外掛每次執行 bash 命令都會按 bash 自己的 BASH_ENV 機制先 source 它——適合 fnm / nvm 這類需要初始化的工具(寫入 eval \"$(fnm env)\" 即可讓 node/npm 在每條命令裡可見)。腳本裡的輸出會混進命令輸出,請勿在腳本裡 echo。改動立即生效,無需重啟。",
|
|
1840
1882
|
"adopt.label": "接管側欄終端機",
|
|
1841
1883
|
"adopt.hint": "開啟(預設)會把 dsh-better-sidebar 的終端機 shell 寫成 Git Bash;關閉後還原接管前的值,手動改過的設定永不被碰。模型側的 bash 工具不受影響——由插件本身提供。",
|
|
1842
1884
|
"sec.dedupe": "與 PTC 創造模式去重",
|
|
@@ -2235,6 +2277,29 @@ window.__ModuleLoader__.load({
|
|
|
2235
2277
|
});
|
|
2236
2278
|
}, [scope, snap.status, mirroredBashPath]);
|
|
2237
2279
|
|
|
2280
|
+
/* v0.45.0 (issue #37): the bash init script draft. Same lifecycle as
|
|
2281
|
+
the bash-path draft above — hydrate from the mirror once ready,
|
|
2282
|
+
never replace this scope's local edits, and only report "saved"
|
|
2283
|
+
for the exact draft that submitted it. */
|
|
2284
|
+
var initState = useState({ scope: scope, value: "", dirty: false, owner: {} });
|
|
2285
|
+
var initDraft = initState[0].scope === scope ? initState[0].value : "";
|
|
2286
|
+
var setInitDraft = initState[1];
|
|
2287
|
+
var initSaved = initState[0].scope === scope && initState[0].saved === true;
|
|
2288
|
+
function setInitSaved(saved) {
|
|
2289
|
+
setInitDraft(function (previous) {
|
|
2290
|
+
if (previous.scope !== scope || previous.owner !== initState[0].owner || previous.saved === saved) return previous;
|
|
2291
|
+
return Object.assign({}, previous, { saved: saved === true, dirty: saved === true ? false : previous.dirty });
|
|
2292
|
+
});
|
|
2293
|
+
}
|
|
2294
|
+
var mirroredInitScript = snap.value && typeof snap.value.initScript === "string" ? snap.value.initScript : "";
|
|
2295
|
+
useEffect(function () {
|
|
2296
|
+
setInitDraft(function (previous) {
|
|
2297
|
+
if (previous.scope !== scope) return { scope: scope, value: snap.status === "ready" ? mirroredInitScript : "", dirty: false, owner: {} };
|
|
2298
|
+
if (snap.status !== "ready" || previous.dirty || previous.value === mirroredInitScript) return previous;
|
|
2299
|
+
return { scope: scope, value: mirroredInitScript, dirty: false, owner: {} };
|
|
2300
|
+
});
|
|
2301
|
+
}, [scope, snap.status, mirroredInitScript]);
|
|
2302
|
+
|
|
2238
2303
|
/* v0.38.0: the card's sections are FOLDERS. All seven stay collapsed
|
|
2239
2304
|
by default — the user scans seven labelled header rows, expands the
|
|
2240
2305
|
one theme they recognise, and finds the switch inside it (user
|
|
@@ -2459,6 +2524,21 @@ window.__ModuleLoader__.load({
|
|
|
2459
2524
|
}, bashSaved ? t("bash.saved") : t("bash.save")),
|
|
2460
2525
|
),
|
|
2461
2526
|
E("p", { className: "gb-hint" }, t("bash.hint")),
|
|
2527
|
+
E("div", { className: "gb-row" },
|
|
2528
|
+
E("span", { className: "gb-rowLabel" }, t("init.label") + ":"),
|
|
2529
|
+
),
|
|
2530
|
+
E("div", { className: "gb-seg" },
|
|
2531
|
+
E("input", { className: "gb-input", type: "text", spellCheck: false, placeholder: "~/.dsh/bash-env.sh", value: initDraft, onChange: function (e) { setInitDraft({ scope: scope, value: e.target.value, dirty: true, owner: {} }); } }),
|
|
2532
|
+
E("button", {
|
|
2533
|
+
type: "button",
|
|
2534
|
+
className: "gb-saveBtn" + (initSaved ? " gb-saved" : ""),
|
|
2535
|
+
onClick: function () {
|
|
2536
|
+
setInitSaved(false);
|
|
2537
|
+
writeField("initScript", initDraft.trim()).then(function (accepted) { setInitSaved(accepted === true); });
|
|
2538
|
+
},
|
|
2539
|
+
}, initSaved ? t("bash.saved") : t("bash.save")),
|
|
2540
|
+
),
|
|
2541
|
+
E("p", { className: "gb-hint" }, t("init.hint")),
|
|
2462
2542
|
);
|
|
2463
2543
|
|
|
2464
2544
|
var terminalSection = fold("sec.terminal",
|
package/src/index.js
CHANGED
|
@@ -481,6 +481,18 @@ export const Config = Schema === null ? undefined : Schema.object({
|
|
|
481
481
|
subagentDialect: live(Schema.boolean().default(true)),
|
|
482
482
|
gitAutocrlf: live(Schema.boolean().default(true)),
|
|
483
483
|
bashPath: live(Schema.string().default('')),
|
|
484
|
+
/**
|
|
485
|
+
* Bash init script (issue #37, v0.45.0): path of a file every `bash -c`
|
|
486
|
+
* must source before running the command. Implemented as `BASH_ENV`, the
|
|
487
|
+
* shell's OWN hook for non-interactive shells — `bash -c` sources it once,
|
|
488
|
+
* with none of `-l`'s side effects (no `cd $HOME`, no PATH reordering, no
|
|
489
|
+
* profile output in stdout). The reported case is fnm/nvm-style node
|
|
490
|
+
* managers: `eval "$(fnm env)"` in that file makes node/npm visible to every
|
|
491
|
+
* tool call. Empty (default) = BASH_ENV is never set, behavior unchanged.
|
|
492
|
+
* `~` expands to the home directory; the path must exist (a missing file is
|
|
493
|
+
* silently ignored by bash, so a typo looks like "not set").
|
|
494
|
+
*/
|
|
495
|
+
initScript: live(Schema.string().default('')),
|
|
484
496
|
adoptSidebar: live(Schema.boolean().default(true)),
|
|
485
497
|
/**
|
|
486
498
|
* Whether the OFFICIAL sidebar terminal ("new terminal") is switched to the
|
package/src/shell.js
CHANGED
|
@@ -38,6 +38,9 @@
|
|
|
38
38
|
|
|
39
39
|
import { SandboxBashExecutor } from '@deepseek-ai/dsh-bash-sandbox'
|
|
40
40
|
|
|
41
|
+
import { homedir } from 'node:os'
|
|
42
|
+
import { join } from 'node:path'
|
|
43
|
+
|
|
41
44
|
import { DEFAULT_GIT_BASH, bashResolutionReport, effectiveConfiguredBashPath, resolveGitBashCached, settingsBashPath } from './bash-path.js'
|
|
42
45
|
|
|
43
46
|
/** Re-exported for callers that historically read it here (the value now lives in bash-path.js). */
|
|
@@ -51,6 +54,22 @@ import { loadSchemastery } from './schemastery.js'
|
|
|
51
54
|
*/
|
|
52
55
|
const SETTINGS_NAMESPACE = 'gitbash-shell'
|
|
53
56
|
|
|
57
|
+
/**
|
|
58
|
+
* Expand one configured path for the init-script setting (issue #37): trim,
|
|
59
|
+
* drop surrounding quotes a pasted Windows path may carry, and resolve a
|
|
60
|
+
* leading `~` against the home directory. Anything else is returned verbatim —
|
|
61
|
+
* the file is bash's to read, not ours to rewrite.
|
|
62
|
+
* @param value - the raw configured `initScript` string.
|
|
63
|
+
* @returns the path to export as BASH_ENV, or '' when unset.
|
|
64
|
+
*/
|
|
65
|
+
export function expandHomePath(value) {
|
|
66
|
+
const raw = typeof value === 'string' ? value.trim().replace(/^["']|["']$/g, '') : ''
|
|
67
|
+
if (raw === '') return ''
|
|
68
|
+
if (raw === '~') return homedir()
|
|
69
|
+
if (raw.startsWith('~/') || raw.startsWith('~\\')) return join(homedir(), raw.slice(2))
|
|
70
|
+
return raw
|
|
71
|
+
}
|
|
72
|
+
|
|
54
73
|
/**
|
|
55
74
|
* Mark one schema field live-editable when the HOST's schemastery supports it.
|
|
56
75
|
*
|
|
@@ -312,7 +331,7 @@ export class GitBashSandboxExecutor extends SandboxBashExecutor {
|
|
|
312
331
|
async execute(spec) {
|
|
313
332
|
if (typeof super.execute !== 'function') return this.run(spec)
|
|
314
333
|
const route = this.gitBashRoute(spec)
|
|
315
|
-
const routed = this.withParityEnv(spec)
|
|
334
|
+
const routed = this.withInitScript(this.withParityEnv(spec))
|
|
316
335
|
if (route === undefined) return super.execute(routed)
|
|
317
336
|
const argv = [this.requireBashPath(), '-c', routed.command]
|
|
318
337
|
const sandbox = this.routeSandbox(route)
|
|
@@ -379,6 +398,33 @@ export class GitBashSandboxExecutor extends SandboxBashExecutor {
|
|
|
379
398
|
}
|
|
380
399
|
}
|
|
381
400
|
|
|
401
|
+
/**
|
|
402
|
+
* Merge the user's bash init script into the trusted env as `BASH_ENV`
|
|
403
|
+
* (issue #37, v0.45.0). `bash -c` sources `BASH_ENV` for every
|
|
404
|
+
* non-interactive shell — the shell's own hook, so no `-l` and none of its
|
|
405
|
+
* side effects (cd $HOME, PATH reordering, profile output in stdout). The
|
|
406
|
+
* reported case is fnm/nvm initialization: `eval "$(fnm env)"` in the file
|
|
407
|
+
* makes node/npm visible to every tool call.
|
|
408
|
+
*
|
|
409
|
+
* Empty = never set (default, behavior unchanged). `~` expands to the home
|
|
410
|
+
* directory; a missing file is silently ignored by bash, so nothing here
|
|
411
|
+
* fails a command because the setting points at a typo — the command simply
|
|
412
|
+
* runs without the hook, exactly as before this setting existed.
|
|
413
|
+
* @param spec the shell request
|
|
414
|
+
* @returns the request with BASH_ENV merged in when a script is configured
|
|
415
|
+
*/
|
|
416
|
+
withInitScript(spec) {
|
|
417
|
+
try {
|
|
418
|
+
const value = this.dialectSettings()
|
|
419
|
+
const configured = value && typeof value.initScript === 'string' ? expandHomePath(value.initScript) : ''
|
|
420
|
+
if (configured === '') return spec
|
|
421
|
+
const dshEnv = { ...(spec.dshEnv === undefined ? {} : spec.dshEnv), BASH_ENV: configured }
|
|
422
|
+
return { ...spec, dshEnv }
|
|
423
|
+
} catch {
|
|
424
|
+
return spec
|
|
425
|
+
}
|
|
426
|
+
}
|
|
427
|
+
|
|
382
428
|
/**
|
|
383
429
|
* 0.1.6-era full-access path with Git Bash argv: the parent's full-access
|
|
384
430
|
* branch delegates to LocalBashExecutor.run, which hardcodes the bare `bash`
|
|
@@ -388,7 +434,7 @@ export class GitBashSandboxExecutor extends SandboxBashExecutor {
|
|
|
388
434
|
*/
|
|
389
435
|
async run(spec) {
|
|
390
436
|
const route = this.gitBashRoute(spec)
|
|
391
|
-
spec = this.withParityEnv(spec)
|
|
437
|
+
spec = this.withInitScript(this.withParityEnv(spec))
|
|
392
438
|
if (route === undefined) return super.run(spec)
|
|
393
439
|
if (route.unconfined) this.warnConfinedUnconfined(route.mode)
|
|
394
440
|
const { result, spawnRequested } = GitBashSandboxExecutor.unwrapRunArgv(
|
|
@@ -403,7 +449,7 @@ export class GitBashSandboxExecutor extends SandboxBashExecutor {
|
|
|
403
449
|
if (GitBashSandboxExecutor.baseStartIsAsync()) return Promise.reject(error)
|
|
404
450
|
throw error
|
|
405
451
|
}
|
|
406
|
-
spec = this.withParityEnv(spec)
|
|
452
|
+
spec = this.withInitScript(this.withParityEnv(spec))
|
|
407
453
|
if (route === undefined) return super.start(spec)
|
|
408
454
|
const proc = this.startArgv(spec, [this.requireBashPath(), '-c', spec.command])
|
|
409
455
|
const label = (handle) => { handle.sandbox = this.routeSandbox(route); return handle }
|