open-index/open-npm huggingface dataset:
npm package: @raina-npm/opentest
Description: 规范驱动测试流程 - 面向 AI 的 Spec-driven Testing（新建、范围、策略、生成、报告、归档）
Latest version: 1.0.4

# OpenTest

规范驱动测试流程，推荐四步：**需求文档 → 需求分析和梳理 → 测试点 → 生成测试用例**。可在**命令行**直接使用（与 OpenSpec 类似），也可在 Cursor 中配合技能（opentest-new、opentest-analysis、opentest-points 等）使用。

## 安装

```bash
npm install -g @raina-npm/opentest
```

或使用 npx 免安装运行：

```bash
npx @raina-npm/opentest init
npx @raina-npm/opentest new 用户登录
```

安装后命令行仍使用 `opentest`（如 `opentest init`、`opentest new <name>`）。  
详细说明见 [使用说明](docs/使用说明.md)。

## 命令行用法

在任意项目根目录执行：

| 命令 | 说明 |
|------|------|
| `opentest init` | 初始化：复制技能到 `.claude/skills/`，创建 `opentest/changes/`、`opentest/archive/` |
| `opentest new <name>` | 新建测试变更（创建目录与 proposal.md 模板） |
| `opentest analysis [--name <name>]` | 在当前变更下创建 requirements-analysis.md 模板 |
| `opentest points [--name <name>]` | 创建 specs 目录与占位场景文件 |
| `opentest generate Excel\|XMind [--name <name>]` | 根据 testcases.json 生成用例到 artifacts/ |
| `opentest report [--name <name>]` | 创建 report.md 模板 |
| `opentest archive [--name <name>]` | 将当前变更归档到 archive/ |
| `opentest list` | 列出未归档与已归档变更 |
| `opentest --help` | 显示帮助 |
| `opentest --version` | 显示版本 |

若只有一个未归档变更，`analysis`、`points`、`generate`、`report`、`archive` 可不写 `--name`。

## 快速开始

```powershell
# 1. 初始化
opentest init

# 2. 新建一次测试
opentest new 用户登录

# 3. 需求分析与测试点（或直接编辑生成的文件）
opentest analysis --name 用户登录
opentest points --name 用户登录

# 4. 若有 testcases.json，生成用例
opentest generate Excel --name 用户登录
# 或同时生成 Excel 与 XMind
opentest generate Excel XMind

# 5. 归档
opentest archive --name 用户登录
```

## 在 Cursor 中使用

初始化后，在 Cursor 中可与 AI 使用对应技能（与技能列表中的名称一致）：

- opentest-new — 新建测试变更
- opentest-analysis — 需求分析与梳理
- opentest-points — 写测试点/场景
- opentest-generate Excel / opentest-generate XMind — 生成用例（AI 会从 specs 生成 testcases.json 再调用脚本）
- opentest-report — 写测试报告
- opentest-archive — 归档

## Python 依赖（可选）

若需生成 **Excel** 格式用例，请安装：

```bash
pip install openpyxl
```

XMind 生成无需额外依赖。

## 目录结构

```
opentest/
  changes/           # 各次测试变更
    <name>/          # proposal、requirements-analysis、specs、artifacts、report
    archive/         # 已归档的变更
```

## License

MIT
npm package: @raina-ss/strapi-plugin-github-projects
Description: This is the description of the plugin.
Author: A Strapi developer
Latest version: 1.1.0

# "Github Projects" - plugin for Strapi 4

This plugin allows to automatically generate "Projects" from public Github repositories, meant to be then exposed via a public API, e.g. to be shown on a front-end application with the aim to showcase a developer's portfolio.
It is meant mostly for educational purposes, being built step by step in the "Strapi Complete Course" by Artcoded, so it's not tested in production.

## How to install

```bash
# yarn
yarn add @raina-ss/strapi-plugin-github-projects

# npm
npm i @raina-ss/strapi-plugin-github-projects
```

## Initial configuration

In order to use this plugin, you need to generate a new personal token [on Github](https://github.com/settings/tokens).
The generated API key must then be set up for your Strapi app as an environment variable called `GITHUB_TOKEN` (add it to your `.env` file).

## Submit issues

Click [here](https://github.com/raina-SS/strapi-plugin-github-projects/issues) to submit an issue

## Disclaimer

We are not endorsed or affiliate in any way with Strapi nor with Github. The names and/or logos of such third-parties are or may be used just to describe the functionality of this plugin.
npm package: @rainb0w-clwn/passport-telegram-official
Description: [UPDATED] Telegram (not official, just the name) authentication strategy for Passport (https://core.telegram.org/widgets/login)
Author: Andrey Vasilev
Latest version: 2.0.2

# [FORKED AND UPDATED VERSION]

# passport-telegram-official

[Passport](http://passportjs.org/) strategy for authenticating with [Telegram](https://core.telegram.org/widgets/login)
using their Widget.

This module lets you authenticate using Telegram in your Node.js applications.
By plugging into Passport, Telegram authentication can be easily and
unobtrusively integrated into any application or framework that supports
[Connect](http://www.senchalabs.org/connect/)-style middleware, including
[Express](http://expressjs.com/).

## Install

    $ npm install passport-telegram-official

    or

    $ yarn add passport-telegram-official

## Usage

#### Create an Application

Before using `passport-telegram-official`, you must register your bot and get a API token. Read more about it on [Telegram Documentation](https://core.telegram.org/bots#3-how-do-i-create-a-bot). Then you must set your domain using `/setdomain` command sent to [@BotFather](https://telegram.me/botfather)

#### Configure Strategy

The Telegram authentication strategy authenticates users using a Telegram
account and Telegram own OAuth. That is simply. Just specify `botToken` and `verify` callback to complete authentication.

```js
passport.use(new TelegramStrategy({
    botToken: BOT_TOKEN
  },
  function(profile, cb) {
    User.findOrCreate({ telegramId: profile.id }, function (err, user) {
      return cb(err, user);
    });
  }
));
```

#### Authenticate Requests

Set'up a route to receive requests

```js
app.get('/auth/telegram',
  passport.authenticate('telegram'),
  function(req, res) {
    // Successful authentication, redirect home.
    res.redirect('/');
  });
```

#### Widget

Generate widget [here](https://core.telegram.org/widgets/login) and paste code on your site. Like this:

```html
<script async src="https://telegram.org/js/telegram-widget.js?2" data-telegram-login="YourBotName" data-size="medium" data-auth-url="/auth/telegram"></script>
```

## Examples

Start a server from `example` folder and go to home page. Note it won't work on `localhost`.

#### Tests

Isn't done yet.

```bash
$ make test
```

## License

[The MIT License](http://opensource.org/licenses/MIT)

## Credits

Based on:
* https://github.com/Blitss/passport-telegram-official
npm package: @rainbird/yolapi
Description: node.js wrapper for the Rainbird engine API.
Latest version: 0.3.5

# YolApi - An example API wrapper for Rainbird's inference engine.

Example which injects a fact:

```javascript
const api = require('@rainbirdai/yolapi');
const session = new api.session(
    'https://some-environment.rainbird.ai', // The environment you're targetting.
    '0648bb21-9fce-4ec7-ae4e-917fa4c2a7ee', // Your Api key.
    '3261cf53-06d3-4690-9e0e-f54788d57fe5'  // The knowledge-map ID.
);

const injectData = [
    {subject:'Bob', relationship:'lives in', object:'England'}
];

const queryData = { subject:'Bob', relationship:'speaks', object: null };

session.start(function(err, result) {
    if (err) throw (err);

    session.inject(injectData, function(err, result) {
        if (err) throw (err);

        session.query(queryData, function(err, result) {
            if (err) throw (err);
            // Write out the response from Rainbird.
            console.log(JSON.stringify(result, null, 3));
        });
    });
});
```

Example which initially answers a question and then goes back using undo:

```javascript
const api = require('@rainbirdai/yolapi');
const session = new api.session(
    'https://some-environment.rainbird.ai', // The environment you're targetting.
    '0648bb21-9fce-4ec7-ae4e-917fa4c2a7ee', // Your Api key.
    '3261cf53-06d3-4690-9e0e-f54788d57fe5'  // The knowledge-map ID.
);

const responseData = {
    answers: [{ subject: 'Bob', relationship: 'lives in', object: 'England' , cf: 100 }]
};

const queryData = { subject:'Bob', relationship:'speaks', object: null };

session.start(function(err, result) {
    if (err) throw (err);

    session.query(queryData, function(err, result) {
        if (err) throw (err);

        session.respond(responseData, function(err, result) {
            if (err) throw (err);
            
            session.undo(function(err, result) {
                if (err) throw (err);
    
                // Write out the response from Rainbird.
                console.log(JSON.stringify(result, null, 3));
            });
        });
    });
});
```
npm package: @rainbirdai/yolapi
Description: node.js wrapper for the Rainbird engine API.
Latest version: 0.3.4

# YolApi - An example API wrapper for Rainbird's inference engine.

Example which injects a fact:

```javascript
const api = require('@rainbirdai/yolapi');
const session = new api.session(
    'https://some-environment.rainbird.ai', // The environment you're targetting.
    '0648bb21-9fce-4ec7-ae4e-917fa4c2a7ee', // Your Api key.
    '3261cf53-06d3-4690-9e0e-f54788d57fe5'  // The knowledge-map ID.
);

const injectData = [
    {subject:'Bob', relationship:'lives in', object:'England'}
];

const queryData = { subject:'Bob', relationship:'speaks', object: null };

session.start(function(err, result) {
    if (err) throw (err);

    session.inject(injectData, function(err, result) {
        if (err) throw (err);

        session.query(queryData, function(err, result) {
            if (err) throw (err);
            // Write out the response from Rainbird.
            console.log(JSON.stringify(result, null, 3));
        });
    });
});
```

Example which initially answers a question and then goes back using undo:

```javascript
const api = require('@rainbirdai/yolapi');
const session = new api.session(
    'https://some-environment.rainbird.ai', // The environment you're targetting.
    '0648bb21-9fce-4ec7-ae4e-917fa4c2a7ee', // Your Api key.
    '3261cf53-06d3-4690-9e0e-f54788d57fe5'  // The knowledge-map ID.
);

const responseData = {
    answers: [{ subject: 'Bob', relationship: 'lives in', object: 'England' , cf: 100 }]
};

const queryData = { subject:'Bob', relationship:'speaks', object: null };

session.start(function(err, result) {
    if (err) throw (err);

    session.query(queryData, function(err, result) {
        if (err) throw (err);

        session.respond(responseData, function(err, result) {
            if (err) throw (err);
            
            session.undo(function(err, result) {
                if (err) throw (err);
    
                // Write out the response from Rainbird.
                console.log(JSON.stringify(result, null, 3));
            });
        });
    });
});
```