start-vibing 2.0.11 → 2.0.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +177 -177
- package/dist/cli.js +19 -2
- package/package.json +42 -42
- package/template/.claude/CLAUDE.md +174 -174
- package/template/.claude/agents/01-orchestration/agent-selector.md +130 -130
- package/template/.claude/agents/01-orchestration/checkpoint-manager.md +142 -142
- package/template/.claude/agents/01-orchestration/context-manager.md +138 -138
- package/template/.claude/agents/01-orchestration/error-recovery.md +182 -182
- package/template/.claude/agents/01-orchestration/orchestrator.md +114 -114
- package/template/.claude/agents/01-orchestration/parallel-coordinator.md +141 -141
- package/template/.claude/agents/01-orchestration/task-decomposer.md +121 -121
- package/template/.claude/agents/01-orchestration/workflow-router.md +114 -114
- package/template/.claude/agents/02-typescript/bun-runtime-expert.md +197 -197
- package/template/.claude/agents/02-typescript/esm-resolver.md +193 -193
- package/template/.claude/agents/02-typescript/import-alias-enforcer.md +158 -158
- package/template/.claude/agents/02-typescript/ts-generics-helper.md +183 -183
- package/template/.claude/agents/02-typescript/ts-migration-helper.md +238 -238
- package/template/.claude/agents/02-typescript/ts-strict-checker.md +180 -180
- package/template/.claude/agents/02-typescript/ts-types-analyzer.md +199 -199
- package/template/.claude/agents/02-typescript/type-definition-writer.md +187 -187
- package/template/.claude/agents/02-typescript/zod-schema-designer.md +212 -212
- package/template/.claude/agents/02-typescript/zod-validator.md +158 -158
- package/template/.claude/agents/03-testing/playwright-assertions.md +265 -265
- package/template/.claude/agents/03-testing/playwright-e2e.md +247 -247
- package/template/.claude/agents/03-testing/playwright-fixtures.md +234 -234
- package/template/.claude/agents/03-testing/playwright-multi-viewport.md +256 -256
- package/template/.claude/agents/03-testing/playwright-page-objects.md +247 -247
- package/template/.claude/agents/03-testing/test-cleanup-manager.md +248 -248
- package/template/.claude/agents/03-testing/test-data-generator.md +254 -254
- package/template/.claude/agents/03-testing/tester-integration.md +278 -278
- package/template/.claude/agents/03-testing/tester-unit.md +207 -207
- package/template/.claude/agents/03-testing/vitest-config.md +287 -287
- package/template/.claude/agents/04-docker/container-health.md +255 -255
- package/template/.claude/agents/04-docker/deployment-validator.md +225 -225
- package/template/.claude/agents/04-docker/docker-compose-designer.md +281 -281
- package/template/.claude/agents/04-docker/docker-env-manager.md +235 -235
- package/template/.claude/agents/04-docker/docker-multi-stage.md +241 -241
- package/template/.claude/agents/04-docker/dockerfile-optimizer.md +208 -208
- package/template/.claude/agents/05-database/database-seeder.md +273 -273
- package/template/.claude/agents/05-database/mongodb-query-optimizer.md +230 -230
- package/template/.claude/agents/05-database/mongoose-aggregation.md +306 -306
- package/template/.claude/agents/05-database/mongoose-index-optimizer.md +182 -182
- package/template/.claude/agents/05-database/mongoose-schema-designer.md +267 -267
- package/template/.claude/agents/06-security/auth-session-validator.md +68 -68
- package/template/.claude/agents/06-security/input-sanitizer.md +80 -80
- package/template/.claude/agents/06-security/owasp-checker.md +97 -97
- package/template/.claude/agents/06-security/permission-auditor.md +100 -100
- package/template/.claude/agents/06-security/security-auditor.md +84 -84
- package/template/.claude/agents/06-security/sensitive-data-scanner.md +83 -83
- package/template/.claude/agents/07-documentation/api-documenter.md +136 -136
- package/template/.claude/agents/07-documentation/changelog-manager.md +105 -105
- package/template/.claude/agents/07-documentation/documenter.md +76 -76
- package/template/.claude/agents/07-documentation/domain-updater.md +81 -81
- package/template/.claude/agents/07-documentation/jsdoc-generator.md +114 -114
- package/template/.claude/agents/07-documentation/readme-generator.md +135 -135
- package/template/.claude/agents/08-git/branch-manager.md +58 -58
- package/template/.claude/agents/08-git/commit-manager.md +63 -63
- package/template/.claude/agents/08-git/pr-creator.md +76 -76
- package/template/.claude/agents/09-quality/code-reviewer.md +71 -71
- package/template/.claude/agents/09-quality/quality-checker.md +67 -67
- package/template/.claude/agents/10-research/best-practices-finder.md +89 -89
- package/template/.claude/agents/10-research/competitor-analyzer.md +106 -106
- package/template/.claude/agents/10-research/pattern-researcher.md +93 -93
- package/template/.claude/agents/10-research/research-cache-manager.md +76 -76
- package/template/.claude/agents/10-research/research-web.md +98 -98
- package/template/.claude/agents/10-research/tech-evaluator.md +101 -101
- package/template/.claude/agents/11-ui-ux/accessibility-auditor.md +136 -136
- package/template/.claude/agents/11-ui-ux/design-system-enforcer.md +125 -125
- package/template/.claude/agents/11-ui-ux/skeleton-generator.md +118 -118
- package/template/.claude/agents/11-ui-ux/ui-desktop.md +132 -132
- package/template/.claude/agents/11-ui-ux/ui-mobile.md +98 -98
- package/template/.claude/agents/11-ui-ux/ui-tablet.md +110 -110
- package/template/.claude/agents/12-performance/api-latency-analyzer.md +156 -156
- package/template/.claude/agents/12-performance/bundle-analyzer.md +113 -113
- package/template/.claude/agents/12-performance/memory-leak-detector.md +137 -137
- package/template/.claude/agents/12-performance/performance-profiler.md +115 -115
- package/template/.claude/agents/12-performance/query-optimizer.md +124 -124
- package/template/.claude/agents/12-performance/render-optimizer.md +154 -154
- package/template/.claude/agents/13-debugging/build-error-fixer.md +207 -207
- package/template/.claude/agents/13-debugging/debugger.md +149 -149
- package/template/.claude/agents/13-debugging/error-stack-analyzer.md +141 -141
- package/template/.claude/agents/13-debugging/network-debugger.md +208 -208
- package/template/.claude/agents/13-debugging/runtime-error-fixer.md +181 -181
- package/template/.claude/agents/13-debugging/type-error-resolver.md +185 -185
- package/template/.claude/agents/14-validation/final-validator.md +93 -93
- package/template/.claude/agents/_backup/analyzer.md +134 -134
- package/template/.claude/agents/_backup/code-reviewer.md +279 -279
- package/template/.claude/agents/_backup/commit-manager.md +219 -219
- package/template/.claude/agents/_backup/debugger.md +280 -280
- package/template/.claude/agents/_backup/documenter.md +237 -237
- package/template/.claude/agents/_backup/domain-updater.md +197 -197
- package/template/.claude/agents/_backup/final-validator.md +169 -169
- package/template/.claude/agents/_backup/orchestrator.md +149 -149
- package/template/.claude/agents/_backup/performance.md +232 -232
- package/template/.claude/agents/_backup/quality-checker.md +240 -240
- package/template/.claude/agents/_backup/research.md +315 -315
- package/template/.claude/agents/_backup/security-auditor.md +192 -192
- package/template/.claude/agents/_backup/tester.md +566 -566
- package/template/.claude/agents/_backup/ui-ux-reviewer.md +247 -247
- package/template/.claude/config/README.md +30 -30
- package/template/.claude/config/mcp-config.json +344 -344
- package/template/.claude/config/project-config.json +53 -53
- package/template/.claude/config/quality-gates.json +46 -46
- package/template/.claude/config/security-rules.json +45 -45
- package/template/.claude/config/testing-config.json +164 -164
- package/template/.claude/hooks/SETUP.md +126 -126
- package/template/.claude/hooks/run-hook.ts +176 -176
- package/template/.claude/hooks/stop-validator.ts +914 -824
- package/template/.claude/hooks/user-prompt-submit.ts +886 -886
- package/template/.claude/scripts/mcp-quick-install.ts +151 -151
- package/template/.claude/scripts/setup-mcps.ts +651 -651
- package/template/.claude/settings.json +275 -275
- package/template/.claude/skills/bun-runtime/SKILL.md +430 -430
- package/template/.claude/skills/codebase-knowledge/domains/claude-system.md +431 -431
- package/template/.claude/skills/codebase-knowledge/domains/mcp-integration.md +295 -295
- package/template/.claude/skills/debugging-patterns/SKILL.md +485 -485
- package/template/.claude/skills/docker-patterns/SKILL.md +555 -555
- package/template/.claude/skills/git-workflow/SKILL.md +454 -454
- package/template/.claude/skills/mongoose-patterns/SKILL.md +499 -499
- package/template/.claude/skills/nextjs-app-router/SKILL.md +327 -327
- package/template/.claude/skills/performance-patterns/SKILL.md +547 -547
- package/template/.claude/skills/playwright-automation/SKILL.md +438 -438
- package/template/.claude/skills/react-patterns/SKILL.md +389 -389
- package/template/.claude/skills/research-cache/SKILL.md +222 -222
- package/template/.claude/skills/shadcn-ui/SKILL.md +511 -511
- package/template/.claude/skills/tailwind-patterns/SKILL.md +465 -465
- package/template/.claude/skills/test-coverage/SKILL.md +467 -467
- package/template/.claude/skills/trpc-api/SKILL.md +434 -434
- package/template/.claude/skills/typescript-strict/SKILL.md +367 -367
- package/template/.claude/skills/zod-validation/SKILL.md +403 -403
- package/template/CLAUDE.md +117 -117
|
@@ -1,430 +1,430 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: bun-runtime
|
|
3
|
-
description: Bun runtime patterns and best practices. Package management, bundling, testing, scripts. Use when working with Bun as the JavaScript runtime.
|
|
4
|
-
allowed-tools: Read, Write, Edit, Bash, Grep, Glob
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
# Bun Runtime - Fast JavaScript Runtime
|
|
8
|
-
|
|
9
|
-
## Purpose
|
|
10
|
-
|
|
11
|
-
Expert guidance for Bun:
|
|
12
|
-
|
|
13
|
-
- **Package Management** - Fast installation
|
|
14
|
-
- **Bundling** - Built-in bundler
|
|
15
|
-
- **Testing** - Vitest-compatible runner
|
|
16
|
-
- **Scripts** - Task runner
|
|
17
|
-
- **APIs** - Bun-specific features
|
|
18
|
-
|
|
19
|
-
---
|
|
20
|
-
|
|
21
|
-
## Package Management
|
|
22
|
-
|
|
23
|
-
### Install Dependencies
|
|
24
|
-
|
|
25
|
-
```bash
|
|
26
|
-
# Install all dependencies
|
|
27
|
-
bun install
|
|
28
|
-
|
|
29
|
-
# Add dependency
|
|
30
|
-
bun add zod mongoose
|
|
31
|
-
|
|
32
|
-
# Add dev dependency
|
|
33
|
-
bun add -D typescript @types/node
|
|
34
|
-
|
|
35
|
-
# Add exact version
|
|
36
|
-
bun add react@18.2.0
|
|
37
|
-
|
|
38
|
-
# Add from GitHub
|
|
39
|
-
bun add github:user/repo
|
|
40
|
-
|
|
41
|
-
# Remove dependency
|
|
42
|
-
bun remove lodash
|
|
43
|
-
|
|
44
|
-
# Update dependencies
|
|
45
|
-
bun update
|
|
46
|
-
|
|
47
|
-
# Update specific package
|
|
48
|
-
bun update react
|
|
49
|
-
```
|
|
50
|
-
|
|
51
|
-
### bunfig.toml
|
|
52
|
-
|
|
53
|
-
```toml
|
|
54
|
-
# bunfig.toml
|
|
55
|
-
[install]
|
|
56
|
-
# Disable postinstall scripts for security
|
|
57
|
-
ignorescripts = true
|
|
58
|
-
|
|
59
|
-
# Registry configuration
|
|
60
|
-
registry = "https://registry.npmjs.org"
|
|
61
|
-
|
|
62
|
-
# Install settings
|
|
63
|
-
frozen-lockfile = true
|
|
64
|
-
|
|
65
|
-
[run]
|
|
66
|
-
# Shell for scripts
|
|
67
|
-
shell = "bash"
|
|
68
|
-
```
|
|
69
|
-
|
|
70
|
-
---
|
|
71
|
-
|
|
72
|
-
## Script Commands
|
|
73
|
-
|
|
74
|
-
### package.json Scripts
|
|
75
|
-
|
|
76
|
-
```json
|
|
77
|
-
{
|
|
78
|
-
"scripts": {
|
|
79
|
-
"dev": "bun run --hot src/index.ts",
|
|
80
|
-
"start": "bun run src/index.ts",
|
|
81
|
-
"build": "bun build src/index.ts --outdir dist",
|
|
82
|
-
"typecheck": "bunx tsc --noEmit",
|
|
83
|
-
"lint": "bunx eslint . --ext .ts,.tsx",
|
|
84
|
-
"lint:fix": "bunx eslint . --ext .ts,.tsx --fix",
|
|
85
|
-
"test": "bun test",
|
|
86
|
-
"test:watch": "bun test --watch",
|
|
87
|
-
"test:coverage": "bun test --coverage"
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
```
|
|
91
|
-
|
|
92
|
-
### Running Scripts
|
|
93
|
-
|
|
94
|
-
```bash
|
|
95
|
-
# Run script
|
|
96
|
-
bun run dev
|
|
97
|
-
bun run build
|
|
98
|
-
|
|
99
|
-
# Shorthand (without "run")
|
|
100
|
-
bun dev
|
|
101
|
-
bun build
|
|
102
|
-
|
|
103
|
-
# Run TypeScript directly
|
|
104
|
-
bun run src/index.ts
|
|
105
|
-
|
|
106
|
-
# Hot reload
|
|
107
|
-
bun run --hot src/index.ts
|
|
108
|
-
|
|
109
|
-
# Watch mode
|
|
110
|
-
bun run --watch src/index.ts
|
|
111
|
-
```
|
|
112
|
-
|
|
113
|
-
---
|
|
114
|
-
|
|
115
|
-
## Bundling
|
|
116
|
-
|
|
117
|
-
### Basic Bundle
|
|
118
|
-
|
|
119
|
-
```bash
|
|
120
|
-
# Bundle for browser
|
|
121
|
-
bun build ./src/index.ts --outdir ./dist
|
|
122
|
-
|
|
123
|
-
# Minify
|
|
124
|
-
bun build ./src/index.ts --outdir ./dist --minify
|
|
125
|
-
|
|
126
|
-
# Source maps
|
|
127
|
-
bun build ./src/index.ts --outdir ./dist --sourcemap
|
|
128
|
-
|
|
129
|
-
# Target
|
|
130
|
-
bun build ./src/index.ts --outdir ./dist --target=browser
|
|
131
|
-
bun build ./src/index.ts --outdir ./dist --target=node
|
|
132
|
-
bun build ./src/index.ts --outdir ./dist --target=bun
|
|
133
|
-
```
|
|
134
|
-
|
|
135
|
-
### Build API
|
|
136
|
-
|
|
137
|
-
```typescript
|
|
138
|
-
// build.ts
|
|
139
|
-
const result = await Bun.build({
|
|
140
|
-
entrypoints: ['./src/index.ts'],
|
|
141
|
-
outdir: './dist',
|
|
142
|
-
target: 'browser',
|
|
143
|
-
minify: true,
|
|
144
|
-
sourcemap: 'external',
|
|
145
|
-
splitting: true,
|
|
146
|
-
format: 'esm',
|
|
147
|
-
define: {
|
|
148
|
-
'process.env.NODE_ENV': '"production"',
|
|
149
|
-
},
|
|
150
|
-
external: ['react', 'react-dom'],
|
|
151
|
-
});
|
|
152
|
-
|
|
153
|
-
if (!result.success) {
|
|
154
|
-
console.error('Build failed:');
|
|
155
|
-
for (const log of result.logs) {
|
|
156
|
-
console.error(log);
|
|
157
|
-
}
|
|
158
|
-
process.exit(1);
|
|
159
|
-
}
|
|
160
|
-
```
|
|
161
|
-
|
|
162
|
-
---
|
|
163
|
-
|
|
164
|
-
## Testing (Vitest-compatible)
|
|
165
|
-
|
|
166
|
-
### Test Configuration
|
|
167
|
-
|
|
168
|
-
```typescript
|
|
169
|
-
// bunfig.toml
|
|
170
|
-
[test];
|
|
171
|
-
preload = ['./tests/setup.ts'];
|
|
172
|
-
coverage = true;
|
|
173
|
-
```
|
|
174
|
-
|
|
175
|
-
### Test File
|
|
176
|
-
|
|
177
|
-
```typescript
|
|
178
|
-
// tests/example.test.ts
|
|
179
|
-
import { describe, test, expect, beforeEach, afterEach } from 'bun:test';
|
|
180
|
-
|
|
181
|
-
describe('Feature', () => {
|
|
182
|
-
beforeEach(() => {
|
|
183
|
-
// Setup
|
|
184
|
-
});
|
|
185
|
-
|
|
186
|
-
afterEach(() => {
|
|
187
|
-
// Cleanup
|
|
188
|
-
});
|
|
189
|
-
|
|
190
|
-
test('should work correctly', () => {
|
|
191
|
-
const result = 1 + 1;
|
|
192
|
-
expect(result).toBe(2);
|
|
193
|
-
});
|
|
194
|
-
|
|
195
|
-
test('async operations', async () => {
|
|
196
|
-
const data = await fetchData();
|
|
197
|
-
expect(data).toBeDefined();
|
|
198
|
-
});
|
|
199
|
-
});
|
|
200
|
-
```
|
|
201
|
-
|
|
202
|
-
### Mocking
|
|
203
|
-
|
|
204
|
-
```typescript
|
|
205
|
-
import { mock, spyOn } from 'bun:test';
|
|
206
|
-
|
|
207
|
-
// Mock function
|
|
208
|
-
const mockFn = mock((x: number) => x * 2);
|
|
209
|
-
mockFn(5);
|
|
210
|
-
expect(mockFn).toHaveBeenCalledWith(5);
|
|
211
|
-
expect(mockFn).toHaveReturnedWith(10);
|
|
212
|
-
|
|
213
|
-
// Spy on existing function
|
|
214
|
-
const spy = spyOn(console, 'log');
|
|
215
|
-
console.log('test');
|
|
216
|
-
expect(spy).toHaveBeenCalledWith('test');
|
|
217
|
-
```
|
|
218
|
-
|
|
219
|
-
---
|
|
220
|
-
|
|
221
|
-
## Bun APIs
|
|
222
|
-
|
|
223
|
-
### File System
|
|
224
|
-
|
|
225
|
-
```typescript
|
|
226
|
-
// Read file
|
|
227
|
-
const text = await Bun.file('path/to/file.txt').text();
|
|
228
|
-
const json = await Bun.file('path/to/file.json').json();
|
|
229
|
-
const buffer = await Bun.file('path/to/file.bin').arrayBuffer();
|
|
230
|
-
|
|
231
|
-
// Write file
|
|
232
|
-
await Bun.write('output.txt', 'Hello, World!');
|
|
233
|
-
await Bun.write('output.json', JSON.stringify({ hello: 'world' }));
|
|
234
|
-
|
|
235
|
-
// File info
|
|
236
|
-
const file = Bun.file('file.txt');
|
|
237
|
-
console.log(file.size);
|
|
238
|
-
console.log(file.type);
|
|
239
|
-
```
|
|
240
|
-
|
|
241
|
-
### HTTP Server
|
|
242
|
-
|
|
243
|
-
```typescript
|
|
244
|
-
// Simple server
|
|
245
|
-
Bun.serve({
|
|
246
|
-
port: 3000,
|
|
247
|
-
fetch(request) {
|
|
248
|
-
const url = new URL(request.url);
|
|
249
|
-
|
|
250
|
-
if (url.pathname === '/api/hello') {
|
|
251
|
-
return Response.json({ message: 'Hello!' });
|
|
252
|
-
}
|
|
253
|
-
|
|
254
|
-
return new Response('Not Found', { status: 404 });
|
|
255
|
-
},
|
|
256
|
-
});
|
|
257
|
-
|
|
258
|
-
// With WebSocket
|
|
259
|
-
Bun.serve({
|
|
260
|
-
port: 3000,
|
|
261
|
-
fetch(request, server) {
|
|
262
|
-
if (server.upgrade(request)) {
|
|
263
|
-
return;
|
|
264
|
-
}
|
|
265
|
-
return new Response('Upgrade failed', { status: 500 });
|
|
266
|
-
},
|
|
267
|
-
websocket: {
|
|
268
|
-
open(ws) {
|
|
269
|
-
console.log('Client connected');
|
|
270
|
-
},
|
|
271
|
-
message(ws, message) {
|
|
272
|
-
ws.send(`Echo: ${message}`);
|
|
273
|
-
},
|
|
274
|
-
close(ws) {
|
|
275
|
-
console.log('Client disconnected');
|
|
276
|
-
},
|
|
277
|
-
},
|
|
278
|
-
});
|
|
279
|
-
```
|
|
280
|
-
|
|
281
|
-
### Subprocess
|
|
282
|
-
|
|
283
|
-
```typescript
|
|
284
|
-
// Run command
|
|
285
|
-
const result = Bun.spawn(['echo', 'Hello']);
|
|
286
|
-
await result.exited;
|
|
287
|
-
|
|
288
|
-
// Capture output
|
|
289
|
-
const proc = Bun.spawn(['git', 'status'], {
|
|
290
|
-
stdout: 'pipe',
|
|
291
|
-
});
|
|
292
|
-
const output = await new Response(proc.stdout).text();
|
|
293
|
-
|
|
294
|
-
// With stdin
|
|
295
|
-
const proc = Bun.spawn(['cat'], {
|
|
296
|
-
stdin: 'pipe',
|
|
297
|
-
stdout: 'pipe',
|
|
298
|
-
});
|
|
299
|
-
proc.stdin.write('Hello from stdin!');
|
|
300
|
-
proc.stdin.end();
|
|
301
|
-
```
|
|
302
|
-
|
|
303
|
-
### Password Hashing
|
|
304
|
-
|
|
305
|
-
```typescript
|
|
306
|
-
// Hash password
|
|
307
|
-
const hash = await Bun.password.hash('my-password', {
|
|
308
|
-
algorithm: 'bcrypt',
|
|
309
|
-
cost: 10,
|
|
310
|
-
});
|
|
311
|
-
|
|
312
|
-
// Verify password
|
|
313
|
-
const isValid = await Bun.password.verify('my-password', hash);
|
|
314
|
-
```
|
|
315
|
-
|
|
316
|
-
### Environment Variables
|
|
317
|
-
|
|
318
|
-
```typescript
|
|
319
|
-
// Access env vars
|
|
320
|
-
const apiKey = Bun.env['API_KEY'];
|
|
321
|
-
const nodeEnv = Bun.env['NODE_ENV'] ?? 'development';
|
|
322
|
-
|
|
323
|
-
// Set env vars
|
|
324
|
-
Bun.env['CUSTOM_VAR'] = 'value';
|
|
325
|
-
```
|
|
326
|
-
|
|
327
|
-
---
|
|
328
|
-
|
|
329
|
-
## Performance Tips
|
|
330
|
-
|
|
331
|
-
### Use Native APIs
|
|
332
|
-
|
|
333
|
-
```typescript
|
|
334
|
-
// Prefer Bun APIs over Node.js equivalents
|
|
335
|
-
|
|
336
|
-
// File reading
|
|
337
|
-
// Node.js way (slower)
|
|
338
|
-
import { readFile } from 'fs/promises';
|
|
339
|
-
const content = await readFile('file.txt', 'utf-8');
|
|
340
|
-
|
|
341
|
-
// Bun way (faster)
|
|
342
|
-
const content = await Bun.file('file.txt').text();
|
|
343
|
-
```
|
|
344
|
-
|
|
345
|
-
### Import Optimization
|
|
346
|
-
|
|
347
|
-
```typescript
|
|
348
|
-
// Use namespace imports for tree-shaking
|
|
349
|
-
import * as z from 'zod';
|
|
350
|
-
|
|
351
|
-
// Avoid dynamic imports in hot paths
|
|
352
|
-
// Bad:
|
|
353
|
-
async function validate(data: unknown) {
|
|
354
|
-
const { z } = await import('zod');
|
|
355
|
-
return z.object({}).parse(data);
|
|
356
|
-
}
|
|
357
|
-
|
|
358
|
-
// Good:
|
|
359
|
-
import { z } from 'zod';
|
|
360
|
-
function validate(data: unknown) {
|
|
361
|
-
return z.object({}).parse(data);
|
|
362
|
-
}
|
|
363
|
-
```
|
|
364
|
-
|
|
365
|
-
### Bundle for Production
|
|
366
|
-
|
|
367
|
-
```bash
|
|
368
|
-
# Compile to single executable
|
|
369
|
-
bun build --compile ./src/index.ts --outfile myapp
|
|
370
|
-
|
|
371
|
-
# Run compiled binary
|
|
372
|
-
./myapp
|
|
373
|
-
```
|
|
374
|
-
|
|
375
|
-
---
|
|
376
|
-
|
|
377
|
-
## Docker Integration
|
|
378
|
-
|
|
379
|
-
```dockerfile
|
|
380
|
-
# Use Bun official image
|
|
381
|
-
FROM oven/bun:1-alpine AS base
|
|
382
|
-
|
|
383
|
-
# Install dependencies
|
|
384
|
-
FROM base AS deps
|
|
385
|
-
WORKDIR /app
|
|
386
|
-
COPY package.json bun.lockb ./
|
|
387
|
-
RUN bun install --frozen-lockfile
|
|
388
|
-
|
|
389
|
-
# Build
|
|
390
|
-
FROM base AS builder
|
|
391
|
-
WORKDIR /app
|
|
392
|
-
COPY --from=deps /app/node_modules ./node_modules
|
|
393
|
-
COPY . .
|
|
394
|
-
RUN bun run build
|
|
395
|
-
|
|
396
|
-
# Runtime
|
|
397
|
-
FROM base AS runner
|
|
398
|
-
WORKDIR /app
|
|
399
|
-
COPY --from=builder /app/dist ./dist
|
|
400
|
-
COPY --from=builder /app/package.json ./
|
|
401
|
-
|
|
402
|
-
EXPOSE 3000
|
|
403
|
-
CMD ["bun", "run", "dist/index.js"]
|
|
404
|
-
```
|
|
405
|
-
|
|
406
|
-
---
|
|
407
|
-
|
|
408
|
-
## Agent Integration
|
|
409
|
-
|
|
410
|
-
This skill is used by:
|
|
411
|
-
|
|
412
|
-
- **bun-runtime-expert** agent
|
|
413
|
-
- **quality-checker** for running tests
|
|
414
|
-
- **build-error-fixer** for build issues
|
|
415
|
-
- **dockerfile-optimizer** for Docker builds
|
|
416
|
-
|
|
417
|
-
---
|
|
418
|
-
|
|
419
|
-
## FORBIDDEN
|
|
420
|
-
|
|
421
|
-
1. **`npm` commands** - Use `bun` instead
|
|
422
|
-
2. **Node.js fs when Bun.file works** - Use native APIs
|
|
423
|
-
3. **Ignoring lockfile** - Always use `--frozen-lockfile` in CI
|
|
424
|
-
4. **Skipping typecheck** - Run `bunx tsc --noEmit`
|
|
425
|
-
|
|
426
|
-
---
|
|
427
|
-
|
|
428
|
-
## Version
|
|
429
|
-
|
|
430
|
-
- **v1.0.0** - Initial implementation based on Bun 1.x patterns
|
|
1
|
+
---
|
|
2
|
+
name: bun-runtime
|
|
3
|
+
description: Bun runtime patterns and best practices. Package management, bundling, testing, scripts. Use when working with Bun as the JavaScript runtime.
|
|
4
|
+
allowed-tools: Read, Write, Edit, Bash, Grep, Glob
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Bun Runtime - Fast JavaScript Runtime
|
|
8
|
+
|
|
9
|
+
## Purpose
|
|
10
|
+
|
|
11
|
+
Expert guidance for Bun:
|
|
12
|
+
|
|
13
|
+
- **Package Management** - Fast installation
|
|
14
|
+
- **Bundling** - Built-in bundler
|
|
15
|
+
- **Testing** - Vitest-compatible runner
|
|
16
|
+
- **Scripts** - Task runner
|
|
17
|
+
- **APIs** - Bun-specific features
|
|
18
|
+
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
## Package Management
|
|
22
|
+
|
|
23
|
+
### Install Dependencies
|
|
24
|
+
|
|
25
|
+
```bash
|
|
26
|
+
# Install all dependencies
|
|
27
|
+
bun install
|
|
28
|
+
|
|
29
|
+
# Add dependency
|
|
30
|
+
bun add zod mongoose
|
|
31
|
+
|
|
32
|
+
# Add dev dependency
|
|
33
|
+
bun add -D typescript @types/node
|
|
34
|
+
|
|
35
|
+
# Add exact version
|
|
36
|
+
bun add react@18.2.0
|
|
37
|
+
|
|
38
|
+
# Add from GitHub
|
|
39
|
+
bun add github:user/repo
|
|
40
|
+
|
|
41
|
+
# Remove dependency
|
|
42
|
+
bun remove lodash
|
|
43
|
+
|
|
44
|
+
# Update dependencies
|
|
45
|
+
bun update
|
|
46
|
+
|
|
47
|
+
# Update specific package
|
|
48
|
+
bun update react
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
### bunfig.toml
|
|
52
|
+
|
|
53
|
+
```toml
|
|
54
|
+
# bunfig.toml
|
|
55
|
+
[install]
|
|
56
|
+
# Disable postinstall scripts for security
|
|
57
|
+
ignorescripts = true
|
|
58
|
+
|
|
59
|
+
# Registry configuration
|
|
60
|
+
registry = "https://registry.npmjs.org"
|
|
61
|
+
|
|
62
|
+
# Install settings
|
|
63
|
+
frozen-lockfile = true
|
|
64
|
+
|
|
65
|
+
[run]
|
|
66
|
+
# Shell for scripts
|
|
67
|
+
shell = "bash"
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
---
|
|
71
|
+
|
|
72
|
+
## Script Commands
|
|
73
|
+
|
|
74
|
+
### package.json Scripts
|
|
75
|
+
|
|
76
|
+
```json
|
|
77
|
+
{
|
|
78
|
+
"scripts": {
|
|
79
|
+
"dev": "bun run --hot src/index.ts",
|
|
80
|
+
"start": "bun run src/index.ts",
|
|
81
|
+
"build": "bun build src/index.ts --outdir dist",
|
|
82
|
+
"typecheck": "bunx tsc --noEmit",
|
|
83
|
+
"lint": "bunx eslint . --ext .ts,.tsx",
|
|
84
|
+
"lint:fix": "bunx eslint . --ext .ts,.tsx --fix",
|
|
85
|
+
"test": "bun test",
|
|
86
|
+
"test:watch": "bun test --watch",
|
|
87
|
+
"test:coverage": "bun test --coverage"
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
### Running Scripts
|
|
93
|
+
|
|
94
|
+
```bash
|
|
95
|
+
# Run script
|
|
96
|
+
bun run dev
|
|
97
|
+
bun run build
|
|
98
|
+
|
|
99
|
+
# Shorthand (without "run")
|
|
100
|
+
bun dev
|
|
101
|
+
bun build
|
|
102
|
+
|
|
103
|
+
# Run TypeScript directly
|
|
104
|
+
bun run src/index.ts
|
|
105
|
+
|
|
106
|
+
# Hot reload
|
|
107
|
+
bun run --hot src/index.ts
|
|
108
|
+
|
|
109
|
+
# Watch mode
|
|
110
|
+
bun run --watch src/index.ts
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
---
|
|
114
|
+
|
|
115
|
+
## Bundling
|
|
116
|
+
|
|
117
|
+
### Basic Bundle
|
|
118
|
+
|
|
119
|
+
```bash
|
|
120
|
+
# Bundle for browser
|
|
121
|
+
bun build ./src/index.ts --outdir ./dist
|
|
122
|
+
|
|
123
|
+
# Minify
|
|
124
|
+
bun build ./src/index.ts --outdir ./dist --minify
|
|
125
|
+
|
|
126
|
+
# Source maps
|
|
127
|
+
bun build ./src/index.ts --outdir ./dist --sourcemap
|
|
128
|
+
|
|
129
|
+
# Target
|
|
130
|
+
bun build ./src/index.ts --outdir ./dist --target=browser
|
|
131
|
+
bun build ./src/index.ts --outdir ./dist --target=node
|
|
132
|
+
bun build ./src/index.ts --outdir ./dist --target=bun
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
### Build API
|
|
136
|
+
|
|
137
|
+
```typescript
|
|
138
|
+
// build.ts
|
|
139
|
+
const result = await Bun.build({
|
|
140
|
+
entrypoints: ['./src/index.ts'],
|
|
141
|
+
outdir: './dist',
|
|
142
|
+
target: 'browser',
|
|
143
|
+
minify: true,
|
|
144
|
+
sourcemap: 'external',
|
|
145
|
+
splitting: true,
|
|
146
|
+
format: 'esm',
|
|
147
|
+
define: {
|
|
148
|
+
'process.env.NODE_ENV': '"production"',
|
|
149
|
+
},
|
|
150
|
+
external: ['react', 'react-dom'],
|
|
151
|
+
});
|
|
152
|
+
|
|
153
|
+
if (!result.success) {
|
|
154
|
+
console.error('Build failed:');
|
|
155
|
+
for (const log of result.logs) {
|
|
156
|
+
console.error(log);
|
|
157
|
+
}
|
|
158
|
+
process.exit(1);
|
|
159
|
+
}
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
---
|
|
163
|
+
|
|
164
|
+
## Testing (Vitest-compatible)
|
|
165
|
+
|
|
166
|
+
### Test Configuration
|
|
167
|
+
|
|
168
|
+
```typescript
|
|
169
|
+
// bunfig.toml
|
|
170
|
+
[test];
|
|
171
|
+
preload = ['./tests/setup.ts'];
|
|
172
|
+
coverage = true;
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
### Test File
|
|
176
|
+
|
|
177
|
+
```typescript
|
|
178
|
+
// tests/example.test.ts
|
|
179
|
+
import { describe, test, expect, beforeEach, afterEach } from 'bun:test';
|
|
180
|
+
|
|
181
|
+
describe('Feature', () => {
|
|
182
|
+
beforeEach(() => {
|
|
183
|
+
// Setup
|
|
184
|
+
});
|
|
185
|
+
|
|
186
|
+
afterEach(() => {
|
|
187
|
+
// Cleanup
|
|
188
|
+
});
|
|
189
|
+
|
|
190
|
+
test('should work correctly', () => {
|
|
191
|
+
const result = 1 + 1;
|
|
192
|
+
expect(result).toBe(2);
|
|
193
|
+
});
|
|
194
|
+
|
|
195
|
+
test('async operations', async () => {
|
|
196
|
+
const data = await fetchData();
|
|
197
|
+
expect(data).toBeDefined();
|
|
198
|
+
});
|
|
199
|
+
});
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
### Mocking
|
|
203
|
+
|
|
204
|
+
```typescript
|
|
205
|
+
import { mock, spyOn } from 'bun:test';
|
|
206
|
+
|
|
207
|
+
// Mock function
|
|
208
|
+
const mockFn = mock((x: number) => x * 2);
|
|
209
|
+
mockFn(5);
|
|
210
|
+
expect(mockFn).toHaveBeenCalledWith(5);
|
|
211
|
+
expect(mockFn).toHaveReturnedWith(10);
|
|
212
|
+
|
|
213
|
+
// Spy on existing function
|
|
214
|
+
const spy = spyOn(console, 'log');
|
|
215
|
+
console.log('test');
|
|
216
|
+
expect(spy).toHaveBeenCalledWith('test');
|
|
217
|
+
```
|
|
218
|
+
|
|
219
|
+
---
|
|
220
|
+
|
|
221
|
+
## Bun APIs
|
|
222
|
+
|
|
223
|
+
### File System
|
|
224
|
+
|
|
225
|
+
```typescript
|
|
226
|
+
// Read file
|
|
227
|
+
const text = await Bun.file('path/to/file.txt').text();
|
|
228
|
+
const json = await Bun.file('path/to/file.json').json();
|
|
229
|
+
const buffer = await Bun.file('path/to/file.bin').arrayBuffer();
|
|
230
|
+
|
|
231
|
+
// Write file
|
|
232
|
+
await Bun.write('output.txt', 'Hello, World!');
|
|
233
|
+
await Bun.write('output.json', JSON.stringify({ hello: 'world' }));
|
|
234
|
+
|
|
235
|
+
// File info
|
|
236
|
+
const file = Bun.file('file.txt');
|
|
237
|
+
console.log(file.size);
|
|
238
|
+
console.log(file.type);
|
|
239
|
+
```
|
|
240
|
+
|
|
241
|
+
### HTTP Server
|
|
242
|
+
|
|
243
|
+
```typescript
|
|
244
|
+
// Simple server
|
|
245
|
+
Bun.serve({
|
|
246
|
+
port: 3000,
|
|
247
|
+
fetch(request) {
|
|
248
|
+
const url = new URL(request.url);
|
|
249
|
+
|
|
250
|
+
if (url.pathname === '/api/hello') {
|
|
251
|
+
return Response.json({ message: 'Hello!' });
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
return new Response('Not Found', { status: 404 });
|
|
255
|
+
},
|
|
256
|
+
});
|
|
257
|
+
|
|
258
|
+
// With WebSocket
|
|
259
|
+
Bun.serve({
|
|
260
|
+
port: 3000,
|
|
261
|
+
fetch(request, server) {
|
|
262
|
+
if (server.upgrade(request)) {
|
|
263
|
+
return;
|
|
264
|
+
}
|
|
265
|
+
return new Response('Upgrade failed', { status: 500 });
|
|
266
|
+
},
|
|
267
|
+
websocket: {
|
|
268
|
+
open(ws) {
|
|
269
|
+
console.log('Client connected');
|
|
270
|
+
},
|
|
271
|
+
message(ws, message) {
|
|
272
|
+
ws.send(`Echo: ${message}`);
|
|
273
|
+
},
|
|
274
|
+
close(ws) {
|
|
275
|
+
console.log('Client disconnected');
|
|
276
|
+
},
|
|
277
|
+
},
|
|
278
|
+
});
|
|
279
|
+
```
|
|
280
|
+
|
|
281
|
+
### Subprocess
|
|
282
|
+
|
|
283
|
+
```typescript
|
|
284
|
+
// Run command
|
|
285
|
+
const result = Bun.spawn(['echo', 'Hello']);
|
|
286
|
+
await result.exited;
|
|
287
|
+
|
|
288
|
+
// Capture output
|
|
289
|
+
const proc = Bun.spawn(['git', 'status'], {
|
|
290
|
+
stdout: 'pipe',
|
|
291
|
+
});
|
|
292
|
+
const output = await new Response(proc.stdout).text();
|
|
293
|
+
|
|
294
|
+
// With stdin
|
|
295
|
+
const proc = Bun.spawn(['cat'], {
|
|
296
|
+
stdin: 'pipe',
|
|
297
|
+
stdout: 'pipe',
|
|
298
|
+
});
|
|
299
|
+
proc.stdin.write('Hello from stdin!');
|
|
300
|
+
proc.stdin.end();
|
|
301
|
+
```
|
|
302
|
+
|
|
303
|
+
### Password Hashing
|
|
304
|
+
|
|
305
|
+
```typescript
|
|
306
|
+
// Hash password
|
|
307
|
+
const hash = await Bun.password.hash('my-password', {
|
|
308
|
+
algorithm: 'bcrypt',
|
|
309
|
+
cost: 10,
|
|
310
|
+
});
|
|
311
|
+
|
|
312
|
+
// Verify password
|
|
313
|
+
const isValid = await Bun.password.verify('my-password', hash);
|
|
314
|
+
```
|
|
315
|
+
|
|
316
|
+
### Environment Variables
|
|
317
|
+
|
|
318
|
+
```typescript
|
|
319
|
+
// Access env vars
|
|
320
|
+
const apiKey = Bun.env['API_KEY'];
|
|
321
|
+
const nodeEnv = Bun.env['NODE_ENV'] ?? 'development';
|
|
322
|
+
|
|
323
|
+
// Set env vars
|
|
324
|
+
Bun.env['CUSTOM_VAR'] = 'value';
|
|
325
|
+
```
|
|
326
|
+
|
|
327
|
+
---
|
|
328
|
+
|
|
329
|
+
## Performance Tips
|
|
330
|
+
|
|
331
|
+
### Use Native APIs
|
|
332
|
+
|
|
333
|
+
```typescript
|
|
334
|
+
// Prefer Bun APIs over Node.js equivalents
|
|
335
|
+
|
|
336
|
+
// File reading
|
|
337
|
+
// Node.js way (slower)
|
|
338
|
+
import { readFile } from 'fs/promises';
|
|
339
|
+
const content = await readFile('file.txt', 'utf-8');
|
|
340
|
+
|
|
341
|
+
// Bun way (faster)
|
|
342
|
+
const content = await Bun.file('file.txt').text();
|
|
343
|
+
```
|
|
344
|
+
|
|
345
|
+
### Import Optimization
|
|
346
|
+
|
|
347
|
+
```typescript
|
|
348
|
+
// Use namespace imports for tree-shaking
|
|
349
|
+
import * as z from 'zod';
|
|
350
|
+
|
|
351
|
+
// Avoid dynamic imports in hot paths
|
|
352
|
+
// Bad:
|
|
353
|
+
async function validate(data: unknown) {
|
|
354
|
+
const { z } = await import('zod');
|
|
355
|
+
return z.object({}).parse(data);
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
// Good:
|
|
359
|
+
import { z } from 'zod';
|
|
360
|
+
function validate(data: unknown) {
|
|
361
|
+
return z.object({}).parse(data);
|
|
362
|
+
}
|
|
363
|
+
```
|
|
364
|
+
|
|
365
|
+
### Bundle for Production
|
|
366
|
+
|
|
367
|
+
```bash
|
|
368
|
+
# Compile to single executable
|
|
369
|
+
bun build --compile ./src/index.ts --outfile myapp
|
|
370
|
+
|
|
371
|
+
# Run compiled binary
|
|
372
|
+
./myapp
|
|
373
|
+
```
|
|
374
|
+
|
|
375
|
+
---
|
|
376
|
+
|
|
377
|
+
## Docker Integration
|
|
378
|
+
|
|
379
|
+
```dockerfile
|
|
380
|
+
# Use Bun official image
|
|
381
|
+
FROM oven/bun:1-alpine AS base
|
|
382
|
+
|
|
383
|
+
# Install dependencies
|
|
384
|
+
FROM base AS deps
|
|
385
|
+
WORKDIR /app
|
|
386
|
+
COPY package.json bun.lockb ./
|
|
387
|
+
RUN bun install --frozen-lockfile
|
|
388
|
+
|
|
389
|
+
# Build
|
|
390
|
+
FROM base AS builder
|
|
391
|
+
WORKDIR /app
|
|
392
|
+
COPY --from=deps /app/node_modules ./node_modules
|
|
393
|
+
COPY . .
|
|
394
|
+
RUN bun run build
|
|
395
|
+
|
|
396
|
+
# Runtime
|
|
397
|
+
FROM base AS runner
|
|
398
|
+
WORKDIR /app
|
|
399
|
+
COPY --from=builder /app/dist ./dist
|
|
400
|
+
COPY --from=builder /app/package.json ./
|
|
401
|
+
|
|
402
|
+
EXPOSE 3000
|
|
403
|
+
CMD ["bun", "run", "dist/index.js"]
|
|
404
|
+
```
|
|
405
|
+
|
|
406
|
+
---
|
|
407
|
+
|
|
408
|
+
## Agent Integration
|
|
409
|
+
|
|
410
|
+
This skill is used by:
|
|
411
|
+
|
|
412
|
+
- **bun-runtime-expert** agent
|
|
413
|
+
- **quality-checker** for running tests
|
|
414
|
+
- **build-error-fixer** for build issues
|
|
415
|
+
- **dockerfile-optimizer** for Docker builds
|
|
416
|
+
|
|
417
|
+
---
|
|
418
|
+
|
|
419
|
+
## FORBIDDEN
|
|
420
|
+
|
|
421
|
+
1. **`npm` commands** - Use `bun` instead
|
|
422
|
+
2. **Node.js fs when Bun.file works** - Use native APIs
|
|
423
|
+
3. **Ignoring lockfile** - Always use `--frozen-lockfile` in CI
|
|
424
|
+
4. **Skipping typecheck** - Run `bunx tsc --noEmit`
|
|
425
|
+
|
|
426
|
+
---
|
|
427
|
+
|
|
428
|
+
## Version
|
|
429
|
+
|
|
430
|
+
- **v1.0.0** - Initial implementation based on Bun 1.x patterns
|