Files
cv-cat dc078b248b catbus:一个命令操作小红书、抖音、TikTok、B 站、快手、微博、闲鱼、淘宝、京东、X
10 个平台的 web 端全部用 TypeScript 移植自 cv-cat 的开源项目,请求与上游逐字节对拍。
统一的命令语法与 JSON 输出、按 平台 × 端 × 账号 隔离的登录态、给 AI Agent 用的技能与 llms.txt。
2026-10-06 19:24:55 +08:00

85 lines
2.5 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// 冒烟测试:对已经全局安装的 catbus 运行几条命令(AGENTS 7.5)。CI 在全部目标系统上跑。
// 用法:node scripts/smoke.mjs
import { spawnSync } from 'node:child_process'
import { mkdtempSync, rmSync } from 'node:fs'
import { tmpdir } from 'node:os'
import { join } from 'node:path'
const home = mkdtempSync(join(tmpdir(), 'catbus-smoke-'))
let failed = 0
function catbus(...args) {
const r = spawnSync('catbus', args, {
encoding: 'utf8',
shell: process.platform === 'win32',
env: { ...process.env, CATBUS_HOME: home },
})
if (r.error) throw r.error
let env = null
try {
env = JSON.parse(r.stdout)
} catch {}
return { code: r.status, stdout: r.stdout, stderr: r.stderr, env }
}
function check(name, fn) {
try {
fn()
console.log(`ok ${name}`)
} catch (err) {
failed++
console.log(`FAIL ${name}:${err.message}`)
}
}
function assert(cond, message) {
if (!cond) throw new Error(message)
}
check('version', () => {
const r = catbus('version')
assert(r.code === 0 && r.env?.ok, r.stdout + r.stderr)
assert(r.env.data.node === process.versions.node, `node 版本不一致:${r.env.data.node}`)
console.log(` ${JSON.stringify(r.env.data)}`)
})
check('doctor', () => {
const r = catbus('doctor')
for (const c of r.env?.data ?? []) console.log(` ${c.ok ? '✓' : '✗'} ${c.name}:${c.message}`)
assert(r.code === 0 && r.env?.ok, r.env?.error?.message ?? r.stdout + r.stderr)
})
check('模型包(assets-jd、assets-ocr)', () => {
const r = catbus('doctor')
for (const name of ['assets-jd', 'assets-ocr']) {
const c = (r.env?.data ?? []).find((x) => x.name === name)
assert(c?.ok, `${name}:${c?.message ?? 'doctor 没有这一项'}`)
}
})
check('platforms', () => {
const r = catbus('platforms')
assert(r.code === 0 && r.env?.data?.length === 10, r.stdout + r.stderr)
})
check('--help', () => {
const r = catbus('--help')
assert(r.code === 0 && r.stdout.includes('catbus <platform> <resource> <action>'), r.stdout + r.stderr)
})
check('planned 端 → NOT_IMPLEMENTED(退出码 4)', () => {
const r = catbus('xianyu', 'item', 'get', 'x', '-e', 'app')
assert(r.code === 4 && r.env?.error?.code === 'NOT_IMPLEMENTED', r.stdout + r.stderr)
})
check('auth list', () => {
const r = catbus('auth', 'list')
assert(r.code === 0 && Array.isArray(r.env?.data), r.stdout + r.stderr)
})
rmSync(home, { recursive: true, force: true })
if (failed) {
console.log(`${failed} 项失败`)
process.exit(1)
}