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

@octalmesh/seagull-core

v0.1.1

Published

The Seagull engine.

Readme

Published independently for anyone who wants just this piece - e.g. scripting against loadConfig() without pulling in the CLI's commander dependency or the docs bundle. Most people should install @octalmesh/seagull instead, which bundles this package (and -cli/-docs) into one.

| Path | What it is | |--------------------|-----------------------------------------------------------------------------------------------------------------------------------| | config/ | The seagull.yaml zod schema, loader, {...} template engine, paths.specFormat helpers, and publishing-conventions resolution | | generator/ | The Generator abstract primitive and the GeneratorRegistry every concrete generator plugs into | | generators/ | The built-in openapi-generator-cli and openapi-typescript generator implementations | | readme/ | README rendering for generated SDK artifacts (custom template or built-in default, per language/kind) | | redocly/ | Keeps redocly.yaml in sync with seagull.yaml | | version/ | hashSpec/resolveVersion - content hashing and info.version extraction from a bundled spec | | git/, process/ | Small git/process utilities (run, resolveBinPath, assertSafeRefName, ...) used by the pipeline commands |

flowchart LR
  A["seagull.yaml<br/>generators.*.tool"] --> B{{"GeneratorRegistry.resolve(tool)"}}
  B -->|"openapi-generator"| C["OpenApiGeneratorCli"]
  B -->|"openapi-typescript"| D["OpenApiTypescriptGenerator"]
  C --> E(["generate(ctx) -> dist/sdk/&lt;contract&gt;/&lt;artifact&gt;"])
  D --> E

  classDef node fill:#363636,stroke:#666,color:#fff,rx:6,ry:6
  classDef result fill:#1f6feb,stroke:#1f6feb,color:#fff,rx:20,ry:20
  class A,B,C,D node
  class E result

GeneratorRegistry looks up one Generator instance per tool (SdkTool, currently "openapi-generator" | "openapi-typescript" - a closed union, not an open plugin-name string) - one instance per underlying tool, not per language, since a single openapi-generator-cli -g java/-g go invocation already covers every language that tool supports.

import { Generator, GeneratorRegistry } from "@octalmesh/seagull-core";
import type { GenerateContext } from "@octalmesh/seagull-core";

class MyOpenApiGeneratorCli extends Generator {
  readonly tool = "openapi-generator"; // must be an existing SdkTool value

  async generate(ctx: GenerateContext): Promise<void> {
    // your own openapi-generator-cli invocation, patching, etc.
  }
}

const registry = new GeneratorRegistry().register(new MyOpenApiGeneratorCli());

tool is typed SdkTool, so this is swapping the implementation behind an existing tool name (useful if you want different generator behavior than the built-in OpenApiGeneratorCli/OpenApiTypescriptGenerator, in your own script built on loadConfig() + a custom GeneratorRegistry) - it's not a way to add a brand-new third tool name to generators.*.tool in seagull.yaml itself, since the CLI's own registry and the config schema both only know about the two built-in values today.