Token导航 LogoToken导航TokenDH.com
开发需要联网github未标认证来源可访问许可证需确认审计通过

rocketrocket 命令行

Agent Skill

rocket 用于处理 GitHub 仓库、Issue、Pull Request 和代码协作信息,适合在 Codex、Claude、Cursor、Gemini CLI 中需要围绕仓库状态、代码变更或协作事项进行整理时使用。可结合来源仓库、安装命令和原始 README 继续核验具体用法。安装前建议确认权限范围、维护状态,以及是否会触发联网、命令执行或文件读写。

总安装

218

周安装

9

GitHub Stars

8

下载量

71
CodexClaudeCursorGemini CLI

安装说明

本站只整理中文说明和来源信息,不托管安装包,也不代用户安装。

GitHub

来源数

2

许可证

unknown

最后核验

2026-05-01

来源状态

来源可访问

安装方式

通过对话安装

复制提示词发给支持本地命令或 Skills 的 AI 助手,先确认命令和权限,再让它执行。

请帮我安装这个 Agent Skill:rocket(rocket 命令行)
来源仓库:https://github.com/ar4mirez/samuel
仓库路径:skills/rocket
安装命令:
npx skills add https://github.com/ar4mirez/samuel --skill rocket
安装前请先检查当前环境是否支持对应 CLI,并向我确认将要执行的命令、安装目录、联网范围和文件读写权限;确认后再执行。

命令行安装

复制命令到本机终端执行。该命令会通过 npx skills 从第三方来源获取 Skill;本站只展示命令,不托管安装包,也不自动执行。

skills.shnpx skills
npx skills add https://github.com/ar4mirez/samuel --skill rocket

简介

rocket 用于处理 GitHub 仓库、Issue、Pull Request 等协作信息,适合整理代码变更和项目状态。

  • 适用于需要围绕仓库动态、代码审查或团队协作事项进行梳理的场景。
  • 通过 npx skills add 命令从指定 GitHub 仓库安装,需确认权限范围和联网需求。
  • 安装前建议核实维护状态及是否会触发文件读写或命令执行操作。
  • 可结合原始 README 和仓库路径进一步验证具体用法和功能边界。

SKILL.md

Rocket Framework Guide

Applies to: Rocket 0.5+, Rust Web APIs, Type-Safe Web Applications Use with: .claude/skills/rust-guide/SKILL.md

Overview

Rocket is a Rust web framework focused on ease of use, developer experience, and type safety. It uses Rust's type system to ensure correctness at compile time, with powerful features like request guards, fairings (middleware), and derive macros for minimal boilerplate.

When to Use Rocket

  • Type-Safe APIs: Maximum compile-time guarantees
  • Developer Experience: Clean, expressive syntax with minimal boilerplate
  • Rapid Prototyping: Quick to start; attribute macros handle routing
  • Form Handling: Excellent support for HTML forms and multipart uploads
  • Traditional Web Apps: Both APIs and server-rendered HTML

When NOT to Use Rocket

  • Async-Heavy Workloads: Consider Axum for pure async performance
  • Minimal Dependencies: Rocket has heavier compile times
  • Maximum Control: Use Axum/Actix for fine-grained middleware control

Project Structure

myproject/
├── Cargo.toml
├── Rocket.toml                 # Rocket configuration (per-profile)
├── src/
│   ├── main.rs                 # Entry point (#[launch] or #[rocket::main])
│   ├── lib.rs                  # Library exports
│   ├── routes/
│   │   ├── mod.rs              # Route mounting functions
│   │   ├── users.rs            # User handlers
│   │   └── health.rs           # Health checks
│   ├── models/
│   │   ├── mod.rs
│   │   └── user.rs             # Domain + request/response models
│   ├── guards/                 # Request guards (auth, rate-limit, etc.)
│   │   ├── mod.rs
│   │   └── auth.rs
│   ├── fairings/               # Middleware (logging, CORS, timing)
│   │   ├── mod.rs
│   │   └── logging.rs
│   ├── db/
│   │   ├── mod.rs              # Database pool definition
│   │   └── pool.rs
│   ├── services/               # Business logic layer
│   │   ├── mod.rs
│   │   └── user_service.rs
│   ├── error.rs                # AppError + catchers
│   └── config.rs               # Custom config extraction
├── tests/
│   └── api_tests.rs            # Integration tests via Client
├── migrations/
└── static/                     # Static file serving

Dependencies

[dependencies]
rocket = { version = "0.5", features = ["json", "secrets"] }
rocket_db_pools = { version = "0.1", features = ["sqlx_postgres"] }
sqlx = { version = "0.7", features = ["runtime-tokio", "postgres", "chrono", "uuid"] }
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"
validator = { version = "0.16", features = ["derive"] }
jsonwebtoken = "9"
bcrypt = "0.15"
chrono = { version = "0.4", features = ["serde"] }
uuid = { version = "1", features = ["v4", "serde"] }
thiserror = "1.0"
dotenvy = "0.15"
tokio = { version = "1", features = ["full"] }

[dev-dependencies]
rocket = { version = "0.5", features = ["json", "secrets"] }

Application Entry Point

#[macro_use] extern crate rocket;

use rocket::{Build, Rocket};
use rocket_db_pools::Database;

#[launch]
fn rocket() -> Rocket<Build> {
    dotenvy::dotenv().ok();

    rocket::build()
        .attach(DbPool::init())
        .attach(RequestLogger)
        .mount("/api", routes::api_routes())
        .mount("/health", routes::health_routes())
        .register("/", catchers![
            error::not_found,
            error::internal_error,
            error::unauthorized,
            error::bad_request,
        ])
}

Configuration (Rocket.toml)

[default]
address = "0.0.0.0"
port = 8000
workers = 16
keep_alive = 5
log_level = "normal"
limits = { form = "64 kB", json = "1 MiB" }

[default.databases.db_pool]
url = "postgres://user:password@localhost/mydb"
min_connections = 5
max_connections = 20
connect_timeout = 5
idle_timeout = 300

[debug]
log_level = "debug"

[release]
secret_key = "generate-a-256-bit-base64-key"
log_level = "critical"

Custom config values via environment or Rocket.toml:

use rocket::serde::Deserialize;

#[derive(Debug, Deserialize)]
#[serde(crate = "rocket::serde")]
pub struct AppConfig {
    pub jwt_secret: String,
    pub jwt_expiration_hours: i64,
}

impl Default for AppConfig {
    fn default() -> Self {
        Self {
            jwt_secret: std::env::var("JWT_SECRET")
                .unwrap_or_else(|_| "development-secret-key".to_string()),
            jwt_expiration_hours: std::env::var("JWT_EXPIRATION_HOURS")
                .unwrap_or_else(|_| "24".to_string())
                .parse()
                .unwrap_or(24),
        }
    }
}

Routing Macros

Rocket uses attribute macros on handler functions. The macro defines the HTTP method, path, and dynamic segments.

#[get("/")]                        // GET /
#[post("/users", data = "<input>")]// POST /users with body
#[put("/users/<id>", data = "<d>")] // PUT /users/:id with body
#[delete("/users/<id>")]           // DELETE /users/:id
#[get("/users?<limit>&<offset>")]  // GET /users?limit=&offset=

Mount routes via Vec<Route>:

pub fn api_routes() -> Vec<Route> {
    routes![register, login, get_user, list_users, delete_user]
}

Request Guards

Request guards implement FromRequest and run before the handler. They are Rocket's primary mechanism for authentication, authorization, and request validation.

#[derive(Debug)]
pub struct AuthUser {
    pub user_id: Uuid,
    pub email: String,
    pub role: String,
}

#[rocket::async_trait]
impl<'r> FromRequest<'r> for AuthUser {
    type Error = AppError;

    async fn from_request(request: &'r Request<'_>) -> Outcome<Self, Self::Error> {
        let token = match request.headers().get_one("Authorization") {
            Some(h) if h.starts_with("Bearer ") => &h[7..],
            _ => return Outcome::Error((
                Status::Unauthorized,
                AppError::Unauthorized("Missing Authorization header".into()),
            )),
        };

        // Decode and validate JWT, return Outcome::Success or Outcome::Error
        // ...
    }
}

Compose guards for role-based access:

pub struct AdminUser(pub AuthUser);

#[rocket::async_trait]
impl<'r> FromRequest<'r> for AdminUser {
    type Error = AppError;

    async fn from_request(request: &'r Request<'_>) -> Outcome<Self, Self::Error> {
        let user = match AuthUser::from_request(request).await {
            Outcome::Success(u) => u,
            Outcome::Error(e) => return Outcome::Error(e),
            Outcome::Forward(s) => return Outcome::Forward(s),
        };
        if user.role != "admin" {
            return Outcome::Error((
                Status::Forbidden,
                AppError::Unauthorized("Admin access required".into()),
            ));
        }
        Outcome::Success(AdminUser(user))
    }
}

Optional auth: wrap in Option<AuthUser> or create an OptionalUser guard.

Responders and Error Handling

Implement Responder for custom error types to return structured JSON errors:

#[derive(Error, Debug)]
pub enum AppError {
    #[error("Not found: {0}")]
    NotFound(String),
    #[error("Unauthorized: {0}")]
    Unauthorized(String),
    #[error("Validation: {0}")]
    Validation(String),
    #[error("Database error: {0}")]
    Database(#[from] sqlx::Error),
    #[error("Internal: {0}")]
    Internal(String),
}

impl<'r> Responder<'r, 'static> for AppError {
    fn respond_to(self, request: &'r Request<'_>) -> response::Result<'static> {
        let (status, body) = match &self {
            AppError::NotFound(m) => (Status::NotFound, json!({"error": m})),
            AppError::Unauthorized(m) => (Status::Unauthorized, json!({"error": m})),
            AppError::Validation(m) => (Status::BadRequest, json!({"error": m})),
            AppError::Database(_) => (Status::InternalServerError, json!({"error": "database error"})),
            AppError::Internal(_) => (Status::InternalServerError, json!({"error": "internal error"})),
        };
        Response::build_from(Json(body).respond_to(request)?)
            .status(status)
            .ok()
    }
}

Register catchers for unhandled status codes:

#[catch(404)]
pub fn not_found() -> Json<Value> { Json(json!({"error": "not found"})) }

#[catch(500)]
pub fn internal_error() -> Json<Value> { Json(json!({"error": "internal error"})) }

#[catch(401)]
pub fn unauthorized() -> Json<Value> { Json(json!({"error": "unauthorized"})) }

Fairings (Middleware)

Fairings attach cross-cutting behavior to the request/response lifecycle.

pub struct RequestLogger;

#[rocket::async_trait]
impl Fairing for RequestLogger {
    fn info(&self) -> Info {
        Info { name: "Request Logger", kind: Kind::Request | Kind::Response }
    }

    async fn on_request(&self, request: &mut Request<'_>, _: &mut Data<'_>) {
        request.local_cache(|| Instant::now());
    }

    async fn on_response<'r>(&self, request: &'r Request<'_>, response: &mut Response<'r>) {
        let start = request.local_cache(|| Instant::now());
        println!("{} {} {} - {:?}", request.method(), request.uri(), response.status().code, start.elapsed());
    }
}

CORS fairing pattern:

pub struct Cors;

#[rocket::async_trait]
impl Fairing for Cors {
    fn info(&self) -> Info { Info { name: "CORS", kind: Kind::Response } }

    async fn on_response<'r>(&self, _: &'r Request<'_>, response: &mut Response<'r>) {
        response.set_header(Header::new("Access-Control-Allow-Origin", "*"));
        response.set_header(Header::new("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS"));
        response.set_header(Header::new("Access-Control-Allow-Headers", "Content-Type, Authorization"));
    }
}

State Management

Database Pool (rocket_db_pools)

use rocket_db_pools::{sqlx, Database, Connection};

#[derive(Database)]
#[database("db_pool")]
pub struct DbPool(sqlx::PgPool);

pub type DbConn = Connection<DbPool>;

Use in handlers:

#[get("/users/<id>")]
pub async fn get_user(mut db: DbConn, id: &str) -> Result<Json<User>, AppError> {
    let user = sqlx::query_as::<_, User>("SELECT * FROM users WHERE id = $1")
        .bind(id)
        .fetch_optional(&mut **db)
        .await?
        .ok_or_else(|| AppError::NotFound("user not found".into()))?;
    Ok(Json(user))
}

Managed State

// Attach in build
rocket::build().manage(AppConfig::default())

// Extract in handler
#[get("/info")]
fn info(config: &State<AppConfig>) -> String {
    format!("JWT expiry: {}h", config.jwt_expiration_hours)
}

Form Handling

#[derive(FromForm)]
pub struct UploadForm<'r> {
    pub name: String,
    pub description: Option<String>,
    pub file: TempFile<'r>,
}

#[post("/upload", data = "<form>")]
pub async fn upload(mut form: Form<UploadForm<'_>>, auth: AuthUser) -> Result<Json<Value>, AppError> {
    let filename = format!("uploads/{}_{}", auth.user_id, form.name);
    form.file.persist_to(&filename).await
        .map_err(|e| AppError::Internal(e.to_string()))?;
    Ok(Json(json!({"status": "uploaded", "filename": filename})))
}

Multipart with built-in validation:

#[derive(FromForm)]
pub struct ProfileForm<'r> {
    #[field(validate = len(1..100))]
    pub name: String,
    #[field(validate = contains('@'))]
    pub email: String,
    #[field(validate = len(..1_000_000))]
    pub avatar: Option<TempFile<'r>>,
}

Commands

cargo run                          # Start dev server
cargo build --release              # Production build
cargo test                         # All tests
cargo test test_health_check       # Specific test
cargo fmt                          # Format
cargo clippy                       # Lint
cargo check                        # Fast type-check
cargo doc --open                   # Generate docs
ROCKET_LOG_LEVEL=debug cargo run   # Debug logging

Best Practices

DO

  • Use request guards for authentication/authorization
  • Implement Responder for custom error types
  • Use fairings for cross-cutting concerns (logging, CORS, timing)
  • Leverage Rocket's type system for compile-time validation
  • Use rocket_db_pools for managed database connections
  • Configure via Rocket.toml with per-profile settings
  • Use derive macros (FromForm, FromRequest) to reduce boilerplate
  • Test with rocket::local::asynchronous::Client
  • Register catchers for all common HTTP error codes

DON'T

  • Use unwrap()/expect() in handler code
  • Ignore validation errors from form or JSON input
  • Store secrets in Rocket.toml (use environment variables)
  • Block async handlers with synchronous operations
  • Skip error catchers for 404, 401, 500
  • Use global mutable state when State<T> or request-local cache suffices
  • Forget to attach database pool via .attach(DbPool::init())

Advanced Patterns

For detailed handler examples, database integration, authentication flows, form handling, and testing patterns, see:

External References

适合场景

01

用户想查找某类 Agent Skill 时

02

需要根据任务场景推荐可安装能力包时

03

需要对比不同来源的安装命令和来源信息时

能力概览

能力 1

按任务关键词查找相关 Skills

能力 2

展示可复制的安装命令

能力 3

保留来源站点、仓库和原始说明,方便继续核验

能力 4

展示第三方安全扫描或审计结果

安装后应在对应宿主中按原始 README 的触发条件使用;具体调用方式请以来源页面和 README 为准。

平台分布

Codex

37.14%
按下载量换算26

Claude

27.94%
按下载量换算20

Cursor

18.72%
按下载量换算13

Gemini CLI

8.56%
按下载量换算6

安全审计

Gen Agent Trust Hub

通过

Socket

通过

Snyk

通过

权限和风险

需要联网

该 Skill 可能需要联网访问来源站点、仓库或外部 API;具体网络访问范围需要结合源码和 README 复核。

安装前确认

本站仅展示第三方公开信息,不托管安装包,不提供自动安装或运行环境。安装前应自行审查源码、依赖和命令行为。当前只有一个来源,正式发布前建议补源仓库或其他目录站核验。

来源信息

继续浏览同类 Skills