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.
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
 
3
3
  // src/init.ts
4
- import { readFileSync, writeFileSync, existsSync } from "fs";
4
+ import { readFileSync, writeFileSync, existsSync, unlinkSync } from "fs";
5
5
  import { join, dirname } from "path";
6
6
  function detectFramework(cwd) {
7
7
  const pkgPath = join(cwd, "package.json");
@@ -35,6 +35,17 @@ function prependImport(filePath, importLine, dryRun) {
35
35
  }
36
36
  return filePath;
37
37
  }
38
+ function removeImport(filePath, importLine, dryRun) {
39
+ const content = readFileSync(filePath, "utf-8");
40
+ if (!content.includes(importLine)) {
41
+ return null;
42
+ }
43
+ const newContent = content.split("\n").filter((line) => line !== importLine).join("\n");
44
+ if (!dryRun) {
45
+ writeFileSync(filePath, newContent, "utf-8");
46
+ }
47
+ return filePath;
48
+ }
38
49
  function patchViteConfig(cwd, dryRun) {
39
50
  const configPath = findFile(
40
51
  cwd,
@@ -144,6 +155,121 @@ function patchCRA(cwd, dryRun) {
144
155
  );
145
156
  return result ? [result] : [];
146
157
  }
158
+ function unpatchViteConfig(cwd, dryRun) {
159
+ const configPath = findFile(
160
+ cwd,
161
+ "vite.config.ts",
162
+ "vite.config.js",
163
+ "vite.config.mts",
164
+ "vite.config.mjs"
165
+ );
166
+ if (!configPath) return [];
167
+ const content = readFileSync(configPath, "utf-8");
168
+ if (!content.includes("agent-react-devtools")) return [];
169
+ let newContent = content.split("\n").filter((line) => line !== "import { reactDevtools } from 'agent-react-devtools/vite';").join("\n");
170
+ newContent = newContent.replace(/\s*reactDevtools\(\),?/g, "");
171
+ if (!dryRun) {
172
+ writeFileSync(configPath, newContent, "utf-8");
173
+ }
174
+ return [configPath];
175
+ }
176
+ function unpatchNextJs(cwd, dryRun) {
177
+ const modified = [];
178
+ const layoutPath = findFile(
179
+ cwd,
180
+ "app/layout.tsx",
181
+ "app/layout.jsx",
182
+ "app/layout.js",
183
+ "src/app/layout.tsx",
184
+ "src/app/layout.jsx",
185
+ "src/app/layout.js"
186
+ );
187
+ if (layoutPath) {
188
+ const devtoolsPath = join(dirname(layoutPath), "devtools.ts");
189
+ let devtoolsIsOurs = false;
190
+ if (existsSync(devtoolsPath)) {
191
+ const content = readFileSync(devtoolsPath, "utf-8");
192
+ if (content.includes("agent-react-devtools")) {
193
+ devtoolsIsOurs = true;
194
+ if (!dryRun) {
195
+ unlinkSync(devtoolsPath);
196
+ }
197
+ modified.push(devtoolsPath);
198
+ }
199
+ }
200
+ if (devtoolsIsOurs) {
201
+ const layoutContent = readFileSync(layoutPath, "utf-8");
202
+ const newContent = layoutContent.split("\n").filter((line) => line !== "import './devtools';").join("\n");
203
+ if (newContent !== layoutContent) {
204
+ if (!dryRun) {
205
+ writeFileSync(layoutPath, newContent, "utf-8");
206
+ }
207
+ modified.push(layoutPath);
208
+ }
209
+ }
210
+ }
211
+ const pagesEntry = findFile(
212
+ cwd,
213
+ "pages/_app.tsx",
214
+ "pages/_app.jsx",
215
+ "pages/_app.js",
216
+ "src/pages/_app.tsx",
217
+ "src/pages/_app.jsx",
218
+ "src/pages/_app.js"
219
+ );
220
+ if (pagesEntry) {
221
+ const result = removeImport(pagesEntry, "import 'agent-react-devtools/connect';", dryRun);
222
+ if (result) modified.push(result);
223
+ }
224
+ return modified;
225
+ }
226
+ function unpatchCRA(cwd, dryRun) {
227
+ const entryPath = findFile(
228
+ cwd,
229
+ "src/index.tsx",
230
+ "src/index.jsx",
231
+ "src/index.js"
232
+ );
233
+ if (!entryPath) return [];
234
+ const result = removeImport(entryPath, "import 'agent-react-devtools/connect';", dryRun);
235
+ return result ? [result] : [];
236
+ }
237
+ async function runUninit(cwd, dryRun) {
238
+ const framework = detectFramework(cwd);
239
+ console.log(`Detected framework: ${framework}`);
240
+ if (framework === "unknown") {
241
+ console.log("\nCould not detect framework. Manual removal required:");
242
+ console.log(" Remove any `import 'agent-react-devtools/connect'` lines");
243
+ return;
244
+ }
245
+ if (framework === "react-native") {
246
+ console.log("\nReact Native detected - no code changes were made by init.");
247
+ return;
248
+ }
249
+ let modified = [];
250
+ if (dryRun) {
251
+ console.log("\n[dry-run] Would modify:");
252
+ }
253
+ switch (framework) {
254
+ case "vite":
255
+ modified = unpatchViteConfig(cwd, dryRun);
256
+ break;
257
+ case "nextjs":
258
+ modified = unpatchNextJs(cwd, dryRun);
259
+ break;
260
+ case "cra":
261
+ modified = unpatchCRA(cwd, dryRun);
262
+ break;
263
+ }
264
+ if (modified.length === 0) {
265
+ console.log(" No changes needed (not configured or already removed)");
266
+ return;
267
+ }
268
+ for (const f of modified) {
269
+ console.log(` ${dryRun ? "[dry-run] " : ""}Reverted: ${f}`);
270
+ }
271
+ console.log("\nDone! agent-react-devtools configuration has been removed.");
272
+ }
147
273
  async function runInit(cwd, dryRun) {
148
274
  const framework = detectFramework(cwd);
149
275
  console.log(`Detected framework: ${framework}`);
@@ -197,6 +323,7 @@ async function runInit(cwd, dryRun) {
197
323
  }
198
324
  export {
199
325
  detectFramework,
200
- runInit
326
+ runInit,
327
+ runUninit
201
328
  };
202
- //# sourceMappingURL=init-7IJ2VXT7.js.map
329
+ //# sourceMappingURL=init-TDSG2Z3U.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/init.ts"],"sourcesContent":["import { readFileSync, writeFileSync, existsSync, unlinkSync } from 'node:fs';\nimport { join, dirname } from 'node:path';\n\ntype Framework = 'vite' | 'nextjs' | 'cra' | 'react-native' | 'unknown';\n\nexport function detectFramework(cwd: string): Framework {\n const pkgPath = join(cwd, 'package.json');\n if (!existsSync(pkgPath)) return 'unknown';\n\n const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8'));\n const allDeps = {\n ...pkg.dependencies,\n ...pkg.devDependencies,\n };\n\n if (allDeps['@vitejs/plugin-react']) return 'vite';\n if (allDeps['next']) return 'nextjs';\n if (allDeps['react-scripts']) return 'cra';\n if (allDeps['react-native']) return 'react-native';\n return 'unknown';\n}\n\nfunction findFile(cwd: string, ...candidates: string[]): string | null {\n for (const c of candidates) {\n const p = join(cwd, c);\n if (existsSync(p)) return p;\n }\n return null;\n}\n\nfunction prependImport(filePath: string, importLine: string, dryRun: boolean): string | null {\n const content = readFileSync(filePath, 'utf-8');\n if (content.includes(importLine) || content.includes('agent-react-devtools')) {\n return null; // already configured\n }\n const newContent = importLine + '\\n' + content;\n if (!dryRun) {\n writeFileSync(filePath, newContent, 'utf-8');\n }\n return filePath;\n}\n\nfunction removeImport(filePath: string, importLine: string, dryRun: boolean): string | null {\n const content = readFileSync(filePath, 'utf-8');\n if (!content.includes(importLine)) {\n return null; // not configured\n }\n const newContent = content\n .split('\\n')\n .filter((line) => line !== importLine)\n .join('\\n');\n if (!dryRun) {\n writeFileSync(filePath, newContent, 'utf-8');\n }\n return filePath;\n}\n\nfunction patchViteConfig(cwd: string, dryRun: boolean): string[] {\n const configPath = findFile(\n cwd,\n 'vite.config.ts',\n 'vite.config.js',\n 'vite.config.mts',\n 'vite.config.mjs',\n );\n if (!configPath) {\n console.error(' Could not find vite.config.{ts,js}');\n return [];\n }\n\n const content = readFileSync(configPath, 'utf-8');\n if (content.includes('agent-react-devtools')) {\n console.log(' Already configured');\n return [];\n }\n\n const importLine = \"import { reactDevtools } from 'agent-react-devtools/vite';\";\n let newContent: string;\n\n // Add import after the last existing import\n const lastImportIdx = content.lastIndexOf('\\nimport ');\n if (lastImportIdx !== -1) {\n const endOfLine = content.indexOf('\\n', lastImportIdx + 1);\n newContent =\n content.slice(0, endOfLine + 1) +\n importLine +\n '\\n' +\n content.slice(endOfLine + 1);\n } else {\n newContent = importLine + '\\n' + content;\n }\n\n // Add reactDevtools() to plugins array\n const pluginsMatch = newContent.match(/plugins\\s*:\\s*\\[/);\n if (pluginsMatch && pluginsMatch.index != null) {\n const insertPos = pluginsMatch.index + pluginsMatch[0].length;\n newContent =\n newContent.slice(0, insertPos) +\n '\\n reactDevtools(),' +\n newContent.slice(insertPos);\n } else {\n console.error(' Could not find plugins array in vite config');\n return [];\n }\n\n if (!dryRun) {\n writeFileSync(configPath, newContent, 'utf-8');\n }\n\n return [configPath];\n}\n\nfunction patchNextJs(cwd: string, dryRun: boolean): string[] {\n // Try Pages Router first — _app is always client-side\n const pagesEntry = findFile(\n cwd,\n 'pages/_app.tsx',\n 'pages/_app.jsx',\n 'pages/_app.js',\n 'src/pages/_app.tsx',\n 'src/pages/_app.jsx',\n 'src/pages/_app.js',\n );\n if (pagesEntry) {\n const result = prependImport(\n pagesEntry,\n \"import 'agent-react-devtools/connect';\",\n dryRun,\n );\n return result ? [result] : [];\n }\n\n // App Router — layout is a Server Component, so we need a 'use client' wrapper\n const layoutPath = findFile(\n cwd,\n 'app/layout.tsx',\n 'app/layout.jsx',\n 'app/layout.js',\n 'src/app/layout.tsx',\n 'src/app/layout.jsx',\n 'src/app/layout.js',\n );\n if (!layoutPath) {\n console.error(' Could not find app/layout.tsx or pages/_app.tsx');\n return [];\n }\n\n const devtoolsPath = join(dirname(layoutPath), 'devtools.ts');\n const modified: string[] = [];\n\n // Create the 'use client' wrapper file\n if (existsSync(devtoolsPath)) {\n const existing = readFileSync(devtoolsPath, 'utf-8');\n if (!existing.includes('agent-react-devtools')) {\n console.error(` ${devtoolsPath} already exists with different content`);\n return [];\n }\n } else {\n const wrapper = \"'use client';\\nimport 'agent-react-devtools/connect';\\n\";\n if (!dryRun) {\n writeFileSync(devtoolsPath, wrapper, 'utf-8');\n }\n modified.push(devtoolsPath);\n }\n\n // Prepend import of the wrapper to the layout\n const result = prependImport(layoutPath, \"import './devtools';\", dryRun);\n if (result) {\n modified.push(result);\n }\n\n return modified;\n}\n\nfunction patchCRA(cwd: string, dryRun: boolean): string[] {\n const entryPath = findFile(\n cwd,\n 'src/index.tsx',\n 'src/index.jsx',\n 'src/index.js',\n );\n if (!entryPath) {\n console.error(' Could not find src/index.tsx');\n return [];\n }\n\n const result = prependImport(\n entryPath,\n \"import 'agent-react-devtools/connect';\",\n dryRun,\n );\n return result ? [result] : [];\n}\n\nfunction unpatchViteConfig(cwd: string, dryRun: boolean): string[] {\n const configPath = findFile(\n cwd,\n 'vite.config.ts',\n 'vite.config.js',\n 'vite.config.mts',\n 'vite.config.mjs',\n );\n if (!configPath) return [];\n\n const content = readFileSync(configPath, 'utf-8');\n if (!content.includes('agent-react-devtools')) return [];\n\n let newContent = content\n .split('\\n')\n .filter((line) => line !== \"import { reactDevtools } from 'agent-react-devtools/vite';\")\n .join('\\n');\n\n // Remove reactDevtools() call from plugins array (with optional trailing comma)\n newContent = newContent.replace(/\\s*reactDevtools\\(\\),?/g, '');\n\n if (!dryRun) {\n writeFileSync(configPath, newContent, 'utf-8');\n }\n return [configPath];\n}\n\nfunction unpatchNextJs(cwd: string, dryRun: boolean): string[] {\n const modified: string[] = [];\n\n // Remove the devtools.ts wrapper file if it exists and is ours\n const layoutPath = findFile(\n cwd,\n 'app/layout.tsx',\n 'app/layout.jsx',\n 'app/layout.js',\n 'src/app/layout.tsx',\n 'src/app/layout.jsx',\n 'src/app/layout.js',\n );\n\n if (layoutPath) {\n const devtoolsPath = join(dirname(layoutPath), 'devtools.ts');\n let devtoolsIsOurs = false;\n if (existsSync(devtoolsPath)) {\n const content = readFileSync(devtoolsPath, 'utf-8');\n if (content.includes('agent-react-devtools')) {\n devtoolsIsOurs = true;\n if (!dryRun) {\n unlinkSync(devtoolsPath);\n }\n modified.push(devtoolsPath);\n }\n }\n\n // Only remove the layout import if we confirmed devtools.ts was created by us,\n // to avoid corrupting a pre-existing import './devtools' that we don't own.\n if (devtoolsIsOurs) {\n const layoutContent = readFileSync(layoutPath, 'utf-8');\n const newContent = layoutContent\n .split('\\n')\n .filter((line) => line !== \"import './devtools';\")\n .join('\\n');\n if (newContent !== layoutContent) {\n if (!dryRun) {\n writeFileSync(layoutPath, newContent, 'utf-8');\n }\n modified.push(layoutPath);\n }\n }\n }\n\n // Also check Pages Router\n const pagesEntry = findFile(\n cwd,\n 'pages/_app.tsx',\n 'pages/_app.jsx',\n 'pages/_app.js',\n 'src/pages/_app.tsx',\n 'src/pages/_app.jsx',\n 'src/pages/_app.js',\n );\n if (pagesEntry) {\n const result = removeImport(pagesEntry, \"import 'agent-react-devtools/connect';\", dryRun);\n if (result) modified.push(result);\n }\n\n return modified;\n}\n\nfunction unpatchCRA(cwd: string, dryRun: boolean): string[] {\n const entryPath = findFile(\n cwd,\n 'src/index.tsx',\n 'src/index.jsx',\n 'src/index.js',\n );\n if (!entryPath) return [];\n\n const result = removeImport(entryPath, \"import 'agent-react-devtools/connect';\", dryRun);\n return result ? [result] : [];\n}\n\nexport async function runUninit(\n cwd: string,\n dryRun: boolean,\n): Promise<void> {\n const framework = detectFramework(cwd);\n\n console.log(`Detected framework: ${framework}`);\n\n if (framework === 'unknown') {\n console.log('\\nCould not detect framework. Manual removal required:');\n console.log(\" Remove any `import 'agent-react-devtools/connect'` lines\");\n return;\n }\n\n if (framework === 'react-native') {\n console.log('\\nReact Native detected - no code changes were made by init.');\n return;\n }\n\n let modified: string[] = [];\n\n if (dryRun) {\n console.log('\\n[dry-run] Would modify:');\n }\n\n switch (framework) {\n case 'vite':\n modified = unpatchViteConfig(cwd, dryRun);\n break;\n case 'nextjs':\n modified = unpatchNextJs(cwd, dryRun);\n break;\n case 'cra':\n modified = unpatchCRA(cwd, dryRun);\n break;\n }\n\n if (modified.length === 0) {\n console.log(' No changes needed (not configured or already removed)');\n return;\n }\n\n for (const f of modified) {\n console.log(` ${dryRun ? '[dry-run] ' : ''}Reverted: ${f}`);\n }\n\n console.log('\\nDone! agent-react-devtools configuration has been removed.');\n}\n\nexport async function runInit(\n cwd: string,\n dryRun: boolean,\n): Promise<void> {\n const framework = detectFramework(cwd);\n\n console.log(`Detected framework: ${framework}`);\n\n if (framework === 'unknown') {\n console.log('\\nCould not detect framework. Manual setup required:');\n console.log(\" import 'agent-react-devtools/connect';\");\n console.log(' // Must be imported before React loads');\n return;\n }\n\n if (framework === 'react-native') {\n console.log('\\nReact Native detected — no code changes needed!');\n console.log('React Native apps connect to DevTools automatically.\\n');\n console.log('Next steps:');\n console.log(' 1. Start the daemon: agent-react-devtools start');\n console.log(' 2. Start your app: npx react-native start');\n console.log('\\nFor physical devices:');\n console.log(' adb reverse tcp:8097 tcp:8097');\n console.log('\\nFor Expo:');\n console.log(' The connection works automatically with Expo dev client.');\n console.log('\\nCustom port:');\n console.log(' Set REACT_DEVTOOLS_PORT=<port> environment variable');\n return;\n }\n\n let modified: string[] = [];\n\n if (dryRun) {\n console.log('\\n[dry-run] Would modify:');\n }\n\n switch (framework) {\n case 'vite':\n modified = patchViteConfig(cwd, dryRun);\n break;\n case 'nextjs':\n modified = patchNextJs(cwd, dryRun);\n break;\n case 'cra':\n modified = patchCRA(cwd, dryRun);\n break;\n }\n\n if (modified.length === 0) {\n console.log(' No changes needed (already configured or could not find entry files)');\n return;\n }\n\n for (const f of modified) {\n console.log(` ${dryRun ? '[dry-run] ' : ''}Modified: ${f}`);\n }\n\n console.log('\\nNext steps:');\n console.log(' 1. Install: npm install -D agent-react-devtools react-devtools-core');\n console.log(' 2. Start daemon: agent-react-devtools start');\n console.log(' 3. Start dev server and open your app');\n console.log(' 4. Inspect: agent-react-devtools get tree');\n}\n"],"mappings":"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","names":["result"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agent-react-devtools",
3
- "version": "0.4.0-canary-20260402222730",
3
+ "version": "0.4.0",
4
4
  "description": "CLI tool for AI agents to inspect React component trees and profile performance",
5
5
  "type": "module",
6
6
  "bin": {
@@ -34,7 +34,7 @@
34
34
  },
35
35
  "repository": {
36
36
  "type": "git",
37
- "url": "https://github.com/piotrski/agent-react-devtools.git",
37
+ "url": "https://github.com/callstackincubator/agent-react-devtools.git",
38
38
  "directory": "packages/agent-react-devtools"
39
39
  },
40
40
  "license": "MIT",
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/init.ts"],"sourcesContent":["import { readFileSync, writeFileSync, existsSync } from 'node:fs';\nimport { join, dirname } from 'node:path';\n\ntype Framework = 'vite' | 'nextjs' | 'cra' | 'react-native' | 'unknown';\n\nexport function detectFramework(cwd: string): Framework {\n const pkgPath = join(cwd, 'package.json');\n if (!existsSync(pkgPath)) return 'unknown';\n\n const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8'));\n const allDeps = {\n ...pkg.dependencies,\n ...pkg.devDependencies,\n };\n\n if (allDeps['@vitejs/plugin-react']) return 'vite';\n if (allDeps['next']) return 'nextjs';\n if (allDeps['react-scripts']) return 'cra';\n if (allDeps['react-native']) return 'react-native';\n return 'unknown';\n}\n\nfunction findFile(cwd: string, ...candidates: string[]): string | null {\n for (const c of candidates) {\n const p = join(cwd, c);\n if (existsSync(p)) return p;\n }\n return null;\n}\n\nfunction prependImport(filePath: string, importLine: string, dryRun: boolean): string | null {\n const content = readFileSync(filePath, 'utf-8');\n if (content.includes(importLine) || content.includes('agent-react-devtools')) {\n return null; // already configured\n }\n const newContent = importLine + '\\n' + content;\n if (!dryRun) {\n writeFileSync(filePath, newContent, 'utf-8');\n }\n return filePath;\n}\n\nfunction patchViteConfig(cwd: string, dryRun: boolean): string[] {\n const configPath = findFile(\n cwd,\n 'vite.config.ts',\n 'vite.config.js',\n 'vite.config.mts',\n 'vite.config.mjs',\n );\n if (!configPath) {\n console.error(' Could not find vite.config.{ts,js}');\n return [];\n }\n\n const content = readFileSync(configPath, 'utf-8');\n if (content.includes('agent-react-devtools')) {\n console.log(' Already configured');\n return [];\n }\n\n const importLine = \"import { reactDevtools } from 'agent-react-devtools/vite';\";\n let newContent: string;\n\n // Add import after the last existing import\n const lastImportIdx = content.lastIndexOf('\\nimport ');\n if (lastImportIdx !== -1) {\n const endOfLine = content.indexOf('\\n', lastImportIdx + 1);\n newContent =\n content.slice(0, endOfLine + 1) +\n importLine +\n '\\n' +\n content.slice(endOfLine + 1);\n } else {\n newContent = importLine + '\\n' + content;\n }\n\n // Add reactDevtools() to plugins array\n const pluginsMatch = newContent.match(/plugins\\s*:\\s*\\[/);\n if (pluginsMatch && pluginsMatch.index != null) {\n const insertPos = pluginsMatch.index + pluginsMatch[0].length;\n newContent =\n newContent.slice(0, insertPos) +\n '\\n reactDevtools(),' +\n newContent.slice(insertPos);\n } else {\n console.error(' Could not find plugins array in vite config');\n return [];\n }\n\n if (!dryRun) {\n writeFileSync(configPath, newContent, 'utf-8');\n }\n\n return [configPath];\n}\n\nfunction patchNextJs(cwd: string, dryRun: boolean): string[] {\n // Try Pages Router first — _app is always client-side\n const pagesEntry = findFile(\n cwd,\n 'pages/_app.tsx',\n 'pages/_app.jsx',\n 'pages/_app.js',\n 'src/pages/_app.tsx',\n 'src/pages/_app.jsx',\n 'src/pages/_app.js',\n );\n if (pagesEntry) {\n const result = prependImport(\n pagesEntry,\n \"import 'agent-react-devtools/connect';\",\n dryRun,\n );\n return result ? [result] : [];\n }\n\n // App Router — layout is a Server Component, so we need a 'use client' wrapper\n const layoutPath = findFile(\n cwd,\n 'app/layout.tsx',\n 'app/layout.jsx',\n 'app/layout.js',\n 'src/app/layout.tsx',\n 'src/app/layout.jsx',\n 'src/app/layout.js',\n );\n if (!layoutPath) {\n console.error(' Could not find app/layout.tsx or pages/_app.tsx');\n return [];\n }\n\n const devtoolsPath = join(dirname(layoutPath), 'devtools.ts');\n const modified: string[] = [];\n\n // Create the 'use client' wrapper file\n if (existsSync(devtoolsPath)) {\n const existing = readFileSync(devtoolsPath, 'utf-8');\n if (!existing.includes('agent-react-devtools')) {\n console.error(` ${devtoolsPath} already exists with different content`);\n return [];\n }\n } else {\n const wrapper = \"'use client';\\nimport 'agent-react-devtools/connect';\\n\";\n if (!dryRun) {\n writeFileSync(devtoolsPath, wrapper, 'utf-8');\n }\n modified.push(devtoolsPath);\n }\n\n // Prepend import of the wrapper to the layout\n const result = prependImport(layoutPath, \"import './devtools';\", dryRun);\n if (result) {\n modified.push(result);\n }\n\n return modified;\n}\n\nfunction patchCRA(cwd: string, dryRun: boolean): string[] {\n const entryPath = findFile(\n cwd,\n 'src/index.tsx',\n 'src/index.jsx',\n 'src/index.js',\n );\n if (!entryPath) {\n console.error(' Could not find src/index.tsx');\n return [];\n }\n\n const result = prependImport(\n entryPath,\n \"import 'agent-react-devtools/connect';\",\n dryRun,\n );\n return result ? [result] : [];\n}\n\nexport async function runInit(\n cwd: string,\n dryRun: boolean,\n): Promise<void> {\n const framework = detectFramework(cwd);\n\n console.log(`Detected framework: ${framework}`);\n\n if (framework === 'unknown') {\n console.log('\\nCould not detect framework. Manual setup required:');\n console.log(\" import 'agent-react-devtools/connect';\");\n console.log(' // Must be imported before React loads');\n return;\n }\n\n if (framework === 'react-native') {\n console.log('\\nReact Native detected — no code changes needed!');\n console.log('React Native apps connect to DevTools automatically.\\n');\n console.log('Next steps:');\n console.log(' 1. Start the daemon: agent-react-devtools start');\n console.log(' 2. Start your app: npx react-native start');\n console.log('\\nFor physical devices:');\n console.log(' adb reverse tcp:8097 tcp:8097');\n console.log('\\nFor Expo:');\n console.log(' The connection works automatically with Expo dev client.');\n console.log('\\nCustom port:');\n console.log(' Set REACT_DEVTOOLS_PORT=<port> environment variable');\n return;\n }\n\n let modified: string[] = [];\n\n if (dryRun) {\n console.log('\\n[dry-run] Would modify:');\n }\n\n switch (framework) {\n case 'vite':\n modified = patchViteConfig(cwd, dryRun);\n break;\n case 'nextjs':\n modified = patchNextJs(cwd, dryRun);\n break;\n case 'cra':\n modified = patchCRA(cwd, dryRun);\n break;\n }\n\n if (modified.length === 0) {\n console.log(' No changes needed (already configured or could not find entry files)');\n return;\n }\n\n for (const f of modified) {\n console.log(` ${dryRun ? '[dry-run] ' : ''}Modified: ${f}`);\n }\n\n console.log('\\nNext steps:');\n console.log(' 1. Install: npm install -D agent-react-devtools react-devtools-core');\n console.log(' 2. Start daemon: agent-react-devtools start');\n console.log(' 3. Start dev server and open your app');\n console.log(' 4. Inspect: agent-react-devtools get tree');\n}\n"],"mappings":"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","names":["result"]}