@ cyberuni/ 代理服务器
与人工智能特工合作的工具包 检测哪个正在运行 克劳德代码,克塞尔, Codex, GitHub 副驾驶 CLI, OpenCode, Kilo 代码,双子座 CLI, Quen 代码, VS 代码中的 GitHub 副驾驶, Cline, Crush, OpenHands, 或 Auggie CLI —— 询问它持有什么(它管理的政策位置, 插件存储、 启用插件、 如何命名插件技能以及如何运行无头设备),以及 解决代理按要求读取的参考文件.
它依赖于没有其它的代理工具,所以其中任何一种工具都可以建立在它上.
状态:释放前. 每一个事实,这个库 编码基于
.research/harness-detection。 。 。 .
探测绳子
import { detectHarness } from '@cyberuni/agent-harness'
const result = detectHarness()
// {
// harness: 'claude-code',
// candidates: ['claude-code'],
// evidence: [
// { harness: 'claude-code', signal: 'CLAUDECODE', research: 'E-CC-D1', description: '…' },
// { harness: 'claude-code', signal: 'CLAUDE_CODE_CHILD_SESSION', research: 'E-CC-D3', description: '…' },
// ],
// }
检测会读取环境变量,每个控制器都设定在其产生的过程上:
| 节奏 | 从 |
|---|---|
| 克劳德代码 | CLAUDECODE=1 与 CLAUDE_CODE_CHILD_SESSION=1 或者说 CLAUDE_CODE_SESSION_ID |
| 光标 | CURSOR_AGENT=1,或 CURSOR_VERSION 与 CURSOR_PROJECT_DIR 钩子 |
| 代码 | CODEX_THREAD_ID |
| GitHub 副驾驶 CLI | COPILOT_CLI=1, (中文(简体) ), COPILOT_AGENT_SESSION_ID,或 COPILOT_PLUGIN_ROOT 钩子 |
| 打开代码 | OPENCODE=1 与 OPENCODE_PID |
| Kilo 代码 | KILO=1 与 KILO_PID |
| 双子座CLI | GEMINI_CLI=1 |
| Quen 代码 | QWEN_CODE=1 |
| VS 代码中的 GitHub 副驾驶 | COPILOT_AGENT=1 |
| 线 | CLINE_ACTIVE=true,仅由 VS 代码扩展设置 |
| 碾碎 | CRUSH=1 |
| 打开手 | AI_AGENT=openhands,或 OPENHANDS_EVENT_TYPE 与 OPENHANDS_PROJECT_DIR 钩子 |
| 奥吉CLI | AUGMENT_HOOK_EVENT 与 AUGMENT_PROJECT_DIR只有钩子 |
报告 unknown 而不是猜测 :
- 当没有带匹配,包括
CLAUDECODE=1a. 本身,IDE扩展也设置; - 当一个以上的绳子匹配, 就像一个绳子运行在另一个的外壳。 比赛
列于
candidates· ; - 页:1
AGENT财务报告和审定财务报表AI_AGENT,几个供应商设定的(只有确切价值)AI_AGENT=openhands(计数)和OPENCODE=1单是Kilo代码,即OpenCode分叉,也可以设置; - 在吊带没有设置任何自身背景的背景:Codex、双子座CLI和Quen码钩,Quen
代码, Crush, OpenHands, 和 Auggie MCP 服务器, Auggie shell 命令, OpenHands CLI 1.1.6. 0 shell
命令( 其 SDK 先前日期)
AI_AGENT=openhands)和线CLI; - 没有经过证实的信号的绳索,如:鹅、抗重力、罗沃德夫、基罗、安普、工厂 机器人 德文桌面 和曲速 研究记录了为什么每一个.
过 { env } 检查除 process.env。 。 。 .
管理政策
import { managedPolicyLocations } from '@cyberuni/agent-harness'
managedPolicyLocations('claude-code', { platform: 'linux' })
// [
// { kind: 'server', location: 'claude.ai admin console or a self-hosted Claude apps gateway', … },
// { kind: 'file', location: '/etc/claude-code/managed-settings.json', … },
// { kind: 'directory', location: '/etc/claude-code/managed-settings.d', … },
// { kind: 'file', location: '/etc/claude-code/managed-mcp.json', … },
// ]
kind 实值 file 或者说 directory 因为一个召唤者能从磁盘上读取什么, macos-managed-preferences
或者说 windows-registry 用于交付MDM,以及 server 供应商持有的保单
组织。 A 类 server 条目意味着本地文件不是整个政策.
插件存储
import { pluginStorage } from '@cyberuni/agent-harness'
pluginStorage('codex')
// {
// harness: 'codex',
// configDir: '/home/me/.codex',
// locations: [
// { kind: 'plugin-cache', path: '/home/me/.codex/plugins/cache', … },
// { kind: 'enabled-record', path: '/home/me/.codex/config.toml', … },
// ],
// }
路径是计算而不是检查的,所以在安装第一个插件之前,一个位置可能不存在.
光标没有 enabled-record: 没有启用其插件的文件记录 .
已启用的插件
import { enabledPlugins } from '@cyberuni/agent-harness'
const result = await enabledPlugins('claude-code')
// {
// harness: 'claude-code',
// supported: true,
// plugins: [{ id: 'my-plugin@my-marketplace', enabled: true, scope: 'project', source: '/repo/.claude/settings.json' }],
// sources: [{ scope: 'managed', path: '/etc/claude-code/managed-settings.json', found: false }, …],
// unread: ['server-managed settings (claude.ai admin console or a self-hosted Claude apps gateway)', …],
// research: ['E-CC-P3', …],
// }
| 节奏 | 文件已读取, 最高优先 |
|---|---|
| 克劳德代码 | 管理 managed-settings.json, (中文(简体) ), .claude/settings.local.json, (中文(简体) ), .claude/settings.json, (中文(简体) ), <config dir>/settings.json |
| 代码 | <config dir>/config.toml |
| GitHub 副驾驶 CLI | 管理 managed-settings.json, (中文(简体) ), .github/copilot/settings.local.json, (中文(简体) ), .github/copilot/settings.json, (中文(简体) ), <config dir>/settings.json |
| Cursor, OpenCode, Kilo 代码, 双子座 CLI, Quen 代码, VS 代码中的副驾驶, Cline, Crush, OpenHands, Auggie CLI | 无: supported 实值 false |
仅报告有明确条目的插件。 没有条目的插件会回到默认状态
此软件包不知道 。 何时 unread 不为空, MDM 或服务器管理的政策仍然可以
推翻答案.
已安装插件
import { enabledPlugins, installedPlugins } from '@cyberuni/agent-harness'
const installed = await installedPlugins('claude-code')
// {
// harness: 'claude-code',
// supported: true,
// plugins: [{ id: 'my-plugin@my-marketplace', path: '/home/me/.claude/plugins/cache/my-marketplace/my-plugin/1.0.0', version: '1.0.0', scope: 'user', research: ['E-CC-P2'] }],
// unresolved: [],
// sources: [{ path: '/home/me/.claude/plugins/installed_plugins.json', found: true }],
// unread: [],
// research: ['E-CC-P2'],
// }
// The folder of each enabled plugin:
const enabled = new Set((await enabledPlugins('claude-code')).plugins.filter((p) => p.enabled).map((p) => p.id))
const folders = installed.plugins.filter((p) => enabled.has(p.id)).map((p) => p.path)
| 节奏 | 从 | 文件夹 |
|---|---|---|
| 克劳德代码 | <config dir>/plugins/installed_plugins.json | installPath; 每个范围安装一个插件条目 |
| 代码 | <config dir>/plugins/cache/<marketplace>/<plugin>/ | local 如果存在, 其他最高版本, 如 Codex 所选 |
| GitHub 副驾驶 CLI | <config dir>/config.json installedPlugins | cache_path; 直接安装的 id 它的空名是无 |
| Cursor, OpenCode, Kilo 代码, 双子座 CLI, Quen 代码, VS 代码中的副驾驶, Cline, Crush, OpenHands, Auggie CLI | 无: supported 实值 false | —— 说 |
unresolved 列出缓存混合 semver 和非 semver 版本文件夹的 Codex 插件, 其中
文件夹 Codex 选择取决于其类型。 从本地添加的市场中加载 CLI 插件
路径到位,没有安装记录,所以它们出现在 unread 换句话说.
技能命名和插件依赖性
import { skillInvocation, supportsPluginDependencies } from '@cyberuni/agent-harness'
skillInvocation('claude-code', { plugin: 'my-plugin', skill: 'review' })?.text // '/my-plugin:review'
skillInvocation('copilot-cli', { plugin: 'my-plugin', skill: 'review' })?.text // '/review'
skillInvocation('codex', { plugin: 'my-plugin', skill: 'review' })?.text // '$review'
skillInvocation('gemini-cli', { plugin: 'my-plugin', skill: 'review' }) // undefined: the model loads skills itself
supportsPluginDependencies('claude-code') // true; false for the others
技能目录
import { skillsDirectories } from '@cyberuni/agent-harness'
skillsDirectories('claude-code') // { project: ['.claude/skills'], user: ['.claude/skills'], research: ['E-CC-L1'] }
skillsDirectories('codex')?.project.includes('.agents/skills') // true
skillsDirectories('qwen-code') // undefined: not confirmed
项目目录与项目根相对,用户目录与主目录相对. 仅 默认读取的目录被列出;管理员,捆绑,插件技能被忽略.
无头运行
如何运行一个没有用户的提示:命令、模型和权限 标记、输出格式以及其中显示符号用途和成本的地方、记录片位置、, 和记录的退出代码。 库只描述运行; 启动进程最多 你吗.
import { headlessCommand, headlessInvocation } from '@cyberuni/agent-harness'
headlessCommand('claude-code', {
prompt: 'Fix the failing test',
model: 'sonnet',
permission: 'unattended',
outputFormat: 'stream-json',
})
// { executable: 'claude', args: ['-p', '--model', 'sonnet', '--permission-mode', 'bypassPermissions',
// '--output-format', 'stream-json', '--verbose', 'Fix the failing test'] }
const codex = headlessInvocation('codex')
// codex.outputFormats[1]: { name: 'jsonl', args: ['--json'],
// usage: { event: 'turn.completed', tokens: 'usage', accumulate: 'sum' } } (no dollar cost)
headlessInvocation('vscode-copilot').supported // false: no headless mode
headlessInvocation('opencode').supported // 'unknown': a one-shot mode exists, but its flags are not verified
Claude Code, Codex, 副驾驶 CLI, Cursor, 双子座 CLI, 和 Quen Code 都涵盖在内. permission: 'unattended' 让运行中编辑文件和运行命令而不询问,所以只用在一个
弃取取出. 退出代码是一个弱信号: Claude 代码只记录零和非零,以及
以转弯停止的运行或预算上限由 result 留言的 subtype。 。 。 .
参考文件
参考文件是名为Markdown的文档,代理人按要求读取,例如核对表或一组
计算技能。 任何人都可以在不编辑传送它的插件的情况下覆盖一个插件: a
项目在 .agents/references/<name>.md,在 ~/.agents/references/<name>.md。 。 。 .
import { loadReference } from '@cyberuni/agent-harness'
const resolved = await loadReference('agent-readiness-weights', {
root: process.cwd(),
// The plugin calling the resolver: its own `references/` is the first plugin layer.
plugin: { name: 'my-plugin', root: pluginRoot },
})
if (resolved.status === 'found') console.log(resolved.content)
status 实值 found, (中文(简体) ), missing,或 ambiguous (两个插件持有此名称; 请求其中之一)
resolved.plugins,例如 my-plugin/agent-readiness-weights) (中文(简体) ). trace 说出每一层所持有的东西.
层被读取最高优先 :
| 级别 | 文件夹 |
|---|---|
| 管理 | 管理员 references/ 文件夹和 a references/ 除了每个检测到的被管理的政策文件 |
| 项目 | .agents/references/ 根和上方的每个文件夹,直到寄存器根 |
| 用户 | ~/.agents/references/ |
| 插件 | 调用插件 references/,每个插件,带启用,然后每个软件包 package.json 声明 |
每个文件夹中, <name>.md 先回答,然后说 <name>/README.md, (中文(简体) ), <name>/index.md,以及
<name>/SKILL.md. 遗产 governances/ 文件夹仍在读取, 下方 references/ 旁边
他们.
文档的前题 merge 说它如何与下面的地层结合:
first-wins(默认值):它取代了下面的一切.combine:放在下层上方,每层保持整齐.merge-sections:其各节取而代之的是下面标题相同的各节,并配以标题路径, 而它没有重新定义的部分被保留下来。 在标题下,<!-- merge: combine -->附录 改为该节<!-- merge: remove -->删除它.
前题读作YAML. merge, (中文(简体) ), description,以及 tags 是解析器读取的密钥;
resolved.metadata 持有每把钥匙,更高层的胜利。 不属于YAML 的前题
地图被忽略 警告.
| 函数 | 对 |
|---|---|
loadReference(name, options) | 将根定出一个名称, 每一级改为 |
referenceLayers(options) | 构建命令的图层,以解析多个名称 |
resolveReference(name, layers) | 决定一个解析后的名称( N)parseReferenceName)对分层 |
listReferences(layers), (中文(简体) ), referenceNames(layers) | 层所持的每个名称, 以及每个副本的状态 |
listReferences(layers, { pattern }) | 按确切名称模式列出的每一个引用,都有层次、插件和模糊状态 |
searchReferences(query, layers) | 按名称、描述、标题或正文匹配查询的名称 |
whereReference(name, layers, options) | 工程和用户文件可以写入一个覆盖到 |
managedReferencesDir(), (中文(简体) ), projectReferencesDir(), (中文(简体) ), projectReferenceLayers() | 单个文件夹和层 |
declaredDependencies(), (中文(简体) ), packageDir() | 一份清单申报了包件,每个包装在哪里 |
引用命令
货包船a reference 命令为 show, (中文(简体) ), list, (中文(简体) ), search, (中文(简体) ), where, (中文(简体) ), create,以及
delete 子命令 :
npx -y @cyberuni/agent-harness reference show <name>... --root <repository root>
npx -y @cyberuni/agent-harness reference list
npx -y @cyberuni/agent-harness reference list 'project-tracker.capabilities.*'
npx -y @cyberuni/agent-harness reference create <name> --scope project
npx -y @cyberuni/agent-harness reference delete <name> --scope project --dry-run
delete 只删除复制到 .agents/references/ (单位:千美元)--scope project)或(或)
~/.agents/references/ (单位:千美元)--scope user,以及复制后答复姓名的报告:
插件的复制件, 一旦一个工程的覆盖器消失 。 它拒绝一个插件已发送或管理的副本.
输出为 东 默认情况下, 代理分析; 通过
--format json 或者说 --format text (单位:千美元)show, (中文(简体) ), create,以及 delete 默认为 text) (中文(简体) ). 格式
跟着 clibuilder 12,其他任何价值均为a
使用错误(退出代码2). 建材制造器制造的CLI 12
可以在自己的插件名称下托管同一命令 ./commands 子路径. --format
是主机的全球选项,所以主机 cli({ format }) 设置每个子命令的默认值;
页:1 text 默认 show, (中文(简体) ), create,以及 delete 属于 agent-harness CLI: 爱丽丝
import { createReferenceCommand } from '@cyberuni/agent-harness/commands'
app.command(createReferenceCommand({ plugin: { name: 'my-plugin', root: pluginRoot } }))
这个 reference 技能
软件包也是一个代理插件, cyber-agent-harness,该船a reference 技术。 类型
/reference (单位:千美元)/cyber-agent-harness:reference 在 Claude 代码中),以加载、创建、更新、删除、查找或
检查一个参考物, 或者用电线来装入一个。 技能只写或删除文件
你同意吗? 它从捆绑中运行命令 scripts/reference.mjs,则不需要
node_modules。 。 。 .
/plugin marketplace add cyberuni/cyberplace
/plugin install cyber-agent-harness@cyberplace
需要一个参考名称的技巧 单行,作为技巧
README.md
显示 :
Load `skill-design` with the `reference` skill in the `cyber-agent-harness` plugin.
为什么会这样
universal-plugin, (中文(简体) ), buddy-agent-harness, (中文(简体) ), repobuddy,以及 cyberlegion/cyber-mux 每一个需要知道
他们正在使用的是什么毒剂, 并且每个人都在重新分别进行检测.
这个软件包是存在的,因此它们共享一个执行.