Repository navigation
Releases: kan/booch
Releases · kan/booch
Release list
v1.19.0
Added
-
delta/shellcheckジョブで、取得した資産の SHA256 を照合するようにした(#20)。upstream はチェックサムを
公開していないので、GitHub の Releases API が資産に付ける digest を期待値にする。転送中の破損や改ざんは
検出できるが、資産そのものの差し替え(上流のアカウント侵害)は検出できないlib/github.shにbooch_github_asset_digest/booch_github_verify_assetを足した。digest が付いていない
(古いリリース)ときは警告して照合を飛ばす。API の取得に失敗したとき(レート制限など)と、digest が一致しない
ときは失敗にするlib/github.shは、lib/verify.shが読み込まれていなければ自分で読み込む(github.sh だけを読む利用側を
壊さないため)
-
jobs/aws.shに、AWS CLI v2 の古い版のディレクトリを削除する関数を足した(#22)。公式インストーラの
install --updateは前の版(1 版 約 270MB)を/usr/local/aws-cli/v2/に残すので、job_awsで更新する
たびに溜まっていたbooch_aws_cli_prune:current以外の使われていない版を sudo で削除する。初回の削除が大きく
ジョブのタイムアウトに掛かりうるので、job_awsの中では消さない。利用側の cleanup から呼ぶbooch_aws_cli_stale_versions: 削除してよい版を 1 行ずつ出す(doctor などの表示用)。currentの aws が
自分の版を名乗るときだけ候補を出し、実行中のプロセスが使っている版と、x.y.z 以外の名前や symlink は
候補にしない。/procを読めず使用中の版を判定できないとき(sudo の失敗など)は、候補を出さずに非 0 を返す- 導入先は
BOOCH_AWS_CLI_ROOTで変えられる(既定/usr/local/aws-cli/v2)
-
jobs/codex.shに、Codex の共有デーモン(app-server)の版を CLI に合わせる機構を足した(#21)。
job_codexが CLI を更新しても、動いているデーモンは自分用の codex で古い版のまま残り、Codex が起動時に
版のずれを警告していたbooch_codex_daemon_versions:"<cli> <app>"の 1 行を出す。デーモンが止まっていれば app は空、
取れなければ非 0(doctor などの表示用)booch_codex_daemon_sync: 版がずれていれば y/N を聞いてcodex app-server daemon updateする。実行中の
作業が中断されうるので確認は省かない(非対話なら何もしない)。ジョブは非対話なので、利用側がbooch_runの
後に主シェルから呼ぶ。入れ替えても版がそろわないときと、確認に使うlib/confirm.shを読み込めないときは
1 を返す
Changed
- README と
install.shのワンライナー、およびinstall.shが gh の keyring を取る curl に
--proto '=https' --tlsv1.2を付けた(#20)。リダイレクトで平文の http へ落ちることと、TLS の格下げを拒否する
Fixed
apt-get updateが一部の repo の index を取得できなくても終了コード 0 を返すため、booch_apt_sync/
booch_apt_installとinstall.shが取得失敗に気付けなかった(#19)。-o APT::Update::Error-Mode=any
を渡して検出するようにした。この項目を知らない古い apt では無視され、これまでどおり動くbooch_apt_sync/booch_apt_installは、検出したときの扱いを環境変数BOOCH_APT_UPDATE_ERROR_MODEで
選べる。既定のwarnは[WARN]を出し、古い index のまま続行する(一時的な不調で setup 全体を止めない)。
strictにすると非 0 を返す。Release が無い、ロックを取れないといった、もともと update が非 0 になる
失敗は、warnでもこれまでどおり非 0 を返す。update の処理はbooch_apt_updateとして公開したinstall.shは取得に失敗した時点で止まる(素の OS では、古い index のまま進むと後続の導入も失敗しやすいため)
v1.18.2
Fixed
booch_claude_plugin_listが、導入済みプラグインが 0 件のときに、セッション限定で読み込まれたプラグイン
(--plugin-dir/--plugin-urlや環境変数CLAUDE_CODE_PLUGIN_DIRS由来)を導入済みとして返していた。
表示用の出力ではSession-only pluginsの節が最初の節になり、「最初の節だけ」を読む解析では除けなかった。
claude plugin list --jsonのscopeで判定し、sessionを除くようにした。jq が無いか、CLI が--jsonを
持たないときは、これまでどおり表示用の出力から拾う
v1.18.1
Fixed
booch_claude_marketplace_listが、Claude Code に組込みの marketplace(anthropic-plugin-directoryなど。
一覧のSource: Built in)も登録済みとして返していた。組込みは利用者が add したものではなく、remove しても
off になるだけで一覧に残るので、autoremove が毎回リスト外として候補に出していた。
claude plugin marketplace list --jsonのnameを返すようにした。jq が無いか、CLI が--jsonを
持たないときは、これまでどおり表示用の出力から拾う
v1.18.0
Added
booch_cleanup_docker_volumes_pruneがorphan:<glob>を受け付けるようにした。一致する volume は、
compose のプロジェクトが見当たらないときだけ削除する。node_modules のように、消すと install し直しに
なる依存を想定している。作業中のプロジェクトのものは残し、消した worktree や使い捨て環境の残骸だけを
消す。プロジェクトが見当たらない名前付き volume のうち消さないものには、一覧でその旨を添えるbooch_cleanup_docker_project_alive project(lib/cleanup.sh): 上の生死の判定。
BOOCH_CLEANUP_PROJECT_ROOTS(:区切りで、各要素は glob)のどれかの直下に、プロジェクト名と同じ名前の
ディレクトリがあれば生きているとみなす。ディレクトリ名は compose と同じ規則(小文字化と
[a-z0-9_-]以外の除去)で正規化して比べる。探す場所の下は 1 回だけ走査する。
未設定なら常に生きている扱いで、orphan:を渡していればその旨を表示する(orphan:の volume は消さない)
Changed
booch_cleanup_docker_volumes_pruneの表示で、削除候補の名前付き volume を「キャッシュ」ではなく
「名前付き」とまとめ、消す理由を各行に添えるようにした
v1.17.0
Added
booch_cleanup_docker_volumes_prune [assume_yes] [cache_glob...](lib/cleanup.sh): どの
コンテナからも参照されていない volume のうち、消しても再作成で戻るものを削除する。- 匿名 volume(名前が 64 桁の hex か、
com.docker.volume.anonymousラベル付き)は削除する - 名前が
cache_glob(bash のパターン。例:'*node-modules')のどれかに一致する volume は削除する - それ以外の名前付き volume は DB のデータを含みうるので消さず、名前と大きさを表示する
- 消す前に一覧と回収見込みを出して y/N 確認を挟む(
assume_yesで省略。非対話では見送り)。
匿名 volume は出どころがラベルに残らないので、短縮 ID / 大きさ / 作成日時を新しい順に出す docker volume pruneは Docker 23 未満だと名前付きも消すので使わず、名前を指定して消す
- 匿名 volume(名前が 64 桁の hex か、
booch_cleanup_docker_volume_rows(lib/cleanup.sh): volume ごとの
"Name|Links|Size|Labels" を返す。上の判定の継ぎ目booch_cleanup_docker_volume_created name...(lib/cleanup.sh): volume ごとの
"Name|CreatedAt" を返す。匿名 volume の一覧表示の継ぎ目
Changed
booch_cleanup_docker_prune_deepの末尾に出していた volume の手動削除の案内をやめた。
消してよい volume の選別と削除はbooch_cleanup_docker_volumes_pruneが行う
v1.16.1
Fixed
booch_claude_marketplace_listが、未登録の marketplace も登録済みとして返していた。
claude plugin marketplace listの "From claude.ai:" 節は、アカウントから追加できるものを "not added" で出す。
利用側の autoremove はこれを候補に出し、消しても登録されていないので毎回候補に戻っていた。
plugin list/marketplace listの共通パーサが、最初の節(導入済み・登録済みの一覧)の行だけを
拾うようにした。節は見出しの文言ではなく、インデントの無い行で区切る。
v1.16.0
Added
lib/doctor.shにラベル列の幅を求める 2 つの関数を足した。どちらも現在の
BOOCH_DOCTOR_LABEL_WIDTHと最長ラベルの大きいほうを返す。長さはprintfの%-*sに合わせて
バイト数で数える。節の前にBOOCH_DOCTOR_LABEL_WIDTHをこの値にすれば、節全体の状態列が揃う。booch_doctor_labels_width label...: 任意のラベルの集合から求めるbooch_doctor_symlinks_width "src|dest"...:booch_doctor_symlinksと同じ規則でラベルを
組み立てて求める。ラベルの組み立て規則を利用側へ写さずに済む
Changed
lib/state.shとlib/apt.shで、外部プロセスの起動を減らした。挙動は変わらない(#18)。_booch_state_file: id の符号化とパスの返却をprintf -vにし、1 文字ごとの fork と、
呼び出しごとのコマンド置換の fork をなくしたbooch_state_changed: 記録をcatではなくreadで読むbooch_state_fresh/booch_apt_key_deadline: 現在時刻をdate +%sではなく
printf '%(%s)T' -1で取る。lib/state.shはdateに依存しなくなった
Fixed
booch_doctor_symlinksで、ラベル(dest の$HOMEを~に短縮したもの)が
BOOCH_DOCTOR_LABEL_WIDTH(既定 30)を超える行だけ状態の列が後ろへずれていた。関数内で幅を最長
ラベルまで広げて描画する。広げた幅は関数を抜けると元に戻る(#16)。booch_doctor_diskが、空き容量が閾値を下回りヒントを渡さなかったときに終了コード 1 を返していた。
set -eの呼び出し側はここで止まっていた。booch_sudo_stopが、キープアライブの子プロセスが既に無いとpkillの失敗で途中終了していた。
set -eの呼び出し側では PID が残っていた。- テストフレームワーク(
tests/lib.sh)が、テスト関数の途中の assert の失敗を見逃していた。
ifの条件の中でテストを実行していたためset -eが無効になり、最後の行の終了コードだけで合否を
決めていた。これで隠れていた上の 2 件と、捕捉の仕方を誤っていたテスト 4 件を直した。
v1.15.0
Added
lib/state.shを足した。宣言と現状を畳んだハッシュが前回と変わったときだけ、または前回から
一定時間が過ぎたときだけ処理を走らせるための状態記録(chezmoi のrun_onchange_/
refreshPeriod相当)。公開 API はbooch_hash_args/booch_state_changed/
booch_state_record/booch_state_fresh/booch_state_touch。記録の置き場は
BOOCH_STATE_DIR(未設定なら${XDG_CACHE_HOME:-$HOME/.cache}/booch/state)。lib は export
しないので、既定を変えてジョブからも使う利用側は自分で export する。記録ファイル名は id を
パーセントエンコードしたもの。
v1.14.0
Changed
jobs/codex.shの導入方式を、GitHub Releases の単体バイナリから公式インストーラ
(https://chatgpt.com/codex/install.sh)に変えた。Codex CLI は付随の実行ファイル
(codex-code-mode-host / rg / bwrap)を含むパッケージとして配布されるようになり、単体
バイナリだけでは正常に動かないため。- 導入先が
/usr/local/bin/codexから$CODEX_INSTALL_DIR(既定~/.local/bin)の symlink に
変わる。利用側で~/.local/binを PATH に通しておく必要がある。 インストーラがシェルの
設定ファイルへ PATH を追記しないよう、HOME を一時ディレクトリに差し替えて実行する。 - 導入済みの版は導入先の codex から取る(PATH 上の codex は見ない)。
- 更新も同じインストーラで行う。導入後、current と直前の版以外のパッケージを
$CODEX_HOME/packages/standalone/releases/から削除する。 - インストーラでの導入が済んでいれば、以前の booch が置いた
/usr/local/bin/codex(codex-cli
を名乗る実ファイルのときだけ)を毎回 sudo で削除する(一度失敗しても次の実行で再試行する)。
撤去するのは booch 自身が置いた物だけで、npm 版など他の経路の codex は利用側に任せる。 - パッケージの SHA256 はインストーラが照合する(README の検証表を更新)。
- 公開 seam の
booch_codex_installの引数を<tag> <arch>から<version>(rust-v を外した
X.Y.Z)に変えた。booch_codex_artifactを削除し、booch_codex_bin_dir/booch_codex_home/
booch_codex_standalone_dir/booch_codex_current_release/booch_codex_fetch_installer/
booch_codex_run_installer/booch_codex_prune_releases/booch_codex_legacy_path/
booch_codex_remove_legacyを足した。
- 導入先が
examples/bootstrap.shの codex ジョブのタイムアウトを 300 秒にした(パッケージが大きくなったため)。
v1.13.3
Fixed
- README「booch 本体の取り込み」の手順を直した。submodule をタグへ
checkoutした直後に
git submodule update --initを実行していたため、submodule addの時点で記録された
既定ブランチの版へ戻り、タグへの固定が消えていた。git add vendor/boochで版を記録して
コミットする手順にし、記録前に update すると戻る理由も書いた。 - 文書と実物の食い違いを直した。
- SHA256 検証済みのツールに Starship が抜けていた(SECURITY.md、CLAUDE.md)
- README の検証表に ShellCheck(未検証)の行が無かった
examples/bootstrap.shが導入する提供ジョブの列挙が実物と違った(README は shellcheck を
含み、examples/README.mdは starship が抜けていた)- CLAUDE.md がジョブの起動を
bash -cと書いていた(実際は一時スクリプトをbash <file>で実行) - uv / Claude のインストーラを
curl | sh系と書いていた(実際は一時ファイルへ取得して実行) - CLAUDE.md のリリース手順が、README に無い固定版番号の更新確認を求めていた
install.shの--booch-refの既定が v1.0.0 のままで、booch が見つからないときに古い版を
clone していた。--booch-refを指定しなければ、clone したタグのうち最新のリリースへ
checkout するようにした(版番号を install.sh に持たないので、リリースのたびに更新する必要が無い)。
Changed
- README の runner API 表に
booch_result_failed/booch_job_sync/booch_result_verを足した。 - README / CLAUDE.md / SECURITY.md / examples/README.md の表記を整えた(textlint の指摘、
地の文のダッシュと並列の中黒、長い文の分割)。