@optima-chat/dev-skills 0.16.7 → 0.16.8
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/.claude/commands/logs.md +1 -1
- package/.claude/commands/query-db.md +6 -1
- package/.claude/skills/discount-codes/SKILL.md +4 -4
- package/.claude/skills/generate-test-token/SKILL.md +8 -4
- package/.claude/skills/logs/SKILL.md +5 -3
- package/.claude/skills/show-env/SKILL.md +1 -1
- package/.claude/skills/yzsgo-e2e/SKILL.md +19 -0
- package/.claude/skills/yzsgo-e2e/SYNC.md +26 -2
- package/.claude/skills/yzsgo-e2e/chat_driver.py +221 -47
- package/.claude/skills/yzsgo-e2e/pull_wire.py +39 -8
- package/.claude/skills/yzsgo-e2e/run_e2e.py +17 -2
- package/.codex/skills/generate-test-token/SKILL.md +3 -2
- package/.codex/skills/logs/SKILL.md +4 -2
- package/.codex/skills/show-env/SKILL.md +4 -2
- package/.codex/skills/yzsgo-e2e/SKILL.md +19 -0
- package/.codex/skills/yzsgo-e2e/SYNC.md +26 -2
- package/.codex/skills/yzsgo-e2e/chat_driver.py +221 -47
- package/.codex/skills/yzsgo-e2e/pull_wire.py +39 -8
- package/.codex/skills/yzsgo-e2e/run_e2e.py +17 -2
- package/AGENTS.md +1 -1
- package/bin/cli.js +3 -3
- package/bin/helpers/billing-http.ts +12 -3
- package/bin/helpers/db-utils.ts +8 -5
- package/bin/helpers/generate-test-token.ts +40 -3
- package/bin/helpers/verify-health.ts +77 -29
- package/dist/bin/helpers/billing-http.js +9 -1
- package/dist/bin/helpers/db-utils.js +8 -2
- package/dist/bin/helpers/generate-test-token.js +40 -3
- package/dist/bin/helpers/verify-health.js +83 -27
- package/package.json +1 -1
package/.claude/commands/logs.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# /query-db - 查询数据库
|
|
2
2
|
|
|
3
|
-
执行 SQL 查询,支持 CI/Stage/Prod
|
|
3
|
+
执行 SQL 查询,支持 CI/Stage/Prod/cn-prod/cn-stage 五个环境。
|
|
4
4
|
|
|
5
5
|
**版本**: v0.7.0
|
|
6
6
|
|
|
@@ -23,6 +23,9 @@ optima-query-db user-auth "SELECT COUNT(*) FROM users" stage
|
|
|
23
23
|
|
|
24
24
|
# 查询 Prod 环境
|
|
25
25
|
optima-query-db commerce-backend "SELECT * FROM products LIMIT 5" prod
|
|
26
|
+
|
|
27
|
+
# 查询阿里云 cn 环境(cn-prod / cn-stage)
|
|
28
|
+
optima-query-db user-auth "SELECT COUNT(*) FROM users" cn-stage
|
|
26
29
|
```
|
|
27
30
|
|
|
28
31
|
**优点**:
|
|
@@ -60,6 +63,8 @@ optima-query-db commerce-backend "SELECT * FROM products LIMIT 5" prod
|
|
|
60
63
|
- `ci` - CI 持续集成环境(开发环境,默认)
|
|
61
64
|
- `stage` - Stage 预发布环境
|
|
62
65
|
- `prod` - Prod 生产环境(⚠️ 谨慎使用)
|
|
66
|
+
- `cn-prod` - 阿里云 cn-prod 生产环境(别名 `cn`,⚠️ 谨慎使用)
|
|
67
|
+
- `cn-stage` - 阿里云 cn-stage 预发环境
|
|
63
68
|
|
|
64
69
|
## 示例
|
|
65
70
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: "discount-codes"
|
|
3
|
-
description: "当用户请求创建优惠码、发优惠码、生成折扣码、promo code、discount code、批量生成优惠码、停用优惠码、查看优惠码时,使用此技能。支持 Stage、Prod
|
|
3
|
+
description: "当用户请求创建优惠码、发优惠码、生成折扣码、promo code、discount code、批量生成优惠码、停用优惠码、查看优惠码时,使用此技能。支持 Stage、Prod、cn-prod、cn-stage 四个环境。"
|
|
4
4
|
allowed-tools: ["Bash"]
|
|
5
5
|
---
|
|
6
6
|
|
|
@@ -45,13 +45,13 @@ optima-discount disable --code LAUNCH20 --env prod
|
|
|
45
45
|
| `--campaign` | 分组标签(generate 时也是码前缀) |
|
|
46
46
|
| `--count` | generate 生成数量 1-1000 |
|
|
47
47
|
| `--limit` | list 返回上限(默认 500,最大 1000) |
|
|
48
|
-
| `--env` | `stage` / `prod`(默认 `stage`) |
|
|
49
|
-
| `--yes` |
|
|
48
|
+
| `--env` | `stage` / `prod` / `cn-prod` / `cn-stage`(默认 `stage`) |
|
|
49
|
+
| `--yes` | 跳过生产环境二次确认 |
|
|
50
50
|
|
|
51
51
|
## 安全提醒
|
|
52
52
|
|
|
53
53
|
1. **Stage 优先**:默认 `stage`。
|
|
54
|
-
2.
|
|
54
|
+
2. **生产环境谨慎**:`create` / `generate` / `disable` 在 `prod` 与 `cn-prod` 会要求输入 "yes" 确认(`--yes` 跳过)。
|
|
55
55
|
3. **唯一码写文件**:`generate` 的码写入当前目录文件(`mode 0600`),不打屏——避免复制时被终端 padding 破坏。
|
|
56
56
|
4. 依赖 billing 已部署对应环境(admin 端点存在)。越界值(如 `--percent 0`)由 billing 服务端校验返 400。
|
|
57
57
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: "generate-test-token"
|
|
3
|
-
description: "当用户请求生成测试 token、创建测试账户、获取 access token、需要测试 API、API 测试、测试账户时,使用此技能。自动完成账户注册、token 获取和 merchant
|
|
3
|
+
description: "当用户请求生成测试 token、创建测试账户、获取 access token、需要测试 API、API 测试、测试账户时,使用此技能。自动完成账户注册、token 获取和 merchant 设置。支持 CI、Stage、Prod、cn-prod、cn-stage 五个环境。"
|
|
4
4
|
allowed-tools: ["Bash", "SlashCommand"]
|
|
5
5
|
---
|
|
6
6
|
|
|
@@ -63,6 +63,8 @@ optima-generate-test-token \
|
|
|
63
63
|
| ci | `auth.optima.chat` | `api.optima.chat` |
|
|
64
64
|
| stage | `auth.stage.optima.onl` | `api.stage.optima.onl` |
|
|
65
65
|
| prod | `auth.optima.onl` | `api.optima.onl` |
|
|
66
|
+
| cn-prod | `auth.yzsgo.com` | `commerce.yzsgo.com` |
|
|
67
|
+
| cn-stage | `auth.stage.optima.chat` | `commerce.stage.optima.chat` |
|
|
66
68
|
|
|
67
69
|
### 使用生成的 Token
|
|
68
70
|
|
|
@@ -207,7 +209,7 @@ curl -H "Authorization: Bearer $(cat /tmp/optima-test-token-xxx.txt)" \
|
|
|
207
209
|
|
|
208
210
|
使用 commerce CLI 时**必须**设置环境变量:
|
|
209
211
|
```bash
|
|
210
|
-
OPTIMA_ENV=ci #
|
|
212
|
+
OPTIMA_ENV=ci # 必需,与上面 --env 取同一个值 (ci/stage/prod/cn-prod/cn-stage)
|
|
211
213
|
OPTIMA_TOKEN=$(cat /tmp/optima-test-token-xxx.txt) # 必需,读取 token
|
|
212
214
|
```
|
|
213
215
|
|
|
@@ -225,15 +227,17 @@ OPTIMA_TOKEN=$(cat /tmp/optima-test-token-xxx.txt) # 必需,读取 token
|
|
|
225
227
|
|
|
226
228
|
### 支持的环境
|
|
227
229
|
|
|
228
|
-
|
|
230
|
+
工具支持五个环境,使用 `--env` 参数指定:
|
|
229
231
|
|
|
230
232
|
| 环境 | Auth API | Commerce API |
|
|
231
233
|
|------|----------|--------------|
|
|
232
234
|
| ci (默认) | `https://auth.optima.chat` | `https://api.optima.chat` |
|
|
233
235
|
| stage | `https://auth.stage.optima.onl` | `https://api.stage.optima.onl` |
|
|
234
236
|
| prod | `https://auth.optima.onl` | `https://api.optima.onl` |
|
|
237
|
+
| cn-prod | `https://auth.yzsgo.com` | `https://commerce.yzsgo.com` |
|
|
238
|
+
| cn-stage | `https://auth.stage.optima.chat` | `https://commerce.stage.optima.chat` |
|
|
235
239
|
|
|
236
|
-
⚠️ **注意**:Prod 环境创建的账户会出现在生产系统中,请谨慎使用。
|
|
240
|
+
⚠️ **注意**:Prod / cn-prod 环境创建的账户会出现在生产系统中,请谨慎使用。
|
|
237
241
|
|
|
238
242
|
## 💡 最佳实践
|
|
239
243
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: "logs"
|
|
3
|
-
description: "当用户请求查看日志、查看服务日志、排查问题、看看日志、检查日志、商品服务日志、后端日志、API日志、正式环境日志、生产环境日志、CI环境日志、开发环境日志、阿里云日志、cn-prod 日志、SAE 日志时,使用此技能。支持 CI、Stage、Prod(AWS ECS/CloudWatch)以及 cn-prod(阿里云 SAE/SLS
|
|
3
|
+
description: "当用户请求查看日志、查看服务日志、排查问题、看看日志、检查日志、商品服务日志、后端日志、API日志、正式环境日志、生产环境日志、CI环境日志、开发环境日志、阿里云日志、cn-prod 日志、cn-stage 日志、SAE 日志时,使用此技能。支持 CI、Stage、Prod(AWS ECS/CloudWatch)以及 cn-prod、cn-stage(阿里云 SAE/SLS)五个环境的 commerce-backend、user-auth、agentic-chat、gateway-core、optima-scout、optima-skills 等服务。"
|
|
4
4
|
allowed-tools: ["Bash", "SlashCommand"]
|
|
5
5
|
---
|
|
6
6
|
|
|
@@ -27,6 +27,7 @@ allowed-tools: ["Bash", "SlashCommand"]
|
|
|
27
27
|
**说明**:
|
|
28
28
|
- 查看 CI 开发环境(dev.optima.chat)
|
|
29
29
|
- 默认环境,不需要指定 `ci` 参数
|
|
30
|
+
- 🔴 这里的「默认 ci」只指 `/logs`(SSH + Docker Compose)。`optima-logs` CLI 不带 `--env` 时默认是 **`cn-prod`(阿里云生产)**,不是 `ci`(见 `bin/helpers/logs.ts`)—— 直接调 CLI 务必显式传 `--env`,否则以为在读 CI、实际读的是生产日志
|
|
30
31
|
- 通过 SSH + Docker Compose 访问
|
|
31
32
|
- 从 GitHub Variables 获取认证信息
|
|
32
33
|
|
|
@@ -175,16 +176,17 @@ INFO - Database query took 3200ms: SELECT * FROM products WHERE...
|
|
|
175
176
|
- 通过 CloudWatch Logs 查看
|
|
176
177
|
- 日志保留 7 天
|
|
177
178
|
|
|
178
|
-
### cn-prod 环境(阿里云)
|
|
179
|
+
### cn-prod / cn-stage 环境(阿里云)
|
|
179
180
|
|
|
180
181
|
```
|
|
181
182
|
/logs gateway-core 100 cn-prod
|
|
182
183
|
/logs agentic-chat 80 cn
|
|
184
|
+
/logs gateway-core 100 cn-stage
|
|
183
185
|
```
|
|
184
186
|
|
|
185
187
|
**特点**:
|
|
186
188
|
- 阿里云 **SLS**(日志服务,cn-beijing),不是 AWS CloudWatch
|
|
187
|
-
- ✅ 用 `optima-logs <svc> --env cn-prod` **直连 SLS**(`aliyun sls GetLogsV2`,公网控制面 API)——免 buildbox 跳板,支持历史检索 + 时间窗(`--since`)+ 关键词(`--grep`)
|
|
189
|
+
- ✅ 用 `optima-logs <svc> --env cn-prod|cn-stage` **直连 SLS**(`aliyun sls GetLogsV2`,公网控制面 API)——免 buildbox 跳板,支持历史检索 + 时间窗(`--since`)+ 关键词(`--grep`)
|
|
188
190
|
- 前置:本机需装 `aliyun` CLI + `aliyun-optima` profile(cn-beijing)
|
|
189
191
|
- 旧的「buildbox → SAE `DescribeInstanceLog` 取当前缓冲」已弃用(缓冲式、重启即丢、不能检索);技术细节见 `.claude/commands/logs.md`(即 `/logs` 命令文档)第 3 节
|
|
190
192
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: "show-env"
|
|
3
|
-
description: "当用户请求查看环境变量、查看配置、查看服务配置、环境变量是什么、env 变量、服务环境变量、查看 Infisical
|
|
3
|
+
description: "当用户请求查看环境变量、查看配置、查看服务配置、环境变量是什么、env 变量、服务环境变量、查看 Infisical 配置、cn 配置、阿里云配置时,使用此技能。支持查看当前 shell 环境变量,以及 Stage、Prod、cn-prod、cn-stage 四个环境的服务配置。"
|
|
4
4
|
allowed-tools: ["Bash", "SlashCommand"]
|
|
5
5
|
---
|
|
6
6
|
|
|
@@ -27,6 +27,25 @@ allowed-tools: ["Bash", "Read", "Write", "Agent", "Workflow"]
|
|
|
27
27
|
- 每个 ✋ 缺项:引导用户——`chrome-9222`:`python3 $S/bootstrap.py launch-chrome` 起窗口、让用户**手动登测试账号**(登一次长期免登);`buildbox-pw`:让用户把口令放 `~/.buildbox_pw`(内部拉 wire 用,向团队要);`test-user-id`:让用户登录 Optima(run_e2e 自动从 `~/.optima/token.json` 读 userId)。
|
|
28
28
|
- 补完 `python3 $S/preflight.py <env>` 复检,直到全 ✅ 才进四段。
|
|
29
29
|
|
|
30
|
+
## 并发(2026-09-09 起):本 skill 自己开 tab
|
|
31
|
+
|
|
32
|
+
鸭嘴兽支持并发任务了 —— **一个浏览器 tab = 一个独立 gateway session**(一 tab 一 session,
|
|
33
|
+
跨 tab 可真并行,同 tab 内仍串行;上限按 plan:free 1 / starter 2 / pro 4 / enterprise 20)。
|
|
34
|
+
|
|
35
|
+
`chat_driver.attach()` **默认就自己开一个 tab**(`own_tab="auto"`)——平台既然支持多 tab,
|
|
36
|
+
独占一个 session 就是常态,共用别人的 tab 才是例外。所以 `run_e2e.py` 直接 `attach()` 即可,
|
|
37
|
+
不去抢用户已经开着的 chat tab。两个好处——① 不跟用户/别的跑测互相串台;② 拿到确定的 `sessionId`,
|
|
38
|
+
`locate_conversation(..., session_id=...)` 按它**确定性**定位 wire 对话,不再靠 (时间, 首句) 猜
|
|
39
|
+
(并发跑时多个会话时间戳交叠,启发式会挑错)。`meta.json` 里多了 `session_id` 字段。
|
|
40
|
+
|
|
41
|
+
该环境 multi-tab flag 没开(`NEXT_PUBLIC_MULTI_TAB_SESSION`,build-time、**默认关**;
|
|
42
|
+
cn-prod 已验开、cn-stage 未验)时 `"auto"` 档自己会降级复用已有 tab(`d.tab_isolated=False`)
|
|
43
|
+
并打 warn,功能不减,只是 wire 定位退回启发式。
|
|
44
|
+
|
|
45
|
+
🔴 **绝不能让两个 driver 共用一个 tab**:实证会**静默串台**——两个线程写同一个 textarea,
|
|
46
|
+
后写的覆盖先写的,只有一条消息真到服务端,两边却都抓到同一份回复,还全程无报错。
|
|
47
|
+
细节见 `chat_driver.py` 模块 docstring。
|
|
48
|
+
|
|
30
49
|
## 四段流程
|
|
31
50
|
1. **preflight + 自举**:见上「环境自举」,**全绿**才继续。
|
|
32
51
|
2. **驱动 + 拉 wire + 备料**:`$VENV/bin/python $S/run_e2e.py --env <env> --message ... [--answer k=v] [--expect ...] --out <dir>` → 出 `prepped.md` + `meta.json`。🔑 用 **venv 的 python**(playwright 在那儿);`--user` 不给则自动读 `~/.optima/token.json`。
|
|
@@ -2,9 +2,33 @@
|
|
|
2
2
|
|
|
3
3
|
| 本文件 | 上游 repo · 路径 | commit | 同步日期 |
|
|
4
4
|
|---|---|---|---|
|
|
5
|
-
| chat_driver.py | optima-store-skills · .claude/skills/operating-yzsgo-chat/chat_driver.py |
|
|
6
|
-
| pull_wire.py | optima-store-skills · .claude/skills/pulling-yzsgo-session-wire/pull_wire.py |
|
|
5
|
+
| chat_driver.py | optima-store-skills · .claude/skills/operating-yzsgo-chat/chat_driver.py | 3cfc2d6 | 2026-09-09 |
|
|
6
|
+
| pull_wire.py | optima-store-skills · .claude/skills/pulling-yzsgo-session-wire/pull_wire.py | 3cfc2d6 | 2026-09-09 |
|
|
7
7
|
| prep_conversation.py | optima-gateway · .claude/skills/conversation-iq/prep_session.py(改编:+浏览器证据合并) | b75f575c | 2026-08-31 |
|
|
8
8
|
| judge_workflow.js | optima-gateway · .claude/skills/conversation-iq/workflow.js(改编:+前后端一致性维度) | b75f575c | 2026-08-31 |
|
|
9
9
|
|
|
10
10
|
> 注:judge_workflow.js 内联的 decideOutcome 是 judge_outcome.js(有 node 单测)的副本,改逻辑需同步两处。
|
|
11
|
+
|
|
12
|
+
## 2026-09-09 这次同步带了什么
|
|
13
|
+
|
|
14
|
+
上游把 e2e 改成**并发跑**(鸭嘴兽支持并发任务:一个 tab = 一个独立 gateway session)。
|
|
15
|
+
`chat_driver.py` 逐字取自上游 `3cfc2d6`(optima-store-skills#206,已合入 main),本次变更点:
|
|
16
|
+
|
|
17
|
+
- `attach()` **默认自己开 tab** 独占 session(`own_tab="auto"`;拿不到独立 session 就降级复用
|
|
18
|
+
已有 tab 并置 `tab_isolated=False`)。`own_tab=True` 是严格档,并行必用——auto 档多 worker
|
|
19
|
+
一起降级会都落到同一个 tab 上 = 静默串台。
|
|
20
|
+
- `session_id` / `close()` 只关自己开的 tab / `concurrency_status()` 读并发名额。
|
|
21
|
+
- send 拒绝分流从三码扩到五码(新增 `concurrency_limit` / `busy_elsewhere`)。
|
|
22
|
+
|
|
23
|
+
`pull_wire.py` 是**改编**(不逐字)。这次做了两件事:
|
|
24
|
+
|
|
25
|
+
1. **补回漏掉的上游修复 #102**(`bfa103c`「末 response 缺失显式标注,不再静默截断」)——
|
|
26
|
+
vendored 副本从 2026-08-31 起就没跟上,一直在静默截断。上游的 4 条回归也一并移植到
|
|
27
|
+
`tests/yzsgo-e2e/test_pull_wire_render.py`(另加一条锁 `render_conversation` 的 6 元 arity,
|
|
28
|
+
因为 `run_e2e.py` 按 6 元解包,少一个会在出报告前一步崩)。
|
|
29
|
+
⚠️ 教训:`verify_drift.py` 对改编文件只标「⚠️(改编·预期)」,**看到这个标记要真的去读上游有什么新提交**,
|
|
30
|
+
不能当成「预期差异」放过——这次就是那么漏掉半个月的。
|
|
31
|
+
2. 自行加了 `locate_conversation(..., session_id=...)`:
|
|
32
|
+
按 gateway sessionId **确定性**定位本轮对话,取代 (时间, 首句) 启发式 —— 并发跑时多个会话
|
|
33
|
+
时间戳交叠,启发式会挑错。传了 sid 却命不中就返回 None,**不静默回退**全局启发式
|
|
34
|
+
(回退会安静地定位到别的 session 的对话)。上游没有这个函数,是本仓独有的腿。
|