mirror of
https://bitbucket.org/siakitem/my-pi.git
synced 2026-10-26 10:45:22 +00:00
feat: 接入 Pi 内置 codemode,并修复全面审查发现的问题
- codemode:Tool Search 常驻(alwaysEnabled)、权限 allow(嵌套调用仍逐个过权限门)、 tools.jsonc 登记使用规则;RTK 跳过 parentToolCallId 嵌套调用,避免丢失 bash structuredContent;Tool Search 目录过滤 hidden / codemode(script-only)exposure; 扩展加载测试加载 builtin:codemode 并断言其常驻激活 - 搜索 key 不再经命令行参数传递:search-auth.mjs 改为 --set-stdin(先读校验再加锁), configure.sh 交互输入经管道、非交互用 --<provider> - - CodeGraph 客户端监听子进程 stdin error,避免 EPIPE 未处理导致崩溃 - 移除 PI_TOOL_SEARCH/HERMES_MEMORY/RTK_CONFIG_PATH 环境变量入口,测试改用工厂 configPath 注入 - pi-subagents 固定 vitest / coverage-istanbul 4.1.10,修复 npm ls 版本冲突 - 补 pi-web-search / pi-worktree UPSTREAM.md 与 pi-minimal-footer AGENTS.md, files 白名单补齐并加测试;.codegraph/.gitignore 移出跟踪 - detect_kitty 优先识别官方安装目录 Generated with [Devin](https://devin.ai) Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
This commit is contained in:
co-authored by
Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
parent
56cbc83296
commit
f9a7f743dd
@@ -1,6 +1,6 @@
|
||||
import assert from "node:assert/strict";
|
||||
import { existsSync } from "node:fs";
|
||||
import { mkdir, mkdtemp, readFile } from "node:fs/promises";
|
||||
import { mkdir, mkdtemp, readFile, writeFile } from "node:fs/promises";
|
||||
import { tmpdir } from "node:os";
|
||||
import { dirname, join, resolve } from "node:path";
|
||||
import { fileURLToPath } from "node:url";
|
||||
@@ -292,9 +292,31 @@ test("all package extensions load together without global registration conflicts
|
||||
const home = await mkdtemp(join(tmpdir(), "my-pi-extension-load-"));
|
||||
const mockBin = join(home, "bin");
|
||||
await mkdir(mockBin, { recursive: true });
|
||||
const args = ["--no-extensions"];
|
||||
// Probe loaded LAST: records every registered tool (name + exposure) and the
|
||||
// final active set so the test can assert the pinned built-in codemode.
|
||||
const probeOutput = join(home, "probe-tools.json");
|
||||
const probePath = join(home, "probe.ts");
|
||||
await writeFile(
|
||||
probePath,
|
||||
[
|
||||
'import { writeFileSync } from "node:fs";',
|
||||
"export default function (pi: any): void {",
|
||||
'\tpi.on("session_start", () => {',
|
||||
"\t\twriteFileSync(",
|
||||
`\t\t\t${JSON.stringify(probeOutput)},`,
|
||||
"\t\t\tJSON.stringify({",
|
||||
"\t\t\t\tall: pi.getAllTools().map((tool: any) => ({ name: tool.name, exposure: tool.exposure })),",
|
||||
"\t\t\t\tactive: pi.getActiveTools(),",
|
||||
"\t\t\t}),",
|
||||
"\t\t);",
|
||||
"\t});",
|
||||
"}",
|
||||
"",
|
||||
].join("\n"),
|
||||
);
|
||||
const args = ["--no-extensions", "-e", "builtin:codemode"];
|
||||
for (const entry of packageJson.pi.extensions) args.push("-e", resolve(repositoryRoot, entry));
|
||||
args.push("--mode", "rpc");
|
||||
args.push("-e", probePath, "--mode", "rpc");
|
||||
|
||||
const loadEnvironment = {
|
||||
...process.env,
|
||||
@@ -313,4 +335,12 @@ test("all package extensions load together without global registration conflicts
|
||||
|
||||
assert.equal(result.status, 0, `${result.stdout}\n${result.stderr}`);
|
||||
assert.doesNotMatch(`${result.stdout}\n${result.stderr}`, /Failed to load extension|conflicts with/u);
|
||||
|
||||
const probe = JSON.parse(await readFile(probeOutput, "utf8")) as {
|
||||
all: { name: string; exposure?: string }[];
|
||||
active: string[];
|
||||
};
|
||||
const codemode = probe.all.find((tool) => tool.name === "codemode");
|
||||
assert.equal(codemode?.exposure, "model-only", "Pi's built-in codemode must load with model-only exposure");
|
||||
assert.ok(probe.active.includes("codemode"), "Tool Search must pin codemode into the active set");
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user