phpstan-mcp-mx 0.7.1 → 0.9.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 +80 -0
- package/README.md +28 -0
- package/dist/index.js +3 -2
- package/dist/index.js.map +1 -1
- package/dist/phpstan/error.d.ts +8 -0
- package/dist/phpstan/error.js +9 -0
- package/dist/phpstan/error.js.map +1 -0
- package/dist/phpstan/output.d.ts +57 -0
- package/dist/phpstan/output.js +76 -0
- package/dist/phpstan/output.js.map +1 -0
- package/dist/phpstan/process.d.ts +45 -0
- package/dist/phpstan/process.js +148 -0
- package/dist/phpstan/process.js.map +1 -0
- package/dist/phpstan/queue.d.ts +21 -0
- package/dist/phpstan/queue.js +76 -0
- package/dist/phpstan/queue.js.map +1 -0
- package/dist/phpstan.d.ts +7 -65
- package/dist/phpstan.js +8 -289
- package/dist/phpstan.js.map +1 -1
- package/dist/server.d.ts +0 -6
- package/dist/server.js +5 -6
- package/dist/server.js.map +1 -1
- package/dist/tools/analysis.d.ts +8 -0
- package/dist/tools/analysis.js +131 -0
- package/dist/tools/analysis.js.map +1 -0
- package/dist/tools/inspect.d.ts +14 -0
- package/dist/tools/inspect.js +211 -0
- package/dist/tools/inspect.js.map +1 -0
- package/dist/tools/prompts.d.ts +3 -0
- package/dist/tools/prompts.js +45 -0
- package/dist/tools/prompts.js.map +1 -0
- package/dist/tools/shared.d.ts +153 -0
- package/dist/tools/shared.js +219 -0
- package/dist/tools/shared.js.map +1 -0
- package/dist/tools/writes.d.ts +17 -0
- package/dist/tools/writes.js +122 -0
- package/dist/tools/writes.js.map +1 -0
- package/dist/tools.d.ts +0 -11
- package/dist/tools.js +5 -594
- package/dist/tools.js.map +1 -1
- package/dist/version.d.ts +9 -0
- package/dist/version.js +10 -0
- package/dist/version.js.map +1 -0
- package/package.json +7 -4
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analysis.js","sourceRoot":"","sources":["../../src/tools/analysis.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
+
import type { Root } from '../roots.js';
|
|
3
|
+
/** Hangt `list_projects` aan de server: welke projecten binnen bereik liggen. */
|
|
4
|
+
export declare function registerListProjects(server: McpServer, roots: Root[]): void;
|
|
5
|
+
/**
|
|
6
|
+
* Eén prompt met het werkpatroon. Er zijn zes tools waarvan drie op elkaar lijken;
|
|
7
|
+
* zonder dit moet het model de juiste volgorde uit de losse beschrijvingen
|
|
8
|
+
* reconstrueren, en dan is `analyse_project` op een groot project de eerste gok.
|
|
9
|
+
*/
|
|
10
|
+
export declare function registerServerConfig(server: McpServer, roots: Root[]): void;
|
|
11
|
+
/** Hangt `diagnose_project` aan de server: PHPStans eigen opstelling in een project. */
|
|
12
|
+
export declare function registerDiagnose(server: McpServer, roots: Root[]): void;
|
|
13
|
+
/** Hangt `baseline_summary` aan de server: wat de baseline verbergt. */
|
|
14
|
+
export declare function registerBaselineSummary(server: McpServer, roots: Root[]): void;
|
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { renderBaseline, summariseBaseline } from '../baseline.js';
|
|
3
|
+
import { diagnose, loadDefaultMemoryLimit, loadMaxParallel } from '../phpstan.js';
|
|
4
|
+
import { discoverProjects, resolveProject } from '../project.js';
|
|
5
|
+
import { ROOTS_ENV_VAR } from '../roots.js';
|
|
6
|
+
import { loadTmpDirMode } from '../tmpdir.js';
|
|
7
|
+
import { VERSION } from '../version.js';
|
|
8
|
+
import { failure, nullable, projectArgument, readOnly, toFailure } from './shared.js';
|
|
9
|
+
import { writesAllowed } from './writes.js';
|
|
10
|
+
/** Hangt `list_projects` aan de server: welke projecten binnen bereik liggen. */
|
|
11
|
+
export function registerListProjects(server, roots) {
|
|
12
|
+
server.registerTool('list_projects', {
|
|
13
|
+
title: 'PHP-projecten opsommen',
|
|
14
|
+
description: 'Somt de PHP-projecten op die deze server mag analyseren, met per project of ' +
|
|
15
|
+
'PHPStan geïnstalleerd is en welk configbestand er ligt. Gebruik het `path` uit ' +
|
|
16
|
+
'het resultaat als `project`-argument voor de andere tools.',
|
|
17
|
+
inputSchema: {},
|
|
18
|
+
outputSchema: {
|
|
19
|
+
projects: z.array(z.object({
|
|
20
|
+
path: z.string(),
|
|
21
|
+
root: z.string(),
|
|
22
|
+
hasPhpstan: z.boolean(),
|
|
23
|
+
config: nullable(z.string()),
|
|
24
|
+
hasGit: z.boolean().describe('Of analyse_changed hier bruikbaar is'),
|
|
25
|
+
})),
|
|
26
|
+
problems: z.array(z.object({ root: z.string(), problem: z.string() })),
|
|
27
|
+
},
|
|
28
|
+
annotations: readOnly(),
|
|
29
|
+
}, () => {
|
|
30
|
+
if (roots.length === 0) {
|
|
31
|
+
return failure(`Er zijn geen projectmappen geconfigureerd. Zet ${ROOTS_ENV_VAR} in de ` +
|
|
32
|
+
'MCP-serverconfiguratie op de absolute paden die geanalyseerd mogen worden, ' +
|
|
33
|
+
'gescheiden door een dubbele punt.');
|
|
34
|
+
}
|
|
35
|
+
const projects = discoverProjects(roots);
|
|
36
|
+
const problems = roots
|
|
37
|
+
.filter((root) => root.problem !== null)
|
|
38
|
+
.map((root) => ({ root: root.raw, problem: root.problem }));
|
|
39
|
+
return {
|
|
40
|
+
content: [{ type: 'text', text: renderProjects(projects, problems) }],
|
|
41
|
+
structuredContent: { projects, problems },
|
|
42
|
+
};
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
function renderProjects(projects, problems) {
|
|
46
|
+
const lines = [];
|
|
47
|
+
if (projects.length === 0) {
|
|
48
|
+
lines.push('Geen PHP-projecten gevonden onder de geconfigureerde mappen.');
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
lines.push(`${projects.length} project(en):`);
|
|
52
|
+
for (const project of projects) {
|
|
53
|
+
const config = project.config ?? 'geen config';
|
|
54
|
+
const phpstan = project.hasPhpstan ? 'phpstan aanwezig' : 'phpstan NIET geïnstalleerd';
|
|
55
|
+
const git = project.hasGit ? 'git' : 'geen git';
|
|
56
|
+
lines.push(`- ${project.path} (${phpstan}, ${config}, ${git})`);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
if (problems.length > 0) {
|
|
60
|
+
lines.push('', 'Overgeslagen regels uit de configuratie:');
|
|
61
|
+
for (const problem of problems)
|
|
62
|
+
lines.push(`- ${problem.root}: ${problem.problem}`);
|
|
63
|
+
}
|
|
64
|
+
return lines.join('\n');
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Eén prompt met het werkpatroon. Er zijn zes tools waarvan drie op elkaar lijken;
|
|
68
|
+
* zonder dit moet het model de juiste volgorde uit de losse beschrijvingen
|
|
69
|
+
* reconstrueren, en dan is `analyse_project` op een groot project de eerste gok.
|
|
70
|
+
*/
|
|
71
|
+
export function registerServerConfig(server, roots) {
|
|
72
|
+
server.registerTool('server_config', {
|
|
73
|
+
title: 'Instellingen van deze server',
|
|
74
|
+
description: 'Geeft de instellingen terug waarmee deze server draait: welke projectmappen binnen ' +
|
|
75
|
+
'bereik liggen, de standaard geheugenlimiet, hoeveel analyses er tegelijk mogen, waar ' +
|
|
76
|
+
'de tijdelijke bestanden heen gaan en of schrijvende tools aanstaan. Gebruik dit als ' +
|
|
77
|
+
'iets geweigerd wordt of trager gaat dan verwacht, vóórdat je aan het project twijfelt.',
|
|
78
|
+
inputSchema: {},
|
|
79
|
+
outputSchema: {
|
|
80
|
+
version: z.string(),
|
|
81
|
+
roots: z.array(z.object({
|
|
82
|
+
raw: z.string().describe('Zoals opgegeven in de env-variabele'),
|
|
83
|
+
path: nullable(z.string()).describe('Het geresolvede pad, of null als de root onbruikbaar is'),
|
|
84
|
+
problem: nullable(z.string()),
|
|
85
|
+
})),
|
|
86
|
+
memoryLimit: nullable(z.string()).describe('Standaard --memory-limit, of null als die niet gezet is'),
|
|
87
|
+
maxParallel: nullable(z.number()).describe('Hoeveel analyses tegelijk; null als de waarde geweigerd is'),
|
|
88
|
+
tmpDir: nullable(z.string()).describe('"project" of "shared"'),
|
|
89
|
+
writesAllowed: z.boolean().describe('Of generate_baseline geregistreerd is'),
|
|
90
|
+
problems: z
|
|
91
|
+
.array(z.string())
|
|
92
|
+
.describe('Instellingen die geweigerd zijn; die velden staan dan op null'),
|
|
93
|
+
},
|
|
94
|
+
annotations: readOnly(),
|
|
95
|
+
}, () => {
|
|
96
|
+
// Elke waarde apart uitlezen: de loaders weigeren een onbruikbare waarde met
|
|
97
|
+
// een uitleg, en juist die uitleg is hier het antwoord. Eén mislukte
|
|
98
|
+
// instelling mag de rest niet onzichtbaar maken.
|
|
99
|
+
const problems = [];
|
|
100
|
+
const config = {
|
|
101
|
+
version: VERSION,
|
|
102
|
+
roots: roots.map((root) => ({ raw: root.raw, path: root.path, problem: root.problem })),
|
|
103
|
+
memoryLimit: setting(() => loadDefaultMemoryLimit() ?? null, problems),
|
|
104
|
+
maxParallel: setting(() => loadMaxParallel(), problems),
|
|
105
|
+
tmpDir: setting(() => loadTmpDirMode(), problems),
|
|
106
|
+
writesAllowed: writesAllowed(),
|
|
107
|
+
problems,
|
|
108
|
+
};
|
|
109
|
+
return {
|
|
110
|
+
content: [{ type: 'text', text: renderConfig(config) }],
|
|
111
|
+
structuredContent: { ...config },
|
|
112
|
+
};
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Leest één instelling en vangt een geweigerde waarde op als melding in plaats van
|
|
117
|
+
* als exception. Bewust geen doorgeefluik naar process.env: in diezelfde omgeving
|
|
118
|
+
* zitten tokens en van alles, en die horen niet in een toolantwoord.
|
|
119
|
+
*/
|
|
120
|
+
function setting(read, problems) {
|
|
121
|
+
try {
|
|
122
|
+
return read();
|
|
123
|
+
}
|
|
124
|
+
catch (error) {
|
|
125
|
+
problems.push(error instanceof Error ? error.message : String(error));
|
|
126
|
+
return null;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
function renderConfig(config) {
|
|
130
|
+
const lines = [`phpstan-mcp ${config.version}`, '', 'Projectmappen:'];
|
|
131
|
+
if (config.roots.length === 0) {
|
|
132
|
+
lines.push(` (geen; zet ${ROOTS_ENV_VAR})`);
|
|
133
|
+
}
|
|
134
|
+
else {
|
|
135
|
+
for (const root of config.roots) {
|
|
136
|
+
lines.push(` ${root.path ?? root.raw}${root.problem === null ? '' : ` — ${root.problem}`}`);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
lines.push('', `Geheugenlimiet: ${config.memoryLimit ?? 'niet gezet (die van PHP zelf)'}`, `Tegelijk: ${config.maxParallel === null ? 'onbekend' : String(config.maxParallel)}`, `Tijdelijke map: ${config.tmpDir === null ? 'onbekend' : config.tmpDir}`, `Schrijvende tools: ${config.writesAllowed ? 'aan (generate_baseline bestaat)' : 'uit'}`);
|
|
140
|
+
if (config.problems.length > 0) {
|
|
141
|
+
lines.push('', 'Geweigerde instellingen:');
|
|
142
|
+
for (const problem of config.problems)
|
|
143
|
+
lines.push(`- ${problem}`);
|
|
144
|
+
}
|
|
145
|
+
return lines.join('\n');
|
|
146
|
+
}
|
|
147
|
+
/** Hangt `diagnose_project` aan de server: PHPStans eigen opstelling in een project. */
|
|
148
|
+
export function registerDiagnose(server, roots) {
|
|
149
|
+
server.registerTool('diagnose_project', {
|
|
150
|
+
title: 'PHPStan-opstelling opvragen',
|
|
151
|
+
description: 'Vraagt PHPStan zelf om zijn opstelling in dit project: PHP- en PHPStan-versie, de ' +
|
|
152
|
+
'configs die Composer-pakketten meebrengen (zoals Larastan) en of de turbo-extensie ' +
|
|
153
|
+
'aanstaat. Draait geen analyse. Gebruik dit als een project zich anders gedraagt dan ' +
|
|
154
|
+
'een ander project, vóórdat je aan de code gaat twijfelen.',
|
|
155
|
+
inputSchema: {
|
|
156
|
+
project: projectArgument,
|
|
157
|
+
timeoutSeconds: z.number().int().positive().max(1800).optional(),
|
|
158
|
+
},
|
|
159
|
+
outputSchema: {
|
|
160
|
+
project: z.string(),
|
|
161
|
+
output: z.string().describe('PHPStans eigen tekst, ongewijzigd'),
|
|
162
|
+
},
|
|
163
|
+
annotations: readOnly(),
|
|
164
|
+
}, async (args, extra) => {
|
|
165
|
+
try {
|
|
166
|
+
const resolved = resolveProject(args.project, roots);
|
|
167
|
+
const diagnosis = await diagnose(resolved, {
|
|
168
|
+
...(args.timeoutSeconds === undefined ? {} : { timeoutMs: args.timeoutSeconds * 1000 }),
|
|
169
|
+
signal: extra.signal,
|
|
170
|
+
});
|
|
171
|
+
return {
|
|
172
|
+
content: [{ type: 'text', text: diagnosis.output }],
|
|
173
|
+
structuredContent: { ...diagnosis },
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
catch (error) {
|
|
177
|
+
return toFailure(error);
|
|
178
|
+
}
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
/** Hangt `baseline_summary` aan de server: wat de baseline verbergt. */
|
|
182
|
+
export function registerBaselineSummary(server, roots) {
|
|
183
|
+
server.registerTool('baseline_summary', {
|
|
184
|
+
title: 'Baseline samenvatten',
|
|
185
|
+
description: 'Leest de phpstan-baseline*.neon van een project en telt wat er genegeerd wordt, ' +
|
|
186
|
+
'per identifier en per bestand. Draait geen analyse. Let op: wat hier in staat is ' +
|
|
187
|
+
'precies wat analyse_project NIET meldt — een project dat zijn baseline includet, ' +
|
|
188
|
+
'rapporteert alleen de fouten die er nieuw bij komen.',
|
|
189
|
+
inputSchema: { project: projectArgument },
|
|
190
|
+
outputSchema: {
|
|
191
|
+
project: z.string(),
|
|
192
|
+
files: z.array(z.object({ file: z.string(), entries: z.number(), errors: z.number() })),
|
|
193
|
+
totals: z.object({ entries: z.number(), errors: z.number() }),
|
|
194
|
+
byIdentifier: z.array(z.object({ identifier: z.string(), count: z.number() })),
|
|
195
|
+
byPath: z.array(z.object({ path: z.string(), count: z.number() })),
|
|
196
|
+
},
|
|
197
|
+
annotations: readOnly(),
|
|
198
|
+
}, ({ project }) => {
|
|
199
|
+
try {
|
|
200
|
+
const summary = summariseBaseline(resolveProject(project, roots));
|
|
201
|
+
return {
|
|
202
|
+
content: [{ type: 'text', text: renderBaseline(summary) }],
|
|
203
|
+
structuredContent: { ...summary },
|
|
204
|
+
};
|
|
205
|
+
}
|
|
206
|
+
catch (error) {
|
|
207
|
+
return toFailure(error);
|
|
208
|
+
}
|
|
209
|
+
});
|
|
210
|
+
}
|
|
211
|
+
//# sourceMappingURL=inspect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inspect.js","sourceRoot":"","sources":["../../src/tools/inspect.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
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) {
|
|
4
|
+
server.registerPrompt('phpstan_wijziging_nakijken', {
|
|
5
|
+
title: 'Eigen wijziging nakijken met PHPStan',
|
|
6
|
+
description: 'Het werkpatroon om je eigen wijziging na te kijken zonder het hele project door te rekenen.',
|
|
7
|
+
argsSchema: {
|
|
8
|
+
project: z
|
|
9
|
+
.string()
|
|
10
|
+
.optional()
|
|
11
|
+
.describe('Absoluut pad naar de projectroot; laat leeg om eerst list_projects te doen'),
|
|
12
|
+
},
|
|
13
|
+
}, ({ project }) => ({
|
|
14
|
+
messages: [
|
|
15
|
+
{
|
|
16
|
+
role: 'user',
|
|
17
|
+
content: {
|
|
18
|
+
type: 'text',
|
|
19
|
+
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}.`,
|
|
23
|
+
'',
|
|
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. Repareer de bevindingen bij de bron. Verzwak geen types naar `mixed` en voeg',
|
|
32
|
+
' niets aan de baseline toe.',
|
|
33
|
+
'4. Draai `analyse_changed` opnieuw tot het schoon is. Blijven er veel',
|
|
34
|
+
' bevindingen van één soort over, gebruik dan `identifiers` om er per soort',
|
|
35
|
+
' door te lopen.',
|
|
36
|
+
'',
|
|
37
|
+
'Gedraagt het project zich onverklaarbaar, draai dan `diagnose_project` voordat',
|
|
38
|
+
'je aan de code twijfelt.',
|
|
39
|
+
].join('\n'),
|
|
40
|
+
},
|
|
41
|
+
},
|
|
42
|
+
],
|
|
43
|
+
}));
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=prompts.js.map
|
|
@@ -0,0 +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,sCAAsC;QAC7C,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,+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"}
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
import type { AnalyseOptions } from '../phpstan.js';
|
|
4
|
+
import type { Window } from '../report.js';
|
|
5
|
+
import type { ResolvedProject } from '../project.js';
|
|
6
|
+
import type { Root } from '../roots.js';
|
|
7
|
+
/** Tekstresultaat waar het model iets aan heeft als er iets misgaat. */
|
|
8
|
+
export type ToolResult = {
|
|
9
|
+
content: {
|
|
10
|
+
type: 'text';
|
|
11
|
+
text: string;
|
|
12
|
+
}[];
|
|
13
|
+
structuredContent?: Record<string, unknown>;
|
|
14
|
+
isError?: boolean;
|
|
15
|
+
};
|
|
16
|
+
/**
|
|
17
|
+
* Nullable veld als `anyOf` in plaats van `type: [..., "null"]`. Zod's `.nullable()`
|
|
18
|
+
* levert de array-vorm op; die is geldig JSON Schema, maar meerdere MCP-clients
|
|
19
|
+
* lezen `type` als één string en laten de constraint dan vallen of weigeren de tool.
|
|
20
|
+
*
|
|
21
|
+
* Let op de `z.literal(null)`: zod vouwt zowel `.nullable()` als een union met
|
|
22
|
+
* `z.null()` terug naar diezelfde array-vorm. Alleen de literal levert echt `anyOf`
|
|
23
|
+
* op (met een overbodige maar onschadelijke `const: null` erbij).
|
|
24
|
+
*/
|
|
25
|
+
export declare function nullable<T extends z.ZodType>(schema: T): z.ZodUnion<readonly [T, z.ZodLiteral<null>]>;
|
|
26
|
+
export declare const projectArgument: z.ZodString;
|
|
27
|
+
export declare const analysisShape: {
|
|
28
|
+
project: z.ZodString;
|
|
29
|
+
totals: z.ZodObject<{
|
|
30
|
+
fileErrors: z.ZodNumber;
|
|
31
|
+
generalErrors: z.ZodNumber;
|
|
32
|
+
}, z.core.$strip>;
|
|
33
|
+
generalErrors: z.ZodArray<z.ZodString>;
|
|
34
|
+
warnings: z.ZodArray<z.ZodString>;
|
|
35
|
+
notices: z.ZodArray<z.ZodString>;
|
|
36
|
+
omitted: z.ZodObject<{
|
|
37
|
+
warnings: z.ZodNumber;
|
|
38
|
+
generalErrors: z.ZodNumber;
|
|
39
|
+
}, z.core.$strip>;
|
|
40
|
+
summary: z.ZodObject<{
|
|
41
|
+
filesWithFindings: z.ZodNumber;
|
|
42
|
+
byFile: z.ZodArray<z.ZodObject<{
|
|
43
|
+
file: z.ZodString;
|
|
44
|
+
count: z.ZodNumber;
|
|
45
|
+
}, z.core.$strip>>;
|
|
46
|
+
byIdentifier: z.ZodArray<z.ZodObject<{
|
|
47
|
+
identifier: z.ZodString;
|
|
48
|
+
count: z.ZodNumber;
|
|
49
|
+
}, z.core.$strip>>;
|
|
50
|
+
}, z.core.$strip>;
|
|
51
|
+
findings: z.ZodArray<z.ZodObject<{
|
|
52
|
+
file: z.ZodString;
|
|
53
|
+
line: z.ZodUnion<readonly [z.ZodNumber, z.ZodLiteral<null>]>;
|
|
54
|
+
message: z.ZodString;
|
|
55
|
+
identifier: z.ZodUnion<readonly [z.ZodString, z.ZodLiteral<null>]>;
|
|
56
|
+
tip: z.ZodUnion<readonly [z.ZodString, z.ZodLiteral<null>]>;
|
|
57
|
+
}, z.core.$strip>>;
|
|
58
|
+
page: z.ZodObject<{
|
|
59
|
+
offset: z.ZodNumber;
|
|
60
|
+
limit: z.ZodNumber;
|
|
61
|
+
returned: z.ZodNumber;
|
|
62
|
+
total: z.ZodNumber;
|
|
63
|
+
hasMore: z.ZodBoolean;
|
|
64
|
+
}, z.core.$strip>;
|
|
65
|
+
filter: z.ZodUnion<readonly [z.ZodArray<z.ZodString>, z.ZodLiteral<null>]>;
|
|
66
|
+
};
|
|
67
|
+
export declare const configArgument: z.ZodOptional<z.ZodString>;
|
|
68
|
+
export declare const windowShape: {
|
|
69
|
+
identifiers: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
70
|
+
offset: z.ZodOptional<z.ZodNumber>;
|
|
71
|
+
limit: z.ZodOptional<z.ZodNumber>;
|
|
72
|
+
};
|
|
73
|
+
/**
|
|
74
|
+
* Argumenten die alle analyse-tools delen. Los gehouden van de zod-schema's, want
|
|
75
|
+
* die verschillen per tool in welke velden erbij staan.
|
|
76
|
+
*/
|
|
77
|
+
interface CommonArgs {
|
|
78
|
+
readonly level?: string | undefined;
|
|
79
|
+
readonly config?: string | undefined;
|
|
80
|
+
readonly memoryLimit?: string | undefined;
|
|
81
|
+
readonly timeoutSeconds?: number | undefined;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Zet de gedeelde argumenten om in AnalyseOptions. `config` gaat door resolveWithin:
|
|
85
|
+
* een neon mag `bootstrapFiles` en extensies bevatten, dus een vrij te kiezen
|
|
86
|
+
* configpad zou anders een route zijn om willekeurige PHP-code te laten uitvoeren —
|
|
87
|
+
* langs de whitelist heen die `project` juist wél afdwingt.
|
|
88
|
+
*/
|
|
89
|
+
export declare function common(resolved: ResolvedProject, args: CommonArgs): AnalyseOptions;
|
|
90
|
+
/** Zet de venster-argumenten van een tool om in een Window voor het rapport. */
|
|
91
|
+
export declare function window(args: {
|
|
92
|
+
offset?: number | undefined;
|
|
93
|
+
limit?: number | undefined;
|
|
94
|
+
identifiers?: string[] | undefined;
|
|
95
|
+
}): Window;
|
|
96
|
+
/**
|
|
97
|
+
* Wat een tool met een geresolvet project wil doen: analyseren met deze opties, of
|
|
98
|
+
* niets — dat laatste is geen fout maar een uitkomst, zoals "geen enkel bestand
|
|
99
|
+
* gewijzigd". Dan wordt PHPStan niet gestart en gaat er alleen tekst terug.
|
|
100
|
+
*/
|
|
101
|
+
type Plan = {
|
|
102
|
+
readonly options: AnalyseOptions;
|
|
103
|
+
readonly heading?: string;
|
|
104
|
+
} | {
|
|
105
|
+
readonly nothingToDo: string;
|
|
106
|
+
};
|
|
107
|
+
/**
|
|
108
|
+
* Resolvet het project één keer en geeft het aan `plan`, zodat een tool die zelf nog
|
|
109
|
+
* paden binnen dat project moet valideren dat op hetzelfde geresolvede project doet.
|
|
110
|
+
* Eerder resolveerde analyse_file het project en deed runAnalysis dat daarna nog
|
|
111
|
+
* een keer.
|
|
112
|
+
*/
|
|
113
|
+
export declare function runAnalysis(server: McpServer, roots: Root[], project: string, plan: (resolved: ResolvedProject) => Plan | Promise<Plan>, window: Window, signal?: AbortSignal): Promise<ToolResult>;
|
|
114
|
+
/**
|
|
115
|
+
* Analyseren verandert de broncode niet. PHPStan schrijft wel zijn resultcache weg,
|
|
116
|
+
* maar dat is geen wijziging waar de gebruiker iets van merkt.
|
|
117
|
+
*/
|
|
118
|
+
export declare function readOnly(): {
|
|
119
|
+
readOnlyHint: true;
|
|
120
|
+
destructiveHint: false;
|
|
121
|
+
idempotentHint: true;
|
|
122
|
+
openWorldHint: false;
|
|
123
|
+
};
|
|
124
|
+
/**
|
|
125
|
+
* Verandert wel iets, maar niet aan de broncode. `idempotentHint` staat aan omdat
|
|
126
|
+
* twee keer legen hetzelfde oplevert; `destructiveHint` omdat er data weggaat die
|
|
127
|
+
* PHPStan daarna opnieuw moet opbouwen.
|
|
128
|
+
*/
|
|
129
|
+
export declare function clears(): {
|
|
130
|
+
readOnlyHint: false;
|
|
131
|
+
destructiveHint: true;
|
|
132
|
+
idempotentHint: true;
|
|
133
|
+
openWorldHint: false;
|
|
134
|
+
};
|
|
135
|
+
/**
|
|
136
|
+
* Schrijft een bestand in het project. Niet idempotent: draai je het opnieuw nadat
|
|
137
|
+
* er fouten bij zijn gekomen, dan staat er iets anders in.
|
|
138
|
+
*/
|
|
139
|
+
export declare function writes(): {
|
|
140
|
+
readOnlyHint: false;
|
|
141
|
+
destructiveHint: true;
|
|
142
|
+
idempotentHint: false;
|
|
143
|
+
openWorldHint: false;
|
|
144
|
+
};
|
|
145
|
+
/**
|
|
146
|
+
* Zet een fout die het model kan opvangen om in een tool-resultaat met `isError`.
|
|
147
|
+
* Alles wat hier niet in de lijst staat slaat door naar de SDK: dat is een bug in
|
|
148
|
+
* deze server en geen situatie waar het model iets mee kan.
|
|
149
|
+
*/
|
|
150
|
+
export declare function toFailure(error: unknown): ToolResult;
|
|
151
|
+
/** Een tool-antwoord dat als mislukt geldt, met alleen tekst erin. */
|
|
152
|
+
export declare function failure(text: string): ToolResult;
|
|
153
|
+
export {};
|