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.
- package/CHANGELOG.md +15 -0
- package/README.md +113 -6
- package/dist/baseline.d.ts +19 -0
- package/dist/baseline.js +44 -11
- package/dist/baseline.js.map +1 -1
- package/dist/config.d.ts +3 -2
- package/dist/config.js.map +1 -1
- package/dist/defaults.d.ts +37 -0
- package/dist/defaults.js +100 -0
- package/dist/defaults.js.map +1 -0
- package/dist/failure.d.ts +1 -1
- package/dist/failure.js.map +1 -1
- package/dist/index.js +17 -1
- package/dist/index.js.map +1 -1
- package/dist/phpstan.js +58 -19
- package/dist/phpstan.js.map +1 -1
- package/dist/project.d.ts +10 -1
- package/dist/project.js +28 -1
- package/dist/project.js.map +1 -1
- package/dist/report.d.ts +15 -2
- package/dist/report.js +12 -5
- package/dist/report.js.map +1 -1
- package/dist/runs.d.ts +59 -0
- package/dist/runs.js +78 -0
- package/dist/runs.js.map +1 -0
- package/dist/schema-dialect.d.ts +30 -0
- package/dist/schema-dialect.js +57 -0
- package/dist/schema-dialect.js.map +1 -0
- package/dist/server.js +5 -0
- package/dist/server.js.map +1 -1
- package/dist/tools/analysis.d.ts +4 -3
- package/dist/tools/analysis.js +26 -6
- package/dist/tools/analysis.js.map +1 -1
- package/dist/tools/inspect.d.ts +2 -0
- package/dist/tools/inspect.js +140 -1
- package/dist/tools/inspect.js.map +1 -1
- package/dist/tools/prompts.d.ts +8 -1
- package/dist/tools/prompts.js +79 -2
- package/dist/tools/prompts.js.map +1 -1
- package/dist/tools/shared.d.ts +14 -1
- package/dist/tools/shared.js +51 -5
- package/dist/tools/shared.js.map +1 -1
- package/dist/tools.js +9 -4
- package/dist/tools.js.map +1 -1
- package/dist/unmatched.d.ts +91 -0
- package/dist/unmatched.js +309 -0
- package/dist/unmatched.js.map +1 -0
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +2 -1
package/dist/tools/shared.js
CHANGED
|
@@ -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
|
|
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
|
package/dist/tools/shared.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shared.js","sourceRoot":"","sources":["../../src/tools/shared.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAC;AAE1D,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAExC,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAEnF,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;
|
|
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,
|
|
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
package/dist/version.js
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "phpstan-mcp-mx",
|
|
3
|
-
"version": "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",
|