react-doctor 0.9.16-dev.675ad3c → 0.9.16-dev.ef1be22

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 (36) hide show
  1. package/README.md +3 -3
  2. package/dist/{build-section-divider-GGc5L4y8.js → build-section-divider-B0MdVO19.js} +4 -4
  3. package/dist/{ci-goW_v2Ve.js → ci-SiOo5RzD.js} +12 -12
  4. package/dist/cli.js +23 -23
  5. package/dist/{design-B3pxgFA5.js → design-Dty0_JnG.js} +4 -4
  6. package/dist/{exit-gracefully-bRfDFHze.js → exit-gracefully-BqUKaxLV.js} +6 -6
  7. package/dist/{handle-error-Ck9Seh9W.js → handle-error-jBnelA-d.js} +5 -5
  8. package/dist/index.d.ts +4 -1
  9. package/dist/index.js +4 -2
  10. package/dist/{inspect-YXgF21wV.js → inspect-ZsJdCoBa.js} +28 -28
  11. package/dist/{install-0L3mbX-S.js → install-CvyHP8Sz.js} +9 -9
  12. package/dist/{install-doctor-script-CEUwgvU0.js → install-doctor-script-YdsysHJ8.js} +4 -4
  13. package/dist/{install-github-workflow-CycJz6SE.js → install-github-workflow-zVARf-aa.js} +4 -4
  14. package/dist/{install-react-doctor-DbcNvWTJ.js → install-react-doctor-Btq_1UZH.js} +8 -8
  15. package/dist/{jsx-runtime-DU2HJf59.js → jsx-runtime-BC_XnKBD.js} +5 -5
  16. package/dist/{print-branded-header-DRPpY-_W.js → print-branded-header-C9VkuYyR.js} +4 -4
  17. package/dist/{prompt-runtime-scan-url-C7lbI0Ot.js → prompt-runtime-scan-url-DBB5q70w.js} +5 -5
  18. package/dist/{read-object-file-UVbDgg-K.js → read-object-file-BMfspuEc.js} +4 -4
  19. package/dist/{record-metric-koJj2V6F.js → record-metric-COaAD5VE.js} +153 -79
  20. package/dist/{report-error-tFFDhXC-.js → report-error-CSpZGdCu.js} +5 -5
  21. package/dist/{report-workflow-result-Ci3V-6OF.js → report-workflow-result-D0Tev_E8.js} +5 -5
  22. package/dist/{resolve-scope-CAqqCs6E.js → resolve-scope-BDtWzgKS.js} +6 -6
  23. package/dist/{rules-BiT3n2J8.js → rules-3T0sQG3z.js} +6 -6
  24. package/dist/{run-scan-app-Ca8_Fmtd.js → run-scan-app-Ch62x8JM.js} +10 -10
  25. package/dist/{runtime-scan-EGp8irIP.js → runtime-scan-fl7GqT-4.js} +9 -9
  26. package/dist/{sanitize-runtime-url-CiT2FV1M.js → sanitize-runtime-url-CxW5-DlL.js} +4 -4
  27. package/dist/{scan-8mlB3o30.js → scan-ChjHrC7N.js} +9 -9
  28. package/dist/{should-fail-scan-gate-CKT7Y6lq.js → should-fail-scan-gate-0HPfGaTS.js} +102 -16
  29. package/dist/{should-skip-prompts-OHfi1uxr.js → should-skip-prompts-Db09UIvm.js} +4 -4
  30. package/dist/{should-use-tui-Dt7R7qSa.js → should-use-tui-CO0fiHNd.js} +4 -4
  31. package/dist/skills/react-doctor/SKILL.md +1 -1
  32. package/dist/{telemetry-runtime-DhCwCPKP.js → telemetry-runtime-CEcDvXxW.js} +6 -6
  33. package/dist/{version-C4YtgcDq.js → version-CP66Metq.js} +4 -4
  34. package/dist/{why-CBJBIHgr.js → why-CyIuJZHz.js} +4 -4
  35. package/dist/{with-run-span-DUsmYNga.js → with-run-span-aYNrYjQY.js} +5 -5
  36. package/package.json +4 -4
@@ -1,18 +1,18 @@
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]="5653d501-836b-5dd6-b859-a5e458a66ce1")}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]="c34d252b-7de9-5778-a1c0-e9b0c46967d6")}catch(e){}}();
3
3
  import { E as TRACKED_FILE_FLAGS_GIT_ARGUMENTS, Ft as HTML_FILE_PATTERN, Ht as MAINTAINABILITY_SOURCE_FILE_PATTERN, Jt as OXLINT_NODE_REQUIREMENT, K as resolveReactDoctorCacheDir, Nt as GIT_SHOW_MAX_BUFFER_BYTES, Rt as JSX_FILE_PATTERN, St as ENTERPRISE_CONTACT_URL, Wt as MILLISECONDS_PER_SECOND, _t as DIAGNOSTIC_CATEGORY_BUCKETS, c as HEAD_SHA_GIT_ARGUMENTS, dn as SHARE_BASE_URL, h as REPOSITORY_ROOT_GIT_ARGUMENTS, i as BASELINE_FILES_TEMP_DIR_PREFIX, k as WORKTREE_STATUS_GIT_ARGUMENTS, q as resolveScanConcurrency, u as METRIC, ut as CI_URL, v as SCAN_RESULT_CACHE_FILENAME } from "./constants-rmkaA7iw.js";
4
4
  import { t as isCacheGloballyDisabled } from "./is-cache-globally-disabled-DquUESHw.js";
5
- import { $ as buildRuleSeverityControls, A as Files, At as isPathInsideDirectory, B as PerFileLintCacheEnabled, Bn as isFile, Bt as mapWithConcurrency, C as ACTION_INPUT_ENVIRONMENT_VARIABLES, Cn as try_, E as isCiOrCodingAgentEnvironment, En as mergeAll, Et as hasPublishedFixRecipe, F as Linter, Fn as yieldToEventLoop, G as SidecarLintCacheEnabled, Gt as resolveLintBatchOrdering, H as Project, Ht as mergeReactDoctorConfigs, I as Maintainability, It as listSourceFiles, Jt as runInspect, Kt as resolveScanTarget, L as NodeResolver, Lt as listSourceFilesCooperative, M as InvocationCaches, Mt as isReactDoctorError, Nn as ParentSpan, O as Config, On as succeed, Ot as hashFileContents, P as LintPartialFailures, Pn as isMonorepoRoot, Pt as isScanComplete, Q as buildRuleDocsUrl, Qt as summarizeDiagnostics, R as OxlintConcurrency, Rn as isDirectory, Rt as listWorkspacePackages, Sn as sync, St as getDiagnosticRuleIdentity, T as isCiEnvironment, Tt as groupBy, U as Reporter, Ut as remainingDeadlineBudgetMs, V as Progress, Vt as materializeSourceTree, W as Score, Wt as resolveGithubActionsScoreMetadata, X as atomicWriteJson, Zt as shouldUseMaintainabilityLayer, _ as VERSION, _n as provide, _t as fingerprintDiagnosticEvidence, at as collectSourceFilesByDirectory, b as isNonInteractiveEnvironment, bn as runPromise, cn as Diagnostic, ct as countOptInProjectRuleSelections, d as isJsonModeActive, et as buildSkippedChecks, fn as gen, ft as discoverSupportedSubprojects, gn as promise, hn as orElseSucceed, ht as filterSourceFiles, in as error, j as Git, k as DIAGNOSTIC_DELTA_IDENTITY, kt as highlighter, l as getRunId, lt as createInvocationCaches, mn as map, mt as filterPathsOutsideDirectories, n as recordDistribution, nn as warmOxlintWorkerPool, nt as canonicalizeUserRuleKey, on as log, ot as computeConfigFingerprint, pt as filterDiagnosticsForSurface, q as SupplyChain, qt as restoreLegacyThrow, r as toSpanAttributes, rn as Console, rt as classifyFileContext, sn as warn, st as computeDiagnosticDelta, t as recordCount, tn as warmDuplicateJsxWorker, tt as calculateScore, un as decodeUnknownSync, ut as createOxlintSpawnSlots, v as makeNoopConsole, vn as provideContext, w as detectRunnerOs, xn as runSync, y as CliInputError, yn as provideService, z as OxlintSpawnSlots } from "./record-metric-koJj2V6F.js";
6
- import { t as getTelemetryContext } from "./telemetry-runtime-DhCwCPKP.js";
5
+ import { $ as buildRuleSeverityControls, $t as shouldUseMaintainabilityLayer, A as Files, An as succeed, At as highlighter, B as PerFileLintCacheEnabled, Bn as isDirectory, C as ACTION_INPUT_ENVIRONMENT_VARIABLES, Cn as runSync, Dt as hasPublishedFixRecipe, E as isCiOrCodingAgentEnvironment, Et as groupBy, F as Linter, Fn as ParentSpan, Ft as isScanComplete, G as SidecarLintCacheEnabled, Gt as remainingDeadlineBudgetMs, H as Project, Hn as isFile, Ht as materializeSourceTree, I as Maintainability, In as isMonorepoRoot, Jt as resolveScanTarget, Kt as resolveGithubActionsScoreMetadata, L as NodeResolver, Ln as yieldToEventLoop, Lt as listSourceFiles, M as InvocationCaches, Nt as isReactDoctorError, O as Config, On as mergeAll, P as LintPartialFailures, Q as buildRuleDocsUrl, R as OxlintConcurrency, Rt as listSourceFilesCooperative, Sn as runPromise, St as getDiagnosticRuleIdentity, T as isCiEnvironment, Tn as try_, Tt as getRuleMetadata, U as Reporter, Ut as mergeAndFilterDiagnostics, V as Progress, Vt as mapWithConcurrency, W as Score, Wt as mergeReactDoctorConfigs, X as atomicWriteJson, Xt as runInspect, Yt as restoreLegacyThrow, _ as VERSION, _n as orElseSucceed, _t as fingerprintDiagnosticEvidence, an as Console, at as collectSourceFilesByDirectory, b as isNonInteractiveEnvironment, bn as provideContext, cn as log, ct as countOptInProjectRuleSelections, d as isJsonModeActive, en as summarizeDiagnostics, et as buildSkippedChecks, fn as decodeUnknownSync, ft as discoverSupportedSubprojects, gn as map, ht as filterSourceFiles, in as warmOxlintWorkerPool, j as Git, jt as isPathInsideDirectory, k as DIAGNOSTIC_DELTA_IDENTITY, kt as hashFileContents, l as getRunId, ln as warn, lt as createInvocationCaches, mn as gen, mt as filterPathsOutsideDirectories, n as recordDistribution, nt as canonicalizeUserRuleKey, on as error, ot as computeConfigFingerprint, pt as filterDiagnosticsForSurface, q as SupplyChain, qt as resolveLintBatchOrdering, r as toSpanAttributes, rn as warmDuplicateJsxWorker, rt as classifyFileContext, st as computeDiagnosticDelta, t as recordCount, tt as calculateScore, un as Diagnostic, ut as createOxlintSpawnSlots, v as makeNoopConsole, vn as promise, w as detectRunnerOs, wn as sync, xn as provideService, y as CliInputError, yn as provide, z as OxlintSpawnSlots, zt as listWorkspacePackages } from "./record-metric-COaAD5VE.js";
6
+ import { t as getTelemetryContext } from "./telemetry-runtime-CEcDvXxW.js";
7
7
  import { t as activeScanAbortRegistry } from "./active-scan-abort-registry-CCTgal0O.js";
8
- import { n as buildFooterLinkLines, t as buildSectionDivider } from "./build-section-divider-GGc5L4y8.js";
8
+ import { n as buildFooterLinkLines, t as buildSectionDivider } from "./build-section-divider-B0MdVO19.js";
9
9
  import { t as toForwardSlashes } from "./path-format-By20mo8A.js";
10
10
  import { t as typescriptBinding } from "./_react-doctor_require-typescript-DXQDYeWK.js";
11
- import { A as runGitAsync, C as isRecord, N as cliLogger, S as getPackageJsonPath, a as installReactDoctorScriptStep, c as spinner, n as findNearestPackageDirectory, o as isSpinnerSilent, s as setSpinnerSilent } from "./install-doctor-script-CEUwgvU0.js";
12
- import { d as detectDefaultBranch, l as prompts, r as installReactDoctorWorkflow, u as isCommandAvailable } from "./install-github-workflow-CycJz6SE.js";
13
- import { a as isValidBlockingLevel, c as openWorkflowPullRequest, l as stageWorkflowFile, o as pickBlockingLevel } from "./resolve-scope-CAqqCs6E.js";
14
- import { n as resetSentryRunState, r as withRunSpan, t as recordSentryProjectContext } from "./with-run-span-DUsmYNga.js";
15
- import { h as detectAvailableAgents, t as reportWorkflowResult } from "./report-workflow-result-Ci3V-6OF.js";
11
+ import { A as runGitAsync, C as isRecord, N as cliLogger, S as getPackageJsonPath, a as installReactDoctorScriptStep, c as spinner, j as runGitRaw, k as runGit, n as findNearestPackageDirectory, o as isSpinnerSilent, s as setSpinnerSilent } from "./install-doctor-script-YdsysHJ8.js";
12
+ import { d as detectDefaultBranch, l as prompts, r as installReactDoctorWorkflow, u as isCommandAvailable } from "./install-github-workflow-zVARf-aa.js";
13
+ import { a as isValidBlockingLevel, c as openWorkflowPullRequest, l as stageWorkflowFile, o as pickBlockingLevel } from "./resolve-scope-BDtWzgKS.js";
14
+ import { n as resetSentryRunState, r as withRunSpan, t as recordSentryProjectContext } from "./with-run-span-aYNrYjQY.js";
15
+ import { h as detectAvailableAgents, t as reportWorkflowResult } from "./report-workflow-result-D0Tev_E8.js";
16
16
  import { createRequire } from "node:module";
17
17
  import * as fs$2 from "node:fs";
18
18
  import fs, { mkdtempSync, rmSync } from "node:fs";
@@ -20,9 +20,16 @@ import * as path$1 from "node:path";
20
20
  import path from "node:path";
21
21
  import { spawn } from "node:child_process";
22
22
  import { tmpdir } from "node:os";
23
- import crypto, { randomUUID } from "node:crypto";
23
+ import crypto, { createHash, randomUUID } from "node:crypto";
24
24
  import * as fs$1 from "node:fs/promises";
25
25
  import { performance } from "node:perf_hooks";
26
+ //#region src/cli/utils/compute-source-filter-config-hash.ts
27
+ const computeSourceFilterConfigHash = (input) => createHash("sha256").update(JSON.stringify({
28
+ textComponents: [...new Set(input.userConfig?.textComponents ?? [])].sort(),
29
+ rawTextWrapperComponents: [...new Set(input.userConfig?.rawTextWrapperComponents ?? [])].sort(),
30
+ respectInlineDisables: input.respectInlineDisables
31
+ })).digest("hex");
32
+ //#endregion
26
33
  //#region src/cli/utils/apply-observability.ts
27
34
  /**
28
35
  * Installs the tracing backend for the inspect program.
@@ -512,6 +519,7 @@ const buildOutcomeAttributes = (input) => {
512
519
  baseTotal: result.baselineDelta.baseTotalCount,
513
520
  crossFileMatches: result.baselineDelta.crossFileMatchCount,
514
521
  source: result.baselineDelta.source ?? "base",
522
+ ruleCountMatches: result.baselineDelta.ruleCountMatchCount ?? 0,
515
523
  degraded: false
516
524
  }));
517
525
  else if (input.gateExempt) attributes["baseline.degraded"] = true;
@@ -1196,6 +1204,64 @@ const copyUnchangedBaselineSources = async (input) => {
1196
1204
  })).every(Boolean);
1197
1205
  };
1198
1206
  //#endregion
1207
+ //#region src/cli/utils/read-baseline-line-map.ts
1208
+ const readBaselineLineMap = (directory, ref) => {
1209
+ const hunksByFile = /* @__PURE__ */ new Map();
1210
+ const revision = ref ? runGit(directory, [
1211
+ "rev-parse",
1212
+ "--verify",
1213
+ "--end-of-options",
1214
+ `${ref}^{commit}`
1215
+ ]) : null;
1216
+ const patch = revision ? runGitRaw(directory, [
1217
+ "-c",
1218
+ "core.quotePath=false",
1219
+ "diff",
1220
+ "--no-ext-diff",
1221
+ "--no-textconv",
1222
+ "--unified=0",
1223
+ "--find-renames",
1224
+ "--relative",
1225
+ "--src-prefix=a/",
1226
+ "--dst-prefix=b/",
1227
+ revision,
1228
+ "--"
1229
+ ]) : null;
1230
+ let currentHunks;
1231
+ for (const line of patch?.split("\n") ?? []) {
1232
+ if (line.startsWith("+++ ")) {
1233
+ currentHunks = [];
1234
+ const headerPath = line.slice(4).replace(/\t$/, "");
1235
+ let filePath = headerPath;
1236
+ if (headerPath.startsWith("\"")) try {
1237
+ filePath = JSON.parse(headerPath);
1238
+ } catch {
1239
+ continue;
1240
+ }
1241
+ if (filePath.startsWith("b/")) hunksByFile.set(filePath.slice(2), currentHunks);
1242
+ continue;
1243
+ }
1244
+ const hunk = /^@@ -(\d+)(?:,(\d+))? \+(\d+)(?:,(\d+))? @@/.exec(line);
1245
+ if (!hunk || !currentHunks) continue;
1246
+ currentHunks.push({
1247
+ baseStart: Number(hunk[1]),
1248
+ baseCount: hunk[2] === void 0 ? 1 : Number(hunk[2]),
1249
+ headStart: Number(hunk[3]),
1250
+ headCount: hunk[4] === void 0 ? 1 : Number(hunk[4])
1251
+ });
1252
+ }
1253
+ return (filePath, baseLine) => {
1254
+ let lineOffset = 0;
1255
+ for (const hunk of hunksByFile.get(filePath) ?? []) {
1256
+ if (baseLine < hunk.baseStart) break;
1257
+ if (hunk.baseCount > 0 && baseLine < hunk.baseStart + hunk.baseCount) return hunk.headStart + Math.min(baseLine - hunk.baseStart, Math.max(0, hunk.headCount - 1));
1258
+ if (hunk.baseCount === 0 && baseLine === hunk.baseStart) break;
1259
+ lineOffset = hunk.headStart + Math.max(1, hunk.headCount) - (hunk.baseStart + Math.max(1, hunk.baseCount));
1260
+ }
1261
+ return baseLine + lineOffset;
1262
+ };
1263
+ };
1264
+ //#endregion
1199
1265
  //#region src/cli/utils/read-diagnostic-evidence.ts
1200
1266
  const SOURCE_EXTENSIONS = [
1201
1267
  ".ts",
@@ -1746,6 +1812,7 @@ const runBaselineComparison = async (input) => {
1746
1812
  const diagnosticDelta = computeDiagnosticDelta({
1747
1813
  headDiagnostics: input.headDiagnostics,
1748
1814
  renamedFiles: snapshot.renamedFiles ?? {},
1815
+ mapBaseLine: readBaselineLineMap(input.directory, input.baselineRef),
1749
1816
  baseDiagnostics: withDiagnosticFingerprints(snapshot.tempDirectory, baseOutput.diagnostics),
1750
1817
  readHeadLine: () => null,
1751
1818
  readBaseLine: () => null
@@ -1758,7 +1825,8 @@ const runBaselineComparison = async (input) => {
1758
1825
  matchedCount: baseOutput.diagnostics.length - diagnosticDelta.fixedCount,
1759
1826
  fixedCount: hasUnscannedUntrackedSourceFiles ? 0 : diagnosticDelta.fixedCount,
1760
1827
  baseTotalCount: baseOutput.diagnostics.length,
1761
- crossFileMatchCount: diagnosticDelta.crossFileMatchCount
1828
+ crossFileMatchCount: diagnosticDelta.crossFileMatchCount,
1829
+ ruleCountMatchCount: diagnosticDelta.ruleCountMatchCount
1762
1830
  }
1763
1831
  };
1764
1832
  } finally {
@@ -2269,6 +2337,11 @@ const inspectWithOxlintRuntime = async (directory, inputOptions, oxlintRuntime)
2269
2337
  ...inputOptions,
2270
2338
  precomputedSourceFiles: void 0
2271
2339
  }, userConfig);
2340
+ const sourceFilterConfigHash = computeSourceFilterConfigHash({
2341
+ userConfig,
2342
+ respectInlineDisables: options.respectInlineDisables
2343
+ });
2344
+ if (options.baselineReport && (options.baselineReport.sourceFilterConfigHash !== void 0 || options.baselineReport.diagnostics.length > 0) && options.baselineReport.sourceFilterConfigHash !== sourceFilterConfigHash) throw new CliInputError("The baseline uses different or unknown source-dependent filters. Regenerate the base --json report with the current textComponents, rawTextWrapperComponents, and respectInlineDisables settings, or use --scope changed --base <ref>.");
2272
2345
  const ownsSpinnerSilence = options.silent && !isConcurrentScan;
2273
2346
  const wasSpinnerSilent = isSpinnerSilent();
2274
2347
  if (ownsSpinnerSilence) setSpinnerSilent(true);
@@ -2286,7 +2359,10 @@ const inspectWithOxlintRuntime = async (directory, inputOptions, oxlintRuntime)
2286
2359
  }
2287
2360
  }, { concurrentScan: isConcurrentScan });
2288
2361
  if (!isConcurrentScan) resetSentryRunState();
2289
- return result;
2362
+ return {
2363
+ ...result,
2364
+ sourceFilterConfigHash
2365
+ };
2290
2366
  } finally {
2291
2367
  if (ownsSpinnerSilence) setSpinnerSilent(wasSpinnerSilent);
2292
2368
  }
@@ -2391,11 +2467,20 @@ const runInspectWithRuntime = async (directory, options, userConfig, hasConfigOv
2391
2467
  let inspectDiagnostics = headDiagnostics;
2392
2468
  let baselineDelta;
2393
2469
  if (options.baselineReport && !didLintFail && !output.didDeadCodeFail && countIncompleteLintFiles(output.lintPartialFailures) === 0) {
2394
- const baseDiagnostics = options.baselineReport.diagnostics;
2470
+ const baseDiagnostics = mergeAndFilterDiagnostics(options.baselineReport.diagnostics.filter((diagnostic) => {
2471
+ const metadata = getRuleMetadata(diagnostic.plugin, diagnostic.rule);
2472
+ if (!metadata) return true;
2473
+ if (metadata.tags.some((tag) => options.ignoredTags.has(tag))) return false;
2474
+ return options.includedTags.size === 0 || metadata.tags.some((tag) => options.includedTags.has(tag));
2475
+ }), directory, userConfig, () => null, {
2476
+ respectInlineDisables: false,
2477
+ warnings: options.warnings
2478
+ });
2395
2479
  const delta = computeDiagnosticDelta({
2396
2480
  headDiagnostics,
2397
2481
  baseDiagnostics,
2398
2482
  renamedFiles: options.baselineReport.renamedFiles ?? {},
2483
+ mapBaseLine: readBaselineLineMap(directory, options.baselineReport.sourceRevision),
2399
2484
  readHeadLine: () => null,
2400
2485
  readBaseLine: () => null
2401
2486
  });
@@ -2407,7 +2492,8 @@ const runInspectWithRuntime = async (directory, options, userConfig, hasConfigOv
2407
2492
  matchedCount: baseDiagnostics.length - delta.fixedCount,
2408
2493
  baseTotalCount: baseDiagnostics.length,
2409
2494
  fixedCount: delta.fixedCount,
2410
- crossFileMatchCount: delta.crossFileMatchCount
2495
+ crossFileMatchCount: delta.crossFileMatchCount,
2496
+ ruleCountMatchCount: delta.ruleCountMatchCount
2411
2497
  };
2412
2498
  } else if (options.baseline && isDiffMode && !didLintFail && !output.didDeadCodeFail && countIncompleteLintFiles(output.lintPartialFailures) === 0) {
2413
2499
  const comparison = await runBaselineComparison({
@@ -3084,5 +3170,5 @@ const shouldFailScanGate = (input) => {
3084
3170
  //#endregion
3085
3171
  export { createInvocationInspect as A, hasIncompleteScoreAnalysis as B, detectLaunchableAgents as C, buildHandoffPayload as D, launchCliAgent as E, formatSkippedCheckLabel as F, hasLintHardFailure as G, buildNoScoreMessage as H, formatElapsedTime as I, formatFixRecipeLine as J, buildRulePriorityMap as K, printFooter as L, resolveMergeBaseRef as M, printHeadlessReport as N, collectProjectSourceFiles as O, pluralize as P, printDiagnosticsDump as R, setUpGitHubActions as S, copyToClipboard as T, buildEmptyReportMessage as U, filterDiagnosticsByCategories as V, resolveInvocationOxlintConcurrency as W, formatLearnMoreLine as Y, retryMissingProjectScores as _, validateModeFlags as a, filterScansForSurface as b, partitionProjectScanOutcomes as c, buildCodeFrame as d, resolveProjectScan as f, resolveProjectRelativeDirectory as g, resolveProjectSourceFilePaths as h, validateIncludeUntrackedScope as i, inspect as j, deduplicateProjectScans as k, discoverWorkspacePackages as l, resolveProjectDiffIncludePaths as m, formatSkippedProjectsMessage as n, resolveExcludedProjectDirectories as o, resolveProjectChangedLineRanges as p, buildSortedRuleGroups as q, validateFilePathSelectionFlags as r, projectManifestChanged as s, shouldFailScanGate as t, selectProjects as u, resolveWorkspaceDeadCodeOwner as v, CLI_AGENT_BINARIES as w, countUniqueScannedFiles as x, resolveCliInspectOptions as y, formatDiagnosticSite as z };
3086
3172
 
3087
- //# sourceMappingURL=should-fail-scan-gate-CKT7Y6lq.js.map
3088
- //# debugId=5653d501-836b-5dd6-b859-a5e458a66ce1
3173
+ //# sourceMappingURL=should-fail-scan-gate-0HPfGaTS.js.map
3174
+ //# debugId=c34d252b-7de9-5778-a1c0-e9b0c46967d6
@@ -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]="867d1a87-fa13-5dc6-a452-94e380f946f0")}catch(e){}}();
3
- import { b as isNonInteractiveEnvironment } from "./record-metric-koJj2V6F.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]="84dd30b4-1237-56ec-916b-b4072be79751")}catch(e){}}();
3
+ import { b as isNonInteractiveEnvironment } from "./record-metric-COaAD5VE.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-OHfi1uxr.js.map
10
- //# debugId=867d1a87-fa13-5dc6-a452-94e380f946f0
9
+ //# sourceMappingURL=should-skip-prompts-Db09UIvm.js.map
10
+ //# debugId=84dd30b4-1237-56ec-916b-b4072be79751
@@ -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]="42dc1529-bcb5-5a1a-9347-2fc2973b1731")}catch(e){}}();
3
- import { b as isNonInteractiveEnvironment } from "./record-metric-koJj2V6F.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]="f5853d6a-d1d8-5253-b118-c06b4c85c379")}catch(e){}}();
3
+ import { b as isNonInteractiveEnvironment } from "./record-metric-COaAD5VE.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-Dt7R7qSa.js.map
25
- //# debugId=42dc1529-bcb5-5a1a-9347-2fc2973b1731
24
+ //# sourceMappingURL=should-use-tui-CO0fiHNd.js.map
25
+ //# debugId=f5853d6a-d1d8-5253-b118-c06b4c85c379
@@ -63,4 +63,4 @@ npx react-doctor@latest --verbose --scope changed
63
63
 
64
64
  ### Reuse a base scan
65
65
 
66
- Save a complete `--json` scan, then pass `--baseline base-report.json` to report only new findings. This also works with `--scope changed`. Use the same version and rules for both scans. Matches use the rule, file path with Git renames, message, and normalized flagged source. Each base finding can match once; line and column shifts do not make it new. Older reports without fingerprints must be regenerated.
66
+ Save a complete `--json` scan, then pass `--baseline base-report.json` to report only new findings. This also works with `--scope changed`. Use the same version and rules for both scans. Findings are grouped by rule and file path, following Git renames. Only increases in each group's count are reported; groups without an increase skip location matching. Fingerprints, message similarity, and Git-adjusted line distance select the added findings. Formatting and edits that keep the same counts report no new findings. Saved reports must use the same `textComponents`, `rawTextWrapperComponents`, and `respectInlineDisables` settings. Regenerate the base report after changing these settings, or use a Git comparison. Older reports without fingerprints or `sourceFilterConfigHash` must be regenerated.
@@ -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]="854081d3-0b1e-5431-b3c9-aab70d8b1431")}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]="3b8ae6e0-ff0a-5b05-a922-88269bc41a1a")}catch(e){}}();
3
3
  import { S as SENTRY_FLUSH_TIMEOUT_MS } from "./constants-rmkaA7iw.js";
4
- import { An as makeUnsafe, Ft as layerObservability, In as messageFromUnknown, J as anonymizeInPlace, Mn as void_, Mt as isReactDoctorError, Tn as buildWithScope, Y as anonymizeText, Yt as scrubSensitivePaths, _ as VERSION, a as isEnvFlagEnabled, bn as runPromise, dn as make, i as isTelemetryEnabled, jt as isProjectDiscoveryError, kn as close, o as buildSentryScope, xn as runSync, y as CliInputError, zn as isErrnoException } from "./record-metric-koJj2V6F.js";
4
+ import { Cn as runSync, Dn as buildWithScope, It as layerObservability, J as anonymizeInPlace, Mn as makeUnsafe, Mt as isProjectDiscoveryError, Nt as isReactDoctorError, Pn as void_, Rn as messageFromUnknown, Sn as runPromise, Vn as isErrnoException, Y as anonymizeText, Zt as scrubSensitivePaths, _ as VERSION, a as isEnvFlagEnabled, i as isTelemetryEnabled, jn as close, o as buildSentryScope, pn as make, y as CliInputError } from "./record-metric-COaAD5VE.js";
5
5
  //#region src/cli/utils/is-environment-error.ts
6
6
  const ENVIRONMENT_ERROR_CODES = new Set([
7
7
  "EACCES",
@@ -212,13 +212,13 @@ const isDevVersion = (version) => version === "0.0.0" || version.includes("-");
212
212
  * uploads source-map artifacts under, so stack frames symbolicate. Honors the
213
213
  * standard `SENTRY_RELEASE` override.
214
214
  */
215
- const resolveSentryRelease = () => process.env.SENTRY_RELEASE || `react-doctor@0.9.16-dev.675ad3c`;
215
+ const resolveSentryRelease = () => process.env.SENTRY_RELEASE || `react-doctor@0.9.16-dev.ef1be22`;
216
216
  /**
217
217
  * Deployment environment shown in Sentry's environment filter. Defaults to
218
218
  * `production` for tagged releases and `development` for dev/unbuilt versions,
219
219
  * overridable via the standard `SENTRY_ENVIRONMENT` env var.
220
220
  */
221
- const resolveSentryEnvironment = () => process.env.SENTRY_ENVIRONMENT || (isDevVersion("0.9.16-dev.675ad3c") ? "development" : "production");
221
+ const resolveSentryEnvironment = () => process.env.SENTRY_ENVIRONMENT || (isDevVersion("0.9.16-dev.ef1be22") ? "development" : "production");
222
222
  //#endregion
223
223
  //#region src/instrument.ts
224
224
  let sentryPromise = null;
@@ -396,5 +396,5 @@ const shutdownTelemetry = async () => {
396
396
  //#endregion
397
397
  export { initializeSentry as a, isNpmCacheCorruptionError as c, getSentry as i, formatEnvironmentError as l, shutdownTelemetry as n, isExpectedUserError as o, flushSentry as r, formatNpmCacheCorruptionError as s, getTelemetryContext as t, isEnvironmentError as u };
398
398
 
399
- //# sourceMappingURL=telemetry-runtime-DhCwCPKP.js.map
400
- //# debugId=854081d3-0b1e-5431-b3c9-aab70d8b1431
399
+ //# sourceMappingURL=telemetry-runtime-CEcDvXxW.js.map
400
+ //# debugId=3b8ae6e0-ff0a-5b05-a922-88269bc41a1a
@@ -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]="961007ac-c336-5a79-863b-8489091bcffd")}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]="60791b2d-265d-5a1b-80fb-9fd612e53a0e")}catch(e){}}();
3
3
  import { u as METRIC } from "./constants-rmkaA7iw.js";
4
- import { _ as VERSION, t as recordCount } from "./record-metric-koJj2V6F.js";
4
+ import { _ as VERSION, t as recordCount } from "./record-metric-COaAD5VE.js";
5
5
  //#region src/cli/commands/version.ts
6
6
  /**
7
7
  * oclif-style version line. 12-factor CLI Apps (#3, "What version am I
@@ -18,5 +18,5 @@ const versionAction = () => {
18
18
  //#endregion
19
19
  export { versionAction };
20
20
 
21
- //# sourceMappingURL=version-C4YtgcDq.js.map
22
- //# debugId=961007ac-c336-5a79-863b-8489091bcffd
21
+ //# sourceMappingURL=version-CP66Metq.js.map
22
+ //# debugId=60791b2d-265d-5a1b-80fb-9fd612e53a0e
@@ -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]="da35ea35-342d-540c-998c-6b26c5e77814")}catch(e){}}();
3
- import { t as inspectAction } from "./inspect-YXgF21wV.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]="5ab06a3c-2fc3-5077-8ffa-dc7a73d5d15d")}catch(e){}}();
3
+ import { t as inspectAction } from "./inspect-ZsJdCoBa.js";
4
4
  //#region src/cli/commands/why.ts
5
5
  /**
6
6
  * `why <file:line>` — explains why a rule fired (or why a suppression didn't
@@ -17,5 +17,5 @@ const whyAction = async (location, options) => {
17
17
  //#endregion
18
18
  export { whyAction };
19
19
 
20
- //# sourceMappingURL=why-CBJBIHgr.js.map
21
- //# debugId=da35ea35-342d-540c-998c-6b26c5e77814
20
+ //# sourceMappingURL=why-CyIuJZHz.js.map
21
+ //# debugId=5ab06a3c-2fc3-5077-8ffa-dc7a73d5d15d
@@ -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]="e87a9a26-6aff-5313-b515-659c9ee312c1")}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]="b8a12b58-3cd5-5733-b4a3-9df4e5b13f8e")}catch(e){}}();
3
3
  import { p as NANOSECONDS_PER_MILLISECOND } from "./constants-rmkaA7iw.js";
4
- import { Mn as void_, c as setSentryProjectInfo, jn as fail, o as buildSentryScope, pn as makeSpan, r as toSpanAttributes, s as buildSentryProjectContext, vn as provideContext, xn as runSync } from "./record-metric-koJj2V6F.js";
5
- import { t as getTelemetryContext } from "./telemetry-runtime-DhCwCPKP.js";
4
+ import { Cn as runSync, Nn as fail, Pn as void_, bn as provideContext, c as setSentryProjectInfo, hn as makeSpan, o as buildSentryScope, r as toSpanAttributes, s as buildSentryProjectContext } from "./record-metric-COaAD5VE.js";
5
+ import { t as getTelemetryContext } from "./telemetry-runtime-CEcDvXxW.js";
6
6
  import { i as setActiveRunTrace, r as recordRunTraceId } from "./active-run-trace-Dewycxda.js";
7
7
  //#region src/cli/utils/with-run-span.ts
8
8
  /**
@@ -107,5 +107,5 @@ const recordSentryProjectContext = (projectInfo, rootSpan, options = {}) => {
107
107
  //#endregion
108
108
  export { resetSentryRunState as n, withRunSpan as r, recordSentryProjectContext as t };
109
109
 
110
- //# sourceMappingURL=with-run-span-DUsmYNga.js.map
111
- //# debugId=e87a9a26-6aff-5313-b515-659c9ee312c1
110
+ //# sourceMappingURL=with-run-span-aYNrYjQY.js.map
111
+ //# debugId=b8a12b58-3cd5-5733-b4a3-9df4e5b13f8e
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "react-doctor",
3
- "version": "0.9.16-dev.675ad3c",
3
+ "version": "0.9.16-dev.ef1be22",
4
4
  "description": "Your agent writes bad React. This catches it",
5
5
  "keywords": [
6
6
  "accessibility",
@@ -70,7 +70,7 @@
70
70
  "typescript": ">=5.0.4 <6",
71
71
  "yaml": "^2.9.0",
72
72
  "yoga-layout": "~3.2.1",
73
- "oxlint-plugin-react-doctor": "0.9.16-dev.675ad3c"
73
+ "oxlint-plugin-react-doctor": "0.9.16-dev.ef1be22"
74
74
  },
75
75
  "devDependencies": {
76
76
  "@types/babel__code-frame": "^7.27.0",
@@ -83,8 +83,8 @@
83
83
  "ora": "^9.4.0",
84
84
  "react": "19.2.5",
85
85
  "react-devtools-core": "^7.0.1",
86
- "@react-doctor/core": "0.9.16",
87
- "@react-doctor/api": "0.9.16"
86
+ "@react-doctor/api": "0.9.16",
87
+ "@react-doctor/core": "0.9.16"
88
88
  },
89
89
  "engines": {
90
90
  "node": "^20.19.0 || >=22.13.0"