open-index/open-npm huggingface dataset:
npm package: @lilithmod/sdk
Description: SDK for developing Lilith mods
Author: zani
Latest version: 1.1.0

# sdk

Lilith SDK contains types & a packager required for working with the Lilith modding API.

### Install

To install you can simply install via NPM
```
npm install @lilithmod/sdk -g
```

### Usage

Using this is extremely simple, first create a mod

```js
const { versions, commandHandler } = require("lilith-sdk");

function onLoad() {
    console.log(`Using Lilith SDK version ${versions.sdk} with Lilith ${versions.lilith}`);

    commandHandler.registerCommand("hello_world", {
        execute: () => {
            console.log("Test command executed (wow)");
        }
    });
}

module.exports = {
    onLoad
}
```

then package it using `lilith-sdk` within your mod's directory

### Building

If you want to modify something about how this packages you can do so, simply run

```
npm install
npm run build
```
to get your built SDK
npm package: @liljimmyk/tic-tac-toe
Description: Webcomponent tic-tac-toe following open-wc recommendations
Author: tic-tac-toe
Latest version: 0.0.3

<p align="center">
  <img width="200" src="https://open-wc.org/hero.png"></img>
</p>

## Open-wc Starter App

[![Built with open-wc recommendations](https://img.shields.io/badge/built%20with-open--wc-blue.svg)](https://github.com/open-wc)

## Quickstart

To get started:

```bash
npm init @open-wc
# requires node 10 & npm 6 or higher
```

## Scripts

- `start` runs your app for development, reloading on file changes
- `start:build` runs your app after it has been built using the build command
- `build` builds your app and outputs it in your `dist` directory
- `test` runs your test suite with Web Test Runner
- `lint` runs the linter for your project
- `format` fixes linting and formatting errors

## Tooling configs

For most of the tools, the configuration is in the `package.json` to reduce the amount of files in your project.

If you customize the configuration a lot, you can consider moving them to individual files.
npm package: @lillallol/outline-pdf-cjs
Description: Add outline to outline-less pdf. Works in node and does not have any dependency on other programming languages.
Author: lillallol
Latest version: 1.0.5

## Table of contents

-   [Description](#description)
-   [Installation](#installation)
-   [Example](#example)
-   [License](#license)

> **NOTICE**: If you have outlined your pdf using a version from 1.0.0 to 1.0.4, then if you edit your pdf it will get corrupted due to a bug introduced by @lillallol/outline-pdf. From version 1.0.5 this bug has been resolved.

## Description

Like [@lillallol/outline-pdf](https://www.npmjs.com/package/@lillallol/outline-pdf) but with a higher level API that takes advantage of the node file system.

## Installation

```bash
npm install @lillallol/outline-pdf-cjs
```

## Example

```ts
import { outlinePdfCjs } from "@lillallol/outline-pdf";

await outlinePdfCjs({
    loadPath: "path/to/pdf/to/outline.pdf",
    savePath: "path/to/save/outlined.pdf",
    // first column  : page number
    //                 negative for collapsing outline
    // second column : outline depth
    // third column  : outline title
    outline: `
         1||Title 1
         2|-|Title 2
        -3|--|Title 3
         4|---|Title 4
         5|---|Title 5
         6|-|Title 6
         7||Title 7
    `,
});
```

## License

[MIT](https://github.com/lillallol/outline-pdf-cjs/blob/master/LICENSE)
npm package: @lilong767676/navigation-controller
Description: a toys navigation-controller
Author: lilong7676@outlook.com
Latest version: 1.0.1

# A React navigation-controller

#### 参考iOS开发中的 UINavigationController 的思想，实现了在React项目中的类似 iOS 页面转场的效果。

- 使用方式
  ```
  $ npm install @lilong767676/navigation-controller
  ```
  ```javascript
  import { NavigationController } from '@lilong767676/navigation-controller';


  // 先创建路由
  // 路由名 - 页面 配置
  export const routes = {
    root: App,
    [RouteNames.addFriendPage]: AddFriendsPage,
    [RouteNames.newFriendsPage]: NewFriendsPage,
    [RouteNames.chatHome]: ChatHome,
    [RouteNames.chatPage]: ChatPage,
  };

  // 初始化 NavigationController,单例模式，保证全局唯一
  const naviController = new NavigationController(routes);

  // 设置 rootContainer
  naviController.setRootContainer(ele);

  // 页面跳转
  NavigationController.push(RouteNames.addFriendPage, props);

  // 返回上一页面
  NavigationController.pop();

  // 销毁 NavigationController
  naviController.destroy();

  ```


#### 效果：
![](https://raw.githubusercontent.com/lilong7676/Picture/master/blog/image/2022-08-17%2014.56.19.gif)
npm package: @lilonga/code-editor
Description: Code editor component for React. Based on the Ace editor.
Author: lilonga
Latest version: 0.1.5

# @lilonga/code-editor

> Code editor component for React. Based on the Ace editor.

[![Screenshot
](https://cdn-nuwywyxjm.now.sh/code-editor.png)]

[![NPM](https://img.shields.io/npm/v/@lilonga/code-editor.svg)](https://www.npmjs.com/package/@lilonga/code-editor)

## Install

```bash
npm install --save @lilonga/code-editor
```

## Usage
Try out an editable version of the below example at Repl.it: [https://repl.it/@lilonga/code-editor](https://repl.it/@lilonga/code-editor)

```jsx
import React, { Component } from 'react'

import CodeEditor from '@lilonga/code-editor'

export default class Example extends Component {
  render () {
    return (
      <CodeEditor 
        code="<h1>Header</h1>" 
        onChange={code => console(code)}
      />
    )
  }
}
```

## License

MIT © [Luka Kakia](https://github.com/manguluka)
npm package: @lilonga/khan-academy-api
Description: Interact with various Khan Academy APIs. Focused on internal programming-related endpoints
Latest version: 0.0.2

# @lilonga/khan-academy-api

> Interact with various Khan Academy APIs. Focused on internal programming-related endpoints


[![NPM](https://img.shields.io/npm/v/@lilonga/khan-academy-api.svg)](https://www.npmjs.com/package/@lilonga/khan-academy-api)

## Install

```bash
npm install --save @lilonga/khan-academy-api
```

## Documentation
[View Documentation](https://khan-academy-api-docs.lilo.now.sh/)

## Tests
```bash
yarn run test-integration
```

## License

MIT © [Luka Kakia](https://github.com/manguluka)
npm package: @lilonga/live-editor
Description: Modular live-coding environment for React
Author: lilonga
Latest version: 0.1.4

# @lilonga/live-editor

> Modular live-coding environment for React

[![NPM](https://img.shields.io/npm/v/@lilonga/live-editor.svg)](https://www.npmjs.com/package/@lilonga/live-editor) 

## Demo
[![Demo](https://live-editor.lilo.now.sh/example/public/live-editor-srecord.gif)]

[@lilonga/live-editor demo on Repl.it](https://repl.it/@lilonga/live-editor)

## Install

```bash
npm install --save @lilonga/live-editor
```

## Usage

```jsx
import React, { Component } from "react";

import LiveEditor from "@lilonga/live-editor";
import OutputIframe from "@lilonga/output-iframe";
import "brace/mode/html";

let iframeCode = `
<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8"/>
	<title>A title</title>
</head>
<body>
	Hello world
</body>
</html>

`;

class App extends Component {
	constructor(){
		super()
		this.state = {
			input:iframeCode,
		}
	}
	render() {
		return (

			<div>
				<LiveEditor
					input={this.state.input}
					onInputChange={(input) => {
						this.setState({input})
					}}
					editorProps={{
						mode:'html'
					}}
					width={"100%"}
					height={"400px"}
					outputComponent={OutputIframe}
					outputProps={{

					}}
				/>
			
			</div>
		);
	}
}

export default App;

```

## License

MIT © [lilonga](https://github.com/lilonga)
npm package: @lilonga/output-iframe
Description: Renders input text within an iframe
Author: lilonga
Latest version: 0.1.0

# @lilonga/output-iframe

> Live-updating iframe 

[![NPM](https://img.shields.io/npm/v/@lilonga/output-iframe.svg)](https://www.npmjs.com/package/@lilonga/output-iframe) 

## Demo

[@lilonga/output-iframe demo on Repl.it](https://repl.it/@lilonga/output-iframe)

## Install

```bash
npm install --save @lilonga/output-iframe
```

## Usage

```jsx
import React, { Component } from 'react'

import OutputIframe from '@lilonga/output-iframe'

class Example extends Component {
  render () {
    return (
      <MyComponent input="<h1>test</h1>"/>
    )
  }
}
```

## License

MIT © [lilonga](https://github.com/lilonga)
npm package: @lilonga/output-khan-processing
Description: Renders input code using Khan Academy's custom Processing.js environment.
Author: Luka Kakia
Latest version: 0.0.3

# @lilonga/output-khan-processing

> Renders input code using Khan Academy's custom Processing.js environment.

[![NPM](https://img.shields.io/npm/v/@lilonga/output-khan-processing.svg)](https://www.npmjs.com/package/@lilonga/output-khan-processing)

## Install

```bash
npm install --save @lilonga/output-khan-processing
```

## Usage
Try out an editable version of the below example at Repl.it: [https://repl.it/@lilonga/output-khan-processing](https://repl.it/@lilonga/output-khan-processing)

```js
import React, { Component } from 'react'

import OutputPjs from '@lilonga/output-khan-processing'

class Example extends Component {
  render() {
    return (
      <OutputPjs
        width={100}
        height={100}
        input="line(0,0,100,100)"
      />
    )
  }
}
export default Example
```

## API
See [@lilonga/output-khan-processing docs](https://@lilonga/output-khan-processing-docs.lilo.now.sh) for more examples and documentation

## License

MIT © [Luka Kakia](https://github.com/manguluka)
npm package: @lilonga/output-p5
Description: Renders input code as a P5.js sketch
Author: Luka Kakia
Latest version: 0.0.1

# @lilonga/output-p5

> Renders input code as a P5.js sketch.

[![NPM](https://img.shields.io/npm/v/@lilonga/output-p5.svg)](https://www.npmjs.com/package/@lilonga/output-p5)

## Install

```bash
npm install --save @lilonga/output-p5
```

## Usage
Try out an editable version of the below example at Repl.it: [https://repl.it/@lilonga/output-p5](https://repl.it/@lilonga/output-p5)

```js
import React, { Component } from 'react'

import OutputPjs from '@lilonga/output-p5'

class Example extends Component {
  render() {
    return (
      <OutputP5
        width={100}
        height={100}
        input="line(0,0,100,100)"
      />
    )
  }
}
export default Example
```

## API
See [@lilonga/output-p5 docs](https://@lilonga/output-p5-docs.lilo.now.sh) for more examples and documentation

## License

MIT © [Luka Kakia](https://github.com/manguluka)
npm package: @lilonga/output-processing-js
Description: Renders input as a Processing.js sketch. Aims for compatibility with the Khan Academy computing environment. 
Author: Luka Kakia
Latest version: 0.0.4
Deprecated: Moved to @lilonga/output-khan-processing

# @lilonga/output-processing-js

> Renders input as a Processing.js sketch. Aims for compatibility with the Khan Academy computing environment.

[![NPM](https://img.shields.io/npm/v/@lilonga/output-processing-js.svg)](https://www.npmjs.com/package/@lilonga/output-processing-js)

**Not all features from Khan academy are currently supported.**

## Install

```bash
npm install --save @lilonga/output-processing-js
```

## Usage
Try out an editable version of the below example at Repl.it: [https://repl.it/@lilonga/output-processing-js](https://repl.it/@lilonga/output-processing-js)

## API
See [@lilonga/output-processing-js docs](https://@lilonga/output-processing-js-docs.lilo.now.sh) for more examples and documentation

## License

MIT © [Luka Kakia](https://github.com/manguluka)
npm package: @lilonghe/wex
Description: A global dashboard for AI CLI tools, MCP servers, skills, usage, and recent chats
Author: Longhe Li
Latest version: 0.1.1

# Wex

一个只读查看工具，用来列出当前机器上已安装的 AI CLI，以及它们配置过的 MCP 和 skills。

当前内置适配器：

- `codex`
- `claude`

## 使用

直接通过 `npx` 运行，默认会启动本地网页：

```bash
npx @lilonghe/wex
```

默认地址是 `http://127.0.0.1:3210`。

输出 JSON：

```bash
npx @lilonghe/wex --json
```

输出文本：

```bash
npx @lilonghe/wex --format text
```

指定监听地址和端口：

```bash
npx @lilonghe/wex --web --host 127.0.0.1 --port 3210
```

如果你全局安装过，也可以直接运行：

```bash
wex
```

默认同样会启动本地网页。

## 本地开发

在当前目录执行：

```bash
npm link
```

安装后可直接运行：

```bash
wex
```

也可以直接用 Node 运行：

```bash
node ./bin/wex.js
```

也可以用 npm script：

```bash
npm run web
```

## 当前读取规则

### Codex

- 全局 MCP: `~/.codex/config.toml`
- 全局 skills: `~/.codex/skills/**/SKILL.md`

### Claude

- 全局 MCP: `~/.claude.json`
- 全局 skills: `~/.claude/skills/**/SKILL.md`
- 全局 slash commands:
  - `~/.claude/commands/**/*.md`

## 说明

- 这是查看工具，不做安装、启停、增删改。
- npm 包名是 `@lilonghe/wex`，CLI 命令名是 `wex`。
- MCP 中的 `env` 和 `headers` 值会自动脱敏，避免把密钥直接打印出来。
- 当前版本只支持 `codex` 和 `claude`，后续要扩展别的 AI CLI，可以继续加适配器。
- 当前版本只保留全局维度，不再读取任何项目级配置。
- `--web` 会启动一个本地只读全局看板，页面由服务端直接渲染，不再暴露数据接口。
- 每个工具卡片都会显示 `1d / 7d / 30d / total` 四档 token usage。
- 默认只显示用户自己安装的 skills；如果要带上系统内置 skills，可用 `--include-system-skills`，只看系统内置则用 `--only-system-skills`。
- Claude 的时间窗口来自 `~/.claude/stats-cache.json` 的按日统计；Codex 的时间窗口基于 `~/.codex/state_5.sqlite` 中最近更新线程的 `tokens_used` 汇总，属于近似值。
npm package: @lilpolymath/hackernews-cli
Description: A CLI to retreive the latest 10 articles from Hackernews.
Author: lilpolymath
Latest version: 1.0.4

# `hackernews-cli`

🏗 A CLI to retreive the latest 10 articles from Hackernews.

## Installation & Usage

```bash
npx hackernews-cli
# or
npm install -g hackernews-cli
hackernews-cli
```

## License

MIT

## Collaborators

- [Ayobami Adedapo](twitter.com/favourcodes)
npm package: @lilsatya/ef-taskapp-cli-js
Description: Taskapp cli
Author: Lingga Satya Heryadi
Latest version: 1.0.3

# ef-taskapp-cli
Tasklist app cli version, using couchDB and pouchDB for offline first

## Install
npm i @lilsatya/ef-taskapp-cli-js
or
npm i @lilsatya/ef-taskapp-cli-js -g

if you want to install globally

## Commands

### Type in cmd: {ef-taskapp} followed with modules and operations
### Example

ef-taskapp tasks (to get list of tasks)

ef-taskapp tasks --id=29asdwua0euai (to get single task)

ef-taskapp tasks -a --title="LALA" --description="LULU" --dueDate="2019-08-30" --assigneeId=1 --tags="tag1,tag2" (to add new task)

ef-taskapp tasks -u --id=29asdwua0euai --rev=1j301njknsadkajw --title="LALA" (to update task)

ef-taskapp tasks -r --id=29asdwua0euai --rev=1j301njknsadkajw (to remove task)

ef-taskapp tasks -s (to sync tasks db with remote db)

### Modules:

tasks

users

use ef-taskapp {module} to do operations

Arguments:

### CRUD

--remove / -r = Remove an object, must be paired with --id and --rev

--update / -u = Update an object, must be paired with --id, and --title or --description

--add / -a = Add a new object, must be paired with --id and --description

--sync / -s = Sync local db with remote

### OTHER

--id = Needed for any single object manipulation

--assigneeId = Needed for --add

--dueDate = date format: 1970-01-20

--status = input one of the following value: backlog, in-progress, completed

--tags = input tags, separated with comma: tag,tag2,tag3

--rev = Needed for --remove

--title = Title of task

--description = Description of task

--help = Show help menu
npm package: @lilsnake/subtitle-editor
Description: A powerful React subtitle editor component with multi-language support, waveform visualization, and real-time editing
Author: SnakeLil
Latest version: 1.0.3

# Subtitle Editor

A powerful React subtitle editor component with multi-language support, waveform visualization, and real-time editing capabilities.

## Features

- 🎬 **Video Player Integration** - Seamlessly integrated video player with subtitle synchronization
- 🌊 **Waveform Visualization** - Visual audio waveform for precise timing adjustments
- 🌍 **Multi-language Support** - Edit and manage subtitles in multiple languages
- ⚡ **Real-time Editing** - Instant preview of subtitle changes
- 📝 **Multiple Formats** - Support for SRT, VTT, and ASS subtitle formats
- 🔄 **Auto-translation** - Built-in translation capabilities
- 💾 **Local Storage** - Automatic saving to browser localStorage
- ⌨️ **Keyboard Shortcuts** - Efficient editing with keyboard commands
- 📊 **Timeline View** - Visual timeline for subtitle management
- 🎯 **Precise Control** - Split, merge, and adjust subtitle timings

## Installation

```bash
npm install @lilsnake/subtitle-editor
```

or

```bash
yarn add @lilsnake/subtitle-editor
```

or

```bash
pnpm add @lilsnake/subtitle-editor
```

## Usage

### Basic Example

```tsx
import { SubtitleEditor } from '@lilsnake/subtitle-editor';


function App() {
  return (
    <SubtitleEditor
      videoUrl="/path/to/video.mp4"
      subtitleUrl="/path/to/subtitle.srt"
      initialLanguage="en"
    />
  );
}
```

### Multi-language Example

```tsx
import { SubtitleEditor } from '@lilsnake/subtitle-editor';


function App() {
  return (
    <SubtitleEditor
      videoUrl="/path/to/video.mp4"
      subtitleUrls={{
        en: '/path/to/subtitle-en.srt',
        zh: '/path/to/subtitle-zh.srt',
        es: '/path/to/subtitle-es.srt',
      }}
      initialLanguage="en"
      persistToLocal={true}
    />
  );
}
```

## Props

| Prop | Type | Default | Description |
|------|------|---------|-------------|
| `videoUrl` | `string` | - | URL of the video file |
| `subtitleUrl` | `string` | - | URL of the subtitle file (single language) |
| `subtitleUrls` | `Record<string, string>` | - | URLs for multiple language subtitles |
| `initialLanguage` | `string` | `'en'` | Initial language to display |
| `persistToLocal` | `boolean` | `true` | Enable/disable localStorage persistence |
| `className` | `string` | - | Additional CSS classes |
| `filmId` | `string` | - | Optional film ID for business integration |

## Keyboard Shortcuts

- `Space` - Play/Pause video
- `Cmd/Ctrl + Z` - Undo changes
- Arrow keys - Navigate timeline

## Supported Formats

- **SRT** - SubRip Text
- **VTT** - WebVTT
- **ASS** - Advanced SubStation Alpha
- **JSON** - Custom JSON format

## Development

```bash
# Install dependencies
npm install

# Start development server
npm run dev

# Build for production
npm run build
```

## Requirements

- React 18.0+ or 19.0+
- react-i18next for internationalization
- i18next for translations

## License

MIT

## Contributing

Contributions are welcome! Please feel free to submit a Pull Request.
npm package: @lilusoft/s-expression
Description: s-expression parser with (un|quasi|)quoting support
Author: Friedemann Altrock
Latest version: 3.0.5

S-expression parser
===================

[Recursive descent parser] [1] for [S-expressions] [2]. It takes a string and
returns the value that corresponds to one complete expression, or an `Error`.

Atoms are parsed to strings. String literals delimited by `"` are parsed into 
`String` objects to make them distinct from the other atoms. Escape sequences 
`\"`, `\\`, `\n`, `\r`, `\t`, `\f`, and `\b` are supported. Lists are parsed 
to `Array`s. Note this means that the result is not a binary tree. This also
means there are no pairs or cons cells, and the expression `(a . b)` is parsed
to `['a', '.', 'b']`.

Supports `quote`, `quasiquote`, `unquote`, and `unquote-splicing`, with `'`, `` ` ``,
`,`, and `,@` respectively.


### Example

    var parse = require('s-expression');

    console.log(parse('a')); // 'a'
    console.log(parse('(a b "c")')); // ['a', 'b', [String: 'c']]
    console.log(parse("'(a `(b ,c))")); // ['quote', ['a', ['quasiquote', ['b', ['unquote', 'c']]]]]


### Errors

The returned `Error`s have two additional properties: `line` and `col`, which
give you the line number and character column of the parse error in your input.
Line means either LF or CRLF and column means one "character" as understood by
javascript, so if you try to parse emoji, it will count them as two characters.

There are four kinds of errors:

1. An unterminated string literal.
2. Not an atom or string after a quote (`'`, `` ` ``, `,`, `,@`).
3. The input ends before the expression is complete.
4. There is more input after the expression is complete.


### Contributing

Contributions are welcome but please note that this project is meant to be a 
one-file parser without dependencies that is not too hard to understand. 


#### License

This software is licensed under MIT, see `LICENSE`.


[1]: https://en.wikipedia.org/wiki/Recursive_descent_parser "Recursive descent parser"
[2]: https://en.wikipedia.org/wiki/S-expression "S-expressions"
npm package: @lily-technologies/ecpair
Description: Client-side Bitcoin JavaScript library ECPair
Latest version: 2.0.1

# ecpair
[![Github CI](https://github.com/bitcoinjs/ecpair/actions/workflows/main_ci.yml/badge.svg)](https://github.com/bitcoinjs/ecpair/actions/workflows/main_ci.yml) [![NPM](https://img.shields.io/npm/v/ecpair.svg)](https://www.npmjs.org/package/ecpair) [![code style: prettier](https://img.shields.io/badge/code_style-prettier-ff69b4.svg?style=flat-square)](https://github.com/prettier/prettier)

A library for managing SECP256k1 keypairs written in TypeScript with transpiled JavaScript committed to git.

## Example

TypeScript

``` typescript
import { Signer, SignerAsync, ECPairInterface, ECPairFactory, ECPairAPI, TinySecp256k1Interface } from 'ecpair';
import * as crypto from 'crypto';

// You need to provide the ECC library. The ECC library must implement 
// all the methods of the `TinySecp256k1Interface` interface.
const tinysecp: TinySecp256k1Interface = require('tiny-secp256k1');
const ECPair: ECPairAPI = ECPairFactory(tinysecp);

// You don't need to explicitly write ECPairInterface, but just to show
// that the keyPair implements the interface this example includes it.

// From WIF
const keyPair1: ECPairInterface = ECPair.fromWIF('KynD8ZKdViVo5W82oyxvE18BbG6nZPVQ8Td8hYbwU94RmyUALUik');
// Random private key
const keyPair2 = ECPair.fromPrivateKey(crypto.randomBytes(32));
// OR (uses randombytes library, compatible with browser)
const keyPair3 = ECPair.makeRandom();
// OR use your own custom random buffer generator BE CAREFUL!!!!
const customRandomBufferFunc = (size: number): Buffer => crypto.randomBytes(size);
const keyPair4 = ECPair.makeRandom({ rng: customRandomBufferFunc });
// From pubkey (33 or 65 byte DER format public key)
const keyPair5 = ECPair.fromPublicKey(keyPair1.publicKey);

// Pass a custom network
const network = {}; // Your custom network object here
ECPair.makeRandom({ network });
ECPair.fromPrivateKey(crypto.randomBytes(32), { network });
ECPair.fromPublicKey(keyPair1.publicKey, { network });
// fromWIF will check the WIF version against the network you pass in
// pass in multiple networks if you are not sure
ECPair.fromWIF('wif key...', network);
const network2 = {}; // Your custom network object here
const network3 = {}; // Your custom network object here
ECPair.fromWIF('wif key...', [network, network2, network3]);
```

## LICENSE [MIT](LICENSE)
Written and tested by [bitcoinjs-lib](https://github.com/bitcoinjs/bitcoinjs-lib) contributors since 2014.
npm package: @lily-technologies/electrum-client
Description: Electrum protocol client for React Native & Node.js
Latest version: 1.1.8

# electrum-client

Electrum Protocol Client for node.js.

# based on

* https://github.com/you21979/node-electrum-client
* https://github.com/7kharov/node-electrum-client
* https://github.com/BlueWallet/rn-electrum-client

# features

* persistence (ping strategy and reconnection)
* batch requests
* works in RN and nodejs

## protocol spec

* https://electrumx.readthedocs.io/en/latest/PROTOCOL.html

## usage

Relies on `net` so will only run in NodeJS environment.