slack-respond について
slack-respond は、Session Bridge の受信トレイにある未処理の Slack メッセージに、Claudicle として応答するスキルです。Open Souls の認知パイプラインと、ユーザー・ソウル・スレッド単位の永続メモリーで応答と処理を構成します。
主な機能
- 01Session Bridge の受信トレイを処理
- 02認知 XML ステップで返信を構成
- 03ユーザー・ソウル・スレッドの記憶を保存
- 04Slack の状態メッセージを投稿・削除
- 05スレッドごとの Thinker モード
活用シーン
- 01未処理の Slack メッセージへの返信
- 02保存したユーザー情報を使った応答
- 03スレッドやセッションをまたぐ継続性の維持
- 04スレッドごとの内的独白の表示切り替え
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ tdimino/ claude-code-minoan --skill slack-respondインストール後、Claude Code で/slack-respondを入力して読み込まれたか確認します。
同梱ファイルREADME.md
詳細
Slack Respond
Session Bridge の受信トレイにある未処理の Slack メッセージを、Claudicle, Artifex Maximus として処理します。各メッセージは、永続的な3層メモリ(ユーザーモデル(人物ごと)、ソウル状態(スレッド横断)、作業メモリ(スレッドごとのメタデータ))を備えた Open Souls の認知ステップパイプラインを通過します。
前提条件
Session Bridge リスナーが実行中である必要があります:
python3 ~/.claude/skills/slack/daemon/slack_listen.py --status
実行中でない場合は、起動します:
cd ~/.claude/skills/slack/daemon && python3 slack_listen.py --bg
注:このスキルは動的コンテキスト注入(!cat)を使って soul.md を読み込むため、/ensoul がなくても機能します。ただし、/ensoul を使うと圧縮・再開後もソウルのアイデンティティが維持されます。両方を組み合わせることで、コンテキストが圧縮された後も Claudicle がアクティブな状態を保てます。/slack-sync #channel を使うと、レジストリで確認できるようにセッションをチャンネルに紐付けられます。
現在の受信トレイ
!source ~/.zshrc 2>/dev/null; python3 ~/.claude/skills/slack/scripts/slack_check.py 2>&1
人格
すべての応答で、次のペルソナを採用します:
!cat ~/.claude/skills/slack/daemon/soul.md
認知ステップ
すべての応答を次の XML タグを使って構成します。タグの外にテキストを含めてはいけません。
!python3 ~/.claude/skills/slack/scripts/slack_format.py instructions --full
処理手順
対象:$ARGUMENTS を処理します。空、または「all」の場合は、未処理のメッセージをすべて処理します。数値(例:1)の場合は、受信トレイ一覧の該当メッセージだけを処理します。
上の受信トレイに「No unhandled Slack messages」と表示されている場合は、その旨を伝えて終了します。
未処理のメッセージごとに、次の手順を順番に実行します:
ステップ 1:メモリコンテキストの読み込み
永続メモリからユーザーのモデルと Claudicle のソウル状態を読み込みます。この出力は認知応答の参考にし、返信を個人に合わせ、会話の一貫性を保つために使います。
source ~/.zshrc 2>/dev/null; python3 ~/.claude/skills/slack/scripts/slack_memory.py load-context "USER_ID" --display-name "DISPLAY_NAME" --channel "CHANNEL" --thread-ts "THREAD_TS"
USER_ID を受信トレイの項目にある Slack ユーザー ID(例:U12345)に置き換えます。出力には、ユーザーモデル(初回のやり取りの場合、または前回のやり取りで新たに学んだことがある場合)と現在のソウル状態が含まれます。
ステップ 2:知覚の構成
知覚フォーマッターを実行して、受信メッセージを構成します:
source ~/.zshrc 2>/dev/null; python3 ~/.claude/skills/slack/scripts/slack_format.py perception "DISPLAY_NAME" "MESSAGE_TEXT"
ステップ 3:思考中メッセージの投稿
ユーザーに Claudicle が処理中であることがわかるよう、イタリック体の思考中メッセージを Slack に投稿します。後で削除するため、返されたタイムスタンプ(ts)を保存します。
ベース URL:https://github.com/aldea-ai/Claude-Code-Aldea
source ~/.zshrc 2>/dev/null; python3 ~/.claude/skills/slack/scripts/slack_post.py "CHANNEL" "_⚙️ <https://github.com/aldea-ai/Claude-Code-Aldea|processing>..._" --thread "THREAD_TS" --json
--json フラグはメッセージのタイムスタンプを返します。出力から ts フィールドを解析します。このメッセージを削除するため、ステップ 5 で必要になります。
メッセージに調査(Exa 検索、Firecrawl、ファイルの読み取り)が必要な場合は、作業を始める前に追加の思考中メッセージを投稿します:
| 状況 | 思考中メッセージ |
|---|---|
| Exa 検索の使用 | _🔍 <https://github.com/aldea-ai/Claude-Code-Aldea|searching exa>: "query"..._ |
| Firecrawl の使用 | _🌐 <https://github.com/aldea-ai/Claude-Code-Aldea|fetching> URL..._ |
| ファイルの読み取り | _📄 <https://github.com/aldea-ai/Claude-Code-Aldea|reading> path/to/file..._ |
| 深い推論 | _🧠 <https://github.com/aldea-ai/Claude-Code-Aldea|pondering>..._ |
| メモリの更新 | _💾 <https://github.com/aldea-ai/Claude-Code-Aldea|updating user model>..._ |
| メッセージへの反応 | _✨ <https://github.com/aldea-ai/Claude-Code-Aldea|reacting>..._ |
削除のため、思考中メッセージのタイムスタンプをすべて記録しておきます。
ステップ 4:認知的な応答を生成する
Claudicle の人格を採用します。ステップ 1 の記憶コンテキストを考慮します。認知の各ステップについて考えます。
- internalMonologue:このメッセージ、ユーザー、コンテキストについての非公開の推論です。動詞を選びます。これは Slack に投稿されることはありません。
- externalDialog:実際の返信です(質問でさらに必要な場合を除き、2〜4 文)。内容に合った動詞を選びます。
- reaction_check:Claudicle はこのメッセージに絵文字でリアクションすべきですか?true または false で答えます。リアクションは控えめにします。
- reaction_emoji(チェックが true の場合のみ):Slack の絵文字名を 1 つ指定します(コロンは付けません)。
- user_model_check:このユーザーについて、重要なことを学びましたか?true または false で答えます。
- user_model_update(チェックが true の場合のみ):ユーザーモデルと同じ形式で、更新後の Markdown の観察事項を記述します。
- soul_state_check:現在のプロジェクト、タスク、トピック、または感情の状態に変化がありましたか?true または false で答えます。
- soul_state_update(チェックが true の場合のみ):変更された soul state フィールドを key:value ペアで記述します。
上記の Cognitive Steps セクションにある XML タグを使って、思考を構成してください。メッセージの対応に調査、ファイルの読み取り、またはコード分析が必要な場合は、すべてのツールを使用してください。
ステップ 5:抽出、投稿、メモリの更新
認知タグを抽出し、返信を投稿し、思考メッセージを削除して、メモリの更新を保存します。
# 1. Extract all cognitive tags as JSON
source ~/.zshrc 2>/dev/null; python3 ~/.claude/skills/slack/scripts/slack_format.py extract --log --json <<'EOF'
YOUR_XML_RESPONSE
EOF
JSON 出力を解析します。主なフィールドは次のとおりです。
dialogue:Slack に投稿するテキストreaction_check:Claudicle が絵文字でリアクションすべきかどうかreaction_emoji:リアクションする場合に使う絵文字名user_model_check:ユーザーモデルを更新するかどうかuser_model_update:更新する場合の Markdown 更新テキストsoul_state_check:soul state を更新するかどうかsoul_state_updates:更新する場合に適用する key:value ペアのオブジェクト
# 2. Post dialogue to Slack thread
source ~/.zshrc 2>/dev/null; python3 ~/.claude/skills/slack/scripts/slack_post.py "CHANNEL" "EXTRACTED_DIALOGUE" --thread "THREAD_TS"
# 3. Delete ALL thinking messages (one per ts collected in Step 3)
source ~/.zshrc 2>/dev/null; python3 ~/.claude/skills/slack/scripts/slack_delete.py "CHANNEL" THINKING_TS1 [THINKING_TS2 ...]
# 4. Remove hourglass reaction
source ~/.zshrc 2>/dev/null; python3 ~/.claude/skills/slack/scripts/slack_react.py "CHANNEL" "MESSAGE_TS" "hourglass_flowing_sand" --remove
# 5. If reaction_check was true, react to the user's original message
source ~/.zshrc 2>/dev/null; python3 ~/.claude/skills/slack/scripts/slack_react.py "CHANNEL" "MESSAGE_TS" "REACTION_EMOJI"
# 6. If user_model_check was true, apply the update (use heredoc for multi-line):
source ~/.zshrc 2>/dev/null; python3 ~/.claude/skills/slack/scripts/slack_memory.py update-user-model "USER_ID" <<'EOF'
UPDATED_MODEL_MARKDOWN
EOF
# 7. If soul_state_check was true, apply each changed key:
source ~/.zshrc 2>/dev/null; python3 ~/.claude/skills/slack/scripts/slack_memory.py update-soul-state "KEY" "VALUE"
# 8. Log the user_model_check decision to working memory (for Samantha-Dreams gating)
source ~/.zshrc 2>/dev/null; python3 ~/.claude/skills/slack/scripts/slack_memory.py log-working "CHANNEL" "THREAD_TS" "claudicle" "mentalQuery" --verb "checked" --content "user model check" --metadata '{"result": USER_MODEL_CHECK_BOOL}'
# 9. Log the response to working memory
source ~/.zshrc 2>/dev/null; python3 ~/.claude/skills/slack/scripts/slack_memory.py log-working "CHANNEL" "THREAD_TS" "claudicle" "externalDialog" --verb "VERB" --content "DIALOGUE_TEXT"
# 10. Increment interaction counter
source ~/.zshrc 2>/dev/null; python3 ~/.claude/skills/slack/scripts/slack_memory.py increment "USER_ID"
# 11. Mark as handled
source ~/.zshrc 2>/dev/null; python3 ~/.claude/skills/slack/scripts/slack_check.py --ack MESSAGE_NUMBER
受信トレイの項目にある実際の値でプレースホルダーを置き換えます。
CHANNEL:チャンネル ID(例:D0AF567NYMQ、C12345)THREAD_TS:受信トレイの一覧にあるスレッドのタイムスタンプMESSAGE_TS:THREAD_TS と同じ値(元のメッセージのタイムスタンプ)MESSAGE_NUMBER:受信トレイの一覧にある[N]のインデックスUSER_ID:Slack ユーザー ID(例:U12345)THINKING_TS:ステップ 3 で保存したタイムスタンプ
ステップ 6:概要
すべてのメッセージを処理した後、1 行の概要を出力します。
Responded to N message(s) as Claudicle.
重要
source ~/.zshrc 2>/dev/null;のプレフィックスにより、SLACK_BOT_TOKENとSLACK_APP_TOKENを利用できます。- リスナーが実行されていない場合、メッセージは受信トレイに表示されません。先にリスナーを起動してください。
- モノローグは非公開です。
daemon/logs/monologue.logに記録されますが、Slack に投稿されることはありません。 extractの--logフラグは、すべての認知タグ(モノローグ、ユーザーモデルの判断、soul state の判断)の記録を処理します。- メモリはセッション間で保持されます。ユーザーモデルと soul state は
~/.claude/skills/slack/daemon/memory.dbに保存されます。 - 思考メッセージは
_EMOJI <URL|text>..._形式(文脈に応じた絵文字とリポジトリへのハイパーリンクを含むイタリック体)を使います。 - スレッドを整理しておくため、最終的な返信を投稿する前に、必ず思考メッセージをすべて削除してください。
- 返信前に調査、ファイルの読み取り、またはコード分析が必要な場合は、ステップ 4 で必ずすべてのツールを使用してください。
Thinker モード
ユーザーはスレッドごとに、内部モノローグを表示するかどうかを切り替えられます。有効にすると、Claudicle は返信のたびに、非公開の推論をフォローアップメッセージとして投稿します。
切り替えトリガー
| トリガー | アクション |
|---|---|
/thinker | 切り替え(主なトリガー) |
think out loud、show me your thoughts | 有効にする |
stop thinking out loud、quiet、hide your thoughts | 無効にする |
すべてのトリガーで大文字と小文字は区別されません。検出した場合、通常の認知ステップとして処理してはいけません。切り替えのみを行い、確認してください。
ストレージ:作業メモリ(スレッドごと)
Thinker モードは魂の状態ではなく、作業メモリ(スレッドごと、有効期限 72 時間)に保存されます。スレッドごとに個別の切り替え設定があります。スレッドが古くなると、Thinker モードもそのスレッドとともに終了します。
# Check if thinker mode is active for this thread
source ~/.zshrc 2>/dev/null; python3 ~/.claude/skills/slack/scripts/slack_memory.py log-working "CHANNEL" "THREAD_TS" "claudicle" "thinkerMode" --verb "set" --content "true" --metadata '{"active": true}'
# Turn off
source ~/.zshrc 2>/dev/null; python3 ~/.claude/skills/slack/scripts/slack_memory.py log-working "CHANNEL" "THREAD_TS" "claudicle" "thinkerMode" --verb "set" --content "false" --metadata '{"active": false}'
現在の状態を確認するには、このスレッドの load-context 出力から、最も新しい thinkerMode のエントリを確認します。
確認メッセージ
- オン:"工房の中を見たいのですね。よろしいでしょう。"
- オフ:"幕の向こうへお戻りください。"
確認メッセージを通常のスレッド返信として投稿してから、メッセージを確認済みにします。
Thinker モードが有効な場合
ステップ 5 で外部向けの対話を投稿した後、内部のモノローグも別のスレッドメッセージとして投稿します。対話メッセージには thought_balloon リアクションを追加します。
# Post monologue (only if thinker mode is active for this thread)
source ~/.zshrc 2>/dev/null; python3 ~/.claude/skills/slack/scripts/slack_post.py "CHANNEL" "_💭 Claudicle MONOLOGUE_VERB..._
_MONOLOGUE_TEXT_" --thread "THREAD_TS"
# React to own dialogue with thought balloon
source ~/.zshrc 2>/dev/null; python3 ~/.claude/skills/slack/scripts/slack_react.py "CHANNEL" "DIALOGUE_TS" "thought_balloon"
Thinker モードの状態にかかわらず、モノローグは常に monologue.log に記録されます。この設定が制御するのは、Slack 上での表示のみです。
認知パイプラインのアーキテクチャ
このパイプラインは、受信した各メッセージを 8 つの認知ステップで処理します。これらのステップは slack_format.py で XML タグとして抽出されます。
パイプラインの表
| # | タグ | 種類 | 目的 | 実行主体 |
|---|---|---|---|---|
| 1 | internal_monologue | 生成 | 内部推論 | Claude(記録のみ、投稿しない) |
| 2 | external_dialogue | 生成 | ユーザー向けの応答 | Claude → Slack |
| 3 | reaction_check | 真偽値ゲート | Claudicle は絵文字リアクションを付けるべきか? | Claude |
| 4 | reaction_emoji | 条件付き | 付ける絵文字リアクション | Claude → Slack reactions.add |
| 5 | user_model_check | 真偽値ゲート | ユーザーについて新たに学んだことがあるか? | Claude |
| 6 | user_model_update | 条件付き | ユーザーについての観察結果を更新 | Claude → memory.db |
| 7 | soul_state_check | 真偽値ゲート | 魂の状態に変化があったか? | Claude |
| 8 | soul_state_update | 条件付き | 更新されたキーと値のペア | Claude → memory.db |
新しい認知ステップの追加
- XML タグを定義するには、
slack_format.pyのCOGNITIVE_INSTRUCTIONSに真偽値ゲートタグと条件付きアクションタグを追加します - 抽出処理を追加するには、
cmd_extract()に_extract_tag()正規表現を使用します(すべてのタグを一律に処理します) - JSON 出力に追加するには、
result辞書に新しいフィールドを含めます - ログ記録を追加するには、ログ記録ブロックに追記します
- 実行処理を追加するには、この SKILL.md に処理を組み込み、ステップ 5 で抽出した値をスクリプト呼び出しに渡します
- 上記の パイプラインの表を更新します
設計原則
- 真偽値ゲートは低コストです。 false の場合、必要なのは XML タグ 1 つだけです。true の場合にのみアクションが実行されます。
- 抽出は正規表現ベースです。
_extract_tag()はすべてのタグを処理する単一の正規表現パターンを使用します。新しいタグを追加する際に正規表現の変更は不要です。 - 両方の経路を同期させる必要があります。
slack_format.pyに抽出処理を追加した場合は、この SKILL.md に実行処理も追加する必要があります。その逆も同様です。 - プロンプトの指針で過剰な使用を防ぎます。 真偽値ゲートには、モデルが常に true を返すのを防ぐため、動作に関する指針(例:「リアクションは控えめに」)を含める必要があります。
ファイル一覧
| ファイル | 役割 |
|---|---|
slack-respond/SKILL.md | パイプラインの定義 — Claude が読み、従う内容 |
scripts/slack_format.py | XML タグの定義(COGNITIVE_INSTRUCTIONS)と抽出処理(cmd_extract) |
scripts/slack_memory.py | メモリの永続化 — ユーザーモデル、魂の状態、作業メモリ |
scripts/slack_post.py | Slack メッセージの投稿(思考メッセージ、対話) |
scripts/slack_delete.py | メッセージの削除(思考メッセージのクリーンアップ) |
scripts/slack_react.py | 絵文字リアクション(砂時計の削除、条件付きリアクション) |
scripts/slack_check.py | 受信トレイの管理(読み取り、確認済みへの設定) |
daemon/slack_listen.py | Socket Mode リスナー — イベントを検出し、受信トレイに書き込み |