open-index/open-npm huggingface dataset:
npm package: @joemccann/pi-exa
Description: Exa AI semantic search and similarity tools for pi coding agent — search the web by meaning, find similar pages, filter by domain/date/category
Author: Joe McCann
Latest version: 1.0.0

# pi-exa

Exa AI semantic search, similarity discovery, and content extraction for [pi](https://github.com/badlogic/pi-mono).

## Install

```bash
pi install npm:@joemccann/pi-exa
```

Or try without installing:

```bash
pi -e npm:@joemccann/pi-exa
```

## Setup

Set the `EXA_API_KEY` environment variable. Get a key at [dashboard.exa.ai](https://dashboard.exa.ai/api-keys).

```bash
export EXA_API_KEY=your-key-here
```

## Tools

| Tool | Description |
|------|-------------|
| `exa_search` | Semantic web search — find pages by meaning, not keywords |
| `exa_find_similar` | Find pages similar to a URL — competitors, related content |
| `exa_get_contents` | Extract clean text from URLs — more reliable than scraping |

### exa_search

Semantic search with filtering by domain, date, category, and search mode.

**Search types:**
- `auto` — Default, picks the best mode
- `fast` — Sub-350ms responses
- `neural` — Embedding-based semantic search
- `deep` — Multi-step reasoning for complex questions

**Categories:** `company`, `research paper`, `news`, `tweet`, `personal site`, `financial report`

**Content options:** `includeText`, `includeSummary`, `includeHighlights` (default: true)

### exa_find_similar

Finds pages semantically similar to a given URL. Pass a company site to find competitors, an article to find related content, or a product page to find alternatives.

### exa_get_contents

Extracts clean, parsed content from one or more URLs in a single API call. Returns text, highlights, and/or AI summaries.

## Examples

```
> Search for recent AI safety research papers

> Find companies similar to Stripe

> Extract the main content from these three URLs
```

## Development

```bash
git clone https://github.com/joemccann/pi-exa
cd pi-exa
npm test
```

### Test locally with pi

```bash
pi -e /path/to/pi-exa
```

## License

MIT
npm package: @joemccann/robinhood-api
Description: 📈 Unofficial node.js package for the Robinhood.com API.
Author: Joe McCann
Latest version: 1.8.0

# Robinhood API

📈 Unofficial node.js client for accessing the APIs called on Robinhood.com.

> NOTE: THIS IS A WORK IN PROGRESS AND NOT RECOMMENDED FOR ANY USAGE BEYOND TINKERING.

## Installation

```sh
npm i -S @joemccann/robinhood-api
```

## Usage

Create a `.env` with the following:

```sh
U=XXX
PASS=YYY
QR=ZZZ # From 2FA from Robinhood
CLIENT_ID=c82SH0WZOsabOXGP2sxqcj34FxkvfnWRZBKlBjFS # From Robinhood
RH_API_VERSION=1.403.0 # Optional, defaults to 1.315.0
```

```js
const { login } = require('@joemccann/robinhood-api')

try {
  const { data, statusCode } = await login()
  console.dir(data)
  console.log(statusCode) // 200
} catch (e) {
  console.error(e)
}
```

For more information on the requests and responses view the
[test](test/index.js) file.

## Tests

```sh
npm i -D
npm test
```

## License

MIT

## Authors

- [Joe McCann](https://twitter.com/joemccann)
npm package: @joemccann/robintrack-api
Description: 📈 Unofficial node client for the robintrack.net website.
Author: Joe McCann
Latest version: 1.0.0

# Robintrack API

📈 Unofficial node.js client for accessing the APIs called on Robintrack.net.

## Installation

```sh
npm i -S @joemccann/robintrack-api
```

## Usage

```js
const rta = require('@joemccann/robintrack-api')

const params = {
  method: 'largest_popularity_increases',
  options: {
    hours_ago: 48,
    limit: 50,
    percentage: true,
    min_popularity: 50,
    start_index: 0
  }
}

try {
  const {
    data = [],
    statusCode = 0
  } = await rta(params)
  console.dir(data) // [...]
  console.log(statusCode) // 200
}
catch(e){
  console.error(e)
}
```

### Supported Methods

- `largest_popularity_changes`
- `largest_popularity_decreases`
- `largest_popularity_increases`
- `least_popular`
- `total_symbols`
- `most_popular`

### Support Options

- `hours_ago`
- `limit`
- `percentage`
- `min_popularity`
- `start_index`

NOTE: The method `total_symbols` doesn't support _any_ options.

For more information on the requests and responses view the [test](test/index.js) file.

## Tests

```sh
npm i -D
npm test
```

## License

MIT

## Authors

- [Joe McCann](https://twitter.com/joemccann)
npm package: @joen95/vue-swipe-tab
Description: A Vue component for swipeable tabs
Latest version: 1.0.4

# 📱 Vue Swipe Tabs

A Vue 3 component for swiping between tabs with custom content support, smooth animations, and flexible tab positioning.

[🌐 Demo](http://vue-swipe-tab.mb-works.fun/)

## ✨ Features

- 🔄 Swipe and drag to switch tabs
- 🧩 Fully typed scoped slots
- 📍 Flexible tab positions: `top`, `bottom`, `left`, `right`
- 🎨 Easily customizable styles
- 🧱 Universal — works with any data and components

## 🚀 Installation

```bash
npm install @joen95/vue-swipe-tab
# or
yarn add @joen95/vue-swipe-tab
```

## ⚙️ Props

| Prop           | Type              | Required | Description                                                             |
|----------------|-------------------|----------|-------------------------------------------------------------------------|
| `tabs`         | `Array<unknown>`  | ✅       | Array of tab items                                                      |
| `contentList`  | `Array<unknown>`  | ✅       | Array of content matching each tab (e.g., Vue components)              |
| `tabsPosition` | `"top" \| "bottom" \| "left" \| "right"` | ❌ | Tab position. Defaults to `"top"`                                      |

> ⚠️ The `tabs` and `contentList` arrays must have the same length.

## 🧩 Slots

Available slots and their typings:

### `tabs`

Customize how each tab is rendered.

| Prop       | Type       | Description                |
|------------|------------|----------------------------|
| `tab`      | `unknown`  | Data for the current tab   |
| `index`    | `number`   | Tab index                  |
| `isActive` | `boolean`  | Whether the tab is active  |

### `panels`

Customize how the tab content is rendered.

| Prop       | Type       | Description                    |
|------------|------------|--------------------------------|
| `content`  | `unknown`  | Data or component to render    |

## 🎨 Styling

You can customize the appearance of the component using your own CSS.  
A base example of the default styles can be found here:

```
@joen95/vue-swipe-tab/dist/vue-swipe-tab.css - important
@joen95/vue-swipe-tab/src/assets/theme/index.css - for customizing
```

You can use it as a starting point to override or extend the component’s styles.

## 🛠 Usage Example

```vue
<template>
  <SwipeTabs
    :tabs="refTabs"
    :content-list="components"
    :tabs-position="refActivePosition"
  >
    <template #tabs="{ tab, index, isActive }">
      <button :class="{ active: isActive }">{{ index + 1 }}. {{ tab }}</button>
    </template>

    <template #panels="{ content }">
      <component :is="content" />
    </template>
  </SwipeTabs>
</template>

<script setup>
  import { ref } from 'vue'
  import SwipeTabs from 'vue-swipe-tabs'
  import TabOne from './TabOne.vue'
  import TabTwo from './TabTwo.vue'

  const refTabs = ['First', 'Second']
  const components = [TabOne, TabTwo]
  const refActivePosition = ref('top')
</script>
```
npm package: @joenano/trie
Description: A Trie data structure for strings
Latest version: 0.0.10

## Trie 
A Trie data structure for strings in JS

#### Install
```
npm i @joenano/trie
```

#### Import

```js
const Trie = require('@joenano/trie');
```

#### Insert

```js

const trie = new Trie();

var strings = ['string 1', 'string 2', 'string 3'];

for(string of strings) {
    trie.insert(string);
}
```

#### Contains
Check if string exists in trie. Returns false for substrings.

```js
if(trie.contains('string 1')) {
    console.log('string found');
}
```

#### Find
Returns array of strings with a given prefix.

```js
let found = trie.find('str');

// found = ['string 1', 'string 2', 'string 3']
```

#### Remove

```js
trie.remove('string 1');

let found = trie.find('str');

// found = ['string 2', 'string 3']
```

#### Caching
Array results of find are cached by default, you can disbale this by setting caching to false.

```js
trie.caching = false;
```

The cache is cleared automatically if a string is removed from the trie, but if you insert after the initial build you will have to manually clear the cache.

```js
trie.insert('new string');
trie.clearCache();

```

#### String count

```js
console.log('Strings in trie: ', trie.stringCount);
```