phpstan-mcp-mx 0.13.0 → 0.14.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 (50) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/README.md +113 -6
  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 +3 -2
  7. package/dist/config.js.map +1 -1
  8. package/dist/defaults.d.ts +37 -0
  9. package/dist/defaults.js +100 -0
  10. package/dist/defaults.js.map +1 -0
  11. package/dist/failure.d.ts +1 -1
  12. package/dist/failure.js.map +1 -1
  13. package/dist/index.js +17 -1
  14. package/dist/index.js.map +1 -1
  15. package/dist/phpstan.js +58 -19
  16. package/dist/phpstan.js.map +1 -1
  17. package/dist/project.d.ts +10 -1
  18. package/dist/project.js +28 -1
  19. package/dist/project.js.map +1 -1
  20. package/dist/report.d.ts +15 -2
  21. package/dist/report.js +12 -5
  22. package/dist/report.js.map +1 -1
  23. package/dist/runs.d.ts +59 -0
  24. package/dist/runs.js +78 -0
  25. package/dist/runs.js.map +1 -0
  26. package/dist/schema-dialect.d.ts +30 -0
  27. package/dist/schema-dialect.js +57 -0
  28. package/dist/schema-dialect.js.map +1 -0
  29. package/dist/server.js +5 -0
  30. package/dist/server.js.map +1 -1
  31. package/dist/tools/analysis.d.ts +4 -3
  32. package/dist/tools/analysis.js +26 -6
  33. package/dist/tools/analysis.js.map +1 -1
  34. package/dist/tools/inspect.d.ts +2 -0
  35. package/dist/tools/inspect.js +140 -1
  36. package/dist/tools/inspect.js.map +1 -1
  37. package/dist/tools/prompts.d.ts +8 -1
  38. package/dist/tools/prompts.js +79 -2
  39. package/dist/tools/prompts.js.map +1 -1
  40. package/dist/tools/shared.d.ts +14 -1
  41. package/dist/tools/shared.js +51 -5
  42. package/dist/tools/shared.js.map +1 -1
  43. package/dist/tools.js +9 -4
  44. package/dist/tools.js.map +1 -1
  45. package/dist/unmatched.d.ts +91 -0
  46. package/dist/unmatched.js +309 -0
  47. package/dist/unmatched.js.map +1 -0
  48. package/dist/version.d.ts +1 -1
  49. package/dist/version.js +1 -1
  50. package/package.json +2 -1
@@ -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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"}
package/dist/tools.js CHANGED
@@ -1,14 +1,19 @@
1
+ import { RunStore } from './runs.js';
1
2
  import { registerAnalyseChanged, registerAnalyseFile, registerAnalyseProject, } from './tools/analysis.js';
2
- import { registerBaselineSummary, registerDiagnose, registerListProjects, registerServerConfig, } from './tools/inspect.js';
3
+ import { registerBaselineSummary, registerDiagnose, registerListProjects, registerServerConfig, registerUnmatchedIgnores, } from './tools/inspect.js';
3
4
  import { registerPrompts } from './tools/prompts.js';
4
5
  import { registerClearResultCache, registerGenerateBaseline, writesAllowed, } from './tools/writes.js';
5
6
  /** Hangt alle tools aan de server. */
6
7
  export function registerTools(server, roots) {
8
+ // Eén opslag per server: een runId uit het ene gesprek hoort niet in het andere,
9
+ // en tests met meerdere servers zitten elkaar dan niet in de weg.
10
+ const runs = new RunStore();
7
11
  registerListProjects(server, roots);
8
- registerAnalyseProject(server, roots);
9
- registerAnalyseFile(server, roots);
10
- registerAnalyseChanged(server, roots);
12
+ registerAnalyseProject(server, roots, runs);
13
+ registerAnalyseFile(server, roots, runs);
14
+ registerAnalyseChanged(server, roots, runs);
11
15
  registerBaselineSummary(server, roots);
16
+ registerUnmatchedIgnores(server, roots);
12
17
  registerDiagnose(server, roots);
13
18
  registerServerConfig(server, roots);
14
19
  registerClearResultCache(server, roots);
package/dist/tools.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"tools.js","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,sBAAsB,EACtB,mBAAmB,EACnB,sBAAsB,GACvB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,uBAAuB,EACvB,gBAAgB,EAChB,oBAAoB,EACpB,oBAAoB,GACrB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EACL,wBAAwB,EACxB,wBAAwB,EACxB,aAAa,GACd,MAAM,mBAAmB,CAAC;AAE3B,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;IACvC,gBAAgB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IAChC,oBAAoB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IACpC,wBAAwB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IACxC,IAAI,aAAa,EAAE;QAAE,wBAAwB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IAC7D,eAAe,CAAC,MAAM,CAAC,CAAC;AAC1B,CAAC"}
1
+ {"version":3,"file":"tools.js","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EACL,sBAAsB,EACtB,mBAAmB,EACnB,sBAAsB,GACvB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,uBAAuB,EACvB,gBAAgB,EAChB,oBAAoB,EACpB,oBAAoB,EACpB,wBAAwB,GACzB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EACL,wBAAwB,EACxB,wBAAwB,EACxB,aAAa,GACd,MAAM,mBAAmB,CAAC;AAE3B,sCAAsC;AACtC,MAAM,UAAU,aAAa,CAAC,MAAiB,EAAE,KAAa;IAC5D,iFAAiF;IACjF,kEAAkE;IAClE,MAAM,IAAI,GAAG,IAAI,QAAQ,EAAE,CAAC;IAE5B,oBAAoB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IACpC,sBAAsB,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;IAC5C,mBAAmB,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;IACzC,sBAAsB,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;IAC5C,uBAAuB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IACvC,wBAAwB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IACxC,gBAAgB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IAChC,oBAAoB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IACpC,wBAAwB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IACxC,IAAI,aAAa,EAAE;QAAE,wBAAwB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IAC7D,eAAe,CAAC,MAAM,CAAC,CAAC;AAC1B,CAAC"}
@@ -0,0 +1,91 @@
1
+ import type { IncludedBaselines } from './baseline.js';
2
+ import type { AnalyseOptions, AnalysisResult } from './phpstan.js';
3
+ import type { ResolvedProject } from './project.js';
4
+ import type { Page } from './report.js';
5
+ /** Eén negeerregel die niets meer doet, of minder dan hij belooft. */
6
+ export interface StaleIgnore {
7
+ /** Pad zoals het aan het model getoond wordt: relatief aan de projectroot waar dat kan. */
8
+ readonly path: string;
9
+ readonly identifier: string | null;
10
+ /** Het patroon zoals PHPStan het noemt, zodat de regel in het bestand terug te vinden is. */
11
+ readonly pattern: string;
12
+ /** `unmatched`: matcht niets meer. `countTooHigh`: matcht nog, maar minder vaak dan `count`. */
13
+ readonly kind: 'unmatched' | 'countTooHigh';
14
+ /** Alleen bij countTooHigh, en alleen als PHPStans melding de aantallen noemt. */
15
+ readonly expected: number | null;
16
+ readonly occurred: number | null;
17
+ /**
18
+ * Of deze regel uit een geïncludeerde baseline komt. Null als een baseline meedoet
19
+ * die niet te lezen is en de regel er dus in zou kunnen staan.
20
+ */
21
+ readonly inBaseline: boolean | null;
22
+ }
23
+ /** Het antwoord van `unmatched_ignores`. */
24
+ export interface UnmatchedReport {
25
+ readonly project: string;
26
+ /** De baseline-bestanden die de config includeert. */
27
+ readonly baselineFiles: readonly string[];
28
+ readonly totals: {
29
+ readonly unmatched: number;
30
+ readonly countTooHigh: number;
31
+ readonly inBaseline: number;
32
+ /** Patronen zonder pad die niets meer matchen. */
33
+ readonly general: number;
34
+ /** Gewone bevindingen uit dezelfde run: wat een nieuwe baseline óók zou verstoppen. */
35
+ readonly otherFindings: number;
36
+ };
37
+ readonly byPath: readonly {
38
+ path: string;
39
+ count: number;
40
+ }[];
41
+ readonly entries: readonly StaleIgnore[];
42
+ /** Patronen zonder pad die niets meer matchen, uit de config of een meegeleverde config. */
43
+ readonly general: readonly string[];
44
+ /** Algemene fouten van PHPStan die géén verouderde negeerregel zijn. */
45
+ readonly generalErrors: readonly string[];
46
+ readonly warnings: readonly string[];
47
+ readonly notices: readonly string[];
48
+ readonly omitted: {
49
+ readonly general: number;
50
+ readonly generalErrors: number;
51
+ readonly warnings: number;
52
+ };
53
+ readonly page: Page;
54
+ }
55
+ /**
56
+ * Draait een volledige analyse met `reportUnmatchedIgnoredErrors` aan en levert de
57
+ * negeerregels die niets meer doen.
58
+ *
59
+ * Via een tijdelijke config die de projectconfig includeert, want PHPStan kent er
60
+ * geen vlag voor en neemt maar één `--configuration`. Die config staat in de
61
+ * tijdelijke map van het project en niet in het project zelf: dan blijft dit een
62
+ * read-only tool.
63
+ *
64
+ * Bewust geen `level` en geen `paths`. Op een ander niveau zijn het andere fouten,
65
+ * en bij een deel van het project lijkt alles buiten dat deel verouderd — in beide
66
+ * gevallen klopt de uitslag niet meer met de baseline die je wilt opschonen.
67
+ */
68
+ export declare function findUnmatchedIgnores(project: ResolvedProject, options?: Pick<AnalyseOptions, 'memoryLimit' | 'timeoutMs' | 'signal'>, window?: {
69
+ readonly offset?: number | undefined;
70
+ readonly limit?: number | undefined;
71
+ }): Promise<UnmatchedReport>;
72
+ /**
73
+ * De inhoud van de tijdelijke config. Het pad gaat als NEON-string tussen enkele
74
+ * quotes: een `'` wordt verdubbeld, en een `%` ook, want PHPStan leest `%naam%` in
75
+ * een include als parameter. Een regeleinde kan in zo'n string helemaal niet.
76
+ */
77
+ export declare function unmatchedConfig(configPath: string): string;
78
+ /**
79
+ * Zet een analyse met `reportUnmatchedIgnoredErrors` om in het antwoord van de tool.
80
+ *
81
+ * Nagemeten op PHPStan 2: een regel met een pad komt als bevinding bij dat bestand,
82
+ * met identifier `ignore.unmatched` of — bij een te hoog `count` — `ignore.count`.
83
+ * Een patroon zonder pad komt als algemene fout. Of een regel uit de baseline komt,
84
+ * zegt PHPStan niet; dat volgt uit identifier en pad tegen de baseline zelf.
85
+ */
86
+ export declare function buildUnmatchedReport(project: string, result: AnalysisResult, baselines: IncludedBaselines, window?: {
87
+ readonly offset?: number | undefined;
88
+ readonly limit?: number | undefined;
89
+ }, notices?: readonly string[]): UnmatchedReport;
90
+ /** Schrijft het antwoord uit als tekst voor het model. */
91
+ export declare function renderUnmatched(report: UnmatchedReport): string;
@@ -0,0 +1,309 @@
1
+ import { mkdirSync, readFileSync, renameSync, writeFileSync } from 'node:fs';
2
+ import { join, normalize, relative } from 'node:path';
3
+ import { readIncludedBaselines } from './baseline.js';
4
+ import { PhpstanError, analyse } from './phpstan.js';
5
+ import { resolveWithin } from './project.js';
6
+ import { DEFAULT_LIMIT, MAX_LIMIT, displayPath, limitMessages } from './report.js';
7
+ import { runnerFor } from './runner.js';
8
+ import { TmpDirError, projectTmpDir } from './tmpdir.js';
9
+ /** Naam van de tijdelijke config, in de tijdelijke map van het project. */
10
+ const CONFIG_NAME = 'unmatched-ignores.neon';
11
+ /** Hoeveel regels de samenvatting per bestand hoogstens toont. */
12
+ const SUMMARY_ROWS = 15;
13
+ /** Hoe lang een patroon mag zijn in het antwoord; een baseline-regex kan lang uitvallen. */
14
+ const MAX_PATTERN_CHARS = 300;
15
+ /**
16
+ * Draait een volledige analyse met `reportUnmatchedIgnoredErrors` aan en levert de
17
+ * negeerregels die niets meer doen.
18
+ *
19
+ * Via een tijdelijke config die de projectconfig includeert, want PHPStan kent er
20
+ * geen vlag voor en neemt maar één `--configuration`. Die config staat in de
21
+ * tijdelijke map van het project en niet in het project zelf: dan blijft dit een
22
+ * read-only tool.
23
+ *
24
+ * Bewust geen `level` en geen `paths`. Op een ander niveau zijn het andere fouten,
25
+ * en bij een deel van het project lijkt alles buiten dat deel verouderd — in beide
26
+ * gevallen klopt de uitslag niet meer met de baseline die je wilt opschonen.
27
+ */
28
+ export async function findUnmatchedIgnores(project, options = {}, window = {}) {
29
+ // De tijdelijke config staat op de host. Een runner draait PHPStan in een andere
30
+ // omgeving, waar dat pad niet bestaat; hem ín het project zetten zou wel werken,
31
+ // maar dan schrijft een read-only tool in de repository.
32
+ if (runnerFor(project.path) !== null) {
33
+ throw new PhpstanError(`${project.path} draait PHPStan in een eigen omgeving, en daar kan deze tool niet bij de ` +
34
+ 'tijdelijke config die hij nodig heeft. Zet reportUnmatchedIgnoredErrors tijdelijk aan ' +
35
+ 'in de config van het project en draai analyse_project, of gebruik baseline_summary ' +
36
+ 'om te zien wat de baseline bevat.', 'unsupported_with_runner', { hint: 'Gebruik analyse_project met reportUnmatchedIgnoredErrors aan in de projectconfig.' });
37
+ }
38
+ const baselines = readIncludedBaselines(project);
39
+ // Zonder config zijn er ook geen negeerregels: dat is een uitkomst, geen storing.
40
+ if (project.config === null) {
41
+ return buildUnmatchedReport(project.path, emptyResult(project.path), baselines, window, [
42
+ `${project.path} heeft geen phpstan.neon(.dist); zonder config zijn er geen negeerregels om te controleren.`,
43
+ ]);
44
+ }
45
+ const config = writeUnmatchedConfig(project, project.config);
46
+ const result = await analyse(project, { ...options, config });
47
+ return buildUnmatchedReport(project.path, result, baselines, window);
48
+ }
49
+ const emptyResult = (project) => ({
50
+ project,
51
+ findings: [],
52
+ generalErrors: [],
53
+ warnings: [],
54
+ instructions: [],
55
+ totals: { fileErrors: 0, generalErrors: 0 },
56
+ });
57
+ /**
58
+ * De inhoud van de tijdelijke config. Het pad gaat als NEON-string tussen enkele
59
+ * quotes: een `'` wordt verdubbeld, en een `%` ook, want PHPStan leest `%naam%` in
60
+ * een include als parameter. Een regeleinde kan in zo'n string helemaal niet.
61
+ */
62
+ export function unmatchedConfig(configPath) {
63
+ if (/[\r\n]/.test(configPath)) {
64
+ throw new PhpstanError(`Het pad ${JSON.stringify(configPath)} bevat een regeleinde en kan niet in een config gezet worden.`);
65
+ }
66
+ const quoted = `'${configPath.replace(/'/g, "''").replace(/%/g, '%%')}'`;
67
+ return ['includes:', `\t- ${quoted}`, '', 'parameters:', '\treportUnmatchedIgnoredErrors: true', ''].join('\n');
68
+ }
69
+ /**
70
+ * Zet de tijdelijke config neer en geeft het pad terug. Via een tijdelijk bestand en
71
+ * een rename: twee aanroepen op hetzelfde project schrijven anders tegelijk, en een
72
+ * PHPStan die net leest kan dan een half bestand zien. Is de inhoud al goed, dan
73
+ * wordt er niets geschreven.
74
+ */
75
+ function writeUnmatchedConfig(project, configName) {
76
+ const dir = projectTmpDir(project.path);
77
+ const file = join(dir, CONFIG_NAME);
78
+ // Door resolveWithin: de config kan uit de standaarden van het project komen, ook
79
+ // als absoluut pad, en de include moet dan nog steeds binnen het project blijven.
80
+ const content = unmatchedConfig(resolveWithin(project, configName));
81
+ try {
82
+ if (readFileSync(file, 'utf8') === content)
83
+ return file;
84
+ }
85
+ catch {
86
+ // Bestaat nog niet; hieronder aanmaken.
87
+ }
88
+ try {
89
+ mkdirSync(dir, { recursive: true });
90
+ const tmp = `${file}.${String(process.pid)}`;
91
+ writeFileSync(tmp, content);
92
+ renameSync(tmp, file);
93
+ }
94
+ catch (error) {
95
+ throw new TmpDirError(`De tijdelijke config ${file} kon niet geschreven worden: ` +
96
+ `${error instanceof Error ? error.message : String(error)}.`);
97
+ }
98
+ return file;
99
+ }
100
+ /** Eindigt de melding van een regel die niets meer matcht. */
101
+ const UNMATCHED_SUFFIX = ' was not matched in reported errors.';
102
+ /** Eindigt de melding van een regel die minder vaak voorkomt dan zijn `count`. */
103
+ const COUNT_SUFFIX = /^ is expected to occur (\d+) times?, but occurred only (\d+) times?\.$/;
104
+ /** Een algemeen patroon, zonder pad: dat komt als algemene fout en niet bij een bestand. */
105
+ const GENERAL_UNMATCHED = /^Ignored error pattern (.+) was not matched in reported errors\.$/s;
106
+ /**
107
+ * Zet een analyse met `reportUnmatchedIgnoredErrors` om in het antwoord van de tool.
108
+ *
109
+ * Nagemeten op PHPStan 2: een regel met een pad komt als bevinding bij dat bestand,
110
+ * met identifier `ignore.unmatched` of — bij een te hoog `count` — `ignore.count`.
111
+ * Een patroon zonder pad komt als algemene fout. Of een regel uit de baseline komt,
112
+ * zegt PHPStan niet; dat volgt uit identifier en pad tegen de baseline zelf.
113
+ */
114
+ export function buildUnmatchedReport(project, result, baselines, window = {}, notices = []) {
115
+ const stale = [];
116
+ let otherFindings = 0;
117
+ for (const finding of result.findings) {
118
+ const entry = toStale(project, finding, baselines);
119
+ if (entry === null)
120
+ otherFindings++;
121
+ else
122
+ stale.push(entry);
123
+ }
124
+ stale.sort((a, b) => a.path.localeCompare(b.path) ||
125
+ (a.identifier ?? '').localeCompare(b.identifier ?? '') ||
126
+ a.pattern.localeCompare(b.pattern));
127
+ const generalPatterns = [];
128
+ const otherErrors = [];
129
+ for (const error of result.generalErrors) {
130
+ const match = GENERAL_UNMATCHED.exec(error);
131
+ if (match?.[1] === undefined)
132
+ otherErrors.push(error);
133
+ else
134
+ generalPatterns.push(shorten(match[1]));
135
+ }
136
+ const limit = clamp(window.limit ?? DEFAULT_LIMIT, 1, MAX_LIMIT);
137
+ const offset = clamp(window.offset ?? 0, 0, stale.length);
138
+ const entries = stale.slice(offset, offset + limit);
139
+ const general = limitMessages(generalPatterns);
140
+ const generalErrors = limitMessages(otherErrors);
141
+ const warnings = limitMessages(result.warnings);
142
+ const allNotices = [...notices];
143
+ if (baselines.unreadable.length > 0) {
144
+ allNotices.push(`${baselines.unreadable.join(', ')} doet mee maar is niet te lezen; of een regel daaruit komt, ` +
145
+ 'staat dan op onbekend.');
146
+ }
147
+ return {
148
+ project,
149
+ baselineFiles: [...baselines.files],
150
+ totals: {
151
+ unmatched: stale.filter((entry) => entry.kind === 'unmatched').length,
152
+ countTooHigh: stale.filter((entry) => entry.kind === 'countTooHigh').length,
153
+ inBaseline: stale.filter((entry) => entry.inBaseline === true).length,
154
+ general: generalPatterns.length,
155
+ otherFindings,
156
+ },
157
+ byPath: tally(stale),
158
+ entries,
159
+ general: general.kept,
160
+ generalErrors: generalErrors.kept,
161
+ warnings: warnings.kept,
162
+ notices: allNotices,
163
+ omitted: { general: general.omitted, generalErrors: generalErrors.omitted, warnings: warnings.omitted },
164
+ page: {
165
+ offset,
166
+ limit,
167
+ returned: entries.length,
168
+ total: stale.length,
169
+ hasMore: offset + entries.length < stale.length,
170
+ },
171
+ };
172
+ }
173
+ /** Een bevinding als verouderde negeerregel, of null als het een gewone bevinding is. */
174
+ function toStale(project, finding, baselines) {
175
+ const kind = finding.identifier === 'ignore.unmatched'
176
+ ? 'unmatched'
177
+ : finding.identifier === 'ignore.count'
178
+ ? 'countTooHigh'
179
+ : null;
180
+ if (kind === null)
181
+ return null;
182
+ // Het pad staat letterlijk in de melding, en PHPStan hangt de bevinding aan
183
+ // datzelfde bestand. Op die markering knippen is betrouwbaarder dan de hele
184
+ // melding met één regex lezen: het patroon zelf kan van alles bevatten.
185
+ const marker = ` in path ${finding.file}`;
186
+ const at = finding.message.lastIndexOf(marker);
187
+ const head = at === -1 ? finding.message : finding.message.slice(0, at);
188
+ const tail = at === -1 ? '' : finding.message.slice(at + marker.length);
189
+ const counts = kind === 'countTooHigh' ? COUNT_SUFFIX.exec(tail) : null;
190
+ const named = /^(?:Ignored error pattern )?(.*?)(?: \(([\w.-]+)\))?$/s.exec(at === -1 ? head.replace(UNMATCHED_SUFFIX, '') : head);
191
+ const identifier = named?.[2] ?? null;
192
+ return {
193
+ path: displayPath(project, finding.file),
194
+ identifier,
195
+ pattern: shorten(named?.[1] ?? head),
196
+ kind,
197
+ expected: counts?.[1] === undefined ? null : Number(counts[1]),
198
+ occurred: kind === 'unmatched' ? 0 : counts?.[2] === undefined ? null : Number(counts[2]),
199
+ inBaseline: inBaseline(relative(project, finding.file), identifier, baselines),
200
+ };
201
+ }
202
+ /**
203
+ * Of een regel met dit pad en deze identifier in een geïncludeerde baseline staat.
204
+ * Meerdere baseline-regels kunnen pad en identifier delen (met een ander patroon);
205
+ * voor de vraag "komt dit uit de baseline" maakt dat niet uit.
206
+ */
207
+ function inBaseline(path, identifier, baselines) {
208
+ const found = baselines.entries.some((entry) => normalize(entry.path) === path && (identifier === null || entry.identifier === identifier));
209
+ if (found)
210
+ return true;
211
+ return baselines.unreadable.length > 0 ? null : false;
212
+ }
213
+ /** Schrijft het antwoord uit als tekst voor het model. */
214
+ export function renderUnmatched(report) {
215
+ const lines = [];
216
+ if (report.warnings.length > 0) {
217
+ lines.push('LET OP — PHPStan meldde dit naast het resultaat:');
218
+ for (const warning of report.warnings)
219
+ lines.push(`- ${warning}`);
220
+ if (report.omitted.warnings > 0)
221
+ lines.push(`- (nog ${report.omitted.warnings} melding(en) niet getoond)`);
222
+ lines.push('Bij een onvolledige analyse kan PHPStan verouderde regels missen; een korte lijst hieronder is dan geen bewijs.', '');
223
+ }
224
+ if (report.notices.length > 0) {
225
+ lines.push('Ter info:');
226
+ for (const notice of report.notices)
227
+ lines.push(`- ${notice}`);
228
+ lines.push('');
229
+ }
230
+ if (report.generalErrors.length > 0) {
231
+ lines.push('Fouten buiten de bestanden om:');
232
+ for (const error of report.generalErrors)
233
+ lines.push(`- ${error}`);
234
+ if (report.omitted.generalErrors > 0)
235
+ lines.push(`- (nog ${report.omitted.generalErrors} fout(en) niet getoond)`);
236
+ lines.push('');
237
+ }
238
+ const { totals } = report;
239
+ if (report.page.total === 0 && totals.general === 0) {
240
+ lines.push(report.baselineFiles.length > 0
241
+ ? `Alle negeerregels matchen nog; in ${report.baselineFiles.join(', ')} is niets verouderd.`
242
+ : 'Geen verouderde negeerregels.');
243
+ return lines.join('\n');
244
+ }
245
+ if (report.page.total > 0) {
246
+ const kop = [`${totals.unmatched} negeerregel(s) matchen niets meer`];
247
+ if (totals.countTooHigh > 0)
248
+ kop.push(`${totals.countTooHigh} staan op een te hoog aantal`);
249
+ lines.push(`${kop.join(', ')}.`);
250
+ if (report.baselineFiles.length > 0) {
251
+ lines.push(`${totals.inBaseline} daarvan staan in ${report.baselineFiles.join(', ')}.`);
252
+ }
253
+ if (report.byPath.length > 1) {
254
+ lines.push('', 'Meeste per bestand:', ...report.byPath.map((row) => ` ${pad(row.count)} ${row.path}`));
255
+ }
256
+ const from = report.page.offset + 1;
257
+ const to = report.page.offset + report.page.returned;
258
+ lines.push('', `Regels ${from}-${to} van ${report.page.total}:`);
259
+ let current = null;
260
+ for (const entry of report.entries) {
261
+ if (entry.path !== current) {
262
+ current = entry.path;
263
+ lines.push('', current);
264
+ }
265
+ const aantal = entry.kind === 'countTooHigh'
266
+ ? entry.expected === null
267
+ ? ' (te hoog aantal)'
268
+ : ` (count ${entry.expected}, komt nog ${entry.occurred ?? '?'} keer voor)`
269
+ : '';
270
+ const herkomst = entry.inBaseline === false ? ' [niet uit de baseline]' : '';
271
+ lines.push(` ${entry.identifier ?? '-'} ${entry.pattern}${aantal}${herkomst}`);
272
+ }
273
+ }
274
+ if (report.general.length > 0) {
275
+ lines.push('', `${totals.general} patroon/patronen zonder pad matchen niets meer. Die staan niet in de ` +
276
+ 'baseline maar in ignoreErrors van de config, of van een config die een pakket meebrengt:', ...report.general.map((pattern) => `- ${pattern}`));
277
+ if (report.omitted.general > 0)
278
+ lines.push(`- (nog ${report.omitted.general} niet getoond)`);
279
+ }
280
+ lines.push('', 'Wat je ermee kunt:', '- Een regel die niets meer matcht hoort bij een fout die opgelost is; die kan weg.', '- Bij een te hoog aantal verlaag je `count` naar wat er nog voorkomt.', totals.otherFindings > 0
281
+ ? `- generate_baseline doet beide in één keer, maar zet ook de ${totals.otherFindings} huidige ` +
282
+ 'bevinding(en) erin. Repareer die eerst, anders verstop je ze in de baseline.'
283
+ : '- generate_baseline doet beide in één keer, als schrijven op deze server aanstaat.');
284
+ if (report.page.hasMore) {
285
+ const to = report.page.offset + report.page.returned;
286
+ lines.push('', `Nog ${report.page.total - to} regel(s). Roep dezelfde tool opnieuw aan met offset=${to} voor de rest.`);
287
+ }
288
+ return lines.join('\n');
289
+ }
290
+ /** De bestanden met de meeste verouderde regels eerst, bij gelijk aantal alfabetisch. */
291
+ function tally(entries) {
292
+ const counts = new Map();
293
+ for (const entry of entries)
294
+ counts.set(entry.path, (counts.get(entry.path) ?? 0) + 1);
295
+ return [...counts.entries()]
296
+ .sort((a, b) => b[1] - a[1] || a[0].localeCompare(b[0]))
297
+ .slice(0, SUMMARY_ROWS)
298
+ .map(([path, count]) => ({ path, count }));
299
+ }
300
+ function shorten(pattern) {
301
+ return pattern.length <= MAX_PATTERN_CHARS ? pattern : `${pattern.slice(0, MAX_PATTERN_CHARS)}… (afgekapt)`;
302
+ }
303
+ function clamp(value, low, high) {
304
+ return Math.min(Math.max(Math.trunc(value), low), high);
305
+ }
306
+ function pad(count) {
307
+ return String(count).padStart(4);
308
+ }
309
+ //# sourceMappingURL=unmatched.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"unmatched.js","sourceRoot":"","sources":["../src/unmatched.ts"],"names":[],"mappings":"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"}
package/dist/version.d.ts CHANGED
@@ -6,4 +6,4 @@
6
6
  * Staat los van server.ts omdat tools.ts hem ook nodig heeft, en server.ts
7
7
  * importeert tools.ts — dat zou een cyclus zijn.
8
8
  */
9
- export declare const VERSION = "0.13.0";
9
+ export declare const VERSION = "0.14.0";
package/dist/version.js CHANGED
@@ -6,5 +6,5 @@
6
6
  * Staat los van server.ts omdat tools.ts hem ook nodig heeft, en server.ts
7
7
  * importeert tools.ts — dat zou een cyclus zijn.
8
8
  */
9
- export const VERSION = '0.13.0';
9
+ export const VERSION = '0.14.0';
10
10
  //# sourceMappingURL=version.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "phpstan-mcp-mx",
3
- "version": "0.13.0",
3
+ "version": "0.14.0",
4
4
  "description": "MCP-server die PHPStan ontsluit als tools, voor meerdere PHP-projecten tegelijk",
5
5
  "keywords": [
6
6
  "mcp",
@@ -62,6 +62,7 @@
62
62
  "@semantic-release/git": "^11.0.1",
63
63
  "@types/node": "^24.13.4",
64
64
  "@vitest/coverage-v8": "^5.0.0",
65
+ "ajv": "^8.20.0",
65
66
  "eslint": "^10.10.0",
66
67
  "eslint-plugin-jsdoc": "^64.3.8",
67
68
  "semantic-release": "^25.0.9",