Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
13 commits
Select commit Hold shift + click to select a range
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,14 @@
**反映には `devbase build base --no-cache` と、使っている派生イメージの建て直し、
コンテナの作り直し(`devbase down` → `devbase up`)が要ります。`devbase up` だけでは
反映されません。**
- **コンテナを作り直しても残るシェルの設定の置き場所 `~/.shellrc.d/` を用意しました(PLAN70 / #253)。**
置き場所へ `*.sh` を置くと、対話シェル(`devbase login` / tmux の窓 / VS Code の端末)の起動時に
ファイル名の順で読まれます。実体はアカウントグループのボリューム(`/persistent/group/.shellrc.d/`)に
あり、同じグループのコンテナすべてで効きます。AI CLI の起動定義の後に読むので、同じ名前の alias は
置き場所の定義が勝ちます。置き場所のパスはコンテナの環境変数 `DEVBASE_SHELLRC_DIR` で、非対話の
処理からも見えます。設定を足すツールはこの変数の指す先へ 1 ファイル置けば、`~/.bashrc` を
書き換えずに済みます。zsh と `lfm` は対象外です。
**反映には `devbase build base --no-cache` と、使っている派生イメージの建て直しが要ります。**

### Changed
- **スナップショットの世代を、アカウントグループ(対象ボリュームの組)ごとの系列で持つように
Expand Down
9 changes: 9 additions & 0 deletions containers/base/Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -235,9 +235,18 @@ RUN set -eux; \
RUN sudo install -d -m 0755 /etc/devbase
COPY --chmod=0644 ai-cli-aliases.sh /etc/devbase/ai-cli-aliases.sh

# 作り直しても残るシェルの設定の読み込み器 (PLAN70)。置き場所の実体はアカウント
# グループのボリュームにあり、entrypoint.sh が ~/.shellrc.d を張る。パスを ENV で
# 示すのは、docker exec の非対話の処理 (Claude Code の Bash など) からも置き場所を
# 見つけられるようにするため。~/.bashrc の export では非対話の処理に届かない。
ENV DEVBASE_SHELLRC_DIR=/home/${USERNAME}/.shellrc.d
COPY --chmod=0644 shellrc-dir.sh /etc/devbase/shellrc-dir.sh

RUN set -eux; \
echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.bashrc; \
echo '. /etc/devbase/ai-cli-aliases.sh' >> ~/.bashrc; \
# 起動定義の後に読み、置き場所の定義が devbase の定義より勝つようにする
echo '. /etc/devbase/shellrc-dir.sh' >> ~/.bashrc; \
git config --global credential.helper store; \
# Configure Claude Code hooks
mkdir -p ~/.claude; \
Expand Down
4 changes: 4 additions & 0 deletions containers/base/entrypoint.sh
Original file line number Diff line number Diff line change
Expand Up @@ -206,6 +206,10 @@ DEVBASE_GROUP_SETTINGS=(
".claude"
".gemini"
".local/share/kiro-cli"
# 作り直しても残るシェルの設定の置き場所 (PLAN70)。~/.bashrc が
# /etc/devbase/shellrc-dir.sh 経由で中の *.sh を読む。ai-plugins の中継の本体が
# ~/.claude にあるので、同じグループの単位にそろえる
".shellrc.d"
)

# 分類 B のうち、既存コンテナのホームから初回だけ取り込むもの。
Expand Down
33 changes: 33 additions & 0 deletions containers/base/shellrc-dir.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
# 作り直しても残るシェルの設定を読む (PLAN70)。
#
# 対話シェルの ~/.bashrc から、/etc/devbase/ai-cli-aliases.sh の**後**に読まれる。
# 置き場所 (DEVBASE_SHELLRC_DIR、空なら ~/.shellrc.d) の直下の *.sh を名前の順に読む。
# 置き場所の実体はアカウントグループのボリュームにあり、entrypoint.sh が symlink を張る。
#
# - 外部コマンドもサブシェルも起動しない (対話シェルの起動を遅くしないため)
# - グロブの展開の間だけ failglob と dotglob を切り、読む前に利用者の状態へ戻す。
# failglob が有効なまま一致が無いと no match を出し、dotglob が有効だと *.sh が
# . で始まる名前にも一致する
# - 変数名を __devbase_ で始め、最後に消す。利用者の変数 (f など) を上書きしない
__devbase_shellrc_dir="${DEVBASE_SHELLRC_DIR:-$HOME/.shellrc.d}"
if [ -d "$__devbase_shellrc_dir" ]; then
# 1 つずつ別の変数に控える。1 本の文字列にまとめて分割で戻すと、利用者の IFS に
# 空白が無いとき (IFS=$'\n\t' など) に分割されず戻せない
__devbase_shellrc_failglob=
__devbase_shellrc_dotglob=
shopt -q failglob && __devbase_shellrc_failglob=1
shopt -q dotglob && __devbase_shellrc_dotglob=1
shopt -u failglob dotglob
__devbase_shellrc_files=("$__devbase_shellrc_dir"/*.sh)
[ -n "$__devbase_shellrc_failglob" ] && shopt -s failglob
[ -n "$__devbase_shellrc_dotglob" ] && shopt -s dotglob
# 一致が無いときはグロブが文字列のまま残る。-f の判定で落ちる
for __devbase_shellrc_file in "${__devbase_shellrc_files[@]}"; do
if [ -f "$__devbase_shellrc_file" ] && [ -r "$__devbase_shellrc_file" ]; then
. "$__devbase_shellrc_file"
fi
done
fi
# 終了状態を 0 にする役も兼ねる (最後のファイルが読めなくても非 0 を残さない)
unset __devbase_shellrc_dir __devbase_shellrc_file __devbase_shellrc_files \
__devbase_shellrc_failglob __devbase_shellrc_dotglob
Loading
Loading