@miracleplus/mplus 0.1.3 → 0.1.5

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@miracleplus/mplus",
3
- "version": "0.1.3",
3
+ "version": "0.1.5",
4
4
  "description": "奇绩创坛命令行工具(mplus CLI)",
5
5
  "keywords": [
6
6
  "miracleplus",
@@ -12,15 +12,20 @@
12
12
  "mplus": "./bin/mplus.js"
13
13
  },
14
14
  "main": "./dist/index.js",
15
+ "readme": "README.npm.md",
15
16
  "files": [
16
17
  "dist",
17
- "bin"
18
+ "bin",
19
+ "skills",
20
+ "scripts/postinstall-skills.js",
21
+ "README.npm.md"
18
22
  ],
19
23
  "scripts": {
20
24
  "build": "tsc -p tsconfig.build.json && node scripts/postbuild.js",
21
25
  "build:dev": "tsc && node scripts/postbuild.js",
22
26
  "obfuscate": "node scripts/obfuscate.js",
23
27
  "prepublishOnly": "npm run clean && npm run build && npm run obfuscate",
28
+ "postinstall": "node scripts/postinstall-skills.js",
24
29
  "dev": "tsc --watch",
25
30
  "start": "node dist/index.js",
26
31
  "clean": "rm -rf dist"
@@ -0,0 +1,49 @@
1
+ /**
2
+ * postinstall hook — 自动将 skills 安装到 ~/.agents/skills/
3
+ * npm install -g @miracleplus/mplus 时自动执行
4
+ */
5
+
6
+ const fs = require('fs');
7
+ const path = require('path');
8
+ const os = require('os');
9
+
10
+ const skillsSource = path.resolve(__dirname, '..', 'skills');
11
+ const skillsTarget = path.join(os.homedir(), '.agents', 'skills');
12
+
13
+ function copyDirSync(src, dest) {
14
+ fs.mkdirSync(dest, { recursive: true });
15
+ const entries = fs.readdirSync(src, { withFileTypes: true });
16
+ for (const entry of entries) {
17
+ const srcPath = path.join(src, entry.name);
18
+ const destPath = path.join(dest, entry.name);
19
+ if (entry.isDirectory()) {
20
+ copyDirSync(srcPath, destPath);
21
+ } else {
22
+ fs.copyFileSync(srcPath, destPath);
23
+ }
24
+ }
25
+ }
26
+
27
+ // 静默执行:失败不阻塞安装
28
+ try {
29
+ if (!fs.existsSync(skillsSource)) {
30
+ // 开发环境或 skills 目录未打包,跳过
31
+ process.exit(0);
32
+ }
33
+
34
+ const skillDirs = fs.readdirSync(skillsSource, { withFileTypes: true })
35
+ .filter((d) => d.isDirectory());
36
+
37
+ if (skillDirs.length === 0) {
38
+ process.exit(0);
39
+ }
40
+
41
+ for (const dir of skillDirs) {
42
+ copyDirSync(path.join(skillsSource, dir.name), path.join(skillsTarget, dir.name));
43
+ }
44
+
45
+ console.log(`mplus: ✓ ${skillDirs.length} AI skills installed to ${skillsTarget}`);
46
+ } catch (err) {
47
+ // 静默失败,不阻塞 npm install
48
+ // 用户可以后续手动执行 mplus install-skills
49
+ }
@@ -0,0 +1,49 @@
1
+ ---
2
+ name: mplus-admission
3
+ version: 0.1.0
4
+ description: "奇绩创坛 Admission 数据查询:查询创业项目(startup_projects)的申请材料和面试材料,支持按批次、补充材料等条件过滤。当用户需要查看、搜索、分析创业项目申请数据时使用。"
5
+ metadata:
6
+ requires:
7
+ bins: ["mplus"]
8
+ ---
9
+
10
+ # admission
11
+
12
+ **CRITICAL — 开始前 MUST 先用 Read 工具读取 [`../mplus-shared/SKILL.md`](../mplus-shared/SKILL.md),其中包含认证、错误处理等共享知识**
13
+
14
+ ## 核心概念
15
+
16
+ - **startup_project**: 创业项目记录,包含申请材料(application_content)和面试材料(interview_content)
17
+ - **batch**: 加速营批次,每期一个批次名(如 "S24"、"W25")
18
+ - **addition**: 补充材料标记,表示该记录是否为补充提交的材料
19
+
20
+ ## 资源关系
21
+
22
+ ```
23
+ Batch (batch_name)
24
+ └── StartupProject (project_id)
25
+ ├── application_content (申请材料,可能为 null)
26
+ ├── interview_content (面试材料,可能为 null)
27
+ └── addition (是否补充材料)
28
+ ```
29
+
30
+ ## 认证要求
31
+
32
+ admission 命令使用 OAuth 认证(非 API Key),需要先执行 `mplus login` 完成授权。
33
+
34
+ 支持 `--session` 参数切换不同的 OAuth session。
35
+
36
+ ## 命令速查
37
+
38
+ | 命令 | 说明 | 参考文档 |
39
+ |------|------|---------|
40
+ | `mplus admission startup-projects list` | 查询项目列表,支持过滤和分页 | [references/admission-startup-projects-list.md](references/admission-startup-projects-list.md) |
41
+ | `mplus admission startup-projects get <id>` | 查询单个项目详情 | [references/admission-startup-projects-get.md](references/admission-startup-projects-get.md) |
42
+
43
+ ## AI 使用建议
44
+
45
+ 1. **先查列表再取详情**:不确定 project_id 时,先用 `list` 命令查找,再用 `get` 获取完整内容
46
+ 2. **始终加 `--json`**:需要解析数据时必须使用 JSON 格式,默认文本格式会截断材料内容(只显示长度)
47
+ 3. **分页策略**:先不带过滤条件查看 `total`,了解数据规模后再决定是否需要翻页或加过滤条件
48
+ 4. **批次过滤**:如果用户提到具体批次(如 "S24 的项目"),使用 `--batch-name` 过滤
49
+ 5. **补充材料**:`--addition true` 只返回补充提交的记录,`--addition false` 只返回初始提交
@@ -0,0 +1,91 @@
1
+ # admission startup-projects get
2
+
3
+ > **前置条件:** 先用 Read 工具读取 [`../mplus-shared/SKILL.md`](../../mplus-shared/SKILL.md) 了解认证和全局参数。
4
+
5
+ 查询单个 startup_project 的详细信息。
6
+
7
+ 对应命令:`mplus admission startup-projects get <project_id>`(内部调用 `GET /admission/api/v1/startup-projects/:project_id`,通过 API Gateway)。
8
+
9
+ ## 命令示例
10
+
11
+ ```bash
12
+ # 查询单个项目(默认只看初始提交)
13
+ mplus admission startup-projects get proj_abc123
14
+
15
+ # JSON 格式输出(AI Agent 推荐)
16
+ mplus admission startup-projects get proj_abc123 --json
17
+
18
+ # 查看补充材料版本
19
+ mplus admission startup-projects get proj_abc123 --addition true --json
20
+
21
+ # 使用指定 OAuth session
22
+ mplus admission startup-projects get proj_abc123 --session work --json
23
+ ```
24
+
25
+ ## 参数
26
+
27
+ | 参数 | 必填 | 类型 | 默认值 | 说明 |
28
+ |------|------|------|--------|------|
29
+ | `<project_id>` | **是** | string (位置参数) | — | 项目唯一标识 |
30
+ | `--addition <bool>` | 否 | string | `"false"` | 是否查看补充材料版本:`true` 返回补充提交,`false` 返回初始提交 |
31
+ | `--session <name>` | 否 | string | `"default"` | OAuth session 名称 |
32
+ | `--json` | 否 | boolean | `false` | 以 JSON 格式输出完整响应 |
33
+
34
+ > **`--addition` 取值规则**:接受 `true`/`1`/`yes`/`y` 或 `false`/`0`/`no`/`n`(不区分大小写)。其他值会报错。
35
+
36
+ ## 返回字段
37
+
38
+ ### JSON 格式(`--json`)
39
+
40
+ ```json
41
+ {
42
+ "project_id": "proj_abc123",
43
+ "batch_name": "S24",
44
+ "application_content": "完整的申请材料文本...",
45
+ "interview_content": "完整的面试材料文本...",
46
+ "addition": false
47
+ }
48
+ ```
49
+
50
+ | 字段 | 类型 | 说明 |
51
+ |------|------|------|
52
+ | `project_id` | string | 项目唯一标识 |
53
+ | `batch_name` | string | 所属批次名 |
54
+ | `application_content` | string \| null | 申请材料全文(可能为 null,表示未提交) |
55
+ | `interview_content` | string \| null | 面试材料全文(可能为 null,表示未提交) |
56
+ | `addition` | boolean | 是否为补充材料 |
57
+
58
+ ### 默认文本格式
59
+
60
+ ```
61
+ 项目 ID:proj_abc123
62
+ 批次:S24
63
+ 补充材料:否
64
+ 申请材料长度:3456
65
+ 面试材料长度:2100
66
+ ```
67
+
68
+ > 文本格式只显示材料长度,不显示实际内容。需要完整内容必须加 `--json`。
69
+
70
+ ## 常见错误
71
+
72
+ | 现象 | 原因 | 解决方案 |
73
+ |------|------|---------|
74
+ | `OAuth 鉴权失败,请运行 mplus login 重新登录` | token 过期且刷新失败 | 执行 `mplus login` |
75
+ | `未找到 OAuth session,请先运行 mplus login` | 从未登录 | 执行 `mplus login` |
76
+ | `--addition 只能是 true 或 false` | `--addition` 传了非法值 | 使用 `true`/`false`/`1`/`0`/`yes`/`no` |
77
+ | `资源不存在` | project_id 不存在,或该 addition 状态下无记录 | 确认 project_id 正确;尝试切换 `--addition` 值 |
78
+ | `你没有访问该资源的权限` | 当前用户无 admission 数据权限 | 确认账户权限 |
79
+
80
+ ## AI 使用建议
81
+
82
+ 1. **获取完整材料**:必须加 `--json`,否则只能看到材料长度
83
+ 2. **初始 vs 补充材料**:同一个 project_id 可能有两个版本——初始提交(`--addition false`,默认)和补充提交(`--addition true`)。如果用户要看"最新材料"或"补充材料",记得切换 `--addition`
84
+ 3. **project_id 来源**:通常从 `admission startup-projects list` 的结果中获取
85
+ 4. **材料为 null**:表示该阶段材料尚未提交,不是错误
86
+
87
+ ## 参考
88
+
89
+ - [mplus-admission](../SKILL.md) — admission 领域概览
90
+ - [mplus-shared](../../mplus-shared/SKILL.md) — 认证和全局参数
91
+ - [admission-startup-projects-list](admission-startup-projects-list.md) — 查询项目列表
@@ -0,0 +1,150 @@
1
+ # admission startup-projects list
2
+
3
+ > **前置条件:** 先用 Read 工具读取 [`../mplus-shared/SKILL.md`](../../mplus-shared/SKILL.md) 了解认证和全局参数。
4
+
5
+ 查询 startup_projects 列表,支持按批次、补充材料、项目 ID 过滤,支持分页。
6
+
7
+ 对应命令:`mplus admission startup-projects list`(内部调用 `GET /admission/api/v1/startup-projects`,通过 API Gateway)。
8
+
9
+ ## 命令示例
10
+
11
+ ```bash
12
+ # 查询所有项目(默认第 1 页,每页 20 条)
13
+ mplus admission startup-projects list
14
+
15
+ # JSON 格式输出(AI Agent 推荐)
16
+ mplus admission startup-projects list --json
17
+
18
+ # 按批次过滤
19
+ mplus admission startup-projects list --batch-name "S24"
20
+
21
+ # 只看补充材料
22
+ mplus admission startup-projects list --addition true
23
+
24
+ # 只看初始提交
25
+ mplus admission startup-projects list --addition false
26
+
27
+ # 按项目 ID 精确查询
28
+ mplus admission startup-projects list --project-id "proj_abc123"
29
+
30
+ # 分页:第 2 页,每页 50 条
31
+ mplus admission startup-projects list --page 2 --page-size 50
32
+
33
+ # 组合过滤 + 分页 + JSON
34
+ mplus admission startup-projects list --batch-name "W25" --addition false --page 1 --page-size 10 --json
35
+
36
+ # 使用指定 OAuth session
37
+ mplus admission startup-projects list --session work --json
38
+ ```
39
+
40
+ ## 参数
41
+
42
+ | 参数 | 必填 | 类型 | 默认值 | 说明 |
43
+ |------|------|------|--------|------|
44
+ | `--batch-name <name>` | 否 | string | — | 按批次名过滤(精确匹配,如 `"S24"`、`"W25"`) |
45
+ | `--addition <bool>` | 否 | string | — | 按补充材料过滤:`true` 只返回补充提交,`false` 只返回初始提交 |
46
+ | `--project-id <id>` | 否 | string | — | 按 project_id 精确过滤 |
47
+ | `--page <number>` | 否 | string | `"1"` | 页码,从 1 开始 |
48
+ | `--page-size <number>` | 否 | string | `"20"` | 每页数量 |
49
+ | `--session <name>` | 否 | string | `"default"` | OAuth session 名称 |
50
+ | `--json` | 否 | boolean | `false` | 以 JSON 格式输出完整响应 |
51
+
52
+ > **`--addition` 取值规则**:接受 `true`/`1`/`yes`/`y` 或 `false`/`0`/`no`/`n`(不区分大小写)。其他值会报错。
53
+
54
+ ## 返回字段
55
+
56
+ ### JSON 格式(`--json`)
57
+
58
+ ```json
59
+ {
60
+ "total": 156,
61
+ "page": 1,
62
+ "page_size": 20,
63
+ "items": [
64
+ {
65
+ "project_id": "proj_abc123",
66
+ "batch_name": "S24",
67
+ "application_content": "完整的申请材料文本...",
68
+ "interview_content": "完整的面试材料文本...",
69
+ "addition": false
70
+ }
71
+ ]
72
+ }
73
+ ```
74
+
75
+ | 字段 | 类型 | 说明 |
76
+ |------|------|------|
77
+ | `total` | number | 符合条件的总记录数 |
78
+ | `page` | number | 当前页码 |
79
+ | `page_size` | number | 每页数量 |
80
+ | `items` | array | 项目列表 |
81
+ | `items[].project_id` | string | 项目唯一标识 |
82
+ | `items[].batch_name` | string | 所属批次名 |
83
+ | `items[].application_content` | string \| null | 申请材料全文(可能为 null) |
84
+ | `items[].interview_content` | string \| null | 面试材料全文(可能为 null) |
85
+ | `items[].addition` | boolean | 是否为补充材料 |
86
+
87
+ ### 默认文本格式
88
+
89
+ 文本格式只显示摘要信息(材料长度而非全文):
90
+
91
+ ```
92
+ 共 156 条,当前第 1 页,每页 20 条
93
+
94
+ 项目 ID:proj_abc123
95
+ 批次:S24
96
+ 补充材料:否
97
+ 申请材料长度:3456
98
+ 面试材料长度:2100
99
+
100
+ 项目 ID:proj_def456
101
+ 批次:S24
102
+ 补充材料:是
103
+ 申请材料长度:0
104
+ 面试材料长度:1800
105
+ ```
106
+
107
+ ## 分页
108
+
109
+ 服务端分页,通过 `--page` 和 `--page-size` 控制:
110
+
111
+ - `total` 表示符合过滤条件的总记录数
112
+ - 总页数 = `Math.ceil(total / page_size)`
113
+ - 翻页:递增 `--page` 值
114
+
115
+ ```bash
116
+ # 第 1 页
117
+ mplus admission startup-projects list --json --page 1 --page-size 20
118
+
119
+ # 第 2 页
120
+ mplus admission startup-projects list --json --page 2 --page-size 20
121
+
122
+ # 第 3 页
123
+ mplus admission startup-projects list --json --page 3 --page-size 20
124
+ ```
125
+
126
+ **判断是否还有下一页**:当 `page * page_size < total` 时,还有更多数据。
127
+
128
+ ## 常见错误
129
+
130
+ | 现象 | 原因 | 解决方案 |
131
+ |------|------|---------|
132
+ | `OAuth 鉴权失败,请运行 mplus login 重新登录` | token 过期且刷新失败 | 执行 `mplus login` |
133
+ | `未找到 OAuth session,请先运行 mplus login` | 从未登录 | 执行 `mplus login` |
134
+ | `--addition 只能是 true 或 false` | `--addition` 传了非法值 | 使用 `true`/`false`/`1`/`0`/`yes`/`no` |
135
+ | `你没有访问该资源的权限` | 当前用户无 admission 数据权限 | 确认账户权限 |
136
+ | `资源不存在` | API 路径错误或服务未部署 | 检查 API Gateway 状态 |
137
+
138
+ ## AI 使用建议
139
+
140
+ 1. **获取完整材料内容**:必须加 `--json`。默认文本格式只显示材料长度(字符数),不显示实际内容
141
+ 2. **大批量数据**:先查一次不带过滤条件看 `total`,再决定分页策略。如果 total 很大,优先加过滤条件缩小范围
142
+ 3. **查找特定项目**:如果知道 project_id,直接用 `--project-id` 过滤(或用 `get` 子命令)
143
+ 4. **批次名格式**:通常为 `S24`、`W25` 这样的格式(S=Summer, W=Winter + 年份后两位),精确匹配
144
+ 5. **材料为 null 的情况**:`application_content` 或 `interview_content` 为 null 表示该阶段材料尚未提交
145
+
146
+ ## 参考
147
+
148
+ - [mplus-admission](../SKILL.md) — admission 领域概览
149
+ - [mplus-shared](../../mplus-shared/SKILL.md) — 认证和全局参数
150
+ - [admission-startup-projects-get](admission-startup-projects-get.md) — 查询单个项目
@@ -0,0 +1,96 @@
1
+ ---
2
+ name: mplus-shared
3
+ version: 0.1.0
4
+ description: "奇绩创坛 CLI 共享基础:OAuth 登录、session 管理、全局参数、错误处理。当用户首次使用 mplus CLI、需要登录授权、遇到鉴权错误、或切换 session 时触发。"
5
+ metadata:
6
+ requires:
7
+ bins: ["mplus"]
8
+ ---
9
+
10
+ # mplus CLI 共享规则
11
+
12
+ 本技能指导你如何通过 mplus CLI 操作奇绩创坛平台资源。
13
+
14
+ ## 认证方式
15
+
16
+ mplus CLI 的 admission 相关命令使用 **OAuth Authorization Code + PKCE** 认证,通过 API Gateway (`https://api-gateway.miracleplus.com`) 访问后端服务。
17
+
18
+ ### 登录
19
+
20
+ ```bash
21
+ # 默认登录(自动打开浏览器)
22
+ mplus login
23
+
24
+ # 指定 session 名称(支持多账户)
25
+ mplus login --session work
26
+
27
+ # 不自动打开浏览器(手动复制链接)
28
+ mplus login --no-open
29
+ ```
30
+
31
+ 登录流程:
32
+ 1. CLI 启动本地 HTTP 服务器(端口 8765)
33
+ 2. 打开浏览器跳转到 MP OAuth 授权页面
34
+ 3. 用户在浏览器中完成授权
35
+ 4. CLI 自动接收回调,换取 access token
36
+ 5. Token 保存到本地 session
37
+
38
+ ### Session 管理
39
+
40
+ 支持多个 OAuth session 并存,通过 `--session` 切换:
41
+
42
+ ```bash
43
+ # 使用默认 session
44
+ mplus admission startup-projects list
45
+
46
+ # 使用指定 session
47
+ mplus admission startup-projects list --session work
48
+ ```
49
+
50
+ ### Token 自动刷新
51
+
52
+ - access token 过期前 60 秒自动使用 refresh_token 刷新
53
+ - 如果 refresh_token 也失效,需要重新 `mplus login`
54
+
55
+ ## 全局输出格式
56
+
57
+ 所有数据命令支持 `--json` 标志:
58
+
59
+ | 模式 | 说明 |
60
+ |------|------|
61
+ | 默认 | 人类友好的格式化文本输出 |
62
+ | `--json` | 完整 JSON 响应(2 空格缩进) |
63
+
64
+ **AI Agent 建议**:需要解析数据时始终使用 `--json`,默认文本格式仅供人类阅读。
65
+
66
+ ## 错误处理
67
+
68
+ 所有错误输出到 stderr,格式为 `错误:<message>`,进程退出码为 1。
69
+
70
+ | 错误消息 | 原因 | 解决方案 |
71
+ |---------|------|---------|
72
+ | `OAuth 鉴权失败,请运行 mplus login 重新登录` | access token 无效或过期且刷新失败 | 执行 `mplus login` 重新授权 |
73
+ | `未找到 OAuth session,请先运行 mplus login` | 从未登录或 session 不存在 | 执行 `mplus login --session <name>` |
74
+ | `你没有访问该资源的权限` | 当前用户无权限 | 确认账户权限 |
75
+ | `网络错误,无法连接 API Gateway` | 网络不通 | 检查网络连接 |
76
+ | `服务器错误,请稍后重试` | 后端 5xx | 等待后重试 |
77
+
78
+ ## Agent 代理发起登录
79
+
80
+ 当你作为 AI Agent 帮用户登录时:
81
+
82
+ 1. 使用 background 方式执行 `mplus login`(该命令会阻塞等待浏览器回调)
83
+ 2. 从输出中提取授权 URL 发给用户
84
+ 3. 等待用户在浏览器中完成授权
85
+ 4. 命令自动完成,session 已保存
86
+
87
+ ```bash
88
+ # background 执行,提取 URL 给用户
89
+ mplus login --session default
90
+ ```
91
+
92
+ ## 安全规则
93
+
94
+ - **禁止**将 access_token / refresh_token 输出到终端明文
95
+ - 写入/删除操作前确认用户意图
96
+ - 使用 `--json` 获取结构化数据,避免解析文本格式出错