一键导入
smoke-test
自动生成冒烟测试 curl 命令。扫描目标模块的 Controller 端点,生成链式 curl 命令(前一步的输出 ID 传给后续请求),读取环境变量 AI_ACCESS_KEY 作为认证凭据。触发词:"冒烟测试"、"smoke test"、"跑个冒烟"。
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
菜单
自动生成冒烟测试 curl 命令。扫描目标模块的 Controller 端点,生成链式 curl 命令(前一步的输出 ID 传给后续请求),读取环境变量 AI_ACCESS_KEY 作为认证凭据。触发词:"冒烟测试"、"smoke test"、"跑个冒烟"。
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
基于 SOC 职业分类
识别每日验收、PR 验收、commit 验收、未发布分支验收、缺陷复测、视觉回归和发布前验收等场景,并为 create-visual-test-to-kb 生成测试范围、指差法步骤、预期结果、证据链、截图回读和报告结构。Use when the user asks to optimize or run visual acceptance across different scenarios, asks whether yesterday's changes, a PR, a commit range, or an unpublished branch were really accepted, or needs PR/commit results to map to screenshots and MAP knowledge base reports.
Convert PRs, commits, yesterday's changes, or release scope into a test-minded acceptance design before visual execution. Use when the user asks for daily acceptance, visual acceptance, PR/commit acceptance, proof that code changes really affected product behavior, coverage planning, fusion testing, evidence strength, or when screenshots/reports looked related but failed to prove the assigned task.
工业级功能验收/视觉测试全流水线(MAP 验收标准 v2)——模拟人类的浏览器取证 + 标准化验收报告 + 归档进 CDS 验收中心并出直达深链。职责分离:验收报告永远按项目归 CDS(平台自带、证据链内置),MAP 等系统通过知识库开放协议从 CDS 拉取展示,技能不再分流到 MAP 知识库。一个技能内含三段:标准/模板、模拟人类浏览器取证(点击导航进入、禁地址栏直达、双主题截图、ZZ 照做风画框标序号 stepClick/stepShot)、报告归档(命名结构固定,**每次归档强制输出可达地址**:CDS 直达深链 /reports,匿名对外用 /r/token)。默认报告走 **ZZ 照做风**(全大标题 + 一句话一步 + 逐步配图 `{{IMG:}}` + 文字在上图在下 + 变化处画框 + 分支顺序讲,同岗位照做必复现)。归档前有**强制准入校验**:目标/档位/Verdict/截图数/证据完整性/报告结构不达标直接拒收(入口准则,杜绝"什么都能进")。项目无关,改 acceptance.config.json 即可跨仓库复用;无 CDS/离线退化为本地 md+截图。触发词:"视觉验收"、"验收"、"视觉测试"、"验收归档"、"归档验收报告"、"create visual test"、"/视觉验收"、"/验收"。
CDS (Cloud Dev Space) core skill — hosts the canonical cdscli Python CLI, handles authentication (static AI_ACCESS_KEY / dynamic pairing / project key), manages env vars and project keys, owns CDS service self-update, defines the preview-URL slug formula, and acts as dispatcher when the user's intent is ambiguous between cold-path scanning and hot-path debugging. Activates when the user mentions CDS generically without specifying scan-or-deploy, configures CDS credentials, manages env / keys, updates the CDS service code itself, or asks about preview URL conventions. Does NOT directly perform project scanning (delegates to cds-project-scan, the cold path) or deployment debugging (delegates to cds-deploy-pipeline, the hot path). Trigger phrases include "cds 认证", "AI_ACCESS_KEY", "项目 key", "cds 自更新", "cds self-update", "预览地址公式", "配 cds 环境变量", "/cds", "/cds-auth", and the bare word "cds" when the user has not yet picked a direction.
Generates weekly project reports from git history. Collects commits, PRs, and contributor data, analyzes and categorizes changes, then produces a structured Chinese-language weekly report (overview, completed items, next-week priorities) saved to doc/report.YYYY-WXX.md. Trigger words: "生成周报", "写周报", "weekly report", "本周总结".
从 git 历史生成「今日大事早知道」开发日报,并发布到知识库(文档空间)。按「新增功能多讲 → 优化/修复次之 → 计划/遗留垫底」的固定权重分层叙事。自动 find-or-create「日报知识库」并出分享链。触发词:"生成日报"、"写日报"、"今日大事"、"日报"、"daily report"、"/daily"、"今天干了啥"。
| name | smoke-test |
| description | 自动生成冒烟测试 curl 命令。扫描目标模块的 Controller 端点,生成链式 curl 命令(前一步的输出 ID 传给后续请求),读取环境变量 AI_ACCESS_KEY 作为认证凭据。触发词:"冒烟测试"、"smoke test"、"跑个冒烟"。 |
版本:v1.0.0 | 状态:已落地 | 触发:
/smoke、"冒烟测试"、"smoke test"、"跑个冒烟"
CDS 分支冒烟请优先用
cds技能 (2026-04-18):cdscli smoke <branchId>覆盖了 分层冒烟(L1 根路径 / L2 无认证 API / L3 认证 API)+ 预览域名自动推断。本技能继续服务于非 CDS 场景:给单一模块 Controller 生成链式 curl(前一步的 ID 传给后续),比如本地起了 prd-api 想跑个冒烟。
为指定模块自动生成链式冒烟测试 curl 命令,验证 CRUD + 核心业务流程的端到端可用性。
| 变量 | 用途 | 默认值 |
|---|---|---|
AI_ACCESS_KEY | API 认证密钥(CDS 和 MAP 平台通用) | 无,必须设置 |
MAP_AI_USER | X-AI-Impersonate 用户名(优先级最高) | 无 |
SMOKE_TEST_HOST | API 服务地址 | http://localhost:5000 |
CDS_HOST | CDS 地址(CDS 模式时使用) | 无 |
AI_ACCESS_KEY是通用密钥:同一个 key 可用于 CDS 管理 API、MAP 平台 API、以及后端业务 API 的认证,无需为不同平台维护多个密钥。
直接 curl 本地或远程 API:
-H "X-AI-Access-Key: $AI_ACCESS_KEY"
-H "X-AI-Impersonate: ${MAP_AI_USER}" # ← 优先从环境变量读取
优先使用此模式,减少 container-exec 调用。
AI_ACCESS_KEY是通用密钥,可直接认证 MAP 平台 API。
通过预览域名直连 MAP 平台 API(无需 container-exec 中转):
警告:
PREVIEW_URL必须走 cdscli 拿,禁止任何形式的手拼(${BRANCH_ID}.miduo.org是 v1 老公式,多项目 CDS 下不可用)。 唯一入口:python3 .claude/skills/cds/cli/cdscli.py --human preview-url(零参数,从 git + /api/branches 自动检测)
PREVIEW_URL=$(python3 .claude/skills/cds/cli/cdscli.py --human preview-url | sed 's:/$::')
IMPERSONATE="${MAP_AI_USER}"
# 直接调用(AI_ACCESS_KEY 通用认证)
curl -sf "$PREVIEW_URL/api/users?pageSize=3" \
-H "X-AI-Access-Key: $AI_ACCESS_KEY" \
-H "X-AI-Impersonate: $IMPERSONATE"
何时使用 MAP 直连模式:
SMOKE_TEST_HOST 是 CDS 预览域名(*.miduo.org)MAP_AI_USER 已配置(省去用户名发现步骤)仅当 MAP 直连失败(Cloudflare/CDN 干扰或端点特殊)时使用 container-exec:
# 仅在直连失败时才用 container-exec
curl -sf "$CDS/api/branches/$BRANCH_ID/container-exec" \
-H "X-AI-Access-Key: $AI_ACCESS_KEY" \
-X POST -H "Content-Type: application/json" \
-d '{"profileId":"api","command":"curl -s http://localhost:5000/api/..."}'
注意:减少 container-exec 使用:container-exec 有嵌套 JSON 转义复杂、调试困难等问题。优先使用模式 B 直连。
警告:严禁硬编码
admin或root。admin通常不是真实数据库用户名,root是破窗账户不在 users 集合中。
自动发现流程(每次冒烟测试开始前必须执行,按优先级尝试):
# 方法 1(最推荐,零网络请求):读取环境变量 MAP_AI_USER
IMPERSONATE="${MAP_AI_USER:-}"
if [[ -n "$IMPERSONATE" ]]; then
echo "[OK] 从 MAP_AI_USER 获取用户名: $IMPERSONATE"
fi
# 方法 2(兜底):通过 root 登录 + JWT 查询用户列表
if [[ -z "$IMPERSONATE" ]]; then
TOKEN=$(curl -s "$HOST/api/v1/auth/login" -X POST \
-H "Content-Type: application/json" \
-d "{\"username\":\"root\",\"password\":\"$ROOT_ACCESS_PASSWORD\",\"clientType\":\"admin\"}" \
| python3 -c "import sys,json;print(json.load(sys.stdin)['data']['accessToken'])")
IMPERSONATE=$(curl -s "$HOST/api/users?pageSize=1" \
-H "Authorization: Bearer $TOKEN" \
| python3 -c "import sys,json;print(json.load(sys.stdin)['data']['items'][0]['username'])")
fi
强烈建议:在 AI 运行环境中配置
MAP_AI_USER环境变量,避免每次冒烟测试都通过 root JWT 登录来发现用户名。
# 请求头(使用自动发现的用户名)
-H "X-AI-Access-Key: $AI_ACCESS_KEY"
-H "X-AI-Impersonate: $IMPERSONATE"
用户说 "冒烟测试" 时,需要判断测试范围:
读取目标模块的 Controller 文件,提取:
[HttpGet], [HttpPost], [HttpPut], [HttpDelete])[Route("api/xxx")])# Controller 文件位置
prd-api/src/PrdAgent.Api/Controllers/Api/{ModuleName}Controller.cs
根据扫描结果,生成一个完整的 bash 脚本,包含:
输出完整的可执行 bash 脚本,格式如下:
#!/bin/bash
# ============================================
# 冒烟测试: {模块名}
# 生成时间: {当前时间}
# ============================================
set -e
# --- 配置 ---
HOST="${SMOKE_TEST_HOST:-http://localhost:5000}"
KEY="${AI_ACCESS_KEY:?请设置环境变量 AI_ACCESS_KEY}"
AUTH=(-H "X-AI-Access-Key: $KEY" -H "X-AI-Impersonate: admin" -H "Content-Type: application/json")
echo "=========================================="
echo "冒烟测试: {模块名}"
echo "目标: $HOST"
echo "=========================================="
# --- 1. 只读查询 ---
echo ""
echo ">>> [1/N] 查询元数据..."
RESULT=$(curl -sf "$HOST/api/{module}/metadata" "${AUTH[@]}")
echo "$RESULT" | jq -r '.data'
echo "[OK] 元数据查询成功"
# --- 2. 创建资源 ---
echo ""
echo ">>> [2/N] 创建测试资源..."
RESULT=$(curl -sf "$HOST/api/{module}/items" "${AUTH[@]}" \
-X POST \
-d '{
"name": "smoke-test-临时",
"field1": "value1"
}')
ITEM_ID=$(echo "$RESULT" | jq -r '.data.id')
echo "[OK] 创建成功, ID: $ITEM_ID"
# --- 3. 读取验证 ---
echo ""
echo ">>> [3/N] 读取刚创建的资源..."
curl -sf "$HOST/api/{module}/items/$ITEM_ID" "${AUTH[@]}" | jq '.data'
echo "[OK] 读取成功"
# --- 4. 更新 ---
echo ""
echo ">>> [4/N] 更新资源..."
curl -sf "$HOST/api/{module}/items/$ITEM_ID" "${AUTH[@]}" \
-X PUT \
-d '{"name": "smoke-test-已更新"}'
echo "[OK] 更新成功"
# --- 5. 业务操作 ---
# (根据模块生成特有操作)
# --- 6. 清理 ---
echo ""
echo ">>> [N/N] 清理测试资源..."
curl -sf "$HOST/api/{module}/items/$ITEM_ID" "${AUTH[@]}" -X DELETE
echo "[OK] 清理完成"
echo ""
echo "=========================================="
echo "所有冒烟测试通过!"
echo "=========================================="
| 模块 | Controller | 关键测试点 |
|---|---|---|
| automations | AutomationRulesController | CRUD + toggle + trigger + event-types + action-types |
| open-platform | OpenPlatformController | 应用 CRUD + webhook 配置 + 密钥轮换 |
| users | UsersController | 列表 + 详情 |
| mds (模型管理) | ModelGroupsController | 模型组 CRUD + 平台列表 |
| authz | AuthzController | 角色列表 + 权限分配 |
| logs | LogsController | LLM 日志查询 |
| visual-agent | VisualAgentController | 工作区列表 + 会话 |
| defect-agent | DefectAgentController | 模板 CRUD + 缺陷提交 |
完整的链式测试脚本(已验证通过):
#!/bin/bash
set -e
HOST="${SMOKE_TEST_HOST:-http://localhost:5000}"
KEY="${AI_ACCESS_KEY:?请设置环境变量 AI_ACCESS_KEY}"
AUTH=(-H "X-AI-Access-Key: $KEY" -H "X-AI-Impersonate: admin" -H "Content-Type: application/json")
echo "=========================================="
echo "冒烟测试: Automations (自动化规则引擎)"
echo "目标: $HOST"
echo "=========================================="
# 1. 获取事件类型列表
echo ""
echo ">>> [1/7] 获取事件类型列表..."
curl -sf "$HOST/api/automations/event-types" "${AUTH[@]}" | jq '.data.items | length | "事件类型数量: \(.)"'
echo "[OK] 事件类型查询成功"
# 2. 获取动作类型列表
echo ""
echo ">>> [2/7] 获取动作类型列表..."
curl -sf "$HOST/api/automations/action-types" "${AUTH[@]}" | jq '.data.items[] | .type + " - " + .label'
echo "[OK] 动作类型查询成功"
# 3. 创建测试规则
echo ""
echo ">>> [3/7] 创建测试规则..."
RESULT=$(curl -sf "$HOST/api/automations/rules" "${AUTH[@]}" \
-X POST \
-d '{
"name": "smoke-test-规则",
"enabled": true,
"eventType": "test.manual",
"actions": [
{
"type": "webhook",
"webhookUrl": "https://httpbin.org/post",
"webhookSecret": "test-secret"
},
{
"type": "admin_notification",
"notifyLevel": "info"
}
],
"titleTemplate": "冒烟测试: {{title}}",
"contentTemplate": "事件: {{eventType}}, 来源: {{sourceId}}"
}')
RULE_ID=$(echo "$RESULT" | jq -r '.data.id')
echo "[OK] 创建成功, ID: $RULE_ID"
# 4. 查询规则列表
echo ""
echo ">>> [4/7] 查询规则列表..."
curl -sf "$HOST/api/automations/rules?page=1&pageSize=5" "${AUTH[@]}" | jq '.data | "总数: \(.total), 当前页: \(.items | length) 条"'
echo "[OK] 列表查询成功"
# 5. 切换启用/禁用
echo ""
echo ">>> [5/7] 切换规则状态..."
curl -sf "$HOST/api/automations/rules/$RULE_ID/toggle" "${AUTH[@]}" -X POST | jq '.data'
echo "[OK] 状态切换成功"
# 切回启用
curl -sf "$HOST/api/automations/rules/$RULE_ID/toggle" "${AUTH[@]}" -X POST > /dev/null
echo " (已切回启用状态)"
# 6. 手动触发规则
echo ""
echo ">>> [6/7] 手动触发规则..."
curl -sf "$HOST/api/automations/rules/$RULE_ID/trigger" "${AUTH[@]}" \
-X POST \
-d '{
"eventType": "test.manual",
"title": "冒烟测试触发",
"content": "这是一条冒烟测试通知"
}' | jq '.data | "所有动作成功: \(.allSucceeded), 动作数: \(.actionResults | length)"'
echo "[OK] 触发成功"
# 7. 删除测试规则
echo ""
echo ">>> [7/7] 清理测试规则..."
curl -sf "$HOST/api/automations/rules/$RULE_ID" "${AUTH[@]}" -X DELETE
echo "[OK] 清理完成"
echo ""
echo "=========================================="
echo "所有 Automations 冒烟测试通过!"
echo "=========================================="
-sf 标志(静默 + 失败时退出)"${AUTH[@]}" 数组展开认证头-d '{...}' 单引号包裹jq -r '.data.id'jq 格式化关键字段# 创建后提取 ID
ITEM_ID=$(echo "$RESULT" | jq -r '.data.id')
# 后续步骤使用该 ID
curl ... "$HOST/api/module/$ITEM_ID" ...
smoke-test- 前缀set -e 使脚本在任何命令失败时立即停止当用户说 "在线冒烟" / "CDS 冒烟" / "线上验证",或目标是 CDS 预览环境时,采用以下模式。
Step 0: 环境准备
├─ 推导 BRANCH_ID(git branch → slugify)
├─ 确认 CDS 认证(AI_ACCESS_KEY 通用密钥)
├─ 确认分支状态为 running
└─ 读取 MAP_AI_USER 环境变量获取用户名
Step 1: 用户名确认
├─ 优先:读取 $MAP_AI_USER 环境变量(零网络请求)
└─ 兜底:通过 root JWT 登录查询用户列表
Step 2: 分层冒烟测试(优先直连预览域名,失败时才用 container-exec)
├─ Layer 1: 无认证端点(健康检查、版本等)
├─ Layer 2: 认证端点-只读(用户列表、模型列表、会话等)
└─ Layer 3: 认证端点-写入(创建+查询+删除,可选)
优先直连:
AI_ACCESS_KEY是通用密钥,可直接认证 MAP 平台的后端 API。只在 Cloudflare 干扰时才回退到 container-exec。
#!/bin/bash
# CDS 远程冒烟测试 — MAP 直连模式(推荐)
# 预览域名永远走 cdscli,禁止手拼(v1/v2 公式在多项目 CDS 下不可用)。
# SSOT: cds/src/services/preview-slug.ts:computePreviewSlug
PREVIEW_URL=$(python3 .claude/skills/cds/cli/cdscli.py --human preview-url | sed 's:/$::')
IMPERSONATE="${MAP_AI_USER:?请设置环境变量 MAP_AI_USER}"
AUTH=(-H "X-AI-Access-Key: $AI_ACCESS_KEY" -H "X-AI-Impersonate: $IMPERSONATE" -H "Content-Type: application/json")
echo ">>> [1] 健康检查(直连 MAP 平台)..."
curl -sf "$PREVIEW_URL/api/shortcuts/version-check"
echo ">>> [2] 用户列表..."
curl -sf "$PREVIEW_URL/api/users?pageSize=3" "${AUTH[@]}"
# ... 更多端点
仅当预览域名被 Cloudflare 干扰时使用:
#!/bin/bash
# CDS 远程冒烟测试 — container-exec 兜底模式
CDS="https://$CDS_HOST"
BRANCH_ID="claude-xxx-yyy"
cds_exec() {
local cmd="$1"
curl -sf "$CDS/api/branches/$BRANCH_ID/container-exec" \
-H "X-AI-Access-Key: $AI_ACCESS_KEY" -X POST -H "Content-Type: application/json" \
-d "{\"profileId\":\"api\",\"command\":\"$cmd\"}" \
| python3 -c "import sys,json;d=json.load(sys.stdin);print(d['stdout'])" 2>/dev/null
}
# 仅在直连失败时使用
cds_exec "curl -s http://localhost:5000/api/shortcuts/version-check"
| 维度 | 本地模式 | MAP 直连模式(推荐) | container-exec 兜底 |
|---|---|---|---|
| 执行位置 | AI 沙箱直接 curl | AI 沙箱 → 预览域名 | AI 沙箱 → CDS API → 容器内 |
| 网络 | 直连 localhost | 直连预览域名 | 经 CDS proxy → 容器 localhost |
| 认证 | 单层(API key) | 单层(API key 通用) | 双层(CDS key + 容器 key) |
| 用户名 | $MAP_AI_USER | $MAP_AI_USER | 需容器内发现或 $MAP_AI_USER |
| CDN 影响 | 无 | 有(极少数端点) | 无 |
| JSON 转义 | 简单 | 简单 | 复杂(嵌套转义) |
| 适用场景 | 本地开发 | 远程验证首选 | 直连失败时兜底 |
$AI_ACCESS_KEY 读取$MAP_AI_USER 读取,严禁使用 admin 或 rootAI_ACCESS_KEY 是通用密钥,减少 container-exec 使用(嵌套 JSON 转义复杂易出错)