chore(vendor): import pi 1.3.0

Imported as a linear vendor commit so forge rebases do not replay the upstream root tree.

git-subtree-dir: third_party/pi

git-subtree-split: 71023aec1546d6d677a65669c5665c0927ce0dd0
This commit is contained in:
2026-10-15 17:58:48 -04:00
parent 719370c8f7
commit 6081e3e325
1743 changed files with 205460 additions and 131705 deletions

View File

@@ -115,16 +115,6 @@ describe("parseArgs", () => {
expect(result.appendSystemPrompt).toEqual(["Context A", "Context B"]);
});
test("parses --mode", () => {
const result = parseArgs(["--mode", "json"]);
expect(result.mode).toBe("json");
});
test("parses --mode rpc", () => {
const result = parseArgs(["--mode", "rpc"]);
expect(result.mode).toBe("rpc");
});
test("parses --session", () => {
const result = parseArgs(["--session", "/path/to/session.jsonl"]);
expect(result.session).toBe("/path/to/session.jsonl");
@@ -155,6 +145,54 @@ describe("parseArgs", () => {
const result = parseArgs(["--models", "gpt-4o,claude-sonnet,gemini-pro"]);
expect(result.models).toEqual(["gpt-4o", "claude-sonnet", "gemini-pro"]);
});
// Issue #10334
test("ignores empty entries in --models", () => {
const result = parseArgs(["--models", "gpt-4o, ,claude-sonnet,"]);
expect(result.models).toEqual(["gpt-4o", "claude-sonnet"]);
});
});
// Issue #9045
describe("--mode flag", () => {
test.each(["text", "json", "rpc"] as const)("parses --mode %s", (mode) => {
const result = parseArgs(["--mode", mode]);
expect(result.mode).toBe(mode);
expect(result.diagnostics).toEqual([]);
});
test.each(["yaml", ""])("rejects invalid --mode value %j", (mode) => {
const result = parseArgs(["--mode", mode, "--version"]);
expect(result.mode).toBeUndefined();
expect(result.version).toBe(true);
expect(result.messages).toEqual([]);
expect(result.unknownFlags.size).toBe(0);
expect(result.diagnostics).toEqual([
{ type: "error", message: `Invalid mode "${mode}". Valid values: text, json, rpc` },
]);
});
test("reports a missing --mode value", () => {
const result = parseArgs(["--mode"]);
expect(result.mode).toBeUndefined();
expect(result.unknownFlags.size).toBe(0);
expect(result.diagnostics).toEqual([{ type: "error", message: "--mode requires text, json, or rpc" }]);
});
test("does not consume another option as a --mode value", () => {
const result = parseArgs(["--mode", "--version"]);
expect(result.mode).toBeUndefined();
expect(result.version).toBe(true);
expect(result.unknownFlags.size).toBe(0);
expect(result.diagnostics).toEqual([{ type: "error", message: "--mode requires text, json, or rpc" }]);
});
test("reports an invalid --mode value after a valid one", () => {
const result = parseArgs(["--mode", "json", "--mode", "yaml"]);
expect(result.diagnostics).toEqual([
{ type: "error", message: 'Invalid mode "yaml". Valid values: text, json, rpc' },
]);
});
});
describe("--name flag", () => {
@@ -244,6 +282,14 @@ describe("parseArgs", () => {
});
});
describe("--no-mcp flag", () => {
test("parses --no-mcp flag", () => {
const result = parseArgs(["--no-mcp"]);
expect(result.noMcp).toBe(true);
expect(result.unknownFlags.size).toBe(0);
});
});
describe("--skill flag", () => {
test("parses single --skill", () => {
const result = parseArgs(["--skill", "./skill-dir"]);
@@ -419,6 +465,31 @@ describe("parseArgs", () => {
expect(result.tools).toEqual(["read", "bash"]);
});
test("parses +name and -name tool modifiers", () => {
const result = parseArgs(["-t", "+codemode,-write"]);
expect(result.tools).toEqual(["+codemode", "-write"]);
expect(result.diagnostics).toEqual([]);
});
test("rejects tool names mixed with modifiers", () => {
const result = parseArgs(["--tools", "read,+codemode"]);
expect(result.tools).toBeUndefined();
expect(result.diagnostics).toEqual([
{ type: "error", message: "--tools: tool names cannot be mixed with +name or -name entries" },
]);
});
test("rejects patterns in tool modifiers", () => {
const result = parseArgs(["-t", "+mcp__radius__*"]);
expect(result.tools).toBeUndefined();
expect(result.diagnostics).toEqual([
{
type: "error",
message: "-t: +name and -name entries take exact tool names, not patterns: +mcp__radius__*",
},
]);
});
test("parses --exclude-tools flag", () => {
const result = parseArgs(["--exclude-tools", "read,bash"]);
expect(result.excludeTools).toEqual(["read", "bash"]);