phpstan-mcp-mx 0.13.0 → 0.15.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 (58) hide show
  1. package/CHANGELOG.md +28 -0
  2. package/README.md +135 -7
  3. package/dist/baseline.d.ts +19 -0
  4. package/dist/baseline.js +44 -11
  5. package/dist/baseline.js.map +1 -1
  6. package/dist/config.d.ts +14 -2
  7. package/dist/config.js +20 -2
  8. package/dist/config.js.map +1 -1
  9. package/dist/defaults.d.ts +37 -0
  10. package/dist/defaults.js +100 -0
  11. package/dist/defaults.js.map +1 -0
  12. package/dist/failure.d.ts +1 -1
  13. package/dist/failure.js.map +1 -1
  14. package/dist/index.js +17 -1
  15. package/dist/index.js.map +1 -1
  16. package/dist/phpstan/process.d.ts +6 -0
  17. package/dist/phpstan/process.js +8 -1
  18. package/dist/phpstan/process.js.map +1 -1
  19. package/dist/phpstan.d.ts +1 -1
  20. package/dist/phpstan.js +106 -41
  21. package/dist/phpstan.js.map +1 -1
  22. package/dist/project.d.ts +10 -1
  23. package/dist/project.js +28 -1
  24. package/dist/project.js.map +1 -1
  25. package/dist/report.d.ts +15 -2
  26. package/dist/report.js +12 -5
  27. package/dist/report.js.map +1 -1
  28. package/dist/runner.d.ts +19 -4
  29. package/dist/runner.js +48 -18
  30. package/dist/runner.js.map +1 -1
  31. package/dist/runs.d.ts +59 -0
  32. package/dist/runs.js +78 -0
  33. package/dist/runs.js.map +1 -0
  34. package/dist/schema-dialect.d.ts +30 -0
  35. package/dist/schema-dialect.js +57 -0
  36. package/dist/schema-dialect.js.map +1 -0
  37. package/dist/server.js +5 -0
  38. package/dist/server.js.map +1 -1
  39. package/dist/tools/analysis.d.ts +4 -3
  40. package/dist/tools/analysis.js +26 -6
  41. package/dist/tools/analysis.js.map +1 -1
  42. package/dist/tools/inspect.d.ts +2 -0
  43. package/dist/tools/inspect.js +144 -2
  44. package/dist/tools/inspect.js.map +1 -1
  45. package/dist/tools/prompts.d.ts +17 -2
  46. package/dist/tools/prompts.js +343 -25
  47. package/dist/tools/prompts.js.map +1 -1
  48. package/dist/tools/shared.d.ts +14 -1
  49. package/dist/tools/shared.js +51 -5
  50. package/dist/tools/shared.js.map +1 -1
  51. package/dist/tools.js +10 -5
  52. package/dist/tools.js.map +1 -1
  53. package/dist/unmatched.d.ts +91 -0
  54. package/dist/unmatched.js +309 -0
  55. package/dist/unmatched.js.map +1 -0
  56. package/dist/version.d.ts +1 -1
  57. package/dist/version.js +1 -1
  58. package/package.json +2 -1
package/CHANGELOG.md CHANGED
@@ -4,6 +4,34 @@ Alle noemenswaardige wijzigingen per versie. Vanaf 0.10.0 gegenereerd door
4
4
  semantic-release uit de commit-historie; de versies daarvoor zijn met de hand
5
5
  geschreven.
6
6
 
7
+ # [0.15.0](https://codeberg.org/MartijnSchimmel/phpstan-mcp-mx/compare/v0.14.0...v0.15.0) (2026-09-10)
8
+
9
+
10
+ ### Bug Fixes
11
+
12
+ * laat runners overal en ook op Windows werken ([b927dbd](https://codeberg.org/MartijnSchimmel/phpstan-mcp-mx/commit/b927dbd76fee9d29d688efe9ade7d67c39ef6870))
13
+ * wijs bij een onbegrijpelijke crash ook naar clear_result_cache ([db253e2](https://codeberg.org/MartijnSchimmel/phpstan-mcp-mx/commit/db253e2d299ced88c9073cad9de4fbf38eec2fbb))
14
+
15
+
16
+ ### Features
17
+
18
+ * meer werkpatronen als prompt, met aanvulling op het project ([deb37a4](https://codeberg.org/MartijnSchimmel/phpstan-mcp-mx/commit/deb37a40cd37ce644e28455798063603beee50f6))
19
+
20
+ # [0.14.0](https://codeberg.org/MartijnSchimmel/phpstan-mcp-mx/compare/v0.13.0...v0.14.0) (2026-09-10)
21
+
22
+
23
+ ### Bug Fixes
24
+
25
+ * laat $schema weg uit de tool-schema's ([96be748](https://codeberg.org/MartijnSchimmel/phpstan-mcp-mx/commit/96be748cd7d738e485f6de1960c3c3e0919c7579))
26
+
27
+
28
+ ### Features
29
+
30
+ * lees de volgende pagina uit hetzelfde resultaat met runId ([caee99f](https://codeberg.org/MartijnSchimmel/phpstan-mcp-mx/commit/caee99f7fb645acf267b4748ecdaee1cb936e3cb))
31
+ * prompt die laat zien wat een level hoger kost ([94cad76](https://codeberg.org/MartijnSchimmel/phpstan-mcp-mx/commit/94cad761b6fc97a46ef47cbc972a2f2522bb32db))
32
+ * spoor verouderde negeerregels op met unmatched_ignores ([435db54](https://codeberg.org/MartijnSchimmel/phpstan-mcp-mx/commit/435db540f1b132552805a7a897db52fced1b470c))
33
+ * standaarden per project voor geheugen, timeout en config ([053335b](https://codeberg.org/MartijnSchimmel/phpstan-mcp-mx/commit/053335bb97a93f7b99f5fc21b07489bff4f11c68))
34
+
7
35
  # [0.13.0](https://codeberg.org/MartijnSchimmel/phpstan-mcp-mx/compare/v0.12.0...v0.13.0) (2026-09-10)
8
36
 
9
37
 
package/README.md CHANGED
@@ -194,12 +194,15 @@ pad in `PHPSTAN_MCP_CONFIG`):
194
194
  "command": ["docker", "exec", "-w", "/var/www/html", "admin-app"],
195
195
  "workdir": "/var/www/html"
196
196
  }
197
+ },
198
+ "projects": {
199
+ "/Users/jij/projecten/shop": { "memoryLimit": "4G", "timeoutSeconds": 900 }
197
200
  }
198
201
  }
199
202
  ```
200
203
 
201
204
  Daarmee is je MCP-registratie één regel zonder `--env`, en staat de configuratie op één plek
202
- in plaats van verdeeld over zes variabelen.
205
+ in plaats van verdeeld over zeven variabelen.
203
206
 
204
207
  Een bestand dat er niet is, is geen fout: dan geldt alleen de omgeving. Een bestand dat er
205
208
  wél is maar niet klopt, laat de server niet starten — dan heeft iemand iets bedoeld wat
@@ -290,7 +293,14 @@ vertaald, en de bestandspaden in het antwoord komen terug als host-paden — and
290
293
  `/var/www/html/app/User.php` terug en kun je dat bestand niet openen.
291
294
 
292
295
  `list_projects` vermeldt per project welke omgeving geldt, en met een runner hoeft er op de
293
- host geen `vendor/bin/phpstan` te staan.
296
+ host geen `vendor/bin/phpstan` te staan. Alles loopt dan via de runner: analyseren, maar ook
297
+ `diagnose_project`, `clear_result_cache` en `generate_baseline`. Alleen `unmatched_ignores`
298
+ werkt niet met een runner (zie daar).
299
+
300
+ `workdir` is een POSIX-pad, ook als de host Windows is: de omgeving is een Linux-container
301
+ of WSL. De projectsleutel mag in de vorm van je platform staan (`C:\Users\jij\admin` of
302
+ `C:/Users/jij/admin`, met of zonder slash erachter); hij wordt vergeleken na het oplossen
303
+ van symlinks, net als het `project`-argument zelf.
294
304
 
295
305
  **Het commando komt uit de serverconfiguratie, nooit uit een tool-aanroep.** Net als de roots
296
306
  is dit iets wat een mens één keer vastlegt: een model kiest alleen een project, en of daar
@@ -325,6 +335,41 @@ Dit is de enige manier om het bij de server vast te leggen. PHPStan kent er geen
325
335
  eigen env-variabele; het alternatief is `memory_limit` in je `php.ini`, en dat geldt dan
326
336
  voor élke PHP-CLI op je machine.
327
337
 
338
+ Heeft één project meer nodig dan de rest, zet het dan bij dat project in
339
+ `PHPSTAN_MCP_PROJECTS` in plaats van deze waarde voor iedereen op te hogen — met
340
+ `PHPSTAN_MCP_MAX_PARALLEL=2` is een machinebrede 4G twee keer 4G.
341
+
342
+ ### `PHPSTAN_MCP_PROJECTS` (optioneel)
343
+
344
+ Standaarden voor één project, als JSON — of onder `projects` in het configbestand:
345
+
346
+ ```json
347
+ {
348
+ "/Users/jij/projecten/shop": {
349
+ "memoryLimit": "4G",
350
+ "timeoutSeconds": 900,
351
+ "config": "phpstan-ci.neon"
352
+ }
353
+ }
354
+ ```
355
+
356
+ | Sleutel | Betekenis |
357
+ | --- | --- |
358
+ | `memoryLimit` | `--memory-limit` voor dit project, in dezelfde vorm als `PHPSTAN_MCP_MEMORY_LIMIT` |
359
+ | `timeoutSeconds` | timeout voor dit project, van 1 tot en met 1800 |
360
+ | `config` | configbestand binnen het project, als PHPStan dat niet zelf vindt |
361
+
362
+ De volgorde is steeds dezelfde: wat de aanroep meegeeft, dan de standaard van het project,
363
+ dan die van de hele server. Een standaard is dus geen plafond.
364
+
365
+ `config` gaat door dezelfde padcontrole als een `config` uit een aanroep en moet binnen het
366
+ project liggen; een neon kan PHP-code laten uitvoeren. Hij telt overal als dé config van het
367
+ project: bij de melding dat er een baseline meedoet en bij `unmatched_ignores`.
368
+
369
+ Een onbekende sleutel wordt geweigerd, niet genegeerd: `memorylimit` met een kleine l zou
370
+ anders stil niets doen. `list_projects` en `server_config` tonen welke standaarden er gelden,
371
+ en een kapotte waarde staat daar als probleem bij — de lijst met projecten blijft werken.
372
+
328
373
  ## Tools
329
374
 
330
375
  Elke tool verwacht een expliciet `project`-pad. De server heeft geen "huidig project": dat
@@ -375,10 +420,17 @@ antwoord volloopt met wat er al jaren stond.
375
420
  | `project` | ja | absoluut pad naar de projectroot |
376
421
  | `base` | nee | commit, branch of tag om tegen te vergelijken (standaard `HEAD`) |
377
422
  | `staged` | nee | alleen wat gestaged is (`git diff --cached`), voor een check vóór een commit |
423
+ | `onlyChangedLines` | nee | alleen bevindingen op regels die gewijzigd zijn |
378
424
 
379
425
  Verder dezelfde argumenten als `analyse_project`, op `paths` na. Met `base=main` krijg je de
380
426
  hele branch in plaats van alleen je onopgeslagen werk.
381
427
 
428
+ Elke bevinding zegt met `onChangedLine` of hij op een gewijzigde regel staat; in de tekst
429
+ staat er een `+` voor. Een gewijzigd bestand bevat vaak ook fouten die er al stonden, en
430
+ zonder dat onderscheid ga je die repareren of stop je te vroeg. Let wel: een bevinding op een
431
+ ongewijzigde regel kan nog steeds uit je wijziging volgen — een aangepaste signatuur geeft
432
+ fouten bij de aanroepen, en die regels heb je niet aangeraakt.
433
+
382
434
  Twee dingen die het meeneemt en die je makkelijk mist: **nieuwe bestanden die nog niet aan
383
435
  git toegevoegd zijn** (`git diff` kent die niet, dus er is een tweede uitvraag voor) en
384
436
  **niets uit `resources/views`** — een `.blade.php` eindigt op `.php`, maar is een template
@@ -415,8 +467,11 @@ clientlog, onzichtbaar voor het model. Een geweigerde instelling wordt gemeld in
415
467
  weggelaten: staat `PHPSTAN_MCP_MAX_PARALLEL` op onzin, dan is dat veld `null` en staat de
416
468
  reden onder "Geweigerde instellingen", terwijl de rest gewoon leesbaar blijft.
417
469
 
418
- Let op wat er *niet* in staat: dit is een vaste lijst van zes instellingen en geen
419
- doorgeefluik naar de omgeving. In dezelfde omgeving zitten tokens; die horen niet in een
470
+ Heeft een project eigen standaarden (`PHPSTAN_MCP_PROJECTS`), dan staan die er per project
471
+ onder.
472
+
473
+ Let op wat er *niet* in staat: dit is een vaste lijst van instellingen en geen doorgeefluik
474
+ naar de omgeving. In dezelfde omgeving zitten tokens; die horen niet in een
420
475
  toolantwoord.
421
476
 
422
477
  ### `diagnose_project`
@@ -456,6 +511,36 @@ Let op het onderscheid: wat hier in staat is precies wat `analyse_project` *niet
456
511
  project dat zijn baseline includet, rapporteert alleen de fouten die er nieuw bij komen —
457
512
  die vergelijking maakt PHPStan zelf al.
458
513
 
514
+ ### `unmatched_ignores`
515
+
516
+ Zoekt de negeerregels die niets meer doen: baseline-regels voor fouten die allang opgelost
517
+ zijn, en regels waarvan de `count` hoger is dan wat er nog voorkomt. Veel projecten zetten
518
+ `reportUnmatchedIgnoredErrors: false`, en dan groeit dat ongemerkt — op één project bleken
519
+ 554 van de 2116 baseline-regels niets meer te matchen.
520
+
521
+ | Argument | Verplicht | Betekenis |
522
+ | --- | --- | --- |
523
+ | `project` | ja | absoluut pad naar de projectroot |
524
+ | `memoryLimit` | nee | dit is een volledige analyse, dus die kan meer nodig hebben |
525
+ | `timeoutSeconds` | nee | standaard 300 |
526
+ | `offset` / `limit` | nee | welk deel van de regels je terugkrijgt |
527
+
528
+ Dit is een volledige analyse, met een tijdelijke config die die van het project includet en
529
+ de vlag omzet. Die config staat in de tijdelijke map van de server en niet in het project,
530
+ dus er verandert niets aan je repository. PHPStans resultcache blijft bruikbaar: de vlag
531
+ verandert niets aan wat er geanalyseerd wordt, dus de volgende gewone analyse is net zo snel.
532
+
533
+ Per regel staat erbij of hij uit de baseline komt. Patronen zonder pad komen apart; die staan
534
+ in `ignoreErrors` van je config of van een config die een pakket meebrengt, en daar helpt een
535
+ nieuwe baseline niet.
536
+
537
+ Er is bewust geen `level` en geen `paths`: op een ander niveau zijn het andere fouten, en bij
538
+ een deel van het project lijkt alles daarbuiten verouderd.
539
+
540
+ Werkt niet op een project met een eigen uitvoeringsomgeving (`PHPSTAN_MCP_RUNNERS`): de
541
+ tijdelijke config staat op de host en is in een container niet te zien. De tool zegt dat met
542
+ reden `unsupported_with_runner`.
543
+
459
544
  ### `generate_baseline` (alleen met schrijfrechten)
460
545
 
461
546
  Zet alle huidige fouten in een baseline, zodat een volgende analyse alleen meldt wat er nieuw
@@ -495,6 +580,35 @@ includes:
495
580
  - phpstan-baseline.neon
496
581
  ```
497
582
 
583
+ ## Prompts
584
+
585
+ Werkpatronen die alleen bestaande tools combineren. Een prompt en geen tool, omdat een tool
586
+ context kost in elke sessie en een prompt alleen als je hem kiest. Elke vangrail in de teksten
587
+ komt uit een proefrun op een echt project die zonder die zin misging.
588
+
589
+ - **`phpstan_wijziging_nakijken`** — je eigen wijziging nakijken met `analyse_changed`,
590
+ beginnen bij de bevindingen op gewijzigde regels, en herhalen tot het schoon is (zonder
591
+ `runId`, anders zie je de uitslag van vóór je reparatie). Met `base` (bijv. `main`) voor
592
+ een hele branch vóór een PR.
593
+ - **`phpstan_level_verhogen`** — wat een level hoger kost: twee tellingen met `limit: 1` en
594
+ het verschil per soort. Het level staat vaak in een gedeelde config in `vendor/`, en
595
+ `ignore.*`-bevindingen tellen niet mee: dat zijn inline `@phpstan-ignore`-regels die op een
596
+ ander level niets te negeren hebben.
597
+ - **`phpstan_baseline_afbouwen`** — wat er in de baseline verouderd is (`unmatched_ignores`),
598
+ wat een nieuwe baseline zou verstoppen (`analyse_project`), en de goedkoopste échte afbouw.
599
+ Opschonen en verstoppen blijven twee dingen: `generate_baseline` wordt alleen voorgesteld
600
+ als er niets te verstoppen valt, en nooit uit zichzelf aangeroepen.
601
+ - **`phpstan_soort_wegwerken`** — een opruimronde voor één identifier of een groep als
602
+ `missingType`, met de `runId` binnen de ronde en zonder `runId` na elke reparatie. Zonder
603
+ `identifier` kiest het model een soort: eerst wat bij de bron op te lossen is, anders een
604
+ soort die in één of twee bestanden zit.
605
+ - **`phpstan_projecten_vergelijken`** — twee projecten naast elkaar (`diagnose_project`,
606
+ level, baseline, runners en standaarden), en alleen de verschillen. Verklaart geen verschil
607
+ het gedrag, dan is een verouderde resultcache de volgende verdachte.
608
+
609
+ Alle prompts nemen een optioneel `project` (bij de vergelijking `projectA` en `projectB`), en
610
+ een client die aanvulling ondersteunt krijgt daar een keuzelijst uit `list_projects`.
611
+
498
612
  ## Als een tool mislukt
499
613
 
500
614
  Een mislukte aanroep geeft twee blokken terug: de melding in gewone taal, en een JSON-blok
@@ -515,8 +629,8 @@ met velden waarop je kunt sturen.
515
629
  lezen: `no_roots_configured`, `project_outside_roots`, `project_not_found`,
516
630
  `path_outside_project`, `path_not_found`, `phpstan_missing`, `config_missing`,
517
631
  `bootstrap_failed`, `baseline_unreadable`, `invalid_setting`, `memory_limit`, `timeout`,
518
- `cancelled`, `git_missing`, `not_a_git_repository`, `unknown_base`, `unusable_output` en
519
- `phpstan_failed`.
632
+ `cancelled`, `git_missing`, `not_a_git_repository`, `unknown_base`, `unsupported_with_runner`,
633
+ `unusable_output` en `phpstan_failed`.
520
634
 
521
635
  De velden staan bewust in `content` en niet in `structuredContent`: dat laatste wordt door
522
636
  MCP-clients gevalideerd tegen het schema van het *geslaagde* antwoord.
@@ -542,7 +656,21 @@ src/Support/Filters/DealFilters.php
542
656
  42 argument.type Parameter #1 $id expects int, string given.
543
657
  ```
544
658
 
545
- Bij meer resultaten eindigt de tekst met de letterlijke vervolgaanroep (`offset=50`).
659
+ Bij meer resultaten eindigt de tekst met de letterlijke vervolgaanroep:
660
+
661
+ ```
662
+ Nog 12 bevinding(en). Roep dezelfde tool opnieuw aan met offset=50 en runId="kX3v9aQp"; dan
663
+ komt de rest uit dit resultaat in plaats van uit een nieuwe analyse.
664
+ ```
665
+
666
+ Met die `runId` komt de volgende pagina uit hetzelfde resultaat. Zonder zou elke pagina een
667
+ nieuwe analyse zijn, en wie tussendoor een bestand aanpast krijgt dan pagina's met
668
+ verschillende totalen. Alleen `offset`, `limit`, `identifiers` en `onlyChangedLines` mogen
669
+ anders zijn. Hoort de `runId` bij andere argumenten, is hij verlopen (na tien minuten) of
670
+ onbekend, dan volgt een nieuwe analyse met een melding erbij in plaats van een fout.
671
+
672
+ Een pagina uit een eerder resultaat noemt hoe oud dat resultaat is. Analyseer na een
673
+ reparatie dus zónder `runId`: anders zie je de uitslag van vóór de reparatie.
546
674
 
547
675
  ### Annuleren
548
676
 
@@ -55,6 +55,25 @@ export declare function findBaselineFiles(project: ResolvedProject): string[];
55
55
  * op een naam in een comment of onder een andere sleutel.
56
56
  */
57
57
  export declare function describeIncludedBaseline(project: ResolvedProject): string | null;
58
+ /**
59
+ * De baseline-bestanden in de projectroot die de config van het project includeert.
60
+ * Leeg als er geen config is of als die niet te lezen is: dan doet er geen mee.
61
+ */
62
+ export declare function includedBaselineFiles(project: ResolvedProject): string[];
63
+ /** De entries uit de geïncludeerde baselines, met de bestanden die niet te lezen waren. */
64
+ export interface IncludedBaselines {
65
+ readonly files: readonly string[];
66
+ readonly entries: readonly BaselineEntry[];
67
+ /** Bestanden die wél meedoen maar waar deze parser niets uit haalt. */
68
+ readonly unreadable: readonly string[];
69
+ }
70
+ /**
71
+ * Leest de entries uit de baselines die meedoen. Een onleesbaar bestand gooit hier
72
+ * niet, anders dan bij summariseBaseline: wie dit aanroept heeft een analyse in
73
+ * handen die ook zonder de baseline bruikbaar is, en moet alleen weten dát hij
74
+ * niet kan zeggen wat eruit komt.
75
+ */
76
+ export declare function readIncludedBaselines(project: ResolvedProject): IncludedBaselines;
58
77
  /**
59
78
  * Leest een baseline-bestand uit.
60
79
  *
package/dist/baseline.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import { ToolFailure } from './failure.js';
2
2
  import { readFileSync, readdirSync } from 'node:fs';
3
- import { join } from 'node:path';
3
+ import { join, resolve } from 'node:path';
4
4
  /** Hoeveel regels de samenvattingslijsten hoogstens tonen. */
5
5
  const SUMMARY_ROWS = 15;
6
6
  /** Fout die als bruikbare melding naar het model teruggaat, niet als crash. */
@@ -38,16 +38,7 @@ export function findBaselineFiles(project) {
38
38
  * op een naam in een comment of onder een andere sleutel.
39
39
  */
40
40
  export function describeIncludedBaseline(project) {
41
- if (project.config === null)
42
- return null;
43
- let config;
44
- try {
45
- config = readFileSync(join(project.path, project.config), 'utf8');
46
- }
47
- catch {
48
- return null;
49
- }
50
- const included = findBaselineFiles(project).filter((file) => isIncludedIn(config, file));
41
+ const included = includedBaselineFiles(project);
51
42
  if (included.length === 0)
52
43
  return null;
53
44
  const namen = included.join(', ');
@@ -67,6 +58,48 @@ export function describeIncludedBaseline(project) {
67
58
  return (`${namen} wordt geïncludeerd: ${String(errors)} genegeerde fout(en) staan niet in dit ` +
68
59
  'rapport. Gebruik baseline_summary om te zien wat er in staat.');
69
60
  }
61
+ /**
62
+ * De baseline-bestanden in de projectroot die de config van het project includeert.
63
+ * Leeg als er geen config is of als die niet te lezen is: dan doet er geen mee.
64
+ */
65
+ export function includedBaselineFiles(project) {
66
+ if (project.config === null)
67
+ return [];
68
+ let config;
69
+ try {
70
+ config = readFileSync(resolve(project.path, project.config), 'utf8');
71
+ }
72
+ catch {
73
+ return [];
74
+ }
75
+ return findBaselineFiles(project).filter((file) => isIncludedIn(config, file));
76
+ }
77
+ /**
78
+ * Leest de entries uit de baselines die meedoen. Een onleesbaar bestand gooit hier
79
+ * niet, anders dan bij summariseBaseline: wie dit aanroept heeft een analyse in
80
+ * handen die ook zonder de baseline bruikbaar is, en moet alleen weten dát hij
81
+ * niet kan zeggen wat eruit komt.
82
+ */
83
+ export function readIncludedBaselines(project) {
84
+ const files = includedBaselineFiles(project);
85
+ const entries = [];
86
+ const unreadable = [];
87
+ for (const file of files) {
88
+ let content;
89
+ try {
90
+ content = readFileSync(join(project.path, file), 'utf8');
91
+ }
92
+ catch {
93
+ unreadable.push(file);
94
+ continue;
95
+ }
96
+ const parsed = parseBaseline(content);
97
+ if (parsed.length === 0 && content.includes('ignoreErrors'))
98
+ unreadable.push(file);
99
+ entries.push(...parsed);
100
+ }
101
+ return { files, entries, unreadable };
102
+ }
70
103
  /** Of `file` in deze config als lijst-entry voorkomt, met of zonder ./ ervoor. */
71
104
  function isIncludedIn(config, file) {
72
105
  const escaped = file.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
@@ -1 +1 @@
1
- {"version":3,"file":"baseline.js","sourceRoot":"","sources":["../src/baseline.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AACpD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAGjC,8DAA8D;AAC9D,MAAM,YAAY,GAAG,EAAE,CAAC;AAsBxB,+EAA+E;AAC/E,MAAM,OAAO,aAAc,SAAQ,WAAW;IAC5C,YAAY,OAAe,EAAE,SAAwB,qBAAqB,EAAE,UAA0B,EAAE;QACtG,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,CAAC;CACF;AAED;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAAC,OAAwB;IACxD,IAAI,CAAC;QACH,OAAO,WAAW,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;aACtD,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,4BAA4B,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;aAClF,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC;aAC1B,IAAI,EAAE,CAAC;IACZ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,wBAAwB,CAAC,OAAwB;IAC/D,IAAI,OAAO,CAAC,MAAM,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAEzC,IAAI,MAAc,CAAC;IACnB,IAAI,CAAC;QACH,MAAM,GAAG,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC;IACpE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,QAAQ,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,YAAY,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC;IACzF,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAEvC,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAElC,IAAI,MAAc,CAAC;IACnB,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAC;QAC3C,MAAM,GAAG,OAAO,CAAC,KAAK;aACnB,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;aAChD,MAAM,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IACvD,CAAC;IAAC,MAAM,CAAC;QACP,4EAA4E;QAC5E,4EAA4E;QAC5E,8BAA8B;QAC9B,OAAO,GAAG,KAAK,qFAAqF,CAAC;IACvG,CAAC;IAED,OAAO,CACL,GAAG,KAAK,wBAAwB,MAAM,CAAC,MAAM,CAAC,yCAAyC;QACvF,+DAA+D,CAChE,CAAC;AACJ,CAAC;AAED,kFAAkF;AAClF,SAAS,YAAY,CAAC,MAAc,EAAE,IAAY;IAChD,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC;IAC5D,OAAO,IAAI,MAAM,CAAC,2BAA2B,OAAO,YAAY,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AACtF,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,aAAa,CAAC,OAAe;IAC3C,MAAM,OAAO,GAAoB,EAAE,CAAC;IACpC,IAAI,OAAO,GAAkE,IAAI,CAAC;IAElF,MAAM,KAAK,GAAG,GAAS,EAAE;QACvB,IAAI,OAAO,KAAK,IAAI;YAAE,OAAO;QAC7B,yEAAyE;QACzE,kEAAkE;QAClE,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAC/B,OAAO,CAAC,IAAI,CAAC;gBACX,UAAU,EAAE,OAAO,CAAC,UAAU,IAAI,qBAAqB;gBACvD,IAAI,EAAE,OAAO,CAAC,IAAI;gBAClB,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;aAC1B,CAAC,CAAC;QACL,CAAC;QACD,OAAO,GAAG,IAAI,CAAC;IACjB,CAAC,CAAC;IAEF,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACvC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAE5B,IAAI,OAAO,KAAK,GAAG,EAAE,CAAC;YACpB,KAAK,EAAE,CAAC;YACR,OAAO,GAAG,EAAE,CAAC;YACb,SAAS;QACX,CAAC;QACD,IAAI,OAAO,KAAK,IAAI;YAAE,SAAS;QAE/B,MAAM,KAAK,GAAG,mCAAmC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAChE,IAAI,KAAK,KAAK,IAAI;YAAE,SAAS;QAE7B,MAAM,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,KAAK,CAAC;QAC3B,MAAM,KAAK,GAAG,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QAEjC,IAAI,GAAG,KAAK,YAAY;YAAE,OAAO,CAAC,UAAU,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;aACzD,IAAI,GAAG,KAAK,MAAM;YAAE,OAAO,CAAC,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;aAClD,IAAI,GAAG,KAAK,OAAO;YAAE,OAAO,CAAC,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC;IAC5E,CAAC;IAED,KAAK,EAAE,CAAC;IACR,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,uDAAuD;AACvD,MAAM,UAAU,iBAAiB,CAAC,OAAwB;IACxD,MAAM,KAAK,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAC;IAEzC,kFAAkF;IAClF,2EAA2E;IAC3E,8EAA8E;IAC9E,4EAA4E;IAC5E,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO;YACL,OAAO,EAAE,OAAO,CAAC,IAAI;YACrB,WAAW,EAAE,KAAK;YAClB,KAAK,EAAE,EAAE;YACT,MAAM,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE;YACjC,YAAY,EAAE,EAAE;YAChB,MAAM,EAAE,EAAE;SACX,CAAC;IACJ,CAAC;IAED,MAAM,OAAO,GAAwD,EAAE,CAAC;IACxE,MAAM,GAAG,GAAoB,EAAE,CAAC;IAEhC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,CAAC;QAC/D,MAAM,OAAO,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;QAEvC,6EAA6E;QAC7E,6EAA6E;QAC7E,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC;YAC7D,MAAM,IAAI,aAAa,CACrB,GAAG,IAAI,iEAAiE;gBACtE,oDAAoD,CACvD,CAAC;QACJ,CAAC;QAED,OAAO,CAAC,IAAI,CAAC;YACX,IAAI;YACJ,OAAO,EAAE,OAAO,CAAC,MAAM;YACvB,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC;SAC7D,CAAC,CAAC;QACH,GAAG,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,CAAC;IACvB,CAAC;IAED,OAAO;QACL,OAAO,EAAE,OAAO,CAAC,IAAI;QACrB,WAAW,EAAE,IAAI;QACjB,KAAK,EAAE,OAAO;QACd,MAAM,EAAE;YACN,OAAO,EAAE,GAAG,CAAC,MAAM;YACnB,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC;SACzD;QACD,YAAY,EAAE,KAAK,CAAC,GAAG,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;YAClF,UAAU;YACV,KAAK;SACN,CAAC,CAAC;QACH,MAAM,EAAE,KAAK,CAAC,GAAG,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;KACpF,CAAC;AACJ,CAAC;AAED,uEAAuE;AACvE,MAAM,UAAU,cAAc,CAAC,OAAwB;IACrD,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;QACzB,kEAAkE;QAClE,KAAK,CAAC,IAAI,CAAC,6EAA6E,CAAC,CAAC;QAC1F,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAED,IAAI,OAAO,CAAC,MAAM,CAAC,OAAO,KAAK,CAAC,EAAE,CAAC;QACjC,KAAK,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;QACnC,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAED,KAAK,CAAC,IAAI,CACR,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,2BAA2B,OAAO,CAAC,MAAM,CAAC,OAAO,qBAAqB,CAC/F,CAAC;IAEF,IAAI,OAAO,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC7B,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,cAAc,CAAC,CAAC;QAC/B,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK;YAAE,KAAK,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;IACtF,CAAC;IAED,KAAK,CAAC,IAAI,CACR,EAAE,EACF,kBAAkB,EAClB,GAAG,OAAO,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,KAAK,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,UAAU,EAAE,CAAC,EAC9E,EAAE,EACF,4BAA4B,EAC5B,GAAG,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,KAAK,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,IAAI,EAAE,CAAC,EAClE,EAAE,EACF,wFAAwF,EACxF,mFAAmF,CACpF,CAAC;IAEF,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,yFAAyF;AACzF,SAAS,KAAK,CAAC,OAAiC,EAAE,GAAqC;IACrF,MAAM,MAAM,GAAG,IAAI,GAAG,EAAkB,CAAC;IACzC,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC;QACxB,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;IAC1D,CAAC;IAED,OAAO,CAAC,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC;SACzB,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;SACvD,KAAK,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC;AAC5B,CAAC;AAED,SAAS,OAAO,CAAC,KAAa;IAC5B,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC/D,OAAO,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC;AAC7B,CAAC;AAED,SAAS,GAAG,CAAC,KAAa;IACxB,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;AACnC,CAAC"}
1
+ {"version":3,"file":"baseline.js","sourceRoot":"","sources":["../src/baseline.ts"],"names":[],"mappings":"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"}
package/dist/config.d.ts CHANGED
@@ -7,8 +7,8 @@ export declare class ConfigError extends ToolFailure {
7
7
  /** Env-variabele die een ander configbestand aanwijst dan de standaardplek. */
8
8
  export declare const CONFIG_ENV_VAR = "PHPSTAN_MCP_CONFIG";
9
9
  /**
10
- * De instellingen zoals ze in het configbestand mogen staan. Dezelfde zes die ook
11
- * als env-variabele kunnen: het bestand is een andere plek, geen andere taal.
10
+ * De instellingen zoals ze in het configbestand mogen staan. Dezelfde die ook als
11
+ * env-variabele kunnen: het bestand is een andere plek, geen andere taal.
12
12
  */
13
13
  export interface FileConfig {
14
14
  readonly roots?: readonly string[];
@@ -17,6 +17,7 @@ export interface FileConfig {
17
17
  readonly tmpDir?: string;
18
18
  readonly allowWrites?: boolean;
19
19
  readonly runners?: Record<string, unknown>;
20
+ readonly projects?: Record<string, unknown>;
20
21
  }
21
22
  /**
22
23
  * Waar het configbestand staat. `XDG_CONFIG_HOME` wint, anders `~/.config` — de
@@ -32,6 +33,17 @@ export declare function configPath(env?: NodeJS.ProcessEnv): string;
32
33
  * wél — dan heeft iemand iets bedoeld wat niet gebeurt.
33
34
  */
34
35
  export declare function loadConfig(env?: NodeJS.ProcessEnv): FileConfig;
36
+ /**
37
+ * Een projectpad uit de configuratie (een sleutel van `runners` of `projects`), in de
38
+ * vorm waarin `resolveProject` het project oplevert: door `realpath.native`.
39
+ *
40
+ * Die sleutels worden letterlijk vergeleken met het geresolvede pad. Zonder deze stap
41
+ * matcht `/pad/project/` met een slash erachter niet, en een pad via een symlink ook
42
+ * niet — en op Windows nooit `C:/Users/…` tegen `C:\Users\…`. Een instelling die om
43
+ * zo'n reden niet matcht, doet stil niets. Bestaat het pad niet, dan alleen
44
+ * normaliseren: dan valt er ook niets te matchen, maar de melding blijft leesbaar.
45
+ */
46
+ export declare function normaliseProjectKey(key: string): string;
35
47
  /**
36
48
  * Eén instelling uit het bestand, als tekst. Handig omdat de bestaande loaders al
37
49
  * op tekst uit de omgeving werken: zo geldt overal dezelfde validatie, en levert
package/dist/config.js CHANGED
@@ -1,6 +1,6 @@
1
- import { readFileSync } from 'node:fs';
1
+ import { readFileSync, realpathSync } from 'node:fs';
2
2
  import { homedir } from 'node:os';
3
- import { join } from 'node:path';
3
+ import { join, resolve } from 'node:path';
4
4
  import { ToolFailure } from './failure.js';
5
5
  /** Fout die als bruikbare melding naar het model teruggaat, niet als crash. */
6
6
  export class ConfigError extends ToolFailure {
@@ -50,6 +50,24 @@ export function loadConfig(env = process.env) {
50
50
  }
51
51
  return ontleed;
52
52
  }
53
+ /**
54
+ * Een projectpad uit de configuratie (een sleutel van `runners` of `projects`), in de
55
+ * vorm waarin `resolveProject` het project oplevert: door `realpath.native`.
56
+ *
57
+ * Die sleutels worden letterlijk vergeleken met het geresolvede pad. Zonder deze stap
58
+ * matcht `/pad/project/` met een slash erachter niet, en een pad via een symlink ook
59
+ * niet — en op Windows nooit `C:/Users/…` tegen `C:\Users\…`. Een instelling die om
60
+ * zo'n reden niet matcht, doet stil niets. Bestaat het pad niet, dan alleen
61
+ * normaliseren: dan valt er ook niets te matchen, maar de melding blijft leesbaar.
62
+ */
63
+ export function normaliseProjectKey(key) {
64
+ try {
65
+ return realpathSync.native(key);
66
+ }
67
+ catch {
68
+ return resolve(key);
69
+ }
70
+ }
53
71
  /**
54
72
  * Eén instelling uit het bestand, als tekst. Handig omdat de bestaande loaders al
55
73
  * op tekst uit de omgeving werken: zo geldt overal dezelfde validatie, en levert
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAE3C,+EAA+E;AAC/E,MAAM,OAAO,WAAY,SAAQ,WAAW;IAC1C,YAAY,OAAe,EAAE,SAAwB,iBAAiB,EAAE,UAA0B,EAAE;QAClG,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,CAAC;CACF;AAED,+EAA+E;AAC/E,MAAM,CAAC,MAAM,cAAc,GAAG,oBAAoB,CAAC;AAenD;;;GAGG;AACH,MAAM,UAAU,UAAU,CAAC,MAAyB,OAAO,CAAC,GAAG;IAC7D,MAAM,SAAS,GAAG,GAAG,CAAC,cAAc,CAAC,EAAE,IAAI,EAAE,CAAC;IAC9C,IAAI,SAAS,KAAK,SAAS,IAAI,SAAS,KAAK,EAAE;QAAE,OAAO,SAAS,CAAC;IAElE,MAAM,KAAK,GAAG,GAAG,CAAC,iBAAiB,CAAC,EAAE,IAAI,EAAE,CAAC;IAC7C,OAAO,IAAI,CAAC,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,CAAC,EAAE,aAAa,EAAE,aAAa,CAAC,CAAC;AACtH,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,UAAU,CAAC,MAAyB,OAAO,CAAC,GAAG;IAC7D,MAAM,GAAG,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;IAE5B,IAAI,MAAc,CAAC;IACnB,IAAI,CAAC;QACH,MAAM,GAAG,YAAY,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IACrC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,IAAI,OAAgB,CAAC;IACrB,IAAI,CAAC;QACH,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAC/B,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,WAAW,CAAC,GAAG,GAAG,2BAA2B,CAAC,CAAC;IAC3D,CAAC;IAED,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QAC9E,MAAM,IAAI,WAAW,CAAC,GAAG,GAAG,sDAAsD,CAAC,CAAC;IACtF,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,UAAU,CAAC,OAAyB,EAAE,MAAyB,OAAO,CAAC,GAAG;IACxF,MAAM,MAAM,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC;IACxC,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAE3C,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;QAAE,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACnD,IAAI,OAAO,MAAM,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IAC9D,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC;AACxB,CAAC"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ import type { FailureDetails, FailureReason } from './failure.js';
2
+ import { ToolFailure } from './failure.js';
3
+ /** Fout die als bruikbare melding naar het model teruggaat, niet als crash. */
4
+ export declare class ProjectDefaultsError extends ToolFailure {
5
+ constructor(message: string, reason?: FailureReason, details?: FailureDetails);
6
+ }
7
+ /** Env-variabele met de standaarden per project, als JSON. */
8
+ export declare const PROJECTS_ENV_VAR = "PHPSTAN_MCP_PROJECTS";
9
+ /** Dezelfde bovengrens als het tool-argument: een standaard mag niet meer dan een aanroep. */
10
+ export declare const MAX_TIMEOUT_SECONDS = 1800;
11
+ /**
12
+ * Wat per project anders mag dan de rest van de machine. Een Larastan-project kan 2G
13
+ * nodig hebben waar een klein pakket met 256M toe kan; één machinebrede limiet is dan
14
+ * voor het ene te krap en voor het andere een onnodig hoog plafond.
15
+ */
16
+ export interface ProjectDefaults {
17
+ readonly memoryLimit?: string;
18
+ readonly timeoutSeconds?: number;
19
+ /** Relatief aan de projectroot; gaat bij gebruik door resolveWithin. */
20
+ readonly config?: string;
21
+ }
22
+ /** Of PHPStan deze waarde als `--memory-limit` accepteert. */
23
+ export declare function isValidMemoryLimit(value: string): boolean;
24
+ /**
25
+ * Leest de standaarden per project uit de omgeving, of anders uit het configbestand.
26
+ *
27
+ * Net als de runners komt dit uit de serverconfiguratie en nooit uit een aanroep. De
28
+ * aanroeper kan een standaard wél overrulen met een tool-argument; dat is de
29
+ * volgorde die ook bij de globale geheugenlimiet geldt.
30
+ *
31
+ * Een onbekende sleutel wordt geweigerd en niet genegeerd: `memorylimit` met een
32
+ * kleine l doet anders stilzwijgend niets, en dan heeft iemand iets bedoeld wat niet
33
+ * gebeurt — dezelfde reden waarom een kapot configbestand de server niet laat starten.
34
+ */
35
+ export declare function loadProjectDefaults(env?: NodeJS.ProcessEnv): Map<string, ProjectDefaults>;
36
+ /** De standaarden voor dit project; leeg als er niets bijzonders voor geldt. */
37
+ export declare function defaultsFor(project: string, env?: NodeJS.ProcessEnv): ProjectDefaults;
@@ -0,0 +1,100 @@
1
+ import { isAbsolute } from 'node:path';
2
+ import { fromConfig, normaliseProjectKey } from './config.js';
3
+ import { ToolFailure } from './failure.js';
4
+ /** Fout die als bruikbare melding naar het model teruggaat, niet als crash. */
5
+ export class ProjectDefaultsError extends ToolFailure {
6
+ constructor(message, reason = 'invalid_setting', details = {}) {
7
+ super(message, reason, details);
8
+ }
9
+ }
10
+ /** Env-variabele met de standaarden per project, als JSON. */
11
+ export const PROJECTS_ENV_VAR = 'PHPSTAN_MCP_PROJECTS';
12
+ /** Dezelfde bovengrens als het tool-argument: een standaard mag niet meer dan een aanroep. */
13
+ export const MAX_TIMEOUT_SECONDS = 1800;
14
+ /** De sleutels die een project mag hebben. Alles daarbuiten is een tikfout. */
15
+ const KEYS = ['memoryLimit', 'timeoutSeconds', 'config'];
16
+ // PHPStans eigen vorm: bytes als getal, optioneel met K, M of G, of -1 voor
17
+ // onbeperkt. Een neon-parameter bestaat er niet voor en PHPStan kent er ook geen
18
+ // eigen env-variabele voor, dus dit is de enige plek om het blijvend vast te leggen.
19
+ const MEMORY_LIMIT_PATTERN = /^(-1|\d+[KMG]?)$/i;
20
+ /** Of PHPStan deze waarde als `--memory-limit` accepteert. */
21
+ export function isValidMemoryLimit(value) {
22
+ return MEMORY_LIMIT_PATTERN.test(value);
23
+ }
24
+ /**
25
+ * Leest de standaarden per project uit de omgeving, of anders uit het configbestand.
26
+ *
27
+ * Net als de runners komt dit uit de serverconfiguratie en nooit uit een aanroep. De
28
+ * aanroeper kan een standaard wél overrulen met een tool-argument; dat is de
29
+ * volgorde die ook bij de globale geheugenlimiet geldt.
30
+ *
31
+ * Een onbekende sleutel wordt geweigerd en niet genegeerd: `memorylimit` met een
32
+ * kleine l doet anders stilzwijgend niets, en dan heeft iemand iets bedoeld wat niet
33
+ * gebeurt — dezelfde reden waarom een kapot configbestand de server niet laat starten.
34
+ */
35
+ export function loadProjectDefaults(env = process.env) {
36
+ const ruw = (env[PROJECTS_ENV_VAR] ?? fromConfig('projects', env))?.trim();
37
+ if (ruw === undefined || ruw === '')
38
+ return new Map();
39
+ let ontleed;
40
+ try {
41
+ ontleed = JSON.parse(ruw);
42
+ }
43
+ catch {
44
+ throw new ProjectDefaultsError(`${PROJECTS_ENV_VAR} bevat geen geldige JSON. Verwacht wordt een object met per ` +
45
+ 'projectpad bijvoorbeeld {"memoryLimit": "2G", "timeoutSeconds": 600, "config": "phpstan.neon"}.');
46
+ }
47
+ if (typeof ontleed !== 'object' || ontleed === null || Array.isArray(ontleed)) {
48
+ throw new ProjectDefaultsError(`${PROJECTS_ENV_VAR} moet een object zijn met een projectpad per sleutel.`);
49
+ }
50
+ const defaults = new Map();
51
+ for (const [pad, waarde] of Object.entries(ontleed)) {
52
+ defaults.set(normaliseProjectKey(pad), controleer(pad, waarde));
53
+ }
54
+ return defaults;
55
+ }
56
+ /** De standaarden voor dit project; leeg als er niets bijzonders voor geldt. */
57
+ export function defaultsFor(project, env = process.env) {
58
+ return loadProjectDefaults(env).get(project) ?? {};
59
+ }
60
+ /** Weigert een onbruikbare waarde met een melding die zegt wat er wél mag. */
61
+ function controleer(pad, waarde) {
62
+ const waar = `${PROJECTS_ENV_VAR}: "${pad}"`;
63
+ if (!isAbsolute(pad)) {
64
+ throw new ProjectDefaultsError(`${waar} is geen absoluut projectpad.`);
65
+ }
66
+ if (typeof waarde !== 'object' || waarde === null || Array.isArray(waarde)) {
67
+ throw new ProjectDefaultsError(`${waar} moet een object zijn, bijvoorbeeld {"memoryLimit": "2G"}.`);
68
+ }
69
+ const obj = waarde;
70
+ const onbekend = Object.keys(obj).filter((key) => !KEYS.includes(key));
71
+ if (onbekend.length > 0) {
72
+ throw new ProjectDefaultsError(`${waar} kent ${onbekend.map((key) => `"${key}"`).join(', ')} niet. Toegestaan zijn ${KEYS.join(', ')}.`);
73
+ }
74
+ const result = {};
75
+ if (obj['memoryLimit'] !== undefined) {
76
+ const limit = obj['memoryLimit'];
77
+ if (typeof limit !== 'string' || !isValidMemoryLimit(limit.trim())) {
78
+ throw new ProjectDefaultsError(`${waar} heeft memoryLimit ${JSON.stringify(limit)}, en die vorm accepteert PHPStan niet. ` +
79
+ 'Gebruik een getal met optioneel K, M of G (bijv. "1G"), of -1 voor geen limiet.');
80
+ }
81
+ result.memoryLimit = limit.trim();
82
+ }
83
+ if (obj['timeoutSeconds'] !== undefined) {
84
+ const seconds = obj['timeoutSeconds'];
85
+ if (typeof seconds !== 'number' || !Number.isInteger(seconds) || seconds < 1 || seconds > MAX_TIMEOUT_SECONDS) {
86
+ throw new ProjectDefaultsError(`${waar} heeft timeoutSeconds ${JSON.stringify(seconds)}; verwacht een geheel getal ` +
87
+ `van 1 tot en met ${String(MAX_TIMEOUT_SECONDS)}.`);
88
+ }
89
+ result.timeoutSeconds = seconds;
90
+ }
91
+ if (obj['config'] !== undefined) {
92
+ const config = obj['config'];
93
+ if (typeof config !== 'string' || config.trim() === '') {
94
+ throw new ProjectDefaultsError(`${waar} heeft een lege of onbruikbare config; verwacht een pad binnen het project.`);
95
+ }
96
+ result.config = config.trim();
97
+ }
98
+ return result;
99
+ }
100
+ //# sourceMappingURL=defaults.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"defaults.js","sourceRoot":"","sources":["../src/defaults.ts"],"names":[],"mappings":"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"}
package/dist/failure.d.ts CHANGED
@@ -12,7 +12,7 @@
12
12
  * lijst uit met beleid, niet met vrije tekst — een code die maar één keer voorkomt
13
13
  * helpt niemand.
14
14
  */
15
- export type FailureReason = 'no_roots_configured' | 'project_outside_roots' | 'project_not_found' | 'path_outside_project' | 'path_not_found' | 'phpstan_missing' | 'config_missing' | 'bootstrap_failed' | 'baseline_unreadable' | 'invalid_setting' | 'memory_limit' | 'timeout' | 'cancelled' | 'git_missing' | 'not_a_git_repository' | 'unknown_base' | 'unusable_output' | 'phpstan_failed';
15
+ export type FailureReason = 'no_roots_configured' | 'project_outside_roots' | 'project_not_found' | 'path_outside_project' | 'path_not_found' | 'phpstan_missing' | 'config_missing' | 'bootstrap_failed' | 'baseline_unreadable' | 'invalid_setting' | 'memory_limit' | 'timeout' | 'cancelled' | 'git_missing' | 'not_a_git_repository' | 'unknown_base' | 'unsupported_with_runner' | 'unusable_output' | 'phpstan_failed';
16
16
  /** Wat er naast de reden bekend is. Alles optioneel: niet elke fout weet dit. */
17
17
  export interface FailureDetails {
18
18
  /** Exit code van het proces, als er een proces was. */
@@ -1 +1 @@
1
- {"version":3,"file":"failure.js","sourceRoot":"","sources":["../src/failure.ts"],"names":[],"mappings":"AAkDA;;;;;GAKG;AACH,MAAM,OAAO,WAAY,SAAQ,KAAK;IAGzB;IACA;IAHX,YACE,OAAe,EACN,MAAqB,EACrB,UAA0B,EAAE;QAErC,KAAK,CAAC,OAAO,CAAC,CAAC;QAHN,WAAM,GAAN,MAAM,CAAe;QACrB,YAAO,GAAP,OAAO,CAAqB;IAGvC,CAAC;CACF"}
1
+ {"version":3,"file":"failure.js","sourceRoot":"","sources":["../src/failure.ts"],"names":[],"mappings":"AAqDA;;;;;GAKG;AACH,MAAM,OAAO,WAAY,SAAQ,KAAK;IAGzB;IACA;IAHX,YACE,OAAe,EACN,MAAqB,EACrB,UAA0B,EAAE;QAErC,KAAK,CAAC,OAAO,CAAC,CAAC;QAHN,WAAM,GAAN,MAAM,CAAe;QACrB,YAAO,GAAP,OAAO,CAAqB;IAGvC,CAAC;CACF"}