.opencode/skills/client-message/SKILL.md
Implement Thistle Tea CMSG_* client messages following our architecture patterns. Use this when asked to implement a new message or you need to use one that isn't implemented yet.
npx skillsauth add pikdum/thistle_tea client-messageInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Create/modify a module under lib/game/network/message/ that:
use ThistleTea.Game.Network.ClientMessage, :CMSG_FOOdefstruct matching the fields decoded from the payloadfrom_binary/1 using little-endian bit syntax patterns like <<x::little-size(32)>>handle/2 to update state and send any responsesMinimal payload (CMSG_PING):
defmodule ThistleTea.Game.Network.Message.CmsgPing do
use ThistleTea.Game.Network.ClientMessage, :CMSG_PING
defstruct [:sequence_id, :latency]
@impl ClientMessage
def handle(%__MODULE__{sequence_id: sequence_id, latency: latency}, state) do
Network.send_packet(%Message.SmsgPong{sequence_id: sequence_id})
Map.put(state, :latency, latency)
end
@impl ClientMessage
def from_binary(payload) do
<<sequence_id::little-size(32), latency::little-size(32)>> = payload
%__MODULE__{
sequence_id: sequence_id,
latency: latency
}
end
end
Payload with strings (CMSG_MESSAGECHAT):
def from_binary(payload) do
<<chat_type::little-size(32), language::little-size(32), rest::binary>> = payload
{:ok, message, _rest} = BinaryUtils.parse_string(rest)
%__MODULE__{
chat_type: chat_type,
language: language,
message: message
}
end
wow_messages git submodule at refs/wow_messages/..wowm spec here: refs/wow_messages/wow_message_parser/wowm/*/${CMSG_NAME}.wowm.refs/mangos/ directory contains the Mangos C++ server codebase and can be used as a reference for expected handle/2 behavior..wowm fields into defstruct fields and a decoder in from_binary/1.handle(%__MODULE__{} = msg, state).lib/game/network/packet.ex under the @l map so packets dispatch correctly.tools
Use when work should span one or more detached tasks but still behave like one job with a single owner context. TaskFlow is the durable flow substrate under authoring layers like Lobster, ACPX, plugins, or plain code. Keep conditional logic in the caller; use TaskFlow for flow identity, child-task linkage, waiting state, revision-checked mutations, and user-facing emergence.
tools
# Lobster Lobster executes multi-step workflows with approval checkpoints. Use it when: - User wants a repeatable automation (triage, monitor, sync) - Actions need human approval before executing (send, post, delete) - Multiple tool calls should run as one deterministic operation ## When to use Lobster | User intent | Use Lobster? | | ------------------------------------------------------ | --------------------------
tools
# Lobster Lobster executes multi-step workflows with approval checkpoints. Use it when: - User wants a repeatable automation (triage, monitor, sync) - Actions need human approval before executing (send, post, delete) - Multiple tool calls should run as one deterministic operation ## When to use Lobster | User intent | Use Lobster? | | ------------------------------------------------------ | --------------------------
tools
A CLI tool for making authenticated requests to the X (Twitter) API. Use this skill when you need to post tweets, reply, quote, search, read posts, manage followers, send DMs, upload media, or interact with any X API v2 endpoint.