Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
204 commits
Select commit Hold shift + click to select a range
94485ed
docs: initialize project
JakeHartnell Mar 24, 2026
f84f4ff
chore: add project config
JakeHartnell Mar 24, 2026
ec358c4
docs: complete project research for WAVS platform extensions
JakeHartnell Mar 24, 2026
6b501aa
docs: define v1 requirements
JakeHartnell Mar 24, 2026
7068b77
docs: create roadmap (3 phases)
JakeHartnell Mar 24, 2026
ae338fd
docs(phase-1): research OCI component pull domain
JakeHartnell Mar 24, 2026
095cb81
docs(01-oci-component-pull): create phase plan (2 plans, 2 waves)
JakeHartnell Mar 24, 2026
b6f54e1
fix(01): revise Plan 02 based on checker feedback
JakeHartnell Mar 24, 2026
ae42245
feat(01-01): add ComponentSource::Oci variant and change digest() to …
JakeHartnell Mar 24, 2026
9befd4d
feat(01-01): create OCI puller module with URI parsing and authentica…
JakeHartnell Mar 24, 2026
ca18593
docs(01-01): complete OCI component pull types and puller plan
JakeHartnell Mar 24, 2026
7a08124
chore(01-01): update Cargo.lock for oci-client and oci-wasm deps
JakeHartnell Mar 24, 2026
77d273c
docs(01-01): update STATE.md with plan 01 completion status and decis…
JakeHartnell Mar 24, 2026
0654811
feat(01-02): wire OCI pull into base_engine.rs with tuple return type
JakeHartnell Mar 24, 2026
292047a
fix(01-02): fix all digest() call sites and handle Option return type
JakeHartnell Mar 24, 2026
ca5add3
docs(01-02): complete OCI engine integration plan
JakeHartnell Mar 24, 2026
223cde3
test(01): persist human verification items as UAT
JakeHartnell Mar 24, 2026
bc27d33
docs(phase-01): complete phase execution
JakeHartnell Mar 24, 2026
fa0e33b
docs(phase-01): evolve PROJECT.md after phase completion
JakeHartnell Mar 24, 2026
553bacf
docs(02): capture phase context
JakeHartnell Mar 24, 2026
33ef1a7
docs(02): research WIT-to-schema tooling domain
JakeHartnell Mar 25, 2026
a1f2730
docs(02): create phase plan for WIT-to-Schema tooling
JakeHartnell Mar 25, 2026
1167147
fix(02): revise plans based on checker feedback
JakeHartnell Mar 25, 2026
6a06bfb
test(02-01): add failing tests for wit-schema crate
JakeHartnell Mar 25, 2026
50210cd
feat(02-01): implement wit-schema core type conversion and export tra…
JakeHartnell Mar 25, 2026
afc10ec
feat(02-01): add schema cache and doc comment enrichment
JakeHartnell Mar 25, 2026
f98ed3f
docs(02-01): complete wit-schema library crate plan
JakeHartnell Mar 25, 2026
feb6fea
feat(02-02): wire wit-schema library into CLI as wit-schema subcommand
JakeHartnell Mar 25, 2026
ed127b4
docs(02-02): complete wit-schema CLI wiring plan summary
JakeHartnell Mar 25, 2026
64c0091
docs(phase-02): complete phase execution — WIT-to-Schema Tooling
JakeHartnell Mar 25, 2026
c635178
docs(03): capture phase context
JakeHartnell Mar 25, 2026
878b6ef
docs(phase-03): research MCP execution interface domain
JakeHartnell Mar 25, 2026
cea0400
docs(03): create phase plan for MCP Execution Interface
JakeHartnell Mar 25, 2026
77285b1
fix(03): revise plans based on checker feedback
JakeHartnell Mar 25, 2026
2346b41
feat(03-01): add exec.rs module with execution types, service cache, …
JakeHartnell Mar 25, 2026
23507a9
feat(03-01): add POST /dev/execute endpoint and WavsClient execute_co…
JakeHartnell Mar 25, 2026
9068800
docs(03-01): complete execution foundation plan
JakeHartnell Mar 25, 2026
b9caf9d
chore(03-01): update Cargo.lock for wavs-mcp dependency additions
JakeHartnell Mar 25, 2026
5eca2d8
feat(03-02): add dynamic exec tool generation and Tier 1 execution di…
JakeHartnell Mar 25, 2026
674b67e
feat(03-02): wire exec tools into MCP server — list_tools, call_tool,…
JakeHartnell Mar 25, 2026
8ecc337
docs(03-02): complete exec tool pipeline plan summary
JakeHartnell Mar 25, 2026
feb2781
feat(03-03): add exec_enabled field and implement Tier 2 signed_resul…
JakeHartnell Mar 25, 2026
7e0a34c
docs(03-03): complete Tier 2/3 trust tiers plan
JakeHartnell Mar 25, 2026
7c30962
Update skill
JakeHartnell Mar 25, 2026
3aa4037
embed agent sidebar directly in in WAVS app
noahsaso Apr 3, 2026
ed6a5b9
updated wavs-mcp component scaffold logic, support new standalone mod…
noahsaso Apr 4, 2026
ff7acf0
coerce bool and number into strings for MCP tool JSON parsing
noahsaso Apr 4, 2026
8fe36c2
add app services page auto refresh
noahsaso Apr 4, 2026
059ca2e
streamline dev tools to prevent agent mistakes
noahsaso Apr 4, 2026
1cec35a
added hint to use ui_open_service to navigate to created service
noahsaso Apr 4, 2026
62f81d5
improve ui navigation tool, and encourage agent to navigate to servic…
noahsaso Apr 4, 2026
c8c8aee
update skill instructions to encourage navigating to service immediately
noahsaso Apr 4, 2026
9026d2d
docs(04): auto-generated context (infrastructure phase)
JakeHartnell Apr 7, 2026
7bdd76c
docs(04): research phase rust event foundation
JakeHartnell Apr 7, 2026
a5e0005
docs(04): create phase plan for rust event foundation
JakeHartnell Apr 7, 2026
57baf27
docs(04): plans verified, ready to execute
JakeHartnell Apr 7, 2026
bdf8413
feat(04-01): add correlation_id to TriggerAction and update all const…
JakeHartnell Apr 7, 2026
033b0bb
feat(04-01): add SubmissionFailed event path and carry correlation_id…
JakeHartnell Apr 7, 2026
a36a9f6
feat(04-01): mirror Rust event changes in TypeScript types and Tauri …
JakeHartnell Apr 7, 2026
b8f3bff
docs(04-01): complete plan summary for correlation_id and SubmissionF…
JakeHartnell Apr 7, 2026
765e39c
docs(04): phase complete — verification passed, roadmap updated
JakeHartnell Apr 7, 2026
2cd10ad
docs: add Phase 5 (Settings Decomposition) and Phase 6 (Unified Activ…
JakeHartnell Apr 7, 2026
494381b
docs(05): smart discuss context
JakeHartnell Apr 7, 2026
4849189
docs(05): UI design contract for settings decomposition
JakeHartnell Apr 7, 2026
59a2233
docs(05): UI design contract approved
JakeHartnell Apr 7, 2026
9a0bcc8
docs(05): research settings decomposition phase
JakeHartnell Apr 7, 2026
b92096b
docs(05): create phase plan for settings decomposition
JakeHartnell Apr 7, 2026
604dad9
docs(05): plans verified, ready to execute (2 plans, 2 waves)
JakeHartnell Apr 7, 2026
f3a74f0
feat(05-01): create SettingsSidebar component with SectionKey type
JakeHartnell Apr 7, 2026
2c0e279
feat(05-01): extract WalletSection, NodeSection, and EnvironmentSecti…
JakeHartnell Apr 7, 2026
f14c6f1
feat(05-01): rewrite Settings.tsx as sidebar-navigated orchestrating …
JakeHartnell Apr 7, 2026
cc881cf
docs(05-01): complete settings sidebar layout and section extraction …
JakeHartnell Apr 7, 2026
aee74f0
feat(05-02): extract AgentSection, McpSection, ResetSection; finalize…
JakeHartnell Apr 7, 2026
a9c6b3e
docs(05-02): complete settings decomposition plan summary
JakeHartnell Apr 7, 2026
1443768
test(05): persist human verification items as UAT
JakeHartnell Apr 7, 2026
f8fa9ed
docs(05): phase complete — settings decomposition done, human validat…
JakeHartnell Apr 7, 2026
a696846
docs(06): smart discuss context
JakeHartnell Apr 7, 2026
9f10a4f
docs(06): UI design contract
JakeHartnell Apr 7, 2026
b8720c6
docs(06): UI design contract approved
JakeHartnell Apr 7, 2026
b143925
docs(06): research unified activity frontend phase
JakeHartnell Apr 7, 2026
ab1d08c
docs(06): create phase plan
JakeHartnell Apr 7, 2026
a751560
docs(06): plans verified, ready to execute (2 plans, 2 waves)
JakeHartnell Apr 7, 2026
1db2422
feat(06-01): create useGroupedActivity hook with GroupedActivityEvent…
JakeHartnell Apr 7, 2026
be56461
feat(06-01): add ERR-02 eviction guard for failed events in appStore
JakeHartnell Apr 7, 2026
24bf1dd
docs(06-01): complete grouped activity data model plan
JakeHartnell Apr 7, 2026
938121d
feat(06-02): create GroupedActivityCard component with status dots an…
JakeHartnell Apr 7, 2026
3e17f3e
feat(06-02): refactor ActivityFeed with status filter tabs and groupe…
JakeHartnell Apr 7, 2026
c96a6e3
docs(06-02): complete unified activity frontend plan
JakeHartnell Apr 7, 2026
9f83967
test(06): verification report
JakeHartnell Apr 7, 2026
09b60fa
docs(06): phase complete — unified activity frontend done, human vali…
JakeHartnell Apr 7, 2026
c0623d4
docs: milestone v1.0 audit report
JakeHartnell Apr 7, 2026
8704e68
chore: complete v1.0 milestone — archive, evolve PROJECT.md, reorgani…
JakeHartnell Apr 7, 2026
d73de8a
docs: start milestone v1.1 Open Source AI Providers & Settings UX
JakeHartnell Apr 8, 2026
8e8dae4
docs: complete project research
JakeHartnell Apr 8, 2026
a236679
docs: complete project research
JakeHartnell Apr 8, 2026
98655a3
docs: define milestone v1.1 requirements
JakeHartnell Apr 8, 2026
e036c1a
docs: create milestone v1.1 roadmap (3 phases)
JakeHartnell Apr 8, 2026
d404d66
docs(07): smart discuss context
JakeHartnell Apr 8, 2026
37f7200
docs(07): research Groq & OpenRouter providers phase
JakeHartnell Apr 8, 2026
a21cfac
docs(07): create phase plan for Groq & OpenRouter providers
JakeHartnell Apr 8, 2026
ca2ef45
feat(07-01): add Groq and OpenRouter to agent provider dropdown
JakeHartnell Apr 8, 2026
3ab2b95
feat(07-01): read saved provider/model from settings.json at sidecar …
JakeHartnell Apr 8, 2026
48ea9ee
docs(07-01): complete Groq/OpenRouter provider plan summary
JakeHartnell Apr 8, 2026
92e05b3
docs(07-01): mark plan complete after human-verify approval
JakeHartnell Apr 8, 2026
f4d049e
fix(07-01): restore Groq/OpenRouter code reverted by continuation agent
JakeHartnell Apr 8, 2026
ecf8dfc
docs(phase-07): complete phase execution
JakeHartnell Apr 8, 2026
f61cd47
docs(08): smart discuss context
JakeHartnell Apr 8, 2026
00257d0
docs(08): research ollama provider phase
JakeHartnell Apr 8, 2026
8d41a56
docs(08): create phase plan for Ollama provider
JakeHartnell Apr 8, 2026
faacf66
feat(08-01): add Ollama to settings UI with conditional base URL field
JakeHartnell Apr 8, 2026
ddd0a72
feat(08-01): generate models.json in Rust and switch sidecar to Model…
JakeHartnell Apr 8, 2026
eff5551
docs(08-01): complete Ollama provider plan summary
JakeHartnell Apr 8, 2026
2a69f22
docs(08-01): complete Ollama provider plan - task 3 human verificatio…
JakeHartnell Apr 8, 2026
b24afcf
fix(08-01): restore source file changes accidentally reverted in summ…
JakeHartnell Apr 8, 2026
62634a0
docs(phase-08): complete phase execution
JakeHartnell Apr 8, 2026
9c5cf93
docs(09): smart discuss context
JakeHartnell Apr 8, 2026
ce55c0f
docs(09): create phase plan for settings scroll refactor
JakeHartnell Apr 8, 2026
621370b
feat(09-01): render all settings sections unconditionally with IDs, h…
JakeHartnell Apr 8, 2026
0c6b7cd
feat(09-01): wire IntersectionObserver scroll tracking and sidebar sc…
JakeHartnell Apr 8, 2026
d7d86dc
docs(09-01): complete settings scroll refactor plan summary
JakeHartnell Apr 8, 2026
de3297f
docs(phase-09): complete phase execution
JakeHartnell Apr 8, 2026
7d17cdc
fix(08): add agent_base_url to appStore initial state
JakeHartnell Apr 8, 2026
5daecaf
docs(v1.1): milestone audit
JakeHartnell Apr 8, 2026
4790faa
chore: complete v1.1 milestone — Open Source AI Providers & Settings UX
JakeHartnell Apr 8, 2026
82603e4
chore: archive phase directories from completed milestones
JakeHartnell Apr 8, 2026
7303053
fix: use optimistic local state in AgentSection form fields
JakeHartnell Apr 8, 2026
995a0f9
Complete new UI milestone
JakeHartnell Apr 8, 2026
6440d49
docs: start milestone v1.2 Components Explorer
JakeHartnell Apr 8, 2026
08ad6bd
docs: define milestone v1.2 requirements
JakeHartnell Apr 8, 2026
424d810
docs: create milestone v1.2 roadmap (3 phases)
JakeHartnell Apr 8, 2026
da6da46
docs(10): smart discuss context
JakeHartnell Apr 8, 2026
3a01765
docs(10): research phase backend commands
JakeHartnell Apr 8, 2026
a25b967
docs(10): create phase plan
JakeHartnell Apr 8, 2026
0b58287
docs(10): fix checker issues in plan and research
JakeHartnell Apr 8, 2026
2d5c01e
feat(10-01): add WasmEngine getters, wit-schema dep, and SchemaCacheS…
JakeHartnell Apr 8, 2026
7d5dff7
feat(10-01): implement cmd_get_component_schema and cmd_get_component…
JakeHartnell Apr 8, 2026
cbc08e2
docs(10-01): complete backend commands plan summary
JakeHartnell Apr 8, 2026
7a3e45e
fix(10): add wasmtime dependency to wavs crate for WasmEngine getter
JakeHartnell Apr 8, 2026
8f8cce3
docs(phase-10): complete phase execution
JakeHartnell Apr 8, 2026
569014a
docs(phase-10): evolve PROJECT.md after phase completion
JakeHartnell Apr 8, 2026
3f6397a
docs(11): smart discuss context
JakeHartnell Apr 8, 2026
8462978
docs(phase-11): UI design contract for Component Detail Page
JakeHartnell Apr 8, 2026
54de016
docs(11): UI design contract
JakeHartnell Apr 8, 2026
d7b3957
docs(11): research component detail page phase
JakeHartnell Apr 8, 2026
db1faa9
docs(11): create phase plan for component detail page
JakeHartnell Apr 8, 2026
e31388d
docs(11): resolve open questions in RESEARCH.md
JakeHartnell Apr 8, 2026
59f3646
feat(11-01): add ComponentSourceResult types, command wrappers, and u…
JakeHartnell Apr 8, 2026
a898819
feat(11-01): create ComponentDetailPage with header card, tab shell, …
JakeHartnell Apr 8, 2026
4ae546d
docs(11-01): complete component detail page foundation plan summary
JakeHartnell Apr 8, 2026
e0e63a8
feat(11-02): implement Interface, Permissions, and Configuration tab …
JakeHartnell Apr 8, 2026
883f096
docs(11-02): complete tab content sections plan summary
JakeHartnell Apr 8, 2026
9498ef2
docs(phase-11): complete phase execution
JakeHartnell Apr 8, 2026
3dbc215
docs(phase-11): evolve PROJECT.md after phase completion
JakeHartnell Apr 8, 2026
ded5007
docs(12): smart discuss context
JakeHartnell Apr 8, 2026
696b1e0
docs(phase-12): UI design contract for Components List Page
JakeHartnell Apr 8, 2026
7b7897a
docs(12): UI design contract
JakeHartnell Apr 8, 2026
7b82b9d
docs(12): research components list page phase
JakeHartnell Apr 8, 2026
4ceae6b
docs(12): create phase plan
JakeHartnell Apr 8, 2026
70419dd
feat(12-01): enhance ComponentsPage with rich cards, search, and filter
JakeHartnell Apr 8, 2026
804cde6
docs(12-01): complete components list page plan summary
JakeHartnell Apr 8, 2026
40cfc71
docs(phase-12): complete phase execution
JakeHartnell Apr 8, 2026
3a40894
docs(phase-12): evolve PROJECT.md after phase completion
JakeHartnell Apr 8, 2026
30fed11
docs(v1.2): milestone audit
JakeHartnell Apr 8, 2026
c51655d
chore: complete v1.2 milestone
JakeHartnell Apr 8, 2026
c34456a
fix: resolve SchemaCacheState conflicting Default and add McpServerSt…
JakeHartnell Apr 9, 2026
4c0d1d1
Complete milestone
JakeHartnell Apr 9, 2026
08646e8
docs: start milestone v1.3 Activity UX & Bug Fixes
JakeHartnell Apr 9, 2026
86d26cc
docs: define milestone v1.3 requirements
JakeHartnell Apr 9, 2026
f9a3b8d
docs: create milestone v1.3 roadmap (4 phases)
JakeHartnell Apr 9, 2026
987f407
docs(13): auto-generated context (infrastructure phase)
JakeHartnell Apr 9, 2026
58c30dd
docs(13): create phase plan
JakeHartnell Apr 9, 2026
3e9295d
feat(13-01): add tx_hash and result_payload to Rust pipeline
JakeHartnell Apr 9, 2026
9c933d9
feat(13-01): update TypeScript interfaces and listeners for new fields
JakeHartnell Apr 9, 2026
1ff651b
docs(13-01): complete activity backend pipeline plan summary
JakeHartnell Apr 9, 2026
1df7083
docs(phase-13): complete phase execution
JakeHartnell Apr 9, 2026
91603f8
docs(phase-13): evolve PROJECT.md after phase completion
JakeHartnell Apr 9, 2026
704bc00
docs(14): smart discuss context
JakeHartnell Apr 9, 2026
559660e
docs(14): UI design contract
JakeHartnell Apr 9, 2026
6f01cd0
docs(14): fix UI-SPEC typography weights and add focal point declaration
JakeHartnell Apr 9, 2026
5cfec63
docs(14): research activity frontend UX phase
JakeHartnell Apr 9, 2026
27e8efd
docs(14): create phase plan
JakeHartnell Apr 9, 2026
89b7af2
feat(14-01): add decodeResultPayload utility
JakeHartnell Apr 9, 2026
d4a3f2e
feat(14-01): add SubmissionRows inline display to activity cards
JakeHartnell Apr 9, 2026
434b6d5
docs(14-01): complete activity frontend UX plan summary
JakeHartnell Apr 9, 2026
4f1f5e5
docs(phase-14): complete phase execution
JakeHartnell Apr 9, 2026
ff156fb
docs(phase-14): evolve PROJECT.md after phase completion
JakeHartnell Apr 9, 2026
aa194d5
docs(15): auto-generated context (infrastructure phase)
JakeHartnell Apr 9, 2026
c9d7d26
docs(15): research service restart reliability phase
JakeHartnell Apr 9, 2026
55c0ecb
docs(15): create phase plan
JakeHartnell Apr 9, 2026
cf4088c
feat(15-01): add pending EVM subscription queue to trigger watcher
JakeHartnell Apr 9, 2026
970a217
test(15-01): add regression tests for pending EVM subscription queue
JakeHartnell Apr 9, 2026
02e4664
docs(15-01): complete service restart reliability plan
JakeHartnell Apr 9, 2026
945e296
docs(phase-15): complete phase execution
JakeHartnell Apr 9, 2026
7d2aa6f
docs(phase-15): evolve PROJECT.md after phase completion
JakeHartnell Apr 9, 2026
e977eca
docs(16): smart discuss context
JakeHartnell Apr 9, 2026
cf7f573
docs(16): create phase plan
JakeHartnell Apr 9, 2026
0e74c7b
feat(16-01): add kebab dropdown menu to wallet card header
JakeHartnell Apr 9, 2026
8c108fe
docs(16-01): complete wallet kebab menu plan summary
JakeHartnell Apr 9, 2026
48a7ab8
docs(phase-16): complete phase execution
JakeHartnell Apr 9, 2026
167e717
docs(phase-16): evolve PROJECT.md after phase completion
JakeHartnell Apr 9, 2026
930c424
docs(v1.3): milestone audit
JakeHartnell Apr 9, 2026
f13a6a4
chore: complete v1.3 milestone
JakeHartnell Apr 9, 2026
b21597d
Better activity cards
JakeHartnell Apr 14, 2026
4385bca
update
JakeHartnell Apr 20, 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
27 changes: 20 additions & 7 deletions .claude/skills/wavs/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -40,13 +40,18 @@ just setup-claude-mcp [/path/to/project]
just start-wavs-dev

# 2. Run wavs-mcp (in a separate terminal)
./target/release/wavs-mcp --wavs-url http://localhost:8000 --token <token>
./target/release/wavs-mcp --wavs-url http://localhost:8000 --token <token> \
--exec-enabled \
--signing-mnemonic "word1 word2 ... word12" \
--mcp-chain-credential "0x<private-key>"

# 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.
> **Execution tools** (`wavs_exec_*`) require `--exec-enabled`. Tier 2 (`signed_result`) also needs `--signing-mnemonic`. Tier 3 (`on_chain`) also needs `--mcp-chain-credential` and `exec_enabled: true` in the service definition. See [`flows/execution.md`](flows/execution.md).

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

---

Expand All @@ -57,6 +62,7 @@ npx @wavs/mcp@latest
| 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) |
| Execute a deployed service | [`flows/execution.md`](flows/execution.md) |

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

Expand All @@ -68,9 +74,10 @@ When in doubt, start with **component-dev** — it ends with a deployment step.
|----------|-------|---------------|
| **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 |
| **Dev** | `upload_component`, `save_service`, `simulate_trigger`, `deploy_dev_service`, `query_kv`, `query_logs`, `query_component_logs` | Dev endpoints enabled |
| **Chain-write** | `set_service_uri`, `deploy_service_manager`, `deploy_poa_service_manager`, `register_operator`, `deploy_and_register` | `WAVS_MCP_CHAIN_CREDENTIAL` env var |
| **Local** | `get_service_schema`, `get_wit_interface`, `scaffold_component`, `build_component`, `validate_component` | None |
| **Execution** | `wavs_exec_*` (dynamic, one per deployed workflow) | `--exec-enabled`; Tier 2 needs `--signing-mnemonic`; Tier 3 needs `--mcp-chain-credential` + `exec_enabled: true` |

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

Expand All @@ -90,12 +97,18 @@ The WAVS app "Register with Claude" button and `just setup-claude-mcp` write thi

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

The `exec_enabled` field in a service definition controls Tier 3 (on-chain) execution:
```json
{ "exec_enabled": true }
```
When omitted or `false`, only Tiers 1–2 are available for that service. See [`reference/service-json.md`](reference/service-json.md).

---

## Reference

- [`reference/mcp-tools.md`](reference/mcp-tools.md) — All 20 tools with auth requirements and parameter notes
- [`reference/mcp-tools.md`](reference/mcp-tools.md) — All 24+ tools with auth requirements and parameter notes (includes dynamic `wavs_exec_*`)
- [`reference/service-json.md`](reference/service-json.md) — Service/trigger JSON formats + simulate examples
164 changes: 128 additions & 36 deletions .claude/skills/wavs/flows/component-dev.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,35 @@ 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 1** — `wavs:wavs_scaffold_component` with `dir` parameter — Creates the complete project on disk with all WIT files, bindings, and trigger template. Nothing to write manually.
- [ ] **Step 2** — Customize `src/lib.rs` with your component logic.
- [ ] **Step 3** — `wavs:wavs_build_component` — Compile; read stderr and fix errors; repeat until exit code 0.
- [ ] **Step 4** — `wavs:wavs_validate_component` — Verify the .wasm exports the correct `run` function before uploading.
- [ ] **Step 5** — `wavs:wavs_upload_component` — Upload `.wasm`; save the returned digest (raw 64-char hex, no `sha256:` prefix).
- **OCI alternative:** If the component is published to an OCI registry (e.g. ghcr.io), you can skip upload and use an OCI source in the service definition instead: `"source": {"oci": {"uri": "oci://ghcr.io/org/component:v1.0"}}`. See [`reference/service-json.md`](../reference/service-json.md#oci-pull-from-registry-at-deploy-time) for details.
- [ ] **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.
- [ ] **Step 7** — If the `ui_navigate` tool is available (WAVS desktop app embedded agent only), **immediately** call it to open the service detail page (path from deploy output). Don't wait — navigate right after deploy so the user can see the service.
- [ ] **Step 8** — `wavs:wavs_simulate_trigger` — Verify output.

> **Tip:** Call `wavs:wavs_get_wit_interface` if you need to understand the full WIT API (HTTP, KV, host functions, etc.) before writing custom logic.
> **Tip:** Omit the `dir` parameter from `wavs_scaffold_component` to get file contents as text instead of writing to disk (useful when integrating into existing projects).

---

## How Scaffolding Works

**With `dir` parameter (recommended):** The tool creates `{dir}/{name}/` with all files ready to build. No manual file creation needed.

**Without `dir`:** Returns file contents as text. You must write every file yourself, including the `wit/` directory. Use this only when integrating into an existing project.

The scaffolded project is self-contained:
- Builds with `cargo build --target wasm32-wasip2 --release` (no `cargo-component` needed)
- All WIT interface definitions are bundled in `wit/`
- **Prerequisite:** `rustup target add wasm32-wasip2`

### In-Workspace Alternative (WAVS repo only)

If working inside the WAVS monorepo, you can instead create a component at `examples/components/{name}/` using `example-helpers = { workspace = true }`. This is simpler (only 2 files, no WIT copy needed) but only works within the workspace. Build with `cargo component build --release -p {name}`.

---

Expand All @@ -24,11 +46,9 @@ trigger_type: evm_contract_event | cosmos_contract_event | block_interval | cron
description: optional one-line description
```

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

---

## Component Anatomy
## Component Anatomy (In-Workspace)

Minimal working component using the prelude:

Expand All @@ -40,23 +60,24 @@ 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,
)])
match action.data {
TriggerData::Raw(data) => {
// Process raw input bytes
Ok(vec![WasmResponse {
payload: data,
ordering: None,
event_id_salt: None,
}])
}
_ => Err("Unsupported trigger data type".to_string()),
}
}
}

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.
The prelude re-exports: `Guest`, `TriggerAction`, `TriggerData`, `Trigger`, `WasmResponse`, `decode_trigger_event`, `encode_trigger_output`, `export_layer_trigger_world`, and the `host` module.

Full explicit imports (when you need specific types):

Expand All @@ -73,11 +94,60 @@ use example_helpers::export_layer_trigger_world;
use example_helpers::trigger::{decode_trigger_event, encode_trigger_output};
```

## Component Anatomy (Standalone)

```rust
#[allow(warnings)]
mod bindings;

use crate::bindings::{
export,
wavs::types::events::TriggerData,
Guest, TriggerAction, WasmResponse,
};

struct Component;
export!(Component with_types_in bindings);

impl Guest for Component {
fn run(action: TriggerAction) -> std::result::Result<Vec<WasmResponse>, String> {
match action.data {
TriggerData::Raw(data) => {
let payload = data; // echo input back
Ok(vec![WasmResponse {
payload,
ordering: None,
event_id_salt: None,
}])
}
_ => Err("Unsupported trigger data type".to_string()),
}
}
}
```

With `src/bindings.rs`:
```rust
#[allow(warnings)]
mod _inner {
wit_bindgen::generate!({
world: "wavs-world",
path: "wit",
pub_export_macro: true,
generate_all,
features: ["tls"],
});
}
pub use _inner::*;
```

---

## Host APIs

```rust
// In-workspace: available via `host::` directly
// Standalone: use `crate::bindings::host`
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.)
Expand All @@ -91,18 +161,26 @@ host::get_event_id(Some(salt)) // custom salt (Vec<u8>)

```rust
match action.data {
TriggerData::EvmContractEvent(_) | TriggerData::CosmosContractEvent(_) => {
let (trigger_id, data) = decode_trigger_event(action.data)?;
TriggerData::EvmContractEvent(event_data) => {
// event_data.chain: chain key string
// event_data.log.data.data: raw ABI-encoded log bytes
// event_data.log.data.topics: Vec of topic byte arrays
}
TriggerData::CosmosContractEvent(event_data) => {
// event_data.chain: chain key string
// event_data.event.ty: event type string
// event_data.event.attributes: Vec<(String, String)>
// event_data.block_height: u64
}
TriggerData::Raw(bytes) => {
// Plain bytes — trigger_id is 0 for raw/manual triggers.
let data = bytes;
// Plain bytes — for manual/raw triggers
}
TriggerData::Cron { trigger_time } => {
// trigger_time: unix timestamp (u64)
TriggerData::Cron(data) => {
// data.trigger_time.nanos: unix timestamp in nanoseconds
}
TriggerData::BlockInterval { block_height } => {
// block_height: u64
TriggerData::BlockInterval(data) => {
// data.block_height: u64
// data.chain: chain key string
}
_ => return Err("unsupported trigger type".to_string()),
}
Expand All @@ -116,6 +194,7 @@ match action.data {

```rust
use example_helpers::bindings::world::wasi::keyvalue::{store, atomics};
// Standalone: use crate::bindings::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())?;
Expand All @@ -139,38 +218,47 @@ let bytes = block_on(async {

---

## Cargo.toml Template
## Cargo.toml Template (In-Workspace)

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

```toml
[package]
name = "{name}"
edition.workspace = true
version.workspace = true
authors.workspace = true
rust-version.workspace = true
repository.workspace = true

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

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

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

---

## Build Output Paths

After `wavs_build_component` (release mode):
After `wavs_build_component` or `cargo component build --release` (workspace):
```
target/wasm32-wasip1/release/{package_name_with_underscores}.wasm
```

After `cargo build --target wasm32-wasip2 --release` (standalone):
```
target/wasm32-wasip2/release/{package_name_with_underscores}.wasm
```

After `just wasi-build-native {component-name}` (from repo root):
```
examples/build/components/{component-name}.wasm
Expand All @@ -183,13 +271,17 @@ 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::*`
- `cannot find type` / `unresolved import` — check import paths match your scaffold mode (workspace vs standalone)
- `failed to create a target world` / `package not found` — WIT files are missing. For standalone: ensure all `wit/deps/*/package.wit` files are written. For workspace: ensure `example-helpers` path is correct.
- `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
- `does not implement Guest` — ensure export macro is present (`export_layer_trigger_world!` for workspace, `export!` for standalone)
- `no export 'run' found` — the export macro is missing or the `Guest` impl is not correct

**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
- Use `wavs_query_component_logs(service_id="<id>", level="debug")` to read component `host::log()` output after simulation
- Use `wavs_query_logs(target="wavs::subsystems::engine", level="warn")` for broader engine-level diagnostics

**Missing config vars** — component returns `"config var X not found"`:
- Service definition must include the key in its `config` map
Expand Down
4 changes: 4 additions & 0 deletions .claude/skills/wavs/flows/deployment.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,13 +18,16 @@ Deploy a new WAVS service with an on-chain ServiceManager contract.
- **SimpleServiceManager** (lightweight PoA): `wavs:wavs_deploy_service_manager` — returns `address`
- **POAStakeRegistry** (full middleware): `wavs:wavs_deploy_poa_service_manager` — returns proxy `address`; requires Docker
- [ ] **Step 3** — `wavs:wavs_upload_component` — Upload the compiled `.wasm`; save the returned digest (raw 64-char hex, no `sha256:` prefix).
- **OCI alternative:** If the component is published to an OCI registry, skip upload and use `"source": {"oci": {"uri": "oci://ghcr.io/org/component:v1.0"}}` in the service definition. The WAVS node pulls it at deploy time. See [`reference/service-json.md`](../reference/service-json.md#oci-pull-from-registry-at-deploy-time).
- [ ] **Step 4** — `wavs:wavs_save_service` — Save the service definition JSON; get back a URI.
- [ ] **Step 5** — `wavs:wavs_set_service_uri` — Call `setServiceURI` on-chain with the URI from step 4.
- [ ] **Step 6** — `wavs:wavs_deploy_service` — Register the service with the WAVS node (reads definition from chain).
- **Verify the node picked up the service:** Call `wavs:wavs_get_service(chain, address)` and confirm `status: active`. Note: `wavs_deploy_service` returning success only means the node fetched and stored the config from the on-chain URI. Confirm active status with `wavs_get_service`.
- If the `ui_navigate` tool is available (WAVS desktop app embedded agent only), **immediately** call it to open the service detail page (use the path from the deploy output). Don't wait — navigate right after deploy so the user can see the service.
- [ ] **Step 7 (POA only)** — `wavs:wavs_register_operator` — Register the node's signing key on the POAStakeRegistry. **Must be called AFTER `wavs_deploy_service`** so the node has assigned a service-specific HD-derived signing key to register on-chain.
- [ ] **Step 8** — `wavs:wavs_simulate_trigger` — Smoke test.
- [ ] **Step 9** — `wavs:wavs_list_services` — Confirm the service appears with `status: active`.
- [ ] **Step 10 (optional)** — If `--exec-enabled` is set on the MCP server, the service is now available as a `wavs_exec_*` tool. Follow [`flows/execution.md`](execution.md) to execute it at any trust tier.

---

Expand Down Expand Up @@ -86,6 +89,7 @@ Pass to `wavs_save_service` or `wavs_deploy_dev_service`:
{
"name": "my-service",
"status": "active",
"exec_enabled": true,
"manager": {
"evm": {
"chain": "evm:31337",
Expand Down
Loading