AgentSkillsCN

bun-patterns

掌握 Bun 运行时与包管理器的使用模式。无论是包管理、Bun.file、Bun.write、Bun.Glob、bun test、脚本编写、工作空间管理,还是从 npm/yarn/pnpm 迁移至 Bun,皆可灵活运用此技能。

SKILL.md
--- frontmatter
name: bun-patterns
description: Bun runtime and package manager patterns. Applies to package management, Bun.file, Bun.write, Bun.Glob, bun test, scripts, workspaces, or migrating from npm/yarn/pnpm.

Bun Patterns

Rules

PatternDoDon't
Packagesbun add <pkg>manually edit package.json
Node importsnode: protocol alwaysbare fs, path
File I/OBun.file(), Bun.write()Node.js fs sync methods
Globsnew Bun.Glob()readdirSync + statSync
Regextop-level constinline in functions

Commands

TaskCommand
Install allbun install
Add packagebun add <pkg>
Add devbun add -d <pkg>
Exact versionbun add --exact react@19.2.0
Removebun remove <pkg>
Run scriptbun run <script>
Execute TSbun <file.ts>
Testbun test
Outdatedbun outdated
Why installedbun pm ls <pkg>

Node.js → Bun API

Node.jsBun Native
readFileSync(path, 'utf-8')await Bun.file(path).text()
JSON.parse(readFileSync())await Bun.file(path).json()
writeFileSync(path, data)await Bun.write(path, data)
existsSync(path)await Bun.file(path).exists()
readdirSync() + statSync()new Bun.Glob(pattern)

File I/O

ts
// ✅ Bun native
const data = await Bun.file("data.json").json()
await Bun.write("output.json", JSON.stringify(data))
if (await Bun.file("config.json").exists()) { /* ... */ }

// ❌ Node.js fs
const content = readFileSync("data.json", "utf-8")
const data = JSON.parse(content)

Glob Pattern

ts
// ✅ Bun.Glob
const glob = new Bun.Glob("*/SKILL.md")
for (const file of glob.scanSync({ cwd: "skills" })) {
  const dirName = file.split("/")[0]
}

// ❌ readdirSync + statSync (many syscalls)

Node Protocol

ts
// ✅ always use node: protocol
import { readFileSync } from "node:fs"
import { resolve } from "node:path"

// ❌ bare imports
import { readFileSync } from "fs"

Top-Level Regex

ts
// ✅ compiled once
const MD_REGEX = /\.md$/
function extractTopic(fileName: string) {
  return fileName.replace(MD_REGEX, "")
}

// ❌ recreated each call
function extractTopic(fileName: string) {
  return fileName.replace(/\.md$/, "")
}

Testing

ts
import { describe, it, expect } from "bun:test"

describe("math", () => {
  it("adds", () => expect(1 + 1).toBe(2))
})

bun test · bun test --watch · bun test --coverage

Scripts

json
{
	"scripts": {
		"dev": "bun --hot src/index.ts",
		"build": "bun build src/index.ts --outdir ./dist",
		"test": "bun test",
		"typecheck": "tsc --noEmit"
	}
}

Workspaces

json
{ "workspaces": ["packages/*", "apps/*"] }

bun install installs all. bun run --filter @myapp/web dev targets one.

Migration from npm/yarn/pnpm

bash
rm package-lock.json yarn.lock pnpm-lock.yaml
bun install
git add bun.lockb

Other APIs

ts
// Password hashing
const hash = await Bun.password.hash("pwd")
const valid = await Bun.password.verify("pwd", hash)

// HTTP server
Bun.serve({ port: 3000, fetch: () => new Response("Hello") })

// Env (auto-loads .env)
const key = process.env.API_KEY

Troubleshooting

Binary packages failing: bun install --backend=hardlink