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

@harness-kernel/skills

v0.5.0

Published

Package-only skill registry, prompts, gated tools, and audit events for Harness Kernel agents.

Downloads

304

Readme

@harness-kernel/skills

Package-only skill helpers for Harness Kernel agents.

A skill is a procedural capability, not an executable tool by itself. It declares when it should be used, adds prompt instructions when active, owns a set of gated tools, and records auditable events/logs for activation, deactivation, and blocked tool calls.

Skills do not own context providers. Attach the single skills.provider returned by createSkillKit() to mode.providers; keep other context providers as normal mode providers.

The package uses a soft gate outside @harness-kernel/core: skill tools are visible in the mode catalog, but the wrapper only delegates to the original tool after the skill is active.

Install

pnpm add @harness-kernel/skills

Basic Usage

import { defineAgent } from "@harness-kernel/core/agent";
import { HarnessMode } from "@harness-kernel/core/agent/mode";
import { createSkillKit, defineSkill } from "@harness-kernel/skills";

const githubSkill = defineSkill({
  key: "github-pr-review",
  description: "Review GitHub pull requests and address review comments.",
  prompt: "Inspect unresolved comments before proposing code changes.",
  tools: [readPullRequestTool, listReviewCommentsTool],
});

const skills = createSkillKit([githubSkill]);

class DevMode extends HarnessMode {
  prompt = "You are a coding agent.";
  providers = [skills.provider];
  tools = [...skills.tools];
}

const devMode = new DevMode();

export const agent = defineAgent({
  label: "Dev Agent",
  initialMode: devMode,
  modes: [devMode],
  declaredEvents: skills.events,
});

Runtime Flow

  1. The prompt provider lists available skills and active skills.
  2. The model calls activate_skill({ key, reason }).
  3. The package writes state.skills.active[key].
  4. The next context build includes the active skill prompt.
  5. Gated tools from that skill delegate to the original tools.

If a gated tool is called too early, it returns structured data with code: "skill.required" and emits SkillRequiredEvent. It does not mark the run as a technical tool error.

API

  • defineSkill(input) normalizes a skill declaration.
  • createSkillRegistry(skills) validates duplicate skill keys and duplicate skill tool names.
  • listAvailableSkills(), listActiveSkills(), listInactiveSkills(), and isSkillActive() inspect registry/state.
  • activateSkill() and deactivateSkill() mutate session state and emit events/logs.
  • createSkillPromptProvider() injects active skill instructions.
  • createSkillActivationTool(), createSkillDeactivationTool(), and createSkillListTool() expose model-facing controls.
  • createSkillGatedTools() wraps skill tools with the soft gate.
  • createSkillKit() returns { registry, provider, tools, events }.
  • skillEvents() returns the custom event classes for declaredEvents.

Use createSkillGatedTools(registry, { skillKeys: ["docs-research"] }) when a mode should expose only a subset of skill tools.

The default state key is skills. Pass { stateKey: "mySkills" } to helpers, tools, provider, or createSkillKit() to use another key.

Skills do not grant authority. Tool approval, risk, permissions, sandbox policy, and host approval callbacks still belong to the core runtime and host application.