open-index/open-npm huggingface dataset:
npm package: @mj-dj-mj/sdk-core
Description: ⚒️ An SDK for building applications on top of Uniswap V3
Latest version: 0.0.1

# Uniswap SDK Core

[![npm version](https://img.shields.io/npm/v/@uniswap/sdk-core/latest.svg)](https://www.npmjs.com/package/@uniswap/sdk-core/v/latest)
[![npm bundle size (scoped version)](https://img.shields.io/bundlephobia/minzip/@uniswap/sdk-core/latest.svg)](https://bundlephobia.com/result?p=@uniswap/sdk-core@latest)

This code is shared across Uniswap TypeScript SDKs.
npm package: @mj-kiwi/matomo-mcp-server
Description: Model Context Protocol server for Matomo analytics integration
Author: MJ Kiwi
Latest version: 0.1.3

# Matomo MCP Server

**⚠️ This package is currently under construction and may not be fully functional. ⚠️**

This package implements a Model Context Protocol (MCP) server that acts as a bridge between an AI agent (like a large language model) and a Matomo analytics instance. It exposes Matomo Reporting API functionalities as MCP tools.

## Configuration

The server requires connection details for your Matomo instance. Configure these using environment variables:

-   `MATOMO_URL`: The base URL of your Matomo instance (e.g., `https://your-matomo.example.com`).
-   `MATOMO_AUTH_TOKEN`: Your Matomo API authentication token.
-   `MATOMO_DEFAULT_SITE_ID`: (Optional) The default Matomo site ID to use if not specified in a tool call. Defaults to `1`.

If these variables are not set, the server will use placeholder values and print a warning.

## Running the Server

You can run the server directly using Node.js:

```bash
node build/index.js
```

Or, if you have configured it as an executable in `package.json`:

```bash
matomo-mcp-server
```

The server communicates over standard input/output (stdio).

## Available Tools


## Module Implementation Status

Below is a checklist showing the implementation status of all Matomo API modules in the MCP server:

- [X] **SitesManager**
- [ ] **AbTesting**
- [ ] **Actions**
- [ ] **ActivityLog**
- [ ] **AdvertisingConversionExport**
- [ ] **Annotations**
- [ ] **Api**
- [ ] **ConnectAccounts**
- [ ] **Contents**
- [ ] **CoreAdminHome**
- [ ] **CrashAnalytics**
- [ ] **CustomAlerts**
- [ ] **CustomDimensions**
- [ ] **CustomJsTracker**
- [ ] **CustomReports**
- [ ] **CustomVariables**
- [ ] **Dashboard**
- [ ] **DevicePlugins**
- [ ] **DevicesDetection**
- [ ] **Events**
- [ ] **Feedback**
- [ ] **FormAnalytics**
- [ ] **Funnels**
- [ ] **Goals**
- [ ] **HeatmapSessionRecording**
- [ ] **ImageGraph**
- [ ] **Insights**
- [ ] **LanguagesManager**
- [ ] **Live**
- [ ] **Login**
- [ ] **MarketingCampaignsReporting**
- [ ] **MediaAnalytics**
- [ ] **MobileMessaging**
- [ ] **MultiChannelConversionAttribution**
- [ ] **MultiSites** 
- [ ] **Overlay**
- [ ] **PagePerformance**
- [ ] **PrivacyManager**
- [ ] **Referrers**
- [ ] **Resolution**
- [ ] **RollUpReporting**
- [ ] **ScheduledReports**
- [ ] **SearchEngineKeywordsPerformance**
- [ ] **SegmentEditor**
- [ ] **Seo**
- [X] **TagManager**
- [X] **Tour**
- [ ] **Transitions**
- [ ] **TwoFactorAuth**
- [ ] **UserCountry**
- [X] **UserId**
- [ ] **UserLanguage**
- [ ] **UsersFlow**
- [ ] **UsersManager**
- [ ] **VisitFrequency**
- [ ] **VisitTime**
- [ ] **VisitorInterest**
- [ ] **VisitsSummary**

Overall progress: 4 modules implemented out of 47 total modules (8.5% complete).
npm package: @mj-kiwi/schema-package
Description: This library was generated with [Nx](https://nx.dev).
Author: mj-kiwi
Latest version: 0.0.1-dev.1682981105

# schema-package

This library was generated with [Nx](https://nx.dev).

## Building

Run `nx build schema-package` to build the library.

## Running unit tests

Run `nx test schema-package` to execute the unit tests via [Jest](https://jestjs.io).
npm package: @mj-studio/http-client
Description: Custom React hook and Rest adapter for network call
Author: MJ Studio
Latest version: 1.0.3

## Http Client

This is a simple fetch wrapper for http request.

![JS Check](https://github.com/mym0404/http-client/workflows/JS%20Check/badge.svg)

---
### Install

```
yarn add @mj-studio/http-client
npm install @mj-studio/http-client
```

---
### Usage

* `GET`, `POST`, `PUT`, `DELETE`, `PATCH` : return a tuple that first item is function to create network call promise and second is function to abort network call

### 1. Set default settings for network call process.(Optional)

Put following code in the application entry like `index.js`.
All fields are optional.
The default values are following.

```ts
setApiDefaultSettings({
  headers: {
    'Content-Type': 'application/json',
    Accept: 'application/json',
  },
  baseUrl: '',
  requestInterceptor: (request) => request,
  responseInterceptor: (response) => response,
  responseInterceptorAddons: [],
  responseCodeWhiteListRange: { minInclude: 200, maxExclude: 300 },
  responseCodeWhiteList: [], // number[]
  responseCodeBlackList: [], // number[]
  serializedNames: {},
});
```

You can reset to default values.

```ts
clearApiDefaultSettings();
```

In `responseInterceptor`, the parameter is body(data) object(or array)in response.

`requestInterceptor` and `responseInterceptor` also receive `Promise` for async tasks.
**You must return processed `request` and `response` in the interceptors!**

```ts
setApiDefaultSettings({
  requestInterceptor: async (request) => {
    request.headers.Authorization = AsyncStorage.getItem('accessToken') || '';
    return request;
  },
  responseInterceptor: async (response) => {
    await logToServer(response)
    return response;
  },
});
```

There are response interceptor addons(currently, only `CAMELCASE`).
You can set this addons to `setApiDefaultSettings`

```ts
setApiDefaultSettings({
  // response data from server like { my_name: 'mj' } is converted with { myName: 'mj' }
  responseInterceptorAddons: [ResponseInterceptorAddOn.CAMELCASE], 
});
```

### 2. Declare your REST api routers

- Use `GET`, `POST`, `PUT`, `PATCH`, `DELETE` in the library.
**this is even not async function or return promise!** 😀

- Return with `ApiResult<your data type>`

```ts
type FetchVersion = {
  androidMinimumVersion: number;
  iosMinimumVersion: number;
};
export const fetchVersion = (): ApiResult<FetchVersion> => {
  return GET('version/', {
    headers: { token: myToken },
    body: { bodyData: 1 },
    files: [{ key: 'movie', file: { name: 'movie', type: 'video/*', uri: 'video/path' } }],
    queryParams: { name: 'queryParamsName' },
  });
};
```
npm package: @mj-studio/react-native-naver-map
Description: Naver Map Component for React Native
Author: MJ Studio
Latest version: 2.7.1

<p align="center">
  <a href="https://rnnavermap.mjstudio.net">
    <img width="160px" src="https://raw.githubusercontent.com/mym0404/image-archive/master/202404241422605.webp"><br/>
  </a>
  <h1 align="center">React Native Naver Map</h1>
  <p align="center">
  <a href="https://www.npmjs.com/package/@mj-studio/react-native-naver-map"><img src="https://img.shields.io/npm/dm/@mj-studio/react-native-naver-map.svg?style=flat-square" alt="NPM downloads"></a>
  <a href="https://www.npmjs.com/package/@mj-studio/react-native-naver-map"><img src="https://img.shields.io/npm/v/@mj-studio/react-native-naver-map.svg?style=flat-square" alt="NPM version"></a>
  <img src="https://img.shields.io/badge/Android_SDK-3.23.0-2ea44f?style=flat-square" alt="Android SDK version">
  <img src="https://img.shields.io/badge/iOS_SDK-3.23.0-3522ff?style=flat-square" alt="iOS SDK version">
  <a href="/LICENSE"><img src="https://img.shields.io/npm/l/@mj-studio/react-native-naver-map.svg?style=flat-square" alt="License"></a>
  <h3 align="center">Bring Naver Map to Your React Fingertips</h3>
  </p>
</p>

- [Documentation](https://rnnavermap.mjstudio.net)

<img src="https://raw.githubusercontent.com/mym0404/image-archive/master/202404240329848.gif" width="400" alt="preview">

> [!IMPORTANT]
> `2.4.x` 버전부터 [AI NAVER API에서 제공되던 지도 API가 아닌 새롭게 출시된 Maps 단독 상품](https://www.ncloud.com/support/notice/all/1930?searchKeyword=map&page=1)이 지원됩니다.


## Contributing

See the [contributing guide](CONTRIBUTING.md) to learn how to contribute to the repository and the
development workflow.

## License

MIT
npm package: @mj-studio/react-native-rest-util
Description: Custom React hook and Rest adapter for network call
Author: MJ Studio
Latest version: 3.0.2

## React Native REST utilities

![JS Check](https://github.com/mym0404/react-native-rest-util/workflows/JS%20Check/badge.svg)

---
### Install

```
yarn add @mj-studio/react-native-rest-util
npm install @mj-studio/react-native-rest-util
```

---
### Usage

* `GET`, `POST`, `PUT`, `DELETE`, `PATCH` : return a tuple that first item is function to create network call promise and second is function to abort network call
* `useRest` : React custom hook for network call
* `useCall` : lazy version of useRest

### 1. Set default settings for network call process.(Optional)

Put following code in the application entry like `index.js`.
All fields are optional.
The default values are following.

```ts
setApiDefaultSettings({
  headers: {
    'Content-Type': 'application/json',
    Accept: 'application/json',
  },
  baseUrl: '',
  timeout: 5000,
  requestInterceptor: (request) => request,
  responseInterceptor: (response) => response,
  responseInterceptorAddons: [],
  responseCodeWhiteListRange: { minInclude: 200, maxExclude: 300 },
  responseCodeWhiteList: [], // number[]
  responseCodeBlackList: [], // number[]
  logging: false,
});
```

You can reset to default values.

```ts
clearApiDefaultSettings();
```

In `responseInterceptor`, the parameter is body(data) object(or array)in response.

`requestInterceptor` and `responseInterceptor` also receive `Promise` for async tasks.
**You must return processed `request` and `response` in the interceptors!**

```ts
setApiDefaultSettings({
  requestInterceptor: async (request) => {
    request.headers.Authorization = AsyncStorage.getItem('accessToken') || '';
    return request;
  },
  responseInterceptor: async (response) => {
    await logToServer(response)
    return response;
  },
});
```

There are response interceptor addons(currently, only `CAMELCASE`).
You can set this addons to `setApiDefaultSettings`

```ts
setApiDefaultSettings({
  // response data from server like { my_name: 'mj' } is converted with { myName: 'mj' }
  responseInterceptorAddons: [ResponseInterceptorAddOn.CAMELCASE], 
});
```

### 2. Declare your REST api routers

- Use `GET`, `POST`, `PUT`, `PATCH`, `DELETE` in the library.
**this is even not async function or return promise!** 😀

- Return with `ApiResult<your data type>`

```ts
type FetchVersion = {
  androidMinimumVersion: number;
  iosMinimumVersion: number;
};
export const fetchVersion = (): ApiResult<FetchVersion> => {
  return GET('version/', {
    headers: { token: myToken },
    body: { bodyData: 1 },
    files: [{ key: 'movie', file: { name: 'movie', type: 'video/*', uri: 'video/path' } }],
    queryParams: { name: 'queryParamsName' },
  });
};
```
npm package: @mj-studio/reactotron-plugin-zustand
Description: Plugin to monitor states from zustand
Author: joalisonpereira
Latest version: 2.0.4

# reactotron-plugin-zustand

Plugin to monitor states from zustand.

![](./docs/badge-statements.svg) ![](./docs/badge-functions.svg) ![](./docs/badge-lines.svg) ![](./docs/badge-branches.svg)

## Install

```bash
npm i -D reactotron-plugin-zustand
```

## Setup

Go to file "Reactotron.config.ts" or your config reactotron from project, is similar to this file:

```ts
import reactotronZustand from 'reactotron-plugin-zustand';

Reactotron.configure({ name: 'Project name' })
  .use(
    //add this line 🙌
    reactotronZustand({ stores: [{ name: 'auth', store: useAuth }] })
  )
  .connect();
```

## Usage

Install [Reactotron Client](https://github.com/infinitered/reactotron/tree/master) and add your store observer, using the example `"auth"` or all states using: `"*"`.

<img width="602" alt="Captura de Tela 2023-06-23 às 00 09 08" src="https://raw.githubusercontent.com/joalisonpereira/reactotron-plugin-zustand/master/docs/tron2.png">

## Updates V2

- Enable snapshot functions
- Code improvements
npm package: @mj66/gulpr
Description: Mingjie's Starter Environment ---
Author: Mingjie Jiang
Latest version: 0.1.0

Mingjie's Starter Environment
---

What's set up here:

- Sass (LibSass)
- Autoprefixer
- CSS Minification
- JSHint
- Scss Lint (based on [this](https://github.com/causes/scss-lint/blob/master/config/default.yml) config)
- HTML Minification
- BrowserSync
- Image Minification
- GH-Pages deployment from dist/ folder

## To Get Started:

1. `git clone` & `cd`
1. Run `rm -rf .git` to remove the Git file from the repo and `git init` for a clean history
1. `npm install` to download dependancies
1. In the terminal, enter `gulp` to make everything run
1. Files will be generated from the `dist/` folder
1. For Netlify, use build command `gulp build`
1. To wipe the `dist/` folder, use `gulp clean`
npm package: @mjaakko/react-responsive-grid
Description: Power tools for responsive layouts with React
Author: Kyle Mathews
Latest version: 0.3.7

[![Build
Status](https://img.shields.io/travis/mjaakko/react-responsive-grid/master.svg?style=flat-square)](http://travis-ci.org/mjaakko/react-responsive-grid)

# react-responsive-grid
Power tools for building responsive layouts with React.

WIP, porting best ideas from [Susy](http://susy.oddbird.net/) to a React-friendly and CSS-independent format.

### Susy porting progress
#### Container
- [x] Basic fluid container
- [ ] static
- [ ] non-centered layouts
- [ ] container positions (left, center (default), right, length (left
  and right))

#### Breakpoint
- [x] Basic component width breakpoints (note this is different than a
  media query breakpoint)
- [ ] Media query breakpoints

#### Columns
- [x] set number of columns
- [ ] list — create asymmetrical grids. List the size of each column
  relative to other columns where 1 is a single column-unit. (1,2) would
create a 2-column grid where the second column being twice the width of
the first.

#### Gutter options
- [x] margin-based
- [ ] padding-based
- [ ] explicit gutter width

#### Gutter positions
- [ ] before
- [x] after
- [ ] inside
- [ ] inside-static
- [ ] split

#### Span
- [x] Set # of columns
- [ ] Set arbitrary width
- [x] Remove last gutter by "last" prop
- [ ] Remove first gutter by "first" prop
- [x] Support nested spans
- [x] Set location of span using "at" prop
- [ ] Span external gutters (in addition to internal gutters)
- [x] "break" prop — start new row by clearing previous spans
- [ ] No gutters option
- [ ] "full" prop — shortcut for a span to fill its entire context
- [x] "pre" prop — add margin before a span
- [x] "post" prop — add margin after a span
- [x] "squish" prop — shortcut for adding pre and post margins to the
  same span
- [ ] "pull" prop — add negative margin before a span pulling it against
  the direction of flow
- [ ] "prefix" prop — add padding before a span
- [ ] "suffix" prop — add padding after a span
- [ ] "pad" prop — add padding before and after a span
- [ ] "bleed" prop — Apply negative margins and equal positive padding
  so that span borders and backgrounds "bleed" outside of their
  containers
- [ ] "bleed-x" prop — a shortcut for applying only left and right
  (horixontal) bleed
- [ ] "bleed-y" prop — a shortcut for applying only top and bottom
  (vertical) bleed

#### Debuggin
- [ ] Show grid
npm package: @mjabali/card
Description: A personal card for Marcelo Jabali
Author: Marcelo Jabali
Latest version: 1.0.1

# Marcelo Jabali's Card

Just another personal card out there.

## Usage

```bash
npx @mjabali/card
```

## Credit

Completely *borrowed* this idea from [Tierney](https://github.com/bnb/bitandbang) :)
npm package: @mjackson/fetch-proxy
Description: An HTTP proxy for the web Fetch API
Author: Michael Jackson
Latest version: 0.4.0

# fetch-proxy

`fetch-proxy` is an HTTP proxy for the [JavaScript Fetch API](https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API).

In the context of servers, an HTTP proxy server is a server that forwards all requests it receives to another server and returns the responses it receives. When you think about it this way, a [`fetch` function](https://developer.mozilla.org/en-US/docs/Web/API/Window/fetch) is like a mini proxy server sitting right there in your code. You send it requests, it goes and talks to some other server, and it gives you back the response it received.

`fetch-proxy` allows you to easily create `fetch` functions that act as proxies to "target" servers.

## Features

- Built on the standard [JavaScript Fetch API](https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API)
- Supports rewriting `Set-Cookie` headers received from target server
- Supports `X-Forwarded-Proto` and `X-Forwarded-Host` headers
- Supports custom `fetch` implementations

## Installation

Install from [npm](https://www.npmjs.com/):

```sh
npm i @mjackson/fetch-proxy
```

## Usage

```ts
import { createFetchProxy } from '@mjackson/fetch-proxy';

// Create a proxy that sends all requests through to remix.run
let proxy = createFetchProxy('https://remix.run');

// This fetch handler is probably running as part of your server somewhere...
function handleFetch(request: Request): Promise<Response> {
  return proxy(request);
}

// Test it out by manually throwing a Request at it
let response = await handleFetch(new Request('https://shopify.com'));

let text = await response.text();
let title = text.match(/<title>([^<]+)<\/title>/)[1];
assert(title.includes('Remix'));
```

## Related Packages

- [`node-fetch-server`](https://github.com/mjackson/remix-the-web/tree/main/packages/node-fetch-server) - Build HTTP servers for Node.js using the web fetch API

## License

See [LICENSE](https://github.com/mjackson/remix-the-web/blob/main/LICENSE)
npm package: @mjackson/file-storage
Description: Key/value storage for JavaScript File objects
Author: Michael Jackson
Latest version: 0.7.0

# file-storage

`file-storage` is a key/value interface for storing [`File` objects](https://developer.mozilla.org/en-US/docs/Web/API/File) in JavaScript. Similar to how `localStorage` allows you to store key/value pairs of strings in the browser, `file-storage` allows you to store key/value pairs of files on the server.

## Features

- Simple, intuitive key/value API (like [Web Storage](https://developer.mozilla.org/en-US/docs/Web/API/Web_Storage_API), but for `File`s instead of strings)
- A generic `FileStorage` interface that works for various large object storage backends (can be adapted to AWS S3, Cloudflare R2, etc.)
- Support streaming file content to and from storage
- Preserves all `File` metadata including `file.name`, `file.type`, and `file.lastModified`

## Installation

Install from [npm](https://www.npmjs.com/):

```sh
npm install @mjackson/file-storage
```

## Usage

```ts
import { LocalFileStorage } from '@mjackson/file-storage/local';

let storage = new LocalFileStorage('./user/files');

let file = new File(['hello world'], 'hello.txt', { type: 'text/plain' });
let key = 'hello-key';

// Put the file in storage.
await storage.set(key, file);

// Then, sometime later...
let fileFromStorage = await storage.get(key);
// All of the original file's metadata is intact
fileFromStorage.name; // 'hello.txt'
fileFromStorage.type; // 'text/plain'

// To remove from storage
await storage.remove(key);
```

The `FileStorage` interface allows you to implement your own file storage for custom storage backends:

```ts
import { type FileStorage } from '@mjackson/file-storage';

class CustomFileStorage implements FileStorage {
  /**
   * Returns `true` if a file with the given key exists, `false` otherwise.
   */
  has(key: string): boolean | Promise<boolean> {
    // ...
  }
  /**
   * Puts a file in storage at the given key.
   */
  set(key: string, file: File): void | Promise<void> {
    // ...
  }
  /**
   * Returns the file with the given key, or `null` if no such key exists.
   */
  get(key: string): File | null | Promise<File | null> {
    // ...
  }
  /**
   * Removes the file with the given key from storage.
   */
  remove(key: string): void | Promise<void> {
    // ...
  }
}
```

## Related Packages

- [`form-data-parser`](https://github.com/mjackson/remix-the-web/tree/main/packages/form-data-parser) - Pairs well with this library for storing `FileUpload` objects received in `multipart/form-data` requests
- [`lazy-file`](https://github.com/mjackson/remix-the-web/tree/main/packages/lazy-file) - The streaming `File` implementation used internally to stream files from storage

## License

See [LICENSE](https://github.com/mjackson/remix-the-web/blob/main/LICENSE)
npm package: @mjackson/react-style
Description: A React component layer for @threepointone/react-css
Author: Michael Jackson
Latest version: 0.1.0

## react-style

This project combines [Pete's component-based approach to styling documents in jsxstyle](https://github.com/petehunt/jsxstyle) and puts it on top of [Sunil's react-css library](https://github.com/threepointone/react-css).

Just an experiment for now, but I think this could work...
npm package: @mjackson/tar-parser
Description: A fast, efficient parser for tar streams in any JavaScript environment
Author: Michael Jackson
Latest version: 0.3.0

# tar-parser

`tar-parser` is a fast, efficient parser for [tar archives](<https://en.wikipedia.org/wiki/Tar_(computing)>). It can be used in any JavaScript environment (not just Node.js).

## Features

- Runs anywhere JavaScript runs
- Built on the standard [web Streams API](https://developer.mozilla.org/en-US/docs/Web/API/Streams_API), so it's composable with `fetch()` streams
- Supports POSIX, GNU, and PAX tar formats
- Memory efficient and does not buffer anything in normal usage
- 0 dependencies

## Installation

Install from [npm](https://www.npmjs.com/):

```sh
npm install @mjackson/tar-parser
```

## Usage

The main parser interface is the `parseTar(archive, handler)` function:

```ts
import { parseTar } from '@mjackson/tar-parser';

let response = await fetch(
  'https://github.com/mjackson/remix-the-web/archive/refs/heads/main.tar.gz',
);

await parseTar(response.body.pipeThrough(new DecompressionStream('gzip')), (entry) => {
  console.log(entry.name, entry.size);
});
```

If you're parsing an archive with filename encodings other than UTF-8, use the `filenameEncoding` option:

```ts
let response = await fetch(/* ... */);

await parseTar(response.body, { filenameEncoding: 'latin1' }, (entry) => {
  console.log(entry.name, entry.size);
});
```

## Benchmark

`tar-parser` performs on par with other popular tar parsing libraries on Node.js.

```
> @mjackson/tar-parser@0.0.0 bench /Users/michael/Projects/remix-the-web/packages/tar-parser
> node --experimental-strip-types --disable-warning=ExperimentalWarning ./bench/runner.ts

Platform: Darwin (24.0.0)
CPU: Apple M1 Pro
Date: 12/6/2024, 11:00:55 AM
Node.js v22.8.0
┌────────────┬────────────────────┐
│ (index)    │ lodash npm package │
├────────────┼────────────────────┤
│ tar-parser │ '6.23 ms ± 0.58'   │
│ tar-stream │ '6.72 ms ± 2.24'   │
│ node-tar   │ '6.49 ms ± 0.44'   │
└────────────┴────────────────────┘
```

## Credits

`tar-parser` is based on the excellent [tar-stream package](https://www.npmjs.com/package/tar-stream) (MIT license) and adopts the same core parsing algorithm, utility functions, and many test cases.

## License

See [LICENSE](https://github.com/mjackson/remix-the-web/blob/main/LICENSE)
npm package: @mjakl/pi-git-research
Description: Tools for researching and exploring Git repositories with Pi agent
Latest version: 1.0.0

# Pi git Research

**Tools for researching and exploring Git repositories with Pi agent. Clone, update, and summarize codebases on the fly.**

## Why pi git Research

**Codebase Exploration** — Quickly download and orient yourself in a new repository. Perfect for researching dependencies, libraries, or competitor codebases.

**Smart Defaults** — Uses shallow clones (`--depth 1`) and hard resets to keep research fast and your workspace clean.

**Automated Summarization** — Automatically extracts directory structure, README content, and latest commit info to give you immediate context.

## Install

### Option 1: Install from npm (recommended)

```bash
pi install npm:@mjakl/pi-git-research
```

### Option 2: Install via git

```bash
pi install git:github.com/mjakl/pi-git-research
```

### Option 3: Manual Installation

Clone this repository into your project-local or global Pi extensions directory:

```bash
cd .pi/extensions # or ~/.pi/agent/extensions
git clone https://github.com/mjakl/pi-git-research.git
cd pi-git-research
npm install
```

## Configuration

You can configure where repositories are checked out.

**Option 1: CLI Flag**
```bash
pi --repo-base-dir ~/Projects/research
```

**Option 2: settings.json**
Add this to your global or project `settings.json`:
```json
{
  "gitResearch": {
    "baseDir": "~/Projects/research"
  }
}
```

If not configured, repositories are cloned into your current working directory.

## Tools

### git_repo
Clone or update a git repository for research.
- `url`: Repository URL (supports GitHub shorthands like `user/repo`).
- `branch`: (Optional) Specific branch or tag.
- `shallow`: (Optional) Use shallow clone (default: `true`).

### git_repo_summary
Get a quick overview of a cloned repository.
- `path`: Path to the local repository.
- `depth`: (Optional) Directory tree depth (default: `2`).

### git_repo_versions
List branches and tags available in a repository (local or remote).

## Skills

### explore-repo
A high-level skill that coordinates the tools to download, summarize, and explain a repository in one go.

```bash
/explore-repo https://github.com/mariozechner/pi-coding-agent
```

## Comparison to Built-in Tools

| Feature | Built-in Bash | This Extension |
|---------|---------------|----------------|
| Cloning | Manual `git clone` | Automatic normalization & updating |
| Updates | Manual fetch/reset | One-call hard reset & clean |
| Context | None | Automatic README & tree extraction |
| Workflow | Multiple steps | Integrated `explore-repo` skill |

## License

MIT
npm package: @mjakl/pi-interlude
Description: Pi extension for stashing the current draft, sending an interlude message, and restoring the draft.
Latest version: 1.1.0

# pi-interlude

Ever had a nice prompt prepared and the agent comes back with a question, or you need to check something before continuing? Deleting the draft is wasted effort, copy/pasting to make space for the interlude prompt is cumbersome. `zsh` has this fantastic stash command - `Esc-q` - that allows you to temporarily remove the current command and it will restore it after your interlude command is finished. `pi-interlude` brings this to pi. Install it, reload, enter something, press `Ctrl-x`, enter something else, send it, and watch with awe as your previous prompt reappears 🎉.

A pi extension that lets you stash the current draft, send a one-off interlude message, and then restore the original draft.

## Install

### Option 1: Install from npm (recommended)

```bash
pi install npm:@mjakl/pi-interlude
```

### Option 2: Install via git

```bash
pi install git:github.com/mjakl/pi-interlude
```

### Option 3: Install local package

```bash
pi install ./
```

## What it does

1. Press the interlude shortcut
2. Your current editor text is stashed and the input box is cleared
3. Type and send a temporary message, or use one of the supported slash commands below
4. Your previous draft is restored into the editor

Press the shortcut again before sending to restore the stashed draft manually.

## Slash command support

Auto-restore currently works for:

- `/compact`
- `/model`

For other slash commands, the stash stays armed. You can restore it manually by pressing the interlude shortcut again.

Note: the extension currently stashes editor text only. If your draft includes attachments, those are not restored.

## Default shortcuts

- `f6`
- `ctrl+x`

`f6` is the robust default.
`ctrl+x` is the default secondary shortcut, nice mnemonics like `ctrl+i` (interlude) or `ctrl-s` (stash) are already taken or interfere with system keybindings.

## Configuration

The extension reads a custom `interlude` key from pi's existing keybindings file:

- `~/.pi/agent/keybindings.json`

Example:

```json
{
  "interlude": ["f6", "ctrl+x"]
}
```

Single shortcut example:

```json
{
  "interlude": "f6"
}
```

If `interlude` is not set, the extension defaults to `f6` and `ctrl+x`.

After changing `keybindings.json`, run `/reload` in pi.
npm package: @mjakl/pi-ooc
Description: Pi extension that adds /ooc for out-of-context side questions using the current session context.
Latest version: 0.1.0

# pi-ooc

Sometimes you want to ask pi a side question without dragging that detour back into your main conversation.

`pi-ooc` adds `/ooc`, which opens an isolated side-agent with the full current session context, shows the result in an overlay, and keeps that whole exchange out of your main session history.

Think of it as: *"use everything we know so far, but don't make this part of the main thread."*

## Install

### Option 1: Install from npm (recommended)

```bash
pi install npm:@mjakl/pi-ooc
```

### Option 2: Install via git

```bash
pi install git:github.com/mjakl/pi-ooc
```

### Option 3: Install local package

```bash
pi install ./
```

## Usage

```text
/ooc What assumptions have we made so far?
/ooc Give me three alternative designs for this refactor.
/ooc Inspect the repo and tell me where the auth flow starts.
/ooc Challenge the current plan and tell me what we're missing.
```

And of course my guilty pleasure: `/ooc commit`

## What happens

When you run `/ooc ...`:

1. pi waits for the current agent to become idle if needed
2. a separate side-agent session is started
3. that side-agent gets the full current session context
4. it uses the current model and thinking level
5. it can run tools just like a normal agent session
6. its output is streamed into a TUI overlay
7. when you close it, nothing from that exchange is appended to your main session

## Why use it?

`/ooc` is useful when you want to:

- ask a side question without cluttering the main thread
- get a second opinion based on the current context
- inspect the repo or run tools without turning that detour into part of the main conversation
- challenge the current plan
- explore alternatives before committing to a direction
- do a quick isolated investigation and then return to your main flow

## Important behavior

This is the part that matters most:

- the `/ooc` conversation is **not added** to your current session history
- the result is shown **only in the overlay**
- the side-agent has the **same context** as your current session
- the side-agent can use **tools**
- if it uses tools that modify files or run commands, those effects are **real**

So `/ooc` is isolated from your **conversation history**, but not from your **working directory**.

## Closing the overlay

If the side-agent is still running and you press `Esc` or `q`, `pi-ooc` will not close immediately.

Instead it shows a confirmation modal:

- press `Esc` or `q` again to abort and close
- press any other key to keep it running and continue reading

Once the side-agent is finished, `Esc` or `q` closes the overlay normally.

## Keys inside the overlay

- `Esc` or `q` - close
- `↑` / `↓` - scroll
- `PgUp` / `PgDn` - page scroll
- `g` / `G` - jump to top / bottom

## In one sentence

`/ooc` gives you a fully context-aware side-agent in an overlay, without polluting your main session history.

## License

MIT
npm package: @mjakupi/vue-marquee
Description: A Vue 3 component for creating smooth marquee animations.
Author: Metin Jakupi
Latest version: 1.0.7

# Vue3 Marquee
[![npm](https://img.shields.io/npm/v/@mjakupi/vue-marquee)](https://www.npmjs.com/package/@mjakupi/vue-marquee)

Vue3 Marquee is a Vue 3 component designed to create smooth and customizable marquee animations easily. It's built with Vue 3 and TypeScript, offering a modern and efficient way to add marquee effects to your Vue projects.

## Features

- Easy to use and integrate with Vue 3 projects.
- Supports horizontal and vertical marquee animations.
- Customizable speed and direction.
- Responsive and accessible.

## Installation

```bash
npm install @mjakupi/vue-marquee
or
yarn add @mjakupi/vue-marquee
```
## Props
 - items: An array of items to be displayed in the marquee.
 - speed: The speed of the marquee animation, with a default value of 20.
 - direction: The direction of the marquee, which can be either 'horizontal' or 'vertical'.
 - rtl: A Boolean indicating whether the marquee should display in reverse (right-to-left) order.
 - outset: A numeric value specifying the outset of the marquee, with valid values ranging from -0.5 to 3.
 - rtlOutset: A numeric value specifically for right-to-left (RTL) layouts, controlling the outset when rtl is true. The valid range is from -3 to -0.5.

## Importing and Using the Component in Options API
```
<template>
  <Marquee :items="marqueeItems" :speed="50" direction="horizontal" :rtl="isRtl">
    <template v-slot="{ item }">
      <div>{{ item.text }}</div>
    </template>
  </Marquee>
</template>

<script>
import { Marquee } from "@mjakupi/vue-marquee";
import '@mjakupi/vue-marquee/dist/style.css'
export default {
  components: {
    Marquee
  },
  data() {
    return {
      marqueeItems: [
        { text: 'Item 1' },
        { text: 'Item 2' },
        { text: 'Item 3' }
      ],
      isRtl: false
    };
  }
};
</script>

```
## Composition API
```
<template>
  <Marquee :items="marqueeItems" :speed="50" direction="horizontal" :rtl="isRtl">
    <template v-slot="{ item }">
      <div class="marquee-content">{{ item.text }}</div>
    </template>
  </Marquee>
</template>

<script setup lang="ts">
import { ref } from 'vue';
import { Marquee } from "@mjakupi/vue-marquee";
import '@mjakupi/vue-marquee/dist/style.css'
const marqueeItems = ref([
  { text: 'Item 1' },
  { text: 'Item 2' },
  { text: 'Item 3' }
]);
const isRtl = ref(false);
</script>
```
## Contributing
Contributions are always welcome! Feel free to open an issue or submit a pull request.

License
MIT License