refactor(fs): migrated remaining sync file operations to async

- Converted readdirSync, readFileSync, and statSync to async readdir, readFile, stat across skills and agent discovery.
- Made scanDirectoryForSkills async and refactored custom directory scanning to use Promise.all for concurrent processing.
- Updated agent discovery to use fs/promises for async file reading and refactored helper patterns.
- Added AgentParsingError exception class for better error handling during agent parsing.
- Added filesystem error type guards (isEnoent, isEacces, isPerm, etc.) to pi-utils for safe error checking.
- Added color manipulation utilities to pi-utils for accessibility features.
- Added color-blind mode setting to settings manager.
- Migrated plugins, settings, and config modules from sync to async file operations.
- Updated error handling to use new pi-utils type guards for type-safe checking.
This commit is contained in:
can1357
2026-01-24 03:18:03 +01:00
parent f66e5dba9b
commit e22d123009
190 changed files with 3800 additions and 2885 deletions
@@ -1,7 +1,6 @@
import { afterEach, beforeEach, describe, expect, it } from "bun:test";
import { rmSync } from "node:fs";
import { PythonKernel } from "@oh-my-pi/pi-coding-agent/ipy/kernel";
import { createTempDirSync, type SyncTempDir } from "@oh-my-pi/pi-utils";
import { TempDir } from "@oh-my-pi/pi-utils";
import type { Subprocess } from "bun";
type SpawnOptions = Parameters<typeof Bun.spawn>[1];
@@ -84,11 +83,11 @@ describe("PythonKernel gateway lifecycle", () => {
const originalGatewayToken = process.env.OMP_PYTHON_GATEWAY_TOKEN;
const originalBunEnv = process.env.BUN_ENV;
let tempDir: SyncTempDir;
let tempDir: TempDir;
let env: MockEnvironment;
beforeEach(() => {
tempDir = createTempDirSync("@omp-python-kernel-");
tempDir = TempDir.createSync("@omp-python-kernel-");
env = { fetchCalls: [], spawnCalls: [] };
process.env.BUN_ENV = "test";
@@ -121,7 +120,7 @@ describe("PythonKernel gateway lifecycle", () => {
afterEach(() => {
if (tempDir) {
rmSync(tempDir.path, { recursive: true, force: true });
tempDir.removeSync();
}
if (originalBunEnv === undefined) {
@@ -168,7 +167,7 @@ describe("PythonKernel gateway lifecycle", () => {
return createResponse({ ok: true }) as unknown as Response;
}) as typeof fetch;
const kernel = await PythonKernel.start({ cwd: tempDir.path, useSharedGateway: false });
const kernel = await PythonKernel.start({ cwd: tempDir.path(), useSharedGateway: false });
expect(env.spawnCalls).toHaveLength(1);
expect(env.spawnCalls[0].cmd).toEqual(
@@ -211,7 +210,7 @@ describe("PythonKernel gateway lifecycle", () => {
return createResponse({ ok: true }) as unknown as Response;
}) as typeof fetch;
await expect(PythonKernel.start({ cwd: tempDir.path, useSharedGateway: false })).rejects.toThrow(
await expect(PythonKernel.start({ cwd: tempDir.path(), useSharedGateway: false })).rejects.toThrow(
"Kernel gateway failed to start",
);
expect(env.spawnCalls).toHaveLength(3);
@@ -239,7 +238,7 @@ describe("PythonKernel gateway lifecycle", () => {
return createResponse({ ok: true }) as unknown as Response;
}) as typeof fetch;
const kernel = await PythonKernel.start({ cwd: tempDir.path });
const kernel = await PythonKernel.start({ cwd: tempDir.path() });
await expect(kernel.shutdown()).resolves.toBeUndefined();
});