← 一覧に戻る

plan-viewer アノテーション質問機能

2026年2月24日

📌 一言でいうと

読みながら「ここがわからない」を即座に送れる仕組み

🎯 なぜこれが必要なのか

plan-viewerでスマホから計画を読んでいるとき、わからない箇所が出てきても「PCに戻ってから聞こう」になりがち。その間に疑問を忘れてしまう。

読んでいるその場で「ここがわからない」を送れれば、次のClaude Codeセッション(私とのチャット)で質問にまとめて回答できる。疑問の鮮度を保ったまま学びにつなげるのが目的よ。

🏗️ どう動くのか

操作の流れ

1
?ボタンをタップ
右下のリロードボタンの上に新しく追加される「?」ボタンを押す。画面が「質問モード」に切り替わる
2
わからない文章を長押しで選択
スマホの標準機能でテキストを選択する。選択した箇所が青くハイライトされる
3
質問を書いて送信
ハイライト箇所の近くにポップアップが出る。「これってどういう意味?」など自由に書いて送信ボタンを押す
4
次のセッションで回答が届く
送信された質問はサーバー上のファイル(questions.json)に保存される。次にClaude Codeを開いた時に「plan-viewerの質問確認して」と言えば、まとめて回答する

ボタンの配置イメージ

右下に2つのボタンが縦に並ぶ。上が質問ボタン、下がリロードボタン。

質問モード
🔄
リロード

質問ポップアップのイメージ

画面イメージ

server.py(HTTPサーバーの本体ファイル)にPOSTリクエスト(データ送信の仕組み)の受付機能を追加する。これにより質問データをファイルに保存できるようになる…

「受付機能を追加する。これにより質問データをファイルに保存」
POSTリクエストって具体的にどういう仕組み?
キャンセル 送信

📊 変更箇所

対象 変更内容 状態
server.py 質問データを受け取って保存するPOST受付を追加 ✅ 済
SKILL.md テンプレート アノテーション用のボタン・ポップアップ・JavaScriptを追加 ⏳ 承認待ち
既存HTMLファイル(4件) 新テンプレートの機能を反映 🔜 テンプレート確定後

🔧 技術的にどうやるか

テキスト選択の検出

ブラウザが標準で持っている Selection API(テキストの選択状態を読み取る仕組み)を使う。スマホで文章を長押しして選択するのはOSの標準動作なので、追加のライブラリは不要。

選択が変わるたびに発生する selectionchange イベント(テキスト選択が変更されたという通知)を監視して、200ミリ秒(0.2秒)の「待ち時間」を入れる。これはドラッグ中に何十回もイベントが発火するのを防ぐため。

ハイライト(マーカー)の仕組み

選択されたテキストを <mark> タグ(HTML標準のハイライト用タグ)で囲む。これにより見た目が青くマーキングされる。

ただし、選択範囲が段落をまたぐ場合(たとえば2つの<p>タグにまたがる場合)は少し工夫が必要。この場合はテキストを一度「切り出して」markタグの中に入れ直す。

データの保存

server.py(plan-viewerのHTTPサーバー)にPOST受付を追加済み。質問を送信すると questions.json というファイルにどんどん追記されていく。保存されるデータは:

💡 ポイント

外部ライブラリなし。 ブラウザが標準で持っている機能だけで実現するので、CDNもnpmも不要。HTMLファイル1つに全部入る。

既存のリロードボタンはそのまま。 その上に質問ボタンが追加されるだけ。普段の使い勝手は変わらない。

質問はオフラインでは送れない。 サーバー(Mac)が起動していてtailscaleで接続されている必要がある。ただし通常のplan-viewer閲覧時は当然接続されているので問題ない。

📝 質問モード — テキストを選択してね
✓ 質問を送信しました