跳到主要内容

19 篇博文 含有标签「AI」

查看所有标签

车辆应用配置(huapp-config)

· 阅读需 2 分钟
Bowen Zhang
本文作者

为指定 VIN 车辆逐条写入应用内部配置(huapp-config):设置应用打开时的首页路由homeRouteName)和截图悬浮按钮showScreenshotFab)开关。 内网接口,无需鉴权,不需要登录 Cookie,可单台或批量调用。

应用不一定都要配 huapp-config —— 只有需要在应用内部做额外设置(首页路由、截图悬浮按钮)的 app 才需要。纯批量加 VIN 到测试分组请用「批量推送」skill。

环境信息

接口https://fuxi-ai-webapp-conversation-01.inner.chj.cloud/api/huapp-config
鉴权无(内网接口)

接口地址可通过环境变量 AMP_HUAPP_CONFIG_URL 覆盖。

默认参数

参数默认值说明
--app-codecom.fuxi.x11mediatest目标应用包名
--home-routeX04cMediaTestDrive_AccelDecelPitch应用打开时的首页路由
截图悬浮按钮showScreenshotFab = true默认开启,--no-fab 关闭

快速开始

# 安装依赖
pip install -r requirements.txt

# 为单台车配置(默认参数)
python scripts/configure.py HLX32B141T1026801

# 指定 app_code、首页路由,并关闭截图悬浮按钮
python scripts/configure.py HLX32B141T1026801 --app-code com.fuxi.x11mediatest --home-route X04cMediaTestDrive_AccelDecelPitch --no-fab

# 批量配置多台
python scripts/configure.py HLX32B141T1026801 HLX34B160T1303448

执行步骤(供 Claude 使用)

  1. 确认参数:VIN(17 位,多台用逗号/空格分隔)、--app-code(默认 com.fuxi.x11mediatest)、--home-route(默认同前)、截图悬浮按钮开关(默认开)
  2. 确认必要性:只有该 app 需要在应用内部做设置时才配置;不了解可询问用户
  3. 运行 python scripts/configure.py <VIN...> [...]
  4. 报告:每台输出 [成功]/[失败] 与汇总「成功 N/总数」;失败项可单独重跑

参数说明

参数必填说明
vins一个或多个 VIN
--app-code应用包名(默认 com.fuxi.x11mediatest
--home-route首页路由名(默认 X04cMediaTestDrive_AccelDecelPitch
--no-fab关闭截图悬浮按钮(默认开启)

故障排查

问题原因解决
单台 [失败]内网接口不可达 / VIN 无效确认在内网环境运行、VIN 为 17 位;可单独重跑该 VIN
返回非 0 code业务异常(参数/app_code 不对)查看失败信息里的 msg,核对包名与参数

批量推送应用到车辆(AMP)

· 阅读需 3 分钟
Bowen Zhang
本文作者

把 VIN 车辆批量添加到 OTA 应用市场运营平台(AMP)的应用测试分组。 纯 Python 实现,不依赖浏览器;接口 + Cookie 鉴权。 车辆应用配置(huapp-config)已拆分为独立 skill「cheyun-amp-huapp-config」:需要配置首页路由/截图悬浮按钮等应用内部设置时用那个 skill,本 skill 只做批量加 VIN。

环境信息

环境接口域名登录页状态
testtwo(开发测试)https://ota-app-market-web.testtwo.k8s.chehejia.comhttps://amp.testtwo.chehejia.com✅ 已接入
prod(生产)https://ota-app-market-web.prod.k8s.chehejia.comhttps://amp.chehejia.com⏳ 接口地址待确认,暂未接入

域名可通过环境变量覆盖:

  • AMP_PUSH_TESTTWO_URL:testtwo 接口域名

testtwo 环境需要登录态。code=240420 表示登录失效。获取 Cookie 方式:

  1. 浏览器登录 https://amp.testtwo.chehejia.com
  2. F12 → Network → 勾选 Fetch/XHR,再按接口域名过滤:ota-app-market-web.testtwo.k8s.chehejia.com;刷新页面或操作一下页面(如触发一次查询)
  3. 复制该请求 Request Headers 里的 Cookie 整串(形如 k1=v1; k2=v2
  4. 通过 --cookie 传入;脚本会保存到 settings.json,下次可省略

Cookie 会过期,报 240420 时重新复制一份即可;可用 --clear-cookie 清除已保存的 cookie。

📖 获取 Cookie 的详细图文步骤见飞书文档:获取AMP登录Cookie操作指南

测试分组解析规则(重要)

--group 参数支持两种写法,脚本自动处理:

用户输入处理方式
数字 id,如 3000742直接作为分组 id 使用
名称/关键字,如 L6试驾调用分页查询接口(/ota/v1/app/market/web/app/test/group/page)按名称模糊匹配
匹配到 1 个自动取该分组
匹配到 多个打印候选列表,提示用户用 --group <数字id> 重新指定(退出码 2)
匹配不到报错,提示先运行 groups --name <关键字> 查看可用分组 id

名称模糊匹配和平台查询的结果一致;拿不准时先运行 groups 子命令确认 id。

快速开始

# 安装依赖
pip install -r requirements.txt

# 按名称查测试分组(返回 id)
python scripts/push.py groups --name L6 --cookie "k1=v1; k2=v2"

# 批量添加 VIN 到测试分组
python scripts/push.py add HLX32B141T1026801 HLX34B160T1303448 --group L6试驾_HU_SS3_台架 --cookie "k1=v1; k2=v2"

# 需要配置车辆应用配置(huapp-config)时,用独立 skill「cheyun-amp-huapp-config」

命令说明

groups:查询测试分组

python scripts/push.py groups [--name <关键字>]
  • 不传 --name 列前 50 条全部分组;传了就按名称模糊匹配
  • 输出包含:id、名称、类型、状态、已关联 VIN 数、说明

add:批量添加 VIN 到测试分组

python scripts/push.py add <VIN> [<VIN> ...] --group <名称或id>

流程:解析分组 → batchAdd(一次性把多个 VIN 加入测试分组)。

需要配置 huapp-config(车辆应用配置,如首页路由、截图悬浮按钮)时,改走独立 skill cheyun-amp-huapp-config,两者分开执行,按需选择。

执行步骤(供 Claude 使用)

  1. 确认参数:拼 VIN(17 位,多台用逗号/空格分隔)、分组(名称或 id)、Cookie(优先已保存的;无则按上文引导获取)
  2. 环境:当前仅 testtwo;如用户明确需要 prod,说明接口地址待确认,暂不可用
  3. 运行:可先 push.py groups --name <关键字> 确认分组 id,再 push.py add ...
  4. 报告:batchAdd 返回 code;多分组歧义时把候选列表展示给用户让其选 id
  5. 按需配置:如果用户还需要配置应用内部设置(首页路由/截图悬浮按钮),再引导用 cheyun-amp-huapp-config skill

参数说明

参数必填说明
vins一个或多个 VIN(add 子命令)
--group测试分组名称或数字 id(add 子命令)
--name分组名称关键字(groups 子命令)
--cookie登录 Cookie,不传则读已保存的
--clear-cookie清除已保存的 cookie 后退出

故障排查

问题原因解决
code 240420Cookie 过期 / 未登录重新登录 https://amp.testtwo.chehejia.com 并复制最新 Cookie
匹配到多个测试分组--group 名称过于模糊按提示用 --group <数字id> 重新指定
未匹配到分组名称不对 / 分组被删先运行 groups --name <关键字> 确认 id
batchAdd 返回业务异常VIN 无效 / 分组状态异常查看返回 msg;确认 VIN 为 17 位、分组已启用
需要配置应用内部设置应是 huapp-config 场景改用独立 skill cheyun-amp-huapp-config

OTA 应用升级数据查询(App Market / AMP)

· 阅读需 3 分钟
Bowen Zhang
本文作者

查询车辆在各应用市场运营平台(AMP)环境下的 OTA 应用升级记录(已安装 / 未安装及版本号)。 纯 Python 实现,不依赖 Playwright 浏览器,通过接口 + 登录 Cookie 鉴权。 应用不写死:VIN 与应用(appid)均由用户输入

环境信息

环境接口域名登录页编号段示例(com.fuxi.x11mediatest)
prod(生产)https://ota-app-market-web.prod.k8s.chehejia.comhttps://amp.chehejia.com1000181
testtwo(开发测试)https://ota-app-market-web.testtwo.k8s.chehejia.comhttps://amp.testtwo.chehejia.com3000170

域名可通过环境变量覆盖(默认使用上表中的值):

  • OTA_QUERY_PROD_URL:prod 接口域名
  • OTA_QUERY_TESTTWO_URL:testtwo 接口域名

两个环境都需要登录态。code=240420 表示登录失效。获取 Cookie 方式:

  1. 浏览器登录对应环境的登录页(prod:https://amp.chehejia.com,testtwo:https://amp.testtwo.chehejia.com
  2. F12 → Network → 勾选 Fetch/XHR,再按接口域名过滤:ota-app-market-web.prod.k8s.chehejia.com(prod)/ ota-app-market-web.testtwo.k8s.chehejia.com(testtwo);刷新页面或操作一下页面(如触发一次查询)
  3. 复制该请求 Request Headers 里的 Cookie 值(形如 k1=v1; k2=v2
  4. 通过 --cookie 传入;脚本会保存到 settings.json,下次可省略

Cookie 会过期,报 240420 时重新复制一份即可;可用 --clear-cookie 清除已保存的 cookie。

📖 获取 Cookie 的详细图文步骤见飞书文档:获取AMP登录Cookie操作指南

appid 转换规则(重要)

queryPage 接口要求平台数字 appId(如 prod 1000181 / testtwo 3000170),不能直接传包名

脚本对用户输入的 --appid 自动处理:

用户输入处理方式
数字,如 1000181 / 3000170直接作为平台 appId 传入
包名,如 com.fuxi.x11mediatest自动调用应用列表枚举接口/ota/v1/app/market/web/common/queryAppList)转为当前环境的数字 appId
中文名子串,如 智能底盘同上,按应用列表模糊匹配
不传查询该车辆全部应用

转换走的目标枚举接口与环境一致:选 --env prod 用 prod 的 app 列表,选 --env testtwo 用 testtwo 的 app 列表。若不匹配会明确报错并提示相近应用。

快速开始

# 安装依赖
pip install -r requirements.txt

# 查询全部应用(prod,需 Cookie)
python scripts/query.py HLX34B160T1303448 --cookie "k1=v1; k2=v2"

# 按包名查某个应用(自动转平台 appId)
python scripts/query.py HLX34B160T1303448 --appid com.fuxi.x11mediatest --cookie "k1=v1; k2=v2"

# 按平台数字 appId 查,并指定 testtwo 环境
python scripts/query.py HLX32B141T1026801 --appid 3000170 --env testtwo --cookie "k1=v1; k2=v2"

# 输出原始 JSON
python scripts/query.py HLX34B160T1303448 --appid com.fuxi.x11mediatest --json

执行步骤(供 Claude 使用)

1. 确认参数

缺什么问什么:

  • VIN:要查询的车辆 VIN(必填)
  • appid:应用。可选。用户直接给包名/中文名/数字均可;不给则查询全部
  • 环境:默认 prod;如需 testtwo 让用户明确指定
  • Cookie:优先用已保存的;失效时引导用户按上文重新复制

2. 检查 Python 环境 & 安装依赖

python --version # 3.10+
pip install -r requirements.txt

3. 运行查询脚本

python scripts/query.py <VIN> [--appid <appid>] [--env <prod|testtwo>] [--cookie "<cookie>"]

4. 向用户报告结果

  • 查到数据:按表展示各行的包名、屏幕、当前/目标版本、升级状态、安装判定、事件时间
  • 未查到:说明该 VIN 在所选环境无该应用升级记录(多数属于未推送/未安装)

返回字段与安装判定

字段说明
code0 成功;240420 登录失效
currentInternalVersion当前版本号(数字),0 表示未装
targetInternalVersion目标版本号
upgradeStatus升级状态码,50 = 升级成功
upgradeStatusName状态文字:升级成功、升级中、下载中、等待升级 等
screenName屏幕位置:中控 / 副驾 / 后排
appPackageName应用包名
eventTime事件时间

已安装判定upgradeStatus == 50currentInternalVersion > 0 → 已安装;否则未完成。

参数说明

参数必填说明
VIN目标车辆 VIN(17 位)
--appid应用:包名 / 中文名 / 平台数字 appId;包名自动转平台 appId;不传查全部
--env环境,prod(默认)或 testtwo
--cookie登录 Cookie,不传则读已保存的
--page-size每页条数(默认 20)
--json输出原始 JSON
--clear-cookie清除已保存的 cookie 后退出

故障排查

问题原因解决
code 240420Cookie 过期 / 未登录重新登录对应环境并复制最新 Cookie
未找到应用 xxx包名/应用名在该环境不存在用应用列表枚举接口确认,或直接用数字 appId
匹配到多个应用输入过于模糊改成完整包名,或直接给平台数字 appId
totalCount: 0该 VIN 无该应用升级记录属于未推送/未安装;可去掉 --appid 查全部

🚀 车云收尾"两件套":切云端环境 + OTA 批量推 App —— 一个编排 Skill 一次串通

· 阅读需 5 分钟
Bowen Zhang
本文作者

一句话摘要: 上一轮我安利过"从 prod 迁车到 testtwo",这次是接续它的编排层 Skill——把「检测 → 添加 → 白名单 → 切换云端环境按车型批量推送 App 到 OTA 测试分组」5 步串成一条线。其中最磨人的两件收尾活:切环境(prod ↔ testtw)和 App OTA 推送,终于不用再跨 AMP / 飞书机器人 / 云端平台人肉一遍。


你是否也被这两件"收尾活"烦着

把车搬进 testtwo、加好白名单,你以为完了——真正磨人的是两个收尾动作

  • 切换云端环境:车得上测试环境联调,结果它云端环境还挂在 prod,联调各种连不上;得去跟飞书机器人「罗伯特」发命令切环境,发完还不知道切没切成,再查一遍;
  • 添加 App 的 OTA 推送:要推了,打开 AMP,按车型挑 OTA 测试分组——组号又长又难记(X04B=3000742、X04C=3000743……),记不住还得回头查,一台一台手点,点错就推到别人的测试环境。

这两件事有规则、纯手工、跨平台,还极其容易错。正适合交给 Claude Code。

所以我把迁移、白名单、切环境、批量推送四个叶子能力串成一个编排 Skill:一句人话触发,5 步一条龙跑完,中间该你拍板的节点自动停下来问你。


一、这个 Skill 是什么:编排层,把 4 个子能力按序串起来

不自造接口,而是站在 4 个已发布的子 Skill 之上,把一条「完整流程」按顺序编排执行:

flow.py plan <VIN...>
├─ Step 1 检测:testtwo 里车是否已存在
├─ Step 2 添加:prod 查原车 → testtwo 建车 + 绑定设备(存在则跳过)
├─ Step 3 白名单:飞书机器人罗伯特加 X01(线上 + 线下)
├─ Step 4 ⚠ 切环境:prod ↔ testtwo(本 Skill 核心新增)
└─ Step 5 ⚠ OTA 推送:选机型测试分组,批量推 App(本 Skill 核心新增)
步骤动作子 Skill入口
1~2检测 / 添加车辆cheyun-vehicle-sync-prod-to-testtwosync.py
3X01 白名单(线上+线下)cheyun-lark-robert-whitelist-envsend.py whitelist
4切换云端环境同上send.py switch-env / query-env
5批量推送 App 到 OTA 分组cheyun-amp-batch-push-apppush.py add / groups

一整条流程 = flow.py 编排 + 4 个子 Skill。只装主 Skill 不装叶子,flow.py list 会显示「缺」,流程跑不了。


二、两件"新增"到底省了什么

场景 A:切换云端环境(Step 4)

以前(约 5~10 分钟,跨两个界面): 找到车 → 判断它目前在 prod 还是 testtwo → 去飞书给机器人罗工发「切环境」命令 → 等回 → 切完再回云端平台查一次确认「现在到底在哪」→ 不在预期里再回头切一遍。

现在: 一行命令(或一句话)就切,切完回读确认在哪个环境:

python send.py switch-env <VIN> prod testtwo # 从 prod 切到 testtwo
python send.py query-env <VIN> # 随时查当前在哪个环境

一句话:「切环境」从『发命令 + 手工回查』变成『一条命令 + 自动确认』。

为什么这个判断点必须先问你: 车可能处于离线。车不在线的时候切换没有意义——是否切由你根据车辆状态拍板,Skill 不做主。

场景 B:批量推送 App 到 OTA 测试分组(Step 5)

以前(一台车 8~15 分钟): 打开 AMP → 输入 VIN → 找到该车型对应的测试分组号(组号要在各分组里翻,因为 X04B=3000742、X04C=3000743 这种编码要死记)→ 把 App 推进分组 → 重复 N 台。

现在:

push.py add VIN1 VIN2 VIN3 --group 3000742 # 多辆车一次批量推
push.py groups --name X04B # 记不住组号?按关键字搜

一句话:「批量推送」从『反复挑组 + 手打组号』变成『一次点名、按机型分组一把推进去』。


三、两个"判断点":它知道什么时候该闭嘴

把流程做成「一门到底」最大的顾虑是自动过头。所以切环境和推送两队都设成了询问点——只问你不自动跑

  • Step 4 为什么问? 车不在线的时候切了等于白切,车辆在不在只有你掌握实况。
  • Step 5 为什么问? 推送是额外操作,推错会误伤测试环境其他同学,必须你确认。

一句话:AI 把能自动的自动掉,把该由你拍板的还给你——这正是它敢『一条龙』的底气。


四、怎么装上、怎么用起来

安装(一条命令串,4 个一起装)

/plugin marketplace add https://gitlab.chehejia.com/ai-market/lixiang-skills-marketplace.git
/plugin marketplace update lixiang-skills-marketplace

/plugin install cheyun-vehicle-migrate-prod-to-testtwo-push
/plugin install cheyun-vehicle-sync-prod-to-testtwo
/plugin install cheyun-lark-robert-whitelist-env
/plugin install cheyun-amp-batch-push-app

/reload-plugins

或到 AI Market 详情页复制安装命令发给 ClaudeCode 机器人即可。

运行所需凭据:

凭据用在怎么拿
x-chj-gwtokenStep 1~2 查/同步 prodlicar.chehejia.com 的 F12 → Network
lark-cli + 进飞书群Step 3~4 白名单/切环境先进罗伯特所在飞书群,再 lark-cli auth login
AMP CookieStep 5 批量推送testtwo 登录浏览器 Copy 最新 Cookie

用法:一句话 / 命令

需求这么说
先看整条流程与命令(推荐先跑)flow.py plan <VIN...>
看某一步怎么执行flow.py step <4/5> <VIN...>
检查子 Skill 是否就位flow.py list
直接开跑「把这辆车迁到 testtwo,切环境,再推到测试分组」或 flow.py run <VIN...>

五、提示与避坑

问题信号解法
子 Skill 没装齐flow.py list 显示「缺」补装完整 4 个插件,再 /reload-plugins
x-chj-gwtoken迁移报 401/403重新从 licar F12 复制一份
白名单发不出去找不到群聊/发送失败先进罗伯特所在飞书群,再登录
推送报错code 240420AMP Cookie 过期,重登 testtwo 替换

别背组号:push.py groups --name <关键字> 帮你搜,X04B=3000742、X04C=3000743 这种事让它记。


适合谁 / 不适合谁

🎯 推荐:

  • 天天在 prod ↔ testtwo 之间切云端环境的测试同学
  • 要给一批车做 OTA 推送、还要按车型分组的
  • 想省"切环境回查 + 背组号"这种纯枯燥操作的人

⚠️ 谨慎:

  • 对云端环境 / OTA 分组关系还不太熟的——先跑 flow.py plan 看清单
  • 对"自动推送"还没把握——Step 5 有刹车点,先手动跑几回确认

下一步规划

  • 📅 支持 VIN 列表文件:CSV 批量 100 台,统一汇总报告
  • 📅 流程日志落盘:每步可回溯,排查不用重跑
  • 📅 凭证改走环境变量:token/cookie 集中管理,不散在命令里

结语

「切环境 + OTA 批量推送」这两件收尾活,是我在车云测试里最想交出去的两件事。 它们不是难,是碎、是重复、是不小心就错。把规则的部分交给编排,把判断的部分留给自己,这台车云测试的日常才算真的顺了下来。

装好之后,在 Claude / LiClaw 里说一句就行:

「把这台车迁到 testtwo,切个环境,再推到 X04B 测试分组」

🚗 完整编排 Skill:https://ai-market.chehejia.com/?page=skills&skill=ckqpipedmzv0phihh4el


Skill 质量检查(skill-quality-check)

· 阅读需 3 分钟
Bowen Zhang
本文作者

检查 skill 目录是否符合上传应用市场的质量标准,兼容输出接近内部评估接口的预检信息(SKILL.md 质量 / 脚本静态分析 / 模拟运行 / 一致性 / 兼容性 / skill 类型 / 沙箱可执行性 / Token 估算 / 安全发现)。 本检查器将 __pycache__ 编译缓存目录及其中的编译产物文件如实判为垃圾文件,不再排除。

检查维度(对齐正式报告)

维度检查内容
SKILL.md 质量目录/SKILL.md 存在、frontmatter 键与 YAML、name(长度/kebab-case/与目录名一致)、description(存在/≤1024/50-500/触发词数量)、正文行数、脚本布局、无不当目录、scripts/ 内容合规、assets/ 内容合规、垃圾/临时文件、根目录非标准文件、路径风格(正斜杠)、引用文件是否存在、引用嵌套深度、目录结构总评
脚本静态分析scripts/ 下每个 .py 脚本:语法正确;存在外部调用(requests/subprocess 等)时必须设置 timeout
模拟运行实际执行每个脚本:--help 正常退出(退出码 0、无堆栈);传入非法参数时优雅报错(退出码非 0、无 Traceback、有错误提示)
一致性代码中的环境变量均在 SKILL.md 文档中提及;requirements.txt 必须存在;所有第三方 import 均在 requirements.txt 中声明
兼容性Python 3.10+ 运行时、Claude Code/OpenClaw 兼容性预检
内部接口预检--json 输出 company_compatible,包括 skill 类型、外部依赖、沙箱可执行性、Token 估算、依赖/环境变量一致性和安全发现

快速开始

# 全量扫描 skills 项目根目录下所有 skill
python scripts/checker.py

# 指定一个或多个 skill 目录逐个检查
python scripts/checker.py cheyun-vehicle-cloud-online-status
python scripts/checker.py ../foo-skill ../bar-skill

# 覆盖扫描根目录、关闭模拟运行、JSON 输出
python scripts/checker.py --root D:/path/to/skills --no-run
python scripts/checker.py --json

--json 输出中的 company_compatible 是本地静态预检,不会访问公司服务端,也不能替代最终上传检测;它的字段和严重级别尽量贴近 AI Market 返回结构。

参数说明

参数说明
dirs要检查的 skill 目录(位置参数,可多个);缺省扫描根目录下所有含 SKILL.md 的目录
--root <dir>覆盖扫描根目录(默认 D:\bowen\project\skills
--no-run关闭「模拟运行」,只做静态检查(零副作用)
--json输出 JSON 结果(供自动化脚本使用)

执行步骤(供 Claude 使用)

1. 确认参数

  • 目标:检查某个具体 skill,还是全量扫描?缺省即全量扫描。
  • 是否要模拟运行:默认开启;若用户担心副作用或目标目录含会真实发送消息/调接口的脚本,可加 --no-run

2. 运行检查器

python scripts/checker.py [skill_dir...] [--no-run]

3. 解读报告

  • 每个 skill 一行 [目录名] 整体得分 xx | 全部通过 / 有 N 项未通过,各维度给出分类得分。
  • [PASS] 通过;[LOW ] 次要问题(如触发词缺失、assets 混入非资源文件);[MED ] 中等问题(如垃圾文件、语法错误、缺超时、依赖未声明)。
  • 有未通过项时,把对应项的 明细 逐条反馈给用户并给出修复建议。

4. 常见修复

问题修复
垃圾/临时文件(明细含 __pycache__ 缓存目录)删除该缓存目录后复查(运行脚本后必现,上传前再清一次;用 rm -rf 删除即可)
scripts/ 内容合规(存在非脚本文件)把模板等移入 scripts/ 下专用的模板子目录,其余非 .py 文件移出 scripts/
description 长度不足 50补充触发词与能力描述,扩展 description
触发词数量检查: 0 个在 description 末尾加 当用户提到"xxx"时触发(引号内为触发词)
存在外部调用但未设置超时给 requests/subprocess 调用补 timeout= 参数
未声明的依赖: xxx在 requirements.txt 补一行 xxx==版本(纯标准库则写 # Pure standard library…
出现堆栈跟踪脚本顶层需 if __name__ == "__main__": 包裹 try/except Exception 优雅退出
引用文件是否存在(正文引用了磁盘上不存在的路径)把正文中反引号内的路径改成真实存在的相对路径,或用描述性措辞,不要写成本就不存在的路径字符串(如示例、通配符、占位目录)

故障排查

问题原因解决
未在 … 下找到含 SKILL.md 的 skill 目录扫描根目录下没有带 SKILL.md 的目录传入 dirs 指定目标,或用 --root 指定正确根目录
模拟运行报错/超时目标脚本依赖特定环境或交互输入--no-run 跳过模拟运行
结果中 __pycache__ 反复出现每次运行脚本都会生成编译缓存上传前删除 scripts/ 下的 __pycache__ 目录,并注意本检查器运行后自身也会生成缓存
Python 3.10 以下依赖 list[str] 等新语法升级到 Python 3.10+

车云:通过群机器人「罗伯特」添加白名单 / 切换环境

· 阅读需 3 分钟
Bowen Zhang
本文作者

通过飞书群聊 @机器人「罗伯特」,发送线上/线下白名单添加切换/查询车辆云端环境等指令。 使用 lark-cli 以用户身份发送,罗伯特才会响应。

环境准备

前置:必须先加入「罗伯特」所在飞书群

使用本 skill 前,必须先进张博文邀请的飞书群,否则无法向群里 @机器人「罗伯特」发消息。

张博文 邀请你加入飞书群,快点击 https://applink.feishu.cn/client/chat/chatter/add_by_link?link_token=f61m352d-9482-44f8-9380-70c632fb8b66 加入吧!

  • 若发送时提示无权限 / 找不到群聊(尚未进群),请先通过上方邀请链接加入飞书群,加入成功后再重试;
  • 若不确定是否已进群,可在飞书客户端搜索群名确认。

本地如果没有 lark-cli,先按文档安装:

lark-cli 安装指南

安装后在终端执行 lark-cli --version 确认可用。首次使用或 token 过期时,先执行 lark-cli auth login 重新授权。

命令一览

# 添加白名单(默认线上 + 线下都发送,间隔 1.5s)
python scripts/send.py whitelist <VIN>

# 只添加线上白名单
python scripts/send.py whitelist <VIN> --type online

# 只添加线下白名单
python scripts/send.py whitelist <VIN> --type offline

# 切换车辆云端环境(prod -> testtwo)
python scripts/send.py switch-env <VIN> prod testtwo

# 切换车辆云端环境(testtwo -> prod)
python scripts/send.py switch-env <VIN> testtwo prod

# 查询车辆云端环境
python scripts/send.py query-env <VIN>

# 不真正发送,只打印将生成的命令(用于核对)
python scripts/send.py whitelist <VIN> --dry-run

底层本质

以上命令最终执行的是 lark-cli 发送一条群消息,等价于:

lark-cli im +messages-send --as user --chat-id oc_826d073ba8c9bf029ad38bef60253e9c \
--text '<at user_id="ou_f18b74520bac526a0242f42b615153be">罗伯特</at> 添加线上X01白名单 <VIN>'
部分说明
--as user以当前登录的用户身份发送(必须加,否则以机器人身份发送,罗伯特不会响应)
--chat-id oc_826d073ba8c9bf029ad38bef60253e9c目标群聊 ID(罗伯特所在的群)
<at user_id="ou_f18b74520bac526a0242f42b615153be">罗伯特</at>在群里 @罗伯特
消息内容添加线上/线下X01白名单 + 空格 + VIN;切换车辆云端环境 <VIN> <当前> <目标>查询车辆云端环境 <VIN>

执行步骤(供 Claude 使用)

1. 确认参数

先问用户以下信息,缺什么问什么:

  • 操作类型:添加白名单 / 切换环境 / 查询环境
  • VIN:目标车辆 VIN(必填)
  • 添加白名单需确认是线上、线下还是都要(默认两条都发)
  • 切换环境需确认当前环境 → 目标环境(prod / testtwo)

2. 检查 lark-cli

lark-cli --version

如果未安装,引导用户按上面文档安装;如果报 token/auth 相关错误,先 lark-cli auth login

3. 发送指令

# 白名单(默认线上+线下)
python scripts/send.py whitelist <VIN>

# 切换环境
python scripts/send.py switch-env <VIN> <当前环境> <目标环境>

# 查询环境
python scripts/send.py query-env <VIN>

不确定时先加 --dry-run 核对要发送的内容,确认无误后再去掉发送。

4. 向用户报告结果

  • 发送成功:告知已发送的操作与 VIN,白名单说明线上/线下均已添加,切换/查询说明请求已投递。
  • 发送失败:展示错误信息;token 相关错误引导执行 lark-cli auth login

注意事项(务必遵守)

  • 必须使用 --as user 以用户身份发送,否则罗伯特不会响应机器人消息。
  • 由于飞书平台限制,不能跨 app 给第三方 bot 发 P2P 私聊,必须通过群聊 @ 的方式。
  • 无论什么车型,都按 X01 发送(罗伯特只识别 X01 格式)。
  • 线上和线下白名单都要添加,不能漏掉任何一个;脚本默认分两条发送,间隔 1.5s。
  • VIN 不要加引号
  • 不要在 <at> 标签中的 @ 前加反斜杠:错误写法 <at>...</at> \罗伯特</at> 会导致无法正常 @ 用户。
  • 当前 lark-cli 登录应用为 cli_aaa26a27d8b91bc2,罗伯特属于另一应用 cli_9f7979022e3d500e

故障排查

问题原因解决
发送报「无权限」/「找不到群聊」/「不是群成员」尚未加入目标飞书群提示用户先通过张博文的邀请链接加入飞书群(见「环境准备」),加入后重试
lark-cli 执行失败 / token 相关token 过期 / 未登录执行 lark-cli auth login 重新授权

参数说明

子命令必填参数说明
whitelistVIN添加 X01 白名单;--type online/offline 只发一条
switch-envVIN from to切换云端环境;from 当前环境,to 目标环境
query-envVIN查询车辆云端环境
通用---dry-run 只打印命令不发送

车云车辆云端环境·在线状态查询

· 阅读需 2 分钟
Bowen Zhang
本文作者

📖 不知道怎么获取 x-chj-gwtoken?看这里! 👉 飞书文档 - 获取 x-chj-gwtoken 操作指南(含截图步骤)

查询车辆在云端(testtwo / prod)各域控模块的在线状态策略:先查 testtwo(无需鉴权),若无数据再兜底查 prod(需 x-chj-gwtoken)。

环境信息

环境域名鉴权
testtwo(开发测试)https://ssp-licar-platform-service.testtwo.k8s.chehejia.com无需鉴权
prod(生产)https://ssp-licar-platform-service.prod.k8s.chehejia.com需要 x-chj-gwtoken

域名可通过环境变量覆盖(默认使用上表中的值):

  • VEHICLE_QUERY_TESTTWO_URL:testtwo 环境域名
  • VEHICLE_QUERY_PROD_URL:prod 环境域名

接口说明

GET /api/icn-veh-domains-all?vin={VIN}

返回车辆的 Domain 域控环境配置信息,每个域控模块(5G、fsd-a、hu-f、xcu 等)包含:

  • isConnected:连接状态
  • ip:连接 IP
  • env:所在环境
  • cell:cell
  • latest:最近在线时间(毫秒时间戳)
  • leaveTime:离线时间(如有)

车辆无云端数据时,接口返回 {}(空对象)。

快速开始

# 安装依赖
pip install -r requirements.txt

# 查询(自动:先查 testtwo,无数据再查 prod)
python scripts/query.py <VIN>

# 指定 token 查询 prod(也可在提示时粘贴,会保存供下次使用)
python scripts/query.py <VIN> --token "your-x-chj-gwtoken"

# 只查 testtwo,不兜底查 prod
python scripts/query.py <VIN> --no-fallback

获取 x-chj-gwtoken

不知道怎么获取 x-chj-gwtoken?查看飞书文档 👉 获取 x-chj-gwtoken 操作指南(含截图)

x-chj-gwtoken 有过期时间,如果 prod 查询报 401/403,重新获取一次即可。

执行步骤(供 Claude 使用)

1. 确认参数

先问用户以下信息,缺什么问什么:

  • VIN:要查询的车辆 VIN(必填)

如果用户只给了 VIN,直接进入下一步;token 仅在 testtwo 无数据、需要兜底查 prod 时才需要。

2. 检查 Python 环境

python --version

确认 Python 3.10+ 可用。

3. 安装依赖

pip install -r requirements.txt

4. 运行查询脚本

python scripts/query.py <VIN>
  • 若 testtwo 查到数据:直接展示各域控模块状态,结束。
  • 若 testtwo 无数据:脚本会提示输入 x-chj-gwtoken(或可提前用 --token 传入),再查询 prod。

5. 向用户报告结果

  • 查到数据:列出各域控模块的连接状态、IP、环境、最近在线时间。
  • 未查到:说明 testtwo、prod 均无该车辆的 Domain 数据,可能是车辆未接入云端或 VIN 有误。

参数说明

参数必填说明
VIN目标车辆 VIN(位置参数,17 位)
--tokenx-chj-gwtoken,不传则 testtwo 无数据时交互式输入
--no-fallback只查 testtwo,testtwo 无数据时不查 prod

故障排查

问题原因解决
401 Unauthorizedx-chj-gwtoken 过期重新获取 x-chj-gwtoken
vin 码格式异常VIN 不是 17 位确认 VIN 是否正确
testtwo 与 prod 均无数据车辆未接入云端或 VIN 有误确认 VIN,或到 licar 平台确认车辆状态

🎯 Everything Claude Code(ECC)上手分享:给 Claude Code 装上「AI 操作系统」

· 阅读需 5 分钟
Bowen Zhang
本文作者

一个痛点开场

用 AI 干活干多了,我发现最扎心的不是"它写不出来",而是这三件事:

一是配置天天重来。Claude Code 换了新会话就不认识你;CLAUDE.md、agents、hooks、rules 每个项目都要重新搭一遍,搭完上个项目的经验又带不过来。

二是干完没人把关。让 AI 并行拉起来跑得挺热闹,但「看起来都对」和「真的对」之间差一道独立检核。好几次交付物差点带病出门,就是少了这一道。

三是没有章法。想让 AI 先规划再动手、提交前自查、测试写规范……说一次管一次,换个说法它又忘了。

所以我就在想:能不能把「并行干活、常驻记忆、质量把关、越用越懂我、干活有章法」这几件事,打包成一个开箱即用的东西,不用每次重新解释?

ECC(Everything Claude Code)就是这么长出来的。

一句话说清它是什么

ECC 是一套「AI 编程工具的配置全家桶」——把 67 个专业子智能体、281 个技能、94 个命令、一套工程规约和安全审计,封装成插件,装进 Claude Code 就能直接用。

它不是针对某个功能的增强,而是把 Claude Code 从"一个能写代码的对话窗口",升级成一支配置好的 AI 团队

数据卡片(截至 2026-08,均可复现验证):

维度数值说明
交付规模67 代理 / 281 技能 / 94 命令装完即得,不用自己造
社区规模≈23.8 万 star / 3.6 万 forkGitHub 热榜级开源项目
打磨时长10+ 个月高强日常使用作者真实产品开发里迭代出来
安全审计1282 项测试 / 98% 覆盖 / 102 条规则AgentShield,黑客松产物
语言覆盖12+ 种语言文档含简体中文 README
授权MIT自由使用、可改
背书Anthropic 黑客松获胜者作者团队实战验证

一句话:它解决的不是『AI 写不写得快』,而是『AI 写得稳不稳、有没有人把关、还记不记得你是谁』。

我亲测下来,它到底好在哪

1. 开箱就是一支「AI 团队」🎯

不用自己写 planner、code-reviewer、tdd-guide——这些它都配好了:写大功能 /ecc:plan,改完 /ecc:code-review,构建挂了有 build-error-resolver,C++/Go/Rust 各有专属 reviewer。

一句话:67 个 agent,就是一支现成的、各司其职的「虚拟团队」。

2. 281 个技能 = 各技术栈的最佳实践直接抄

frontend-patternsbackend-patternspython-patternsgolang-patterns……让 AI 输出的不是"能跑",而是符合该语言惯用法的代码tdd-workflow 把"先写测试"变成每次都会执行的流程。

一句话:想少踩坑,就先装一套别人踩完坑沉淀出来的 patterns。

3. 一套规约,让 AI 干活「有章法」

rules/ 里是必须遵守的硬约束:代码风格、git 规范、80% 覆盖率、提交前安全自查。装完之后,不管开哪个项目,AI 都默认按这套标准干活。

一句话:等于把团队的工程纪律,也"配置化"了。

4. 跨会话记忆 + 持续学习:AI 终于记得我

hooks 自动在会话开始加载上下文、会话结束存状态;/instinct-status 能看 AI 学到了我哪些习惯,/evolve 把相关习惯聚合成技能。用久了是真的"越用越懂我"。

一句话:新会话里它不再是个陌生人。

5. AgentShield:给 AI 配置上个「安全锁」🤔

扫描 CLAUDE.md / settings.json / MCP / hooks,查密钥泄露、注入风险、权限过宽。一句话命令就能跑:

npx ecc-agentshield scan

一句话:把 AI 接进生产之前,先让它自己给自己体检一遍。

6. 不止 Claude Code:一套配置,多端通用

Claude Code / Codex / Cursor / OpenCode / Gemini 都能用——skills 和 rules 的资产可以带走,不被某个工具绑定。

怎么装上就用(完整教程)

前置条件

  • Claude Code v2.1.0+(ECC 依赖新版插件钩子机制,太老会踩坑)
claude --version

方式一:插件安装(推荐,2 分钟)

/plugin marketplace add https://github.com/affaan-m/ECC
/plugin install ecc@ecc

⚠️ 早期文档见过 everything-claude-code@everything-claude-code 这种旧标识符,现在统一成 ecc@ecc,以仓库最新 README 为准。

方式二:手动安装(想完全掌握装哪些)

git clone https://github.com/affaan-m/ECC.git && cd ECC
npm install

# ⚠️ 关键一步:rules 不随插件分发,必须手动复制,否则「规约不生效」
mkdir -p ~/.claude/rules
cp -R rules/common ~/.claude/rules/
cp -R rules/typescript ~/.claude/rules/ # 按技术栈追加 python/golang 等

常用命令速查

命令作用
/ecc:plan "需求"实现前先规划拆解
/ecc:code-review代码质量 + 安全检查
/ecc:build-fix一键修构建错误
/security-scanAgentShield 审计配置安全
/skill-create从当前仓库 git 历史生成自己的技能
/instinct-status / /evolve看 AI 学会了什么 / 聚合成技能
/sessions管理会话历史

三个容易踩的坑

  1. 别叠加安装:已用 /plugin install 就不要再跑 install.sh --profile fullnpx ecc-install,会技能重复。
  2. MCP 别一下开太多:工具开关太多会挤爆上下文窗口,每个项目实际启用 < 10 个。
  3. multi- 命令需额外装运行时*:/multi-plan 这类要 npx ccg-workflow 初始化才可用。

适合谁 / 不适合谁

🎯 推荐给:

  • 重度 Claude Code 用户——少写重复配置、让 AI 干活更规范
  • 多语言 / 多项目开发——一套 skills/rules 通用所有技术栈
  • 想把"写代码"外包给 AI、但还想保留工程判断力的人——规划 / 评审 / 安全这些"人的活",它帮你兜底

⚠️ 要谨慎的:

  • Claude Code 新手:67 个 agent + 281 个技能信息量巨大,建议先只装 rules + 几个常用 skill
  • 不喜欢被规约束缚的人:它会"管教"AI 的行为,自由发挥型会觉得被唠叨
  • 只想改一行代码就收工的人:完整规划流程有额外开销

看完立即做(10 分钟落地清单)✅

  1. claude --version 确认 ≥ v2.1.0
  2. /plugin marketplace add https://github.com/affaan-m/ECC + /plugin install ecc@ecc
  3. 手动补 rules(git clone + cp rules/commonrules/typescript~/.claude/rules/
  4. npx ecc-agentshield scan 给现有配置体检一遍
  5. 随手试一下 /ecc:plan "给当前项目加个用户认证"

🚀 装上之后你会发现:AI 干活的方式,从"你要什么我给什么",变成了"我按工程标准帮你把关、把成果交给你验收"。


参考资料:

  • GitHub 仓库:affaan-m/ECC | 官网:ecc.tools
  • 作者 @affaanmustafa 的官方精简指南 / 长文指南 / 安全指南
  • 许可:MIT,可直接用、可改造,记得给个 star

本文为个人亲测分享,所有数字均可到仓库 README 复现验证。


提报人:张博文

在车云平台干测试,这两件"顺手活"最磨人——现在我让一句话把它接走了

· 阅读需 4 分钟
Bowen Zhang
本文作者

一句话摘要: 给 testtwo 测试环境加一辆车、排查某辆车今天有没有连上云端——这两件在车云平台上高频又繁琐的"手工活",被我做成了两个 Claude Code Skill。现在只要跟 Claude 说一句人话,它自己跑去 prod 把车搬过来建好、自己去翻各域控的在线状态。本文是实战记录,也顺带把这两个 Skill 安利给同样在干这件事的同事。


你是否也会被这两件事卡住?

  • 测试环境缺一辆车,得从 prod(licar)把它的基础信息、拓扑、HU 配置字、设备、展示信息一个个查出来、再一个个建回去,一不留神漏一项,等到联调才发现。
  • 有人问"这辆车怎么不在线上?"你第一反应是"它在哪个环境?域控连上没?"——然后得去好几个平台翻接口,把 5G、HU、座舱这些模块挨个对状态。
  • 这些活有规则、重复、纯属"会,但很浪费时间",还特别容易因为手抖出错。

这两个 Skill 就是这么长出来的:把有规则但容易出错的车云操作,变成一句话就能触发的能力。


一、两个 Skill 各管什么

Skill一句话典型场景
cheyun-vehicle-sync-prod-to-testtwo从 prod(licar)把车一键迁移到 testtwo 测试环境测试环境加车、环境间数据同步、测试用车准备
cheyun-vehicle-cloud-online-status查车辆在云端的各域控模块在线状态排查"车不在线"、确认车辆在哪个环境、域控是否掉线

两个都发布于我们内部的 AI Market,质量评级 A,均已通过安全认证,创建者:张博文。

按场景触发一句话,例如: 「把车 XX 同步到 testtwo」 / 「查一下这辆车在线吗」


二、场景拆解:从"半小时手工活"到"一句话"

场景 A:给 testtwo 测试环境加车

以前:先拿 VIN 去 prod 查车辆基础信息(车型系列、型号、用途)→ 再查配置字 → 再查设备(SN、ICCID)→ 然后到 testtwo 依次建基础信息、同步拓扑、创建 HU 配置字、绑定设备、更新展示信息。中间任何一个接口断了、字段记岔了,就得从头对。

现在python scripts/sync.py <VIN>,或者在 Claude/LiClaw 里说一句"把这两辆车同步到 testtwo 测试环境"。Skill 自己完成 8 步全流程:基础信息 → 拓扑 → HU 功能配置字 → 设备绑定 → 展示信息更新 → 验证结果,最后给你一份迁移摘要。

场景 B:查某辆车今天在不在线上

以前:问"车在哪个环境"——测试环境和生产环境是两套平台,得先猜一个去翻,找不到再换另一个。确认了环境还要挨个看 5G 模块、HU、ADAS 这些域控到底连没连上、有没有掉线时间。

现在python scripts/query.py <VIN>,或者直接问"查下这几辆车的在线状态"。Skill 的策略是 先查 testtwo(免鉴权)→ 没有再兜底查 prod,一次返回每个域控模块(5G、fsd-a、hu-f、xcu 等)的连接状态、IP、所在环境、最近在线时间,一眼定位问题出在哪个域控、哪个环境。


三、它们是怎么干活的

两个 Skill 本质是轻量 Python 脚本 + Claude 编排,核心都是一条原则:优先走接口,能免鉴权就免鉴权。

  • sync(prod → testtwo):只有 prod 读取需要 x-chj-gwtokentesttwo 写入侧根本不需要鉴权。流程是"先查原车 → 再逐项还原创建",最终落脚在纯接口操作,不依赖浏览器点击。
  • online-status(在线状态):默认 GET /api/icn-veh-domains-all?vin={VIN},先查免鉴权的 testtwo,接口返回空({})才降级去 prod,避免为了看个状态还要先找 token。想只查测试环境、不落生产,加一个 --no-fallback 即可。

设计取舍:免鉴权优先。日常 80% 的排查其实在 testtwo 就能拿到答案;只有确需生产数据时才要求 token,且 token 由你本地提供、不写入任何仓库。


四、怎么装上,怎么用起来

安装(三步)

  1. 打开 AI Market 里的 Skill 详情页;
  2. 点右上角 复制安装命令
  3. 通过飞书发给 OpenClaw / ClaudeCode 机器人,等它装完即可。

也可以直接在详情页 一键安装进 LiClaw,或 下载 Skill 本地放入 ~/.claude/skills

环境要求:Python 3.10+,pip install requests 一个依赖,其余零外部服务。

使用(说人话就行)

需求可以这么说
测试环境加车 / 环境间搬数据"迁移车辆"、"把车从 prod 同步到 testtwo"、"测试环境加车"
排查在线状态 / 定位环境"查询车辆在线状态"、"查车在哪个环境"、"查下这辆车的域控在线情况"

五、提示与避坑

  • x-chj-gwtoken 有过期时间:迁移过程中报 401/403,多半是它到期了,重新获取一份即可(获取方式见 Skill 文档页的飞书指引)。
  • 先测 testtwo 再谈 prod:Online-status 默认先查 testtwo,能省掉大部门鉴权和找 token 的流程。
  • 验证要闭环:sync 每步都做结果确认,最后回读一把,确认车辆在 testtwo 真的"建起来了"而不是接口"假装成功"。
  • 它是工具不是魔法:Skill 负责按规则把活干完,但"这台车该不该上测试环境""这个域控掉线是不是符合预期"仍然要人拍板——AI 省掉的是搬砖,不是判断。

六、下一步还能怎么演进

  • 批量:sync 现在是单 VIN,改成读一个 VIN 列表文件、批量迁移 + 汇总报告;
  • 看板化:online-status 顺手产出一张"哪些车在线/离线"的小结表,适合每次例会前刷一遍;
  • 权限收敛:token 支持从环境变量读取,集中管理,避免散落。

结语

做这两个 Skill 的最大体会是:把有规则、重复、容易错的车云操作交给 Claude,人只留判断。 环境加车、在线排查这类活,不该每天靠人肉去磨。

如果你也常跟 testtwo / prod / 车辆数据打交道,欢迎装上试试:

  • 🚗 车辆迁移(prod → testtwo):https://ai-market.chehejia.com/?page=skills&skill=8hqeaasmwadzjadjk5ti
  • 📡 云端在线状态查询:https://ai-market.chehejia.com/?page=skills&skill=vlddgr6bn7iih5x6uz7d

有新的车云场景想工具化,或者用起来有报错,欢迎在评论区或话题群里聊聊。