By bbingz
Use multiple provider CLIs from one Claude Code plugin, including background job lifecycle.
Run an adversarial provider-backed review on the current diff through polycli
Ask one provider a question through polycli, optionally in the background
Cancel an active polycli background job in this repository
Run a long provider-backed task through polycli, in foreground or background
Show the stored final output for a finished polycli job in this repository
No model invocation
Executes directly as bash, bypassing the AI model
Own this plugin?
Verify ownership to unlock analytics, metadata editing, and a verified badge. GitHub access is read-only (username + org membership).
Sign in to claimOwn this plugin?
Verify ownership to unlock analytics, metadata editing, and a verified badge. GitHub access is read-only (username + org membership).
Sign in to claimBased on adoption, maintenance, documentation, and repository signals. Not a security audit or endorsement.
polycli 是一个刻意收窄到 Path B 的 monorepo:只提供可复用工具层和独立 timing contract,不提供公共 runtime、继承树或 hook framework。
这个仓库面向多 provider companion / wrapper 项目,目标有两个:
当前仓库已经落地三层能力:
@bbingz/polycli-utils@bbingz/polycli-timing@bbingz/polycli-runtimeClaude / Codex / Copilot / OpenCode)v1 阶段只有前两个包;从 v2 开始,claude / copilot / opencode / pi / gemini / kimi / qwen / minimax 的 runtime adapter 已经进入本仓,集中在 @bbingz/polycli-runtime。旧 4 个 plugin repo 仍然是 reference implementation,不再作为运行依赖。
@bbingz/polycli-utils
args: 命令行参数解析与原始字符串切词process: 命令执行、可用性探测、进程树终止stream: UTF-8 安全的按行解码atomic-save: 原子写与锁文件ndjson: 追加 / 读取 / tail NDJSONsession-id: 从 stdout / stderr / 文件值中提取 session idparse-stream-json: 消化前缀噪声并解析 JSON 行@bbingz/polycli-timing
timing.schema.json: timing record 契约validateTimingRecord(): 运行时校验calculatePercentiles(): p50 / p95 / p99aggregateTimingRecords(): capability-aware 聚合@bbingz/polycli-runtime
claude / copilot / opencode / pi / gemini / kimi / qwen / minimax runtime adapterplugins/polycli
/polycli:setup / ask / rescue / review / adversarial-review/polycli:status / result / cancel/polycli:timinghost adapters
plugins/polycli for Claude Codeplugins/polycli-codex for Codexplugins/polycli-copilot for GitHub Copilot CLIplugins/polycli-opencode plus .opencode/plugins/polycli.mjs for OpenCode.claude-plugin/marketplace.json.agents/plugins/marketplace.json.github/plugin/marketplace.json仓库当前是 monorepo 本地开发形态,先进入根目录:
cd /Users/bing/-Code-/polycli
npm test
发布态安装入口已经固定为:
claude plugin marketplace add bbingz/polycli 然后 claude plugin install polycli@polycli-hostscodex plugin marketplace add bbingz/polyclicopilot plugin marketplace add bbingz/polycli 然后 copilot plugin install polycli-copilot@polycli-hostsopencode plugin @bbingz/polycli-opencode仓库内可重复执行的发布前校验:
npm run release:check
npm run pack:opencode
在本仓内直接从源码引用:
import { parseArgs, createLineDecoder, appendNdjson } from "./packages/polycli-utils/src/index.js";
import { validateTimingRecord, aggregateTimingRecords } from "./packages/polycli-timing/src/index.js";
未来发布到 npm 后,调用方式会是:
import { parseArgs } from "@bbingz/polycli-utils";
import { validateTimingRecord } from "@bbingz/polycli-timing";
@bbingz/polycli-utils参数解析:
import { parseArgs } from "./packages/polycli-utils/src/index.js";
const parsed = parseArgs(
["--json", "-t", "5000", "ask", "--", "--literal"],
{
booleanOptions: ["json"],
valueOptions: ["timeout"],
aliasMap: { t: "timeout" }
}
);
// parsed.options => { json: true, timeout: "5000" }
// parsed.positionals => ["ask", "--literal"]
流式按行解码:
import { createLineDecoder } from "./packages/polycli-utils/src/index.js";
const decoder = createLineDecoder();
decoder.push(Buffer.from("hello\nwor"));
decoder.push(Buffer.from("ld\n"));
decoder.end();
带噪声前缀的 JSON 行解析:
import { parseStreamJsonLine } from "./packages/polycli-utils/src/index.js";
const parsed = parseStreamJsonLine('MCP issues detected... {"type":"init","session_id":"abc"}');
if (parsed.ok) {
console.log(parsed.event.type); // "init"
}
NDJSON 历史写入:
import { appendNdjson, readNdjson, tailNdjson } from "./packages/polycli-utils/src/index.js";
appendNdjson("/tmp/polycli-history.ndjson", { id: 1, ok: true });
appendNdjson("/tmp/polycli-history.ndjson", { id: 2, ok: true });
const all = readNdjson("/tmp/polycli-history.ndjson");
const last = tailNdjson("/tmp/polycli-history.ndjson", 1);
session id 解析:
import { resolveSessionId } from "./packages/polycli-utils/src/index.js";
const result = resolveSessionId({
stdout: "",
stderr: "To resume: kimi -r 123e4567-e89b-12d3-a456-426614174000",
fileValue: null,
priority: ["stderr", "stdout", "file"]
});
@bbingz/polycli-timingpolycli-timing 的核心不是“统一 6 段数值”,而是统一状态表达。每个 metric 都必须明确标记为:
measured: 有数据且大于 0zero: 明确贡献了 0missing: 理论上能测,但本次没拿到unsupported: provider / runtime 根本不具备这个指标这保证跨 AI 能力对比时不会把“没能力”“没数据”“贡献 0”混成一列。
此外,record 里保留了两个强约束字段:
npx claudepluginhub bbingz/polycli --plugin polycliUse Gemini from Claude Code to review code or delegate tasks. Streaming support, task runtime, thread resumption.
Use Qwen from Claude Code to review code or delegate tasks.
Use MiniMax (via Mini-Agent) from Claude Code.
Use Kimi from Claude Code to review code or delegate tasks.
Comprehensive UI/UX design plugin for mobile (iOS, Android, React Native) and web applications with design systems, accessibility, and modern patterns
Standalone image generation plugin using Nano Banana MCP server. Generates and edits images, icons, diagrams, patterns, and visual assets via Gemini image models. No Gemini CLI dependency required.
Multi-model consensus engine integrating OpenAI Codex CLI, Gemini CLI, and Claude CLI for collaborative code review and problem-solving.
Write feature specs, plan roadmaps, and synthesize user research faster. Keep stakeholders updated and stay ahead of the competitive landscape.
Unified status line for Claude Code with multi-CLI (Claude, Codex, Gemini, z.ai) usage monitoring, context, rate limits, and cost tracking