codebrief 1.2.0 → 1.3.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/README.md CHANGED
@@ -1,124 +1,268 @@
1
1
  # codebrief
2
2
 
3
- Bootstrap optimized AI context files for any project. Auto-detects your tech stack, generates code snapshots, and produces config for Claude Code, Cursor, Copilot, Windsurf, Cline, Continue, Aider, and more.
3
+ Give your AI agent full project context, without the warm-up.
4
4
 
5
5
  ![codebrief demo](demo.gif)
6
6
 
7
+ AI coding agents spend their first few minutes reading files, tracing imports, and piecing together your architecture. **codebrief** does that work once, ahead of time, and hands the agent a single context file so it can start writing useful code immediately.
8
+
9
+ ```bash
10
+ npx codebrief
11
+ ```
12
+
13
+ ## Before & After
14
+
15
+ Without codebrief, a typical AI agent session starts like this:
16
+
17
+ ```
18
+ Agent: Let me explore the project structure...
19
+ Agent: Reading src/index.ts...
20
+ Agent: Reading src/types.ts...
21
+ Agent: Reading src/utils/api-client.ts...
22
+ Agent: Reading src/store/auth.ts...
23
+ Agent: Now I understand the architecture. Let me start working...
24
+ ```
25
+
26
+ With codebrief, the agent already knows:
27
+
28
+ | What | Example |
29
+ |------|---------|
30
+ | Tech stack | Next.js 14 (App Router), TypeScript, Zustand, Tailwind |
31
+ | Key files | `src/types.ts` (highest centrality), `src/api/client.ts` |
32
+ | Architecture | services → hooks → components → pages |
33
+ | Active areas | `src/auth/` changed 12 times in the last 90 days |
34
+ | Coupled files | `routes.ts` and `middleware.ts` always change together |
35
+ | Code snapshot | All public types, interfaces, props, and function signatures |
36
+
37
+ <details>
38
+ <summary><strong>Example: generated CLAUDE.md</strong> (click to expand)</summary>
39
+
40
+ ```markdown
41
+ # MyProject
42
+
43
+ > **Keep this file up to date.** When you change the architecture, add a dependency,
44
+ > create a new pattern, or learn a gotcha, update this file in the same step.
45
+
46
+ ## What Is This
47
+
48
+ A mobile AI chat app connecting to OpenAI, Anthropic, and Google APIs
49
+
50
+ ## Tech Stack
51
+
52
+ - **Next.js** 14.1.0 (used in 34 files)
53
+ - **TypeScript**
54
+ - **Prisma** (used in 8 files)
55
+ - **Tailwind CSS** (used in 22 files)
56
+ - **npm** (package manager)
57
+
58
+ ## Code Snapshot
59
+
60
+ <!-- CODE SNAPSHOT (auto-generated) -->
61
+
62
+ ### Core Types
63
+
64
+ ‍```ts
65
+ export interface User { // imported by 12 files
66
+ id: string;
67
+ email: string;
68
+ role: "admin" | "user";
69
+ }
70
+
71
+ export type APIResponse<T> = { // imported by 8 files
72
+ data: T;
73
+ error?: string;
74
+ }
75
+ ‍```
76
+
77
+ ### Key Functions
78
+
79
+ ‍```ts
80
+ export async function fetchChat(chatId: string): Promise<Chat> // imported by 6 files
81
+
82
+ export function useAuth(): AuthContext // imported by 9 files
83
+ ‍```
84
+
85
+ <!-- /CODE SNAPSHOT -->
86
+
87
+ ## Key Files
88
+
89
+ | File | Imported By | Stability |
90
+ |------|-------------|-----------|
91
+ | `src/types.ts` | 18 files | stable |
92
+ | `src/lib/api-client.ts` | 12 files | stable |
93
+ | `src/store/auth.ts` | 9 files | stable |
94
+
95
+ ## Architecture
96
+
97
+ ‍```
98
+ ┌──────────────┐ ┌──────────────┐
99
+ │ types │ │ services │
100
+ └──────────────┘ └──────────────┘
101
+ │ │
102
+ ▼ ▼
103
+ ┌──────────────┐ ┌──────────────┐
104
+ │ hooks │ │ components │
105
+ └──────────────┘ └──────────────┘
106
+ ‍```
107
+
108
+ ## Recently Active Files
109
+
110
+ | File | Commits (90d) | Last Changed |
111
+ |------|--------------|--------------|
112
+ | `src/app/chat/page.tsx` | 14 | 2 days ago |
113
+ | `src/lib/api-client.ts` | 11 | 3 days ago |
114
+
115
+ <!-- ... more sections: change coupling, module clusters, gotchas -->
116
+ ```
117
+
118
+ </details>
119
+
7
120
  ## Quick Start
8
121
 
122
+ Run in your project root:
123
+
9
124
  ```bash
10
125
  npx codebrief
11
126
  ```
12
127
 
13
- Run in your project root. It will:
128
+ codebrief will:
14
129
 
15
- 1. **Auto-detect** your tech stack (language, framework, package manager, linter)
130
+ 1. **Detect** your tech stack (language, framework, package manager, linter)
16
131
  2. **Ask** a few questions (which AI tool, project purpose, key patterns)
17
132
  3. **Scan** source files for a code snapshot (types, store shapes, component props)
18
- 4. **Generate** optimized context files for your chosen tool
133
+ 4. **Generate** an optimized context file for your chosen tool
19
134
  5. **Show** a summary with token savings estimate
20
135
 
21
- On first run, your answers are saved to `.codebrief.json` so future runs skip the prompts entirely.
136
+ Your answers are saved to `.codebrief.json` so future runs skip the prompts.
22
137
 
23
- ## What It Does
138
+ ## Supported Tools
24
139
 
25
- codebrief builds a comprehensive understanding of your codebase and distills it into context files that AI agents can load instantly — eliminating the expensive exploration phase where agents read dozens of files just to understand the architecture.
140
+ | Tool | Generated file | Docs |
141
+ |------|---------------|------|
142
+ | Claude Code | `CLAUDE.md` | [claude.ai/docs](https://docs.anthropic.com/en/docs/claude-code/memory#claudemd-files) |
143
+ | Cursor | `CLAUDE.md` + `.cursor/rules/*.md` | [cursor.com/docs](https://docs.cursor.com/context/rules-for-ai) |
144
+ | OpenCode | `AGENTS.md` | [opencode.ai](https://opencode.ai/) |
145
+ | GitHub Copilot | `.github/copilot-instructions.md` | [docs.github.com](https://docs.github.com/en/copilot/customizing-copilot/adding-repository-custom-instructions-for-github-copilot) |
146
+ | Windsurf | `.windsurfrules` | [windsurf.com](https://docs.windsurf.com/windsurf/memories#rules) |
147
+ | Cline | `.clinerules` | [cline.bot](https://docs.cline.bot/improving-your-workflow/cline-rules) |
148
+ | Continue.dev | `.continuerules` | [continue.dev/docs](https://docs.continue.dev/customize/deep-dives/rules) |
149
+ | Aider | `.aider.conf.yml` | [aider.chat](https://aider.chat/docs/config/adir_conf.html) |
150
+ | Generic | `CONTEXT.md` | - |
26
151
 
27
- The generated context includes:
152
+ ## How It Works
28
153
 
29
- - **Tech stack summary** with detected frameworks, versions, and usage counts
30
- - **Code snapshot** of all public types, interfaces, function signatures, and component props
31
- - **Key files** ranked by centrality (PageRank) with stability warnings
32
- - **Architecture layers** showing dependency flow
33
- - **Change coupling** — file pairs that frequently change together
34
- - **Circular dependencies** detected via Tarjan's SCC algorithm
35
- - **Module clusters** — automatically detected groups of related files
36
- - **Git activity** — recently active files and churn patterns
37
- - **Framework conventions** — best practices for your specific stack
154
+ codebrief runs a pipeline of static analysis steps. Here's a quick overview:
38
155
 
39
- ## How It Works
156
+ | Step | What it does | Why it matters |
157
+ |------|-------------|----------------|
158
+ | [Dependency graph](#dependency-graph) | Parses all `import`/`require`/`use` statements | Maps how files connect to each other |
159
+ | [PageRank](#pagerank) | Ranks files by structural importance | Surfaces the files an agent should read first |
160
+ | [Dead export removal](#dead-export-removal) | Drops exports nothing imports | Saves tokens on unused code |
161
+ | [Token budgeting](#token-budgeting) | Fits the snapshot into a token limit | Keeps context files within model limits |
162
+ | [Layer detection](#layer-detection) | Classifies files into architecture layers | Gives agents a mental model of your project |
163
+ | [Cycle detection](#cycle-detection) | Finds circular import chains | Warns agents about risky dependency loops |
164
+ | [Instability scoring](#instability-scoring) | Flags volatile, widely-depended-on files | Tells agents where to be extra careful |
165
+ | [Change coupling](#change-coupling) | Finds files that always change together | Prevents incomplete changes |
166
+ | [Module clustering](#module-clustering) | Groups related files into logical modules | Reveals structure beyond folder layout |
167
+ | [Git activity](#git-activity) | Surfaces recently active files | Shows where current work is focused |
168
+ | [Stale detection](#stale-detection) | Hashes file paths + mtimes | Tells you when to re-run |
169
+
170
+ ### Dependency Graph
171
+
172
+ Parses all `import`, `require`, and `use` statements across your source files and builds a directed graph. This graph powers every other analysis step.
40
173
 
41
- codebrief runs a pipeline of static analysis on your codebase. Here's what each step does and why it matters.
174
+ ```
175
+ src/hooks/useAuth.ts ──imports──▶ src/store/auth.ts
176
+ src/hooks/useAuth.ts ──imports──▶ src/types.ts
177
+ src/pages/Login.tsx ──imports──▶ src/hooks/useAuth.ts
178
+ ```
42
179
 
43
- ### Mapping dependencies
180
+ ### PageRank
44
181
 
45
- **Problem:** AI agents don't know which files depend on each other, so they waste time reading unrelated code.
182
+ Runs the [PageRank algorithm](https://en.wikipedia.org/wiki/PageRank) on the import graph. The same algorithm Google uses to rank web pages. Files imported by many important files score highest.
46
183
 
47
- codebrief parses all `import`/`require`/`use` statements across your source files and builds a dependency graph. This graph powers most of the analysis below it's how codebrief understands the structure of your project without running it.
184
+ **Example:** In a typical project, `types.ts` or `api-client.ts` often ranks #1 because most of the codebase depends on them. These high-centrality files appear first in the generated context so agents understand foundational code before details.
48
185
 
49
- ### Ranking files by importance (PageRank)
186
+ ### Dead Export Removal
50
187
 
51
- **Problem:** In a project with hundreds of files, which ones should an agent read first?
188
+ Cross-references every named export against the import graph. If nothing in the project imports it, it's excluded from the snapshot.
52
189
 
53
- codebrief runs the same algorithm Google uses to rank web pages — but on your import graph instead of the internet. Files that are imported by many important files get a high score. For example, your main `types.ts` or a shared `api-client.ts` would rank near the top because they sit at the center of your dependency tree. These high-centrality files are surfaced first so agents understand your architecture before diving into details.
190
+ This catches leftover refactors, over-exported utilities, and test-only helpers, keeping the context lean.
54
191
 
55
- ### Removing dead exports
192
+ ### Token Budgeting
56
193
 
57
- **Problem:** Source files often contain exported functions, types, or constants that nothing actually imports leftover refactors, unused utilities, or over-exported modules. Including these in context wastes tokens.
194
+ Large projects may have more types and signatures than fit in the token budget. codebrief uses a greedy [knapsack](https://en.wikipedia.org/wiki/Knapsack_problem) approach that prioritizes:
58
195
 
59
- codebrief cross-references every named export against the import graph. If no file in the project imports it, it's excluded from the code snapshot.
196
+ 1. Entries from high-centrality files (via PageRank)
197
+ 2. Recently active files (via git history)
198
+ 3. Core categories (types, store shapes, component props)
60
199
 
61
- ### Fitting context into a token budget
200
+ Lower-priority items fill whatever budget remains.
62
201
 
63
- **Problem:** A full code snapshot of every type, interface, and function signature might exceed the token budget — especially in large projects.
202
+ ### Layer Detection
64
203
 
65
- codebrief uses a greedy knapsack approach: it prioritizes entries from the most central files, recently active files, and core categories (types, store shapes) first, then fills the remaining budget with lower-priority items. This ensures the most valuable context always makes it in, even under tight limits.
204
+ Classifies files into architecture layers based on directory and naming conventions:
66
205
 
67
- ### Detecting architectural layers
206
+ ```
207
+ types → stores → services → hooks → components → pages
208
+
209
+ utils, config
210
+ ```
68
211
 
69
- **Problem:** Agents need to understand the high-level shape of a project where the types live, where the API calls happen, where the UI components are.
212
+ The generated context includes a dependency-flow summary so agents understand how layers relate (e.g., "services call the API, components use hooks, hooks read from stores").
70
213
 
71
- codebrief classifies files into layers (types, stores, hooks, services, components, pages, utils, config) based on directory and naming conventions, then analyzes how those layers depend on each other. This gives agents a quick mental model like "services call the API, components use hooks, hooks read from stores."
214
+ ### Cycle Detection
72
215
 
73
- ### Finding circular dependencies (Tarjan's SCC)
216
+ Uses [Tarjan's algorithm](https://en.wikipedia.org/wiki/Tarjan%27s_strongly_connected_components_algorithm) to find groups of files that form import cycles.
74
217
 
75
- **Problem:** Circular imports cause subtle bugs, make refactoring dangerous, and confuse AI agents trying to understand dependency flow.
218
+ **Example:** `auth.ts user.ts permissions.ts auth.ts`. All three files are reported as a circular dependency cluster. Agents are warned to avoid deepening the cycle.
76
219
 
77
- codebrief uses Tarjan's algorithm to find groups of files that form import cycles. For example, if `auth.ts → user.ts → permissions.ts → auth.ts`, all three files are reported as a circular dependency cluster. This is surfaced in the context so agents avoid introducing more cycles.
220
+ ### Instability Scoring
78
221
 
79
- ### Flagging unstable files
222
+ Computes an [instability metric](https://en.wikipedia.org/wiki/Software_package_metrics) for each file:
80
223
 
81
- **Problem:** Some files change frequently but are imported by many others — any modification risks breaking things across the project.
224
+ ```
225
+ instability = outgoing imports / (outgoing + incoming imports)
226
+ ```
82
227
 
83
- codebrief computes an instability score for each file based on how many files it imports vs. how many files import it. Files that are both highly unstable and widely depended on are flagged as risk zones — agents will know to be extra careful when modifying them.
228
+ Files that are both highly unstable (many outgoing deps) **and** widely depended on (many incoming deps) are flagged as risk zones.
84
229
 
85
- ### Detecting change coupling
230
+ ### Change Coupling
86
231
 
87
- **Problem:** Some files always need to change together (e.g., a component and its test, or a route and its handler) but there's no import relationship between them.
232
+ Analyzes 90 days of git history to find file pairs that frequently appear in the same commits.
88
233
 
89
- codebrief analyzes 90 days of git history to find file pairs that frequently appear in the same commits. If two files were changed together in many commits, they're reported as coupled — so agents know that touching one likely means touching the other.
234
+ **Example output:**
90
235
 
91
- ### Discovering module clusters
236
+ | File A | File B | Co-changes | Confidence |
237
+ |--------|--------|------------|------------|
238
+ | `src/api/client.ts` | `src/api/types.ts` | 12 | 92% |
239
+ | `src/routes.ts` | `src/middleware.ts` | 8 | 80% |
92
240
 
93
- **Problem:** Large projects have natural groupings of related files (an auth module, a payments module) but these aren't always obvious from the folder structure.
241
+ This catches implicit dependencies that don't show up in imports. Agents know that touching one file likely means touching the other.
94
242
 
95
- codebrief uses label propagation on the import graph: each file starts with its own label and iteratively adopts the most common label among its neighbors. Files that end up sharing a label form a natural cluster. This reveals logical modules even when the folder layout doesn't match.
243
+ ### Module Clustering
96
244
 
97
- ### Tracking git activity
245
+ Uses [label propagation](https://en.wikipedia.org/wiki/Label_propagation_algorithm) on the import graph to discover natural groupings. Each file starts with its own label and iteratively adopts the most common label among its neighbors. Files sharing a label form a module cluster.
98
246
 
99
- **Problem:** Agents don't know which parts of the codebase are actively being worked on vs. which are stable.
247
+ This reveals logical boundaries (auth module, payments module, settings module) even when the folder layout doesn't reflect them.
100
248
 
101
- codebrief counts commits per file over the last 90 days to surface hot spots and recently active files. This helps agents understand where current development is focused.
249
+ ### Git Activity
102
250
 
103
- ### Detecting stale snapshots
251
+ Counts commits per file over the last 90 days to surface:
104
252
 
105
- **Problem:** After a refactor, the code snapshot in your context file may be outdated — describing types and signatures that no longer exist.
253
+ - **Hot spots**: files with the most churn
254
+ - **Recently active files**: where current development is focused
255
+ - **Quiet zones**: stable code that rarely changes
106
256
 
107
- codebrief hashes all source file paths and modification times. When you run `--check`, it compares this hash against the stored one to tell you if the snapshot needs refreshing.
257
+ ### Stale Detection
108
258
 
109
- ## Supported Tools
259
+ Hashes all source file paths and modification times. Run `--check` to compare against the stored hash:
110
260
 
111
- | Tool | Files Generated |
112
- |------|----------------|
113
- | Claude Code | `CLAUDE.md` |
114
- | Cursor | `CLAUDE.md` + `.cursor/rules/*.md` (glob-scoped) |
115
- | OpenCode | `AGENTS.md` |
116
- | GitHub Copilot | `.github/copilot-instructions.md` |
117
- | Windsurf | `.windsurfrules` |
118
- | Cline | `.clinerules` |
119
- | Continue.dev | `.continuerules` |
120
- | Aider | `.aider.conf.yml` |
121
- | Generic | `CONTEXT.md` |
261
+ ```bash
262
+ npx codebrief --check
263
+ # exit 0 = snapshot is fresh
264
+ # exit 1 = snapshot is stale, run --refresh-snapshot
265
+ ```
122
266
 
123
267
  ## Options
124
268
 
@@ -128,13 +272,17 @@ npx codebrief [directory] [options]
128
272
 
129
273
  | Flag | Description |
130
274
  |------|-------------|
131
- | `directory` | Path to analyze (defaults to current directory) |
275
+ | `directory` | Path to analyze (defaults to `.`) |
276
+ | `-h, --help` | Show help message |
277
+ | `-V, --version` | Show version number |
132
278
  | `--force` | Overwrite existing files without asking |
133
- | `--dry-run` | Show what would be generated without writing any files |
134
- | `--refresh-snapshot` | Re-scan source files and update the code snapshot in your existing context file |
135
- | `--reconfigure` | Force re-prompting even if `.codebrief.json` exists |
136
- | `--check` | Check if the snapshot is stale (exit code 0 = fresh, 1 = stale). Designed for shell integration. |
279
+ | `--dry-run` | Preview what would be generated |
280
+ | `--refresh-snapshot` | Re-scan source files and update just the code snapshot |
281
+ | `--reconfigure` | Re-prompt even if `.codebrief.json` exists |
282
+ | `--check` | Check if the snapshot is stale (exit 0 = fresh, 1 = stale) |
137
283
  | `--max-tokens=N` | Set the token budget for the code snapshot |
284
+ | `--generate-skills` | Generate Claude Code skill files |
285
+ | `-v, --verbose` | Show detailed progress output |
138
286
 
139
287
  ### Refreshing Snapshots
140
288
 
@@ -144,13 +292,14 @@ After a refactor, update just the code snapshot without re-generating the entire
144
292
  npx codebrief --refresh-snapshot
145
293
  ```
146
294
 
147
- This auto-detects your context file (CLAUDE.md, AGENTS.md, etc.), finds the `<!-- CODE SNAPSHOT -->` markers, re-scans source files, and replaces just that section in-place.
295
+ This finds the `<!-- CODE SNAPSHOT -->` markers in your context file, re-scans source files, and replaces just that section.
148
296
 
149
297
  ## Shell Integration
150
298
 
151
- Use `--check` to automatically detect stale snapshots when you `cd` into a project:
299
+ Automatically detect stale snapshots when you `cd` into a project:
152
300
 
153
- ### zsh
301
+ <details>
302
+ <summary><strong>zsh</strong></summary>
154
303
 
155
304
  ```zsh
156
305
  # Add to ~/.zshrc
@@ -161,7 +310,10 @@ chpwd() {
161
310
  }
162
311
  ```
163
312
 
164
- ### bash
313
+ </details>
314
+
315
+ <details>
316
+ <summary><strong>bash</strong></summary>
165
317
 
166
318
  ```bash
167
319
  # Add to ~/.bashrc
@@ -173,7 +325,10 @@ cd() {
173
325
  }
174
326
  ```
175
327
 
176
- ### fish
328
+ </details>
329
+
330
+ <details>
331
+ <summary><strong>fish</strong></summary>
177
332
 
178
333
  ```fish
179
334
  # Add to ~/.config/fish/conf.d/codebrief.fish
@@ -184,6 +339,8 @@ function __codebrief_check --on-variable PWD
184
339
  end
185
340
  ```
186
341
 
342
+ </details>
343
+
187
344
  ## Config File
188
345
 
189
346
  On first run, codebrief saves your answers to `.codebrief.json`:
@@ -202,23 +359,26 @@ On first run, codebrief saves your answers to `.codebrief.json`:
202
359
  }
203
360
  ```
204
361
 
205
- Subsequent runs load this config and skip all prompts. Use `--reconfigure` to re-prompt with your saved values as defaults.
362
+ Subsequent runs load this config and skip all prompts. Use `--reconfigure` to re-prompt.
206
363
 
207
- Add `.codebrief.json` to your `.gitignore` — it's a local tool config, not project documentation.
364
+ Add `.codebrief.json` to your `.gitignore`. It's local tool config, not project docs.
208
365
 
209
366
  ## Framework Conventions
210
367
 
211
- codebrief detects specific frameworks and automatically includes relevant best practices in the generated output:
368
+ codebrief detects your framework and includes relevant best practices:
212
369
 
213
- - **Next.js** App Router vs Pages Router patterns, server components, route handlers
214
- - **Express** — middleware chain, error handling, router organization
215
- - **FastAPI** dependency injection, Pydantic models, async endpoints
216
- - **Django** apps structure, models-views-templates, migrations
217
- - **NestJS** modules, controllers, providers, guards
218
- - **SvelteKit** load functions, form actions, server routes
219
- - **Expo / React Native** — routing, native modules, platform-specific files
220
- - **Vue / Nuxt** Composition API, auto-imports, data fetching
221
- - And more: Fastify, Hono, Angular, Svelte, Prisma, Drizzle, Tailwind CSS, Electron
370
+ | Framework | What's included |
371
+ |-----------|----------------|
372
+ | Next.js | App Router vs Pages Router, server components, route handlers |
373
+ | Express | Middleware chain, error handling, router organization |
374
+ | FastAPI | Dependency injection, Pydantic models, async endpoints |
375
+ | Django | Apps structure, models-views-templates, migrations |
376
+ | NestJS | Modules, controllers, providers, guards |
377
+ | SvelteKit | Load functions, form actions, server routes |
378
+ | Expo / React Native | Routing, native modules, platform-specific files |
379
+ | Vue / Nuxt | Composition API, auto-imports, data fetching |
380
+
381
+ Also supports: Fastify, Hono, Angular, Svelte, Prisma, Drizzle, Tailwind CSS, Electron, and more.
222
382
 
223
383
  ## Monorepo Support
224
384
 
@@ -228,11 +388,11 @@ codebrief detects monorepo tooling and can generate per-package context files:
228
388
  - **Turborepo** (`turbo.json`)
229
389
  - **Nx** (`nx.json`)
230
390
 
231
- When a monorepo is detected, you'll be asked if you want per-package context files. Each package gets its own scoped context with that package's specific dependencies, frameworks, and code snapshot.
391
+ When detected, you'll be asked if you want per-package files. Each package gets its own scoped context with that package's dependencies, frameworks, and code snapshot.
232
392
 
233
393
  ## Living Documents
234
394
 
235
- Generated files include maintenance directives telling your AI agent to keep them up to date as the project evolves. The code snapshot section is marked with HTML comments so it's clear what to refresh after refactors.
395
+ Generated files include maintenance directives telling your AI agent to keep them up to date. The code snapshot section uses HTML comment markers (`<!-- CODE SNAPSHOT -->`) so it's clear what to refresh after refactors.
236
396
 
237
397
  ## Development
238
398
 
@@ -241,4 +401,9 @@ npm install
241
401
  npm run build # Build with tsup
242
402
  npm run dev # Watch mode
243
403
  npm run typecheck # Type-check without emitting
404
+ npm test # Run tests with vitest
244
405
  ```
406
+
407
+ ## License
408
+
409
+ [MIT](LICENSE)