Skip to content

Releases: kan/booch

v1.19.0

Choose a tag to compare

@kan kan released this 15 Oct 04:30
c7026b5

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

Choose a tag to compare

@kan kan released this 07 Oct 02:49
5a39bd5

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

Choose a tag to compare

@kan kan released this 03 Oct 02:43
6364dff

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

Choose a tag to compare

@kan kan released this 29 Sep 09:45
22275be

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

Choose a tag to compare

@kan kan released this 29 Sep 09:17
6570e0d

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 未満だと名前付きも消すので使わず、名前を指定して消す
  • 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

Choose a tag to compare

@kan kan released this 24 Sep 09:16
1b34752

Fixed

  • booch_claude_marketplace_list が、未登録の marketplace も登録済みとして返していた。
    claude plugin marketplace list の "From claude.ai:" 節は、アカウントから追加できるものを "not added" で出す。
    利用側の autoremove はこれを候補に出し、消しても登録されていないので毎回候補に戻っていた。
    plugin list / marketplace list の共通パーサが、最初の節(導入済み・登録済みの一覧)の行だけを
    拾うようにした。節は見出しの文言ではなく、インデントの無い行で区切る。

v1.16.0

Choose a tag to compare

@kan kan released this 24 Sep 08:42
3e278d2

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

Choose a tag to compare

@kan kan released this 24 Sep 07:26
2976c1c

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

Choose a tag to compare

@kan kan released this 17 Sep 12:44
00ce0b5

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

Choose a tag to compare

@kan kan released this 15 Sep 05:38
96c8e8d

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 の指摘、
    地の文のダッシュと並列の中黒、長い文の分割)。