@perfonext/render-mcp 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +7 -2
- package/dist/index.js +3 -1
- package/dist/index.js.map +1 -1
- package/dist/parser/analysis.d.ts +7 -2
- package/dist/parser/analysis.d.ts.map +1 -1
- package/dist/parser/analysis.js +359 -3
- package/dist/parser/analysis.js.map +1 -1
- package/dist/parser/react-profile.d.ts.map +1 -1
- package/dist/parser/react-profile.js +48 -2
- package/dist/parser/react-profile.js.map +1 -1
- package/dist/parser/types.d.ts +75 -0
- package/dist/parser/types.d.ts.map +1 -1
- package/dist/tools/compare-renders.d.ts +3 -0
- package/dist/tools/compare-renders.d.ts.map +1 -0
- package/dist/tools/compare-renders.js +50 -0
- package/dist/tools/compare-renders.js.map +1 -0
- package/dist/tools/get-hot-commits.d.ts.map +1 -1
- package/dist/tools/get-hot-commits.js +3 -2
- package/dist/tools/get-hot-commits.js.map +1 -1
- package/dist/tools/get-render-summary.js +1 -1
- package/dist/tools/get-render-summary.js.map +1 -1
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -7,10 +7,11 @@
|
|
|
7
7
|
## What It Does
|
|
8
8
|
|
|
9
9
|
- loads exported React Profiler JSON files from Next.js apps
|
|
10
|
-
- summarizes commits
|
|
10
|
+
- summarizes commits, the most expensive components, and detected render issues in one call
|
|
11
11
|
- ranks the hottest commits and shows the top components inside each spike
|
|
12
12
|
- identifies the slowest components by total render cost
|
|
13
13
|
- highlights components with repeated rerenders using deterministic heuristics, evidence signals, and confidence levels
|
|
14
|
+
- compares two render profiles to surface regressions and improvements
|
|
14
15
|
- keeps the loaded profiles in memory so an MCP client can iterate without re-reading the file
|
|
15
16
|
|
|
16
17
|
## Tools
|
|
@@ -18,13 +19,16 @@
|
|
|
18
19
|
| Tool | Description |
|
|
19
20
|
|------|-------------|
|
|
20
21
|
| `load_render_profile` | Parse and load an exported React Profiler JSON file from disk |
|
|
21
|
-
| `get_render_summary` | Summarize a loaded profile
|
|
22
|
+
| `get_render_summary` | Summarize a loaded profile: top components by render cost, hottest commits, and detected render issues (rerender storms, commit spikes) |
|
|
22
23
|
| `get_hot_commits` | Rank the most expensive commits and show the top components inside each spike |
|
|
23
24
|
| `get_slow_components` | Rank the slowest components by total actual render time |
|
|
24
25
|
| `get_rerender_causes` | Explain likely rerender causes using profile-derived heuristics, evidence, confidence, and a documented score |
|
|
26
|
+
| `compare_renders` | Diff two loaded render profiles and rank regressions, improvements, additions, and removals |
|
|
25
27
|
|
|
26
28
|
`get_rerender_causes` is heuristic by design. It works from structural signals in the profiler export — update frequency, nested update propagation, commit spread, and self-intensive renders. When you record with **"Record why each component rendered"** enabled in React DevTools Profiler settings, the export includes richer `changeDescriptions` data; future versions of this tool will parse that field to surface exact prop/state/context diffs natively.
|
|
27
29
|
|
|
30
|
+
`get_render_summary` includes an `issues` field with up to 5 detected render issues (commit spikes and rerender storms) so you get actionable findings in the same call as the summary.
|
|
31
|
+
|
|
28
32
|
## Rerender Score Contract
|
|
29
33
|
|
|
30
34
|
`get_rerender_causes` returns a `score`, `scoreBand`, `confidence`, and `evidence[]` for each component.
|
|
@@ -88,6 +92,7 @@ Local workspace MCP config is also included in `.vscode/mcp.json` for developmen
|
|
|
88
92
|
|
|
89
93
|
- "Load the React Profiler export at `./profile.json` and summarize the hottest components."
|
|
90
94
|
- "Show me the hottest commits in `./profile.json` and which components dominated each spike."
|
|
95
|
+
- "Compare `before.json` and `after.json` and tell me which components regressed."
|
|
91
96
|
- "Which components are consuming the most render time in this Next.js profile?"
|
|
92
97
|
- "Show me the likely rerender causes for the slowest components, including evidence and confidence."
|
|
93
98
|
|
package/dist/index.js
CHANGED
|
@@ -2,15 +2,17 @@
|
|
|
2
2
|
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
3
3
|
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
4
4
|
import { registerLoadRenderProfile } from './tools/load-render-profile.js';
|
|
5
|
+
import { registerCompareRenders } from './tools/compare-renders.js';
|
|
5
6
|
import { registerGetRenderSummary } from './tools/get-render-summary.js';
|
|
6
7
|
import { registerGetHotCommits } from './tools/get-hot-commits.js';
|
|
7
8
|
import { registerGetSlowComponents } from './tools/get-slow-components.js';
|
|
8
9
|
import { registerGetRerenderCauses } from './tools/get-rerender-causes.js';
|
|
9
10
|
const server = new McpServer({
|
|
10
11
|
name: 'perfonext-render-mcp',
|
|
11
|
-
version: '0.
|
|
12
|
+
version: '0.2.0',
|
|
12
13
|
});
|
|
13
14
|
registerLoadRenderProfile(server);
|
|
15
|
+
registerCompareRenders(server);
|
|
14
16
|
registerGetRenderSummary(server);
|
|
15
17
|
registerGetHotCommits(server);
|
|
16
18
|
registerGetSlowComponents(server);
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AAEjF,OAAO,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAC;AAC3E,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AACzE,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACnE,OAAO,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAC;AAC3E,OAAO,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAC;AAE3E,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;IAC3B,IAAI,EAAE,sBAAsB;IAC5B,OAAO,EAAE,OAAO;CACjB,CAAC,CAAC;AAEH,yBAAyB,CAAC,MAAM,CAAC,CAAC;AAClC,wBAAwB,CAAC,MAAM,CAAC,CAAC;AACjC,qBAAqB,CAAC,MAAM,CAAC,CAAC;AAC9B,yBAAyB,CAAC,MAAM,CAAC,CAAC;AAClC,yBAAyB,CAAC,MAAM,CAAC,CAAC;AAElC,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;AAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AAEjF,OAAO,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAC;AAC3E,OAAO,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AACpE,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AACzE,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACnE,OAAO,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAC;AAC3E,OAAO,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAC;AAE3E,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;IAC3B,IAAI,EAAE,sBAAsB;IAC5B,OAAO,EAAE,OAAO;CACjB,CAAC,CAAC;AAEH,yBAAyB,CAAC,MAAM,CAAC,CAAC;AAClC,sBAAsB,CAAC,MAAM,CAAC,CAAC;AAC/B,wBAAwB,CAAC,MAAM,CAAC,CAAC;AACjC,qBAAqB,CAAC,MAAM,CAAC,CAAC;AAC9B,yBAAyB,CAAC,MAAM,CAAC,CAAC;AAClC,yBAAyB,CAAC,MAAM,CAAC,CAAC;AAElC,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;AAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import type { HotCommitSummary, ParsedRenderProfile, RenderSummaryEntry, RerenderCause } from './types.js';
|
|
2
|
-
export declare function getHotCommits(profile: ParsedRenderProfile, limit?: number, componentLimit?: number): HotCommitSummary[];
|
|
1
|
+
import type { CommitBreakdown, HotCommitSummary, ParsedRenderProfile, RenderComparison, RenderIssue, RenderPropagationPath, RenderSummaryEntry, RerenderCause } from './types.js';
|
|
2
|
+
export declare function getHotCommits(profile: ParsedRenderProfile, limit?: number, componentLimit?: number, priorityLevel?: string): HotCommitSummary[];
|
|
3
3
|
export declare function getRenderSummary(profile: ParsedRenderProfile, limit?: number): {
|
|
4
4
|
profileId: string;
|
|
5
5
|
filename: string;
|
|
@@ -11,7 +11,12 @@ export declare function getRenderSummary(profile: ParsedRenderProfile, limit?: n
|
|
|
11
11
|
totalRenderDuration: number;
|
|
12
12
|
topComponents: RenderSummaryEntry[];
|
|
13
13
|
hotCommits: HotCommitSummary[];
|
|
14
|
+
issues: RenderIssue[];
|
|
14
15
|
};
|
|
15
16
|
export declare function getSlowComponents(profile: ParsedRenderProfile, limit?: number, sortBy?: 'total' | 'average' | 'max', minDuration?: number): RenderSummaryEntry[];
|
|
16
17
|
export declare function getRerenderCauses(profile: ParsedRenderProfile, limit?: number, minDuration?: number): RerenderCause[];
|
|
18
|
+
export declare function getCommitBreakdown(profile: ParsedRenderProfile, commitIndex: number, componentLimit?: number): CommitBreakdown | null;
|
|
19
|
+
export declare function traceRenderPropagation(profile: ParsedRenderProfile, commitIndex: number, limit?: number): RenderPropagationPath[];
|
|
20
|
+
export declare function detectRenderIssues(profile: ParsedRenderProfile, limit?: number): RenderIssue[];
|
|
21
|
+
export declare function compareRenders(baseProfile: ParsedRenderProfile, currentProfile: ParsedRenderProfile, limit?: number, minDelta?: number): RenderComparison;
|
|
17
22
|
//# sourceMappingURL=analysis.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"analysis.d.ts","sourceRoot":"","sources":["../../src/parser/analysis.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"analysis.d.ts","sourceRoot":"","sources":["../../src/parser/analysis.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,eAAe,EAIf,gBAAgB,EAChB,mBAAmB,EAEnB,gBAAgB,EAEhB,WAAW,EAGX,qBAAqB,EACrB,kBAAkB,EAClB,aAAa,EAId,MAAM,YAAY,CAAC;AAwFpB,wBAAgB,aAAa,CAC3B,OAAO,EAAE,mBAAmB,EAC5B,KAAK,SAAK,EACV,cAAc,SAAI,EAClB,aAAa,CAAC,EAAE,MAAM,GACrB,gBAAgB,EAAE,CAsBpB;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,mBAAmB,EAAE,KAAK,SAAK,GAAG;IAC1E,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,mBAAmB,EAAE,MAAM,CAAC;IAC5B,aAAa,EAAE,kBAAkB,EAAE,CAAC;IACpC,UAAU,EAAE,gBAAgB,EAAE,CAAC;IAC/B,MAAM,EAAE,WAAW,EAAE,CAAC;CACvB,CAcA;AAED,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,mBAAmB,EAC5B,KAAK,SAAK,EACV,MAAM,GAAE,OAAO,GAAG,SAAS,GAAG,KAAe,EAC7C,WAAW,SAAI,GACd,kBAAkB,EAAE,CA0BtB;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,mBAAmB,EAAE,KAAK,SAAK,EAAE,WAAW,SAAI,GAAG,aAAa,EAAE,CA6I5G;AAED,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,mBAAmB,EAC5B,WAAW,EAAE,MAAM,EACnB,cAAc,SAAI,GACjB,eAAe,GAAG,IAAI,CA4ExB;AAED,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,mBAAmB,EAC5B,WAAW,EAAE,MAAM,EACnB,KAAK,SAAK,GACT,qBAAqB,EAAE,CA0JzB;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,mBAAmB,EAAE,KAAK,SAAK,GAAG,WAAW,EAAE,CAyE1F;AA8CD,wBAAgB,cAAc,CAC5B,WAAW,EAAE,mBAAmB,EAChC,cAAc,EAAE,mBAAmB,EACnC,KAAK,SAAK,EACV,QAAQ,SAAI,GACX,gBAAgB,CAyBlB"}
|
package/dist/parser/analysis.js
CHANGED
|
@@ -16,9 +16,30 @@ function getConfidence(evidenceCount) {
|
|
|
16
16
|
}
|
|
17
17
|
return 'low';
|
|
18
18
|
}
|
|
19
|
+
function getSeverityRank(severity) {
|
|
20
|
+
if (severity === 'high') {
|
|
21
|
+
return 3;
|
|
22
|
+
}
|
|
23
|
+
if (severity === 'medium') {
|
|
24
|
+
return 2;
|
|
25
|
+
}
|
|
26
|
+
return 1;
|
|
27
|
+
}
|
|
28
|
+
function getMeasurementsTotalActualDuration(measurements) {
|
|
29
|
+
return measurements.reduce((sum, measurement) => sum + measurement.actualDuration, 0);
|
|
30
|
+
}
|
|
31
|
+
function getFiberNodeMap(profile, rootId) {
|
|
32
|
+
const nodes = rootId == null
|
|
33
|
+
? profile.fiberNodes
|
|
34
|
+
: profile.fiberNodes.filter(node => node.rootId === rootId);
|
|
35
|
+
return new Map(nodes.map(node => [node.fiberId, node]));
|
|
36
|
+
}
|
|
37
|
+
function getMeasurementMap(commit) {
|
|
38
|
+
return new Map(commit.measurements.map(measurement => [measurement.fiberId, measurement]));
|
|
39
|
+
}
|
|
19
40
|
function getCommitTopComponents(commit, limit) {
|
|
20
41
|
const components = new Map();
|
|
21
|
-
const totalActualDuration = commit.measurements
|
|
42
|
+
const totalActualDuration = getMeasurementsTotalActualDuration(commit.measurements);
|
|
22
43
|
for (const measurement of commit.measurements) {
|
|
23
44
|
const existing = components.get(measurement.componentName) ?? {
|
|
24
45
|
componentName: measurement.componentName,
|
|
@@ -42,12 +63,17 @@ function getCommitTopComponents(commit, limit) {
|
|
|
42
63
|
: 0,
|
|
43
64
|
}));
|
|
44
65
|
}
|
|
45
|
-
|
|
66
|
+
function getCommitByIndex(profile, commitIndex) {
|
|
67
|
+
return profile.commits.find(commit => commit.index === commitIndex);
|
|
68
|
+
}
|
|
69
|
+
export function getHotCommits(profile, limit = 10, componentLimit = 3, priorityLevel) {
|
|
46
70
|
return profile.commits
|
|
71
|
+
.filter(commit => priorityLevel == null || commit.priorityLevel === priorityLevel)
|
|
47
72
|
.map(commit => ({
|
|
48
73
|
commitIndex: commit.index,
|
|
74
|
+
rootId: commit.rootId,
|
|
49
75
|
duration: commit.duration,
|
|
50
|
-
totalActualDuration: commit.measurements
|
|
76
|
+
totalActualDuration: getMeasurementsTotalActualDuration(commit.measurements),
|
|
51
77
|
timestamp: commit.timestamp,
|
|
52
78
|
priorityLevel: commit.priorityLevel,
|
|
53
79
|
measurementCount: commit.measurements.length,
|
|
@@ -74,6 +100,7 @@ export function getRenderSummary(profile, limit = 10) {
|
|
|
74
100
|
totalRenderDuration: profile.totalRenderDuration,
|
|
75
101
|
hotCommits: getHotCommits(profile, Math.min(3, profile.commits.length), 3),
|
|
76
102
|
topComponents: getSlowComponents(profile, limit),
|
|
103
|
+
issues: detectRenderIssues(profile, 5),
|
|
77
104
|
};
|
|
78
105
|
}
|
|
79
106
|
export function getSlowComponents(profile, limit = 10, sortBy = 'total', minDuration = 0) {
|
|
@@ -223,4 +250,333 @@ export function getRerenderCauses(profile, limit = 10, minDuration = 0) {
|
|
|
223
250
|
});
|
|
224
251
|
return causes.slice(0, limit);
|
|
225
252
|
}
|
|
253
|
+
export function getCommitBreakdown(profile, commitIndex, componentLimit = 5) {
|
|
254
|
+
const commit = getCommitByIndex(profile, commitIndex);
|
|
255
|
+
if (!commit) {
|
|
256
|
+
return null;
|
|
257
|
+
}
|
|
258
|
+
const totalActualDuration = getMeasurementsTotalActualDuration(commit.measurements);
|
|
259
|
+
const components = new Map();
|
|
260
|
+
for (const measurement of commit.measurements) {
|
|
261
|
+
const existing = components.get(measurement.componentName) ?? {
|
|
262
|
+
componentName: measurement.componentName,
|
|
263
|
+
actualDuration: 0,
|
|
264
|
+
selfDuration: 0,
|
|
265
|
+
renderCount: 0,
|
|
266
|
+
shareOfCommitWork: 0,
|
|
267
|
+
mountCount: 0,
|
|
268
|
+
updateCount: 0,
|
|
269
|
+
nestedUpdateCount: 0,
|
|
270
|
+
};
|
|
271
|
+
existing.actualDuration += measurement.actualDuration;
|
|
272
|
+
existing.selfDuration += measurement.selfDuration;
|
|
273
|
+
existing.renderCount += 1;
|
|
274
|
+
if (measurement.phase === 'mount') {
|
|
275
|
+
existing.mountCount += 1;
|
|
276
|
+
}
|
|
277
|
+
else {
|
|
278
|
+
existing.updateCount += 1;
|
|
279
|
+
if (measurement.isNestedUpdate) {
|
|
280
|
+
existing.nestedUpdateCount += 1;
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
components.set(measurement.componentName, existing);
|
|
284
|
+
}
|
|
285
|
+
const topComponents = Array.from(components.values())
|
|
286
|
+
.sort((left, right) => right.actualDuration - left.actualDuration)
|
|
287
|
+
.slice(0, componentLimit)
|
|
288
|
+
.map(component => ({
|
|
289
|
+
...component,
|
|
290
|
+
shareOfCommitWork: totalActualDuration > 0
|
|
291
|
+
? component.actualDuration / totalActualDuration
|
|
292
|
+
: 0,
|
|
293
|
+
}));
|
|
294
|
+
const topComponentShare = topComponents[0]?.shareOfCommitWork ?? 0;
|
|
295
|
+
const topThreeShare = topComponents
|
|
296
|
+
.slice(0, 3)
|
|
297
|
+
.reduce((sum, component) => sum + component.shareOfCommitWork, 0);
|
|
298
|
+
let interpretation;
|
|
299
|
+
if (topComponentShare >= 0.5) {
|
|
300
|
+
interpretation = 'This commit is dominated by one component, so investigate that component before the rest of the tree.';
|
|
301
|
+
}
|
|
302
|
+
else if (topThreeShare >= 0.8) {
|
|
303
|
+
interpretation = 'This commit is concentrated in a small set of components, so the spike is likely localized to one subtree.';
|
|
304
|
+
}
|
|
305
|
+
else {
|
|
306
|
+
interpretation = 'This commit spreads work across several components, which often points to broader parent-to-child rerender propagation.';
|
|
307
|
+
}
|
|
308
|
+
return {
|
|
309
|
+
commitIndex: commit.index,
|
|
310
|
+
rootId: commit.rootId,
|
|
311
|
+
duration: commit.duration,
|
|
312
|
+
totalActualDuration,
|
|
313
|
+
timestamp: commit.timestamp,
|
|
314
|
+
priorityLevel: commit.priorityLevel,
|
|
315
|
+
measurementCount: commit.measurements.length,
|
|
316
|
+
updaterComponentNames: commit.updaterComponentNames,
|
|
317
|
+
topComponents,
|
|
318
|
+
concentration: {
|
|
319
|
+
topComponentShare,
|
|
320
|
+
topThreeShare,
|
|
321
|
+
},
|
|
322
|
+
interpretation,
|
|
323
|
+
};
|
|
324
|
+
}
|
|
325
|
+
export function traceRenderPropagation(profile, commitIndex, limit = 10) {
|
|
326
|
+
const commit = getCommitByIndex(profile, commitIndex);
|
|
327
|
+
if (!commit) {
|
|
328
|
+
return [];
|
|
329
|
+
}
|
|
330
|
+
const fiberNodeMap = getFiberNodeMap(profile, commit.rootId);
|
|
331
|
+
const measurementMap = getMeasurementMap(commit);
|
|
332
|
+
const renderedFiberIds = new Set(measurementMap.keys());
|
|
333
|
+
const updaterNames = new Set(commit.updaterComponentNames);
|
|
334
|
+
// ---------------------------------------------------------------------------
|
|
335
|
+
// Fallback: infer parent-child links for orphan fibers.
|
|
336
|
+
//
|
|
337
|
+
// Orphan fibers are fibers that rendered in this commit but have no entry in
|
|
338
|
+
// the snapshot tree. This happens when components mount *after* profiling
|
|
339
|
+
// starts — React DevTools only snapshots the tree as it existed at session
|
|
340
|
+
// start, so any later-mounted subtree is invisible to the snapshot.
|
|
341
|
+
//
|
|
342
|
+
// Strategy: sort all rendered fibers by actualDuration descending, then for
|
|
343
|
+
// each orphan pick the tightest candidate parent — the rendered fiber with
|
|
344
|
+
// the smallest actualDuration that is still larger than the orphan's and has
|
|
345
|
+
// enough remaining "child budget" (actualDuration − selfDuration) to absorb
|
|
346
|
+
// it. Subtract the orphan's cost from the chosen parent's budget so
|
|
347
|
+
// subsequent orphans are assigned correctly.
|
|
348
|
+
// ---------------------------------------------------------------------------
|
|
349
|
+
const remainingBudget = new Map();
|
|
350
|
+
const sortedRendered = Array.from(renderedFiberIds)
|
|
351
|
+
.map(id => ({ id, m: measurementMap.get(id) }))
|
|
352
|
+
.sort((a, b) => b.m.actualDuration - a.m.actualDuration);
|
|
353
|
+
for (const { id, m } of sortedRendered) {
|
|
354
|
+
remainingBudget.set(id, m.actualDuration - m.selfDuration);
|
|
355
|
+
}
|
|
356
|
+
// orphanParentMap: orphanFiberId → inferred parent fiberId (or null = root entry)
|
|
357
|
+
const orphanParentMap = new Map();
|
|
358
|
+
// orphanChildrenMap: parentFiberId → list of orphan children assigned to it
|
|
359
|
+
const orphanChildrenMap = new Map();
|
|
360
|
+
for (const { id, m } of sortedRendered) {
|
|
361
|
+
if (fiberNodeMap.has(id)) {
|
|
362
|
+
continue; // has a real snapshot link — skip
|
|
363
|
+
}
|
|
364
|
+
let bestParentId = null;
|
|
365
|
+
let bestParentDuration = Infinity;
|
|
366
|
+
for (const { id: candidateId, m: candidateM } of sortedRendered) {
|
|
367
|
+
if (candidateId === id) {
|
|
368
|
+
continue;
|
|
369
|
+
}
|
|
370
|
+
if (candidateM.actualDuration <= m.actualDuration) {
|
|
371
|
+
continue; // parent must have larger actualDuration
|
|
372
|
+
}
|
|
373
|
+
const budget = remainingBudget.get(candidateId) ?? 0;
|
|
374
|
+
if (budget >= m.actualDuration - 0.1 /* floating-point tolerance */) {
|
|
375
|
+
if (candidateM.actualDuration < bestParentDuration) {
|
|
376
|
+
bestParentDuration = candidateM.actualDuration;
|
|
377
|
+
bestParentId = candidateId;
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
orphanParentMap.set(id, bestParentId);
|
|
382
|
+
if (bestParentId !== null) {
|
|
383
|
+
remainingBudget.set(bestParentId, (remainingBudget.get(bestParentId) ?? 0) - m.actualDuration);
|
|
384
|
+
const siblings = orphanChildrenMap.get(bestParentId) ?? [];
|
|
385
|
+
siblings.push(id);
|
|
386
|
+
orphanChildrenMap.set(bestParentId, siblings);
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
const entryFiberIds = Array.from(renderedFiberIds)
|
|
390
|
+
.filter(fiberId => {
|
|
391
|
+
const node = fiberNodeMap.get(fiberId);
|
|
392
|
+
if (node != null) {
|
|
393
|
+
// Real snapshot node: entry if its parent did not render in this commit.
|
|
394
|
+
return node.parentFiberId == null || !renderedFiberIds.has(node.parentFiberId);
|
|
395
|
+
}
|
|
396
|
+
// Orphan fiber: entry only if its inferred parent also did not render.
|
|
397
|
+
const inferredParent = orphanParentMap.get(fiberId);
|
|
398
|
+
return inferredParent == null || !renderedFiberIds.has(inferredParent);
|
|
399
|
+
})
|
|
400
|
+
.sort((left, right) => {
|
|
401
|
+
const leftMeasurement = measurementMap.get(left);
|
|
402
|
+
const rightMeasurement = measurementMap.get(right);
|
|
403
|
+
return (rightMeasurement?.actualDuration ?? 0) - (leftMeasurement?.actualDuration ?? 0);
|
|
404
|
+
});
|
|
405
|
+
const paths = [];
|
|
406
|
+
const visit = (fiberId, fiberPath, componentPath, totalActualDuration) => {
|
|
407
|
+
const measurement = measurementMap.get(fiberId);
|
|
408
|
+
if (!measurement) {
|
|
409
|
+
return;
|
|
410
|
+
}
|
|
411
|
+
const node = fiberNodeMap.get(fiberId);
|
|
412
|
+
const componentName = node?.componentName ?? `(fiber:${fiberId})`;
|
|
413
|
+
const nextFiberPath = [...fiberPath, fiberId];
|
|
414
|
+
const nextComponentPath = [...componentPath, componentName];
|
|
415
|
+
const nextTotalActualDuration = totalActualDuration + measurement.actualDuration;
|
|
416
|
+
// Snapshot children that rendered + any orphans inferred to live under this fiber.
|
|
417
|
+
const snapshotChildren = node
|
|
418
|
+
? node.childFiberIds.filter(childId => renderedFiberIds.has(childId))
|
|
419
|
+
: [];
|
|
420
|
+
const orphanChildren = (orphanChildrenMap.get(fiberId) ?? [])
|
|
421
|
+
.filter(childId => renderedFiberIds.has(childId));
|
|
422
|
+
const renderedChildren = [...snapshotChildren, ...orphanChildren];
|
|
423
|
+
if (renderedChildren.length === 0) {
|
|
424
|
+
paths.push({
|
|
425
|
+
commitIndex: commit.index,
|
|
426
|
+
rootId: commit.rootId,
|
|
427
|
+
fiberPath: nextFiberPath,
|
|
428
|
+
componentPath: nextComponentPath,
|
|
429
|
+
depth: nextComponentPath.length,
|
|
430
|
+
totalActualDuration: nextTotalActualDuration,
|
|
431
|
+
leafActualDuration: measurement.actualDuration,
|
|
432
|
+
includesUpdater: nextComponentPath.some(name => updaterNames.has(name)),
|
|
433
|
+
});
|
|
434
|
+
return;
|
|
435
|
+
}
|
|
436
|
+
for (const childId of renderedChildren) {
|
|
437
|
+
visit(childId, nextFiberPath, nextComponentPath, nextTotalActualDuration);
|
|
438
|
+
}
|
|
439
|
+
};
|
|
440
|
+
for (const fiberId of entryFiberIds) {
|
|
441
|
+
visit(fiberId, [], [], 0);
|
|
442
|
+
}
|
|
443
|
+
return paths
|
|
444
|
+
.sort((left, right) => {
|
|
445
|
+
if (right.totalActualDuration !== left.totalActualDuration) {
|
|
446
|
+
return right.totalActualDuration - left.totalActualDuration;
|
|
447
|
+
}
|
|
448
|
+
return right.depth - left.depth;
|
|
449
|
+
})
|
|
450
|
+
.slice(0, limit);
|
|
451
|
+
}
|
|
452
|
+
export function detectRenderIssues(profile, limit = 10) {
|
|
453
|
+
const issues = [];
|
|
454
|
+
const averageCommitDuration = profile.commits.length > 0
|
|
455
|
+
? profile.totalCommitDuration / profile.commits.length
|
|
456
|
+
: 0;
|
|
457
|
+
for (const cause of getRerenderCauses(profile, profile.components.length, 0)) {
|
|
458
|
+
if (cause.scoreBand === 'low') {
|
|
459
|
+
continue;
|
|
460
|
+
}
|
|
461
|
+
issues.push({
|
|
462
|
+
type: 'rerender-storm',
|
|
463
|
+
severity: cause.scoreBand,
|
|
464
|
+
title: `${cause.componentName} rerenders frequently`,
|
|
465
|
+
summary: cause.likelyCauses[0] ?? `${cause.componentName} shows repeated rerender pressure.`,
|
|
466
|
+
componentName: cause.componentName,
|
|
467
|
+
evidence: cause.evidence,
|
|
468
|
+
});
|
|
469
|
+
}
|
|
470
|
+
for (const commit of getHotCommits(profile, Math.min(5, profile.commits.length), 3)) {
|
|
471
|
+
if (averageCommitDuration > 0 && commit.duration >= averageCommitDuration * 1.5) {
|
|
472
|
+
const topShare = commit.topComponents[0]?.shareOfCommitWork ?? 0;
|
|
473
|
+
issues.push({
|
|
474
|
+
type: 'commit-spike',
|
|
475
|
+
severity: commit.duration >= averageCommitDuration * 2 ? 'high' : 'medium',
|
|
476
|
+
title: `Commit ${commit.commitIndex} is a render spike`,
|
|
477
|
+
summary: `Commit ${commit.commitIndex} took ${commit.duration.toFixed(2)}ms, versus an average commit duration of ${averageCommitDuration.toFixed(2)}ms. ${topShare >= 0.5 ? 'One component dominates this spike.' : 'The spike is spread across several components.'}`,
|
|
478
|
+
commitIndex: commit.commitIndex,
|
|
479
|
+
evidence: [
|
|
480
|
+
{
|
|
481
|
+
signal: 'commit-duration-spike',
|
|
482
|
+
observed: Number(commit.duration.toFixed(2)),
|
|
483
|
+
threshold: Number((averageCommitDuration * 1.5).toFixed(2)),
|
|
484
|
+
detail: `Commit ${commit.commitIndex} exceeded the average commit duration by ${Number((commit.duration / averageCommitDuration).toFixed(2))}x.`,
|
|
485
|
+
},
|
|
486
|
+
],
|
|
487
|
+
});
|
|
488
|
+
}
|
|
489
|
+
const cascadingPath = traceRenderPropagation(profile, commit.commitIndex, 5)
|
|
490
|
+
.find(path => path.depth >= 3);
|
|
491
|
+
if (cascadingPath) {
|
|
492
|
+
issues.push({
|
|
493
|
+
type: 'cascading-render',
|
|
494
|
+
severity: cascadingPath.includesUpdater ? 'high' : 'medium',
|
|
495
|
+
title: `Commit ${commit.commitIndex} shows cascading subtree work`,
|
|
496
|
+
summary: `A rendered path of depth ${cascadingPath.depth} was observed (${cascadingPath.componentPath.join(' -> ')}), which suggests parent-to-child rerender propagation rather than isolated component work.`,
|
|
497
|
+
commitIndex: commit.commitIndex,
|
|
498
|
+
evidence: [
|
|
499
|
+
{
|
|
500
|
+
signal: 'deep-render-propagation',
|
|
501
|
+
observed: cascadingPath.depth,
|
|
502
|
+
threshold: 3,
|
|
503
|
+
detail: `Rendered path ${cascadingPath.componentPath.join(' -> ')} accumulated ${cascadingPath.totalActualDuration.toFixed(2)}ms of work in a single commit.`,
|
|
504
|
+
},
|
|
505
|
+
],
|
|
506
|
+
});
|
|
507
|
+
}
|
|
508
|
+
}
|
|
509
|
+
return issues
|
|
510
|
+
.sort((left, right) => {
|
|
511
|
+
const severityDelta = getSeverityRank(right.severity) - getSeverityRank(left.severity);
|
|
512
|
+
if (severityDelta !== 0) {
|
|
513
|
+
return severityDelta;
|
|
514
|
+
}
|
|
515
|
+
return (left.commitIndex ?? Number.MAX_SAFE_INTEGER) - (right.commitIndex ?? Number.MAX_SAFE_INTEGER);
|
|
516
|
+
})
|
|
517
|
+
.slice(0, limit);
|
|
518
|
+
}
|
|
519
|
+
function createDiffEntry(componentName, baseComponent, currentComponent) {
|
|
520
|
+
const baseTotalActualDuration = baseComponent?.totalActualDuration ?? 0;
|
|
521
|
+
const currentTotalActualDuration = currentComponent?.totalActualDuration ?? 0;
|
|
522
|
+
const baseAverageActualDuration = baseComponent != null && baseComponent.renderCount > 0
|
|
523
|
+
? baseComponent.totalActualDuration / baseComponent.renderCount
|
|
524
|
+
: 0;
|
|
525
|
+
const currentAverageActualDuration = currentComponent != null && currentComponent.renderCount > 0
|
|
526
|
+
? currentComponent.totalActualDuration / currentComponent.renderCount
|
|
527
|
+
: 0;
|
|
528
|
+
const totalActualDurationDelta = currentTotalActualDuration - baseTotalActualDuration;
|
|
529
|
+
let changeType;
|
|
530
|
+
if (!baseComponent && currentComponent) {
|
|
531
|
+
changeType = 'added';
|
|
532
|
+
}
|
|
533
|
+
else if (baseComponent && !currentComponent) {
|
|
534
|
+
changeType = 'removed';
|
|
535
|
+
}
|
|
536
|
+
else if (totalActualDurationDelta >= 0) {
|
|
537
|
+
changeType = 'regression';
|
|
538
|
+
}
|
|
539
|
+
else {
|
|
540
|
+
changeType = 'improvement';
|
|
541
|
+
}
|
|
542
|
+
return {
|
|
543
|
+
componentName,
|
|
544
|
+
changeType,
|
|
545
|
+
baseTotalActualDuration,
|
|
546
|
+
currentTotalActualDuration,
|
|
547
|
+
totalActualDurationDelta,
|
|
548
|
+
averageActualDurationDelta: currentAverageActualDuration - baseAverageActualDuration,
|
|
549
|
+
maxActualDurationDelta: (currentComponent?.maxActualDuration ?? 0) - (baseComponent?.maxActualDuration ?? 0),
|
|
550
|
+
renderCountDelta: (currentComponent?.renderCount ?? 0) - (baseComponent?.renderCount ?? 0),
|
|
551
|
+
commitCountDelta: (currentComponent?.commitIndices.length ?? 0) - (baseComponent?.commitIndices.length ?? 0),
|
|
552
|
+
percentChange: baseTotalActualDuration > 0
|
|
553
|
+
? (totalActualDurationDelta / baseTotalActualDuration) * 100
|
|
554
|
+
: currentTotalActualDuration > 0
|
|
555
|
+
? 100
|
|
556
|
+
: null,
|
|
557
|
+
};
|
|
558
|
+
}
|
|
559
|
+
export function compareRenders(baseProfile, currentProfile, limit = 10, minDelta = 0) {
|
|
560
|
+
const baseComponents = new Map(baseProfile.components.map(component => [component.componentName, component]));
|
|
561
|
+
const currentComponents = new Map(currentProfile.components.map(component => [component.componentName, component]));
|
|
562
|
+
const allComponentNames = new Set([...baseComponents.keys(), ...currentComponents.keys()]);
|
|
563
|
+
const entries = Array.from(allComponentNames)
|
|
564
|
+
.map(componentName => createDiffEntry(componentName, baseComponents.get(componentName), currentComponents.get(componentName)))
|
|
565
|
+
.filter(entry => {
|
|
566
|
+
if (entry.changeType === 'added' || entry.changeType === 'removed') {
|
|
567
|
+
return true;
|
|
568
|
+
}
|
|
569
|
+
return Math.abs(entry.totalActualDurationDelta) > 0 && Math.abs(entry.totalActualDurationDelta) >= minDelta;
|
|
570
|
+
})
|
|
571
|
+
.sort((left, right) => Math.abs(right.totalActualDurationDelta) - Math.abs(left.totalActualDurationDelta))
|
|
572
|
+
.slice(0, limit);
|
|
573
|
+
return {
|
|
574
|
+
baseProfileId: baseProfile.id,
|
|
575
|
+
currentProfileId: currentProfile.id,
|
|
576
|
+
regressions: entries.filter(entry => entry.changeType === 'regression' && entry.totalActualDurationDelta > 0),
|
|
577
|
+
improvements: entries.filter(entry => entry.changeType === 'improvement' && entry.totalActualDurationDelta < 0),
|
|
578
|
+
added: entries.filter(entry => entry.changeType === 'added'),
|
|
579
|
+
removed: entries.filter(entry => entry.changeType === 'removed'),
|
|
580
|
+
};
|
|
581
|
+
}
|
|
226
582
|
//# sourceMappingURL=analysis.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"analysis.js","sourceRoot":"","sources":["../../src/parser/analysis.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"analysis.js","sourceRoot":"","sources":["../../src/parser/analysis.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"react-profile.d.ts","sourceRoot":"","sources":["../../src/parser/react-profile.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"react-profile.d.ts","sourceRoot":"","sources":["../../src/parser/react-profile.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAGV,mBAAmB,EAGpB,MAAM,YAAY,CAAC;AA0RpB,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,mBAAmB,CAuEzF"}
|
|
@@ -28,6 +28,45 @@ function buildSnapshotMap(snapshots) {
|
|
|
28
28
|
}
|
|
29
29
|
return map;
|
|
30
30
|
}
|
|
31
|
+
function buildFiberNodes(snapshots, rootId) {
|
|
32
|
+
if (!Array.isArray(snapshots)) {
|
|
33
|
+
return [];
|
|
34
|
+
}
|
|
35
|
+
const nodeMap = new Map();
|
|
36
|
+
const parentMap = new Map();
|
|
37
|
+
for (const entry of snapshots) {
|
|
38
|
+
if (!Array.isArray(entry) || entry.length < 2) {
|
|
39
|
+
continue;
|
|
40
|
+
}
|
|
41
|
+
const [fiberId, node] = entry;
|
|
42
|
+
if (typeof fiberId !== 'number' || node === null || typeof node !== 'object') {
|
|
43
|
+
continue;
|
|
44
|
+
}
|
|
45
|
+
nodeMap.set(fiberId, node);
|
|
46
|
+
if (!parentMap.has(fiberId)) {
|
|
47
|
+
parentMap.set(fiberId, null);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
for (const [fiberId, node] of nodeMap) {
|
|
51
|
+
const children = Array.isArray(node.children) ? node.children : [];
|
|
52
|
+
for (const childId of children) {
|
|
53
|
+
if (typeof childId === 'number' && nodeMap.has(childId)) {
|
|
54
|
+
parentMap.set(childId, fiberId);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
return Array.from(nodeMap.entries()).map(([fiberId, node]) => ({
|
|
59
|
+
fiberId,
|
|
60
|
+
rootId,
|
|
61
|
+
componentName: typeof node.displayName === 'string' && node.displayName.trim().length > 0
|
|
62
|
+
? node.displayName
|
|
63
|
+
: `(fiber:${fiberId})`,
|
|
64
|
+
parentFiberId: parentMap.get(fiberId) ?? null,
|
|
65
|
+
childFiberIds: Array.isArray(node.children)
|
|
66
|
+
? node.children.filter((childId) => typeof childId === 'number' && nodeMap.has(childId))
|
|
67
|
+
: [],
|
|
68
|
+
}));
|
|
69
|
+
}
|
|
31
70
|
/**
|
|
32
71
|
* Build a Set of fiberIDs that existed before profiling started.
|
|
33
72
|
* initialTreeBaseDurations is serialised as Array<[fiberID, duration]>.
|
|
@@ -47,7 +86,7 @@ function buildInitialFiberIDSet(initialTreeBaseDurations) {
|
|
|
47
86
|
* Parse a single commit from the React DevTools v5 export.
|
|
48
87
|
* fiberActualDurations and fiberSelfDurations are Array<[fiberID, duration]> tuples.
|
|
49
88
|
*/
|
|
50
|
-
function parseCommit(raw, index, snapshotMap, initialFiberIDs, seenFiberIDs) {
|
|
89
|
+
function parseCommit(raw, index, rootId, snapshotMap, initialFiberIDs, seenFiberIDs) {
|
|
51
90
|
const fiberActualDurations = Array.isArray(raw.fiberActualDurations)
|
|
52
91
|
? raw.fiberActualDurations
|
|
53
92
|
: [];
|
|
@@ -98,6 +137,8 @@ function parseCommit(raw, index, snapshotMap, initialFiberIDs, seenFiberIDs) {
|
|
|
98
137
|
const isMount = !initialFiberIDs.has(fiberID) && !seenFiberIDs.has(fiberID);
|
|
99
138
|
seenFiberIDs.add(fiberID);
|
|
100
139
|
measurements.push({
|
|
140
|
+
fiberId: fiberID,
|
|
141
|
+
rootId,
|
|
101
142
|
componentName,
|
|
102
143
|
phase: isMount ? 'mount' : 'update',
|
|
103
144
|
actualDuration,
|
|
@@ -111,6 +152,7 @@ function parseCommit(raw, index, snapshotMap, initialFiberIDs, seenFiberIDs) {
|
|
|
111
152
|
}
|
|
112
153
|
return {
|
|
113
154
|
index,
|
|
155
|
+
rootId,
|
|
114
156
|
duration: asNumber(raw.duration),
|
|
115
157
|
timestamp: asNumber(raw.timestamp),
|
|
116
158
|
priorityLevel: typeof raw.priorityLevel === 'string' ? raw.priorityLevel : null,
|
|
@@ -179,10 +221,13 @@ export function parseRenderProfile(content, filename) {
|
|
|
179
221
|
'Ensure you exported from the React DevTools Profiler tab, not the browser Performance tab.');
|
|
180
222
|
}
|
|
181
223
|
const allCommits = [];
|
|
224
|
+
const allFiberNodes = [];
|
|
182
225
|
for (const rawRoot of parsed.dataForRoots) {
|
|
183
226
|
const root = rawRoot;
|
|
227
|
+
const rootId = typeof root.rootID === 'number' ? root.rootID : 0;
|
|
184
228
|
// fiberID -> displayName, built from the serialised snapshots map
|
|
185
229
|
const snapshotMap = buildSnapshotMap(root.snapshots);
|
|
230
|
+
allFiberNodes.push(...buildFiberNodes(root.snapshots, rootId));
|
|
186
231
|
// Fibers present before profiling started (used for mount vs update detection)
|
|
187
232
|
const initialFiberIDs = buildInitialFiberIDSet(root.initialTreeBaseDurations);
|
|
188
233
|
const seenFiberIDs = new Set();
|
|
@@ -191,7 +236,7 @@ export function parseRenderProfile(content, filename) {
|
|
|
191
236
|
: [];
|
|
192
237
|
const startIndex = allCommits.length;
|
|
193
238
|
for (let i = 0; i < commitDataArray.length; i++) {
|
|
194
|
-
allCommits.push(parseCommit(commitDataArray[i], startIndex + i, snapshotMap, initialFiberIDs, seenFiberIDs));
|
|
239
|
+
allCommits.push(parseCommit(commitDataArray[i], startIndex + i, rootId, snapshotMap, initialFiberIDs, seenFiberIDs));
|
|
195
240
|
}
|
|
196
241
|
}
|
|
197
242
|
if (allCommits.length === 0) {
|
|
@@ -204,6 +249,7 @@ export function parseRenderProfile(content, filename) {
|
|
|
204
249
|
version: '5',
|
|
205
250
|
rendererId: null,
|
|
206
251
|
commits: allCommits,
|
|
252
|
+
fiberNodes: allFiberNodes,
|
|
207
253
|
components,
|
|
208
254
|
totalCommitDuration: allCommits.reduce((sum, c) => sum + c.duration, 0),
|
|
209
255
|
totalRenderDuration: components.reduce((sum, c) => sum + c.totalActualDuration, 0),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"react-profile.js","sourceRoot":"","sources":["../../src/parser/react-profile.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"react-profile.js","sourceRoot":"","sources":["../../src/parser/react-profile.ts"],"names":[],"mappings":"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"}
|
package/dist/parser/types.d.ts
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
export interface RenderMeasurement {
|
|
2
|
+
fiberId: number;
|
|
3
|
+
rootId: number;
|
|
2
4
|
componentName: string;
|
|
3
5
|
phase: string;
|
|
4
6
|
actualDuration: number;
|
|
@@ -11,12 +13,20 @@ export interface RenderMeasurement {
|
|
|
11
13
|
}
|
|
12
14
|
export interface RenderCommit {
|
|
13
15
|
index: number;
|
|
16
|
+
rootId: number;
|
|
14
17
|
duration: number;
|
|
15
18
|
timestamp: number;
|
|
16
19
|
priorityLevel: string | null;
|
|
17
20
|
measurements: RenderMeasurement[];
|
|
18
21
|
updaterComponentNames: string[];
|
|
19
22
|
}
|
|
23
|
+
export interface FiberNode {
|
|
24
|
+
fiberId: number;
|
|
25
|
+
rootId: number;
|
|
26
|
+
componentName: string;
|
|
27
|
+
parentFiberId: number | null;
|
|
28
|
+
childFiberIds: number[];
|
|
29
|
+
}
|
|
20
30
|
export interface ComponentStats {
|
|
21
31
|
componentName: string;
|
|
22
32
|
renderCount: number;
|
|
@@ -34,6 +44,7 @@ export interface ParsedRenderProfile {
|
|
|
34
44
|
version: string;
|
|
35
45
|
rendererId: number | null;
|
|
36
46
|
commits: RenderCommit[];
|
|
47
|
+
fiberNodes: FiberNode[];
|
|
37
48
|
components: ComponentStats[];
|
|
38
49
|
totalCommitDuration: number;
|
|
39
50
|
totalRenderDuration: number;
|
|
@@ -58,6 +69,7 @@ export interface HotCommitComponentSummary {
|
|
|
58
69
|
}
|
|
59
70
|
export interface HotCommitSummary {
|
|
60
71
|
commitIndex: number;
|
|
72
|
+
rootId: number;
|
|
61
73
|
duration: number;
|
|
62
74
|
totalActualDuration: number;
|
|
63
75
|
timestamp: number;
|
|
@@ -66,6 +78,37 @@ export interface HotCommitSummary {
|
|
|
66
78
|
topComponents: HotCommitComponentSummary[];
|
|
67
79
|
updaterComponentNames: string[];
|
|
68
80
|
}
|
|
81
|
+
export interface CommitBreakdownComponentSummary extends HotCommitComponentSummary {
|
|
82
|
+
mountCount: number;
|
|
83
|
+
updateCount: number;
|
|
84
|
+
nestedUpdateCount: number;
|
|
85
|
+
}
|
|
86
|
+
export interface CommitBreakdown {
|
|
87
|
+
commitIndex: number;
|
|
88
|
+
rootId: number;
|
|
89
|
+
duration: number;
|
|
90
|
+
totalActualDuration: number;
|
|
91
|
+
timestamp: number;
|
|
92
|
+
priorityLevel: string | null;
|
|
93
|
+
measurementCount: number;
|
|
94
|
+
updaterComponentNames: string[];
|
|
95
|
+
topComponents: CommitBreakdownComponentSummary[];
|
|
96
|
+
concentration: {
|
|
97
|
+
topComponentShare: number;
|
|
98
|
+
topThreeShare: number;
|
|
99
|
+
};
|
|
100
|
+
interpretation: string;
|
|
101
|
+
}
|
|
102
|
+
export interface RenderPropagationPath {
|
|
103
|
+
commitIndex: number;
|
|
104
|
+
rootId: number;
|
|
105
|
+
fiberPath: number[];
|
|
106
|
+
componentPath: string[];
|
|
107
|
+
depth: number;
|
|
108
|
+
totalActualDuration: number;
|
|
109
|
+
leafActualDuration: number;
|
|
110
|
+
includesUpdater: boolean;
|
|
111
|
+
}
|
|
69
112
|
export interface RerenderEvidence {
|
|
70
113
|
signal: string;
|
|
71
114
|
observed: number | string;
|
|
@@ -86,4 +129,36 @@ export interface RerenderCause {
|
|
|
86
129
|
evidence: RerenderEvidence[];
|
|
87
130
|
likelyCauses: string[];
|
|
88
131
|
}
|
|
132
|
+
export type RenderIssueType = 'rerender-storm' | 'commit-spike' | 'cascading-render';
|
|
133
|
+
export type RenderIssueSeverity = 'low' | 'medium' | 'high';
|
|
134
|
+
export interface RenderIssue {
|
|
135
|
+
type: RenderIssueType;
|
|
136
|
+
severity: RenderIssueSeverity;
|
|
137
|
+
title: string;
|
|
138
|
+
summary: string;
|
|
139
|
+
componentName?: string;
|
|
140
|
+
commitIndex?: number;
|
|
141
|
+
evidence: RerenderEvidence[];
|
|
142
|
+
}
|
|
143
|
+
export type RenderDiffChangeType = 'regression' | 'improvement' | 'added' | 'removed';
|
|
144
|
+
export interface RenderDiffEntry {
|
|
145
|
+
componentName: string;
|
|
146
|
+
changeType: RenderDiffChangeType;
|
|
147
|
+
baseTotalActualDuration: number;
|
|
148
|
+
currentTotalActualDuration: number;
|
|
149
|
+
totalActualDurationDelta: number;
|
|
150
|
+
averageActualDurationDelta: number;
|
|
151
|
+
maxActualDurationDelta: number;
|
|
152
|
+
renderCountDelta: number;
|
|
153
|
+
commitCountDelta: number;
|
|
154
|
+
percentChange: number | null;
|
|
155
|
+
}
|
|
156
|
+
export interface RenderComparison {
|
|
157
|
+
baseProfileId: string;
|
|
158
|
+
currentProfileId: string;
|
|
159
|
+
regressions: RenderDiffEntry[];
|
|
160
|
+
improvements: RenderDiffEntry[];
|
|
161
|
+
added: RenderDiffEntry[];
|
|
162
|
+
removed: RenderDiffEntry[];
|
|
163
|
+
}
|
|
89
164
|
//# sourceMappingURL=types.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/parser/types.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/parser/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compare-renders.d.ts","sourceRoot":"","sources":["../../src/tools/compare-renders.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AA0BpE,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAoC9D"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { formatMs } from '../format.js';
|
|
3
|
+
import { compareRenders } from '../parser/analysis.js';
|
|
4
|
+
import { getRenderProfile } from '../store.js';
|
|
5
|
+
function formatDiffEntry(entry) {
|
|
6
|
+
return {
|
|
7
|
+
...entry,
|
|
8
|
+
baseTotalActualDuration: formatMs(entry.baseTotalActualDuration),
|
|
9
|
+
currentTotalActualDuration: formatMs(entry.currentTotalActualDuration),
|
|
10
|
+
totalActualDurationDelta: formatMs(entry.totalActualDurationDelta),
|
|
11
|
+
averageActualDurationDelta: formatMs(entry.averageActualDurationDelta),
|
|
12
|
+
maxActualDurationDelta: formatMs(entry.maxActualDurationDelta),
|
|
13
|
+
percentChange: entry.percentChange == null ? null : `${entry.percentChange.toFixed(1)}%`,
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
export function registerCompareRenders(server) {
|
|
17
|
+
server.registerTool('compare_renders', {
|
|
18
|
+
title: 'Compare Renders',
|
|
19
|
+
description: 'Diff two loaded render profiles and rank the biggest regressions, improvements, additions, and removals.',
|
|
20
|
+
inputSchema: {
|
|
21
|
+
baseProfileId: z.string().describe('Baseline profile ID from load_render_profile'),
|
|
22
|
+
currentProfileId: z.string().describe('Current profile ID from load_render_profile'),
|
|
23
|
+
limit: z.number().int().positive().max(25).optional().describe('How many changed components to include. Defaults to 10.'),
|
|
24
|
+
minDeltaMs: z.number().nonnegative().optional().describe('Minimum absolute total render delta in ms for changed components. Defaults to 0.'),
|
|
25
|
+
},
|
|
26
|
+
}, async ({ baseProfileId, currentProfileId, limit, minDeltaMs }) => {
|
|
27
|
+
const baseProfile = getRenderProfile(baseProfileId);
|
|
28
|
+
if (!baseProfile) {
|
|
29
|
+
throw new Error(`Base profile "${baseProfileId}" not found.`);
|
|
30
|
+
}
|
|
31
|
+
const currentProfile = getRenderProfile(currentProfileId);
|
|
32
|
+
if (!currentProfile) {
|
|
33
|
+
throw new Error(`Current profile "${currentProfileId}" not found.`);
|
|
34
|
+
}
|
|
35
|
+
const comparison = compareRenders(baseProfile, currentProfile, limit ?? 10, minDeltaMs ?? 0);
|
|
36
|
+
return {
|
|
37
|
+
content: [{
|
|
38
|
+
type: 'text',
|
|
39
|
+
text: JSON.stringify({
|
|
40
|
+
...comparison,
|
|
41
|
+
regressions: comparison.regressions.map(formatDiffEntry),
|
|
42
|
+
improvements: comparison.improvements.map(formatDiffEntry),
|
|
43
|
+
added: comparison.added.map(formatDiffEntry),
|
|
44
|
+
removed: comparison.removed.map(formatDiffEntry),
|
|
45
|
+
}, null, 2),
|
|
46
|
+
}],
|
|
47
|
+
};
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=compare-renders.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compare-renders.js","sourceRoot":"","sources":["../../src/tools/compare-renders.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACxC,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAE/C,SAAS,eAAe,CAOrB,KAAQ;IACT,OAAO;QACL,GAAG,KAAK;QACR,uBAAuB,EAAE,QAAQ,CAAC,KAAK,CAAC,uBAAuB,CAAC;QAChE,0BAA0B,EAAE,QAAQ,CAAC,KAAK,CAAC,0BAA0B,CAAC;QACtE,wBAAwB,EAAE,QAAQ,CAAC,KAAK,CAAC,wBAAwB,CAAC;QAClE,0BAA0B,EAAE,QAAQ,CAAC,KAAK,CAAC,0BAA0B,CAAC;QACtE,sBAAsB,EAAE,QAAQ,CAAC,KAAK,CAAC,sBAAsB,CAAC;QAC9D,aAAa,EAAE,KAAK,CAAC,aAAa,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG;KACzF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,MAAiB;IACtD,MAAM,CAAC,YAAY,CAAC,iBAAiB,EAAE;QACrC,KAAK,EAAE,iBAAiB;QACxB,WAAW,EAAE,0GAA0G;QACvH,WAAW,EAAE;YACX,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,8CAA8C,CAAC;YAClF,gBAAgB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,6CAA6C,CAAC;YACpF,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,yDAAyD,CAAC;YACzH,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,kFAAkF,CAAC;SAC7I;KACF,EAAE,KAAK,EAAE,EAAE,aAAa,EAAE,gBAAgB,EAAE,KAAK,EAAE,UAAU,EAAE,EAAE,EAAE;QAClE,MAAM,WAAW,GAAG,gBAAgB,CAAC,aAAa,CAAC,CAAC;QACpD,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,iBAAiB,aAAa,cAAc,CAAC,CAAC;QAChE,CAAC;QAED,MAAM,cAAc,GAAG,gBAAgB,CAAC,gBAAgB,CAAC,CAAC;QAC1D,IAAI,CAAC,cAAc,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CAAC,oBAAoB,gBAAgB,cAAc,CAAC,CAAC;QACtE,CAAC;QAED,MAAM,UAAU,GAAG,cAAc,CAAC,WAAW,EAAE,cAAc,EAAE,KAAK,IAAI,EAAE,EAAE,UAAU,IAAI,CAAC,CAAC,CAAC;QAE7F,OAAO;YACL,OAAO,EAAE,CAAC;oBACR,IAAI,EAAE,MAAe;oBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;wBACnB,GAAG,UAAU;wBACb,WAAW,EAAE,UAAU,CAAC,WAAW,CAAC,GAAG,CAAC,eAAe,CAAC;wBACxD,YAAY,EAAE,UAAU,CAAC,YAAY,CAAC,GAAG,CAAC,eAAe,CAAC;wBAC1D,KAAK,EAAE,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,eAAe,CAAC;wBAC5C,OAAO,EAAE,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC;qBACjD,EAAE,IAAI,EAAE,CAAC,CAAC;iBACZ,CAAC;SACH,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-hot-commits.d.ts","sourceRoot":"","sources":["../../src/tools/get-hot-commits.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAOpE,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"get-hot-commits.d.ts","sourceRoot":"","sources":["../../src/tools/get-hot-commits.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAOpE,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAuC7D"}
|
|
@@ -10,13 +10,14 @@ export function registerGetHotCommits(server) {
|
|
|
10
10
|
profileId: z.string().describe('Profile ID from load_render_profile'),
|
|
11
11
|
limit: z.number().int().positive().max(25).optional().describe('How many commits to include. Defaults to 10.'),
|
|
12
12
|
componentLimit: z.number().int().positive().max(10).optional().describe('How many top components to include per commit. Defaults to 3.'),
|
|
13
|
+
priorityLevel: z.string().optional().describe('Filter to commits with this priority level only. Common values: "Immediate" (synchronous, input-blocking), "Normal" (async, e.g. API responses). Omit to include all priorities.'),
|
|
13
14
|
},
|
|
14
|
-
}, async ({ profileId, limit, componentLimit }) => {
|
|
15
|
+
}, async ({ profileId, limit, componentLimit, priorityLevel }) => {
|
|
15
16
|
const profile = getRenderProfile(profileId);
|
|
16
17
|
if (!profile) {
|
|
17
18
|
throw new Error(`Profile "${profileId}" not found. Call get_render_summary without a profileId to list all loaded profiles.`);
|
|
18
19
|
}
|
|
19
|
-
const hotCommits = getHotCommits(profile, limit ?? 10, componentLimit ?? 3).map(commit => ({
|
|
20
|
+
const hotCommits = getHotCommits(profile, limit ?? 10, componentLimit ?? 3, priorityLevel).map(commit => ({
|
|
20
21
|
...commit,
|
|
21
22
|
duration: formatMs(commit.duration),
|
|
22
23
|
totalActualDuration: formatMs(commit.totalActualDuration),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-hot-commits.js","sourceRoot":"","sources":["../../src/tools/get-hot-commits.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAE/C,MAAM,UAAU,qBAAqB,CAAC,MAAiB;IACrD,MAAM,CAAC,YAAY,CAAC,iBAAiB,EAAE;QACrC,KAAK,EAAE,iBAAiB;QACxB,WAAW,EAAE,2GAA2G;QACxH,WAAW,EAAE;YACX,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,qCAAqC,CAAC;YACrE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,8CAA8C,CAAC;YAC9G,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,+DAA+D,CAAC;
|
|
1
|
+
{"version":3,"file":"get-hot-commits.js","sourceRoot":"","sources":["../../src/tools/get-hot-commits.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAE/C,MAAM,UAAU,qBAAqB,CAAC,MAAiB;IACrD,MAAM,CAAC,YAAY,CAAC,iBAAiB,EAAE;QACrC,KAAK,EAAE,iBAAiB;QACxB,WAAW,EAAE,2GAA2G;QACxH,WAAW,EAAE;YACX,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,qCAAqC,CAAC;YACrE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,8CAA8C,CAAC;YAC9G,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,+DAA+D,CAAC;YACxI,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,kLAAkL,CAAC;SAClO;KACF,EAAE,KAAK,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,EAAE,EAAE;QAC/D,MAAM,OAAO,GAAG,gBAAgB,CAAC,SAAS,CAAC,CAAC;QAC5C,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,YAAY,SAAS,uFAAuF,CAAC,CAAC;QAChI,CAAC;QAED,MAAM,UAAU,GAAG,aAAa,CAAC,OAAO,EAAE,KAAK,IAAI,EAAE,EAAE,cAAc,IAAI,CAAC,EAAE,aAAa,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YACxG,GAAG,MAAM;YACT,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC;YACnC,mBAAmB,EAAE,QAAQ,CAAC,MAAM,CAAC,mBAAmB,CAAC;YACzD,aAAa,EAAE,MAAM,CAAC,aAAa,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;gBACpD,GAAG,SAAS;gBACZ,cAAc,EAAE,QAAQ,CAAC,SAAS,CAAC,cAAc,CAAC;gBAClD,YAAY,EAAE,QAAQ,CAAC,SAAS,CAAC,YAAY,CAAC;gBAC9C,iBAAiB,EAAE,SAAS,CAAC,SAAS,CAAC,iBAAiB,CAAC;aAC1D,CAAC,CAAC;SACJ,CAAC,CAAC,CAAC;QAEJ,OAAO;YACL,OAAO,EAAE,CAAC;oBACR,IAAI,EAAE,MAAe;oBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;wBACnB,SAAS;wBACT,aAAa,EAAE,uFAAuF;wBACtG,UAAU;qBACX,EAAE,IAAI,EAAE,CAAC,CAAC;iBACZ,CAAC;SACH,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -5,7 +5,7 @@ import { getRenderProfile, listRenderProfiles } from '../store.js';
|
|
|
5
5
|
export function registerGetRenderSummary(server) {
|
|
6
6
|
server.registerTool('get_render_summary', {
|
|
7
7
|
title: 'Get Render Summary',
|
|
8
|
-
description: 'Summarize the loaded Next.js render profile, including top components by render cost.',
|
|
8
|
+
description: 'Summarize the loaded Next.js render profile, including top components by render cost and detected render issues (rerender storms, commit spikes).',
|
|
9
9
|
inputSchema: {
|
|
10
10
|
profileId: z.string().optional().describe('Profile ID from load_render_profile. Omit to list loaded profiles.'),
|
|
11
11
|
limit: z.number().int().positive().max(25).optional().describe('How many top components to include. Defaults to 10.'),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-render-summary.js","sourceRoot":"","sources":["../../src/tools/get-render-summary.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EAAE,gBAAgB,IAAI,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AACnF,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAEnE,MAAM,UAAU,wBAAwB,CAAC,MAAiB;IACxD,MAAM,CAAC,YAAY,CAAC,oBAAoB,EAAE;QACxC,KAAK,EAAE,oBAAoB;QAC3B,WAAW,EAAE,
|
|
1
|
+
{"version":3,"file":"get-render-summary.js","sourceRoot":"","sources":["../../src/tools/get-render-summary.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@perfonext/render-mcp",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "MCP server for analyzing Next.js React Profiler exports and
|
|
3
|
+
"version": "0.2.0",
|
|
4
|
+
"description": "MCP server for analyzing Next.js React Profiler exports: render summaries, rerender causes, hot commits, and profile diffing",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
7
7
|
"bin": {
|