feat: add Pi as first-class Mosaic runtime (#339)
Some checks failed
ci/woodpecker/push/ci Pipeline was successful
ci/woodpecker/push/publish Pipeline failed

This commit was merged in pull request #339.
This commit is contained in:
2026-04-01 17:02:23 +00:00
parent 35123b21ce
commit be74ca3cf9
5 changed files with 36 additions and 2 deletions

View File

@@ -33,6 +33,12 @@ const RUNTIME_DEFS: Record<
versionFlag: 'version',
installHint: 'See https://opencode.ai for install instructions',
},
pi: {
label: 'Pi',
command: 'pi',
versionFlag: '--version',
installHint: 'npm install -g @mariozechner/pi-coding-agent',
},
};
export function detectRuntime(name: RuntimeName): RuntimeInfo {

View File

@@ -7,6 +7,7 @@ export function formatInstallInstructions(name: RuntimeName): string {
claude: 'Claude Code',
codex: 'Codex',
opencode: 'OpenCode',
pi: 'Pi',
};
return `To install ${labels[name]}:\n ${hint}`;
}

View File

@@ -16,6 +16,8 @@ export function configureMcpForRuntime(runtime: RuntimeName): void {
return configureCodexMcp();
case 'opencode':
return configureOpenCodeMcp();
case 'pi':
return configurePiMcp();
}
}
@@ -69,6 +71,31 @@ function configureCodexMcp(): void {
writeFileSync(configPath, content, 'utf-8');
}
function configurePiMcp(): void {
const settingsPath = join(homedir(), '.pi', 'agent', 'settings.json');
ensureDir(settingsPath);
let data: Record<string, unknown> = {};
if (existsSync(settingsPath)) {
try {
data = JSON.parse(readFileSync(settingsPath, 'utf-8')) as Record<string, unknown>;
} catch {
// Start fresh if corrupt
}
}
if (
!data['mcpServers'] ||
typeof data['mcpServers'] !== 'object' ||
Array.isArray(data['mcpServers'])
) {
data['mcpServers'] = {};
}
(data['mcpServers'] as Record<string, unknown>)['sequential-thinking'] = MCP_ENTRY;
writeFileSync(settingsPath, JSON.stringify(data, null, 2) + '\n', 'utf-8');
}
function configureOpenCodeMcp(): void {
const configPath = join(homedir(), '.config', 'opencode', 'config.json');
ensureDir(configPath);