phpstan-mcp-mx 0.10.0 → 0.11.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.
package/CHANGELOG.md CHANGED
@@ -4,6 +4,27 @@ 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.11.0](https://codeberg.org/MartijnSchimmel/phpstan-mcp-mx/compare/v0.10.1...v0.11.0) (2026-09-10)
8
+
9
+
10
+ ### Bug Fixes
11
+
12
+ * ontdubbel de kopieën die parallelle workers achterlaten ([6419583](https://codeberg.org/MartijnSchimmel/phpstan-mcp-mx/commit/6419583dfdc8fd4acc337871c47a2ea604ff0263))
13
+
14
+
15
+ ### Features
16
+
17
+ * geef elke mislukking een reden uit een gesloten verzameling ([b3ef4c7](https://codeberg.org/MartijnSchimmel/phpstan-mcp-mx/commit/b3ef4c736dda2ecc86c822f64881ccf3f4627871))
18
+ * houd PHPStans aanwijzingen apart van de waarschuwingen ([eb34805](https://codeberg.org/MartijnSchimmel/phpstan-mcp-mx/commit/eb3480596c5f89276a2563f7b5f26058f2442471))
19
+ * laat PHPStan per project in een eigen omgeving draaien ([2afaa98](https://codeberg.org/MartijnSchimmel/phpstan-mcp-mx/commit/2afaa98b9d13cfe969a08252fd54621526c1b530))
20
+
21
+ ## [0.10.1](https://codeberg.org/MartijnSchimmel/phpstan-mcp-mx/compare/v0.10.0...v0.10.1) (2026-09-10)
22
+
23
+
24
+ ### Bug Fixes
25
+
26
+ * bewaar de oorzaak van een fout, en meld "geen baseline" als uitkomst ([12da44c](https://codeberg.org/MartijnSchimmel/phpstan-mcp-mx/commit/12da44c574087de02db17b19c1805654e1cc607d))
27
+
7
28
  # [0.10.0](https://codeberg.org/MartijnSchimmel/phpstan-mcp-mx/compare/v0.9.0...v0.10.0) (2026-09-10)
8
29
 
9
30
 
package/README.md CHANGED
@@ -236,6 +236,36 @@ Kies `shared` als je wil dat de server dezelfde cache gebruikt als je terminal,
236
236
  zetten van `TMPDIR` iets in je project stoort — bij Larastan draait er een hele
237
237
  Laravel-applicatie in hetzelfde proces mee.
238
238
 
239
+ ### `PHPSTAN_MCP_RUNNERS` (optioneel)
240
+
241
+ Sommige projecten zijn op de host niet te analyseren. Larastan start je Laravel-applicatie
242
+ écht op, en mist de host bijvoorbeeld `ext-redis`, dan klapt de bootstrap en stopt de analyse
243
+ — terwijl dezelfde repo in zijn container probleemloos doorloopt.
244
+
245
+ Met deze variabele zeg je per project waar PHPStan gedraaid moet worden:
246
+
247
+ ```json
248
+ {
249
+ "/Users/jij/projecten/admin": {
250
+ "command": ["docker", "exec", "-w", "/var/www/html", "admin-app"],
251
+ "workdir": "/var/www/html"
252
+ }
253
+ }
254
+ ```
255
+
256
+ `command` is het commando dat ervóór komt; `workdir` is het pad waarop diezelfde projectmap
257
+ in die omgeving staat. Dat tweede is geen detail: paden die je meegeeft worden ernaartoe
258
+ vertaald, en de bestandspaden in het antwoord komen terug als host-paden — anders krijg je
259
+ `/var/www/html/app/User.php` terug en kun je dat bestand niet openen.
260
+
261
+ `list_projects` vermeldt per project welke omgeving geldt, en met een runner hoeft er op de
262
+ host geen `vendor/bin/phpstan` te staan.
263
+
264
+ **Het commando komt uit de serverconfiguratie, nooit uit een tool-aanroep.** Net als de roots
265
+ is dit iets wat een mens één keer vastlegt: een model kiest alleen een project, en of daar
266
+ een omgeving bij hoort ligt dan al vast. Zou een aanroeper het commando mogen meegeven, dan
267
+ bepaalt die wat er uitgevoerd wordt en is de whitelist zinloos.
268
+
239
269
  ### Waarom die lijst verplicht is
240
270
 
241
271
  PHPStan is geen passieve parser. Het laadt de autoloader van het project, voert
@@ -434,6 +464,32 @@ includes:
434
464
  - phpstan-baseline.neon
435
465
  ```
436
466
 
467
+ ## Als een tool mislukt
468
+
469
+ Een mislukte aanroep geeft twee blokken terug: de melding in gewone taal, en een JSON-blok
470
+ met velden waarop je kunt sturen.
471
+
472
+ ```json
473
+ {
474
+ "ok": false,
475
+ "reason": "bootstrap_failed",
476
+ "exitCode": 1,
477
+ "cause": "Class \"Redis\" not found",
478
+ "causeOrigin": "vendor/laravel/framework/…/PhpRedisConnector.php(34)",
479
+ "hint": "Draai diagnose_project op dit project: …"
480
+ }
481
+ ```
482
+
483
+ `reason` komt uit een gesloten verzameling, zodat je erop kunt matchen zonder de tekst te
484
+ lezen: `no_roots_configured`, `project_outside_roots`, `project_not_found`,
485
+ `path_outside_project`, `path_not_found`, `phpstan_missing`, `config_missing`,
486
+ `bootstrap_failed`, `baseline_unreadable`, `invalid_setting`, `memory_limit`, `timeout`,
487
+ `cancelled`, `git_missing`, `not_a_git_repository`, `unknown_base`, `unusable_output` en
488
+ `phpstan_failed`.
489
+
490
+ De velden staan bewust in `content` en niet in `structuredContent`: dat laatste wordt door
491
+ MCP-clients gevalideerd tegen het schema van het *geslaagde* antwoord.
492
+
437
493
  ## Wat je terugkrijgt
438
494
 
439
495
  Een analyse levert eerst tellingen over álle bevindingen en daarna één pagina met de
@@ -489,6 +545,18 @@ Dat is het verschil tussen "geen bevindingen" en "geen bevindingen, plus duizend
489
545
  gemeld worden". De check kijkt of je config het bestand echt includeert — een baseline die
490
546
  naast `phpstan.neon` ligt zonder erin te staan, doet niets.
491
547
 
548
+ PHPStans eigen aanwijzingen bij het lezen van bevindingen staan apart in `instructions` en
549
+ worden onder het rapport getoond:
550
+
551
+ ```
552
+ PHPStan zegt hierbij:
553
+ Do not add `@phpstan-ignore` comments … to suppress the error.
554
+ Do not add type casts just to silence errors.
555
+ ```
556
+
557
+ Dat blok is elke run hetzelfde en zegt niets over déze analyse, dus het telt niet mee als
558
+ waarschuwing — en het wordt niet afgekapt, want een half blok aanwijzingen helpt niemand.
559
+
492
560
  Het `warnings`-veld staat los van `generalErrors`: dat tweede is PHPStans eigen
493
561
  `errors`-array uit de JSON. Beide lijsten zijn begrensd op tien meldingen van elk hoogstens
494
562
  1000 tekens — een mislukte Laravel-bootstrap levert anders een lap tekst op die het hele
@@ -1,3 +1,5 @@
1
+ import type { FailureDetails, FailureReason } from './failure.js';
2
+ import { ToolFailure } from './failure.js';
1
3
  import type { ResolvedProject } from './project.js';
2
4
  /** Eén genegeerde fout uit een baseline-bestand. */
3
5
  export interface BaselineEntry {
@@ -9,6 +11,8 @@ export interface BaselineEntry {
9
11
  /** Wat er in de baselines van één project staat. */
10
12
  export interface BaselineSummary {
11
13
  readonly project: string;
14
+ /** Of er überhaupt een baseline ligt. Zo niet, dan is alles hieronder nul. */
15
+ readonly hasBaseline: boolean;
12
16
  /** De gevonden baseline-bestanden, met per bestand de aantallen. */
13
17
  readonly files: readonly {
14
18
  file: string;
@@ -29,7 +33,8 @@ export interface BaselineSummary {
29
33
  }[];
30
34
  }
31
35
  /** Fout die als bruikbare melding naar het model teruggaat, niet als crash. */
32
- export declare class BaselineError extends Error {
36
+ export declare class BaselineError extends ToolFailure {
37
+ constructor(message: string, reason?: FailureReason, details?: FailureDetails);
33
38
  }
34
39
  /**
35
40
  * Zoekt de baseline-bestanden in de projectroot. Alleen daar en niet dieper: een
package/dist/baseline.js CHANGED
@@ -1,9 +1,13 @@
1
+ import { ToolFailure } from './failure.js';
1
2
  import { readFileSync, readdirSync } from 'node:fs';
2
3
  import { join } from 'node:path';
3
4
  /** Hoeveel regels de samenvattingslijsten hoogstens tonen. */
4
5
  const SUMMARY_ROWS = 15;
5
6
  /** Fout die als bruikbare melding naar het model teruggaat, niet als crash. */
6
- export class BaselineError extends Error {
7
+ export class BaselineError extends ToolFailure {
8
+ constructor(message, reason = 'baseline_unreadable', details = {}) {
9
+ super(message, reason, details);
10
+ }
7
11
  }
8
12
  /**
9
13
  * Zoekt de baseline-bestanden in de projectroot. Alleen daar en niet dieper: een
@@ -120,8 +124,19 @@ export function parseBaseline(content) {
120
124
  /** Telt de baselines van één project bij elkaar op. */
121
125
  export function summariseBaseline(project) {
122
126
  const files = findBaselineFiles(project);
127
+ // Geen baseline is een normale, gezonde toestand: het antwoord op "wat wordt hier
128
+ // genegeerd" is dan nul, niet "de tool is mislukt". Een errorpad dwingt de
129
+ // aanroeper anders om een storing af te handelen om een geslaagd resultaat te
130
+ // lezen — en maakt dit niet te onderscheiden van een écht kapotte baseline.
123
131
  if (files.length === 0) {
124
- throw new BaselineError(`${project.path} heeft geen baseline (geen phpstan-baseline*.neon in de projectmap).`);
132
+ return {
133
+ project: project.path,
134
+ hasBaseline: false,
135
+ files: [],
136
+ totals: { entries: 0, errors: 0 },
137
+ byIdentifier: [],
138
+ byPath: [],
139
+ };
125
140
  }
126
141
  const perFile = [];
127
142
  const all = [];
@@ -143,6 +158,7 @@ export function summariseBaseline(project) {
143
158
  }
144
159
  return {
145
160
  project: project.path,
161
+ hasBaseline: true,
146
162
  files: perFile,
147
163
  totals: {
148
164
  entries: all.length,
@@ -158,6 +174,11 @@ export function summariseBaseline(project) {
158
174
  /** Schrijft een baseline-samenvatting uit als tekst voor het model. */
159
175
  export function renderBaseline(summary) {
160
176
  const lines = [];
177
+ if (!summary.hasBaseline) {
178
+ // Geen storing, maar een uitkomst: er wordt hier niets genegeerd.
179
+ lines.push('Dit project heeft geen baseline; er wordt dus niets verzwegen door PHPStan.');
180
+ return lines.join('\n');
181
+ }
161
182
  if (summary.totals.entries === 0) {
162
183
  lines.push('De baseline is leeg.');
163
184
  return lines.join('\n');
@@ -1 +1 @@
1
- {"version":3,"file":"baseline.js","sourceRoot":"","sources":["../src/baseline.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"baseline.js","sourceRoot":"","sources":["../src/baseline.ts"],"names":[],"mappings":"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"}
package/dist/changed.d.ts CHANGED
@@ -1,6 +1,9 @@
1
+ import type { FailureDetails, FailureReason } from './failure.js';
2
+ import { ToolFailure } from './failure.js';
1
3
  import type { ResolvedProject } from './project.js';
2
4
  /** Fout die als bruikbare melding naar het model teruggaat, niet als crash. */
3
- export declare class GitError extends Error {
5
+ export declare class GitError extends ToolFailure {
6
+ constructor(message: string, reason?: FailureReason, details?: FailureDetails);
4
7
  }
5
8
  /** Waartegen standaard vergeleken wordt: de laatste commit van deze werkboom. */
6
9
  export declare const DEFAULT_BASE = "HEAD";
package/dist/changed.js CHANGED
@@ -1,7 +1,11 @@
1
+ import { ToolFailure } from './failure.js';
1
2
  import { spawn } from 'node:child_process';
2
3
  import { ProjectError, resolveWithin } from './project.js';
3
4
  /** Fout die als bruikbare melding naar het model teruggaat, niet als crash. */
4
- export class GitError extends Error {
5
+ export class GitError extends ToolFailure {
6
+ constructor(message, reason = 'git_missing', details = {}) {
7
+ super(message, reason, details);
8
+ }
5
9
  }
6
10
  /** Waartegen standaard vergeleken wordt: de laatste commit van deze werkboom. */
7
11
  export const DEFAULT_BASE = 'HEAD';
@@ -103,10 +107,16 @@ async function git(cwd, args) {
103
107
  if (spawnError !== null) {
104
108
  throw new GitError(spawnError.code === 'ENOENT'
105
109
  ? 'git is niet gevonden. Geef paths mee aan analyse_project om zonder git te werken.'
106
- : `git kon niet gestart worden in ${cwd}: ${spawnError.message}`);
110
+ : `git kon niet gestart worden in ${cwd}: ${spawnError.message}`, 'git_missing');
107
111
  }
108
112
  if (code !== 0) {
109
- throw new GitError(describeGitFailure(cwd, args, stderr, code));
113
+ const details = stderr.trim();
114
+ const reden = /not a git repository/i.test(details)
115
+ ? 'not_a_git_repository'
116
+ : /unknown revision|bad revision|ambiguous argument/i.test(details)
117
+ ? 'unknown_base'
118
+ : 'git_missing';
119
+ throw new GitError(describeGitFailure(cwd, args, stderr, code), reden, { exitCode: code });
110
120
  }
111
121
  return stdout;
112
122
  }
@@ -1 +1 @@
1
- {"version":3,"file":"changed.js","sourceRoot":"","sources":["../src/changed.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"changed.js","sourceRoot":"","sources":["../src/changed.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Waarom een tool-aanroep mislukt is, als **gesloten** verzameling.
3
+ *
4
+ * Het faalpad gaf tot nu toe alleen proza: één Nederlandse zin plus een blob ruwe
5
+ * tekst. Een aanroeper kon daaruit niet aflezen wát voor soort mislukking het was —
6
+ * ligt het aan het project, aan deze server, of aan de aanroep zelf — en moest dus
7
+ * op woorden gaan matchen.
8
+ *
9
+ * Met een code uit deze lijst kan een aanroeper zelf herstellen: bij
10
+ * `bootstrap_failed` uitwijken naar een omgeving waar de applicatie wél start, bij
11
+ * `config_missing` om paden vragen, bij `timeout` opnieuw met meer tijd. Breid deze
12
+ * lijst uit met beleid, niet met vrije tekst — een code die maar één keer voorkomt
13
+ * helpt niemand.
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';
16
+ /** Wat er naast de reden bekend is. Alles optioneel: niet elke fout weet dit. */
17
+ export interface FailureDetails {
18
+ /** Exit code van het proces, als er een proces was. */
19
+ readonly exitCode?: number | null;
20
+ /** De regel die de oorzaak noemt, bijvoorbeeld `Class "Redis" not found`. */
21
+ readonly cause?: string;
22
+ /** Waar die oorzaak vandaan komt: het eerste frame van de stack trace. */
23
+ readonly causeOrigin?: string;
24
+ /** Wat de aanroeper hierna kan doen, in gewone taal. */
25
+ readonly hint?: string;
26
+ }
27
+ /**
28
+ * Basis voor elke fout die als tool-resultaat teruggaat in plaats van als crash.
29
+ *
30
+ * De subklassen blijven bestaan omdat ze op verschillende plekken gegooid worden en
31
+ * `instanceof` in de tests leesbaar houdt; de reden en de details zitten hier.
32
+ */
33
+ export declare class ToolFailure extends Error {
34
+ readonly reason: FailureReason;
35
+ readonly details: FailureDetails;
36
+ constructor(message: string, reason: FailureReason, details?: FailureDetails);
37
+ }
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Basis voor elke fout die als tool-resultaat teruggaat in plaats van als crash.
3
+ *
4
+ * De subklassen blijven bestaan omdat ze op verschillende plekken gegooid worden en
5
+ * `instanceof` in de tests leesbaar houdt; de reden en de details zitten hier.
6
+ */
7
+ export class ToolFailure extends Error {
8
+ reason;
9
+ details;
10
+ constructor(message, reason, details = {}) {
11
+ super(message);
12
+ this.reason = reason;
13
+ this.details = details;
14
+ }
15
+ }
16
+ //# sourceMappingURL=failure.js.map
@@ -0,0 +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,8 +1,11 @@
1
+ import type { FailureDetails, FailureReason } from '../failure.js';
2
+ import { ToolFailure } from '../failure.js';
1
3
  /**
2
4
  * Fout die als bruikbare melding naar het model teruggaat, niet als crash.
3
5
  *
4
6
  * Staat in een eigen module omdat zowel phpstan.ts als de queue hem gooit, en
5
7
  * queue.ts importeren vanuit phpstan.ts zou een cyclus zijn.
6
8
  */
7
- export declare class PhpstanError extends Error {
9
+ export declare class PhpstanError extends ToolFailure {
10
+ constructor(message: string, reason?: FailureReason, details?: FailureDetails);
8
11
  }
@@ -1,9 +1,13 @@
1
+ import { ToolFailure } from '../failure.js';
1
2
  /**
2
3
  * Fout die als bruikbare melding naar het model teruggaat, niet als crash.
3
4
  *
4
5
  * Staat in een eigen module omdat zowel phpstan.ts als de queue hem gooit, en
5
6
  * queue.ts importeren vanuit phpstan.ts zou een cyclus zijn.
6
7
  */
7
- export class PhpstanError extends Error {
8
+ export class PhpstanError extends ToolFailure {
9
+ constructor(message, reason = 'phpstan_failed', details = {}) {
10
+ super(message, reason, details);
11
+ }
8
12
  }
9
13
  //# sourceMappingURL=error.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"error.js","sourceRoot":"","sources":["../../src/phpstan/error.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,OAAO,YAAa,SAAQ,KAAK;CAAG"}
1
+ {"version":3,"file":"error.js","sourceRoot":"","sources":["../../src/phpstan/error.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C;;;;;GAKG;AACH,MAAM,OAAO,YAAa,SAAQ,WAAW;IAC3C,YAAY,OAAe,EAAE,SAAwB,gBAAgB,EAAE,UAA0B,EAAE;QACjG,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,CAAC;CACF"}
@@ -21,15 +21,24 @@ type PhpstanOutput = z.infer<typeof outputSchema>;
21
21
  * associatieve array nu eenmaal als JSON-array.
22
22
  */
23
23
  export declare function tryParse(stdout: string): PhpstanOutput | null;
24
+ /** Wat er op stderr stond, uit elkaar getrokken naar wat het is. */
25
+ export interface StderrInhoud {
26
+ /** Meldingen over de run zelf, zoals "Result is incomplete". */
27
+ readonly warnings: string[];
28
+ /** PHPStans vaste aanwijzingen bij het lezen van de bevindingen. */
29
+ readonly instructions: string[];
30
+ }
24
31
  /**
25
32
  * Haalt uit stderr wat het model moet weten bij een gelúkte analyse. Dit werd eerder
26
33
  * helemaal weggegooid zodra de JSON parseerde — en juist daar staat PHPStans
27
34
  * "Result is incomplete because of severe errors.": geldige JSON die het project niet
28
35
  * volledig dekt. Zonder deze regels leest een model een schone uitslag die dat niet is.
36
+ *
37
+ * Het instructieblok wordt apart gehouden: dat zegt niets over déze run.
29
38
  */
30
- export declare function collectWarnings(stderr: string): string[];
39
+ export declare function collectWarnings(stderr: string): StderrInhoud;
31
40
  /** Zet PHPStans uitvoer om in het interne resultaat, met de waarschuwingen erbij. */
32
- export declare function toResult(project: string, output: PhpstanOutput, warnings: readonly string[]): AnalysisResult;
41
+ export declare function toResult(project: string, output: PhpstanOutput, stderr: StderrInhoud): AnalysisResult;
33
42
  /** Eén bevinding van PHPStan, gekoppeld aan een bestand. */
34
43
  export interface Finding {
35
44
  /** Absoluut pad zoals PHPStan het rapporteert. */
@@ -49,9 +58,25 @@ export interface AnalysisResult {
49
58
  readonly generalErrors: readonly string[];
50
59
  /** Wat PHPStan naast de JSON op stderr zei; leeg als er niets bijzonders was. */
51
60
  readonly warnings: readonly string[];
61
+ /** PHPStans vaste aanwijzingen bij het lezen van bevindingen. */
62
+ readonly instructions: readonly string[];
52
63
  readonly totals: {
53
64
  readonly fileErrors: number;
54
65
  readonly generalErrors: number;
55
66
  };
56
67
  }
68
+ /** Hoeveel tekens een foutdetail hoogstens beslaat. */
69
+ export declare const MAX_DETAIL_CHARS = 2000;
70
+ /**
71
+ * Kort een foutmelding in zonder de bruikbare helft weg te gooien.
72
+ *
73
+ * Een simpele `slice(0, N)` knipt bij een mislukte bootstrap precies het antwoord
74
+ * weg: waargenomen eindigde de uitvoer op "- Verify service p", midden in een woord,
75
+ * terwijl `Class "Redis" not found` er net achter stond.
76
+ *
77
+ * Daarom in deze volgorde: eerst de generieke tips eruit, dan de oorzaakregel
78
+ * opzoeken en dáár de ruimte aan geven, en de context ervoor met wat er overblijft.
79
+ * Wat wegvalt wordt geteld en gemeld, en er wordt altijd op een regelgrens geknipt.
80
+ */
81
+ export declare function condenseDetails(text: string, max?: number): string;
57
82
  export {};
@@ -39,20 +39,38 @@ export function tryParse(stdout) {
39
39
  * niet kennen, en die stil laten vallen is precies de fout die dit moet voorkomen.
40
40
  */
41
41
  const HARMLESS_STDERR = [/^Note: /];
42
+ /**
43
+ * PHPStan zet bij een analyse een blok aanwijzingen op stderr: hoe je een
44
+ * error-identifier opzoekt, en dat je fouten bij de bron hoort te repareren in
45
+ * plaats van ze met `@phpstan-ignore` of een baseline weg te drukken.
46
+ *
47
+ * Dat is geen waarschuwing maar begeleiding, en het is elke run dezelfde tekst.
48
+ * Het werd hiervoor als waarschuwing geteld, waarna de limiet van tien meldingen
49
+ * het middenin afkapte — dertien regels, drie "weggelaten", en dus een half signaal
50
+ * waar niemand iets mee kon.
51
+ */
52
+ const INSTRUCTIE_KOP = /^Instructions for interpreting errors/i;
42
53
  /**
43
54
  * Haalt uit stderr wat het model moet weten bij een gelúkte analyse. Dit werd eerder
44
55
  * helemaal weggegooid zodra de JSON parseerde — en juist daar staat PHPStans
45
56
  * "Result is incomplete because of severe errors.": geldige JSON die het project niet
46
57
  * volledig dekt. Zonder deze regels leest een model een schone uitslag die dat niet is.
58
+ *
59
+ * Het instructieblok wordt apart gehouden: dat zegt niets over déze run.
47
60
  */
48
61
  export function collectWarnings(stderr) {
49
- return stderr
50
- .split('\n')
51
- .map((line) => line.trim())
52
- .filter((line) => line !== '' && !HARMLESS_STDERR.some((pattern) => pattern.test(line)));
62
+ const regels = stderr.split('\n').map((regel) => regel.trim());
63
+ const kop = regels.findIndex((regel) => INSTRUCTIE_KOP.test(regel));
64
+ const bruikbaar = (deel) => deel.filter((regel) => regel !== '' && !HARMLESS_STDERR.some((patroon) => patroon.test(regel)));
65
+ if (kop === -1)
66
+ return { warnings: bruikbaar(regels), instructions: [] };
67
+ return {
68
+ warnings: bruikbaar(regels.slice(0, kop)),
69
+ instructions: bruikbaar(regels.slice(kop)),
70
+ };
53
71
  }
54
72
  /** Zet PHPStans uitvoer om in het interne resultaat, met de waarschuwingen erbij. */
55
- export function toResult(project, output, warnings) {
73
+ export function toResult(project, output, stderr) {
56
74
  const findings = [];
57
75
  for (const [file, entry] of Object.entries(output.files)) {
58
76
  for (const message of entry.messages) {
@@ -69,8 +87,133 @@ export function toResult(project, output, warnings) {
69
87
  project,
70
88
  findings,
71
89
  generalErrors: output.errors,
72
- warnings,
90
+ warnings: stderr.warnings,
91
+ instructions: stderr.instructions,
73
92
  totals: { fileErrors: output.totals.file_errors, generalErrors: output.totals.errors },
74
93
  };
75
94
  }
95
+ /** Hoeveel tekens een foutdetail hoogstens beslaat. */
96
+ export const MAX_DETAIL_CHARS = 2000;
97
+ /**
98
+ * PHPStans generieke tips bij een mislukte bootstrap. Die staan vóór de regel die
99
+ * er wél toe doet, dus ze gaan er als eerste uit.
100
+ */
101
+ const TIPS_KOP = /^\s*Tip: Try the following/i;
102
+ /**
103
+ * De regel waar de oorzaak staat. PHPStan zet die ná zijn generieke tips neer, en
104
+ * de stack trace erachter loopt van de oorzaak naar de opstartcode — dus vanaf hier
105
+ * is de *kop* het antwoord en de staart plumbing.
106
+ */
107
+ const OORZAAK = /^\s*(Error|Fatal error|PHP Fatal error):/i;
108
+ /**
109
+ * Kort een foutmelding in zonder de bruikbare helft weg te gooien.
110
+ *
111
+ * Een simpele `slice(0, N)` knipt bij een mislukte bootstrap precies het antwoord
112
+ * weg: waargenomen eindigde de uitvoer op "- Verify service p", midden in een woord,
113
+ * terwijl `Class "Redis" not found` er net achter stond.
114
+ *
115
+ * Daarom in deze volgorde: eerst de generieke tips eruit, dan de oorzaakregel
116
+ * opzoeken en dáár de ruimte aan geven, en de context ervoor met wat er overblijft.
117
+ * Wat wegvalt wordt geteld en gemeld, en er wordt altijd op een regelgrens geknipt.
118
+ */
119
+ export function condenseDetails(text, max = MAX_DETAIL_CHARS) {
120
+ const ontdubbeld = dedupeWorkers(text.trim().split('\n'));
121
+ const body = beknopt(dropTips(ontdubbeld.regels), max);
122
+ return ontdubbeld.weg === 0
123
+ ? body
124
+ : `${body}\n\n… (${String(ontdubbeld.weg)} identieke regel(s) van parallelle workers weggelaten) …`;
125
+ }
126
+ /**
127
+ * PHPStan forkt workers die élk het bootstrap-bestand uitvoeren. Klapt dat, dan
128
+ * schrijft iedere worker dezelfde melding naar dezelfde pipe, en komt het vermengd
129
+ * binnen: regels uit verschillende kopieën door elkaar, buiten volgorde.
130
+ *
131
+ * Gemeten op een echt project: vier kopieën van dezelfde fout, 246 regels stderr.
132
+ * Dedupliceren gebeurt op de regel zónder naspaties — PHPStan omkadert zijn eerste
133
+ * regel met opvulling, waardoor twee kopieën anders niet identiek lijken.
134
+ *
135
+ * Verschilt de fout per worker, dan blijven die regels allebei staan: alleen exacte
136
+ * herhalingen vallen weg, in de volgorde waarin ze het eerst voorkwamen.
137
+ */
138
+ function dedupeWorkers(regels) {
139
+ const gezien = new Set();
140
+ const uit = [];
141
+ let weg = 0;
142
+ for (const regel of regels) {
143
+ // De sleutel negeert witruimte aan béíde kanten: PHPStan omkadert regels met
144
+ // opvulling, en de buitenste trim van de hele tekst haalt die alleen bij de
145
+ // eerste regel weg. Wat er blijft staan houdt zijn eigen inspringing.
146
+ const sleutel = regel.trim();
147
+ // Lege regels dragen geen inhoud; opeenvolgende blanks worden er één.
148
+ if (sleutel === '') {
149
+ if (uit.length > 0 && uit[uit.length - 1] !== '')
150
+ uit.push('');
151
+ continue;
152
+ }
153
+ if (gezien.has(sleutel)) {
154
+ weg += 1;
155
+ continue;
156
+ }
157
+ gezien.add(sleutel);
158
+ uit.push(regel.trimEnd());
159
+ }
160
+ return { regels: uit, weg };
161
+ }
162
+ /** Kort een al ontdubbelde lijst in tot `max` tekens. */
163
+ function beknopt(regels, max) {
164
+ const samen = regels.join('\n');
165
+ if (samen.length <= max)
166
+ return samen;
167
+ const anker = regels.findIndex((regel) => OORZAAK.test(regel));
168
+ if (anker === -1) {
169
+ // Geen herkenbare oorzaak: dan is de kop het beste wat er is.
170
+ const kop = neemTot(regels, max - MARKERING_RUIMTE);
171
+ return [...kop, weggelaten(regels.length - kop.length)].join('\n');
172
+ }
173
+ // De oorzaak plus de frames eronder krijgen het leeuwendeel; de laatste frames
174
+ // zijn de console-plumbing van PHPStan zelf en missen niemand.
175
+ const kern = neemTot(regels.slice(anker), Math.floor(max * 0.8));
176
+ const rest = max - kern.join('\n').length - MARKERING_RUIMTE * 2;
177
+ const context = neemTot([...regels.slice(0, anker)].reverse(), Math.max(rest, 0)).reverse();
178
+ return [
179
+ ...(anker > context.length ? [weggelaten(anker - context.length)] : []),
180
+ ...context,
181
+ ...kern,
182
+ ...(regels.length - anker > kern.length ? [weggelaten(regels.length - anker - kern.length)] : []),
183
+ ].join('\n');
184
+ }
185
+ /** Ruimte die de markering zelf inneemt, zodat het budget klopt. */
186
+ const MARKERING_RUIMTE = 40;
187
+ function weggelaten(aantal) {
188
+ return `… (${String(aantal)} regel(s) weggelaten) …`;
189
+ }
190
+ /** Laat het tips-blok weg: de kopregel plus de opsomming die eronder hangt. */
191
+ function dropTips(regels) {
192
+ const uit = [];
193
+ let inTips = false;
194
+ for (const regel of regels) {
195
+ if (TIPS_KOP.test(regel)) {
196
+ inTips = true;
197
+ continue;
198
+ }
199
+ // De opsomming eindigt bij de eerste regel die geen streepje of leegte is.
200
+ if (inTips && (regel.trim() === '' || regel.trim().startsWith('-')))
201
+ continue;
202
+ inTips = false;
203
+ uit.push(regel);
204
+ }
205
+ return uit;
206
+ }
207
+ /** Zoveel regels als er binnen `budget` tekens passen. */
208
+ function neemTot(regels, budget) {
209
+ const uit = [];
210
+ let gebruikt = 0;
211
+ for (const regel of regels) {
212
+ if (gebruikt + regel.length + 1 > budget)
213
+ break;
214
+ uit.push(regel);
215
+ gebruikt += regel.length + 1;
216
+ }
217
+ return uit;
218
+ }
76
219
  //# sourceMappingURL=output.js.map