agent-react-devtools 0.4.0-canary-20260402222730 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +19 -1
- package/README.md +33 -4
- package/dist/cli.js +85 -11
- package/dist/cli.js.map +1 -1
- package/dist/daemon.js +78 -23
- package/dist/daemon.js.map +1 -1
- package/dist/{init-7IJ2VXT7.js → init-TDSG2Z3U.js} +130 -3
- package/dist/init-TDSG2Z3U.js.map +1 -0
- package/package.json +2 -2
- package/dist/init-7IJ2VXT7.js.map +0 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# agent-react-devtools
|
|
2
2
|
|
|
3
|
-
## 0.4.0
|
|
3
|
+
## 0.4.0
|
|
4
4
|
|
|
5
5
|
### Minor Changes
|
|
6
6
|
|
|
@@ -35,6 +35,24 @@
|
|
|
35
35
|
- **`--sort duration`**: Sort commits by render duration (slowest first) instead of chronological order.
|
|
36
36
|
- **Paginated header**: Output shows `Commit timeline (showing 1–20 of 87):` when paginated, or `Commit timeline (87 commits):` when all results fit on one page.
|
|
37
37
|
|
|
38
|
+
- a1bed65: Smart tree truncation and subtree extraction for large component trees
|
|
39
|
+
|
|
40
|
+
Large React apps (500-2000+ components) now produce much smaller `get tree` output:
|
|
41
|
+
|
|
42
|
+
- **Host filtering by default**: `<div>`, `<span>`, and other host components are hidden (use `--all` to show them). Host components with keys or custom element names are always shown.
|
|
43
|
+
- **Sibling collapsing**: When a parent has many children with the same display name (e.g. list items), only the first 3 are shown with a `... +N more ComponentName` summary.
|
|
44
|
+
- **Summary footer**: Output ends with `N components shown (M total)` so the agent knows how much was filtered.
|
|
45
|
+
- **`--max-lines N` flag**: Hard cap on output lines to stay within context budgets.
|
|
46
|
+
- **Subtree extraction**: `get tree @c5` shows only the subtree rooted at a specific component. Labels are re-assigned starting from `@c1` within the subtree. Combine with `--depth N` to limit depth within the subtree.
|
|
47
|
+
|
|
48
|
+
- c7127db: Add `uninit` command to reverse framework configuration
|
|
49
|
+
|
|
50
|
+
`agent-react-devtools uninit` removes the changes made by `init` — restoring your config files to their original state.
|
|
51
|
+
|
|
52
|
+
- Supports all frameworks: Vite, Next.js (Pages Router and App Router), CRA
|
|
53
|
+
- `--dry-run` flag previews what would be removed without writing any files
|
|
54
|
+
- Safe to run on projects not configured by `init` (no-op)
|
|
55
|
+
|
|
38
56
|
### Patch Changes
|
|
39
57
|
|
|
40
58
|
- 68bd0fc: Auto-restart daemon when CLI detects the binary has been rebuilt since the daemon started. Previously, rebuilding the package required manually stopping and restarting the daemon for changes to take effect.
|
package/README.md
CHANGED
|
@@ -52,8 +52,25 @@ agent-react-devtools get tree --depth 3
|
|
|
52
52
|
├─ @c5 [fn] TodoList
|
|
53
53
|
│ ├─ @c6 [fn] TodoItem key=1
|
|
54
54
|
│ ├─ @c7 [fn] TodoItem key=2
|
|
55
|
-
│
|
|
55
|
+
│ ├─ @c8 [fn] TodoItem key=3
|
|
56
|
+
│ └─ ... +47 more TodoItem
|
|
56
57
|
└─ @c9 [fn] Footer
|
|
58
|
+
53 components shown (1,843 total)
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
Host components (`<div>`, `<span>`, etc.) are filtered by default to keep output compact. Use `--all` to include them. Host components with keys or custom element names (e.g. `<my-widget>`) are always shown.
|
|
62
|
+
|
|
63
|
+
View a subtree rooted at a specific component:
|
|
64
|
+
|
|
65
|
+
```sh
|
|
66
|
+
agent-react-devtools get tree @c5 --depth 2
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
```
|
|
70
|
+
@c1 [fn] TodoList
|
|
71
|
+
├─ @c2 [fn] TodoItem key=1
|
|
72
|
+
├─ @c3 [fn] TodoItem key=2
|
|
73
|
+
└─ @c4 [fn] TodoItem key=3
|
|
57
74
|
```
|
|
58
75
|
|
|
59
76
|
Inspect a component's props, state, and hooks:
|
|
@@ -115,13 +132,18 @@ agent-react-devtools status # Connection status
|
|
|
115
132
|
### Components
|
|
116
133
|
|
|
117
134
|
```sh
|
|
118
|
-
agent-react-devtools get tree [--depth N]
|
|
135
|
+
agent-react-devtools get tree [@c1 | id] [--depth N] [--all] [--max-lines N] # Component hierarchy (subtree)
|
|
119
136
|
agent-react-devtools get component <@c1 | id> # Props, state, hooks
|
|
120
137
|
agent-react-devtools find <name> [--exact] # Search by display name
|
|
121
138
|
agent-react-devtools count # Component count by type
|
|
122
139
|
agent-react-devtools errors # Components with errors/warnings
|
|
123
140
|
```
|
|
124
141
|
|
|
142
|
+
Tree output flags:
|
|
143
|
+
- `--depth N` — limit tree depth
|
|
144
|
+
- `--all` — include host components (filtered by default)
|
|
145
|
+
- `--max-lines N` — hard cap on output lines
|
|
146
|
+
|
|
125
147
|
Components are labeled `@c1`, `@c2`, etc. You can use these labels or numeric IDs interchangeably.
|
|
126
148
|
|
|
127
149
|
Components with errors or warnings are annotated in tree and search output:
|
|
@@ -178,6 +200,12 @@ npx agent-react-devtools init
|
|
|
178
200
|
|
|
179
201
|
This detects your framework (Vite, Next.js, CRA) and patches the appropriate config file.
|
|
180
202
|
|
|
203
|
+
To undo these changes:
|
|
204
|
+
|
|
205
|
+
```sh
|
|
206
|
+
npx agent-react-devtools uninit
|
|
207
|
+
```
|
|
208
|
+
|
|
181
209
|
### One-line import
|
|
182
210
|
|
|
183
211
|
Add a single import as the first line of your entry point (e.g. `src/main.tsx`):
|
|
@@ -244,7 +272,7 @@ agent-react-devtools status # Should show "Apps: 1 connected"
|
|
|
244
272
|
Add the skill to your AI coding assistant for richer context:
|
|
245
273
|
|
|
246
274
|
```sh
|
|
247
|
-
npx skills add
|
|
275
|
+
npx skills add callstackincubator/agent-react-devtools
|
|
248
276
|
```
|
|
249
277
|
|
|
250
278
|
This works with Claude Code, Codex, Cursor, Gemini CLI, GitHub Copilot, Goose, OpenCode, and Windsurf.
|
|
@@ -254,7 +282,7 @@ This works with Claude Code, Codex, Cursor, Gemini CLI, GitHub Copilot, Goose, O
|
|
|
254
282
|
You can also install via the Claude Code plugin marketplace:
|
|
255
283
|
|
|
256
284
|
```
|
|
257
|
-
/plugin marketplace add
|
|
285
|
+
/plugin marketplace add callstackincubator/agent-react-devtools
|
|
258
286
|
/plugin install agent-react-devtools@piotrski
|
|
259
287
|
```
|
|
260
288
|
|
|
@@ -276,6 +304,7 @@ This project uses agent-react-devtools to inspect the running React app.
|
|
|
276
304
|
- `agent-react-devtools start` — start the daemon
|
|
277
305
|
- `agent-react-devtools status` — check if the app is connected
|
|
278
306
|
- `agent-react-devtools get tree` — see the component hierarchy
|
|
307
|
+
- `agent-react-devtools get tree @c5` — see subtree from a specific component
|
|
279
308
|
- `agent-react-devtools get component @c1` — inspect a specific component
|
|
280
309
|
- `agent-react-devtools find <Name>` — search for components
|
|
281
310
|
- `agent-react-devtools errors` — list components with errors or warnings
|
package/dist/cli.js
CHANGED
|
@@ -164,12 +164,17 @@ var PIPE = "\u2502 ";
|
|
|
164
164
|
var TEE = "\u251C\u2500 ";
|
|
165
165
|
var ELBOW = "\u2514\u2500 ";
|
|
166
166
|
var SPACE = " ";
|
|
167
|
-
|
|
167
|
+
var COLLAPSE_THRESHOLD = 3;
|
|
168
|
+
function formatTree(nodes, hintOrOpts) {
|
|
169
|
+
const opts = typeof hintOrOpts === "string" ? { hint: hintOrOpts } : hintOrOpts || {};
|
|
170
|
+
const { hint, totalCount, maxLines } = opts;
|
|
168
171
|
if (nodes.length === 0) {
|
|
169
172
|
return hint ? `No components (${hint})` : "No components (is a React app connected?)";
|
|
170
173
|
}
|
|
171
174
|
const childrenMap = /* @__PURE__ */ new Map();
|
|
175
|
+
const nodeMap = /* @__PURE__ */ new Map();
|
|
172
176
|
for (const node of nodes) {
|
|
177
|
+
nodeMap.set(node.id, node);
|
|
173
178
|
const parentId = node.parentId;
|
|
174
179
|
let siblings = childrenMap.get(parentId);
|
|
175
180
|
if (!siblings) {
|
|
@@ -179,21 +184,72 @@ function formatTree(nodes, hint) {
|
|
|
179
184
|
siblings.push(node);
|
|
180
185
|
}
|
|
181
186
|
const lines = [];
|
|
187
|
+
let truncated = false;
|
|
188
|
+
const lineLimit = maxLines !== void 0 ? maxLines - (totalCount !== void 0 ? 1 : 0) : Infinity;
|
|
189
|
+
function addLine(line) {
|
|
190
|
+
if (lines.length >= lineLimit) {
|
|
191
|
+
truncated = true;
|
|
192
|
+
return false;
|
|
193
|
+
}
|
|
194
|
+
lines.push(line);
|
|
195
|
+
return true;
|
|
196
|
+
}
|
|
182
197
|
function walk(nodeId, prefix, isLast, isRoot) {
|
|
183
|
-
const node =
|
|
184
|
-
if (!node) return;
|
|
198
|
+
const node = nodeMap.get(nodeId);
|
|
199
|
+
if (!node) return true;
|
|
185
200
|
const connector = isRoot ? "" : isLast ? ELBOW : TEE;
|
|
186
201
|
const line = formatRef({ label: node.label, type: node.type, name: node.displayName, key: node.key, errors: node.errors, warnings: node.warnings });
|
|
187
|
-
|
|
202
|
+
if (!addLine(`${prefix}${connector}${line}`)) return false;
|
|
188
203
|
const children = childrenMap.get(node.id) || [];
|
|
189
204
|
const childPrefix = isRoot ? "" : prefix + (isLast ? SPACE : PIPE);
|
|
190
|
-
|
|
191
|
-
|
|
205
|
+
let i = 0;
|
|
206
|
+
while (i < children.length) {
|
|
207
|
+
let runEnd = i + 1;
|
|
208
|
+
while (runEnd < children.length && children[runEnd].displayName === children[i].displayName) {
|
|
209
|
+
runEnd++;
|
|
210
|
+
}
|
|
211
|
+
const runLen = runEnd - i;
|
|
212
|
+
if (runLen > COLLAPSE_THRESHOLD) {
|
|
213
|
+
for (let j = 0; j < COLLAPSE_THRESHOLD; j++) {
|
|
214
|
+
if (!walk(children[i + j].id, childPrefix, false, false)) return false;
|
|
215
|
+
}
|
|
216
|
+
const remaining = runLen - COLLAPSE_THRESHOLD;
|
|
217
|
+
const isLastGroup = runEnd === children.length;
|
|
218
|
+
const summaryConnector = isLastGroup ? ELBOW : TEE;
|
|
219
|
+
if (!addLine(`${childPrefix}${summaryConnector}... +${remaining} more ${children[i].displayName}`)) return false;
|
|
220
|
+
i = runEnd;
|
|
221
|
+
} else {
|
|
222
|
+
for (let j = i; j < runEnd; j++) {
|
|
223
|
+
const isLastChild = j === children.length - 1;
|
|
224
|
+
if (!walk(children[j].id, childPrefix, isLastChild, false)) return false;
|
|
225
|
+
}
|
|
226
|
+
i = runEnd;
|
|
227
|
+
}
|
|
192
228
|
}
|
|
229
|
+
return true;
|
|
193
230
|
}
|
|
194
231
|
const roots = childrenMap.get(null) || [];
|
|
195
232
|
for (let i = 0; i < roots.length; i++) {
|
|
196
|
-
walk(roots[i].id, "", i === roots.length - 1, true);
|
|
233
|
+
if (!walk(roots[i].id, "", i === roots.length - 1, true)) break;
|
|
234
|
+
}
|
|
235
|
+
if (truncated) {
|
|
236
|
+
if (totalCount !== void 0) {
|
|
237
|
+
lines.push(`... output truncated at ${maxLines} lines (${totalCount.toLocaleString()} total components)`);
|
|
238
|
+
} else {
|
|
239
|
+
if (lines.length > 0) {
|
|
240
|
+
lines[lines.length - 1] = `... output truncated at ${maxLines} lines`;
|
|
241
|
+
} else {
|
|
242
|
+
lines.push(`... output truncated at ${maxLines} lines`);
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
} else if (totalCount !== void 0) {
|
|
246
|
+
const shown = nodes.length;
|
|
247
|
+
const totalFormatted = totalCount.toLocaleString();
|
|
248
|
+
if (shown < totalCount) {
|
|
249
|
+
lines.push(`${shown} components shown (${totalFormatted} total)`);
|
|
250
|
+
} else {
|
|
251
|
+
lines.push(`${totalFormatted} components`);
|
|
252
|
+
}
|
|
197
253
|
}
|
|
198
254
|
return lines.join("\n");
|
|
199
255
|
}
|
|
@@ -472,6 +528,7 @@ function usage() {
|
|
|
472
528
|
|
|
473
529
|
Setup:
|
|
474
530
|
init [--dry-run] Auto-configure your React app
|
|
531
|
+
uninit [--dry-run] Remove configuration added by init
|
|
475
532
|
|
|
476
533
|
Daemon:
|
|
477
534
|
start [--port 8097] Start daemon
|
|
@@ -479,7 +536,7 @@ Daemon:
|
|
|
479
536
|
status Show daemon status
|
|
480
537
|
|
|
481
538
|
Components:
|
|
482
|
-
get tree [--depth N]
|
|
539
|
+
get tree [@c1 | id] [--depth N] [--all] [--max-lines N] Component hierarchy
|
|
483
540
|
get component <@c1 | id> Props, state, hooks
|
|
484
541
|
find <name> [--exact] Search by display name
|
|
485
542
|
count Component count by type
|
|
@@ -548,10 +605,15 @@ async function main() {
|
|
|
548
605
|
const cmd1 = command[1];
|
|
549
606
|
try {
|
|
550
607
|
if (cmd0 === "init") {
|
|
551
|
-
const { runInit } = await import("./init-
|
|
608
|
+
const { runInit } = await import("./init-TDSG2Z3U.js");
|
|
552
609
|
await runInit(process.cwd(), flags["dry-run"] === true);
|
|
553
610
|
return;
|
|
554
611
|
}
|
|
612
|
+
if (cmd0 === "uninit") {
|
|
613
|
+
const { runUninit } = await import("./init-TDSG2Z3U.js");
|
|
614
|
+
await runUninit(process.cwd(), flags["dry-run"] === true);
|
|
615
|
+
return;
|
|
616
|
+
}
|
|
555
617
|
if (cmd0 === "profile" && cmd1 === "diff") {
|
|
556
618
|
const fileA = command[2];
|
|
557
619
|
const fileB = command[3];
|
|
@@ -617,10 +679,22 @@ async function main() {
|
|
|
617
679
|
await ensureDaemon();
|
|
618
680
|
if (cmd0 === "get" && cmd1 === "tree") {
|
|
619
681
|
const depth = parseNumericFlag(flags, "depth");
|
|
620
|
-
const
|
|
682
|
+
const maxLines = parseNumericFlag(flags, "max-lines");
|
|
683
|
+
const noHost = flags["all"] !== true;
|
|
684
|
+
const rawRoot = command[2];
|
|
685
|
+
let root;
|
|
686
|
+
if (rawRoot) {
|
|
687
|
+
root = rawRoot.startsWith("@") ? rawRoot : parseInt(rawRoot, 10);
|
|
688
|
+
if (typeof root === "number" && isNaN(root)) {
|
|
689
|
+
console.error("Usage: devtools get tree [@c1 | id] [--depth N] [--all] [--max-lines N]");
|
|
690
|
+
process.exit(1);
|
|
691
|
+
}
|
|
692
|
+
}
|
|
693
|
+
const ipcCmd = { type: "get-tree", depth, noHost, maxLines, root };
|
|
621
694
|
const resp = await sendCommand(ipcCmd);
|
|
622
695
|
if (resp.ok) {
|
|
623
|
-
|
|
696
|
+
const { nodes, totalCount } = resp.data;
|
|
697
|
+
console.log(formatTree(nodes, { hint: resp.hint, totalCount, maxLines }));
|
|
624
698
|
} else {
|
|
625
699
|
console.error(resp.error);
|
|
626
700
|
process.exit(1);
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/daemon-client.ts","../src/formatters.ts","../src/cli.ts"],"sourcesContent":["import net from 'node:net';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { spawn } from 'node:child_process';\nimport type { IpcCommand, IpcResponse, DaemonInfo } from './types.js';\n\nconst DEFAULT_STATE_DIR = path.join(\n process.env.HOME || process.env.USERPROFILE || '/tmp',\n '.agent-react-devtools',\n);\n\nlet stateDir = DEFAULT_STATE_DIR;\n\nexport function setStateDir(dir: string): void {\n stateDir = dir;\n}\n\nfunction getDaemonInfoPath(): string {\n return path.join(stateDir, 'daemon.json');\n}\n\nfunction getSocketPath(): string {\n return path.join(stateDir, 'daemon.sock');\n}\n\nexport function readDaemonInfo(): DaemonInfo | null {\n try {\n const raw = fs.readFileSync(getDaemonInfoPath(), 'utf-8');\n return JSON.parse(raw) as DaemonInfo;\n } catch {\n return null;\n }\n}\n\nfunction isDaemonAlive(info: DaemonInfo): boolean {\n try {\n // Signal 0 doesn't kill, just checks if process exists\n process.kill(info.pid, 0);\n return true;\n } catch {\n return false;\n }\n}\n\nexport async function ensureDaemon(port?: number): Promise<void> {\n const info = readDaemonInfo();\n if (info && isDaemonAlive(info)) {\n const daemonScript = path.join(\n path.dirname(new URL(import.meta.url).pathname),\n 'daemon.js',\n );\n try {\n const stat = fs.statSync(daemonScript);\n const stale = info.buildMtime !== undefined\n ? stat.mtimeMs !== info.buildMtime\n : stat.mtimeMs > info.startedAt;\n if (stale) {\n port = port ?? info.port;\n stopDaemon();\n } else {\n return;\n }\n } catch {\n return;\n }\n }\n\n // Clean up stale files\n try {\n fs.unlinkSync(getDaemonInfoPath());\n } catch {\n // ignore\n }\n try {\n fs.unlinkSync(getSocketPath());\n } catch {\n // ignore\n }\n\n // Start daemon as detached child process\n const daemonScript = path.join(\n path.dirname(new URL(import.meta.url).pathname),\n 'daemon.js',\n );\n\n const args = [];\n if (port) args.push(`--port=${port}`);\n if (stateDir !== DEFAULT_STATE_DIR) args.push(`--state-dir=${stateDir}`);\n\n const child = spawn(process.execPath, [daemonScript, ...args], {\n detached: true,\n stdio: 'ignore',\n });\n child.unref();\n\n // Wait for daemon to be ready (up to 5 seconds)\n const deadline = Date.now() + 5000;\n while (Date.now() < deadline) {\n await new Promise((r) => setTimeout(r, 100));\n try {\n await sendCommand({ type: 'ping' });\n return;\n } catch {\n // not ready yet\n }\n }\n throw new Error('Daemon failed to start within 5 seconds');\n}\n\nexport function stopDaemon(): boolean {\n const info = readDaemonInfo();\n if (!info) return false;\n\n try {\n process.kill(info.pid, 'SIGTERM');\n // Clean up files\n try {\n fs.unlinkSync(getDaemonInfoPath());\n } catch {\n // ignore\n }\n return true;\n } catch {\n return false;\n }\n}\n\nexport function sendCommand(cmd: IpcCommand, socketTimeout = 30_000): Promise<IpcResponse> {\n return new Promise((resolve, reject) => {\n const socketPath = getSocketPath();\n\n const conn = net.createConnection(socketPath, () => {\n conn.write(JSON.stringify(cmd) + '\\n');\n });\n\n let buffer = '';\n conn.on('data', (chunk) => {\n buffer += chunk.toString();\n const newlineIdx = buffer.indexOf('\\n');\n if (newlineIdx !== -1) {\n const line = buffer.slice(0, newlineIdx);\n conn.end();\n try {\n resolve(JSON.parse(line) as IpcResponse);\n } catch {\n reject(new Error('Invalid response from daemon'));\n }\n }\n });\n\n conn.on('error', (err) => {\n reject(new Error(`Cannot connect to daemon: ${err.message}`));\n });\n\n conn.setTimeout(socketTimeout, () => {\n conn.destroy();\n reject(new Error('Command timed out'));\n });\n });\n}\n","import type {\n StatusInfo,\n InspectedElement,\n ComponentRenderReport,\n ChangedKeys,\n} from './types.js';\nimport type { TreeNode } from './component-tree.js';\nimport type { ProfileSummary, TimelineResult, CommitDetail } from './profiler.js';\nimport type { ProfileDiffResult, DiffEntry } from './profile-diff.js';\n\n// ── Abbreviations for component types ──\nconst TYPE_ABBREV: Record<string, string> = {\n function: 'fn',\n class: 'cls',\n host: 'host',\n memo: 'memo',\n forwardRef: 'fRef',\n profiler: 'prof',\n suspense: 'susp',\n context: 'ctx',\n other: '?',\n};\n\nfunction typeTag(type: string): string {\n return TYPE_ABBREV[type] || type;\n}\n\n/**\n * Format a consistent component reference: `@c1 [fn] Name` or `@c1 [fn] Name key=x`\n * When errors/warnings are non-zero, appends annotations like `⚠2 ✗1`.\n */\nfunction formatRef(opts: { label?: string; type?: string; name: string; key?: string | null; errors?: number; warnings?: number }): string {\n const ref = opts.label || '?';\n const tag = typeTag(opts.type || 'other');\n let s = `${ref} [${tag}] ${opts.name}`;\n if (opts.key) s += ` key=${opts.key}`;\n const annotations = formatErrorAnnotations(opts.errors, opts.warnings);\n if (annotations) s += ` ${annotations}`;\n return s;\n}\n\n/**\n * Format error/warning count annotations (e.g., `⚠2 ✗1`).\n * Returns empty string if both counts are zero or undefined.\n */\nfunction formatErrorAnnotations(errors?: number, warnings?: number): string {\n const parts: string[] = [];\n if (warnings && warnings > 0) parts.push(`⚠${warnings}`);\n if (errors && errors > 0) parts.push(`✗${errors}`);\n return parts.join(' ');\n}\n\n// ── Tree connector characters ──\nconst PIPE = '│ ';\nconst TEE = '├─ ';\nconst ELBOW = '└─ ';\nconst SPACE = ' ';\n\nexport function formatTree(nodes: TreeNode[], hint?: string): string {\n if (nodes.length === 0) {\n return hint ? `No components (${hint})` : 'No components (is a React app connected?)';\n }\n\n // Build tree structure from the flat list\n const childrenMap = new Map<number | null, TreeNode[]>();\n for (const node of nodes) {\n const parentId = node.parentId;\n let siblings = childrenMap.get(parentId);\n if (!siblings) {\n siblings = [];\n childrenMap.set(parentId, siblings);\n }\n siblings.push(node);\n }\n\n const lines: string[] = [];\n\n function walk(nodeId: number, prefix: string, isLast: boolean, isRoot: boolean): void {\n const node = nodes.find((n) => n.id === nodeId);\n if (!node) return;\n\n const connector = isRoot ? '' : isLast ? ELBOW : TEE;\n const line = formatRef({ label: node.label, type: node.type, name: node.displayName, key: node.key, errors: node.errors, warnings: node.warnings });\n\n lines.push(`${prefix}${connector}${line}`);\n\n const children = childrenMap.get(node.id) || [];\n const childPrefix = isRoot ? '' : prefix + (isLast ? SPACE : PIPE);\n\n for (let i = 0; i < children.length; i++) {\n walk(children[i].id, childPrefix, i === children.length - 1, false);\n }\n }\n\n // Find root nodes\n const roots = childrenMap.get(null) || [];\n for (let i = 0; i < roots.length; i++) {\n walk(roots[i].id, '', i === roots.length - 1, true);\n }\n\n return lines.join('\\n');\n}\n\nexport function formatErrors(nodes: TreeNode[]): string {\n if (nodes.length === 0) return 'No components with errors or warnings';\n\n const lines: string[] = [];\n for (const n of nodes) {\n const ref = formatRef({ label: n.label, type: n.type, name: n.displayName, key: n.key, errors: n.errors, warnings: n.warnings });\n lines.push(ref);\n }\n return lines.join('\\n');\n}\n\nexport function formatComponent(element: InspectedElement & { errors?: number; warnings?: number }, label?: string): string {\n const lines: string[] = [];\n\n lines.push(formatRef({ label: label || `#${element.id}`, type: element.type, name: element.displayName, key: element.key, errors: element.errors, warnings: element.warnings }));\n\n // Props\n if (element.props && Object.keys(element.props).length > 0) {\n lines.push('props:');\n for (const [key, value] of Object.entries(element.props)) {\n lines.push(` ${key}: ${formatCompactValue(value) ?? 'undefined'}`);\n }\n }\n\n // State\n if (element.state && Object.keys(element.state).length > 0) {\n lines.push('state:');\n for (const [key, value] of Object.entries(element.state)) {\n lines.push(` ${key}: ${formatCompactValue(value) ?? 'undefined'}`);\n }\n }\n\n // Hooks\n if (element.hooks && element.hooks.length > 0) {\n lines.push('hooks:');\n for (const h of element.hooks) {\n const val = formatCompactValue(h.value);\n lines.push(val !== undefined ? ` ${h.name}: ${val}` : ` ${h.name}`);\n if (h.subHooks && h.subHooks.length > 0) {\n for (const sh of h.subHooks) {\n const sval = formatCompactValue(sh.value);\n lines.push(sval !== undefined ? ` ${sh.name}: ${sval}` : ` ${sh.name}`);\n }\n }\n }\n }\n\n return lines.join('\\n');\n}\n\nexport function formatSearchResults(results: TreeNode[]): string {\n if (results.length === 0) return 'No components found';\n\n return results\n .map((n) => {\n // Use numeric id as label when @c label isn't resolved (e.g., tree not traversed)\n const effectiveLabel = n.label === '@c?' ? `@c?(id:${n.id})` : n.label;\n return formatRef({ label: effectiveLabel, type: n.type, name: n.displayName, key: n.key, errors: n.errors, warnings: n.warnings });\n })\n .join('\\n');\n}\n\nexport function formatCount(counts: Record<string, number>): string {\n const total = Object.values(counts).reduce((a, b) => a + b, 0);\n const parts = Object.entries(counts)\n .sort((a, b) => b[1] - a[1])\n .map(([type, count]) => `${typeTag(type)}:${count}`)\n .join(' ');\n return `${total} components (${parts})`;\n}\n\nexport function formatStatus(status: StatusInfo): string {\n const lines: string[] = [];\n lines.push(`Daemon: running (port ${status.port})`);\n lines.push(\n `Apps: ${status.connectedApps} connected, ${status.componentCount} components`,\n );\n if (status.profilingActive) {\n lines.push('Profiling: active');\n }\n const upSec = Math.round(status.uptime / 1000);\n lines.push(`Uptime: ${upSec}s`);\n if (status.connection?.recentEvents?.length > 0) {\n const last = status.connection.recentEvents[status.connection.recentEvents.length - 1];\n const ago = formatAgo(Date.now() - last.timestamp);\n lines.push(`Last event: app ${last.type} ${ago}`);\n }\n return lines.join('\\n');\n}\n\nexport function formatAgo(ms: number): string {\n const sec = Math.round(ms / 1000);\n if (sec < 60) return `${sec}s ago`;\n const min = Math.round(sec / 60);\n if (min < 60) return `${min}m ago`;\n const hr = Math.round(min / 60);\n return `${hr}h ago`;\n}\n\nexport function formatProfileSummary(summary: ProfileSummary): string {\n const lines: string[] = [];\n const durSec = (summary.duration / 1000).toFixed(1);\n lines.push(\n `Profile \"${summary.name}\" (${durSec}s, ${summary.commitCount} commits)`,\n );\n\n if (summary.componentRenderCounts.length > 0) {\n lines.push('');\n lines.push('Top renders:');\n for (const c of summary.componentRenderCounts.slice(0, 10)) {\n const ref = formatRef({ label: c.label, type: c.type, name: c.displayName || `#${c.id}` });\n lines.push(` ${ref} ${c.count} renders`);\n }\n }\n\n return lines.join('\\n');\n}\n\nexport function formatProfileReport(report: ComponentRenderReport, label?: string): string {\n const lines: string[] = [];\n lines.push(formatRef({ label: label || report.label || `#${report.id}`, type: report.type, name: report.displayName }));\n lines.push(\n `renders:${report.renderCount} avg:${report.avgDuration.toFixed(1)}ms max:${report.maxDuration.toFixed(1)}ms total:${report.totalDuration.toFixed(1)}ms`,\n );\n if (report.causes.length > 0) {\n lines.push(`causes: ${report.causes.join(', ')}`);\n }\n const keys = formatChangedKeys(report.changedKeys);\n if (keys) {\n lines.push(`changed: ${keys}`);\n }\n return lines.join('\\n');\n}\n\nexport function formatSlowest(reports: ComponentRenderReport[]): string {\n if (reports.length === 0) return 'No profiling data';\n\n const lines: string[] = ['Slowest (by avg render time):'];\n for (const r of reports) {\n const ref = formatRef({ label: r.label, type: r.type, name: r.displayName });\n const causes = r.causes.length > 0 ? r.causes.join(', ') : '?';\n let line = ` ${ref} avg:${r.avgDuration.toFixed(1)}ms max:${r.maxDuration.toFixed(1)}ms renders:${r.renderCount} causes:${causes}`;\n const keys = formatChangedKeys(r.changedKeys);\n if (keys) line += ` changed: ${keys}`;\n lines.push(line);\n }\n return lines.join('\\n');\n}\n\nexport function formatRerenders(reports: ComponentRenderReport[]): string {\n if (reports.length === 0) return 'No profiling data';\n\n const lines: string[] = ['Most re-renders:'];\n for (const r of reports) {\n const ref = formatRef({ label: r.label, type: r.type, name: r.displayName });\n const causes = r.causes.length > 0 ? r.causes.join(', ') : '?';\n let line = ` ${ref} ${r.renderCount} renders causes:${causes}`;\n const keys = formatChangedKeys(r.changedKeys);\n if (keys) line += ` changed: ${keys}`;\n lines.push(line);\n }\n return lines.join('\\n');\n}\n\nexport function formatTimeline(result: TimelineResult): string {\n if (result.total === 0) return 'No profiling data';\n\n const { entries, total, offset } = result;\n\n if (entries.length === 0) {\n return `Commit timeline (showing 0 of ${total}): offset past end`;\n }\n\n let header: string;\n if (entries.length === total) {\n header = `Commit timeline (${total} commits):`;\n } else {\n const from = offset + 1;\n const to = offset + entries.length;\n header = `Commit timeline (showing ${from}–${to} of ${total}):`;\n }\n\n const lines: string[] = [header];\n for (const e of entries) {\n lines.push(\n ` #${e.index} ${e.duration.toFixed(1)}ms ${e.componentCount} components`,\n );\n }\n return lines.join('\\n');\n}\n\nexport function formatCommitDetail(detail: CommitDetail): string {\n const lines: string[] = [];\n lines.push(`Commit #${detail.index} ${detail.duration.toFixed(1)}ms ${detail.totalComponents} components`);\n lines.push('');\n for (const c of detail.components) {\n const ref = formatRef({ label: c.label, type: c.type, name: c.displayName });\n const causes = c.causes.length > 0 ? c.causes.join(', ') : '?';\n let line = ` ${ref} self:${c.selfDuration.toFixed(1)}ms total:${c.actualDuration.toFixed(1)}ms causes:${causes}`;\n const keys = formatChangedKeys(c.changedKeys);\n if (keys) line += ` changed: ${keys}`;\n lines.push(line);\n }\n const hidden = detail.totalComponents - detail.components.length;\n if (hidden > 0) {\n lines.push(` ... ${hidden} more (use --limit to show more)`);\n }\n return lines.join('\\n');\n}\n\n// ── Changed-keys helper ──\n\nexport function formatChangedKeys(keys: ChangedKeys | undefined): string {\n if (!keys) return '';\n const parts: string[] = [];\n if (keys.props.length > 0) parts.push(`props: ${keys.props.join(', ')}`);\n if (keys.state.length > 0) parts.push(`state: ${keys.state.join(', ')}`);\n if (keys.hooks.length > 0) parts.push(`hooks: ${keys.hooks.map((h) => `#${h}`).join(', ')}`);\n return parts.join(' ');\n}\n\n// ── Helpers ──\n\nfunction formatCompactValue(val: unknown): string | undefined {\n if (val === undefined) return undefined;\n if (val === null) return 'null';\n if (typeof val === 'function') return 'ƒ';\n if (typeof val === 'string') return `\"${val}\"`;\n if (typeof val === 'number' || typeof val === 'boolean') return String(val);\n try {\n const s = JSON.stringify(val, replacer, 0);\n if (s && s.length > 60) return s.slice(0, 57) + '...';\n return s || String(val);\n } catch {\n return String(val);\n }\n}\n\nfunction replacer(_key: string, value: unknown): unknown {\n if (typeof value === 'function') return 'ƒ';\n return value;\n}\n\n// ── Profile Diff ──\n\nfunction fmtMs(ms: number): string {\n return ms.toFixed(1) + 'ms';\n}\n\nfunction fmtPct(pct: number | null): string {\n if (pct === null) return '';\n const sign = pct > 0 ? '+' : '';\n return `${sign}${pct.toFixed(0)}%`;\n}\n\nfunction fmtDiffLine(e: DiffEntry): string {\n const before = e.before ? fmtMs(e.before.avgDuration) : '-';\n const after = e.after ? fmtMs(e.after.avgDuration) : '-';\n const pct = fmtPct(e.avgDurationDeltaPct);\n const rendersBefore = e.before ? String(e.before.renderCount) : '-';\n const rendersAfter = e.after ? String(e.after.renderCount) : '-';\n return ` ${e.displayName.padEnd(30)} avg: ${before.padStart(8)} -> ${after.padStart(8)} ${pct.padStart(6)} renders: ${rendersBefore} -> ${rendersAfter}`;\n}\n\nexport function formatProfileDiff(diff: ProfileDiffResult, limit?: number): string {\n const lines: string[] = [];\n const s = diff.summary;\n\n lines.push(`Before: ${s.totalCommitsBefore} commits, ${fmtMs(s.totalDurationBefore)} total`);\n lines.push(`After: ${s.totalCommitsAfter} commits, ${fmtMs(s.totalDurationAfter)} total`);\n\n const durDelta = s.totalDurationAfter - s.totalDurationBefore;\n const durPct = s.totalDurationBefore > 0 ? (durDelta / s.totalDurationBefore) * 100 : 0;\n lines.push(`Delta: ${fmtMs(durDelta)} (${fmtPct(durPct)})`);\n\n if (diff.regressed.length > 0) {\n lines.push('');\n lines.push(`Regressed (${diff.regressed.length}):`);\n for (const e of diff.regressed.slice(0, limit)) {\n lines.push(fmtDiffLine(e));\n }\n const hidden = diff.regressed.length - (limit ?? diff.regressed.length);\n if (hidden > 0) lines.push(` ... ${hidden} more`);\n }\n\n if (diff.improved.length > 0) {\n lines.push('');\n lines.push(`Improved (${diff.improved.length}):`);\n for (const e of diff.improved.slice(0, limit)) {\n lines.push(fmtDiffLine(e));\n }\n const hidden = diff.improved.length - (limit ?? diff.improved.length);\n if (hidden > 0) lines.push(` ... ${hidden} more`);\n }\n\n if (diff.added.length > 0) {\n lines.push('');\n lines.push(`New (${diff.added.length}):`);\n for (const e of diff.added.slice(0, limit)) {\n lines.push(fmtDiffLine(e));\n }\n const hidden = diff.added.length - (limit ?? diff.added.length);\n if (hidden > 0) lines.push(` ... ${hidden} more`);\n }\n\n if (diff.removed.length > 0) {\n lines.push('');\n lines.push(`Removed (${diff.removed.length}):`);\n for (const e of diff.removed.slice(0, limit)) {\n lines.push(fmtDiffLine(e));\n }\n const hidden = diff.removed.length - (limit ?? diff.removed.length);\n if (hidden > 0) lines.push(` ... ${hidden} more`);\n }\n\n if (diff.regressed.length === 0 && diff.improved.length === 0 && diff.added.length === 0 && diff.removed.length === 0) {\n lines.push('');\n lines.push(`No significant changes (all within ${s.thresholdPct}% threshold)`);\n }\n\n return lines.join('\\n');\n}\n","import {\n ensureDaemon,\n sendCommand,\n stopDaemon,\n readDaemonInfo,\n setStateDir,\n} from './daemon-client.js';\nimport {\n formatTree,\n formatComponent,\n formatSearchResults,\n formatCount,\n formatErrors,\n formatStatus,\n formatProfileSummary,\n formatProfileReport,\n formatSlowest,\n formatRerenders,\n formatTimeline,\n formatCommitDetail,\n formatProfileDiff,\n} from './formatters.js';\nimport { writeFileSync } from 'node:fs';\nimport { resolve } from 'node:path';\nimport type { IpcCommand } from './types.js';\n\nfunction usage(): string {\n return `Usage: devtools <command> [options]\n\nSetup:\n init [--dry-run] Auto-configure your React app\n\nDaemon:\n start [--port 8097] Start daemon\n stop Stop daemon\n status Show daemon status\n\nComponents:\n get tree [--depth N] Component hierarchy\n get component <@c1 | id> Props, state, hooks\n find <name> [--exact] Search by display name\n count Component count by type\n errors Components with errors/warnings\n\nWait:\n wait --connected [--timeout S] Block until an app connects\n wait --component <name> [--timeout S] Block until a component appears\n\nProfiling:\n profile start [name] Start profiling session\n profile stop Stop profiling, collect data\n profile report <@c1 | id> Render report for component\n profile slow [--limit N] Slowest components (by avg)\n profile rerenders [--limit N] Most re-rendered components\n profile timeline [--limit N] Commit timeline\n profile commit <N | #N> [--limit N] Detail for specific commit\n profile export <file> Export as React DevTools JSON\n profile diff <before.json> <after.json> [--limit N] [--threshold N] Compare two exports`;\n}\n\nfunction parseArgs(argv: string[]): {\n command: string[];\n flags: Record<string, string | boolean>;\n} {\n const command: string[] = [];\n const flags: Record<string, string | boolean> = {};\n\n for (let i = 0; i < argv.length; i++) {\n const arg = argv[i];\n if (arg.startsWith('--')) {\n const key = arg.slice(2);\n const eqIdx = key.indexOf('=');\n if (eqIdx !== -1) {\n flags[key.slice(0, eqIdx)] = key.slice(eqIdx + 1);\n } else {\n // Check if next arg is a value\n const next = argv[i + 1];\n if (next && !next.startsWith('--')) {\n flags[key] = next;\n i++;\n } else {\n flags[key] = true;\n }\n }\n } else {\n command.push(arg);\n }\n }\n return { command, flags };\n}\n\nfunction parseNumericFlag(\n flags: Record<string, string | boolean>,\n name: string,\n defaultValue?: number,\n): number | undefined {\n const raw = flags[name];\n if (raw === undefined || raw === true) return defaultValue;\n const n = parseInt(raw as string, 10);\n if (isNaN(n)) {\n console.error(`Invalid value for --${name}: expected a number`);\n process.exit(1);\n }\n return n;\n}\n\nasync function main(): Promise<void> {\n const { command, flags } = parseArgs(process.argv.slice(2));\n\n if (command.length === 0 || flags['help']) {\n console.log(usage());\n process.exit(0);\n }\n\n // Configure custom state directory (for test isolation)\n if (typeof flags['state-dir'] === 'string') {\n setStateDir(flags['state-dir']);\n }\n\n const cmd0 = command[0];\n const cmd1 = command[1];\n\n try {\n // ── Init ──\n if (cmd0 === 'init') {\n const { runInit } = await import('./init.js');\n await runInit(process.cwd(), flags['dry-run'] === true);\n return;\n }\n\n // ── Profile diff (no daemon needed) ──\n if (cmd0 === 'profile' && cmd1 === 'diff') {\n const fileA = command[2];\n const fileB = command[3];\n if (!fileA || !fileB) {\n console.error('Usage: devtools profile diff <before.json> <after.json> [--limit N] [--threshold N]');\n process.exit(1);\n }\n const { loadExportFile, diffProfiles } = await import('./profile-diff.js');\n let before: ReturnType<typeof loadExportFile>;\n let after: ReturnType<typeof loadExportFile>;\n try {\n before = loadExportFile(resolve(fileA));\n } catch (e) {\n console.error(`Error reading ${fileA}: ${(e as Error).message}`);\n process.exit(1);\n }\n try {\n after = loadExportFile(resolve(fileB));\n } catch (e) {\n console.error(`Error reading ${fileB}: ${(e as Error).message}`);\n process.exit(1);\n }\n const limit = parseNumericFlag(flags, 'limit');\n const threshold = parseNumericFlag(flags, 'threshold');\n const diff = diffProfiles(before, after, threshold);\n console.log(formatProfileDiff(diff, limit));\n return;\n }\n\n // ── Daemon management ──\n if (cmd0 === 'start') {\n const port = parseNumericFlag(flags, 'port');\n await ensureDaemon(port);\n const resp = await sendCommand({ type: 'status' });\n if (resp.ok) {\n console.log(formatStatus(resp.data as any));\n }\n return;\n }\n\n if (cmd0 === 'stop') {\n const stopped = stopDaemon();\n console.log(stopped ? 'Daemon stopped' : 'Daemon is not running');\n return;\n }\n\n if (cmd0 === 'status') {\n const info = readDaemonInfo();\n if (!info) {\n console.log('Daemon is not running');\n process.exit(1);\n }\n try {\n const resp = await sendCommand({ type: 'status' });\n if (resp.ok) {\n console.log(formatStatus(resp.data as any));\n } else {\n console.error(resp.error);\n process.exit(1);\n }\n } catch {\n console.log('Daemon is not running (stale info)');\n process.exit(1);\n }\n return;\n }\n\n // ── All other commands require the daemon ──\n await ensureDaemon();\n\n // ── Component inspection ──\n if (cmd0 === 'get' && cmd1 === 'tree') {\n const depth = parseNumericFlag(flags, 'depth');\n const ipcCmd: IpcCommand = { type: 'get-tree', depth };\n const resp = await sendCommand(ipcCmd);\n if (resp.ok) {\n console.log(formatTree(resp.data as any, resp.hint));\n } else {\n console.error(resp.error);\n process.exit(1);\n }\n return;\n }\n\n if (cmd0 === 'get' && cmd1 === 'component') {\n const raw = command[2];\n if (!raw) {\n console.error('Usage: devtools get component <@c1 | id>');\n process.exit(1);\n }\n const id: number | string = raw.startsWith('@') ? raw : parseInt(raw, 10);\n if (typeof id === 'number' && isNaN(id)) {\n console.error('Usage: devtools get component <@c1 | id>');\n process.exit(1);\n }\n const resp = await sendCommand({ type: 'get-component', id });\n if (resp.ok) {\n console.log(formatComponent(resp.data as any, resp.label));\n } else {\n console.error(resp.error);\n process.exit(1);\n }\n return;\n }\n\n if (cmd0 === 'find') {\n const name = command[1];\n if (!name) {\n console.error('Usage: devtools find <name> [--exact]');\n process.exit(1);\n }\n const exact = flags['exact'] === true;\n const resp = await sendCommand({ type: 'find', name, exact });\n if (resp.ok) {\n console.log(formatSearchResults(resp.data as any));\n } else {\n console.error(resp.error);\n process.exit(1);\n }\n return;\n }\n\n if (cmd0 === 'count') {\n const resp = await sendCommand({ type: 'count' });\n if (resp.ok) {\n console.log(formatCount(resp.data as any));\n } else {\n console.error(resp.error);\n process.exit(1);\n }\n return;\n }\n\n if (cmd0 === 'errors') {\n const resp = await sendCommand({ type: 'errors' });\n if (resp.ok) {\n console.log(formatErrors(resp.data as any));\n } else {\n console.error(resp.error);\n process.exit(1);\n }\n return;\n }\n\n // ── Wait ──\n if (cmd0 === 'wait') {\n const timeoutSec = parseNumericFlag(flags, 'timeout', 30)!;\n const timeoutMs = timeoutSec * 1000;\n const socketTimeout = timeoutMs + 5000;\n\n let ipcCmd: IpcCommand;\n if (flags['connected'] !== undefined) {\n ipcCmd = { type: 'wait', condition: 'connected', timeout: timeoutMs };\n } else if (flags['component'] !== undefined) {\n if (typeof flags['component'] !== 'string') {\n console.error('Usage: devtools wait --component <name> [--timeout S]');\n process.exit(1);\n }\n ipcCmd = { type: 'wait', condition: 'component', name: flags['component'], timeout: timeoutMs };\n } else {\n console.error('Usage: devtools wait --connected|--component <name> [--timeout S]');\n process.exit(1);\n }\n\n const resp = await sendCommand(ipcCmd, socketTimeout);\n if (resp.ok) {\n const result = resp.data as { met: boolean; condition: string; timeout?: boolean };\n if (result.met) {\n console.log(`Condition met: ${result.condition}`);\n } else {\n console.error(`Timed out waiting for: ${result.condition}`);\n process.exit(1);\n }\n } else {\n console.error(resp.error);\n process.exit(1);\n }\n return;\n }\n\n // ── Profiling ──\n if (cmd0 === 'profile' && cmd1 === 'start') {\n const name = command[2];\n const resp = await sendCommand({ type: 'profile-start', name });\n if (resp.ok) {\n console.log(resp.data);\n } else {\n console.error(resp.error);\n process.exit(1);\n }\n return;\n }\n\n if (cmd0 === 'profile' && cmd1 === 'stop') {\n const resp = await sendCommand({ type: 'profile-stop' });\n if (resp.ok) {\n console.log(formatProfileSummary(resp.data as any));\n } else {\n console.error(resp.error);\n process.exit(1);\n }\n return;\n }\n\n if (cmd0 === 'profile' && cmd1 === 'report') {\n const raw = command[2];\n if (!raw) {\n console.error('Usage: devtools profile report <@c1 | id>');\n process.exit(1);\n }\n const componentId: number | string = raw.startsWith('@') ? raw : parseInt(raw, 10);\n if (typeof componentId === 'number' && isNaN(componentId)) {\n console.error('Usage: devtools profile report <@c1 | id>');\n process.exit(1);\n }\n const resp = await sendCommand({ type: 'profile-report', componentId });\n if (resp.ok) {\n console.log(formatProfileReport(resp.data as any, resp.label));\n } else {\n console.error(resp.error);\n process.exit(1);\n }\n return;\n }\n\n if (cmd0 === 'profile' && cmd1 === 'slow') {\n const limit = parseNumericFlag(flags, 'limit');\n const resp = await sendCommand({ type: 'profile-slow', limit });\n if (resp.ok) {\n console.log(formatSlowest(resp.data as any));\n } else {\n console.error(resp.error);\n process.exit(1);\n }\n return;\n }\n\n if (cmd0 === 'profile' && cmd1 === 'rerenders') {\n const limit = parseNumericFlag(flags, 'limit');\n const resp = await sendCommand({ type: 'profile-rerenders', limit });\n if (resp.ok) {\n console.log(formatRerenders(resp.data as any));\n } else {\n console.error(resp.error);\n process.exit(1);\n }\n return;\n }\n\n if (cmd0 === 'profile' && cmd1 === 'commit') {\n const raw = command[2];\n if (!raw) {\n console.error('Usage: devtools profile commit <N | #N>');\n process.exit(1);\n }\n const index = parseInt(raw.replace(/^#/, ''), 10);\n if (isNaN(index)) {\n console.error('Usage: devtools profile commit <N | #N>');\n process.exit(1);\n }\n const limit = parseNumericFlag(flags, 'limit');\n const resp = await sendCommand({ type: 'profile-commit', index, limit });\n if (resp.ok) {\n console.log(formatCommitDetail(resp.data as any));\n } else {\n console.error(resp.error);\n process.exit(1);\n }\n return;\n }\n\n if (cmd0 === 'profile' && cmd1 === 'timeline') {\n const limit = parseNumericFlag(flags, 'limit');\n const offset = parseNumericFlag(flags, 'offset');\n const sortFlag = flags['sort'];\n const sort = sortFlag === 'duration' ? 'duration' as const\n : sortFlag === 'timeline' ? 'timeline' as const\n : undefined;\n const resp = await sendCommand({ type: 'profile-timeline', limit, offset, sort });\n if (resp.ok) {\n console.log(formatTimeline(resp.data as any));\n } else {\n console.error(resp.error);\n process.exit(1);\n }\n return;\n }\n\n if (cmd0 === 'profile' && cmd1 === 'export') {\n const file = command[2];\n if (!file) {\n console.error('Usage: devtools profile export <file>');\n process.exit(1);\n }\n const resp = await sendCommand({ type: 'profile-export' });\n if (resp.ok) {\n const outPath = resolve(file);\n writeFileSync(outPath, JSON.stringify(resp.data), 'utf-8');\n console.log(`Exported to ${outPath}`);\n } else {\n console.error(resp.error);\n process.exit(1);\n }\n return;\n }\n\n console.error(`Unknown command: ${command.join(' ')}`);\n console.log(usage());\n process.exit(1);\n } catch (err) {\n console.error(\n err instanceof Error ? err.message : String(err),\n );\n process.exit(1);\n }\n}\n\nmain();\n"],"mappings":"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","names":["daemonScript","resolve"]}
|
|
1
|
+
{"version":3,"sources":["../src/daemon-client.ts","../src/formatters.ts","../src/cli.ts"],"sourcesContent":["import net from 'node:net';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { spawn } from 'node:child_process';\nimport type { IpcCommand, IpcResponse, DaemonInfo } from './types.js';\n\nconst DEFAULT_STATE_DIR = path.join(\n process.env.HOME || process.env.USERPROFILE || '/tmp',\n '.agent-react-devtools',\n);\n\nlet stateDir = DEFAULT_STATE_DIR;\n\nexport function setStateDir(dir: string): void {\n stateDir = dir;\n}\n\nfunction getDaemonInfoPath(): string {\n return path.join(stateDir, 'daemon.json');\n}\n\nfunction getSocketPath(): string {\n return path.join(stateDir, 'daemon.sock');\n}\n\nexport function readDaemonInfo(): DaemonInfo | null {\n try {\n const raw = fs.readFileSync(getDaemonInfoPath(), 'utf-8');\n return JSON.parse(raw) as DaemonInfo;\n } catch {\n return null;\n }\n}\n\nfunction isDaemonAlive(info: DaemonInfo): boolean {\n try {\n // Signal 0 doesn't kill, just checks if process exists\n process.kill(info.pid, 0);\n return true;\n } catch {\n return false;\n }\n}\n\nexport async function ensureDaemon(port?: number): Promise<void> {\n const info = readDaemonInfo();\n if (info && isDaemonAlive(info)) {\n const daemonScript = path.join(\n path.dirname(new URL(import.meta.url).pathname),\n 'daemon.js',\n );\n try {\n const stat = fs.statSync(daemonScript);\n const stale = info.buildMtime !== undefined\n ? stat.mtimeMs !== info.buildMtime\n : stat.mtimeMs > info.startedAt;\n if (stale) {\n port = port ?? info.port;\n stopDaemon();\n } else {\n return;\n }\n } catch {\n return;\n }\n }\n\n // Clean up stale files\n try {\n fs.unlinkSync(getDaemonInfoPath());\n } catch {\n // ignore\n }\n try {\n fs.unlinkSync(getSocketPath());\n } catch {\n // ignore\n }\n\n // Start daemon as detached child process\n const daemonScript = path.join(\n path.dirname(new URL(import.meta.url).pathname),\n 'daemon.js',\n );\n\n const args = [];\n if (port) args.push(`--port=${port}`);\n if (stateDir !== DEFAULT_STATE_DIR) args.push(`--state-dir=${stateDir}`);\n\n const child = spawn(process.execPath, [daemonScript, ...args], {\n detached: true,\n stdio: 'ignore',\n });\n child.unref();\n\n // Wait for daemon to be ready (up to 5 seconds)\n const deadline = Date.now() + 5000;\n while (Date.now() < deadline) {\n await new Promise((r) => setTimeout(r, 100));\n try {\n await sendCommand({ type: 'ping' });\n return;\n } catch {\n // not ready yet\n }\n }\n throw new Error('Daemon failed to start within 5 seconds');\n}\n\nexport function stopDaemon(): boolean {\n const info = readDaemonInfo();\n if (!info) return false;\n\n try {\n process.kill(info.pid, 'SIGTERM');\n // Clean up files\n try {\n fs.unlinkSync(getDaemonInfoPath());\n } catch {\n // ignore\n }\n return true;\n } catch {\n return false;\n }\n}\n\nexport function sendCommand(cmd: IpcCommand, socketTimeout = 30_000): Promise<IpcResponse> {\n return new Promise((resolve, reject) => {\n const socketPath = getSocketPath();\n\n const conn = net.createConnection(socketPath, () => {\n conn.write(JSON.stringify(cmd) + '\\n');\n });\n\n let buffer = '';\n conn.on('data', (chunk) => {\n buffer += chunk.toString();\n const newlineIdx = buffer.indexOf('\\n');\n if (newlineIdx !== -1) {\n const line = buffer.slice(0, newlineIdx);\n conn.end();\n try {\n resolve(JSON.parse(line) as IpcResponse);\n } catch {\n reject(new Error('Invalid response from daemon'));\n }\n }\n });\n\n conn.on('error', (err) => {\n reject(new Error(`Cannot connect to daemon: ${err.message}`));\n });\n\n conn.setTimeout(socketTimeout, () => {\n conn.destroy();\n reject(new Error('Command timed out'));\n });\n });\n}\n","import type {\n StatusInfo,\n InspectedElement,\n ComponentRenderReport,\n ChangedKeys,\n} from './types.js';\nimport type { TreeNode } from './component-tree.js';\nimport type { ProfileSummary, TimelineResult, CommitDetail } from './profiler.js';\nimport type { ProfileDiffResult, DiffEntry } from './profile-diff.js';\n\n// ── Abbreviations for component types ──\nconst TYPE_ABBREV: Record<string, string> = {\n function: 'fn',\n class: 'cls',\n host: 'host',\n memo: 'memo',\n forwardRef: 'fRef',\n profiler: 'prof',\n suspense: 'susp',\n context: 'ctx',\n other: '?',\n};\n\nfunction typeTag(type: string): string {\n return TYPE_ABBREV[type] || type;\n}\n\n/**\n * Format a consistent component reference: `@c1 [fn] Name` or `@c1 [fn] Name key=x`\n * When errors/warnings are non-zero, appends annotations like `⚠2 ✗1`.\n */\nfunction formatRef(opts: { label?: string; type?: string; name: string; key?: string | null; errors?: number; warnings?: number }): string {\n const ref = opts.label || '?';\n const tag = typeTag(opts.type || 'other');\n let s = `${ref} [${tag}] ${opts.name}`;\n if (opts.key) s += ` key=${opts.key}`;\n const annotations = formatErrorAnnotations(opts.errors, opts.warnings);\n if (annotations) s += ` ${annotations}`;\n return s;\n}\n\n/**\n * Format error/warning count annotations (e.g., `⚠2 ✗1`).\n * Returns empty string if both counts are zero or undefined.\n */\nfunction formatErrorAnnotations(errors?: number, warnings?: number): string {\n const parts: string[] = [];\n if (warnings && warnings > 0) parts.push(`⚠${warnings}`);\n if (errors && errors > 0) parts.push(`✗${errors}`);\n return parts.join(' ');\n}\n\n// ── Tree connector characters ──\nconst PIPE = '│ ';\nconst TEE = '├─ ';\nconst ELBOW = '└─ ';\nconst SPACE = ' ';\n\n/** Default number of siblings to show before collapsing a run */\nconst COLLAPSE_THRESHOLD = 3;\n\nexport interface FormatTreeOptions {\n /** Total component count (before filtering), for the summary footer */\n totalCount?: number;\n /** Maximum output lines (hard cap) */\n maxLines?: number;\n /** Hint text for empty tree */\n hint?: string;\n}\n\nexport function formatTree(nodes: TreeNode[], hintOrOpts?: string | FormatTreeOptions): string {\n const opts: FormatTreeOptions =\n typeof hintOrOpts === 'string' ? { hint: hintOrOpts } : hintOrOpts || {};\n const { hint, totalCount, maxLines } = opts;\n\n if (nodes.length === 0) {\n return hint ? `No components (${hint})` : 'No components (is a React app connected?)';\n }\n\n // Build tree structure and id lookup from the flat list\n const childrenMap = new Map<number | null, TreeNode[]>();\n const nodeMap = new Map<number, TreeNode>();\n for (const node of nodes) {\n nodeMap.set(node.id, node);\n const parentId = node.parentId;\n let siblings = childrenMap.get(parentId);\n if (!siblings) {\n siblings = [];\n childrenMap.set(parentId, siblings);\n }\n siblings.push(node);\n }\n\n const lines: string[] = [];\n let truncated = false;\n // Reserve lines for summary footer only; truncation replaces the last tree line\n const lineLimit = maxLines !== undefined\n ? maxLines - (totalCount !== undefined ? 1 : 0)\n : Infinity;\n\n function addLine(line: string): boolean {\n if (lines.length >= lineLimit) {\n truncated = true;\n return false;\n }\n lines.push(line);\n return true;\n }\n\n function walk(nodeId: number, prefix: string, isLast: boolean, isRoot: boolean): boolean {\n const node = nodeMap.get(nodeId);\n if (!node) return true;\n\n const connector = isRoot ? '' : isLast ? ELBOW : TEE;\n const line = formatRef({ label: node.label, type: node.type, name: node.displayName, key: node.key, errors: node.errors, warnings: node.warnings });\n\n if (!addLine(`${prefix}${connector}${line}`)) return false;\n\n const children = childrenMap.get(node.id) || [];\n const childPrefix = isRoot ? '' : prefix + (isLast ? SPACE : PIPE);\n\n // Collapse repeated siblings with the same display name\n let i = 0;\n while (i < children.length) {\n // Find a run of siblings with the same displayName\n let runEnd = i + 1;\n while (runEnd < children.length && children[runEnd].displayName === children[i].displayName) {\n runEnd++;\n }\n const runLen = runEnd - i;\n\n if (runLen > COLLAPSE_THRESHOLD) {\n // Show first COLLAPSE_THRESHOLD items, then a summary line\n for (let j = 0; j < COLLAPSE_THRESHOLD; j++) {\n if (!walk(children[i + j].id, childPrefix, false, false)) return false;\n }\n // Summary line for the rest\n const remaining = runLen - COLLAPSE_THRESHOLD;\n const isLastGroup = runEnd === children.length;\n const summaryConnector = isLastGroup ? ELBOW : TEE;\n if (!addLine(`${childPrefix}${summaryConnector}... +${remaining} more ${children[i].displayName}`)) return false;\n i = runEnd;\n } else {\n // Render normally\n for (let j = i; j < runEnd; j++) {\n const isLastChild = j === children.length - 1;\n if (!walk(children[j].id, childPrefix, isLastChild, false)) return false;\n }\n i = runEnd;\n }\n }\n return true;\n }\n\n // Find root nodes\n const roots = childrenMap.get(null) || [];\n for (let i = 0; i < roots.length; i++) {\n if (!walk(roots[i].id, '', i === roots.length - 1, true)) break;\n }\n\n if (truncated) {\n if (totalCount !== undefined) {\n // Use the reserved footer slot for the truncation notice so no content line is lost.\n // Combine with total count so the summary info isn't dropped.\n lines.push(`... output truncated at ${maxLines} lines (${totalCount.toLocaleString()} total components)`);\n } else {\n // No footer reserved — replace last content line with truncation notice.\n if (lines.length > 0) {\n lines[lines.length - 1] = `... output truncated at ${maxLines} lines`;\n } else {\n lines.push(`... output truncated at ${maxLines} lines`);\n }\n }\n } else if (totalCount !== undefined) {\n // Summary footer (only when output was not truncated)\n const shown = nodes.length;\n const totalFormatted = totalCount.toLocaleString();\n if (shown < totalCount) {\n lines.push(`${shown} components shown (${totalFormatted} total)`);\n } else {\n lines.push(`${totalFormatted} components`);\n }\n }\n\n return lines.join('\\n');\n}\n\nexport function formatErrors(nodes: TreeNode[]): string {\n if (nodes.length === 0) return 'No components with errors or warnings';\n\n const lines: string[] = [];\n for (const n of nodes) {\n const ref = formatRef({ label: n.label, type: n.type, name: n.displayName, key: n.key, errors: n.errors, warnings: n.warnings });\n lines.push(ref);\n }\n return lines.join('\\n');\n}\n\nexport function formatComponent(element: InspectedElement & { errors?: number; warnings?: number }, label?: string): string {\n const lines: string[] = [];\n\n lines.push(formatRef({ label: label || `#${element.id}`, type: element.type, name: element.displayName, key: element.key, errors: element.errors, warnings: element.warnings }));\n\n // Props\n if (element.props && Object.keys(element.props).length > 0) {\n lines.push('props:');\n for (const [key, value] of Object.entries(element.props)) {\n lines.push(` ${key}: ${formatCompactValue(value) ?? 'undefined'}`);\n }\n }\n\n // State\n if (element.state && Object.keys(element.state).length > 0) {\n lines.push('state:');\n for (const [key, value] of Object.entries(element.state)) {\n lines.push(` ${key}: ${formatCompactValue(value) ?? 'undefined'}`);\n }\n }\n\n // Hooks\n if (element.hooks && element.hooks.length > 0) {\n lines.push('hooks:');\n for (const h of element.hooks) {\n const val = formatCompactValue(h.value);\n lines.push(val !== undefined ? ` ${h.name}: ${val}` : ` ${h.name}`);\n if (h.subHooks && h.subHooks.length > 0) {\n for (const sh of h.subHooks) {\n const sval = formatCompactValue(sh.value);\n lines.push(sval !== undefined ? ` ${sh.name}: ${sval}` : ` ${sh.name}`);\n }\n }\n }\n }\n\n return lines.join('\\n');\n}\n\nexport function formatSearchResults(results: TreeNode[]): string {\n if (results.length === 0) return 'No components found';\n\n return results\n .map((n) => {\n // Use numeric id as label when @c label isn't resolved (e.g., tree not traversed)\n const effectiveLabel = n.label === '@c?' ? `@c?(id:${n.id})` : n.label;\n return formatRef({ label: effectiveLabel, type: n.type, name: n.displayName, key: n.key, errors: n.errors, warnings: n.warnings });\n })\n .join('\\n');\n}\n\nexport function formatCount(counts: Record<string, number>): string {\n const total = Object.values(counts).reduce((a, b) => a + b, 0);\n const parts = Object.entries(counts)\n .sort((a, b) => b[1] - a[1])\n .map(([type, count]) => `${typeTag(type)}:${count}`)\n .join(' ');\n return `${total} components (${parts})`;\n}\n\nexport function formatStatus(status: StatusInfo): string {\n const lines: string[] = [];\n lines.push(`Daemon: running (port ${status.port})`);\n lines.push(\n `Apps: ${status.connectedApps} connected, ${status.componentCount} components`,\n );\n if (status.profilingActive) {\n lines.push('Profiling: active');\n }\n const upSec = Math.round(status.uptime / 1000);\n lines.push(`Uptime: ${upSec}s`);\n if (status.connection?.recentEvents?.length > 0) {\n const last = status.connection.recentEvents[status.connection.recentEvents.length - 1];\n const ago = formatAgo(Date.now() - last.timestamp);\n lines.push(`Last event: app ${last.type} ${ago}`);\n }\n return lines.join('\\n');\n}\n\nexport function formatAgo(ms: number): string {\n const sec = Math.round(ms / 1000);\n if (sec < 60) return `${sec}s ago`;\n const min = Math.round(sec / 60);\n if (min < 60) return `${min}m ago`;\n const hr = Math.round(min / 60);\n return `${hr}h ago`;\n}\n\nexport function formatProfileSummary(summary: ProfileSummary): string {\n const lines: string[] = [];\n const durSec = (summary.duration / 1000).toFixed(1);\n lines.push(\n `Profile \"${summary.name}\" (${durSec}s, ${summary.commitCount} commits)`,\n );\n\n if (summary.componentRenderCounts.length > 0) {\n lines.push('');\n lines.push('Top renders:');\n for (const c of summary.componentRenderCounts.slice(0, 10)) {\n const ref = formatRef({ label: c.label, type: c.type, name: c.displayName || `#${c.id}` });\n lines.push(` ${ref} ${c.count} renders`);\n }\n }\n\n return lines.join('\\n');\n}\n\nexport function formatProfileReport(report: ComponentRenderReport, label?: string): string {\n const lines: string[] = [];\n lines.push(formatRef({ label: label || report.label || `#${report.id}`, type: report.type, name: report.displayName }));\n lines.push(\n `renders:${report.renderCount} avg:${report.avgDuration.toFixed(1)}ms max:${report.maxDuration.toFixed(1)}ms total:${report.totalDuration.toFixed(1)}ms`,\n );\n if (report.causes.length > 0) {\n lines.push(`causes: ${report.causes.join(', ')}`);\n }\n const keys = formatChangedKeys(report.changedKeys);\n if (keys) {\n lines.push(`changed: ${keys}`);\n }\n return lines.join('\\n');\n}\n\nexport function formatSlowest(reports: ComponentRenderReport[]): string {\n if (reports.length === 0) return 'No profiling data';\n\n const lines: string[] = ['Slowest (by avg render time):'];\n for (const r of reports) {\n const ref = formatRef({ label: r.label, type: r.type, name: r.displayName });\n const causes = r.causes.length > 0 ? r.causes.join(', ') : '?';\n let line = ` ${ref} avg:${r.avgDuration.toFixed(1)}ms max:${r.maxDuration.toFixed(1)}ms renders:${r.renderCount} causes:${causes}`;\n const keys = formatChangedKeys(r.changedKeys);\n if (keys) line += ` changed: ${keys}`;\n lines.push(line);\n }\n return lines.join('\\n');\n}\n\nexport function formatRerenders(reports: ComponentRenderReport[]): string {\n if (reports.length === 0) return 'No profiling data';\n\n const lines: string[] = ['Most re-renders:'];\n for (const r of reports) {\n const ref = formatRef({ label: r.label, type: r.type, name: r.displayName });\n const causes = r.causes.length > 0 ? r.causes.join(', ') : '?';\n let line = ` ${ref} ${r.renderCount} renders causes:${causes}`;\n const keys = formatChangedKeys(r.changedKeys);\n if (keys) line += ` changed: ${keys}`;\n lines.push(line);\n }\n return lines.join('\\n');\n}\n\nexport function formatTimeline(result: TimelineResult): string {\n if (result.total === 0) return 'No profiling data';\n\n const { entries, total, offset } = result;\n\n if (entries.length === 0) {\n return `Commit timeline (showing 0 of ${total}): offset past end`;\n }\n\n let header: string;\n if (entries.length === total) {\n header = `Commit timeline (${total} commits):`;\n } else {\n const from = offset + 1;\n const to = offset + entries.length;\n header = `Commit timeline (showing ${from}–${to} of ${total}):`;\n }\n\n const lines: string[] = [header];\n for (const e of entries) {\n lines.push(\n ` #${e.index} ${e.duration.toFixed(1)}ms ${e.componentCount} components`,\n );\n }\n return lines.join('\\n');\n}\n\nexport function formatCommitDetail(detail: CommitDetail): string {\n const lines: string[] = [];\n lines.push(`Commit #${detail.index} ${detail.duration.toFixed(1)}ms ${detail.totalComponents} components`);\n lines.push('');\n for (const c of detail.components) {\n const ref = formatRef({ label: c.label, type: c.type, name: c.displayName });\n const causes = c.causes.length > 0 ? c.causes.join(', ') : '?';\n let line = ` ${ref} self:${c.selfDuration.toFixed(1)}ms total:${c.actualDuration.toFixed(1)}ms causes:${causes}`;\n const keys = formatChangedKeys(c.changedKeys);\n if (keys) line += ` changed: ${keys}`;\n lines.push(line);\n }\n const hidden = detail.totalComponents - detail.components.length;\n if (hidden > 0) {\n lines.push(` ... ${hidden} more (use --limit to show more)`);\n }\n return lines.join('\\n');\n}\n\n// ── Changed-keys helper ──\n\nexport function formatChangedKeys(keys: ChangedKeys | undefined): string {\n if (!keys) return '';\n const parts: string[] = [];\n if (keys.props.length > 0) parts.push(`props: ${keys.props.join(', ')}`);\n if (keys.state.length > 0) parts.push(`state: ${keys.state.join(', ')}`);\n if (keys.hooks.length > 0) parts.push(`hooks: ${keys.hooks.map((h) => `#${h}`).join(', ')}`);\n return parts.join(' ');\n}\n\n// ── Helpers ──\n\nfunction formatCompactValue(val: unknown): string | undefined {\n if (val === undefined) return undefined;\n if (val === null) return 'null';\n if (typeof val === 'function') return 'ƒ';\n if (typeof val === 'string') return `\"${val}\"`;\n if (typeof val === 'number' || typeof val === 'boolean') return String(val);\n try {\n const s = JSON.stringify(val, replacer, 0);\n if (s && s.length > 60) return s.slice(0, 57) + '...';\n return s || String(val);\n } catch {\n return String(val);\n }\n}\n\nfunction replacer(_key: string, value: unknown): unknown {\n if (typeof value === 'function') return 'ƒ';\n return value;\n}\n\n// ── Profile Diff ──\n\nfunction fmtMs(ms: number): string {\n return ms.toFixed(1) + 'ms';\n}\n\nfunction fmtPct(pct: number | null): string {\n if (pct === null) return '';\n const sign = pct > 0 ? '+' : '';\n return `${sign}${pct.toFixed(0)}%`;\n}\n\nfunction fmtDiffLine(e: DiffEntry): string {\n const before = e.before ? fmtMs(e.before.avgDuration) : '-';\n const after = e.after ? fmtMs(e.after.avgDuration) : '-';\n const pct = fmtPct(e.avgDurationDeltaPct);\n const rendersBefore = e.before ? String(e.before.renderCount) : '-';\n const rendersAfter = e.after ? String(e.after.renderCount) : '-';\n return ` ${e.displayName.padEnd(30)} avg: ${before.padStart(8)} -> ${after.padStart(8)} ${pct.padStart(6)} renders: ${rendersBefore} -> ${rendersAfter}`;\n}\n\nexport function formatProfileDiff(diff: ProfileDiffResult, limit?: number): string {\n const lines: string[] = [];\n const s = diff.summary;\n\n lines.push(`Before: ${s.totalCommitsBefore} commits, ${fmtMs(s.totalDurationBefore)} total`);\n lines.push(`After: ${s.totalCommitsAfter} commits, ${fmtMs(s.totalDurationAfter)} total`);\n\n const durDelta = s.totalDurationAfter - s.totalDurationBefore;\n const durPct = s.totalDurationBefore > 0 ? (durDelta / s.totalDurationBefore) * 100 : 0;\n lines.push(`Delta: ${fmtMs(durDelta)} (${fmtPct(durPct)})`);\n\n if (diff.regressed.length > 0) {\n lines.push('');\n lines.push(`Regressed (${diff.regressed.length}):`);\n for (const e of diff.regressed.slice(0, limit)) {\n lines.push(fmtDiffLine(e));\n }\n const hidden = diff.regressed.length - (limit ?? diff.regressed.length);\n if (hidden > 0) lines.push(` ... ${hidden} more`);\n }\n\n if (diff.improved.length > 0) {\n lines.push('');\n lines.push(`Improved (${diff.improved.length}):`);\n for (const e of diff.improved.slice(0, limit)) {\n lines.push(fmtDiffLine(e));\n }\n const hidden = diff.improved.length - (limit ?? diff.improved.length);\n if (hidden > 0) lines.push(` ... ${hidden} more`);\n }\n\n if (diff.added.length > 0) {\n lines.push('');\n lines.push(`New (${diff.added.length}):`);\n for (const e of diff.added.slice(0, limit)) {\n lines.push(fmtDiffLine(e));\n }\n const hidden = diff.added.length - (limit ?? diff.added.length);\n if (hidden > 0) lines.push(` ... ${hidden} more`);\n }\n\n if (diff.removed.length > 0) {\n lines.push('');\n lines.push(`Removed (${diff.removed.length}):`);\n for (const e of diff.removed.slice(0, limit)) {\n lines.push(fmtDiffLine(e));\n }\n const hidden = diff.removed.length - (limit ?? diff.removed.length);\n if (hidden > 0) lines.push(` ... ${hidden} more`);\n }\n\n if (diff.regressed.length === 0 && diff.improved.length === 0 && diff.added.length === 0 && diff.removed.length === 0) {\n lines.push('');\n lines.push(`No significant changes (all within ${s.thresholdPct}% threshold)`);\n }\n\n return lines.join('\\n');\n}\n","import {\n ensureDaemon,\n sendCommand,\n stopDaemon,\n readDaemonInfo,\n setStateDir,\n} from './daemon-client.js';\nimport {\n formatTree,\n formatComponent,\n formatSearchResults,\n formatCount,\n formatErrors,\n formatStatus,\n formatProfileSummary,\n formatProfileReport,\n formatSlowest,\n formatRerenders,\n formatTimeline,\n formatCommitDetail,\n formatProfileDiff,\n} from './formatters.js';\nimport { writeFileSync } from 'node:fs';\nimport { resolve } from 'node:path';\nimport type { IpcCommand } from './types.js';\n\nfunction usage(): string {\n return `Usage: devtools <command> [options]\n\nSetup:\n init [--dry-run] Auto-configure your React app\n uninit [--dry-run] Remove configuration added by init\n\nDaemon:\n start [--port 8097] Start daemon\n stop Stop daemon\n status Show daemon status\n\nComponents:\n get tree [@c1 | id] [--depth N] [--all] [--max-lines N] Component hierarchy\n get component <@c1 | id> Props, state, hooks\n find <name> [--exact] Search by display name\n count Component count by type\n errors Components with errors/warnings\n\nWait:\n wait --connected [--timeout S] Block until an app connects\n wait --component <name> [--timeout S] Block until a component appears\n\nProfiling:\n profile start [name] Start profiling session\n profile stop Stop profiling, collect data\n profile report <@c1 | id> Render report for component\n profile slow [--limit N] Slowest components (by avg)\n profile rerenders [--limit N] Most re-rendered components\n profile timeline [--limit N] Commit timeline\n profile commit <N | #N> [--limit N] Detail for specific commit\n profile export <file> Export as React DevTools JSON\n profile diff <before.json> <after.json> [--limit N] [--threshold N] Compare two exports`;\n}\n\nfunction parseArgs(argv: string[]): {\n command: string[];\n flags: Record<string, string | boolean>;\n} {\n const command: string[] = [];\n const flags: Record<string, string | boolean> = {};\n\n for (let i = 0; i < argv.length; i++) {\n const arg = argv[i];\n if (arg.startsWith('--')) {\n const key = arg.slice(2);\n const eqIdx = key.indexOf('=');\n if (eqIdx !== -1) {\n flags[key.slice(0, eqIdx)] = key.slice(eqIdx + 1);\n } else {\n // Check if next arg is a value\n const next = argv[i + 1];\n if (next && !next.startsWith('--')) {\n flags[key] = next;\n i++;\n } else {\n flags[key] = true;\n }\n }\n } else {\n command.push(arg);\n }\n }\n return { command, flags };\n}\n\nfunction parseNumericFlag(\n flags: Record<string, string | boolean>,\n name: string,\n defaultValue?: number,\n): number | undefined {\n const raw = flags[name];\n if (raw === undefined || raw === true) return defaultValue;\n const n = parseInt(raw as string, 10);\n if (isNaN(n)) {\n console.error(`Invalid value for --${name}: expected a number`);\n process.exit(1);\n }\n return n;\n}\n\nasync function main(): Promise<void> {\n const { command, flags } = parseArgs(process.argv.slice(2));\n\n if (command.length === 0 || flags['help']) {\n console.log(usage());\n process.exit(0);\n }\n\n // Configure custom state directory (for test isolation)\n if (typeof flags['state-dir'] === 'string') {\n setStateDir(flags['state-dir']);\n }\n\n const cmd0 = command[0];\n const cmd1 = command[1];\n\n try {\n // ── Init / Uninit ──\n if (cmd0 === 'init') {\n const { runInit } = await import('./init.js');\n await runInit(process.cwd(), flags['dry-run'] === true);\n return;\n }\n\n if (cmd0 === 'uninit') {\n const { runUninit } = await import('./init.js');\n await runUninit(process.cwd(), flags['dry-run'] === true);\n return;\n }\n\n // ── Profile diff (no daemon needed) ──\n if (cmd0 === 'profile' && cmd1 === 'diff') {\n const fileA = command[2];\n const fileB = command[3];\n if (!fileA || !fileB) {\n console.error('Usage: devtools profile diff <before.json> <after.json> [--limit N] [--threshold N]');\n process.exit(1);\n }\n const { loadExportFile, diffProfiles } = await import('./profile-diff.js');\n let before: ReturnType<typeof loadExportFile>;\n let after: ReturnType<typeof loadExportFile>;\n try {\n before = loadExportFile(resolve(fileA));\n } catch (e) {\n console.error(`Error reading ${fileA}: ${(e as Error).message}`);\n process.exit(1);\n }\n try {\n after = loadExportFile(resolve(fileB));\n } catch (e) {\n console.error(`Error reading ${fileB}: ${(e as Error).message}`);\n process.exit(1);\n }\n const limit = parseNumericFlag(flags, 'limit');\n const threshold = parseNumericFlag(flags, 'threshold');\n const diff = diffProfiles(before, after, threshold);\n console.log(formatProfileDiff(diff, limit));\n return;\n }\n\n // ── Daemon management ──\n if (cmd0 === 'start') {\n const port = parseNumericFlag(flags, 'port');\n await ensureDaemon(port);\n const resp = await sendCommand({ type: 'status' });\n if (resp.ok) {\n console.log(formatStatus(resp.data as any));\n }\n return;\n }\n\n if (cmd0 === 'stop') {\n const stopped = stopDaemon();\n console.log(stopped ? 'Daemon stopped' : 'Daemon is not running');\n return;\n }\n\n if (cmd0 === 'status') {\n const info = readDaemonInfo();\n if (!info) {\n console.log('Daemon is not running');\n process.exit(1);\n }\n try {\n const resp = await sendCommand({ type: 'status' });\n if (resp.ok) {\n console.log(formatStatus(resp.data as any));\n } else {\n console.error(resp.error);\n process.exit(1);\n }\n } catch {\n console.log('Daemon is not running (stale info)');\n process.exit(1);\n }\n return;\n }\n\n // ── All other commands require the daemon ──\n await ensureDaemon();\n\n // ── Component inspection ──\n if (cmd0 === 'get' && cmd1 === 'tree') {\n const depth = parseNumericFlag(flags, 'depth');\n const maxLines = parseNumericFlag(flags, 'max-lines');\n // Host components are filtered by default; --all includes them\n const noHost = flags['all'] !== true;\n // Parse optional root: `get tree @c5` or `get tree 5`\n const rawRoot = command[2];\n let root: number | string | undefined;\n if (rawRoot) {\n root = rawRoot.startsWith('@') ? rawRoot : parseInt(rawRoot, 10);\n if (typeof root === 'number' && isNaN(root)) {\n console.error('Usage: devtools get tree [@c1 | id] [--depth N] [--all] [--max-lines N]');\n process.exit(1);\n }\n }\n const ipcCmd: IpcCommand = { type: 'get-tree', depth, noHost, maxLines, root };\n const resp = await sendCommand(ipcCmd);\n if (resp.ok) {\n const { nodes, totalCount } = resp.data as any;\n console.log(formatTree(nodes, { hint: resp.hint, totalCount, maxLines }));\n } else {\n console.error(resp.error);\n process.exit(1);\n }\n return;\n }\n\n if (cmd0 === 'get' && cmd1 === 'component') {\n const raw = command[2];\n if (!raw) {\n console.error('Usage: devtools get component <@c1 | id>');\n process.exit(1);\n }\n const id: number | string = raw.startsWith('@') ? raw : parseInt(raw, 10);\n if (typeof id === 'number' && isNaN(id)) {\n console.error('Usage: devtools get component <@c1 | id>');\n process.exit(1);\n }\n const resp = await sendCommand({ type: 'get-component', id });\n if (resp.ok) {\n console.log(formatComponent(resp.data as any, resp.label));\n } else {\n console.error(resp.error);\n process.exit(1);\n }\n return;\n }\n\n if (cmd0 === 'find') {\n const name = command[1];\n if (!name) {\n console.error('Usage: devtools find <name> [--exact]');\n process.exit(1);\n }\n const exact = flags['exact'] === true;\n const resp = await sendCommand({ type: 'find', name, exact });\n if (resp.ok) {\n console.log(formatSearchResults(resp.data as any));\n } else {\n console.error(resp.error);\n process.exit(1);\n }\n return;\n }\n\n if (cmd0 === 'count') {\n const resp = await sendCommand({ type: 'count' });\n if (resp.ok) {\n console.log(formatCount(resp.data as any));\n } else {\n console.error(resp.error);\n process.exit(1);\n }\n return;\n }\n\n if (cmd0 === 'errors') {\n const resp = await sendCommand({ type: 'errors' });\n if (resp.ok) {\n console.log(formatErrors(resp.data as any));\n } else {\n console.error(resp.error);\n process.exit(1);\n }\n return;\n }\n\n // ── Wait ──\n if (cmd0 === 'wait') {\n const timeoutSec = parseNumericFlag(flags, 'timeout', 30)!;\n const timeoutMs = timeoutSec * 1000;\n const socketTimeout = timeoutMs + 5000;\n\n let ipcCmd: IpcCommand;\n if (flags['connected'] !== undefined) {\n ipcCmd = { type: 'wait', condition: 'connected', timeout: timeoutMs };\n } else if (flags['component'] !== undefined) {\n if (typeof flags['component'] !== 'string') {\n console.error('Usage: devtools wait --component <name> [--timeout S]');\n process.exit(1);\n }\n ipcCmd = { type: 'wait', condition: 'component', name: flags['component'], timeout: timeoutMs };\n } else {\n console.error('Usage: devtools wait --connected|--component <name> [--timeout S]');\n process.exit(1);\n }\n\n const resp = await sendCommand(ipcCmd, socketTimeout);\n if (resp.ok) {\n const result = resp.data as { met: boolean; condition: string; timeout?: boolean };\n if (result.met) {\n console.log(`Condition met: ${result.condition}`);\n } else {\n console.error(`Timed out waiting for: ${result.condition}`);\n process.exit(1);\n }\n } else {\n console.error(resp.error);\n process.exit(1);\n }\n return;\n }\n\n // ── Profiling ──\n if (cmd0 === 'profile' && cmd1 === 'start') {\n const name = command[2];\n const resp = await sendCommand({ type: 'profile-start', name });\n if (resp.ok) {\n console.log(resp.data);\n } else {\n console.error(resp.error);\n process.exit(1);\n }\n return;\n }\n\n if (cmd0 === 'profile' && cmd1 === 'stop') {\n const resp = await sendCommand({ type: 'profile-stop' });\n if (resp.ok) {\n console.log(formatProfileSummary(resp.data as any));\n } else {\n console.error(resp.error);\n process.exit(1);\n }\n return;\n }\n\n if (cmd0 === 'profile' && cmd1 === 'report') {\n const raw = command[2];\n if (!raw) {\n console.error('Usage: devtools profile report <@c1 | id>');\n process.exit(1);\n }\n const componentId: number | string = raw.startsWith('@') ? raw : parseInt(raw, 10);\n if (typeof componentId === 'number' && isNaN(componentId)) {\n console.error('Usage: devtools profile report <@c1 | id>');\n process.exit(1);\n }\n const resp = await sendCommand({ type: 'profile-report', componentId });\n if (resp.ok) {\n console.log(formatProfileReport(resp.data as any, resp.label));\n } else {\n console.error(resp.error);\n process.exit(1);\n }\n return;\n }\n\n if (cmd0 === 'profile' && cmd1 === 'slow') {\n const limit = parseNumericFlag(flags, 'limit');\n const resp = await sendCommand({ type: 'profile-slow', limit });\n if (resp.ok) {\n console.log(formatSlowest(resp.data as any));\n } else {\n console.error(resp.error);\n process.exit(1);\n }\n return;\n }\n\n if (cmd0 === 'profile' && cmd1 === 'rerenders') {\n const limit = parseNumericFlag(flags, 'limit');\n const resp = await sendCommand({ type: 'profile-rerenders', limit });\n if (resp.ok) {\n console.log(formatRerenders(resp.data as any));\n } else {\n console.error(resp.error);\n process.exit(1);\n }\n return;\n }\n\n if (cmd0 === 'profile' && cmd1 === 'commit') {\n const raw = command[2];\n if (!raw) {\n console.error('Usage: devtools profile commit <N | #N>');\n process.exit(1);\n }\n const index = parseInt(raw.replace(/^#/, ''), 10);\n if (isNaN(index)) {\n console.error('Usage: devtools profile commit <N | #N>');\n process.exit(1);\n }\n const limit = parseNumericFlag(flags, 'limit');\n const resp = await sendCommand({ type: 'profile-commit', index, limit });\n if (resp.ok) {\n console.log(formatCommitDetail(resp.data as any));\n } else {\n console.error(resp.error);\n process.exit(1);\n }\n return;\n }\n\n if (cmd0 === 'profile' && cmd1 === 'timeline') {\n const limit = parseNumericFlag(flags, 'limit');\n const offset = parseNumericFlag(flags, 'offset');\n const sortFlag = flags['sort'];\n const sort = sortFlag === 'duration' ? 'duration' as const\n : sortFlag === 'timeline' ? 'timeline' as const\n : undefined;\n const resp = await sendCommand({ type: 'profile-timeline', limit, offset, sort });\n if (resp.ok) {\n console.log(formatTimeline(resp.data as any));\n } else {\n console.error(resp.error);\n process.exit(1);\n }\n return;\n }\n\n if (cmd0 === 'profile' && cmd1 === 'export') {\n const file = command[2];\n if (!file) {\n console.error('Usage: devtools profile export <file>');\n process.exit(1);\n }\n const resp = await sendCommand({ type: 'profile-export' });\n if (resp.ok) {\n const outPath = resolve(file);\n writeFileSync(outPath, JSON.stringify(resp.data), 'utf-8');\n console.log(`Exported to ${outPath}`);\n } else {\n console.error(resp.error);\n process.exit(1);\n }\n return;\n }\n\n console.error(`Unknown command: ${command.join(' ')}`);\n console.log(usage());\n process.exit(1);\n } catch (err) {\n console.error(\n err instanceof Error ? err.message : String(err),\n );\n process.exit(1);\n }\n}\n\nmain();\n"],"mappings":"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","names":["daemonScript","resolve"]}
|