phpstan-mcp-mx 0.13.0 → 0.15.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (58) hide show
  1. package/CHANGELOG.md +28 -0
  2. package/README.md +135 -7
  3. package/dist/baseline.d.ts +19 -0
  4. package/dist/baseline.js +44 -11
  5. package/dist/baseline.js.map +1 -1
  6. package/dist/config.d.ts +14 -2
  7. package/dist/config.js +20 -2
  8. package/dist/config.js.map +1 -1
  9. package/dist/defaults.d.ts +37 -0
  10. package/dist/defaults.js +100 -0
  11. package/dist/defaults.js.map +1 -0
  12. package/dist/failure.d.ts +1 -1
  13. package/dist/failure.js.map +1 -1
  14. package/dist/index.js +17 -1
  15. package/dist/index.js.map +1 -1
  16. package/dist/phpstan/process.d.ts +6 -0
  17. package/dist/phpstan/process.js +8 -1
  18. package/dist/phpstan/process.js.map +1 -1
  19. package/dist/phpstan.d.ts +1 -1
  20. package/dist/phpstan.js +106 -41
  21. package/dist/phpstan.js.map +1 -1
  22. package/dist/project.d.ts +10 -1
  23. package/dist/project.js +28 -1
  24. package/dist/project.js.map +1 -1
  25. package/dist/report.d.ts +15 -2
  26. package/dist/report.js +12 -5
  27. package/dist/report.js.map +1 -1
  28. package/dist/runner.d.ts +19 -4
  29. package/dist/runner.js +48 -18
  30. package/dist/runner.js.map +1 -1
  31. package/dist/runs.d.ts +59 -0
  32. package/dist/runs.js +78 -0
  33. package/dist/runs.js.map +1 -0
  34. package/dist/schema-dialect.d.ts +30 -0
  35. package/dist/schema-dialect.js +57 -0
  36. package/dist/schema-dialect.js.map +1 -0
  37. package/dist/server.js +5 -0
  38. package/dist/server.js.map +1 -1
  39. package/dist/tools/analysis.d.ts +4 -3
  40. package/dist/tools/analysis.js +26 -6
  41. package/dist/tools/analysis.js.map +1 -1
  42. package/dist/tools/inspect.d.ts +2 -0
  43. package/dist/tools/inspect.js +144 -2
  44. package/dist/tools/inspect.js.map +1 -1
  45. package/dist/tools/prompts.d.ts +17 -2
  46. package/dist/tools/prompts.js +343 -25
  47. package/dist/tools/prompts.js.map +1 -1
  48. package/dist/tools/shared.d.ts +14 -1
  49. package/dist/tools/shared.js +51 -5
  50. package/dist/tools/shared.js.map +1 -1
  51. package/dist/tools.js +10 -5
  52. package/dist/tools.js.map +1 -1
  53. package/dist/unmatched.d.ts +91 -0
  54. package/dist/unmatched.js +309 -0
  55. package/dist/unmatched.js.map +1 -0
  56. package/dist/version.d.ts +1 -1
  57. package/dist/version.js +1 -1
  58. package/package.json +2 -1
@@ -1,15 +1,198 @@
1
+ import { basename } from 'node:path';
1
2
  import { z } from 'zod';
2
- /** Hangt de prompts aan de server. Nu één: het werkpatroon om je eigen wijziging na te kijken. */
3
- export function registerPrompts(server) {
3
+ import { completable } from '@modelcontextprotocol/sdk/server/completable.js';
4
+ import { discoverProjects } from '../project.js';
5
+ /**
6
+ * Hangt de prompts aan de server: werkpatronen die bestaande tools combineren.
7
+ *
8
+ * Een prompt en geen tool, omdat het alleen bestaande tools combineert. Een tool kost
9
+ * context in elke `tools/list`, ook in een sessie die hem nooit gebruikt; een prompt
10
+ * alleen als iemand hem kiest. Elke vangrail in deze teksten komt uit een proefrun op
11
+ * een echt project die zonder die zin misging — zie fase 15.6 en 16 in het plan.
12
+ */
13
+ export function registerPrompts(server, roots) {
14
+ registerReviewPrompt(server, roots);
15
+ registerLevelPrompt(server, roots);
16
+ registerBaselinePrompt(server, roots);
17
+ registerKindPrompt(server, roots);
18
+ registerComparePrompt(server, roots);
19
+ }
20
+ /**
21
+ * De projecten binnen de roots die passen bij wat er al getypt is: een prefix op het
22
+ * volledige pad of op de mapnaam, zonder onderscheid in hoofdletters. Elke keer opnieuw
23
+ * ontdekt en niet gecachet — net zoals `withSlot` zijn grens elke keer opnieuw leest,
24
+ * zodat een nieuw project meteen meedoet.
25
+ */
26
+ export function suggestProjects(roots, value, exclude) {
27
+ const needle = value.trim().toLowerCase();
28
+ return discoverProjects(roots)
29
+ .map((project) => project.path)
30
+ .filter((path) => path !== exclude)
31
+ .filter((path) => path.toLowerCase().startsWith(needle) || basename(path).toLowerCase().startsWith(needle));
32
+ }
33
+ /**
34
+ * Een optioneel projectargument met aanvulling uit `list_projects`.
35
+ *
36
+ * **Dubbel gemarkeerd, en dat is geen vergissing.** Het SDK (1.30) kijkt voor de
37
+ * capability naar de binnenkant van een `ZodOptional`, maar bij het aanvullen naar het
38
+ * veld zelf. Nagemeten met een echte client:
39
+ *
40
+ * - `completable(z.string().optional())`: geen `completions`-capability, `-32601`;
41
+ * - `completable(z.string()).optional()`: capability wel, maar altijd een lege lijst;
42
+ * - beide gemarkeerd: capability én suggesties.
43
+ *
44
+ * De test in tools.spec vraagt echt om aanvulling; verandert het SDK dit gedrag, dan
45
+ * valt die om in plaats van dat de keuzelijst stil leeg blijft.
46
+ */
47
+ function projectArgument(roots, description, exclude) {
48
+ const complete = (value, context) => suggestProjects(roots, value ?? '', exclude?.(context?.arguments));
49
+ return completable(completable(z.string(), complete).optional().describe(description), complete);
50
+ }
51
+ const PROJECT_DESCRIPTION = 'Absoluut pad naar de projectroot; laat leeg om eerst list_projects te doen';
52
+ /** De openingszin: het project, of eerst list_projects als er geen is meegegeven. */
53
+ function opening(project, wat) {
54
+ return project === undefined || project === ''
55
+ ? `Roep eerst \`list_projects\` aan en kies het project ${wat}.`
56
+ : `Werk in het project ${project}.`;
57
+ }
58
+ /** Het werkpatroon om je eigen wijziging na te kijken, voor je werkboom of een hele branch. */
59
+ function registerReviewPrompt(server, roots) {
4
60
  server.registerPrompt('phpstan_wijziging_nakijken', {
5
61
  title: 'Eigen wijziging nakijken/reviewen met PHPStan',
6
62
  description: 'Het werkpatroon om je eigen wijziging na te kijken zonder het hele project door te rekenen.',
7
63
  argsSchema: {
8
- project: z
64
+ project: projectArgument(roots, PROJECT_DESCRIPTION),
65
+ // Een argument en geen aparte prompt: die zou grotendeels hetzelfde zeggen en
66
+ // dan uit elkaar gaan lopen. Een base met een leidend streepje weigert
67
+ // checkBase zelf, met uitleg; dat hoeft hier niet herhaald te worden.
68
+ base: z
69
+ .string()
70
+ .optional()
71
+ .describe('Commit of branch om tegen te vergelijken, bijv. "main" voor een hele branch vóór een PR'),
72
+ },
73
+ }, ({ project, base }) => {
74
+ const metBase = base !== undefined && base !== '';
75
+ return {
76
+ messages: [
77
+ {
78
+ role: 'user',
79
+ content: {
80
+ type: 'text',
81
+ text: [
82
+ opening(project, 'waar ik in werk'),
83
+ '',
84
+ 'Ga daarna zo te werk:',
85
+ metBase
86
+ ? `1. \`analyse_changed\` met dat project en \`base: "${base}"\` — dat pakt alles wat op`
87
+ : '1. `analyse_changed` met dat project — dat pakt alleen wat git gewijzigd heeft,',
88
+ metBase
89
+ ? ` deze branch gewijzigd is ten opzichte van ${base}, ook wat nog niet toegevoegd is.`
90
+ : ' inclusief bestanden die nog niet toegevoegd zijn. Doe dit ook als het project',
91
+ metBase
92
+ ? ' Doe dit ook als het project groot is; `analyse_project` rekent alles door.'
93
+ : ' groot is; `analyse_project` zonder paden rekent alles door.',
94
+ '2. Staat er "LET OP" of "Ter info" boven het rapport, lees dat eerst: een',
95
+ ' onvolledige analyse of een baseline die meedoet maakt een schone uitslag',
96
+ ' onbetrouwbaar.',
97
+ '3. Begin bij de bevindingen met een + (`onChangedLine`): die staan op een regel',
98
+ ' die je gewijzigd hebt. Kijk daarna naar de rest van die bestanden — een',
99
+ ' aangepaste signatuur levert fouten op bij de aanroepen, en die regels heb je',
100
+ ' niet aangeraakt. Wat daar duidelijk al stond, laat je liggen.',
101
+ '4. Repareer de bevindingen bij de bron. Verzwak geen types naar `mixed` en voeg',
102
+ ' niets aan de baseline toe.',
103
+ metBase
104
+ ? `5. Draai \`analyse_changed\` opnieuw, met dezelfde base, tot het schoon is — zónder`
105
+ : '5. Draai `analyse_changed` opnieuw tot het schoon is — zónder runId, want die',
106
+ metBase
107
+ ? ' runId, want die geeft het resultaat van vóór je reparatie. Een runId is alleen'
108
+ : ' geeft het resultaat van vóór je reparatie. Een runId is alleen voor de',
109
+ metBase
110
+ ? ' voor de volgende pagina van hetzelfde resultaat. Blijven er veel'
111
+ : ' volgende pagina van hetzelfde resultaat. Blijven er veel',
112
+ ' bevindingen van één soort over, gebruik dan `identifiers` om er per soort',
113
+ ' door te lopen.',
114
+ '',
115
+ 'Gedraagt het project zich onverklaarbaar, draai dan `diagnose_project` voordat',
116
+ 'je aan de code twijfelt.',
117
+ ].join('\n'),
118
+ },
119
+ },
120
+ ],
121
+ };
122
+ });
123
+ }
124
+ /**
125
+ * Wat een level hoger kost: twee tellingen en het verschil ertussen. Met `limit: 1`,
126
+ * want alleen de samenvatting telt, en die gaat altijd over álle bevindingen.
127
+ */
128
+ function registerLevelPrompt(server, roots) {
129
+ server.registerPrompt('phpstan_level_verhogen', {
130
+ title: 'Wat kost een level hoger?',
131
+ description: 'Telt hoeveel bevindingen er bijkomen als het project een PHPStan-level omhoog gaat, ' +
132
+ 'per soort en per bestand, zonder iets aan de code of de config te veranderen.',
133
+ argsSchema: {
134
+ project: projectArgument(roots, PROJECT_DESCRIPTION),
135
+ level: z
9
136
  .string()
10
137
  .optional()
11
- .describe('Absoluut pad naar de projectroot; laat leeg om eerst list_projects te doen'),
138
+ .describe('Het level om naartoe te gaan; standaard het huidige plus één'),
12
139
  },
140
+ }, ({ project, level }) => ({
141
+ messages: [
142
+ {
143
+ role: 'user',
144
+ content: {
145
+ type: 'text',
146
+ text: [
147
+ opening(project, 'dat ik bedoel'),
148
+ '',
149
+ 'Zoek uit wat het kost om dit project een PHPStan-level omhoog te zetten:',
150
+ '1. Zoek het huidige level op: `parameters.level` in de config die list_projects',
151
+ ' noemt, of in een config die daar geïncludeerd wordt — vaak een gedeelde config',
152
+ ' in vendor/. Staat het al op `max` of 10, zeg dan dat er geen hoger level is en',
153
+ ' stop. Vind je het niet, zeg dat en kies er niet zelf een: een te laag gekozen',
154
+ ' level geeft mínder bevindingen, en dan lijkt een hoger level gratis.',
155
+ '2. `analyse_project` zonder level en met `limit: 1`. Alleen de tellingen tellen;',
156
+ ' die gaan altijd over álle bevindingen, niet over de ene op de pagina.',
157
+ level === undefined || level === ''
158
+ ? '3. `analyse_project` met `level` op het huidige plus één, weer met `limit: 1`.'
159
+ : `3. \`analyse_project\` met \`level: "${level}"\`, weer met \`limit: 1\`.`,
160
+ '4. Het verschil tussen de twee totalen is wat het hogere level kost. Leg de',
161
+ ' `summary.byIdentifier` van beide naast elkaar: de soorten die erbij komen of',
162
+ ' flink groeien zijn het werk. Tel `ignore.*` niet mee: dat zijn inline',
163
+ ' `@phpstan-ignore`-regels die op dat level niets te negeren hebben, geen nieuw',
164
+ ' werk. Geeft het hogere level zonder die mínder bevindingen dan het huidige, dan',
165
+ ' klopt het huidige level niet: stop en meld dat.',
166
+ '5. Staat er bij de eerste analyse "Ter info" over een baseline, dan zijn fouten',
167
+ ' van het huidige level daar al verborgen en zegt de tweede telling vooral wat',
168
+ ' het nieuwe level toevoegt. Zeg dat erbij.',
169
+ '',
170
+ 'Rapporteer het aantal extra bevindingen, de soorten die het meest bijdragen en de',
171
+ 'zwaarst getroffen bestanden. Onderscheid wat mechanisch op te lossen is (zoals',
172
+ 'ontbrekende types bij `missingType.*`) van wat op echte fouten kan wijzen (zoals',
173
+ '`argument.type` of een aanroep op iets dat null kan zijn). Verander niets aan de',
174
+ 'code of de config; dit is een verkenning. Loopt een analyse tegen de timeout aan,',
175
+ 'geef dan `timeoutSeconds` mee.',
176
+ ].join('\n'),
177
+ },
178
+ },
179
+ ],
180
+ }));
181
+ }
182
+ /**
183
+ * De baseline afbouwen, met opschonen en verstoppen uit elkaar gehouden.
184
+ *
185
+ * Fase 15.2 vond de val: `generate_baseline` ruimt verouderde regels op maar zet de
186
+ * huidige bevindingen er in dezelfde handeling bij. Nagelopen op `cms`: 293 verouderde
187
+ * regels, 3 met een te hoog count, twee padloze patronen uit een gedeelde config in
188
+ * vendor/, en 32 huidige bevindingen die een nieuwe baseline zou verstoppen.
189
+ */
190
+ function registerBaselinePrompt(server, roots) {
191
+ server.registerPrompt('phpstan_baseline_afbouwen', {
192
+ title: 'De baseline afbouwen',
193
+ description: 'Zoekt wat er in de baseline verouderd is, wat een nieuwe baseline zou verstoppen, en ' +
194
+ 'welke afbouw het goedkoopst is — met opschonen en verstoppen als twee aparte dingen.',
195
+ argsSchema: { project: projectArgument(roots, PROJECT_DESCRIPTION) },
13
196
  }, ({ project }) => ({
14
197
  messages: [
15
198
  {
@@ -17,33 +200,168 @@ export function registerPrompts(server) {
17
200
  content: {
18
201
  type: 'text',
19
202
  text: [
20
- project === undefined || project === ''
21
- ? 'Roep eerst `list_projects` aan en kies het project waar ik in werk.'
22
- : `Werk in het project ${project}.`,
203
+ opening(project, 'waarvan ik de baseline wil afbouwen'),
204
+ '',
205
+ 'Help me de baseline af te bouwen. Opschonen (regels weghalen die niets meer',
206
+ 'doen) en verstoppen (huidige fouten erin zetten) zijn twee verschillende dingen;',
207
+ 'houd ze uit elkaar.',
23
208
  '',
24
- 'Ga daarna zo te werk:',
25
- '1. `analyse_changed` met dat project dat pakt alleen wat git gewijzigd heeft,',
26
- ' inclusief bestanden die nog niet toegevoegd zijn. Doe dit ook als het project',
27
- ' groot is; `analyse_project` zonder paden rekent alles door.',
28
- '2. Staat er "LET OP" of "Ter info" boven het rapport, lees dat eerst: een',
29
- ' onvolledige analyse of een baseline die meedoet maakt een schone uitslag',
30
- ' onbetrouwbaar.',
31
- '3. Begin bij de bevindingen met een + (`onChangedLine`): die staan op een regel',
32
- ' die je gewijzigd hebt. Kijk daarna naar de rest van die bestanden — een',
33
- ' aangepaste signatuur levert fouten op bij de aanroepen, en die regels heb je',
34
- ' niet aangeraakt. Wat daar duidelijk al stond, laat je liggen.',
35
- '4. Repareer de bevindingen bij de bron. Verzwak geen types naar `mixed` en voeg',
36
- ' niets aan de baseline toe.',
37
- '5. Draai `analyse_changed` opnieuw tot het schoon is. Blijven er veel',
38
- ' bevindingen van één soort over, gebruik dan `identifiers` om er per soort',
39
- ' door te lopen.',
209
+ '1. `baseline_summary`: hoe groot de baseline is, en welke soorten en bestanden het',
210
+ ' zwaarst wegen. Staat er `hasBaseline: false`, zeg dan dat er niets af te bouwen',
211
+ ' is en stop.',
212
+ '2. `unmatched_ignores` een volledige analyse; geef bij een groot project',
213
+ ' `timeoutSeconds` mee. Splits de uitkomst in drie groepen:',
214
+ ' - regels die niets meer matchen (`inBaseline: true`): de fout is opgelost, de',
215
+ ' regel kan weg;',
216
+ ' - regels met een te hoog aantal (`kind: "countTooHigh"`): de count kan omlaag',
217
+ ' naar wat er nog voorkomt;',
218
+ ' - patronen zonder pad (`general`): die komen uit ignoreErrors van een config,',
219
+ ' vaak een gedeelde in vendor/. Kom daar niet aan; een nieuwe baseline doet er',
220
+ ' niets aan.',
221
+ ' Staat `inBaseline` op null, dan was de baseline niet te lezen: meld dat en gok',
222
+ ' niet. Weigert de tool met `unsupported_with_runner`, dan draait PHPStan in een',
223
+ ' container: zeg dat deze stap hier niet kan en ga verder met stap 3.',
224
+ '3. `analyse_project` met `limit: 1`. Dat totaal is precies wat een nieuwe baseline',
225
+ ' zou verstoppen; zeg dat er met zoveel woorden bij.',
226
+ '4. Kies de goedkoopste échte afbouw: een bestand met weinig baseline-regels en een',
227
+ ' soort die bij de bron op te lossen is, zoals `missingType.*`. Welke soorten in',
228
+ ' welk bestand zitten, telt `baseline_summary` niet; dat staat in het',
229
+ ' baseline-bestand zelf (per regel `identifier:` en `path:`). Repareer bij de bron:',
230
+ ' geen `mixed`, geen `@phpstan-ignore`, geen cast om een fout stil te krijgen.',
231
+ ' Controleer met `analyse_file` op dat bestand dat er niets nieuws bijkomt; de',
232
+ ' baseline-regels die daardoor verouderd zijn, mogen dan weg.',
233
+ '5. `generate_baseline` ruimt alles in één keer op, maar zet ook het totaal uit',
234
+ ' stap 3 in de baseline. Stel hem daarom alleen voor als dat totaal op nul staat;',
235
+ ' staat het er niet op, dan eerst die bevindingen repareren. Hij bestaat alleen',
236
+ ' als de server schrijfrechten heeft, en ook dan roep je hem niet zelf aan: hij',
237
+ ' herschrijft een bestand dat in git staat. Stel het voor, en laat mij kiezen.',
40
238
  '',
41
- 'Gedraagt het project zich onverklaarbaar, draai dan `diagnose_project` voordat',
42
- 'je aan de code twijfelt.',
239
+ 'Rapporteer: hoe groot de baseline is, hoeveel regels verouderd zijn, hoeveel huidige',
240
+ 'bevindingen een nieuwe baseline zou verstoppen, en welke afbouw je voorstelt of',
241
+ 'gedaan hebt.',
43
242
  ].join('\n'),
44
243
  },
45
244
  },
46
245
  ],
47
246
  }));
48
247
  }
248
+ /**
249
+ * Een opruimronde per soort. Nagelopen op `lasouris-lease-shared`: geen `missingType.*`
250
+ * te kiezen, 11 van de 15 bevindingen in één ontwikkeltool, en `encapsedStringPart`
251
+ * dat tot `(string)`-casts uitnodigt — terwijl PHPStans eigen waarschuwing daartegen
252
+ * via deze client niet eens meekomt (`instructions` bleef leeg).
253
+ */
254
+ function registerKindPrompt(server, roots) {
255
+ server.registerPrompt('phpstan_soort_wegwerken', {
256
+ title: 'Eén soort bevinding wegwerken',
257
+ description: 'Een opruimronde voor één identifier (of een groep zoals missingType) door het hele ' +
258
+ 'project, tot die soort op nul staat of de rest een inhoudelijke keuze vraagt.',
259
+ argsSchema: {
260
+ project: projectArgument(roots, PROJECT_DESCRIPTION),
261
+ identifier: z
262
+ .string()
263
+ .optional()
264
+ .describe('Bijv. "missingType.iterableValue" of de groep "missingType"; laat leeg om er een te laten kiezen'),
265
+ },
266
+ }, ({ project, identifier }) => {
267
+ const gekozen = identifier !== undefined && identifier !== '';
268
+ return {
269
+ messages: [
270
+ {
271
+ role: 'user',
272
+ content: {
273
+ type: 'text',
274
+ text: [
275
+ opening(project, 'dat ik wil opruimen'),
276
+ '',
277
+ 'Help me één soort bevinding in dit project weg te werken. Dit is een',
278
+ 'opruimronde, iets anders dan een eigen wijziging nakijken.',
279
+ '',
280
+ ...(gekozen
281
+ ? [
282
+ `1. \`analyse_project\` met \`identifiers: ["${identifier}"]\`. Een groep als`,
283
+ ' `missingType` matcht alle `missingType.*`, maar niet iets als `missingTypex`.',
284
+ ]
285
+ : [
286
+ '1. `analyse_project` met `limit: 1`, en kies uit `summary.byIdentifier` een soort.',
287
+ ' Eerst wat bij de bron op te lossen is zonder het gedrag te veranderen, zoals',
288
+ ' ontbrekende types (`missingType.*`). Is die er niet, kies dan een soort die in',
289
+ ' één of twee bestanden zit (`summary.byFile`), zodat de ronde te overzien is.',
290
+ ' Kies geen `ignore.*`: dat zijn negeerregels, geen fouten. Zeg welke soort je',
291
+ ' kiest en waarom.',
292
+ ]),
293
+ '2. Loop met `identifiers` op die soort door de bevindingen. Is er meer dan één',
294
+ ' pagina, geef dan de `runId` mee samen met `offset`: dan komt de volgende pagina',
295
+ ' uit hetzelfde resultaat.',
296
+ '3. Repareer bij de bron. Geen `mixed`, geen `@phpstan-ignore`, niets in de',
297
+ ' baseline, en geen cast of `assert()` om een fout stil te krijgen. Een cast is',
298
+ ' alleen goed als je zeker weet dat de waarde dat type heeft — en dan hoort dat',
299
+ ' type bij de bron vast te liggen, niet op de plek van de melding.',
300
+ '4. Na een reparatie opnieuw analyseren met `identifiers`, zónder runId: die geeft',
301
+ ' het resultaat van vóór je reparatie, en dan lijkt de ronde niets te doen. Kijk',
302
+ ' ook naar het totaal: een reparatie kan een bevinding van een andere soort',
303
+ ' opleveren, en die hoort dan bij deze ronde.',
304
+ '5. Stop als de soort op nul staat, of als wat overblijft een inhoudelijke keuze',
305
+ ' vraagt. Rapporteer dan wat er over is en waarom je daar stopt.',
306
+ ].join('\n'),
307
+ },
308
+ },
309
+ ],
310
+ };
311
+ });
312
+ }
313
+ /**
314
+ * Twee projecten naast elkaar, om te verklaren waarom PHPStan zich anders gedraagt.
315
+ * Nagelopen op `lasouris-lease-api` tegen `lasouris-lease-shared`: dezelfde PHP-,
316
+ * PHPStan- en Larastan-versie, maar een ander PHP-bereik in composer.json en een
317
+ * gedeelde coding-standards-config die maar bij één van de twee meedoet. En een
318
+ * mislukking die uit een verouderde resultcache kwam, was in diagnose onzichtbaar.
319
+ */
320
+ function registerComparePrompt(server, roots) {
321
+ server.registerPrompt('phpstan_projecten_vergelijken', {
322
+ title: 'Twee projecten vergelijken',
323
+ description: 'Legt de PHPStan-opstelling van twee projecten naast elkaar en rapporteert alleen de ' +
324
+ 'verschillen, om te verklaren waarom PHPStan zich in het ene anders gedraagt.',
325
+ argsSchema: {
326
+ projectA: projectArgument(roots, 'Het eerste project; laat leeg om eerst list_projects te doen'),
327
+ projectB: projectArgument(roots, 'Het tweede project; laat leeg om eerst list_projects te doen', (argumenten) => argumenten?.['projectA']),
328
+ },
329
+ }, ({ projectA, projectB }) => {
330
+ const beide = projectA !== undefined && projectA !== '' && projectB !== undefined && projectB !== '';
331
+ return {
332
+ messages: [
333
+ {
334
+ role: 'user',
335
+ content: {
336
+ type: 'text',
337
+ text: [
338
+ beide
339
+ ? `Vergelijk ${projectA} met ${projectB}.`
340
+ : 'Roep eerst `list_projects` aan en vraag welke twee projecten ik wil vergelijken.',
341
+ '',
342
+ 'Zoek uit waarom PHPStan zich in het ene project anders gedraagt dan in het andere:',
343
+ '1. `diagnose_project` op beide. Zet naast elkaar: de PHP-versie (wat er draait én',
344
+ ' wat composer.json toestaat), de PHPStan- en Larastan-versie, de configs die',
345
+ ' Composer-pakketten meebrengen, en of turbo aanstaat. Let vooral op die configs:',
346
+ ' een gedeelde coding-standards-config zet vaak het level en eigen ignoreErrors.',
347
+ '2. Het level van beide: `parameters.level` in de eigen config, of in een config uit',
348
+ ' vendor/ die daar geïncludeerd wordt.',
349
+ '3. De baseline: `baseline_summary` zegt of er een ligt. Of hij ook meedoet, blijkt',
350
+ ' pas uit de "Ter info"-melding bij `analyse_project` met `limit: 1` — een',
351
+ ' baseline die er ligt maar niet geïncludeerd wordt, doet niets.',
352
+ '4. `server_config`: of er voor een van beide een runner of eigen standaarden',
353
+ ' gelden (geheugen, timeout, config).',
354
+ '',
355
+ 'Rapporteer alleen de verschillen; wat gelijk is, verklaart niets. Verklaart geen',
356
+ 'enkel verschil het gedrag — klapt een analyse met een melding die nergens op lijkt',
357
+ 'te slaan terwijl de opstelling gelijk is — dan is een verouderde resultcache de',
358
+ 'volgende verdachte. Stel dan `clear_result_cache` voor dat project voor; die leegt',
359
+ 'alleen de cache, maar vraag het eerst.',
360
+ ].join('\n'),
361
+ },
362
+ },
363
+ ],
364
+ };
365
+ });
366
+ }
49
367
  //# sourceMappingURL=prompts.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../src/tools/prompts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,kGAAkG;AAClG,MAAM,UAAU,eAAe,CAAC,MAAiB;IAC/C,MAAM,CAAC,cAAc,CACnB,4BAA4B,EAC5B;QACE,KAAK,EAAE,+CAA+C;QACtD,WAAW,EACT,6FAA6F;QAC/F,UAAU,EAAE;YACV,OAAO,EAAE,CAAC;iBACP,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CAAC,4EAA4E,CAAC;SAC1F;KACF,EACD,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC;QAChB,QAAQ,EAAE;YACR;gBACE,IAAI,EAAE,MAAM;gBACZ,OAAO,EAAE;oBACP,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE;wBACJ,OAAO,KAAK,SAAS,IAAI,OAAO,KAAK,EAAE;4BACrC,CAAC,CAAC,qEAAqE;4BACvE,CAAC,CAAC,uBAAuB,OAAO,GAAG;wBACrC,EAAE;wBACF,uBAAuB;wBACvB,iFAAiF;wBACjF,kFAAkF;wBAClF,gEAAgE;wBAChE,2EAA2E;wBAC3E,6EAA6E;wBAC7E,mBAAmB;wBACnB,iFAAiF;wBACjF,4EAA4E;wBAC5E,iFAAiF;wBACjF,kEAAkE;wBAClE,iFAAiF;wBACjF,+BAA+B;wBAC/B,uEAAuE;wBACvE,8EAA8E;wBAC9E,mBAAmB;wBACnB,EAAE;wBACF,gFAAgF;wBAChF,0BAA0B;qBAC3B,CAAC,IAAI,CAAC,IAAI,CAAC;iBACb;aACF;SACF;KACF,CAAC,CACH,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../src/tools/prompts.ts"],"names":[],"mappings":"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"}
@@ -3,6 +3,7 @@ import { z } from 'zod';
3
3
  import type { AnalyseOptions } from '../phpstan.js';
4
4
  import type { ChangedLineCheck, Window } from '../report.js';
5
5
  import type { ResolvedProject } from '../project.js';
6
+ import type { RunStore } from '../runs.js';
6
7
  import type { Root } from '../roots.js';
7
8
  import type { FailureDetails, FailureReason } from '../failure.js';
8
9
  /** Tekstresultaat waar het model iets aan heeft als er iets misgaat. */
@@ -66,6 +67,7 @@ export declare const analysisShape: {
66
67
  hasMore: z.ZodBoolean;
67
68
  }, z.core.$strip>;
68
69
  filter: z.ZodUnion<readonly [z.ZodArray<z.ZodString>, z.ZodLiteral<null>]>;
70
+ runId: z.ZodUnion<readonly [z.ZodString, z.ZodLiteral<null>]>;
69
71
  changedLines: z.ZodUnion<readonly [z.ZodObject<{
70
72
  onChangedLine: z.ZodNumber;
71
73
  elsewhere: z.ZodNumber;
@@ -77,7 +79,18 @@ export declare const windowShape: {
77
79
  identifiers: z.ZodOptional<z.ZodArray<z.ZodString>>;
78
80
  offset: z.ZodOptional<z.ZodNumber>;
79
81
  limit: z.ZodOptional<z.ZodNumber>;
82
+ runId: z.ZodOptional<z.ZodString>;
80
83
  };
84
+ /**
85
+ * Of een pagina uit een eerder resultaat mag komen, en onder welke sleutel. De
86
+ * sleutel komt van de tool zelf: alleen die weet welke argumenten bepalen wát er
87
+ * geanalyseerd wordt.
88
+ */
89
+ export interface Reuse {
90
+ readonly runs: RunStore;
91
+ readonly key: string;
92
+ readonly runId?: string | undefined;
93
+ }
81
94
  /**
82
95
  * Argumenten die alle analyse-tools delen. Los gehouden van de zod-schema's, want
83
96
  * die verschillen per tool in welke velden erbij staan.
@@ -130,7 +143,7 @@ export declare function log(server: McpServer, level: 'info' | 'debug', data: Re
130
143
  * Eerder resolveerde analyse_file het project en deed runAnalysis dat daarna nog
131
144
  * een keer.
132
145
  */
133
- export declare function runAnalysis(server: McpServer, roots: Root[], project: string, plan: (resolved: ResolvedProject) => Plan | Promise<Plan>, window: Window, signal?: AbortSignal): Promise<ToolResult>;
146
+ export declare function runAnalysis(server: McpServer, roots: Root[], project: string, plan: (resolved: ResolvedProject) => Plan | Promise<Plan>, window: Window, signal: AbortSignal | undefined, reuse: Reuse): Promise<ToolResult>;
134
147
  /**
135
148
  * Analyseren verandert de broncode niet. PHPStan schrijft wel zijn resultcache weg,
136
149
  * maar dat is geen wijziging waar de gebruiker iets van merkt.
@@ -68,6 +68,7 @@ export const analysisShape = {
68
68
  })
69
69
  .describe('Welk deel van de bevindingen dit antwoord bevat'),
70
70
  filter: nullable(z.array(z.string())).describe('Op welke identifiers deze pagina beperkt is, of null als er niet gefilterd is'),
71
+ runId: nullable(z.string()).describe('Geef dit mee bij de volgende pagina, dan komt die uit hetzelfde resultaat; null als er niets geanalyseerd is'),
71
72
  changedLines: nullable(z.object({
72
73
  onChangedLine: z.number(),
73
74
  elsewhere: z.number(),
@@ -94,6 +95,12 @@ export const windowShape = {
94
95
  .max(MAX_LIMIT)
95
96
  .optional()
96
97
  .describe(`Hoeveel bevindingen dit antwoord bevat (standaard ${String(DEFAULT_LIMIT)})`),
98
+ runId: z
99
+ .string()
100
+ .optional()
101
+ .describe('De runId uit een eerder antwoord: dan komt deze pagina uit dat resultaat in plaats van uit ' +
102
+ 'een nieuwe analyse, zodat de totalen gelijk blijven. Alleen offset, limit, identifiers en ' +
103
+ 'onlyChangedLines mogen dan anders zijn'),
97
104
  };
98
105
  /**
99
106
  * Zet de gedeelde argumenten om in AnalyseOptions. `config` gaat door resolveWithin:
@@ -133,10 +140,23 @@ export function log(server, level, data) {
133
140
  * Eerder resolveerde analyse_file het project en deed runAnalysis dat daarna nog
134
141
  * een keer.
135
142
  */
136
- export async function runAnalysis(server, roots, project, plan, window, signal) {
143
+ export async function runAnalysis(server, roots, project, plan, window, signal, reuse) {
137
144
  const begin = Date.now();
138
145
  try {
146
+ // Eerst resolven, ook voor een pagina uit een eerder resultaat: de whitelist
147
+ // geldt bij elke aanroep, en de runId moet bij dit project horen.
139
148
  const resolved = resolveProject(project, roots);
149
+ let fallback = null;
150
+ if (reuse.runId !== undefined) {
151
+ const stored = reuse.runs.get(reuse.runId, resolved.path, reuse.key);
152
+ if (stored !== null)
153
+ return fromStoredRun(server, stored, window);
154
+ // Geen fout: dat kost het model een ronde om te ontdekken wat het toch al kan
155
+ // doen. Wel hardop, want de tellingen kunnen nu afwijken van eerdere pagina's.
156
+ fallback =
157
+ `runId "${reuse.runId}" is onbekend, verlopen of hoort bij andere argumenten; ` +
158
+ 'dit is een nieuwe analyse, dus de tellingen kunnen afwijken van eerdere pagina’s.';
159
+ }
140
160
  const chosen = await plan(resolved);
141
161
  if ('nothingToDo' in chosen) {
142
162
  // Toch het volledige rapportschema teruggeven: een client die op
@@ -152,7 +172,7 @@ export async function runAnalysis(server, roots, project, plan, window, signal)
152
172
  }, {});
153
173
  return {
154
174
  content: [{ type: 'text', text: chosen.nothingToDo }],
155
- structuredContent: { ...empty },
175
+ structuredContent: { ...empty, runId: null },
156
176
  };
157
177
  }
158
178
  // Het signaal komt uit het MCP-verzoek zelf: annuleert de client, dan wordt de
@@ -169,17 +189,43 @@ export async function runAnalysis(server, roots, project, plan, window, signal)
169
189
  waarschuwingen: result.warnings.length,
170
190
  duurMs: Date.now() - begin,
171
191
  });
172
- const report = buildReport(result, window, collectNotices(resolved), chosen.onChangedLine);
192
+ const notices = collectNotices(resolved);
193
+ const runId = reuse.runs.put({
194
+ project: resolved.path,
195
+ key: reuse.key,
196
+ result,
197
+ notices,
198
+ ...(chosen.heading === undefined ? {} : { heading: chosen.heading }),
199
+ ...(chosen.onChangedLine === undefined ? {} : { onChangedLine: chosen.onChangedLine }),
200
+ });
201
+ const report = buildReport(result, window, fallback === null ? notices : [...notices, fallback], chosen.onChangedLine);
173
202
  const heading = chosen.heading === undefined ? '' : `${chosen.heading}\n\n`;
174
203
  return {
175
- content: [{ type: 'text', text: heading + renderReport(report) }],
176
- structuredContent: { ...report },
204
+ content: [{ type: 'text', text: heading + renderReport(report, runId) }],
205
+ structuredContent: { ...report, runId },
177
206
  };
178
207
  }
179
208
  catch (error) {
180
209
  return toFailure(error);
181
210
  }
182
211
  }
212
+ /**
213
+ * Een pagina uit een eerder resultaat. Met de leeftijd erbij: wat er sindsdien in de
214
+ * code veranderd is, zit hier niet in, en wie net iets gerepareerd heeft moet dat
215
+ * weten voordat hij denkt dat het niet geholpen heeft.
216
+ */
217
+ function fromStoredRun(server, stored, window) {
218
+ const seconden = Math.max(0, Math.round((Date.now() - stored.createdAt) / 1000));
219
+ const herkomst = `Deze pagina komt uit de analyse van ${String(seconden)}s geleden (runId ${stored.id}); ` +
220
+ 'wat er sindsdien in de code veranderd is, zit er niet in.';
221
+ log(server, 'debug', { gebeurtenis: 'pagina uit eerdere analyse', project: stored.project, runId: stored.id });
222
+ const report = buildReport(stored.result, window, [...stored.notices, herkomst], stored.onChangedLine);
223
+ const heading = stored.heading === undefined ? '' : `${stored.heading}\n\n`;
224
+ return {
225
+ content: [{ type: 'text', text: heading + renderReport(report, stored.id) }],
226
+ structuredContent: { ...report, runId: stored.id },
227
+ };
228
+ }
183
229
  /**
184
230
  * Wat deze server zelf bij een analyse te melden heeft. Nu alleen de baseline: doet
185
231
  * die mee, dan rapporteert PHPStan alleen wat er nieuw bij komt, en dan is een
@@ -1 +1 @@
1
- {"version":3,"file":"shared.js","sourceRoot":"","sources":["../../src/tools/shared.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"shared.js","sourceRoot":"","sources":["../../src/tools/shared.ts"],"names":[],"mappings":"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"}