From a8347c3762881f03e096e484a72302302f025a65 Mon Sep 17 00:00:00 2001 From: Dax Date: Wed, 18 Feb 2026 19:20:03 -0500 Subject: [PATCH] refactor: migrate src/storage/db.ts from Bun.file() to statSync (#14124) --- .opencode/skill/bun-file-io/SKILL.md | 42 ---------------------------- packages/opencode/src/storage/db.ts | 4 +-- 2 files changed, 2 insertions(+), 44 deletions(-) delete mode 100644 .opencode/skill/bun-file-io/SKILL.md diff --git a/.opencode/skill/bun-file-io/SKILL.md b/.opencode/skill/bun-file-io/SKILL.md deleted file mode 100644 index f78de3309..000000000 --- a/.opencode/skill/bun-file-io/SKILL.md +++ /dev/null @@ -1,42 +0,0 @@ ---- -name: bun-file-io -description: Use this when you are working on file operations like reading, writing, scanning, or deleting files. It summarizes the preferred file APIs and patterns used in this repo. It also notes when to use filesystem helpers for directories. ---- - -## Use this when - -- Editing file I/O or scans in `packages/opencode` -- Handling directory operations or external tools - -## Bun file APIs (from Bun docs) - -- `Bun.file(path)` is lazy; call `text`, `json`, `stream`, `arrayBuffer`, `bytes`, `exists` to read. -- Metadata: `file.size`, `file.type`, `file.name`. -- `Bun.write(dest, input)` writes strings, buffers, Blobs, Responses, or files. -- `Bun.file(...).delete()` deletes a file. -- `file.writer()` returns a FileSink for incremental writes. -- `Bun.Glob` + `Array.fromAsync(glob.scan({ cwd, absolute, onlyFiles, dot }))` for scans. -- Use `Bun.which` to find a binary, then `Bun.spawn` to run it. -- `Bun.readableStreamToText/Bytes/JSON` for stream output. - -## When to use node:fs - -- Use `node:fs/promises` for directories (`mkdir`, `readdir`, recursive operations). - -## Repo patterns - -- Prefer Bun APIs over Node `fs` for file access. -- Check `Bun.file(...).exists()` before reading. -- For binary/large files use `arrayBuffer()` and MIME checks via `file.type`. -- Use `Bun.Glob` + `Array.fromAsync` for scans. -- Decode tool stderr with `Bun.readableStreamToText`. -- For large writes, use `Bun.write(Bun.file(path), text)`. - -NOTE: Bun.file(...).exists() will return `false` if the value is a directory. -Use Filesystem.exists(...) instead if path can be file or directory - -## Quick checklist - -- Use Bun APIs first. -- Use `path.join`/`path.resolve` for paths. -- Prefer promise `.catch(...)` over `try/catch` when possible. diff --git a/packages/opencode/src/storage/db.ts b/packages/opencode/src/storage/db.ts index 0974cbe7b..6d7bfd728 100644 --- a/packages/opencode/src/storage/db.ts +++ b/packages/opencode/src/storage/db.ts @@ -10,7 +10,7 @@ import { Log } from "../util/log" import { NamedError } from "@opencode-ai/util/error" import z from "zod" import path from "path" -import { readFileSync, readdirSync } from "fs" +import { readFileSync, readdirSync, existsSync } from "fs" import * as schema from "./schema" declare const OPENCODE_MIGRATIONS: { sql: string; timestamp: number }[] | undefined @@ -54,7 +54,7 @@ export namespace Database { const sql = dirs .map((name) => { const file = path.join(dir, name, "migration.sql") - if (!Bun.file(file).size) return + if (!existsSync(file)) return return { sql: readFileSync(file, "utf-8"), timestamp: time(name),