关于 koko
koko 是面向 Koko Elixir 项目的开发技能,供构建或调试其 BEAM Agent 的开发者使用。它涵盖 OTP 模式、架构决策,以及 Koko 与 joelclaw 分阶段、初期只读的集成方式。
主要功能
- 01GenServer 与监督器开发指引
- 02工作负载和事件处理器实现
- 03Redis 桥接约束与阶段
- 04架构变更前检查 ADR
- 05OTP 调试与影子结果对比
适用场景
- 01添加 Koko 工作负载或事件处理器
- 02排查 OTP 监督树和进程崩溃
- 03修改 Redis 事件集成
- 04将影子结果与 TypeScript 对比
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ joelhooks/ joelclaw --skill koko安装后在 Claude Code 中输入/koko确认已加载。
详细介绍
Koko 开发
在开发 Koko Elixir 项目时使用此技能——这是与 joelclaw 同驻 BEAM 的 Agent。
使用场景
- 在 Koko 中构建新的 GenServer、监督器或事件处理器
- 实现工作负载(健康脉冲、事件摘要、影子执行器)
- 将 Koko 接入新的 Redis 通道或 joelclaw 事件
- 调试 OTP 监督树或进程崩溃
- 将 Koko 的影子结果与 TypeScript 对应实现进行比较
触发词:koko、elixir agent、beam、otp、shadow executor、koko workload、koko event、mix
项目位置
- 仓库:
~/Code/joelhooks/koko(github.com/joelhooks/koko) - 主机:Overlook(Mac Mini M4 Pro),可通过
ssh joel@panda访问 - AGENTS.md:完整背景信息位于仓库根目录
ADR 注意事项
实现前务必检查相关 ADR。 Koko 的架构由 ADR 驱动。
| ADR | 标题 | 状态 | URL |
|---|---|---|---|
| 0114 | Elixir/BEAM/Jido 迁移 | proposed | joelclaw.com/adrs/0114-elixir-beam-jido-migration |
| 0115 | Koko 项目章程 | proposed | joelclaw.com/adrs/0115-koko-project-charter |
| 0116 | Redis 桥接协议 | proposed | joelclaw.com/adrs/0116-koko-redis-bridge-protocol |
| 0117 | 首批工作负载 | proposed | joelclaw.com/adrs/0117-koko-first-workloads |
| 0118 | 影子执行器 | proposed | joelclaw.com/adrs/0118-koko-shadow-executor |
添加新工作负载前:查看 ADR-0117 中的工作负载计划,以及 ADR-0118 中的影子执行模式。
更改 Redis 集成前:查看 ADR-0116 中的桥接协议和阶段边界。
进行任何架构变更前:在 ~/Vault/docs/decisions/ 中提出或更新 ADR。
关键约束
- Koko 处于只读状态(第 1 阶段)。 仅作为 PubSub 观察者。不得清空 LPUSH 队列,也不得执行权威写入。
- 仅限影子结果。 写入 Redis 中的
joelclaw:koko:shadow:<function>或本地文件。绝不写入 Typesense、Todoist、网关或任何生产状态。 - Koko 崩溃时,系统不会受到影响。 TypeScript 技术栈不依赖 Koko。
- Redis 位于 localhost:6379 ——Overlook 上的 k8s NodePort。
开发命令
# Run
cd ~/Code/joelhooks/koko
mix deps.get
mix run --no-halt
# Test
mix test
# Interactive
iex -S mix
Koko.events_seen()
# Format
mix format
# Remote (from another machine)
ssh joel@panda "cd ~/Code/joelhooks/koko && mix run --no-halt"
应遵循的 OTP 模式
- 每项关注点使用一个 GenServer ——健康检查器、事件累加器和影子运行器应为独立进程
- 监督器策略:除非进程相互耦合(此时使用
rest_for_one),否则使用one_for_one - 在
handle_info中对事件类型进行模式匹配 ——不要使用 if/else 链 - 所有日志输出都使用
Logger.info("[koko]")前缀 - 尽早崩溃 ——让监督器负责恢复,不要围绕故障编写防御性代码
实现阶段
第 1 阶段:被动观察者(当前)
- 通过 PubSub 订阅
joelclaw:gateway:events✅ - 记录并分类事件 ✅
- 下一步:添加健康脉冲 GenServer(ADR-0117 中的工作负载 1)
第 2 阶段:专用通道
- 为已认领的工作创建
joelclaw:koko:events - TypeScript 将事件分发给 Koko:
LPUSH joelclaw:koko:events <payload> - Koko 将结果写入
joelclaw:koko:results
第 3 阶段:影子执行器
- 将选定的 Inngest 函数镜像为 Koko GenServer
- 使用相同输入并行执行,然后比较结果
- 影子日志位于
joelclaw:koko:shadow:<function>
第 4 阶段:毕业
- Koko 比 TypeScript 更可靠地处理某项工作负载
- 连续 30 天无需人工干预
- 开发体验令人愉快
评论
支持 Markdown