move-setup
Move package setup (Move.toml, edition, dependencies), building, testing, and common pitfalls from other Move dialects.
Best use case
move-setup is best used when you need a repeatable AI agent workflow instead of a one-off prompt.
Move package setup (Move.toml, edition, dependencies), building, testing, and common pitfalls from other Move dialects.
Teams using move-setup should expect a more consistent output, faster repeated execution, less prompt rewriting.
When to use this skill
- You want a reusable workflow that can be run more than once with consistent structure.
When not to use this skill
- You only need a quick one-off answer and do not need a reusable workflow.
- You cannot install or maintain the underlying files, dependencies, or repository context.
Installation
Claude Code / Cursor / Codex
Manual Installation
- Download SKILL.md from GitHub
- Place it in
.claude/skills/setup/SKILL.mdinside your project - Restart your AI agent — it will auto-discover the skill
How move-setup Compares
| Feature / Agent | move-setup | Standard Approach |
|---|---|---|
| Platform Support | Not specified | Limited / Varies |
| Context Awareness | High | Baseline |
| Installation Complexity | Unknown | N/A |
Frequently Asked Questions
What does this skill do?
Move package setup (Move.toml, edition, dependencies), building, testing, and common pitfalls from other Move dialects.
Where can I find the source code?
You can find the source code on GitHub using the link provided at the top of the page.
SKILL.md Source
## 1. Package Setup
Always use the Move 2024 edition (`edition = "2024"` in Move.toml). The `name` in `[package]` defines the package's address name and **must match** what your Move code uses (e.g., `module my_package::m` requires `name = "my_package"`):
```toml
[package]
name = "my_package"
edition = "2024"
```
**Implicit framework dependencies (Sui 1.45+)** — do not list `Sui`, `MoveStdlib`, `Bridge`, or `SuiSystem` in `[dependencies]`. They are implicit:
```toml
# ✅ Sui 1.45+
[dependencies]
# no framework entries needed
# ❌ Outdated
[dependencies]
Sui = { git = "...", subdir = "crates/sui-framework/packages/sui-framework", rev = "..." }
```
**No `[addresses]` section (Sui CLI 1.63+)** — named addresses are derived from the `[package]` name and `[dependencies]` keys. Do not add an `[addresses]` or `[dev-addresses]` section.
Run `sui move build` after any significant change to verify the code compiles before proceeding.
---
## 2. Building and Testing
Always verify code compiles and tests pass using the Sui CLI:
```bash
# Build
sui move build
# Run all tests
sui move test
# Run a specific test by name
sui move test swap_exact_input
```
### Test conventions
**Naming** — do not prefix test functions with `test_`. The `#[test]` attribute already signals intent:
```move
// ✅
#[test] fun create_pool() { }
#[test] fun swap_returns_correct_amount() { }
// ❌
#[test] fun test_create_pool() { }
```
**Merge attributes** — combine `#[test]` and `#[expected_failure]` on one line:
```move
// ✅
#[test, expected_failure(abort_code = EInsufficientLiquidity)]
fun swap_with_zero_input() { ... }
// ❌
#[test]
#[expected_failure(abort_code = EInsufficientLiquidity)]
fun swap_with_zero_input() { ... }
```
**Don't clean up in `expected_failure` tests** — let them abort naturally, don't add `scenario.end()` or other teardown:
```move
// ✅
#[test, expected_failure(abort_code = EInsufficientLiquidity)]
fun swap_with_zero_input() {
let mut ctx = tx_context::dummy();
let pool = create_pool(&mut ctx);
pool.swap(coin::zero(&mut ctx)); // aborts here — done
}
// ❌ — don't clean up after expected failure
#[test, expected_failure(abort_code = EInsufficientLiquidity)]
fun swap_with_zero_input() {
let mut scenario = test_scenario::begin(@0xA);
// ... test body ...
scenario.end(); // unnecessary, misleading
}
```
**Use `tx_context::dummy()` for simple tests** — only reach for `test_scenario` when you genuinely need multi-transaction or multi-sender behaviour:
```move
// ✅ Simple test — no scenario needed
#[test]
fun create_pool() {
let mut ctx = tx_context::dummy();
let pool = new_pool(&mut ctx);
assert_eq!(pool.fee_bps(), 30);
sui::test_utils::destroy(pool);
}
// ✅ Multi-sender test — scenario is appropriate
#[test]
fun only_admin_can_set_fee() {
let mut scenario = test_scenario::begin(@admin);
// ...
scenario.end();
}
```
**Assertions** — prefer `assert_eq!` over `assert!` for value comparisons (shows both sides on failure), and never pass abort codes to `assert!`:
```move
// ✅
assert_eq!(pool.fee_bps(), 30);
assert!(pool.is_active());
// ❌
assert!(pool.fee_bps() == 30); // doesn't show the actual value on failure
assert!(pool.is_active(), 0); // abort code conflicts with app error codes
```
**Destroying objects in tests** — use `sui::test_utils::destroy`, never write custom `destroy_for_testing` functions:
```move
// ✅
use sui::test_utils::destroy;
destroy(pool);
// ❌
pool.destroy_for_testing();
```
---
## 3. What Move on Sui is NOT
| Pattern | Source | Do NOT use on Sui |
| ----------------------------------------------------- | ----------------- | --------------------------------------- |
| `acquires`, `move_to`, `move_from`, `borrow_global` | Aptos / Core Move | Sui has no global storage |
| `signer` type | Aptos / Core Move | Use `&mut TxContext` and `ctx.sender()` |
| `Script` functions | Aptos | Use `entry` functions instead |
| `public(friend)` | Legacy Move | Use `public(package)` |
| Struct without `public` keyword | Legacy Move | All structs must be `public` |
| `let x = ...` for mutable vars | Legacy Move | Use `let mut x = ...` |
| `use` inside function bodies for module-level imports | Style issue | Put `use` at the top of the module |
| `&signer` | Rust / Aptos | Does not exist on Sui |Related Skills
move-syntax
Move language syntax — module layout, imports, mutability, visibility, method syntax, enums, macros, and comments.
move-stdlib
Common Sui Move standard library patterns — strings, Coin/Balance, Option, addresses, UID, TxContext, vectors, and struct unpacking.
move-patterns
Move design patterns — events, error handling, one-time witness (OTW), capability pattern, and pure functions/composability.
move-objects
Sui object model — struct declarations, abilities (key/store/copy/drop), object ownership, naming conventions, and dynamic fields.
move
Move smart contract development on Sui. Use when writing, reviewing, or debugging Move code, Move.toml configuration, or Sui object model patterns.
sui-ts-sdk
Sui TypeScript SDK — PTB construction, client setup, transaction execution, and on-chain queries. Use when writing code that interacts with the Sui blockchain via @mysten/sui. These patterns apply in both backend scripts and frontend apps. For frontend-specific setup (dApp Kit, wallet adapters, React hooks), use the sui-frontend skill first or alongside this one.
sui-frontend
Sui frontend dApp development with @mysten/dapp-kit-react (React) and @mysten/dapp-kit-core (Vue, vanilla JS, other frameworks). Use when building browser apps that connect to Sui wallets, query on-chain data, or execute transactions. Use alongside the sui-ts-sdk skill for PTB construction patterns.
sui-dev
Full-stack Sui blockchain development — Move smart contracts, TypeScript SDK, and frontend dApp Kit. Routes to the appropriate sub-skill based on what the user is building.
VibeCollab — Setup Instructions for AI Assistants
You are helping a user set up VibeCollab in their project.
performing-lateral-movement-with-wmiexec
Perform lateral movement across Windows networks using WMI-based remote execution techniques including Impacket wmiexec.py, CrackMapExec, and native WMI commands for stealthy post-exploitation during red team engagements.
performing-lateral-movement-detection
Detects lateral movement techniques including Pass-the-Hash, PsExec, WMI execution, RDP pivoting, and SMB-based spreading using SIEM correlation of Windows event logs, network flow data, and endpoint telemetry mapped to MITRE ATT&CK Lateral Movement (TA0008) techniques.
move-smith-fuzzer
Move Smith Fuzzer Skill