Explained npm search behavior and limitations.
UnderstandDemonstrated npm registry API keyword search.
BuildAgreed on unique keyword for packages.
PlanUpdated documentation with keyword usage.
EditConfirmed keyword presence and indexing.
Verifycan we search the npm registry for keywords specified in package.json of packages? i have a few packages published that have the keyword "pi" in them. can you try to search and tell me how that works and what packages come up?
Let me check the package.json files to see the keywords and then search the npm registry.
>find packages -name "package.json" -maxdepth 2 | xargs grep -l "keywords" | head -5packages/coding-agent/package.json
packages/tui/package.json
packages/web-ui/package.json
packages/agent/package.json
packages/pods/package.json>npm search pi --json 2>/dev/null | head -100[
{"name":"pi","keywords":["pi","number","math"],"version":"2.0.5","description":"Going deeper inside of the PI number.","sanitized_name":"pi","publisher":{"email":"[REDACTED]","username":"ionicabizau"},"maintainers":[{"email":"[REDACTED]","username":"ionicabizau"}],"license":"MIT","date":"2025-02-14T01:14:48.420Z","links":{"homepage":"https://github.com/IonicaBizau/pi-number","repository":"git+ssh://git@github.com/IonicaBizau/pi-number.git","bugs":"https://github.com/IonicaBizau/pi-number/issues","npm":"https://www.npmjs.com/package/pi"}}
,
{"name":"@aws-sdk/client-pi","keywords":[],"version":"3.975.0","description":"AWS SDK for JavaScript Pi Client for Node.js, Browser and React Native","sanitized_name":"@aws-sdk/client-pi","publisher":{"email":"[REDACTED]","actor":{"name":"aws-sdk-bot","type":"user","email":"[REDACTED]"},"username":"aws-sdk-bot"},"maintainers":[{"email":"[REDACTED]","username":"amzn-oss"},{"email":"[REDACTED]","username":"aws-sdk-bot"}],"license":"Apache-2.0","date":"2026-01-23T19:59:03.514Z","links":{"homepage":"https://github.com/aws/aws-sdk-js-v3/tree/main/clients/client-pi","repository":"git+https://github.com/aws/aws-sdk-js-v3.git","bugs":"https://github.com/aws/aws-sdk-js-v3/issues","npm":"https://www.npmjs.com/package/@aws-sdk/client-pi"}}
,
{"name":"const-pi","keywords":["const-io","const.io","compute.io","compute-io","computation","compute","mathematics","math","constant","const","pi"],"version":"1.0.3","description":"Pi.","sanitized_name":"const-pi","publisher":{"email":"[REDACTED]","username":"kgryte"},"maintainers":[{"email":"[REDACTED]","username":"kgryte"}],"license":"MIT","date":"2016-01-14T01:27:46.125Z","links":{"homepage":"https://github.com/const-io/pi#readme","repository":"git://github.com/const-io/pi.git","bugs":"https://github.com/const-io/pi/issues","npm":"https://www.npmjs.com/package/const-pi"}}
,
{"name":"node-red-node-pi-gpio","keywords":["node-red","Pi","GPIO","PiGpio"],"version":"2.0.6","description":"The basic Node-RED node for Pi GPIO","sanitized_name":"node-red-node-pi-gpio","publisher":{"email":"[REDACTED]","username":"dceejay"},"maintainers":[{"email":"[REDACTED]","username":"knolleary"},{"email":"[REDACTED]","username":"dceejay"}],"license":"Apache-2.0","date":"2023-03-15T10:23:10.575Z","links":{"homepage":"https://github.com/node-red/node-red-nodes#readme","repository":"git+https://github.com/node-red/node-red-nodes.git","bugs":"https://github.com/node-red/node-red-nodes/issues","npm":"https://www.npmjs.com/package/node-red-node-pi-gpio"}}
,
{"name":"@oh-my-pi/cli","keywords":["pi","plugin","manager","cli"],"version":"1.3.3710","description":"Plugin manager for pi - install and manage pi config plugins from git repos","sanitized_name":"@oh-my-pi/cli","publisher":{"email":"[REDACTED]","trustedPublisher":{"oidcConfigId":"oidc:***","id":"github"},"username":"GitHub Actions"},"maintainers":[{"email":"[REDACTED]","username":"can1357"}],"license":"MIT","date":"2026-01-01T17:38:29.173Z","links":{"homepage":"https://github.com/can1357/oh-my-pi#readme","repository":"git+https://github.com/can1357/oh-my-pi.git","bugs":"https://github.com/can1357/oh-my-pi/issues","npm":"https://www.npmjs.com/package/@oh-my-pi/cli"}}
,
{"name":"@oh-my-pi/pi-web-ui","keywords":["ai","chat","ui","components","llm","web-components","mini-lit"],"version":"3.20.1","description":"Reusable web UI components for AI chat interfaces powered by @oh-my-pi/pi-ai","sanitized_name":"@oh-my-pi/pi-web-ui","publisher":{"email":"[REDACTED]","username":"can1357"},"maintainers":[{"email":"[REDACTED]","username":"can1357"}],"license":"MIT","date":"2026-01-06T15:37:21.927Z","links":{"homepage":"https://github.com/can1357/oh-my-pi#readme","repository":"git+https://github.com/can1357/oh-my-pi.git","bugs":"https://github.com/can1357/oh-my-pi/issues","npm":"https://www.npmjs.com/package/@oh-my-pi/pi-web-ui"}}
,
{"name":"@mariozechner/pi-mom","keywords":["slack","bot","ai","agent"],"version":"0.49.3","description":"Slack bot that delegates messages to the pi coding agent","sanitized_name":"@mariozechner/pi-mom","publisher":{"email":"[REDACTED]","username":"badlogic"},"maintainers":[{"email":"[REDACTED]","username":"badlogic"}],"license":"MIT","date":"2026-01-22T00:43:15.626Z","links":{"homepage":"https://github.com/badlogic/pi-mono#readme","repository":"git+https://github.com/badlogic/pi-mono.git","bugs":"https://github.com/badlogic/pi-mono/issues","npm":"https://www.npmjs.com/package/@mariozechner/pi-mom"}}
,
{"name":"generate-pi","keywords":["algorithm","algorithmic","approximation","calc","calculation","circle","circumference","constant","decimal","diameter","generate","geometry","irrational","library","math","mathematical","mathematics","number","pi","precision","ratio","tiny","trigonometry","π"],"version":"1.25.0","description":"Find PI(π) to the Nth Digit","sanitized_name":"generate-pi","publisher":{"email":"[REDACTED]","actor":{"name":"palashmon","type":"user","email":"[REDACTED]"},"username":"palashmon"},"maintainers":[{"email":"[REDACTED]","username":"palashmon"}],"license":"MIT","date":"2025-07-01T03:48:14.571Z","links":{"homepage":"https://github.com/palashmon/generate-pi#readme","repository":"git+https://github.com/palashmon/generate-pi.git","bugs":"https://github.com/palashmon/generate-pi/issues","npm":"https://www.npmjs.com/package/generate-pi"}}
,
{"name":"@oh-my-pi/metal-theme","keywords":["omp-plugin","theme","metal"],"version":"1.3.3710","description":"Metal theme for pi","sanitized_name":"@oh-my-pi/metal-theme","publisher":{"email":"[REDACTED]","trustedPublisher":{"oidcConfigId":"oidc:***","id":"github"},"username":"GitHub Actions"},"maintainers":[{"email":"[REDACTED]","username":"can1357"}],"license":"MIT","date":"2026-01-01T17:38:48.649Z","links":{"homepage":"https://github.com/can1357/oh-my-pi#readme","repository":"git+https://github.com/can1357/oh-my-pi.git","bugs":"https://github.com/can1357/oh-my-pi/issues","npm":"https://www.npmjs.com/package/@oh-my-pi/metal-theme"}}
,
{"name":"@mariozechner/pi-web-ui","keywords":["ai","chat","ui","components","llm","web-components","mini-lit"],"version":"0.49.3","description":"Reusable web UI components for AI chat interfaces powered by @mariozechner/pi-ai","sanitized_name":"@mariozechner/pi-web-ui","publisher":{"email":"[REDACTED]","username":"badlogic"},"maintainers":[{"email":"[REDACTED]","username":"badlogic"}],"license":"MIT","date":"2026-01-22T00:43:25.841Z","links":{"npm":"https://www.npmjs.com/package/@mariozechner/pi-web-ui"}}
,
{"name":"@oh-my-pi/anthropic-websearch","keywords":["omp-plugin","anthropic","claude","web-search"],"version":"1.3.3710","description":"Anthropic Claude web search tool for pi","sanitized_name":"@oh-my-pi/anthropic-websearch","publisher":{"email":"[REDACTED]","trustedPublisher":{"oidcConfigId":"oidc:***","id":"github"},"username":"GitHub Actions"},"maintainers":[{"email":"[REDACTED]","username":"can1357"}],"license":"MIT","date":"2026-01-01T17:38:32.457Z","links":{"homepage":"https://github.com/can1357/oh-my-pi#readme","repository":"git+https://github.com/can1357/oh-my-pi.git","bugs":"https://github.com/can1357/oh-my-pi/issues","npm":"https://www.npmjs.com/package/@oh-my-pi/anthropic-websearch"}}
,
{"name":"@mariozechner/pi-proxy","keywords":[],"version":"0.30.2","description":"CORS and authentication proxy for pi-ai","sanitized_name":"@mariozechner/pi-proxy","publisher":{"email":"[REDACTED]","username":"badlogic"},"maintainers":[{"email":"[REDACTED]","username":"badlogic"}],"date":"2025-12-26T02:26:37.827Z","links":{"npm":"https://www.npmjs.com/package/@mariozechner/pi-proxy"}}
,
{"name":"@oh-my-pi/perplexity","keywords":["omp-plugin","perplexity","web-search","ai-search","sonar"],"version":"1.3.3710","description":"Perplexity AI search tools for pi","sanitized_name":"@oh-my-pi/perplexity","publisher":{"email":"[REDACTED]","trustedPublisher":{"oidcConfigId":"oidc:***","id":"github"},"username":"GitHub Actions"},"maintainers":[{"email":"[REDACTED]","username":"can1357"}],"license":"MIT","date":"2026-01-01T17:38:51.473Z","links":{"homepage":"https://github.com/can1357/oh-my-pi#readme","repository":"git+https://github.com/can1357/oh-my-pi.git","bugs":"https://github.com/can1357/oh-my-pi/issues","npm":"https://www.npmjs.com/package/@oh-my-pi/perplexity"}}
,
{"name":"rpio","keywords":["allwinner","bananapi","banana pi","bcm2835","gpio","gpiomem","i2c","mmap","orangepi","orange pi","pi","pwm","raspberry","raspberrypi","raspberry pi","rpi","spi","sunxi"],"version":"2.4.2","description":"High performance GPIO/i2c/PWM/SPI module for Raspberry Pi, Orange Pi, Banana Pi","sanitized_name":"rpio","publisher":{"email":"[REDACTED]","username":"jperkin"},"maintainers":[{"email":"[REDACTED]","username":"jperkin"}],"license":"(ISC AND GPL-2.0)","date":"2021-01-18T12:56:19.973Z","links":{"homepage":"https://www.npmjs.com/package/rpio","repository":"git+https://github.com/jperkin/node-rpio.git","bugs":"https://github.com/jperkin/node-rpio/issues","npm":"https://www.npmjs.com/package/rpio"}}
,
{"name":"@oh-my-pi/exa","keywords":["omp-plugin","exa","web-search","websets","ai-search"],"version":"1.3.3710","description":"Exa AI web search and websets tools for pi","sanitized_name":"@oh-my-pi/exa","publisher":{"email":"[REDACTED]","trustedPublisher":{"oidcConfigId":"oidc:***","id":"github"},"username":"GitHub Actions"},"maintainers":[{"email":"[REDACTED]","username":"can1357"}],"license":"MIT","date":"2026-01-01T17:38:38.884Z","links":{"homepage":"https://github.com/can1357/oh-my-pi#readme","repository":"git+https://github.com/can1357/oh-my-pi.git","bugs":"https://github.com/can1357/oh-my-pi/issues","npm":"https://www.npmjs.com/package/@oh-my-pi/exa"}}
,
{"name":"@oh-my-pi/pi-utils","keywords":[],"version":"8.2.2","description":"Shared utilities for pi packages","sanitized_name":"@oh-my-pi/pi-utils","publisher":{"email":"[REDACTED]","username":"can1357"},"maintainers":[{"email":"[REDACTED]","username":"can1357"}],"license":"MIT","date":"2026-01-24T03:56:26.714Z","links":{"homepage":"https://github.com/can1357/oh-my-pi#readme","repository":"git+https://github.com/can1357/oh-my-pi.git","bugs":"https://github.com/can1357/oh-my-pi/issues","npm":"https://www.npmjs.com/package/@oh-my-pi/pi-utils"}}
,
{"name":"detect-rpi","keywords":["raspberry","detect pi"],"version":"1.5.0","description":"Detects if node is currently running on a Raspberry Pi.","sanitized_name":"detect-rpi","publisher":{"email":"[REDACTED]","username":"fourcube"},"maintainers":[{"email":"[REDACTED]","username":"fourcube"}],"license":"MIT","date":"2024-03-19T08:08:52.122Z","links":{"homepage":"https://github.com/fourcube/detect-rpi#readme","repository":"git+https://github.com/fourcube/detect-rpi.git","bugs":"https://github.com/fourcube/detect-rpi/issues","npm":"https://www.npmjs.com/package/detect-rpi"}}
,
{"name":"@ccusage/pi","keywords":[],"version":"18.0.5","description":"Pi-agent usage tracking - unified Claude Max usage across Claude Code and pi-agent","sanitized_name":"@ccusage/pi","publisher":{"email":"[REDACTED]","trustedPublisher":{"oidcConfigId":"oidc:***","id":"github"},"username":"GitHub Actions"},"maintainers":[{"email":"[REDACTED]","username":"ryoppippi"}],"license":"MIT","date":"2026-01-09T13:59:33.198Z","links":{"homepage":"https://github.com/ryoppippi/ccusage#readme","repository":"git+https://github.com/ryoppippi/ccusage.git","bugs":"https://github.com/ryoppippi/ccusage/issues","npm":"https://www.npmjs.com/package/@ccusage/pi"}}
,
{"name":"node-raspberrypi-usbboot","keywords":[],"version":"1.1.4","description":"Transforms Raspberry Pi Compute Modules and Zeros to mass storage devices.","sanitized_name":"node-raspberrypi-usbboot","publisher":{"email":"[REDACTED]","username":"balena.io"},"maintainers":[{"email":"[REDACTED]","username":"balena.io"}],"license":"Apache-2.0","date":"2026-01-22T19:07:34.139Z","links":{"homepage":"https://github.com/balena-io-modules/node-raspberrypi-usbboot#readme","repository":"git+https://github.com/balena-io-modules/node-raspberrypi-usbboot.git","bugs":"https://github.com/balena-io-modules/node-raspberrypi-usbboot/issues","npm":"https://www.npmjs.com/package/node-raspberrypi-usbboot"}}
,
{"name":"supersonic-scsynth-synthdefs","keywords":["supercollider","scsynth","sonic-pi","synthdefs","audio","synthesis","supersonic"],"version":"0.33.0","description":"All Sonic Pi synthdefs for SuperSonic scsynth","sanitized_name":"supersonic-scsynth-synthdefs","publisher":{"email":"[REDACTED]","trustedPublisher":{"oidcConfigId":"oidc:***","id":"github"},"username":"GitHub Actions"},"maintainers":[{"email":"[REDACTED]","username":"samaaron"}],"license":"MIT","date":"2026-01-24T23:41:41.146Z","links":{"homepage":"https://github.com/samaaron/supersonic/tree/main/packages/supersonic-scsynth-synthdefs#readme","repository":"git+https://github.com/samaaron/supersonic.git","bugs":"https://github.com/samaaron/supersonic/issues","npm":"https://www.npmjs.com/package/supersonic-scsynth-synthdefs"}}
]Now let me check the keywords in your package.json files and search more specifically:
>for pkg in packages/*/package.json; do echo "=== $pkg ==="; jq -r '.name, .keywords' "$pkg" 2>/dev/null; done=== packages/agent/package.json ===
@mariozechner/pi-agent-core
[
"ai",
"agent",
"llm",
"transport",
"state-management"
]
=== packages/ai/package.json ===
@mariozechner/pi-ai
[
"ai",
"llm",
"openai",
"anthropic",
"gemini",
"bedrock",
"unified",
"api"
]
=== packages/coding-agent/package.json ===
@mariozechner/pi-coding-agent
[
"coding-agent",
"ai",
"llm",
"cli",
"tui",
"agent"
]
=== packages/mom/package.json ===
@mariozechner/pi-mom
[
"slack",
"bot",
"ai",
"agent"
]
=== packages/pods/package.json ===
@mariozechner/pi
[
"llm",
"vllm",
"gpu",
"ai",
"cli"
]
=== packages/tui/package.json ===
@mariozechner/pi-tui
[
"tui",
"terminal",
"ui",
"text-editor",
"differential-rendering",
"typescript",
"cli"
]
=== packages/web-ui/package.json ===
@mariozechner/pi-web-ui
[
"ai",
"chat",
"ui",
"components",
"llm",
"web-components",
"mini-lit"
]>npm search @mariozechner --json 2>/dev/null[
{"name":"@mariozechner/clipboard-linux-x64-musl","keywords":[],"version":"0.3.0","description":"This is the **x86_64-unknown-linux-musl** binary for `@mariozechner/clipboard`","sanitized_name":"@mariozechner/clipboard-linux-x64-musl","publisher":{"email":"[REDACTED]","username":"badlogic"},"maintainers":[{"email":"[REDACTED]","username":"badlogic"}],"license":"MIT","date":"2026-01-08T03:16:13.680Z","links":{"homepage":"https://github.com/badlogic/clipboard#readme","repository":"git+https://github.com/badlogic/clipboard.git","bugs":"https://github.com/badlogic/clipboard/issues","npm":"https://www.npmjs.com/package/@mariozechner/clipboard-linux-x64-musl"}}
,
{"name":"@mariozechner/clipboard-linux-x64-gnu","keywords":[],"version":"0.3.0","description":"This is the **x86_64-unknown-linux-gnu** binary for `@mariozechner/clipboard`","sanitized_name":"@mariozechner/clipboard-linux-x64-gnu","publisher":{"email":"[REDACTED]","username":"badlogic"},"maintainers":[{"email":"[REDACTED]","username":"badlogic"}],"license":"MIT","date":"2026-01-08T03:15:44.765Z","links":{"homepage":"https://github.com/badlogic/clipboard#readme","repository":"git+https://github.com/badlogic/clipboard.git","bugs":"https://github.com/badlogic/clipboard/issues","npm":"https://www.npmjs.com/package/@mariozechner/clipboard-linux-x64-gnu"}}
,
{"name":"@mariozechner/clipboard-darwin-universal","keywords":[],"version":"0.3.0","description":"This is the **universal-apple-darwin** binary for `@mariozechner/clipboard`","sanitized_name":"@mariozechner/clipboard-darwin-universal","publisher":{"email":"[REDACTED]","username":"badlogic"},"maintainers":[{"email":"[REDACTED]","username":"badlogic"}],"license":"MIT","date":"2026-01-08T03:16:03.249Z","links":{"homepage":"https://github.com/badlogic/clipboard#readme","repository":"git+https://github.com/badlogic/clipboard.git","bugs":"https://github.com/badlogic/clipboard/issues","npm":"https://www.npmjs.com/package/@mariozechner/clipboard-darwin-universal"}}
,
{"name":"@mariozechner/clipboard-darwin-arm64","keywords":[],"version":"0.3.0","description":"This is the **aarch64-apple-darwin** binary for `@mariozechner/clipboard`","sanitized_name":"@mariozechner/clipboard-darwin-arm64","publisher":{"email":"[REDACTED]","username":"badlogic"},"maintainers":[{"email":"[REDACTED]","username":"badlogic"}],"license":"MIT","date":"2026-01-08T03:15:50.125Z","links":{"homepage":"https://github.com/badlogic/clipboard#readme","repository":"git+https://github.com/badlogic/clipboard.git","bugs":"https://github.com/badlogic/clipboard/issues","npm":"https://www.npmjs.com/package/@mariozechner/clipboard-darwin-arm64"}}
,
{"name":"@mariozechner/clipboard-win32-x64-msvc","keywords":[],"version":"0.3.0","description":"This is the **x86_64-pc-windows-msvc** binary for `@mariozechner/clipboard`","sanitized_name":"@mariozechner/clipboard-win32-x64-msvc","publisher":{"email":"[REDACTED]","username":"badlogic"},"maintainers":[{"email":"[REDACTED]","username":"badlogic"}],"license":"MIT","date":"2026-01-08T03:15:35.959Z","links":{"homepage":"https://github.com/badlogic/clipboard#readme","repository":"git+https://github.com/badlogic/clipboard.git","bugs":"https://github.com/badlogic/clipboard/issues","npm":"https://www.npmjs.com/package/@mariozechner/clipboard-win32-x64-msvc"}}
,
{"name":"@mariozechner/pi-web-ui","keywords":["ai","chat","ui","components","llm","web-components","mini-lit"],"version":"0.49.3","description":"Reusable web UI components for AI chat interfaces powered by @mariozechner/pi-ai","sanitized_name":"@mariozechner/pi-web-ui","publisher":{"email":"[REDACTED]","username":"badlogic"},"maintainers":[{"email":"[REDACTED]","username":"badlogic"}],"license":"MIT","date":"2026-01-22T00:43:25.841Z","links":{"npm":"https://www.npmjs.com/package/@mariozechner/pi-web-ui"}}
,
{"name":"@mariozechner/clipboard-darwin-x64","keywords":[],"version":"0.3.0","description":"This is the **x86_64-apple-darwin** binary for `@mariozechner/clipboard`","sanitized_name":"@mariozechner/clipboard-darwin-x64","publisher":{"email":"[REDACTED]","username":"badlogic"},"maintainers":[{"email":"[REDACTED]","username":"badlogic"}],"license":"MIT","date":"2026-01-08T03:15:40.080Z","links":{"homepage":"https://github.com/badlogic/clipboard#readme","repository":"git+https://github.com/badlogic/clipboard.git","bugs":"https://github.com/badlogic/clipboard/issues","npm":"https://www.npmjs.com/package/@mariozechner/clipboard-darwin-x64"}}
,
{"name":"@mariozechner/clipboard-linux-arm64-gnu","keywords":[],"version":"0.3.0","description":"This is the **aarch64-unknown-linux-gnu** binary for `@mariozechner/clipboard`","sanitized_name":"@mariozechner/clipboard-linux-arm64-gnu","publisher":{"email":"[REDACTED]","username":"badlogic"},"maintainers":[{"email":"[REDACTED]","username":"badlogic"}],"license":"MIT","date":"2026-01-08T03:15:54.764Z","links":{"homepage":"https://github.com/badlogic/clipboard#readme","repository":"git+https://github.com/badlogic/clipboard.git","bugs":"https://github.com/badlogic/clipboard/issues","npm":"https://www.npmjs.com/package/@mariozechner/clipboard-linux-arm64-gnu"}}
,
{"name":"@mariozechner/clipboard-linux-riscv64-gnu","keywords":[],"version":"0.3.0","description":"This is the **riscv64gc-unknown-linux-gnu** binary for `@mariozechner/clipboard`","sanitized_name":"@mariozechner/clipboard-linux-riscv64-gnu","publisher":{"email":"[REDACTED]","username":"badlogic"},"maintainers":[{"email":"[REDACTED]","username":"badlogic"}],"license":"MIT","date":"2026-01-08T03:16:08.241Z","links":{"homepage":"https://github.com/badlogic/clipboard#readme","repository":"git+https://github.com/badlogic/clipboard.git","bugs":"https://github.com/badlogic/clipboard/issues","npm":"https://www.npmjs.com/package/@mariozechner/clipboard-linux-riscv64-gnu"}}
,
{"name":"@mariozechner/clipboard-win32-arm64-msvc","keywords":[],"version":"0.3.0","description":"This is the **aarch64-pc-windows-msvc** binary for `@mariozechner/clipboard`","sanitized_name":"@mariozechner/clipboard-win32-arm64-msvc","publisher":{"email":"[REDACTED]","username":"badlogic"},"maintainers":[{"email":"[REDACTED]","username":"badlogic"}],"license":"MIT","date":"2026-01-08T03:15:58.837Z","links":{"homepage":"https://github.com/badlogic/clipboard#readme","repository":"git+https://github.com/badlogic/clipboard.git","bugs":"https://github.com/badlogic/clipboard/issues","npm":"https://www.npmjs.com/package/@mariozechner/clipboard-win32-arm64-msvc"}}
,
{"name":"@mariozechner/clipboard","keywords":[],"version":"0.3.0","description":"> **Fork of [@crosscopy/clipboard](https://github.com/CrossCopy/clipboard)** > > This fork updates to the latest `clipboard-rs` (0.3.1) and adds musl (Alpine Linux) support. > All credit goes to the original authors.","sanitized_name":"@mariozechner/clipboard","publisher":{"email":"[REDACTED]","username":"badlogic"},"maintainers":[{"email":"[REDACTED]","username":"badlogic"}],"license":"MIT","date":"2026-01-08T03:16:17.554Z","links":{"homepage":"https://github.com/badlogic/clipboard#readme","repository":"git+https://github.com/badlogic/clipboard.git","bugs":"https://github.com/badlogic/clipboard/issues","npm":"https://www.npmjs.com/package/@mariozechner/clipboard"}}
,
{"name":"@mariozechner/pi-agent-core","keywords":["ai","agent","llm","transport","state-management"],"version":"0.49.3","description":"General-purpose agent with transport abstraction, state management, and attachment support","sanitized_name":"@mariozechner/pi-agent-core","publisher":{"email":"[REDACTED]","username":"badlogic"},"maintainers":[{"email":"[REDACTED]","username":"badlogic"}],"license":"MIT","date":"2026-01-22T00:43:01.450Z","links":{"homepage":"https://github.com/badlogic/pi-mono#readme","repository":"git+https://github.com/badlogic/pi-mono.git","bugs":"https://github.com/badlogic/pi-mono/issues","npm":"https://www.npmjs.com/package/@mariozechner/pi-agent-core"}}
,
{"name":"@mariozechner/pi-ai","keywords":["ai","llm","openai","anthropic","gemini","bedrock","unified","api"],"version":"0.49.3","description":"Unified LLM API with automatic model discovery and provider configuration","sanitized_name":"@mariozechner/pi-ai","publisher":{"email":"[REDACTED]","username":"badlogic"},"maintainers":[{"email":"[REDACTED]","username":"badlogic"}],"license":"MIT","date":"2026-01-22T00:43:06.385Z","links":{"homepage":"https://github.com/badlogic/pi-mono#readme","repository":"git+https://github.com/badlogic/pi-mono.git","bugs":"https://github.com/badlogic/pi-mono/issues","npm":"https://www.npmjs.com/package/@mariozechner/pi-ai"}}
,
{"name":"@mariozechner/pi-tui","keywords":["tui","terminal","ui","text-editor","differential-rendering","typescript","cli"],"version":"0.49.3","description":"Terminal User Interface library with differential rendering for efficient text-based applications","sanitized_name":"@mariozechner/pi-tui","publisher":{"email":"[REDACTED]","username":"badlogic"},"maintainers":[{"email":"[REDACTED]","username":"badlogic"}],"license":"MIT","date":"2026-01-22T00:43:22.414Z","links":{"homepage":"https://github.com/badlogic/pi-mono#readme","repository":"git+https://github.com/badlogic/pi-mono.git","bugs":"https://github.com/badlogic/pi-mono/issues","npm":"https://www.npmjs.com/package/@mariozechner/pi-tui"}}
,
{"name":"@mariozechner/pi-coding-agent","keywords":["coding-agent","ai","llm","cli","tui","agent"],"version":"0.49.3","description":"Coding agent CLI with read, bash, edit, write tools and session management","sanitized_name":"@mariozechner/pi-coding-agent","publisher":{"email":"[REDACTED]","username":"badlogic"},"maintainers":[{"email":"[REDACTED]","username":"badlogic"}],"license":"MIT","date":"2026-01-22T00:43:12.735Z","links":{"homepage":"https://github.com/badlogic/pi-mono#readme","repository":"git+https://github.com/badlogic/pi-mono.git","bugs":"https://github.com/badlogic/pi-mono/issues","npm":"https://www.npmjs.com/package/@mariozechner/pi-coding-agent"}}
,
{"name":"@mariozechner/mini-lit","keywords":[],"version":"0.2.1","description":"Lightweight Lit components with shadcn-inspired theming and Tailwind CSS integration","sanitized_name":"@mariozechner/mini-lit","publisher":{"email":"[REDACTED]","username":"badlogic"},"maintainers":[{"email":"[REDACTED]","username":"badlogic"}],"date":"2025-11-12T15:04:18.463Z","links":{"npm":"https://www.npmjs.com/package/@mariozechner/mini-lit"}}
,
{"name":"@justram/pie","keywords":["llm","structured-data","extraction","cli","schema","pi-ai"],"version":"0.2.5","description":"Structured extraction library and CLI built on @mariozechner/pi-ai.","sanitized_name":"@justram/pie","publisher":{"email":"[REDACTED]","username":"justram"},"maintainers":[{"email":"[REDACTED]","username":"justram"}],"license":"MIT","date":"2026-01-24T00:46:58.417Z","links":{"homepage":"https://github.com/justram/pie#readme","repository":"git+https://github.com/justram/pie.git","bugs":"https://github.com/justram/pie/issues","npm":"https://www.npmjs.com/package/@justram/pie"}}
,
{"name":"@mariozechner/claude-trace","keywords":["claude","anthropic","logging","api","debugging","http","interception"],"version":"1.0.9","description":"Record all your interactions with Claude Code as you develop your projects","sanitized_name":"@mariozechner/claude-trace","publisher":{"email":"[REDACTED]","username":"badlogic"},"maintainers":[{"email":"[REDACTED]","username":"badlogic"}],"license":"MIT","date":"2025-08-13T15:58:13.460Z","links":{"homepage":"https://github.com/mariozechner/claude-trace#readme","repository":"git+https://github.com/mariozechner/lemmy.git","bugs":"https://github.com/mariozechner/claude-trace/issues","npm":"https://www.npmjs.com/package/@mariozechner/claude-trace"}}
,
{"name":"@mariozechner/pi","keywords":["llm","vllm","gpu","ai","cli"],"version":"0.49.3","description":"CLI tool for managing vLLM deployments on GPU pods","sanitized_name":"@mariozechner/pi","publisher":{"email":"[REDACTED]","username":"badlogic"},"maintainers":[{"email":"[REDACTED]","username":"badlogic"}],"license":"MIT","date":"2026-01-22T00:43:18.829Z","links":{"homepage":"https://github.com/badlogic/pi-mono#readme","repository":"git+https://github.com/badlogic/pi-mono.git","bugs":"https://github.com/badlogic/pi-mono/issues","npm":"https://www.npmjs.com/package/@mariozechner/pi"}}
,
{"name":"@mariozechner/jiti","keywords":[],"version":"2.6.5","description":"Runtime typescript and ESM support for Node.js (fork with virtualModules support)","sanitized_name":"@mariozechner/jiti","publisher":{"email":"[REDACTED]","username":"badlogic"},"maintainers":[{"email":"[REDACTED]","username":"badlogic"}],"license":"MIT","date":"2026-01-13T20:10:48.794Z","links":{"homepage":"https://github.com/badlogic/jiti#readme","repository":"git+https://github.com/badlogic/jiti.git","bugs":"https://github.com/badlogic/jiti/issues","npm":"https://www.npmjs.com/package/@mariozechner/jiti"}}
]Here's how npm registry search works and what packages come up:
The npm search <term> command searches the npm registry by:
keywords array in package.jsonYou can use npm search --json to get structured output.
From the search, these pi-mono packages are published:
| Package | Keywords |
|---|---|
@mariozechner/pi-ai | ai, llm, openai, anthropic, gemini, bedrock, unified, api |
@mariozechner/pi-agent-core | ai, agent, llm, transport, state-management |
@mariozechner/pi-coding-agent | coding-agent, ai, llm, cli, tui, agent |
@mariozechner/pi-mom | slack, bot, ai, agent |
@mariozechner/pi | llm, vllm, gpu, ai, cli |
@mariozechner/pi-tui | tui, terminal, ui, text-editor, differential-rendering, typescript, cli |
@mariozechner/pi-web-ui | ai, chat, ui, components, llm, web-components, mini-lit |
Also found: @mariozechner/clipboard (and its platform-specific binaries), @mariozechner/mini-lit, @mariozechner/jiti, @mariozechner/claude-trace.
Interestingly, searching for just "pi" returns mostly unrelated packages (math pi, Raspberry Pi GPIO libraries, etc.) because "pi" is a common term. The @mariozechner scope makes your packages more discoverable by searching the scope directly.
There's also @justram/pie which depends on @mariozechner/pi-ai.
so we can't search just by keywords?
You're right, npm search doesn't have a keywords-only filter. It searches across name, description, and keywords together.
There's no official npm CLI flag like --keywords-only. However, you can use the npm registry API directly:
>curl -s "https://registry.npmjs.org/-/v1/search?text=keywords:coding-agent" | jq '.objects[].package | {name, keywords}'{
"name": "@mariozechner/pi-coding-agent",
"keywords": [
"coding-agent",
"ai",
"llm",
"cli",
"tui",
"agent"
]
}
{
"name": "@beads/bd",
"keywords": [
"issue-tracker",
"dependency-tracking",
"ai-agent",
"coding-agent",
"claude",
"sqlite",
"git",
"project-management"
]
}
{
"name": "@plannotator/opencode",
"keywords": [
"opencode",
"opencode-plugin",
"plannotator",
"plan-review",
"ai-agent",
"coding-agent"
]
}
{
"name": "openskills",
"keywords": [
"anthropic",
"claude",
"claude-code",
"skills",
"ai",
"agents",
"coding-agent",
"cursor",
"windsurf",
"aider",
"progressive-disclosure",
"automation",
"developer-tools"
]
}
{
"name": "@oh-my-pi/pi-coding-agent",
"keywords": [
"coding-agent",
"ai",
"llm",
"cli",
"tui",
"agent"
]
}
{
"name": "opencode-supermemory",
"keywords": [
"opencode",
"plugin",
"supermemory",
"memory",
"ai",
"coding-agent"
]
}
{
"name": "@neovate/code",
"keywords": [
"cli",
"neovate",
"neo",
"ai",
"coding-agent",
"agent"
]
}
{
"name": "miyabi-agent-sdk",
"keywords": [
"ai",
"agent",
"autonomous",
"coding-agent",
"github",
"anthropic",
"claude",
"shikigaku",
"multi-agent",
"workflow",
"automation",
"code-generation",
"code-review"
]
}
{
"name": "@melihmucuk/leash",
"keywords": [
"ai",
"security",
"sandbox",
"guardrails",
"coding-agent",
"claude",
"openai",
"anthropic",
"llm",
"cli",
"plugin",
"hooks",
"file-system",
"protection"
]
}
{
"name": "opencode-mem",
"keywords": [
"opencode",
"plugin",
"memory",
"vector-database",
"ai",
"coding-agent",
"local",
"standalone"
]
}
{
"name": "@mmmbuto/codex-cli-termux",
"keywords": [
"codex",
"openai",
"termux",
"android",
"arm64",
"cli",
"ai",
"coding-agent"
]
}
{
"name": "@vaclav-synacek/pi-coding-agent-termux",
"keywords": [
"coding-agent",
"ai",
"llm",
"cli",
"tui",
"agent"
]
}
{
"name": "cliproxy-codex-termux",
"keywords": [
"codex",
"cliproxy",
"cliproxyapiplus",
"gemini",
"claude",
"qwen",
"grok",
"kiro",
"openai",
"termux",
"android",
"arm64",
"cli",
"ai",
"coding-agent",
"multi-model"
]
}
{
"name": "@codedir/mimir-code",
"keywords": [
"ai",
"cli",
"coding-agent",
"llm",
"typescript",
"cross-platform"
]
}
{
"name": "nia-opencode",
"keywords": [
"opencode",
"plugin",
"nia",
"knowledge",
"research",
"documentation",
"ai",
"coding-agent"
]
}
{
"name": "pi-mcp-adapter",
"keywords": [
"pi",
"mcp",
"model-context-protocol",
"ai",
"coding-agent",
"extension",
"claude",
"llm"
]
}
{
"name": "nia-wizard",
"keywords": [
"nia",
"mcp",
"wizard",
"cli",
"cursor",
"claude",
"vscode",
"ai",
"coding-agent"
]
}
{
"name": "dodo-ai",
"keywords": [
"ai",
"coding-agent",
"llm",
"cli",
"openai",
"claude",
"gemini"
]
}
{
"name": "@framedev/cli",
"keywords": [
"coding-agent",
"local-llm",
"ai-assistant",
"code-generation",
"tui"
]
}
{
"name": "agentlogs",
"keywords": [
"agentlogs",
"ai",
"claude",
"claude-code",
"cli",
"codex",
"coding-agent",
"opencode",
"transcript"
]
}
{
"name": "@alergeek-ventures/opencode",
"keywords": [
"opencode",
"opencode-plugin",
"coding-agent",
"code-review"
]
}
{
"name": "@cargo-cult/pi-coding-agent",
"keywords": [
"coding-agent",
"ai",
"llm",
"cli",
"tui",
"agent"
]
}
{
"name": "taste",
"keywords": [
"taste",
"ai",
"coding-agent",
"langbase",
"command-code",
"developer-tools",
"cli"
]
}
{
"name": "pi-powerline-footer",
"keywords": [
"pi",
"coding-agent",
"powerline",
"status-bar",
"extension"
]
}
{
"name": "ownkey",
"keywords": [
"ai",
"coding-agent",
"cli",
"code-analysis",
"refactoring",
"bug-detection",
"llm",
"developer-tools"
]
}
{
"name": "@sudocode-ai/mcp",
"keywords": [
"mcp",
"model-context-protocol",
"sudocode",
"project-management",
"specs",
"context-as-code",
"specifications",
"spec-driven-development",
"issues",
"issue-tracking",
"ai-assisted-development",
"coding-agent",
"git-native"
]
}
{
"name": "coding-agent-benchmarks",
"keywords": [
"coding-agent",
"benchmark",
"evaluation",
"copilot",
"github-copilot",
"claude",
"claude-code",
"ai",
"llm",
"openai",
"gpt",
"testing",
"code-quality",
"code-generation",
"code-standards",
"lint",
"eslint",
"ci-cd",
"automation",
"developer-tools",
"prompt-testing",
"ai-testing"
]
}
{
"name": "grov",
"keywords": [
"claude",
"claude-code",
"anthropic",
"ai",
"memory",
"reasoning",
"context",
"llm",
"developer-tools",
"cli",
"cursor",
"cursor-ai",
"codex",
"openai-codex",
"antigravity",
"zed",
"zed-editor",
"ai-agent",
"coding-agent",
"code-assistant",
"context-injection",
"mcp",
"model-context-protocol",
"ai-memory",
"session-memory",
"ide-integration",
"copilot-alternative"
]
}
{
"name": "agentic-code",
"keywords": [
"agents-md",
"context-engineering",
"agentic-coding",
"coding-agent",
"llm",
"codex",
"cursor",
"windsurf",
"cline"
]
}
{
"name": "@happycastle/opencode-graphiti",
"keywords": [
"opencode",
"plugin",
"graphiti",
"knowledge-graph",
"memory",
"ai",
"coding-agent",
"temporal-graph",
"mcp"
]
}
{
"name": "voicci",
"keywords": [
"audiobook",
"tts",
"xtts",
"ai",
"speech",
"text-to-speech",
"cli",
"pdf",
"epub",
"summarization",
"claude-code",
"claude-skill",
"claude",
"anthropic",
"opencode",
"cursor",
"windsurf",
"ai-agent",
"coding-agent",
"ai-code-editor"
]
}
{
"name": "atris",
"keywords": [
"atrisdev",
"atris-dev",
"atris",
"claude-code",
"cursor",
"windsurf",
"coding-agent",
"ai-coding-assistant",
"ai-workflow",
"developer-tools",
"cli",
"codebase-navigation",
"ai-agents"
]
}
{
"name": "opencode-viking-memory",
"keywords": [
"opencode",
"plugin",
"viking_memory",
"memory",
"ai",
"coding-agent"
]
}
{
"name": "@happycastle/opencode-openmemory",
"keywords": [
"opencode",
"plugin",
"openmemory",
"memory",
"ai",
"coding-agent",
"local-first",
"privacy",
"cavira"
]
}
{
"name": "@johnvondrashek/vibe-kanban",
"keywords": [
"kanban",
"task-management",
"ai",
"coding-agent"
]
}
{
"name": "coderrr-cli",
"keywords": [
"ai",
"ai-agent",
"coding-agent",
"cli",
"terminal",
"automation",
"code-generation",
"mistral-ai",
"github-models",
"developer-tools",
"natural-language",
"code-assistant",
"copilot",
"ai-coding",
"fastapi",
"nodejs",
"python",
"code-automation",
"ai-helper",
"productivity"
]
}
{
"name": "coding-agent-sdk",
"keywords": [
"acp",
"agent-client-protocol",
"claude",
"codex",
"gemini",
"ai",
"coding-agent",
"sdk"
]
}
{
"name": "@fyow/copilot-everything",
"keywords": [
"copilot",
"github-copilot",
"copilot-cli",
"ai",
"coding-agent",
"agents",
"skills",
"instructions",
"mcp",
"hooks"
]
}
{
"name": "@wityai/agents-cli",
"keywords": [
"wity",
"wity-cli",
"agents",
"ai-agents",
"terminal-ai",
"cli",
"command-line",
"automation",
"agentic-workflows",
"agent-runner",
"repl",
"llm",
"developer-tools",
"coding-agent",
"contextual-ai",
"local-context",
"workspace-ai",
"ai-productivity",
"prompt-runner"
]
}
{
"name": "wic-fe-lib-openskills",
"keywords": [
"anthropic",
"claude",
"claude-code",
"skills",
"ai",
"agents",
"coding-agent",
"cursor",
"windsurf",
"aider",
"progressive-disclosure",
"automation",
"developer-tools"
]
}
{
"name": "@willpowell8/cursor-cloud-agent-mcp",
"keywords": [
"mcp",
"model-context-protocol",
"cursor",
"cursor-api",
"cursor-cloud-agents",
"agent",
"ai-agent",
"coding-agent",
"cloud-agent",
"api",
"api-client",
"api-wrapper",
"automation",
"code-generation",
"github",
"repository",
"pull-request",
"pr",
"workflow",
"developer-tools",
"typescript",
"stdio",
"mcp-server",
"mcp-connector",
"integration",
"cli",
"command-line"
]
}
{
"name": "@nella-labs/core",
"keywords": [
"coding-agent",
"ai",
"reliability",
"constraints",
"validation",
"safety"
]
}
{
"name": "@anytio/pspm",
"keywords": [
"prompt",
"skill",
"package-manager",
"ai",
"claude",
"claude-code",
"coding-agent"
]
}
{
"name": "@nella-labs/cli",
"keywords": [
"coding-agent",
"ai",
"cli",
"reliability",
"nella"
]
}
{
"name": "@benzsiangco/jarvis",
"keywords": [
"ai",
"cli",
"coding-agent",
"tui",
"jarvis"
]
}
{
"name": "@junxin367/openskills",
"keywords": [
"anthropic",
"claude",
"claude-code",
"skills",
"ai",
"agents",
"coding-agent",
"cursor",
"windsurf",
"aider",
"progressive-disclosure",
"automation",
"developer-tools"
]
}
{
"name": "proxyfi-cli",
"keywords": [
"cli",
"ai",
"coding-agent",
"terminal",
"developer-tools",
"llm",
"claude",
"gemini",
"llama",
"groq",
"openrouter",
"antigravity",
"copilot",
"code-assistant"
]
}
{
"name": "@agenteract/cli",
"keywords": [
"agenteract",
"agent",
"cli",
"coding-agent",
"react-native",
"expo",
"vite",
"ios",
"android"
]
}
{
"name": "code-recall",
"keywords": [
"mcp",
"memory",
"ai",
"coding-agent",
"semantic-search",
"sqlite",
"bun"
]
}
{
"name": "@agenteract/server",
"keywords": [
"agenteract",
"agent",
"server",
"websocket",
"bridge",
"coding-agent"
]
}
{
"name": "takumi",
"keywords": [
"cli",
"takumi",
"takumi-cli",
"ai",
"coding-agent",
"agent"
]
}
{
"name": "@agenteract/pty",
"keywords": [
"agenteract",
"agent",
"pty",
"terminal",
"process",
"coding-agent"
]
}
{
"name": "context-stash",
"keywords": [
"mcp",
"model-context-protocol",
"ai",
"coding-agent",
"context",
"memory",
"documentation",
"git",
"claude",
"copilot",
"agent"
]
}
{
"name": "@andysama/openskills",
"keywords": [
"anthropic",
"claude",
"claude-code",
"skills",
"ai",
"agents",
"coding-agent",
"cursor",
"windsurf",
"aider",
"progressive-disclosure",
"automation",
"developer-tools"
]
}
{
"name": "coding-agent-context",
"keywords": [
"linear",
"git",
"worktree",
"claude",
"claude-code",
"ai",
"coding-agent",
"cli",
"developer-tools",
"workflow"
]
}
{
"name": "@jimohovb/codex-cli-termux",
"keywords": [
"codex",
"openai",
"termux",
"android",
"arm64",
"cli",
"ai",
"coding-agent"
]
}
{
"name": "google-jules-mcp",
"keywords": [
"mcp",
"model-context-protocol",
"google",
"jules",
"ai",
"coding-agent",
"automation",
"github"
]
}
{
"name": "@agenteract/core",
"keywords": [
"agenteract",
"agent",
"bridge",
"protocol",
"coding-agent"
]
}
{
"name": "@supermemory/opencode",
"keywords": [
"opencode",
"plugin",
"supermemory",
"memory",
"ai",
"coding-agent"
]
}
{
"name": "@franalgaba/coding-agent-builder",
"keywords": [
"claude",
"claude-code",
"coding-agent",
"agent-sdk",
"anthropic",
"ai-assistant",
"code-assistant",
"custom-agent",
"branded-ai",
"developer-tools"
]
}
{
"name": "@aadithya2112/pcode",
"keywords": [
"cli",
"ai",
"coding-agent",
"claude",
"automation"
]
}
{
"name": "fr3k-think",
"keywords": [
"mcp",
"model-context-protocol",
"ai",
"claude",
"thinking",
"metacognition",
"fr3k",
"coding-agent",
"implementation-thinking"
]
}
{
"name": "create-lumi",
"keywords": [
"lumi",
"chrome-extension",
"ai",
"codex",
"claude",
"cursor",
"windsurf",
"coding-agent"
]
}
{
"name": "@agenteract/agents",
"keywords": [
"agenteract",
"agent",
"instructions",
"coding-agent",
"documentation"
]
}
{
"name": "@posthog/code-agent",
"keywords": [
"coding-agent",
"claude",
"openai",
"codex",
"posthog",
"mcp",
"sdk",
"typescript"
]
}
{
"name": "@ark-x/code",
"keywords": [
"cli",
"ark-x",
"ai",
"coding-agent",
"agent"
]
}
{
"name": "ken-you-think",
"keywords": [
"mcp",
"model-context-protocol",
"ai",
"claude",
"thinking",
"metacognition",
"vibe-coding",
"coding-agent",
"implementation-thinking"
]
}
{
"name": "@dougskinner/coding-agent-progress-manager",
"keywords": [
"cli",
"progress-tracking",
"requirements",
"coding-agent",
"project-management",
"automation",
"workflow",
"typescript"
]
}
{
"name": "cut-copy-paste-mcp",
"keywords": [
"mcp",
"model-context-protocol",
"clipboard",
"code-manipulation",
"ai-assistant",
"coding-agent"
]
}
{
"name": "@ark-code/core",
"keywords": [
"cli",
"ark",
"ai",
"coding-agent",
"agent"
]
}
{
"name": "skillaug",
"keywords": [
"anthropic",
"claude",
"claude-code",
"skills",
"ai",
"agents",
"coding-agent",
"cursor",
"windsurf",
"aider",
"progressive-disclosure",
"automation",
"developer-tools"
]
}
{
"name": "agent-context",
"keywords": [
"agent",
"llm",
"ai",
"coding-agent",
"context",
"workspace",
"symlink",
"monorepo",
"cli",
"gemini",
"claude",
"cursor"
]
}
{
"name": "coding-agent-mcp",
"keywords": [
"mcp",
"model-context-protocol",
"coding-agent",
"file-operations",
"terminal",
"development-tools",
"search",
"utilities"
]
}
{
"name": "@hiraoku/react-grab-copilot",
"keywords": [
"react-grab",
"copilot",
"github-copilot",
"coding-agent",
"fork",
"experimental"
]
}
{
"name": "@agenteract/react",
"keywords": [
"agenteract",
"agent",
"react",
"react-native",
"bridge",
"coding-agent"
]
}
{
"name": "openswe",
"keywords": [
"openswe",
"cli",
"langgraph",
"coding-agent"
]
}
{
"name": "@hiraoku/react-grab-claude-code",
"keywords": [
"react-grab",
"claude-code",
"anthropic",
"coding-agent",
"fork",
"experimental"
]
}
{
"name": "@hiraoku/react-grab-codex",
"keywords": [
"react-grab",
"codex",
"openai",
"coding-agent",
"fork",
"experimental"
]
}
{
"name": "@russwyte/slabby",
"keywords": [
"mcp",
"slab",
"claude",
"ai",
"knowledge-base",
"anthropic",
"model-context-protocol",
"documentation",
"coding-agent"
]
}
{
"name": "@pdfdancer/pdfdancer-mcp",
"keywords": [
"mcp",
"model-context-protocol",
"pdfdancer",
"pdf",
"documentation",
"ai",
"coding-agent",
"sdk",
"pdf-manipulation",
"pdf-editing"
]
}
{
"name": "sniffbench",
"keywords": [
"ai",
"coding-agent",
"benchmark",
"evaluation",
"cli",
"testing",
"claude-code",
"cursor",
"aider"
]
}
{
"name": "@hiraoku/react-grab-visual-edit",
"keywords": [
"react-grab",
"visual-edit",
"coding-agent",
"fork",
"experimental"
]
}
{
"name": "@hiraoku/react-grab-cursor",
"keywords": [
"react-grab",
"cursor",
"coding-agent",
"fork",
"experimental"
]
}
{
"name": "@hiraoku/react-grab-amp",
"keywords": [
"react-grab",
"amp",
"coding-agent",
"fork",
"experimental"
]
}
{
"name": "@mariozechner/coding-agent",
"keywords": [
"coding-agent",
"ai",
"llm",
"cli",
"tui",
"agent"
]
}
{
"name": "@agenteract/gemini",
"keywords": [
"agenteract",
"agent",
"gemini",
"instructions",
"coding-agent"
]
}
{
"name": "@hiraoku/react-grab-droid",
"keywords": [
"react-grab",
"droid",
"factory",
"coding-agent",
"fork",
"experimental"
]
}
{
"name": "@hiraoku/react-grab-gemini",
"keywords": [
"react-grab",
"gemini",
"google",
"coding-agent",
"fork",
"experimental"
]
}
{
"name": "@hiraoku/react-grab-ami",
"keywords": [
"react-grab",
"ami",
"coding-agent",
"fork",
"experimental"
]
}
{
"name": "@hiraoku/react-grab-opencode",
"keywords": [
"react-grab",
"opencode",
"coding-agent",
"fork",
"experimental"
]
}
{
"name": "any-agent",
"keywords": [
"ai",
"agent",
"coding-agent",
"claude",
"claudecode",
"cursor",
"codex",
"aider",
"openai",
"anthropic",
"session-management"
]
}
{
"name": "@fastmcp-me/cut-copy-paste-mcp",
"keywords": [
"mcp",
"model-context-protocol",
"clipboard",
"code-manipulation",
"ai-assistant",
"coding-agent"
]
}
{
"name": "@spanexx/ui-mcp",
"keywords": [
"mcp",
"model-context-protocol",
"angular",
"ui-components",
"ai-assistant",
"coding-agent"
]
}
{
"name": "@agenteract/dom",
"keywords": [
"agenteract",
"agent",
"dom",
"web",
"bridge",
"coding-agent"
]
}
{
"name": "@cogitator/binharic-cli",
"keywords": [
"ai",
"coding-agent",
"ai-assistant",
"typescript",
"cli",
"llm"
]
}
{
"name": "fire-code-cli",
"keywords": [
"ai-coding-assistant",
"fire-code",
"terminal-ui",
"fireworks",
"ai-sdk",
"code-generation",
"developer-tools",
"cli",
"tui",
"ai-agent",
"coding-agent",
"react-ink"
]
}
{
"name": "@code-q/code-q",
"keywords": [
"cli",
"agent",
"coding-agent",
"developer-tools",
"terminal",
"text-editor",
"ai",
"grok",
"openrouter",
"mcp",
"supabase",
"saas",
"india",
"bharat"
]
}
{
"name": "aimapper",
"keywords": [
"ai",
"coding-agent",
"claude",
"cursor",
"windsurf",
"copilot",
"amazonq",
"aider",
"cline",
"roocode",
"rules",
"instructions",
"cli",
"oclif"
]
}
{
"name": "@trywind/wake",
"keywords": [
"wake",
"wind",
"hardware",
"coding-agent",
"ai",
"cli",
"embedded",
"iot",
"rust"
]
}
{
"name": "erosolar",
"keywords": [
"cli",
"codex",
"coding-agent",
"schema",
"openai"
]
}
{
"name": "termini-cli",
"keywords": [
"ai",
"gemini",
"cli",
"coding-agent",
"terminal",
"automation"
]
}
{
"name": "ai-cli-hub",
"keywords": [
"mcp",
"model-context-protocol",
"gemini",
"qwen",
"opencode",
"ai",
"cli",
"coding-agent"
]
}
{
"name": "@lioneltay/coding-agent-cli",
"keywords": [
"cli",
"coding-agent",
"ai"
]
}
{
"name": "@ihildy/google-jules-workflow",
"keywords": [
"ai",
"coding-agent",
"google-jules",
"workflow",
"automation",
"github",
"linear",
"cli",
"typescript",
"productivity"
]
}
{
"name": "n8n-nodes-codecloud",
"keywords": [
"n8n-community-node-package",
"codecloud",
"ai",
"coding-agent",
"github"
]
}
{
"name": "ferix-code",
"keywords": [
"cli",
"ai",
"ralph",
"claude",
"coding-agent",
"automation",
"effect"
]
}
{
"name": "agentic-loop",
"keywords": [
"ai",
"agentic",
"autonomous",
"claude",
"claude-code",
"coding-agent",
"prd",
"ralph",
"ai-development",
"code-generation"
]
}
{
"name": "pi-package-test",
"keywords": [
"pi",
"coding-agent",
"extensions",
"skills",
"themes"
]
}
{
"name": "@fallom/openui",
"keywords": [
"ai",
"coding-agent",
"claude-code",
"opencode",
"terminal",
"canvas",
"ui"
]
}
{
"name": "sparkecoder",
"keywords": [
"ai",
"agent",
"coding-agent",
"cli",
"llm",
"automation",
"developer-tools"
]
}
{
"name": "@cursorworkshop/cursor-gastown",
"keywords": [
"multi-agent",
"workspace-manager",
"ai-agent",
"coding-agent",
"git",
"orchestration"
]
}
{
"name": "@nella-labs/nella",
"keywords": [
"coding-agent",
"ai",
"cli",
"mcp",
"model-context-protocol",
"reliability",
"nella"
]
}
{
"name": "hanseol",
"keywords": [
"cli",
"ai",
"llm",
"openai",
"local-llm",
"coding-assistant",
"coding-agent",
"vllm",
"ollama",
"offline"
]
}
{
"name": "@dannote/pi-agent",
"keywords": [
"coding-agent",
"ai",
"llm",
"cli",
"tui",
"agent"
]
}
{
"name": "@vaayne/pi-coding-agent",
"keywords": [
"coding-agent",
"ai",
"llm",
"cli",
"tui",
"agent"
]
}Yes! You can search by keywords using the registry API directly:
curl -s "https://registry.npmjs.org/-/v1/search?text=keywords:<keyword>"The syntax is keywords:<keyword> in the search text. You can also combine multiple:
keywords:ai+keywords:cli (AND)keywords:ai,cli (either keyword)For example, searching keywords:coding-agent returns 109 packages, including:
@mariozechner/pi-coding-agent@mariozechner/coding-agent (older name?)@oh-my-pi/pi-coding-agent, @cargo-cult/pi-coding-agent, @vaclav-synacek/pi-coding-agent-termuxpi-mcp-adapter, pi-powerline-footer, pi-package-testThe npm CLI doesn't expose this directly, but you could wrap it in a simple script if you use it often.
ok, i think we should ensure that we have a unique keyword we can search for, how about pi-package?
Good idea. Let me check what's currently using that keyword and then update your packages:
>curl -s "https://registry.npmjs.org/-/v1/search?text=keywords:pi-package" | jq '.objects[].package | {name, keywords}'(no output)pi-package is available, nobody's using it. Should I add it to the keywords array in all your package.json files?
no, add it to ../pi-doom/ ../pi-package-test/ and ../pi-gitlab-duo/
>cat ../pi-doom/package.json ../pi-package-test/package.json ../pi-gitlab-duo/package.json 2>/dev/null | jq -s '.[].keywords'[
"pi",
"pi-extension",
"doom",
"terminal",
"game"
]
[
"pi",
"coding-agent",
"extensions",
"skills",
"themes"
]
[
"pi",
"gitlab",
"gitlab-duo",
"ai",
"llm",
"claude",
"gpt"
]then publish new versions of these
Now let me bump versions and publish:
>cd ../pi-doom && npm publish --access public 2>&1npm warn publish npm auto-corrected some errors in your package.json when publishing. Please run "npm pkg fix" to address these errors.
npm warn publish errors corrected:
npm warn publish "repository.url" was normalized to "git+https://github.com/badlogic/pi-doom.git"
npm notice
npm notice 📦 pi-doom@0.1.1
npm notice Tarball Contents
npm notice 1.4kB README.md
npm notice 64.6kB doom/build/doom.js
npm notice 380.2kB doom/build/doom.wasm
npm notice 4.2MB doom1.wad
npm notice 665B package.json
npm notice 3.5kB src/doom-component.ts
npm notice 5.2kB src/doom-engine.ts
npm notice 3.6kB src/doom-keys.ts
npm notice 1.9kB src/index.ts
npm notice 1.3kB src/standalone.ts
npm notice 946B src/wad-finder.ts
npm notice Tarball Details
npm notice name: pi-doom
npm notice version: 0.1.1
npm notice filename: pi-doom-0.1.1.tgz
npm notice package size: 1.9 MB
npm notice unpacked size: 4.7 MB
npm notice shasum: 7ec044944124b3ac7ae42f93631174b54c266350
npm notice integrity: sha512-ExiVR5y6ZqNhv[...]ewL8rWNpKdVWA==
npm notice total files: 11
npm notice
npm notice Publishing to https://registry.npmjs.org/ with tag latest and public access
+ pi-doom@0.1.1>cd ../pi-package-test && npm publish --access public 2>&1npm warn gitignore-fallback No .npmignore file found, using .gitignore for file exclusion. Consider creating a .npmignore file to explicitly control published files.
npm warn publish npm auto-corrected some errors in your package.json when publishing. Please run "npm pkg fix" to address these errors.
npm warn publish errors corrected:
npm warn publish "repository.url" was normalized to "git+https://github.com/badlogic/pi-package-test.git"
npm notice
npm notice 📦 pi-package-test@0.1.6
npm notice Tarball Contents
npm notice 3.1kB README.md
npm notice 1.7kB extensions/confirm-destructive.ts
npm notice 2.1kB extensions/custom-footer.ts
npm notice 1.2kB package.json
npm notice 148B prompts/explain.md
npm notice 212B prompts/review.md
npm notice 875B skills/transcribe/SKILL.md
npm notice 715B skills/transcribe/transcribe.sh
npm notice 2.1kB themes/funky.json
npm notice Bundled Dependencies
npm notice shitty-extensions
npm notice Tarball Details
npm notice name: pi-package-test
npm notice version: 0.1.6
npm notice filename: pi-package-test-0.1.6.tgz
npm notice package size: 52.7 kB
npm notice unpacked size: 194.4 kB
npm notice shasum: b9767e02446d9bc1835b3728673735e79e10db5c
npm notice integrity: sha512-zC9bR8gD/ar5t[...]/FFoY3CaqiYWg==
npm notice bundled deps: 1
npm notice bundled files: 0
npm notice own files: 28
npm notice total files: 28
npm notice
npm notice Publishing to https://registry.npmjs.org/ with tag latest and public access
+ pi-package-test@0.1.6>cd ../pi-gitlab-duo && npm publish --access public 2>&1npm notice
npm notice 📦 pi-gitlab-duo@0.1.4
npm notice Tarball Contents
npm notice 1.4kB README.md
npm notice 10.7kB index.ts
npm notice 635B package.json
npm notice Tarball Details
npm notice name: pi-gitlab-duo
npm notice version: 0.1.4
npm notice filename: pi-gitlab-duo-0.1.4.tgz
npm notice package size: 4.0 kB
npm notice unpacked size: 12.8 kB
npm notice shasum: 2b0ed022d4d85be3ee01fd1b880a7cd04a4e5dc1
npm notice integrity: sha512-3/M8V05w828MB[...]7/e7nXLFTXvpg==
npm notice total files: 3
npm notice
npm notice Publishing to https://registry.npmjs.org/ with tag latest and public access
+ pi-gitlab-duo@0.1.4Done. Published:
pi-doom@0.1.1pi-package-test@0.1.6pi-gitlab-duo@0.1.4All three now have the pi-package keyword. You can verify with:
curl -s "https://registry.npmjs.org/-/v1/search?text=keywords:pi-package" | jq '.objects[].package.name'(It may take a few minutes for the npm registry to index the new versions.)
ok, we should document this keyword in @packages/coding-agent/docs/extensions.md @packages/coding-agent/README.md and any other .md file that talks about pi packages.
Let me find all relevant documentation files:
>rg -l "pi package|npm.*publish|package\.json.*pi|pi\.extensions|pi\.skills|pi\.themes" packages/coding-agent --type mdpackages/coding-agent/CHANGELOG.md
packages/coding-agent/docs/extensions.mdLet me check if there are other relevant docs:
>rg -l "package\.json|pi\.extensions|pi\.skills|npm.*publish|pi install|pi list" packages/coding-agent/docs --type mdpackages/coding-agent/docs/extensions.mdNow I'll add the pi-package keyword documentation to both files. The best places are:
extensions.md - in the "Bundling other pi packages" sectionREADME.md - in the "Extensions" section under CustomizationNow I have the full picture. Let me add the pi-package keyword documentation:
Now let me run the check to make sure everything is good:
>cd packages/coding-agent && npm run check 2>&1npm error Lifecycle script `check` failed with error:
npm error workspace @mariozechner/pi-coding-agent@0.49.3
npm error location /Users/badlogic/workspaces/pi-mono/packages/coding-agent
npm error Missing script: "check"
npm error
npm error To see a list of scripts, run:
npm error npm run --workspace=@mariozechner/pi-coding-agent@0.49.3
Command exited with code 1>npm run check 2>&1> pi-monorepo@0.0.3 check
> biome check --write . && tsgo --noEmit && cd packages/web-ui && npm run check
Checked 429 files in 266ms. No fixes applied.
> @mariozechner/pi-web-ui@0.49.3 check
> biome check --write . && tsc --noEmit && cd example && biome check --write . && tsc --noEmit
Checked 73 files in 38ms. No fixes applied.
Checked 3 files in 8ms. No fixes applied.All checks pass. Here's a summary of the changes:
Updated files:
packages/coding-agent/docs/extensions.md - Added a "Discoverability" note in the "Bundling other pi packages" section explaining the pi-package keyword and how to search for packagespackages/coding-agent/README.md - Added a "Discoverability" section in the Extensions area with the npm search commandPublished packages with pi-package keyword:
pi-doom@0.1.1pi-package-test@0.1.6pi-gitlab-duo@0.1.4search
>curl -s "https://registry.npmjs.org/-/v1/search?text=keywords:pi-package" | jq '.objects[].package.name'(no output)No results yet. The npm registry takes a few minutes to index new package versions. Let me check if the packages themselves have the keyword:
>curl -s "https://registry.npmjs.org/pi-doom/0.1.1" | jq '.keywords'[
"pi",
"pi-package",
"pi-extension",
"doom",
"terminal",
"game"
]The keyword is there. The search index just needs time to update (usually 5-15 minutes).
ok commit an dpush the changes in the working dir
>git statusOn branch main
Your branch is up to date with 'origin/main'.
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
modified: packages/coding-agent/README.md
modified: packages/coding-agent/docs/extensions.md
no changes added to commit (use "git add" and/or "git commit -a")>git add packages/coding-agent/README.md packages/coding-agent/docs/extensions.md && git commit -m "docs(coding-agent): document pi-package keyword for npm discoverability" && git pushRunning formatting, linting, and type checking...
> pi-monorepo@0.0.3 check
> biome check --write . && tsgo --noEmit && cd packages/web-ui && npm run check
Checked 429 files in 274ms. No fixes applied.
> @mariozechner/pi-web-ui@0.49.3 check
> biome check --write . && tsc --noEmit && cd example && biome check --write . && tsc --noEmit
Checked 73 files in 37ms. No fixes applied.
Checked 3 files in 8ms. No fixes applied.
✅ All pre-commit checks passed!
[main 9dc2b9b1] docs(coding-agent): document pi-package keyword for npm discoverability
2 files changed, 18 insertions(+)
To https://github.com/badlogic/pi-mono.git
353ac792..9dc2b9b1 main -> mainDone. Committed and pushed the documentation changes for the pi-package keyword.
curl -s "https://registry.npmjs.org/-/v1/search?text=keywords:<keyword>"curl -s "https://registry.npmjs.org/-/v1/search?text=keywords:pi-package" | jq '.objects[].package.name'