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 +253 -88
- package/dist/index.js +706 -289
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -1,124 +1,268 @@
|
|
|
1
1
|
# codebrief
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Give your AI agent full project context, without the warm-up.
|
|
4
4
|
|
|
5
5
|

|
|
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
|
-
|
|
128
|
+
codebrief will:
|
|
14
129
|
|
|
15
|
-
1. **
|
|
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
|
|
133
|
+
4. **Generate** an optimized context file for your chosen tool
|
|
19
134
|
5. **Show** a summary with token savings estimate
|
|
20
135
|
|
|
21
|
-
|
|
136
|
+
Your answers are saved to `.codebrief.json` so future runs skip the prompts.
|
|
22
137
|
|
|
23
|
-
##
|
|
138
|
+
## Supported Tools
|
|
24
139
|
|
|
25
|
-
|
|
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
|
-
|
|
152
|
+
## How It Works
|
|
28
153
|
|
|
29
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
###
|
|
180
|
+
### PageRank
|
|
44
181
|
|
|
45
|
-
|
|
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
|
-
|
|
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
|
-
###
|
|
186
|
+
### Dead Export Removal
|
|
50
187
|
|
|
51
|
-
|
|
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
|
-
|
|
190
|
+
This catches leftover refactors, over-exported utilities, and test-only helpers, keeping the context lean.
|
|
54
191
|
|
|
55
|
-
###
|
|
192
|
+
### Token Budgeting
|
|
56
193
|
|
|
57
|
-
|
|
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
|
-
|
|
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
|
-
|
|
200
|
+
Lower-priority items fill whatever budget remains.
|
|
62
201
|
|
|
63
|
-
|
|
202
|
+
### Layer Detection
|
|
64
203
|
|
|
65
|
-
|
|
204
|
+
Classifies files into architecture layers based on directory and naming conventions:
|
|
66
205
|
|
|
67
|
-
|
|
206
|
+
```
|
|
207
|
+
types → stores → services → hooks → components → pages
|
|
208
|
+
↑
|
|
209
|
+
utils, config
|
|
210
|
+
```
|
|
68
211
|
|
|
69
|
-
|
|
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
|
-
|
|
214
|
+
### Cycle Detection
|
|
72
215
|
|
|
73
|
-
|
|
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
|
-
**
|
|
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
|
-
|
|
220
|
+
### Instability Scoring
|
|
78
221
|
|
|
79
|
-
|
|
222
|
+
Computes an [instability metric](https://en.wikipedia.org/wiki/Software_package_metrics) for each file:
|
|
80
223
|
|
|
81
|
-
|
|
224
|
+
```
|
|
225
|
+
instability = outgoing imports / (outgoing + incoming imports)
|
|
226
|
+
```
|
|
82
227
|
|
|
83
|
-
|
|
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
|
-
###
|
|
230
|
+
### Change Coupling
|
|
86
231
|
|
|
87
|
-
|
|
232
|
+
Analyzes 90 days of git history to find file pairs that frequently appear in the same commits.
|
|
88
233
|
|
|
89
|
-
|
|
234
|
+
**Example output:**
|
|
90
235
|
|
|
91
|
-
|
|
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
|
-
|
|
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
|
-
|
|
243
|
+
### Module Clustering
|
|
96
244
|
|
|
97
|
-
|
|
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
|
-
|
|
247
|
+
This reveals logical boundaries (auth module, payments module, settings module) even when the folder layout doesn't reflect them.
|
|
100
248
|
|
|
101
|
-
|
|
249
|
+
### Git Activity
|
|
102
250
|
|
|
103
|
-
|
|
251
|
+
Counts commits per file over the last 90 days to surface:
|
|
104
252
|
|
|
105
|
-
**
|
|
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
|
-
|
|
257
|
+
### Stale Detection
|
|
108
258
|
|
|
109
|
-
|
|
259
|
+
Hashes all source file paths and modification times. Run `--check` to compare against the stored hash:
|
|
110
260
|
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
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
|
|
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` |
|
|
134
|
-
| `--refresh-snapshot` | Re-scan source files and update the code snapshot
|
|
135
|
-
| `--reconfigure` |
|
|
136
|
-
| `--check` | Check if the snapshot is stale (exit
|
|
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
|
|
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
|
-
|
|
299
|
+
Automatically detect stale snapshots when you `cd` into a project:
|
|
152
300
|
|
|
153
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
362
|
+
Subsequent runs load this config and skip all prompts. Use `--reconfigure` to re-prompt.
|
|
206
363
|
|
|
207
|
-
Add `.codebrief.json` to your `.gitignore
|
|
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
|
|
368
|
+
codebrief detects your framework and includes relevant best practices:
|
|
212
369
|
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
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
|
|
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
|
|
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)
|