helixlife-v5-cli 1.1.4 → 1.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
|
@@ -31,6 +31,7 @@
|
|
|
31
31
|
- **直播分类(必辨路由)**:
|
|
32
32
|
- `pathname` 为 `/edu/search`(顶栏搜索打开的页面):仅在 `main` 内点 `getByText('直播')`(与"课程"并列的结果 Tab),见 S-18 第 3 步;URL 常追加 `activeTab=live`。**禁止**改点侧栏 `to='/edu/courses'` 或套用 S-14。
|
|
33
33
|
- `pathname` 为 `/edu/courses` 或其它学习中心列表(非 `/edu/search`):「直播」指 S-14 顶栏「直播」 + 子类 → `/edu/lives?category=…`。
|
|
34
|
+
- **学习中心 · 子类消歧(必辨父 Tab)**:顶栏「课程 / 训练营 / 直播」为**一级 Tab**,各自下拉内有**独立子类**;**子类名可跨 Tab 重名**(实测「三十六策」同时存在于**课程**与**直播**下拉)。用户说「**课程**下的三十六策」→ **必须先点「课程」Tab 展开下拉**,再点该下拉内的「三十六策」→ 验收 `pathname` 仍为 `/edu/courses` 且带 `category=`、`title` 以 `课程-` 开头;**禁止**因子类名命中直播枚举而跳过「课程」Tab 直接去 `/edu/lives`。细则见「学习中心 · 一级 Tab 与子类消歧」。
|
|
34
35
|
- **播放页内切节(同课程:视频 / PDF / 作业等)**:用户说「下一个作业 / 下一节 / 下一份 PDF / 下一套小测」等,意图为**同一门课、同一大纲内**换到另一节时:
|
|
35
36
|
1. 先用 `eval`(如 `location.pathname`)或 `snapshot` 确认当前路由。
|
|
36
37
|
2. 若已在 `/edu/study/courses/{courseId}`:**必须优先**在本页 `main` 左侧「目录」(必要时先 `click` → `getByText('查看全部')` 展开)中,用 `getByText('<节完整标题>', { exact: true })` 直接 `click` 切节。视频、PDF、作业/小测等**均在本页完成**。
|
|
@@ -162,7 +163,7 @@
|
|
|
162
163
|
| 数据分析 · 列表 / 主·子分类 / 拼图 / 全局设置 / 卡片收藏 | S-13 |
|
|
163
164
|
| 数据分析 · 拼图工具子页(ABC 标注 · 生信工具 · 拖图 · 参考线 · TIFF/PDF 导出) | S-27(细则见「数据分析 · 拼图工具页」) |
|
|
164
165
|
| 数据分析 · 工具详情页(上传 / 验证 / 参数重置保存 / 确认出结果 / 顶栏文档) | S-28(细则见「数据分析 · 工具详情页」) |
|
|
165
|
-
| 学习中心 · 进入与 Tab
|
|
166
|
+
| 学习中心 · 进入与 Tab/子类(含跨 Tab 重名消歧) | S-14 |
|
|
166
167
|
| 学习中心 · 课程排序/个人筛选 | S-17 |
|
|
167
168
|
| 学习中心 · 顶栏关键字搜索(新标签) | S-18 |
|
|
168
169
|
| 搜索页 · 同关键词下切「课程 / 直播」结果 | S-18 第 3 步(非 S-14) |
|
|
@@ -774,19 +775,73 @@ helixlife-v5-cli run-code --filename=scripts/analysis-detail-upload-file.js
|
|
|
774
775
|
|
|
775
776
|
**说明**:`/edu/courses` 上切换顶栏「课程/训练营/直播」时,只有「课程」保持上述路径;点选训练营/直播子类会 push 到 `/edu/trainings?…`、`/edu/lives?…`(`category` 由后端配置,勿硬编码)。需确定回到课程列表时优先 `click` → `div.side-menu--item[to='/edu/courses']`,比顶栏 `getByText('课程')` 更稳。
|
|
776
777
|
|
|
778
|
+
#### 学习中心 · 一级 Tab 与子类消歧(Agent 必读)
|
|
779
|
+
|
|
780
|
+
> **核验记录**(2026-05-22):「课程」「训练营」「直播」均为**带下箭头的一级 Tab**;子类仅出现在**对应 Tab 展开的下拉菜单**内。子类名**可跨 Tab 重名**——实测 **「三十六策」** 同时存在于「课程」与「直播」下拉,但路由不同(`/edu/courses?category=…` vs `/edu/lives?category=…`)。
|
|
781
|
+
|
|
782
|
+
###### 一级 Tab 与子类枚举
|
|
783
|
+
|
|
784
|
+
| 一级 Tab | 路由(选子类后) | 子类(下拉内 · 2026-05-22 实测) |
|
|
785
|
+
| --- | --- | --- |
|
|
786
|
+
| **课程** | `/edu/courses` + `?category=…` | 全部课程、**三十六策**、套路体系、基金申请、基础科研、生信分析、临床研究、文献阅读、科研规划 |
|
|
787
|
+
| **训练营** | `/edu/trainings` + `?category=…` | 全部训练营、7天主题营、14天成长营、21天讲席营、30天陪读营 |
|
|
788
|
+
| **直播** | `/edu/lives` + `?category=…` | 全部直播、直播季、名师直播、陪读营、**三十六策**、直播大课 |
|
|
789
|
+
|
|
790
|
+
###### 跨 Tab 重名子类(必记)
|
|
791
|
+
|
|
792
|
+
| 子类名 | 出现的 Tab | 验收 |
|
|
793
|
+
| --- | --- | --- |
|
|
794
|
+
| **三十六策** | 课程、直播 | 课程:`pathname === '/edu/courses'` 且 `title` 以 `课程-` 开头;直播:`pathname === '/edu/lives'` 且 `title` 以 `直播-` 开头 |
|
|
795
|
+
|
|
796
|
+
> 运营后续若新增跨 Tab 重名,按同样格式追加本表;**勿**假设子类名全局唯一。
|
|
797
|
+
|
|
798
|
+
###### 用户话术 → 操作映射
|
|
799
|
+
|
|
800
|
+
| 用户说法 | 解析 | 操作 |
|
|
801
|
+
| --- | --- | --- |
|
|
802
|
+
| 「**课程**下的 XX / 切到课程 XX」 | 父 Tab = **课程** | `click` 顶栏「课程」Tab 块展开下拉 → 在下拉内 `click` → `getByText('XX', { exact: true })` |
|
|
803
|
+
| 「**直播**下的 XX / 切到直播 XX」 | 父 Tab = **直播** | 同上,父 Tab 换「直播」 |
|
|
804
|
+
| 「**训练营**下的 XX」 | 父 Tab = **训练营** | 同上,父 Tab 换「训练营」 |
|
|
805
|
+
| 仅说「三十六策」等**重名子类**、未给父 Tab | 歧义 | **向用户确认**「课程还是直播?」;或 `snapshot` 列出两 Tab 供选。**禁止**默认走直播 |
|
|
806
|
+
|
|
807
|
+
###### Agent 决策树(切换学习中心子类时必走)
|
|
808
|
+
|
|
809
|
+
1. **`snapshot`(必做)**。
|
|
810
|
+
2. 从用户句中解析**父 Tab 关键词**(课程 / 训练营 / 直播):
|
|
811
|
+
- **已明确**(如「课程下的三十六策」)→ 锁定该 Tab,**禁止**因子类名出现在其它 Tab 枚举而改道。
|
|
812
|
+
- **未明确**且子类名在「跨 Tab 重名」表 → **追问用户**或列出选项。
|
|
813
|
+
- **未明确**且子类名**仅**出现在某一 Tab 的子类枚举 → 可推断该 Tab(如「7天主题营」→ 训练营)。
|
|
814
|
+
3. **`click` 对应一级 Tab**(带下箭头的块,非整页裸 `getByText`)**展开下拉**。
|
|
815
|
+
4. **在该 Tab 的下拉菜单作用域内** `click` 目标子类(推荐先缩到 Tab 块再点,避免 strict / 误触另一 Tab 同名项):
|
|
816
|
+
|
|
817
|
+
```js
|
|
818
|
+
const tab = page.locator('main').locator('div').filter({ hasText: /^课程$/ }).first();
|
|
819
|
+
await tab.click();
|
|
820
|
+
await tab.getByText('三十六策', { exact: true }).click();
|
|
821
|
+
```
|
|
822
|
+
|
|
823
|
+
5. **验收**(必做):`pathname` 与 `document.title` 前缀须与**父 Tab**一致(见上表);`category=` 由后端配置,勿硬编码 UUID。
|
|
824
|
+
|
|
825
|
+
**反模式**
|
|
826
|
+
|
|
827
|
+
- **禁止**未确定父 Tab 就对全页 `getByText('三十六策')`(`.first()` 可能点到错误 Tab 或 strict 失败)。
|
|
828
|
+
- **禁止**用户已说「课程下的…」仍因文档/live 枚举含该名而跳转到 `/edu/lives`。
|
|
829
|
+
- **禁止**用搜索页 S-18 的「课程/直播」结果 Tab 代替列表页 S-14 的一级 Tab 下拉(除非当前已在 `/edu/search`)。
|
|
830
|
+
|
|
777
831
|
#### 信息架构与功能区块
|
|
778
832
|
|
|
779
833
|
| 层级 | 区块 | 功能要点 |
|
|
780
834
|
| --- | --- | --- |
|
|
781
835
|
| 全局 | 左侧主导航 | `div.side-menu--item[to='/edu/courses']`(S-07) |
|
|
782
836
|
| 列表公共顶栏 | 搜索 | 见 S-18;与应用/数据分析同一占位「请输入搜索关键词」+ 按钮「搜索」。数据分析同页内搜索见 S-13 |
|
|
783
|
-
| 列表 | 一级 Tab |
|
|
837
|
+
| 列表 | 一级 Tab | 「课程」「训练营」「直播」:均为**带下箭头下拉**的一级 Tab;`getByText('课程')` 等须配合展开后再点子类 |
|
|
838
|
+
| 课程 | 子类 | 全部课程、三十六策、套路体系、基金申请、基础科研、生信分析、临床研究、文献阅读、科研规划 → `/edu/courses?category=…`(**「三十六策」与直播下拉重名**,须先确定父 Tab,见「一级 Tab 与子类消歧」) |
|
|
784
839
|
| 课程列表 | 排序与筛选 | 「最新」「最热」(`paragraph` 可点);`getByRole('checkbox', { name: '只显示我学习的' })` |
|
|
785
840
|
| 课程列表 | 课程卡片 | 难度、已学人数、时长、已学进度(如「已学4%」);点击进入 `/edu/courses/…/learn`(S-19) |
|
|
786
841
|
| 训练营 | 子类 | 全部训练营、7天主题营、14天成长营、21天讲席营、30天陪读营 → `/edu/trainings?category=…` |
|
|
787
842
|
| 训练营列表 | 筛选 | 「全部」;「最新」「最热」;`getByRole('checkbox', { name: '只显示我报名的' })` |
|
|
788
843
|
| 训练营列表 | 卡片 | 营名、营类型、人数/状态(如「待开营」)、时长;点击进入 `/edu/trainings/{id}`(S-20) |
|
|
789
|
-
| 直播 | 子类 | 全部直播、直播季、名师直播、陪读营、三十六策、直播大课 → `/edu/lives?category
|
|
844
|
+
| 直播 | 子类 | 全部直播、直播季、名师直播、陪读营、三十六策、直播大课 → `/edu/lives?category=…`(**「三十六策」与课程下拉重名**,须先确定父 Tab) |
|
|
790
845
|
| 直播列表 | 讲师筛选 | 全部、酸菜、老谈、雪球、虾仁、猫大、AW、大空熠等;`getByText('雪球')` 等 |
|
|
791
846
|
| 直播列表 | 个人筛选 | `getByRole('checkbox', { name: '只显示我预约的' })` |
|
|
792
847
|
| 直播列表 | 卡片 | 时间、标题、讲师·预约人数;状态标签「预约中」「回放」;推荐直接点标题进入详情(S-21) |
|
|
@@ -954,9 +1009,10 @@ async page => {
|
|
|
954
1009
|
| 进入学习中心 | `div.side-menu--item[to='/edu/courses']` | 与全局侧栏表一致 |
|
|
955
1010
|
| 顶栏搜索框 | `getByRole('textbox', { name: '请输入搜索关键词' })` | 列表/搜索页通用 |
|
|
956
1011
|
| 顶栏搜索按钮 | `getByRole('button', { name: '搜索' })` | 点击后常**新开标签**(S-18) |
|
|
957
|
-
| 一级 Tab | `getByText('课程')`、`getByText('训练营')`、`getByText('直播')` |
|
|
958
|
-
|
|
|
959
|
-
|
|
|
1012
|
+
| 一级 Tab | `getByText('课程')`、`getByText('训练营')`、`getByText('直播')` | 切换子类须先 `click` Tab 块**展开下拉**,再点下拉内子类;跨 Tab 重名见「一级 Tab 与子类消歧」 |
|
|
1013
|
+
| 课程子类 | `getByText('三十六策')` 等 | **须**先展开「课程」Tab,并在该 Tab 作用域内点击 |
|
|
1014
|
+
| 训练营子类 | `getByText('7天主题营')` 等 | 须先展开「训练营」Tab |
|
|
1015
|
+
| 直播子类 | `getByText('名师直播')` 等 | 须先展开「直播」Tab;「三十六策」与课程重名,**禁止**全页裸点 |
|
|
960
1016
|
| 课程 · 最新/最热 | `getByText('最新')`、`getByText('最热')` | 与直播/训练营列表同文案 |
|
|
961
1017
|
| 课程 · 仅看我的学习 | `getByRole('checkbox', { name: '只显示我学习的' })` | |
|
|
962
1018
|
| 训练营 · 仅看我的报名 | `getByRole('checkbox', { name: '只显示我报名的' })` | |
|
|
@@ -1102,11 +1158,11 @@ async page => {
|
|
|
1102
1158
|
|
|
1103
1159
|
1. S-07 → `click` → `div.side-menu--item[to='/edu/courses']`。
|
|
1104
1160
|
2. **验收**:`location.pathname` 为 `/edu/courses`;`title` 以 `课程-` 开头;`main` 内可见顶栏「搜索」与「课程/训练营/直播」。
|
|
1105
|
-
3. **切换一级形态**(按需,均禁止对 `/edu/**` 使用 `goto
|
|
1106
|
-
-
|
|
1107
|
-
-
|
|
1108
|
-
-
|
|
1109
|
-
4. **优化**:子类名、讲师名以运营配置为准;失效时用 `snapshot` 更新本文枚举,不要猜 `category` UUID
|
|
1161
|
+
3. **切换一级形态**(按需,均禁止对 `/edu/**` 使用 `goto`;**子类切换细则见「一级 Tab 与子类消歧」**):
|
|
1162
|
+
- **课程 · 子类**:`click` 顶栏「课程」Tab 块展开下拉 → `click` → `getByText('<子类名>', { exact: true })`(须在该 Tab 作用域内)。验收:`pathname` 为 `/edu/courses` 且带 `category=`;`title` 以 `课程-` 开头。例:「课程下的三十六策」→ 课程 Tab → 三十六策,**勿**走直播。
|
|
1163
|
+
- **训练营 · 子类**:`click` → `getByText('训练营')` → 展开后 `click` → `getByText('<子类名>')`(如 7天主题营)。验收:`pathname` 为 `/edu/trainings` 且带 `category=`;`title` 以 `训练营-` 开头。
|
|
1164
|
+
- **直播 · 子类**:`click` 顶栏「直播」Tab 块展开下拉 → `click` → `getByText('<子类名>', { exact: true })`(须在该 Tab 作用域内)。验收:`pathname` 为 `/edu/lives` 且带 `category=`;`title` 以 `直播-` 开头。
|
|
1165
|
+
4. **优化**:子类名、讲师名以运营配置为准;失效时用 `snapshot` 更新本文枚举,不要猜 `category` UUID。跨 Tab 重名子类须回写「跨 Tab 重名子类」表。
|
|
1110
1166
|
|
|
1111
1167
|
#### S-17:学习中心 · 课程列表排序与个人课单筛选
|
|
1112
1168
|
|