From all-skills
Guides writing and debugging `.mm` monitor scripts — the DTrace-inspired DSL for instrumenting WebAssembly binaries. Covers match rules, variables, predicates, and bound variable tables.
How this skill is triggered — by the user, by Claude, or both
Slash command
/all-skills:whamm-dslThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
A `.mm` script is the instrumentation program whamm! injects into a WebAssembly binary (or compiles for engine-support). Each script contains global declarations followed by one or more **probes**. whamm! statically analyses match rules to decide which probes apply at each site, folding away constant guards before injection.
.mm Monitor LanguageA .mm script is the instrumentation program whamm! injects into a WebAssembly binary (or compiles for engine-support). Each script contains global declarations followed by one or more probes. whamm! statically analyses match rules to decide which probes apply at each site, folding away constant guards before injection.
For installing whamm! and running instrumented modules, load the companion whamm skill in this plugin.
Activate when:
.mm monitor scripts to instrument WebAssembly binaries.mm filesvar, unshared var, report var, and frame varuse whamm_core;) or the @static/@init call modifiersA .mm file contains, in order:
use declarations — use lib; imports a named library.report var, var, etc. declared at file scope.name(args) -> ret { .. } (NOT YET IMPLEMENTED).provider:package:event:mode / predicate / { actions }
The predicate is optional. Without it: provider:package:event:mode { actions }.
Hierarchy: wasm (provider) → package → event → mode.
| Package | Events | Modes |
|---|---|---|
opcode | any opcode name or glob | before, after, alt |
func | (any function) | entry, exit (unwind planned) |
block | end | (none) |
| (none) | begin, end, report | (none — top-level probes) |
Globbing examples:
wasm:opcode:*:before # all opcodes, before
wasm::*if:before # if + br_if (empty package = wildcard)
wasm:opcode:*load*|*store*:before # all memory loads and stores
wasm:opcode:call|return_call:before
Type bounds narrow polymorphic args: wasm:opcode:call(arg0: i32):before matches only call sites where arg0 is i32.
Full event and bound-variable tables: see references/events.md.
wasm:opcode:call:before / pc == 25 && arg0 == 1 / {
count++;
}
whamm! performs constant folding on static vars (pc, fid, imm0, …). At a site where pc != 25, the probe is not injected at all. At pc == 25 the dynamic guard arg0 == 1 is emitted inline.
Modes:
before — inject before the opcode executes.after — inject after; result vars res0, res1, … hold the opcode's outputs.alt — replace the opcode; call drop_args() to discard its input args.entry / exit — inject at function entry or exit.| Kind | Declared as | Lifetime | Typical use |
|---|---|---|---|
var | var x: T; or var x: T = v; | Reinitialised on each probe invocation | Temporaries |
unshared var | unshared var x: T; | One instance per match site; retained across visits | Per-callsite counters |
report var | report var x: T; | Alias for report unshared var; printed at program end via WASI | Output accumulators |
frame var | frame var x: T; | Stored on the function frame; shared between func:entry and func:exit | Entry→exit state |
shared var | shared var x: T; | Single instance across ALL sites | NOT YET IMPLEMENTED |
Variables declared inside a probe body behave as unshared var by default.
Full type syntax — ints, floats, str, tuples, maps: see references/language.md.
Count every WebAssembly opcode executed:
report var count: u32;
wasm:opcode:*:before {
count++;
}
report var is global and printed automatically when the instrumented module exits (via WASI). No wasm:report block required for simple scalars.
The bound-variable lists in this skill are derived from the whamm documentation. Per /core:anti-fabrication, confirm the exact variables available at a given match rule with whamm info --rule "<rule>" at the installed version rather than assuming — the authoritative set is what the binary reports.
references/language.md — types, var kinds with examples, operators, strings, tuples, maps; functions (planned)references/events.md — full provider hierarchy, available vs planned, all bound-variable tablesreferences/libraries.md — use, whamm_core built-ins, string memory interop, @static/@init, wasm:report overridereferences/examples.md — annotated .mm scripts: instruction count, branch monitor, call graph, cache simulator, string interopCompanion skill for install and CLI: whamm (same plugin).
npx claudepluginhub vinnie357/claude-skills --plugin sbxInstall and operate whamm! to instrument .wasm binaries using DTrace-inspired monitor scripts. Count opcodes, track function calls, choose injection strategies.
Automatically discovers and provides access to WebAssembly skills for development tasks with WASM, WASI, wasm-bindgen, Rust-to-WASM, wasm-pack, and browser runtimes.
Guides Wasmtime for WebAssembly development: compiling Rust/Zig to wasm, embedding in Rust/Elixir hosts, using WASI, and Component Model.