@devflow-tools/plugin-react 0.16.10 → 0.16.12

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 (31) hide show
  1. package/dist/analyzers/__tests__/performance-audit.test.js +16 -0
  2. package/dist/analyzers/__tests__/performance-audit.test.js.map +1 -1
  3. package/dist/analyzers/__tests__/target-resolver.test.d.ts +2 -0
  4. package/dist/analyzers/__tests__/target-resolver.test.d.ts.map +1 -0
  5. package/dist/analyzers/__tests__/target-resolver.test.js +173 -0
  6. package/dist/analyzers/__tests__/target-resolver.test.js.map +1 -0
  7. package/dist/analyzers/diagnose-bug.d.ts.map +1 -1
  8. package/dist/analyzers/diagnose-bug.js +46 -77
  9. package/dist/analyzers/diagnose-bug.js.map +1 -1
  10. package/dist/analyzers/file-scanner.d.ts +11 -0
  11. package/dist/analyzers/file-scanner.d.ts.map +1 -1
  12. package/dist/analyzers/file-scanner.js +37 -168
  13. package/dist/analyzers/file-scanner.js.map +1 -1
  14. package/dist/analyzers/hooks-review.d.ts.map +1 -1
  15. package/dist/analyzers/hooks-review.js +24 -5
  16. package/dist/analyzers/hooks-review.js.map +1 -1
  17. package/dist/analyzers/performance-audit.d.ts +15 -0
  18. package/dist/analyzers/performance-audit.d.ts.map +1 -1
  19. package/dist/analyzers/performance-audit.js +118 -8
  20. package/dist/analyzers/performance-audit.js.map +1 -1
  21. package/dist/analyzers/refactor-component.d.ts.map +1 -1
  22. package/dist/analyzers/refactor-component.js +29 -3
  23. package/dist/analyzers/refactor-component.js.map +1 -1
  24. package/dist/analyzers/target-resolver.d.ts +57 -0
  25. package/dist/analyzers/target-resolver.d.ts.map +1 -0
  26. package/dist/analyzers/target-resolver.js +451 -0
  27. package/dist/analyzers/target-resolver.js.map +1 -0
  28. package/dist/index.d.ts.map +1 -1
  29. package/dist/index.js +43 -7
  30. package/dist/index.js.map +1 -1
  31. package/package.json +3 -3
@@ -0,0 +1,451 @@
1
+ import ts from 'typescript';
2
+ import { lstatSync, readFileSync, readdirSync, realpathSync } from 'fs';
3
+ import { basename, extname, isAbsolute, join, relative, resolve, sep } from 'path';
4
+ import { fileURLToPath } from 'url';
5
+ const REACT_EXTENSIONS = ['.tsx', '.ts', '.jsx', '.js'];
6
+ const IGNORE_DIRECTORIES = new Set([
7
+ '.git', '.claude', '.devflow', '.codegraph', '.next', '.turbo', '.cache',
8
+ 'node_modules', 'dist', 'build', 'coverage',
9
+ ]);
10
+ const NOISE_PATTERNS = [
11
+ /[\\/]__tests__[\\/]/,
12
+ /\.test\.\w+$/,
13
+ /\.spec\.\w+$/,
14
+ /\.config\.\w+$/,
15
+ /\.d\.ts$/,
16
+ /[\\/]plugins[\\/]/,
17
+ ];
18
+ export function resolveAnalyzerTarget(ctx, options) {
19
+ return createTargetResolverInventory(ctx).resolve(options);
20
+ }
21
+ export function createTargetResolverInventory(ctx) {
22
+ const bounds = getProjectBounds(ctx.projectRoot);
23
+ const state = {
24
+ bounds,
25
+ files: uniqueFiles(ctx.files, bounds),
26
+ scannedDisk: false,
27
+ initialContextTruncated: ctx.truncated === true,
28
+ contentCache: new Map(),
29
+ exportedSymbolsCache: new Map(),
30
+ };
31
+ return {
32
+ resolve: options => resolveWithInventory(state, options),
33
+ getProjectFiles: () => {
34
+ ensureProjectFiles(state);
35
+ return [...state.files];
36
+ },
37
+ };
38
+ }
39
+ function resolveWithInventory(inventory, options) {
40
+ const requested = {
41
+ filePath: options.filePath,
42
+ componentName: options.componentName,
43
+ };
44
+ const { bounds, initialContextTruncated } = inventory;
45
+ const target = buildTargetDescriptor(options, bounds.root);
46
+ if (!target.normalizedPath && target.names.length === 0) {
47
+ return {
48
+ status: 'not_found',
49
+ rank: null,
50
+ requested,
51
+ candidates: [],
52
+ scannedDisk: inventory.scannedDisk,
53
+ initialContextTruncated,
54
+ };
55
+ }
56
+ inventory.files = mergeFiles(inventory.files, directPathCandidates(bounds, target.normalizedPath));
57
+ // A truncated context cannot establish basename/symbol uniqueness. Expand it
58
+ // before ranking. An exact path is globally unique; every lower rank needs a
59
+ // disk inventory even when the supplied context only contains partial hints.
60
+ if (initialContextTruncated) {
61
+ ensureProjectFiles(inventory);
62
+ }
63
+ let structural = rankCandidates(inventory.files, bounds.root, target, options, false, inventory);
64
+ const hasExactPath = structural.some(candidate => candidate.rank === 'exact_path');
65
+ if (!hasExactPath && !inventory.scannedDisk) {
66
+ ensureProjectFiles(inventory);
67
+ structural = rankCandidates(inventory.files, bounds.root, target, options, false, inventory);
68
+ }
69
+ const ranked = structural.length > 0
70
+ ? structural
71
+ : rankCandidates(inventory.files, bounds.root, target, options, true, inventory);
72
+ if (ranked.length === 0) {
73
+ return {
74
+ status: 'not_found',
75
+ rank: null,
76
+ requested,
77
+ candidates: [],
78
+ scannedDisk: inventory.scannedDisk,
79
+ initialContextTruncated,
80
+ };
81
+ }
82
+ const bestRank = ranked[0].rankOrder;
83
+ const candidates = ranked.filter(candidate => candidate.rankOrder === bestRank);
84
+ if (candidates.length > 1) {
85
+ return {
86
+ status: 'ambiguous',
87
+ rank: candidates[0].rank,
88
+ requested,
89
+ candidates,
90
+ scannedDisk: inventory.scannedDisk,
91
+ initialContextTruncated,
92
+ };
93
+ }
94
+ return {
95
+ status: 'resolved',
96
+ rank: candidates[0].rank,
97
+ requested,
98
+ files: [candidates[0].file],
99
+ candidates,
100
+ scannedDisk: inventory.scannedDisk,
101
+ initialContextTruncated,
102
+ };
103
+ }
104
+ function ensureProjectFiles(inventory) {
105
+ if (inventory.scannedDisk)
106
+ return;
107
+ inventory.files = mergeFiles(inventory.files, scanProjectFiles(inventory.bounds));
108
+ inventory.scannedDisk = true;
109
+ }
110
+ export function toTargetResolutionMetadata(result) {
111
+ return {
112
+ status: result.status,
113
+ rank: result.rank,
114
+ requested: result.requested,
115
+ files: result.status === 'resolved'
116
+ ? result.candidates.map(candidate => candidate.path)
117
+ : [],
118
+ candidates: result.candidates.map(candidate => ({
119
+ path: candidate.path,
120
+ rank: candidate.rank,
121
+ evidence: candidate.evidence,
122
+ })),
123
+ scannedDisk: result.scannedDisk,
124
+ initialContextTruncated: result.initialContextTruncated,
125
+ };
126
+ }
127
+ function buildTargetDescriptor(options, projectRoot) {
128
+ const normalizedPath = options.filePath
129
+ ? normalizeTargetPath(options.filePath, projectRoot).replace(/\/+$/, '')
130
+ : undefined;
131
+ const names = new Set();
132
+ addNameForms(names, options.componentName);
133
+ if (normalizedPath)
134
+ addNameForms(names, basename(normalizedPath).replace(/\.[^.]+$/, ''));
135
+ return {
136
+ normalizedPath,
137
+ normalizedPathWithoutExtension: normalizedPath?.replace(/\.[^.]+$/, ''),
138
+ names: [...names].filter(Boolean),
139
+ canonicalNames: new Set([...names].map(canonicalName).filter(Boolean)),
140
+ };
141
+ }
142
+ function rankCandidates(files, projectRoot, target, options, includeFuzzy, inventory) {
143
+ const candidates = [];
144
+ for (const file of files) {
145
+ const path = normalizeTargetPath(relative(projectRoot, file), projectRoot);
146
+ const pathLower = path.toLowerCase();
147
+ const pathWithoutExtension = pathLower.replace(/\.[^.]+$/, '');
148
+ const fileBase = basename(path).replace(/\.[^.]+$/, '');
149
+ const evidence = [];
150
+ let rank;
151
+ let rankOrder = Number.MAX_SAFE_INTEGER;
152
+ if (target.normalizedPath) {
153
+ const requestedPath = target.normalizedPath.toLowerCase();
154
+ const requestedWithoutExtension = target.normalizedPathWithoutExtension.toLowerCase();
155
+ if (pathLower === requestedPath
156
+ || (!extname(target.normalizedPath) && pathWithoutExtension === requestedWithoutExtension)) {
157
+ rank = 'exact_path';
158
+ rankOrder = 1;
159
+ evidence.push(`normalized path matches ${target.normalizedPath}`);
160
+ }
161
+ }
162
+ if (!rank && target.canonicalNames.has(canonicalName(fileBase))) {
163
+ rank = 'exact_basename';
164
+ rankOrder = 2;
165
+ evidence.push(`normalized basename matches ${fileBase}`);
166
+ }
167
+ if (!rank) {
168
+ const symbols = collectExportedSymbolsAndComponents(file, inventory);
169
+ const matchingSymbol = symbols.find(symbol => target.canonicalNames.has(canonicalName(symbol)));
170
+ if (matchingSymbol) {
171
+ rank = 'exported_symbol';
172
+ rankOrder = 3;
173
+ evidence.push(`exports symbol ${matchingSymbol}`);
174
+ }
175
+ }
176
+ if (!rank && isDirectoryEntry(path, target)) {
177
+ rank = 'directory_entry';
178
+ rankOrder = 4;
179
+ evidence.push(`directory entry matches ${basename(path)}`);
180
+ }
181
+ if (!rank && includeFuzzy
182
+ && matchesContent(file, target.names, options.matchContent, inventory)) {
183
+ rank = 'fuzzy_content';
184
+ rankOrder = 5;
185
+ evidence.push('content contains a normalized target name');
186
+ }
187
+ if (rank)
188
+ candidates.push({ file, path, rank, rankOrder, evidence });
189
+ }
190
+ return candidates.sort((left, right) => left.rankOrder - right.rankOrder || left.path.localeCompare(right.path));
191
+ }
192
+ function collectExportedSymbolsAndComponents(file, inventory) {
193
+ const cached = inventory.exportedSymbolsCache.get(file);
194
+ if (cached)
195
+ return cached;
196
+ const content = readCachedFile(file, inventory);
197
+ if (content === null)
198
+ return [];
199
+ const sourceFile = ts.createSourceFile(file, content, ts.ScriptTarget.Latest, true, inferScriptKind(file));
200
+ const symbols = new Set();
201
+ for (const statement of sourceFile.statements) {
202
+ const exported = hasExportModifier(statement);
203
+ if ((ts.isFunctionDeclaration(statement) || ts.isClassDeclaration(statement)
204
+ || ts.isInterfaceDeclaration(statement) || ts.isTypeAliasDeclaration(statement)
205
+ || ts.isEnumDeclaration(statement)) && statement.name) {
206
+ if (exported)
207
+ symbols.add(statement.name.text);
208
+ continue;
209
+ }
210
+ if (ts.isVariableStatement(statement)) {
211
+ for (const declaration of statement.declarationList.declarations) {
212
+ if (exported && ts.isIdentifier(declaration.name)) {
213
+ symbols.add(declaration.name.text);
214
+ }
215
+ }
216
+ continue;
217
+ }
218
+ if (ts.isExportDeclaration(statement) && statement.exportClause
219
+ && ts.isNamedExports(statement.exportClause)) {
220
+ for (const element of statement.exportClause.elements)
221
+ symbols.add(element.name.text);
222
+ }
223
+ if (ts.isExportAssignment(statement) && ts.isIdentifier(statement.expression)) {
224
+ symbols.add(statement.expression.text);
225
+ }
226
+ }
227
+ const exportedSymbols = [...symbols];
228
+ inventory.exportedSymbolsCache.set(file, exportedSymbols);
229
+ return exportedSymbols;
230
+ }
231
+ function hasExportModifier(node) {
232
+ return ts.canHaveModifiers(node)
233
+ && (ts.getModifiers(node)?.some(modifier => modifier.kind === ts.SyntaxKind.ExportKeyword) ?? false);
234
+ }
235
+ function isDirectoryEntry(path, target) {
236
+ const base = basename(path).replace(/\.[^.]+$/, '').toLowerCase();
237
+ if (base !== 'index')
238
+ return false;
239
+ const directory = path.slice(0, Math.max(0, path.lastIndexOf('/')));
240
+ if (target.normalizedPath && directory.toLowerCase() === target.normalizedPath.toLowerCase())
241
+ return true;
242
+ return target.canonicalNames.has(canonicalName(basename(directory)));
243
+ }
244
+ function matchesContent(file, names, matchContent, inventory) {
245
+ if (matchContent) {
246
+ for (const name of names) {
247
+ try {
248
+ if (matchContent(file, name))
249
+ return true;
250
+ }
251
+ catch { }
252
+ }
253
+ return false;
254
+ }
255
+ const content = inventory ? readCachedFile(file, inventory) : null;
256
+ return content !== null
257
+ && names.some(name => content.toLowerCase().includes(name.toLowerCase()));
258
+ }
259
+ function readCachedFile(file, inventory) {
260
+ if (inventory.contentCache.has(file))
261
+ return inventory.contentCache.get(file);
262
+ let content;
263
+ try {
264
+ content = readFileSync(file, 'utf-8');
265
+ }
266
+ catch {
267
+ content = null;
268
+ }
269
+ inventory.contentCache.set(file, content);
270
+ return content;
271
+ }
272
+ function directPathCandidates(bounds, normalizedPath) {
273
+ if (!normalizedPath)
274
+ return [];
275
+ const absolutePath = resolve(bounds.root, normalizedPath);
276
+ const candidates = extname(normalizedPath)
277
+ ? [absolutePath]
278
+ : [absolutePath, ...REACT_EXTENSIONS.map(extension => `${absolutePath}${extension}`)];
279
+ return candidates.filter(file => isEligibleProjectFile(file, bounds));
280
+ }
281
+ function scanProjectFiles(bounds) {
282
+ const files = [];
283
+ const directories = [bounds.root];
284
+ while (directories.length > 0) {
285
+ const directory = directories.pop();
286
+ let entries;
287
+ try {
288
+ entries = readdirSync(directory).sort();
289
+ }
290
+ catch {
291
+ continue;
292
+ }
293
+ const childDirectories = [];
294
+ for (const entry of entries) {
295
+ if (IGNORE_DIRECTORIES.has(entry))
296
+ continue;
297
+ const fullPath = join(directory, entry);
298
+ let stat;
299
+ try {
300
+ stat = lstatSync(fullPath);
301
+ }
302
+ catch {
303
+ continue;
304
+ }
305
+ if (stat.isSymbolicLink())
306
+ continue;
307
+ if (stat.isDirectory())
308
+ childDirectories.push(fullPath);
309
+ else if (stat.isFile() && hasEligibleExtensionAndPath(fullPath, bounds.root))
310
+ files.push(fullPath);
311
+ }
312
+ directories.push(...childDirectories.reverse());
313
+ }
314
+ return files;
315
+ }
316
+ function isEligibleProjectFile(file, bounds) {
317
+ const absolute = resolve(file);
318
+ if (!isPathContained(bounds.root, absolute) || hasSymlinkSegment(bounds.root, absolute))
319
+ return false;
320
+ try {
321
+ const stat = lstatSync(absolute);
322
+ const canonicalFile = realpathSync.native(absolute);
323
+ return stat.isFile()
324
+ && isPathContained(bounds.canonicalRoot, canonicalFile)
325
+ && hasEligibleExtensionAndPath(absolute, bounds.root);
326
+ }
327
+ catch {
328
+ return false;
329
+ }
330
+ }
331
+ function hasEligibleExtensionAndPath(file, projectRoot) {
332
+ const normalizedPath = relative(projectRoot, file).replace(/\\/g, '/');
333
+ return REACT_EXTENSIONS.includes(extname(file))
334
+ && !NOISE_PATTERNS.some(pattern => pattern.test(normalizedPath));
335
+ }
336
+ function uniqueFiles(files, bounds) {
337
+ const unique = new Map();
338
+ for (const file of files) {
339
+ const absolute = resolveProjectPath(file, bounds.root);
340
+ if (absolute && isEligibleProjectFile(absolute, bounds)) {
341
+ unique.set(relative(bounds.root, absolute).replace(/\\/g, '/').toLowerCase(), absolute);
342
+ }
343
+ }
344
+ return [...unique.values()];
345
+ }
346
+ function mergeFiles(left, right) {
347
+ const result = [...left];
348
+ const seen = new Set(left.map(file => file.replace(/\\/g, '/').toLowerCase()));
349
+ for (const file of right) {
350
+ const key = file.replace(/\\/g, '/').toLowerCase();
351
+ if (!seen.has(key)) {
352
+ seen.add(key);
353
+ result.push(file);
354
+ }
355
+ }
356
+ return result;
357
+ }
358
+ export function normalizeTargetPath(filePath, projectRoot) {
359
+ const root = resolve(projectRoot);
360
+ const absolute = resolveProjectPath(filePath, root);
361
+ return absolute ? relative(root, absolute).replace(/\\/g, '/') : '';
362
+ }
363
+ function resolveProjectPath(filePath, projectRoot) {
364
+ const parsedPath = parseTargetPath(filePath);
365
+ if (!parsedPath)
366
+ return undefined;
367
+ const absolute = isAbsolute(parsedPath)
368
+ ? resolve(parsedPath)
369
+ : resolve(projectRoot, parsedPath);
370
+ return isPathContained(projectRoot, absolute) ? absolute : undefined;
371
+ }
372
+ function parseTargetPath(filePath) {
373
+ const trimmed = filePath.trim();
374
+ if (!trimmed)
375
+ return undefined;
376
+ if (/^file:/i.test(trimmed)) {
377
+ try {
378
+ return fileURLToPath(new URL(trimmed));
379
+ }
380
+ catch {
381
+ return undefined;
382
+ }
383
+ }
384
+ return trimmed
385
+ .replace(/^webpack:\/\/+/, '')
386
+ .replace(/[?#].*$/, '')
387
+ .replace(/\\/g, '/');
388
+ }
389
+ function getProjectBounds(projectRoot) {
390
+ const root = resolve(projectRoot);
391
+ let canonicalRoot = root;
392
+ try {
393
+ canonicalRoot = realpathSync.native(root);
394
+ }
395
+ catch { }
396
+ return { root, canonicalRoot };
397
+ }
398
+ function isPathContained(root, candidate) {
399
+ const relativePath = relative(root, candidate);
400
+ return relativePath === ''
401
+ || (relativePath !== '..'
402
+ && !relativePath.startsWith(`..${sep}`)
403
+ && !isAbsolute(relativePath));
404
+ }
405
+ function hasSymlinkSegment(root, candidate) {
406
+ const relativePath = relative(root, candidate);
407
+ if (!relativePath || !isPathContained(root, candidate))
408
+ return false;
409
+ let current = root;
410
+ for (const segment of relativePath.split(sep)) {
411
+ current = join(current, segment);
412
+ try {
413
+ if (lstatSync(current).isSymbolicLink())
414
+ return true;
415
+ }
416
+ catch {
417
+ return false;
418
+ }
419
+ }
420
+ return false;
421
+ }
422
+ function addNameForms(names, value) {
423
+ if (!value?.trim())
424
+ return;
425
+ const words = value.trim()
426
+ .replace(/\.[^.]+$/, '')
427
+ .replace(/([a-z0-9])([A-Z])/g, '$1 $2')
428
+ .split(/[^a-zA-Z0-9]+/)
429
+ .filter(Boolean)
430
+ .map(word => word.toLowerCase());
431
+ if (words.length === 0)
432
+ return;
433
+ const pascal = words.map(word => word.charAt(0).toUpperCase() + word.slice(1)).join('');
434
+ names.add(value.trim());
435
+ names.add(words.join('-'));
436
+ names.add(pascal);
437
+ names.add(pascal.charAt(0).toLowerCase() + pascal.slice(1));
438
+ }
439
+ function canonicalName(value) {
440
+ return value.replace(/[^a-zA-Z0-9]/g, '').toLowerCase();
441
+ }
442
+ function inferScriptKind(file) {
443
+ if (file.endsWith('.tsx'))
444
+ return ts.ScriptKind.TSX;
445
+ if (file.endsWith('.jsx'))
446
+ return ts.ScriptKind.JSX;
447
+ if (file.endsWith('.js'))
448
+ return ts.ScriptKind.JS;
449
+ return ts.ScriptKind.TS;
450
+ }
451
+ //# sourceMappingURL=target-resolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"target-resolver.js","sourceRoot":"","sources":["../../src/analyzers/target-resolver.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAIxD,eAAO,MAAM,WAAW,EAAE,aA23DzB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAIxD,eAAO,MAAM,WAAW,EAAE,aA+5DzB,CAAC"}
package/dist/index.js CHANGED
@@ -3,7 +3,7 @@ export const reactPlugin = {
3
3
  meta: {
4
4
  name: "react",
5
5
  version: "0.1.0",
6
- description: "React 18 专家能力 — Bug 诊断、组件重构、性能优化、Hooks 审查",
6
+ description: "React 专家能力 — Bug 诊断、组件重构、性能优化、Hooks 审查",
7
7
  icon: "⚛️",
8
8
  tags: ["frontend", "react", "hooks", "jsx", "performance"],
9
9
  },
@@ -17,13 +17,13 @@ export const reactPlugin = {
17
17
  "https://react.dev/learn",
18
18
  ],
19
19
  pluginName: "react",
20
- version: "18.3.1",
20
+ version: "current",
21
21
  },
22
22
  ],
23
23
  },
24
24
  memory: {
25
25
  project: {
26
- stack: ["React 18", "React Router", "Zustand"],
26
+ stack: ["React", "React Router", "Zustand"],
27
27
  conventions: [
28
28
  { key: "components", value: "使用函数组件 + Hooks", source: "manual", confidence: 0.9 },
29
29
  { key: "file-structure", value: "一个组件一个文件", source: "manual", confidence: 0.9 },
@@ -44,7 +44,7 @@ export const reactPlugin = {
44
44
  id: "react:useEffect-cleanup",
45
45
  source: "react",
46
46
  title: "useEffect 清理",
47
- content: "useEffect 的返回值应为一个清理函数,用于取消订阅、清除定时器等副作用。React 18 在 Strict Mode 下会执行两次 useEffect 以帮助发现清理问题。",
47
+ content: "useEffect 的返回值应为一个清理函数,用于取消订阅、清除定时器等副作用。开发模式下的 Strict Mode 可能重复执行 Effect 以帮助发现清理问题。",
48
48
  embedding: [],
49
49
  },
50
50
  {
@@ -65,7 +65,7 @@ export const reactPlugin = {
65
65
  id: "react:suspense-streaming",
66
66
  source: "react",
67
67
  title: "Suspense 与流式渲染",
68
- content: "React 18 支持 Suspense 配合流式 SSR。使用 lazy() 动态导入组件。Suspense 的 fallback 在数据加载期间显示。结合 useDeferredValue 和 useTransition 优化用户体验。",
68
+ content: "React 支持 Suspense 配合流式 SSR。使用 lazy() 动态导入组件。Suspense 的 fallback 在数据加载期间显示。结合项目版本可用的并发 API 优化用户体验。",
69
69
  embedding: [],
70
70
  },
71
71
  ],
@@ -1672,7 +1672,7 @@ export const reactPlugin = {
1672
1672
  ],
1673
1673
  },
1674
1674
  prompt: {
1675
- system: "你是一个 React 18 专家。使用函数组件、Hooks 和 TypeScript。遇到问题先查文档再给方案,不凭空猜测 API 行为。",
1675
+ system: "你是一个 React 专家。项目 package.json 与 lockfile 检测到的版本是唯一权威。使用函数组件、Hooks 和 TypeScript;遇到问题先查对应版本文档再给方案。",
1676
1676
  rules: [
1677
1677
  "使用函数组件 + Hooks,不使用 Class 组件",
1678
1678
  "每个文件只导出一个组件",
@@ -1807,13 +1807,49 @@ export const reactPlugin = {
1807
1807
  },
1808
1808
  },
1809
1809
  runtimeProfilingOccurred: { type: 'boolean' },
1810
+ evidenceContract: {
1811
+ type: 'object',
1812
+ properties: {
1813
+ version: { type: 'string', enum: ['1.0'] },
1814
+ id: { type: 'string' },
1815
+ runtimeProfilingOccurred: { type: 'boolean' },
1816
+ samplingEvidenceOccurred: { type: 'boolean' },
1817
+ requiredSections: {
1818
+ type: 'array',
1819
+ items: { type: 'string', enum: ['工具发现', '模型假设', '需要运行时验证'] },
1820
+ minItems: 3,
1821
+ maxItems: 3,
1822
+ },
1823
+ prohibitedClaims: { type: 'array', items: { type: 'string' }, maxItems: 16 },
1824
+ correctionPolicy: {
1825
+ type: 'object',
1826
+ properties: {
1827
+ maxAttempts: { type: 'integer', enum: [1] },
1828
+ repeatedViolation: { type: 'string', enum: ['fail_open'] },
1829
+ },
1830
+ required: ['maxAttempts', 'repeatedViolation'],
1831
+ },
1832
+ canonicalReport: { type: 'string' },
1833
+ },
1834
+ required: [
1835
+ 'version',
1836
+ 'id',
1837
+ 'runtimeProfilingOccurred',
1838
+ 'samplingEvidenceOccurred',
1839
+ 'requiredSections',
1840
+ 'prohibitedClaims',
1841
+ 'correctionPolicy',
1842
+ 'canonicalReport',
1843
+ ],
1844
+ },
1845
+ canonicalReport: { type: 'string' },
1810
1846
  totalFindings: { type: 'number' },
1811
1847
  truncated: { type: 'boolean' },
1812
1848
  reportId: { type: 'string' },
1813
1849
  metrics: { type: 'object' },
1814
1850
  data: { type: 'object' },
1815
1851
  },
1816
- required: ['success', 'summary', 'findings', 'runtimeProfilingOccurred'],
1852
+ required: ['success', 'summary', 'findings', 'runtimeProfilingOccurred', 'evidenceContract', 'canonicalReport'],
1817
1853
  },
1818
1854
  annotations: {
1819
1855
  readOnlyHint: true,