mails 0.2.0 → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.ja.md ADDED
@@ -0,0 +1,142 @@
1
+ # mails
2
+
3
+ AIエージェント向けのメールインフラ。プログラムでメールの送受信ができます。
4
+
5
+ [![npm](https://img.shields.io/npm/v/mails)](https://www.npmjs.com/package/mails)
6
+ [![license](https://img.shields.io/npm/l/mails)](https://github.com/chekusu/mails/blob/main/LICENSE)
7
+
8
+ [English](https://github.com/chekusu/mails/blob/main/README.md) | [中文](https://github.com/chekusu/mails/blob/main/README.zh.md)
9
+
10
+ ## 特徴
11
+
12
+ - **メール送信** — Resend経由(他のプロバイダーも追加予定)
13
+ - **メール受信** — Cloudflare Email Routing Worker経由
14
+ - **認証コード自動抽出** — メールから認証コードを自動検出(英語/中国語/日本語/韓国語対応)
15
+ - **ストレージプロバイダー** — ローカルSQLite(デフォルト)または [db9.ai](https://db9.ai) クラウドPostgreSQL
16
+ - **依存関係ゼロ** — Resendプロバイダーは `fetch()` を直接使用、SDKは不要
17
+ - **エージェントファースト** — `skill.md` 統合ガイド付きのAIエージェント向け設計
18
+ - **クラウドサービス** — `@mails.dev` アドレス、x402マイクロペイメント対応(近日公開)
19
+
20
+ ## インストール
21
+
22
+ ```bash
23
+ npm install -g mails
24
+ # または
25
+ bun install -g mails
26
+ # または直接実行
27
+ npx mails
28
+ ```
29
+
30
+ ## クイックスタート
31
+
32
+ ```bash
33
+ # 設定
34
+ mails config set resend_api_key re_YOUR_KEY
35
+ mails config set default_from "Agent <agent@yourdomain.com>"
36
+
37
+ # メール送信
38
+ mails send --to user@example.com --subject "Hello" --body "World"
39
+ ```
40
+
41
+ ## CLIリファレンス
42
+
43
+ ### 送信
44
+
45
+ ```bash
46
+ mails send --to <email> --subject <subject> --body <text>
47
+ mails send --to <email> --subject <subject> --html "<h1>Hello</h1>"
48
+ mails send --from "Name <email>" --to <email> --subject <subject> --body <text>
49
+ ```
50
+
51
+ ### 受信箱
52
+
53
+ ```bash
54
+ mails inbox # 最近のメール一覧
55
+ mails inbox --mailbox agent@test.com # 特定メールボックス
56
+ mails inbox <id> # メール詳細表示
57
+ ```
58
+
59
+ ### 認証コード
60
+
61
+ ```bash
62
+ mails code --to agent@test.com # コード待機(デフォルト30秒)
63
+ mails code --to agent@test.com --timeout 60 # タイムアウト指定
64
+ ```
65
+
66
+ コードは標準出力に出力されるため、パイプで利用可能: `CODE=$(mails code --to agent@test.com)`
67
+
68
+ ### 設定
69
+
70
+ ```bash
71
+ mails config # 全設定表示
72
+ mails config set <key> <value> # 値を設定
73
+ mails config get <key> # 値を取得
74
+ mails config path # 設定ファイルのパス表示
75
+ ```
76
+
77
+ ## SDK
78
+
79
+ ```typescript
80
+ import { send, getInbox, waitForCode } from 'mails'
81
+
82
+ // 送信
83
+ const result = await send({
84
+ to: 'user@example.com',
85
+ subject: 'Hello',
86
+ text: 'World',
87
+ })
88
+
89
+ // 受信箱一覧
90
+ const emails = await getInbox('agent@yourdomain.com', { limit: 10 })
91
+
92
+ // 認証コード待機
93
+ const code = await waitForCode('agent@yourdomain.com', { timeout: 30 })
94
+ if (code) console.log(code.code) // "123456"
95
+ ```
96
+
97
+ ## メールワーカー
98
+
99
+ `worker/` ディレクトリにCloudflare Email Routing Workerが含まれています。
100
+
101
+ ### セットアップ
102
+
103
+ ```bash
104
+ cd worker
105
+ bun install
106
+ # wrangler.toml を編集 — D1データベースIDを設定
107
+ wrangler d1 create mails
108
+ wrangler d1 execute mails --file=schema.sql
109
+ wrangler deploy
110
+ ```
111
+
112
+ その後、Cloudflare Email Routingでこのワーカーへの転送を設定します。
113
+
114
+ ## ストレージプロバイダー
115
+
116
+ ### SQLite(デフォルト)
117
+
118
+ `~/.mails/mails.db` のローカルデータベース。設定不要。
119
+
120
+ ### db9.ai
121
+
122
+ AIエージェント向けクラウドPostgreSQL。
123
+
124
+ ```bash
125
+ mails config set storage_provider db9
126
+ mails config set db9_token YOUR_TOKEN
127
+ mails config set db9_database_id YOUR_DB_ID
128
+ ```
129
+
130
+ ## テスト
131
+
132
+ ```bash
133
+ bun test # 全テスト実行(ユニット78件 + E2E 1件)
134
+ bun test:coverage # カバレッジレポート付き
135
+ bun test:live # ライブE2E(実際の Resend + Cloudflare、.env が必要)
136
+ ```
137
+
138
+ 全ファイル: 100.00% Functions | 100.00% Lines — ユニットテスト 78件 + ライブE2Eテスト 8件
139
+
140
+ ## ライセンス
141
+
142
+ MIT
package/README.md CHANGED
@@ -1,127 +1,197 @@
1
- ## ![Mails](http://ww2.sinaimg.cn/large/61ff0de3gw1eajmy0wdikj2014014wea.jpg) mails ![npm](https://badge.fury.io/js/mails.png)
1
+ # mails
2
2
 
3
- Mails 使发送邮件变得更简单与优雅,提高模板复用率。
3
+ Email infrastructure for AI agents. Send and receive emails programmatically.
4
4
 
5
- 使用 Mails 内建的标准模板 `mails-default` 来发送邮件,或者快速发布自己的邮件主题,Mails 推荐您把邮件主题发布到 NPM
5
+ [![npm](https://img.shields.io/npm/v/mails)](https://www.npmjs.com/package/mails)
6
+ [![license](https://img.shields.io/npm/l/mails)](https://github.com/chekusu/mails/blob/main/LICENSE)
6
7
 
7
- Mails 内建的标准邮件模板由 [Ink](http://zurb.com/ink) 改造而来,对二次开发表现友好,也对各个终端的兼容表现优秀。稍作修改,亦可以适配智能手机等小屏幕终端。
8
+ [日本語](https://github.com/chekusu/mails/blob/main/README.ja.md) | [中文](https://github.com/chekusu/mails/blob/main/README.zh.md)
9
+
10
+ ## Features
11
+
12
+ - **Send emails** via Resend (more providers coming)
13
+ - **Receive emails** via Cloudflare Email Routing Worker
14
+ - **Verification code extraction** — auto-extracts codes from emails (EN/ZH/JA/KO)
15
+ - **Storage providers** — local SQLite (default) or [db9.ai](https://db9.ai) cloud PostgreSQL
16
+ - **Zero dependencies** — Resend provider uses raw `fetch()`, no SDK needed
17
+ - **Agent-first** — designed for AI agents with `skill.md` integration guide
18
+ - **Cloud service** — `@mails.dev` addresses with x402 micropayments (coming soon)
19
+
20
+ ## Install
21
+
22
+ ```bash
23
+ npm install -g mails
24
+ # or
25
+ bun install -g mails
26
+ # or use directly
27
+ npx mails
28
+ ```
29
+
30
+ ## Quick Start
8
31
 
9
- ### 如何安装
10
32
  ```bash
11
- $ npm install mails --save
33
+ # Configure
34
+ mails config set resend_api_key re_YOUR_KEY
35
+ mails config set default_from "Agent <agent@yourdomain.com>"
36
+
37
+ # Send an email
38
+ mails send --to user@example.com --subject "Hello" --body "World"
12
39
  ```
13
40
 
14
- ### 快速指引
41
+ ## CLI Reference
42
+
43
+ ### Send
44
+
45
+ ```bash
46
+ mails send --to <email> --subject <subject> --body <text>
47
+ mails send --to <email> --subject <subject> --html "<h1>Hello</h1>"
48
+ mails send --from "Name <email>" --to <email> --subject <subject> --body <text>
49
+ ```
50
+
51
+ ### Inbox
52
+
53
+ ```bash
54
+ mails inbox # List recent emails
55
+ mails inbox --mailbox agent@test.com # Specific mailbox
56
+ mails inbox <id> # View email details
57
+ ```
58
+
59
+ ### Verification Code
60
+
61
+ ```bash
62
+ mails code --to agent@test.com # Wait for code (default 30s)
63
+ mails code --to agent@test.com --timeout 60 # Custom timeout
64
+ ```
65
+
66
+ The code is printed to stdout for easy piping: `CODE=$(mails code --to agent@test.com)`
67
+
68
+ ### Config
69
+
70
+ ```bash
71
+ mails config # Show all config
72
+ mails config set <key> <value> # Set a value
73
+ mails config get <key> # Get a value
74
+ mails config path # Show config file path
75
+ ```
76
+
77
+ ## SDK Usage
78
+
79
+ ```typescript
80
+ import { send, getInbox, waitForCode } from 'mails'
15
81
 
16
- Mails 包括三个部分:
82
+ // Send
83
+ const result = await send({
84
+ to: 'user@example.com',
85
+ subject: 'Hello',
86
+ text: 'World',
87
+ })
88
+
89
+ // List inbox
90
+ const emails = await getInbox('agent@yourdomain.com', { limit: 10 })
17
91
 
18
- - 一个邮件模板加载器
19
- - 一个支持实时编辑(live reload)的邮件模板设计工具(CLI)
20
- - 一个快速生成邮件主题项目文件的脚手架工具(CLI)
92
+ // Wait for verification code
93
+ const code = await waitForCode('agent@yourdomain.com', { timeout: 30 })
94
+ if (code) console.log(code.code) // "123456"
95
+ ```
21
96
 
22
- 如果你是邮件主题开发者,希望分享自己的主题,或者将他们发布到 NPM,你可能会想要使用到第二个与第三个工具;
23
- 如果你只是使用 mails 发送邮件的程序员,并不需要了解后两者如何运作,只需了解API的使用方法即可:
97
+ ### Direct Provider Usage
24
98
 
25
- ### 范例代码
26
- 最快上手使用 mails,我们来看一段渲染邮件的代码:
27
- ```js
28
- import mails from 'mails'
99
+ ```typescript
100
+ import { createResendProvider } from 'mails'
29
101
 
30
- // 使用 mails-default/basic 别名渲染邮件模板,并填入对应的变量:
31
- mails.render('basic', {
32
- name: 'The First Email To You',
33
- banner: 'http://mysite.com/banner.jpg'
34
- }).then(function(html){
35
- console.log(html) // 得到最终的邮件 html 代码
36
- }).catch(err => {
37
- console.log(err)
102
+ const resend = createResendProvider('re_YOUR_KEY')
103
+ await resend.send({
104
+ from: 'Agent <agent@yourdomain.com>',
105
+ to: ['user@example.com'],
106
+ subject: 'Hello',
107
+ text: 'Direct provider usage',
38
108
  })
39
109
  ```
40
110
 
41
- ### 加载 NPM 模块作为主题
42
- 你可以将 mails 提供的标准邮件主题进行简单的二次开发,然后发布到 NPM 作为您的邮件主题,使他人获益。
111
+ ## Email Worker
112
+
113
+ The `worker/` directory contains a Cloudflare Email Routing Worker for receiving emails.
43
114
 
44
- 在这个例子中,我们使用 `mails-flat` 模块中的 `message` 主题进行邮件渲染:
45
- ```js
46
- import mails from 'mails'
115
+ ### Setup
47
116
 
48
- mails.render('mails-flat/message', {})
49
- .then(function(html) {
50
- console.log(html)
51
- })
117
+ ```bash
118
+ cd worker
119
+ bun install
120
+ # Edit wrangler.toml — set your D1 database ID
121
+ wrangler d1 create mails
122
+ wrangler d1 execute mails --file=schema.sql
123
+ wrangler deploy
52
124
  ```
53
125
 
54
- #### 如何进行主题的二次开发
55
-
56
- 1. 首先,将 mails-cli 作为全局模块安装:
57
-
58
- ````
59
- $ npm install mails-cli -g
60
- ````
61
-
62
- 2. 建立新项目文件夹,初始化邮件主题:
63
-
64
- ````
65
- $ mkdir my-mails-theme && cd my-mails-theme
66
- $ mails init
67
- ````
68
-
69
- 3. 编辑 `package.json`,这个文件定义了模板引擎的配置,也保存了调试所需要的变量,确保此文件中有正确的 `view engine` 字段:
70
-
71
- ````
72
- $ vi ./package.json
73
- $ { "view engine": "swig" } // 比如使用swig作为模板引擎
74
- ````
75
-
76
- 4. 使用 live reload 设计工具进行开发
77
-
78
- ````
79
- // ./package.json 也是存放模板变量的文件
80
- $ mails watch ./package.json [-p] [port]
81
- ````
82
- 使用 mails 提供的 live reload 工具进行开发,程序会监听当前文件夹下文件的变动,包括样式表文件,模板文件和提供模板变量的 json 文件。打开相应的端口服务,指定相应文件的url即可访问,比如:
83
- ````
84
- $ GET http://localhost:3001/message.html
85
- ````
86
-
87
- #### 如何发布主题到 NPM
88
- 在使用 `npm publish` 发布到社区之前,确认以下几项:
89
- - 确保你的项目中 `package.json` 符合 NPM 社区规范
90
- - 确保 `package.json` 文件中有 `view engine` 字段并且符合邮件模板引擎
91
- - 确保填写了相应的依赖模块名
92
- - 建议在 readme.md 中附上一张模板最终渲染效果的截图
93
-
94
- ### 贡献我的代码
95
- - Fork this repo
96
- - Clone your repo
97
- - Install dependencies
98
- - Checkout a feature branch
99
- - Feel free to add your features
100
- - Make sure your features are fully tested
101
- - Open a pull request, and enjoy <3
102
-
103
- ### MIT license
104
- Copyright (c) 2013 turing &lt;o.u.turing@gmail.com&gt;
105
-
106
- Permission is hereby granted, free of charge, to any person obtaining a copy
107
- of this software and associated documentation files (the "Software"), to deal
108
- in the Software without restriction, including without limitation the rights
109
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
110
- copies of the Software, and to permit persons to whom the Software is
111
- furnished to do so, subject to the following conditions:
112
-
113
- The above copyright notice and this permission notice shall be included in
114
- all copies or substantial portions of the Software.
115
-
116
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
117
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
118
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
119
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
120
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
121
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
122
- THE SOFTWARE.
123
-
124
-
125
- ---
126
- ![docor](https://cdn1.iconfinder.com/data/icons/windows8_icons_iconpharm/26/doctor.png)
127
- generated using [docor](https://github.com/turingou/docor.git) @ 0.1.0. brought to you by [turingou](https://github.com/turingou)
126
+ Then configure Cloudflare Email Routing to forward to this worker.
127
+
128
+ ### Worker API
129
+
130
+ | Endpoint | Description |
131
+ |----------|-------------|
132
+ | `GET /api/inbox?to=<addr>&limit=20` | List emails |
133
+ | `GET /api/code?to=<addr>&timeout=30` | Long-poll for verification code |
134
+ | `GET /api/email?id=<id>` | Get email by ID |
135
+ | `GET /health` | Health check |
136
+
137
+ ## Storage Providers
138
+
139
+ ### SQLite (default)
140
+
141
+ Local database at `~/.mails/mails.db`. Zero config.
142
+
143
+ ### db9.ai
144
+
145
+ Cloud PostgreSQL for AI agents.
146
+
147
+ ```bash
148
+ mails config set storage_provider db9
149
+ mails config set db9_token YOUR_TOKEN
150
+ mails config set db9_database_id YOUR_DB_ID
151
+ ```
152
+
153
+ ## Config Keys
154
+
155
+ | Key | Default | Description |
156
+ |-----|---------|-------------|
157
+ | `mode` | `hosted` | `hosted` or `selfhosted` |
158
+ | `domain` | `mails.dev` | Email domain |
159
+ | `mailbox` | | Your receiving address |
160
+ | `send_provider` | `resend` | Send provider |
161
+ | `storage_provider` | `sqlite` | `sqlite` or `db9` |
162
+ | `resend_api_key` | | Resend API key |
163
+ | `default_from` | | Default sender address |
164
+ | `db9_token` | | db9.ai API token |
165
+ | `db9_database_id` | | db9.ai database ID |
166
+
167
+ ## Testing
168
+
169
+ ```bash
170
+ bun test # Run all tests (78 unit + 1 E2E)
171
+ bun test:coverage # With coverage report
172
+ bun test:live # Live E2E with real Resend + Cloudflare (requires .env)
173
+ ```
174
+
175
+ ### Test Coverage
176
+
177
+ ```
178
+ ---------------------------------|---------|---------|
179
+ File | % Funcs | % Lines |
180
+ ---------------------------------|---------|---------|
181
+ All files | 100.00 | 100.00 |
182
+ src/cli/commands/help.ts | 100.00 | 100.00 |
183
+ src/core/config.ts | 100.00 | 100.00 |
184
+ src/core/send.ts | 100.00 | 100.00 |
185
+ src/core/types.ts | 100.00 | 100.00 |
186
+ src/providers/send/resend.ts | 100.00 | 100.00 |
187
+ src/providers/storage/db9.ts | 100.00 | 100.00 |
188
+ src/providers/storage/sqlite.ts | 100.00 | 100.00 |
189
+ worker/src/extract-code.ts | 100.00 | 100.00 |
190
+ ---------------------------------|---------|---------|
191
+
192
+ 78 unit tests + 8 live E2E tests (real Resend + Cloudflare Email Routing)
193
+ ```
194
+
195
+ ## License
196
+
197
+ MIT
package/README.zh.md ADDED
@@ -0,0 +1,156 @@
1
+ # mails
2
+
3
+ 面向 AI Agent 的邮件基础设施。通过编程方式收发邮件。
4
+
5
+ [![npm](https://img.shields.io/npm/v/mails)](https://www.npmjs.com/package/mails)
6
+ [![license](https://img.shields.io/npm/l/mails)](https://github.com/chekusu/mails/blob/main/LICENSE)
7
+
8
+ [English](https://github.com/chekusu/mails/blob/main/README.md) | [日本語](https://github.com/chekusu/mails/blob/main/README.ja.md)
9
+
10
+ ## 特性
11
+
12
+ - **发送邮件** — 通过 Resend(更多 Provider 即将支持)
13
+ - **接收邮件** — 通过 Cloudflare Email Routing Worker
14
+ - **验证码自动提取** — 自动从邮件中提取验证码(支持中/英/日/韩)
15
+ - **存储 Provider** — 本地 SQLite(默认)或 [db9.ai](https://db9.ai) 云端 PostgreSQL
16
+ - **零依赖** — Resend Provider 直接使用 `fetch()`,无需 SDK
17
+ - **Agent 优先** — 为 AI Agent 设计,附带 `skill.md` 接入指南
18
+ - **云服务** — `@mails.dev` 邮箱地址,x402 微支付(即将上线)
19
+
20
+ ## 安装
21
+
22
+ ```bash
23
+ npm install -g mails
24
+ # 或
25
+ bun install -g mails
26
+ # 或直接使用
27
+ npx mails
28
+ ```
29
+
30
+ ## 快速开始
31
+
32
+ ```bash
33
+ # 配置
34
+ mails config set resend_api_key re_YOUR_KEY
35
+ mails config set default_from "Agent <agent@yourdomain.com>"
36
+
37
+ # 发送邮件
38
+ mails send --to user@example.com --subject "Hello" --body "World"
39
+ ```
40
+
41
+ ## CLI 参考
42
+
43
+ ### 发送
44
+
45
+ ```bash
46
+ mails send --to <email> --subject <subject> --body <text>
47
+ mails send --to <email> --subject <subject> --html "<h1>Hello</h1>"
48
+ mails send --from "Name <email>" --to <email> --subject <subject> --body <text>
49
+ ```
50
+
51
+ ### 收件箱
52
+
53
+ ```bash
54
+ mails inbox # 最近邮件列表
55
+ mails inbox --mailbox agent@test.com # 指定邮箱
56
+ mails inbox <id> # 查看邮件详情
57
+ ```
58
+
59
+ ### 验证码
60
+
61
+ ```bash
62
+ mails code --to agent@test.com # 等待验证码(默认 30 秒)
63
+ mails code --to agent@test.com --timeout 60 # 自定义超时
64
+ ```
65
+
66
+ 验证码输出到 stdout,方便管道使用:`CODE=$(mails code --to agent@test.com)`
67
+
68
+ ### 配置
69
+
70
+ ```bash
71
+ mails config # 显示所有配置
72
+ mails config set <key> <value> # 设置值
73
+ mails config get <key> # 获取值
74
+ mails config path # 显示配置文件路径
75
+ ```
76
+
77
+ ## SDK 用法
78
+
79
+ ```typescript
80
+ import { send, getInbox, waitForCode } from 'mails'
81
+
82
+ // 发送
83
+ const result = await send({
84
+ to: 'user@example.com',
85
+ subject: 'Hello',
86
+ text: 'World',
87
+ })
88
+
89
+ // 收件箱列表
90
+ const emails = await getInbox('agent@yourdomain.com', { limit: 10 })
91
+
92
+ // 等待验证码
93
+ const code = await waitForCode('agent@yourdomain.com', { timeout: 30 })
94
+ if (code) console.log(code.code) // "123456"
95
+ ```
96
+
97
+ ## 邮件 Worker
98
+
99
+ `worker/` 目录包含 Cloudflare Email Routing Worker,用于接收邮件。
100
+
101
+ ### 部署
102
+
103
+ ```bash
104
+ cd worker
105
+ bun install
106
+ # 编辑 wrangler.toml — 设置你的 D1 数据库 ID
107
+ wrangler d1 create mails
108
+ wrangler d1 execute mails --file=schema.sql
109
+ wrangler deploy
110
+ ```
111
+
112
+ 然后在 Cloudflare Email Routing 中配置转发到此 Worker。
113
+
114
+ ## 存储 Provider
115
+
116
+ ### SQLite(默认)
117
+
118
+ 本地数据库 `~/.mails/mails.db`,无需配置。
119
+
120
+ ### db9.ai
121
+
122
+ 面向 AI Agent 的云端 PostgreSQL。
123
+
124
+ ```bash
125
+ mails config set storage_provider db9
126
+ mails config set db9_token YOUR_TOKEN
127
+ mails config set db9_database_id YOUR_DB_ID
128
+ ```
129
+
130
+ ## 配置项
131
+
132
+ | 键 | 默认值 | 说明 |
133
+ |---|--------|------|
134
+ | `mode` | `hosted` | `hosted` 或 `selfhosted` |
135
+ | `domain` | `mails.dev` | 邮件域名 |
136
+ | `mailbox` | | 接收邮箱地址 |
137
+ | `send_provider` | `resend` | 发送 Provider |
138
+ | `storage_provider` | `sqlite` | `sqlite` 或 `db9` |
139
+ | `resend_api_key` | | Resend API 密钥 |
140
+ | `default_from` | | 默认发件人地址 |
141
+ | `db9_token` | | db9.ai API Token |
142
+ | `db9_database_id` | | db9.ai 数据库 ID |
143
+
144
+ ## 测试
145
+
146
+ ```bash
147
+ bun test # 运行所有测试(单元 78 + E2E 1)
148
+ bun test:coverage # 带覆盖率报告
149
+ bun test:live # Live E2E(真实 Resend + Cloudflare,需要 .env)
150
+ ```
151
+
152
+ 全部文件: 100.00% Functions | 100.00% Lines — 78 个单元测试 + 8 个 Live E2E 测试
153
+
154
+ ## 许可证
155
+
156
+ MIT