chore: bump version to 3.15.0

This commit is contained in:
can1357
2026-01-05 04:47:32 +01:00
parent 21192e2056
commit 4cc8270ad5
17 changed files with 69 additions and 38 deletions
+11 -13
View File
@@ -20,7 +20,7 @@
},
"packages/agent": {
"name": "@oh-my-pi/pi-agent-core",
"version": "3.14.0",
"version": "3.15.0",
"dependencies": {
"@oh-my-pi/pi-ai": "workspace:*",
"@oh-my-pi/pi-tui": "workspace:*",
@@ -32,7 +32,7 @@
},
"packages/ai": {
"name": "@oh-my-pi/pi-ai",
"version": "3.14.0",
"version": "3.15.0",
"bin": {
"pi-ai": "./src/cli.ts",
},
@@ -56,7 +56,7 @@
},
"packages/coding-agent": {
"name": "@oh-my-pi/pi-coding-agent",
"version": "3.14.0",
"version": "3.15.0",
"bin": {
"omp": "src/cli.ts",
},
@@ -93,7 +93,7 @@
},
"packages/mom": {
"name": "@oh-my-pi/pi-mom",
"version": "3.14.0",
"version": "3.15.0",
"bin": {
"mom": "src/main.ts",
},
@@ -117,7 +117,7 @@
},
"packages/tui": {
"name": "@oh-my-pi/pi-tui",
"version": "3.14.0",
"version": "3.15.0",
"dependencies": {
"@types/mime-types": "^2.1.4",
"chalk": "^5.5.0",
@@ -132,7 +132,7 @@
},
"packages/web-ui": {
"name": "@oh-my-pi/pi-web-ui",
"version": "3.14.0",
"version": "3.15.0",
"dependencies": {
"@lmstudio/sdk": "^1.5.0",
"@oh-my-pi/pi-agent-core": "workspace:*",
@@ -1079,7 +1079,7 @@
"string-width-cjs": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="],
"string_decoder": ["string_decoder@1.1.1", "", { "dependencies": { "safe-buffer": "~5.1.0" } }, "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg=="],
"string_decoder": ["string_decoder@1.3.0", "", { "dependencies": { "safe-buffer": "~5.2.0" } }, "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA=="],
"strip-ansi": ["strip-ansi@7.1.2", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA=="],
@@ -1253,16 +1253,12 @@
"concurrently/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="],
"ecdsa-sig-formatter/safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="],
"form-data/mime-types": ["mime-types@2.1.35", "", { "dependencies": { "mime-db": "1.52.0" } }, "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw=="],
"jszip/readable-stream": ["readable-stream@2.3.8", "", { "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", "isarray": "~1.0.0", "process-nextick-args": "~2.0.0", "safe-buffer": "~5.1.1", "string_decoder": "~1.1.1", "util-deprecate": "~1.0.1" } }, "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA=="],
"jwa/safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="],
"jws/safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="],
"katex/commander": ["commander@8.3.0", "", {}, "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww=="],
"micromatch/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="],
@@ -1283,9 +1279,9 @@
"string-width-cjs/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="],
"strip-ansi-cjs/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="],
"string_decoder/safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="],
"tunnel-agent/safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="],
"strip-ansi-cjs/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="],
"wrap-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="],
@@ -1335,6 +1331,8 @@
"form-data/mime-types/mime-db": ["mime-db@1.52.0", "", {}, "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="],
"jszip/readable-stream/string_decoder": ["string_decoder@1.1.1", "", { "dependencies": { "safe-buffer": "~5.1.0" } }, "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg=="],
"rimraf/glob/jackspeak": ["jackspeak@3.4.3", "", { "dependencies": { "@isaacs/cliui": "^8.0.2" }, "optionalDependencies": { "@pkgjs/parseargs": "^0.11.0" } }, "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw=="],
"rimraf/glob/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="],
+2
View File
@@ -2,6 +2,8 @@
## [Unreleased]
## [3.15.0] - 2026-01-05
## [3.14.0] - 2026-01-04
## [3.13.1337] - 2026-01-04
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@oh-my-pi/pi-agent-core",
"version": "3.14.0",
"version": "3.15.0",
"description": "General-purpose agent with transport abstraction, state management, and attachment support",
"type": "module",
"main": "./src/index.ts",
+2 -2
View File
@@ -303,7 +303,7 @@ describe("agentLoop with AgentMessage", () => {
expect(toolStart).toBeDefined();
expect(toolEnd).toBeDefined();
if (toolEnd?.type === "tool_execution_end") {
expect(toolEnd.isError).toBe(false);
expect(toolEnd.isError).toBeFalsy();
}
});
@@ -393,7 +393,7 @@ describe("agentLoop with AgentMessage", () => {
(e): e is Extract<AgentEvent, { type: "tool_execution_end" }> => e.type === "tool_execution_end",
);
expect(toolEnds.length).toBe(2);
expect(toolEnds[0].isError).toBe(false);
expect(toolEnds[0].isError).toBeFalsy();
expect(toolEnds[1].isError).toBe(true);
if (toolEnds[1].result.content[0]?.type === "text") {
expect(toolEnds[1].result.content[0].text).toContain("Skipped due to queued user message");
+2
View File
@@ -1,6 +1,8 @@
# Changelog
## [Unreleased]
## [3.15.0] - 2026-01-05
### Changed
- Made `isError` field optional in `ToolResultMessage` interface, defaulting to non-error state
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@oh-my-pi/pi-ai",
"version": "3.14.0",
"version": "3.15.0",
"description": "Unified LLM API with automatic model discovery and provider configuration",
"type": "module",
"main": "./src/index.ts",
+2
View File
@@ -2,6 +2,8 @@
## [Unreleased]
## [3.15.0] - 2026-01-05
### Added
- Added spinner type variants (status and activity) with distinct animation frames per symbol preset
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@oh-my-pi/pi-coding-agent",
"version": "3.14.0",
"version": "3.15.0",
"description": "Coding agent CLI with read, bash, edit, write tools and session management",
"type": "module",
"ompConfig": {
+2
View File
@@ -2,6 +2,8 @@
## [Unreleased]
## [3.15.0] - 2026-01-05
## [3.14.0] - 2026-01-04
## [3.13.1337] - 2026-01-04
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@oh-my-pi/pi-mom",
"version": "3.14.0",
"version": "3.15.0",
"description": "Slack bot that delegates messages to the omp coding agent",
"type": "module",
"bin": {
+2
View File
@@ -2,6 +2,8 @@
## [Unreleased]
## [3.15.0] - 2026-01-05
### Added
- Added `inputCursor` symbol for customizing the text input cursor character
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@oh-my-pi/pi-tui",
"version": "3.14.0",
"version": "3.15.0",
"description": "Terminal User Interface library with differential rendering for efficient text-based applications",
"type": "module",
"main": "src/index.ts",
+3 -3
View File
@@ -531,8 +531,8 @@ describe("Editor component", () => {
});
expect(contentLines.length).toBe(2);
expect(contentLines[0]).toBe("日本語テス"); // 5 chars = 10 columns
// Last line has cursor (▏) which we need to strip
expect(contentLines[1]?.replace("▏", "")).toBe("ト"); // 1 char = 2 columns (+ cursor + padding)
// Last line has cursor (|) which we need to strip
expect(contentLines[1]?.replace("|", "")).toBe("ト"); // 1 char = 2 columns (+ cursor + padding)
});
it("handles mixed ASCII and wide characters in wrapping", () => {
@@ -561,7 +561,7 @@ describe("Editor component", () => {
// The cursor (blinking thin bar) should be visible
const contentLine = lines[1]!;
expect(contentLine.includes("\x1b[5m▏")).toBeTruthy();
expect(contentLine.includes("\x1b[5m|")).toBeTruthy();
// Line should still be correct width
expect(visibleWidth(contentLine)).toBe(width);
+13 -13
View File
@@ -117,8 +117,8 @@ describe("Markdown component", () => {
expect(plainLines.some((line) => line.includes("Alice"))).toBeTruthy();
expect(plainLines.some((line) => line.includes("Bob"))).toBeTruthy();
// Check for table borders
expect(plainLines.some((line) => line.includes("│"))).toBeTruthy();
expect(plainLines.some((line) => line.includes("─"))).toBeTruthy();
expect(plainLines.some((line) => line.includes("|"))).toBeTruthy();
expect(plainLines.some((line) => line.includes("-"))).toBeTruthy();
});
it("should render table with alignment", () => {
@@ -207,7 +207,7 @@ describe("Markdown component", () => {
const plainLines = lines.map((line) => line.replace(/\x1b\[[0-9;]*m/g, "").trimEnd());
// Should have multiple data rows due to wrapping
const dataRows = plainLines.filter((line) => line.startsWith("│") && !line.includes("─"));
const dataRows = plainLines.filter((line) => line.startsWith("|") && !line.includes("-"));
expect(dataRows.length > 2).toBeTruthy();
// All content should be preserved (may be split across lines)
@@ -240,15 +240,15 @@ describe("Markdown component", () => {
}
// Borders should stay intact (exactly 2 vertical borders for a 1-col table)
const tableLines = plainLines.filter((line) => line.startsWith("│"));
const tableLines = plainLines.filter((line) => line.startsWith("|"));
for (const line of tableLines) {
const borderCount = line.split("│").length - 1;
const borderCount = line.split("|").length - 1;
expect(borderCount).toBe(2);
}
// Strip box drawing characters + whitespace so we can assert the URL is preserved
// even if it was split across multiple wrapped lines.
const extracted = plainLines.join("").replace(/[│├┤─\s]/g, "");
const extracted = plainLines.join("").replace(/[|++-\s]/g, "");
expect(extracted.includes("prefix")).toBeTruthy();
expect(extracted.includes(url)).toBeTruthy();
});
@@ -276,9 +276,9 @@ describe("Markdown component", () => {
);
}
const tableLines = plainLines.filter((line) => line.startsWith("│"));
const tableLines = plainLines.filter((line) => line.startsWith("|"));
for (const line of tableLines) {
const borderCount = line.split("│").length - 1;
const borderCount = line.split("|").length - 1;
expect(borderCount).toBe(2);
}
});
@@ -323,9 +323,9 @@ describe("Markdown component", () => {
// Should have proper table structure
const headerLine = plainLines.find((line) => line.includes("A") && line.includes("B"));
expect(headerLine).toBeTruthy();
expect(headerLine?.includes("│")).toBeTruthy();
expect(headerLine?.includes("|")).toBeTruthy();
const separatorLine = plainLines.find((line) => line.includes("├") && line.includes("┼"));
const separatorLine = plainLines.find((line) => line.includes("+") && line.includes("+"));
expect(separatorLine).toBeTruthy();
const dataLine = plainLines.find((line) => line.includes("1") && line.includes("2"));
@@ -352,7 +352,7 @@ describe("Markdown component", () => {
}
// Table rows should have left padding
const tableRow = plainLines.find((line) => line.includes("│"));
const tableRow = plainLines.find((line) => line.includes("|"));
expect(tableRow?.startsWith(" ")).toBeTruthy();
});
});
@@ -384,7 +384,7 @@ describe("Markdown component", () => {
expect(plainLines.some((line) => line.includes(" - Nested item"))).toBeTruthy();
// Check table
expect(plainLines.some((line) => line.includes("Col1"))).toBeTruthy();
expect(plainLines.some((line) => line.includes("│"))).toBeTruthy();
expect(plainLines.some((line) => line.includes("|"))).toBeTruthy();
});
});
@@ -488,7 +488,7 @@ again, hello world`,
const lines = markdown.render(80);
const plainLines = lines.map((line) => line.replace(/\x1b\[[0-9;]*m/g, "").trimEnd());
const dividerIndex = plainLines.findIndex((line) => line.includes("─"));
const dividerIndex = plainLines.findIndex((line) => line.includes("-"));
expect(dividerIndex !== -1).toBeTruthy();
const afterDivider = plainLines.slice(dividerIndex + 1);
+2
View File
@@ -2,6 +2,8 @@
## [Unreleased]
## [3.15.0] - 2026-01-05
### Changed
- Resize large image attachments before sending (max 1920x1080 if dimension exceeds 2048) and convert >2MB images to JPEG
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@oh-my-pi/pi-web-ui",
"version": "3.14.0",
"version": "3.15.0",
"description": "Reusable web UI components for AI chat interfaces powered by @oh-my-pi/pi-ai",
"type": "module",
"main": "src/index.ts",
+22 -1
View File
@@ -88,6 +88,20 @@ async function cmdWatch(): Promise<void> {
process.exit(success ? 0 : 1);
}
function parseVersion(v: string): [number, number, number] {
const match = v.replace(/^v/, "").match(/^(\d+)\.(\d+)\.(\d+)/);
if (!match) throw new Error(`Invalid version: ${v}`);
return [parseInt(match[1]), parseInt(match[2]), parseInt(match[3])];
}
function compareVersions(a: string, b: string): number {
const [aMajor, aMinor, aPatch] = parseVersion(a);
const [bMajor, bMinor, bPatch] = parseVersion(b);
if (aMajor !== bMajor) return aMajor - bMajor;
if (aMinor !== bMinor) return aMinor - bMinor;
return aPatch - bPatch;
}
async function cmdRelease(version: string): Promise<void> {
console.log("\n=== Release Script ===\n");
@@ -107,7 +121,14 @@ async function cmdRelease(version: string): Promise<void> {
console.error(status);
process.exit(1);
}
console.log(" Working directory clean\n");
console.log(" Working directory clean");
const latestTag = (await $`git describe --tags --abbrev=0`.text()).trim();
if (compareVersions(version, latestTag) <= 0) {
console.error(`Error: Version ${version} must be greater than latest tag ${latestTag}`);
process.exit(1);
}
console.log(` Version ${version} > ${latestTag}\n`);
// 2. Update package versions
console.log(`Updating package versions to ${version}...`);