projscan 4.0.0 → 4.1.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.
Files changed (39) hide show
  1. package/README.md +332 -24
  2. package/dist/cli/commands/route.js +1 -0
  3. package/dist/cli/commands/route.js.map +1 -1
  4. package/dist/cli/commands/semanticGraph.js +27 -0
  5. package/dist/cli/commands/semanticGraph.js.map +1 -1
  6. package/dist/cli/commands/start.js +74 -1
  7. package/dist/cli/commands/start.js.map +1 -1
  8. package/dist/core/dependencyAnalyzer.js +172 -0
  9. package/dist/core/dependencyAnalyzer.js.map +1 -1
  10. package/dist/core/intentRouter.d.ts +8 -1
  11. package/dist/core/intentRouter.js +2186 -22
  12. package/dist/core/intentRouter.js.map +1 -1
  13. package/dist/core/issueEngine.js +6 -7
  14. package/dist/core/issueEngine.js.map +1 -1
  15. package/dist/core/onboarding.d.ts +2 -2
  16. package/dist/core/onboarding.js +29 -5
  17. package/dist/core/onboarding.js.map +1 -1
  18. package/dist/core/start.d.ts +1 -0
  19. package/dist/core/start.js +2010 -10
  20. package/dist/core/start.js.map +1 -1
  21. package/dist/mcp/server.d.ts +1 -1
  22. package/dist/mcp/server.js +14 -5
  23. package/dist/mcp/server.js.map +1 -1
  24. package/dist/mcp/tools/start.js +6 -1
  25. package/dist/mcp/tools/start.js.map +1 -1
  26. package/dist/projscan-sbom.cdx.json +6 -6
  27. package/dist/reporters/consoleReporter.js +19 -0
  28. package/dist/reporters/consoleReporter.js.map +1 -1
  29. package/dist/reporters/markdownReporter.js +19 -0
  30. package/dist/reporters/markdownReporter.js.map +1 -1
  31. package/dist/tool-manifest.json +6 -2
  32. package/dist/types.d.ts +83 -0
  33. package/docs/GUIDE.md +1565 -0
  34. package/docs/ROADMAP.md +219 -0
  35. package/docs/demos/projscan-4-1-demo.html +648 -0
  36. package/docs/projscan-mission-control.png +0 -0
  37. package/docs/projscan-proof-router.png +0 -0
  38. package/package.json +8 -1
  39. package/scripts/capture-readme-assets.mjs +60 -0
@@ -0,0 +1,648 @@
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="utf-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
6
+ <title>projscan Mission Control README capture</title>
7
+ <style>
8
+ :root {
9
+ color-scheme: light;
10
+ --paper: #f4f1ea;
11
+ --panel: #fffdf8;
12
+ --ink: #17202a;
13
+ --muted: #5d6673;
14
+ --line: #d9d1c2;
15
+ --terminal: #111418;
16
+ --terminal-line: #2b3139;
17
+ --terminal-muted: #8d98a8;
18
+ --green: #247a52;
19
+ --green-soft: #e6f4ec;
20
+ --blue: #2f5f90;
21
+ --blue-soft: #e4eef8;
22
+ --amber: #9b5a00;
23
+ --amber-soft: #fff2d8;
24
+ --red: #a5403a;
25
+ --red-soft: #fae7e4;
26
+ }
27
+
28
+ * {
29
+ box-sizing: border-box;
30
+ }
31
+
32
+ body {
33
+ margin: 0;
34
+ background: var(--paper);
35
+ color: var(--ink);
36
+ font-family:
37
+ Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont,
38
+ "Segoe UI", sans-serif;
39
+ line-height: 1.45;
40
+ }
41
+
42
+ .page {
43
+ width: min(1280px, calc(100vw - 80px));
44
+ margin: 0 auto;
45
+ padding: 42px 0 72px;
46
+ }
47
+
48
+ .hero {
49
+ display: grid;
50
+ grid-template-columns: minmax(0, 0.92fr) minmax(620px, 1.08fr);
51
+ gap: 28px;
52
+ align-items: stretch;
53
+ }
54
+
55
+ .intro {
56
+ padding: 8px 4px 0;
57
+ display: flex;
58
+ flex-direction: column;
59
+ justify-content: space-between;
60
+ min-height: 620px;
61
+ }
62
+
63
+ .eyebrow {
64
+ margin: 0 0 18px;
65
+ color: var(--blue);
66
+ font-size: 14px;
67
+ font-weight: 800;
68
+ text-transform: uppercase;
69
+ }
70
+
71
+ h1,
72
+ h2,
73
+ h3,
74
+ p {
75
+ margin-top: 0;
76
+ }
77
+
78
+ h1 {
79
+ max-width: 540px;
80
+ margin-bottom: 22px;
81
+ font-size: 58px;
82
+ line-height: 1.02;
83
+ letter-spacing: 0;
84
+ }
85
+
86
+ .lead {
87
+ max-width: 560px;
88
+ margin-bottom: 28px;
89
+ color: var(--muted);
90
+ font-size: 21px;
91
+ }
92
+
93
+ .pills {
94
+ display: flex;
95
+ flex-wrap: wrap;
96
+ gap: 10px;
97
+ }
98
+
99
+ .pill {
100
+ min-height: 34px;
101
+ padding: 7px 12px;
102
+ border: 1px solid var(--line);
103
+ border-radius: 999px;
104
+ background: rgba(255, 253, 248, 0.72);
105
+ color: var(--ink);
106
+ font-size: 14px;
107
+ font-weight: 700;
108
+ }
109
+
110
+ .metric-row {
111
+ display: grid;
112
+ grid-template-columns: repeat(3, minmax(0, 1fr));
113
+ gap: 12px;
114
+ margin-top: 38px;
115
+ }
116
+
117
+ .metric {
118
+ min-height: 116px;
119
+ padding: 16px;
120
+ border: 1px solid var(--line);
121
+ border-radius: 8px;
122
+ background: var(--panel);
123
+ }
124
+
125
+ .metric strong {
126
+ display: block;
127
+ margin-bottom: 4px;
128
+ font-size: 27px;
129
+ line-height: 1;
130
+ }
131
+
132
+ .metric span {
133
+ color: var(--muted);
134
+ font-size: 13px;
135
+ font-weight: 700;
136
+ text-transform: uppercase;
137
+ }
138
+
139
+ .terminal {
140
+ overflow: hidden;
141
+ border: 1px solid #262d34;
142
+ border-radius: 8px;
143
+ background: var(--terminal);
144
+ color: #edf2f7;
145
+ box-shadow: 0 18px 45px rgba(23, 32, 42, 0.18);
146
+ }
147
+
148
+ .terminal-bar {
149
+ display: flex;
150
+ align-items: center;
151
+ gap: 9px;
152
+ height: 42px;
153
+ padding: 0 16px;
154
+ border-bottom: 1px solid var(--terminal-line);
155
+ color: var(--terminal-muted);
156
+ font-size: 13px;
157
+ }
158
+
159
+ .dot {
160
+ width: 10px;
161
+ height: 10px;
162
+ border-radius: 50%;
163
+ }
164
+
165
+ .dot.red {
166
+ background: #ef6a5b;
167
+ }
168
+
169
+ .dot.amber {
170
+ background: #f4bf4f;
171
+ }
172
+
173
+ .dot.green {
174
+ background: #63c554;
175
+ }
176
+
177
+ .terminal-title {
178
+ margin-left: 8px;
179
+ font-weight: 700;
180
+ }
181
+
182
+ .terminal-body {
183
+ padding: 26px;
184
+ font-family:
185
+ "SFMono-Regular", Consolas, "Liberation Mono", Menlo, monospace;
186
+ font-size: 15px;
187
+ }
188
+
189
+ .prompt {
190
+ color: #9ad8b1;
191
+ }
192
+
193
+ .cmd {
194
+ color: #ffffff;
195
+ }
196
+
197
+ .dim {
198
+ color: var(--terminal-muted);
199
+ }
200
+
201
+ .term-section {
202
+ margin-top: 22px;
203
+ padding-top: 18px;
204
+ border-top: 1px solid var(--terminal-line);
205
+ }
206
+
207
+ .term-heading {
208
+ color: #ffd58a;
209
+ font-weight: 800;
210
+ }
211
+
212
+ .line {
213
+ display: block;
214
+ min-height: 22px;
215
+ }
216
+
217
+ .success {
218
+ color: #9ad8b1;
219
+ }
220
+
221
+ .notice {
222
+ color: #90c7ff;
223
+ }
224
+
225
+ .warn {
226
+ color: #ffd58a;
227
+ }
228
+
229
+ .grid {
230
+ display: grid;
231
+ grid-template-columns: repeat(3, minmax(0, 1fr));
232
+ gap: 18px;
233
+ margin-top: 30px;
234
+ }
235
+
236
+ .card {
237
+ min-height: 196px;
238
+ padding: 20px;
239
+ border: 1px solid var(--line);
240
+ border-radius: 8px;
241
+ background: var(--panel);
242
+ }
243
+
244
+ .label {
245
+ display: inline-flex;
246
+ align-items: center;
247
+ min-height: 28px;
248
+ margin-bottom: 16px;
249
+ padding: 4px 9px;
250
+ border-radius: 999px;
251
+ font-size: 12px;
252
+ font-weight: 800;
253
+ text-transform: uppercase;
254
+ }
255
+
256
+ .label.green {
257
+ background: var(--green-soft);
258
+ color: var(--green);
259
+ }
260
+
261
+ .label.blue {
262
+ background: var(--blue-soft);
263
+ color: var(--blue);
264
+ }
265
+
266
+ .label.amber {
267
+ background: var(--amber-soft);
268
+ color: var(--amber);
269
+ }
270
+
271
+ .card h2,
272
+ .card h3 {
273
+ margin-bottom: 10px;
274
+ font-size: 24px;
275
+ line-height: 1.16;
276
+ letter-spacing: 0;
277
+ }
278
+
279
+ .card p {
280
+ margin-bottom: 0;
281
+ color: var(--muted);
282
+ font-size: 15px;
283
+ }
284
+
285
+ .proof {
286
+ padding-top: 74px;
287
+ }
288
+
289
+ .proof-header {
290
+ display: grid;
291
+ grid-template-columns: minmax(0, 0.78fr) minmax(0, 1.22fr);
292
+ gap: 24px;
293
+ align-items: end;
294
+ margin-bottom: 24px;
295
+ }
296
+
297
+ .proof-header h2 {
298
+ margin-bottom: 10px;
299
+ font-size: 44px;
300
+ line-height: 1.06;
301
+ letter-spacing: 0;
302
+ }
303
+
304
+ .proof-header p {
305
+ margin-bottom: 0;
306
+ color: var(--muted);
307
+ font-size: 18px;
308
+ }
309
+
310
+ .workflow {
311
+ display: grid;
312
+ grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
313
+ gap: 22px;
314
+ }
315
+
316
+ .compact-terminal .terminal-body {
317
+ min-height: 390px;
318
+ padding: 22px;
319
+ font-size: 14px;
320
+ }
321
+
322
+ .signal-list {
323
+ display: grid;
324
+ gap: 12px;
325
+ }
326
+
327
+ .signal {
328
+ display: grid;
329
+ grid-template-columns: 124px minmax(0, 1fr);
330
+ gap: 14px;
331
+ align-items: start;
332
+ padding: 16px;
333
+ border: 1px solid var(--line);
334
+ border-radius: 8px;
335
+ background: var(--panel);
336
+ }
337
+
338
+ .signal strong {
339
+ display: block;
340
+ color: var(--ink);
341
+ }
342
+
343
+ .signal span:not(.tag) {
344
+ color: var(--muted);
345
+ font-size: 14px;
346
+ }
347
+
348
+ .tag {
349
+ width: 124px;
350
+ min-height: 30px;
351
+ padding: 6px 8px;
352
+ border-radius: 6px;
353
+ color: #fff;
354
+ font-size: 12px;
355
+ font-weight: 800;
356
+ text-align: center;
357
+ text-transform: uppercase;
358
+ }
359
+
360
+ .tag.green {
361
+ background: var(--green);
362
+ }
363
+
364
+ .tag.blue {
365
+ background: var(--blue);
366
+ }
367
+
368
+ .tag.amber {
369
+ background: var(--amber);
370
+ }
371
+
372
+ .tag.red {
373
+ background: var(--red);
374
+ }
375
+
376
+ @media (max-width: 980px) {
377
+ .page {
378
+ width: min(100% - 32px, 760px);
379
+ padding-top: 28px;
380
+ }
381
+
382
+ .hero,
383
+ .proof-header,
384
+ .workflow,
385
+ .grid {
386
+ grid-template-columns: 1fr;
387
+ }
388
+
389
+ .intro {
390
+ min-height: auto;
391
+ }
392
+
393
+ h1 {
394
+ font-size: 42px;
395
+ }
396
+
397
+ .metric-row {
398
+ grid-template-columns: 1fr;
399
+ }
400
+
401
+ .terminal-body {
402
+ overflow-x: auto;
403
+ }
404
+ }
405
+
406
+ body.proof-only .hero,
407
+ body.proof-only .grid {
408
+ display: none;
409
+ }
410
+
411
+ body.proof-only .proof {
412
+ padding-top: 0;
413
+ }
414
+
415
+ body.proof-only .proof-header {
416
+ margin-top: 0;
417
+ }
418
+ </style>
419
+ </head>
420
+ <body>
421
+ <main class="page">
422
+ <section class="hero" aria-label="projscan Mission Control">
423
+ <div class="intro">
424
+ <div>
425
+ <p class="eyebrow">Unreleased developer-life upgrade</p>
426
+ <h1>Plain-language repo work, routed to proof.</h1>
427
+ <p class="lead">
428
+ projscan now turns a developer's intent into the right local
429
+ command, the first files to trust, the ready actions, and the
430
+ proof commands that make a PR reviewable.
431
+ </p>
432
+ <div class="pills" aria-label="Product capabilities">
433
+ <span class="pill">Mission Control</span>
434
+ <span class="pill">Local-first</span>
435
+ <span class="pill">MCP-ready</span>
436
+ <span class="pill">No source upload</span>
437
+ </div>
438
+ </div>
439
+
440
+ <div class="metric-row" aria-label="Release candidate signals">
441
+ <div class="metric">
442
+ <strong>1 call</strong>
443
+ <span>intent to workflow</span>
444
+ </div>
445
+ <div class="metric">
446
+ <strong>45</strong>
447
+ <span>MCP tools preserved</span>
448
+ </div>
449
+ <div class="metric">
450
+ <strong>A</strong>
451
+ <span>dogfood health gate</span>
452
+ </div>
453
+ </div>
454
+ </div>
455
+
456
+ <section class="terminal" aria-label="Mission Control terminal output">
457
+ <div class="terminal-bar">
458
+ <span class="dot red"></span>
459
+ <span class="dot amber"></span>
460
+ <span class="dot green"></span>
461
+ <span class="terminal-title">projscan start --intent</span>
462
+ </div>
463
+ <div class="terminal-body">
464
+ <span class="line"
465
+ ><span class="prompt">$</span>
466
+ <span class="cmd"
467
+ >projscan start --intent "is it safe to commit this
468
+ change?"</span
469
+ ></span
470
+ >
471
+ <span class="line dim">ProjScan Mission Control</span>
472
+ <span class="line">Intent: is it safe to commit this change?</span>
473
+ <span class="line">Status: <span class="warn">needs_attention</span></span>
474
+ <span class="line"
475
+ >Route:
476
+ <span class="notice">Safety gate via projscan_preflight</span></span
477
+ >
478
+ <span class="line dim"
479
+ >confidence: high; matched: safe, commit</span
480
+ >
481
+
482
+ <div class="term-section">
483
+ <span class="line term-heading">Action Plan</span>
484
+ <span class="line"
485
+ >- Use projscan_preflight before broader workflow
486
+ commands</span
487
+ >
488
+ <span class="line"
489
+ >- Preserve the original goal across follow-up evidence</span
490
+ >
491
+ <span class="line"
492
+ >- Surface blockers with owner, file, or next command</span
493
+ >
494
+ </div>
495
+
496
+ <div class="term-section">
497
+ <span class="line term-heading">Ready Proof</span>
498
+ <span class="line success"
499
+ >- projscan preflight --mode before_commit --format json</span
500
+ >
501
+ <span class="line success"
502
+ >- projscan understand --view verify --format json</span
503
+ >
504
+ <span class="line success"
505
+ >- projscan session touched --format json</span
506
+ >
507
+ </div>
508
+
509
+ <div class="term-section">
510
+ <span class="line term-heading">Done When</span>
511
+ <span class="line"
512
+ >- Preflight returns proceed or documented manual review</span
513
+ >
514
+ <span class="line"
515
+ >- Every blocker has a concrete follow-up command</span
516
+ >
517
+ </div>
518
+ </div>
519
+ </section>
520
+ </section>
521
+
522
+ <section class="grid" aria-label="New developer workflows">
523
+ <article class="card">
524
+ <span class="label green">Goal routing</span>
525
+ <h2>Ask in human language.</h2>
526
+ <p>
527
+ Route privacy, merge readiness, refactor risk, local setup,
528
+ ownership, dependency, release, and handoff questions to the right
529
+ command with matched keywords and confidence.
530
+ </p>
531
+ </article>
532
+ <article class="card">
533
+ <span class="label blue">Repo context</span>
534
+ <h2>Start from cited evidence.</h2>
535
+ <p>
536
+ Repo maps now include read-first files, package contracts, runtime
537
+ flows, public exports, proof tiers, setup commands, and unknowns
538
+ that need human input.
539
+ </p>
540
+ </article>
541
+ <article class="card">
542
+ <span class="label amber">Review proof</span>
543
+ <h2>Make PRs easier to approve.</h2>
544
+ <p>
545
+ Mission Control carries the original intent into preflight,
546
+ verification, session memory, evidence packs, and reviewer-ready
547
+ next commands.
548
+ </p>
549
+ </article>
550
+ </section>
551
+
552
+ <section class="proof" id="proof" aria-label="Proof and dependency view">
553
+ <div class="proof-header">
554
+ <div>
555
+ <p class="eyebrow">Intent, graph, and dependency intelligence</p>
556
+ <h2>Fewer dead-end agent turns.</h2>
557
+ </div>
558
+ <p>
559
+ The new flow is built for a developer asking "what now?" after a
560
+ change, a failed run, a risky rename, or a dependency question.
561
+ </p>
562
+ </div>
563
+
564
+ <div class="workflow">
565
+ <section class="terminal compact-terminal" aria-label="Intent router">
566
+ <div class="terminal-bar">
567
+ <span class="dot red"></span>
568
+ <span class="dot amber"></span>
569
+ <span class="dot green"></span>
570
+ <span class="terminal-title">projscan route</span>
571
+ </div>
572
+ <div class="terminal-body">
573
+ <span class="line"
574
+ ><span class="prompt">$</span>
575
+ <span class="cmd"
576
+ >projscan route "what breaks if I rename the auth token
577
+ loader"</span
578
+ ></span
579
+ >
580
+ <span class="line dim">Best tools for the developer goal</span>
581
+ <span class="line">&nbsp;</span>
582
+ <span class="line term-heading">1. projscan_impact</span>
583
+ <span class="line">confidence: high</span>
584
+ <span class="line">matched: breaks, rename</span>
585
+ <span class="line notice"
586
+ >Before renaming or deleting, see every caller that
587
+ breaks.</span
588
+ >
589
+ <span class="line success"
590
+ >projscan impact --symbol buildCodeGraph --format json</span
591
+ >
592
+ <span class="line">&nbsp;</span>
593
+ <span class="line term-heading">2. projscan_dataflow</span>
594
+ <span class="line">confidence: high</span>
595
+ <span class="line">matched: token</span>
596
+ <span class="line notice"
597
+ >Spot request-data reaching dangerous sinks.</span
598
+ >
599
+ </div>
600
+ </section>
601
+
602
+ <div class="signal-list" aria-label="Developer proof signals">
603
+ <div class="signal">
604
+ <span class="tag green">Verify</span>
605
+ <span>
606
+ <strong>Proof selection</strong>
607
+ Which tests should I run? now routes to
608
+ <code>understand --view verify</code> instead of generic
609
+ regression planning.
610
+ </span>
611
+ </div>
612
+ <div class="signal">
613
+ <span class="tag blue">Setup</span>
614
+ <span>
615
+ <strong>Local command discovery</strong>
616
+ npm scripts, lint, typecheck, Storybook, Cypress, Playwright,
617
+ Docker Compose, migrations, and seed/reset commands are called
618
+ out where agents need them.
619
+ </span>
620
+ </div>
621
+ <div class="signal">
622
+ <span class="tag amber">License</span>
623
+ <span>
624
+ <strong>Dependency intelligence</strong>
625
+ Dependency reports now summarize known licenses, copyleft risk,
626
+ installed package sizes, and package importer lookups.
627
+ </span>
628
+ </div>
629
+ <div class="signal">
630
+ <span class="tag red">Trust</span>
631
+ <span>
632
+ <strong>Release review guardrails</strong>
633
+ Stable-surface checks preserve public CLI and MCP contracts
634
+ while allowing additive intent support.
635
+ </span>
636
+ </div>
637
+ </div>
638
+ </div>
639
+ </section>
640
+ </main>
641
+ <script>
642
+ if (window.location.hash === "#proof") {
643
+ document.body.classList.add("proof-only");
644
+ }
645
+ document.documentElement.dataset.ready = "true";
646
+ </script>
647
+ </body>
648
+ </html>
Binary file
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "projscan",
3
3
  "mcpName": "io.github.abhiyoheswaran1/projscan",
4
- "version": "4.0.0",
4
+ "version": "4.1.0",
5
5
  "description": "Agent-first code intelligence. MCP server (2025-03-26) with AST parsing for JavaScript, TypeScript, Python, Go, Java, Ruby, Rust, PHP, C#, Kotlin, Swift, and C++; repo understanding maps (projscan_understand), stable v3 semantic graph (projscan_semantic_graph), dataflow risk engine with bridge-helper detection (projscan_dataflow), code graph, file + per-function AST cyclomatic complexity, per-function fan-in + fan-out, coupling + cycle detection, structural PR diff with HTML reporter, coverage report with HTML reporter, intent-grounded one-call PR review (projscan_review with optional `intent` arg, new taint flows, contract changes, and newDataflowRisks) and long-running PR-watch mode with structured per-bucket deltas (projscan_review_watch), first-60-seconds workflow orientation (projscan_start), agent workplans (projscan_workplan), bug-hunt queues (projscan_bug_hunt), product-line planning (projscan_release_train), evidence packs (projscan_evidence_pack), regression planning (projscan_regression_plan), agent briefs (projscan_agent_brief), quality scorecards (projscan_quality_scorecard), and preflight with supply-chain IOC evidence, rule-driven fix suggestions + mechanical apply layer with rollback (projscan_apply_fix, projscan_fix_suggest, projscan_explain_issue), source-to-sink taint analysis (projscan_taint) with truncation reporting, transitive blast-radius analysis with cross-repo mode (projscan_impact for files and symbols), cross-repo workspace registration + intelligence (projscan_workspace_graph), per-function semantic search chunks (sub-file embeddings), per-rule confidence + severity drift + cost-summary analytics with live streaming (projscan_cost_summary), stable local analyzer + reporter plugin API (projscan_plugin, CLI --reporter, opt-in via PROJSCAN_PLUGINS_PREVIEW=1), monorepo workspace awareness with cross-package import policy + per-package dependencies / outdated / audit, BM25 + optional semantic search, cursor pagination, progress notifications, context-budgeted output, and a stable-surface CI guard. CLI on the side.",
6
6
  "type": "module",
7
7
  "main": "./dist/index.js",
@@ -13,10 +13,16 @@
13
13
  "dist",
14
14
  "README.md",
15
15
  "docs/2.0-MIGRATION.md",
16
+ "docs/GUIDE.md",
16
17
  "docs/PLUGIN-AUTHORING.md",
17
18
  "docs/PLUGIN-GALLERY.md",
19
+ "docs/ROADMAP.md",
20
+ "docs/demos/projscan-4-1-demo.html",
18
21
  "docs/plugin.schema.json",
22
+ "docs/projscan-mission-control.png",
23
+ "docs/projscan-proof-router.png",
19
24
  "docs/examples/plugins",
25
+ "scripts/capture-readme-assets.mjs",
20
26
  "public/brand/baseframe-labs",
21
27
  "public/.well-known/security.txt",
22
28
  "CONTRIBUTING.md",
@@ -37,6 +43,7 @@
37
43
  "format": "prettier --write .",
38
44
  "bench": "node scripts/bench.mjs",
39
45
  "bench:references": "node scripts/bench-references.mjs",
46
+ "docs:screenshots": "node scripts/capture-readme-assets.mjs",
40
47
  "smoke:packed-install": "node scripts/packed-install-smoke.mjs",
41
48
  "check:stability": "node scripts/check-stability.mjs",
42
49
  "release:check": "node scripts/release-check.mjs",