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

@hesed/harness

v0.2.0

Published

Extensible CLI harness for running configurable AI coding agents

Readme

harness

Extensible CLI harness for running configurable AI coding agents

Version Downloads/week

Quick start

$ ai profile add fast --provider openai --model gpt-4.1 --api openai-responses --api-key-env OPENAI_API_KEY --use
$ ai workspace add app --mode sandbox --repo https://github.com/example/app.git --clone --use
$ ai skills add review ./skills/review/SKILL.md --description "Code review workflow"
$ ai lsp list --workspace app
$ ai tools list
$ ai prompt add summarize "Inspect the project and summarize the architecture" --description "Architecture summary"
$ ai prompt run summarize --profile fast --workspace app
$ ai run "Inspect the project and summarize the architecture" --profile fast --workspace app

Profiles, workspaces, and skills are stored in ~/.ai-harness/config.json by default. Set HARNESS_HOME to use a different config root, which is useful for tests or separate environments. Saved prompts are persisted separately through @hesed/plugin-lib under the CLI's standard config directory (override with AI_CONFIG_DIR).

Usage

$ npm install -g @hesed/harness
$ ai COMMAND
running command...
$ ai (--version)
@hesed/harness/0.2.0 linux-x64 node-v24.17.0
$ ai --help [COMMAND]
USAGE
  $ ai COMMAND
...

Commands

ai lsp list

Detect language servers for a workspace

USAGE
  $ ai lsp list [-w <value>]

FLAGS
  -w, --workspace=<value>  Workspace name to inspect

DESCRIPTION
  Detect language servers for a workspace

See code: src/commands/lsp/list.ts

ai profile add NAME

Create or update an LLM provider profile

USAGE
  $ ai profile add NAME --api
    anthropic-messages|azure-openai-responses|google-generative-ai|google-vertex|mistral|openai-codex-responses|openai-c
    ompletions|openai-responses --model <value> --provider <value> [--api-key-env <value>] [--base-url <value>] [--use]

ARGUMENTS
  NAME  Profile name

FLAGS
  --api=<option>         (required) Provider API adapter
                         <options: anthropic-messages|azure-openai-responses|google-generative-ai|google-vertex|mistral|
                         openai-codex-responses|openai-completions|openai-responses>
  --api-key-env=<value>  Environment variable containing the API key
  --base-url=<value>     Custom provider base URL
  --model=<value>        (required) Model id
  --provider=<value>     (required) Provider id
  --use                  Set this profile active

DESCRIPTION
  Create or update an LLM provider profile

See code: src/commands/profile/add.ts

ai profile list

List configured LLM provider profiles

USAGE
  $ ai profile list

DESCRIPTION
  List configured LLM provider profiles

See code: src/commands/profile/list.ts

ai profile show [NAME]

Show one LLM provider profile

USAGE
  $ ai profile show [NAME]

ARGUMENTS
  [NAME]  Profile name. Defaults to active profile.

DESCRIPTION
  Show one LLM provider profile

See code: src/commands/profile/show.ts

ai profile use NAME

Select the default LLM provider profile

USAGE
  $ ai profile use NAME

ARGUMENTS
  NAME  Profile name

DESCRIPTION
  Select the default LLM provider profile

See code: src/commands/profile/use.ts

ai prompt add NAME BODY

Create or overwrite a saved prompt

USAGE
  $ ai prompt add NAME BODY [-d <value>]

ARGUMENTS
  NAME  Prompt name
  BODY  Prompt text to save

FLAGS
  -d, --description=<value>  Short prompt description

DESCRIPTION
  Create or overwrite a saved prompt

See code: src/commands/prompt/add.ts

ai prompt delete NAME

Delete a saved prompt

USAGE
  $ ai prompt delete NAME

ARGUMENTS
  NAME  Prompt name

DESCRIPTION
  Delete a saved prompt

ALIASES
  $ ai prompt rm

See code: src/commands/prompt/delete.ts

ai prompt edit NAME [BODY]

Edit a saved prompt

USAGE
  $ ai prompt edit NAME [BODY] [-d <value>]

ARGUMENTS
  NAME    Prompt name
  [BODY]  Replacement prompt text

FLAGS
  -d, --description=<value>  Replacement prompt description

DESCRIPTION
  Edit a saved prompt

See code: src/commands/prompt/edit.ts

ai prompt list

List saved prompts

USAGE
  $ ai prompt list

DESCRIPTION
  List saved prompts

See code: src/commands/prompt/list.ts

ai prompt rm NAME

Delete a saved prompt

USAGE
  $ ai prompt rm NAME

ARGUMENTS
  NAME  Prompt name

DESCRIPTION
  Delete a saved prompt

ALIASES
  $ ai prompt rm

ai prompt run NAME

Execute a saved prompt through a selected profile and workspace

USAGE
  $ ai prompt run NAME [--dry-run] [-p <value>] [-w <value>]

ARGUMENTS
  NAME  Prompt name

FLAGS
  -p, --profile=<value>    Profile name to use
  -w, --workspace=<value>  Workspace name to use
      --dry-run            Print the resolved launch context without starting Pi

DESCRIPTION
  Execute a saved prompt through a selected profile and workspace

See code: src/commands/prompt/run.ts

ai prompt show NAME

View a saved prompt

USAGE
  $ ai prompt show NAME

ARGUMENTS
  NAME  Prompt name

DESCRIPTION
  View a saved prompt

See code: src/commands/prompt/show.ts

ai run [MESSAGE]

Run the Pi coding agent through a selected harness profile and workspace

USAGE
  $ ai run [MESSAGE] [--dry-run] [-p <value>] [-w <value>]

ARGUMENTS
  [MESSAGE]  Prompt to send to the agent

FLAGS
  -p, --profile=<value>    Profile name to use
  -w, --workspace=<value>  Workspace name to use
      --dry-run            Print the resolved launch context without starting Pi

DESCRIPTION
  Run the Pi coding agent through a selected harness profile and workspace

See code: src/commands/run/index.ts

ai skills add NAME PATH

Register a reusable skill for the agent

USAGE
  $ ai skills add NAME PATH [-d <value>]

ARGUMENTS
  NAME  Skill name
  PATH  Path to a skill file or directory

FLAGS
  -d, --description=<value>  Short skill description

DESCRIPTION
  Register a reusable skill for the agent

See code: src/commands/skills/add.ts

ai skills list

List registered skills

USAGE
  $ ai skills list

DESCRIPTION
  List registered skills

See code: src/commands/skills/list.ts

ai tools call TOOL

Call a harness tool: a built-in workspace tool or any host command

USAGE
  $ ai tools call TOOL... [-w <value>]

ARGUMENTS
  TOOL...  Tool name: a built-in workspace tool or a host command

FLAGS
  -w, --workspace=<value>  Workspace name to use

DESCRIPTION
  Call a harness tool: a built-in workspace tool or any host command

EXAMPLES
  $ ai tools call read src/index.ts

  $ ai tools call grep "needle with spaces"

  $ ai tools call profile:add -- fast --provider openai --model gpt-4.1

See code: src/commands/tools/call.ts

ai tools list

List the tools available to the harness: built-in workspace tools and every host command

USAGE
  $ ai tools list

DESCRIPTION
  List the tools available to the harness: built-in workspace tools and every host command

See code: src/commands/tools/list.ts

ai workspace add NAME

Create or update a workspace

USAGE
  $ ai workspace add NAME [--branch <value>] [--clone] [--mode local|sandbox] [--path <value>] [--repo <value>]
    [--use]

ARGUMENTS
  NAME  Workspace name

FLAGS
  --branch=<value>  Git branch to clone or record
  --clone           Clone --repo into the workspace path
  --mode=<option>   [default: local] Workspace mode
                    <options: local|sandbox>
  --path=<value>    Workspace path. Defaults to cwd for local or harness sandbox root for sandbox.
  --repo=<value>    Git repository URL stored in workspace config
  --use             Set this workspace active

DESCRIPTION
  Create or update a workspace

See code: src/commands/workspace/add.ts

ai workspace list

List configured workspaces

USAGE
  $ ai workspace list

DESCRIPTION
  List configured workspaces

See code: src/commands/workspace/list.ts

ai workspace show [NAME]

Show one workspace

USAGE
  $ ai workspace show [NAME]

ARGUMENTS
  [NAME]  Workspace name. Defaults to active workspace.

DESCRIPTION
  Show one workspace

See code: src/commands/workspace/show.ts

ai workspace use NAME

Select the default workspace

USAGE
  $ ai workspace use NAME

ARGUMENTS
  NAME  Workspace name

DESCRIPTION
  Select the default workspace

See code: src/commands/workspace/use.ts