projscan 4.11.0 → 4.12.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.
@@ -377,6 +377,109 @@
377
377
  background: var(--red);
378
378
  }
379
379
 
380
+ .assess {
381
+ padding-top: 74px;
382
+ }
383
+
384
+ .assess-header {
385
+ display: grid;
386
+ grid-template-columns: minmax(0, 0.82fr) minmax(0, 1.18fr);
387
+ gap: 24px;
388
+ align-items: end;
389
+ margin-bottom: 24px;
390
+ }
391
+
392
+ .assess-header h2 {
393
+ margin-bottom: 10px;
394
+ font-size: 44px;
395
+ line-height: 1.06;
396
+ letter-spacing: 0;
397
+ }
398
+
399
+ .assess-header p {
400
+ margin-bottom: 0;
401
+ color: var(--muted);
402
+ font-size: 18px;
403
+ }
404
+
405
+ .proof-card-grid {
406
+ display: grid;
407
+ grid-template-columns: minmax(0, 0.95fr) minmax(0, 1.05fr);
408
+ gap: 22px;
409
+ }
410
+
411
+ .proof-card {
412
+ min-height: 470px;
413
+ padding: 24px;
414
+ border: 1px solid var(--line);
415
+ border-radius: 8px;
416
+ background: var(--panel);
417
+ }
418
+
419
+ .proof-card h3 {
420
+ margin-bottom: 8px;
421
+ font-size: 30px;
422
+ line-height: 1.12;
423
+ letter-spacing: 0;
424
+ }
425
+
426
+ .proof-card p {
427
+ margin-bottom: 18px;
428
+ color: var(--muted);
429
+ font-size: 15px;
430
+ }
431
+
432
+ .evidence-list {
433
+ display: grid;
434
+ gap: 10px;
435
+ }
436
+
437
+ .evidence-item {
438
+ display: grid;
439
+ grid-template-columns: 118px minmax(0, 1fr);
440
+ gap: 12px;
441
+ padding: 13px 0;
442
+ border-top: 1px solid var(--line);
443
+ font-size: 14px;
444
+ }
445
+
446
+ .evidence-item strong {
447
+ color: var(--ink);
448
+ }
449
+
450
+ .evidence-item span {
451
+ color: var(--muted);
452
+ }
453
+
454
+ .delta-row {
455
+ display: grid;
456
+ grid-template-columns: repeat(3, minmax(0, 1fr));
457
+ gap: 10px;
458
+ margin-top: 18px;
459
+ }
460
+
461
+ .delta {
462
+ min-height: 82px;
463
+ padding: 13px;
464
+ border: 1px solid var(--line);
465
+ border-radius: 8px;
466
+ background: #fbf7ef;
467
+ }
468
+
469
+ .delta strong {
470
+ display: block;
471
+ margin-bottom: 5px;
472
+ font-size: 24px;
473
+ line-height: 1;
474
+ }
475
+
476
+ .delta span {
477
+ color: var(--muted);
478
+ font-size: 12px;
479
+ font-weight: 800;
480
+ text-transform: uppercase;
481
+ }
482
+
380
483
  @media (max-width: 980px) {
381
484
  .page {
382
485
  width: min(100% - 32px, 760px);
@@ -385,6 +488,8 @@
385
488
 
386
489
  .hero,
387
490
  .proof-header,
491
+ .assess-header,
492
+ .proof-card-grid,
388
493
  .workflow,
389
494
  .grid {
390
495
  grid-template-columns: 1fr;
@@ -408,7 +513,11 @@
408
513
  }
409
514
 
410
515
  body.proof-only .hero,
411
- body.proof-only .grid {
516
+ body.proof-only .grid,
517
+ body.proof-only .assess,
518
+ body.assess-only .hero,
519
+ body.assess-only .grid,
520
+ body.assess-only .proof {
412
521
  display: none;
413
522
  }
414
523
 
@@ -419,6 +528,14 @@
419
528
  body.proof-only .proof-header {
420
529
  margin-top: 0;
421
530
  }
531
+
532
+ body.assess-only .assess {
533
+ padding-top: 0;
534
+ }
535
+
536
+ body.assess-only .assess-header {
537
+ margin-top: 0;
538
+ }
422
539
  </style>
423
540
  </head>
424
541
  <body>
@@ -448,7 +565,7 @@
448
565
  <span>mission and proof</span>
449
566
  </div>
450
567
  <div class="metric">
451
- <strong>45</strong>
568
+ <strong>47</strong>
452
569
  <span>MCP tools</span>
453
570
  </div>
454
571
  <div class="metric">
@@ -617,11 +734,106 @@
617
734
  </div>
618
735
  </div>
619
736
  </section>
737
+
738
+ <section class="assess" id="assess" aria-label="Proof Cards assessment view">
739
+ <div class="assess-header">
740
+ <div>
741
+ <p class="eyebrow">Proof-first assessment</p>
742
+ <h2>Pick the safest next fix.</h2>
743
+ </div>
744
+ <p>
745
+ <code>projscan assess</code> turns local quality, bug-hunt, and preflight evidence into
746
+ Proof Cards. Each card names the risk, the safest change shape, and the commands that
747
+ prove the risk went down.
748
+ </p>
749
+ </div>
750
+
751
+ <div class="proof-card-grid">
752
+ <section class="terminal compact-terminal" aria-label="Assess terminal output">
753
+ <div class="terminal-bar">
754
+ <span class="dot red"></span>
755
+ <span class="dot amber"></span>
756
+ <span class="dot green"></span>
757
+ <span class="terminal-title">projscan assess --mode fix-first</span>
758
+ </div>
759
+ <div class="terminal-body">
760
+ <span class="line"
761
+ ><span class="prompt">$</span>
762
+ <span class="cmd">projscan assess --mode fix-first --format markdown</span></span
763
+ >
764
+ <span class="line dim">Proof-first assessment</span>
765
+ <span class="line">&nbsp;</span>
766
+ <span class="line term-heading">Fix first: maintainability hotspot</span>
767
+ <span class="line">src/core/bugHunt.ts combines ranking, evidence, and output.</span>
768
+ <span class="line success">Confidence: high</span>
769
+ <span class="line notice">Risk delta: 76 -> 61 if split behind tests</span>
770
+ <span class="line">&nbsp;</span>
771
+ <span class="line term-heading">Proof commands</span>
772
+ <span class="line success">npm run typecheck</span>
773
+ <span class="line success">npm run lint</span>
774
+ <span class="line success">vitest tests/core/bugHunt.test.ts</span>
775
+ <span class="line">&nbsp;</span>
776
+ <span class="line term-heading">Simulate before editing</span>
777
+ <span class="line notice"
778
+ >projscan simulate --plan "split bugHunt.ts into ranking..."</span
779
+ >
780
+ </div>
781
+ </section>
782
+
783
+ <article class="proof-card" aria-label="Proof Card">
784
+ <span class="label blue">Proof Card</span>
785
+ <h3>Maintainability hotspot</h3>
786
+ <p>
787
+ Fix the extraction only when local evidence shows lower coupling and focused tests can
788
+ prove behavior stayed stable.
789
+ </p>
790
+ <div class="evidence-list">
791
+ <div class="evidence-item">
792
+ <strong>Evidence</strong>
793
+ <span>high churn, high complexity, broad imports, direct bug-hunt tests</span>
794
+ </div>
795
+ <div class="evidence-item">
796
+ <strong>Impact</strong>
797
+ <span>bug ranking, MCP findings, release review, PR evidence packs</span>
798
+ </div>
799
+ <div class="evidence-item">
800
+ <strong>Safe shape</strong>
801
+ <span>extract ranking, evidence, and markdown output behind existing tests</span>
802
+ </div>
803
+ <div class="evidence-item">
804
+ <strong>Verify</strong>
805
+ <span>typecheck, lint, focused Vitest, then bug-hunt smoke</span>
806
+ </div>
807
+ <div class="evidence-item">
808
+ <strong>Feedback</strong>
809
+ <span>accept, suppress, or feed false-positive notes back into trust memory</span>
810
+ </div>
811
+ </div>
812
+ <div class="delta-row" aria-label="Risk delta">
813
+ <div class="delta">
814
+ <strong>76</strong>
815
+ <span>before risk</span>
816
+ </div>
817
+ <div class="delta">
818
+ <strong>61</strong>
819
+ <span>after risk</span>
820
+ </div>
821
+ <div class="delta">
822
+ <strong>3</strong>
823
+ <span>proof commands</span>
824
+ </div>
825
+ </div>
826
+ </article>
827
+ </div>
828
+ </section>
620
829
  </main>
621
830
  <script>
622
831
  if (window.location.hash === '#proof') {
623
832
  document.body.classList.add('proof-only');
624
833
  }
834
+ if (window.location.hash === '#assess') {
835
+ document.body.classList.add('assess-only');
836
+ }
625
837
  document.documentElement.dataset.ready = 'true';
626
838
  </script>
627
839
  </body>
Binary file
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.11.0",
4
+ "version": "4.12.0",
5
5
  "description": "Local code intelligence for agent-assisted engineering. Focused daily workflows for repo orientation before edits, proof before handoff or commit, and release-candidate review, with AST-backed evidence through an MCP server and CLI. Runs locally by default.",
6
6
  "type": "module",
7
7
  "main": "./dist/index.js",
@@ -25,6 +25,7 @@
25
25
  "docs/examples/swarm-coordination.md",
26
26
  "docs/projscan-mission-control.png",
27
27
  "docs/projscan-mission-control.gif",
28
+ "docs/projscan-proof-cards.png",
28
29
  "docs/projscan-proof-router.png",
29
30
  "docs/projscan-mission-proof.gif",
30
31
  "docs/examples/plugins",
@@ -24,6 +24,12 @@ const captures = [
24
24
  output: path.join(repoRoot, 'docs', 'projscan-proof-router.png'),
25
25
  viewport: '1440,760',
26
26
  },
27
+ {
28
+ name: 'Proof Cards assessment',
29
+ url: `${pathToFileURL(demoPath).href}#assess`,
30
+ output: path.join(repoRoot, 'docs', 'projscan-proof-cards.png'),
31
+ viewport: '1440,820',
32
+ },
27
33
  ];
28
34
 
29
35
  for (const capture of captures) {