[[🦉JINRAI]]のプランメモ。
> [!left-bubble] ![[chappy.webp]]
[[Codex CLI]] x [[GPT-5.3-Codex]] のプランです。
## Jinrai を Spoon専用配布へ再編する計画
### 概要
jinrai を dofile 前提のスクリプト構成から、hs.loadSpoon("Jinrai") で読み込む Spoon 構成へ移行する。
配布物は Jinrai.spoon.zip を正式形式とし、開発時はリポジトリ内 .spoon を直接参照して、現行同等の高速リロード体験を維持する。
### Spoon配布の要点(説明)
- Spoon は Name.spoon/init.lua を基本単位とする Lua プラグイン形式。
- 利用者は ~/.hammerspoon/Spoons/Name.spoon に配置し、hs.loadSpoon("Name") でロードする。
- 配布は通常 .zip(例: Jinrai.spoon.zip)。
- 開発時は zip 不要で、package.path 追加またはシンボリックリンクでリポジトリ直読みできる。
- 参考仕様: Hammerspoon SPOONS.md(公式)
### 実装方針(Spoon専用)
1. ディレクトリ再編
- ルートに Jinrai.spoon/ を作成。
- 既存 Lua モジュールを Jinrai.spoon/ 配下へ移設:
- init.lua
- focus_border.lua
- window_hints.lua
- focus_back.lua
- focus_history.lua
- アセット jinrai.svg も Jinrai.spoon/ へ移動(必要なら assets/ サブディレクトリ化)。
2. ロード方式の Spoon 準拠化
- debug.getinfo ベースの相対解決を廃止。
- 追加コード/リソース読み込みは hs.spoons.resourcePath(...) + dofile(...) に統一。
- focus_back.lua からの focus_history.lua 読み込みも同方式へ変更。
3. 公開APIの再定義(Spoon専用)
- spoon.Jinrai:setup(config) を主APIとして維持(既存 setup 利用者の移行コスト最小化)。
- spoon.Jinrai:teardown() を明示公開。
- name/version/author/license/homepage のメタデータを init.lua に追加。
- start/stop/bindHotkeys は今回は追加しない(現行機能は setup で十分なため)。
4. ドキュメント更新
- README.md / README.ja.md の導入手順を全面更新:
- 旧: dofile("/path/to/jinrai/init.lua")
- 新: hs.loadSpoon("Jinrai") + spoon.Jinrai:setup({...})
- 開発者向けに「開発時の即時確認フロー」を明記:
- ~/.hammerspoon/Spoons/Jinrai.spoon をリポジトリへ symlink
- または package.path 追加で repo 直読み
- 配布手順として Jinrai.spoon.zip の作り方を記載。
5. 配布オペレーション整備
- scripts/package-spoon.sh を追加し、Jinrai.spoon.zip を再現可能に生成。
- .github/workflows/ に release 用 workflow を追加:
- タグ push で zip 生成
- GitHub Release へ asset 添付
- CI は既存 busted を維持し、必要に応じてテスト対象パスのみ更新。
### 変更対象ファイル(予定)
- init.lua 相当を Jinrai.spoon/init.lua へ移行
- focus_back.lua ほか4モジュールを Jinrai.spoon/ へ移行
- README.md
- README.ja.md
- .github/workflows/ci.yml(必要最小限)
- 新規: scripts/package-spoon.sh
- 新規: .github/workflows/release.yml
### テストケース
1. 既存ユニットテスト
- busted
- busted spec/focus_back_spec.lua
- busted spec/init_spec.lua
2. Spoonロード検証(回帰防止)
- hs.loadSpoon("Jinrai") でロード成功。
- spoon.Jinrai:setup({ focus_border = {}, window_hints = {}, focus_back = {} }) で従来同等動作。
- spoon.Jinrai:teardown() が teardown 順序要件を満たす。
3. 開発フロー検証
- symlink 運用で Hammerspoon Reload Config 後に変更反映される。
- zip 配布物を展開しても同一APIで動作。
4. 配布物検証
- Jinrai.spoon.zip 内に Jinrai.spoon/init.lua と必要ファイルが揃う。
- 余計なファイル(spec 等)が含まれない。
### 受け入れ基準
- README の初期導入手順に dofile が残っていない。
- 初期導入は hs.loadSpoon("Jinrai") 前提で完結。
- 開発時に repo 直参照で反復確認できる手順が README に明記されている。
- CI が通り、リリースで Jinrai.spoon.zip を生成可能。
### 前提・デフォルト
- 配布導線は GitHub Releases をデフォルト採用。
- Spoon名は Jinrai(TitleCase)を採用。
- API は setup/teardown 継続をデフォルト採用(start/stop/bindHotkeys は非導入)。
- 既存 dofile 方式との互換レイヤーは作らない(Spoon専用方針)。