projscan 4.6.0 → 4.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (176) hide show
  1. package/README.md +24 -11
  2. package/dist/cli/_shared.js +12 -44
  3. package/dist/cli/_shared.js.map +1 -1
  4. package/dist/cli/changedOnly.d.ts +16 -0
  5. package/dist/cli/changedOnly.js +28 -0
  6. package/dist/cli/changedOnly.js.map +1 -0
  7. package/dist/cli/formatOptions.d.ts +4 -0
  8. package/dist/cli/formatOptions.js +30 -0
  9. package/dist/cli/formatOptions.js.map +1 -0
  10. package/dist/core/agentBrief.js +6 -1
  11. package/dist/core/agentBrief.js.map +1 -1
  12. package/dist/core/astBodySignals.js +2 -3
  13. package/dist/core/astBodySignals.js.map +1 -1
  14. package/dist/core/astMembers.d.ts +1 -0
  15. package/dist/core/astMembers.js +38 -9
  16. package/dist/core/astMembers.js.map +1 -1
  17. package/dist/core/bugHunt.js +2 -142
  18. package/dist/core/bugHunt.js.map +1 -1
  19. package/dist/core/bugHuntHotspotFindings.d.ts +2 -0
  20. package/dist/core/bugHuntHotspotFindings.js +68 -0
  21. package/dist/core/bugHuntHotspotFindings.js.map +1 -0
  22. package/dist/core/bugHuntPreflightFindings.d.ts +3 -0
  23. package/dist/core/bugHuntPreflightFindings.js +115 -0
  24. package/dist/core/bugHuntPreflightFindings.js.map +1 -0
  25. package/dist/core/codeGraph.d.ts +1 -8
  26. package/dist/core/codeGraph.js +4 -30
  27. package/dist/core/codeGraph.js.map +1 -1
  28. package/dist/core/codeGraphFileSelection.d.ts +7 -0
  29. package/dist/core/codeGraphFileSelection.js +19 -0
  30. package/dist/core/codeGraphFileSelection.js.map +1 -0
  31. package/dist/core/codeGraphQueries.d.ts +9 -0
  32. package/dist/core/codeGraphQueries.js +25 -0
  33. package/dist/core/codeGraphQueries.js.map +1 -0
  34. package/dist/core/dataflow.js +3 -338
  35. package/dist/core/dataflow.js.map +1 -1
  36. package/dist/core/dataflowDatabaseSinks.d.ts +8 -0
  37. package/dist/core/dataflowDatabaseSinks.js +78 -0
  38. package/dist/core/dataflowDatabaseSinks.js.map +1 -0
  39. package/dist/core/dataflowRiskAssembly.d.ts +11 -0
  40. package/dist/core/dataflowRiskAssembly.js +117 -0
  41. package/dist/core/dataflowRiskAssembly.js.map +1 -0
  42. package/dist/core/dataflowTraversal.d.ts +25 -0
  43. package/dist/core/dataflowTraversal.js +200 -0
  44. package/dist/core/dataflowTraversal.js.map +1 -0
  45. package/dist/core/fileInspectionReport.d.ts +13 -0
  46. package/dist/core/fileInspectionReport.js +49 -0
  47. package/dist/core/fileInspectionReport.js.map +1 -0
  48. package/dist/core/fileInspector.d.ts +3 -11
  49. package/dist/core/fileInspector.js +2 -46
  50. package/dist/core/fileInspector.js.map +1 -1
  51. package/dist/core/fixSuggest.d.ts +1 -9
  52. package/dist/core/fixSuggest.js +2 -58
  53. package/dist/core/fixSuggest.js.map +1 -1
  54. package/dist/core/fixSuggestDependencyNames.d.ts +1 -0
  55. package/dist/core/fixSuggestDependencyNames.js +9 -0
  56. package/dist/core/fixSuggestDependencyNames.js.map +1 -0
  57. package/dist/core/fixSuggestPreview.d.ts +10 -0
  58. package/dist/core/fixSuggestPreview.js +87 -0
  59. package/dist/core/fixSuggestPreview.js.map +1 -0
  60. package/dist/core/frameworkHonoSources.js +7 -0
  61. package/dist/core/frameworkHonoSources.js.map +1 -1
  62. package/dist/core/frameworkNextRouteSources.d.ts +6 -1
  63. package/dist/core/frameworkNextRouteSources.js +31 -1
  64. package/dist/core/frameworkNextRouteSources.js.map +1 -1
  65. package/dist/core/frameworkRemixSources.d.ts +2 -0
  66. package/dist/core/frameworkRemixSources.js +63 -0
  67. package/dist/core/frameworkRemixSources.js.map +1 -0
  68. package/dist/core/frameworkSources.d.ts +15 -3
  69. package/dist/core/frameworkSources.js +41 -10
  70. package/dist/core/frameworkSources.js.map +1 -1
  71. package/dist/core/intentRouter.d.ts +4 -14
  72. package/dist/core/intentRouter.js +4 -29
  73. package/dist/core/intentRouter.js.map +1 -1
  74. package/dist/core/intentRouterCatalog.js +17 -0
  75. package/dist/core/intentRouterCatalog.js.map +1 -1
  76. package/dist/core/intentRouterKeywordWeights.js +13 -0
  77. package/dist/core/intentRouterKeywordWeights.js.map +1 -1
  78. package/dist/core/intentRouterReleaseSignals.js +119 -39
  79. package/dist/core/intentRouterReleaseSignals.js.map +1 -1
  80. package/dist/core/intentRouterResult.d.ts +16 -0
  81. package/dist/core/intentRouterResult.js +34 -0
  82. package/dist/core/intentRouterResult.js.map +1 -0
  83. package/dist/core/intentRouterWorkSignals.js +18 -0
  84. package/dist/core/intentRouterWorkSignals.js.map +1 -1
  85. package/dist/core/languages/pythonLockfiles.d.ts +4 -0
  86. package/dist/core/languages/pythonLockfiles.js +6 -2
  87. package/dist/core/languages/pythonLockfiles.js.map +1 -1
  88. package/dist/core/languages/pythonManifests.js +5 -5
  89. package/dist/core/languages/pythonManifests.js.map +1 -1
  90. package/dist/core/languages/pythonProjectEvidence.js +1 -1
  91. package/dist/core/languages/pythonProjectEvidence.js.map +1 -1
  92. package/dist/core/languages/pythonRequirements.js +144 -18
  93. package/dist/core/languages/pythonRequirements.js.map +1 -1
  94. package/dist/core/pluginManifestValidation.d.ts +41 -0
  95. package/dist/core/pluginManifestValidation.js +179 -0
  96. package/dist/core/pluginManifestValidation.js.map +1 -0
  97. package/dist/core/plugins.d.ts +3 -41
  98. package/dist/core/plugins.js +2 -129
  99. package/dist/core/plugins.js.map +1 -1
  100. package/dist/core/regressionPlan.d.ts +2 -1
  101. package/dist/core/regressionPlan.js +7 -1
  102. package/dist/core/regressionPlan.js.map +1 -1
  103. package/dist/core/releaseEvidence.js +6 -120
  104. package/dist/core/releaseEvidence.js.map +1 -1
  105. package/dist/core/releaseEvidenceArtifacts.d.ts +3 -0
  106. package/dist/core/releaseEvidenceArtifacts.js +65 -0
  107. package/dist/core/releaseEvidenceArtifacts.js.map +1 -0
  108. package/dist/core/releaseEvidenceVerdict.d.ts +6 -0
  109. package/dist/core/releaseEvidenceVerdict.js +54 -0
  110. package/dist/core/releaseEvidenceVerdict.js.map +1 -0
  111. package/dist/core/reportPathRedaction.d.ts +4 -0
  112. package/dist/core/reportPathRedaction.js +64 -0
  113. package/dist/core/reportPathRedaction.js.map +1 -0
  114. package/dist/core/reportScope.js +2 -163
  115. package/dist/core/reportScope.js.map +1 -1
  116. package/dist/core/reportScopeFiltering.d.ts +9 -0
  117. package/dist/core/reportScopeFiltering.js +102 -0
  118. package/dist/core/reportScopeFiltering.js.map +1 -0
  119. package/dist/core/searchIndex.d.ts +2 -14
  120. package/dist/core/searchIndex.js +4 -227
  121. package/dist/core/searchIndex.js.map +1 -1
  122. package/dist/core/searchIndexFiles.d.ts +1 -0
  123. package/dist/core/searchIndexFiles.js +26 -0
  124. package/dist/core/searchIndexFiles.js.map +1 -0
  125. package/dist/core/searchIndexText.d.ts +15 -0
  126. package/dist/core/searchIndexText.js +204 -0
  127. package/dist/core/searchIndexText.js.map +1 -0
  128. package/dist/core/start.js +5 -46
  129. package/dist/core/start.js.map +1 -1
  130. package/dist/core/startEvidence.d.ts +1 -1
  131. package/dist/core/startEvidence.js +16 -1
  132. package/dist/core/startEvidence.js.map +1 -1
  133. package/dist/core/startInputs.d.ts +1 -0
  134. package/dist/core/startInputs.js +4 -1
  135. package/dist/core/startInputs.js.map +1 -1
  136. package/dist/core/startMissionPolicy.js +10 -0
  137. package/dist/core/startMissionPolicy.js.map +1 -1
  138. package/dist/core/startReportBuilder.d.ts +1 -0
  139. package/dist/core/startReportBuilder.js +1 -0
  140. package/dist/core/startReportBuilder.js.map +1 -1
  141. package/dist/core/startReportContext.d.ts +23 -0
  142. package/dist/core/startReportContext.js +51 -0
  143. package/dist/core/startReportContext.js.map +1 -0
  144. package/dist/core/startRoadmapPreview.d.ts +2 -0
  145. package/dist/core/startRoadmapPreview.js +31 -0
  146. package/dist/core/startRoadmapPreview.js.map +1 -0
  147. package/dist/core/taint.d.ts +2 -67
  148. package/dist/core/taint.js +41 -164
  149. package/dist/core/taint.js.map +1 -1
  150. package/dist/core/taintIndex.d.ts +20 -0
  151. package/dist/core/taintIndex.js +81 -0
  152. package/dist/core/taintIndex.js.map +1 -0
  153. package/dist/core/taintTraversal.d.ts +8 -0
  154. package/dist/core/taintTraversal.js +113 -0
  155. package/dist/core/taintTraversal.js.map +1 -0
  156. package/dist/core/taintTypes.d.ts +67 -0
  157. package/dist/core/taintTypes.js +2 -0
  158. package/dist/core/taintTypes.js.map +1 -0
  159. package/dist/core/telemetry.js +36 -30
  160. package/dist/core/telemetry.js.map +1 -1
  161. package/dist/core/upgradePreviewPython.js +1 -1
  162. package/dist/core/upgradePreviewPython.js.map +1 -1
  163. package/dist/mcp/tools.js +11 -12
  164. package/dist/mcp/tools.js.map +1 -1
  165. package/dist/projscan-sbom.cdx.json +6 -6
  166. package/dist/reporters/consoleFixReporter.d.ts +3 -0
  167. package/dist/reporters/consoleFixReporter.js +41 -0
  168. package/dist/reporters/consoleFixReporter.js.map +1 -0
  169. package/dist/reporters/consoleReporter.d.ts +1 -3
  170. package/dist/reporters/consoleReporter.js +1 -42
  171. package/dist/reporters/consoleReporter.js.map +1 -1
  172. package/dist/tool-manifest.json +2 -2
  173. package/dist/types/start.d.ts +14 -0
  174. package/docs/GUIDE.md +1 -1
  175. package/docs/ROADMAP.md +16 -5
  176. package/package.json +1 -1
@@ -1,38 +1,75 @@
1
1
  import fs from 'node:fs/promises';
2
2
  import path from 'node:path';
3
3
  import { splitPep508 } from './pythonPep508.js';
4
- const REQUIREMENTS_FILE_RE = /^requirements(-.*)?\.txt$/i;
4
+ const REQUIREMENTS_DECLARATION_FILE_RE = /^(?:requirements(?:-.*)?|(?:dev|test|lint)-requirements)\.(?:txt|in)$/i;
5
+ const REQUIREMENTS_LOCK_FILE_RE = /^(?:requirements(?:-.*)?|(?:dev|test|lint)-requirements)\.txt$/i;
6
+ const DEV_REQUIREMENTS_FILE_RE = /^(?:requirements-(?:test|dev|lint)|(?:dev|test|lint)-requirements)\.(?:txt|in)$/i;
5
7
  const CONSTRAINTS_FILE_RE = /^constraints(-.*)?\.txt$/i;
6
8
  export async function readRootRequirementEvidence(rootPath, files) {
9
+ const context = {
10
+ rootPath,
11
+ fileSet: new Set(files.map((file) => normalizeRel(file.relativePath))),
12
+ seenRequirements: new Set(),
13
+ seenConstraints: new Set(),
14
+ };
7
15
  const evidence = {
8
16
  manifestFiles: [],
9
17
  declared: [],
10
18
  locked: [],
11
19
  };
12
- await appendRootRequirements(evidence, rootPath, files);
13
- await appendRootConstraints(evidence, rootPath, files);
20
+ await appendRootRequirements(evidence, context, files);
21
+ await appendRootConstraints(evidence, context, files);
14
22
  return evidence;
15
23
  }
16
- async function appendRootRequirements(evidence, rootPath, files) {
24
+ async function appendRootRequirements(evidence, context, files) {
17
25
  for (const rel of rootRequirementFiles(files)) {
18
- const content = await tryRead(path.join(rootPath, rel));
19
- if (content === null)
20
- continue;
21
- evidence.manifestFiles.push(rel);
22
- const isDev = /requirements(-test|-dev|-lint)\.txt$/i.test(rel);
23
- const deps = parseRequirements(content, rel, isDev ? 'dev' : 'main');
24
- evidence.declared.push(...deps);
25
- evidence.locked.push(...deps.flatMap(requirementPinToLockedDep));
26
+ const isDev = DEV_REQUIREMENTS_FILE_RE.test(path.basename(rel));
27
+ await appendRequirementFile(evidence, context, rel, isDev ? 'dev' : 'main');
26
28
  }
27
29
  }
28
- async function appendRootConstraints(evidence, rootPath, files) {
30
+ async function appendRootConstraints(evidence, context, files) {
29
31
  for (const rel of rootConstraintFiles(files)) {
30
- const content = await tryRead(path.join(rootPath, rel));
31
- if (content === null)
32
- continue;
33
- const deps = parseRequirements(content, rel, 'main');
32
+ await appendConstraintFile(evidence, context, rel);
33
+ }
34
+ }
35
+ async function appendRequirementFile(evidence, context, rel, scope) {
36
+ const normalized = normalizeRel(rel);
37
+ if (context.seenRequirements.has(normalized))
38
+ return;
39
+ context.seenRequirements.add(normalized);
40
+ const content = await readScannedFile(context, normalized);
41
+ if (content === null)
42
+ return;
43
+ pushUnique(evidence.manifestFiles, normalized);
44
+ const deps = parseRequirements(content, normalized, scope);
45
+ evidence.declared.push(...deps);
46
+ if (isRequirementsLockFile(normalized)) {
34
47
  evidence.locked.push(...deps.flatMap(requirementPinToLockedDep));
35
48
  }
49
+ for (const include of parseRequirementIncludes(content, normalized)) {
50
+ if (include.kind === 'requirement') {
51
+ await appendRequirementFile(evidence, context, include.relativePath, scope);
52
+ }
53
+ else {
54
+ await appendConstraintFile(evidence, context, include.relativePath);
55
+ }
56
+ }
57
+ }
58
+ async function appendConstraintFile(evidence, context, rel) {
59
+ const normalized = normalizeRel(rel);
60
+ if (context.seenConstraints.has(normalized))
61
+ return;
62
+ context.seenConstraints.add(normalized);
63
+ const content = await readScannedFile(context, normalized);
64
+ if (content === null)
65
+ return;
66
+ const deps = parseRequirements(content, normalized, 'main');
67
+ evidence.locked.push(...deps.flatMap(requirementPinToLockedDep));
68
+ for (const include of parseRequirementIncludes(content, normalized)) {
69
+ if (include.kind === 'constraint') {
70
+ await appendConstraintFile(evidence, context, include.relativePath);
71
+ }
72
+ }
36
73
  }
37
74
  function rootRequirementFiles(files) {
38
75
  return files.filter(isRootRequirementsFile).map((file) => file.relativePath);
@@ -41,7 +78,7 @@ function rootConstraintFiles(files) {
41
78
  return files.filter(isRootConstraintsFile).map((file) => file.relativePath);
42
79
  }
43
80
  function isRootRequirementsFile(file) {
44
- return isRootFile(file) && REQUIREMENTS_FILE_RE.test(path.basename(file.relativePath));
81
+ return isRootFile(file) && REQUIREMENTS_DECLARATION_FILE_RE.test(path.basename(file.relativePath));
45
82
  }
46
83
  function isRootConstraintsFile(file) {
47
84
  return isRootFile(file) && CONSTRAINTS_FILE_RE.test(path.basename(file.relativePath));
@@ -49,6 +86,14 @@ function isRootConstraintsFile(file) {
49
86
  function isRootFile(file) {
50
87
  return !file.directory || file.directory === '.';
51
88
  }
89
+ function isRequirementsLockFile(rel) {
90
+ return REQUIREMENTS_LOCK_FILE_RE.test(path.basename(rel));
91
+ }
92
+ async function readScannedFile(context, relativePath) {
93
+ if (!context.fileSet.has(relativePath))
94
+ return null;
95
+ return tryRead(path.join(context.rootPath, relativePath.split('/').join(path.sep)));
96
+ }
52
97
  async function tryRead(absolutePath) {
53
98
  try {
54
99
  return await fs.readFile(absolutePath, 'utf-8');
@@ -74,6 +119,87 @@ export function parseRequirements(content, sourceFile, scope) {
74
119
  }
75
120
  return out;
76
121
  }
122
+ function parseRequirementIncludes(content, sourceFile) {
123
+ const out = [];
124
+ for (const raw of content.split('\n')) {
125
+ const stripped = cleanRequirementLine(raw);
126
+ if (!stripped)
127
+ continue;
128
+ const parsed = requirementIncludeTarget(stripped, sourceFile);
129
+ if (parsed)
130
+ out.push(parsed);
131
+ }
132
+ return out;
133
+ }
134
+ function requirementIncludeTarget(line, sourceFile) {
135
+ const requirement = directiveTarget(line, '-r', '--requirement');
136
+ if (requirement) {
137
+ return safeRequirementInclude('requirement', sourceFile, requirement);
138
+ }
139
+ const constraint = directiveTarget(line, '-c', '--constraint');
140
+ if (constraint) {
141
+ return safeRequirementInclude('constraint', sourceFile, constraint);
142
+ }
143
+ return null;
144
+ }
145
+ function directiveTarget(line, shortFlag, longFlag) {
146
+ return (spacedDirectiveTarget(line, shortFlag) ??
147
+ compactShortDirectiveTarget(line, shortFlag) ??
148
+ spacedDirectiveTarget(line, longFlag) ??
149
+ equalsDirectiveTarget(line, longFlag));
150
+ }
151
+ function spacedDirectiveTarget(line, flag) {
152
+ return line.startsWith(`${flag} `) ? firstDirectiveToken(line.slice(flag.length).trim()) : null;
153
+ }
154
+ function compactShortDirectiveTarget(line, flag) {
155
+ const target = line.slice(flag.length).trim();
156
+ return line.startsWith(flag) && target && !target.startsWith('-')
157
+ ? firstDirectiveToken(target)
158
+ : null;
159
+ }
160
+ function equalsDirectiveTarget(line, flag) {
161
+ return line.startsWith(`${flag}=`) ? firstDirectiveToken(line.slice(flag.length + 1).trim()) : null;
162
+ }
163
+ function firstDirectiveToken(value) {
164
+ const match = /^(['"])(.*?)\1(?:\s|$)/.exec(value);
165
+ if (match)
166
+ return match[2];
167
+ return value.split(/\s+/)[0] || null;
168
+ }
169
+ function safeRequirementInclude(kind, sourceFile, target) {
170
+ if (!isLocalRequirementTarget(target))
171
+ return null;
172
+ const relativePath = resolveRequirementInclude(sourceFile, target);
173
+ return relativePath ? { kind, relativePath } : null;
174
+ }
175
+ function isLocalRequirementTarget(target) {
176
+ return Boolean(target) && !target.includes('\0') && !path.isAbsolute(target) && !isUrlLike(target);
177
+ }
178
+ function isUrlLike(target) {
179
+ return /^[a-z][a-z+.-]*:/i.test(target);
180
+ }
181
+ function resolveRequirementInclude(sourceFile, target) {
182
+ const sourceDir = path.posix.dirname(normalizeRel(sourceFile));
183
+ const baseDir = sourceDir === '.' ? '' : sourceDir;
184
+ const normalized = normalizeRel(path.posix.normalize(path.posix.join(baseDir, target)));
185
+ return isRepoRelativePath(normalized) ? normalized : null;
186
+ }
187
+ function isRepoRelativePath(relativePath) {
188
+ return (Boolean(relativePath) &&
189
+ relativePath !== '.' &&
190
+ relativePath !== '..' &&
191
+ !relativePath.startsWith('../'));
192
+ }
193
+ function cleanRequirementLine(raw) {
194
+ return raw.replace(/\s+#.*$/, '').trim();
195
+ }
196
+ function normalizeRel(rel) {
197
+ return rel.split(path.sep).join('/');
198
+ }
199
+ function pushUnique(arr, value) {
200
+ if (!arr.includes(value))
201
+ arr.push(value);
202
+ }
77
203
  function exactVersionFromSpec(version) {
78
204
  return /^={2,3}\s*([^\s,;]+)/.exec(version)?.[1] ?? null;
79
205
  }
@@ -1 +1 @@
1
- {"version":3,"file":"pythonRequirements.js","sourceRoot":"","sources":["../../../src/core/languages/pythonRequirements.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"pythonRequirements.js","sourceRoot":"","sources":["../../../src/core/languages/pythonRequirements.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ export declare const PLUGIN_SCHEMA_VERSION = 1;
2
+ export type PluginKind = 'analyzer' | 'reporter';
3
+ export type PluginReporterCommand = 'doctor' | 'analyze' | 'ci';
4
+ export declare const PLUGIN_REPORTER_COMMANDS: readonly ["doctor", "analyze", "ci"];
5
+ interface PluginManifestBase {
6
+ schemaVersion: number;
7
+ name: string;
8
+ kind: PluginKind;
9
+ /** Module entry point, relative to the manifest file. */
10
+ module: string;
11
+ /** Optional human-readable summary. */
12
+ description?: string;
13
+ }
14
+ export interface PluginAnalyzerManifest extends PluginManifestBase {
15
+ kind: 'analyzer';
16
+ /** Issue category emitted by this plugin (`Issue.category`). */
17
+ category: string;
18
+ }
19
+ export interface PluginReporterManifest extends PluginManifestBase {
20
+ kind: 'reporter';
21
+ /** CLI commands this reporter can render. */
22
+ commands: PluginReporterCommand[];
23
+ }
24
+ export type PluginManifest = PluginAnalyzerManifest | PluginReporterManifest;
25
+ export interface PluginDiagnostic {
26
+ code: 'invalid-manifest' | 'unsupported-schema-version' | 'invalid-name' | 'unsupported-kind' | 'invalid-module' | 'invalid-category' | 'invalid-commands' | 'invalid-description' | 'invalid-manifest-path' | 'invalid-json' | 'read-error' | 'plugins-disabled' | 'reporter-not-found' | 'reporter-unsupported-command' | 'invalid-reporter-export' | 'reporter-load-error' | 'reporter-render-error' | 'plugin-untrusted';
27
+ message: string;
28
+ field?: string;
29
+ hint?: string;
30
+ }
31
+ interface ValidationOk {
32
+ ok: true;
33
+ manifest: PluginManifest;
34
+ }
35
+ interface ValidationFail {
36
+ ok: false;
37
+ reason: string;
38
+ diagnostic: PluginDiagnostic;
39
+ }
40
+ export declare function validateManifest(input: unknown): ValidationOk | ValidationFail;
41
+ export {};
@@ -0,0 +1,179 @@
1
+ import path from 'node:path';
2
+ export const PLUGIN_SCHEMA_VERSION = 1;
3
+ export const PLUGIN_REPORTER_COMMANDS = ['doctor', 'analyze', 'ci'];
4
+ const BASE_MANIFEST_DIAGNOSTICS = [
5
+ schemaVersionDiagnostic,
6
+ nameDiagnostic,
7
+ kindDiagnostic,
8
+ moduleDiagnostic,
9
+ descriptionDiagnostic,
10
+ ];
11
+ export function validateManifest(input) {
12
+ const validation = validateManifestBase(input);
13
+ if (!validation.ok)
14
+ return validation;
15
+ return validation.base.kind === 'analyzer'
16
+ ? validateAnalyzerManifest(validation.obj, validation.base)
17
+ : validateReporterManifest(validation.obj, validation.base);
18
+ }
19
+ function validateManifestBase(input) {
20
+ const objectValidation = validateManifestObject(input);
21
+ if (!objectValidation.ok)
22
+ return objectValidation;
23
+ const diagnostic = BASE_MANIFEST_DIAGNOSTICS.map((check) => check(objectValidation.obj)).find((item) => item !== null);
24
+ if (diagnostic)
25
+ return failValidation(diagnostic);
26
+ return {
27
+ ok: true,
28
+ obj: objectValidation.obj,
29
+ base: manifestBaseFromObject(objectValidation.obj),
30
+ };
31
+ }
32
+ function validateManifestObject(input) {
33
+ if (input && typeof input === 'object')
34
+ return { ok: true, obj: input };
35
+ return failValidation({
36
+ code: 'invalid-manifest',
37
+ message: 'manifest must be a JSON object',
38
+ hint: 'Use an object with schemaVersion, name, kind, module, and category fields.',
39
+ });
40
+ }
41
+ function manifestBaseFromObject(obj) {
42
+ return {
43
+ schemaVersion: PLUGIN_SCHEMA_VERSION,
44
+ name: obj.name,
45
+ kind: obj.kind,
46
+ module: obj.module,
47
+ ...(typeof obj.description === 'string' ? { description: obj.description } : {}),
48
+ };
49
+ }
50
+ function schemaVersionDiagnostic(obj) {
51
+ if (obj.schemaVersion === PLUGIN_SCHEMA_VERSION)
52
+ return null;
53
+ return {
54
+ code: 'unsupported-schema-version',
55
+ field: 'schemaVersion',
56
+ message: `unsupported schemaVersion ${String(obj.schemaVersion)}; expected ${PLUGIN_SCHEMA_VERSION}`,
57
+ hint: `Set "schemaVersion": ${PLUGIN_SCHEMA_VERSION}.`,
58
+ };
59
+ }
60
+ function nameDiagnostic(obj) {
61
+ if (typeof obj.name === 'string' && /^[a-z0-9][a-z0-9._/-]{0,64}$/i.test(obj.name))
62
+ return null;
63
+ return {
64
+ code: 'invalid-name',
65
+ field: 'name',
66
+ message: 'name is required and must be 1-65 chars of [a-z0-9._/-]',
67
+ hint: 'Use a stable 1-65 character plugin id such as "team/no-console" or "my-plugin".',
68
+ };
69
+ }
70
+ function kindDiagnostic(obj) {
71
+ if (obj.kind === 'analyzer' || obj.kind === 'reporter')
72
+ return null;
73
+ return {
74
+ code: 'unsupported-kind',
75
+ field: 'kind',
76
+ message: 'kind must be "analyzer" or "reporter"',
77
+ hint: 'Set "kind": "analyzer" for issue-producing plugins or "kind": "reporter" for CLI output plugins.',
78
+ };
79
+ }
80
+ function moduleDiagnostic(obj) {
81
+ if (typeof obj.module !== 'string' || obj.module.length === 0) {
82
+ return {
83
+ code: 'invalid-module',
84
+ field: 'module',
85
+ message: 'module is required and must be a relative path',
86
+ hint: 'Point to a local module inside the same plugin directory, for example "./check.mjs".',
87
+ };
88
+ }
89
+ if (path.isAbsolute(obj.module) || obj.module.split(/[/\\]/).some((seg) => seg === '..')) {
90
+ return {
91
+ code: 'invalid-module',
92
+ field: 'module',
93
+ message: 'module must be a relative path inside the plugin dir',
94
+ hint: 'Do not use absolute paths or any ".." path segment.',
95
+ };
96
+ }
97
+ return null;
98
+ }
99
+ function descriptionDiagnostic(obj) {
100
+ if (obj.description === undefined || typeof obj.description === 'string')
101
+ return null;
102
+ return {
103
+ code: 'invalid-description',
104
+ field: 'description',
105
+ message: 'description must be a string when provided',
106
+ };
107
+ }
108
+ function validateAnalyzerManifest(obj, base) {
109
+ if (typeof obj.category !== 'string' || obj.category.length === 0) {
110
+ return failValidation({
111
+ code: 'invalid-category',
112
+ field: 'category',
113
+ message: 'category is required for analyzer plugins',
114
+ hint: 'Use the fallback Issue.category for this plugin, for example "custom" or "security".',
115
+ });
116
+ }
117
+ return {
118
+ ok: true,
119
+ manifest: {
120
+ schemaVersion: base.schemaVersion,
121
+ name: base.name,
122
+ kind: 'analyzer',
123
+ module: base.module,
124
+ category: obj.category,
125
+ ...(base.description ? { description: base.description } : {}),
126
+ },
127
+ };
128
+ }
129
+ function validateReporterManifest(obj, base) {
130
+ const commandValidation = validateReporterCommands(obj.commands);
131
+ if (!commandValidation.ok)
132
+ return commandValidation;
133
+ return {
134
+ ok: true,
135
+ manifest: {
136
+ schemaVersion: base.schemaVersion,
137
+ name: base.name,
138
+ kind: 'reporter',
139
+ module: base.module,
140
+ commands: commandValidation.commands,
141
+ ...(base.description ? { description: base.description } : {}),
142
+ },
143
+ };
144
+ }
145
+ function validateReporterCommands(input) {
146
+ if (!Array.isArray(input) || input.length === 0) {
147
+ return failValidation({
148
+ code: 'invalid-commands',
149
+ field: 'commands',
150
+ message: 'commands must be a non-empty array for reporter plugins',
151
+ hint: 'Use one or more supported commands: doctor, analyze, ci.',
152
+ });
153
+ }
154
+ const seen = new Set();
155
+ const invalid = [];
156
+ for (const value of input) {
157
+ if (typeof value !== 'string' || !isReporterCommand(value)) {
158
+ invalid.push(String(value));
159
+ continue;
160
+ }
161
+ seen.add(value);
162
+ }
163
+ if (invalid.length > 0) {
164
+ return failValidation({
165
+ code: 'invalid-commands',
166
+ field: 'commands',
167
+ message: `unsupported reporter command(s): ${invalid.join(', ')}`,
168
+ hint: 'Supported reporter commands are: doctor, analyze, ci.',
169
+ });
170
+ }
171
+ return { ok: true, commands: [...seen] };
172
+ }
173
+ function isReporterCommand(value) {
174
+ return PLUGIN_REPORTER_COMMANDS.includes(value);
175
+ }
176
+ function failValidation(diagnostic) {
177
+ return { ok: false, reason: diagnostic.message, diagnostic };
178
+ }
179
+ //# sourceMappingURL=pluginManifestValidation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pluginManifestValidation.js","sourceRoot":"","sources":["../../src/core/pluginManifestValidation.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,6 @@
1
1
  import type { CodeGraph } from './codeGraph.js';
2
2
  import type { FileEntry, Issue, DataflowReport, SemanticGraphReport } from '../types.js';
3
+ import type { PluginAnalyzerManifest, PluginDiagnostic, PluginManifest, PluginReporterCommand, PluginReporterManifest } from './pluginManifestValidation.js';
3
4
  /**
4
5
  * Stable local plugin API (2.0+).
5
6
  *
@@ -15,32 +16,10 @@ import type { FileEntry, Issue, DataflowReport, SemanticGraphReport } from '../t
15
16
  * discipline as the rest of projscan.
16
17
  */
17
18
  export declare const PLUGIN_PREVIEW_FLAG = "PROJSCAN_PLUGINS_PREVIEW";
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' | 'reporter';
22
- export type PluginReporterCommand = 'doctor' | 'analyze' | 'ci';
23
- export declare const PLUGIN_REPORTER_COMMANDS: readonly ["doctor", "analyze", "ci"];
24
- interface PluginManifestBase {
25
- schemaVersion: number;
26
- name: string;
27
- kind: PluginKind;
28
- /** Module entry point, relative to the manifest file. */
29
- module: string;
30
- /** Optional human-readable summary. */
31
- description?: string;
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;
21
+ export { PLUGIN_REPORTER_COMMANDS, PLUGIN_SCHEMA_VERSION, validateManifest, } from './pluginManifestValidation.js';
22
+ export type { PluginAnalyzerManifest, PluginDiagnostic, PluginKind, PluginManifest, PluginReporterCommand, PluginReporterManifest, } from './pluginManifestValidation.js';
44
23
  export interface PluginAnalyzerContext {
45
24
  schemaVersion: 1;
46
25
  getCodeGraph: () => Promise<CodeGraph>;
@@ -133,20 +112,3 @@ export declare function renderReporterPlugin(plugin: LoadedReporterPlugin, conte
133
112
  * collide).
134
113
  */
135
114
  export declare function runAnalyzerPlugins(plugins: LoadedPlugin[], rootPath: string, files: FileEntry[], context?: PluginAnalyzerContext): Promise<Issue[]>;
136
- export interface PluginDiagnostic {
137
- code: 'invalid-manifest' | 'unsupported-schema-version' | 'invalid-name' | 'unsupported-kind' | 'invalid-module' | 'invalid-category' | 'invalid-commands' | 'invalid-description' | 'invalid-manifest-path' | 'invalid-json' | 'read-error' | 'plugins-disabled' | 'reporter-not-found' | 'reporter-unsupported-command' | 'invalid-reporter-export' | 'reporter-load-error' | 'reporter-render-error' | 'plugin-untrusted';
138
- message: string;
139
- field?: string;
140
- hint?: string;
141
- }
142
- interface ValidationOk {
143
- ok: true;
144
- manifest: PluginManifest;
145
- }
146
- interface ValidationFail {
147
- ok: false;
148
- reason: string;
149
- diagnostic: PluginDiagnostic;
150
- }
151
- export declare function validateManifest(input: unknown): ValidationOk | ValidationFail;
152
- export {};