sigmap 3.4.0 → 3.5.1

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/AGENTS.md CHANGED
@@ -11,32 +11,625 @@ Use this marker block for all appendable context files:
11
11
  ```
12
12
  ## Auto-generated signatures
13
13
  <!-- Updated by gen-context.js -->
14
+ You are a coding assistant with full knowledge of this codebase.
15
+ Below are the code signatures extracted by SigMap v3.5.0 on 2026-04-14T21:58:46.968Z.
16
+
17
+ Use these signatures to answer questions about the code accurately.
18
+
19
+ ## Code Signatures
20
+
21
+ <!-- Generated by SigMap gen-context.js v3.5.0 -->
22
+ <!-- DO NOT EDIT below the marker line — run gen-context.js to regenerate -->
23
+
24
+ # Code signatures
25
+
26
+ ## changes (last 5 commits — 19 minutes ago)
27
+ ```
28
+ src/config/loader.js ~detectAutoSrcDirs
29
+ src/eval/analyzer.js ~isDockerfile
30
+ src/extractors/markdown.js +extract
31
+ src/extractors/patterns.js +extract +implementing
32
+ src/extractors/properties.js +extract
33
+ src/extractors/python_dataclass.js +extract +definitions
34
+ src/extractors/toml.js +extract
35
+ src/extractors/typescript_react.js +extract +declarations
36
+ src/extractors/vue_sfc.js +extract
37
+ src/extractors/xml.js +attributes +extract
38
+ ```
39
+
40
+ ## packages
41
+
42
+ ### packages/core/index.js
43
+ ```
44
+ module.exports = { extract, rank, buildSigIndex, scan, score, adapt }
45
+ function _resolveExtractor(language)
46
+ function extract(src, language) → string[]
47
+ function rank(query, sigIndex, opts) → { file: string, score: nu
48
+ function buildSigIndex(cwd) → Map<string, string[]>
49
+ function scan(sigs, filePath) → { safe: string[], redacte
50
+ function score(cwd) → { * score: number, * grad
51
+ function adapt(context, adapterName, opts = {}) → string
52
+ ```
53
+
54
+ ### packages/adapters/claude.js
55
+ ```
56
+ module.exports = { name, format, outputPath, write }
57
+ function format(context, opts = {}) → string
58
+ function outputPath(cwd) → string
59
+ function write(context, cwd, opts = {})
60
+ ```
61
+
62
+ ### packages/adapters/codex.js
63
+ ```
64
+ module.exports = { name, format, outputPath, write }
65
+ function format(context, opts = {}) → string
66
+ function outputPath(cwd) → string
67
+ function write(context, cwd, opts = {})
68
+ ```
69
+
70
+ ### packages/adapters/copilot.js
71
+ ```
72
+ module.exports = { name, format, outputPath, write }
73
+ function format(context, opts = {}) → string
74
+ function outputPath(cwd) → string
75
+ function write(context, cwd, opts = {})
76
+ ```
77
+
78
+ ### packages/adapters/cursor.js
79
+ ```
80
+ module.exports = { name, format, outputPath }
81
+ function format(context, opts = {}) → string
82
+ function outputPath(cwd) → string
83
+ ```
84
+
85
+ ### packages/adapters/gemini.js
86
+ ```
87
+ module.exports = { name, format, outputPath, write }
88
+ function format(context, opts = {}) → string
89
+ function outputPath(cwd) → string
90
+ function write(context, cwd, opts = {})
91
+ ```
92
+
93
+ ### packages/adapters/index.js
94
+ ```
95
+ module.exports = { getAdapter, listAdapters, adapt, outputsToAdapters }
96
+ function getAdapter(name) → { name: string, format: F
97
+ function listAdapters() → string[]
98
+ function adapt(context, adapterName, opts = {}) → string
99
+ function outputsToAdapters(outputs) → string[]
100
+ ```
101
+
102
+ ### packages/adapters/openai.js
103
+ ```
104
+ module.exports = { name, format, outputPath }
105
+ function format(context, opts = {}) → string
106
+ function outputPath(cwd) → string
107
+ ```
108
+
109
+ ### packages/adapters/windsurf.js
110
+ ```
111
+ module.exports = { name, format, outputPath }
112
+ function format(context, opts = {}) → string
113
+ function outputPath(cwd) → string
114
+ ```
115
+
116
+ ### packages/cli/index.js
117
+ ```
118
+ module.exports = { CLI_ENTRY, run }
119
+ function run(argv, cwd) → void
120
+ ```
121
+
122
+ ### packages/core/README.md
123
+ ```
124
+ h1 sigmap-core
125
+ h2 Installation
126
+ h2 Quick start
127
+ h2 API reference
128
+ h3 `extract(src, language)` → `string[]`
129
+ h3 `rank(query, sigIndex, opts?)` → `Result[]`
130
+ h3 `buildSigIndex(cwd)` → `Map<string, string[]>`
131
+ h3 `scan(sigs, filePath)` → `{ safe: string[], redacted: boolean }`
132
+ h3 `score(cwd)` → `HealthResult`
133
+ h2 Migration from v2.3 and earlier
134
+ h2 v3.0 — Multi-Adapter Architecture (released)
135
+ h2 Zero dependencies
136
+ code-fence bash
137
+ code-fence plain
138
+ code-fence js
139
+ code-fence ---
140
+ ```
141
+
142
+ ## src
143
+
144
+ ### src/config/defaults.js
145
+ ```
146
+ module.exports = { DEFAULTS }
147
+ ```
148
+
149
+ ### src/config/loader.js
150
+ ```
151
+ module.exports = { loadConfig }
152
+ function detectAutoSrcDirs(cwd, excludeList) → string[]
153
+ function loadConfig(cwd) → object
154
+ function deepClone(obj)
155
+ ```
156
+
157
+ ### src/eval/analyzer.js
158
+ ```
159
+ module.exports = { analyzeFiles, formatAnalysisTable, formatAnalysisJSON }
160
+ function isDockerfile(name)
161
+ function getExtractorName(filePath)
162
+ function tokenCount(sigs)
163
+ function hasCoverage(filePath, cwd)
164
+ function loadExtractor(name, cwd)
165
+ function analyzeFiles(files, cwd, opts) → object[]
166
+ function formatAnalysisTable(stats, showSlow) → string
167
+ function formatAnalysisJSON(stats) → object
168
+ ```
169
+
170
+ ### src/extractors/graphql.js
171
+ ```
172
+ module.exports = { extract }
173
+ function extract(src) → string[]
174
+ ```
175
+
176
+ ### src/extractors/markdown.js
177
+ ```
178
+ module.exports = { extract }
179
+ function extract(src) → string[]
180
+ ```
181
+
182
+ ### src/extractors/patterns.js
183
+ ```
184
+ module.exports = { extract }
185
+ function extract(src) → string[]
186
+ ```
187
+
188
+ ### src/extractors/properties.js
189
+ ```
190
+ module.exports = { extract }
191
+ function extract(src) → string[]
192
+ ```
193
+
194
+ ### src/extractors/protobuf.js
195
+ ```
196
+ module.exports = { extract }
197
+ function extract(src) → string[]
198
+ ```
199
+
200
+ ### src/extractors/python_dataclass.js
201
+ ```
202
+ module.exports = { extract }
203
+ function extract(src) → string[]
204
+ ```
205
+
206
+ ### src/extractors/sql.js
207
+ ```
208
+ module.exports = { extract }
209
+ function extract(src) → string[]
210
+ function _cleanName(raw)
211
+ function _normalizeParams(raw)
212
+ ```
213
+
214
+ ### src/extractors/terraform.js
215
+ ```
216
+ module.exports = { extract }
217
+ function extract(src) → string[]
218
+ ```
219
+
220
+ ### src/extractors/toml.js
221
+ ```
222
+ module.exports = { extract }
223
+ function extract(src) → string[]
224
+ ```
225
+
226
+ ### src/extractors/typescript_react.js
227
+ ```
228
+ module.exports = { extract }
229
+ function extract(src) → string[]
230
+ ```
231
+
232
+ ### src/extractors/vue_sfc.js
233
+ ```
234
+ module.exports = { extract }
235
+ function extract(src) → string[]
236
+ ```
237
+
238
+ ### src/extractors/xml.js
239
+ ```
240
+ module.exports = { extract }
241
+ function extract(src) → string[]
242
+ ```
243
+
244
+ ### src/mcp/server.js
245
+ ```
246
+ module.exports = { start }
247
+ function respond(id, result)
248
+ function respondError(id, code, message)
249
+ function dispatch(msg, cwd)
250
+ function start(cwd)
251
+ ```
252
+
253
+ ### src/eval/runner.js
254
+ ```
255
+ module.exports = { run, rank, loadTasks, buildSigIndex, formatTable, formatMetrics, tokenize }
256
+ function buildSigIndex(cwd) → Map<string, string[]>
257
+ function tokenize(text) → string[]
258
+ function scoreFile(sigs, queryTokens) → number
259
+ function rank(query, index, topK = 10) → { file: string, score: nu
260
+ function estimateTokens(sigs) → number
261
+ function loadTasks(tasksFile) → Array<{id:string, query:s
262
+ function run(tasksFile, cwd, opts = {}) → { * tasks: Array<{id, que
263
+ function formatTable(taskResults) → string
264
+ function formatMetrics(metrics) → string
265
+ ```
266
+
267
+ ### src/eval/scorer.js
268
+ ```
269
+ module.exports = { hitAtK, reciprocalRank, precisionAtK, aggregate, firstRank }
270
+ function firstRank(ranked, expected) → number
271
+ function normalizePath(p) → string
272
+ function hitAtK(ranked, expected, k = 5) → 0|1
273
+ function reciprocalRank(ranked, expected) → number
274
+ function precisionAtK(ranked, expected, k = 5) → number
275
+ function aggregate(results, k = 5) → { * hitAt5: number, // fr
276
+ function round(x)
277
+ ```
278
+
279
+ ### src/extractors/coverage.js
280
+ ```
281
+ module.exports = { buildTestIndex, isTested }
282
+ function walkFiles(dir)
283
+ function buildTestIndex(cwd, testDirs)
284
+ function isTested(funcName, testIndex)
285
+ ```
286
+
287
+ ### src/extractors/cpp.js
288
+ ```
289
+ module.exports = { extract }
290
+ function extract(src) → string[]
291
+ function extractBlock(src, startIndex)
292
+ function extractMembers(block)
293
+ function normalizeParams(params)
294
+ function normalizeType(type)
295
+ ```
296
+
297
+ ### src/extractors/csharp.js
298
+ ```
299
+ module.exports = { extract }
300
+ function extract(src) → string[]
301
+ function extractBlock(src, startIndex)
302
+ function extractMembers(block)
303
+ function normalizeParams(params)
304
+ function normalizeType(type)
305
+ ```
306
+
307
+ ### src/extractors/css.js
308
+ ```
309
+ module.exports = { extract }
310
+ function extract(src) → string[]
14
311
  ```
15
312
 
16
- ### Files that must use append-under-marker
313
+ ### src/extractors/dart.js
314
+ ```
315
+ module.exports = { extract }
316
+ function extract(src) → string[]
317
+ function extractBlock(src, startIndex)
318
+ function extractMembers(block)
319
+ function normalizeParams(params)
320
+ ```
17
321
 
18
- 1. `CLAUDE.md`
19
- 2. `.github/copilot-instructions.md`
20
- 3. `.github/gemini-context.md`
322
+ ### src/extractors/deps.js
323
+ ```
324
+ module.exports = { extractPythonDeps, extractTSDeps, buildReverseDepMap }
325
+ function extractPythonDeps(src) → string[]
326
+ function extractTSDeps(src) → string[]
327
+ function buildReverseDepMap(forwardMap) → Map<string, string[]>
328
+ ```
21
329
 
22
- ### Safe write procedure
330
+ ### src/extractors/dockerfile.js
331
+ ```
332
+ module.exports = { extract }
333
+ function extract(src) → string[]
334
+ ```
23
335
 
24
- 1. Read existing file (or start with empty string if file does not exist).
25
- 2. Find the marker `## Auto-generated signatures`.
26
- 3. If marker exists: keep everything above marker unchanged; replace only marker-and-below with new generated block.
27
- 4. If marker does not exist: append marker + generated block to the end.
28
- 5. Never modify human content above marker.
336
+ ### src/extractors/go.js
337
+ ```
338
+ module.exports = { extract }
339
+ function extract(src) string[]
340
+ function extractBlock(src, startIndex)
341
+ function extractInterfaceMethods(block)
342
+ function normalizeParams(params)
343
+ ```
29
344
 
30
- ### Legacy cleanup rule
345
+ ### src/extractors/html.js
346
+ ```
347
+ module.exports = { extract }
348
+ function extract(src) → string[]
349
+ ```
31
350
 
32
- If an existing generated file has no marker but contains prior SigMap-generated content headers, replace the full legacy generated content with marker + new generated block.
351
+ ### src/extractors/java.js
352
+ ```
353
+ module.exports = { extract }
354
+ function extract(src) → string[]
355
+ function extractBlock(src, startIndex)
356
+ function extractMembers(block)
357
+ function normalizeParams(params)
358
+ function normalizeType(type)
359
+ ```
33
360
 
34
- ## Verification
361
+ ### src/extractors/javascript.js
362
+ ```
363
+ module.exports = { extract }
364
+ function extract(src) → string[]
365
+ function extractBlock(src, startIndex)
366
+ function extractClassMembers(block, returnHints)
367
+ function buildReturnHints(src)
368
+ function normalizeType(type)
369
+ function formatReturnHint(type)
370
+ function normalizeParams(params)
371
+ ```
35
372
 
36
- After changing write logic, run:
373
+ ### src/extractors/kotlin.js
374
+ ```
375
+ module.exports = { extract }
376
+ function extract(src) → string[]
377
+ function extractBlock(src, startIndex)
378
+ function extractMembers(block)
379
+ function normalizeParams(params)
380
+ ```
37
381
 
38
- ```bash
39
- node test/integration/multi-output.test.js
382
+ ### src/extractors/php.js
383
+ ```
384
+ module.exports = { extract }
385
+ function extract(src) → string[]
386
+ function extractBlock(src, startIndex)
387
+ function extractMembers(block)
388
+ function normalizeParams(params)
389
+ function normalizeType(type)
40
390
  ```
41
391
 
42
- Expected: all tests pass, including append-preservation cases.
392
+ ### src/extractors/prdiff.js
393
+ ```
394
+ module.exports = { diffSignatures, extractName }
395
+ function diffSignatures(baseSigs, currentSigs) → {added:string[], removed:
396
+ function extractName(sig)
397
+ ```
398
+
399
+ ### src/extractors/python.js
400
+ ```
401
+ module.exports = { extract }
402
+ function extract(src) → string[]
403
+ function extractClassMethods(stripped, startIndex)
404
+ function tryExtractDataclassFields(stripped, classIndex)
405
+ function tryExtractBaseModelFields(stripped, bodyStart)
406
+ function extractClassConstants(stripped, startIndex)
407
+ function extractReturnType(sigLine)
408
+ function normalizeParams(params)
409
+ function extractDocHint(src, fnName, fnSigLine)
410
+ ```
411
+
412
+ ### src/extractors/ruby.js
413
+ ```
414
+ module.exports = { extract }
415
+ function extract(src) → string[]
416
+ function normalizeParams(params)
417
+ function extractReturnHint(stripped, index)
418
+ ```
419
+
420
+ ### src/extractors/rust.js
421
+ ```
422
+ module.exports = { extract }
423
+ function extract(src) → string[]
424
+ function extractBlock(src, startIndex)
425
+ function extractMethods(block)
426
+ function normalizeParams(params)
427
+ function extractReturnType(afterParen)
428
+ ```
429
+
430
+ ### src/extractors/scala.js
431
+ ```
432
+ module.exports = { extract }
433
+ function extract(src) → string[]
434
+ function extractBlock(src, startIndex)
435
+ function extractMembers(block)
436
+ function normalizeParams(params)
437
+ function normalizeType(type)
438
+ ```
439
+
440
+ ### src/extractors/shell.js
441
+ ```
442
+ module.exports = { extract }
443
+ function extract(src) → string[]
444
+ ```
445
+
446
+ ### src/extractors/svelte.js
447
+ ```
448
+ module.exports = { extract }
449
+ function extract(src) → string[]
450
+ function normalizeParams(params)
451
+ function normalizeType(type)
452
+ ```
453
+
454
+ ### src/extractors/swift.js
455
+ ```
456
+ module.exports = { extract }
457
+ function extract(src) → string[]
458
+ function extractBlock(src, startIndex)
459
+ function extractMembers(block)
460
+ function normalizeParams(params)
461
+ function extractArrowType(str)
462
+ ```
463
+
464
+ ### src/extractors/todos.js
465
+ ```
466
+ module.exports = { extractTodos }
467
+ function extractTodos(src) → {line:number, tag:string,
468
+ ```
469
+
470
+ ### src/extractors/typescript.js
471
+ ```
472
+ module.exports = { extract }
473
+ function extract(src) → string[]
474
+ function extractBlock(src, startIndex)
475
+ function extractInterfaceMembers(block)
476
+ function extractClassMembers(block)
477
+ function normalizeParams(params)
478
+ ```
479
+
480
+ ### src/extractors/vue.js
481
+ ```
482
+ module.exports = { extract }
483
+ function extract(src) → string[]
484
+ function normalizeParams(params)
485
+ function normalizeType(type)
486
+ ```
487
+
488
+ ### src/extractors/yaml.js
489
+ ```
490
+ module.exports = { extract }
491
+ function extract(src) → string[]
492
+ ```
493
+
494
+ ### src/format/cache.js
495
+ ```
496
+ module.exports = { formatCache, formatCachePayload }
497
+ function formatCache(content) → string
498
+ function formatCachePayload(content, model) → string
499
+ ```
500
+
501
+ ### src/format/dashboard.js
502
+ ```
503
+ module.exports = { generateDashboardHtml, renderHistoryCharts, computeExtractorCoverage, percentile, overBudgetStreak }
504
+ function toNumber(v)
505
+ function percentile(values, p)
506
+ function overBudgetStreak(entries)
507
+ function loadConfig(cwd)
508
+ function shouldExclude(rel, excludeSet)
509
+ function detectLanguage(filePath)
510
+ function walkFiles(dir, maxDepth, depth, out, excludeSet)
511
+ function computeExtractorCoverage(cwd)
512
+ function readBenchmarkTrend(cwd)
513
+ function lineChartSvg(values, title, ySuffix)
514
+ function barChartSvg(perLanguage)
515
+ function sparkline(values)
516
+ function buildDashboardData(cwd, health)
517
+ function generateDashboardHtml(cwd, health)
518
+ function renderHistoryCharts(cwd, health)
519
+ ```
520
+
521
+ ### src/graph/builder.js
522
+ ```
523
+ module.exports = { build, buildFromCwd, extractFileDeps }
524
+ function resolveJsPath(dir, importStr, fileSet) → string|null
525
+ function extractFileDeps(filePath, content, fileSet) → string[]
526
+ function build(files, cwd) → { forward: Map<string,str
527
+ function buildFromCwd(cwd, opts) → { forward: Map<string,str
528
+ ```
529
+
530
+ ### src/graph/impact.js
531
+ ```
532
+ module.exports = { getImpact, analyzeImpact, formatImpact, formatImpactJSON }
533
+ function bfs(startFile, reverseGraph, maxDepth) → { direct: Set<string>, tr
534
+ function isTestFile(f)
535
+ function isRouteFile(f)
536
+ function getImpact(changedFile, graph, opts) → { * changed: string, * di
537
+ function analyzeImpact(changedFiles, cwd, opts) → { file: string, impact: o
538
+ function formatImpact(result) → string
539
+ function formatImpactJSON(result) → object
540
+ ```
541
+
542
+ ### src/health/scorer.js
543
+ ```
544
+ module.exports = { score }
545
+ function score(cwd) → { * score: number, * grad
546
+ ```
547
+
548
+ ### src/map/class-hierarchy.js
549
+ ```
550
+ module.exports = { analyze }
551
+ function analyze(files, cwd)
552
+ ```
553
+
554
+ ### src/map/import-graph.js
555
+ ```
556
+ module.exports = { analyze }
557
+ function extractImports(filePath, content, fileSet)
558
+ function resolveJsPath(dir, importStr, fileSet)
559
+ function detectCycles(graph)
560
+ function analyze(files, cwd)
561
+ ```
562
+
563
+ ### src/map/route-table.js
564
+ ```
565
+ module.exports = { analyze }
566
+ function shouldSkipFile(rel)
567
+ function analyze(files, cwd)
568
+ ```
569
+
570
+ ### src/mcp/handlers.js
571
+ ```
572
+ module.exports = { readContext, searchSignatures, getMap, createCheckpoint, getRouting, explainFile, listModules, queryContext, getImpact }
573
+ function readContext(args, cwd)
574
+ function searchSignatures(args, cwd)
575
+ function getMap(args, cwd)
576
+ function createCheckpoint(args, cwd)
577
+ function getRouting(args, cwd)
578
+ function explainFile(args, cwd)
579
+ function listModules(args, cwd)
580
+ function queryContext(args, cwd)
581
+ function getImpact(args, cwd)
582
+ ```
583
+
584
+ ### src/mcp/tools.js
585
+ ```
586
+ module.exports = { TOOLS }
587
+ ```
588
+
589
+ ### src/retrieval/ranker.js
590
+ ```
591
+ module.exports = { rank, buildSigIndex, scoreFile, formatRankTable, formatRankJSON, DEFAULT_WEIGHTS }
592
+ function scoreFile(filePath, sigs, queryTokens, weights) → number
593
+ function rank(query, sigIndex, opts) → { file: string, score: nu
594
+ function buildSigIndex(cwd) → Map<string, string[]>
595
+ function formatRankTable(results, query) → string
596
+ function formatRankJSON(results, query) → object
597
+ ```
598
+
599
+ ### src/retrieval/tokenizer.js
600
+ ```
601
+ module.exports = { tokenize, STOP_WORDS }
602
+ function tokenize(text, opts) → string[]
603
+ ```
604
+
605
+ ### src/routing/classifier.js
606
+ ```
607
+ module.exports = { classify, classifyAll }
608
+ function classify(filePath, sigs) → 'fast'|'balanced'|'powerf
609
+ function classifyAll(fileEntries, cwd) → { fast: string[], balance
610
+ ```
611
+
612
+ ### src/routing/hints.js
613
+ ```
614
+ module.exports = { TIERS, formatRoutingSection }
615
+ function formatRoutingSection(groups) → string
616
+ ```
617
+
618
+ ### src/security/patterns.js
619
+ ```
620
+ module.exports = { PATTERNS }
621
+ ```
622
+
623
+ ### src/security/scanner.js
624
+ ```
625
+ module.exports = { scan }
626
+ function scan(signatures, filePath) → { safe: string[], redacte
627
+ ```
628
+
629
+ ### src/tracking/logger.js
630
+ ```
631
+ module.exports = { logRun, readLog, summarize }
632
+ function logRun(entry, cwd)
633
+ function readLog(cwd) → object[]
634
+ function summarize(entries) → object
635
+ ```
package/CHANGELOG.md CHANGED
@@ -10,6 +10,31 @@ Format: [Semantic Versioning](https://semver.org/)
10
10
 
11
11
  ---
12
12
 
13
+ ## [3.5.0] — 2026-04-14 — Phase C/D Intelligence Expansion
14
+
15
+ ### Added
16
+ - **Phase C framework-specialized extractors** for richer framework-level signatures:
17
+ - TypeScript React: `.tsx` component metadata (props, hooks, handlers)
18
+ - Vue SFC: `.vue` component metadata (props, emits, slots, lifecycle)
19
+ - Python dataclass/model patterns: dataclasses, Pydantic models, ORM-style fields
20
+ - **Phase D cross-module pattern extractor**:
21
+ - Detects DI containers and injection signatures
22
+ - Detects service, repository, middleware, and controller layer hints
23
+ - Detects type-to-implementation linkage and domain use-case cues
24
+ - Flags unsafe patterns (null-check risks, weak validation, error exposure)
25
+
26
+ ### Changed
27
+ - **Extractor mapping expanded** so framework-specific files route to specialized extractors (`.tsx` and `.vue`) for higher-signal signatures.
28
+ - **Standalone/bundled runtime wiring updated** to include new Phase C/D extractors in factory resolution.
29
+
30
+ ### Testing
31
+ - Added integration coverage for Phase C extractors (`phase-c-extractors`) and Phase D pattern inference (`phase-d-patterns`).
32
+ - Current results:
33
+ - `phase-c-extractors`: 3 passed, 0 failed
34
+ - `phase-d-patterns`: 10 passed, 0 failed
35
+
36
+ ---
37
+
13
38
  ## [3.4.0] — 2026-04-14 — Phase A/B Coverage Expansion
14
39
 
15
40
  ### Added
@@ -24,6 +49,16 @@ Format: [Semantic Versioning](https://semver.org/)
24
49
  - **Framework-aware source discovery** defaults expanded for Next/React, Angular, Rails, Laravel, and Flask/Python-style layouts.
25
50
  - **Strategy audit coverage rules** updated to treat Phase A formats as supported instead of important unsupported baselines.
26
51
  - **Default srcDirs** broadened to improve first-run context quality on framework-heavy repositories.
52
+ ## [3.3.4] — 2026-04-14 — Binary Bundle Fix
53
+
54
+ ### Fixed
55
+ - **Standalone binary pre-flight now passes for new P1 extractors**
56
+ - Added missing bundled `__factories` entries in `gen-context.js` for:
57
+ - `./src/extractors/graphql`
58
+ - `./src/extractors/protobuf`
59
+ - `./src/extractors/sql`
60
+ - `./src/extractors/terraform`
61
+ - Resolves CI/build failure in `scripts/build-binary.mjs` reporting missing `src/` modules in bundle.
27
62
 
28
63
  ---
29
64