Caps LockをONにしている間を「退席」とみなし、Codex CLI / Claude Code CLI / OpenCode / Piのセッション記録を収集して、選択したCLIとモデルで復帰時に要約するmacOSアプリです。ネイティブメニューバー、履歴ウィンドウ、退席前メモウィンドウ、設定ウィンドウを備えます。
- 収集元はCodex / Claude Code / OpenCode / Piを独立して複数選択
- 要約担当CLIは収集元と無関係に選択
- 要約担当ごとにモデルとReasoning(CLI固有のeffort / variant / thinking)を指定
- 主担当が失敗した場合は利用可能な別CLIへ自動フォールバック
- 退席前に任意メモを入力でき、CLIログがなくても要約を実行(GUI版エージェントの作業補足に対応)
- 誤操作を防ぐ最短退席時間しきい値を設定可能
- 履歴の要約をクリップボードへコピー、Markdownとして書き出し
- 元セッションをresumeせず、隔離した一時ディレクトリで要約のみ実行
- 成功時は生ログを削除し、失敗時だけ再要約用に保持
- 履歴ウィンドウ、macOS通知、
.pkg生成に対応
- macOS 14以降
- Xcode 26または対応するSwift toolchain
- 要約に使うCLIがインストール・認証済みであること
| CLI | セッション収集 | 要約起動 | モデル / Reasoning |
|---|---|---|---|
| Codex | ~/.codex/sessions のJSONL |
codex exec --ephemeral --sandbox read-only --output-schema |
--model / --config model_reasoning_effort=... |
| Claude Code | ~/.claude/projects のJSONL |
claude -p(安全境界は常時、任意機能だけ --help で有効化) |
--model / --effort |
| OpenCode | opencode session list --format json + opencode export |
opencode run --format json --variant |
--model provider/model / model固有のvariant |
| Pi | ~/.pi/agent/sessions のJSONL |
pi --print --no-session --no-tools |
--model / --thinking |
OpenCodeは現行版がDB-backed storageを使うため、保存ファイルを直接JSONLとして解釈せず、公式CLIの一覧・export境界を使います。要約時は全CLIで元の作業ディレクトリをcwdにせず、読み取り専用またはツール無効の実行にしています。OpenCode要約のセッションDBも一時ディレクトリへ隔離します。
モデルIDとReasoningの有効値はCLIやモデルごとに変わるため、設定欄は自由入力です。空欄なら各CLIの既定値を使います。OpenCodeのvariantはモデルごとに有効値が異なります。
ChatGPTデスクトップアプリやCursorなど、JSONLログを読めないGUIエージェントの作業はCapsStackが直接収集できません。その代わり、メニューバーの「退席前メモ...」から専用ウィンドウへ入力しておくと、復帰時の要約資料に含まれます。
CLIセッションが一件も検出されず、退席前メモだけがある場合は、メモ単体を要約対象として扱います。これにより、GUI専用ワークフローや短い外出でも履歴が空になりません。
実装時の照合先: Codex exec CLI、Claude Code CLI、OpenCode CLI、OpenCode permissions、Pi usage。
swift test
./script/build_and_run.sh --verifyCodexアプリのRunボタンも ./script/build_and_run.sh を呼び出します。
CLIは履歴の参照、退席前メモの受け渡し、対応エージェントCLIの検出を行います。履歴やメモはmacOSアプリと同じローカル保存先を使い、生ログにはアクセスしません。
開発時は、macOSの大文字小文字非区別ファイルシステムでアプリ名と衝突しないSwiftPM product名を使います。
swift run capsstack-cli --help
swift run capsstack-cli status --json
swift run capsstack-cli history latest --markdown
printf '%s' '次は回帰テストを実行' | swift run capsstack-cli memo set --stdin --json.app / .pkg には CapsStack.app/Contents/Helpers/capsstack として同梱されます。Contents/MacOS/CapsStack と同じディレクトリに小文字名を置くと、macOS標準の大文字小文字非区別ファイルシステムでアプリ本体と衝突するためです。
/Applications/CapsStack.app/Contents/Helpers/capsstack status主なコマンド:
| コマンド | 用途 |
|---|---|
status [--json] |
履歴、メモ、対応CLIの状態を確認 |
history list [--limit N] [--json] |
新しい順に履歴を一覧表示 |
history latest [--json|--markdown] |
最新の復帰要約を表示 |
history show <UUID> [--json|--markdown] |
指定した履歴を表示 |
memo get [--json] |
現在の退席前メモを表示 |
memo set <text> [--json] |
退席前メモを保存 |
memo set --stdin [--json] |
stdinから退席前メモを安全に保存 |
memo clear [--json] |
退席前メモを消去 |
検証済みのCodexプラグインは plugins/capsstack にあります。プラグインには次のSkillsを同梱しています。
capsstack-context: 退席前の作業状況を短いメモとして保存し、連携状態を確認capsstack-history: 最新または指定した復帰要約をJSON / Markdownで安全に取得
Skillsは CAPSSTACK_CLI、リポジトリ内の開発ビルド、PATH、/Applications/CapsStack.app/Contents/Helpers/capsstack の順でCLIを解決します。プラグインの配布時は plugins/capsstack ディレクトリをCodex marketplaceのplugin sourceとして利用できます。
GitHubで新しい空のリポジトリを作成します。初回の履歴をローカルで作るため、作成時にREADME、.gitignore、Licenseの自動生成は選択しません。
ローカルでコミット対象を確認してから、初回コミットを作成します。.gitignore によりビルド生成物、ローカルのCodex設定、環境ファイル、秘密鍵・署名ファイルは対象外になります。
cd /path/to/CapsStack
git status --short --ignored
git add .
git status --short
git diff --cached --check
git diff --cached
git commit -m "Initial commit"
git branch -M mainコミット内容を確認したら、GitHubリポジトリを origin として登録してpushします。OWNER と REPOSITORY は自分の値に置き換えてください。
SSHを使う場合:
git remote add origin git@github.com:OWNER/REPOSITORY.git
git push -u origin mainHTTPSを使う場合:
git remote add origin https://github.com/OWNER/REPOSITORY.git
git push -u origin mainすでに origin が登録済みなら git remote set-url origin ... を使います。GitHub CLIやSSH agentなどで認証し、アクセストークンをURLやソースに直接書かないでください。2回目以降は git push だけで更新できます。
ローカル確認用のad-hoc署名パッケージ:
./script/build_pkg.shDeveloper ID署名:
DEVELOPER_ID_APPLICATION="Developer ID Application: ..." \
DEVELOPER_ID_INSTALLER="Developer ID Installer: ..." \
./script/build_pkg.shoutputs/CapsStack.pkg はバージョンごとに1つだけ保持します。同じバージョンがすでにある場合は再生成せず、異なるバージョンの場合だけ新しいパッケージを作ってから置き換えます。生成中に別のパッケージ生成が走った場合も、重複生成せず終了します。
バージョンを更新する場合:
CAPSSTACK_VERSION="0.2.0" CAPSSTACK_BUILD="0.2.0" ./script/build_pkg.shnotarytoolの認証情報をKeychainへ保存した後:
NOTARY_PROFILE="capsstack-notary" ./script/notarize.shCapsStack自身は収集資料を独自サーバーへ送信しません。ただし要約CLIは各サービスの設定に従って入力を処理します。要約成功後、生ログと一時資料は削除されます。
Caps Lockを物理スイッチとして扱う軽快な体験はCapsomniaに着想を得ています。CapsStackはコード、アセット、文言、画面構成を流用せず、セッション収集と復帰要約のために独立実装しています。スリープ制御や特権ヘルパーも含みません。