phpstan-mcp-mx 0.1.1 → 0.3.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 +138 -3
- package/dist/changed.d.ts +25 -0
- package/dist/changed.js +134 -0
- package/dist/changed.js.map +1 -0
- package/dist/index.js +18 -1
- package/dist/index.js.map +1 -1
- package/dist/phpstan.d.ts +21 -0
- package/dist/phpstan.js +60 -4
- package/dist/phpstan.js.map +1 -1
- package/dist/report.d.ts +25 -0
- package/dist/report.js +84 -7
- package/dist/report.js.map +1 -1
- package/dist/server.d.ts +1 -1
- package/dist/server.js +1 -1
- package/dist/tools.js +155 -27
- package/dist/tools.js.map +1 -1
- package/package.json +4 -1
package/README.md
CHANGED
|
@@ -5,12 +5,23 @@ bedient meerdere PHP-projecten tegelijk; welke dat zijn, leg je zelf vast.
|
|
|
5
5
|
|
|
6
6
|
## Installatie
|
|
7
7
|
|
|
8
|
-
|
|
9
|
-
die
|
|
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.
|
|
10
11
|
|
|
11
12
|
```bash
|
|
12
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.
|
|
13
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
|
|
14
25
|
claude mcp add phpstan --scope user \
|
|
15
26
|
--env PHPSTAN_MCP_ROOTS=/pad/naar/projecten \
|
|
16
27
|
-- phpstan-mcp-mx
|
|
@@ -25,7 +36,39 @@ claude mcp add phpstan --scope user \
|
|
|
25
36
|
-- npx -y phpstan-mcp-mx
|
|
26
37
|
```
|
|
27
38
|
|
|
28
|
-
|
|
39
|
+
Nagaan of het gelukt is:
|
|
40
|
+
|
|
41
|
+
```bash
|
|
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:
|
|
29
72
|
|
|
30
73
|
```json
|
|
31
74
|
{
|
|
@@ -38,6 +81,19 @@ Voor Claude Desktop komt hetzelfde in `claude_desktop_config.json`:
|
|
|
38
81
|
}
|
|
39
82
|
```
|
|
40
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
|
+
|
|
41
97
|
### Als de server niet start: PATH
|
|
42
98
|
|
|
43
99
|
Krijg je iets als `env: node: No such file or directory`, of blijft de server op "failed to
|
|
@@ -118,6 +174,8 @@ al je projecten.
|
|
|
118
174
|
|
|
119
175
|
## Configuratie
|
|
120
176
|
|
|
177
|
+
### `PHPSTAN_MCP_ROOTS` (verplicht)
|
|
178
|
+
|
|
121
179
|
`PHPSTAN_MCP_ROOTS` is verplicht: een lijst absolute paden, gescheiden door een dubbele punt
|
|
122
180
|
(een puntkomma op Windows). Alles daaronder mag geanalyseerd worden, alles daarbuiten niet.
|
|
123
181
|
|
|
@@ -138,6 +196,26 @@ betekent daarmee "voer de PHP-code uit die in X's configuratie staat" — en het
|
|
|
138
196
|
een taalmodel. De lijst met roots maakt expliciet en menselijk vastgesteld wat binnen bereik
|
|
139
197
|
ligt.
|
|
140
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
|
+
|
|
141
219
|
## Tools
|
|
142
220
|
|
|
143
221
|
Elke tool verwacht een expliciet `project`-pad. De server heeft geen "huidig project": dat
|
|
@@ -157,15 +235,52 @@ tools als `project` verwachten.
|
|
|
157
235
|
| `project` | ja | absoluut pad naar de projectroot |
|
|
158
236
|
| `paths` | nee | paden binnen het project; leeg betekent: volg `phpstan.neon` |
|
|
159
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 |
|
|
160
239
|
| `memoryLimit` | nee | bijv. `1G`, als PHPStan op de PHP-geheugenlimiet klapt |
|
|
161
240
|
| `timeoutSeconds` | nee | standaard 300 |
|
|
241
|
+
| `identifiers` | nee | alleen deze identifiers in de pagina, bijv. `["argument.type"]` |
|
|
162
242
|
| `offset` / `limit` | nee | welk deel van de bevindingen je terugkrijgt |
|
|
163
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
|
+
|
|
164
253
|
### `analyse_file`
|
|
165
254
|
|
|
166
255
|
Zelfde argumenten, plus een verplichte `path` — één bestand of map binnen het project. Het
|
|
167
256
|
pad mag relatief aan de projectroot zijn of absoluut, maar moet er wel binnen liggen.
|
|
168
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
|
+
|
|
169
284
|
### `baseline_summary`
|
|
170
285
|
|
|
171
286
|
Leest de `phpstan-baseline*.neon` van een project en telt wat er genegeerd wordt, per
|
|
@@ -198,6 +313,26 @@ src/Support/Filters/DealFilters.php
|
|
|
198
313
|
|
|
199
314
|
Bij meer resultaten eindigt de tekst met de letterlijke vervolgaanroep (`offset=50`).
|
|
200
315
|
|
|
316
|
+
### Als de analyse niet volledig is
|
|
317
|
+
|
|
318
|
+
PHPStan kan geldige JSON teruggeven en er tegelijk op stderr bij zeggen dat hij het niet
|
|
319
|
+
heeft afgemaakt. Dat komt bovenaan het antwoord te staan, vóór alles:
|
|
320
|
+
|
|
321
|
+
```
|
|
322
|
+
LET OP — PHPStan meldde dit naast het resultaat:
|
|
323
|
+
- Result is incomplete because of severe errors.
|
|
324
|
+
```
|
|
325
|
+
|
|
326
|
+
Dat onderscheid is wezenlijk: zonder die regel is een lege uitslag niet te onderscheiden van
|
|
327
|
+
een schone. Staat er een waarschuwing, dan leest het antwoord ook niet meer "Geen
|
|
328
|
+
bevindingen" maar "Verder geen bevindingen".
|
|
329
|
+
|
|
330
|
+
Het `warnings`-veld staat los van `generalErrors`: dat tweede is PHPStans eigen
|
|
331
|
+
`errors`-array uit de JSON. Beide lijsten zijn begrensd op tien meldingen van elk hoogstens
|
|
332
|
+
1000 tekens — een mislukte Laravel-bootstrap levert anders een lap tekst op die het hele
|
|
333
|
+
antwoord vult. Hoeveel er weggelaten is staat in `omitted`, en in de tekst als "nog N niet
|
|
334
|
+
getoond".
|
|
335
|
+
|
|
201
336
|
## Vereisten
|
|
202
337
|
|
|
203
338
|
- Node 20 of nieuwer
|
|
@@ -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>;
|
package/dist/changed.js
ADDED
|
@@ -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":"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"}
|
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,
|
|
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. */
|
|
@@ -18,6 +20,8 @@ export interface AnalysisResult {
|
|
|
18
20
|
readonly findings: readonly Finding[];
|
|
19
21
|
/** Fouten die niet aan een bestand hangen, zoals configuratieproblemen. */
|
|
20
22
|
readonly generalErrors: readonly string[];
|
|
23
|
+
/** Wat PHPStan naast de JSON op stderr zei; leeg als er niets bijzonders was. */
|
|
24
|
+
readonly warnings: readonly string[];
|
|
21
25
|
readonly totals: {
|
|
22
26
|
readonly fileErrors: number;
|
|
23
27
|
readonly generalErrors: number;
|
|
@@ -29,6 +33,8 @@ export interface AnalyseOptions {
|
|
|
29
33
|
readonly paths?: readonly string[];
|
|
30
34
|
/** Level-override, 0 t/m 10 of "max". */
|
|
31
35
|
readonly level?: string;
|
|
36
|
+
/** Absoluut pad naar een ander configbestand dan dat PHPStan zelf zou vinden. */
|
|
37
|
+
readonly config?: string;
|
|
32
38
|
readonly memoryLimit?: string;
|
|
33
39
|
readonly timeoutMs?: number;
|
|
34
40
|
}
|
|
@@ -43,3 +49,18 @@ export declare class PhpstanError extends Error {
|
|
|
43
49
|
* overheen. Verschillende projecten draaien wél parallel.
|
|
44
50
|
*/
|
|
45
51
|
export declare function analyse(project: ResolvedProject, options?: AnalyseOptions): Promise<AnalysisResult>;
|
|
52
|
+
/**
|
|
53
|
+
* Leest de standaard geheugenlimiet uit de omgeving. Een onbruikbare waarde wordt
|
|
54
|
+
* hier al geweigerd en niet aan PHPStan doorgegeven: die zou er per analyse op
|
|
55
|
+
* klappen met een melding die "memory limit" bevat, waarna describeFailure het
|
|
56
|
+
* model aanraadt een limiet mee te geven — precies het verkeerde advies, want de
|
|
57
|
+
* fout zit in de serverconfiguratie en niet in de aanroep.
|
|
58
|
+
*/
|
|
59
|
+
export declare function loadDefaultMemoryLimit(env?: NodeJS.ProcessEnv): string | undefined;
|
|
60
|
+
/**
|
|
61
|
+
* Haalt uit stderr wat het model moet weten bij een gelúkte analyse. Dit werd eerder
|
|
62
|
+
* helemaal weggegooid zodra de JSON parseerde — en juist daar staat PHPStans
|
|
63
|
+
* "Result is incomplete because of severe errors.": geldige JSON die het project niet
|
|
64
|
+
* volledig dekt. Zonder deze regels leest een model een schone uitslag die dat niet is.
|
|
65
|
+
*/
|
|
66
|
+
export declare function collectWarnings(stderr: string): string[];
|
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
|
}
|
|
@@ -38,15 +44,38 @@ async function run(project, options) {
|
|
|
38
44
|
// problemen ín de JSON. De exit code alleen is dus geen betrouwbaar signaal.
|
|
39
45
|
const parsed = tryParse(execution.stdout);
|
|
40
46
|
if (parsed !== null)
|
|
41
|
-
return toResult(project.path, parsed);
|
|
47
|
+
return toResult(project.path, parsed, collectWarnings(execution.stderr));
|
|
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
|
-
|
|
49
|
-
|
|
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 ?? [];
|
|
@@ -157,7 +186,25 @@ function tryParse(stdout) {
|
|
|
157
186
|
const parsed = outputSchema.safeParse(raw);
|
|
158
187
|
return parsed.success ? parsed.data : null;
|
|
159
188
|
}
|
|
160
|
-
|
|
189
|
+
/**
|
|
190
|
+
* Regels op stderr die geen waarschuwing zijn. Bewust een lijst van wat ongevaarlijk
|
|
191
|
+
* is en niet van wat alarmerend is: PHPStan kan meldingen introduceren die we hier
|
|
192
|
+
* niet kennen, en die stil laten vallen is precies de fout die dit moet voorkomen.
|
|
193
|
+
*/
|
|
194
|
+
const HARMLESS_STDERR = [/^Note: /];
|
|
195
|
+
/**
|
|
196
|
+
* Haalt uit stderr wat het model moet weten bij een gelúkte analyse. Dit werd eerder
|
|
197
|
+
* helemaal weggegooid zodra de JSON parseerde — en juist daar staat PHPStans
|
|
198
|
+
* "Result is incomplete because of severe errors.": geldige JSON die het project niet
|
|
199
|
+
* volledig dekt. Zonder deze regels leest een model een schone uitslag die dat niet is.
|
|
200
|
+
*/
|
|
201
|
+
export function collectWarnings(stderr) {
|
|
202
|
+
return stderr
|
|
203
|
+
.split('\n')
|
|
204
|
+
.map((line) => line.trim())
|
|
205
|
+
.filter((line) => line !== '' && !HARMLESS_STDERR.some((pattern) => pattern.test(line)));
|
|
206
|
+
}
|
|
207
|
+
function toResult(project, output, warnings) {
|
|
161
208
|
const findings = [];
|
|
162
209
|
for (const [file, entry] of Object.entries(output.files)) {
|
|
163
210
|
for (const message of entry.messages) {
|
|
@@ -174,12 +221,21 @@ function toResult(project, output) {
|
|
|
174
221
|
project,
|
|
175
222
|
findings,
|
|
176
223
|
generalErrors: output.errors,
|
|
224
|
+
warnings,
|
|
177
225
|
totals: { fileErrors: output.totals.file_errors, generalErrors: output.totals.errors },
|
|
178
226
|
};
|
|
179
227
|
}
|
|
180
228
|
/** Vertaalt een run die geen bruikbare JSON opleverde naar iets waar je wat mee kunt. */
|
|
181
229
|
function describeFailure(project, execution) {
|
|
182
230
|
const details = (execution.stderr.trim() || execution.stdout.trim()).slice(0, 2000);
|
|
231
|
+
// "Invalid memory limit format" bevat óók "memory limit", maar is een afgekeurde
|
|
232
|
+
// waarde en geen volgelopen geheugen. Eerst afvangen, anders krijgt het model de
|
|
233
|
+
// raad een limiet mee te geven die het net al meegaf.
|
|
234
|
+
if (/invalid memory limit/i.test(details)) {
|
|
235
|
+
return (`PHPStan accepteerde de meegegeven geheugenlimiet niet in ${project.path}. ` +
|
|
236
|
+
`Controleer memoryLimit of ${MEMORY_LIMIT_ENV_VAR}.\n\n` +
|
|
237
|
+
details);
|
|
238
|
+
}
|
|
183
239
|
// PHPStan meldt dit op twee manieren: PHP's eigen "Allowed memory size ...
|
|
184
240
|
// exhausted", en PHPStans eigen "reached configured PHP memory limit: 128M".
|
|
185
241
|
if (/allowed memory size|memory[_ ]limit/i.test(details)) {
|
package/dist/phpstan.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"phpstan.js","sourceRoot":"","sources":["../src/phpstan.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,yDAAyD;AACzD,MAAM,CAAC,MAAM,kBAAkB,GAAG,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"phpstan.js","sourceRoot":"","sources":["../src/phpstan.ts"],"names":[],"mappings":"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"}
|
package/dist/report.d.ts
CHANGED
|
@@ -3,6 +3,12 @@ import type { AnalysisResult, Finding } from './phpstan.js';
|
|
|
3
3
|
export declare const DEFAULT_LIMIT = 50;
|
|
4
4
|
/** Bovengrens, zodat één aanroep de context niet alsnog kan vullen. */
|
|
5
5
|
export declare const MAX_LIMIT = 500;
|
|
6
|
+
/**
|
|
7
|
+
* Hoeveel losse meldingen (waarschuwingen, algemene fouten) er hoogstens mee gaan.
|
|
8
|
+
* Onbegrensd doorgeven was een contextbom: een mislukte Laravel-bootstrap levert een
|
|
9
|
+
* lap tekst op, en die kwam integraal in het antwoord terecht.
|
|
10
|
+
*/
|
|
11
|
+
export declare const MAX_MESSAGES = 10;
|
|
6
12
|
/** Een bevinding zoals ze naar buiten gaat: pad relatief waar dat kan. */
|
|
7
13
|
export interface DisplayFinding extends Omit<Finding, 'file'> {
|
|
8
14
|
readonly file: string;
|
|
@@ -27,19 +33,38 @@ export interface Summary {
|
|
|
27
33
|
count: number;
|
|
28
34
|
}[];
|
|
29
35
|
}
|
|
36
|
+
/** Hoeveel meldingen er weggelaten zijn omdat het er te veel waren. */
|
|
37
|
+
export interface Omitted {
|
|
38
|
+
readonly warnings: number;
|
|
39
|
+
readonly generalErrors: number;
|
|
40
|
+
}
|
|
30
41
|
/** Het volledige antwoord van een analyse-tool. */
|
|
31
42
|
export interface Report {
|
|
32
43
|
readonly project: string;
|
|
33
44
|
readonly totals: AnalysisResult['totals'];
|
|
34
45
|
readonly generalErrors: readonly string[];
|
|
46
|
+
/**
|
|
47
|
+
* Wat PHPStan naast het resultaat meldde — een onvolledige analyse bijvoorbeeld.
|
|
48
|
+
* Staat los van generalErrors: dat is PHPStans eigen `errors`-array.
|
|
49
|
+
*/
|
|
50
|
+
readonly warnings: readonly string[];
|
|
51
|
+
readonly omitted: Omitted;
|
|
35
52
|
readonly summary: Summary;
|
|
36
53
|
readonly findings: readonly DisplayFinding[];
|
|
37
54
|
readonly page: Page;
|
|
55
|
+
/** Op welke identifiers de pagina beperkt is, of null als er niet gefilterd is. */
|
|
56
|
+
readonly filter: readonly string[] | null;
|
|
38
57
|
}
|
|
39
58
|
/** Waar in de bevindingenlijst dit antwoord begint en hoe lang het is. */
|
|
40
59
|
export interface Window {
|
|
41
60
|
readonly offset?: number | undefined;
|
|
42
61
|
readonly limit?: number | undefined;
|
|
62
|
+
/**
|
|
63
|
+
* Alleen bevindingen met deze identifiers in de pagina. Een waarde matcht exact
|
|
64
|
+
* ("argument.type") of als groep ("argument" matcht "argument.type", maar niet
|
|
65
|
+
* "argumentx.iets"). De samenvatting blijft over álles rekenen.
|
|
66
|
+
*/
|
|
67
|
+
readonly identifiers?: readonly string[] | undefined;
|
|
43
68
|
}
|
|
44
69
|
/**
|
|
45
70
|
* Zet een analyse om in het antwoord dat de tool teruggeeft: tellingen over alles,
|
package/dist/report.js
CHANGED
|
@@ -5,6 +5,14 @@ export const DEFAULT_LIMIT = 50;
|
|
|
5
5
|
export const MAX_LIMIT = 500;
|
|
6
6
|
/** Hoeveel regels de samenvattingslijsten hoogstens tonen. */
|
|
7
7
|
const SUMMARY_ROWS = 15;
|
|
8
|
+
/**
|
|
9
|
+
* Hoeveel losse meldingen (waarschuwingen, algemene fouten) er hoogstens mee gaan.
|
|
10
|
+
* Onbegrensd doorgeven was een contextbom: een mislukte Laravel-bootstrap levert een
|
|
11
|
+
* lap tekst op, en die kwam integraal in het antwoord terecht.
|
|
12
|
+
*/
|
|
13
|
+
export const MAX_MESSAGES = 10;
|
|
14
|
+
/** Hoe lang één melding mag zijn. Zelfde orde als de details in describeFailure. */
|
|
15
|
+
const MAX_MESSAGE_CHARS = 1000;
|
|
8
16
|
/**
|
|
9
17
|
* Zet een analyse om in het antwoord dat de tool teruggeeft: tellingen over alles,
|
|
10
18
|
* en maar één pagina bevindingen. De samenvatting rekent bewust over de volledige
|
|
@@ -15,38 +23,90 @@ export function buildReport(result, window = {}) {
|
|
|
15
23
|
...finding,
|
|
16
24
|
file: displayPath(result.project, finding.file),
|
|
17
25
|
}));
|
|
26
|
+
// Filteren vóór het pagineren, maar ná het samenvatten: page.total moet de
|
|
27
|
+
// gefilterde lijst beschrijven, anders liegen offset en hasMore. De samenvatting
|
|
28
|
+
// rekent over alles, zodat het model ziet wat het met een filter wegliet.
|
|
29
|
+
const filter = normaliseFilter(window.identifiers);
|
|
30
|
+
const selected = filter === null ? all : all.filter((finding) => matches(finding, filter));
|
|
18
31
|
const limit = clamp(window.limit ?? DEFAULT_LIMIT, 1, MAX_LIMIT);
|
|
19
|
-
const offset = clamp(window.offset ?? 0, 0, Math.max(
|
|
20
|
-
const findings =
|
|
32
|
+
const offset = clamp(window.offset ?? 0, 0, Math.max(selected.length, 0));
|
|
33
|
+
const findings = selected.slice(offset, offset + limit);
|
|
34
|
+
const warnings = limitMessages(result.warnings);
|
|
35
|
+
const generalErrors = limitMessages(result.generalErrors);
|
|
21
36
|
return {
|
|
22
37
|
project: result.project,
|
|
23
38
|
totals: result.totals,
|
|
24
|
-
generalErrors:
|
|
39
|
+
generalErrors: generalErrors.kept,
|
|
40
|
+
warnings: warnings.kept,
|
|
41
|
+
omitted: { warnings: warnings.omitted, generalErrors: generalErrors.omitted },
|
|
25
42
|
summary: summarise(all),
|
|
26
43
|
findings,
|
|
27
44
|
page: {
|
|
28
45
|
offset,
|
|
29
46
|
limit,
|
|
30
47
|
returned: findings.length,
|
|
31
|
-
total:
|
|
32
|
-
hasMore: offset + findings.length <
|
|
48
|
+
total: selected.length,
|
|
49
|
+
hasMore: offset + findings.length < selected.length,
|
|
33
50
|
},
|
|
51
|
+
filter,
|
|
34
52
|
};
|
|
35
53
|
}
|
|
54
|
+
/** Lege of alleen-witruimte-waarden vallen weg; blijft er niets over, dan is er geen filter. */
|
|
55
|
+
function normaliseFilter(identifiers) {
|
|
56
|
+
if (identifiers === undefined)
|
|
57
|
+
return null;
|
|
58
|
+
const cleaned = [...new Set(identifiers.map((value) => value.trim()).filter((value) => value !== ''))];
|
|
59
|
+
return cleaned.length === 0 ? null : cleaned;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Exact, of als groep op een punt. Op `startsWith` alleen matchen zou "argument"
|
|
63
|
+
* ook op "argumentx.iets" laten passen — dezelfde valkuil als bij de
|
|
64
|
+
* containment-check op paden.
|
|
65
|
+
*/
|
|
66
|
+
function matches(finding, filter) {
|
|
67
|
+
if (finding.identifier === null)
|
|
68
|
+
return false;
|
|
69
|
+
const identifier = finding.identifier;
|
|
70
|
+
return filter.some((value) => identifier === value || identifier.startsWith(`${value}.`));
|
|
71
|
+
}
|
|
36
72
|
/** Schrijft een rapport uit als tekst voor het model. */
|
|
37
73
|
export function renderReport(report) {
|
|
38
74
|
const lines = [];
|
|
75
|
+
// Bovenaan, vóór de fouten: dit bepaalt of je de uitslag hieronder mag vertrouwen.
|
|
76
|
+
if (report.warnings.length > 0) {
|
|
77
|
+
lines.push('LET OP — PHPStan meldde dit naast het resultaat:');
|
|
78
|
+
for (const warning of report.warnings)
|
|
79
|
+
lines.push(`- ${warning}`);
|
|
80
|
+
if (report.omitted.warnings > 0)
|
|
81
|
+
lines.push(`- (nog ${report.omitted.warnings} melding(en) niet getoond)`);
|
|
82
|
+
lines.push('');
|
|
83
|
+
}
|
|
39
84
|
if (report.generalErrors.length > 0) {
|
|
40
85
|
lines.push('Fouten buiten de bestanden om:');
|
|
41
86
|
for (const error of report.generalErrors)
|
|
42
87
|
lines.push(`- ${error}`);
|
|
88
|
+
if (report.omitted.generalErrors > 0) {
|
|
89
|
+
lines.push(`- (nog ${report.omitted.generalErrors} fout(en) niet getoond)`);
|
|
90
|
+
}
|
|
43
91
|
lines.push('');
|
|
44
92
|
}
|
|
45
93
|
if (report.page.total === 0) {
|
|
46
|
-
|
|
94
|
+
if (report.filter !== null && report.totals.fileErrors > 0) {
|
|
95
|
+
lines.push(`Geen bevindingen met identifier ${report.filter.join(', ')}, ` +
|
|
96
|
+
`terwijl er ${report.totals.fileErrors} andere bevinding(en) zijn.`);
|
|
97
|
+
return lines.join('\n');
|
|
98
|
+
}
|
|
99
|
+
lines.push(report.generalErrors.length === 0 && report.warnings.length === 0
|
|
100
|
+
? 'Geen bevindingen.'
|
|
101
|
+
: 'Verder geen bevindingen.');
|
|
47
102
|
return lines.join('\n');
|
|
48
103
|
}
|
|
49
|
-
lines.push(
|
|
104
|
+
lines.push(report.filter === null
|
|
105
|
+
? `${report.page.total} bevinding(en) in ${report.summary.filesWithFindings} bestand(en).`
|
|
106
|
+
: `${report.page.total} bevinding(en) met identifier ${report.filter.join(', ')}, ` +
|
|
107
|
+
`van ${report.totals.fileErrors} in totaal.`, '', report.filter === null
|
|
108
|
+
? 'Meest voorkomend:'
|
|
109
|
+
: 'Meest voorkomend (over álle bevindingen, ook de weggefilterde):', ...report.summary.byIdentifier.map((row) => ` ${pad(row.count)} ${row.identifier}`));
|
|
50
110
|
if (report.summary.byFile.length > 1) {
|
|
51
111
|
lines.push('', 'Zwaarst getroffen bestanden:', ...report.summary.byFile.map((row) => ` ${pad(row.count)} ${row.file}`));
|
|
52
112
|
}
|
|
@@ -70,6 +130,23 @@ export function renderReport(report) {
|
|
|
70
130
|
}
|
|
71
131
|
return lines.join('\n');
|
|
72
132
|
}
|
|
133
|
+
/**
|
|
134
|
+
* Kapt een meldinglijst af op aantal en op lengte per melding. Het aantal
|
|
135
|
+
* weggelaten meldingen komt apart terug in plaats van als extra regel in de lijst:
|
|
136
|
+
* die lijst gaat ook als structuredContent naar buiten, en daar hoort geen
|
|
137
|
+
* verzonnen melding tussen te staan.
|
|
138
|
+
*/
|
|
139
|
+
function limitMessages(messages) {
|
|
140
|
+
return {
|
|
141
|
+
kept: messages.slice(0, MAX_MESSAGES).map(truncate),
|
|
142
|
+
omitted: Math.max(messages.length - MAX_MESSAGES, 0),
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
function truncate(message) {
|
|
146
|
+
return message.length <= MAX_MESSAGE_CHARS
|
|
147
|
+
? message
|
|
148
|
+
: `${message.slice(0, MAX_MESSAGE_CHARS)}… (afgekapt)`;
|
|
149
|
+
}
|
|
73
150
|
function summarise(findings) {
|
|
74
151
|
const perFile = new Map();
|
|
75
152
|
const perIdentifier = new Map();
|
package/dist/report.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"report.js","sourceRoot":"","sources":["../src/report.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAGjD,qDAAqD;AACrD,MAAM,CAAC,MAAM,aAAa,GAAG,EAAE,CAAC;AAEhC,uEAAuE;AACvE,MAAM,CAAC,MAAM,SAAS,GAAG,GAAG,CAAC;AAE7B,8DAA8D;AAC9D,MAAM,YAAY,GAAG,EAAE,CAAC;
|
|
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.
|
|
8
|
+
export declare const VERSION = "0.3.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.
|
|
8
|
+
export const VERSION = '0.3.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
|
/**
|
|
@@ -25,6 +26,13 @@ const analysisShape = {
|
|
|
25
26
|
generalErrors: z
|
|
26
27
|
.array(z.string())
|
|
27
28
|
.describe('Fouten die niet aan een bestand hangen, zoals een crash of configuratiefout'),
|
|
29
|
+
warnings: z
|
|
30
|
+
.array(z.string())
|
|
31
|
+
.describe('Wat PHPStan naast het resultaat meldde. Staat hier "Result is incomplete", dan ' +
|
|
32
|
+
'dekt de analyse niet het hele project en is een schone uitslag geen bewijs'),
|
|
33
|
+
omitted: z
|
|
34
|
+
.object({ warnings: z.number(), generalErrors: z.number() })
|
|
35
|
+
.describe('Hoeveel meldingen weggelaten zijn omdat het er te veel waren'),
|
|
28
36
|
summary: z
|
|
29
37
|
.object({
|
|
30
38
|
filesWithFindings: z.number(),
|
|
@@ -48,8 +56,19 @@ const analysisShape = {
|
|
|
48
56
|
hasMore: z.boolean(),
|
|
49
57
|
})
|
|
50
58
|
.describe('Welk deel van de bevindingen dit antwoord bevat'),
|
|
59
|
+
filter: nullable(z.array(z.string())).describe('Op welke identifiers deze pagina beperkt is, of null als er niet gefilterd is'),
|
|
51
60
|
};
|
|
61
|
+
const configArgument = z
|
|
62
|
+
.string()
|
|
63
|
+
.optional()
|
|
64
|
+
.describe('Ander configbestand dan PHPStan zelf zou pakken, bijv. "phpstan-strict.neon". ' +
|
|
65
|
+
'Moet binnen het project liggen');
|
|
52
66
|
const windowShape = {
|
|
67
|
+
identifiers: z
|
|
68
|
+
.array(z.string())
|
|
69
|
+
.optional()
|
|
70
|
+
.describe('Beperk de bevindingen tot deze identifiers, bijv. ["argument.type"]. ' +
|
|
71
|
+
'"missingType" matcht de hele groep. De samenvatting blijft over alles tellen'),
|
|
53
72
|
offset: z.number().int().min(0).optional().describe('Sla de eerste N bevindingen over'),
|
|
54
73
|
limit: z
|
|
55
74
|
.number()
|
|
@@ -64,6 +83,7 @@ export function registerTools(server, roots) {
|
|
|
64
83
|
registerListProjects(server, roots);
|
|
65
84
|
registerAnalyseProject(server, roots);
|
|
66
85
|
registerAnalyseFile(server, roots);
|
|
86
|
+
registerAnalyseChanged(server, roots);
|
|
67
87
|
registerBaselineSummary(server, roots);
|
|
68
88
|
}
|
|
69
89
|
function registerBaselineSummary(server, roots) {
|
|
@@ -140,18 +160,86 @@ function registerAnalyseProject(server, roots) {
|
|
|
140
160
|
.optional()
|
|
141
161
|
.describe('Paden binnen het project; leeg betekent: volg de configuratie'),
|
|
142
162
|
level: z.string().optional().describe('Level-override, 0 t/m 10 of "max"'),
|
|
143
|
-
|
|
163
|
+
config: configArgument,
|
|
164
|
+
memoryLimit: z
|
|
165
|
+
.string()
|
|
166
|
+
.optional()
|
|
167
|
+
.describe('Bijv. "1G", als PHPStan op de PHP-limiet klapt; overrulet de serverstandaard'),
|
|
144
168
|
timeoutSeconds: z.number().int().positive().max(1800).optional(),
|
|
145
169
|
...windowShape,
|
|
146
170
|
},
|
|
147
171
|
outputSchema: analysisShape,
|
|
148
172
|
annotations: readOnly(),
|
|
149
|
-
}, async (
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
173
|
+
}, async (args) => runAnalysis(roots, args.project, (resolved) => ({
|
|
174
|
+
options: {
|
|
175
|
+
// Elk pad door resolveWithin, ook al komt het rechtstreeks uit de
|
|
176
|
+
// aanroep. Ongefilterd doorgeven was op twee manieren mis: een pad
|
|
177
|
+
// buiten het project liet PHPStan bestanden lezen waar de whitelist
|
|
178
|
+
// juist over gaat, en een "pad" als --generate-baseline=x werd door
|
|
179
|
+
// PHPStan als vlag gelezen en schreef dat bestand echt weg
|
|
180
|
+
// (nagemeten). Na resolveWithin is elk pad absoluut en bestaat het,
|
|
181
|
+
// dus het kan geen vlag meer zijn.
|
|
182
|
+
...(args.paths === undefined
|
|
183
|
+
? {}
|
|
184
|
+
: { paths: args.paths.map((path) => resolveWithin(resolved, path)) }),
|
|
185
|
+
...common(resolved, args),
|
|
186
|
+
},
|
|
187
|
+
}), window(args)));
|
|
188
|
+
}
|
|
189
|
+
function registerAnalyseChanged(server, roots) {
|
|
190
|
+
server.registerTool('analyse_changed', {
|
|
191
|
+
title: 'Gewijzigde bestanden analyseren',
|
|
192
|
+
description: 'Draait PHPStan over de PHP-bestanden die in dit project gewijzigd zijn volgens git, ' +
|
|
193
|
+
'inclusief bestanden die nog niet toegevoegd zijn. Bedoeld om te zien of een eigen ' +
|
|
194
|
+
'wijziging fouten oplevert, zonder het hele project door te rekenen. Vergelijkt ' +
|
|
195
|
+
`standaard met ${DEFAULT_BASE}; geef \`base\` mee (bijv. "main") voor de hele branch.`,
|
|
196
|
+
inputSchema: {
|
|
197
|
+
project: projectArgument,
|
|
198
|
+
base: z
|
|
199
|
+
.string()
|
|
200
|
+
.optional()
|
|
201
|
+
.describe(`Commit, branch of tag om tegen te vergelijken (standaard ${DEFAULT_BASE})`),
|
|
202
|
+
level: z.string().optional().describe('Level-override, 0 t/m 10 of "max"'),
|
|
203
|
+
config: configArgument,
|
|
204
|
+
memoryLimit: z.string().optional(),
|
|
205
|
+
timeoutSeconds: z.number().int().positive().max(1800).optional(),
|
|
206
|
+
...windowShape,
|
|
207
|
+
},
|
|
208
|
+
outputSchema: analysisShape,
|
|
209
|
+
annotations: readOnly(),
|
|
210
|
+
}, async (args) => runAnalysis(roots, args.project, async (resolved) => {
|
|
211
|
+
const changed = await changedPhpFiles(resolved, args.base);
|
|
212
|
+
if (changed.files.length === 0) {
|
|
213
|
+
return { nothingToDo: describeNothingChanged(changed) };
|
|
214
|
+
}
|
|
215
|
+
return {
|
|
216
|
+
options: { paths: [...changed.files], ...common(resolved, args) },
|
|
217
|
+
heading: describeChanged(resolved, changed),
|
|
218
|
+
};
|
|
219
|
+
}, window(args)));
|
|
220
|
+
}
|
|
221
|
+
/** Waarom er niets geanalyseerd is; de overgeslagen paden horen daar bij. */
|
|
222
|
+
function describeNothingChanged(changed) {
|
|
223
|
+
const lines = [`Geen gewijzigde PHP-bestanden ten opzichte van ${changed.base}.`];
|
|
224
|
+
if (changed.skipped.length > 0)
|
|
225
|
+
lines.push('', ...skippedLines(changed));
|
|
226
|
+
return lines.join('\n');
|
|
227
|
+
}
|
|
228
|
+
/** Wat er geanalyseerd is, zodat zichtbaar is waarop het rapport eronder betrekking heeft. */
|
|
229
|
+
function describeChanged(resolved, changed) {
|
|
230
|
+
const lines = [
|
|
231
|
+
`${changed.files.length} gewijzigd(e) PHP-bestand(en) ten opzichte van ${changed.base}:`,
|
|
232
|
+
...changed.files.map((file) => ` ${displayPath(resolved.path, file)}`),
|
|
233
|
+
];
|
|
234
|
+
if (changed.skipped.length > 0)
|
|
235
|
+
lines.push('', ...skippedLines(changed));
|
|
236
|
+
return lines.join('\n');
|
|
237
|
+
}
|
|
238
|
+
function skippedLines(changed) {
|
|
239
|
+
return [
|
|
240
|
+
'Overgeslagen, dus niet meegenomen in dit rapport:',
|
|
241
|
+
...changed.skipped.map((entry) => ` ${entry.path}: ${entry.reason}`),
|
|
242
|
+
];
|
|
155
243
|
}
|
|
156
244
|
function registerAnalyseFile(server, roots) {
|
|
157
245
|
server.registerTool('analyse_file', {
|
|
@@ -162,35 +250,72 @@ function registerAnalyseFile(server, roots) {
|
|
|
162
250
|
project: projectArgument,
|
|
163
251
|
path: z.string().describe('Bestand of map binnen het project, bijv. "app/Models/User.php"'),
|
|
164
252
|
level: z.string().optional().describe('Level-override, 0 t/m 10 of "max"'),
|
|
253
|
+
config: configArgument,
|
|
165
254
|
memoryLimit: z.string().optional(),
|
|
166
255
|
timeoutSeconds: z.number().int().positive().max(1800).optional(),
|
|
167
256
|
...windowShape,
|
|
168
257
|
},
|
|
169
258
|
outputSchema: analysisShape,
|
|
170
259
|
annotations: readOnly(),
|
|
171
|
-
}, async (
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
260
|
+
}, async (args) => runAnalysis(roots, args.project, (resolved) => ({
|
|
261
|
+
options: {
|
|
262
|
+
paths: [resolveWithin(resolved, args.path)],
|
|
263
|
+
...common(resolved, args),
|
|
264
|
+
},
|
|
265
|
+
}), window(args)));
|
|
266
|
+
}
|
|
267
|
+
/**
|
|
268
|
+
* Zet de gedeelde argumenten om in AnalyseOptions. `config` gaat door resolveWithin:
|
|
269
|
+
* een neon mag `bootstrapFiles` en extensies bevatten, dus een vrij te kiezen
|
|
270
|
+
* configpad zou anders een route zijn om willekeurige PHP-code te laten uitvoeren —
|
|
271
|
+
* langs de whitelist heen die `project` juist wél afdwingt.
|
|
272
|
+
*/
|
|
273
|
+
function common(resolved, args) {
|
|
274
|
+
return {
|
|
275
|
+
...(args.level === undefined ? {} : { level: args.level }),
|
|
276
|
+
...(args.config === undefined ? {} : { config: resolveWithin(resolved, args.config) }),
|
|
277
|
+
...(args.memoryLimit === undefined ? {} : { memoryLimit: args.memoryLimit }),
|
|
278
|
+
...(args.timeoutSeconds === undefined ? {} : { timeoutMs: args.timeoutSeconds * 1000 }),
|
|
279
|
+
};
|
|
280
|
+
}
|
|
281
|
+
function window(args) {
|
|
282
|
+
return {
|
|
283
|
+
offset: args.offset,
|
|
284
|
+
limit: args.limit,
|
|
285
|
+
...(args.identifiers === undefined ? {} : { identifiers: args.identifiers }),
|
|
286
|
+
};
|
|
186
287
|
}
|
|
187
|
-
|
|
288
|
+
/**
|
|
289
|
+
* Resolvet het project één keer en geeft het aan `plan`, zodat een tool die zelf nog
|
|
290
|
+
* paden binnen dat project moet valideren dat op hetzelfde geresolvede project doet.
|
|
291
|
+
* Eerder resolveerde analyse_file het project en deed runAnalysis dat daarna nog
|
|
292
|
+
* een keer.
|
|
293
|
+
*/
|
|
294
|
+
async function runAnalysis(roots, project, plan, window) {
|
|
188
295
|
try {
|
|
189
296
|
const resolved = resolveProject(project, roots);
|
|
190
|
-
const
|
|
297
|
+
const chosen = await plan(resolved);
|
|
298
|
+
if ('nothingToDo' in chosen) {
|
|
299
|
+
// Toch het volledige rapportschema teruggeven: een client die op
|
|
300
|
+
// structuredContent vertrouwt moet niet ineens een ander soort antwoord
|
|
301
|
+
// krijgen omdat er niets te doen was.
|
|
302
|
+
const empty = buildReport({
|
|
303
|
+
project: resolved.path,
|
|
304
|
+
findings: [],
|
|
305
|
+
generalErrors: [],
|
|
306
|
+
warnings: [],
|
|
307
|
+
totals: { fileErrors: 0, generalErrors: 0 },
|
|
308
|
+
}, {});
|
|
309
|
+
return {
|
|
310
|
+
content: [{ type: 'text', text: chosen.nothingToDo }],
|
|
311
|
+
structuredContent: { ...empty },
|
|
312
|
+
};
|
|
313
|
+
}
|
|
314
|
+
const result = await analyse(resolved, chosen.options);
|
|
191
315
|
const report = buildReport(result, window);
|
|
316
|
+
const heading = chosen.heading === undefined ? '' : `${chosen.heading}\n\n`;
|
|
192
317
|
return {
|
|
193
|
-
content: [{ type: 'text', text: renderReport(report) }],
|
|
318
|
+
content: [{ type: 'text', text: heading + renderReport(report) }],
|
|
194
319
|
structuredContent: { ...report },
|
|
195
320
|
};
|
|
196
321
|
}
|
|
@@ -226,7 +351,10 @@ function readOnly() {
|
|
|
226
351
|
return { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false };
|
|
227
352
|
}
|
|
228
353
|
function toFailure(error) {
|
|
229
|
-
if (error instanceof ProjectError ||
|
|
354
|
+
if (error instanceof ProjectError ||
|
|
355
|
+
error instanceof PhpstanError ||
|
|
356
|
+
error instanceof BaselineError ||
|
|
357
|
+
error instanceof GitError) {
|
|
230
358
|
return failure(error.message);
|
|
231
359
|
}
|
|
232
360
|
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":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAEjF,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAEvE,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAErD,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,WAAW,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE/F,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAE7F,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAS3C;;;;;;;;GAQG;AACH,SAAS,QAAQ,CAAsB,MAAS;IAC9C,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAC5C,CAAC;AAED,MAAM,eAAe,GAAG,CAAC;KACtB,MAAM,EAAE;KACR,QAAQ,CAAC,sEAAsE,CAAC,CAAC;AAEpF,MAAM,aAAa,GAAG;IACpB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;IACnB,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC;IACvE,aAAa,EAAE,CAAC;SACb,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;SACjB,QAAQ,CAAC,6EAA6E,CAAC;IAC1F,QAAQ,EAAE,CAAC;SACR,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;SACjB,QAAQ,CACP,iFAAiF;QAC/E,4EAA4E,CAC/E;IACH,OAAO,EAAE,CAAC;SACP,MAAM,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC;SAC3D,QAAQ,CAAC,8DAA8D,CAAC;IAC3E,OAAO,EAAE,CAAC;SACP,MAAM,CAAC;QACN,iBAAiB,EAAE,CAAC,CAAC,MAAM,EAAE;QAC7B,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QAClE,YAAY,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;KAC/E,CAAC;SACD,QAAQ,CAAC,oEAAoE,CAAC;IACjF,QAAQ,EAAE,CAAC,CAAC,KAAK,CACf,CAAC,CAAC,MAAM,CAAC;QACP,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,iCAAiC,CAAC;QAC5D,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;QAC1B,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;QACnB,UAAU,EAAE,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;QAChC,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;KAC1B,CAAC,CACH;IACD,IAAI,EAAE,CAAC;SACJ,MAAM,CAAC;QACN,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE;QAClB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;QACjB,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE;QACpB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;QACjB,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE;KACrB,CAAC;SACD,QAAQ,CAAC,iDAAiD,CAAC;IAC9D,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,QAAQ,CAC5C,+EAA+E,CAChF;CACF,CAAC;AAEF,MAAM,cAAc,GAAG,CAAC;KACrB,MAAM,EAAE;KACR,QAAQ,EAAE;KACV,QAAQ,CACP,gFAAgF;IAC9E,gCAAgC,CACnC,CAAC;AAEJ,MAAM,WAAW,GAAG;IAClB,WAAW,EAAE,CAAC;SACX,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;SACjB,QAAQ,EAAE;SACV,QAAQ,CACP,uEAAuE;QACrE,8EAA8E,CACjF;IACH,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,kCAAkC,CAAC;IACvF,KAAK,EAAE,CAAC;SACL,MAAM,EAAE;SACR,GAAG,EAAE;SACL,GAAG,CAAC,CAAC,CAAC;SACN,GAAG,CAAC,SAAS,CAAC;SACd,QAAQ,EAAE;SACV,QAAQ,CAAC,qDAAqD,MAAM,CAAC,aAAa,CAAC,GAAG,CAAC;CAC3F,CAAC;AAEF,sCAAsC;AACtC,MAAM,UAAU,aAAa,CAAC,MAAiB,EAAE,KAAa;IAC5D,oBAAoB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IACpC,sBAAsB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IACtC,mBAAmB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IACnC,sBAAsB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IACtC,uBAAuB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;AACzC,CAAC;AAED,SAAS,uBAAuB,CAAC,MAAiB,EAAE,KAAa;IAC/D,MAAM,CAAC,YAAY,CACjB,kBAAkB,EAClB;QACE,KAAK,EAAE,sBAAsB;QAC7B,WAAW,EACT,kFAAkF;YAClF,mFAAmF;YACnF,mFAAmF;YACnF,sDAAsD;QACxD,WAAW,EAAE,EAAE,OAAO,EAAE,eAAe,EAAE;QACzC,YAAY,EAAE;YACZ,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;YACnB,KAAK,EAAE,CAAC,CAAC,KAAK,CACZ,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CACxE;YACD,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC;YAC7D,YAAY,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;YAC9E,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;SACnE;QACD,WAAW,EAAE,QAAQ,EAAE;KACxB,EACD,CAAC,EAAE,OAAO,EAAE,EAAc,EAAE;QAC1B,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,iBAAiB,CAAC,cAAc,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;YAClE,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC1D,iBAAiB,EAAE,EAAE,GAAG,OAAO,EAAE;aAClC,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,SAAS,CAAC,KAAK,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC;AAED,SAAS,oBAAoB,CAAC,MAAiB,EAAE,KAAa;IAC5D,MAAM,CAAC,YAAY,CACjB,eAAe,EACf;QACE,KAAK,EAAE,wBAAwB;QAC/B,WAAW,EACT,8EAA8E;YAC9E,iFAAiF;YACjF,4DAA4D;QAC9D,WAAW,EAAE,EAAE;QACf,YAAY,EAAE;YACZ,QAAQ,EAAE,CAAC,CAAC,KAAK,CACf,CAAC,CAAC,MAAM,CAAC;gBACP,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;gBAChB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;gBAChB,UAAU,EAAE,CAAC,CAAC,OAAO,EAAE;gBACvB,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;aAC7B,CAAC,CACH;YACD,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;SACvE;QACD,WAAW,EAAE,QAAQ,EAAE;KACxB,EACD,GAAe,EAAE;QACf,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,OAAO,OAAO,CACZ,kDAAkD,aAAa,SAAS;gBACtE,6EAA6E;gBAC7E,mCAAmC,CACtC,CAAC;QACJ,CAAC;QAED,MAAM,QAAQ,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC;QACzC,MAAM,QAAQ,GAAG,KAAK;aACnB,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,KAAK,IAAI,CAAC;aACvC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,CAAC,OAAiB,EAAE,CAAC,CAAC,CAAC;QAExE,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,CAAC,QAAQ,EAAE,QAAQ,CAAC,EAAE,CAAC;YACrE,iBAAiB,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE;SAC1C,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC;AAED,SAAS,sBAAsB,CAAC,MAAiB,EAAE,KAAa;IAC9D,MAAM,CAAC,YAAY,CACjB,iBAAiB,EACjB;QACE,KAAK,EAAE,oBAAoB;QAC3B,WAAW,EACT,gFAAgF;YAChF,8DAA8D;QAChE,WAAW,EAAE;YACX,OAAO,EAAE,eAAe;YACxB,KAAK,EAAE,CAAC;iBACL,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;iBACjB,QAAQ,EAAE;iBACV,QAAQ,CAAC,+DAA+D,CAAC;YAC5E,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mCAAmC,CAAC;YAC1E,MAAM,EAAE,cAAc;YACtB,WAAW,EAAE,CAAC;iBACX,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CAAC,8EAA8E,CAAC;YAC3F,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE;YAChE,GAAG,WAAW;SACf;QACD,YAAY,EAAE,aAAa;QAC3B,WAAW,EAAE,QAAQ,EAAE;KACxB,EACD,KAAK,EAAE,IAAI,EAAuB,EAAE,CAClC,WAAW,CACT,KAAK,EACL,IAAI,CAAC,OAAO,EACZ,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;QACb,OAAO,EAAE;YACP,kEAAkE;YAClE,mEAAmE;YACnE,oEAAoE;YACpE,oEAAoE;YACpE,2DAA2D;YAC3D,oEAAoE;YACpE,mCAAmC;YACnC,GAAG,CAAC,IAAI,CAAC,KAAK,KAAK,SAAS;gBAC1B,CAAC,CAAC,EAAE;gBACJ,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC;YACvE,GAAG,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC;SAC1B;KACF,CAAC,EACF,MAAM,CAAC,IAAI,CAAC,CACb,CACJ,CAAC;AACJ,CAAC;AAED,SAAS,sBAAsB,CAAC,MAAiB,EAAE,KAAa;IAC9D,MAAM,CAAC,YAAY,CACjB,iBAAiB,EACjB;QACE,KAAK,EAAE,iCAAiC;QACxC,WAAW,EACT,sFAAsF;YACtF,oFAAoF;YACpF,iFAAiF;YACjF,iBAAiB,YAAY,yDAAyD;QACxF,WAAW,EAAE;YACX,OAAO,EAAE,eAAe;YACxB,IAAI,EAAE,CAAC;iBACJ,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CAAC,4DAA4D,YAAY,GAAG,CAAC;YACxF,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mCAAmC,CAAC;YAC1E,MAAM,EAAE,cAAc;YACtB,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;YAClC,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE;YAChE,GAAG,WAAW;SACf;QACD,YAAY,EAAE,aAAa;QAC3B,WAAW,EAAE,QAAQ,EAAE;KACxB,EACD,KAAK,EAAE,IAAI,EAAuB,EAAE,CAClC,WAAW,CACT,KAAK,EACL,IAAI,CAAC,OAAO,EACZ,KAAK,EAAE,QAAQ,EAAE,EAAE;QACjB,MAAM,OAAO,GAAG,MAAM,eAAe,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QAE3D,IAAI,OAAO,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC/B,OAAO,EAAE,WAAW,EAAE,sBAAsB,CAAC,OAAO,CAAC,EAAE,CAAC;QAC1D,CAAC;QAED,OAAO;YACL,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,EAAE,GAAG,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,EAAE;YACjE,OAAO,EAAE,eAAe,CAAC,QAAQ,EAAE,OAAO,CAAC;SAC5C,CAAC;IACJ,CAAC,EACD,MAAM,CAAC,IAAI,CAAC,CACb,CACJ,CAAC;AACJ,CAAC;AAED,6EAA6E;AAC7E,SAAS,sBAAsB,CAAC,OAAqB;IACnD,MAAM,KAAK,GAAG,CAAC,kDAAkD,OAAO,CAAC,IAAI,GAAG,CAAC,CAAC;IAClF,IAAI,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC;QAAE,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC;IACzE,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,8FAA8F;AAC9F,SAAS,eAAe,CAAC,QAAyB,EAAE,OAAqB;IACvE,MAAM,KAAK,GAAG;QACZ,GAAG,OAAO,CAAC,KAAK,CAAC,MAAM,kDAAkD,OAAO,CAAC,IAAI,GAAG;QACxF,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,WAAW,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC;KACxE,CAAC;IAEF,IAAI,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC;QAAE,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC;IACzE,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,SAAS,YAAY,CAAC,OAAqB;IACzC,OAAO;QACL,mDAAmD;QACnD,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,MAAM,EAAE,CAAC;KACtE,CAAC;AACJ,CAAC;AAED,SAAS,mBAAmB,CAAC,MAAiB,EAAE,KAAa;IAC3D,MAAM,CAAC,YAAY,CACjB,cAAc,EACd;QACE,KAAK,EAAE,2BAA2B;QAClC,WAAW,EACT,kFAAkF;YAClF,2EAA2E;QAC7E,WAAW,EAAE;YACX,OAAO,EAAE,eAAe;YACxB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,gEAAgE,CAAC;YAC3F,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mCAAmC,CAAC;YAC1E,MAAM,EAAE,cAAc;YACtB,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;YAClC,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE;YAChE,GAAG,WAAW;SACf;QACD,YAAY,EAAE,aAAa;QAC3B,WAAW,EAAE,QAAQ,EAAE;KACxB,EACD,KAAK,EAAE,IAAI,EAAuB,EAAE,CAClC,WAAW,CACT,KAAK,EACL,IAAI,CAAC,OAAO,EACZ,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;QACb,OAAO,EAAE;YACP,KAAK,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;YAC3C,GAAG,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC;SAC1B;KACF,CAAC,EACF,MAAM,CAAC,IAAI,CAAC,CACb,CACJ,CAAC;AACJ,CAAC;AAaD;;;;;GAKG;AACH,SAAS,MAAM,CAAC,QAAyB,EAAE,IAAgB;IACzD,OAAO;QACL,GAAG,CAAC,IAAI,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;QAC1D,GAAG,CAAC,IAAI,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QACtF,GAAG,CAAC,IAAI,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC;QAC5E,GAAG,CAAC,IAAI,CAAC,cAAc,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,cAAc,GAAG,IAAI,EAAE,CAAC;KACxF,CAAC;AACJ,CAAC;AAED,SAAS,MAAM,CAAC,IAAqG;IACnH,OAAO;QACL,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,GAAG,CAAC,IAAI,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC;KAC7E,CAAC;AACJ,CAAC;AAWD;;;;;GAKG;AACH,KAAK,UAAU,WAAW,CACxB,KAAa,EACb,OAAe,EACf,IAAyD,EACzD,MAAc;IAEd,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,cAAc,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QAChD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,CAAC;QAEpC,IAAI,aAAa,IAAI,MAAM,EAAE,CAAC;YAC5B,iEAAiE;YACjE,wEAAwE;YACxE,sCAAsC;YACtC,MAAM,KAAK,GAAG,WAAW,CACvB;gBACE,OAAO,EAAE,QAAQ,CAAC,IAAI;gBACtB,QAAQ,EAAE,EAAE;gBACZ,aAAa,EAAE,EAAE;gBACjB,QAAQ,EAAE,EAAE;gBACZ,MAAM,EAAE,EAAE,UAAU,EAAE,CAAC,EAAE,aAAa,EAAE,CAAC,EAAE;aAC5C,EACD,EAAE,CACH,CAAC;YACF,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,WAAW,EAAE,CAAC;gBACrD,iBAAiB,EAAE,EAAE,GAAG,KAAK,EAAE;aAChC,CAAC;QACJ,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,QAAQ,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;QACvD,MAAM,MAAM,GAAG,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAC3C,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,OAAO,MAAM,CAAC;QAE5E,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC;YACjE,iBAAiB,EAAE,EAAE,GAAG,MAAM,EAAE;SACjC,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,SAAS,CAAC,KAAK,CAAC,CAAC;IAC1B,CAAC;AACH,CAAC;AAED,SAAS,cAAc,CACrB,QAAiF,EACjF,QAAsD;IAEtD,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,KAAK,CAAC,IAAI,CAAC,8DAA8D,CAAC,CAAC;IAC7E,CAAC;SAAM,CAAC;QACN,KAAK,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,MAAM,eAAe,CAAC,CAAC;QAC9C,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,aAAa,CAAC;YAC/C,MAAM,OAAO,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,4BAA4B,CAAC;YACvF,KAAK,CAAC,IAAI,CAAC,KAAK,OAAO,CAAC,IAAI,KAAK,OAAO,KAAK,MAAM,GAAG,CAAC,CAAC;QAC1D,CAAC;IACH,CAAC;IAED,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,0CAA0C,CAAC,CAAC;QAC3D,KAAK,MAAM,OAAO,IAAI,QAAQ;YAAE,KAAK,CAAC,IAAI,CAAC,KAAK,OAAO,CAAC,IAAI,KAAK,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;IACtF,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED;;;GAGG;AACH,SAAS,QAAQ;IACf,OAAO,EAAE,YAAY,EAAE,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,CAAC;AACpG,CAAC;AAED,SAAS,SAAS,CAAC,KAAc;IAC/B,IACE,KAAK,YAAY,YAAY;QAC7B,KAAK,YAAY,YAAY;QAC7B,KAAK,YAAY,aAAa;QAC9B,KAAK,YAAY,QAAQ,EACzB,CAAC;QACD,OAAO,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAChC,CAAC;IACD,MAAM,KAAK,CAAC;AACd,CAAC;AAED,SAAS,OAAO,CAAC,IAAY;IAC3B,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;AAC9D,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "phpstan-mcp-mx",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.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",
|