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

runskein

v0.1.1

Published

Unified engine adapter over the Agent Client Protocol — one API for coding-agent engines, with the built-in adapters bundled.

Readme

runskein

One TypeScript API for coding-agent engines — process lifecycle, sessions, permissions, and a single persistent transcript format — with engines integrated as auto-discovered adapters over the Agent Client Protocol (which is never exposed to you).

npm install runskein

Node.js 22 or newer, ESM only. This installs no engine: runskein drives OpenCode, Kimi Code, Claude Code, Codex or pi already on your PATH, so install at least one and log in first.

Quickstart

import { createHub, policies } from 'runskein';

const hub = createHub(); // bundles the opencode / kimi / claude-code / codex / pi adapters

// What's available on this machine? (cheap; never spawns)
console.table(await hub.engines());

// One conversation on one engine (spawns on demand, engines share processes)
const session = await hub.session({
  engine: 'opencode',
  cwd: process.cwd(),
  permissionPolicy: policies.allowAll, // the default; denyAll / rules([...]) / your own
});

session.on('update', (e) => {
  if (e.update.sessionUpdate === 'agent_message_chunk' && e.update.content.type === 'text') {
    process.stdout.write(e.update.content.text);
  }
});

const result = await session.prompt('Summarize this repository.');
console.log('\nturn ended:', result.stopReason, `${result.durationMs}ms`);

// The transcript persisted itself (.transcripts/ by default; sqliteStore available)
for await (const event of session.transcript()) {
  // {seq, ts, sessionId, engineId, update} — ACP vocabulary, runskein envelope
}

// Resume later — native when the engine supports it, transcript-digest
// rebuild when it doesn't; the session id stays the same either way:
const resumed = await hub.session({ engine: 'opencode', cwd: process.cwd(), resume: session.id });
console.log(resumed.resumeTier); // 'native' | 'load' | 'rebuilt'

await session.close();
await hub.quit();

The default policy is allowAll, so the agent may read and write files under the cwd you pass. Point a first experiment at a directory you can throw away.

Adding an engine

Drop a directory with a runskein.adapter marker in <cwd>/adapters/<id>/ (or publish a runskein-adapter-<id> package) whose default export follows the adapter spec — no core or consumer changes. See the adapter guide and the bundled adapters/* packages for reference.

Docs

Questions, or an engine behaving differently from the matrix? Open an issue.