--- name: rust-dev description: Desenvolvimento do AcidaOS Core em Rust — criar crates, definir endpoints Axum, debugar erros do compilador. Usar quando "rust", "axum", "cargo", "crate", "core", "acidaos core", "rust error", "borrow checker", desenvolvimento do motor central do AcidaOS. allowed-tools: Read, Write, Edit, Bash, mcp__memory-supabase__search_memories, mcp__gitea__get_file_content, mcp__gitea__create_file, mcp__gitea__update_file --- # AcidaOS Rust Dev Skill para desenvolvimento do **Core do AcidaOS** em Rust. ## Contexto do Projecto ``` acidaos-core (Rust) ├── src/ │ ├── api/ ← endpoints Axum (REST/gRPC) │ ├── kernel/ ← Agent Kernel & Scheduler │ ├── security/ ← Sandboxing, isolamento WASM │ ├── memory/ ← Context & Memory Engine │ ├── registry/ ← Parsers de skills/plugins │ ├── observability/← Logging, tracing │ └── ethics/ ← Constitution Engine ├── crates/ ← bibliotecas internas └── Cargo.toml ``` **Stack:** Rust stable | Axum | Tokio | Serde | Tracing | SQLx | wasmtime ## Protocolo Inicial ``` mcp__memory-supabase__search_memories "acidaos core [componente]" mcp__gitea__get_file_content acidaos-core/Cargo.toml # verificar dependências actuais ``` --- ## Operações ### 1. Criar novo crate (`/rust-create-crate`) **Input:** Nome do crate e propósito **Passos:** 1. Criar directório `crates//` 2. Gerar `Cargo.toml` com dependências mínimas 3. Criar `src/lib.rs` com estrutura base 4. Adicionar ao workspace `Cargo.toml` 5. Criar `src/error.rs` com tipo de erro custom usando `thiserror` **Template `Cargo.toml`:** ```toml [package] name = "acidaos-" version = "0.1.0" edition = "2021" description = "" [dependencies] tracing = "0.1" serde = { version = "1", features = ["derive"] } thiserror = "1" tokio = { version = "1", features = ["full"] } ``` **Template `src/lib.rs`:** ```rust //! # acidaos- //! //! //! //! ## Exemplo //! ```rust //! use acidaos_::; //! ``` mod error; pub use error::Error; pub type Result = std::result::Result; ``` **Template `src/error.rs`:** ```rust use thiserror::Error; #[derive(Debug, Error)] pub enum Error { #[error("Erro de inicialização: {0}")] Init(String), #[error("Operação não suportada: {0}")] Unsupported(String), } ``` --- ### 2. Definir endpoint Axum (`/rust-define-api-endpoint`) **Input:** Definição do endpoint (método, path, request/response types) de uma SPEC.md **Template de endpoint:** ```rust use axum::{ extract::{Path, State}, http::StatusCode, response::Json, routing::{get, post}, Router, }; use serde::{Deserialize, Serialize}; use tracing::instrument; // --- Tipos --- #[derive(Debug, Deserialize)] pub struct { // campos do request } #[derive(Debug, Serialize)] pub struct { // campos do response } // --- Handler --- #[instrument(skip(state))] pub async fn ( State(state): State, Json(req): Json<>, ) -> Result>, StatusCode> { tracing::info!("Processando "); // lógica do handler Ok(Json( { // preencher response })) } // --- Router --- pub fn _router() -> Router { Router::new() .route("/", post()) } ``` **Princípios obrigatórios:** - `#[instrument]` em todos os handlers (observabilidade) - Erros retornam `StatusCode` ou tipo de erro custom (nunca `.unwrap()`) - Estado partilhado via `State` (não globals) - Validação de input antes de processamento --- ### 3. Debugar erro do compilador (`/rust-debug-compiler-error`) **Input:** Output completo de `cargo build` ou `cargo check` **Protocolo de análise:** 1. **Identificar categoria do erro:** | Código | Categoria | Solução típica | |--------|-----------|----------------| | E0382 | Move após uso | Usar `clone()` ou referências `&` | | E0502 | Borrow conflict | Reordenar operações, usar `Arc>` | | E0308 | Type mismatch | Verificar tipos, usar `.into()` ou cast explícito | | E0277 | Trait not impl | Implementar trait ou usar tipo diferente | | E0499 | Multiple mut borrows | Usar `RefCell` ou reestruturar lógica | 2. **Analisar mensagem de erro completa** (incluindo `help:` e `note:`) 3. **Gerar código corrigido** com explicação da causa raiz 4. **Verificar:** `cargo check` passa antes de `cargo build` **Padrões comuns no AcidaOS Core:** ```rust // ❌ Move não intencional let data = fetch_data(); process(data); log(data); // ERRO: data foi moved // ✅ Correcto let data = fetch_data(); process(&data); // ou process(data.clone()) log(&data); // ❌ Async + lifetime async fn handler(req: &Request) -> Response { ... } // lifetime issue // ✅ Correcto — owned ou Arc async fn handler(req: Arc) -> Response { ... } ``` --- ## Quality Gate Antes de fazer commit: ```bash cargo check # zero erros cargo clippy # zero warnings cargo test # todos os testes passam cargo fmt --check # formatação correcta ``` **Standards:** - Zero `unwrap()` em código de produção — usar `?` ou `expect("mensagem descritiva")` - Funções async < 50 linhas - `tracing::instrument` em todas as funções públicas async - Documentação `///` em todos os tipos e funções públicas --- ## Checklist Entrega - [ ] `cargo check` sem erros - [ ] `cargo clippy -- -D warnings` limpo - [ ] `cargo test` 100% pass - [ ] Documentação `///` completa - [ ] Observabilidade: `#[instrument]` nos handlers - [ ] Sem `.unwrap()` em paths críticos - [ ] CHANGELOG.md actualizado --- **Versão**: 1.0.0 | **Autor**: Descomplicar® | **Plugin**: acidaos