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

opencode-stream-rules

v0.1.1

Published

Inject rules when needed, without wasting context.

Downloads

264

Readme

opencode-stream-rules

Inject rules when needed, without wasting context.

You can write custom streaming rules for the agent.

These rules are injected only as a steering notice after a pattern match, then agent retry from the same point. This allows you to control the boundaries of agent behavior, without wasting context.

Similar to oh-my-pi's "Time-traveling stream rules", but with a very simple and compact code implementation.

Install

opencode plugin opencode-stream-rules

Or add to opencode.json:

{ "plugin": ["opencode-stream-rules"] }

After installing

You need to write the rules in your own .ts file. This plugin WON'T WORK by default until you edit the rules.

You can start with:

mv rules/rules.ts.example rules/rules.local.ts
  • Rules live in the rules/ directory next to this plugin (e.g. ~/.config/opencode/plugins/stream-rules)
    • Files starting with _ are skipped.
    • To point at a different rules directory: { "plugin": [["opencode-stream-rules", { "rules": "path/to/your/rules" }]] }
  • Using .ts as rules makes it easier to write pattern match functions without being limited to regx. Code is cheap; let your agent write the code!
  • A rule with reject: true will only be rejected on the first toolcall; subsequent attempts by the agent will be allowed. This provides steering while avoiding overly restricting the model (e.g., allowing pip install if it's already in a container).

Writing rules

Example:

// rules/rules.local.ts
import type { Rule } from "../index.ts"

export default [
  {
    match: (v) =>
      v.includes("pip") &&
      v.includes("install") &&
      !v.includes("uv pip") &&
      !v.includes("uvx"),
    reject: true,
    prompt: "Use `uvx` or `uv venv` + `uv pip` instead of `pip install` directly",
  },
  {
    match: (v: string) => v.includes("curl") && v.includes("api.github.com"),
    prompt:
      "Prefer using `gh` cli over `curl https://api.github.com/...`. gh offers more requests limits.",
  },
  {
    match: (v) => v.includes("pdf"),
    prompt: "Use the `markitdown` skill to read PDF files.",
  },
  // add your rules here
]

A rule has three fields:

| field | required | description | | -------- | -------- | -------------------------------------------------------------------- | | match | ✅ | (v: string) => boolean, any responses/toolcalls returned by LLM will attempted to be matched | | prompt | ✅ | The prompt for steering | | reject | | If true, prevent toolcalls first, instead of just steering |