open-index/open-npm huggingface dataset:
npm package: @ssen/each-options
Description: Each options
Author: SSen
Latest version: 0.1.0

# Install

```sh
npm install @ssen/each-options
```

# Example

```tsx
import { Button } from '@material-ui/core';
import eachOptions from '@ssen/each-options';
import React, { ComponentProps } from 'react';
import styled from 'styled-components';

// buttonOptions will be made of 9
const buttonOptions = eachOptions<ComponentProps<typeof Button>>({
  variant: ['contained', 'outlined', 'text'],
  size: ['small', 'medium', 'large'],
});

export default function () {
  return (
    <div>
      <Group>
        {buttonOptions.map((buttonProps) => (
          <Section>
            <Button {...buttonProps} color="default">
              BUTTON
            </Button>
            <Button {...buttonProps} color="primary">
              BUTTON
            </Button>
            <Button {...buttonProps} color="secondary">
              BUTTON
            </Button>
            <Button {...buttonProps} color="default" disabled>
              BUTTON
            </Button>
            <Button {...buttonProps} color="primary" disabled>
              BUTTON
            </Button>
            <Button {...buttonProps} color="secondary" disabled>
              BUTTON
            </Button>
          </Section>
        ))}
      </Group>
    </div>
  );
}

const Group = styled.div`
  padding: 20px;
  background-color: ${({ theme }) => theme.palette.background.default};
`;

const Section = styled.div`
  display: flex;

  justify-content: left;
  align-items: center;

  :not(:first-child) {
    margin-top: 10px;
  }

  > :not(:first-child) {
    margin-left: 10px;
  }
`;
```
npm package: @ssen/extended-compiler-host
Description: Use `createCompilerHost()` instead.
Author: SSen
Latest version: 4.0.0

# `@ssen/extended-compiler-host`

Use `createCompilerHost()` instead.

```ts
import { CompilerHost, createCompilerHost } from 'typescript';
import { createExtendedCompilerHost } from '@ssen/extended-compiler-host';

// const compilerHost: CompilerHost = createCompilerHost(compilerOptions);
const compilerHost: CompilerHost = createExtendedCompilerHost(compilerOptions);
```

# Support Files

## Plain Text

- `import string from './file.html'`
- `import string from './file.txt'`
- `import string from './file.md'`
- `import string from './file.ejs'`

## YAML

- `import object from './file.yaml'`
- `import object from './file.yml'`

## Image

- `import base64String from './file.jpg'`
- `import base64String from './file.jpeg'`
- `import base64String from './file.gif'`
- `import base64String from './file.png'`
- `import base64String from './file.webp'`

## SVG

- `import base64String, { ReactComponent } from './file.svg'`

> You can change export to `import ReactComponent from './file.svg'` with `process.env.TS_SVG_EXPORT === 'default'`
npm package: @ssen/flat-package-name
Description: Flat package name rule.
Author: SSen
Latest version: 4.0.0

# `@ssen/flat-package-name`

Flat package name rule.

# Test Codes

<!-- source __tests__/*.test.ts -->

[\_\_tests\_\_/flatPackageName.test.ts](__tests__/flatPackageName.test.ts)

```ts
import { flatPackageName } from '@ssen/flat-package-name';
import { describe, expect, test } from 'vitest';

describe('flatPackageName()', () => {
  test('should flat package names', () => {
    expect(flatPackageName('eslint')).toBe('eslint');
    expect(flatPackageName('markdown-source-import')).toBe(
      'markdown-source-import',
    );
    expect(flatPackageName('@ssen/eslint-config')).toBe('ssen__eslint-config');
    expect(flatPackageName('@ssen/prettier-config')).toBe(
      'ssen__prettier-config',
    );
  });
});
```

<!-- /source -->
npm package: @ssen/jest-transform
Description: ```js module.exports = {   transform: {     '.(ts|tsx|js|jsx)$': require.resolve('ts-jest'),     '.(svg)$': require.resolve('@ssen/jest-transform/transform/svg'),     '.(html|ejs|txt|md)$': require.resolve(       '@ssen/jest-transform/transform/text',    
Author: SSen
Latest version: 3.0.3

# Jest Mockups

```js
module.exports = {
  transform: {
    '.(ts|tsx|js|jsx)$': require.resolve('ts-jest'),
    '.(svg)$': require.resolve('@ssen/jest-transform/transform/svg'),
    '.(html|ejs|txt|md)$': require.resolve(
      '@ssen/jest-transform/transform/text',
    ),
    '.(yaml|yml)$': require.resolve('@ssen/jest-transform/transform/yaml'),
  },
  moduleNameMapper: {
    '.(bmp|jpg|jpeg|png|gif|eot|otf|webp|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga)$':
      require.resolve('@ssen/jest-transform/mockup/file'),
    '.(css|less|sass|scss)$': require.resolve(
      '@ssen/jest-transform/mockup/style',
    ),
  },
  setupFilesAfterEnv: [require.resolve('@ssen/jest-transform/setup/fetch')],
};
```
npm package: @ssen/prettier-config
Description: Prettier Config
Author: Seoyeon Lee
Latest version: 2.0.1

# Prettier config

<!-- source index.json -->

[index.json](index.json)

```json
{
  "$schema": "http://json.schemastore.org/prettierrc",
  "semi": true,
  "singleQuote": true,
  "quoteProps": "consistent",
  "trailingComma": "all",
  "bracketSpacing": true
}
```

<!-- /source -->

## Usage

Install.

```sh
npm install prettier @ssen/prettier-config --save-dev
```

Add config files.

`.prettierrc.js`

```js
module.exports = {
  ...require('@ssen/prettier-config'),
};
```

`.prettierignore`

```ignore
node_modules
out
```
npm package: @ssense/cucumber-testrail-sync
Description: Synchronize test cases from TestRail & pushes Cucumber results
Author: Mickael Burguet
Latest version: 3.0.6

# Cucumber TestRail Sync

[![Build Status](https://travis-ci.org/SSENSE/node-cucumber-testrail-sync.svg?branch=master)](https://travis-ci.org/SSENSE/node-cucumber-testrail-sync)
[![Coverage Status](https://coveralls.io/repos/github/SSENSE/node-cucumber-testrail-sync/badge.svg?branch=master)](https://coveralls.io/github/SSENSE/node-cucumber-testrail-sync?branch=master)
[![Latest Stable Version](https://img.shields.io/npm/v/@ssense/cucumber-testrail-sync.svg)](https://www.npmjs.com/package/@ssense/cucumber-testrail-sync)
[![Known Vulnerabilities](https://snyk.io/test/npm/@ssense/cucumber-testrail-sync/badge.svg)](https://snyk.io/test/npm/@ssense/cucumber-testrail-sync)

Module to use [Cucumber](https://github.com/cucumber/cucumber-js) in conjunction with [TestRail](http://www.gurock.com/testrail/).

* It can synchronize test cases from TestRail to `.feature` files on your local filesystem.

* It can automatically push test results to TestRail - after they've been run.

![Synchronization!](https://github.com/SSENSE/node-cucumber-testrail-sync/raw/master/docs/img/sync.gif)

## Philosophy

At [SSENSE](https://github.com/SSENSE), we strive to deliver high quality on every project.

With that perspective, `Cucumber TestRail Sync` has been developed with 2 main goals:

1. Have a single source of truth for test cases (TestRail)

2. Encourage synergy between developers and QA analysts - yes it's possible !

We propose the following collaborative workflow for BDD testing:

![Synchronization!](https://github.com/SSENSE/node-cucumber-testrail-sync/raw/master/docs/img/sync-flow.png)

## Installation

> npm i @ssense/cucumber-testrail-sync -D

## Usage

* [Configuring a project](/docs/configuration.md)

* [Synchronization of test cases from/to TestRail](/docs/synchronization.md)

* [Synchronization verification](/docs/verification.md)

* [Pushing test results to TestRail](/docs/pushing_results.md)

## [Change Log](/docs/changelog.md)

## Authors

* **Lizbeth Burbano** - *Senior QA Analyst* - [LizbethB](https://github.com/LizbethB)
* **Mickael Burguet** - *Senior Developer* - [rundef](http://rundef.com)

## License

This project is licensed under the MIT License - see the [LICENSE.md](LICENSE.md) file for details.
npm package: @ssense/eslint-config-ui-core
Description: JavaScript code standards for Backend Services at SSENSE
Author: SSENSE Dev Team
Latest version: 0.4.0

# eslint-config-ui-core

# SSENSE JavaScript Style Guide for Backend Services

# Installation

```shell
npm install --save-dev eslint @ssense/eslint-config-ui-core
```

Because of the https://github.com/eslint/eslint/issues/3458 [current inability for sharable configs] to supply their dependencies you will also need to:

```shell
npm install --save-dev \
  babel-eslint \
  eslint-config-airbnb \
  eslint-plugin-import \
  eslint-plugin-react
```

# Usage

Edit your `package.json`

For client-side projects (only one supported at the moment)
```json
  "eslintConfig": {
    "extends": "ssense/client"
  }
```

`/client` specializations are that it permits browser globals, requires the `react` plugin.

# CLI eslint

We can preview all linting errors from the command line by running:
```shell
./node_modules/.bin/eslint **
```

We can also run it with --fix, which should fix most of the problems:
```shell
./node_modules/.bin/eslint ** --fix
```

Or even better we can add a script to package.json which runs this for us:
```json
"lint": "./node_modules/.bin/eslint 'app/**'",
"lint:fix": "./node_modules/.bin/eslint 'app/**' --fix",
```

In this particular case, we are validating everything inside our /app folder


# Extends

### `airbnb-base` https://github.com/airbnb/javascript[↗]

We extend the AirBnB rules for historical reasons. Our configuration will continue to evolve and may not be based on it one day if we eventually disable or adjust too much of it via overrides.

# Plugins

### `import` https://github.com/benmosher/eslint-plugin-import[↗]
Provides rules that help prevent import bugs and enforces style.

### `react` https://github.com/yannickcr/eslint-plugin-react[↗]
React specific linting rules for ESLint



# Rules

This section contains documentation about certain (not all) rules we enforce. Each rule section contains rationale and pass/fail examples. Over time we will complete exhaustive documentation. So far we have focused on significant deviations from our AirBnB inheritance.

(..@todo)
npm package: @ssense/flip
Description: A React to Vue Component Transpiler
Author: Quinn Langille
Latest version: 0.0.3

# Flip
## 🔄 Transform React to Vue! 🔄

<a href="https://github.com/Groupe-Atallah/flip/issues#boards?repos=146508330"><img src="https://img.shields.io/badge/Shipping_faster_with-ZenHub-5e60ba.svg?style=flat-square"></a>

Flip is great for teams migrating from react to vue, or projects that want to employ micro front ends using both technologies. 

It will consume your React components, and generate out a new directory full of Vue components.

Optionally, you can also roll them into one nice exported bundle per framework (i.e - `bundle.react.js`, `bundle.vue.js`) 📦


_Flip initially started as a fork of [this babel plugin](https://github.com/vueact/babel-plugin-transform-react-to-vue) and still uses a modified version of it under the hood._


## How to use

```
yarn add -D @ssense/flip
```

To use, run

```
yarn flip [path-to-your-components]
```

This command also accepts an optional `-b` flag, which will rollup bundles of each your react and vue components for distribution. This is how that will look:

```
yarn flip [path-to-your-components] -b
```

and it will generate the following folder structure:

```
 - dist
 | - react
    | - button
    | - form
 | - vue
    | - button
    | - form
 | - bundles
    | - bundle.react.js
    | - bundle.vue.js
```

### Styling

While not necessary, flip is compatible with [styled-components](https://www.styled-components.com/) (it even handles remapping the react/vue styled component import 😎)


## Contributing

Please read [our contribution guide](CONTRIBUTING.md) for details on the development process, and the process for submitting a pull request

With any contribution, you accept all conditions implicitly defined in the [Code of Conduct](CODE_OF_CONDUCT.md).

## License
This project is licensed under the MIT License - see the [LICENSE.md](LICENSE) for more details

## Authors

Quinn Langille - [email](mailto:quinn.langille@ssense.com)
npm package: @ssense/node-logger
Description: Application and access logger
Author: Rémy Jeancolas
Latest version: 1.1.2
Deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.

# Node Logger

[![Build Status](https://travis-ci.org/SSENSE/node-logger.svg?branch=develop)](https://travis-ci.org/SSENSE/node-logger)
[![Coverage Status](https://coveralls.io/repos/github/SSENSE/node-logger/badge.svg?branch=develop)](https://coveralls.io/github/SSENSE/node-logger?branch=develop)
[![Latest Stable Version](https://img.shields.io/npm/v/@ssense/node-logger.svg)](https://www.npmjs.com/package/@ssense/node-logger)

SSENSE Standardized Logs


## Application Logger

```javascript
// Inclusion
import {Logger, LogLevel} from '@ssense/node-logger';
```
```javascript
// Usage
const logger = new AppLogger('your_app_id', LogLevel.Silly);
// Enable / Disable
logger.enable(true);
// Set log level
logger.setLevel('Silly');
// Prettify / Indent
logger.setPretty(true);

// Log
// silly(message: string, id?: string, tags?: string[], details?: any)
// verbose(message: string, id?: string, tags?: string[], details?: any)
// info(message: string, id?: string, tags?: string[], details?: any)
// warn(message: string, id?: string, tags?: string[], details?: any)
// error(message: string, id?: string, tags?: string[], details?: any)
logger.silly('Some log message');
logger.error(`Error with paypal express checkout: ${orderId}`, 'MY_REQUEST_ID', ['checkout', 'paypal'], error.stack);
```

## Request Logger

```js
req.logger = logger.getRequestLogger('MY_REQUEST_ID');
req.logger.error(`Error with paypal express checkout: ${orderId}`, ['checkout', 'paypal'], error.stack);
```

## Access logger

```javascript
import {AccessLogger} from '@ssense/node-logger';
```

```javascript
const accessLogger = new AccessLogger('your_app_id');
// Enable / Disable
accessLogger.enable(true);
// Prettify / Indent
accessLogger.setPretty(process.env.NODE_ENV === 'development');

// Log
// logRequest(req: Request, res: Response)
accessLogger.logRequest(req, res);
```

### User id logging

If your application manipulates users, you may want to log the connected user id associated to each request.
This is possible with the AccessLogger `setUserIdCallback` method.

This method allows you to pass a callback that will be called after each request, this callback takes in parameters the `Request` and `Response` objects.
To store the corresponding user id, just be sure to return a string when this callback is called.

**Example**:
```javascript
const accessLogger = new AccessLogger('your_app_id');
accessLogger.setUserIdCallback((req, res) => {
  return req.header('customer-id');
});
```
In this case, if a request has a `customer-id` header, it will be logged as `userId` field by the AccessLogger.
npm package: @ssense/node-paginator
Description: Paginator
Author: Mathieu Doyon
Latest version: 1.1.2

# Paginator
Paginator library in NodeJS to facilitate REST pagination

[![Build Status](https://travis-ci.org/SSENSE/node-paginator.svg?branch=master)](https://travis-ci.org/SSENSE/node-paginator)
[![Coverage Status](https://coveralls.io/repos/github/SSENSE/node-paginator/badge.svg?branch=master)](https://coveralls.io/github/SSENSE/node-paginator?branch=master)
[![Latest Stable Version](https://img.shields.io/npm/v/@ssense/node-paginator.svg)](https://www.npmjs.com/package/@ssense/node-paginator)
[![Known Vulnerabilities](https://snyk.io/test/npm/@ssense/node-paginator/badge.svg)](https://snyk.io/test/npm/@ssense/node-paginator)

## Table of Contents
- [Installation](#installation)
- [Usage](#usage)
- [Tips and tricks](#tips-and-tricks)
    - [Append queries string to URL](#append-queries-string-to-url)
    - [Add fragment to URL](#add-fragment-to-url)
- [Licence](#licence)


### Installation

```bash
npm install --save @ssense/node-paginator
```

### Usage

```js
import { Paginator } from '@ssense/node-paginator';

const items = ['item1', 'item2', 'item3']; // from your DB returned collection...
const perPage = 1;
const currentPage = 2;
const paginator: Paginator = new Paginator(items, items.length, perPage, currentPage);

// Transform paginator to object, use this as rour REST response
const paginated = paginator.transform();

console.log(paginated);
/*
output
{
    total: 3,
    per_page: 1,
    current_page: 2,
    last_page: 3,
    from: 2,
    to: 4,
    links:{
        previous: '/?page=1&foo=bar#foobar',
        current: '/?page=2&foo=bar#foobar',
        next: '/?page=3&foo=bar#foobar'
    },
    data: [ 'item1', 'item2', 'item3' ]
}
*/
```

### Tips and tricks
#### Append queries string to URL

```js
// Append one query string to URL
paginator.append('key', 'value');

// Appends multiple queries to URL
paginator.appends({
    foo: 'bar'
});
```

#### Add fragment to URL 

```js
// Add foobar fragment to URL
paginator.fragment('foobar');
```

### License

This project is licensed under the MIT License - see the [LICENSE.md](LICENSE.md) file for details.
npm package: @ssense/tslint-config
Description: SSENSE's base TSLint configuration
Author: Nebez Briefkani
Latest version: 5.0.3

## tslint-config

[![npm version](https://badge.fury.io/js/%40ssense%2Ftslint-config.svg)](https://www.npmjs.com/package/@ssense/tslint-config) [![Build Status](https://travis-ci.org/SSENSE/tslint-config.svg?branch=test_integration)](https://travis-ci.org/SSENSE/tslint-config)

The [tslint](http://palantir.github.io/tslint/) config we use at **SSENSE** for all TypeScript projects. It's a combination of base rules provided by tslint as well as rules from [tslint-microsoft-contrib](https://github.com/Microsoft/tslint-microsoft-contrib).

#### Installation

1. Install the package
    * `npm install --save-dev tslint @ssense/tslint-config`
2. Create a file named *tslint.json* in your project root
    * `touch tslint.json`
3. Add the contents referenced in the section below to *tslint.json*
4. Run **tslint**
    * `./node_modules/.bin/tslint`

#### tslint.json

```json
{
    "extends": "@ssense/tslint-config"
}
```


#### corresponding SSENSE TSLint, TSLint and tslint-microsoft-contrib version

| SSENSE VERSION | TSLint version | tslint-microsoft-contrib version | Typescript version |
| --- | --- | --- | --- |
| **>= 5.x** | >= 5.x | 5.x | >= 2.3.x |
| **>= 4.x** | >= 4.x | 4.x | |
| **>= 2.x** | >= 3.2.x | 2.x | |
npm package: @ssense/vue-carousel
Description: A flexible, responsive, touch-friendly carousel for Vue.js
Author: todd.beauchamp@ssense.com
Latest version: 0.6.5

# Vue Carousel

[![Build Status](https://travis-ci.org/SSENSE/vue-carousel.svg?branch=master)](https://travis-ci.org/SSENSE/vue-carousel)
[![Coverage Status](https://coveralls.io/repos/github/SSENSE/vue-carousel/badge.svg?branch=master)](https://coveralls.io/github/SSENSE/vue-carousel?branch=master)
[![Latest Stable Version](https://img.shields.io/npm/v/vue-carousel.svg)](https://www.npmjs.com/package/vue-carousel)

**WARNING: vue-carousel is at pre-alpha stage of development and may undergo significant changes.**

**Feel free to submit issues and feature requests [here](https://github.com/SSENSE/vue-carousel/issues)**.

**[Full documentation and examples](https://ssense.github.io/vue-carousel)**

## Table of Contents
- [Installation](#installation)
- [Usage](#usage)
- [Development](#development)
- [License](#license)

## Installation

``` bash
npm install -S vue-carousel
```

## Usage

### Global

You may install Vue Carousel globally:

``` js
import Vue from 'vue';
import VueCarousel from 'vue-carousel';

Vue.use(VueCarousel);
```
This will make **&lt;carousel&gt;** and **&lt;slide&gt;** available to all components within your Vue app.

### Local

Include the carousel directly into your component using import:

``` js
import { Carousel, Slide } from 'vue-carousel';

export default {
  ...
  components: {
    Carousel,
    Slide
  }
  ...
};
```

### HTML Structure

Once the **Carousel** and **Slide** components are installed globally or imported, they can be used in templates in the following manner:

``` html
  <carousel>
    <slide>
      Slide 1 Content
    </slide>
    <slide>
      Slide 2 Content
    </slide>
  </carousel>
```

## Development

A sandboxed dev environment is provided by [vue-play](https://github.com/vue-play/vue-play). Changes made to the component files will appear in real time in the sandbox. 

To begin development, run:

``` bash
npm install
npm run dev
```

then navigate to `http://localhost:5000`

To modify and add sandbox scenarios, edit `play/index.js`

## License

This project is licensed under the MIT License - see the [LICENSE.md](LICENSE.md) file for details.
npm package: @ssense/vue-component-boilerplate
Description: A sensible starting point for Vue component creation
Author: todd.beauchamp@ssense.com
Latest version: 0.1.0

# Vue Component Boilerplate

## Introduction

This repository serves as a sensible starting point for developing Vue components which can be published as node modules.

The following features are provided standard, but many of them can be configured:

* Automatic Github repository creation
* Documentation with Gitbook, publish to `gh-pages` baked in
* Configurable linting with ESLint
* Unit testing with Jest
* Development sandbox with dev server and HMR provided by vue-play
* Continuous integration with Travis CI

## Setup

### 1. Run the generator

This boilerplate uses [vue-cli](https://github.com/vuejs/vue-cli) as a generator to scaffold out your project. To install:

``` bash
npm install -g vue-cli
```

Next, you will initialize the cli with a folder name and will be prompted with a series of options to configure the new component.

### 2. Choose a folder name

**Important: To minimize any need to do manually renaming later, choose a folder name which matches the repo name you will use on Git.**

For example, if you want your component to be published as `vue-dynamic-button` on github and npm, that should be the folder name you select at the start.

With that in mind, initialize the generator:

``` bash
vue init '@ssense/vue-component-boilerplate' my-folder-name
```

You will be prompted with options and a new folder will be created for you in the current directory.

### 3. Initialize the repository on Github

An npm script is provided which will create a repository under the github username you specified in the generator's option prompt.

**Important: The following command will create a new repository on Github. If you'd like to configure your own git origin, skip this step and do so manually.**

Create and initialize a public repository:

``` bash
cd my-folder-name
npm run init
```

or create & initialize a private repository:

``` bash
cd my-folder-name
npm run init:private
```

## Usage

After running generator, the usage instructions can be found in README.md in the newly created directory.
npm package: @sseocho-plugins/claude-deep-work
Description: Deep Work plugin for Claude Code - 3-phase workflow (Research → Plan → Implement)
Author: sungmin
Latest version: 1.0.0

# Deep Work Plugin

AI 코딩 도구 사용 시 **기획과 코딩의 철저한 분리**를 강제하는 3단계 워크플로우 플러그인.

## 문제

AI 코딩 도구가 복잡한 작업을 수행할 때 흔히 발생하는 문제:
- 기존 아키텍처를 무시하고 새로운 패턴을 도입
- 이미 존재하는 유틸리티를 중복 구현
- 코드베이스를 충분히 이해하기 전에 구현 시작
- 요청하지 않은 "개선"을 추가하여 버그 유발

## 해결책

**Research → Plan → Implement** 3단계 워크플로우로 분석, 계획, 구현을 엄격히 분리합니다.

- **Phase 1 (Research)**: 코드베이스를 깊이 분석하여 문서화
- **Phase 2 (Plan)**: 분석 결과를 바탕으로 상세 구현 계획 작성, 사용자 승인
- **Phase 3 (Implement)**: 승인된 계획을 기계적으로 실행

Phase 1, 2에서는 **코드 파일 수정이 물리적으로 차단**됩니다 (PreToolUse 훅).

## 사용법

```bash
# 1. 세션 시작
/deep-work "JWT 기반 사용자 인증 구현"

# 2. 코드베이스 분석
/deep-research

# 3. deep-work/research.md 검토 후 계획 작성
/deep-plan

# 4. deep-work/plan.md 검토, 피드백, 반복
#    만족스러우면 "승인" 입력

# 5. 구현 실행
/deep-implement

# 상태 확인 (아무 때나)
/deep-status
```

## 커맨드

| 커맨드 | 설명 |
|--------|------|
| `/deep-work <task>` | 세션 초기화, 작업 디렉토리 생성 |
| `/deep-research` | Phase 1: 코드베이스 분석 → `research.md` |
| `/deep-plan` | Phase 2: 구현 계획 작성 → `plan.md` |
| `/deep-implement` | Phase 3: 계획 실행 |
| `/deep-status` | 현재 상태 및 진행률 확인 |

## 산출물

- `deep-work/research.md` — 코드베이스 분석 결과
- `deep-work/plan.md` — 상세 구현 계획 (체크리스트 포함)
- `.claude/deep-work.local.md` — 세션 상태 (phase, 승인 여부 등)

## Phase Guard

`hooks/scripts/phase-guard.sh`가 Write/Edit 도구 호출을 감시합니다:

- **Research/Plan 단계**: `deep-work/` 내 문서와 상태 파일만 수정 허용
- **Implement 단계**: 모든 파일 수정 허용
- **세션 비활성**: 제한 없음

## 설치

### 방법 1: GitHub Marketplace (권장)

```bash
# 1. 마켓플레이스 추가
/plugin marketplace add Sungmin-Cho/sseocho-plugins

# 2. 플러그인 설치
/plugin install deep-work@sseocho
```

### 방법 2: npm

```bash
npm install @sseocho/claude-deep-work
```

### 방법 3: 로컬 (개발용)

이 저장소를 `~/.claude/plugins/deep-work/`에 클론합니다.
Claude Code가 자동으로 플러그인을 감지합니다.
npm package: @sset/doc
Description: 仅供作者测试使用
Author: jgzhang
Latest version: 0.1.2

# vant-doc-demo

## Project setup
```
npm install
```

### Compiles and hot-reloads for development
```
npm run serve
```

### Compiles and minifies for production
```
npm run build
```

### Run your tests
```
npm run test
```

### Lints and fixes files
```
npm run lint
```

### Customize configuration
See [Configuration Reference](https://cli.vuejs.org/config/).
npm package: @ssfbank/norwegian-id-validators
Description: Validates norwegian ssn, orgno(both statically and API), accountno and KID. Based on npm pkg norsk-validator.
Author: Asbjørn Lucassen, Sparebanken Sogn og Fjordane
Latest version: 1.0.0

# Norwegian Id number validators

* Validates statically norwegian ssn, kid, account and organization numbers.
* Generates statically a random norwegian SSN from a birth date.
* Should be usable in most js/ts environments.

TS+Babel fork of npm pkg norsk-validator.
Credit goes to original author https://github.com/storbukas/norsk-validator

# Usage

```
npm install @ssfbank/norwegian-id-validators
```

```
import { validateSsn, 
generateDigitsSsn, 
validateKid, 
validateAccount, 
validateOrg
} from '@ssfbank/norwegian-id-validators';

const valid = validateSsn('26068848740');
const valid = validateSsn('260688 48740');
const valid = validateKid('100001928231');
const valid = validateOrg('998 447 356');
const valid = validateAccount('7694.05.12057');

const ssn = generateDigitsSsn('260688');
// random valid ssn, like 26068848740
```
npm package: @ssfbank/push-to-repo
Description: Commit changes back to the repo from a GitLab CI job.
Author: Ville Säävuori
Latest version: 0.7.0

# Push To Repo

Commit changes back to the repo from a GitLab CI job.

Uses GitLab API and by default fails quietly (if the pushed file is for example unchanged). Easy to use and flexible to configure.

## Configuration

1. Add `GL_PRIVATE_TOKEN` to your GitLab repo CI/CD variables with a valid GitLab access token as its value.

## Usage

`npx push-to-repo -h`

All options except the filename are optional(or --all-commit if run in all commit mode). Note that by default the script does not set author details to the commit which means that it will use the credentials of the user who created the access token. This means that the commits will show up in that users commit history etc. If you want to avoid this, set author name and email explicitly.

```
Usage: push-to-repo -f <file> [options]

Options:
  -f, --file-name <filename>  the file to push
  -a, --all-commit            Push all modified or deleted changes or new files.
  -b, --branch <branch>       the branch to push (default: "CI_COMMIT_BRANCH")
  -m, --message <message>     commit message (default: "Update <filename> [skip ci]")
  -u, --base-url <url>        GitLab API base URL (default: "https://gitlab.com/api/v4")
  -n, --author-name           Author name
  -e, --author-email          Author e-mail
  --fail-on-error             fail the job on error
  -d, --debug                 debug (verbose) mode
  -V, --version               output the version number
  -h, --help                  display help for command
```

## All commit to Gitlab

This mode of commit replaces the -f flag and lets you push all easily handled changes(modified or deleted) to existing files. New files are also added. Renames and chmods are not though.

### Example use case in CI

The foremost practical use case for this is the common npm package release pattern where you increment the version of package.json, commit it, then publish it to NPM, all done in CI.

### Caveats

Remember that this cli only pushes through the gitlab API, so your current working tree remains unchanged. Gitlab jobs will by default swallow these changes and when the next job in the pipeline starts these are gone as it continues on the same commit. One way of handling this is for any later jobs in the pipeline to be triggered by the commit message.

This goes for the regular --file-name flag as well.

## Testing locally

This tool is intended to be used inside GitLab CI but you can test or use it locally by setting the following GitLab CI env variables: `CI_PROJECT_ID`, `CI_PROJECT_DIR`, and `CI_COMMIT_BRANCH`.

## Contributing

All contributions are welcome! Please follow the [code of conduct](https://www.contributor-covenant.org/version/2/0/code_of_conduct/) when interacting with others. [This project lives on GitLab](https://gitlab.com/uninen/push-to-repo).

[Follow @Uninen](https://twitter.com/uninen) on Twitter.
npm package: @ssfxx44533/onebot-qq
Description: OpenClaw channel plugin for NapCat / OneBot QQ
Latest version: 0.1.2

# @ssfxx44533/onebot-qq

OpenClaw 原生 `ChannelPlugin`，直接把 NapCat / OneBot QQ 接到 OpenClaw。

设计目标：

- 不再做独立 bridge + main + cron 的拼装服务
- 不在接入层持有模型 API token
- QQ 入站消息直接进入 OpenClaw 原生 session / reply pipeline
- 出站统一走 OpenClaw channel 能力，支持文本、图片、音频、视频、文件

## 当前范围

已实现：

- NapCat WebSocket 长连接与自动重连（指数退避重连）
- QQ 私聊入站
- QQ 群聊入站，默认要求 `@机器人`
- OpenClaw 原生 session 路由与自动回复分发
- DM pairing 审批流
- 入站图片 / 音频 / 视频自动缓存到本地媒体目录
- 入站文件附件元数据提取（`file` / `onlinefile`）
- 文本回复（超长自动分块，默认 1200 字）
- 图片 / 音频 / 视频消息发送
- 普通文件上传
- 基础 `allowFrom` / `groupAllowFrom` / `dmPolicy` / `groupPolicy`
- per-group `requireMention` / `systemPrompt` / `allowFrom`

暂未实现：

- OneBot 反向 HTTP webhook 模式
- 多账号复杂编排

## 安装

本地开发链接：

```bash
openclaw plugins install -l /root/openclaw-onebot-qq
openclaw plugins enable onebot-qq
openclaw gateway restart
```

后续发布到 npm 后：

```bash
openclaw plugins install @ssfxx44533/onebot-qq
openclaw plugins enable onebot-qq
openclaw gateway restart
```

## 配置

最小配置：

```json5
{
  channels: {
    "onebot-qq": {
      enabled: true,
      wsUrl: "ws://localhost:3001/?access_token=napcat_ws"
    }
  },
  plugins: {
    entries: {
      "onebot-qq": {
        enabled: true
      }
    }
  }
}
```

常用配置：

```json5
{
  channels: {
    "onebot-qq": {
      enabled: true,
      wsUrl: "ws://localhost:3001/?access_token=napcat_ws",
      selfId: "3546821676",
      requireMention: true,
      dmPolicy: "pairing",
      mediaMaxMb: 20,
      groupPolicy: "open",
      allowFrom: ["123456789"],
      groupAllowFrom: ["123456789"],
      groups: {
        "987654321": {
          requireMention: true,
          systemPrompt: "这是内部群，优先简洁回复。"
        }
      }
    }
  }
}
```

## 出站目标格式

- 私聊：直接填 QQ 号，例如 `123456789`
- 私聊：也可以用 `qq:123456789` 或 `private:123456789`
- 群聊：用 `group:987654321`

## 开发检查

```bash
cd /root/openclaw-onebot-qq
npm test
npm run check
```

## 兼容性说明

当前 OpenClaw 插件安装器只会对插件 `package.json` 里的 `dependencies`
执行隔离目录内的 `npm install`。因此本插件显式声明了 `openclaw`
运行时依赖，避免首次安装后出现
`Cannot find module 'openclaw/plugin-sdk/...` 这类宿主 SDK 解析失败。
npm package: @ssfxx44533/openclaw-onebot
Description: OpenClaw channel plugin for NapCat / OneBot QQ
Latest version: 0.1.0

# @ssfxx44533/openclaw-onebot

OpenClaw 原生 `ChannelPlugin`，直接把 NapCat / OneBot QQ 接到 OpenClaw。

设计目标：

- 不再做独立 bridge + main + cron 的拼装服务
- 不在接入层持有模型 API token
- QQ 入站消息直接进入 OpenClaw 原生 session / reply pipeline
- 出站统一走 OpenClaw channel 能力，支持文本、图片、音频、视频、文件

## 当前范围

第一版已实现：

- NapCat WebSocket 长连接与自动重连
- QQ 私聊入站
- QQ 群聊入站，默认要求 `@机器人`
- OpenClaw 原生 session 路由与自动回复分发
- DM pairing 审批流
- 入站图片 / 音频 / 视频自动缓存到本地媒体目录
- 文本回复
- 图片 / 音频 / 视频消息发送
- 普通文件上传
- 基础 `allowFrom` / `groupAllowFrom` / `dmPolicy` / `groupPolicy`

第一版暂未实现：

- OneBot 反向 HTTP webhook 模式
- 普通文件入站下载与本地转存
- 多账号复杂编排

## 安装

本地开发链接：

```bash
openclaw plugins install -l /root/openclaw-onebot-qq
openclaw plugins enable onebot-qq
openclaw gateway restart
```

后续发布到 npm 后：

```bash
openclaw plugins install @ssfxx44533/openclaw-onebot
openclaw plugins enable onebot-qq
openclaw gateway restart
```

## 配置

最小配置：

```json5
{
  channels: {
    "onebot-qq": {
      enabled: true,
      wsUrl: "ws://localhost:3001/?access_token=napcat_ws"
    }
  },
  plugins: {
    entries: {
      "onebot-qq": {
        enabled: true
      }
    }
  }
}
```

常用配置：

```json5
{
  channels: {
    "onebot-qq": {
      enabled: true,
      wsUrl: "ws://localhost:3001/?access_token=napcat_ws",
      selfId: "3546821676",
      requireMention: true,
      dmPolicy: "pairing",
      mediaMaxMb: 20,
      groupPolicy: "open",
      allowFrom: ["123456789"],
      groupAllowFrom: ["123456789"],
      groups: {
        "987654321": {
          requireMention: true,
          systemPrompt: "这是内部群，优先简洁回复。"
        }
      }
    }
  }
}
```

## 出站目标格式

- 私聊：直接填 QQ 号，例如 `123456789`
- 私聊：也可以用 `qq:123456789` 或 `private:123456789`
- 群聊：用 `group:987654321`

## 开发检查

```bash
cd /root/openclaw-onebot-qq
npm test
npm run check
```