open-index/open-npm huggingface dataset:
npm package: @shohzod7777777/iohook
Description: Node.js global keyboard and mouse hook
Author: Shohzod
Latest version: 1.1.4

<p align="center">
  <img width="100%" src="https://github.com/robolab-io/iohook/assets/52982404/edec7f92-70bc-43bf-9ec8-19a0a1be7921"/>
</p>

iohook is a global native keyboard and mouse listener for Node.js. This is a fork of https://github.com/wilix-team/iohook, which is abandoned and unmainntained.

We provide a modern CI pipeline for easy, fast, reliable, builds of iohook for modern versions of Node and Electron. At Robolab, we use this library in [MechaKeys](https://v2.robolab.io), the integrated typing environment.

## Supported Versions
- Versions >= 0.9.4 support Electron 25 and Node 18
- For older version support, use the wilix-team library

## Installation
```sh
# Install MechaKeys iohook
npm install --save @shohzod7777777/iohook
```

```sh
# Install prebuilt binaries for your platform, architecture, and ABIs.
cd ./node_modules/@shohzod7777777/iohook
npm i
node install.js
```

By default, prebuilds will be downloaded for your own platform and architecture, but you can download specific ones through your package.json:
```json
"iohook": {
    "targets": [
        "node-108",
        "electron-128"
    ],
    "platforms": [
        "win32",
        "darwin",
        "linux"
    ],
    "arches": [
        "x64",
    ]
}
```

As of right now, we do not build 32-bit versions.
npm package: @shoio/server
Description: An comprehensible Web Framwork
Author: Brendon Ferreira de Matos
Latest version: 2.0.8

# Shoio Server

## Installing

  `npm install --save @shoio/core @shoio/server`

## Getting Started

```javascript
import { Shoio } from "@shoio/core";
import { ShoioHttpServer } from "@shoio/server";

class PingService extends Shoio {

    mountRouter(http) {
        http.get('ping', this.ping)
    }

    routerMounted( server, config ) {
        console.log( 'Server running in port', config.port )
    }

    ping() {
        return 'pong'
    }

}

const app = new PingService({
    plugins: [
        new ShoioHttpServer({boot: true})  
    ]
})

app.mount()
```
npm package: @shoislom/editor
Description: Browser-based VSCode-like code editor CLI tool with terminal, git integration, and search
Author: shoislom
Latest version: 1.0.12

# @shoislom/editor

A browser-based VSCode-like code editor CLI tool. Edit files and folders from your terminal in a beautiful web UI.

## Features

- **Monaco Editor** - Same editor engine that powers VSCode
- **File Explorer** - Navigate and manage your files
- **Integrated Terminal** - Full PTY terminal support
- **Git Integration** - View status, stage/unstage files, commit
- **Global Search** - Search across all files with regex support
- **Format on Save** - Automatic code formatting
- **Syntax Highlighting** - Support for 30+ languages

## Installation

```bash
npm install -g @shoislom/editor
```

## Usage

```bash
# Edit current directory
edit .

# Edit a specific folder
edit /path/to/folder

# Edit on a different port
edit . --port 8080

# Don't auto-open browser
edit . --no-open
```

## Keyboard Shortcuts

| Shortcut | Action |
|----------|--------|
| `Cmd/Ctrl + S` | Save file (with formatting) |
| `Cmd/Ctrl + `` ` | Toggle terminal |
| `Cmd/Ctrl + Shift + F` | Open search panel |
| `Cmd/Ctrl + Shift + G` | Open git panel |

## Screenshots

The editor provides a VSCode-like interface with:
- File tree on the left
- Tabbed editor in the center
- Terminal at the bottom
- Git and search panels

## Requirements

- Node.js >= 18.0.0

## License

MIT
npm package: @shokai/async-throttle
Description: make async/promise function execute only one at a time.
Author: Sho Hashimoto
Latest version: 0.2.3

# async-throttle

make async/promise function execute only one at a time.

- https://github.com/shokai/async-throttle
- https://npmjs.com/package/@shokai/async-throttle


## Usage

### throttle

```js
const asyncThrottle = require('@shokai/async-throttle')

const delay = msec => new Promise(resolve => setTimeout(resolve, msec))

async function countUp (n = 0) {
  for (let i = 0; i < 5; i++) {
    console.log(n + i)
    await delay(100)
  }
}
```

```js
const throttledCountUp = asyncThrottle(countUp)

throttledCountUp(0) // run
throttledCountUp(10) // skip this
await throttledCountUp(20) // skip this, but wait for "throttledCountUp(0)" to finish

throttledCountUp(30) // run this
```


#### result

```
0
1
2
3
4
30
31
32
33
34
```

### trailing

When the function being executed is finished, it is executed only once at the last.


```js
const throttledCountUp = asyncThrottle(countUp, {trailing: true})

throttledCountUp(0) // run
throttledCountUp(10) // skip
throttledCountUp(20) // skip
throttledCountUp(30) // run, but wait for "throttledCountUp(0)" to finish
```

#### result

```
0
1
2
3
4
30
31
32
33
34
```
npm package: @shoki/card-deck
Description: TypeScript deck of cards
Author: James Monger
Latest version: 1.0.0

# card-deck

A TypeScript card deck implementation, with shuffling using the [Fisher-Yates shuffle](https://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle).

## Installation

```
npm i @shoki/card-deck
```

or

```
yarn add @shoki/card-deck
```

## Usage

### Creating a deck

When creating a deck, you must provide a generic parameter `TCard`. This indicates the type of card within the deck.

```ts
import { CardDeck } from "@shoki/card-deck";

type Card = {
	value: number;
	suit: string;
};

const deck = new CardDeck<Card>();
```

### Adding cards

You can add a card, or cards, to the deck with the `addCards` function.

There is an optional boolean parameter `shouldShuffle` (which defaults to `true`) to indicate whether the deck should be shuffled (with the `shuffle` function described below) immediately after the addition.

```ts
// Add a single card
deck.addCards({ value: 1, suit: "hearts" });

// Add a card without shuffling
deck.addCards({ value: 2, suit: "hearts" }, false);

// Add multiple cards
deck.addCards([
	{ value: 3, suit: "hearts" },
	{ value: 4, suit: "hearts" },
]);

// Add multiple cards without shuffling
deck.addCards(
	[
		{ value: 3, suit: "hearts" },
		{ value: 4, suit: "hearts" },
	],
	false
);
```

### Taking cards

You can take a card, or multiple cards, from the deck with the `take` function.

```ts
// Take a single card
const card = deck.take();

// Take multiple cards
const cards = deck.take(2);
```

### Shuffling the deck

This uses the [Fisher-Yates shuffle](https://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle) through [`lodash.shuffle`](https://www.npmjs.com/package/lodash.shuffle).

```ts
// Shuffle the deck
deck.shuffle();
```
npm package: @shokirovr16/frontend-library
Description: CLI for bootstrapping comfort UI components into Vite + React + Tailwind projects.
Latest version: 0.1.2

# @shokirovr16/frontend-library

Shared frontend package for:

- browser auth helpers used by the support/operator frontends
- CLI tooling for Comfort UI component bootstrap and maintenance

## Package Identity

- npm package name: `@shokirovr16/frontend-library`
- auth exports: `@shokirovr16/frontend-library/auth`, `@shokirovr16/frontend-library/auth/react`
- CLI aliases: `frontend-library`, `cmfrt`
- generated config/doc filenames still remain `cmfrt.json` and `cmfrt-doc.md`

Important:

- this repository is now published and consumed as `@shokirovr16/frontend-library`
- the old public `cmfrt` package is not the source of truth for this repository anymore

## Install

```bash
npm install @shokirovr16/frontend-library
```

Peer dependencies:

- `react >= 18`
- `react-router-dom >= 6`
- `axios >= 1` for the axios helper only

## Auth Usage

```js
import { initializeAuth } from '@shokirovr16/frontend-library/auth';
import { AuthProvider } from '@shokirovr16/frontend-library/auth/react';
```

See [src/auth/README.md](D:/MIO%20BEAUTY%20ERP%202.0.0/frontend-library/src/auth/README.md) for the auth runtime contract and examples.

## CLI Usage

Both commands are valid after installation:

```bash
npx frontend-library init
npx cmfrt init
```

The CLI still manages the same generated files:

- `cmfrt.json`
- `cmfrt-doc.md`

## Local Workspace Development

Current workspace rule:

- [cx-admin-frontend/package.json](D:/MIO%20BEAUTY%20ERP%202.0.0/cx-admin-frontend/package.json) uses `"@shokirovr16/frontend-library": "file:../frontend-library"` during active auth-library work
- after changing this package, run `npm install` in both `frontend-library` and `cx-admin-frontend`
- `cx-admin-frontend` dev mode uses `vite --force` to avoid stale optimized deps while the local file dependency changes

Recommended local loop:

```bash
cd frontend-library
npm install

cd ../cx-admin-frontend
npm install
npm run build
```

## Publishing

Publish this repository under the package name `@shokirovr16/frontend-library`.

Recommended release flow:

```bash
cd frontend-library
npm install
npm version patch
npm publish
git push origin main --tags
```

Before publishing:

- make sure `git status` is clean
- verify `npm pack --json` produces `shokirovr16-frontend-library-<version>.tgz`
- verify `cx-admin-frontend` still builds against either the local file dependency or the published version

After publishing:

1. Replace the local dependency in [cx-admin-frontend/package.json](D:/MIO%20BEAUTY%20ERP%202.0.0/cx-admin-frontend/package.json) with a semver range such as `"@shokirovr16/frontend-library": "^0.1.2"`.
2. Run `npm install` in `cx-admin-frontend`.
3. Run `npm run build` in `cx-admin-frontend`.
npm package: @sholajapheth/drive-photos-core
Description: Framework-agnostic Google Drive photo listing, validation, and image fallback utilities
Author: Shola Japheth
Latest version: 0.1.0

# @sholajapheth/drive-photos-core

Framework-agnostic utilities for listing Google Drive images, validating inputs, caching, and building image URL fallbacks.

## API

### `listDrivePhotos(config: DriveGalleryConfig): Promise<FetchPhotosResult>`

Paginates through Drive `files.list` for a folder and returns sanitized photos.

### `normalizeFolderId(input: string): string`

Parses raw ids and common Drive folder URLs.

### Validators (`sanitizer.ts`)

| Function            | Purpose                             |
| ------------------- | ----------------------------------- |
| `validateApiKey`    | API key shape                       |
| `validateFileId`    | File id for proxy safety            |
| `validateSize`      | Clamps 100–1920                     |
| `sanitizePhotoName` | Display-safe file names             |
| `validateConfig`    | Aggregates configuration validation |

### `buildFallbackUrls(fileId, size)`

Returns ordered image URLs (proxy path first, then public Google endpoints).

### `fetchWithFallback(urls)`

Tries each URL with a 3s timeout per attempt.

### `LRUCache` / `photoListCache`

In-memory cache for list results (default TTL 5 minutes, max 10 entries).

### `RateLimiter`

Sliding-window limiter for client usage.

## Configuration

| Field                 | Type                                  | Default       | Description                |
| --------------------- | ------------------------------------- | ------------- | -------------------------- |
| `apiKey`              | `string`                              | —             | Google API key             |
| `folderId`            | `string`                              | —             | Folder id or supported URL |
| `pageSize`            | `number`                              | `1000`        | Page size (max 1000)       |
| `orderBy`             | `createdTime \| name \| modifiedTime` | `createdTime` | Sort field                 |
| `mimeTypes`           | `string[]`                            | built-in list | MIME allowlist             |
| `includeSharedDrives` | `boolean`                             | `true`        | Shared drives              |

## Error codes

| Code                  | Meaning              |
| --------------------- | -------------------- |
| `INVALID_API_KEY`     | Malformed key        |
| `INVALID_FOLDER_ID`   | Unparsable folder    |
| `INVALID_FILE_ID`     | Unsafe file id       |
| `INVALID_REQUEST`     | Drive API 400        |
| `ACCESS_DENIED`       | 403 from Drive       |
| `FOLDER_NOT_FOUND`    | 404 from Drive       |
| `RATE_LIMITED`        | 429 from Drive       |
| `NETWORK_ERROR`       | Network/unknown HTTP |
| `IMAGE_NOT_FOUND`     | All fallbacks failed |
| `CONFIGURATION_ERROR` | Invalid options      |

## Author

[Shola Japheth](https://sholajapheth.com/) · [GitHub](https://github.com/sholajapheth)
npm package: @sholajapheth/drive-photos-next
Description: Next.js App Router handlers and middleware for drive-photos
Author: Shola Japheth
Latest version: 0.1.0

# @sholajapheth/drive-photos-next

Next.js App Router helpers for listing Drive photos and proxying images without exposing API keys to browsers.

## Environment

- `GOOGLE_DRIVE_API_KEY` — server-only API key
- `GOOGLE_DRIVE_FOLDER_ID` — default folder id (optional if using `allowDynamicFolder`)

## Routes

### List: `app/api/photos/route.ts`

```ts
import { createPhotosRoute } from '@sholajapheth/drive-photos-next';

export const { GET } = createPhotosRoute({
  apiKey: process.env.GOOGLE_DRIVE_API_KEY!,
  folderId: process.env.GOOGLE_DRIVE_FOLDER_ID!,
  allowDynamicFolder: true,
});
```

### Proxy: `app/api/photos/[id]/route.ts`

```ts
import { createPhotoProxyRoute } from '@sholajapheth/drive-photos-next';

export const { GET } = createPhotoProxyRoute({
  apiKey: process.env.GOOGLE_DRIVE_API_KEY!,
});
```

### Middleware: `middleware.ts`

```ts
import { drivePhotosMiddleware } from '@sholajapheth/drive-photos-next';

export default drivePhotosMiddleware();
```

## `next.config.js` remote patterns

```js
/** @type {import('next').NextConfig} */
const nextConfig = {
  images: {
    remotePatterns: [
      { protocol: 'https', hostname: 'drive.google.com' },
      { protocol: 'https', hostname: 'lh3.googleusercontent.com' },
    ],
  },
};
module.exports = nextConfig;
```

## Author

[Shola Japheth](https://sholajapheth.com/) · [GitHub](https://github.com/sholajapheth)
npm package: @sholtee/cordova-plugin-exit
Description: Implements navigator.app.exit on Android
Author: Denes Solti
Latest version: 0.0.1

# Exit (PhoneGap/Cordova Plugin)

This plugin lets you close your app programmatically by implementing `navigator.app.exit()` method. Unlike similar plugins here you can pass custom data on terminate.

### Platform Support

This plugin supports PhoneGap/Cordova apps running on Android.

## Installation

#### Automatic Installation using PhoneGap/Cordova CLI (Android)

`cordova plugin add @sholtee/cordova-plugin-exit`

## Usage
```js
const userData = {
  field: "kerekesfacapa"
};
navigator.app.exit(userData);
```
npm package: @sholtee/cordova-plugin-launch
Description: Implements application launching on Android
Author: Denes Solti
Latest version: 0.0.2

# Launch (PhoneGap/Cordova Plugin)

This plugin lets you launch apps (identified by package name) by implementing `window.launch()` method. Unlike similar plugins here you can read custom data (passed on terminate) back from launched app.

### Platform Support

This plugin supports PhoneGap/Cordova apps running on Android.

## Installation

#### Automatic Installation using PhoneGap/Cordova CLI (Android)

`cordova plugin add @sholtee/cordova-plugin-launch`

## Usage
```js
const result = await window.launch({
    packageName: "com.foo.bar", // required
	extras: { // optional
	    ...
	}
});

const extras = result.extras;
if (extras.RetVal) {  // if you're using @sholtee/cordova-plugin-exit
    ...
}
```
npm package: @sholtee/replacer
Description: A replacer that supports interpolation
Latest version: 0.0.7

# Replacer

A replacer that supports interpolation.

## Installation

### Package

via npm:

```bash
$ npm install @sholtee/replacer
```

## API

### replacer()
Renders a template with the given context.

#### Parameters

- `src` The source string to be processed
- `context` The context (object) which contains the interpolation variables 
- `[markup]` Optional regex to override the interpolation markup (default is `#{...}`)
 
#### Returns
The rendered string.

#### Usage example:

```js
const replace = require('@sholtee/replacer');
.
.
.

// render
const result = replace('Some #{val} with #{fn()} and \\#{escaped content}.', {
    val: 'string',
    fn: () => 'extra'
});

console.log(result); // will print: "Some string with extra and #{escaped content}."
```

### replacer.compile()
Compiles a template into a function that can be evaluated for rendering

#### Parameters

- `src`  The source string to be processed
- `[markup]` Optional regex to override the interpolation markup (default is `#{...}`)
 
#### Returns
A rendering function which has the following one parameter

- `context`  The context (object) which contains the interpolation variables 
 
#### Usage example:

```js
const replacer = require('@sholtee/replacer');
.
.
.

// compile
const replace = replacer.compile('Some #{val} with #{fn()} and \\#{escaped content}.');
 
// render 
const result = replace({
    val: 'string',
    fn: () => 'extra'
});

console.log(result); // will print: "Some string with extra and #{escaped content}."
```

### markups
Replacer comes with several built in markup styles (default is `#{...}`) available via the this property. You may use the consts found here as the `markup` parameter (see before). Note, you can even use arbitrary regex to define markups.

#### Built in styles

- DEFAULT: `#{...}`
- ERB: `<%=...%>`
- DOUBLE_BRACES: `{{...}}`  

#### Usage example:

```js
const replace = require('@sholtee/replacer');
.
.
.

// render
const result = replace('Some <%= val %>.', {val: 'string'}, replace.markups.ERB);

console.log(result); // will print: "Some string."
```

## Version history

- 0.0.1: Initial release
- 0.0.2: Using regexp to determine markups
- 0.0.3: Overridable markup
- 0.0.4: 
  1. Fixed multiple interpolation issue
  2. Support for escaped interpolation
- 0.0.5: Removed parameter `escapeChar`
- 0.0.6: Regex cosmetics
- 0.0.7:
  1. Added `compile()` API
  2. Added `markups` property

## License

MIT
npm package: @shome/ebus-cli
Description: Command Line Utility for [ebusd](https://github.com/john30/ebusd)
Latest version: 0.1.0

# @shome/ebus-cli

Command Line Utility for [ebusd](https://github.com/john30/ebusd) 

## Installation

    $ npm install --global @shome/ebus-cli 

## Usage
    
Read all registers from device: "bai" (Vaillant)

```sh    
shome-ebus read-all bai
```

Read one register: "ReturnTemp" from device: "bai" (Vaillant)

```sh
shome-ebus read bai ReturnTemp
```

## Flags
```sh
shome-ebus --help
```
## License

MIT
npm package: @shome/ebus-client
Description: Node.js client for [ebusd](https://github.com/john30/ebusd)
Latest version: 0.1.0

# @shome/ebus-client

    Node.js client for [ebusd](https://github.com/john30/ebusd) 

## Installation

    $ npm install @shome/ebus-client --save

## Usage
    

#### Creating client
```js
import EBusClient from '@shome/ebus-client';

const client = new EBusClient({
    enabled: true|false,
    host: <host>,
    port: <port>,
});
```

Run ebus command `find`:
```js
const response = await client.find();
```
   
> Response will be string.

#### Read all registers from device `bai`. 
```js
for await (const [name, value] from client.readAll('bai')) {
    ...
}
> Response is async generator.

## License

MIT
npm package: @shomida/utils
Description: > TODO: description
Author: Blaze S.
Latest version: 0.0.10

<h1 align="center">Welcome to @shomida/utils 👋</h1>
<p>
  <a href="https://www.npmjs.com/package/@shomida/utils" target="_blank">
    <img alt="Version" src="https://img.shields.io/npm/v/@shomida/utils.svg">
  </a>
  <a href="https://github.com/shomida/toolkit#readme" target="_blank">
    <img alt="Documentation" src="https://img.shields.io/badge/documentation-yes-brightgreen.svg" />
  </a>
  <a href="https://github.com/shomida/toolkit/graphs/commit-activity" target="_blank">
    <img alt="Maintenance" src="https://img.shields.io/badge/Maintained%3F-yes-green.svg" />
  </a>
  <a href="https://github.com/shomida/toolkit/blob/master/LICENSE" target="_blank">
    <img alt="License: MIT" src="https://img.shields.io/github/license/shomida/@shomida/utils" />
  </a>
</p>

### 🏠 [Homepage](https://github.com/shomida/toolkit#readme)

## Author

👤 **Blaze S.**

- Github: [@shomida](https://github.com/shomida)

## 🤝 Contributing

Contributions, issues and feature requests are welcome!<br />Feel free to check [issues page](https://github.com/shomida/toolkit/issues). You can also take a look at the [contributing guide](https://github.com/shomida/toolkit/blob/master/CONTRIBUTING.md).

## Show your support

Give a ⭐️ if this project helped you!

## 📝 License

Copyright © 2023 [Blaze S.](https://github.com/shomida)<br />
This project is [MIT](https://github.com/shomida/toolkit/blob/master/LICENSE) licensed.

---

_This README was generated with ❤️ by [readme-md-generator](https://github.com/kefranabg/readme-md-generator)_
npm package: @shon-yuan/acp-react-hooks
Description: React hooks for Agent Client Protocol (ACP)
Author: ACP Team
Latest version: 0.1.0

# ACP React Hooks

React hooks for Agent Client Protocol (ACP) - Connect to AI agents like Claude and Kimi through WebSocket.

## Installation

```bash
npm install acp-react-hooks
```

## Usage

### Basic Usage with useACP

```tsx
import { useACP } from 'acp-react-hooks';

function MyApp() {
  const {
    // WebSocket state
    connectionStatus,
    selectedProvider,
    error,
    
    // Session state
    sessions,
    currentSession,
    messages,
    isLoading,
    
    // Permission state
    pendingRequests,
    
    // Actions
    connect,
    disconnect,
    selectProvider,
    createSession,
    sendPrompt,
    respondToPermission,
  } = useACP({
    defaultUrl: 'ws://localhost:9178',
    autoConnect: true,
  });

  // Render your UI...
}
```

### Individual Hooks

```tsx
import { useACPWebSocket, useACPSession, useACPPermission } from 'acp-react-hooks';

// WebSocket only
const ws = useACPWebSocket('ws://localhost:9178');

// Session management
const session = useACPSession({
  sendMessage: ws.sendMessage,
  subscribe: ws.subscribe,
  connectionStatus: ws.connectionStatus,
});

// Permission handling
const permission = useACPPermission({
  sendMessage: ws.sendMessage,
  subscribe: ws.subscribe,
});
```

## API

### useACP

Main hook combining WebSocket, Session, and Permission management.

### useACPWebSocket

Manages WebSocket connection to ACP server.

### useACPSession

Manages sessions, messages, and prompts.

### useACPPermission

Manages permission requests from agents.

## License

MIT
npm package: @shon/tiny
Description: Removes all spaces from a string
Latest version: 2.3.0

# @shon/tiny
[![npm (scoped)](https://img.shields.io/npm/v/@shon/tiny.svg)](https://github.com/snolangps/tiny)
[![npm bundle size (minified)](https://img.shields.io/bundlephobia/min/@shon/tiny.svg)](https://github.com/snolangps/tiny)

Removes all whitespace from string

# Install
<pre>$ npm install @shon/tiny</pre>

# Usage
<pre>
const tiny = require("@shon/tiny");

tiny("So much space!");
//=> "Somuchspace!"

tiny(1337);
//=> Uncaught TypeError: Tiny wants a string!
//    at tiny (<anonymous>:2:41)
//    at <anonymous>:1:1
</pre>
npm package: @shons/next-configify
Description: NestJS Config on Next Steroids
Author: shonbir
Latest version: 1.0.1

## Next-Description

**next-configify** is just a small extension to the existing <b>@itgorillaz/configify</b> project with following features which I needed in my own project.

1. environment profile (dev, prod, stage, test) based configuration files loading
2. register configuration properties as environment variables e.g. ```app.my.property --> APP_MY_PROPERTY``` or ```app.my-property.default --> APP_MY_PROPERTY_DEFAULT```
3. If duplicate properties are found, lateral ones will be considered
4. Environement properties will always take precedence
5. if all config type files are provided then precedence would be as follows:
    ```application.yml -> application.yaml -> application.json -> .env -> customprops.[yml|json|.env] -->  environemntVariables```
***when ```envProfile``` is set***
```application.yml -> application.yaml -> application.json -> .env -> application-<envProfile>.yml -> application-<envProfile>.yaml -> application-<envProfile>.json -> .<envProfile>.env ->  customprops.[yml|json|.env] --> environemntVariables ```
    

### How to set 'environment profile'?
You can add module otions by providing an object as argumento to the `forRootAsync()` method:

```js
/**
   * then environment name to load environemnt specific file.
   * 
   *  e.g. if envProfile: 'prod';  ```applicaition-prod.yml or application-prod.json or .prod.env``` files will be loaded in addition to default files
   */
  envProfile?: string
  
  
```

for rest of the Readme please go  [@it-gorillaz/configify
](https://github.com/it-gorillaz/configify)
## License

This code is licensed under the [MIT License](./LICENSE.txt).

All files located in the node_modules and external directories are externally maintained libraries used by this software which have their own licenses; we recommend you read them, as their terms may differ from the terms in the MIT License.
npm package: @shonsukee/image-editor-mcp
Description: A Model Context Protocol server for image editing
Latest version: 1.1.1

# @shonsukee/image-editor-mcp

A Model Context Protocol (MCP) server for image editing.

## Features

| Tool | Description |
|------|-------------|
| `adjust_brightness` | Adjust image brightness (e.g., factor 1.5 for 50% brighter, 0.5 for 50% darker) |
| `crop_image` | Crop image to specified rectangle (left, top, width, height) |
| `compress_image` | Compress image with quality setting (1-100, supports JPEG/PNG/WebP) |
| `optimize_image` | Trim whitespace from image edges automatically |
| `convert_to_pdf` | Convert image to PDF document |

All tools support PDF input as image source.

## Installation

### Claude Desktop

Edit `~/Library/Application Support/Claude/claude_desktop_config.json` (macOS) or `%APPDATA%/Claude/claude_desktop_config.json` (Windows):

```json
{
  "mcpServers": {
    "image-editor-mcp": {
      "command": "npx",
      "args": [
        "-y",
        "@shonsukee/image-editor-mcp",
        "/path/to/your/resources"
      ]
    }
  }
}
```

Restart Claude Desktop to apply changes.

### Cursor

Edit `.cursor/mcp.json` in your project or `~/.cursor/mcp.json`:

```json
{
  "mcpServers": {
    "image-editor-mcp": {
      "command": "npx",
      "args": [
        "-y",
        "@shonsukee/image-editor-mcp",
        "/path/to/your/resources"
      ]
    }
  }
}
```

### MCP Inspector (for testing)

```bash
npx @modelcontextprotocol/inspector npx @shonsukee/image-editor-mcp
```

## Tool Parameters

### adjust_brightness

| Parameter | Type | Description |
|-----------|------|-------------|
| `sourceFilename` | string | Path to source image/PDF file |
| `outputFilename` | string | Path to output image file |
| `factor` | number | Brightness multiplier (e.g., 1.5 = 50% brighter) |

### crop_image

| Parameter | Type | Description |
|-----------|------|-------------|
| `sourceFilename` | string | Path to source image/PDF file |
| `outputFilename` | string | Path to output image file |
| `left` | number | Left position of crop area |
| `top` | number | Top position of crop area |
| `width` | number | Width of crop area |
| `height` | number | Height of crop area |

### compress_image

| Parameter | Type | Description |
|-----------|------|-------------|
| `sourceFilename` | string | Path to source image/PDF file |
| `outputFilename` | string | Path to output image file |
| `quality` | number | Compression quality (1-100) |

### optimize_image

| Parameter | Type | Description |
|-----------|------|-------------|
| `sourceFilename` | string | Path to source image/PDF file |
| `outputFilename` | string | Path to output image file |

### convert_to_pdf

| Parameter | Type | Description |
|-----------|------|-------------|
| `sourceFilename` | string | Path to source image file |
| `outputFilename` | string | Path to output PDF file |

## Development

```bash
# Install dependencies
npm install

# Build
npm run build

# Watch mode
npm run watch

# Run inspector
npm run inspector
```

## License

MIT