react-doctor 0.9.12-dev.6416370 → 0.9.12-dev.79d8007

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (35) hide show
  1. package/dist/{build-section-divider-CGqjqvEG.js → build-section-divider-B5vvlvZH.js} +7 -7
  2. package/dist/{ci-Btu-cSJ3.js → ci-Rb4z9odo.js} +12 -12
  3. package/dist/cli.js +24 -24
  4. package/dist/{design-jjfUYQ1N.js → design-CjYMP7IA.js} +4 -4
  5. package/dist/{exit-gracefully-CptEwS9n.js → exit-gracefully-CU9q_o0f.js} +6 -6
  6. package/dist/{handle-error-CJbBGFWV.js → handle-error-85VFeMW6.js} +5 -5
  7. package/dist/index.js +63 -5
  8. package/dist/{inspect-U8dPI4Kp.js → inspect-htfpLgCT.js} +16 -16
  9. package/dist/{install-zvV1U626.js → install-CIcnJSnv.js} +9 -9
  10. package/dist/{install-doctor-script-B94dXnbf.js → install-doctor-script-Bo0GK6Eq.js} +4 -4
  11. package/dist/{install-github-workflow-PoJBXNVx.js → install-github-workflow-lzQyBKdc.js} +5 -5
  12. package/dist/{install-react-doctor-DhXGNP0G.js → install-react-doctor-OirjfAF9.js} +8 -8
  13. package/dist/{jsx-runtime-rX-uyu-N.js → jsx-runtime-BWPZKNBQ.js} +5 -5
  14. package/dist/{print-branded-header-DrTEqNzr.js → print-branded-header-h9Kvmccv.js} +4 -4
  15. package/dist/project-analysis-worker.js +3 -3
  16. package/dist/{prompt-runtime-scan-url-DEAm_LGd.js → prompt-runtime-scan-url-hzes2VqP.js} +5 -5
  17. package/dist/{read-object-file-DRsmMnhh.js → read-object-file-BesjR6NM.js} +4 -4
  18. package/dist/{record-metric-DKzjNui-.js → record-metric-DlR0XC0i.js} +65 -7
  19. package/dist/{report-error-Dd2AIOrT.js → report-error-BBzkgRQ4.js} +5 -5
  20. package/dist/{report-workflow-result-Be-u7k5t.js → report-workflow-result-BpEkl4QM.js} +5 -5
  21. package/dist/{resolve-scope-B6tfTUJj.js → resolve-scope-CymB97w8.js} +6 -6
  22. package/dist/{rules-CdUg_ovk.js → rules-DWxAtuvn.js} +6 -6
  23. package/dist/{run-scan-app-DqgVw6xW.js → run-scan-app-bw6ZA5Y8.js} +10 -10
  24. package/dist/{runtime-scan-CAZo4uiu.js → runtime-scan-_HfBdRJw.js} +9 -9
  25. package/dist/{sanitize-runtime-url-c17alaBD.js → sanitize-runtime-url-DPEV2PKy.js} +4 -4
  26. package/dist/{scan-BxtXorVy.js → scan-DLEWug0Y.js} +9 -9
  27. package/dist/{should-fail-scan-gate-ifL9wq2M.js → should-fail-scan-gate-phENuxsY.js} +11 -11
  28. package/dist/{should-skip-prompts-C7rPlQd4.js → should-skip-prompts-Dmbzet_Y.js} +4 -4
  29. package/dist/{should-use-tui-BQ2TXU_F.js → should-use-tui-Cke4n9ty.js} +4 -4
  30. package/dist/skills/improve-threejs/SKILL.md +102 -0
  31. package/dist/{telemetry-runtime-DlKLQN-9.js → telemetry-runtime-Bh-S_83U.js} +4 -4
  32. package/dist/{version-DTUTs2Wf.js → version-BNDRU2B8.js} +4 -4
  33. package/dist/{why-DlzjTUh4.js → why-BHIIhUt4.js} +4 -4
  34. package/dist/{with-run-span-BxZf1cDB.js → with-run-span-CAOGHFC5.js} +5 -5
  35. package/package.json +4 -4
@@ -1,5 +1,5 @@
1
1
 
2
- !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="ea6b7ff6-0d96-50d7-b114-197a98204476")}catch(e){}}();
2
+ !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="b7599247-0b42-5c2d-b358-ea54f0e37c2a")}catch(e){}}();
3
3
  import { i as __toESM, n as __exportAll, r as __require, t as __commonJSMin } from "./chunk-ChKA3wi6.js";
4
4
  import { n as require_picomatch$2, t as require_semver } from "./semver-DFtnEmN-.js";
5
5
  import { builtinModules } from "node:module";
@@ -42091,7 +42091,7 @@ const resolveEntries = async (config) => {
42091
42091
  onlyFiles: true
42092
42092
  }));
42093
42093
  }
42094
- if (isEligible && (workspacePackage.isDeclaredWorkspace || !workspaceDiscovery.hasRootLevelWorkspacePatterns)) {
42094
+ if (isEligible) {
42095
42095
  const workspacePackageJsonEntries = await extractPackageJsonEntries(resolve(workspacePackage.directory, "package.json"));
42096
42096
  if (workspacePackageJsonEntries.some((entryPath) => existsSync(entryPath))) {
42097
42097
  workspaceEntries.push(...workspacePackageJsonEntries);
@@ -51897,4 +51897,4 @@ startProjectAnalysisWorker();
51897
51897
  export {};
51898
51898
 
51899
51899
  //# sourceMappingURL=project-analysis-worker.js.map
51900
- //# debugId=ea6b7ff6-0d96-50d7-b114-197a98204476
51900
+ //# debugId=b7599247-0b42-5c2d-b358-ea54f0e37c2a
@@ -1,8 +1,8 @@
1
1
 
2
- !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="cd347040-5048-5fa9-b2fc-a7bbba4cb1b2")}catch(e){}}();
2
+ !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="5964c65a-c1f8-5558-a032-9271e42cecbc")}catch(e){}}();
3
3
  import { t as unrefStdin } from "./unref-stdin-BKT_s38a.js";
4
- import { a as RUNTIME_SCAN_LOCAL_DEV_PORTS, t as sanitizeRuntimeUrl, u as RUNTIME_SCAN_MAX_STRING_LENGTH } from "./sanitize-runtime-url-c17alaBD.js";
5
- import { a as useExitOnCtrlC, c as Spinner, d as useInput, h as Box, i as import_react, m as Text, n as registerMountedTuiRenderer, o as terminalSymbols, p as render, r as useStdoutDimensions, s as isPrintableInput, t as require_jsx_runtime } from "./jsx-runtime-rX-uyu-N.js";
4
+ import { a as RUNTIME_SCAN_LOCAL_DEV_PORTS, t as sanitizeRuntimeUrl, u as RUNTIME_SCAN_MAX_STRING_LENGTH } from "./sanitize-runtime-url-DPEV2PKy.js";
5
+ import { a as useExitOnCtrlC, c as Spinner, d as useInput, h as Box, i as import_react, m as Text, n as registerMountedTuiRenderer, o as terminalSymbols, p as render, r as useStdoutDimensions, s as isPrintableInput, t as require_jsx_runtime } from "./jsx-runtime-BWPZKNBQ.js";
6
6
  import * as http from "node:http";
7
7
  //#region src/cli/runtime-scan/detect-local-runtime-urls.ts
8
8
  const LOCAL_HTTP_HOSTS = ["127.0.0.1", "::1"];
@@ -236,5 +236,5 @@ const promptRuntimeScanUrl = () => new Promise((resolve) => {
236
236
  //#endregion
237
237
  export { promptRuntimeScanUrl };
238
238
 
239
- //# sourceMappingURL=prompt-runtime-scan-url-DEAm_LGd.js.map
240
- //# debugId=cd347040-5048-5fa9-b2fc-a7bbba4cb1b2
239
+ //# sourceMappingURL=prompt-runtime-scan-url-hzes2VqP.js.map
240
+ //# debugId=5964c65a-c1f8-5558-a032-9271e42cecbc
@@ -1,6 +1,6 @@
1
1
 
2
- !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="d5ed2314-6a4b-543b-bd6f-c4f80fdbc443")}catch(e){}}();
3
- import { Sr as isPlainObject } from "./record-metric-DKzjNui-.js";
2
+ !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="ca8964c1-e15a-5e67-834a-d3e87706b3e1")}catch(e){}}();
3
+ import { Sr as isPlainObject } from "./record-metric-DlR0XC0i.js";
4
4
  import * as fs$1 from "node:fs";
5
5
  import { parseJSON5 } from "confbox";
6
6
  //#region src/cli/utils/read-object-file.ts
@@ -20,5 +20,5 @@ const readObjectFile = (filePath) => {
20
20
  //#endregion
21
21
  export { readObjectFile as t };
22
22
 
23
- //# sourceMappingURL=read-object-file-DRsmMnhh.js.map
24
- //# debugId=d5ed2314-6a4b-543b-bd6f-c4f80fdbc443
23
+ //# sourceMappingURL=read-object-file-BesjR6NM.js.map
24
+ //# debugId=ca8964c1-e15a-5e67-834a-d3e87706b3e1
@@ -1,5 +1,5 @@
1
1
 
2
- !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="b30e31d3-e95b-5e95-9c2d-09c22201c049")}catch(e){}}();
2
+ !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="a95a8f1f-31fd-5404-ae11-33b8ee668bdc")}catch(e){}}();
3
3
  import { i as __toESM$1, r as __require, t as __commonJSMin$1 } from "./chunk-ChKA3wi6.js";
4
4
  import { n as require_picomatch, t as require_semver } from "./semver-DFtnEmN-.js";
5
5
  import { createRequire } from "node:module";
@@ -71067,7 +71067,11 @@ var Git = class Git extends Service()("react-doctor/Git") {
71067
71067
  const symref = yield* runGit(directory, ["symbolic-ref", "refs/remotes/origin/HEAD"]);
71068
71068
  if (symref.status === 0) {
71069
71069
  const trimmed = trimOrNull(symref.stdout);
71070
- if (trimmed !== null) return trimmed.replace("refs/remotes/origin/", "");
71070
+ if (trimmed !== null) {
71071
+ const branchName = trimmed.replace("refs/remotes/origin/", "");
71072
+ const remoteBranch = `origin/${branchName}`;
71073
+ return (yield* branchExists(directory, remoteBranch)) ? remoteBranch : branchName;
71074
+ }
71071
71075
  }
71072
71076
  const candidates = yield* runGit(directory, [
71073
71077
  "for-each-ref",
@@ -71075,7 +71079,10 @@ var Git = class Git extends Service()("react-doctor/Git") {
71075
71079
  ...DEFAULT_BRANCH_CANDIDATES.map((candidate) => `refs/heads/${candidate}`)
71076
71080
  ]);
71077
71081
  if (candidates.status !== 0) return null;
71078
- return trimOrNull(candidates.stdout.split("\n")[0] ?? "");
71082
+ const localBranch = trimOrNull(candidates.stdout.split("\n")[0] ?? "");
71083
+ if (localBranch === null) return null;
71084
+ const remoteBranch = `origin/${localBranch}`;
71085
+ return (yield* branchExists(directory, remoteBranch)) ? remoteBranch : localBranch;
71079
71086
  }).pipe(withSpan("Git.defaultBranch"));
71080
71087
  const branchExists = (directory, branch) => runGit(directory, [
71081
71088
  "rev-parse",
@@ -73098,6 +73105,46 @@ const buildProfiledNodeArguments = (input) => [
73098
73105
  ...input.heapProfileDirectory ? ["--heap-prof", `--heap-prof-dir=${input.heapProfileDirectory}`] : [],
73099
73106
  ...input.argumentsList
73100
73107
  ];
73108
+ const buildOxlintTimingArguments = (argumentsList) => {
73109
+ const timingArguments = [...argumentsList];
73110
+ const formatFlagIndex = timingArguments.indexOf("--format");
73111
+ if (formatFlagIndex === -1 || formatFlagIndex + 1 >= timingArguments.length) throw new Error("Oxlint timing arguments require a --format value");
73112
+ timingArguments[formatFlagIndex + 1] = "default";
73113
+ timingArguments.push("--debug", "timings", "--quiet");
73114
+ return timingArguments;
73115
+ };
73116
+ const captureOxlintRuleTimings = (input) => new Promise((resolve, reject) => {
73117
+ const timingEnvironment = { ...input.environment };
73118
+ timingEnvironment.REACT_DOCTOR_RULE_TIMINGS_DIR = void 0;
73119
+ const timingChild = spawn(input.nodeBinaryPath, buildOxlintTimingArguments(input.argumentsList), {
73120
+ cwd: input.rootDirectory,
73121
+ env: timingEnvironment,
73122
+ stdio: [
73123
+ "ignore",
73124
+ "pipe",
73125
+ "pipe"
73126
+ ]
73127
+ });
73128
+ const stdoutBuffers = [];
73129
+ const stderrBuffers = [];
73130
+ timingChild.stdout.on("data", (buffer) => stdoutBuffers.push(buffer));
73131
+ timingChild.stderr.on("data", (buffer) => stderrBuffers.push(buffer));
73132
+ timingChild.on("error", reject);
73133
+ timingChild.on("close", (_code, signal) => {
73134
+ if (signal) {
73135
+ reject(/* @__PURE__ */ new Error(`Oxlint timing pass was killed by ${signal}`));
73136
+ return;
73137
+ }
73138
+ const timingOutput = `${Buffer.concat(stdoutBuffers).toString("utf8")}\n${Buffer.concat(stderrBuffers).toString("utf8")}`;
73139
+ if (!timingOutput.includes("Rule timings:")) {
73140
+ resolve();
73141
+ return;
73142
+ }
73143
+ fs$1$3.mkdirSync(input.timingDirectory, { recursive: true });
73144
+ fs$1$3.writeFileSync(path$1$1.join(input.timingDirectory, `oxlint-${timingChild.pid ?? process.pid}.timings.txt`), timingOutput);
73145
+ resolve();
73146
+ });
73147
+ });
73101
73148
  const lowerChildProcessPriority = (processId) => {
73102
73149
  if (processId === void 0) return;
73103
73150
  try {
@@ -73219,7 +73266,18 @@ const spawnOxlint = (args, rootDirectory, nodeBinaryPath, spawnTimeoutMs = OXLIN
73219
73266
  return;
73220
73267
  }
73221
73268
  }
73222
- resolve(output);
73269
+ const timingDirectory = SANITIZED_ENV.REACT_DOCTOR_OXLINT_TIMINGS_DIR;
73270
+ if (timingDirectory === void 0) {
73271
+ resolve(output);
73272
+ return;
73273
+ }
73274
+ captureOxlintRuleTimings({
73275
+ argumentsList: args,
73276
+ environment: SANITIZED_ENV,
73277
+ nodeBinaryPath,
73278
+ rootDirectory,
73279
+ timingDirectory
73280
+ }).then(() => resolve(output), reject);
73223
73281
  });
73224
73282
  });
73225
73283
  const PARALLELISM_EXHAUSTION_ERROR_CODES = new Set([
@@ -76543,7 +76601,7 @@ const makeNoopConsole = () => ({
76543
76601
  });
76544
76602
  //#endregion
76545
76603
  //#region src/cli/utils/version.ts
76546
- const VERSION = "0.9.12-dev.6416370";
76604
+ const VERSION = "0.9.12-dev.79d8007";
76547
76605
  //#endregion
76548
76606
  //#region src/cli/utils/json-mode.ts
76549
76607
  let context = null;
@@ -76887,5 +76945,5 @@ const recordDistribution = (name, value, options = {}) => {
76887
76945
  //#endregion
76888
76946
  export { Linter as $, CANONICAL_DISCORD_URL as $n, layerObservability as $t, SCAN_RESULT_CACHE_FILENAME as A, gen as An, discoverSupportedSubprojects as At, isNonInteractiveEnvironment as B, sync as Bn, getDiffInfo as Bt, CI_TRUST_COMPANIES as C, error as Cn, messageFromUnknown as Cr, collectSourceFileCountsByDirectory as Ct, NANOSECONDS_PER_MILLISECOND as D, Diagnostic as Dn, createNodeReadFileLinesSync as Dt, MINIMUM_VTE_VERSION_FOR_HYPERLINKS as E, warn$1 as En, countOptInProjectRuleSelections as Et, STAGED_FILES_TEMP_DIR_PREFIX as F, provide as Fn, formatErrorChain as Ft, isCiEnvironment as G, provide$2 as Gn, hashFileContents as Gt, isDebugFlagEnabled as H, void_ as Hn, groupBy as Ht, STAGED_SNAPSHOT_ADDITIONAL_CONFIG_FILENAMES as I, provideContext as In, formatReactDoctorError as It, Config as J, makeUnsafe$5 as Jn, isPathInsideDirectory as Jt, isCiOrCodingAgentEnvironment as K, succeed$3 as Kn, highlighter as Kt, TUI_REPORT_COMPACT_MAX_ROWS as L, provideService as Ln, getBaselineDiffPlan as Lt, SENTRY_DSN as M, map$3 as Mn, filterPathsOutsideDirectories as Mt, SENTRY_FLUSH_TIMEOUT_MS as N, orElseSucceed as Nn, filterSourceFiles as Nt, REACT_DOCTOR_CONFIG_PROJECT_NAME as O, decodeUnknownSync as On, createOxlintSpawnSlots as Ot, SENTRY_RELEASE_PREFIX as P, promise as Pn, findLegacyConfig as Pt, LintPartialFailures as Q, AXIOM_DEFAULT_DOMAIN as Qn, isScanComplete as Qt, TUI_REPORT_DETAIL_WIDTH_FRACTION as R, runPromise as Rn, getChangedLineRanges as Rt, BASELINE_FILES_TEMP_DIR_PREFIX as S, Console as Sn, isPlainObject as Sr, clearConfigCache as St, METRIC as T, log as Tn, computeDiagnosticDelta as Tt, ACTION_INPUT_ENVIRONMENT_VARIABLES as U, buildWithScope as Un, hasPublishedFixRecipe as Ut, isGitHookEnvironment as V, try_ as Vn, getEquivalentRuleKeys as Vt, detectRunnerOs as W, mergeAll$1 as Wn, hasSupportedFrameworkOrLibrary as Wt, Git as X, void_$1 as Xn, isReactDoctorError as Xt, Files as Y, fail$5 as Yn, isProjectDiscoveryError as Yt, LEGACY_CONFIG_FILENAME as Z, ParentSpan as Zn, isSameRuleKey as Zt, VERSION as _, shouldUseMaintainabilityLayer as _n, STAGED_FILES_PROJECT_CONFIG_FILENAMES as _r, buildRuleSeverityControls as _t, isEnvFlagEnabled as a, materializeSourceTree as an, DIAGNOSTIC_CATEGORY_BUCKETS as ar, Progress as at, AXIOM_METRICS_DATASET as b, validateConfigTypes as bn, isErrnoException as br, canonicalizeUserRuleKey as bt, setSentryProjectInfo as c, resolveGithubActionsScoreMetadata as cn, GITHUB_ACTIONS_SETUP_URL as cr, Score as ct, isJsonModeActive as d, resolveScanConcurrency as dn, JSX_DUPLICATION_SOURCE_FILE_PATTERN as dr, SupplyChain as dt, listSourceFiles as en, CANONICAL_GITHUB_URL as er, Maintainability as et, setJsonReportDirectory as f, resolveScanTarget as fn, JSX_FILE_PATTERN as fr, anonymizeInPlace as ft, writeJsonReport as g, setColorEnabled as gn, SKILL_NAME as gr, buildRuleDocsUrl as gt, writeJsonErrorReport as h, scrubSensitivePaths as hn, SHARE_BASE_URL as hr, buildJsonReport as ht, isTelemetryEnabled as i, mapWithConcurrency as in, CONFIG_SCHEMA_URL as ir, PerFileLintCacheEnabled as it, SCAN_RESULT_CACHE_MAX_HASHED_FILE_SIZE_BYTES as j, makeSpan$1 as jn, filterDiagnosticsForSurface as jt, RUN_GIT_MAX_BUFFER_BYTES as k, make$30 as kn, detectAiTrainingEnvironment as kt, getRunId as l, resolveLintBatchOrdering as ln, GIT_SHOW_MAX_BUFFER_BYTES as lr, SidecarLintCacheEnabled as lt, writeJsonCancellationReport as m, runInspect as mn, OXLINT_NODE_REQUIREMENT as mr, atomicWriteJson as mt, recordDistribution as n, listWorkspacePackages as nn, COMPILER_CLEANUP_BUCKET as nr, OxlintConcurrency as nt, buildSentryScope as o, mergeReactDoctorConfigs as on, DOCS_URL as or, Project as ot, setJsonReportMode as p, restoreLegacyThrow as pn, MILLISECONDS_PER_SECOND as pr, anonymizeText as pt, isCodingAgentEnvironment as q, close as qn, isMonorepoRoot as qt, toSpanAttributes as r, loadConfigWithSource as rn, COMPILER_CLEANUP_RULE_KEYS as rr, OxlintSpawnSlots as rt, buildSentryProjectContext as s, remainingDeadlineBudgetMs as sn, ENTERPRISE_CONTACT_URL as sr, Reporter as st, recordCount as t, listSourceFilesCooperative as tn, CI_URL as tr, NodeResolver as tt, enableJsonMode as u, resolveReactDoctorCacheDir as un, HTML_FILE_PATTERN as ur, StagedFiles as ut, makeNoopConsole as v, summarizeDiagnostics as vn, getCategoryImpact as vr, buildSkippedChecks as vt, GH_DEFAULT_BRANCH_PROBE_TIMEOUT_MS as w, info as wn, toCanonicalPath as wr, computeConfigFingerprint as wt, AXIOM_TRACES_DATASET as x, yieldToEventLoop as xn, isFile as xr, classifyFileContext as xt, AXIOM_INGEST_TOKEN as y, toRelativePath as yn, isDirectory as yr, calculateScore as yt, CliInputError as z, runSync as zn, getDiagnosticRuleIdentity as zt };
76889
76947
 
76890
- //# sourceMappingURL=record-metric-DKzjNui-.js.map
76891
- //# debugId=b30e31d3-e95b-5e95-9c2d-09c22201c049
76948
+ //# sourceMappingURL=record-metric-DlR0XC0i.js.map
76949
+ //# debugId=a95a8f1f-31fd-5404-ae11-33b8ee668bdc
@@ -1,7 +1,7 @@
1
1
 
2
- !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="9a5f42ec-efbd-532f-9817-fe7d8bf1e1cc")}catch(e){}}();
3
- import { N as SENTRY_FLUSH_TIMEOUT_MS, T as METRIC, Xt as isReactDoctorError, l as getRunId, o as buildSentryScope, t as recordCount } from "./record-metric-DKzjNui-.js";
4
- import { n as shutdownTelemetry, r as isExpectedUserError } from "./telemetry-runtime-DlKLQN-9.js";
2
+ !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="c988f4de-2ab8-51a7-9e38-6b6c3a9a2196")}catch(e){}}();
3
+ import { N as SENTRY_FLUSH_TIMEOUT_MS, T as METRIC, Xt as isReactDoctorError, l as getRunId, o as buildSentryScope, t as recordCount } from "./record-metric-DlR0XC0i.js";
4
+ import { n as shutdownTelemetry, r as isExpectedUserError } from "./telemetry-runtime-Bh-S_83U.js";
5
5
  import { r as recordRunTraceId, t as getActiveRunTrace } from "./active-run-trace-dlIZeEvb.js";
6
6
  import * as Sentry from "@sentry/node";
7
7
  //#region src/cli/utils/report-error.ts
@@ -60,5 +60,5 @@ const reportErrorToSentry = async (error) => {
60
60
  //#endregion
61
61
  export { reportErrorToSentry as t };
62
62
 
63
- //# sourceMappingURL=report-error-Dd2AIOrT.js.map
64
- //# debugId=9a5f42ec-efbd-532f-9817-fe7d8bf1e1cc
63
+ //# sourceMappingURL=report-error-BBzkgRQ4.js.map
64
+ //# debugId=c988f4de-2ab8-51a7-9e38-6b6c3a9a2196
@@ -1,7 +1,7 @@
1
1
 
2
- !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="c6f78864-e5ee-5b59-928d-a79d773bcdf9")}catch(e){}}();
3
- import { O as REACT_DOCTOR_CONFIG_PROJECT_NAME, T as METRIC, t as recordCount } from "./record-metric-DKzjNui-.js";
4
- import { u as isCommandAvailable } from "./install-github-workflow-PoJBXNVx.js";
2
+ !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="20af6a9a-64c9-56ad-b079-5518aba9a4e7")}catch(e){}}();
3
+ import { O as REACT_DOCTOR_CONFIG_PROJECT_NAME, T as METRIC, t as recordCount } from "./record-metric-DlR0XC0i.js";
4
+ import { u as isCommandAvailable } from "./install-github-workflow-lzQyBKdc.js";
5
5
  import { spawn } from "node:child_process";
6
6
  import * as path$1 from "node:path";
7
7
  import process$1 from "node:process";
@@ -275,5 +275,5 @@ const reportWorkflowResult = (workflowSpinner, result, projectRoot) => {
275
275
  //#endregion
276
276
  export { recordGate as a, ACTION_UPGRADE_EVENT as c, INSTALL_AGENTS_PREFERENCE_ID as d, ONBOARDING_EVENT as f, detectAvailableAgents as h, readPreference as i, CI_PITCH_EVENT as l, computeDefaultSelectedAgents as m, openUrl as n, runMigrations as o, SETUP_HINT_EVENT as p, isGatePending as r, writePreference as s, reportWorkflowResult as t, HANDOFF_TARGET_PREFERENCE_ID as u };
277
277
 
278
- //# sourceMappingURL=report-workflow-result-Be-u7k5t.js.map
279
- //# debugId=c6f78864-e5ee-5b59-928d-a79d773bcdf9
278
+ //# sourceMappingURL=report-workflow-result-BpEkl4QM.js.map
279
+ //# debugId=20af6a9a-64c9-56ad-b079-5518aba9a4e7
@@ -1,8 +1,8 @@
1
1
 
2
- !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="a78da4b8-413a-541d-8a27-5312819006dc")}catch(e){}}();
3
- import { Jt as isPathInsideDirectory, Nt as filterSourceFiles, wr as toCanonicalPath } from "./record-metric-DKzjNui-.js";
4
- import { N as cliLogger } from "./install-doctor-script-B94dXnbf.js";
5
- import { d as detectDefaultBranch, f as runCommand, l as prompts, u as isCommandAvailable } from "./install-github-workflow-PoJBXNVx.js";
2
+ !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="0dfaa4aa-f5a3-5173-b1bd-fdb3a21fdd70")}catch(e){}}();
3
+ import { Jt as isPathInsideDirectory, Nt as filterSourceFiles, wr as toCanonicalPath } from "./record-metric-DlR0XC0i.js";
4
+ import { N as cliLogger } from "./install-doctor-script-Bo0GK6Eq.js";
5
+ import { d as detectDefaultBranch, f as runCommand, l as prompts, u as isCommandAvailable } from "./install-github-workflow-lzQyBKdc.js";
6
6
  import * as path$1 from "node:path";
7
7
  //#region src/cli/utils/path-format.ts
8
8
  const toForwardSlashes = (filePath) => filePath.replaceAll("\\", "/");
@@ -335,5 +335,5 @@ const finalizeScope = async ({ requested, diffInfo, skipPrompts, isQuiet }) => {
335
335
  //#endregion
336
336
  export { isValidBlockingLevel as a, openWorkflowPullRequest as c, warnDeprecatedDiff as i, stageWorkflowFile as l, isScopeValue as n, pickBlockingLevel as o, resolveScope as r, resolveBlockingLevel as s, finalizeScope as t, toForwardSlashes as u };
337
337
 
338
- //# sourceMappingURL=resolve-scope-B6tfTUJj.js.map
339
- //# debugId=a78da4b8-413a-541d-8a27-5312819006dc
338
+ //# sourceMappingURL=resolve-scope-CymB97w8.js.map
339
+ //# debugId=0dfaa4aa-f5a3-5173-b1bd-fdb3a21fdd70
@@ -1,8 +1,8 @@
1
1
 
2
- !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="4fe43364-530e-5409-94fd-2429823326c0")}catch(e){}}();
3
- import { Kt as highlighter, Sr as isPlainObject, St as clearConfigCache, T as METRIC, Vt as getEquivalentRuleKeys, Zt as isSameRuleKey, bn as validateConfigTypes, gt as buildRuleDocsUrl, nr as COMPILER_CLEANUP_BUCKET, rn as loadConfigWithSource, rr as COMPILER_CLEANUP_RULE_KEYS, t as recordCount } from "./record-metric-DKzjNui-.js";
4
- import { N as cliLogger, n as findNearestPackageDirectory } from "./install-doctor-script-B94dXnbf.js";
5
- import { t as readObjectFile } from "./read-object-file-DRsmMnhh.js";
2
+ !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="860b920e-ce3c-5685-8019-9777cf5e8460")}catch(e){}}();
3
+ import { Kt as highlighter, Sr as isPlainObject, St as clearConfigCache, T as METRIC, Vt as getEquivalentRuleKeys, Zt as isSameRuleKey, bn as validateConfigTypes, gt as buildRuleDocsUrl, nr as COMPILER_CLEANUP_BUCKET, rn as loadConfigWithSource, rr as COMPILER_CLEANUP_RULE_KEYS, t as recordCount } from "./record-metric-DlR0XC0i.js";
4
+ import { N as cliLogger, n as findNearestPackageDirectory } from "./install-doctor-script-Bo0GK6Eq.js";
5
+ import { t as readObjectFile } from "./read-object-file-BesjR6NM.js";
6
6
  import * as path$1 from "node:path";
7
7
  import * as fs$1 from "node:fs";
8
8
  import { REACT_DOCTOR_RULES } from "oxlint-plugin-react-doctor/core";
@@ -577,5 +577,5 @@ const rulesUnignoreTagAction = async (tag, options) => {
577
577
  //#endregion
578
578
  export { rulesCategoryAction, rulesDisableAction, rulesEnableAction, rulesExplainAction, rulesIgnoreTagAction, rulesListAction, rulesSetAction, rulesUnignoreTagAction };
579
579
 
580
- //# sourceMappingURL=rules-CdUg_ovk.js.map
581
- //# debugId=4fe43364-530e-5409-94fd-2429823326c0
580
+ //# sourceMappingURL=rules-DWxAtuvn.js.map
581
+ //# debugId=860b920e-ce3c-5685-8019-9777cf5e8460
@@ -1,12 +1,12 @@
1
1
 
2
- !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="514acd54-0c15-5ecd-b612-fba38a715406")}catch(e){}}();
3
- import { Bn as sync, Bt as getDiffInfo, C as CI_TRUST_COMPANIES, G as isCiEnvironment, Hn as void_, Jt as isPathInsideDirectory, Kn as succeed, Kt as highlighter, L as TUI_REPORT_COMPACT_MAX_ROWS, Lt as getBaselineDiffPlan, R as TUI_REPORT_DETAIL_WIDTH_FRACTION, Rn as runPromise, Rt as getChangedLineRanges, T as METRIC, Ut as hasPublishedFixRecipe, V as isGitHookEnvironment, ar as DIAGNOSTIC_CATEGORY_BUCKETS, at as Progress, cr as GITHUB_ACTIONS_SETUP_URL, fn as resolveScanTarget, gt as buildRuleDocsUrl, in as mapWithConcurrency, n as recordDistribution, sn as remainingDeadlineBudgetMs, st as Reporter, t as recordCount, vr as getCategoryImpact, xn as yieldToEventLoop, yt as calculateScore } from "./record-metric-DKzjNui-.js";
4
- import { N as cliLogger, l as isUnicodeSupported, n as findNearestPackageDirectory } from "./install-doctor-script-B94dXnbf.js";
5
- import { i as isReactDoctorWorkflowInstalled } from "./install-github-workflow-PoJBXNVx.js";
6
- import { r as resolveScope, s as resolveBlockingLevel, t as finalizeScope, u as toForwardSlashes } from "./resolve-scope-B6tfTUJj.js";
7
- import { A as resolveMergeBaseRef, B as buildNoScoreMessage, C as copyToClipboard, D as deduplicateProjectScans, E as collectProjectSourceFileCounts, F as printFooter, G as formatFixRecipeLine, H as hasLintHardFailure, I as printDiagnosticsDump, K as formatLearnMoreLine, L as formatDiagnosticSite, M as pluralize, N as formatSkippedCheckLabel, O as createInvocationInspect, P as formatElapsedTime, R as hasIncompleteScoreAnalysis, S as CLI_AGENT_BINARIES, T as buildHandoffPayload, U as buildRulePriorityMap, V as buildEmptyReportMessage, W as buildSortedRuleGroups, _ as resolveCliInspectOptions, a as projectManifestChanged, b as setUpGitHubActions, c as selectProjects, d as resolveProjectChangedLineRanges, f as resolveProjectDiffIncludePaths, g as resolveWorkspaceDeadCodeOwner, h as retryMissingProjectScores, l as buildCodeFrame, n as formatSkippedProjectsMessage, o as partitionProjectScanOutcomes, p as resolveProjectSourceFilePaths, r as validateIncludeUntrackedScope, s as discoverWorkspacePackages, t as shouldFailScanGate, u as resolveProjectScan, v as filterScansForSurface, w as launchCliAgent, x as detectLaunchableAgents, y as countUniqueScannedFiles, z as filterDiagnosticsByCategories } from "./should-fail-scan-gate-ifL9wq2M.js";
8
- import { a as recordGate, f as ONBOARDING_EVENT, n as openUrl, r as isGatePending } from "./report-workflow-result-Be-u7k5t.js";
9
- import { a as useExitOnCtrlC, c as Spinner, d as useInput, f as Transform, h as Box, i as import_react, l as useStdout, m as Text, n as registerMountedTuiRenderer, o as terminalSymbols, p as render, r as useStdoutDimensions, s as isPrintableInput, t as require_jsx_runtime, u as useApp } from "./jsx-runtime-rX-uyu-N.js";
2
+ !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="969dca38-2acc-5213-a1d2-0c794858487a")}catch(e){}}();
3
+ import { Bn as sync, Bt as getDiffInfo, C as CI_TRUST_COMPANIES, G as isCiEnvironment, Hn as void_, Jt as isPathInsideDirectory, Kn as succeed, Kt as highlighter, L as TUI_REPORT_COMPACT_MAX_ROWS, Lt as getBaselineDiffPlan, R as TUI_REPORT_DETAIL_WIDTH_FRACTION, Rn as runPromise, Rt as getChangedLineRanges, T as METRIC, Ut as hasPublishedFixRecipe, V as isGitHookEnvironment, ar as DIAGNOSTIC_CATEGORY_BUCKETS, at as Progress, cr as GITHUB_ACTIONS_SETUP_URL, fn as resolveScanTarget, gt as buildRuleDocsUrl, in as mapWithConcurrency, n as recordDistribution, sn as remainingDeadlineBudgetMs, st as Reporter, t as recordCount, vr as getCategoryImpact, xn as yieldToEventLoop, yt as calculateScore } from "./record-metric-DlR0XC0i.js";
4
+ import { N as cliLogger, l as isUnicodeSupported, n as findNearestPackageDirectory } from "./install-doctor-script-Bo0GK6Eq.js";
5
+ import { i as isReactDoctorWorkflowInstalled } from "./install-github-workflow-lzQyBKdc.js";
6
+ import { r as resolveScope, s as resolveBlockingLevel, t as finalizeScope, u as toForwardSlashes } from "./resolve-scope-CymB97w8.js";
7
+ import { A as resolveMergeBaseRef, B as buildNoScoreMessage, C as copyToClipboard, D as deduplicateProjectScans, E as collectProjectSourceFileCounts, F as printFooter, G as formatFixRecipeLine, H as hasLintHardFailure, I as printDiagnosticsDump, K as formatLearnMoreLine, L as formatDiagnosticSite, M as pluralize, N as formatSkippedCheckLabel, O as createInvocationInspect, P as formatElapsedTime, R as hasIncompleteScoreAnalysis, S as CLI_AGENT_BINARIES, T as buildHandoffPayload, U as buildRulePriorityMap, V as buildEmptyReportMessage, W as buildSortedRuleGroups, _ as resolveCliInspectOptions, a as projectManifestChanged, b as setUpGitHubActions, c as selectProjects, d as resolveProjectChangedLineRanges, f as resolveProjectDiffIncludePaths, g as resolveWorkspaceDeadCodeOwner, h as retryMissingProjectScores, l as buildCodeFrame, n as formatSkippedProjectsMessage, o as partitionProjectScanOutcomes, p as resolveProjectSourceFilePaths, r as validateIncludeUntrackedScope, s as discoverWorkspacePackages, t as shouldFailScanGate, u as resolveProjectScan, v as filterScansForSurface, w as launchCliAgent, x as detectLaunchableAgents, y as countUniqueScannedFiles, z as filterDiagnosticsByCategories } from "./should-fail-scan-gate-phENuxsY.js";
8
+ import { a as recordGate, f as ONBOARDING_EVENT, n as openUrl, r as isGatePending } from "./report-workflow-result-BpEkl4QM.js";
9
+ import { a as useExitOnCtrlC, c as Spinner, d as useInput, f as Transform, h as Box, i as import_react, l as useStdout, m as Text, n as registerMountedTuiRenderer, o as terminalSymbols, p as render, r as useStdoutDimensions, s as isPrintableInput, t as require_jsx_runtime, u as useApp } from "./jsx-runtime-BWPZKNBQ.js";
10
10
  import path from "node:path";
11
11
  import { performance } from "node:perf_hooks";
12
12
  import { getSkillAgentConfig } from "agent-install";
@@ -2504,5 +2504,5 @@ const runScanApp = async (input) => {
2504
2504
  //#endregion
2505
2505
  export { runScanApp };
2506
2506
 
2507
- //# sourceMappingURL=run-scan-app-DqgVw6xW.js.map
2508
- //# debugId=514acd54-0c15-5ecd-b612-fba38a715406
2507
+ //# sourceMappingURL=run-scan-app-bw6ZA5Y8.js.map
2508
+ //# debugId=969dca38-2acc-5213-a1d2-0c794858487a
@@ -1,11 +1,11 @@
1
1
 
2
- !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="46debe13-c128-5eca-a9d5-3ef198df2860")}catch(e){}}();
3
- import { Kt as highlighter, T as METRIC, t as recordCount, u as enableJsonMode, z as CliInputError } from "./record-metric-DKzjNui-.js";
2
+ !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="79d673b5-2351-5d89-8eb5-163bc5837334")}catch(e){}}();
3
+ import { Kt as highlighter, T as METRIC, t as recordCount, u as enableJsonMode, z as CliInputError } from "./record-metric-DlR0XC0i.js";
4
4
  import { t as activeScanAbortRegistry } from "./active-scan-abort-registry-DwG6tSPy.js";
5
- import { t as reportErrorToSentry } from "./report-error-Dd2AIOrT.js";
6
- import { n as resetSentryRunState, r as withRunSpan } from "./with-run-span-BxZf1cDB.js";
7
- import { _ as RUNTIME_SCAN_SNAPSHOT_TIMEOUT_MS, b as RUNTIME_SCAN_TRACING_COMPLETE_TIMEOUT_MS, f as RUNTIME_SCAN_PROBE_RELATIVE_PATH, g as RUNTIME_SCAN_SAFE_CDP_PAGE_URLS, h as RUNTIME_SCAN_PROBE_SNAPSHOT_TOKEN_PLACEHOLDER, l as RUNTIME_SCAN_MAX_SNAPSHOT_PAYLOAD_BYTES, m as RUNTIME_SCAN_PROBE_SNAPSHOT_BINDING_NAME_PLACEHOLDER, n as RUNTIME_SCAN_BROWSER_WIDTH_PX, o as RUNTIME_SCAN_MAX_COMPONENT_EVENTS, p as RUNTIME_SCAN_PROBE_SNAPSHOT_ATTRIBUTE_NAME_PLACEHOLDER, r as RUNTIME_SCAN_CONTROL_CHARACTERS_PATTERN, s as RUNTIME_SCAN_MAX_RECORDING_DURATION_MS, t as sanitizeRuntimeUrl, v as RUNTIME_SCAN_TRACE_CATEGORIES, y as RUNTIME_SCAN_TRACE_FILE_EXTENSION } from "./sanitize-runtime-url-c17alaBD.js";
8
- import { r as resolveTuiEnvironment, t as isTuiEnvironmentSupported } from "./should-use-tui-BQ2TXU_F.js";
5
+ import { t as reportErrorToSentry } from "./report-error-BBzkgRQ4.js";
6
+ import { n as resetSentryRunState, r as withRunSpan } from "./with-run-span-CAOGHFC5.js";
7
+ import { _ as RUNTIME_SCAN_SNAPSHOT_TIMEOUT_MS, b as RUNTIME_SCAN_TRACING_COMPLETE_TIMEOUT_MS, f as RUNTIME_SCAN_PROBE_RELATIVE_PATH, g as RUNTIME_SCAN_SAFE_CDP_PAGE_URLS, h as RUNTIME_SCAN_PROBE_SNAPSHOT_TOKEN_PLACEHOLDER, l as RUNTIME_SCAN_MAX_SNAPSHOT_PAYLOAD_BYTES, m as RUNTIME_SCAN_PROBE_SNAPSHOT_BINDING_NAME_PLACEHOLDER, n as RUNTIME_SCAN_BROWSER_WIDTH_PX, o as RUNTIME_SCAN_MAX_COMPONENT_EVENTS, p as RUNTIME_SCAN_PROBE_SNAPSHOT_ATTRIBUTE_NAME_PLACEHOLDER, r as RUNTIME_SCAN_CONTROL_CHARACTERS_PATTERN, s as RUNTIME_SCAN_MAX_RECORDING_DURATION_MS, t as sanitizeRuntimeUrl, v as RUNTIME_SCAN_TRACE_CATEGORIES, y as RUNTIME_SCAN_TRACE_FILE_EXTENSION } from "./sanitize-runtime-url-DPEV2PKy.js";
8
+ import { r as resolveTuiEnvironment, t as isTuiEnvironmentSupported } from "./should-use-tui-Cke4n9ty.js";
9
9
  import * as path$1 from "node:path";
10
10
  import * as fs$1 from "node:fs";
11
11
  import { randomUUID } from "node:crypto";
@@ -719,7 +719,7 @@ const resolveRuntimeScanUrl = async (url) => {
719
719
  if (url !== void 0) return url;
720
720
  if (!isTuiEnvironmentSupported(resolveTuiEnvironment(process.stderr.isTTY === true))) throw new CliInputError("A URL is required outside an interactive terminal. Run `react-doctor scan <url>`.");
721
721
  recordCount(METRIC.runtimeScanUrlPromptShown);
722
- const { promptRuntimeScanUrl } = await import("./prompt-runtime-scan-url-DEAm_LGd.js");
722
+ const { promptRuntimeScanUrl } = await import("./prompt-runtime-scan-url-hzes2VqP.js");
723
723
  return promptRuntimeScanUrl();
724
724
  };
725
725
  const runtimeScanAction = async (url, flags) => {
@@ -766,5 +766,5 @@ const runtimeScanAction = async (url, flags) => {
766
766
  //#endregion
767
767
  export { runtimeScanAction };
768
768
 
769
- //# sourceMappingURL=runtime-scan-CAZo4uiu.js.map
770
- //# debugId=46debe13-c128-5eca-a9d5-3ef198df2860
769
+ //# sourceMappingURL=runtime-scan-_HfBdRJw.js.map
770
+ //# debugId=79d673b5-2351-5d89-8eb5-163bc5837334
@@ -1,6 +1,6 @@
1
1
 
2
- !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="3b2b984d-ba9f-519f-8b64-5038d69f5b39")}catch(e){}}();
3
- import { z as CliInputError } from "./record-metric-DKzjNui-.js";
2
+ !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="8e3f3dee-ebb9-5835-a619-06f28b02831f")}catch(e){}}();
3
+ import { z as CliInputError } from "./record-metric-DlR0XC0i.js";
4
4
  //#region src/cli/runtime-scan/constants.ts
5
5
  const RUNTIME_SCAN_MAX_COMPONENT_EVENTS = 2e3;
6
6
  const RUNTIME_SCAN_MAX_SNAPSHOT_PAYLOAD_BYTES = 5 * 1024 * 1024;
@@ -72,5 +72,5 @@ const sanitizeRuntimeUrl = (rawUrl) => {
72
72
  //#endregion
73
73
  export { RUNTIME_SCAN_SNAPSHOT_TIMEOUT_MS as _, RUNTIME_SCAN_LOCAL_DEV_PORTS as a, RUNTIME_SCAN_TRACING_COMPLETE_TIMEOUT_MS as b, RUNTIME_SCAN_MAX_SNAPSHOT_BYTES as c, RUNTIME_SCAN_MAX_TRACE_BYTES as d, RUNTIME_SCAN_PROBE_RELATIVE_PATH as f, RUNTIME_SCAN_SAFE_CDP_PAGE_URLS as g, RUNTIME_SCAN_PROBE_SNAPSHOT_TOKEN_PLACEHOLDER as h, RUNTIME_SCAN_LAYOUT_THRASH_RATIO as i, RUNTIME_SCAN_MAX_SNAPSHOT_PAYLOAD_BYTES as l, RUNTIME_SCAN_PROBE_SNAPSHOT_BINDING_NAME_PLACEHOLDER as m, RUNTIME_SCAN_BROWSER_WIDTH_PX as n, RUNTIME_SCAN_MAX_COMPONENT_EVENTS as o, RUNTIME_SCAN_PROBE_SNAPSHOT_ATTRIBUTE_NAME_PLACEHOLDER as p, RUNTIME_SCAN_CONTROL_CHARACTERS_PATTERN as r, RUNTIME_SCAN_MAX_RECORDING_DURATION_MS as s, sanitizeRuntimeUrl as t, RUNTIME_SCAN_MAX_STRING_LENGTH as u, RUNTIME_SCAN_TRACE_CATEGORIES as v, RUNTIME_SCAN_TRACE_FILE_EXTENSION as y };
74
74
 
75
- //# sourceMappingURL=sanitize-runtime-url-c17alaBD.js.map
76
- //# debugId=3b2b984d-ba9f-519f-8b64-5038d69f5b39
75
+ //# sourceMappingURL=sanitize-runtime-url-DPEV2PKy.js.map
76
+ //# debugId=8e3f3dee-ebb9-5835-a619-06f28b02831f
@@ -1,10 +1,10 @@
1
1
 
2
- !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="f660d3a0-d5fb-5e1a-87dc-620fbc865755")}catch(e){}}();
3
- import { T as METRIC, fn as resolveScanTarget, t as recordCount } from "./record-metric-DKzjNui-.js";
4
- import { i as warnDeprecatedDiff } from "./resolve-scope-B6tfTUJj.js";
5
- import { _ as resolveCliInspectOptions, i as validateModeFlags } from "./should-fail-scan-gate-ifL9wq2M.js";
6
- import { n as warnDeprecatedFailOn, r as runProjectMigrations, t as inspectAction } from "./inspect-U8dPI4Kp.js";
7
- import { n as shouldUseTui, r as resolveTuiEnvironment } from "./should-use-tui-BQ2TXU_F.js";
2
+ !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="189dcad2-d7e0-523a-b717-f67e197b5cce")}catch(e){}}();
3
+ import { T as METRIC, fn as resolveScanTarget, t as recordCount } from "./record-metric-DlR0XC0i.js";
4
+ import { i as warnDeprecatedDiff } from "./resolve-scope-CymB97w8.js";
5
+ import { _ as resolveCliInspectOptions, i as validateModeFlags } from "./should-fail-scan-gate-phENuxsY.js";
6
+ import { n as warnDeprecatedFailOn, r as runProjectMigrations, t as inspectAction } from "./inspect-htfpLgCT.js";
7
+ import { n as shouldUseTui, r as resolveTuiEnvironment } from "./should-use-tui-Cke4n9ty.js";
8
8
  import path from "node:path";
9
9
  //#region src/cli/commands/scan.ts
10
10
  const runScanCommand = async (input) => {
@@ -22,7 +22,7 @@ const runScanCommand = async (input) => {
22
22
  warnDeprecatedFailOn(input.flags, scanTarget.userConfig);
23
23
  warnDeprecatedDiff(input.flags, scanTarget.userConfig);
24
24
  recordCount(METRIC.cliInvoked, 1, { command: input.invocationCommand });
25
- const { runScanApp } = await import("./run-scan-app-DqgVw6xW.js");
25
+ const { runScanApp } = await import("./run-scan-app-bw6ZA5Y8.js");
26
26
  const { shouldFail } = await runScanApp({
27
27
  directory: input.directory,
28
28
  scanTarget,
@@ -37,5 +37,5 @@ const runScanCommand = async (input) => {
37
37
  //#endregion
38
38
  export { runScanCommand };
39
39
 
40
- //# sourceMappingURL=scan-BxtXorVy.js.map
41
- //# debugId=f660d3a0-d5fb-5e1a-87dc-620fbc865755
40
+ //# sourceMappingURL=scan-DLEWug0Y.js.map
41
+ //# debugId=189dcad2-d7e0-523a-b717-f67e197b5cce
@@ -1,14 +1,14 @@
1
1
 
2
- !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="f7484d31-a027-501b-b120-d1c46a81e6a9")}catch(e){}}();
3
- import { $ as Linter, A as SCAN_RESULT_CACHE_FILENAME, An as gen, At as discoverSupportedSubprojects, B as isNonInteractiveEnvironment, Bn as sync, Cn as error, Ct as collectSourceFileCountsByDirectory, Dn as Diagnostic, Dt as createNodeReadFileLinesSync, En as warn, Et as countOptInProjectRuleSelections, Fn as provide, G as isCiEnvironment, Gt as hashFileContents, Ht as groupBy, In as provideContext, J as Config, Jt as isPathInsideDirectory, K as isCiOrCodingAgentEnvironment, Kn as succeed, Kt as highlighter, Ln as provideService, Mn as map, Mt as filterPathsOutsideDirectories, Nn as orElseSucceed, Nt as filterSourceFiles, On as decodeUnknownSync, Ot as createOxlintSpawnSlots, Pn as promise, Q as LintPartialFailures, Qt as isScanComplete, Rn as runPromise, S as BASELINE_FILES_TEMP_DIR_PREFIX, Sn as Console, T as METRIC, Tn as log, Tt as computeDiagnosticDelta, U as ACTION_INPUT_ENVIRONMENT_VARIABLES, Ut as hasPublishedFixRecipe, Vn as try_, W as detectRunnerOs, Wn as mergeAll, X as Git, Xt as isReactDoctorError, Y as Files, Zn as ParentSpan, _ as VERSION, _n as shouldUseMaintainabilityLayer, _t as buildRuleSeverityControls, an as materializeSourceTree, ar as DIAGNOSTIC_CATEGORY_BUCKETS, at as Progress, bt as canonicalizeUserRuleKey, cn as resolveGithubActionsScoreMetadata, ct as Score, d as isJsonModeActive, dn as resolveScanConcurrency, dr as JSX_DUPLICATION_SOURCE_FILE_PATTERN, dt as SupplyChain, en as listSourceFiles, et as Maintainability, fn as resolveScanTarget, fr as JSX_FILE_PATTERN, gt as buildRuleDocsUrl, hr as SHARE_BASE_URL, in as mapWithConcurrency, it as PerFileLintCacheEnabled, jt as filterDiagnosticsForSurface, l as getRunId, ln as resolveLintBatchOrdering, lr as GIT_SHOW_MAX_BUFFER_BYTES, lt as SidecarLintCacheEnabled, mn as runInspect, mr as OXLINT_NODE_REQUIREMENT, mt as atomicWriteJson, n as recordDistribution, nn as listWorkspacePackages, nt as OxlintConcurrency, on as mergeReactDoctorConfigs, ot as Project, pn as restoreLegacyThrow, pr as MILLISECONDS_PER_SECOND, qt as isMonorepoRoot, r as toSpanAttributes, rt as OxlintSpawnSlots, sn as remainingDeadlineBudgetMs, sr as ENTERPRISE_CONTACT_URL, st as Reporter, t as recordCount, tn as listSourceFilesCooperative, tr as CI_URL, tt as NodeResolver, un as resolveReactDoctorCacheDir, ur as HTML_FILE_PATTERN, v as makeNoopConsole, vn as summarizeDiagnostics, vt as buildSkippedChecks, wt as computeConfigFingerprint, xn as yieldToEventLoop, xr as isFile, xt as classifyFileContext, yr as isDirectory, yt as calculateScore, z as CliInputError, zn as runSync, zt as getDiagnosticRuleIdentity } from "./record-metric-DKzjNui-.js";
4
- import { t as getTelemetryContext } from "./telemetry-runtime-DlKLQN-9.js";
5
- import { n as buildFooterLinkLines, t as buildSectionDivider } from "./build-section-divider-CGqjqvEG.js";
2
+ !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="b5004a14-4c15-56dc-9943-aaba2b628843")}catch(e){}}();
3
+ import { $ as Linter, A as SCAN_RESULT_CACHE_FILENAME, An as gen, At as discoverSupportedSubprojects, B as isNonInteractiveEnvironment, Bn as sync, Cn as error, Ct as collectSourceFileCountsByDirectory, Dn as Diagnostic, Dt as createNodeReadFileLinesSync, En as warn, Et as countOptInProjectRuleSelections, Fn as provide, G as isCiEnvironment, Gt as hashFileContents, Ht as groupBy, In as provideContext, J as Config, Jt as isPathInsideDirectory, K as isCiOrCodingAgentEnvironment, Kn as succeed, Kt as highlighter, Ln as provideService, Mn as map, Mt as filterPathsOutsideDirectories, Nn as orElseSucceed, Nt as filterSourceFiles, On as decodeUnknownSync, Ot as createOxlintSpawnSlots, Pn as promise, Q as LintPartialFailures, Qt as isScanComplete, Rn as runPromise, S as BASELINE_FILES_TEMP_DIR_PREFIX, Sn as Console, T as METRIC, Tn as log, Tt as computeDiagnosticDelta, U as ACTION_INPUT_ENVIRONMENT_VARIABLES, Ut as hasPublishedFixRecipe, Vn as try_, W as detectRunnerOs, Wn as mergeAll, X as Git, Xt as isReactDoctorError, Y as Files, Zn as ParentSpan, _ as VERSION, _n as shouldUseMaintainabilityLayer, _t as buildRuleSeverityControls, an as materializeSourceTree, ar as DIAGNOSTIC_CATEGORY_BUCKETS, at as Progress, bt as canonicalizeUserRuleKey, cn as resolveGithubActionsScoreMetadata, ct as Score, d as isJsonModeActive, dn as resolveScanConcurrency, dr as JSX_DUPLICATION_SOURCE_FILE_PATTERN, dt as SupplyChain, en as listSourceFiles, et as Maintainability, fn as resolveScanTarget, fr as JSX_FILE_PATTERN, gt as buildRuleDocsUrl, hr as SHARE_BASE_URL, in as mapWithConcurrency, it as PerFileLintCacheEnabled, jt as filterDiagnosticsForSurface, l as getRunId, ln as resolveLintBatchOrdering, lr as GIT_SHOW_MAX_BUFFER_BYTES, lt as SidecarLintCacheEnabled, mn as runInspect, mr as OXLINT_NODE_REQUIREMENT, mt as atomicWriteJson, n as recordDistribution, nn as listWorkspacePackages, nt as OxlintConcurrency, on as mergeReactDoctorConfigs, ot as Project, pn as restoreLegacyThrow, pr as MILLISECONDS_PER_SECOND, qt as isMonorepoRoot, r as toSpanAttributes, rt as OxlintSpawnSlots, sn as remainingDeadlineBudgetMs, sr as ENTERPRISE_CONTACT_URL, st as Reporter, t as recordCount, tn as listSourceFilesCooperative, tr as CI_URL, tt as NodeResolver, un as resolveReactDoctorCacheDir, ur as HTML_FILE_PATTERN, v as makeNoopConsole, vn as summarizeDiagnostics, vt as buildSkippedChecks, wt as computeConfigFingerprint, xn as yieldToEventLoop, xr as isFile, xt as classifyFileContext, yr as isDirectory, yt as calculateScore, z as CliInputError, zn as runSync, zt as getDiagnosticRuleIdentity } from "./record-metric-DlR0XC0i.js";
4
+ import { t as getTelemetryContext } from "./telemetry-runtime-Bh-S_83U.js";
5
+ import { n as buildFooterLinkLines, t as buildSectionDivider } from "./build-section-divider-B5vvlvZH.js";
6
6
  import { t as activeScanAbortRegistry } from "./active-scan-abort-registry-DwG6tSPy.js";
7
- import { A as runGit, C as getPackageJsonPath, N as cliLogger, a as installReactDoctorScriptStep, c as spinner, n as findNearestPackageDirectory, o as isSpinnerSilent, s as setSpinnerSilent, w as isRecord } from "./install-doctor-script-B94dXnbf.js";
8
- import { d as detectDefaultBranch, l as prompts, r as installReactDoctorWorkflow, u as isCommandAvailable } from "./install-github-workflow-PoJBXNVx.js";
9
- import { a as isValidBlockingLevel, c as openWorkflowPullRequest, l as stageWorkflowFile, o as pickBlockingLevel, u as toForwardSlashes } from "./resolve-scope-B6tfTUJj.js";
10
- import { n as resetSentryRunState, r as withRunSpan, t as recordSentryProjectContext } from "./with-run-span-BxZf1cDB.js";
11
- import { h as detectAvailableAgents, t as reportWorkflowResult } from "./report-workflow-result-Be-u7k5t.js";
7
+ import { A as runGit, C as getPackageJsonPath, N as cliLogger, a as installReactDoctorScriptStep, c as spinner, n as findNearestPackageDirectory, o as isSpinnerSilent, s as setSpinnerSilent, w as isRecord } from "./install-doctor-script-Bo0GK6Eq.js";
8
+ import { d as detectDefaultBranch, l as prompts, r as installReactDoctorWorkflow, u as isCommandAvailable } from "./install-github-workflow-lzQyBKdc.js";
9
+ import { a as isValidBlockingLevel, c as openWorkflowPullRequest, l as stageWorkflowFile, o as pickBlockingLevel, u as toForwardSlashes } from "./resolve-scope-CymB97w8.js";
10
+ import { n as resetSentryRunState, r as withRunSpan, t as recordSentryProjectContext } from "./with-run-span-CAOGHFC5.js";
11
+ import { h as detectAvailableAgents, t as reportWorkflowResult } from "./report-workflow-result-BpEkl4QM.js";
12
12
  import { createRequire } from "node:module";
13
13
  import { spawn } from "node:child_process";
14
14
  import * as path$1 from "node:path";
@@ -2997,5 +2997,5 @@ const shouldFailScanGate = (input) => {
2997
2997
  //#endregion
2998
2998
  export { resolveMergeBaseRef as A, buildNoScoreMessage as B, copyToClipboard as C, deduplicateProjectScans as D, collectProjectSourceFileCounts as E, printFooter as F, formatFixRecipeLine as G, hasLintHardFailure as H, printDiagnosticsDump as I, formatLearnMoreLine as K, formatDiagnosticSite as L, pluralize as M, formatSkippedCheckLabel as N, createInvocationInspect as O, formatElapsedTime as P, hasIncompleteScoreAnalysis as R, CLI_AGENT_BINARIES as S, buildHandoffPayload as T, buildRulePriorityMap as U, buildEmptyReportMessage as V, buildSortedRuleGroups as W, resolveCliInspectOptions as _, projectManifestChanged as a, setUpGitHubActions as b, selectProjects as c, resolveProjectChangedLineRanges as d, resolveProjectDiffIncludePaths as f, resolveWorkspaceDeadCodeOwner as g, retryMissingProjectScores as h, validateModeFlags as i, printHeadlessReport as j, inspect as k, buildCodeFrame as l, resolveProjectRelativeDirectory as m, formatSkippedProjectsMessage as n, partitionProjectScanOutcomes as o, resolveProjectSourceFilePaths as p, validateIncludeUntrackedScope as r, discoverWorkspacePackages as s, shouldFailScanGate as t, resolveProjectScan as u, filterScansForSurface as v, launchCliAgent as w, detectLaunchableAgents as x, countUniqueScannedFiles as y, filterDiagnosticsByCategories as z };
2999
2999
 
3000
- //# sourceMappingURL=should-fail-scan-gate-ifL9wq2M.js.map
3001
- //# debugId=f7484d31-a027-501b-b120-d1c46a81e6a9
3000
+ //# sourceMappingURL=should-fail-scan-gate-phENuxsY.js.map
3001
+ //# debugId=b5004a14-4c15-56dc-9943-aaba2b628843
@@ -1,10 +1,10 @@
1
1
 
2
- !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="75d9efe5-007a-5e5b-9eea-daa2bdc94cb6")}catch(e){}}();
3
- import { B as isNonInteractiveEnvironment } from "./record-metric-DKzjNui-.js";
2
+ !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="ff2a01e1-eb37-56cb-b1ea-8bd3846c6d46")}catch(e){}}();
3
+ import { B as isNonInteractiveEnvironment } from "./record-metric-DlR0XC0i.js";
4
4
  //#region src/cli/utils/should-skip-prompts.ts
5
5
  const shouldSkipPrompts = (input = {}) => Boolean(input.yes) || Boolean(input.json) || isNonInteractiveEnvironment() || !process.stdin.isTTY;
6
6
  //#endregion
7
7
  export { shouldSkipPrompts as t };
8
8
 
9
- //# sourceMappingURL=should-skip-prompts-C7rPlQd4.js.map
10
- //# debugId=75d9efe5-007a-5e5b-9eea-daa2bdc94cb6
9
+ //# sourceMappingURL=should-skip-prompts-Dmbzet_Y.js.map
10
+ //# debugId=ff2a01e1-eb37-56cb-b1ea-8bd3846c6d46
@@ -1,6 +1,6 @@
1
1
 
2
- !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="3e88de34-f130-5efc-b637-864c73baa0dd")}catch(e){}}();
3
- import { B as isNonInteractiveEnvironment } from "./record-metric-DKzjNui-.js";
2
+ !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="53db37ab-93c2-5bca-ba7d-8b81f0607684")}catch(e){}}();
3
+ import { B as isNonInteractiveEnvironment } from "./record-metric-DlR0XC0i.js";
4
4
  //#region src/cli/utils/resolve-tui-environment.ts
5
5
  const resolveTuiEnvironment = (outputIsTty = process.stdout.isTTY === true) => ({
6
6
  isNonInteractiveEnvironment: isNonInteractiveEnvironment(),
@@ -21,5 +21,5 @@ const shouldUseTui = (input) => {
21
21
  //#endregion
22
22
  export { shouldUseTui as n, resolveTuiEnvironment as r, isTuiEnvironmentSupported as t };
23
23
 
24
- //# sourceMappingURL=should-use-tui-BQ2TXU_F.js.map
25
- //# debugId=3e88de34-f130-5efc-b637-864c73baa0dd
24
+ //# sourceMappingURL=should-use-tui-Cke4n9ty.js.map
25
+ //# debugId=53db37ab-93c2-5bca-ba7d-8b81f0607684
@@ -0,0 +1,102 @@
1
+ ---
2
+ name: improve-threejs
3
+ description: Audit and fix Three.js and React Three Fiber apps for frame-loop performance, GPU memory leaks, scene-graph correctness, and visual defects like z-fighting, shadow acne, wrong color space, and broken resize handling. Uses React Doctor as the scanning engine plus a visual rubric checked against rendered output. Use when the user asks to improve, audit, scan, or clean up a Three.js, R3F, react-three-fiber, drei, or WebGL app, or types `/improve-threejs`.
4
+ ---
5
+
6
+ # Improve Three.js
7
+
8
+ Audits a Three.js or React Three Fiber (R3F) codebase and fixes what hurts most: work that runs every frame, GPU resources that never get disposed, scene-graph objects rebuilt on every render, and visual defects the user can see. React Doctor supplies the machine-verified code scan; this skill supplies the frame-loop judgment and the visual inspection a general React scanner lacks.
9
+
10
+ The core principle: severity follows the render loop. Code inside `useFrame` or a `requestAnimationFrame` callback runs 60 times per second, so a minor inefficiency there outweighs a major one in a settings panel. Rank every finding by where it runs, not by the rule's default severity.
11
+
12
+ ## Workflow
13
+
14
+ ### Step 1: Recon
15
+
16
+ Identify the stack before scanning: plain Three.js or R3F, which helper libraries are in use (drei, postprocessing, rapier), and where the render loop lives (`useFrame` hooks, `requestAnimationFrame`, the `<Canvas frameloop>` setting).
17
+
18
+ Build a hot-path map: every `useFrame` body, every RAF callback, every pointer-move handler. These files get the strictest review in Step 3.
19
+
20
+ ### Step 2: Scan
21
+
22
+ Run React Doctor read-only to collect structured evidence:
23
+
24
+ ```bash
25
+ npx react-doctor@latest --verbose
26
+ ```
27
+
28
+ For a regression check after making changes, run with `--scope changed` and confirm the score did not drop.
29
+
30
+ ### Step 3: Triage by frame-loop leverage
31
+
32
+ Re-rank the scanner's findings using the hot-path map, then hunt for the Three.js-specific problems the scanner cannot see. Confirm every finding at its `file:line` before reporting it.
33
+
34
+ **HIGH severity, runs every frame or leaks GPU memory:**
35
+
36
+ - **Allocation inside `useFrame`**: `new Vector3()`, `new Color()`, or fresh arrays passed to Three.js APIs each frame. Fix: hoist a scratch object to module scope or `useMemo`, then mutate it in place
37
+ - **`setState` inside `useFrame`**: re-renders the React tree on every frame. Fix: mutate refs directly; reserve state for discrete changes like selection or visibility
38
+ - **Missing disposal**: geometries, materials, textures, or render targets created imperatively and never disposed. Fix: call `dispose()` in the cleanup function, or move the object into R3F's declarative tree so it owns the lifecycle
39
+ - **Object reconstruction in render**: geometry or material instances created without `useMemo`, or inline `args` arrays whose identity changes each render, forcing R3F to rebuild the underlying object
40
+
41
+ **MEDIUM severity, per-render or per-interaction waste:**
42
+
43
+ - **Unstable scene-graph props**: inline `new THREE.Vector3()` or fresh material objects as props (plain arrays like `position={[x, y, z]}` are fine; R3F handles them)
44
+ - **Missing instancing**: hundreds of identical meshes rendered individually instead of through `<Instances>` or `InstancedMesh`
45
+ - **Wasted frames**: `frameloop="always"` on a scene that only changes on interaction. Fix: `frameloop="demand"` plus `invalidate()`
46
+ - **Uncached asset loading**: textures and models loaded outside `useLoader`, `useTexture`, or `useGLTF`, losing caching and Suspense integration
47
+
48
+ **LOW severity, hygiene:** React Doctor findings on non-canvas UI code, missing `<Preload>`, oversized textures.
49
+
50
+ ### Step 4: Visual audit
51
+
52
+ Inspect what the scene actually renders. Every visual finding needs evidence: a screenshot, a frame capture, or a reproduced observation, never a guess from reading source. When a dev server and browser are available, load the app, capture the first stable frame, then capture again after moving the camera and interacting. When no browser is available, check the code-level causes listed below and label each finding as inferred from source.
53
+
54
+ Apply the mini rubric. A row fails only when the evidence shows the failure condition:
55
+
56
+ | Area | Check | Fail when |
57
+ | ---------------------- | ---------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------- |
58
+ | Render sanity | The scene reaches a stable frame after load | Black canvas, WebGL context errors, or content that never appears |
59
+ | Geometry | Move the camera along seams, edges, and boundaries | Gaps, missing faces, visible backfaces, or two surfaces flickering at the same depth (z-fighting) |
60
+ | Transparency and depth | Cross depth-order boundaries with overlapping or transmissive surfaces | Wrong sort order, halos, opaque surfaces that should transmit, or flicker at grazing angles |
61
+ | Textures | View mapped surfaces close, far, and at grazing angles | Missing textures, stretching, seams, moiré, shimmer, or washed-out colors from a wrong color space |
62
+ | Materials and lighting | Change light and view direction on lit surfaces | Surfaces that ignore light direction, or reflective metals with no environment to reflect |
63
+ | Shadows | Move casters, receivers, and the light through their range | Acne, detached or floating shadows, flicker at rest, or shadows that outlive their caster |
64
+ | Camera | Follow the primary subject through movement and transitions | Subject leaves frame, camera clips into geometry, or foreground blocks the play area |
65
+ | Scale and contact | Compare object scale and resting contact against surroundings | Objects float above, sink into, or intersect their support surface, or sit at implausible scale |
66
+ | Image stability | Pan the camera slowly at supported resolutions | Silhouettes, thin geometry, or highlights that crawl, sparkle, or ghost |
67
+ | Resize and DPR | Change viewport size, zoom, and device pixel ratio | Distortion, blur, stretched output, or content leaving the viewport |
68
+
69
+ Each rubric row has a small set of usual code-level causes. Check these first when a row fails:
70
+
71
+ - **Washed-out or too-dark colors**: `renderer.outputColorSpace` not set to `SRGBColorSpace`, color textures missing `texture.colorSpace = SRGBColorSpace`, or a data texture (normal, roughness) wrongly marked sRGB
72
+ - **Z-fighting**: coplanar geometry needing `polygonOffset` or a position nudge, or a near plane set far too small for the scene scale
73
+ - **Shadow acne or floating shadows**: `shadow.bias` and `shadow.normalBias` untuned, or a shadow camera frustum far larger than the scene
74
+ - **Blurry or stretched canvas**: renderer size not synced to canvas CSS size, `setPixelRatio` never called, or a resize handler that forgets `camera.updateProjectionMatrix()`
75
+ - **Black metals**: `metalness: 1` with no `scene.environment` set
76
+ - **Transparency sorting glitches**: large transparent meshes needing `depthWrite: false`, manual `renderOrder`, or a split into smaller meshes
77
+ - **Shimmer and crawl**: missing texture anisotropy, antialiasing disabled, or thin geometry needing thicker forms
78
+
79
+ ### Step 5: Fix
80
+
81
+ Fix in severity order: HIGH performance findings and failed visual rows first. When a finding maps to a React Doctor rule, fetch the canonical recipe instead of improvising:
82
+
83
+ ```text
84
+ https://www.react.doctor/prompts/rules/<plugin>/<rule>.md
85
+ ```
86
+
87
+ For Three.js-specific findings, apply the fix named in the triage list or the cause list above.
88
+
89
+ ### Step 6: Validate
90
+
91
+ Run `npx react-doctor@latest --verbose --scope changed` and confirm the score did not regress. Re-check every visual rubric row that failed, using the same viewpoint and interaction as the original evidence, and confirm it now passes. Then verify behavior: the scene renders, animations play, and interactions respond. If browser dev tools are available, watch the memory profile while orbiting an idle scene; a rising heap during idle means a disposal leak survived.
92
+
93
+ ## Checks the scanner always misses
94
+
95
+ Review these by hand on every audit:
96
+
97
+ - `dispose()` coverage for every imperatively created GPU resource
98
+ - Allocations and `setState` inside `useFrame` and RAF callbacks
99
+ - Event listeners and `ResizeObserver`s on the canvas or window without cleanup
100
+ - Raycasting against the full scene on every pointer move instead of a filtered target list
101
+ - Shadows or postprocessing enabled globally when one part of the scene needs them
102
+ - Color space configuration on the renderer and every color texture