Development skill for bili-rs, a Rust CLI tool for Bilibili (B站). Use when implementing features, fixing bugs, or extending the bilibili-cli-rust codebase. Provides architecture conventions, API endpoints, coding patterns, and project-specific constraints. Triggers on tasks involving adding CLI commands, calling Bilibili APIs, handling authentication, implementing output formatting, or working with the layered cli/commands/client/payloads architecture.
Rust rewrite of bilibili-cli. Single binary, no runtime deps. Full feature parity with the Python original.
cli/ (clap structs only) → commands/ (business logic) → client/ (HTTP async fn)
↓
payloads/ (normalize raw JSON → structs)
↓
formatter.rs (JSON/YAML/Rich output)
Rules:
cli/ — clap derive structs only, zero business logiccommands/ — calls client/, never builds HTTP requests directlyclient/ — never imports clap or formattersrc/cli/<domain>.rssrc/commands/<domain>.rssrc/client/<domain>.rssrc/payloads/<domain>.rs if neededsrc/main.rs run() match arm// client/ layer: always map API errors
let code = body["code"].as_i64().unwrap_or(-1);
if code != 0 {
return Err(map_api_error(code, body["message"].as_str().unwrap_or("unknown")));
}
// commands/ layer
match result {
Ok(data) => formatter::output(data, format),
Err(e) => { emit_error(&e, format); std::process::exit(1); }
}
SuccessEnvelope { ok: true, schema_version: "1", data: T }
ErrorEnvelope { ok: false, schema_version: "1", error: ErrorBody }
--json > --yaml > $OUTPUT env var > TTY→Rich / non-TTY→YAML
Optional — load saved creds if available, don't fail if missingRead — requires SESSDATAWrite — requires SESSDATA + bili_jctCredential file: ~/.bilibili-cli/credential.json (0o600, 7-day TTL)
Some Bilibili endpoints require a WBI request signature (a per-request HMAC-like parameter). Use src/client/wbi.rs:
let (img_key, sub_key) = fetch_wbi_keys(cred).await?;
let params = sign_params(vec![("bvid".to_string(), bvid)], &img_key, &sub_key);
req = req.query(¶ms);
Known endpoints needing WBI: /x/web-interface/view/conclusion/get
console::stylecomfy-table) or JSON/YAML"X.X万" formatcargo build && cargo clippy -- -D warnings && cargo fmt --check && cargo test
PRD.md in project rootCLAUDE.md in project root