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,219 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { BaselineError, describeIncludedBaseline } from '../baseline.js';
|
|
3
|
+
import { GitError } from '../changed.js';
|
|
4
|
+
import { PhpstanError, analyse } from '../phpstan.js';
|
|
5
|
+
import { DEFAULT_LIMIT, MAX_LIMIT, buildReport, renderReport } from '../report.js';
|
|
6
|
+
import { ProjectError, resolveProject, resolveWithin } from '../project.js';
|
|
7
|
+
import { TmpDirError } from '../tmpdir.js';
|
|
8
|
+
/**
|
|
9
|
+
* Nullable veld als `anyOf` in plaats van `type: [..., "null"]`. Zod's `.nullable()`
|
|
10
|
+
* levert de array-vorm op; die is geldig JSON Schema, maar meerdere MCP-clients
|
|
11
|
+
* lezen `type` als één string en laten de constraint dan vallen of weigeren de tool.
|
|
12
|
+
*
|
|
13
|
+
* Let op de `z.literal(null)`: zod vouwt zowel `.nullable()` als een union met
|
|
14
|
+
* `z.null()` terug naar diezelfde array-vorm. Alleen de literal levert echt `anyOf`
|
|
15
|
+
* op (met een overbodige maar onschadelijke `const: null` erbij).
|
|
16
|
+
*/
|
|
17
|
+
export function nullable(schema) {
|
|
18
|
+
return z.union([schema, z.literal(null)]);
|
|
19
|
+
}
|
|
20
|
+
export const projectArgument = z
|
|
21
|
+
.string()
|
|
22
|
+
.describe('Absoluut pad naar de projectroot, zoals list_projects het teruggeeft');
|
|
23
|
+
export const analysisShape = {
|
|
24
|
+
project: z.string(),
|
|
25
|
+
totals: z.object({ fileErrors: z.number(), generalErrors: z.number() }),
|
|
26
|
+
generalErrors: z
|
|
27
|
+
.array(z.string())
|
|
28
|
+
.describe('Fouten die niet aan een bestand hangen, zoals een crash of configuratiefout'),
|
|
29
|
+
warnings: z
|
|
30
|
+
.array(z.string())
|
|
31
|
+
.describe('Wat PHPStan naast het resultaat meldde. Staat hier "Result is incomplete", dan ' +
|
|
32
|
+
'dekt de analyse niet het hele project en is een schone uitslag geen bewijs'),
|
|
33
|
+
notices: z
|
|
34
|
+
.array(z.string())
|
|
35
|
+
.describe('Meldingen van deze server zelf, zoals een baseline die meedoet — dan rapporteert ' +
|
|
36
|
+
'PHPStan alleen wat er nieuw bij komt'),
|
|
37
|
+
omitted: z
|
|
38
|
+
.object({ warnings: z.number(), generalErrors: z.number() })
|
|
39
|
+
.describe('Hoeveel meldingen weggelaten zijn omdat het er te veel waren'),
|
|
40
|
+
summary: z
|
|
41
|
+
.object({
|
|
42
|
+
filesWithFindings: z.number(),
|
|
43
|
+
byFile: z.array(z.object({ file: z.string(), count: z.number() })),
|
|
44
|
+
byIdentifier: z.array(z.object({ identifier: z.string(), count: z.number() })),
|
|
45
|
+
})
|
|
46
|
+
.describe('Tellingen over álle bevindingen, ook die buiten deze pagina vallen'),
|
|
47
|
+
findings: z.array(z.object({
|
|
48
|
+
file: z.string().describe('Pad relatief aan de projectroot'),
|
|
49
|
+
line: nullable(z.number()),
|
|
50
|
+
message: z.string(),
|
|
51
|
+
identifier: nullable(z.string()),
|
|
52
|
+
tip: nullable(z.string()),
|
|
53
|
+
})),
|
|
54
|
+
page: z
|
|
55
|
+
.object({
|
|
56
|
+
offset: z.number(),
|
|
57
|
+
limit: z.number(),
|
|
58
|
+
returned: z.number(),
|
|
59
|
+
total: z.number(),
|
|
60
|
+
hasMore: z.boolean(),
|
|
61
|
+
})
|
|
62
|
+
.describe('Welk deel van de bevindingen dit antwoord bevat'),
|
|
63
|
+
filter: nullable(z.array(z.string())).describe('Op welke identifiers deze pagina beperkt is, of null als er niet gefilterd is'),
|
|
64
|
+
};
|
|
65
|
+
export const configArgument = z
|
|
66
|
+
.string()
|
|
67
|
+
.optional()
|
|
68
|
+
.describe('Ander configbestand dan PHPStan zelf zou pakken, bijv. "phpstan-strict.neon". ' +
|
|
69
|
+
'Moet binnen het project liggen');
|
|
70
|
+
export const windowShape = {
|
|
71
|
+
identifiers: z
|
|
72
|
+
.array(z.string())
|
|
73
|
+
.optional()
|
|
74
|
+
.describe('Beperk de bevindingen tot deze identifiers, bijv. ["argument.type"]. ' +
|
|
75
|
+
'"missingType" matcht de hele groep. De samenvatting blijft over alles tellen'),
|
|
76
|
+
offset: z.number().int().min(0).optional().describe('Sla de eerste N bevindingen over'),
|
|
77
|
+
limit: z
|
|
78
|
+
.number()
|
|
79
|
+
.int()
|
|
80
|
+
.min(1)
|
|
81
|
+
.max(MAX_LIMIT)
|
|
82
|
+
.optional()
|
|
83
|
+
.describe(`Hoeveel bevindingen dit antwoord bevat (standaard ${String(DEFAULT_LIMIT)})`),
|
|
84
|
+
};
|
|
85
|
+
/**
|
|
86
|
+
* Zet de gedeelde argumenten om in AnalyseOptions. `config` gaat door resolveWithin:
|
|
87
|
+
* een neon mag `bootstrapFiles` en extensies bevatten, dus een vrij te kiezen
|
|
88
|
+
* configpad zou anders een route zijn om willekeurige PHP-code te laten uitvoeren —
|
|
89
|
+
* langs de whitelist heen die `project` juist wél afdwingt.
|
|
90
|
+
*/
|
|
91
|
+
export function common(resolved, args) {
|
|
92
|
+
return {
|
|
93
|
+
...(args.level === undefined ? {} : { level: args.level }),
|
|
94
|
+
...(args.config === undefined ? {} : { config: resolveWithin(resolved, args.config) }),
|
|
95
|
+
...(args.memoryLimit === undefined ? {} : { memoryLimit: args.memoryLimit }),
|
|
96
|
+
...(args.timeoutSeconds === undefined ? {} : { timeoutMs: args.timeoutSeconds * 1000 }),
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
/** Zet de venster-argumenten van een tool om in een Window voor het rapport. */
|
|
100
|
+
export function window(args) {
|
|
101
|
+
return {
|
|
102
|
+
offset: args.offset,
|
|
103
|
+
limit: args.limit,
|
|
104
|
+
...(args.identifiers === undefined ? {} : { identifiers: args.identifiers }),
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Stuurt een logmelding naar de client. Faalt bewust stil: een client die
|
|
109
|
+
* halverwege wegvalt of geen logging wil, mag een lopende analyse niet omleggen.
|
|
110
|
+
* Dit staat naast de opstartregel op stderr — die is voor de mens die het
|
|
111
|
+
* clientlog opent, dit is voor de client zelf.
|
|
112
|
+
*/
|
|
113
|
+
function log(server, level, data) {
|
|
114
|
+
void server.server.sendLoggingMessage({ level, logger: 'phpstan-mcp', data }).catch(() => undefined);
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Resolvet het project één keer en geeft het aan `plan`, zodat een tool die zelf nog
|
|
118
|
+
* paden binnen dat project moet valideren dat op hetzelfde geresolvede project doet.
|
|
119
|
+
* Eerder resolveerde analyse_file het project en deed runAnalysis dat daarna nog
|
|
120
|
+
* een keer.
|
|
121
|
+
*/
|
|
122
|
+
export async function runAnalysis(server, roots, project, plan, window, signal) {
|
|
123
|
+
const begin = Date.now();
|
|
124
|
+
try {
|
|
125
|
+
const resolved = resolveProject(project, roots);
|
|
126
|
+
const chosen = await plan(resolved);
|
|
127
|
+
if ('nothingToDo' in chosen) {
|
|
128
|
+
// Toch het volledige rapportschema teruggeven: een client die op
|
|
129
|
+
// structuredContent vertrouwt moet niet ineens een ander soort antwoord
|
|
130
|
+
// krijgen omdat er niets te doen was.
|
|
131
|
+
const empty = buildReport({
|
|
132
|
+
project: resolved.path,
|
|
133
|
+
findings: [],
|
|
134
|
+
generalErrors: [],
|
|
135
|
+
warnings: [],
|
|
136
|
+
totals: { fileErrors: 0, generalErrors: 0 },
|
|
137
|
+
}, {});
|
|
138
|
+
return {
|
|
139
|
+
content: [{ type: 'text', text: chosen.nothingToDo }],
|
|
140
|
+
structuredContent: { ...empty },
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
// Het signaal komt uit het MCP-verzoek zelf: annuleert de client, dan wordt de
|
|
144
|
+
// procesgroep opgeruimd in plaats van dat PHPStan doorrekent voor niemand.
|
|
145
|
+
log(server, 'debug', { gebeurtenis: 'analyse gestart', project: resolved.path });
|
|
146
|
+
const result = await analyse(resolved, {
|
|
147
|
+
...chosen.options,
|
|
148
|
+
...(signal === undefined ? {} : { signal }),
|
|
149
|
+
});
|
|
150
|
+
log(server, 'info', {
|
|
151
|
+
gebeurtenis: 'analyse klaar',
|
|
152
|
+
project: resolved.path,
|
|
153
|
+
bevindingen: result.totals.fileErrors,
|
|
154
|
+
waarschuwingen: result.warnings.length,
|
|
155
|
+
duurMs: Date.now() - begin,
|
|
156
|
+
});
|
|
157
|
+
const report = buildReport(result, window, collectNotices(resolved));
|
|
158
|
+
const heading = chosen.heading === undefined ? '' : `${chosen.heading}\n\n`;
|
|
159
|
+
return {
|
|
160
|
+
content: [{ type: 'text', text: heading + renderReport(report) }],
|
|
161
|
+
structuredContent: { ...report },
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
catch (error) {
|
|
165
|
+
return toFailure(error);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Wat deze server zelf bij een analyse te melden heeft. Nu alleen de baseline: doet
|
|
170
|
+
* die mee, dan rapporteert PHPStan alleen wat er nieuw bij komt, en dan is een
|
|
171
|
+
* schone uitslag geen schone code. Dat staat in de toolbeschrijving, maar niet in
|
|
172
|
+
* het antwoord waar het model naar kijkt.
|
|
173
|
+
*/
|
|
174
|
+
function collectNotices(project) {
|
|
175
|
+
const baseline = describeIncludedBaseline(project);
|
|
176
|
+
return baseline === null ? [] : [baseline];
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Analyseren verandert de broncode niet. PHPStan schrijft wel zijn resultcache weg,
|
|
180
|
+
* maar dat is geen wijziging waar de gebruiker iets van merkt.
|
|
181
|
+
*/
|
|
182
|
+
export function readOnly() {
|
|
183
|
+
return { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false };
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* Verandert wel iets, maar niet aan de broncode. `idempotentHint` staat aan omdat
|
|
187
|
+
* twee keer legen hetzelfde oplevert; `destructiveHint` omdat er data weggaat die
|
|
188
|
+
* PHPStan daarna opnieuw moet opbouwen.
|
|
189
|
+
*/
|
|
190
|
+
export function clears() {
|
|
191
|
+
return { readOnlyHint: false, destructiveHint: true, idempotentHint: true, openWorldHint: false };
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* Schrijft een bestand in het project. Niet idempotent: draai je het opnieuw nadat
|
|
195
|
+
* er fouten bij zijn gekomen, dan staat er iets anders in.
|
|
196
|
+
*/
|
|
197
|
+
export function writes() {
|
|
198
|
+
return { readOnlyHint: false, destructiveHint: true, idempotentHint: false, openWorldHint: false };
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* Zet een fout die het model kan opvangen om in een tool-resultaat met `isError`.
|
|
202
|
+
* Alles wat hier niet in de lijst staat slaat door naar de SDK: dat is een bug in
|
|
203
|
+
* deze server en geen situatie waar het model iets mee kan.
|
|
204
|
+
*/
|
|
205
|
+
export function toFailure(error) {
|
|
206
|
+
if (error instanceof ProjectError ||
|
|
207
|
+
error instanceof PhpstanError ||
|
|
208
|
+
error instanceof BaselineError ||
|
|
209
|
+
error instanceof GitError ||
|
|
210
|
+
error instanceof TmpDirError) {
|
|
211
|
+
return failure(error.message);
|
|
212
|
+
}
|
|
213
|
+
throw error;
|
|
214
|
+
}
|
|
215
|
+
/** Een tool-antwoord dat als mislukt geldt, met alleen tekst erin. */
|
|
216
|
+
export function failure(text) {
|
|
217
|
+
return { isError: true, content: [{ type: 'text', text }] };
|
|
218
|
+
}
|
|
219
|
+
//# sourceMappingURL=shared.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared.js","sourceRoot":"","sources":["../../src/tools/shared.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
+
import type { Root } from '../roots.js';
|
|
3
|
+
/** Env-variabele die schrijvende tools vrijgeeft. */
|
|
4
|
+
export declare const WRITES_ENV_VAR = "PHPSTAN_MCP_ALLOW_WRITES";
|
|
5
|
+
/**
|
|
6
|
+
* Of schrijvende tools geregistreerd mogen worden. Alleen "1" en "true" tellen; al
|
|
7
|
+
* het andere staat uit. Dat faalt de veilige kant op: een typfout laat schrijven
|
|
8
|
+
* uit, en de opstartregel zegt wat er geldt.
|
|
9
|
+
*
|
|
10
|
+
* Niet registreren en niet weigeren-bij-de-aanroep: een tool die bestaat maar altijd
|
|
11
|
+
* nee zegt, kost het model een ronde en context om dat te ontdekken.
|
|
12
|
+
*/
|
|
13
|
+
export declare function writesAllowed(env?: NodeJS.ProcessEnv): boolean;
|
|
14
|
+
/** Hangt `clear_result_cache` aan de server. Verandert wel iets, maar niet aan de broncode. */
|
|
15
|
+
export declare function registerClearResultCache(server: McpServer, roots: Root[]): void;
|
|
16
|
+
/** Hangt `generate_baseline` aan de server. Alleen aanroepen als schrijven aanstaat. */
|
|
17
|
+
export declare function registerGenerateBaseline(server: McpServer, roots: Root[]): void;
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { clearResultCache, generateBaseline } from '../phpstan.js';
|
|
3
|
+
import { displayPath } from '../report.js';
|
|
4
|
+
import { resolveNewWithin, resolveProject, resolveWithin } from '../project.js';
|
|
5
|
+
import { clears, common, configArgument, projectArgument, toFailure, writes } from './shared.js';
|
|
6
|
+
/** Env-variabele die schrijvende tools vrijgeeft. */
|
|
7
|
+
export const WRITES_ENV_VAR = 'PHPSTAN_MCP_ALLOW_WRITES';
|
|
8
|
+
/**
|
|
9
|
+
* Of schrijvende tools geregistreerd mogen worden. Alleen "1" en "true" tellen; al
|
|
10
|
+
* het andere staat uit. Dat faalt de veilige kant op: een typfout laat schrijven
|
|
11
|
+
* uit, en de opstartregel zegt wat er geldt.
|
|
12
|
+
*
|
|
13
|
+
* Niet registreren en niet weigeren-bij-de-aanroep: een tool die bestaat maar altijd
|
|
14
|
+
* nee zegt, kost het model een ronde en context om dat te ontdekken.
|
|
15
|
+
*/
|
|
16
|
+
export function writesAllowed(env = process.env) {
|
|
17
|
+
const configured = env[WRITES_ENV_VAR]?.trim().toLowerCase();
|
|
18
|
+
return configured === '1' || configured === 'true';
|
|
19
|
+
}
|
|
20
|
+
/** Hangt `clear_result_cache` aan de server. Verandert wel iets, maar niet aan de broncode. */
|
|
21
|
+
export function registerClearResultCache(server, roots) {
|
|
22
|
+
server.registerTool('clear_result_cache', {
|
|
23
|
+
title: 'Resultcache legen',
|
|
24
|
+
description: 'Leegt PHPStans resultcache, zodat de volgende analyse alles opnieuw doorrekent. ' +
|
|
25
|
+
'Gebruik dit als een uitslag niet klopt met de code — bijvoorbeeld na een wijziging ' +
|
|
26
|
+
'aan een extensie of een geïncludeerde config. Let op: die cache ligt standaard niet ' +
|
|
27
|
+
'in het project maar in de tijdelijke map van het systeem, en wordt dan gedeeld met ' +
|
|
28
|
+
'elk ander project dat geen eigen tmpDir zet. Het antwoord noemt de map die geleegd is.',
|
|
29
|
+
inputSchema: {
|
|
30
|
+
project: projectArgument,
|
|
31
|
+
config: configArgument,
|
|
32
|
+
timeoutSeconds: z.number().int().positive().max(1800).optional(),
|
|
33
|
+
},
|
|
34
|
+
outputSchema: { project: z.string(), output: z.string() },
|
|
35
|
+
annotations: clears(),
|
|
36
|
+
}, async (args, extra) => {
|
|
37
|
+
try {
|
|
38
|
+
const resolved = resolveProject(args.project, roots);
|
|
39
|
+
const cleared = await clearResultCache(resolved, {
|
|
40
|
+
...(args.config === undefined ? {} : { config: resolveWithin(resolved, args.config) }),
|
|
41
|
+
...(args.timeoutSeconds === undefined ? {} : { timeoutMs: args.timeoutSeconds * 1000 }),
|
|
42
|
+
signal: extra.signal,
|
|
43
|
+
});
|
|
44
|
+
return {
|
|
45
|
+
content: [{ type: 'text', text: cleared.output }],
|
|
46
|
+
structuredContent: { ...cleared },
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
catch (error) {
|
|
50
|
+
return toFailure(error);
|
|
51
|
+
}
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
/** Standaardnaam, dezelfde die PHPStan zelf gebruikt. */
|
|
55
|
+
const DEFAULT_BASELINE = 'phpstan-baseline.neon';
|
|
56
|
+
/** Hangt `generate_baseline` aan de server. Alleen aanroepen als schrijven aanstaat. */
|
|
57
|
+
export function registerGenerateBaseline(server, roots) {
|
|
58
|
+
server.registerTool('generate_baseline', {
|
|
59
|
+
title: 'Baseline genereren',
|
|
60
|
+
description: 'Zet alle huidige fouten in een baseline-bestand, zodat een volgende analyse alleen ' +
|
|
61
|
+
'meldt wat er nieuw bij komt. Bedoeld om een bestaand project onder PHPStan te ' +
|
|
62
|
+
'krijgen, niet om fouten weg te werken: wat hierin komt, wordt daarna niet meer ' +
|
|
63
|
+
'gemeld. Overschrijft een bestaande baseline. Het bestand moet nog wel in de config ' +
|
|
64
|
+
'geïncludeerd worden voordat het effect heeft.',
|
|
65
|
+
inputSchema: {
|
|
66
|
+
project: projectArgument,
|
|
67
|
+
file: z
|
|
68
|
+
.string()
|
|
69
|
+
.optional()
|
|
70
|
+
.describe(`Doelbestand binnen het project (standaard ${DEFAULT_BASELINE})`),
|
|
71
|
+
paths: z.array(z.string()).optional().describe('Paden binnen het project'),
|
|
72
|
+
level: z.string().optional().describe('Level-override, 0 t/m 10 of "max"'),
|
|
73
|
+
config: configArgument,
|
|
74
|
+
allowEmpty: z
|
|
75
|
+
.boolean()
|
|
76
|
+
.optional()
|
|
77
|
+
.describe('Ook schrijven als er niets te negeren valt; anders weigert PHPStan'),
|
|
78
|
+
memoryLimit: z.string().optional(),
|
|
79
|
+
timeoutSeconds: z.number().int().positive().max(1800).optional(),
|
|
80
|
+
},
|
|
81
|
+
outputSchema: {
|
|
82
|
+
project: z.string(),
|
|
83
|
+
file: z.string(),
|
|
84
|
+
errors: z.number().describe('Hoeveel fouten er in de baseline gezet zijn'),
|
|
85
|
+
output: z.string(),
|
|
86
|
+
},
|
|
87
|
+
annotations: writes(),
|
|
88
|
+
}, async (args, extra) => {
|
|
89
|
+
try {
|
|
90
|
+
const resolved = resolveProject(args.project, roots);
|
|
91
|
+
const generated = await generateBaseline(resolved, {
|
|
92
|
+
file: resolveNewWithin(resolved, args.file ?? DEFAULT_BASELINE),
|
|
93
|
+
...(args.paths === undefined
|
|
94
|
+
? {}
|
|
95
|
+
: { paths: args.paths.map((path) => resolveWithin(resolved, path)) }),
|
|
96
|
+
...(args.allowEmpty === undefined ? {} : { allowEmpty: args.allowEmpty }),
|
|
97
|
+
...common(resolved, args),
|
|
98
|
+
signal: extra.signal,
|
|
99
|
+
});
|
|
100
|
+
return {
|
|
101
|
+
content: [{ type: 'text', text: renderGenerated(resolved, generated) }],
|
|
102
|
+
structuredContent: { ...generated },
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
catch (error) {
|
|
106
|
+
return toFailure(error);
|
|
107
|
+
}
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
/** De uitkomst plus wat er nog moet gebeuren voordat de baseline iets doet. */
|
|
111
|
+
function renderGenerated(project, generated) {
|
|
112
|
+
const naam = displayPath(project.path, generated.file);
|
|
113
|
+
return [
|
|
114
|
+
`${String(generated.errors)} fout(en) in ${naam} gezet.`,
|
|
115
|
+
'',
|
|
116
|
+
`Deze fouten worden vanaf nu niet meer gemeld zodra ${naam} in de configuratie staat:`,
|
|
117
|
+
'',
|
|
118
|
+
'includes:',
|
|
119
|
+
` - ${naam}`,
|
|
120
|
+
].join('\n');
|
|
121
|
+
}
|
|
122
|
+
//# sourceMappingURL=writes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"writes.js","sourceRoot":"","sources":["../../src/tools/writes.ts"],"names":[],"mappings":"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"}
|
package/dist/tools.d.ts
CHANGED
|
@@ -1,15 +1,4 @@
|
|
|
1
1
|
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
2
|
import type { Root } from './roots.js';
|
|
3
|
-
/** Env-variabele die schrijvende tools vrijgeeft. */
|
|
4
|
-
export declare const WRITES_ENV_VAR = "PHPSTAN_MCP_ALLOW_WRITES";
|
|
5
|
-
/**
|
|
6
|
-
* Of schrijvende tools geregistreerd mogen worden. Alleen "1" en "true" tellen; al
|
|
7
|
-
* het andere staat uit. Dat faalt de veilige kant op: een typfout laat schrijven
|
|
8
|
-
* uit, en de opstartregel zegt wat er geldt.
|
|
9
|
-
*
|
|
10
|
-
* Niet registreren en niet weigeren-bij-de-aanroep: een tool die bestaat maar altijd
|
|
11
|
-
* nee zegt, kost het model een ronde en context om dat te ontdekken.
|
|
12
|
-
*/
|
|
13
|
-
export declare function writesAllowed(env?: NodeJS.ProcessEnv): boolean;
|
|
14
3
|
/** Hangt alle tools aan de server. */
|
|
15
4
|
export declare function registerTools(server: McpServer, roots: Root[]): void;
|