Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
102 commits
Select commit Hold shift + click to select a range
8329900
tauri
dakom Dec 23, 2025
8958b37
fix runtime
dakom Dec 23, 2025
8f31190
forward logs
dakom Dec 23, 2025
43849f9
updates
dakom Dec 24, 2025
3dbbeb3
deps
dakom Dec 24, 2025
ac4150a
ci
dakom Dec 24, 2025
16955de
ci
dakom Dec 24, 2025
ccb5de9
ci
dakom Dec 24, 2025
a6c9361
updates
dakom Dec 25, 2025
bcc28ef
ci
dakom Dec 25, 2025
6e747d5
ci
dakom Dec 25, 2025
62afb75
ci
dakom Dec 25, 2025
4383e95
ci
dakom Dec 25, 2025
85f233b
ci
dakom Dec 25, 2025
8cf029d
ci
dakom Dec 25, 2025
e396446
ci
dakom Dec 25, 2025
866ec23
updates
dakom Dec 25, 2025
6adc990
self-signing osx
dakom Dec 25, 2025
89cf5e1
ci
dakom Dec 25, 2025
79c5f14
Use Typescript / React / Vite frontend
JakeHartnell Jan 31, 2026
fe5969e
Use OS keyring for wallet
JakeHartnell Jan 31, 2026
d5d1760
Maybe progress? Still broken PoA / Services
JakeHartnell Jan 31, 2026
b8c82dc
Fixing bugs, health page
JakeHartnell Jan 31, 2026
6104dd7
PoA deployment works
JakeHartnell Feb 18, 2026
bb4bf3e
Logo
JakeHartnell Feb 18, 2026
afb0b3a
Add UI to edit wavs.toml file
JakeHartnell Feb 18, 2026
08419ec
State management (persist services and registries)
JakeHartnell Feb 18, 2026
292558b
Able to fully deploy component + service
JakeHartnell Feb 18, 2026
86bf043
UX improvements
JakeHartnell Feb 18, 2026
e3a896c
Major UX improvements
JakeHartnell Feb 18, 2026
882900a
Better logging.
JakeHartnell Feb 18, 2026
6680606
Rebase fixups
JakeHartnell Feb 19, 2026
3e830d4
More post rebase fixups
JakeHartnell Feb 19, 2026
98b99d4
Clean up
JakeHartnell Feb 19, 2026
edc4ff5
Update wit, rebuild WASM components
JakeHartnell Feb 19, 2026
178a844
Clean up dead code
JakeHartnell Feb 19, 2026
cbb8dcb
Better health indcator
JakeHartnell Feb 19, 2026
6ffbebf
Vite
JakeHartnell Feb 19, 2026
76aaf3d
Hello Claude.
JakeHartnell Feb 19, 2026
363b702
Pause / unpause services, layout improvements
JakeHartnell Feb 19, 2026
213876a
Fix duplicate log entries bug
JakeHartnell Feb 19, 2026
46310f2
Reload services on startup and persist them
JakeHartnell Feb 19, 2026
1fd7f9e
Try to fix CI
JakeHartnell Feb 19, 2026
403783e
Show balances in wallet, small UI tweaks
JakeHartnell Feb 20, 2026
59a2e56
Initial WAVS MCP support
JakeHartnell Feb 24, 2026
5abe743
Fixups
JakeHartnell Feb 24, 2026
809a0c9
MCP server works
JakeHartnell Feb 24, 2026
38e7e24
WAVS MCP improvements
JakeHartnell Feb 24, 2026
11b8f8a
Fixups
JakeHartnell Feb 26, 2026
a6b7a91
PR feedback
JakeHartnell Feb 26, 2026
a7e3c5d
Improved WAVS skill
JakeHartnell Feb 26, 2026
7e5dec1
Further skill improvements
JakeHartnell Feb 26, 2026
337d0f0
Make it easy to install the WAVS skill
JakeHartnell Feb 26, 2026
498afcc
Fix auto start MCP
JakeHartnell Feb 26, 2026
87a14e1
Closer?
JakeHartnell Feb 27, 2026
2a10846
Improvements based on agent feedback
JakeHartnell Feb 27, 2026
c5da1c6
Respond to more AI feedback
JakeHartnell Feb 27, 2026
b801163
More secure defaults
JakeHartnell Feb 27, 2026
5b8d1a6
Add WAVS MCP readme.
JakeHartnell Feb 27, 2026
99a359e
Update MCP and skill with learnings.
JakeHartnell Feb 27, 2026
d050f98
Fix dockerfile
ismellike Feb 27, 2026
3c2010f
Track WIT deps in repo and remove wkg fetch from CI
ismellike Feb 27, 2026
3d4f713
Progress
JakeHartnell Mar 2, 2026
6919f5c
MCP improvements
JakeHartnell Mar 2, 2026
8168f5d
Attempt to fix submissions not showing up in app
JakeHartnell Mar 2, 2026
77fc2d8
Fix services not loading on app restart
JakeHartnell Mar 2, 2026
a583b75
Better aesthetics
JakeHartnell Mar 2, 2026
5a898cc
Fix services reloading on start
JakeHartnell Mar 2, 2026
0bd3945
Update plan
JakeHartnell Mar 2, 2026
b9c6035
Improved activity feed components
JakeHartnell Mar 2, 2026
e11dc21
Environment variables
JakeHartnell Mar 2, 2026
4984823
Suggested Env variables
JakeHartnell Mar 3, 2026
1973f86
Add KV handlers and UI to view KV store
JakeHartnell Mar 3, 2026
23c9be5
WAVS branding.
JakeHartnell Mar 3, 2026
6212f98
Cleanup, try to fix CI
JakeHartnell Mar 3, 2026
ad06b52
Try and fix CI again.
JakeHartnell Mar 3, 2026
42d1113
Cargo fmt
JakeHartnell Mar 3, 2026
e275680
Cleanup justfile, rebuild components
JakeHartnell Mar 3, 2026
c90b5dc
Fix clippy error
JakeHartnell Mar 3, 2026
85867dd
Update release.yml
ismellike Mar 5, 2026
92ab509
Improve WAVS core: persist pause state, async fs handler, optimize Su…
ismellike Mar 5, 2026
5bb1900
Add tests for set_status registry persistence and backward compatibility
ismellike Mar 5, 2026
3b8838a
Better install experience
JakeHartnell Mar 6, 2026
decf6a3
Support claude desktop
JakeHartnell Mar 6, 2026
cca984b
Clean up based on PR feedback
JakeHartnell Mar 11, 2026
048965f
Remove pause service hack
JakeHartnell Mar 11, 2026
011bf59
Improve components UX
JakeHartnell Mar 11, 2026
6381cf2
logs api for mcp
dakom Mar 12, 2026
a47dd83
Address Copilot PR review feedback on logs API
dakom Mar 13, 2026
b90b4b7
Address second round of Copilot PR review feedback
dakom Mar 13, 2026
9e39219
Address third round of Copilot PR review feedback
dakom Mar 13, 2026
e065377
Move EnvFilter to outermost layer in both tracing init branches
dakom Mar 13, 2026
37142d5
Eliminate allocations in level_value and precompute min level per req…
dakom Mar 13, 2026
ea91810
Fix ID ordering, SSE dedup, and next_id computation
dakom Mar 13, 2026
7e01d79
Address fifth round of Copilot PR review feedback
dakom Mar 13, 2026
d80dadd
Remove unused opentelemetry-otlp, opentelemetry_sdk, and opentelemetr…
dakom Mar 13, 2026
58eaaf2
Rebuild post rebase
JakeHartnell Mar 15, 2026
7715d64
pause/resume -> update service
dakom Mar 16, 2026
69bfc04
Merge pull request #1139 from Lay3rLabs/wavs-app-update-service
dakom Mar 16, 2026
bf4c567
Update app/PLAN.md
dakom Mar 16, 2026
791ff57
fix action
dakom Mar 17, 2026
91aee30
bump
dakom Mar 17, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
101 changes: 101 additions & 0 deletions .claude/skills/wavs/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
---
name: wavs
description: >
Develops, deploys, and manages WAVS (WebAssembly-based Actively Validated Services)
components and services using the wavs MCP server. Use when the user wants to build a
WASM component, deploy a new service, update an existing service, or manage service
lifecycle. Triggers on: wavs, wasm component, AVS, service manager,
deploy service, scaffold component.
---

# WAVS Developer Guide

WAVS runs off-chain computation as sandboxed WebAssembly (WASI) components triggered by on-chain events (EVM/Cosmos contract events, cron, block intervals, or manual inputs); execution results are submitted back on-chain through a ServiceManager contract.

---

## MCP Setup

The `wavs:` MCP tools below require `wavs-mcp` to be running and registered with Claude Code.

**One-command setup (recommended)**
```bash
npx @wavs/mcp@latest
```
Interactive wizard: installs the binary, prompts for URL + token + credentials,
writes `~/.claude.json` and `~/.wavs/wavs.toml`, installs skill files.

**Using the WAVS desktop app**
The app auto-starts `wavs-mcp`. Use the "Register with Claude Code" button in
Settings → MCP Server to register for any project path without leaving the app.

**WAVS repo users**
```bash
just setup-claude-mcp [/path/to/project]
```

**CLI / manual setup**
```bash
# 1. Start a WAVS node
just start-wavs-dev

# 2. Run wavs-mcp (in a separate terminal)
./target/release/wavs-mcp --wavs-url http://localhost:8000 --token <token>

# 3. Register with Claude Code
npx @wavs/mcp@latest
```

> **Local tools** (`scaffold_component`, `build_component`, `get_wit_interface`) work without MCP — useful for component development without a running node.

---

## Choose Your Flow

| User Intent | Follow |
|-------------|--------|
| Build a new component from scratch | [`flows/component-dev.md`](flows/component-dev.md) |
| Deploy a new service with an on-chain contract | [`flows/deployment.md`](flows/deployment.md) |
| Update a deployed service with a new component | [`flows/update-service.md`](flows/update-service.md) |

When in doubt, start with **component-dev** — it ends with a deployment step.

---

## MCP Tool Categories

| Category | Tools | Auth Required |
|----------|-------|---------------|
| **Read** | `get_node_info`, `get_health`, `list_services`, `get_service` | None |
| **Write** | `deploy_service`, `delete_service` | `--token` |
| **Dev** | `upload_component`, `save_service`, `simulate_trigger`, `deploy_dev_service`, `query_kv` | Dev endpoints enabled |
| **Chain-write** | `set_service_uri`, `deploy_service_manager`, `deploy_poa_service_manager`, `register_operator` | `WAVS_MCP_CHAIN_CREDENTIAL` env var |
| **Local** | `get_wit_interface`, `scaffold_component`, `build_component` | None |

Full tool reference: [`reference/mcp-tools.md`](reference/mcp-tools.md)

---

## Key Configuration

For on-chain operations, credentials are read from `~/.wavs/wavs.toml` (the WAVS home config):

```toml
[wavs]
mcp_chain_credential = "0x<private-key>"
signing_mnemonic = "word1 word2 ... word12"
```

The WAVS app "Register with Claude" button and `just setup-claude-mcp` write this file automatically.

Dev endpoints must be enabled in `wavs.toml` under `[wavs]`:
```toml
dev_endpoints_enabled = true # Required for upload, save, simulate, deploy_dev
```

---

## Reference

- [`reference/mcp-tools.md`](reference/mcp-tools.md) — All 20 tools with auth requirements and parameter notes
- [`reference/service-json.md`](reference/service-json.md) — Service/trigger JSON formats + simulate examples
200 changes: 200 additions & 0 deletions .claude/skills/wavs/flows/component-dev.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,200 @@
# Component Development Flow

Build, test, and deploy a new WAVS WASM component from scratch.

---

## Checklist

- [ ] **Step 1** — `wavs:wavs_get_wit_interface` — Read WIT definitions to understand available APIs before writing code.
- [ ] **Step 2** — `wavs:wavs_scaffold_component` — Generate project skeleton (`Cargo.toml` + `src/lib.rs`).
- [ ] **Step 3** — Implement logic in `src/lib.rs` using the patterns below.
- [ ] **Step 4** — `wavs:wavs_build_component` — Compile; read stderr and fix errors; repeat until exit code 0.
- [ ] **Step 5** — `wavs:wavs_upload_component` — Upload `.wasm`; save the returned digest (raw 64-char hex, no `sha256:` prefix).
- [ ] **Step 6** — `wavs:wavs_deploy_dev_service` (no on-chain contract) **or** follow [`deployment.md`](deployment.md) for a real deployment.
- [ ] **Step 7** — `wavs:wavs_simulate_trigger` — Verify output.

---

## Scaffold Parameters

```
name: lowercase-with-hyphens (e.g. "price-feed")
trigger_type: evm_contract_event | cosmos_contract_event | block_interval | cron | manual
description: optional one-line description
```

Place the generated component at `examples/components/{name}/` to use workspace deps automatically.

---

## Component Anatomy

Minimal working component using the prelude:

```rust
// Brief description of what this component does.
use example_helpers::prelude::*;

struct Component;

impl Guest for Component {
fn run(action: TriggerAction) -> Result<Vec<WasmResponse>, String> {
let (trigger_id, data) = decode_trigger_event(action.data)?;

// Process `data` bytes and compute output.
let output = data; // echo the raw input for now

Ok(vec![encode_trigger_output(
trigger_id,
&output,
action.config.service_id,
)])
}
}

export_layer_trigger_world!(Component);
```

The prelude re-exports: `Guest`, `TriggerAction`, `WasmResponse`, `decode_trigger_event`, `encode_trigger_output`, `export_layer_trigger_world`, and the `host` module.

Full explicit imports (when you need specific types):

```rust
use example_helpers::bindings::world::{
host,
wavs::operator::{
input::{TriggerAction, TriggerData},
output::WasmResponse,
},
Guest,
};
use example_helpers::export_layer_trigger_world;
use example_helpers::trigger::{decode_trigger_event, encode_trigger_output};
```

---

## Host APIs

```rust
host::config_var("my-key") // → Option<String>; reads service config
host::log(host::LogLevel::Info, "msg"); // levels: Debug, Info, Warn, Error
host::get_service() // → ServiceInfo (manager address, config, etc.)
host::get_event_id(None) // deterministic event ID (default salt)
host::get_event_id(Some(salt)) // custom salt (Vec<u8>)
```

---

## Trigger Type Patterns

```rust
match action.data {
TriggerData::EvmContractEvent(_) | TriggerData::CosmosContractEvent(_) => {
let (trigger_id, data) = decode_trigger_event(action.data)?;
}
TriggerData::Raw(bytes) => {
// Plain bytes — trigger_id is 0 for raw/manual triggers.
let data = bytes;
}
TriggerData::Cron { trigger_time } => {
// trigger_time: unix timestamp (u64)
}
TriggerData::BlockInterval { block_height } => {
// block_height: u64
}
_ => return Err("unsupported trigger type".to_string()),
}
```

---

## WASI APIs

### Key-Value Store

```rust
use example_helpers::bindings::world::wasi::keyvalue::{store, atomics};

let bucket = store::open("my-bucket").map_err(|e| e.to_string())?;
let value: Option<Vec<u8>> = bucket.get("key").map_err(|e| e.to_string())?;
bucket.set("key", &bytes).map_err(|e| e.to_string())?;
let new_val = atomics::increment(&bucket, "counter", 1).map_err(|e| e.to_string())?;
```

### Outbound HTTP

```rust
use wstd::runtime::block_on;

let bytes = block_on(async {
let resp = wstd::http::Client::new()
.get("https://api.example.com/data")
.send()
.await?;
resp.bytes().await
})?;
```

---

## Cargo.toml Template

Place at `examples/components/{name}/Cargo.toml`:

```toml
[package]
name = "{name}"
edition.workspace = true

[lib]
crate-type = ["cdylib"]

[package.metadata.component]
package = "wavs-user:{name}"

[dependencies]
example-helpers = { path = "../../_helpers" }
serde = { version = "1", features = ["derive"] }
serde_json = "1"
# Add for KV store or outbound HTTP:
# wstd = { workspace = true }
```

---

## Build Output Paths

After `wavs_build_component` (release mode):
```
target/wasm32-wasip1/release/{package_name_with_underscores}.wasm
```

After `just wasi-build-native {component-name}` (from repo root):
```
examples/build/components/{component-name}.wasm
```

Use the **absolute path** when calling `wavs_upload_component`.

---

## Debugging

**Build errors** (read `stderr` from `wavs_build_component`):
- `cannot find type` / `unresolved import` — check `example-helpers` path; try `use example_helpers::prelude::*`
- `the trait bound is not satisfied` — `encode_trigger_output` needs `&[u8]` or `AsRef<[u8]>`
- `does not implement Guest` — ensure `export_layer_trigger_world!(Component)` is present

**Runtime errors** (from `wavs_simulate_trigger`):
- Error message comes directly from your `?` or `return Err(...)` calls
- Add `host::log(host::LogLevel::Debug, &format!("data: {:?}", data))` and re-simulate

**Missing config vars** — component returns `"config var X not found"`:
- Service definition must include the key in its `config` map
- Verify with `wavs_get_service`

**Wrong trigger type** — `"unsupported trigger data type"`:
- The `match` must cover the trigger type configured in the service definition
- Use `TriggerData::Raw` for manual/simulation testing
Loading
Loading