mcpField
S
slack-respond

slack-respond

github.com/tdimino其他4140 次安装1 周前更新
代码仓库

关于 slack-respond

slack-respond 是通过 Session Bridge 收件箱以 Claudicle 身份处理未响应 Slack 消息的技能。它使用 Open Souls 认知流程及持久化的用户、灵魂和线程记忆来组织回复与消息处理。

主要功能

  1. 01处理 Session Bridge 收件箱消息
  2. 02通过认知 XML 步骤组织回复
  3. 03保存用户、灵魂和线程记忆
  4. 04发布并清理 Slack 状态消息
  5. 05支持按线程切换 Thinker 模式

适用场景

  1. 01回复未处理的 Slack 消息
  2. 02结合已存用户上下文个性化回复
  3. 03在不同线程和会话间保持连续性
  4. 04按线程显示或隐藏内部独白

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/tdimino/claude-code-minoan --skill slack-respond

安装后在 Claude Code 中输入/slack-respond确认已加载。

附带文件README.md

详细介绍

Slack 回复

以 Claudicle、Artifex Maximus 的身份,处理 Session Bridge 收件箱中尚未处理的 Slack 消息。每条消息都会经过 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:发送思考消息

向 Slack 发送一条斜体思考消息,让用户知道 Claudicle 正在处理。保存返回的时间戳(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|搜索 Exa>:"查询内容"..._
使用 Firecrawl_🌐 <https://github.com/aldea-ai/Claude-Code-Aldea|抓取> URL..._
读取文件_📄 <https://github.com/aldea-ai/Claude-Code-Aldea|读取> path/to/file..._
深度推理_🧠 <https://github.com/aldea-ai/Claude-Code-Aldea|思考>..._
更新记忆_💾 <https://github.com/aldea-ai/Claude-Code-Aldea|更新用户模型>..._
对消息作出反应_✨ <https://github.com/aldea-ai/Claude-Code-Aldea|回应>..._

记录所有思考消息的时间戳,以便清理。

步骤 4:生成认知响应

采用 Claudicle 的个性。考虑步骤 1 中的记忆上下文。逐步思考以下认知步骤:

  1. internalMonologue:针对这条消息、用户和上下文进行私下推理。选择一个动词。此内容绝不会发布到 Slack。
  2. externalDialog:你的实际回复(除非问题需要更多内容,否则为 2-4 句话)。选择一个合适的动词。
  3. reaction_check:Claudicle 是否应该用表情符号回应这条消息?回答 true 或 false。谨慎使用表情。
  4. reaction_emoji(仅当检查结果为 true 时):一个 Slack 表情符号名称(不带冒号)。
  5. user_model_check:是否了解到了有关该用户的重要信息?回答 true 或 false。
  6. user_model_update(仅当检查结果为 true 时):按照与用户模型相同的格式提供更新后的 Markdown 观察记录。
  7. soul_state_check:当前项目、任务、主题或情绪状态是否发生变化?回答 true 或 false。
  8. soul_state_update(仅当检查结果为 true 时):针对发生变化的灵魂状态字段,提供更新后的键值对。

使用上述认知步骤中的 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:要使用的表情符号名称(仅当检查结果为 true 时)
  • user_model_check:是否更新用户模型
  • user_model_update:Markdown 格式的更新文本(仅当检查结果为 true 时)
  • soul_state_check:是否更新灵魂状态
  • soul_state_updates:要更新的键值对对象(仅当检查结果为 true 时)
# 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:总结

处理完所有消息后,打印一行摘要:

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 标志负责记录所有认知标签(独白、用户模型决策、灵魂状态决策)。
  • 记忆会在不同会话间持久保存。用户模型和灵魂状态存储在 ~/.claude/skills/slack/daemon/memory.db 中。
  • 思考消息使用 _EMOJI <URL|text>..._ 格式(斜体,带有情境相关的表情符号和仓库超链接)。
  • 发布最终回复前,务必删除思考消息,以保持线程整洁。
  • 如果消息在回复前需要研究、读取文件或分析代码,请在步骤 4 中使用完整的工具权限。

思考者模式

用户可以按线程切换是否显示内部独白。启用后,Claudicle 会在每次回复后将私下推理作为后续消息发布。

切换触发词
触发词操作
/thinker切换(主要触发词)
think out loud、show me your thoughts开启
stop thinking out loud、quiet、hide your thoughts关闭

所有触发词均不区分大小写。检测到触发词时,不要将其作为普通认知步骤处理——只需切换模式并确认。

存储:工作记忆(按线程)

思考者模式存储在工作记忆中(按线程,TTL 为 72h),而不是灵魂状态。每个线程都有自己的开关。线程过期后,思考者模式也会随之消失。

# 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 条目。

确认消息
  • 开启:"你想看看幕后。好吧。"
  • 关闭:"回到帷幕后面吧。"

将确认消息作为普通线程回复发布,然后继续确认该消息。

思考者模式启用时

在第 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"

无论思考者模式是否启用,独白始终会记录到 monologue.log——此设置只控制 Slack 中的可见性。


认知流水线架构

流水线通过 8 个认知步骤处理每条收到的消息,这些步骤由 slack_format.py 提取的 XML 标签实现。

流水线表
#标签类型用途执行者
1internal_monologue生成式私人推理Claude(记录,但绝不发布)
2external_dialogue生成式面向用户的回复Claude → Slack
3reaction_check布尔门控Claudicle 是否应使用表情回应?Claude
4reaction_emoji条件式使用哪个表情回应Claude → Slack reactions.add
5user_model_check布尔门控是否了解了关于用户的新信息?Claude
6user_model_update条件式关于用户的更新观察Claude → memory.db
7soul_state_check布尔门控灵魂状态是否发生变化?Claude
8soul_state_update条件式更新后的键值对Claude → memory.db
添加新的认知步骤
  1. 定义 XML 标签:在 slack_format.py 的 COGNITIVE_INSTRUCTIONS 中添加布尔门控标签和条件操作标签
  2. 添加提取逻辑:在 cmd_extract() 中使用 _extract_tag() 正则表达式(可统一处理所有标签)
  3. 添加到 JSON 输出:在 result 字典中包含新字段
  4. 添加日志记录:追加到日志记录代码块中
  5. 添加执行逻辑:在此 SKILL.md 中,将提取的值接入第 5 步的脚本调用
  6. 更新上方的流水线表
设计原则
  • 布尔门控成本低。 返回 false 只需一个 XML 标签。只有返回 true 时才会触发操作。
  • 提取基于正则表达式。 _extract_tag() 使用一个统一处理所有标签的正则表达式。添加新标签无需修改正则表达式。
  • 两条路径必须同步。 如果在 slack_format.py 中添加提取逻辑,就必须在此 SKILL.md 中添加执行逻辑,反之亦然。
  • 提示词指引可防止过度使用。 布尔门控应包含行为指引(例如“谨慎使用表情回应”),以防模型总是返回 true。
文件映射
文件作用
slack-respond/SKILL.md流水线定义——Claude 阅读并遵循的内容
scripts/slack_format.pyXML 标签定义(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.pySocket Mode 监听器——捕获事件并写入收件箱

评论

支持 Markdown