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

@skippercorp/skipper

v1.5.0

Published

<p align="center"> <img src="docs/skipper-logo.png" alt="Skipper logo" width="220" /> </p>

Downloads

1,444

Readme

Workflows can be defined per user in ~/.config/skipper/workflow/*.ts or per workspace in .skipper/workflow/*.ts.

Install

bun add -g @skippercorp/skipper

Or run without installing:

bunx @skippercorp/skipper --help

Quick start

# Clone a repo
skipper clone owner/repo

# Create sandbox resources
skipper sandbox add --repository repo --branch feature

# Run a prompt in a repo
skipper run --repository repo "fix typo in README"

# Pick repo, branch, then workflow
skipper workflow run

# Remove sandbox resources
skipper sandbox remove --repository repo --branch feature

Commands

| Command | Description | |---------|-------------| | skipper clone <owner/repo> | Clone repo into ~/.local/share/github/<repo> | | skipper sandbox add | Create sandbox resources | | skipper sandbox remove (or s rm) | Remove sandbox resources | | skipper run --repository <repo> "<prompt>" | Run prompt in a repo | | skipper workflow run | Pick repo, branch, workflow and run it | | skipper task create | Create a task | | skipper task list | List all tasks | | skipper task get --id <id> | Get task by ID | | skipper task update-state --id <id> --state <state> | Update task state | | skipper task delete --id <id> | Delete a task |

Workflows

Workflow files are TypeScript modules discovered from:

~/.config/skipper/workflow/*.ts
~/.local/share/github/my-repo/.skipper/workflow/*.ts
~/.local/share/skipper/worktree/my-repo/my-repo.feature/.skipper/workflow/*.ts
  • skipper workflow run uses pickers: repository -> branch -> workflow
  • workflow name comes from the filename stem
  • if user + repo/worktree have same workflow name, repo/worktree wins
  • workflows run with bun
  • repo/worktree workflow lookup uses the selected workspace path

Example workflow:

export default async function issueTriage(context, { issueNumber }) {
  const details = await context.shell(
    `gh issue view ${issueNumber} --json number,title,body,comments`
  );
  const comment = await context.prompt(
    `Summarize triage for issue #${issueNumber}: ${details.stdout}`
  );
  await context.shell(`gh issue comment ${issueNumber} --body-file -`, {
    stdin: comment,
  });
}

Example code-review workflow for current local changes:

export default async function codeReviewWorkflow(context) {
  const diff = await context.shell(
    "git diff --cached --no-ext-diff && git diff --no-ext-diff"
  );

  if (diff.stdout.trim().length === 0) {
    process.stdout.write("No local changes to review.\n");
    return;
  }

  const review = await context.prompt(
    [
      "Review these local git changes. Staged diff comes first, then unstaged diff.",
      "Only report major or minor issues: correctness, regressions, security, reliability, and meaningful test gaps.",
      "Ignore style-only feedback and nitpicks.",
      "Keep feedback concise and actionable.",
      "",
      diff.stdout,
    ].join("\n")
  );

  process.stdout.write(`${review.trim()}\n`);
}

Optional input:

skipper workflow run --input '{"issueNumber":123}'

Workflow host API in V1:

  • context.shell(command, { stdin? }) returns { stdout, stderr, exitCode }
  • context.prompt(text) runs the configured agent command and returns stdout

Requirements

  • bun
  • git
  • gh (GitHub CLI)
  • tmux

Development

bun install
bun run cli -- --help
bun run typecheck
bun test

Release

Uses Changesets for versioning:

bun run changeset  # Add changeset
bun run version-packages  # Bump versions
bun run release  # Publish to npm