Release v0.13.1

This commit is contained in:
Mario Zechner 2025-12-06 23:12:36 +01:00
parent 2641424bfa
commit 95eadb9ed7
14 changed files with 132 additions and 35 deletions

View file

@ -2,6 +2,12 @@
## [Unreleased]
## [0.13.1] - 2025-12-06
### Added
- **Flexible Windows shell configuration**: The bash tool now supports multiple shell sources beyond Git Bash. Resolution order: (1) custom `shellPath` in settings.json, (2) Git Bash in standard locations, (3) any bash.exe on PATH. This enables Cygwin, MSYS2, and other bash environments. Configure with `~/.pi/agent/settings.json`: `{"shellPath": "C:\\cygwin64\\bin\\bash.exe"}`.
### Fixed
- **Windows binary detection**: Fixed Bun compiled binary detection on Windows by checking for URL-encoded `%7EBUN` in addition to `$bunfs` and `~BUN` in `import.meta.url`. This ensures the binary correctly locates supporting files (package.json, themes, etc.) next to the executable.

View file

@ -2,11 +2,12 @@
A radically simple and opinionated coding agent with multi-model support (including mid-session switching), a simple yet powerful CLI for headless coding tasks, and many creature comforts you might be used to from other coding agents.
Works on Linux, macOS, and Windows (barely tested, needs Git Bash running in the "modern" Windows Terminal).
Works on Linux, macOS, and Windows (needs a bash shell, see [Windows Shell Configuration](#windows-shell-configuration)).
## Table of Contents
- [Installation](#installation)
- [Windows Shell Configuration](#windows-shell-configuration)
- [Quick Start](#quick-start)
- [API Keys](#api-keys)
- [OAuth Authentication (Optional)](#oauth-authentication-optional)
@ -81,6 +82,29 @@ npm run build:binary
./dist/pi
```
## Windows Shell Configuration
On Windows, pi requires a bash shell. The following locations are checked in order:
1. **Custom shell path** from `~/.pi/agent/settings.json` (if configured)
2. **Git Bash** in standard locations (`C:\Program Files\Git\bin\bash.exe`)
3. **bash.exe on PATH** (Cygwin, MSYS2, WSL, etc.)
For most users, installing [Git for Windows](https://git-scm.com/download/win) is sufficient.
### Custom Shell Path
If you use Cygwin, MSYS2, or have bash in a non-standard location, add the path to your settings:
```json
// ~/.pi/agent/settings.json
{
"shellPath": "C:\\cygwin64\\bin\\bash.exe"
}
```
Alternatively, ensure your bash is on the system PATH.
## Quick Start
```bash

View file

@ -1,6 +1,6 @@
{
"name": "@mariozechner/pi-coding-agent",
"version": "0.13.0",
"version": "0.13.1",
"description": "Coding agent CLI with read, bash, edit, write tools and session management",
"type": "module",
"piConfig": {
@ -28,9 +28,9 @@
"prepublishOnly": "npm run clean && npm run build"
},
"dependencies": {
"@mariozechner/pi-agent-core": "^0.13.0",
"@mariozechner/pi-ai": "^0.13.0",
"@mariozechner/pi-tui": "^0.13.0",
"@mariozechner/pi-agent-core": "^0.13.1",
"@mariozechner/pi-ai": "^0.13.1",
"@mariozechner/pi-tui": "^0.13.1",
"chalk": "^5.5.0",
"diff": "^8.0.2",
"glob": "^11.0.3"

View file

@ -17,6 +17,7 @@ export interface Settings {
theme?: string;
compaction?: CompactionSettings;
hideThinkingBlock?: boolean;
shellPath?: string; // Custom shell path (e.g., for Cygwin users on Windows)
}
export class SettingsManager {
@ -153,4 +154,13 @@ export class SettingsManager {
this.settings.hideThinkingBlock = hide;
this.save();
}
getShellPath(): string | undefined {
return this.settings.shellPath;
}
setShellPath(path: string | undefined): void {
this.settings.shellPath = path;
this.save();
}
}

View file

@ -1,13 +1,57 @@
import type { AgentTool } from "@mariozechner/pi-ai";
import { Type } from "@sinclair/typebox";
import { spawn } from "child_process";
import { spawn, spawnSync } from "child_process";
import { existsSync } from "fs";
import { SettingsManager } from "../settings-manager.js";
let cachedShellConfig: { shell: string; args: string[] } | null = null;
/**
* Get shell configuration based on platform
* Find bash executable on PATH (Windows)
*/
function findBashOnPath(): string | null {
try {
const result = spawnSync("where", ["bash.exe"], { encoding: "utf-8", timeout: 5000 });
if (result.status === 0 && result.stdout) {
const firstMatch = result.stdout.trim().split(/\r?\n/)[0];
if (firstMatch && existsSync(firstMatch)) {
return firstMatch;
}
}
} catch {
// Ignore errors
}
return null;
}
/**
* Get shell configuration based on platform.
* Resolution order:
* 1. User-specified shellPath in settings.json
* 2. On Windows: Git Bash in known locations
* 3. Fallback: bash on PATH (Windows) or sh (Unix)
*/
function getShellConfig(): { shell: string; args: string[] } {
if (cachedShellConfig) {
return cachedShellConfig;
}
const settings = new SettingsManager();
const customShellPath = settings.getShellPath();
// 1. Check user-specified shell path
if (customShellPath) {
if (existsSync(customShellPath)) {
cachedShellConfig = { shell: customShellPath, args: ["-c"] };
return cachedShellConfig;
}
throw new Error(
`Custom shell path not found: ${customShellPath}\n` + `Please update shellPath in ~/.pi/agent/settings.json`,
);
}
if (process.platform === "win32") {
// 2. Try Git Bash in known locations
const paths: string[] = [];
const programFiles = process.env.ProgramFiles;
if (programFiles) {
@ -20,16 +64,29 @@ function getShellConfig(): { shell: string; args: string[] } {
for (const path of paths) {
if (existsSync(path)) {
return { shell: path, args: ["-c"] };
cachedShellConfig = { shell: path, args: ["-c"] };
return cachedShellConfig;
}
}
// 3. Fallback: search bash.exe on PATH (Cygwin, MSYS2, WSL, etc.)
const bashOnPath = findBashOnPath();
if (bashOnPath) {
cachedShellConfig = { shell: bashOnPath, args: ["-c"] };
return cachedShellConfig;
}
throw new Error(
`Git Bash not found. Please install Git for Windows from https://git-scm.com/download/win\n` +
`Searched in:\n${paths.map((p) => ` ${p}`).join("\n")}`,
`No bash shell found. Options:\n` +
` 1. Install Git for Windows: https://git-scm.com/download/win\n` +
` 2. Add your bash to PATH (Cygwin, MSYS2, etc.)\n` +
` 3. Set shellPath in ~/.pi/agent/settings.json\n\n` +
`Searched Git Bash in:\n${paths.map((p) => ` ${p}`).join("\n")}`,
);
}
return { shell: "sh", args: ["-c"] };
cachedShellConfig = { shell: "sh", args: ["-c"] };
return cachedShellConfig;
}
/**