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).
Quick checklist
•Use Bun APIs first.•Use path.join/path.resolve for paths.•Prefer promise .catch(...) over try/catch when possible.