phpstan-mcp-mx 0.1.0 → 0.2.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/README.md CHANGED
@@ -5,37 +5,177 @@ bedient meerdere PHP-projecten tegelijk; welke dat zijn, leg je zelf vast.
5
5
 
6
6
  ## Installatie
7
7
 
8
+ De server draait als los proces dat je MCP-client opstart. Installeer hem één keer globaal
9
+ en meld hem daarna aan bij de client die je gebruikt — Claude Code en Claude Desktop houden
10
+ elk hun eigen lijst bij, dus voor allebei doe je dat apart.
11
+
12
+ ```bash
13
+ npm install -g phpstan-mcp-mx
14
+ ```
15
+
16
+ Vervang hieronder overal `/pad/naar/projecten` door de map waar je PHP-projecten in staan.
17
+ Die is verplicht; zie [Configuratie](#configuratie) voor waarom.
18
+
19
+ ### Claude Code
20
+
21
+ Met `--scope user` is de server in al je projecten beschikbaar — wat je wilt bij één server
22
+ die meerdere projecten bedient.
23
+
24
+ ```bash
25
+ claude mcp add phpstan --scope user \
26
+ --env PHPSTAN_MCP_ROOTS=/pad/naar/projecten \
27
+ -- phpstan-mcp-mx
28
+ ```
29
+
30
+ Zonder globale installatie kan het ook rechtstreeks van de registry; dat kost wel elke
31
+ sessiestart een npx-resolutie:
32
+
8
33
  ```bash
9
- claude mcp add phpstan \
34
+ claude mcp add phpstan --scope user \
10
35
  --env PHPSTAN_MCP_ROOTS=/pad/naar/projecten \
11
36
  -- npx -y phpstan-mcp-mx
12
37
  ```
13
38
 
14
- Of, als je de repo lokaal hebt staan:
39
+ Nagaan of het gelukt is:
15
40
 
16
41
  ```bash
17
- npm install && npm run build
18
- claude mcp add phpstan \
42
+ claude mcp get phpstan
43
+ ```
44
+
45
+ ```
46
+ phpstan:
47
+ Scope: User config (available in all your projects)
48
+ Status: ✔ Connected
49
+ Type: stdio
50
+ Command: phpstan-mcp-mx
51
+ Environment:
52
+ PHPSTAN_MCP_ROOTS=/pad/naar/projecten
53
+ ```
54
+
55
+ `claude mcp get` en `claude mcp list` verbinden echt met de server in plaats van alleen de
56
+ configuratie terug te lezen — ze melden dus of hij ook daadwerkelijk start. Binnen een
57
+ sessie doet `/mcp` hetzelfde. Vraag daarna om de projectenlijst: komt die leeg terug terwijl
58
+ de verbinding staat, dan wijzen je roots naar de verkeerde map en is er niets mis met de
59
+ server zelf.
60
+
61
+ ### Claude Desktop
62
+
63
+ Desktop leest zijn servers uit `claude_desktop_config.json`:
64
+
65
+ | besturingssysteem | pad |
66
+ | --- | --- |
67
+ | macOS | `~/Library/Application Support/Claude/claude_desktop_config.json` |
68
+ | Windows | `%APPDATA%\Claude\claude_desktop_config.json` |
69
+ | Linux | `~/.config/Claude/claude_desktop_config.json` |
70
+
71
+ Bestaat dat bestand nog niet, maak het dan zelf aan:
72
+
73
+ ```json
74
+ {
75
+ "mcpServers": {
76
+ "phpstan": {
77
+ "command": "phpstan-mcp-mx",
78
+ "env": { "PHPSTAN_MCP_ROOTS": "/pad/naar/projecten" }
79
+ }
80
+ }
81
+ }
82
+ ```
83
+
84
+ Staat er al een `mcpServers`-blok, zet `phpstan` er dan naast in plaats van het bestand te
85
+ vervangen — je overschrijft anders de servers die er al in staan.
86
+
87
+ Desktop leest dat bestand alleen bij het opstarten, en op macOS is het venster sluiten geen
88
+ afsluiten: quit de app volledig (⌘Q) en start hem opnieuw. Daarna staat `phpstan` tussen de
89
+ beschikbare tools in het gesprek.
90
+
91
+ Heb je Desktop al ingericht en wil je hetzelfde in Claude Code, dan neemt
92
+ `claude mcp add-from-claude-desktop` die servers over (alleen macOS en WSL).
93
+
94
+ Werkt het in je terminal wel maar in Desktop niet, ga dan meteen naar de volgende sectie:
95
+ een GUI-app erft je shell-profiel niet, en dat is hier veruit de meest voorkomende oorzaak.
96
+
97
+ ### Als de server niet start: PATH
98
+
99
+ Krijg je iets als `env: node: No such file or directory`, of blijft de server op "failed to
100
+ connect" staan, dan is dit vrijwel altijd de oorzaak.
101
+
102
+ Het commando `phpstan-mcp-mx` is een script dat begint met `#!/usr/bin/env node`, en `npx`
103
+ is zelf ook een commando dat gevonden moet worden. Allebei werken ze in je terminal omdat je
104
+ shell-profiel Node op `PATH` zet. Maar de MCP-server wordt gestart door een ánder programma,
105
+ en dat erft je shell-profiel niet altijd — een GUI-app op macOS krijgt vaak alleen een kale
106
+ `PATH` met `/usr/bin` en `/bin`. Node staat daar niet: Homebrew zet hem in
107
+ `/opt/homebrew/bin`, en nvm, fnm, asdf en volta ergens onder je home.
108
+
109
+ De oplossing is absolute paden gebruiken, zodat er niets meer opgezocht hoeft te worden:
110
+
111
+ ```bash
112
+ command -v node # bijv. /opt/homebrew/bin/node
113
+ npm root -g # bijv. /opt/homebrew/lib/node_modules
114
+ ```
115
+
116
+ ```bash
117
+ claude mcp add phpstan --scope user \
19
118
  --env PHPSTAN_MCP_ROOTS=/pad/naar/projecten \
20
- -- node /pad/naar/phpstan-mcp-mx/dist/index.js
119
+ -- /opt/homebrew/bin/node /opt/homebrew/lib/node_modules/phpstan-mcp-mx/dist/index.js
21
120
  ```
22
121
 
23
- Voor Claude Desktop komt hetzelfde in `claude_desktop_config.json`:
122
+ En voor Claude Desktop:
24
123
 
25
124
  ```json
26
125
  {
27
126
  "mcpServers": {
28
127
  "phpstan": {
29
- "command": "npx",
30
- "args": ["-y", "phpstan-mcp-mx"],
128
+ "command": "/opt/homebrew/bin/node",
129
+ "args": ["/opt/homebrew/lib/node_modules/phpstan-mcp-mx/dist/index.js"],
31
130
  "env": { "PHPSTAN_MCP_ROOTS": "/pad/naar/projecten" }
32
131
  }
33
132
  }
34
133
  }
35
134
  ```
36
135
 
136
+ Zelf nagaan of het aan `PATH` ligt, zonder de MCP-client erbij te halen. Het binary wordt
137
+ eerst in je eigen shell opgezocht en daarna met een kale `PATH` gestart — anders is het
138
+ commando zelf al onvindbaar en meet je iets anders:
139
+
140
+ ```bash
141
+ echo '' | env -i PATH=/usr/bin:/bin "$(command -v phpstan-mcp-mx)"
142
+ ```
143
+
144
+ ```
145
+ env: node: No such file or directory
146
+ ```
147
+
148
+ Komt dat eruit, dan weet je genoeg. Dezelfde test op de absolute variant hoort gewoon te
149
+ starten:
150
+
151
+ ```bash
152
+ echo '' | env -i PATH=/usr/bin:/bin \
153
+ /opt/homebrew/bin/node /opt/homebrew/lib/node_modules/phpstan-mcp-mx/dist/index.js
154
+ ```
155
+
156
+ ```
157
+ phpstan-mcp 0.1.0 luistert op stdio, 0 root(s) geconfigureerd
158
+ ```
159
+
160
+ (Nul roots klopt hier: `env -i` gooit ook `PHPSTAN_MCP_ROOTS` weg. Het gaat er alleen om dát
161
+ hij start.)
162
+
163
+ ### Vanuit de repo
164
+
165
+ ```bash
166
+ npm install && npm run build
167
+ claude mcp add phpstan --scope user \
168
+ --env PHPSTAN_MCP_ROOTS=/pad/naar/projecten \
169
+ -- node /pad/naar/phpstan-mcp-mx/dist/index.js
170
+ ```
171
+
172
+ Let op dat je dan vastzit aan die map: verplaats of verwijder je hem, dan faalt de server in
173
+ al je projecten.
174
+
37
175
  ## Configuratie
38
176
 
177
+ ### `PHPSTAN_MCP_ROOTS` (verplicht)
178
+
39
179
  `PHPSTAN_MCP_ROOTS` is verplicht: een lijst absolute paden, gescheiden door een dubbele punt
40
180
  (een puntkomma op Windows). Alles daaronder mag geanalyseerd worden, alles daarbuiten niet.
41
181
 
@@ -56,6 +196,26 @@ betekent daarmee "voer de PHP-code uit die in X's configuratie staat" — en het
56
196
  een taalmodel. De lijst met roots maakt expliciet en menselijk vastgesteld wat binnen bereik
57
197
  ligt.
58
198
 
199
+ ### `PHPSTAN_MCP_MEMORY_LIMIT` (optioneel)
200
+
201
+ Klapt PHPStan op de PHP-geheugenlimiet, dan kan een aanroep `memoryLimit` meegeven — maar
202
+ dat gebeurt pas nadat de analyse al mislukt is. Met deze variabele leg je de standaard één
203
+ keer vast, naast je roots:
204
+
205
+ ```
206
+ PHPSTAN_MCP_MEMORY_LIMIT=2G
207
+ ```
208
+
209
+ Dat wordt `--memory-limit=2G` op elke aanroep die zelf niets meegeeft; een `memoryLimit` in
210
+ de aanroep gaat vóór. Toegestaan is wat PHPStan zelf accepteert: een getal in bytes,
211
+ optioneel met `K`, `M` of `G`, of `-1` voor onbeperkt. Iets anders wordt geweigerd met een
212
+ melding in plaats van doorgegeven, want PHPStan zou er per analyse op klappen.
213
+
214
+ Dit is de enige manier om het bij de server vast te leggen. PHPStan kent er geen
215
+ `phpstan.neon`-parameter voor (`Unexpected item 'parameters › memoryLimit'`) en ook geen
216
+ eigen env-variabele; het alternatief is `memory_limit` in je `php.ini`, en dat geldt dan
217
+ voor élke PHP-CLI op je machine.
218
+
59
219
  ## Tools
60
220
 
61
221
  Elke tool verwacht een expliciet `project`-pad. De server heeft geen "huidig project": dat
@@ -75,15 +235,52 @@ tools als `project` verwachten.
75
235
  | `project` | ja | absoluut pad naar de projectroot |
76
236
  | `paths` | nee | paden binnen het project; leeg betekent: volg `phpstan.neon` |
77
237
  | `level` | nee | level-override, `0` t/m `10` of `max` |
238
+ | `config` | nee | ander configbestand, bijv. `phpstan-strict.neon`; moet binnen het project liggen |
78
239
  | `memoryLimit` | nee | bijv. `1G`, als PHPStan op de PHP-geheugenlimiet klapt |
79
240
  | `timeoutSeconds` | nee | standaard 300 |
241
+ | `identifiers` | nee | alleen deze identifiers in de pagina, bijv. `["argument.type"]` |
80
242
  | `offset` / `limit` | nee | welk deel van de bevindingen je terugkrijgt |
81
243
 
244
+ `config` gaat door dezelfde padcontrole als `project`. Dat is geen formaliteit: een `.neon`
245
+ kan `bootstrapFiles` en extensies aanwijzen, dus een vrij te kiezen configpad zou een route
246
+ zijn om willekeurige PHP-code te laten uitvoeren langs de whitelist heen.
247
+
248
+ `identifiers` filtert alleen de *pagina*; de samenvatting blijft over alles tellen, zodat
249
+ zichtbaar blijft wat je wegliet. Een waarde matcht exact (`argument.type`) of als groep
250
+ (`missingType` matcht `missingType.return` en `missingType.parameter`, maar `argument` matcht
251
+ niet `argumentx.iets`).
252
+
82
253
  ### `analyse_file`
83
254
 
84
255
  Zelfde argumenten, plus een verplichte `path` — één bestand of map binnen het project. Het
85
256
  pad mag relatief aan de projectroot zijn of absoluut, maar moet er wel binnen liggen.
86
257
 
258
+ ### `analyse_changed`
259
+
260
+ Analyseert de PHP-bestanden die volgens git gewijzigd zijn. Bedoeld om te zien of een eigen
261
+ wijziging fouten oplevert, zonder het hele project door te rekenen — en zonder dat het
262
+ antwoord volloopt met wat er al jaren stond.
263
+
264
+ | Argument | Verplicht | Betekenis |
265
+ | --- | --- | --- |
266
+ | `project` | ja | absoluut pad naar de projectroot |
267
+ | `base` | nee | commit, branch of tag om tegen te vergelijken (standaard `HEAD`) |
268
+
269
+ Verder dezelfde argumenten als `analyse_project`, op `paths` na. Met `base=main` krijg je de
270
+ hele branch in plaats van alleen je onopgeslagen werk.
271
+
272
+ Twee dingen die het meeneemt en die je makkelijk mist: **nieuwe bestanden die nog niet aan
273
+ git toegevoegd zijn** (`git diff` kent die niet, dus er is een tweede uitvraag voor) en
274
+ **niets uit `resources/views`** — een `.blade.php` eindigt op `.php`, maar is een template
275
+ die PHPStan bij een normale run nooit ziet, omdat de config die map niet in `paths` noemt.
276
+
277
+ Elk pad dat git noemt gaat door dezelfde controle als een pad dat het model zelf geeft. Wat
278
+ daar niet doorkomt — een kapotte symlink, een bestand dat buiten het project uitwijst — komt
279
+ als "overgeslagen" bij het antwoord te staan in plaats van er stil uit te vallen.
280
+
281
+ Staat het project niet onder git, dan zegt de tool dat en verwijst hij naar `analyse_project`
282
+ met expliciete `paths`.
283
+
87
284
  ### `baseline_summary`
88
285
 
89
286
  Leest de `phpstan-baseline*.neon` van een project en telt wat er genegeerd wordt, per
@@ -0,0 +1,25 @@
1
+ import type { ResolvedProject } from './project.js';
2
+ /** Fout die als bruikbare melding naar het model teruggaat, niet als crash. */
3
+ export declare class GitError extends Error {
4
+ }
5
+ /** Waartegen standaard vergeleken wordt: de laatste commit van deze werkboom. */
6
+ export declare const DEFAULT_BASE = "HEAD";
7
+ /** De gewijzigde PHP-bestanden van een project, met wat er niet bruikbaar was. */
8
+ export interface ChangedFiles {
9
+ readonly base: string;
10
+ /** Absolute paden binnen het project, alfabetisch zodat de volgorde vastligt. */
11
+ readonly files: readonly string[];
12
+ /** Paden die git noemde maar die niet te gebruiken zijn, met de reden. */
13
+ readonly skipped: readonly {
14
+ path: string;
15
+ reason: string;
16
+ }[];
17
+ }
18
+ /**
19
+ * Zoekt de PHP-bestanden die in dit project gewijzigd zijn ten opzichte van `base`.
20
+ *
21
+ * Twee uitvragen, want één dekt het niet: `diff` ziet wat er van bekende bestanden
22
+ * veranderd is, en `ls-files --others` de nieuwe bestanden die nog nergens in staan.
23
+ * Zonder die tweede mist juist het bestand dat net is aangemaakt.
24
+ */
25
+ export declare function changedPhpFiles(project: ResolvedProject, base?: string): Promise<ChangedFiles>;
@@ -0,0 +1,134 @@
1
+ import { spawn } from 'node:child_process';
2
+ import { ProjectError, resolveWithin } from './project.js';
3
+ /** Fout die als bruikbare melding naar het model teruggaat, niet als crash. */
4
+ export class GitError extends Error {
5
+ }
6
+ /** Waartegen standaard vergeleken wordt: de laatste commit van deze werkboom. */
7
+ export const DEFAULT_BASE = 'HEAD';
8
+ /**
9
+ * Hoe lang git mag doen over één uitvraag. Ruim boven wat `diff --name-only` kost,
10
+ * maar niet oneindig: op een kapotte repository kan git blijven wachten op een lock.
11
+ */
12
+ const GIT_TIMEOUT_MS = 15_000;
13
+ /**
14
+ * Zoekt de PHP-bestanden die in dit project gewijzigd zijn ten opzichte van `base`.
15
+ *
16
+ * Twee uitvragen, want één dekt het niet: `diff` ziet wat er van bekende bestanden
17
+ * veranderd is, en `ls-files --others` de nieuwe bestanden die nog nergens in staan.
18
+ * Zonder die tweede mist juist het bestand dat net is aangemaakt.
19
+ */
20
+ export async function changedPhpFiles(project, base = DEFAULT_BASE) {
21
+ // --relative: zonder dat rapporteert git paden vanaf de repositoryroot, en die
22
+ // hoeft niet de projectroot te zijn — een project kan in een monorepo liggen.
23
+ //
24
+ // --end-of-options: `base` is het enige argument dat als los argv-token uit een
25
+ // tool-aanroep komt, en `git diff` kent vlaggen die schrijven. Zonder deze grens
26
+ // maakt een base van "--output=/pad" van deze read-only server een manier om een
27
+ // bestand te laten schrijven; nagemeten, git maakt dat bestand daadwerkelijk aan.
28
+ // Dubbel dichtgezet, want de vlag bestaat pas sinds git 2.24: checkBase weigert
29
+ // zo'n waarde ook los van git.
30
+ const changed = await git(project.path, [
31
+ 'diff',
32
+ '--name-only',
33
+ '--relative',
34
+ '--diff-filter=ACMR',
35
+ '--end-of-options',
36
+ checkBase(base),
37
+ ]);
38
+ const untracked = await git(project.path, ['ls-files', '--others', '--exclude-standard']);
39
+ const candidates = [...new Set([...lines(changed), ...lines(untracked)])]
40
+ .filter(isAnalysablePhp)
41
+ .sort();
42
+ const files = [];
43
+ const skipped = [];
44
+ for (const candidate of candidates) {
45
+ try {
46
+ // Via resolveWithin en niet met een eigen join: dan geldt hier dezelfde
47
+ // realpath-en-containment-garantie als voor een pad dat het model zelf geeft.
48
+ files.push(resolveWithin(project, candidate));
49
+ }
50
+ catch (error) {
51
+ // Git kan een bestand noemen dat er inmiddels niet meer is, of dat via een
52
+ // symlink buiten het project uitkomt. Beide overslaan, maar wel benoemen:
53
+ // stil weglaten maakt een incomplete analyse niet te onderscheiden van een
54
+ // complete.
55
+ skipped.push({
56
+ path: candidate,
57
+ reason: error instanceof ProjectError ? error.message : String(error),
58
+ });
59
+ }
60
+ }
61
+ return { base, files, skipped };
62
+ }
63
+ /**
64
+ * Blade-templates eindigen óók op `.php`, en juist die moeten er niet in: een
65
+ * project noemt `resources/views` niet in zijn `paths`, dus PHPStan komt ze bij een
66
+ * normale run nooit tegen. Geef je er expliciet één mee, dan analyseert PHPStan hem
67
+ * alsnog — een pad op de commandoregel overrulet de configuratie — en levert een
68
+ * template onbruikbare meldingen op. Kwam boven bij een echt project met een
69
+ * gewijzigde `.blade.php` ernaast.
70
+ */
71
+ function isAnalysablePhp(path) {
72
+ const lower = path.toLowerCase();
73
+ return lower.endsWith('.php') && !lower.endsWith('.blade.php');
74
+ }
75
+ /**
76
+ * Weigert een base die als vlag gelezen kan worden. Alleen het leidende streepje is
77
+ * hier gevaarlijk: al het andere komt als één argv-token bij git aan en kan dus geen
78
+ * losse optie meer worden. Geen witte lijst van rev-tekens, want een geldige rev mag
79
+ * veel meer dan je zou denken (`HEAD~2`, `main@{yesterday}`, `v1.0^{commit}`).
80
+ */
81
+ function checkBase(base) {
82
+ if (base.startsWith('-')) {
83
+ throw new GitError(`"${base}" kan geen base zijn: een waarde die met een streepje begint zou als ` +
84
+ 'git-optie gelezen worden. Gebruik een commit, branch of tag, bijvoorbeeld HEAD of main.');
85
+ }
86
+ return base;
87
+ }
88
+ function lines(output) {
89
+ return output
90
+ .split('\n')
91
+ .map((line) => line.trim())
92
+ .filter((line) => line !== '');
93
+ }
94
+ async function git(cwd, args) {
95
+ const { code, stdout, stderr, spawnError } = await execute(cwd, args);
96
+ if (spawnError !== null) {
97
+ throw new GitError(spawnError.code === 'ENOENT'
98
+ ? 'git is niet gevonden. Geef paths mee aan analyse_project om zonder git te werken.'
99
+ : `git kon niet gestart worden in ${cwd}: ${spawnError.message}`);
100
+ }
101
+ if (code !== 0) {
102
+ throw new GitError(describeGitFailure(cwd, args, stderr, code));
103
+ }
104
+ return stdout;
105
+ }
106
+ function describeGitFailure(cwd, args, stderr, code) {
107
+ const details = stderr.trim().slice(0, 1000);
108
+ if (/not a git repository/i.test(details)) {
109
+ return (`${cwd} staat niet onder git, dus er is niets om tegen te vergelijken. ` +
110
+ 'Gebruik analyse_project met expliciete paths.');
111
+ }
112
+ // Een onbekende base is de enige fout die de aanroeper zelf kan herstellen, dus
113
+ // die krijgt zijn eigen melding in plaats van de ruwe git-uitvoer.
114
+ if (/unknown revision|bad revision|ambiguous argument/i.test(details)) {
115
+ return (`git kent "${args[args.length - 1] ?? ''}" niet in ${cwd}. ` +
116
+ 'Gebruik een bestaande commit, branch of tag, bijvoorbeeld HEAD of main.');
117
+ }
118
+ return `git faalde in ${cwd} (exit code ${code ?? '?'}).\n\n${details === '' ? 'Geen uitvoer.' : details}`;
119
+ }
120
+ function execute(cwd, args) {
121
+ return new Promise((resolve) => {
122
+ // Zonder shell, net als bij PHPStan. Geen detached procesgroep: git start geen
123
+ // workers die de pipes openhouden, dus 'close' volgt hier gewoon op de timeout.
124
+ const child = spawn('git', [...args], { cwd, timeout: GIT_TIMEOUT_MS });
125
+ let stdout = '';
126
+ let stderr = '';
127
+ let spawnError = null;
128
+ child.stdout.on('data', (chunk) => (stdout += chunk.toString()));
129
+ child.stderr.on('data', (chunk) => (stderr += chunk.toString()));
130
+ child.on('error', (error) => (spawnError = error));
131
+ child.on('close', (code) => resolve({ code, stdout, stderr, spawnError }));
132
+ });
133
+ }
134
+ //# sourceMappingURL=changed.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"changed.js","sourceRoot":"","sources":["../src/changed.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAE3C,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAE3D,+EAA+E;AAC/E,MAAM,OAAO,QAAS,SAAQ,KAAK;CAAG;AAEtC,iFAAiF;AACjF,MAAM,CAAC,MAAM,YAAY,GAAG,MAAM,CAAC;AAEnC;;;GAGG;AACH,MAAM,cAAc,GAAG,MAAM,CAAC;AAW9B;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,OAAwB,EACxB,OAAe,YAAY;IAE3B,+EAA+E;IAC/E,8EAA8E;IAC9E,EAAE;IACF,gFAAgF;IAChF,iFAAiF;IACjF,iFAAiF;IACjF,kFAAkF;IAClF,gFAAgF;IAChF,+BAA+B;IAC/B,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE;QACtC,MAAM;QACN,aAAa;QACb,YAAY;QACZ,oBAAoB;QACpB,kBAAkB;QAClB,SAAS,CAAC,IAAI,CAAC;KAChB,CAAC,CAAC;IACH,MAAM,SAAS,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,UAAU,EAAE,UAAU,EAAE,oBAAoB,CAAC,CAAC,CAAC;IAE1F,MAAM,UAAU,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,EAAE,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;SACtE,MAAM,CAAC,eAAe,CAAC;SACvB,IAAI,EAAE,CAAC;IAEV,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,OAAO,GAAuC,EAAE,CAAC;IAEvD,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,IAAI,CAAC;YACH,wEAAwE;YACxE,8EAA8E;YAC9E,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC;QAChD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,2EAA2E;YAC3E,0EAA0E;YAC1E,2EAA2E;YAC3E,YAAY;YACZ,OAAO,CAAC,IAAI,CAAC;gBACX,IAAI,EAAE,SAAS;gBACf,MAAM,EAAE,KAAK,YAAY,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;aACtE,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;AAClC,CAAC;AAED;;;;;;;GAOG;AACH,SAAS,eAAe,CAAC,IAAY;IACnC,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;IACjC,OAAO,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;AACjE,CAAC;AAED;;;;;GAKG;AACH,SAAS,SAAS,CAAC,IAAY;IAC7B,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACzB,MAAM,IAAI,QAAQ,CAChB,IAAI,IAAI,uEAAuE;YAC7E,yFAAyF,CAC5F,CAAC;IACJ,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,KAAK,CAAC,MAAc;IAC3B,OAAO,MAAM;SACV,KAAK,CAAC,IAAI,CAAC;SACX,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;SAC1B,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,EAAE,CAAC,CAAC;AACnC,CAAC;AAED,KAAK,UAAU,GAAG,CAAC,GAAW,EAAE,IAAc;IAC5C,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IAEtE,IAAI,UAAU,KAAK,IAAI,EAAE,CAAC;QACxB,MAAM,IAAI,QAAQ,CAChB,UAAU,CAAC,IAAI,KAAK,QAAQ;YAC1B,CAAC,CAAC,mFAAmF;YACrF,CAAC,CAAC,kCAAkC,GAAG,KAAK,UAAU,CAAC,OAAO,EAAE,CACnE,CAAC;IACJ,CAAC;IAED,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;QACf,MAAM,IAAI,QAAQ,CAAC,kBAAkB,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC;IAClE,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,kBAAkB,CACzB,GAAW,EACX,IAAuB,EACvB,MAAc,EACd,IAAmB;IAEnB,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IAE7C,IAAI,uBAAuB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QAC1C,OAAO,CACL,GAAG,GAAG,kEAAkE;YACxE,+CAA+C,CAChD,CAAC;IACJ,CAAC;IAED,gFAAgF;IAChF,mEAAmE;IACnE,IAAI,mDAAmD,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QACtE,OAAO,CACL,aAAa,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,EAAE,aAAa,GAAG,IAAI;YAC5D,yEAAyE,CAC1E,CAAC;IACJ,CAAC;IAED,OAAO,iBAAiB,GAAG,eAAe,IAAI,IAAI,GAAG,SAAS,OAAO,KAAK,EAAE,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;AAC7G,CAAC;AASD,SAAS,OAAO,CAAC,GAAW,EAAE,IAAuB;IACnD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,+EAA+E;QAC/E,gFAAgF;QAChF,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC,GAAG,IAAI,CAAC,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,cAAc,EAAE,CAAC,CAAC;QAExE,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,IAAI,UAAU,GAAiC,IAAI,CAAC;QAEpD,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE,CAAC,CAAC,MAAM,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;QACzE,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE,CAAC,CAAC,MAAM,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;QACzE,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAA4B,EAAE,EAAE,CAAC,CAAC,UAAU,GAAG,KAAK,CAAC,CAAC,CAAC;QAC1E,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC;IAC7E,CAAC,CAAC,CAAC;AACL,CAAC"}
package/dist/index.js CHANGED
@@ -1,5 +1,6 @@
1
1
  #!/usr/bin/env node
2
2
  import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
3
+ import { loadDefaultMemoryLimit } from './phpstan.js';
3
4
  import { loadRoots } from './roots.js';
4
5
  import { VERSION, createServer } from './server.js';
5
6
  async function main() {
@@ -8,7 +9,23 @@ async function main() {
8
9
  // stdio: het protocol zelf loopt over stdout. Alles wat deze server logt moet
9
10
  // daarom naar stderr — één console.log breekt de JSON-RPC-stroom.
10
11
  await server.connect(new StdioServerTransport());
11
- console.error(`phpstan-mcp ${VERSION} luistert op stdio, ${roots.length} root(s) geconfigureerd`);
12
+ console.error(`phpstan-mcp ${VERSION} luistert op stdio, ${roots.length} root(s) geconfigureerd` +
13
+ describeMemoryDefault());
14
+ }
15
+ /**
16
+ * Zet de standaard geheugenlimiet in de opstartregel, zodat je in het clientlog ziet
17
+ * of hij opgepikt is. Een onbruikbare waarde is hier bewust niet fataal: de server
18
+ * kan er verder prima mee door, en analyse() legt het probleem alsnog uit aan wie
19
+ * een analyse aanvraagt.
20
+ */
21
+ function describeMemoryDefault() {
22
+ try {
23
+ const limit = loadDefaultMemoryLimit();
24
+ return limit === undefined ? '' : `, geheugenlimiet ${limit}`;
25
+ }
26
+ catch (error) {
27
+ return `, LET OP: ${error instanceof Error ? error.message : String(error)}`;
28
+ }
12
29
  }
13
30
  main().catch((error) => {
14
31
  console.error('phpstan-mcp kon niet starten:', error);
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEpD,KAAK,UAAU,IAAI;IACjB,MAAM,KAAK,GAAG,SAAS,EAAE,CAAC;IAC1B,MAAM,MAAM,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;IAEnC,8EAA8E;IAC9E,kEAAkE;IAClE,MAAM,MAAM,CAAC,OAAO,CAAC,IAAI,oBAAoB,EAAE,CAAC,CAAC;IAEjD,OAAO,CAAC,KAAK,CAAC,eAAe,OAAO,uBAAuB,KAAK,CAAC,MAAM,yBAAyB,CAAC,CAAC;AACpG,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;IAC9B,OAAO,CAAC,KAAK,CAAC,+BAA+B,EAAE,KAAK,CAAC,CAAC;IACtD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AACtD,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEpD,KAAK,UAAU,IAAI;IACjB,MAAM,KAAK,GAAG,SAAS,EAAE,CAAC;IAC1B,MAAM,MAAM,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;IAEnC,8EAA8E;IAC9E,kEAAkE;IAClE,MAAM,MAAM,CAAC,OAAO,CAAC,IAAI,oBAAoB,EAAE,CAAC,CAAC;IAEjD,OAAO,CAAC,KAAK,CACX,eAAe,OAAO,uBAAuB,KAAK,CAAC,MAAM,yBAAyB;QAChF,qBAAqB,EAAE,CAC1B,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,SAAS,qBAAqB;IAC5B,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,sBAAsB,EAAE,CAAC;QACvC,OAAO,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,oBAAoB,KAAK,EAAE,CAAC;IAChE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,aAAa,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;IAC/E,CAAC;AACH,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;IAC9B,OAAO,CAAC,KAAK,CAAC,+BAA+B,EAAE,KAAK,CAAC,CAAC;IACtD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
package/dist/phpstan.d.ts CHANGED
@@ -1,6 +1,8 @@
1
1
  import type { ResolvedProject } from './project.js';
2
2
  /** Standaardtijd waarna een analyse wordt afgebroken. */
3
3
  export declare const DEFAULT_TIMEOUT_MS = 300000;
4
+ /** Env-variabele met de `--memory-limit` voor aanroepen die er zelf geen meegeven. */
5
+ export declare const MEMORY_LIMIT_ENV_VAR = "PHPSTAN_MCP_MEMORY_LIMIT";
4
6
  /** Eén bevinding van PHPStan, gekoppeld aan een bestand. */
5
7
  export interface Finding {
6
8
  /** Absoluut pad zoals PHPStan het rapporteert. */
@@ -29,6 +31,8 @@ export interface AnalyseOptions {
29
31
  readonly paths?: readonly string[];
30
32
  /** Level-override, 0 t/m 10 of "max". */
31
33
  readonly level?: string;
34
+ /** Absoluut pad naar een ander configbestand dan dat PHPStan zelf zou vinden. */
35
+ readonly config?: string;
32
36
  readonly memoryLimit?: string;
33
37
  readonly timeoutMs?: number;
34
38
  }
@@ -43,3 +47,11 @@ export declare class PhpstanError extends Error {
43
47
  * overheen. Verschillende projecten draaien wél parallel.
44
48
  */
45
49
  export declare function analyse(project: ResolvedProject, options?: AnalyseOptions): Promise<AnalysisResult>;
50
+ /**
51
+ * Leest de standaard geheugenlimiet uit de omgeving. Een onbruikbare waarde wordt
52
+ * hier al geweigerd en niet aan PHPStan doorgegeven: die zou er per analyse op
53
+ * klappen met een melding die "memory limit" bevat, waarna describeFailure het
54
+ * model aanraadt een limiet mee te geven — precies het verkeerde advies, want de
55
+ * fout zit in de serverconfiguratie en niet in de aanroep.
56
+ */
57
+ export declare function loadDefaultMemoryLimit(env?: NodeJS.ProcessEnv): string | undefined;
package/dist/phpstan.js CHANGED
@@ -2,6 +2,12 @@ import { spawn } from 'node:child_process';
2
2
  import { z } from 'zod';
3
3
  /** Standaardtijd waarna een analyse wordt afgebroken. */
4
4
  export const DEFAULT_TIMEOUT_MS = 300_000;
5
+ /** Env-variabele met de `--memory-limit` voor aanroepen die er zelf geen meegeven. */
6
+ export const MEMORY_LIMIT_ENV_VAR = 'PHPSTAN_MCP_MEMORY_LIMIT';
7
+ // PHPStans eigen vorm: bytes als getal, optioneel met K, M of G, of -1 voor
8
+ // onbeperkt. Een neon-parameter bestaat er niet voor en PHPStan kent er ook geen
9
+ // eigen env-variabele voor, dus dit is de enige plek om het blijvend vast te leggen.
10
+ const MEMORY_LIMIT_PATTERN = /^(-1|\d+[KMG]?)$/i;
5
11
  /** Fout die als bruikbare melding naar het model teruggaat, niet als crash. */
6
12
  export class PhpstanError extends Error {
7
13
  }
@@ -41,12 +47,35 @@ async function run(project, options) {
41
47
  return toResult(project.path, parsed);
42
48
  throw new PhpstanError(describeFailure(project, execution));
43
49
  }
50
+ /**
51
+ * Leest de standaard geheugenlimiet uit de omgeving. Een onbruikbare waarde wordt
52
+ * hier al geweigerd en niet aan PHPStan doorgegeven: die zou er per analyse op
53
+ * klappen met een melding die "memory limit" bevat, waarna describeFailure het
54
+ * model aanraadt een limiet mee te geven — precies het verkeerde advies, want de
55
+ * fout zit in de serverconfiguratie en niet in de aanroep.
56
+ */
57
+ export function loadDefaultMemoryLimit(env = process.env) {
58
+ const configured = env[MEMORY_LIMIT_ENV_VAR]?.trim();
59
+ if (configured === undefined || configured === '')
60
+ return undefined;
61
+ if (!MEMORY_LIMIT_PATTERN.test(configured)) {
62
+ throw new PhpstanError(`${MEMORY_LIMIT_ENV_VAR} staat op "${configured}", en die vorm accepteert PHPStan niet. ` +
63
+ 'Gebruik een getal met optioneel K, M of G (bijv. "1G"), of -1 voor geen limiet.');
64
+ }
65
+ return configured;
66
+ }
44
67
  function buildArgs(project, options) {
45
68
  const args = ['analyse', '--error-format=json', '--no-progress', '--no-interaction', '--no-ansi'];
69
+ // Vóór de rest, zoals PHPStan het zelf ook documenteert: de config bepaalt wat de
70
+ // overige vlaggen overrulen.
71
+ if (options.config !== undefined)
72
+ args.push(`--configuration=${options.config}`);
46
73
  if (options.level !== undefined)
47
74
  args.push(`--level=${options.level}`);
48
- if (options.memoryLimit !== undefined)
49
- args.push(`--memory-limit=${options.memoryLimit}`);
75
+ // De aanroep gaat vóór de env-variabele: die is de standaard, niet het plafond.
76
+ const memoryLimit = options.memoryLimit ?? loadDefaultMemoryLimit();
77
+ if (memoryLimit !== undefined)
78
+ args.push(`--memory-limit=${memoryLimit}`);
50
79
  // Zonder config én zonder paden weet PHPStan niet wat het moet doen; dan is een
51
80
  // duidelijke melding beter dan PHPStans eigen usage-tekst.
52
81
  const paths = options.paths ?? [];
@@ -180,6 +209,14 @@ function toResult(project, output) {
180
209
  /** Vertaalt een run die geen bruikbare JSON opleverde naar iets waar je wat mee kunt. */
181
210
  function describeFailure(project, execution) {
182
211
  const details = (execution.stderr.trim() || execution.stdout.trim()).slice(0, 2000);
212
+ // "Invalid memory limit format" bevat óók "memory limit", maar is een afgekeurde
213
+ // waarde en geen volgelopen geheugen. Eerst afvangen, anders krijgt het model de
214
+ // raad een limiet mee te geven die het net al meegaf.
215
+ if (/invalid memory limit/i.test(details)) {
216
+ return (`PHPStan accepteerde de meegegeven geheugenlimiet niet in ${project.path}. ` +
217
+ `Controleer memoryLimit of ${MEMORY_LIMIT_ENV_VAR}.\n\n` +
218
+ details);
219
+ }
183
220
  // PHPStan meldt dit op twee manieren: PHP's eigen "Allowed memory size ...
184
221
  // exhausted", en PHPStans eigen "reached configured PHP memory limit: 128M".
185
222
  if (/allowed memory size|memory[_ ]limit/i.test(details)) {
@@ -1 +1 @@
1
- {"version":3,"file":"phpstan.js","sourceRoot":"","sources":["../src/phpstan.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"phpstan.js","sourceRoot":"","sources":["../src/phpstan.ts"],"names":[],"mappings":"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"}
package/dist/report.d.ts CHANGED
@@ -35,11 +35,19 @@ export interface Report {
35
35
  readonly summary: Summary;
36
36
  readonly findings: readonly DisplayFinding[];
37
37
  readonly page: Page;
38
+ /** Op welke identifiers de pagina beperkt is, of null als er niet gefilterd is. */
39
+ readonly filter: readonly string[] | null;
38
40
  }
39
41
  /** Waar in de bevindingenlijst dit antwoord begint en hoe lang het is. */
40
42
  export interface Window {
41
43
  readonly offset?: number | undefined;
42
44
  readonly limit?: number | undefined;
45
+ /**
46
+ * Alleen bevindingen met deze identifiers in de pagina. Een waarde matcht exact
47
+ * ("argument.type") of als groep ("argument" matcht "argument.type", maar niet
48
+ * "argumentx.iets"). De samenvatting blijft over álles rekenen.
49
+ */
50
+ readonly identifiers?: readonly string[] | undefined;
43
51
  }
44
52
  /**
45
53
  * Zet een analyse om in het antwoord dat de tool teruggeeft: tellingen over alles,
package/dist/report.js CHANGED
@@ -15,9 +15,14 @@ export function buildReport(result, window = {}) {
15
15
  ...finding,
16
16
  file: displayPath(result.project, finding.file),
17
17
  }));
18
+ // Filteren vóór het pagineren, maar ná het samenvatten: page.total moet de
19
+ // gefilterde lijst beschrijven, anders liegen offset en hasMore. De samenvatting
20
+ // rekent over alles, zodat het model ziet wat het met een filter wegliet.
21
+ const filter = normaliseFilter(window.identifiers);
22
+ const selected = filter === null ? all : all.filter((finding) => matches(finding, filter));
18
23
  const limit = clamp(window.limit ?? DEFAULT_LIMIT, 1, MAX_LIMIT);
19
- const offset = clamp(window.offset ?? 0, 0, Math.max(all.length, 0));
20
- const findings = all.slice(offset, offset + limit);
24
+ const offset = clamp(window.offset ?? 0, 0, Math.max(selected.length, 0));
25
+ const findings = selected.slice(offset, offset + limit);
21
26
  return {
22
27
  project: result.project,
23
28
  totals: result.totals,
@@ -28,11 +33,30 @@ export function buildReport(result, window = {}) {
28
33
  offset,
29
34
  limit,
30
35
  returned: findings.length,
31
- total: all.length,
32
- hasMore: offset + findings.length < all.length,
36
+ total: selected.length,
37
+ hasMore: offset + findings.length < selected.length,
33
38
  },
39
+ filter,
34
40
  };
35
41
  }
42
+ /** Lege of alleen-witruimte-waarden vallen weg; blijft er niets over, dan is er geen filter. */
43
+ function normaliseFilter(identifiers) {
44
+ if (identifiers === undefined)
45
+ return null;
46
+ const cleaned = [...new Set(identifiers.map((value) => value.trim()).filter((value) => value !== ''))];
47
+ return cleaned.length === 0 ? null : cleaned;
48
+ }
49
+ /**
50
+ * Exact, of als groep op een punt. Op `startsWith` alleen matchen zou "argument"
51
+ * ook op "argumentx.iets" laten passen — dezelfde valkuil als bij de
52
+ * containment-check op paden.
53
+ */
54
+ function matches(finding, filter) {
55
+ if (finding.identifier === null)
56
+ return false;
57
+ const identifier = finding.identifier;
58
+ return filter.some((value) => identifier === value || identifier.startsWith(`${value}.`));
59
+ }
36
60
  /** Schrijft een rapport uit als tekst voor het model. */
37
61
  export function renderReport(report) {
38
62
  const lines = [];
@@ -43,10 +67,20 @@ export function renderReport(report) {
43
67
  lines.push('');
44
68
  }
45
69
  if (report.page.total === 0) {
70
+ if (report.filter !== null && report.totals.fileErrors > 0) {
71
+ lines.push(`Geen bevindingen met identifier ${report.filter.join(', ')}, ` +
72
+ `terwijl er ${report.totals.fileErrors} andere bevinding(en) zijn.`);
73
+ return lines.join('\n');
74
+ }
46
75
  lines.push(report.generalErrors.length === 0 ? 'Geen bevindingen.' : 'Verder geen bevindingen.');
47
76
  return lines.join('\n');
48
77
  }
49
- lines.push(`${report.page.total} bevinding(en) in ${report.summary.filesWithFindings} bestand(en).`, '', 'Meest voorkomend:', ...report.summary.byIdentifier.map((row) => ` ${pad(row.count)} ${row.identifier}`));
78
+ lines.push(report.filter === null
79
+ ? `${report.page.total} bevinding(en) in ${report.summary.filesWithFindings} bestand(en).`
80
+ : `${report.page.total} bevinding(en) met identifier ${report.filter.join(', ')}, ` +
81
+ `van ${report.totals.fileErrors} in totaal.`, '', report.filter === null
82
+ ? 'Meest voorkomend:'
83
+ : 'Meest voorkomend (over álle bevindingen, ook de weggefilterde):', ...report.summary.byIdentifier.map((row) => ` ${pad(row.count)} ${row.identifier}`));
50
84
  if (report.summary.byFile.length > 1) {
51
85
  lines.push('', 'Zwaarst getroffen bestanden:', ...report.summary.byFile.map((row) => ` ${pad(row.count)} ${row.file}`));
52
86
  }
@@ -1 +1 @@
1
- {"version":3,"file":"report.js","sourceRoot":"","sources":["../src/report.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"report.js","sourceRoot":"","sources":["../src/report.ts"],"names":[],"mappings":"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"}
package/dist/server.d.ts CHANGED
@@ -5,7 +5,7 @@ import type { Root } from './roots.js';
5
5
  * package.json; die kan hier niet zomaar geïmporteerd worden, want een JSON-import
6
6
  * verhuist bij het bouwen mee naar dist/ en wijst dan naar het verkeerde bestand.
7
7
  */
8
- export declare const VERSION = "0.1.0";
8
+ export declare const VERSION = "0.2.0";
9
9
  /**
10
10
  * Bouwt de MCP-server met de tools die op deze set roots van toepassing zijn.
11
11
  * De roots worden één keer bij het opstarten ingelezen: ze komen uit de
package/dist/server.js CHANGED
@@ -5,7 +5,7 @@ import { registerTools } from './tools.js';
5
5
  * package.json; die kan hier niet zomaar geïmporteerd worden, want een JSON-import
6
6
  * verhuist bij het bouwen mee naar dist/ en wijst dan naar het verkeerde bestand.
7
7
  */
8
- export const VERSION = '0.1.0';
8
+ export const VERSION = '0.2.0';
9
9
  /**
10
10
  * Bouwt de MCP-server met de tools die op deze set roots van toepassing zijn.
11
11
  * De roots worden één keer bij het opstarten ingelezen: ze komen uit de
package/dist/tools.js CHANGED
@@ -1,7 +1,8 @@
1
1
  import { z } from 'zod';
2
2
  import { BaselineError, renderBaseline, summariseBaseline } from './baseline.js';
3
+ import { DEFAULT_BASE, GitError, changedPhpFiles } from './changed.js';
3
4
  import { PhpstanError, analyse } from './phpstan.js';
4
- import { DEFAULT_LIMIT, MAX_LIMIT, buildReport, renderReport } from './report.js';
5
+ import { DEFAULT_LIMIT, MAX_LIMIT, buildReport, displayPath, renderReport } from './report.js';
5
6
  import { ProjectError, discoverProjects, resolveProject, resolveWithin } from './project.js';
6
7
  import { ROOTS_ENV_VAR } from './roots.js';
7
8
  /**
@@ -48,8 +49,19 @@ const analysisShape = {
48
49
  hasMore: z.boolean(),
49
50
  })
50
51
  .describe('Welk deel van de bevindingen dit antwoord bevat'),
52
+ filter: nullable(z.array(z.string())).describe('Op welke identifiers deze pagina beperkt is, of null als er niet gefilterd is'),
51
53
  };
54
+ const configArgument = z
55
+ .string()
56
+ .optional()
57
+ .describe('Ander configbestand dan PHPStan zelf zou pakken, bijv. "phpstan-strict.neon". ' +
58
+ 'Moet binnen het project liggen');
52
59
  const windowShape = {
60
+ identifiers: z
61
+ .array(z.string())
62
+ .optional()
63
+ .describe('Beperk de bevindingen tot deze identifiers, bijv. ["argument.type"]. ' +
64
+ '"missingType" matcht de hele groep. De samenvatting blijft over alles tellen'),
53
65
  offset: z.number().int().min(0).optional().describe('Sla de eerste N bevindingen over'),
54
66
  limit: z
55
67
  .number()
@@ -64,6 +76,7 @@ export function registerTools(server, roots) {
64
76
  registerListProjects(server, roots);
65
77
  registerAnalyseProject(server, roots);
66
78
  registerAnalyseFile(server, roots);
79
+ registerAnalyseChanged(server, roots);
67
80
  registerBaselineSummary(server, roots);
68
81
  }
69
82
  function registerBaselineSummary(server, roots) {
@@ -140,18 +153,86 @@ function registerAnalyseProject(server, roots) {
140
153
  .optional()
141
154
  .describe('Paden binnen het project; leeg betekent: volg de configuratie'),
142
155
  level: z.string().optional().describe('Level-override, 0 t/m 10 of "max"'),
143
- memoryLimit: z.string().optional().describe('Bijv. "1G", als PHPStan op de PHP-limiet klapt'),
156
+ config: configArgument,
157
+ memoryLimit: z
158
+ .string()
159
+ .optional()
160
+ .describe('Bijv. "1G", als PHPStan op de PHP-limiet klapt; overrulet de serverstandaard'),
161
+ timeoutSeconds: z.number().int().positive().max(1800).optional(),
162
+ ...windowShape,
163
+ },
164
+ outputSchema: analysisShape,
165
+ annotations: readOnly(),
166
+ }, async (args) => runAnalysis(roots, args.project, (resolved) => ({
167
+ options: {
168
+ // Elk pad door resolveWithin, ook al komt het rechtstreeks uit de
169
+ // aanroep. Ongefilterd doorgeven was op twee manieren mis: een pad
170
+ // buiten het project liet PHPStan bestanden lezen waar de whitelist
171
+ // juist over gaat, en een "pad" als --generate-baseline=x werd door
172
+ // PHPStan als vlag gelezen en schreef dat bestand echt weg
173
+ // (nagemeten). Na resolveWithin is elk pad absoluut en bestaat het,
174
+ // dus het kan geen vlag meer zijn.
175
+ ...(args.paths === undefined
176
+ ? {}
177
+ : { paths: args.paths.map((path) => resolveWithin(resolved, path)) }),
178
+ ...common(resolved, args),
179
+ },
180
+ }), window(args)));
181
+ }
182
+ function registerAnalyseChanged(server, roots) {
183
+ server.registerTool('analyse_changed', {
184
+ title: 'Gewijzigde bestanden analyseren',
185
+ description: 'Draait PHPStan over de PHP-bestanden die in dit project gewijzigd zijn volgens git, ' +
186
+ 'inclusief bestanden die nog niet toegevoegd zijn. Bedoeld om te zien of een eigen ' +
187
+ 'wijziging fouten oplevert, zonder het hele project door te rekenen. Vergelijkt ' +
188
+ `standaard met ${DEFAULT_BASE}; geef \`base\` mee (bijv. "main") voor de hele branch.`,
189
+ inputSchema: {
190
+ project: projectArgument,
191
+ base: z
192
+ .string()
193
+ .optional()
194
+ .describe(`Commit, branch of tag om tegen te vergelijken (standaard ${DEFAULT_BASE})`),
195
+ level: z.string().optional().describe('Level-override, 0 t/m 10 of "max"'),
196
+ config: configArgument,
197
+ memoryLimit: z.string().optional(),
144
198
  timeoutSeconds: z.number().int().positive().max(1800).optional(),
145
199
  ...windowShape,
146
200
  },
147
201
  outputSchema: analysisShape,
148
202
  annotations: readOnly(),
149
- }, async ({ project, paths, level, memoryLimit, timeoutSeconds, offset, limit }) => runAnalysis(roots, project, {
150
- ...(paths === undefined ? {} : { paths }),
151
- ...(level === undefined ? {} : { level }),
152
- ...(memoryLimit === undefined ? {} : { memoryLimit }),
153
- ...(timeoutSeconds === undefined ? {} : { timeoutMs: timeoutSeconds * 1000 }),
154
- }, { offset, limit }));
203
+ }, async (args) => runAnalysis(roots, args.project, async (resolved) => {
204
+ const changed = await changedPhpFiles(resolved, args.base);
205
+ if (changed.files.length === 0) {
206
+ return { nothingToDo: describeNothingChanged(changed) };
207
+ }
208
+ return {
209
+ options: { paths: [...changed.files], ...common(resolved, args) },
210
+ heading: describeChanged(resolved, changed),
211
+ };
212
+ }, window(args)));
213
+ }
214
+ /** Waarom er niets geanalyseerd is; de overgeslagen paden horen daar bij. */
215
+ function describeNothingChanged(changed) {
216
+ const lines = [`Geen gewijzigde PHP-bestanden ten opzichte van ${changed.base}.`];
217
+ if (changed.skipped.length > 0)
218
+ lines.push('', ...skippedLines(changed));
219
+ return lines.join('\n');
220
+ }
221
+ /** Wat er geanalyseerd is, zodat zichtbaar is waarop het rapport eronder betrekking heeft. */
222
+ function describeChanged(resolved, changed) {
223
+ const lines = [
224
+ `${changed.files.length} gewijzigd(e) PHP-bestand(en) ten opzichte van ${changed.base}:`,
225
+ ...changed.files.map((file) => ` ${displayPath(resolved.path, file)}`),
226
+ ];
227
+ if (changed.skipped.length > 0)
228
+ lines.push('', ...skippedLines(changed));
229
+ return lines.join('\n');
230
+ }
231
+ function skippedLines(changed) {
232
+ return [
233
+ 'Overgeslagen, dus niet meegenomen in dit rapport:',
234
+ ...changed.skipped.map((entry) => ` ${entry.path}: ${entry.reason}`),
235
+ ];
155
236
  }
156
237
  function registerAnalyseFile(server, roots) {
157
238
  server.registerTool('analyse_file', {
@@ -162,35 +243,66 @@ function registerAnalyseFile(server, roots) {
162
243
  project: projectArgument,
163
244
  path: z.string().describe('Bestand of map binnen het project, bijv. "app/Models/User.php"'),
164
245
  level: z.string().optional().describe('Level-override, 0 t/m 10 of "max"'),
246
+ config: configArgument,
165
247
  memoryLimit: z.string().optional(),
166
248
  timeoutSeconds: z.number().int().positive().max(1800).optional(),
167
249
  ...windowShape,
168
250
  },
169
251
  outputSchema: analysisShape,
170
252
  annotations: readOnly(),
171
- }, async ({ project, path, level, memoryLimit, timeoutSeconds, offset, limit }) => {
172
- try {
173
- const resolved = resolveProject(project, roots);
174
- const target = resolveWithin(resolved, path);
175
- return await runAnalysis(roots, project, {
176
- paths: [target],
177
- ...(level === undefined ? {} : { level }),
178
- ...(memoryLimit === undefined ? {} : { memoryLimit }),
179
- ...(timeoutSeconds === undefined ? {} : { timeoutMs: timeoutSeconds * 1000 }),
180
- }, { offset, limit });
181
- }
182
- catch (error) {
183
- return toFailure(error);
184
- }
185
- });
253
+ }, async (args) => runAnalysis(roots, args.project, (resolved) => ({
254
+ options: {
255
+ paths: [resolveWithin(resolved, args.path)],
256
+ ...common(resolved, args),
257
+ },
258
+ }), window(args)));
259
+ }
260
+ /**
261
+ * Zet de gedeelde argumenten om in AnalyseOptions. `config` gaat door resolveWithin:
262
+ * een neon mag `bootstrapFiles` en extensies bevatten, dus een vrij te kiezen
263
+ * configpad zou anders een route zijn om willekeurige PHP-code te laten uitvoeren —
264
+ * langs de whitelist heen die `project` juist wél afdwingt.
265
+ */
266
+ function common(resolved, args) {
267
+ return {
268
+ ...(args.level === undefined ? {} : { level: args.level }),
269
+ ...(args.config === undefined ? {} : { config: resolveWithin(resolved, args.config) }),
270
+ ...(args.memoryLimit === undefined ? {} : { memoryLimit: args.memoryLimit }),
271
+ ...(args.timeoutSeconds === undefined ? {} : { timeoutMs: args.timeoutSeconds * 1000 }),
272
+ };
273
+ }
274
+ function window(args) {
275
+ return {
276
+ offset: args.offset,
277
+ limit: args.limit,
278
+ ...(args.identifiers === undefined ? {} : { identifiers: args.identifiers }),
279
+ };
186
280
  }
187
- async function runAnalysis(roots, project, options, window) {
281
+ /**
282
+ * Resolvet het project één keer en geeft het aan `plan`, zodat een tool die zelf nog
283
+ * paden binnen dat project moet valideren dat op hetzelfde geresolvede project doet.
284
+ * Eerder resolveerde analyse_file het project en deed runAnalysis dat daarna nog
285
+ * een keer.
286
+ */
287
+ async function runAnalysis(roots, project, plan, window) {
188
288
  try {
189
289
  const resolved = resolveProject(project, roots);
190
- const result = await analyse(resolved, options);
290
+ const chosen = await plan(resolved);
291
+ if ('nothingToDo' in chosen) {
292
+ // Toch het volledige rapportschema teruggeven: een client die op
293
+ // structuredContent vertrouwt moet niet ineens een ander soort antwoord
294
+ // krijgen omdat er niets te doen was.
295
+ const empty = buildReport({ project: resolved.path, findings: [], generalErrors: [], totals: { fileErrors: 0, generalErrors: 0 } }, {});
296
+ return {
297
+ content: [{ type: 'text', text: chosen.nothingToDo }],
298
+ structuredContent: { ...empty },
299
+ };
300
+ }
301
+ const result = await analyse(resolved, chosen.options);
191
302
  const report = buildReport(result, window);
303
+ const heading = chosen.heading === undefined ? '' : `${chosen.heading}\n\n`;
192
304
  return {
193
- content: [{ type: 'text', text: renderReport(report) }],
305
+ content: [{ type: 'text', text: heading + renderReport(report) }],
194
306
  structuredContent: { ...report },
195
307
  };
196
308
  }
@@ -226,7 +338,10 @@ function readOnly() {
226
338
  return { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false };
227
339
  }
228
340
  function toFailure(error) {
229
- if (error instanceof ProjectError || error instanceof PhpstanError || error instanceof BaselineError) {
341
+ if (error instanceof ProjectError ||
342
+ error instanceof PhpstanError ||
343
+ error instanceof BaselineError ||
344
+ error instanceof GitError) {
230
345
  return failure(error.message);
231
346
  }
232
347
  throw error;
package/dist/tools.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"tools.js","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tools.js","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "phpstan-mcp-mx",
3
- "version": "0.1.0",
3
+ "version": "0.2.0",
4
4
  "description": "MCP-server die PHPStan ontsluit als tools, voor meerdere PHP-projecten tegelijk",
5
5
  "keywords": [
6
6
  "mcp",
@@ -36,6 +36,9 @@
36
36
  "watch": "tsc --watch",
37
37
  "start": "node dist/index.js",
38
38
  "inspect": "npm run build && npx @modelcontextprotocol/inspector node dist/index.js",
39
+ "inspect:dist": "npx @modelcontextprotocol/inspector node dist/index.js",
40
+ "inspect:ui": "npx @modelcontextprotocol/inspector",
41
+ "inspect:catalog": "npm run build && node scripts/inspector-catalog.mjs && npx @modelcontextprotocol/inspector --web --catalog inspector.mcp.json",
39
42
  "typecheck": "tsc --noEmit",
40
43
  "test": "vitest run",
41
44
  "test:watch": "vitest",