@martinffx/atelier 2.0.0 → 3.0.0
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/CHANGELOG.md +14 -0
- package/README.md +94 -253
- package/package.json +1 -1
- package/skills/{spec-orchestrator → atelier-orchestrator}/SKILL.md +3 -3
- package/skills/atelier-setup/SKILL.md +80 -0
- package/skills/code-review/references/reviewers.md +3 -3
- package/skills/code-review/references/rq.md +6 -6
- package/skills/spec-brainstorm/SKILL.md +5 -5
- package/skills/spec-implement/SKILL.md +2 -3
- package/skills/spec-plan/SKILL.md +21 -29
- package/skills/spec-plan/references/plan_template.md +77 -0
- package/skills/python-architecture/SKILL.md +0 -148
- package/skills/python-architecture/references/data-modeling.md +0 -558
- package/skills/python-architecture/references/ddd.md +0 -569
- package/skills/python-architecture/references/functional-core.md +0 -337
- package/skills/python-build-tools/SKILL.md +0 -153
- package/skills/python-build-tools/references/basedpyright.md +0 -321
- package/skills/python-build-tools/references/ruff.md +0 -225
- package/skills/python-build-tools/references/uv.md +0 -257
- package/skills/python-fastapi/SKILL.md +0 -184
- package/skills/python-fastapi/references/api-design.md +0 -563
- package/skills/python-fastapi/references/dependencies.md +0 -479
- package/skills/python-fastapi/references/middleware.md +0 -475
- package/skills/python-fastapi/references/validation.md +0 -497
- package/skills/python-modern-python/SKILL.md +0 -201
- package/skills/python-modern-python/references/async.md +0 -76
- package/skills/python-modern-python/references/pattern-matching.md +0 -89
- package/skills/python-modern-python/references/typing.md +0 -96
- package/skills/python-monorepo/SKILL.md +0 -146
- package/skills/python-monorepo/references/docker.md +0 -515
- package/skills/python-monorepo/references/namespace-packages.md +0 -426
- package/skills/python-monorepo/references/workspace-config.md +0 -341
- package/skills/python-sqlalchemy/SKILL.md +0 -119
- package/skills/python-sqlalchemy/references/async.md +0 -51
- package/skills/python-sqlalchemy/references/models.md +0 -67
- package/skills/python-sqlalchemy/references/queries.md +0 -57
- package/skills/python-temporal/SKILL.md +0 -128
- package/skills/python-temporal/references/patterns.md +0 -87
- package/skills/python-temporal/references/testing.md +0 -54
- package/skills/python-testing/SKILL.md +0 -161
- package/skills/python-testing/references/boundaries.md +0 -449
- package/skills/python-testing/references/mocking.md +0 -449
- package/skills/python-testing/references/pytest.md +0 -524
- package/skills/typescript-api-design/SKILL.md +0 -396
- package/skills/typescript-api-design/references/error-responses.md +0 -469
- package/skills/typescript-build-tools/SKILL.md +0 -447
- package/skills/typescript-build-tools/references/biome.md +0 -436
- package/skills/typescript-build-tools/references/bun.md +0 -432
- package/skills/typescript-build-tools/references/turborepo.md +0 -426
- package/skills/typescript-build-tools/references/vitest.md +0 -518
- package/skills/typescript-drizzle-orm/SKILL.md +0 -398
- package/skills/typescript-drizzle-orm/references/cloudflare.md +0 -392
- package/skills/typescript-drizzle-orm/references/entity-pattern.md +0 -412
- package/skills/typescript-drizzle-orm/references/postgresql.md +0 -191
- package/skills/typescript-drizzle-orm/references/repository-pattern.md +0 -479
- package/skills/typescript-drizzle-orm/references/sqlite.md +0 -291
- package/skills/typescript-dynamodb-toolbox/SKILL.md +0 -370
- package/skills/typescript-dynamodb-toolbox/references/entity-layer.md +0 -574
- package/skills/typescript-dynamodb-toolbox/references/error-handling.md +0 -495
- package/skills/typescript-dynamodb-toolbox/references/modeling.md +0 -332
- package/skills/typescript-dynamodb-toolbox/references/repository-layer.md +0 -631
- package/skills/typescript-dynamodb-toolbox/references/testing.md +0 -718
- package/skills/typescript-dynamodb-toolbox/references/transactions.md +0 -423
- package/skills/typescript-effect-ts/SKILL.md +0 -341
- package/skills/typescript-effect-ts/references/core.md +0 -412
- package/skills/typescript-effect-ts/references/error-handling.md +0 -468
- package/skills/typescript-effect-ts/references/resources.md +0 -476
- package/skills/typescript-effect-ts/references/schema.md +0 -536
- package/skills/typescript-effect-ts/references/services.md +0 -461
- package/skills/typescript-fastify/SKILL.md +0 -405
- package/skills/typescript-fastify/references/plugins.md +0 -329
- package/skills/typescript-fastify/references/typeid.md +0 -315
- package/skills/typescript-functional-patterns/SKILL.md +0 -402
- package/skills/typescript-functional-patterns/references/adts.md +0 -497
- package/skills/typescript-functional-patterns/references/branded-types.md +0 -542
- package/skills/typescript-functional-patterns/references/migration-guide.md +0 -695
- package/skills/typescript-functional-patterns/references/option-result.md +0 -585
- package/skills/typescript-testing/SKILL.md +0 -353
- package/skills/typescript-testing/references/mocking.md +0 -675
- package/skills/typescript-testing/references/msw.md +0 -852
- package/skills/typescript-testing/references/snapshot-testing.md +0 -774
|
@@ -1,436 +0,0 @@
|
|
|
1
|
-
# Biome Configuration Guide
|
|
2
|
-
|
|
3
|
-
Detailed Biome rules and configuration patterns for TypeScript projects.
|
|
4
|
-
|
|
5
|
-
## Configuration Hierarchy
|
|
6
|
-
|
|
7
|
-
Biome searches for configuration in this order:
|
|
8
|
-
1. `biome.json` in current directory
|
|
9
|
-
2. `biome.jsonc` in current directory
|
|
10
|
-
3. Parent directories (up to root)
|
|
11
|
-
|
|
12
|
-
## Formatter Options
|
|
13
|
-
|
|
14
|
-
### Indentation Style
|
|
15
|
-
|
|
16
|
-
```json
|
|
17
|
-
{
|
|
18
|
-
"formatter": {
|
|
19
|
-
"indentStyle": "tab", // "tab" or "space"
|
|
20
|
-
"indentWidth": 2, // 2 or 4
|
|
21
|
-
"lineWidth": 100 // 80, 100, or 120
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
```
|
|
25
|
-
|
|
26
|
-
### JavaScript/TypeScript Specific
|
|
27
|
-
|
|
28
|
-
```json
|
|
29
|
-
{
|
|
30
|
-
"javascript": {
|
|
31
|
-
"formatter": {
|
|
32
|
-
"quoteStyle": "double", // "double" or "single"
|
|
33
|
-
"trailingCommas": "es5", // "all", "es5", or "none"
|
|
34
|
-
"semicolons": "always", // "always" or "asNeeded"
|
|
35
|
-
"arrowParentheses": "always", // "always" or "asNeeded"
|
|
36
|
-
"bracketSameLine": false,
|
|
37
|
-
"bracketSpacing": true
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
```
|
|
42
|
-
|
|
43
|
-
## Linter Rules
|
|
44
|
-
|
|
45
|
-
### Recommended (Default)
|
|
46
|
-
|
|
47
|
-
```json
|
|
48
|
-
{
|
|
49
|
-
"linter": {
|
|
50
|
-
"enabled": true,
|
|
51
|
-
"rules": {
|
|
52
|
-
"recommended": true
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
```
|
|
57
|
-
|
|
58
|
-
### Strict Configuration
|
|
59
|
-
|
|
60
|
-
```json
|
|
61
|
-
{
|
|
62
|
-
"linter": {
|
|
63
|
-
"enabled": true,
|
|
64
|
-
"rules": {
|
|
65
|
-
"recommended": true,
|
|
66
|
-
"complexity": {
|
|
67
|
-
"noForEach": "error",
|
|
68
|
-
"noUselessFragments": "error",
|
|
69
|
-
"useLiteralKeys": "error"
|
|
70
|
-
},
|
|
71
|
-
"correctness": {
|
|
72
|
-
"noUnusedImports": "error",
|
|
73
|
-
"noUnusedVariables": "error",
|
|
74
|
-
"useHookAtTopLevel": "error"
|
|
75
|
-
},
|
|
76
|
-
"performance": {
|
|
77
|
-
"noDelete": "error",
|
|
78
|
-
"noAccumulatingSpread": "warn"
|
|
79
|
-
},
|
|
80
|
-
"style": {
|
|
81
|
-
"noNonNullAssertion": "warn",
|
|
82
|
-
"useNodejsImportProtocol": "error",
|
|
83
|
-
"useImportType": "error",
|
|
84
|
-
"useExportType": "error"
|
|
85
|
-
},
|
|
86
|
-
"suspicious": {
|
|
87
|
-
"noExplicitAny": "warn",
|
|
88
|
-
"noConfusingVoidType": "error"
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
```
|
|
94
|
-
|
|
95
|
-
### Rule Explanations
|
|
96
|
-
|
|
97
|
-
| Rule | Why | Example |
|
|
98
|
-
|------|-----|---------|
|
|
99
|
-
| `noForEach` | Prefer `for...of` - better performance, supports `break`/`continue` | ❌ `arr.forEach(x => ...)` ✅ `for (const x of arr)` |
|
|
100
|
-
| `noDelete` | Use `Map.delete()` or object destructuring - `delete` is slow | ❌ `delete obj.key` ✅ `const { key, ...rest } = obj` |
|
|
101
|
-
| `useNodejsImportProtocol` | Use `node:fs` instead of `fs` - explicit, avoids bundler issues | ❌ `import fs from 'fs'` ✅ `import fs from 'node:fs'` |
|
|
102
|
-
| `noNonNullAssertion` | Avoid `!` assertions - use proper null checks | ❌ `user!.name` ✅ `user?.name` |
|
|
103
|
-
| `noExplicitAny` | Use `unknown` and narrow types - better type safety | ❌ `data: any` ✅ `data: unknown` |
|
|
104
|
-
| `noUnusedImports` | Clean imports - reduces bundle size | ❌ `import { unused } from 'lib'` |
|
|
105
|
-
| `useImportType` | Use `import type` for types - helps tree-shaking | ❌ `import { User } from './types'` ✅ `import type { User } from './types'` |
|
|
106
|
-
| `noAccumulatingSpread` | Avoid spread in loops - O(n²) complexity | ❌ `arr = [...arr, x]` in loop ✅ `arr.push(x)` |
|
|
107
|
-
| `useLiteralKeys` | Use literals instead of computed properties | ❌ `{ ['key']: value }` ✅ `{ key: value }` |
|
|
108
|
-
|
|
109
|
-
## File Ignoring
|
|
110
|
-
|
|
111
|
-
### Via biome.json
|
|
112
|
-
|
|
113
|
-
```json
|
|
114
|
-
{
|
|
115
|
-
"files": {
|
|
116
|
-
"ignore": [
|
|
117
|
-
"dist",
|
|
118
|
-
"node_modules",
|
|
119
|
-
"*.gen.ts",
|
|
120
|
-
"drizzle/**",
|
|
121
|
-
"coverage/**"
|
|
122
|
-
],
|
|
123
|
-
"ignoreUnknown": true
|
|
124
|
-
}
|
|
125
|
-
}
|
|
126
|
-
```
|
|
127
|
-
|
|
128
|
-
### Via .biomeignore
|
|
129
|
-
|
|
130
|
-
```
|
|
131
|
-
# Generated files
|
|
132
|
-
dist/
|
|
133
|
-
coverage/
|
|
134
|
-
*.gen.ts
|
|
135
|
-
|
|
136
|
-
# Dependencies
|
|
137
|
-
node_modules/
|
|
138
|
-
|
|
139
|
-
# Drizzle migrations
|
|
140
|
-
drizzle/
|
|
141
|
-
```
|
|
142
|
-
|
|
143
|
-
## Organize Imports
|
|
144
|
-
|
|
145
|
-
```json
|
|
146
|
-
{
|
|
147
|
-
"organizeImports": {
|
|
148
|
-
"enabled": true
|
|
149
|
-
}
|
|
150
|
-
}
|
|
151
|
-
```
|
|
152
|
-
|
|
153
|
-
This automatically groups and sorts imports:
|
|
154
|
-
|
|
155
|
-
```typescript
|
|
156
|
-
// Before
|
|
157
|
-
import { useState } from 'react'
|
|
158
|
-
import fs from 'node:fs'
|
|
159
|
-
import { User } from './types'
|
|
160
|
-
import path from 'node:path'
|
|
161
|
-
|
|
162
|
-
// After (organized)
|
|
163
|
-
import fs from 'node:fs'
|
|
164
|
-
import path from 'node:path'
|
|
165
|
-
|
|
166
|
-
import { useState } from 'react'
|
|
167
|
-
|
|
168
|
-
import { User } from './types'
|
|
169
|
-
```
|
|
170
|
-
|
|
171
|
-
## VCS Integration
|
|
172
|
-
|
|
173
|
-
```json
|
|
174
|
-
{
|
|
175
|
-
"vcs": {
|
|
176
|
-
"enabled": true,
|
|
177
|
-
"clientKind": "git",
|
|
178
|
-
"useIgnoreFile": true,
|
|
179
|
-
"defaultBranch": "main"
|
|
180
|
-
}
|
|
181
|
-
}
|
|
182
|
-
```
|
|
183
|
-
|
|
184
|
-
Benefits:
|
|
185
|
-
- Respects `.gitignore` patterns
|
|
186
|
-
- Only formats tracked files
|
|
187
|
-
- Integrates with git workflows
|
|
188
|
-
|
|
189
|
-
## Shareable Config (Monorepo)
|
|
190
|
-
|
|
191
|
-
### packages/config-biome/package.json
|
|
192
|
-
|
|
193
|
-
```json
|
|
194
|
-
{
|
|
195
|
-
"name": "@myorg/biome-config",
|
|
196
|
-
"version": "1.0.0",
|
|
197
|
-
"main": "biome.json",
|
|
198
|
-
"files": ["biome.json"]
|
|
199
|
-
}
|
|
200
|
-
```
|
|
201
|
-
|
|
202
|
-
### packages/config-biome/biome.json
|
|
203
|
-
|
|
204
|
-
```json
|
|
205
|
-
{
|
|
206
|
-
"$schema": "https://biomejs.dev/schemas/2.0.0/schema.json",
|
|
207
|
-
"formatter": {
|
|
208
|
-
"indentStyle": "tab",
|
|
209
|
-
"lineWidth": 100
|
|
210
|
-
},
|
|
211
|
-
"javascript": {
|
|
212
|
-
"formatter": {
|
|
213
|
-
"quoteStyle": "double",
|
|
214
|
-
"trailingCommas": "es5"
|
|
215
|
-
}
|
|
216
|
-
},
|
|
217
|
-
"linter": {
|
|
218
|
-
"enabled": true,
|
|
219
|
-
"rules": {
|
|
220
|
-
"recommended": true,
|
|
221
|
-
"complexity": {
|
|
222
|
-
"noForEach": "error"
|
|
223
|
-
},
|
|
224
|
-
"performance": {
|
|
225
|
-
"noDelete": "error"
|
|
226
|
-
},
|
|
227
|
-
"style": {
|
|
228
|
-
"useNodejsImportProtocol": "error"
|
|
229
|
-
}
|
|
230
|
-
}
|
|
231
|
-
},
|
|
232
|
-
"organizeImports": {
|
|
233
|
-
"enabled": true
|
|
234
|
-
}
|
|
235
|
-
}
|
|
236
|
-
```
|
|
237
|
-
|
|
238
|
-
### apps/api/biome.json
|
|
239
|
-
|
|
240
|
-
```json
|
|
241
|
-
{
|
|
242
|
-
"$schema": "https://biomejs.dev/schemas/2.0.0/schema.json",
|
|
243
|
-
"extends": ["@myorg/biome-config"],
|
|
244
|
-
"files": {
|
|
245
|
-
"ignore": ["dist/**"]
|
|
246
|
-
}
|
|
247
|
-
}
|
|
248
|
-
```
|
|
249
|
-
|
|
250
|
-
## Using with ESLint
|
|
251
|
-
|
|
252
|
-
Biome can coexist with ESLint for type-aware rules that Biome doesn't support:
|
|
253
|
-
|
|
254
|
-
```json
|
|
255
|
-
// biome.json - handle formatting and most linting
|
|
256
|
-
{
|
|
257
|
-
"linter": {
|
|
258
|
-
"enabled": true,
|
|
259
|
-
"rules": {
|
|
260
|
-
"recommended": true
|
|
261
|
-
}
|
|
262
|
-
}
|
|
263
|
-
}
|
|
264
|
-
```
|
|
265
|
-
|
|
266
|
-
```javascript
|
|
267
|
-
// eslint.config.js - type-aware rules only
|
|
268
|
-
import tseslint from 'typescript-eslint'
|
|
269
|
-
import boundaries from 'eslint-plugin-boundaries'
|
|
270
|
-
|
|
271
|
-
export default tseslint.config({
|
|
272
|
-
plugins: {
|
|
273
|
-
boundaries,
|
|
274
|
-
},
|
|
275
|
-
rules: {
|
|
276
|
-
// Type-aware rules Biome can't do
|
|
277
|
-
'@typescript-eslint/no-floating-promises': 'error',
|
|
278
|
-
'@typescript-eslint/no-misused-promises': 'error',
|
|
279
|
-
// Architectural boundaries
|
|
280
|
-
'boundaries/element-types': 'error',
|
|
281
|
-
},
|
|
282
|
-
})
|
|
283
|
-
```
|
|
284
|
-
|
|
285
|
-
### Dual Linting Scripts
|
|
286
|
-
|
|
287
|
-
```json
|
|
288
|
-
{
|
|
289
|
-
"scripts": {
|
|
290
|
-
"lint": "biome check ./src && eslint ./src --max-warnings 0",
|
|
291
|
-
"lint:fix": "biome check --write ./src && eslint --fix ./src"
|
|
292
|
-
}
|
|
293
|
-
}
|
|
294
|
-
```
|
|
295
|
-
|
|
296
|
-
## CLI Commands
|
|
297
|
-
|
|
298
|
-
```bash
|
|
299
|
-
# Check all files (lint + format check)
|
|
300
|
-
biome check .
|
|
301
|
-
|
|
302
|
-
# Fix all files (lint + format)
|
|
303
|
-
biome check --write .
|
|
304
|
-
|
|
305
|
-
# Format only
|
|
306
|
-
biome format --write .
|
|
307
|
-
|
|
308
|
-
# Lint only
|
|
309
|
-
biome lint .
|
|
310
|
-
|
|
311
|
-
# Check specific files
|
|
312
|
-
biome check src/
|
|
313
|
-
|
|
314
|
-
# CI mode (fail on any issue)
|
|
315
|
-
biome ci .
|
|
316
|
-
|
|
317
|
-
# Show what would be changed (dry run)
|
|
318
|
-
biome check --write --dry-run .
|
|
319
|
-
```
|
|
320
|
-
|
|
321
|
-
## Migration from ESLint/Prettier
|
|
322
|
-
|
|
323
|
-
```bash
|
|
324
|
-
# Generate Biome config from existing configs
|
|
325
|
-
biome migrate --write
|
|
326
|
-
|
|
327
|
-
# Migrate ESLint config
|
|
328
|
-
biome migrate eslint --write
|
|
329
|
-
|
|
330
|
-
# Migrate Prettier config
|
|
331
|
-
biome migrate prettier --write
|
|
332
|
-
```
|
|
333
|
-
|
|
334
|
-
After migration:
|
|
335
|
-
1. Review generated `biome.json`
|
|
336
|
-
2. Test on a few files
|
|
337
|
-
3. Remove ESLint/Prettier configs
|
|
338
|
-
4. Uninstall old packages: `bun remove eslint prettier @typescript-eslint/parser @typescript-eslint/eslint-plugin`
|
|
339
|
-
|
|
340
|
-
## Editor Integration
|
|
341
|
-
|
|
342
|
-
### VSCode
|
|
343
|
-
|
|
344
|
-
Install the Biome extension:
|
|
345
|
-
|
|
346
|
-
```bash
|
|
347
|
-
code --install-extension biomejs.biome
|
|
348
|
-
```
|
|
349
|
-
|
|
350
|
-
Settings (`.vscode/settings.json`):
|
|
351
|
-
|
|
352
|
-
```json
|
|
353
|
-
{
|
|
354
|
-
"[typescript]": {
|
|
355
|
-
"editor.defaultFormatter": "biomejs.biome",
|
|
356
|
-
"editor.formatOnSave": true,
|
|
357
|
-
"editor.codeActionsOnSave": {
|
|
358
|
-
"quickfix.biome": "explicit",
|
|
359
|
-
"source.organizeImports.biome": "explicit"
|
|
360
|
-
}
|
|
361
|
-
},
|
|
362
|
-
"[typescriptreact]": {
|
|
363
|
-
"editor.defaultFormatter": "biomejs.biome",
|
|
364
|
-
"editor.formatOnSave": true
|
|
365
|
-
}
|
|
366
|
-
}
|
|
367
|
-
```
|
|
368
|
-
|
|
369
|
-
### Recommended Extensions
|
|
370
|
-
|
|
371
|
-
For VSCode workspace, add to `.vscode/extensions.json`:
|
|
372
|
-
|
|
373
|
-
```json
|
|
374
|
-
{
|
|
375
|
-
"recommendations": [
|
|
376
|
-
"biomejs.biome"
|
|
377
|
-
],
|
|
378
|
-
"unwantedRecommendations": [
|
|
379
|
-
"dbaeumer.vscode-eslint",
|
|
380
|
-
"esbenp.prettier-vscode"
|
|
381
|
-
]
|
|
382
|
-
}
|
|
383
|
-
```
|
|
384
|
-
|
|
385
|
-
## Pre-commit Hooks
|
|
386
|
-
|
|
387
|
-
### Using Husky + lint-staged
|
|
388
|
-
|
|
389
|
-
```bash
|
|
390
|
-
bun add -D husky lint-staged
|
|
391
|
-
```
|
|
392
|
-
|
|
393
|
-
`.husky/pre-commit`:
|
|
394
|
-
|
|
395
|
-
```bash
|
|
396
|
-
#!/usr/bin/env sh
|
|
397
|
-
. "$(dirname -- "$0")/_/husky.sh"
|
|
398
|
-
|
|
399
|
-
bun run lint-staged
|
|
400
|
-
```
|
|
401
|
-
|
|
402
|
-
`package.json`:
|
|
403
|
-
|
|
404
|
-
```json
|
|
405
|
-
{
|
|
406
|
-
"lint-staged": {
|
|
407
|
-
"*.{ts,tsx}": [
|
|
408
|
-
"biome check --write --no-errors-on-unmatched"
|
|
409
|
-
]
|
|
410
|
-
}
|
|
411
|
-
}
|
|
412
|
-
```
|
|
413
|
-
|
|
414
|
-
## Performance
|
|
415
|
-
|
|
416
|
-
Biome is significantly faster than ESLint + Prettier:
|
|
417
|
-
|
|
418
|
-
| Tool | Speed (10k files) |
|
|
419
|
-
|------|-------------------|
|
|
420
|
-
| ESLint + Prettier | ~45s |
|
|
421
|
-
| Biome | ~1.5s |
|
|
422
|
-
|
|
423
|
-
## Best Practices
|
|
424
|
-
|
|
425
|
-
1. **Use tabs** for accessibility - users can set their preferred width
|
|
426
|
-
2. **Set line width to 100** - balances readability and screen space
|
|
427
|
-
3. **Use double quotes** - consistent with JSON, less escaping in HTML
|
|
428
|
-
4. **Enable organize imports** - cleaner diffs, easier to read
|
|
429
|
-
5. **Enable VCS integration** - respects .gitignore
|
|
430
|
-
6. **Use recommended rules** as baseline
|
|
431
|
-
7. **Add strict rules gradually** - `noForEach`, `noDelete`, `useNodejsImportProtocol`
|
|
432
|
-
8. **Share config in monorepos** via workspace package
|
|
433
|
-
9. **Use ESLint alongside** for type-aware rules only
|
|
434
|
-
10. **Run `biome ci`** in CI - fails on any issue
|
|
435
|
-
11. **Configure editor integration** - format on save
|
|
436
|
-
12. **Use pre-commit hooks** - catch issues before commit
|