@redaksjon/brennpunkt 0.0.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/README.md ADDED
@@ -0,0 +1,619 @@
1
+ # Brennpunkt
2
+
3
+ **Coverage Priority Analyzer** — Parses `lcov.info` and ranks files by testing priority. Helps answer: *"Where should I focus testing efforts next?"*
4
+
5
+ ## What is Brennpunkt?
6
+
7
+ Brennpunkt is a command-line tool that analyzes test coverage reports and tells you **where to focus your testing efforts for maximum impact**. Instead of showing you raw percentages, it calculates a priority score for each file based on coverage gaps, file size, and configurable weights.
8
+
9
+ **Think of it as a coverage report that actually tells you what to do next.**
10
+
11
+ ### Where Does This Fit In?
12
+
13
+ When you run tests with coverage enabled, your test framework generates a coverage report. This report is typically stored in a format called **LCOV** (originally from the Linux Test Project). Brennpunkt reads this LCOV data and transforms it into actionable priorities.
14
+
15
+ ```
16
+ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
17
+ │ Your Tests │ ──▶ │ Coverage Tool │ ──▶ │ lcov.info │
18
+ │ (Jest, etc.) │ │ (v8, istanbul) │ │ (raw data) │
19
+ └─────────────────┘ └─────────────────┘ └─────────────────┘
20
+
21
+
22
+ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
23
+ │ Prioritized │ ◀── │ Brennpunkt │ ◀── │ Parses LCOV │
24
+ │ Action List │ │ (this tool) │ │ Calculates │
25
+ └─────────────────┘ └─────────────────┘ └─────────────────┘
26
+ ```
27
+
28
+ ### What Produces LCOV Files?
29
+
30
+ Most JavaScript/TypeScript test frameworks can generate LCOV coverage data:
31
+
32
+ | Test Framework | Coverage Provider | Command |
33
+ |----------------|-------------------|---------|
34
+ | **Vitest** | v8 (built-in) | `vitest run --coverage` |
35
+ | **Jest** | istanbul/v8 | `jest --coverage` |
36
+ | **Mocha** | c8 / nyc | `c8 mocha` or `nyc mocha` |
37
+ | **Node.js** | c8 | `c8 node script.js` |
38
+ | **Karma** | karma-coverage | Configure in `karma.conf.js` |
39
+ | **AVA** | c8 | `c8 ava` |
40
+ | **Playwright** | v8 | `npx playwright test --coverage` |
41
+
42
+ The output is typically a file called `lcov.info` in a `coverage/` directory.
43
+
44
+ ### Compatible With
45
+
46
+ Brennpunkt works with any tool that produces LCOV format output:
47
+
48
+ - ✅ **Vitest** (recommended for new projects)
49
+ - ✅ **Jest** (most popular)
50
+ - ✅ **c8** (native V8 coverage)
51
+ - ✅ **NYC/Istanbul** (legacy but widely used)
52
+ - ✅ **Karma** (Angular projects)
53
+ - ✅ **Any CI system** that archives coverage artifacts
54
+
55
+ ### What Brennpunkt Assumes
56
+
57
+ 1. **You have tests** — Brennpunkt analyzes coverage, it doesn't run tests
58
+ 2. **You have LCOV output** — Run your tests with `--coverage` first
59
+ 3. **You want to improve coverage** — This tool helps prioritize, not measure
60
+
61
+ ## The Challenge
62
+
63
+ You're staring at a failed CI build: **"Coverage threshold not met: 85.2% < 90%"**
64
+
65
+ Now what? You open the coverage report and see a wall of percentages. File after file, each showing line coverage, branch coverage, function coverage. Some files are at 45%, others at 98%. The "Uncovered Lines" column shows cryptic ranges like `23-27, 45, 89-102`.
66
+
67
+ **The problem:** You need to close a 5% coverage gap, but the standard coverage report doesn't tell you *where to focus*. You're left doing mental math:
68
+ - Which files have the most uncovered lines?
69
+ - Which gaps are in critical code vs. tiny utilities?
70
+ - Should you prioritize that file with 50% line coverage or the one with 0% branch coverage?
71
+
72
+ Traditional coverage tools show you *what* isn't covered. They don't tell you *what matters most*.
73
+
74
+ **Brennpunkt was built to solve this.** Instead of presenting raw percentages, it calculates a **priority score** that weighs coverage gaps against file importance. Run one command and immediately see which files will have the biggest impact on your coverage goals.
75
+
76
+ It was also designed with **agentic coding tools** in mind. When an AI assistant needs to improve test coverage, it shouldn't wade through percentage tables—it needs a ranked list of where to focus. Brennpunkt's JSON output integrates directly into automated workflows, giving coding agents clear, actionable targets.
77
+
78
+ ## Installation
79
+
80
+ ```bash
81
+ npm install -g @redaksjon/brennpunkt
82
+ ```
83
+
84
+ Or use directly with npx:
85
+
86
+ ```bash
87
+ npx @redaksjon/brennpunkt
88
+ ```
89
+
90
+ ## Usage
91
+
92
+ ```bash
93
+ # Analyze coverage (auto-discovers lcov.info location)
94
+ brennpunkt
95
+
96
+ # Specify a custom coverage file path
97
+ brennpunkt path/to/lcov.info
98
+
99
+ # Show only top 10 priority files
100
+ brennpunkt --top 10
101
+
102
+ # Output as JSON for tooling integration
103
+ brennpunkt --json
104
+
105
+ # Custom weights for branches, functions, lines
106
+ brennpunkt --weights 0.6,0.2,0.2
107
+
108
+ # Exclude files with fewer than 50 lines
109
+ brennpunkt --min-lines 50
110
+ ```
111
+
112
+ ## Coverage File Discovery
113
+
114
+ When no coverage file is specified, brennpunkt automatically searches common locations:
115
+
116
+ | Search Order | Location | Test Framework |
117
+ |--------------|----------|----------------|
118
+ | 1 | `coverage/lcov.info` | Jest, Vitest, c8 (most common) |
119
+ | 2 | `.coverage/lcov.info` | Some configurations |
120
+ | 3 | `coverage/lcov/lcov.info` | Karma |
121
+ | 4 | `lcov.info` | Project root |
122
+ | 5 | `.nyc_output/lcov.info` | NYC legacy |
123
+ | 6 | `test-results/lcov.info` | Some CI configurations |
124
+
125
+ The first file found is used. When a file is auto-discovered, brennpunkt shows which file was selected:
126
+
127
+ ```
128
+ Using coverage file: coverage/lcov.info
129
+
130
+ 📊 Coverage Priority Report
131
+ ...
132
+ ```
133
+
134
+ To skip discovery and use a specific file:
135
+
136
+ ```bash
137
+ brennpunkt path/to/your/lcov.info
138
+ ```
139
+
140
+ ## Options
141
+
142
+ | Option | Description | Default |
143
+ |--------|-------------|---------|
144
+ | `[coverage-path]` | Path to lcov.info file | Auto-discovered |
145
+ | `-w, --weights <B,F,L>` | Custom weights for branches, functions, lines | `0.5,0.3,0.2` |
146
+ | `-m, --min-lines <N>` | Exclude files with fewer than N lines | `10` |
147
+ | `-j, --json` | Output as JSON | `false` |
148
+ | `-t, --top <N>` | Show only top N priority files | (all) |
149
+ | `-c, --config <path>` | Path to configuration file | `brennpunkt.yaml` |
150
+ | `--init-config` | Generate a default configuration file | |
151
+ | `--check-config` | Display resolved configuration and exit | |
152
+ | `-V, --version` | Show version | |
153
+ | `-h, --help` | Show help | |
154
+
155
+ ## Configuration
156
+
157
+ Brennpunkt reads configuration from a `brennpunkt.yaml` file in your project directory. This follows the pattern of other development tools like ESLint, Prettier, and TypeScript.
158
+
159
+ ### Initialize Configuration
160
+
161
+ Generate a default configuration file in your project:
162
+
163
+ ```bash
164
+ brennpunkt --init-config
165
+ ```
166
+
167
+ This creates a `brennpunkt.yaml` file with all available options commented out.
168
+
169
+ ### Configuration File
170
+
171
+ Create a `brennpunkt.yaml` file in your project root:
172
+
173
+ ```yaml
174
+ # Brennpunkt Configuration
175
+ # https://github.com/redaksjon/brennpunkt
176
+
177
+ # Path to lcov.info coverage file
178
+ coveragePath: coverage/lcov.info
179
+
180
+ # Priority weights for branches, functions, lines (should sum to 1.0)
181
+ # Higher branch weight = untested branches are prioritized more heavily
182
+ weights: "0.5,0.3,0.2"
183
+
184
+ # Minimum number of lines for a file to be included
185
+ # Helps filter out tiny utility files
186
+ minLines: 10
187
+
188
+ # Output format (true for JSON, false for table)
189
+ json: false
190
+
191
+ # Limit results to top N files (remove for all files)
192
+ top: 20
193
+ ```
194
+
195
+ ### Configuration Options
196
+
197
+ | Option | Type | Description | Default |
198
+ |--------|------|-------------|---------|
199
+ | `coveragePath` | string | Path to the lcov.info file | `coverage/lcov.info` |
200
+ | `weights` | string | Comma-separated weights for branches,functions,lines | `"0.5,0.3,0.2"` |
201
+ | `minLines` | number | Exclude files with fewer than N lines | `10` |
202
+ | `json` | boolean | Output as JSON instead of table | `false` |
203
+ | `top` | number | Limit output to top N priority files | (all files) |
204
+
205
+ ### Configuration Precedence
206
+
207
+ Configuration is resolved in this order (highest priority first):
208
+
209
+ 1. **CLI arguments** — Always override everything
210
+ 2. **Config file** — `brennpunkt.yaml` in current directory
211
+ 3. **Built-in defaults** — Fallback values
212
+
213
+ ### Check Configuration
214
+
215
+ View the resolved configuration with source tracking:
216
+
217
+ ```bash
218
+ brennpunkt --check-config
219
+ ```
220
+
221
+ Output:
222
+
223
+ ```
224
+ ================================================================================
225
+ BRENNPUNKT CONFIGURATION
226
+ ================================================================================
227
+
228
+ Config file: brennpunkt.yaml
229
+ Status: Found
230
+
231
+ RESOLVED CONFIGURATION:
232
+ --------------------------------------------------------------------------------
233
+ [config file] coveragePath : "coverage/lcov.info"
234
+ [config file] weights : "0.6,0.2,0.2"
235
+ [config file] minLines : 20
236
+ [default] json : false
237
+ [config file] top : 10
238
+
239
+ ================================================================================
240
+ ```
241
+
242
+ ### Using a Custom Config Path
243
+
244
+ ```bash
245
+ # Use a config file in a different location
246
+ brennpunkt --config .config/brennpunkt.yaml
247
+
248
+ # Generate config in a specific location
249
+ brennpunkt --init-config --config .config/brennpunkt.yaml
250
+ ```
251
+
252
+ ## Priority Scoring
253
+
254
+ Files are ranked by a priority score that considers:
255
+
256
+ 1. **Coverage gaps** — The difference between 100% and actual coverage for branches, functions, and lines
257
+ 2. **Weights** — Customizable weights determine relative importance (default: branches 50%, functions 30%, lines 20%)
258
+ 3. **File size** — Larger files with low coverage rank higher (logarithmic scaling)
259
+
260
+ **Formula:**
261
+ ```
262
+ priorityScore = (branchGap × branchWeight + functionGap × functionWeight + lineGap × lineWeight) × log10(lines + 1)
263
+ ```
264
+
265
+ ### Why These Default Weights?
266
+
267
+ - **Branches (50%)** — Untested branches hide conditional bugs. A function might execute but still have untested error paths.
268
+ - **Functions (30%)** — Untested functions indicate dead code or missing feature tests.
269
+ - **Lines (20%)** — Basic execution coverage. High line coverage doesn't guarantee correctness.
270
+
271
+ ### Customizing Weights
272
+
273
+ ```yaml
274
+ # Prioritize branch coverage heavily
275
+ weights: "0.7,0.2,0.1"
276
+
277
+ # Equal weights for all metrics
278
+ weights: "0.33,0.33,0.34"
279
+
280
+ # Focus on function coverage
281
+ weights: "0.2,0.6,0.2"
282
+ ```
283
+
284
+ ## Output
285
+
286
+ ### Terminal Output
287
+
288
+ ```
289
+ 📊 Coverage Priority Report
290
+
291
+ ┌─────────────────────────────────────────────────────────────────┐
292
+ │ OVERALL COVERAGE │
293
+ ├─────────────────┬─────────────────┬─────────────────────────────┤
294
+ │ Lines: 78.50% │ Functions: 82.30% │ Branches: 65.20% │
295
+ │ (1234/1572) │ (156/190) │ (98/150) │
296
+ └─────────────────┴─────────────────┴─────────────────────────────┘
297
+
298
+ Files: 25 | Weights: B=0.5, F=0.3, L=0.2 | Min lines: 10
299
+
300
+ ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
301
+ Priority File Lines Funcs Branch Uncov Lines Score
302
+ ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
303
+ #1 src/complex-module.ts 45.2% 50.0% 35.0% 120 156.3
304
+ #2 src/another-module.ts 62.5% 70.0% 55.0% 75 98.7
305
+ ...
306
+
307
+ 🎯 Recommended Focus (Top 3):
308
+
309
+ 1. src/complex-module.ts
310
+ 13 untested branches, 5 untested functions, 120 uncovered lines
311
+
312
+ 2. src/another-module.ts
313
+ 9 untested branches, 3 untested functions, 75 uncovered lines
314
+ ```
315
+
316
+ ### JSON Output
317
+
318
+ ```json
319
+ {
320
+ "overall": {
321
+ "lines": { "found": 1572, "hit": 1234, "coverage": 78.5 },
322
+ "functions": { "found": 190, "hit": 156, "coverage": 82.3 },
323
+ "branches": { "found": 150, "hit": 98, "coverage": 65.2 },
324
+ "fileCount": 25
325
+ },
326
+ "files": [
327
+ {
328
+ "file": "src/complex-module.ts",
329
+ "lines": { "found": 218, "hit": 98, "coverage": 45.2 },
330
+ "functions": { "found": 10, "hit": 5, "coverage": 50 },
331
+ "branches": { "found": 20, "hit": 7, "coverage": 35 },
332
+ "priorityScore": 156.3,
333
+ "uncoveredLines": 120,
334
+ "uncoveredBranches": 13
335
+ }
336
+ ]
337
+ }
338
+ ```
339
+
340
+ ## Integration
341
+
342
+ ### npm Scripts (Post-Test Hook)
343
+
344
+ The simplest integration is adding brennpunkt to your `package.json` as a post-test script:
345
+
346
+ ```json
347
+ {
348
+ "scripts": {
349
+ "test": "vitest run --coverage",
350
+ "posttest": "brennpunkt --top 10"
351
+ }
352
+ }
353
+ ```
354
+
355
+ Now every time you run `npm test`, you'll automatically see prioritized coverage guidance:
356
+
357
+ ```bash
358
+ $ npm test
359
+
360
+ ✓ tests/auth.test.ts (15 tests)
361
+ ✓ tests/api.test.ts (23 tests)
362
+
363
+ Coverage: 85.2%
364
+
365
+ Using coverage file: coverage/lcov.info
366
+
367
+ 📊 Coverage Priority Report
368
+ ...
369
+ 🎯 Recommended Focus (Top 3):
370
+ 1. src/auth/login.ts - 13 untested branches
371
+ ```
372
+
373
+ ### GitHub Actions
374
+
375
+ Add brennpunkt to your CI workflow to surface coverage priorities in pull requests:
376
+
377
+ ```yaml
378
+ name: Test & Coverage
379
+
380
+ on: [push, pull_request]
381
+
382
+ jobs:
383
+ test:
384
+ runs-on: ubuntu-latest
385
+ steps:
386
+ - uses: actions/checkout@v4
387
+ - uses: actions/setup-node@v4
388
+ with:
389
+ node-version: '20'
390
+
391
+ - run: npm ci
392
+ - run: npm test -- --coverage
393
+
394
+ # Add coverage priority analysis
395
+ - name: Coverage Priority Analysis
396
+ run: npx @redaksjon/brennpunkt --top 10
397
+
398
+ # Optional: Save JSON report as artifact
399
+ - name: Generate Priority Report
400
+ run: npx @redaksjon/brennpunkt --json > coverage-priority.json
401
+
402
+ - uses: actions/upload-artifact@v4
403
+ with:
404
+ name: coverage-priority
405
+ path: coverage-priority.json
406
+ ```
407
+
408
+ ### Generic CI Integration
409
+
410
+ For any CI system, add brennpunkt after your test command:
411
+
412
+ ```bash
413
+ # Run tests with coverage
414
+ npm test -- --coverage
415
+
416
+ # Analyze and display priorities
417
+ npx @redaksjon/brennpunkt --top 10
418
+
419
+ # Or save for later processing
420
+ npx @redaksjon/brennpunkt --json > coverage-priority.json
421
+ ```
422
+
423
+ ### Fail on High-Priority Gaps (Advanced)
424
+
425
+ Use brennpunkt with `jq` to fail builds when critical files have low coverage:
426
+
427
+ ```bash
428
+ #!/bin/bash
429
+ # fail-on-priority.sh
430
+
431
+ # Get the top priority file's score
432
+ TOP_SCORE=$(brennpunkt --json --top 1 | jq '.files[0].priorityScore')
433
+
434
+ # Fail if priority score exceeds threshold
435
+ if (( $(echo "$TOP_SCORE > 100" | bc -l) )); then
436
+ echo "❌ High-priority coverage gap detected (score: $TOP_SCORE)"
437
+ echo "Run 'brennpunkt --top 5' to see recommended files to test"
438
+ exit 1
439
+ fi
440
+
441
+ echo "✅ Coverage priorities within acceptable range"
442
+ ```
443
+
444
+ ## AI & MCP Integration
445
+
446
+ Brennpunkt is designed to work with AI coding assistants. Instead of running tests repeatedly, AI tools can query existing coverage data for prioritized, actionable insights.
447
+
448
+ ### The Problem
449
+
450
+ When you ask an AI to "improve test coverage," it typically runs tests, parses text output, and guesses priorities. This is slow (30s-5min per test run) and wasteful when coverage data already exists.
451
+
452
+ ### Solution 1: JSON Output for AI Prompts
453
+
454
+ The simplest integration—include brennpunkt output in your prompts:
455
+
456
+ ```bash
457
+ # In your prompt to Cursor/Claude/etc:
458
+ "I need to improve test coverage. Here's the priority analysis:
459
+
460
+ $(brennpunkt --json --top 3)
461
+
462
+ Write tests for the #1 priority file, focusing on untested branches."
463
+ ```
464
+
465
+ ### Solution 2: MCP Server
466
+
467
+ For deeper integration, Brennpunkt runs as an MCP (Model Context Protocol) server, allowing AI tools like Cursor and Claude to query coverage data directly.
468
+
469
+ **Key features:**
470
+ - Works with **any test framework** producing lcov format (Jest, Vitest, Mocha, c8, NYC, Karma, AVA, Playwright, etc.)
471
+ - **One-time setup** for all your projects—no per-project configuration
472
+ - **Reads existing coverage data**—does NOT run tests
473
+ - **Respects project configuration**—automatically loads `brennpunkt.yaml` from each project
474
+ - **Sub-100ms responses**—fast enough for interactive use
475
+
476
+ **Available MCP Tools:**
477
+
478
+ | Tool | Purpose |
479
+ |------|---------|
480
+ | `brennpunkt_get_priorities` | Get files ranked by testing priority with reasons and suggestions |
481
+ | `brennpunkt_coverage_summary` | Quick overview: percentages, status, quick wins |
482
+ | `brennpunkt_get_file_coverage` | Detailed coverage for a specific file |
483
+ | `brennpunkt_estimate_impact` | "If I test these files, will I hit 90%?" |
484
+
485
+ **One-Time Setup (works for all projects):**
486
+
487
+ ```json
488
+ {
489
+ "mcpServers": {
490
+ "brennpunkt": {
491
+ "command": "brennpunkt-mcp"
492
+ }
493
+ }
494
+ }
495
+ ```
496
+
497
+ The AI passes the current workspace path as `projectPath` to each tool—no need to configure per-project.
498
+
499
+ **Project Configuration Respected:**
500
+
501
+ If a project has a `brennpunkt.yaml`, the MCP server automatically uses it:
502
+
503
+ ```yaml
504
+ # /path/to/project/brennpunkt.yaml
505
+ weights: "0.7,0.2,0.1" # This project prioritizes branch coverage
506
+ minLines: 20
507
+ ```
508
+
509
+ Each response includes `configUsed` so the AI knows what settings are active.
510
+
511
+ **Example Workflows:**
512
+
513
+ ```
514
+ Human: What files should I focus on to improve test coverage?
515
+
516
+ AI: [calls brennpunkt_get_priorities with projectPath from workspace]
517
+
518
+ AI: The highest priority file is src/auth/login.ts (score: 156.3).
519
+ It has 35% branch coverage with 13 untested branches.
520
+ Suggested focus: Test error handling paths in validateCredentials().
521
+ ```
522
+
523
+ ```
524
+ Human: If I fully test login.ts and handler.ts, will I hit 90%?
525
+
526
+ AI: [calls brennpunkt_estimate_impact with those files]
527
+
528
+ AI: Current: 85.2% → Estimated: 91.8% (+6.6%)
529
+ Yes, testing those two files should get you above 90%.
530
+ ```
531
+
532
+ ```
533
+ Human: Compare coverage between auth-service and user-service.
534
+
535
+ AI: [calls brennpunkt_coverage_summary for each project]
536
+
537
+ AI: auth-service: 92.1% lines, 85.3% branches
538
+ user-service: 78.4% lines, 62.1% branches
539
+
540
+ user-service needs attention, especially branch coverage.
541
+ ```
542
+
543
+ **Why MCP Instead of Running Tests:**
544
+
545
+ | Aspect | Running Tests | MCP Query |
546
+ |--------|---------------|-----------|
547
+ | Speed | 30s-5min | <100ms |
548
+ | Data | Raw percentages | Prioritized + actionable suggestions |
549
+ | Efficiency | Redundant test runs | Reads existing coverage |
550
+ | Multi-project | Reconfigure each time | Query any project path |
551
+
552
+ See [guide/ai-integration.md](./guide/ai-integration.md) for complete documentation.
553
+
554
+ ### Quick Start: Cursor Rule (No MCP Required)
555
+
556
+ Don't want to configure MCP? Add this to your project's `.cursorrules` file for instant AI-powered coverage prioritization:
557
+
558
+ ```markdown
559
+ # Coverage Priority Analysis
560
+
561
+ When working on test coverage improvements:
562
+
563
+ 1. Run `npx @redaksjon/brennpunkt --json --top 5` to get prioritized files
564
+ 2. Focus on the highest priority file first (highest priorityScore)
565
+ 3. Pay special attention to:
566
+ - Files with low branch coverage (untested conditionals hide bugs)
567
+ - Files with high uncoveredLines count
568
+ 4. After writing tests, re-run brennpunkt to see updated priorities
569
+
570
+ When I ask about test coverage, run brennpunkt and interpret the results.
571
+ Suggest specific test cases based on the uncovered branches and functions.
572
+ ```
573
+
574
+ **Usage**: After adding this rule, just ask Cursor:
575
+ - "What files need test coverage?"
576
+ - "Help me improve test coverage"
577
+ - "Where should I focus my testing efforts?"
578
+
579
+ The AI will automatically run brennpunkt and provide actionable recommendations.
580
+
581
+ ## Programmatic Usage
582
+
583
+ You can also use brennpunkt as a library:
584
+
585
+ ```typescript
586
+ import { parseLcov, analyzeCoverage, formatJson } from '@redaksjon/brennpunkt';
587
+ import { readFileSync } from 'node:fs';
588
+
589
+ const lcovContent = readFileSync('coverage/lcov.info', 'utf-8');
590
+ const files = parseLcov(lcovContent);
591
+
592
+ const result = analyzeCoverage(files, {
593
+ branches: 0.5,
594
+ functions: 0.3,
595
+ lines: 0.2,
596
+ }, 10, null);
597
+
598
+ console.log(formatJson(result));
599
+ ```
600
+
601
+ ## Development
602
+
603
+ ```bash
604
+ # Install dependencies
605
+ npm install
606
+
607
+ # Run tests
608
+ npm test
609
+
610
+ # Build
611
+ npm run build
612
+
613
+ # Lint
614
+ npm run lint
615
+ ```
616
+
617
+ ## License
618
+
619
+ Apache-2.0