pina_cli 0.8.0

CLI tool for Pina Solana programs (IDL generation and more)
Documentation

pina_cli

CLI and library for generating Codama IDLs from Pina programs.

The binary name is pina.

Crates.io Docs.rs CI License codecov

Installation

cargo install pina_cli

Or run from source in this repository:

cargo run -p pina_cli -- --help

Commands

pina idl

Generate a Codama rootNode JSON from a Pina program crate.

# Write to stdout.
pina idl --path ./examples/counter_program

# Write to a file.
pina idl --path ./examples/counter_program --output ./codama/idls/counter_program.json

# Override program name in generated output.
pina idl --path ./examples/counter_program --name my_program_alias

pina init

Scaffold a new Pina program project.

pina init my_program
pina init my_program --path ./programs/my_program --force

pina profile

Static CU profiler for compiled SBF programs.

pina profile target/deploy/my_program.so
pina profile target/deploy/my_program.so --json
pina profile target/deploy/my_program.so --output report.json

pina codama generate

Generate Codama IDLs and Rust/JS clients from one or more example program crates.

pina codama generate
pina codama generate --example counter_program --example todo_program

Library API

pina_cli can also be embedded directly:

use std::path::Path;

let root = pina_cli::generate_idl(Path::new("./examples/counter_program"), None)?;
println!("{}", serde_json::to_string_pretty(&root)?);
# Ok::<(), Box<dyn std::error::Error>>(())

Codama Workflow

  1. Generate IDL with pina idl.
  2. Feed the JSON into Codama renderers.

JavaScript clients in another project

pina idl --path ./programs/my_program --output ./idls/my_program.json
pnpm add -D codama @codama/renderers-js
import { renderVisitor as renderJsVisitor } from "@codama/renderers-js";
import { createFromFile } from "codama";

const codama = await createFromFile("./idls/my_program.json");
await codama.accept(renderJsVisitor("./clients/js/my_program"));

Pina-style Rust clients

This repository includes crates/pina_codama_renderer, which renders discriminator-first/bytemuck Rust client models from Codama JSON.

cargo run --manifest-path ./crates/pina_codama_renderer/Cargo.toml -- \
  --idl ./idls/my_program.json \
  --output ./clients/rust

Parser Expectations

The IDL parser supports multi-file programs — it follows mod declarations from src/lib.rs to discover accounts, instructions, and discriminators across all source files.

For best IDL extraction fidelity, follow the rules documented in crates/pina_cli/rules.md.