purecontext-mcp 1.1.1 → 1.1.2

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.
Files changed (37) hide show
  1. package/package.json +1 -1
  2. package/docs/dev/API_STABILITY.md +0 -319
  3. package/docs/dev/DECISIONS.md +0 -22
  4. package/docs/dev/DOCUMENTATION_PLAN.md +0 -113
  5. package/docs/dev/PHASE10_TASKS.md +0 -476
  6. package/docs/dev/PHASE11_TASKS.md +0 -385
  7. package/docs/dev/PHASE12_TASKS.md +0 -335
  8. package/docs/dev/PHASE13_TASKS.md +0 -381
  9. package/docs/dev/PHASE14_TASKS.md +0 -371
  10. package/docs/dev/PHASE15_TASKS.md +0 -256
  11. package/docs/dev/PHASE16_TASKS.md +0 -314
  12. package/docs/dev/PHASE17_TASKS.md +0 -321
  13. package/docs/dev/PHASE18_TASKS.md +0 -345
  14. package/docs/dev/PHASE19_TASKS.md +0 -261
  15. package/docs/dev/PHASE1_TASKS.md +0 -443
  16. package/docs/dev/PHASE20_TASKS.md +0 -280
  17. package/docs/dev/PHASE21_TASKS.md +0 -355
  18. package/docs/dev/PHASE22_TASKS.md +0 -371
  19. package/docs/dev/PHASE23_TASKS.md +0 -274
  20. package/docs/dev/PHASE24_TASKS.md +0 -326
  21. package/docs/dev/PHASE25_TASKS.md +0 -452
  22. package/docs/dev/PHASE26_TASKS.md +0 -253
  23. package/docs/dev/PHASE27_TASKS.md +0 -410
  24. package/docs/dev/PHASE2_TASKS.md +0 -328
  25. package/docs/dev/PHASE3_TASKS.md +0 -571
  26. package/docs/dev/PHASE4_TASKS.md +0 -531
  27. package/docs/dev/PHASE5_TASKS.md +0 -835
  28. package/docs/dev/PHASE6_TASKS.md +0 -347
  29. package/docs/dev/PHASE7_TASKS.md +0 -257
  30. package/docs/dev/PHASE8_TASKS.md +0 -299
  31. package/docs/dev/PHASE9_TASKS.md +0 -320
  32. package/docs/dev/PureContext_MCP_PRD_v1.0.docx +0 -0
  33. package/docs/dev/SELF_HOSTING.md +0 -142
  34. package/docs/dev/TEAM_SETUP.md +0 -316
  35. package/docs/dev/TELEMETRY.md +0 -99
  36. package/docs/dev/feature-analysis.md +0 -305
  37. package/docs/dev/phase-1-notes.md +0 -3
@@ -1,443 +0,0 @@
1
- # Phase 1 — Task Breakdown
2
-
3
- **Goal**: Working MCP server that indexes JS/TS projects with symbol-level retrieval and dependency graph.
4
-
5
- **Approach**: Tasks are sequenced so each one builds on the previous. Complete them in order. Each task should be independently testable before moving to the next.
6
-
7
- ---
8
-
9
- ## Task 1: Project Scaffolding
10
-
11
- Set up the TypeScript project with all tooling configured.
12
-
13
- **Deliverables:**
14
- - `package.json` with ES modules, scripts (build, dev, test, lint), and dependencies
15
- - `tsconfig.json` with strict mode, ES2022 target, NodeNext module resolution
16
- - `vitest.config.ts`
17
- - `.eslintrc.cjs` with TypeScript rules
18
- - `.gitignore`
19
- - Empty directory structure matching CLAUDE.md specification
20
- - `src/index.ts` entry point that prints version and exits
21
-
22
- **Dependencies to install:**
23
- - `typescript`, `@types/node`
24
- - `web-tree-sitter`
25
- - `better-sqlite3`, `@types/better-sqlite3`
26
- - `@modelcontextprotocol/sdk`
27
- - `chokidar`
28
- - `vitest` (dev)
29
- - `eslint`, `@typescript-eslint/parser`, `@typescript-eslint/eslint-plugin` (dev)
30
-
31
- **Verify:** `npm run build` succeeds, `npm run test` runs (no tests yet), `node dist/index.js` prints version.
32
-
33
- ---
34
-
35
- ## Task 2: Core Types and Error System
36
-
37
- Define the foundational types and error classes that everything else depends on.
38
-
39
- **Deliverables:**
40
- - `src/core/types.ts` — `SymbolRecord`, `SymbolKind`, `ImportRecord`, `LanguageHandler`, `FrameworkAdapter`, `ProcessedBlock`, `RepoMetadata`, `IndexOptions`
41
- - `src/core/errors.ts` — `PureContextError` base class, `IndexError`, `ParseError`, `ConfigError`, `StorageError`
42
- - `src/core/logger.ts` — Simple leveled logger (debug/info/warn/error) that writes to stderr (stdout is reserved for MCP stdio transport)
43
-
44
- **Verify:** Types compile cleanly. Logger outputs formatted messages to stderr.
45
-
46
- **Tests:** Logger formatting test.
47
-
48
- ---
49
-
50
- ## Task 3: SQLite Schema and Storage Layer
51
-
52
- Create the database schema and CRUD operations.
53
-
54
- **Deliverables:**
55
- - `src/core/db/schema.ts` — Table creation SQL, schema version, migration support
56
- - `repos` table: id, root_path, symbol_count, file_count, languages (JSON), indexed_at, schema_version
57
- - `symbols` table: id, repo_id, name, kind, file_path, start_byte, end_byte, signature, summary, framework_meta (JSON), indexed_at
58
- - `files` table: repo_id, path, content_hash, raw_content (BLOB), indexed_at
59
- - `dep_edges` table: repo_id, source_file, source_symbol_id (nullable), target_file, target_symbol_id (nullable), edge_type, specifier
60
- - Indexes on: symbols(repo_id, name), symbols(repo_id, file_path), symbols(repo_id, kind), dep_edges(repo_id, source_file), dep_edges(repo_id, target_file)
61
- - `src/core/db/symbol-store.ts` — insertSymbols (batch), searchSymbols (FTS or LIKE), getSymbolById, getSymbolsByFile, getSymbolsByRepo, deleteByFile
62
- - `src/core/db/file-store.ts` — upsertFile, getFileContent, getFileHash, deleteFile
63
- - `src/core/db/dep-store.ts` — insertEdges (batch), getForwardDeps, getReverseDeps, getImportersOf, findDeadExports
64
-
65
- **Key decisions:**
66
- - Use `better-sqlite3` synchronous API (faster than async for local DB)
67
- - Database file at `~/.purecontext/indexes/{repoId}.db`
68
- - Repo ID = `SHA-256(absolutePath).slice(0, 16)`
69
- - Batch inserts use transactions for performance
70
-
71
- **Verify:** Can create DB, insert symbols, query by name, query deps.
72
-
73
- **Tests:** Unit tests for each store with an in-memory SQLite database.
74
-
75
- ---
76
-
77
- ## Task 4: File Discovery and Hash Cache
78
-
79
- Build the file scanner that finds and prioritizes source files.
80
-
81
- **Deliverables:**
82
- - `src/core/file-discovery.ts`
83
- - `discoverFiles(rootPath, options)` — recursively scan directory
84
- - Respect `.gitignore` patterns (use a simple `.gitignore` parser or `ignore` npm package)
85
- - Built-in exclusions: `node_modules/`, `.git/`, `dist/`, `build/`, `.claude/`, `.env*`, `*.lock`
86
- - Priority ordering: `src/` > `lib/` > `app/` > `pages/` > `components/` > `server/` > everything else > `test/` > `__tests__/`
87
- - File count limit (default 1000, configurable)
88
- - Filter by supported extensions (from registered language handlers)
89
- - Return: `DiscoveredFile[]` with path, size, priority
90
- - `src/core/hash-cache.ts`
91
- - In-memory `Map<string, string>` (filePath → SHA-256 hash)
92
- - `computeHash(content: Buffer): string`
93
- - `hasChanged(filePath, newHash): boolean`
94
- - `sync(db)` — persist to files table
95
- - `loadFromDb(db, repoId)` — hydrate cache from SQLite on startup
96
-
97
- **Verify:** Scan a real project directory, get sorted file list, compute hashes.
98
-
99
- **Tests:** Test against `test/fixtures/basic-ts-project/` (create a small fixture with 5-10 files).
100
-
101
- ---
102
-
103
- ## Task 5: Tree-sitter Integration
104
-
105
- Set up web-tree-sitter with WASM grammar loading.
106
-
107
- **Deliverables:**
108
- - Download and bundle WASM grammars into `grammars/`:
109
- - `tree-sitter-typescript.wasm`
110
- - `tree-sitter-tsx.wasm`
111
- - `tree-sitter-javascript.wasm`
112
- - `src/core/parse-dispatcher.ts`
113
- - `initParser()` — initialize web-tree-sitter, load WASM grammars
114
- - `parseFile(source: Buffer, handler: LanguageHandler): Tree` — parse source with handler's grammar
115
- - Grammar caching: load each grammar once, reuse across files
116
- - `src/handlers/handler-registry.ts`
117
- - `registerHandler(handler: LanguageHandler)` — register by extensions
118
- - `getHandler(filePath: string): LanguageHandler | null` — resolve by extension
119
- - `getAllHandlers(): LanguageHandler[]`
120
- - Auto-scan `src/handlers/` for handler files at startup
121
-
122
- **Key technical notes:**
123
- - `web-tree-sitter` requires calling `Parser.init()` before use (async, loads WASM runtime)
124
- - Grammar loading: `parser.setLanguage(await Parser.Language.load('path/to/grammar.wasm'))`
125
- - The Tree object holds the CST; traverse via `tree.rootNode`
126
-
127
- **Verify:** Parse a TypeScript file, walk the tree, print node types.
128
-
129
- **Tests:** Parse a known fixture file, verify root node type is `program`.
130
-
131
- ---
132
-
133
- ## Task 6: TypeScript/JavaScript Language Handler
134
-
135
- The first (and for Phase 1, only) language handler.
136
-
137
- **Deliverables:**
138
- - `src/handlers/typescript.ts` — implements `LanguageHandler`
139
- - `extensions()`: `['.ts', '.tsx', '.mts', '.cts']`
140
- - `grammarPath()`: path to typescript/tsx WASM
141
- - `extractSymbols()`: Walk AST, extract symbols from these node types:
142
- - `function_declaration` → kind: 'function'
143
- - `class_declaration` → kind: 'class'
144
- - `method_definition` (inside class) → kind: 'method'
145
- - `lexical_declaration` with `export` → kind: 'const' (for exported const/let)
146
- - `type_alias_declaration` → kind: 'type'
147
- - `interface_declaration` → kind: 'interface'
148
- - `enum_declaration` → kind: 'enum'
149
- - `arrow_function` assigned to exported const → kind: 'function'
150
- - For each: capture name, byte offsets (startIndex/endIndex), build signature from the declaration line
151
- - `extractImports()`: Find `import_statement` nodes, parse:
152
- - Default imports, named imports, namespace imports
153
- - `import type` detection
154
- - Source specifier (the string after `from`)
155
- - `extractDocstring()`: Look for comment node immediately preceding symbol node (JSDoc `/** */` pattern), extract first sentence
156
-
157
- - `src/handlers/javascript.ts` — implements `LanguageHandler`
158
- - Mostly identical to TypeScript but with JS grammar
159
- - `extensions()`: `['.js', '.jsx', '.mjs', '.cjs']`
160
- - No type-specific nodes (type_alias, interface)
161
-
162
- **Key extraction logic:**
163
- ```
164
- For each child of root:
165
- If node.type is 'export_statement':
166
- Check its child — could be function_declaration, class_declaration, lexical_declaration
167
- Extract the actual declaration from inside the export wrapper
168
- If node.type is 'function_declaration', 'class_declaration', etc.:
169
- Extract directly (non-exported symbol, still useful for internal navigation)
170
- ```
171
-
172
- **Signature building:**
173
- - For functions: `function name(params): returnType`
174
- - For classes: `class Name extends Base implements Interface`
175
- - For const: `const name: Type = ...` (truncate value)
176
- - For types/interfaces: `type Name = ...` or `interface Name { ... }` (truncate body)
177
- - Keep signatures under 120 chars
178
-
179
- **Verify:** Index `test/fixtures/basic-ts-project/`, confirm all exported functions, classes, types are extracted with correct byte offsets.
180
-
181
- **Tests:** Comprehensive tests with fixture files covering: simple functions, arrow functions, classes with methods, type aliases, interfaces, enums, default exports, named exports, re-exports, import statements.
182
-
183
- ---
184
-
185
- ## Task 7: Import Path Resolution
186
-
187
- Resolve import specifiers to actual file paths within the project.
188
-
189
- **Deliverables:**
190
- - `src/graph/path-resolver.ts`
191
- - `createResolver(projectRoot: string): PathResolver`
192
- - Load `tsconfig.json` → extract `compilerOptions.paths` and `baseUrl`
193
- - Resolve strategies (tried in order):
194
- 1. Relative paths (`./foo`, `../bar`) → resolve against importing file's directory
195
- 2. tsconfig paths (`@/utils/foo`) → map through paths config
196
- 3. Index files → try appending `/index.ts`, `/index.js`
197
- 4. Extension resolution → try `.ts`, `.tsx`, `.js`, `.jsx` if no extension
198
- 5. External packages → if specifier doesn't start with `.` or `@/` and isn't in paths, mark as external (resolvedPath = null)
199
- - Return `resolvedPath` relative to project root, or `null` for external
200
-
201
- **Key edge cases:**
202
- - `@/` alias (common in Vue/Nuxt — maps to `src/`)
203
- - `~/` alias (Nuxt convention)
204
- - Barrel files (`index.ts` re-exports)
205
- - Path aliases with wildcards (`"@components/*": ["src/components/*"]`)
206
-
207
- **Verify:** Resolve imports from fixture project files correctly, including alias paths.
208
-
209
- **Tests:** Test each resolution strategy independently. Test with a tsconfig that has path aliases.
210
-
211
- ---
212
-
213
- ## Task 8: Dependency Graph Builder
214
-
215
- Build the import dependency graph from extracted ImportRecords.
216
-
217
- **Deliverables:**
218
- - `src/graph/graph-builder.ts`
219
- - `buildGraph(imports: ImportRecord[], resolver: PathResolver, repoId: string): DepEdge[]`
220
- - For each import: resolve path, create edge(s) from source file to target file
221
- - If specific named imports: create symbol-level edges (source file → target symbol)
222
- - Store edges in `dep_edges` table via dep-store
223
- - `src/graph/graph-traversal.ts`
224
- - `getBlastRadius(symbolId, depth, db): SymbolRecord[]` — reverse-walk deps to find all affected symbols
225
- - `getContextBundle(symbolId, depth, db): SymbolRecord[]` — forward-walk deps to find all dependencies
226
- - `findImporters(filePath, db): { file, symbols }[]` — who imports this file
227
- - `findDeadCode(repoId, db): SymbolRecord[]` — exported symbols with zero importers
228
- - All traversals return results with token count estimates
229
-
230
- **Verify:** Build graph for fixture project, query blast radius and context bundle, verify results match expected dependency chains.
231
-
232
- **Tests:** Fixture project with known dependency chain (A imports B, B imports C). Verify forward/reverse walks.
233
-
234
- ---
235
-
236
- ## Task 9: Index Manager (Orchestrator)
237
-
238
- The central coordinator that ties the pipeline together.
239
-
240
- **Deliverables:**
241
- - `src/core/index-manager.ts`
242
- - `indexFolder(rootPath, options): IndexResult`
243
- 1. Compute repo ID from rootPath
244
- 2. Create/open SQLite database
245
- 3. Run file discovery
246
- 4. Load hash cache from DB
247
- 5. Filter to changed files only
248
- 6. For each changed file:
249
- a. Get language handler
250
- b. Parse with tree-sitter
251
- c. Extract symbols
252
- d. Extract imports
253
- e. Extract docstrings → set as summaries
254
- f. Generate symbol IDs
255
- 7. Batch insert symbols to DB
256
- 8. Resolve import paths
257
- 9. Build dependency graph, batch insert edges
258
- 10. Update hash cache
259
- 11. Update repo metadata
260
- 12. Return IndexResult (counts, timing, errors)
261
- - `reindexFiles(repoId, changedPaths): IndexResult` — fast path for watcher events
262
- - `deleteIndex(repoId)` — remove DB file
263
-
264
- **Verify:** Index `test/fixtures/basic-ts-project/` end-to-end. Query symbols and deps from resulting DB.
265
-
266
- **Tests:** Full integration test: index a fixture, verify symbol count, verify dep edges, re-index after file change, verify incremental behavior.
267
-
268
- ---
269
-
270
- ## Task 10: Summary Generator
271
-
272
- Three-stage fallback for symbol summaries (no AI in Phase 1).
273
-
274
- **Deliverables:**
275
- - `src/summarizer/summarizer.ts`
276
- - `generateSummary(symbol, docstring): string`
277
- - Stage 1: If docstring exists, extract first sentence (up to first period or 100 chars)
278
- - Stage 2: (Placeholder for Phase 2 — framework-derived summaries)
279
- - Stage 3: (Placeholder for Phase 2 — AI batch summarization)
280
- - Stage 4: Use signature as summary (truncated to 100 chars)
281
- - `src/summarizer/docstring-extractor.ts`
282
- - Parse JSDoc/TSDoc format
283
- - Extract `@description` or first paragraph
284
- - Strip tags, markdown, and formatting
285
-
286
- **Verify:** Symbols with JSDoc get docstring summaries. Symbols without get signature summaries.
287
-
288
- **Tests:** Various JSDoc formats (single-line, multi-line, with tags, without).
289
-
290
- ---
291
-
292
- ## Task 11: MCP Server and Tool Handlers
293
-
294
- Wire everything up as an MCP server.
295
-
296
- **Deliverables:**
297
- - `src/server/mcp-server.ts`
298
- - Initialize MCP server with `@modelcontextprotocol/sdk`
299
- - Register all tools with names, descriptions, JSON schemas
300
- - stdio transport
301
- - Graceful shutdown handling
302
- - `src/server/tools/` — one file per tool:
303
- - `index-folder.ts` — calls IndexManager.indexFolder, returns counts and timing
304
- - `resolve-repo.ts` — computes repo ID, checks if DB exists, returns metadata or hint
305
- - `list-repos.ts` — scan `~/.purecontext/indexes/` for DB files, return metadata
306
- - `search-symbols.ts` — search by name/kind/file pattern, return signatures + summaries (no source)
307
- - `get-symbol-source.ts` — retrieve raw source via byte offsets from file cache
308
- - `get-file-outline.ts` — all symbols in a file with signatures and summaries
309
- - `get-repo-outline.ts` — files with their top-level symbols
310
- - `get-file-tree.ts` — directory structure with file counts
311
- - `get-context-bundle.ts` — symbol + forward deps, include token count
312
- - `get-blast-radius.ts` — symbol + reverse deps
313
- - `find-importers.ts` — files importing a given module
314
- - `find-dead-code.ts` — exported symbols with zero importers
315
-
316
- **Key design:**
317
- - Each tool handler is a pure function: `(input, services) => output`
318
- - Services object holds: IndexManager, SymbolStore, DepStore, PathResolver
319
- - Tool responses include a `_tokenEstimate` field so agents can gauge response size
320
-
321
- **Verify:** Start server, connect with Claude Code, index a project, run search and retrieval tools.
322
-
323
- **Tests:** Unit tests for each tool handler with mocked services. Integration test: start server, send MCP messages via stdio, verify responses.
324
-
325
- ---
326
-
327
- ## Task 12: File Watcher
328
-
329
- Live re-indexing on file changes.
330
-
331
- **Deliverables:**
332
- - `src/core/watcher/file-watcher.ts`
333
- - `startWatching(rootPath, repoId, indexManager, options)`
334
- - Use chokidar to watch the indexed directory
335
- - Debounce events (default 2000ms, configurable)
336
- - Batch changed paths during debounce window
337
- - On debounce fire: call `indexManager.reindexFiles(repoId, changedPaths)` — fast path
338
- - Handle: add, change, unlink events
339
- - Ignore: node_modules, .git, dist, build (same as file discovery exclusions)
340
- - `stopWatching()` — cleanup
341
-
342
- **Verify:** Start watching, modify a file, verify re-index happens within debounce window.
343
-
344
- **Tests:** Use temp directory, create/modify/delete files, verify watcher events and re-indexing.
345
-
346
- ---
347
-
348
- ## Task 13: Configuration System
349
-
350
- User-configurable settings with sensible defaults.
351
-
352
- **Deliverables:**
353
- - `src/config/config-schema.ts` — JSON schema for `config.json`
354
- - `indexDir`: where to store indexes (default: `~/.purecontext/indexes/`)
355
- - `fileLimit`: max files to index (default: 1000)
356
- - `watchDebounceMs`: watcher debounce (default: 2000)
357
- - `excludePatterns`: additional glob patterns to exclude
358
- - `adapters`: `'auto'` | `string[]` | `'none'` (default: `'auto'`)
359
- - `ai.provider`: `'anthropic'` | `'openai'` | `'none'` (default: `'none'`)
360
- - `ai.allowRemoteAI`: boolean (default: false)
361
- - `layers`: layer violation config (optional)
362
- - `src/config/config-loader.ts` — load from `~/.purecontext/config.json`, merge with defaults
363
- - `src/config/cli.ts`
364
- - `config --init` — generate default config.json with comments
365
- - `config --check` — validate config, check prerequisites (tree-sitter grammars present, SQLite working)
366
- - `config` — show effective configuration
367
-
368
- **Verify:** `npx purecontext-mcp config --init` creates config, `--check` validates it.
369
-
370
- **Tests:** Config loading with various override combinations.
371
-
372
- ---
373
-
374
- ## Task 14: Entry Point and CLI
375
-
376
- Tie everything together into a runnable command.
377
-
378
- **Deliverables:**
379
- - `src/index.ts`
380
- - Parse CLI args: `purecontext-mcp` (start server), `purecontext-mcp config [--init|--check]`
381
- - Initialize parser, load handlers, start MCP server
382
- - Handle SIGINT/SIGTERM for graceful shutdown
383
- - `package.json` `"bin"` field pointing to compiled entry point
384
- - `README.md` with:
385
- - Quick start (install, configure, connect to Claude Code)
386
- - Tool reference (brief description of each tool)
387
- - Configuration reference
388
- - Architecture overview (link to PRD)
389
-
390
- **Verify:** Full end-to-end: `npx purecontext-mcp` → Claude Code connects → index a real project → search symbols → retrieve source → check blast radius.
391
-
392
- ---
393
-
394
- ## Task 15: Integration Testing and Polish
395
-
396
- Final validation before Phase 1 is complete.
397
-
398
- **Deliverables:**
399
- - Create `test/fixtures/basic-ts-project/` — a small but representative TypeScript project:
400
- - 3-4 modules with imports between them
401
- - Functions, classes, interfaces, types, enums
402
- - JSDoc comments on some symbols
403
- - A tsconfig.json with path aliases
404
- - At least one circular dependency to test graph handling
405
- - End-to-end integration test:
406
- 1. Index the fixture project
407
- 2. Verify symbol count matches expected
408
- 3. Search for a symbol by name → verify found
409
- 4. Get symbol source → verify byte offsets produce correct code
410
- 5. Get context bundle → verify dependencies included
411
- 6. Get blast radius → verify reverse deps
412
- 7. Find dead code → verify unreferenced exports detected
413
- 8. Modify a fixture file → trigger re-index → verify incremental update
414
- - Performance benchmark:
415
- - Index a medium project (500+ files) if available
416
- - Measure: index time, search time, retrieval time
417
- - Compare token counts: symbol retrieval vs. full file
418
-
419
- **Verify:** All tests pass. Performance targets from PRD Section 8.2 are met.
420
-
421
- ---
422
-
423
- ## Order of Execution
424
-
425
- ```
426
- Task 1: Project scaffolding ██░░░░░░░░ Foundation
427
- Task 2: Core types and errors ██░░░░░░░░ Foundation
428
- Task 3: SQLite schema + stores ███░░░░░░░ Storage
429
- Task 4: File discovery + hashing ███░░░░░░░ Storage
430
- Task 5: Tree-sitter integration ████░░░░░░ Parsing
431
- Task 6: TS/JS language handler █████░░░░░ Parsing
432
- Task 7: Import path resolution █████░░░░░ Graph
433
- Task 8: Dependency graph builder ██████░░░░ Graph
434
- Task 9: Index manager orchestrator ███████░░░ Integration
435
- Task 10: Summary generator ███████░░░ Integration
436
- Task 11: MCP server + tool handlers ████████░░ Server
437
- Task 12: File watcher █████████░ Server
438
- Task 13: Configuration system █████████░ Server
439
- Task 14: Entry point + CLI ██████████ Polish
440
- Task 15: Integration testing ██████████ Polish
441
- ```
442
-
443
- **After Phase 1 is complete**, move to Phase 2 (Vue + Nuxt adapters) as defined in the PRD.