24b0b68ed0
Plugin acidaos (novo): - rust-dev: desenvolvimento Core em Rust (Axum, crates, debug compiler) - spoke-dev: desenvolvimento Spokes em Next.js/TypeScript + Storybook - devops: pipelines Gitea Actions CI/CD (adaptado de GitHub para Gitea) - docs: rustdoc, TypeDoc, Outline e ADRs dev-tools: - prompt-refine: skill genérica de engenharia de prompts para agentes IA Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
5.8 KiB
5.8 KiB
name, description, allowed-tools
| name | description | allowed-tools |
|---|---|---|
| rust-dev | 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. | 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:
- Criar directório
crates/<nome>/ - Gerar
Cargo.tomlcom dependências mínimas - Criar
src/lib.rscom estrutura base - Adicionar ao workspace
Cargo.toml - Criar
src/error.rscom tipo de erro custom usandothiserror
Template Cargo.toml:
[package]
name = "acidaos-<nome>"
version = "0.1.0"
edition = "2021"
description = "<descrição>"
[dependencies]
tracing = "0.1"
serde = { version = "1", features = ["derive"] }
thiserror = "1"
tokio = { version = "1", features = ["full"] }
Template src/lib.rs:
//! # acidaos-<nome>
//!
//! <Descrição do módulo>
//!
//! ## Exemplo
//! ```rust
//! use acidaos_<nome>::<TipoPrincipal>;
//! ```
mod error;
pub use error::Error;
pub type Result<T> = std::result::Result<T, Error>;
Template src/error.rs:
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:
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 <NomeRequest> {
// campos do request
}
#[derive(Debug, Serialize)]
pub struct <NomeResponse> {
// campos do response
}
// --- Handler ---
#[instrument(skip(state))]
pub async fn <nome_handler>(
State(state): State<AppState>,
Json(req): Json<<NomeRequest>>,
) -> Result<Json<<NomeResponse>>, StatusCode> {
tracing::info!("Processando <nome>");
// lógica do handler
Ok(Json(<NomeResponse> {
// preencher response
}))
}
// --- Router ---
pub fn <nome>_router() -> Router<AppState> {
Router::new()
.route("/<path>", post(<nome_handler>))
}
Princípios obrigatórios:
#[instrument]em todos os handlers (observabilidade)- Erros retornam
StatusCodeou tipo de erro custom (nunca.unwrap()) - Estado partilhado via
State<AppState>(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:
-
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<Mutex<>>E0308 Type mismatch Verificar tipos, usar .into()ou cast explícitoE0277 Trait not impl Implementar trait ou usar tipo diferente E0499 Multiple mut borrows Usar RefCellou reestruturar lógica -
Analisar mensagem de erro completa (incluindo
help:enote:) -
Gerar código corrigido com explicação da causa raiz
-
Verificar:
cargo checkpassa antes decargo build
Padrões comuns no AcidaOS Core:
// ❌ 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<Request>) -> Response { ... }
Quality Gate
Antes de fazer commit:
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?ouexpect("mensagem descritiva") - Funções async < 50 linhas
tracing::instrumentem todas as funções públicas async- Documentação
///em todos os tipos e funções públicas
Checklist Entrega
cargo checksem erroscargo clippy -- -D warningslimpocargo test100% 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