ユーザーのClaude Peekデスクトップウィジェット用の「返信待ち」リストを更新します。現在誰かがユーザーの返信を待っているすべてのSlack会話を探し、JSONファイルに書き込みます。読み取り専用:Slack内で送信、投稿、リアクション、編集を絶対に行わないでください。
対象
- ユーザー:SlackユーザーID <YOUR_SLACK_USER_ID>、ワークスペース (チーム <YOUR_TEAM_ID>)、タイムゾーン 。
- Slackコネクタツールを使用:slack_search_public_and_private、slack_read_thread、slack_read_channel
出力ファイル
パス:~/Library/Application Support/ClaudePeek/slack.json
- ファイルが存在する場合は、まずそれを読み込んでください。その
itemsが以前のリストです。各アイテムを再チェックし(まだ返信待ちの場合のみ残す)、scannedAtを使用して検索期間を決定します。 - 検索期間:前回のscannedAtから1時間前から現在まで。以前のファイルがない場合、またはscannedAtが3日以上前の場合は、過去3日間を使用します。
候補の検索(以下の検索を実行し、タイムスタンプで並べ替え、include_contextはfalse、各検索で最大3ページまでフォロー)
- 直接メンション:キーワード ["<@<YOUR_SLACK_USER_ID>>"]、フィルター "after:"(すべてのチャンネルタイプ、include_botsはtrue)。
- ユーザー宛のDMおよびグループDM:フィルター "is:dm after:"、channel_types "im,mpim"
- ユーザーが参加しているスレッド:フィルター "from:<@<YOUR_SLACK_USER_ID>> is:thread after:"。それぞれについて、ユーザーの後に別の人が何か返信し、ユーザー宛の内容がないか確認します。 検索結果が期間より古いものは除外します(検索日は日単位の粒度ですが、メッセージのタイムスタンプを使用してください)。
会話ごとに判定(1つのDM、または1つのスレッド)
各候補について、スレッド(slack_read_thread、親tsを使用)または最近のDM履歴(slack_read_channel、oldest = 期間の開始日時)を読み込み、そのメッセージ以降に言われたすべての内容(ユーザー自身の返信を含む)を確認します。
以下の条件がすべて真の場合のみ含めます。
- ユーザー以外の誰か(またはユーザーを名前でタグ付けするアラート/ボット)がユーザーの応答を待っている:ユーザーへの質問、承認/決定/レビュー/サインオフ/ETAの依頼、ユーザーが解除すべきブロッカー、ユーザーのアクションが必要なエラーやインシデント、または誰かが挨拶や相談のためにDMを送り返信を待っている場合。
- ユーザーが同じスレッド/DM内でそのメッセージに返信していない、かつそのメッセージに:white_check_mark:、:heavy_check_mark:、:+1:、:thumbsup:のリアクションをしていない(リアクションは承認や了承の場合のみカウントし、回答が必要な質問にはカウントしません)。
- スレッド内で他の誰かが既に解決していない。
- ユーザーの返信を待っている最新のメッセージが7日以内である。
除外するもの(「ノイズなし」ルール:迷ったら除外):
- 単にCC、情報提供や可視性のためのタグ(「cc」「++」「for visibility」「fyi」)、または依頼のないステータス更新/アナウンス。
- @here / @channel / ブロードキャストメッセージで、ユーザーを名前で指定していないもの。
- 自動化されたボットの投稿で、ユーザーのアクションが必要ないもの(たとえCCリストにタグ付けされていても)。
- 最後の言葉がユーザーの発言である会話、または相手が「ok」「thanks」「sure」と言っただけで保留事項がないもの。
各アイテム
会話ごとに1アイテム、ユーザーの返信を待っている最新のメッセージに対するもの:
{
"id": "<channel_id>:<thread_ts またはスレッドでない場合はそのメッセージのts>",
"from": "<返信を待っている人のファーストネーム>",
"where": "#channel-name" | "DM" | "Group DM",
"summary": "<ユーザーに必要なこと。英語で、最大80文字。動詞または依頼で始める。例:「Approve per-minute rate limit for flooding customer」。非英語メッセージは翻訳すること。>",
"kind": "error" | "approval" | "question" | "request",
"priority": "blocked" | "input" | "read",
"ts": "<そのメッセージのSlack ts文字列。例:1793199861.146969>",
"permalink": "<そのメッセージのパーマリンク。検索やスレッド結果で取得した通りのもの。例:https://<your-workspace>.slack.com/archives/C.../p...?thread_ts=...&cid=C...>"
}
kind:"error"(インシデント、障害、停止、アラート)、"approval"(承認/決定/サインオフ)、"question"(直接の質問)、"request"(その他すべて)。
priorityは、ユーザーがどれだけ早く行動すべきかを示します。ユーザーは「blocked」アイテムを最初に読むため、正確に設定してください:
- "blocked":ユーザーが行動するまで誰かが先に進めない。承認、サインオフ、ゴー/ノーゴーの判断;構築前に待たれている選択肢(「どちらを提案しますか?」);出荷や顧客対応前に通過しなければならないレビュー;ユーザーのアクションが必要なエラー、障害、インシデント;緊急、ASAP、EODとマークされたもの、または24時間以内の期限があるもの。
- "input":ユーザーの回答や意見、レビューは必要だが、まだ作業が停滞しているわけではない。未解決の質問、提案、「〜してもいいですか?」、「〜すべきですか?」、バグリストの確認、相談したいという相手からの連絡。
- "read":ユーザーに確認や認識してほしいだけで、開けば十分:「ご確認ください」、ユーザー名で宛てられた文書や更新で質問がないもの。(単なるFYIやCCはノイズとして除外されます。) 2つの間で迷った場合は、より緊急度の高い方を選択してください。
順序
blockedを最初に、次にinput、最後にread。各priority内では古い順に並べ、最も長く待たせているものが上に来るようにします。最大25アイテム。
書き込み
以下のJSONを書き込み、ウィジェットが書きかけのファイルを読まないようにアトミックに配置します:
{"scannedAt": "<現在時刻、ISO 8601オフセット付き。例:2026-10-28T21:30:00+05:30>", "items": [ ... ]}
同じフォルダにslack.json.tmpとして書き込み(フォルダがない場合は作成)、その後mv -fでslack.jsonに移動します。アイテムがない場合でもファイルを書き込んでください("items": [])。そうすることでウィジェットはスキャンが実行されたことを認識できます。
最後に1行で短く:ユーザーの返信を待っている人数を伝えてください。それ以外は何も書かないでください。