projscan 1.10.0 → 1.11.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.
@@ -18,36 +18,90 @@ export declare const PLUGIN_PREVIEW_FLAG = "PROJSCAN_PLUGINS_PREVIEW";
18
18
  export declare const PLUGIN_SCHEMA_VERSION = 1;
19
19
  export declare const PLUGIN_DIR = ".projscan-plugins";
20
20
  export declare const PLUGIN_MANIFEST_EXT = ".projscan-plugin.json";
21
- export type PluginKind = 'analyzer';
22
- export interface PluginManifest {
21
+ export type PluginKind = 'analyzer' | 'reporter';
22
+ export type PluginReporterCommand = 'doctor' | 'analyze' | 'ci';
23
+ export declare const PLUGIN_REPORTER_COMMANDS: readonly ["doctor", "analyze", "ci"];
24
+ interface PluginManifestBase {
23
25
  schemaVersion: number;
24
26
  name: string;
25
27
  kind: PluginKind;
26
28
  /** Module entry point, relative to the manifest file. */
27
29
  module: string;
28
- /** Issue category emitted by this plugin (`Issue.category`). */
29
- category: string;
30
30
  /** Optional human-readable summary. */
31
31
  description?: string;
32
32
  }
33
+ export interface PluginAnalyzerManifest extends PluginManifestBase {
34
+ kind: 'analyzer';
35
+ /** Issue category emitted by this plugin (`Issue.category`). */
36
+ category: string;
37
+ }
38
+ export interface PluginReporterManifest extends PluginManifestBase {
39
+ kind: 'reporter';
40
+ /** CLI commands this reporter can render. */
41
+ commands: PluginReporterCommand[];
42
+ }
43
+ export type PluginManifest = PluginAnalyzerManifest | PluginReporterManifest;
33
44
  export interface PluginAnalyzerExports {
34
45
  check: (rootPath: string, files: FileEntry[]) => Promise<Issue[]> | Issue[];
35
46
  }
47
+ export interface PluginReporterContext<TPayload = unknown> {
48
+ command: PluginReporterCommand;
49
+ rootPath: string;
50
+ manifest: PluginReporterManifest;
51
+ payload: TPayload;
52
+ }
53
+ export interface PluginReporterExports {
54
+ render: (context: PluginReporterContext) => Promise<string> | string;
55
+ }
36
56
  export interface LoadedPlugin {
37
- manifest: PluginManifest;
57
+ manifest: PluginAnalyzerManifest;
38
58
  /** Absolute path to the manifest file on disk. */
39
59
  manifestPath: string;
40
60
  /** Absolute path to the resolved module entry point. */
41
61
  modulePath: string;
42
62
  exports: PluginAnalyzerExports;
43
63
  }
64
+ export interface LoadedReporterPlugin {
65
+ manifest: PluginReporterManifest;
66
+ /** Absolute path to the manifest file on disk. */
67
+ manifestPath: string;
68
+ /** Absolute path to the resolved module entry point. */
69
+ modulePath: string;
70
+ exports: PluginReporterExports;
71
+ }
44
72
  export interface PluginDiscoveryEntry {
45
73
  manifestPath: string;
46
74
  manifest: PluginManifest | null;
47
75
  /** Set when the manifest failed to parse or validate. */
48
76
  error?: string;
77
+ diagnostic?: PluginDiagnostic;
49
78
  }
79
+ export type PluginManifestFileResult = {
80
+ ok: true;
81
+ manifest: PluginManifest;
82
+ } | {
83
+ ok: false;
84
+ reason: string;
85
+ diagnostic: PluginDiagnostic;
86
+ };
87
+ export type PluginReporterResolveResult = {
88
+ ok: true;
89
+ plugin: LoadedReporterPlugin;
90
+ } | {
91
+ ok: false;
92
+ reason: string;
93
+ diagnostic: PluginDiagnostic;
94
+ };
95
+ export type PluginReporterRenderResult = {
96
+ ok: true;
97
+ output: string;
98
+ } | {
99
+ ok: false;
100
+ reason: string;
101
+ diagnostic: PluginDiagnostic;
102
+ };
50
103
  export declare function pluginsEnabled(): boolean;
104
+ export declare function readPluginManifestFile(manifestPath: string): Promise<PluginManifestFileResult>;
51
105
  /**
52
106
  * Discover every plugin manifest under `<root>/.projscan-plugins/`. Manifests
53
107
  * that fail to parse or validate are returned with `manifest: null` and an
@@ -63,6 +117,8 @@ export declare function discoverPluginManifests(rootPath: string): Promise<Plugi
63
117
  * We never let one bad plugin break the projscan pipeline.
64
118
  */
65
119
  export declare function loadPlugins(rootPath: string): Promise<LoadedPlugin[]>;
120
+ export declare function resolveReporterPlugin(rootPath: string, reporterName: string, command: PluginReporterCommand): Promise<PluginReporterResolveResult>;
121
+ export declare function renderReporterPlugin(plugin: LoadedReporterPlugin, context: PluginReporterContext): Promise<PluginReporterRenderResult>;
66
122
  /**
67
123
  * Run every loaded analyzer plugin against `files`. Issues that don't pass
68
124
  * a tight shape check are dropped so a malformed plugin can't poison the
@@ -71,6 +127,12 @@ export declare function loadPlugins(rootPath: string): Promise<LoadedPlugin[]>;
71
127
  * collide).
72
128
  */
73
129
  export declare function runAnalyzerPlugins(plugins: LoadedPlugin[], rootPath: string, files: FileEntry[]): Promise<Issue[]>;
130
+ export interface PluginDiagnostic {
131
+ code: 'invalid-manifest' | 'unsupported-schema-version' | 'invalid-name' | 'unsupported-kind' | 'invalid-module' | 'invalid-category' | 'invalid-commands' | 'invalid-description' | 'invalid-json' | 'read-error' | 'plugins-disabled' | 'reporter-not-found' | 'reporter-unsupported-command' | 'invalid-reporter-export' | 'reporter-load-error' | 'reporter-render-error';
132
+ message: string;
133
+ field?: string;
134
+ hint?: string;
135
+ }
74
136
  interface ValidationOk {
75
137
  ok: true;
76
138
  manifest: PluginManifest;
@@ -78,6 +140,7 @@ interface ValidationOk {
78
140
  interface ValidationFail {
79
141
  ok: false;
80
142
  reason: string;
143
+ diagnostic: PluginDiagnostic;
81
144
  }
82
145
  export declare function validateManifest(input: unknown): ValidationOk | ValidationFail;
83
146
  export {};
@@ -20,10 +20,49 @@ export const PLUGIN_PREVIEW_FLAG = 'PROJSCAN_PLUGINS_PREVIEW';
20
20
  export const PLUGIN_SCHEMA_VERSION = 1;
21
21
  export const PLUGIN_DIR = '.projscan-plugins';
22
22
  export const PLUGIN_MANIFEST_EXT = '.projscan-plugin.json';
23
+ export const PLUGIN_REPORTER_COMMANDS = ['doctor', 'analyze', 'ci'];
23
24
  export function pluginsEnabled() {
24
25
  const v = process.env[PLUGIN_PREVIEW_FLAG];
25
26
  return v === '1' || v === 'true';
26
27
  }
28
+ export async function readPluginManifestFile(manifestPath) {
29
+ let raw;
30
+ try {
31
+ raw = await fs.readFile(manifestPath, 'utf-8');
32
+ }
33
+ catch (err) {
34
+ const message = `unable to read manifest: ${err instanceof Error ? err.message : String(err)}`;
35
+ return {
36
+ ok: false,
37
+ reason: message,
38
+ diagnostic: {
39
+ code: 'read-error',
40
+ message,
41
+ hint: 'Check file permissions and try again.',
42
+ },
43
+ };
44
+ }
45
+ let parsed;
46
+ try {
47
+ parsed = JSON.parse(raw);
48
+ }
49
+ catch (err) {
50
+ const message = `invalid JSON: ${err instanceof Error ? err.message : String(err)}`;
51
+ return {
52
+ ok: false,
53
+ reason: message,
54
+ diagnostic: {
55
+ code: 'invalid-json',
56
+ message,
57
+ hint: 'Fix the manifest so it is valid JSON.',
58
+ },
59
+ };
60
+ }
61
+ const validation = validateManifest(parsed);
62
+ return validation.ok
63
+ ? { ok: true, manifest: validation.manifest }
64
+ : { ok: false, reason: validation.reason, diagnostic: validation.diagnostic };
65
+ }
27
66
  /**
28
67
  * Discover every plugin manifest under `<root>/.projscan-plugins/`. Manifests
29
68
  * that fail to parse or validate are returned with `manifest: null` and an
@@ -43,36 +82,17 @@ export async function discoverPluginManifests(rootPath) {
43
82
  if (!name.endsWith(PLUGIN_MANIFEST_EXT))
44
83
  continue;
45
84
  const manifestPath = path.join(dir, name);
46
- let raw;
47
- try {
48
- raw = await fs.readFile(manifestPath, 'utf-8');
49
- }
50
- catch (err) {
85
+ const result = await readPluginManifestFile(manifestPath);
86
+ if (!result.ok) {
51
87
  out.push({
52
88
  manifestPath,
53
89
  manifest: null,
54
- error: `unable to read manifest: ${err instanceof Error ? err.message : String(err)}`,
90
+ error: result.reason,
91
+ diagnostic: result.diagnostic,
55
92
  });
56
93
  continue;
57
94
  }
58
- let parsed;
59
- try {
60
- parsed = JSON.parse(raw);
61
- }
62
- catch (err) {
63
- out.push({
64
- manifestPath,
65
- manifest: null,
66
- error: `invalid JSON: ${err instanceof Error ? err.message : String(err)}`,
67
- });
68
- continue;
69
- }
70
- const validation = validateManifest(parsed);
71
- if (!validation.ok) {
72
- out.push({ manifestPath, manifest: null, error: validation.reason });
73
- continue;
74
- }
75
- out.push({ manifestPath, manifest: validation.manifest });
95
+ out.push({ manifestPath, manifest: result.manifest });
76
96
  }
77
97
  return out;
78
98
  }
@@ -92,6 +112,8 @@ export async function loadPlugins(rootPath) {
92
112
  for (const entry of discovered) {
93
113
  if (!entry.manifest)
94
114
  continue;
115
+ if (entry.manifest.kind !== 'analyzer')
116
+ continue;
95
117
  const modulePath = path.resolve(path.dirname(entry.manifestPath), entry.manifest.module);
96
118
  try {
97
119
  const mod = (await import(pathToFileURL(modulePath).href));
@@ -113,6 +135,83 @@ export async function loadPlugins(rootPath) {
113
135
  }
114
136
  return loaded;
115
137
  }
138
+ export async function resolveReporterPlugin(rootPath, reporterName, command) {
139
+ if (!pluginsEnabled()) {
140
+ return pluginRuntimeFail({
141
+ code: 'plugins-disabled',
142
+ message: `reporter plugins require ${PLUGIN_PREVIEW_FLAG}=1`,
143
+ hint: `Set ${PLUGIN_PREVIEW_FLAG}=1 in the environment to enable plugin reporters.`,
144
+ });
145
+ }
146
+ const entries = await discoverPluginManifests(rootPath);
147
+ const reporters = entries.filter((entry) => entry.manifest?.kind === 'reporter');
148
+ const entry = reporters.find((candidate) => candidate.manifest.name === reporterName);
149
+ if (!entry) {
150
+ return pluginRuntimeFail({
151
+ code: 'reporter-not-found',
152
+ message: `reporter plugin "${reporterName}" was not found`,
153
+ hint: 'Run `projscan plugin list` to see discovered reporter plugins.',
154
+ });
155
+ }
156
+ if (!entry.manifest.commands.includes(command)) {
157
+ return pluginRuntimeFail({
158
+ code: 'reporter-unsupported-command',
159
+ message: `reporter plugin "${reporterName}" does not support command "${command}"`,
160
+ hint: `Add "${command}" to the reporter manifest's commands array or choose a different reporter.`,
161
+ });
162
+ }
163
+ return loadReporterPlugin(entry.manifest, entry.manifestPath);
164
+ }
165
+ export async function renderReporterPlugin(plugin, context) {
166
+ try {
167
+ const output = await plugin.exports.render(context);
168
+ if (typeof output !== 'string') {
169
+ return pluginRuntimeFail({
170
+ code: 'reporter-render-error',
171
+ message: `reporter plugin "${plugin.manifest.name}" returned ${typeof output}; expected string`,
172
+ hint: 'Reporter render(context) must return text for stdout.',
173
+ });
174
+ }
175
+ return { ok: true, output };
176
+ }
177
+ catch (err) {
178
+ return pluginRuntimeFail({
179
+ code: 'reporter-render-error',
180
+ message: `reporter plugin "${plugin.manifest.name}" failed during render: ${formatError(err)}`,
181
+ hint: 'Fix the reporter render(context) implementation and try again.',
182
+ });
183
+ }
184
+ }
185
+ async function loadReporterPlugin(manifest, manifestPath) {
186
+ const modulePath = path.resolve(path.dirname(manifestPath), manifest.module);
187
+ try {
188
+ const mod = (await import(pathToFileURL(modulePath).href));
189
+ const exportsObj = (mod.default ?? mod);
190
+ if (typeof exportsObj.render !== 'function') {
191
+ return pluginRuntimeFail({
192
+ code: 'invalid-reporter-export',
193
+ message: `reporter plugin "${manifest.name}" missing required export "render"`,
194
+ hint: 'Export `render(context)` as the default export or a named export.',
195
+ });
196
+ }
197
+ return {
198
+ ok: true,
199
+ plugin: {
200
+ manifest,
201
+ manifestPath,
202
+ modulePath,
203
+ exports: { render: exportsObj.render },
204
+ },
205
+ };
206
+ }
207
+ catch (err) {
208
+ return pluginRuntimeFail({
209
+ code: 'reporter-load-error',
210
+ message: `reporter plugin "${manifest.name}" failed to load: ${formatError(err)}`,
211
+ hint: 'Check the reporter module path and module syntax.',
212
+ });
213
+ }
214
+ }
116
215
  /**
117
216
  * Run every loaded analyzer plugin against `files`. Issues that don't pass
118
217
  * a tight shape check are dropped so a malformed plugin can't poison the
@@ -143,36 +242,96 @@ export async function runAnalyzerPlugins(plugins, rootPath, files) {
143
242
  }
144
243
  return out;
145
244
  }
245
+ function failValidation(diagnostic) {
246
+ return { ok: false, reason: diagnostic.message, diagnostic };
247
+ }
248
+ function pluginRuntimeFail(diagnostic) {
249
+ return { ok: false, reason: diagnostic.message, diagnostic };
250
+ }
251
+ function formatError(err) {
252
+ return err instanceof Error ? err.message : String(err);
253
+ }
146
254
  export function validateManifest(input) {
147
255
  if (!input || typeof input !== 'object') {
148
- return { ok: false, reason: 'manifest must be a JSON object' };
256
+ return failValidation({
257
+ code: 'invalid-manifest',
258
+ message: 'manifest must be a JSON object',
259
+ hint: 'Use an object with schemaVersion, name, kind, module, and category fields.',
260
+ });
149
261
  }
150
262
  const obj = input;
151
263
  if (obj.schemaVersion !== PLUGIN_SCHEMA_VERSION) {
152
- return {
153
- ok: false,
154
- reason: `unsupported schemaVersion ${String(obj.schemaVersion)}; expected ${PLUGIN_SCHEMA_VERSION}`,
155
- };
264
+ return failValidation({
265
+ code: 'unsupported-schema-version',
266
+ field: 'schemaVersion',
267
+ message: `unsupported schemaVersion ${String(obj.schemaVersion)}; expected ${PLUGIN_SCHEMA_VERSION}`,
268
+ hint: `Set "schemaVersion": ${PLUGIN_SCHEMA_VERSION}.`,
269
+ });
156
270
  }
157
271
  if (typeof obj.name !== 'string' || !/^[a-z0-9][a-z0-9._/-]{0,64}$/i.test(obj.name)) {
158
- return { ok: false, reason: 'name is required and must be 1–65 chars of [a-z0-9._/-]' };
272
+ return failValidation({
273
+ code: 'invalid-name',
274
+ field: 'name',
275
+ message: 'name is required and must be 1-65 chars of [a-z0-9._/-]',
276
+ hint: 'Use a stable 1-65 character plugin id such as "team/no-console" or "my-plugin".',
277
+ });
159
278
  }
160
- if (obj.kind !== 'analyzer') {
161
- return { ok: false, reason: 'only kind:"analyzer" is supported in the 1.10 preview' };
279
+ if (obj.kind !== 'analyzer' && obj.kind !== 'reporter') {
280
+ return failValidation({
281
+ code: 'unsupported-kind',
282
+ field: 'kind',
283
+ message: 'kind must be "analyzer" or "reporter"',
284
+ hint: 'Set "kind": "analyzer" for issue-producing plugins or "kind": "reporter" for CLI output plugins.',
285
+ });
162
286
  }
163
287
  if (typeof obj.module !== 'string' || obj.module.length === 0) {
164
- return { ok: false, reason: 'module is required and must be a relative path' };
288
+ return failValidation({
289
+ code: 'invalid-module',
290
+ field: 'module',
291
+ message: 'module is required and must be a relative path',
292
+ hint: 'Point to a local module inside the same plugin directory, for example "./check.mjs".',
293
+ });
165
294
  }
166
295
  // Path-traversal guard. Modules must resolve under the manifest's own dir.
167
296
  if (path.isAbsolute(obj.module) || obj.module.split(/[/\\]/).some((seg) => seg === '..')) {
168
- return { ok: false, reason: 'module must be a relative path inside the plugin dir' };
169
- }
170
- if (typeof obj.category !== 'string' || obj.category.length === 0) {
171
- return { ok: false, reason: 'category is required' };
297
+ return failValidation({
298
+ code: 'invalid-module',
299
+ field: 'module',
300
+ message: 'module must be a relative path inside the plugin dir',
301
+ hint: 'Do not use absolute paths or any ".." path segment.',
302
+ });
172
303
  }
173
304
  if (obj.description !== undefined && typeof obj.description !== 'string') {
174
- return { ok: false, reason: 'description must be a string when provided' };
305
+ return failValidation({
306
+ code: 'invalid-description',
307
+ field: 'description',
308
+ message: 'description must be a string when provided',
309
+ });
175
310
  }
311
+ if (obj.kind === 'analyzer') {
312
+ if (typeof obj.category !== 'string' || obj.category.length === 0) {
313
+ return failValidation({
314
+ code: 'invalid-category',
315
+ field: 'category',
316
+ message: 'category is required for analyzer plugins',
317
+ hint: 'Use the fallback Issue.category for this plugin, for example "custom" or "security".',
318
+ });
319
+ }
320
+ return {
321
+ ok: true,
322
+ manifest: {
323
+ schemaVersion: obj.schemaVersion,
324
+ name: obj.name,
325
+ kind: obj.kind,
326
+ module: obj.module,
327
+ category: obj.category,
328
+ ...(typeof obj.description === 'string' ? { description: obj.description } : {}),
329
+ },
330
+ };
331
+ }
332
+ const commandValidation = validateReporterCommands(obj.commands);
333
+ if (!commandValidation.ok)
334
+ return commandValidation;
176
335
  return {
177
336
  ok: true,
178
337
  manifest: {
@@ -180,11 +339,42 @@ export function validateManifest(input) {
180
339
  name: obj.name,
181
340
  kind: obj.kind,
182
341
  module: obj.module,
183
- category: obj.category,
342
+ commands: commandValidation.commands,
184
343
  ...(typeof obj.description === 'string' ? { description: obj.description } : {}),
185
344
  },
186
345
  };
187
346
  }
347
+ function validateReporterCommands(input) {
348
+ if (!Array.isArray(input) || input.length === 0) {
349
+ return failValidation({
350
+ code: 'invalid-commands',
351
+ field: 'commands',
352
+ message: 'commands must be a non-empty array for reporter plugins',
353
+ hint: 'Use one or more supported commands: doctor, analyze, ci.',
354
+ });
355
+ }
356
+ const seen = new Set();
357
+ const invalid = [];
358
+ for (const value of input) {
359
+ if (typeof value !== 'string' || !isReporterCommand(value)) {
360
+ invalid.push(String(value));
361
+ continue;
362
+ }
363
+ seen.add(value);
364
+ }
365
+ if (invalid.length > 0) {
366
+ return failValidation({
367
+ code: 'invalid-commands',
368
+ field: 'commands',
369
+ message: `unsupported reporter command(s): ${invalid.join(', ')}`,
370
+ hint: 'Supported reporter commands are: doctor, analyze, ci.',
371
+ });
372
+ }
373
+ return { ok: true, commands: [...seen] };
374
+ }
375
+ function isReporterCommand(value) {
376
+ return PLUGIN_REPORTER_COMMANDS.includes(value);
377
+ }
188
378
  function isWellShapedIssue(x) {
189
379
  if (!x || typeof x !== 'object')
190
380
  return false;
@@ -1 +1 @@
1
- {"version":3,"file":"plugins.js","sourceRoot":"","sources":["../../src/core/plugins.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"plugins.js","sourceRoot":"","sources":["../../src/core/plugins.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAGzC;;;;;;;;;;;;;;GAcG;AAEH,MAAM,CAAC,MAAM,mBAAmB,GAAG,0BAA0B,CAAC;AAC9D,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,CAAC;AACvC,MAAM,CAAC,MAAM,UAAU,GAAG,mBAAmB,CAAC;AAC9C,MAAM,CAAC,MAAM,mBAAmB,GAAG,uBAAuB,CAAC;AAK3D,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,QAAQ,EAAE,SAAS,EAAE,IAAI,CAAU,CAAC;AA+E7E,MAAM,UAAU,cAAc;IAC5B,MAAM,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;IAC3C,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,MAAM,CAAC;AACnC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,YAAoB;IAC/D,IAAI,GAAW,CAAC;IAChB,IAAI,CAAC;QACH,GAAG,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;IACjD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,OAAO,GAAG,4BAA4B,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;QAC/F,OAAO;YACL,EAAE,EAAE,KAAK;YACT,MAAM,EAAE,OAAO;YACf,UAAU,EAAE;gBACV,IAAI,EAAE,YAAY;gBAClB,OAAO;gBACP,IAAI,EAAE,uCAAuC;aAC9C;SACF,CAAC;IACJ,CAAC;IAED,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC3B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,OAAO,GAAG,iBAAiB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;QACpF,OAAO;YACL,EAAE,EAAE,KAAK;YACT,MAAM,EAAE,OAAO;YACf,UAAU,EAAE;gBACV,IAAI,EAAE,cAAc;gBACpB,OAAO;gBACP,IAAI,EAAE,uCAAuC;aAC9C;SACF,CAAC;IACJ,CAAC;IAED,MAAM,UAAU,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;IAC5C,OAAO,UAAU,CAAC,EAAE;QAClB,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,CAAC,QAAQ,EAAE;QAC7C,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM,EAAE,UAAU,EAAE,UAAU,CAAC,UAAU,EAAE,CAAC;AAClF,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAAC,QAAgB;IAC5D,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;IAC5C,IAAI,OAAiB,CAAC;IACtB,IAAI,CAAC;QACH,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAClC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,MAAM,GAAG,GAA2B,EAAE,CAAC;IACvC,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;QAClC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,mBAAmB,CAAC;YAAE,SAAS;QAClD,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAC1C,MAAM,MAAM,GAAG,MAAM,sBAAsB,CAAC,YAAY,CAAC,CAAC;QAC1D,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;YACf,GAAG,CAAC,IAAI,CAAC;gBACP,YAAY;gBACZ,QAAQ,EAAE,IAAI;gBACd,KAAK,EAAE,MAAM,CAAC,MAAM;gBACpB,UAAU,EAAE,MAAM,CAAC,UAAU;aAC9B,CAAC,CAAC;YACH,SAAS;QACX,CAAC;QACD,GAAG,CAAC,IAAI,CAAC,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;IACxD,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,QAAgB;IAChD,IAAI,CAAC,cAAc,EAAE;QAAE,OAAO,EAAE,CAAC;IACjC,MAAM,UAAU,GAAG,MAAM,uBAAuB,CAAC,QAAQ,CAAC,CAAC;IAC3D,MAAM,MAAM,GAAmB,EAAE,CAAC;IAClC,KAAK,MAAM,KAAK,IAAI,UAAU,EAAE,CAAC;QAC/B,IAAI,CAAC,KAAK,CAAC,QAAQ;YAAE,SAAS;QAC9B,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,KAAK,UAAU;YAAE,SAAS;QACjD,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QACzF,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,CAAC,MAAM,MAAM,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,CAA4B,CAAC;YACtF,MAAM,UAAU,GAAG,CAAC,GAAG,CAAC,OAAO,IAAI,GAAG,CAAmC,CAAC;YAC1E,IAAI,OAAO,UAAU,CAAC,KAAK,KAAK,UAAU,EAAE,CAAC;gBAC3C,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,sBAAsB,KAAK,CAAC,QAAQ,CAAC,IAAI,+CAA+C,CACzF,CAAC;gBACF,SAAS;YACX,CAAC;YACD,MAAM,CAAC,IAAI,CAAC;gBACV,QAAQ,EAAE,KAAK,CAAC,QAAQ;gBACxB,YAAY,EAAE,KAAK,CAAC,YAAY;gBAChC,UAAU;gBACV,OAAO,EAAE,EAAE,KAAK,EAAE,UAAU,CAAC,KAAuC,EAAE;aACvE,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,sBAAsB,KAAK,CAAC,QAAQ,CAAC,IAAI,qBAAqB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,cAAc,CAC7H,CAAC;QACJ,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,QAAgB,EAChB,YAAoB,EACpB,OAA8B;IAE9B,IAAI,CAAC,cAAc,EAAE,EAAE,CAAC;QACtB,OAAO,iBAAiB,CAAC;YACvB,IAAI,EAAE,kBAAkB;YACxB,OAAO,EAAE,4BAA4B,mBAAmB,IAAI;YAC5D,IAAI,EAAE,OAAO,mBAAmB,mDAAmD;SACpF,CAAC,CAAC;IACL,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,uBAAuB,CAAC,QAAQ,CAAC,CAAC;IACxD,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,CAC9B,CAAC,KAAK,EAAwE,EAAE,CAC9E,KAAK,CAAC,QAAQ,EAAE,IAAI,KAAK,UAAU,CACtC,CAAC;IACF,MAAM,KAAK,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,KAAK,YAAY,CAAC,CAAC;IACtF,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,iBAAiB,CAAC;YACvB,IAAI,EAAE,oBAAoB;YAC1B,OAAO,EAAE,oBAAoB,YAAY,iBAAiB;YAC1D,IAAI,EAAE,gEAAgE;SACvE,CAAC,CAAC;IACL,CAAC;IAED,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QAC/C,OAAO,iBAAiB,CAAC;YACvB,IAAI,EAAE,8BAA8B;YACpC,OAAO,EAAE,oBAAoB,YAAY,+BAA+B,OAAO,GAAG;YAClF,IAAI,EAAE,QAAQ,OAAO,6EAA6E;SACnG,CAAC,CAAC;IACL,CAAC;IAED,OAAO,kBAAkB,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,YAAY,CAAC,CAAC;AAChE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,MAA4B,EAC5B,OAA8B;IAE9B,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACpD,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;YAC/B,OAAO,iBAAiB,CAAC;gBACvB,IAAI,EAAE,uBAAuB;gBAC7B,OAAO,EAAE,oBAAoB,MAAM,CAAC,QAAQ,CAAC,IAAI,cAAc,OAAO,MAAM,mBAAmB;gBAC/F,IAAI,EAAE,uDAAuD;aAC9D,CAAC,CAAC;QACL,CAAC;QACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IAC9B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,iBAAiB,CAAC;YACvB,IAAI,EAAE,uBAAuB;YAC7B,OAAO,EAAE,oBAAoB,MAAM,CAAC,QAAQ,CAAC,IAAI,2BAA2B,WAAW,CAAC,GAAG,CAAC,EAAE;YAC9F,IAAI,EAAE,gEAAgE;SACvE,CAAC,CAAC;IACL,CAAC;AACH,CAAC;AAED,KAAK,UAAU,kBAAkB,CAC/B,QAAgC,EAChC,YAAoB;IAEpB,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC7E,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,CAAC,MAAM,MAAM,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,CAA4B,CAAC;QACtF,MAAM,UAAU,GAAG,CAAC,GAAG,CAAC,OAAO,IAAI,GAAG,CAAmC,CAAC;QAC1E,IAAI,OAAO,UAAU,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;YAC5C,OAAO,iBAAiB,CAAC;gBACvB,IAAI,EAAE,yBAAyB;gBAC/B,OAAO,EAAE,oBAAoB,QAAQ,CAAC,IAAI,oCAAoC;gBAC9E,IAAI,EAAE,mEAAmE;aAC1E,CAAC,CAAC;QACL,CAAC;QACD,OAAO;YACL,EAAE,EAAE,IAAI;YACR,MAAM,EAAE;gBACN,QAAQ;gBACR,YAAY;gBACZ,UAAU;gBACV,OAAO,EAAE,EAAE,MAAM,EAAE,UAAU,CAAC,MAAyC,EAAE;aAC1E;SACF,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,iBAAiB,CAAC;YACvB,IAAI,EAAE,qBAAqB;YAC3B,OAAO,EAAE,oBAAoB,QAAQ,CAAC,IAAI,qBAAqB,WAAW,CAAC,GAAG,CAAC,EAAE;YACjF,IAAI,EAAE,mDAAmD;SAC1D,CAAC,CAAC;IACL,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,OAAuB,EACvB,QAAgB,EAChB,KAAkB;IAElB,MAAM,GAAG,GAAY,EAAE,CAAC;IACxB,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,IAAI,GAAY,CAAC;QACjB,IAAI,CAAC;YACH,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC;QACvD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,sBAAsB,CAAC,CAAC,QAAQ,CAAC,IAAI,yBAAyB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,2BAA2B,CAC1I,CAAC;YACF,SAAS;QACX,CAAC;QACD,KAAK,MAAM,KAAK,IAAI,GAAG,EAAE,CAAC;YACxB,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC;gBAAE,SAAS;YACxC,GAAG,CAAC,IAAI,CAAC;gBACP,GAAG,KAAK;gBACR,EAAE,EAAE,UAAU,CAAC,CAAC,QAAQ,CAAC,IAAI,IAAI,KAAK,CAAC,EAAE,EAAE;gBAC3C,QAAQ,EAAE,KAAK,CAAC,QAAQ,IAAI,CAAC,CAAC,QAAQ,CAAC,QAAQ;aAChD,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAmCD,SAAS,cAAc,CAAC,UAA4B;IAClD,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,CAAC,OAAO,EAAE,UAAU,EAAE,CAAC;AAC/D,CAAC;AAED,SAAS,iBAAiB,CAAC,UAA4B;IACrD,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,CAAC,OAAO,EAAE,UAAU,EAAE,CAAC;AAC/D,CAAC;AAED,SAAS,WAAW,CAAC,GAAY;IAC/B,OAAO,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;AAC1D,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,KAAc;IAC7C,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QACxC,OAAO,cAAc,CAAC;YACpB,IAAI,EAAE,kBAAkB;YACxB,OAAO,EAAE,gCAAgC;YACzC,IAAI,EAAE,4EAA4E;SACnF,CAAC,CAAC;IACL,CAAC;IACD,MAAM,GAAG,GAAG,KAAgC,CAAC;IAC7C,IAAI,GAAG,CAAC,aAAa,KAAK,qBAAqB,EAAE,CAAC;QAChD,OAAO,cAAc,CAAC;YACpB,IAAI,EAAE,4BAA4B;YAClC,KAAK,EAAE,eAAe;YACtB,OAAO,EAAE,6BAA6B,MAAM,CAAC,GAAG,CAAC,aAAa,CAAC,cAAc,qBAAqB,EAAE;YACpG,IAAI,EAAE,wBAAwB,qBAAqB,GAAG;SACvD,CAAC,CAAC;IACL,CAAC;IACD,IAAI,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,+BAA+B,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;QACpF,OAAO,cAAc,CAAC;YACpB,IAAI,EAAE,cAAc;YACpB,KAAK,EAAE,MAAM;YACb,OAAO,EAAE,yDAAyD;YAClE,IAAI,EAAE,iFAAiF;SACxF,CAAC,CAAC;IACL,CAAC;IACD,IAAI,GAAG,CAAC,IAAI,KAAK,UAAU,IAAI,GAAG,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;QACvD,OAAO,cAAc,CAAC;YACpB,IAAI,EAAE,kBAAkB;YACxB,KAAK,EAAE,MAAM;YACb,OAAO,EAAE,uCAAuC;YAChD,IAAI,EAAE,kGAAkG;SACzG,CAAC,CAAC;IACL,CAAC;IACD,IAAI,OAAO,GAAG,CAAC,MAAM,KAAK,QAAQ,IAAI,GAAG,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC9D,OAAO,cAAc,CAAC;YACpB,IAAI,EAAE,gBAAgB;YACtB,KAAK,EAAE,QAAQ;YACf,OAAO,EAAE,gDAAgD;YACzD,IAAI,EAAE,sFAAsF;SAC7F,CAAC,CAAC;IACL,CAAC;IACD,2EAA2E;IAC3E,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,KAAK,IAAI,CAAC,EAAE,CAAC;QACzF,OAAO,cAAc,CAAC;YACpB,IAAI,EAAE,gBAAgB;YACtB,KAAK,EAAE,QAAQ;YACf,OAAO,EAAE,sDAAsD;YAC/D,IAAI,EAAE,qDAAqD;SAC5D,CAAC,CAAC;IACL,CAAC;IACD,IAAI,GAAG,CAAC,WAAW,KAAK,SAAS,IAAI,OAAO,GAAG,CAAC,WAAW,KAAK,QAAQ,EAAE,CAAC;QACzE,OAAO,cAAc,CAAC;YACpB,IAAI,EAAE,qBAAqB;YAC3B,KAAK,EAAE,aAAa;YACpB,OAAO,EAAE,4CAA4C;SACtD,CAAC,CAAC;IACL,CAAC;IACD,IAAI,GAAG,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;QAC5B,IAAI,OAAO,GAAG,CAAC,QAAQ,KAAK,QAAQ,IAAI,GAAG,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAClE,OAAO,cAAc,CAAC;gBACpB,IAAI,EAAE,kBAAkB;gBACxB,KAAK,EAAE,UAAU;gBACjB,OAAO,EAAE,2CAA2C;gBACpD,IAAI,EAAE,sFAAsF;aAC7F,CAAC,CAAC;QACL,CAAC;QACD,OAAO;YACL,EAAE,EAAE,IAAI;YACR,QAAQ,EAAE;gBACR,aAAa,EAAE,GAAG,CAAC,aAAa;gBAChC,IAAI,EAAE,GAAG,CAAC,IAAI;gBACd,IAAI,EAAE,GAAG,CAAC,IAAI;gBACd,MAAM,EAAE,GAAG,CAAC,MAAM;gBAClB,QAAQ,EAAE,GAAG,CAAC,QAAQ;gBACtB,GAAG,CAAC,OAAO,GAAG,CAAC,WAAW,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aACjF;SACF,CAAC;IACJ,CAAC;IAED,MAAM,iBAAiB,GAAG,wBAAwB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACjE,IAAI,CAAC,iBAAiB,CAAC,EAAE;QAAE,OAAO,iBAAiB,CAAC;IAEpD,OAAO;QACL,EAAE,EAAE,IAAI;QACR,QAAQ,EAAE;YACR,aAAa,EAAE,GAAG,CAAC,aAAa;YAChC,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,MAAM,EAAE,GAAG,CAAC,MAAM;YAClB,QAAQ,EAAE,iBAAiB,CAAC,QAAQ;YACpC,GAAG,CAAC,OAAO,GAAG,CAAC,WAAW,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACjF;KACF,CAAC;AACJ,CAAC;AAED,SAAS,wBAAwB,CAAC,KAAc;IAC9C,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAChD,OAAO,cAAc,CAAC;YACpB,IAAI,EAAE,kBAAkB;YACxB,KAAK,EAAE,UAAU;YACjB,OAAO,EAAE,yDAAyD;YAClE,IAAI,EAAE,0DAA0D;SACjE,CAAC,CAAC;IACL,CAAC;IAED,MAAM,IAAI,GAAG,IAAI,GAAG,EAAyB,CAAC;IAC9C,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,KAAK,MAAM,KAAK,IAAI,KAAK,EAAE,CAAC;QAC1B,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,EAAE,CAAC;YAC3D,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;YAC5B,SAAS;QACX,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAClB,CAAC;IACD,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,OAAO,cAAc,CAAC;YACpB,IAAI,EAAE,kBAAkB;YACxB,KAAK,EAAE,UAAU;YACjB,OAAO,EAAE,oCAAoC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;YACjE,IAAI,EAAE,uDAAuD;SAC9D,CAAC,CAAC;IACL,CAAC;IACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC;AAC3C,CAAC;AAED,SAAS,iBAAiB,CAAC,KAAa;IACtC,OAAQ,wBAA8C,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AACzE,CAAC;AAED,SAAS,iBAAiB,CAAC,CAAU;IACnC,IAAI,CAAC,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC9C,MAAM,GAAG,GAAG,CAA4B,CAAC;IACzC,IAAI,OAAO,GAAG,CAAC,EAAE,KAAK,QAAQ,IAAI,GAAG,CAAC,EAAE,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACpE,IAAI,OAAO,GAAG,CAAC,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAChD,IAAI,OAAO,GAAG,CAAC,WAAW,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IACtD,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC;QAAE,OAAO,KAAK,CAAC;IAC5C,IAAI,OAAO,GAAG,CAAC,QAAQ,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IACnD,IAAI,OAAO,GAAG,CAAC,YAAY,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC;IACxD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,UAAU,CAAC,CAAU;IAC5B,OAAO,CAAC,KAAK,OAAO,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,MAAM,CAAC;AAC1D,CAAC"}
@@ -1,7 +1,7 @@
1
1
  import type { McpTool } from './_shared.js';
2
2
  /**
3
3
  * `projscan_plugin` (1.10+ preview) — discover and validate third-party
4
- * analyzer plugins under `<root>/.projscan-plugins/*.projscan-plugin.json`.
4
+ * plugins under `<root>/.projscan-plugins/*.projscan-plugin.json`.
5
5
  *
6
6
  * Behind the PROJSCAN_PLUGINS_PREVIEW=1 feature flag. The tool is always
7
7
  * registered (so agents can probe for it), but `action:"list"` returns
@@ -1,8 +1,8 @@
1
- import { PLUGIN_PREVIEW_FLAG, discoverPluginManifests, pluginsEnabled, validateManifest, } from '../../core/plugins.js';
2
- import fs from 'node:fs/promises';
1
+ import path from 'node:path';
2
+ import { PLUGIN_PREVIEW_FLAG, discoverPluginManifests, pluginsEnabled, readPluginManifestFile, } from '../../core/plugins.js';
3
3
  /**
4
4
  * `projscan_plugin` (1.10+ preview) — discover and validate third-party
5
- * analyzer plugins under `<root>/.projscan-plugins/*.projscan-plugin.json`.
5
+ * plugins under `<root>/.projscan-plugins/*.projscan-plugin.json`.
6
6
  *
7
7
  * Behind the PROJSCAN_PLUGINS_PREVIEW=1 feature flag. The tool is always
8
8
  * registered (so agents can probe for it), but `action:"list"` returns
@@ -13,7 +13,7 @@ import fs from 'node:fs/promises';
13
13
  */
14
14
  export const pluginTool = {
15
15
  name: 'projscan_plugin',
16
- description: '1.10+ preview. Discover and validate third-party analyzer plugins under .projscan-plugins/. Gated by the PROJSCAN_PLUGINS_PREVIEW=1 env flag; the schema is preview-only and may shift before 2.0. Use action:"list" to see what is discoverable today, action:"validate" to check a manifest before committing it.',
16
+ description: '1.10+ preview. Discover and validate third-party analyzer and reporter plugins under .projscan-plugins/. Gated by the PROJSCAN_PLUGINS_PREVIEW=1 env flag; the schema is preview-only and may shift before 2.0. Use action:"list" to see what is discoverable today, action:"validate" to check a manifest before committing it.',
17
17
  inputSchema: {
18
18
  type: 'object',
19
19
  properties: {
@@ -45,10 +45,12 @@ export const pluginTool = {
45
45
  name: e.manifest.name,
46
46
  kind: e.manifest.kind,
47
47
  module: e.manifest.module,
48
- category: e.manifest.category,
48
+ ...(e.manifest.kind === 'analyzer'
49
+ ? { category: e.manifest.category }
50
+ : { commands: e.manifest.commands }),
49
51
  description: e.manifest.description,
50
52
  }
51
- : { error: e.error }),
53
+ : { error: e.error, diagnostic: e.diagnostic }),
52
54
  })),
53
55
  };
54
56
  }
@@ -56,28 +58,11 @@ export const pluginTool = {
56
58
  const p = typeof args.manifest_path === 'string' ? args.manifest_path : '';
57
59
  if (!p)
58
60
  throw new Error('validate action requires a "manifest_path" argument');
59
- let raw;
60
- try {
61
- raw = await fs.readFile(p, 'utf-8');
62
- }
63
- catch (err) {
64
- return {
65
- ok: false,
66
- error: `unable to read manifest: ${err instanceof Error ? err.message : String(err)}`,
67
- };
68
- }
69
- let parsed;
70
- try {
71
- parsed = JSON.parse(raw);
72
- }
73
- catch (err) {
74
- return {
75
- ok: false,
76
- error: `invalid JSON: ${err instanceof Error ? err.message : String(err)}`,
77
- };
78
- }
79
- const v = validateManifest(parsed);
80
- return v.ok ? { ok: true, manifest: v.manifest } : { ok: false, error: v.reason };
61
+ const manifestPath = path.isAbsolute(p) ? p : path.resolve(rootPath, p);
62
+ const result = await readPluginManifestFile(manifestPath);
63
+ return result.ok
64
+ ? { ok: true, manifest: result.manifest }
65
+ : { ok: false, error: result.reason, diagnostic: result.diagnostic };
81
66
  }
82
67
  default:
83
68
  throw new Error(`Unknown action "${action}". Known: list, validate.`);
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.js","sourceRoot":"","sources":["../../../src/mcp/tools/plugin.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"plugin.js","sourceRoot":"","sources":["../../../src/mcp/tools/plugin.ts"],"names":[],"mappings":"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"}
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "name": "projscan",
3
- "version": "1.10.0",
3
+ "version": "1.11.0",
4
4
  "mcpProtocolVersion": "2025-03-26",
5
- "generatedAt": "2026-05-12T21:51:14.985Z",
5
+ "generatedAt": "2026-05-18T09:59:21.665Z",
6
6
  "toolCount": 28,
7
7
  "tools": [
8
8
  {
@@ -714,7 +714,7 @@
714
714
  },
715
715
  {
716
716
  "name": "projscan_plugin",
717
- "description": "1.10+ preview. Discover and validate third-party analyzer plugins under .projscan-plugins/. Gated by the PROJSCAN_PLUGINS_PREVIEW=1 env flag; the schema is preview-only and may shift before 2.0. Use action:\"list\" to see what is discoverable today, action:\"validate\" to check a manifest before committing it.",
717
+ "description": "1.10+ preview. Discover and validate third-party analyzer and reporter plugins under .projscan-plugins/. Gated by the PROJSCAN_PLUGINS_PREVIEW=1 env flag; the schema is preview-only and may shift before 2.0. Use action:\"list\" to see what is discoverable today, action:\"validate\" to check a manifest before committing it.",
718
718
  "inputSchema": {
719
719
  "type": "object",
720
720
  "properties": {
package/package.json CHANGED
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "name": "projscan",
3
3
  "mcpName": "io.github.abhiyoheswaran1/projscan",
4
- "version": "1.10.0",
5
- "description": "Agent-first code intelligence. MCP server (2025-03-26) with AST parsing for JavaScript, TypeScript, Python, Go, Java, Ruby, Rust, PHP, C#, Kotlin, Swift, and C++; code graph, file + per-function AST cyclomatic complexity, per-function fan-in + fan-out, coupling + cycle detection, structural PR diff with HTML reporter, coverage report with HTML reporter, intent-grounded one-call PR review (projscan_review with optional `intent` arg) and long-running PR-watch mode with structured per-bucket deltas (projscan_review_watch), rule-driven fix suggestions + mechanical apply layer with rollback (projscan_apply_fix, projscan_fix_suggest, projscan_explain_issue), source-to-sink taint analysis (projscan_taint) with truncation reporting, transitive blast-radius analysis with cross-repo mode (projscan_impact for files and symbols), cross-repo workspace registration + intelligence (projscan_workspace_graph), per-function semantic search chunks (sub-file embeddings), per-rule confidence + severity drift + cost-summary analytics with live streaming (projscan_cost_summary), analyzer plugin API preview (projscan_plugin, gated by PROJSCAN_PLUGINS_PREVIEW=1), monorepo workspace awareness with cross-package import policy + per-package dependencies / outdated / audit, BM25 + optional semantic search, cursor pagination, progress notifications, context-budgeted output, and a stable-surface CI guard. CLI on the side.",
4
+ "version": "1.11.0",
5
+ "description": "Agent-first code intelligence. MCP server (2025-03-26) with AST parsing for JavaScript, TypeScript, Python, Go, Java, Ruby, Rust, PHP, C#, Kotlin, Swift, and C++; code graph, file + per-function AST cyclomatic complexity, per-function fan-in + fan-out, coupling + cycle detection, structural PR diff with HTML reporter, coverage report with HTML reporter, intent-grounded one-call PR review (projscan_review with optional `intent` arg) and long-running PR-watch mode with structured per-bucket deltas (projscan_review_watch), rule-driven fix suggestions + mechanical apply layer with rollback (projscan_apply_fix, projscan_fix_suggest, projscan_explain_issue), source-to-sink taint analysis (projscan_taint) with truncation reporting, transitive blast-radius analysis with cross-repo mode (projscan_impact for files and symbols), cross-repo workspace registration + intelligence (projscan_workspace_graph), per-function semantic search chunks (sub-file embeddings), per-rule confidence + severity drift + cost-summary analytics with live streaming (projscan_cost_summary), analyzer + reporter plugin API preview (projscan_plugin, CLI --reporter, gated by PROJSCAN_PLUGINS_PREVIEW=1), monorepo workspace awareness with cross-package import policy + per-package dependencies / outdated / audit, BM25 + optional semantic search, cursor pagination, progress notifications, context-budgeted output, and a stable-surface CI guard. CLI on the side.",
6
6
  "type": "module",
7
7
  "main": "./dist/index.js",
8
8
  "types": "./dist/index.d.ts",