Skip to content

Latest commit

 

History

History
119 lines (82 loc) · 13.7 KB

File metadata and controls

119 lines (82 loc) · 13.7 KB
Cairn Tabs logo

Cairn Tabs

開発者向けタブ コンテキスト マネージャー。 ブラウザのタブをタスクごとに自動グループ化し、タスク全体をワンクリックでアーカイブ・復元、あらゆるタブを即座に検索できます。Chrome / Edge のサイドパネル拡張機能 — ローカルファースト、アカウント不要。

English · 简体中文 · 日本語 · 한국어


cairn とは山道を示す石積みの道標 — 散らばったタブのランドマークです。 元のコードネームは TabCtx。詳細は tabctx-prd-tech-spec.md を参照。

機能

MVP のコアループ、v1.1 開発者特化機能、v1.5 AI はすべて実装済みで動作しています(現在 1.0):

  • サイドバー — 現在のタブをタスク別にリアルタイム表示。統計バーとボトムステータスバーを備え、ヘッダーからワンクリックで全展開 / 全折りたたみ(アクティブなタスク + Inbox)。

  • 手動タスク — 作成 / 名前変更 / 削除、タスク間でのタブのドラッグ移動。

  • タスク全体のアーカイブ / 復元 — ワンクリックでアーカイブ&クローズ、ワンクリックで復元(レートリミット付き再オープン)。5 秒間の Undo。

  • AI によるタブ整理 — ヘッダーにある「✦ 整理する」ボタンですべての開いているタブを一括再クラスタリングし、タブをグループをまたいで移動して残余を最小化。スター付きおよび手動配置済みのタブは移動しない。空のグループはクリーンアップ。プレビューには各タブの元のグループが表示され、整理全体をワンクリックで Undo 可能(Inbox には独自の控えめな「✦ AI 整理」あり。詳細は後述)。

  • セッション復旧 — タスクはブラウザの再起動後も保持。再起動時にタブは URL でレコードに再バインドされ、タスクはタイトルでネイティブグループに再接続されるため、データは失われません。Chrome がタスクのタブをまったく復元しなかった場合、そのタスクは自動アーカイブ(URL 保持)されるため、ワンクリックで呼び戻せます。

  • 重複検出 & マージ(F-05)— 同一 URL の重複にフラグを立て、ワンクリックでマージ(最後にアクティブだったものを保持)。

  • グローバル検索⌘⇧K)— fuse.js でオープンタブとアーカイブ済みタブをファジー検索。 でタブにジャンプ、⌘↵ でタスク全体を復元。入力前はランチャーとして最近のタブと ★ スター付きタブを表示。

  • 双方向ネイティブ tabGroups 同期(F-06)— Inbox = グループ未設定、名前付きタスク = 1 つのネイティブタブグループで、タイトル / カラーを 1:1 マッピング。ネイティブ側でのグループ追加 / 削除 / 編集は逆同期され、手動作成グループは自動採用。

  • 自動グループ化エンジン(F-07)— 新しいタブはオープナーチェーン / 時間ウィンドウ / ドメインでスコアリングされ、十分な確信がある場合のみ既存タスクに参加(例:そのタスク内のタブから開かれた場合)。それ以外は Inbox に残留。ドラッグアウトで否定サンプルを記録、手動割り当てでロックという形で学習。デフォルトでは保守的 — 誤分類よりも Inbox を優先。新規タスク(グループ)の作成は必ず確認を要求 — Inbox タブを新しいタスクに自動昇格させることはない。同一サイト提案:Inbox 内のタブが同一サイト(eTLD+1)を十分な数(デフォルト閾値 4、設定で 2〜8 に調整可能)共有する場合、パネル上部に「グループ」候補が表示され、確認後にのみ新規タスクになる。エンジン全体を設定でオフにすることも可能(オフ時は新しいタブは Inbox のみに移動)。

  • localhost プロジェクト名マッピング(F-08)— localhost:3000 に対してバインドしたプロジェクト名(例:auth-service)を表示。ポートはモノスペースで行末に表示。未バインドのポートにはインラインのワンクリックバインド提案を表示。

  • GitHub / Bitbucket メタデータ(F-09)— GitHub の PR / Issue と Bitbucket Cloud の PR / Issue 行にはモノスペースの「タイプ + 番号」バッジ(PR #482 / #212)を表示。ホバーで owner/repo(Bitbucket は workspace/repo)を表示。GitHub は長い末尾タイトルを除去し、実際のタイトルのみ残す。純粋な URL パースのみ — リクエストゼロ、権限ゼロ。

  • スター(ハイライト) — タブ行をホバーしてスターを付けると「ハイライト」に設定。スター付きタブはタスクの先頭に浮き上がり、クイックアクセス用にパネル上部の「★ ハイライト」セクションに集約。古い / 沈んだタブとしてマークされることも、自動破棄されることもない(大切なものはシステムが奪わない)。スターはアーカイブ / 復元後も保持。

  • AI リネーム(AI 設定が必要)— タスク名変更時に入力欄横の「✦ AI」ボタンを押すと、AI がそのタスクのタブタイトル + ドメインから短いタスク名を提案し入力欄に挿入(確認または編集して使用)。タイトル + ドメインのみ送信、自動適用なし。実行中はボタンが「✦ キャンセル」に変わり中止可能。

  • 古いタブ検出(F-10)— 閾値(デフォルト 7 日、調整可能)を超えて訪問されていないタブをタスクから引き出し、下部の暗い「沈んだ」エリアに表示。ワンクリックで「すべてアーカイブ」(Undo 可能)。通知なし、設定でオフ可能。

  • タブの破棄 & メモリ回収(F-11)— デフォルトはオフ。オンにすると 5 分ごとにスキャンし、非アクティブ / 非オーディオ / 非ピンかつ localhost 以外で閾値(デフォルト 30 分、調整可能)を超えたアイドルタブを破棄してメモリを解放(クリックで自動リロード)。ボトムステータスバーに累積推定回収量を表示。localhost ホワイトリストで開発サーバーを保護。

  • エクスポート & インポート(F-12)— タスクを Markdown(タイトル + リンク、クリップボードにコピー、スタンドアップ / Notion 向け)にワンクリックでエクスポート。設定の「すべてのデータをエクスポート(JSON)」でバックアップ、「JSON をインポート」で復元。インポートは追加型で非破壊的 — インポートしたタスクはアーカイブに入り、既存データが上書きされることはないため、マシン間のバックアップ / 移行に安全に使えます。

  • Inbox の AI 整理(F-13、オプション)— Anthropic / OpenAI の API キーを入力すると、Inbox ヘッダーに「✦ AI 整理」ボタンが表示。AI はタブのタイトル + ドメインと既存タスクのドメイン + サンプルタイトルを読み込み、新規タスクの作成または適切な既存タスクへのマージを提案し、プレビュー後に適用。分析中でもキャンセル可能。 デフォルトはオフ。タイトル + ドメイン + タスク名(既存タスクのドメイン / サンプル含む)のみ送信、公式 API に直接接続、キーはデバイス上に保存。

    • カスタムリレー — 公式 API 以外に「カスタムリレー」を選択可能。OpenAI 互換エンドポイント(例:https://newapi.elevatesphere.com/v1)+ キー + モデルを入力して独自リレーに接続。プライバシー境界は変わらず(タイトル + ドメイン + タスク名のみ)、キーはローカル保存、権限は入力したホストのみにスコープ。
    • 接続テスト — 設定のワンクリック「接続テスト」で小さなリクエストを送信してキー / エンドポイント / モデルを確認。即時フィードバック ✓ Connected · model · Nms またはわかりやすいエラー(認証失敗 / エンドポイントまたはモデルが見つからない / タイムアウト / ネットワークエラー…)を表示。
  • 多言語 UI — インターフェース全体が English / 简体中文 / 日本語 / 한국어 に対応。デフォルトではブラウザの UI 言語に従い、設定でいつでも切り替え可能。

未実装(設計ドキュメントのロードマップ参照):Firefox サポート、クロスデバイス同期。

インストールと使い方

まだストアには公開されていません — 一度ビルドして「パッケージ化されていない拡張機能」として読み込むと長期的に使用できます(アカウント不要、サーバー不要、データはすべてローカル保存)。

前提条件: Node 20 以上 と pnpmnpm i -g pnpm)。

1. ビルド

git clone https://github.com/JavaLyHn/cairn-tabs.git
cd cairn-tabs
pnpm install
pnpm build          # output in .output/chrome-mv3

2. ブラウザへの読み込み(Chrome / Edge)

  1. chrome://extensions(Edge の場合は edge://extensions)を開く。
  2. デベロッパーモードを有効にする(右上)。
  3. **「パッケージ化されていない拡張機能を読み込む」**をクリックし、プロジェクト内の .output/chrome-mv3 ディレクトリを選択。
  4. ツールバーアイコンをピン留めしてクリックするとサイドパネルが開きます(⌘⇧O / Ctrl+Shift+O でパネルを開く、⌘⇧K / Ctrl+Shift+K で検索を開く)。

⚠️ 必ず .output/chrome-mv3(プロダクションビルド — 自己完結型、すぐに動作)を選択してください。.output/chrome-mv3-dev は開発用ビルドであり、pnpm dev を起動し続けないと空白のパネルが表示されます — 通常使用では読み込まないでください。

3. 新バージョンへの更新

git pull && pnpm build

その後 chrome://extensions を開き、拡張機能の更新 ↻ をクリック(削除して再追加する必要はありません)。

4.(オプション)AI を有効化 — 設定 ⚙ → AI 整理 → プロバイダーを選択して API キー(またはカスタムリレーのエンドポイント + キー + モデル)を入力 → 「接続テスト」をクリックして確認 → 保存。デフォルトはオフ。タブのタイトル + ドメイン + タスク名のみ送信。

データ & バックアップ: すべてのタスク / タブはブラウザのローカル IndexedDB に保存され、アップロードされることはありません。設定の「すべてのデータをエクスポート(JSON)」でいつでもバックアップでき、「JSON をインポート」で復元や別マシンへの移行が可能です(インポートしたタスクはアーカイブに入り、既存データは上書きされません)。

技術スタック

WXT (Manifest V3) · React 19 · TypeScript · Tailwind CSS · Dexie (IndexedDB) · Zustand · fuse.js · Vitest

アーキテクチャの特徴:Service Worker が唯一の書き込み主体。UI はコマンドを送信して状態スナップショットをサブスクライブするのみ。タブ / グループの自発的な操作はすべてイベントループを回避するための同期ロック内で実行。SW のスリープ後は hydrate + reconcile によって状態を再構築・整合。

開発

pnpm install
pnpm dev        # start the dev server (HMR); doesn't open a browser — load .output/chrome-mv3-dev manually
pnpm build      # production build to .output/chrome-mv3
pnpm compile    # type-check (tsc --noEmit)
pnpm test       # run Vitest

通常の使用方法については上記のインストールと使い方を参照。開発時は pnpm dev を使用して .output/chrome-mv3-dev を読み込んでください(ホットリロードに対応しますが、開発サーバーが起動していないとパネルが空白になります)。

プロジェクト構成

core/            UI-agnostic domain logic (unit-testable)
  store/         Dexie schema and repository layer
  background/    SW: tab sync / command handling / native group sync / undo / sync lock
  search/        fuse.js index
entrypoints/     WXT entry points: background + sidepanel (React)
shared/          types and the message protocol
tests/           Vitest (incl. fake-chrome integration tests)
docs/            design docs

コントリビューション

コントリビューション歓迎 — まず CONTRIBUTING.md をお読みください。

ライセンス

AGPL-3.0-only © JavaLyHn. ネットワーク経由の SaaS を含む派生物は同一ライセンスのもとでオープンソース化する必要があります。