projscan 4.11.0 → 4.11.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 CHANGED
@@ -102,6 +102,8 @@ You get Proof Cards: each recommendation carries local evidence, impact, a safe
102
102
 
103
103
  Use the risk delta simulator before a refactor or extraction. It predicts likely touched files, affected tests, contract surfaces, rollout steps, proof commands, and before/after risk from local evidence. It is read-only: it does not edit files, run the plan, release, tag, publish, or deploy.
104
104
 
105
+ <img src="docs/projscan-proof-cards.png" alt="projscan assess showing a Proof Card with evidence, impact, safe change shape, verification commands, feedback path, and risk delta" width="760">
106
+
105
107
  Success criteria: the team sees the one or two highest-value fixes, why they matter, how to prove them, and whether ship-readiness still needs caution or review.
106
108
 
107
109
  ## Mission Control
@@ -143,6 +145,16 @@ npm run docs:screenshots
143
145
  npm run docs:demos
144
146
  ```
145
147
 
148
+ ## 4.11.1 Notes
149
+
150
+ 4.11.1 is a public README media refresh for the proof-first release:
151
+
152
+ - Added a dedicated Proof Cards screenshot for `projscan assess` and
153
+ `projscan simulate`.
154
+ - Regenerated README screenshots so public media shows the current 47-tool MCP
155
+ surface.
156
+ - Updated website handoff guidance to use immutable `v4.11.1` media URLs.
157
+
146
158
  ## 4.11.0 Notes
147
159
 
148
160
  4.11.0 is the proof-first engineering command center release:
@@ -183,45 +195,45 @@ npx -y projscan mcp --watch
183
195
 
184
196
  ### Agent Questions
185
197
 
186
- | Agent question | CLI or MCP route |
187
- | -------------------------------------------- | -------------------------------------------------------------------------------- |
188
- | Which files implement auth? | `projscan search "auth" --format json` |
189
- | Who imports this file? | `projscan semantic-graph --query importers --file src/auth/jwt.ts --format json` |
190
- | What breaks if I rename this symbol? | `projscan impact --symbol buildCodeGraph --format json` |
191
- | What should I fix first? | `projscan bug-hunt --format json` |
192
- | What is risky and worth fixing this week? | `projscan assess --goal "make this repo safer to ship this week"` |
198
+ | Agent question | CLI or MCP route |
199
+ | -------------------------------------------- | ---------------------------------------------------------------------------------------- |
200
+ | Which files implement auth? | `projscan search "auth" --format json` |
201
+ | Who imports this file? | `projscan semantic-graph --query importers --file src/auth/jwt.ts --format json` |
202
+ | What breaks if I rename this symbol? | `projscan impact --symbol buildCodeGraph --format json` |
203
+ | What should I fix first? | `projscan bug-hunt --format json` |
204
+ | What is risky and worth fixing this week? | `projscan assess --goal "make this repo safer to ship this week"` |
193
205
  | Is this refactor worth doing? | `projscan simulate --plan "split bugHunt.ts into ranking, evidence, and output modules"` |
194
- | Which files have high risk and low coverage? | `projscan coverage --format json` |
195
- | What should my agent do next? | `projscan workplan --format json` |
196
- | Which proof belongs in this PR? | `projscan evidence-pack --pr-comment` |
197
- | Is this branch ready to merge? | `projscan preflight --mode before_merge --format json` |
206
+ | Which files have high risk and low coverage? | `projscan coverage --format json` |
207
+ | What should my agent do next? | `projscan workplan --format json` |
208
+ | Which proof belongs in this PR? | `projscan evidence-pack --pr-comment` |
209
+ | Is this branch ready to merge? | `projscan preflight --mode before_merge --format json` |
198
210
 
199
211
  ## Command Map
200
212
 
201
- | Command | Use it when you need |
202
- | ------------------------- | -------------------------------------------------------------------------- |
203
- | `projscan start` | first-60-seconds orientation, routing, and Mission Control |
204
- | `projscan understand` | cited repo map, runtime flows, public contracts, and change readiness |
205
- | `projscan preflight` | proceed, caution, or block gate for edit, commit, or merge |
213
+ | Command | Use it when you need |
214
+ | ------------------------- | --------------------------------------------------------------------------- |
215
+ | `projscan start` | first-60-seconds orientation, routing, and Mission Control |
216
+ | `projscan understand` | cited repo map, runtime flows, public contracts, and change readiness |
217
+ | `projscan preflight` | proceed, caution, or block gate for edit, commit, or merge |
206
218
  | `projscan assess` | proof-first assessment with Proof Cards, risk delta, and fix-first guidance |
207
219
  | `projscan simulate` | risk delta simulator for a proposed change plan before editing |
208
- | `projscan evidence-pack` | PR-ready proof with risks, owners, and next commands |
209
- | `projscan bug-hunt` | ranked fix queue from health, hotspots, session, and preflight evidence |
210
- | `projscan workplan` | ordered agent tasks with proof and handoff text |
211
- | `projscan doctor` | project health, tooling gaps, dead code, and supply-chain signals |
212
- | `projscan review` | one-call PR review from structural diff, risk, cycles, functions, and deps |
213
- | `projscan impact` | blast radius for a file or symbol before rename, delete, or upgrade |
214
- | `projscan semantic-graph` | imports, exports, importers, symbol definitions, and package importers |
215
- | `projscan dataflow` | framework-aware source-to-sink risks |
216
- | `projscan hotspots` | churn, complexity, ownership, and coverage risk ranking |
217
- | `projscan coverage` | high-risk files with weak test coverage |
218
- | `projscan dependencies` | dependency inventory, license summary, and risk notes |
219
- | `projscan upgrade <pkg>` | offline upgrade impact from changelog and importer evidence |
220
- | `projscan audit` | normalized `npm audit` findings and SARIF |
221
- | `projscan coordinate` | collisions, claims, and merge-risk across worktrees |
222
- | `projscan plugin` | local analyzer and reporter plugin workflow |
223
- | `projscan privacy-check` | local scan boundary, telemetry, ignore rules, and network-capable paths |
224
- | `projscan mcp` | MCP server over stdio |
220
+ | `projscan evidence-pack` | PR-ready proof with risks, owners, and next commands |
221
+ | `projscan bug-hunt` | ranked fix queue from health, hotspots, session, and preflight evidence |
222
+ | `projscan workplan` | ordered agent tasks with proof and handoff text |
223
+ | `projscan doctor` | project health, tooling gaps, dead code, and supply-chain signals |
224
+ | `projscan review` | one-call PR review from structural diff, risk, cycles, functions, and deps |
225
+ | `projscan impact` | blast radius for a file or symbol before rename, delete, or upgrade |
226
+ | `projscan semantic-graph` | imports, exports, importers, symbol definitions, and package importers |
227
+ | `projscan dataflow` | framework-aware source-to-sink risks |
228
+ | `projscan hotspots` | churn, complexity, ownership, and coverage risk ranking |
229
+ | `projscan coverage` | high-risk files with weak test coverage |
230
+ | `projscan dependencies` | dependency inventory, license summary, and risk notes |
231
+ | `projscan upgrade <pkg>` | offline upgrade impact from changelog and importer evidence |
232
+ | `projscan audit` | normalized `npm audit` findings and SARIF |
233
+ | `projscan coordinate` | collisions, claims, and merge-risk across worktrees |
234
+ | `projscan plugin` | local analyzer and reporter plugin workflow |
235
+ | `projscan privacy-check` | local scan boundary, telemetry, ignore rules, and network-capable paths |
236
+ | `projscan mcp` | MCP server over stdio |
225
237
 
226
238
  Run the generated command help when you need flags:
227
239
 
@@ -285,7 +297,7 @@ Use `suppress` for a known false positive in a specific path without disabling
285
297
  the rule everywhere. For one line, add an inline directive next to the value:
286
298
 
287
299
  ```ts
288
- const firebaseKey = "AIza..." // projscan-ignore-line hardcoded-secret -- Firebase web keys are public identifiers
300
+ const firebaseKey = 'AIza...'; // projscan-ignore-line hardcoded-secret -- Firebase web keys are public identifiers
289
301
  ```
290
302
 
291
303
  Config docs live in [docs/GUIDE.md](docs/GUIDE.md#configuration-projscanrc).
@@ -394,7 +406,7 @@ Supply-chain scanners may flag package strings or APIs used by `git`, `npm audit
394
406
 
395
407
  ## Install Notes
396
408
 
397
- `projscan@4.11.0` has seven direct runtime dependencies:
409
+ `projscan@4.11.1` has seven direct runtime dependencies:
398
410
 
399
411
  - `@babel/parser`
400
412
  - `@babel/types`
@@ -404,7 +416,7 @@ Supply-chain scanners may flag package strings or APIs used by `git`, `npm audit
404
416
  - `ora`
405
417
  - `web-tree-sitter`
406
418
 
407
- If npm prints `allow-scripts` warnings during a global install, check which package names it lists. projscan core does not need `node-gyp` grammar builds at runtime in 4.11.0. Open an issue with the warning text if npm reports install scripts from `projscan@latest`, or run `projscan feedback intake --text "<warning text>" --format json` to turn it into a focused setup-trust task.
419
+ If npm prints `allow-scripts` warnings during a global install, check which package names it lists. projscan core does not need `node-gyp` grammar builds at runtime in 4.11.1. Open an issue with the warning text if npm reports install scripts from `projscan@latest`, or run `projscan feedback intake --text "<warning text>" --format json` to turn it into a focused setup-trust task.
408
420
 
409
421
  The grammar packages are build-time sources, not global-install dependencies. Published grammar assets include `tree-sitter-python.wasm` and `tree-sitter-c_sharp.wasm`.
410
422
 
@@ -1,23 +1,23 @@
1
1
  {
2
2
  "bomFormat": "CycloneDX",
3
3
  "specVersion": "1.5",
4
- "serialNumber": "urn:uuid:bd2ad4e4-033a-46f3-bbb7-1b717665131f",
4
+ "serialNumber": "urn:uuid:ac1a1fd3-2c78-4830-8579-508d0b0ff5e9",
5
5
  "version": 1,
6
6
  "metadata": {
7
- "timestamp": "2026-06-21T21:06:26.004Z",
7
+ "timestamp": "2026-06-22T06:58:43.839Z",
8
8
  "tools": [
9
9
  {
10
10
  "vendor": "projscan",
11
11
  "name": "projscan-sbom-generator",
12
- "version": "4.11.0"
12
+ "version": "4.11.1"
13
13
  }
14
14
  ],
15
15
  "component": {
16
16
  "type": "application",
17
- "bom-ref": "pkg:npm/projscan@4.11.0",
17
+ "bom-ref": "pkg:npm/projscan@4.11.1",
18
18
  "name": "projscan",
19
- "version": "4.11.0",
20
- "purl": "pkg:npm/projscan@4.11.0"
19
+ "version": "4.11.1",
20
+ "purl": "pkg:npm/projscan@4.11.1"
21
21
  }
22
22
  },
23
23
  "components": [
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "name": "projscan",
3
- "version": "4.11.0",
3
+ "version": "4.11.1",
4
4
  "mcpProtocolVersion": null,
5
- "generatedAt": "2026-06-21T21:06:32.779Z",
5
+ "generatedAt": "2026-06-22T06:58:50.868Z",
6
6
  "toolCount": 47,
7
7
  "tools": [
8
8
  {
@@ -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.11.1",
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) {