← 一覧
@lapius/sca-clisca
GitHubnpm

sca — chatapp.lapius7.com CLIクライアント

https://chatapp.lapius7.com/ のチャット機能を、ブラウザを開かずターミナルのscaコマンドから使うためのCLI。

構成

ユーザーが直接使うのはcli/側のバイナリ(sca)だけで、Python側はsca room who / sca room join実行時に裏で自動的に呼ばれる。

インストール

npm(推奨)

npm i -g @lapius/sca-cli

Linux / macOS(x64・arm64)/ Windows(x64)のビルド済みバイナリが入る(Go 不要、Node.js 18 以降)。 更新も同じコマンド(npm i -g @lapius/sca-cli)で行う。

sca room who / sca room join(Realtime 機能)だけは Python 3 を使う。必要な Python 環境は 初回実行時に自動で準備される。

インストーラースクリプト(Go でソースからビルド)

curl -fsSL https://raw.githubusercontent.com/Lapius7/sca-cli/main/install.sh | bash

Go が必要。Go の有無チェック・ビルド・インストール先と PATH の案内・Realtime 用の Python 環境の準備までをまとめて行う。 go install を直接叩く方法はサポートしない。

初期設定

sca login         # ブラウザでaccount.lapius7.com(Lapount)にログインし、自動的にセッションを取得する

これだけで使い始められる。設定ファイルを書く必要はなく、Realtime機能(sca room who/join)に 必要なPython環境もインストーラースクリプトが自動で準備する(準備前に初めてsca room who/join を実行した場合でも、その場で自動的にセットアップされる)。 CLIはsupabase.lapius7.comに直接繋がず、専用のリバースプロキシ https://chatapp.lapius7.com/api/ (実体はweb/chatapp.lapius7.com/proxy/main.go、REST/Auth/Realtime WebSocketをすべて中継する)経由で通信する。ANON_KEYの付与はこのプロキシだけが行うため、 CLI(Go/Pythonどちら側にも)はANON_KEYを一切持たない。ANON_KEY自体はRLSで保護される 前提の非秘匿な値(Web版のJSバンドルにもそのまま入っている)なので厳密には埋め込んでも 問題ないが、CLIのソースコードに一切登場しない構成にすることで「念のため」のリスクも 無くしている。

sca loginはローカルに一時HTTPサーバー(OSに選ばせたランダムなポート)を立て、まず oauth-connect-token関数(action=mint、sca-proxy経由なのでANON_KEY不要)を呼んで 転送先(http://127.0.0.1:<port>/callback)に対応する使い捨てトークンを発行し、 https://account.lapius7.com/oauth/v2/authorize?token=<token>をターミナルに表示する (有効期限も併記する。ブラウザは自動で開かず、ユーザー自身がクリックまたはコピーして 開く)。account.lapius7.comのSSOハンドオフでログイン後、そのローカルサーバーにトークンが 自動的に返ってくる(gh/aws等のCLIと同じ方式)。こちらのoauth-connect-token呼び出し・ /oauth/v2/authorizeアクセスはsca-proxyを経由せずaccount.lapius7.com/supabase.lapius7.comに 直接アクセスする(旧パス/oauth/authorizeはaccount.lapius7.com側で302リダイレクトされる ので引き続き動くが、新規のリンクは/oauth/v2/authorizeで発行する)。 /oauth/v2/authorizeは一般的なOAuth認可エンドポイントの見た目に合わせた 専用パスで、chatapp.lapius7.com・post.lapius7.com・md.lapius7.com などの既存サービスも同じ入口(と同じトークン発行の仕組み)を共有している。実際の転送先URLは URLに直接出ず、5分で失効する使い捨てトークンの向こう側にある。

ポートを固定(旧実装は8765固定)にしなかったのは、固定ポートだと第三者が事前に 同じポートを乗っ取っておき、フィッシングリンクでログインの確認画面だけ踏ませて セッションを奪うことが理論上可能になるため(このCLIはOSSでポート番号も公開されている)。 account.lapius7.com側は127.0.0.1の任意ポートへのハンドオフだけを特例で許可しており (oauth-connect-token関数・sso-handoff関数・ssoRedirect.ts)、他ドメインへの緩和は 一切行っていない。

別のSupabaseインスタンスに直接向けたい場合だけ、~/.config/sca/config.envに SUPABASE_URL/ANON_KEYを書くか同名の環境変数を設定して上書きできる(この場合は プロキシを経由しないので、自分のインスタンスのANON_KEYを指定する必要がある)。

使い方

sca whoami                                          # ログイン中のユーザーを表示
sca room list                                       # 自分が作成したルームの一覧(IDも表示される)
sca room create "雑談部屋"                           # ルーム作成(作成後そのまま入室する)
sca room rename 5f2e...-uuid "雑談部屋2"             # リネーム(自分が作成したルームのみ)
sca room delete 5f2e...-uuid                        # 削除(自分が作成したルームのみ、確認あり)
sca room who 5f2e...-uuid                           # 今そのルームにいる人を表示
sca room join 5f2e...-uuid                          # 入室して対話チャット開始
sca version                                         # バージョンを表示

<room_id>はルームIDのみ指定できる(名前では入室できない)。chat_roomsは全認証済み ユーザーがSELECT可能なRLSのため、名前検索を許すと他人のルーム名を適当に打っただけで 存在確認やIDの割り出し・入室ができてしまう問題があった。そのためsca room listは 自分が作成したルームだけを表示し、他人のルームへは作成者から/inviteで渡されたIDで のみ参加できるようにしている。

sca room joinの対話セッション中は:

設計メモ

既知の制約