qomicex CLI 工具参考
qomicex 是 Qomicex 插件生态的命令行工具,覆盖插件开发全流程:create / dev / pack / verify / lint / bump / publish,并附带 login / logout(登录会话管理)、doctor(环境诊断)、debug(启动器 CDP 调试)。
- 零运行时依赖(Node ≥ 20,仅用内置
node:fs/node:zlib/ WebCrypto) - 包:
@qomicex/cli(源码在packages/qomicex-cli/)
安装
全局参数
环境变量
命令总览
create
manifest.json / package.json / Cargo.toml / src/lib.rs 中的 id。四种模板:
- react 模板权限最小集:
config:read/ui:toast/network:cors_proxy;html 模板为config:read/ui:toast;lib 模板permissions:["config:write"];wasm 模板permissions:["wasm:execute"] - lib 模板无
contributes.menuItems(不创建侧边栏),参照 MarkdownLibrary - wasm 模板参照 WASM 插件(L3),
src/lib.rs导入qomicexhost 模块、导出on_load/on_unload/get_manifest - 生成后提示
pnpm install(wasm 为rustup target add wasm32-unknown-unknown)
pack/verify/lint/publish对四种模板均适用:有package.json时pnpm run build,有Cargo.toml时cargo build,纯静态项目(两者皆无)自动跳过构建直接打包。L3 wasm 插件 verify 跳过 JS 权限扫描(wasm:execute由网关消费)。
dev
- 仓库内(harness 模式):插件位于仓库
plugins-dev/{id}时,自动检测并启动scripts/harness/run.mjs—— Playwright 起 Vite(:1420) + 注入 Tauri mock + stub mock server(:5100) + 源码变更热重载(重建后整页 reload)。此模式--port不生效(harness 固定端口),Ctrl+C退出时一并清理 stub/Vite。详见 调试与热重载。 - 仓库外(裸 Vite):未检测到 harness 时回退为起 Vite dev server + 在项目根写
.qomicex-dev.json(dev 源插件配置:插件 id → localhost URL 映射),供手动注册 dev 源使用。
pack
.qplugin = zip,manifest.json 在根 + dist/**(或 plugin.wasm)。构建自动检测:项目有 package.json 且含 scripts.build 时走 pnpm run build(react/html/lib);有 Cargo.toml 时走 scripts/build.sh / build.ps1(wasm);两者皆无则跳过(纯静态项目)。无 dist/ 时回退收集 manifest 引用的根文件与 plugin.wasm。entry.theme / contributes.overlay.file 若引用 dist/ 下文件但源码在根目录,会自动拷入。
实例(日常迭代出包):
verify
- manifest 合法性:id(反向域名/安全字符)、name、version(semver)、minLauncherVersion、layers、permissions、entry、contributes
- 权限最小化:对比
manifest.permissions与源码实际调用的桥方法(METHOD_PERMISSIONS表)。声明未用 / 用了未声明都会报错 - 图标名校验:源码里的
fa-solid fa-*/fa-brands fa-*字面量与 manifest 的icon字段,对照启动器内置图标表;表外类名报 error(这类图标在 UI 里渲染为空,且此前是静默的),并给出相近的内置图标建议。插件自带contributes.iconTheme声明的键视为合法 - 长循环告警:
while(true)、for(;;)、setInterval无界轮询(提示放 Worker / WASM / 后端)——启发式文本扫描,可能误报/漏报 - 签名检查:包模式用内置商店根公钥验签(ADR-050,设置
QOMICEX_DEV_ROOT_PUBLIC_KEY时改用本地开发根钥,见发布与签名文档);无签名提示「未签名」不拒绝;验签失败(含pack --key生成的自签名证书被根钥拒绝)以非 0 退出
lint
verify 更严的发布前静态门禁,额外检查:
- 相对 import 缺扩展名:
import ... from './x'无扩展名且非目录 barrel → error(Vite 硬规则) - 资源引用存在性:
entry.frontend/theme/backend、contributes.overlay.file指向的文件不存在 → error(dist/引用未构建时给 warning) - 图标名校验:同
verify(manifesticon字段 + 源码 FA 字面量),表外类名 → error
bump
manifest.json 的 version 字段,不触发构建。发布新版本前用它递增版本,避免商店拒绝「比线上更老」的版本(409 version_exists)。版本号支持 semver pre-release 与 build metadata(1.2.3-beta.1 / 1.2.3+build5)。
实例(发布流程标准化):
login / logout
qomicex publish 免重复授权:access token 15 分钟过期时自动用 refresh token 经 POST /auth/refresh 旋转续期。会话按商店 API base 区分(不同商店各自独立登录)。
实例(首次登录 + 多商店隔离):
publish
- 认证:
QOMICEX_API_KEY存在(CI)或持久化会话续期成功则跳过;否则POST /api/v1/auth/device/code设备流登录(RFC 8628) POST /api/v1/developer/keys上传 Ed25519 公钥 → 商店根钥签发开发者证书(keyId+signature.cert.json)- 用私钥对包体签名(规范化 JSON 载荷 → Ed25519 →
signature.json),与证书一起打进.qplugin - 查找/创建插件记录(
/plugins/mine→ 无则POST /plugins),确认后POST /plugins/:id/versionsmultipart 上传 - 成功后将签名包存为
release/<id>-<version>.signed.qplugin供复验
实例(发布 + 更新版本):
doctor
@qomicex/plugin-ui、Vite、openssl + WebCrypto(Ed25519)、后端 :5000、插件商店可达、调试 harness 可定位。输出 ✔/✗ 与原因,不修改任何文件。
实例(排障:插件构建/调试环境出问题时先跑一遍):
debug
--launcher > QOMICEX_LAUNCHER_PATH > 仓库 src-tauri/target/{release,debug} > 安装路径),以 --debug <port> 参数启动。
启动器本身支持 Qomicex Launcher.exe --debug <port>——第三方开发者无需 CLI/源码,直接命令行传参即可开放 CDP + 实时推送日志;release 默认纯 IPC 不受影响(仅显式传参才启用)。
- Windows(WebView2):
--debug <port>设WEBVIEW2_ADDITIONAL_BROWSER_ARGUMENTS=--remote-debugging-port=<port>开放 CDP;轮询/json/list打印 targets + DevTools 前端地址 - Linux/macOS:设
WEBKIT_INSPECTOR_SERVER/WEBKIT_INSPECTOR_HTTP_SERVER尽力支持(需应用启用 inspector) - 实时日志双通道:① 启动器 stderr 实时推送(backend 日志 + 启动器日志,
stdio: inherit直接可见);② tail{BaseDir}/logs/qomicex-backend.log(FileLog逐行 flush 实时落盘,含[plugin:...]/[frontend:...]trace 行)打印[trace] ...。均不依赖后端 TCP Ctrl+C停止并结束启动器子进程(--no-kill保留)
签名密钥
生成 Ed25519 密钥对(PKCS#8 PEM 或 raw 32 字节 seed base64):AI 辅助开发
Qomicex 的插件开发 AI skill 包独立维护在 qomicex-plugin-skills 仓库,供 AI agent(Claude / opencode / Cursor 等)在写插件时加载,获得准确且不过时的 manifest 字段、权限目录、桥 API 签名、主题 token、签名与调试流程——避免 AI 臆造字段。详见 AI 辅助开发。设计说明
- 零依赖:zip 读写(
node:zlib+ 手写 CRC32/目录结构)、Ed25519(WebCrypto)、参数解析(手写)均不引入第三方包 - 签名规范化 与商店
src/lib/signature.ts、启动器plugin_signature.rs字节级一致(键序/无空白 canonicalJson,signedHash= 载荷 SHA-256) - 不改商店上传接口:只读参考契约实现客户端