npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@rcrsr/rill-ext-claude-code

v0.8.6

Published

rill extension for Claude Code CLI integration

Readme

@rcrsr/rill-ext-claude-code

rill extension for executing Claude Code operations from rill scripts. Provides prompt, skill, and command host functions with streaming output parsing, token tracking, and process lifecycle management.

Experimental. Breaking changes will occur before stabilization.

Install

npm install @rcrsr/rill-ext-claude-code

Peer dependencies: @rcrsr/rill, node-pty

Quick Start

import { parse, execute, createRuntimeContext, prefixFunctions } from '@rcrsr/rill';
import { createClaudeCodeExtension } from '@rcrsr/rill-ext-claude-code';

const ext = createClaudeCodeExtension();
const prefixed = prefixFunctions('claude_code', ext);
const { dispose, ...functions } = prefixed;

const ctx = createRuntimeContext({
  functions,
  callbacks: { onLog: (v) => console.log(v) },
});

const script = `claude_code::prompt("Explain TCP handshakes")`;
const result = await execute(parse(script), ctx);

dispose?.();

Host Functions

All functions return a dict with result, tokens, cost, exitCode, and duration.

claude_code::prompt(text, options?)

Execute a Claude Code prompt.

claude_code::prompt("Analyze this code for security issues") => $response
$response.result -> log
$response.tokens.output -> log

claude_code::skill(name, args?)

Execute a Claude Code skill (slash command).

claude_code::skill("commit", [message: "fix: resolve login bug"])

claude_code::command(name, args?)

Execute a Claude Code command.

claude_code::command("review-pr", [pr: "123"]) => $review
$review.result -> log

Configuration

const ext = createClaudeCodeExtension({
  binaryPath: '/usr/local/bin/claude',     // default: 'claude'
  defaultTimeout: 60000,                   // default: 1800000 (30 min)
  dangerouslySkipPermissions: true,        // default: true
  settingSources: '',                      // default: '' (no plugins)
});

| Option | Type | Default | Description | |--------|------|---------|-------------| | binaryPath | string | 'claude' | Path to Claude Code CLI binary | | defaultTimeout | number | 1800000 | Default timeout in ms (max: 3600000) | | dangerouslySkipPermissions | boolean | true | Bypass permission checks | | settingSources | string | '' | Setting sources to load (see below) |

settingSources

Controls which Claude Code settings load at startup. Maps to --setting-sources.

| Value | Effect | |-------|--------| | '' (default) | No settings loaded. Disables plugins, MCP servers, slash commands. | | 'user' | Load user settings (~/.claude/settings.json) including plugins. | | 'project' | Load project settings (.claude/settings.json). | | 'user,project' | Load both user and project settings. |

The factory validates the binary path and timeout eagerly. It throws if the binary is not found in $PATH or the timeout is out of range.

Result Shape

interface ClaudeCodeResult {
  result: string;      // combined text from assistant messages
  tokens: TokenCounts; // prompt, cacheWrite5m, cacheWrite1h, cacheRead, output
  cost: number;        // total cost in USD
  exitCode: number;    // CLI process exit code (0 = success)
  duration: number;    // execution duration in ms
}

Lifecycle

Call dispose() on the extension to clean up active processes:

const ext = createClaudeCodeExtension();
// ... use extension ...
await ext.dispose?.();

Test Host

A runnable example at examples/test-host.ts wires up the extension with the rill runtime:

# Built-in demo
pnpm exec tsx examples/test-host.ts

# Inline expression
pnpm exec tsx examples/test-host.ts -e 'claude_code::prompt("Tell me a joke") -> log'

# Script file
pnpm exec tsx examples/test-host.ts script.rill

Requires node-pty native module built for your platform and claude in $PATH.

Documentation

| Document | Description | |----------|-------------| | Extensions Guide | Extension contract and patterns | | Host API Reference | Runtime context and host functions |

License

MIT