共享东代理插件库
共同执行 east-claude-plugin 财务报告和审定财务报表 east-codex-plugin,作为 @elaraai/east-plugin 用于基于 East 的 Claude 代码或代码插件( 见 建立在 East 插件上) (中文(简体) ). 这不是代理插件本身 .
lib/:项目检测,搜索,复核和调试,守护进程客户端,Python诊断,状态,笔录助手,stdio LSP客户端,搜索第一指南和钩子(Claude Code's insearch-hooks.ts代码在codex-hook.ts),可编码技术适配器(codex-skills.ts),以及插件组装器(package.ts) (中文(简体) ).hooks/:常见的生命周期和克洛德工具适配器. Codex的一个工具钩是east-codex-plugin/hooks/codex-tools.ts结束lib/codex-hook.ts财务报告和审定财务报表lib/codex-tools.ts(胸口和外壳正常化).daemon/: TypeScript/TSX LSP,Python LSP发射器和驻地诊断服务器.mcp/:实例搜索、检索、状态和真正的LSP桥;搜索和检索工具是example-tools.ts用于任何服务器.skills/:一个技能目录——四个插件-内生技能外加同包自有技能的同义链接.scripts/:唯一索引生成器 Python 渲染器,组装器驱动程序(package.ts)和CLI安装/更新执行.index.json: 犬科生成的活体, 一个承诺的文物。 每个装配的插件都装了一份, 出版的套件把它装上一个插件, 这个插件在它自己旁边为东方服务.marketplace/(被忽略):两个插件都是作为主机安装而组装的,east-claude-plugin/财务报告和审定财务报表east-codex-plugin/,有市场文件为它们取名——一个Claude Code和Codex在目录下名下的地方市场(elaraai, (中文(简体) ),elaraai-codex),所以一个维护者在报到或目录中点出名字.
主机运行时间文件是薄包再导出,由 Esbuild 内含. 它们不能独立地复制共同行为. hostText 翻译输出边界上的主机化工具和技能名. 组装的插件有意包含重复字节,所以已安装的插件不依赖于这个工作空间包.
pnpm --filter @elaraai/east-plugin run build
pnpm --filter @elaraai/east-plugin run generate-index # → index.json (commit it)
make -C libs/east-plugin package # both hosts' bundles + the assembled plugins under marketplace/
索引生成需要构建实例和Python环境,这在任一主机README中都有记载. 在运行时间变化后, 在捆绑主机前构建此软件包 。 代码 build 克劳德 build 自动做到这一点,并组装自己的插件;根递归式构建遵循工作空间依赖性图表.
编辑该技能拥有的库, 或它的本地源代码在此 。 Claude Code的插件通过包时的链接复制了目录; Codex的实现和调整了同样的源. 在两个主机下都没有产生任何犯罪。 在改变共享行为后运行两个主机测试套件:它们运行在组装的插件上.
出版
发布会公布汇编的目录 @elaraai/east-claude-plugin 财务报告和审定财务报表 @elaraai/east-codex-plugin 在锁步版本中 scripts/publish-plugins.mjs - 和公开目录 elaraai/插头 逐个列出为 npm 源被固定在它发布的版本上,为两个主机. 新套件名称被一手拖出(scripts/bootstrap-plugins-npm.mjs),在可以为此配置可信出版之前.
建立在 East 插件上
由东方所建出的产品的一个插件——它自己的技能和自己的例子——在自己的本体上运行同样的机械,每个被调用插件自己名字的作品:索引生成器,实例搜索及其MCP工具,搜索第一钩和Codex技能适配器. 东方自有的插件就是这些,用东方的名字来称呼.
npm install @elaraai/east-plugin@<the East packages' version>
诸版本. @elaraai/east-plugin 在一个版本的船舶上 @elaraai/* 软件包共享,并取决于 @elaraai/east 财务报告和审定财务报表 @elaraai/east-diagnostics 在那个版本。 把它固定在您所使用实例的东方软件包中, 并把它们一起移动 。 东方指数是那个版本的本体.
指数
一个 index.config.json 命名软件包 *.examples.ts(x) 作为东方的索引 index.config.json 是否: 来源为 ir: true 是一个以东程序为例的软件包,从它已建的测试模块中读取(dist),并与其所打印的TypeScript作为IR存储;其他任何被作为作者来源存储. 手写条目(如CLI) index.static.json 联 合 国 { "entries": [...] }。 。 。 .
npx east-plugin-generate-index --base-dir . --config index.config.json --static index.static.json --out index.json
# the python printings of the programs, optional (without them a program answers in TypeScript only):
uv run --with elaraai-east-py python node_modules/@elaraai/east-plugin/scripts/render-python.py index.json
从代码, generateIndex({ baseDir, config, staticEntries }) (单位:千美元)@elaraai/east-plugin/scripts/generate-index)返回要写入的索引.
搜索
搜索和获取 MCP 服务器上的工具注册 registerExampleTools(server, { index, searchTool, getTool, corpus, packages, scopes }),一旦索引上载,它就会回答:一个服务器在连接之前等待它,所以一个不会在启动时加载失败的索引,命名原因. scopes 是npm 瞄准镜 炸弹包安装在, @elaraai 除非给出:包过滤器接受其中任何一个下的名称,搜索工具告诉代理商不要读取那里已安装的包. 一个插件用East的两种方法之一来组成它的包:
-
一个服务器回答两个蝎子. 服务East的索引与你自己的索引:包过滤器既知道两者,又有一个例子id命名了它的包,所以两者从不相撞.
import { fileURLToPath } from "node:url"; import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"; import { registerExampleTools } from "@elaraai/east-plugin/mcp/example-tools"; import { EAST_INDEX_PATH } from "@elaraai/east-plugin/lib/east-index"; const server = new McpServer({ name: "acme", version: "1.0.0" }); await registerExampleTools(server, { index: [EAST_INDEX_PATH, fileURLToPath(new URL("../index.json", import.meta.url))], searchTool: "search_acme_examples", getTool: "get_acme_example", corpus: "Acme", packages: ["acme-cloud", "east", "e3"], }); await server.connect(new StdioServerTransport()); -
各取一.. 安装在您旁边的 East 插件用它自己的工具解答 East 的元件; 您的服务器只服务您的索引 .
EAST_INDEX_PATH 命名已安装的软件包 index.json。一个捆绑的服务器,作为East的插件捆绑他们的插件,复制文件在构建时输入插件,并从那里读取.
包裹
主机安装的插件是一个目录,每个文件都是真实的,完全不依赖. assemblePlugin (单位:千美元)@elaraai/east-plugin/lib/package) 从您的插件源头—— 它的显示目录, 它的建立 .build/,每个 hooks/hooks.json, (中文(简体) ), .mcp.json, (中文(简体) ), .lsp.json,读取,LICENSE和(克洛德码) commands/ 财务报告和审定财务报表 agents/ 它有——你的技能目录(后面的符号链接,包含一个链接的技能目录;在您的名字中被改编为Codex),以及你的索引,并生成一个 package.json 没有依赖性。 它就在旁边 out 并且一旦完成就搬入原地,所以失败将留下一个更早的集合 out 除先前的集合或源头重叠外,其他任何物体都不得持有:
import { assemblePlugin } from "@elaraai/east-plugin/lib/package";
await assemblePlugin({ host: "claude", source: "packages/acme-claude-plugin", skills: "packages/acme-plugin/skills", index: "packages/acme-plugin/index.json", out: "marketplace/acme-claude-plugin" });
await assemblePlugin({ host: "codex", source: "packages/acme-codex-plugin", skills: "packages/acme-plugin/skills", index: "packages/acme-plugin/index.json", out: "marketplace/acme-codex-plugin", names: ACME });
发布每个目录 npm publish <dir> --access public ,并在 elaraai/插头 catalog,该目录将每个标注在它为两个主机发布的版本上. 同一个目录,旁边是 .claude-plugin/marketplace.json 财务报告和审定财务报表 .agents/plugins/marketplace.json 拥有相对来源,是当地的发展市场,就像东方的 scripts/package.ts 写一个.
钩子
Claude Code每起事件都有一个钩子 每个功能都是共享的,由您的名字配置 :
// hooks/pre-write.ts — the gate on a write of your code with no search on record
import { gateText, type SearchGuidance } from "@elaraai/east-plugin/lib/search-guidance";
import { runPreWriteGate } from "@elaraai/east-plugin/lib/search-hooks";
import { SEARCH_TOOLS } from "@elaraai/east-plugin/lib/transcript";
const ACME: SearchGuidance = {
searchTool: "mcp__plugin_acme_acme__search_acme_examples",
getTool: "mcp__plugin_acme_acme__get_acme_example",
corpus: "Acme",
scope: "@elaraai",
};
await runPreWriteGate({
searchTools: [ACME.searchTool, ACME.getTool, ...SEARCH_TOOLS], // a search of East's corpus counts too
gateText: gateText(ACME),
isCorpusCode: (code) => /@elaraai\/acme/.test(code),
markerPrefix: "acme-search-seen",
requireSearchEnv: "ACME_REQUIRE_SEARCH",
});
读取的提醒是 runPreReadReminder({ readText: readText(ACME), isCorpusRead: corpusReadFor(ACME.scope) })。编码器在每个工具上运行一个钩: codexSearchGate(event, options) (单位:千美元)lib/codex-hook.ts电话后用工具记录搜索情况,在记录之前,它会提醒人们读取你的体格和门的密码; writeSearchHookReply 写下答案.
技能
一个插件会传送自己的技能;东方来自它旁边安装的东方插件. Codex只缓存插件本身,所以一个Codex插件将它的技能作为真实文件传送,改编自克洛德代码: materializeSkills(sources, target, names) (单位:千美元)lib/codex-skills.ts)适应了每种技能的"Markdown"——你的工具失去了克洛德代码的MCP前缀, /acme: 变成 $acme-codex-plugin:并复制其他文件.