🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI

肖邦编程智能体 CodePrometheus/chopin-ai

DeepSeek Harness
CodePrometheus10 天前有提交已提供中文文档扫描:含敏感能力

在终端里跑可续跑的编程会话,随时切模型并分叉

30.7/100
综合分
1
GitHub 星标
—
npm 周下载
—/5
用户评分

数据截至 2026/10/22 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。

安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add CodePrometheus/chopin-ai
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:仅索引
是什么
dsh 原生插件 · dev
装得上吗
本站尚未做安装检查
L4 · 真实安装等级说明 →
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 10 天前
档位由哪些信号合成

本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。

验证判据与等级说明 →
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。

可执行外部命令读写/删除本地文件读取剪贴板或密钥环境变量发起外部网络请求
查看扫描证据(共 48 处,展示前 45 条)
  • 读取密钥环境变量
    apps/tui/src/acp.ts:25
    ? connect(remote ?? "", process.env.CHOPIN_TOKEN === undefined ? {} : { token: process.env.CHOPIN_TOKEN })
  • 读取本地文件
    apps/tui/src/agent.ts:18
    const layer = await stat(directory).then(() => loadLayer(directory), () => undefined);
  • 写入本地文件
    apps/tui/src/chat.ts:521
    await writeFile(file, lines.map((line) => `${JSON.stringify(line)}\n`).join(""), { mode: 0o600 });
  • 读取本地文件
    apps/tui/src/chat.ts:687
    return (JSON.parse(await readFile(new URL("../package.json", import.meta.url), "utf8")) as { version: string }).version;
  • 读取本地文件
    apps/tui/src/chat.ts:700
    const head = await readFile(join(directory, ".git", "HEAD"), "utf8").catch(() => undefined);
  • 写入本地文件
    apps/tui/src/credentials.ts:45
    await mkdir(dirname(this.#file), { recursive: true });
  • 读取本地文件
    apps/tui/src/credentials.ts:50
    const text = await readFile(this.#file, "utf8").catch((error: NodeJS.ErrnoException) => {
  • 写入本地文件
    apps/tui/src/external-editor.ts:16
    await writeFile(file, text);
  • 执行外部命令来自配置/变量
    apps/tui/src/external-editor.ts:19
    const child = spawn(program, [...args, file], { stdio: "inherit", shell: process.platform === "win32" });
  • 读取本地文件
    apps/tui/src/external-editor.ts:23
    return code === 0 ? (await readFile(file, "utf8")).replace(/^/, "").replace(/ $/, "") : undefined;
  • 删除本地文件递归
    apps/tui/src/external-editor.ts:25
    await rm(directory, { recursive: true, force: true }).catch(() => {});
  • 读取本地文件
    apps/tui/src/home.ts:58
    return JSON.parse(await readFile(settingsFile(), "utf8")) as Settings;
  • 写入本地文件
    apps/tui/src/home.ts:66
    await mkdir(chopinHome(), { recursive: true });
  • 写入本地文件
    apps/tui/src/home.ts:78
    await mkdir(chopinHome(), { recursive: true });
  • 写入本地文件
    apps/tui/src/home.ts:92
    await writeFile(draft, text, mode === undefined ? {} : { mode });
  • 写入本地文件
    apps/tui/src/home.ts:93
    await rename(draft, file);
  • 删除本地文件
    apps/tui/src/home.ts:95
    await rm(draft, { force: true });
  • 发起网络请求
    apps/tui/src/network.ts:19
    setGlobalDispatcher(new EnvHttpProxyAgent({ noProxy: [...(spared === undefined || spared === "" ? [] : [spared]), ...LOOPBACK].join(",") }));
  • 发起网络请求
    apps/tui/src/network.ts:19
    setGlobalDispatcher(new EnvHttpProxyAgent({ noProxy: [...(spared === undefined || spared === "" ? [] : [spared]), ...LOOPBACK].join(",") }));
  • 发起网络请求
    apps/tui/src/network.ts:20
    install();
  • 写入本地文件
    apps/tui/src/paste.ts:25
    await writeFile(file, image, { mode: 0o600 });
  • 读取本地文件
    apps/tui/src/project.ts:86
    const logged = (await stat(paths.log).catch(() => undefined))?.size ?? 0;
  • 读取本地文件
    apps/tui/src/project.ts:93
    const log = (await readFile(paths.log)).subarray(logged).toString("utf8").trim();
  • 删除本地文件
    apps/tui/src/project.ts:132
    await rm(paths.record, { force: true });
  • 读取本地文件
    apps/tui/src/project.ts:134
    for (const name of await readdir(home)) if (name.startsWith(`${basename(paths.record)}.`)) await rm(join(home, name), { force: true });
  • 删除本地文件
    apps/tui/src/project.ts:134
    for (const name of await readdir(home)) if (name.startsWith(`${basename(paths.record)}.`)) await rm(join(home, name), { force: true });
  • 删除本地文件
    apps/tui/src/project.ts:162
    await rm(paths.record, { force: true });
  • 读取本地文件
    apps/tui/src/project.ts:183
    workspaces: new DirectoryWorkspaceProvider(paths.root, { hidden: [await realpath(chopinHome())] }),
  • 读取本地文件
    apps/tui/src/project.ts:235
    versions.push((JSON.parse(await readFile(join(root, "..", "package.json"), "utf8")) as { version: string }).version);
  • 读取本地文件
    apps/tui/src/project.ts:236
    for (const entry of await readdir(root, { recursive: true, withFileTypes: true })) {
  • 执行外部命令来自配置/变量
    apps/tui/src/project.ts:266
    const child = spawn(process.execPath, [BIN, "daemon", paths.root], {
  • 写入本地文件
    apps/tui/src/project.ts:287
    await mkdir(home, { recursive: true });
  • 写入本地文件
    apps/tui/src/project.ts:288
    await chmod(home, 0o700);
  • 写入本地文件
    packages/core/src/transcript.ts:11
    await appendFile(path, `${JSON.stringify(entry)}\n`);
  • 读取本地文件
    packages/core/src/transcript.ts:15
    return parseTranscript(await readFile(path, "utf8"));
  • 读取本地文件
    packages/harness-dsh/src/plugin.ts:65
    const text = await readFile(join(candidate.locator as string, "SKILL.md"), "utf8");
  • 写入本地文件
    packages/harness-dsh/src/plugin.ts:110
    const folder = () => (made ??= mkdir(directory, { recursive: true }).then(() => {}, (error: unknown) => {
  • 写入本地文件
    packages/harness-dsh/src/plugin.ts:117
    await appendFile(file, text);
  • 写入本地文件
    packages/harness-dsh/src/plugin.ts:122
    await appendFile(file, text);
  • 读取本地文件
    packages/harness-pi/src/http.ts:58
    return (await stat(path).catch(() => undefined))?.isFile() === true ? path : undefined;
  • 读取本地文件
    packages/harness-pi/src/layer.ts:145
    const text = await readFile(path, "utf8");
  • 读取本地文件
    packages/harness-pi/src/mcp.ts:14
    version ??= readFile(new URL("../package.json", import.meta.url), "utf8")
  • 写入本地文件
    packages/harness-pi/src/service.ts:480
    await mkdir(this.#options.dataDir, { recursive: true });
  • 写入本地文件
    packages/harness-pi/src/service.ts:481
    await chmod(this.#options.dataDir, 0o700);
  • 执行外部命令来自配置/变量
    packages/workspace/src/run.ts:33
    const child = execFile(binary as string, args, { env: { ...process.env, ...env }, maxBuffer: Infinity, encoding: "buffer" }, (error, stdout, stderr) =
扫描于 2026/10/31(1 天前) · 范围 全包扫描 · 来源 GitHub 仓库

静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。

给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

一个会自我改进的编程智能体,靠一层可变层实现,只有密封评估器能改动它。

README

由 DeepSeek 最新模型翻译生成
chopin-ai 一个为自我改进而生的编程智能体。 状态: v0.2.0 是智能体本体。让它自我改进的循环留到下个版本;见它如何自我改进。 安装 npm install -g chopin-ai 需要 Node.js 24.8 或更高版本。 快速开始 cd my-project chopin 首次运行会连接服务商,用登录方式或 API key 都行,然后选一个模型。/hotkeys 列出所有快捷键。 功能 - 会话不丢。 每一步都先保存再显示,所以重启打断的运行能从停下的地方接着跑。 - 一个智能体,处处可用。 每个项目有一个后台服务;终端、浏览器(chopin web)和编辑器(chopin acp)接入同一段会话,关掉终端智能体照样干活。 - 服务商随意。 /login 用登录方式或 API key 连接;/model 和 ctrl+p 在会话中途切换模型。 - shell 就在会话里。 !command 执行命令,智能体随后能看到结果;!!command 只给你自己看。 - 边跑边指挥。 enter 给正在跑的回合下指令,alt+enter 把后续消息排队,alt+up 把排队的消息取回来。 - 会话可以分叉。 /resume、/fork、/compact 和 /export。 - 项目自己的指令。
展开完整文档(README 剩余 1 节)
chopin-ai

一个为自我改进而生的编程智能体。

状态: v0.2.0 是智能体本体。让它自我改进的循环留到下个版本;见它如何自我改进。

安装

npm install -g chopin-ai

需要 Node.js 24.8 或更高版本。

快速开始

cd my-project
chopin

首次运行会连接服务商,用登录方式或 API key 都行,然后选一个模型。/hotkeys 列出所有快捷键。

功能

- 会话不丢。 每一步都先保存再显示,所以重启打断的运行能从停下的地方接着跑。
- 一个智能体,处处可用。 每个项目有一个后台服务;终端、浏览器(chopin web)和编辑器(chopin acp)接入同一段会话,关掉终端智能体照样干活。
- 服务商随意。 /login 用登录方式或 API key 连接;/model 和 ctrl+p 在会话中途切换模型。
- shell 就在会话里。 !command 执行命令,智能体随后能看到结果;!!command 只给你自己看。
- 边跑边指挥。 enter 给正在跑的回合下指令,alt+enter 把后续消息排队,alt+up 把排队的消息取回来。
- 会话可以分叉。 /resume、/fork、/compact 和 /export。
- 项目自己的指令。 每次请求前都会读取 AGENTS.md,从仓库根目录一路读到工作目录。
- 按用户隔离工作区。 chopin serve 为每个用户跑一个容器工作区,用户身份由集成方的签名 token 指定。

它如何自我改进

智能体的行为放在一个可变的层里:AGENTS.md 指令、Agent Skills、MCP 服务器和 gate 规则,两套 harness 共用,再加上每套 harness 自己的代码。即将到来的 RSI(递归自我改进)循环会改动这一层,并且只在一种情况下接受改动:由智能体够不着的封闭评测器证明,改动至少帮到一套 harness,且没有让任何一套退步。这一层用开放格式,所以它学到的东西能带到其他智能体上。

这一层今天就已经能加载:放进 ~/.chopin/layer,再用 chopin layer check <dir> 检查。

配置

| 位置 | 内容 |
| ~/.chopin/auth.json | /login 保存的凭据;服务商惯用的环境变量同样有效 |
| ~/.chopin/config.json | 默认模型、供 ctrl+p 使用的 enabledModels、主题、httpProxy |
| ~/.chopin/models.json | 额外的服务商和模型 |
| ~/.chopin/layer/ | AGENTS.md、skills/<name>/SKILL.md、mcp.json、gates.yaml |
| CHOPIN_MODEL | 覆盖默认模型 |
| CHOPIN_HOME | 把 ~/.chopin 挪到别处 |
| HTTP_PROXY、HTTPS_PROXY | 让请求走代理 |

面向集成方

chopin serve --jwks <url> 为多个用户运行智能体,每个用户各有一个容器工作区;先从代码检出目录构建镜像,命令是 pnpm --filter @chopin-ai/harness-pi image。客户端通过客户端协议或 ACP 接入。

| 包 | 用途 |
| chopin-ai | chopin 命令:终端客户端、Web 应用、ACP 和项目服务 |
| @chopin-ai/core | 可变层格式、ACP 记录和 chopin layer check |
| @chopin-ai/workspace | 工作区生命周期接口,提供目录和容器两种实现 |
| @chopin-ai/harness-pi | 持久化 harness 适配器:智能体服务、客户端协议、ACP 桥接 |
| @chopin-ai/harness-dsh | 插件 harness 适配器:加载可变层、无头运行 |

开发

需要 pnpm 12。

pnpm install
pnpm typecheck # packages and tests
pnpm test

v0.1.0 归档了旧版设计。
CHANGELOG 列出每次发布。

许可证

Apache-2.0
预览分享卡片长什么样 ↓CodePrometheus/chopin-ai
分享 · DeepSeek Harness Hub
CodePrometheus/chopin-ai

在终端里跑可续跑的编程会话,随时切模型并分叉

回到顶部