Skip to content
System One

Dicklesworthstone/skillranker

Rust CLI that hands an agent's live session context to Jev, which compares the available skills and estimates which fit the next step. Ships Claude Code hooks, structured JSON, abstention, a terminal display and local feedback.

Dicklesworthstone/skillranker on GitHub

Stars
116
Forks
8
Language
Rust
Last push
24 Sep 2026

Read from GitHub on . Counts change daily.

SkillRanker is a standalone Rust CLI that helps a coding agent pick the right skill for its next step. It gathers the recent conversation, the current request, workspace signals, and the harness’s visible skill inventory, then hands that context to Jev, which first does a broad comparison across all candidate skills and then reads richer descriptions for a shortlist before judging fit. Both rounds include a real “none of these” option, and the result is advisory: the agent still decides what to actually use.

Both rounds use Jev’s typed choice and noul questions. For libraries larger than 254 eligible skills, a separate local search tool, Quill from FrankenSearch, narrows the candidates before Jev evaluates them; smaller skill sets go to Jev in full. It ships Claude Code hooks for automatic integration, structured JSON output, an inline terminal display, and local feedback records, plus a calibrate command that proposes new thresholds from a labeled evaluation but does not change them silently. A TypeSafe API key is required to use the ranking system at all.

The project’s stated problem is that a large skill library makes choosing a skill its own task: similar descriptions blur useful distinctions, and a skill that helped early in a conversation can be irrelevant a few turns later, so loading the wrong one wastes context and can steer the agent off task.

How it uses Jev

use skillranker::limits::DurationMillis;
use skillranker::runtime::EntryClock;

fn endpoint() -> CanonicalOrigin {
    CanonicalOrigin::parse("https://api.typesafe.ai").expect("valid production origin")
}

fn clock() -> EntryClock {
    EntryClock::capture_with(
        DurationMillis::new("total", 30_000, 60_000).unwrap(),
        DurationMillis::new("cleanup", 500, 60_000).unwrap(),
    )
    .unwrap()
}

View in tests/jev_admission.rs

Open on GitHub

More like this

Use cases this is tagged with