react-doctor 0.9.11-dev.f1899d2 → 0.9.12-dev.86198f1

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 (28) hide show
  1. package/dist/{build-section-divider-4ZztYtZV.js → build-section-divider-DHZDIOiT.js} +7 -7
  2. package/dist/{ci-B04VkLj2.js → ci-DNs73md0.js} +11 -11
  3. package/dist/cli.js +22 -22
  4. package/dist/{design-AAjcvExu.js → design-DJhMZpV0.js} +4 -4
  5. package/dist/{exit-gracefully-B7v9PIJk.js → exit-gracefully-CYTyitpL.js} +6 -6
  6. package/dist/index.d.ts +17 -19
  7. package/dist/index.js +29 -16
  8. package/dist/{inspect-CdQJI2XI.js → inspect-Di3W9fRk.js} +18 -18
  9. package/dist/{install-BRU4jf-Y.js → install-BM5_akdY.js} +8 -8
  10. package/dist/{install-doctor-script-Dn69YqKG.js → install-doctor-script-DONC221X.js} +4 -4
  11. package/dist/{install-github-workflow-BwELZAhu.js → install-github-workflow-Cn1g1qCj.js} +6 -6
  12. package/dist/{install-react-doctor-CcDiKPfC.js → install-react-doctor-D-5gMlFh.js} +8 -8
  13. package/dist/lsp.js +30 -10
  14. package/dist/{print-branded-header-_kkHIAUd.js → print-branded-header-BqOTK3ep.js} +4 -4
  15. package/dist/{read-object-file-Bsov5R1-.js → read-object-file-6XbVf1hj.js} +4 -4
  16. package/dist/{record-metric-CeygoJWT.js → record-metric-CsNC4O_Q.js} +41 -19
  17. package/dist/{report-error-uffmJocy.js → report-error-DkUx4ePX.js} +5 -5
  18. package/dist/{report-workflow-result-CMtcy7Eb.js → report-workflow-result-CnxQYm4L.js} +5 -5
  19. package/dist/{resolve-scope-CFro-KQO.js → resolve-scope-VYeciHMp.js} +6 -6
  20. package/dist/{rules-BkLea4GL.js → rules-BHuxNUWe.js} +6 -6
  21. package/dist/{run-scan-app-Befn2abh.js → run-scan-app-tfWkuR3n.js} +10 -10
  22. package/dist/{scan-C00HPxuL.js → scan-BB60TMXB.js} +8 -8
  23. package/dist/{should-fail-scan-gate-BEoC3SoQ.js → should-fail-scan-gate-83kHV2TB.js} +10 -10
  24. package/dist/{should-skip-prompts-De37OlfL.js → should-skip-prompts-B_13T5y9.js} +4 -4
  25. package/dist/{unref-stdin-DklpxlNQ.js → unref-stdin-BS_WPjIC.js} +4 -4
  26. package/dist/{version-CRfqT5pV.js → version-DEV3zEd5.js} +4 -4
  27. package/dist/{why-BTbl-alh.js → why-D0IleQEO.js} +4 -4
  28. package/package.json +6 -6
@@ -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]="98283582-1524-5393-968b-e62c11706c17")}catch(e){}}();
3
- import { At as anonymizeInPlace, Fn as scrubSensitivePaths, M as SENTRY_FLUSH_TIMEOUT_MS, Y as CANONICAL_GITHUB_URL, a as isEnvFlagEnabled, cn as highlighter, i as isTelemetryEnabled, jt as anonymizeText, nt as DOCS_URL, o as buildSentryScope } from "./record-metric-CeygoJWT.js";
4
- import { c as isExpectedUserError } from "./unref-stdin-DklpxlNQ.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]="3a1d6706-7e5e-5b38-9a23-8a9efca3a73f")}catch(e){}}();
3
+ import { At as anonymizeInPlace, Fn as scrubSensitivePaths, M as SENTRY_FLUSH_TIMEOUT_MS, Y as CANONICAL_GITHUB_URL, a as isEnvFlagEnabled, cn as highlighter, i as isTelemetryEnabled, jt as anonymizeText, nt as DOCS_URL, o as buildSentryScope } from "./record-metric-CsNC4O_Q.js";
4
+ import { c as isExpectedUserError } from "./unref-stdin-BS_WPjIC.js";
5
5
  import * as Sentry from "@sentry/node";
6
6
  //#region src/cli/utils/scrub-sentry-event.ts
7
7
  /**
@@ -71,13 +71,13 @@ const isDevVersion = (version) => version === "0.0.0" || version.includes("-");
71
71
  * uploads source-map artifacts under, so stack frames symbolicate. Honors the
72
72
  * standard `SENTRY_RELEASE` override.
73
73
  */
74
- const resolveSentryRelease = () => process.env.SENTRY_RELEASE || `react-doctor@0.9.11-dev.f1899d2`;
74
+ const resolveSentryRelease = () => process.env.SENTRY_RELEASE || `react-doctor@0.9.12-dev.86198f1`;
75
75
  /**
76
76
  * Deployment environment shown in Sentry's environment filter. Defaults to
77
77
  * `production` for tagged releases and `development` for dev/unbuilt versions,
78
78
  * overridable via the standard `SENTRY_ENVIRONMENT` env var.
79
79
  */
80
- const resolveSentryEnvironment = () => process.env.SENTRY_ENVIRONMENT || (isDevVersion("0.9.11-dev.f1899d2") ? "development" : "production");
80
+ const resolveSentryEnvironment = () => process.env.SENTRY_ENVIRONMENT || (isDevVersion("0.9.12-dev.86198f1") ? "development" : "production");
81
81
  //#endregion
82
82
  //#region src/instrument.ts
83
83
  let isInitialized = false;
@@ -227,5 +227,5 @@ const buildSectionDivider = () => highlighter.dim(`${DIVIDER_INDENT}${"─".repe
227
227
  //#endregion
228
228
  export { initializeSentry as a, flushSentry as i, buildFooterLinkLines as n, activeScanAbortRegistry as r, buildSectionDivider as t };
229
229
 
230
- //# sourceMappingURL=build-section-divider-4ZztYtZV.js.map
231
- //# debugId=98283582-1524-5393-968b-e62c11706c17
230
+ //# sourceMappingURL=build-section-divider-DHZDIOiT.js.map
231
+ //# debugId=3a1d6706-7e5e-5b38-9a23-8a9efca3a73f
@@ -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]="c4506989-df5f-5e29-890d-9feb446fc7b1")}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]="b56e8d27-b0cc-5144-853c-7fafd21f8821")}catch(e){}}();
3
3
  import { n as __require, r as __toESM, t as __commonJSMin } from "./chunk-q7NCDQ7-.js";
4
- import { X as CI_URL, ar as runSync, cn as highlighter, ot as GITHUB_ACTIONS_SETUP_URL, t as recordCount, w as METRIC } from "./record-metric-CeygoJWT.js";
5
- import { c as isExpectedUserError } from "./unref-stdin-DklpxlNQ.js";
6
- import { n as handleError, r as handleUserError, t as reportErrorToSentry } from "./report-error-uffmJocy.js";
7
- import { L as cliLogger, c as spinner, n as findNearestPackageDirectory } from "./install-doctor-script-Dn69YqKG.js";
8
- import { a as readReactDoctorWorkflow, d as detectDefaultBranch, f as runCommand, l as prompts, n as getReactDoctorWorkflowPath, s as upgradeWorkflowActionToV2, t as buildWorkflowContent } from "./install-github-workflow-BwELZAhu.js";
9
- import { a as isValidBlockingLevel, c as openWorkflowPullRequest, l as stageWorkflowFile, n as isScopeValue } from "./resolve-scope-CFro-KQO.js";
10
- import { t as shouldSkipPrompts } from "./should-skip-prompts-De37OlfL.js";
11
- import { t as printBrandedHeader } from "./print-branded-header-_kkHIAUd.js";
4
+ import { X as CI_URL, ar as runSync, cn as highlighter, ot as GITHUB_ACTIONS_SETUP_URL, t as recordCount, w as METRIC } from "./record-metric-CsNC4O_Q.js";
5
+ import { c as isExpectedUserError } from "./unref-stdin-BS_WPjIC.js";
6
+ import { n as handleError, r as handleUserError, t as reportErrorToSentry } from "./report-error-DkUx4ePX.js";
7
+ import { L as cliLogger, c as spinner, n as findNearestPackageDirectory } from "./install-doctor-script-DONC221X.js";
8
+ import { a as readReactDoctorWorkflow, d as detectDefaultBranch, f as runCommand, l as prompts, n as getReactDoctorWorkflowPath, s as upgradeWorkflowActionToV2, t as buildWorkflowContent } from "./install-github-workflow-Cn1g1qCj.js";
9
+ import { a as isValidBlockingLevel, c as openWorkflowPullRequest, l as stageWorkflowFile, n as isScopeValue } from "./resolve-scope-VYeciHMp.js";
10
+ import { t as shouldSkipPrompts } from "./should-skip-prompts-B_13T5y9.js";
11
+ import { t as printBrandedHeader } from "./print-branded-header-BqOTK3ep.js";
12
12
  import * as path$1 from "node:path";
13
13
  import * as fs$1 from "node:fs";
14
14
  //#region src/cli/utils/ci/ci-provider.ts
@@ -7497,5 +7497,5 @@ const ciConfigAction = (options) => runCiCommand("config", runCiConfig, options)
7497
7497
  //#endregion
7498
7498
  export { ciConfigAction, ciInstallAction, ciUpgradeAction };
7499
7499
 
7500
- //# sourceMappingURL=ci-B04VkLj2.js.map
7501
- //# debugId=c4506989-df5f-5e29-890d-9feb446fc7b1
7500
+ //# sourceMappingURL=ci-DNs73md0.js.map
7501
+ //# debugId=b56e8d27-b0cc-5144-853c-7fafd21f8821
package/dist/cli.js CHANGED
@@ -1,11 +1,11 @@
1
1
 
2
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]="c779427c-ed7c-5be4-b123-73410d3af015")}catch(e){}}();
3
3
  import { n as __require, r as __toESM, t as __commonJSMin } from "./chunk-q7NCDQ7-.js";
4
- import { In as setColorEnabled, R as CliInputError, V as isDebugFlagEnabled, X as CI_URL, Y as CANONICAL_GITHUB_URL, cn as highlighter, d as isJsonModeActive, g as VERSION, i as isTelemetryEnabled, m as writeJsonErrorReport } from "./record-metric-CeygoJWT.js";
5
- import { c as isExpectedUserError, r as getLastRunTraceId, s as shutdownTelemetry, t as unrefStdin } from "./unref-stdin-DklpxlNQ.js";
6
- import { a as initializeSentry, i as flushSentry } from "./build-section-divider-4ZztYtZV.js";
7
- import { t as exitGracefully } from "./exit-gracefully-B7v9PIJk.js";
8
- import { n as handleError, r as handleUserError, t as reportErrorToSentry } from "./report-error-uffmJocy.js";
4
+ import { In as setColorEnabled, R as CliInputError, V as isDebugFlagEnabled, X as CI_URL, Y as CANONICAL_GITHUB_URL, cn as highlighter, d as isJsonModeActive, g as VERSION, i as isTelemetryEnabled, m as writeJsonErrorReport } from "./record-metric-CsNC4O_Q.js";
5
+ import { c as isExpectedUserError, r as getLastRunTraceId, s as shutdownTelemetry, t as unrefStdin } from "./unref-stdin-BS_WPjIC.js";
6
+ import { a as initializeSentry, i as flushSentry } from "./build-section-divider-DHZDIOiT.js";
7
+ import { t as exitGracefully } from "./exit-gracefully-CYTyitpL.js";
8
+ import { n as handleError, r as handleUserError, t as reportErrorToSentry } from "./report-error-DkUx4ePX.js";
9
9
  import { execFileSync } from "node:child_process";
10
10
  //#region ../../node_modules/.pnpm/commander@14.0.3/node_modules/commander/lib/error.js
11
11
  var require_error = /* @__PURE__ */ __commonJSMin(((exports) => {
@@ -3481,7 +3481,7 @@ ${highlighter.dim("Learn more:")}
3481
3481
  const collectCategoryOption = (value, previousValues) => [...previousValues ?? [], value];
3482
3482
  const program = new Command().name("react-doctor").description("Diagnose React codebase health").version(VERSION, "-v, --version", "display the version number").argument("[directory]", "project directory to scan", ".").option("--lint", "enable linting").option("--no-lint", "skip linting").option("--dead-code", "enable dead-code analysis (default)").option("--no-dead-code", "skip dead-code analysis (unused files / exports / dependencies, circular imports)").option("--supply-chain", "enable the dependency supply-chain scan (default)").option("--no-supply-chain", "skip the dependency supply-chain scan (Socket.dev dependency health checks)").option("--verbose", "show every rule and per-file details (default shows top 3 rules)").option("--debug", "force a Sentry trace and print its id at the end (paste it into a bug report)").option("--output-dir <dir>", "directory for the full diagnostics dump (default: a temp folder)").option("--score", "output only the score").option("--json", "output a single structured JSON report (suppresses other output)").option("--json-compact", "with --json, emit compact JSON (no indentation)").option("--json-out <path>", "with --json, write the report to a file instead of stdout").option("--no-cache", "disable all scan caches for this run").option("-y, --yes", "skip prompts, scan all workspace projects").option("--no-parallel", "lint serially with one worker (default: parallel across CPU cores; set the worker count with REACT_DOCTOR_PARALLEL)").option("--project <name>", "select projects: workspace names or directory paths (comma-separated for multiple); overrides the `projects` config field").option("--scope <value>", "how much supported JS/TS and inline HTML script source to scan/report: full (default), files, changed (only new issues vs base), or lines (issues whose source spans touch changed lines)").option("--base <ref>", "base git ref for files/changed/lines scope (auto-detected when omitted)").option("--include-untracked", "with --scope files/changed/lines, also scan ordinary untracked files (respects .gitignore)").addOption(new Option("--diff [base]", "[deprecated] alias for --scope changed (pass `false` to force a full scan)").hideHelp()).addOption(new Option("--changed-files-from <file>", "scan source files listed in a newline-delimited changed-files file").hideHelp()).option("--no-score", "skip the score API, the share URL, and crash reporting").addOption(new Option("--category <category>", "only show diagnostics in a category (repeatable; e.g. Security)").argParser(collectCategoryOption)).option("--no-telemetry", "alias for --no-score (skip the score API, share URL, and crash reporting)").option("--staged", "scan only staged (git index) files for pre-commit hooks (honors --project and config `projects`; exits 0 when nothing is staged)").option("--max-duration <seconds>", MAX_DURATION_OPTION_DESCRIPTION).option("--blocking <level>", "severity that fails CI: error (default), warning, or none (advisory)").addOption(new Option("--fail-on <level>", "[deprecated] alias for --blocking <level>").hideHelp()).option("--no-respect-inline-disables", "audit mode: neutralize inline lint suppressions before scanning").option("--warnings", "show warning-severity diagnostics (default)").option("--no-warnings", "hide warning-severity diagnostics (errors only)").option("--color", "force colored output").option("--no-color", "disable colored output (also honors NO_COLOR)").addHelpText("after", renderRootHelpEpilog);
3483
3483
  program.action(async (directory = ".", flags) => {
3484
- const { runScanCommand } = await import("./scan-C00HPxuL.js");
3484
+ const { runScanCommand } = await import("./scan-BB60TMXB.js");
3485
3485
  return runScanCommand({
3486
3486
  directory,
3487
3487
  flags,
@@ -3489,72 +3489,72 @@ program.action(async (directory = ".", flags) => {
3489
3489
  });
3490
3490
  });
3491
3491
  program.command("design [directory]").description("Run only the focused UI design diagnostics").addHelpText("after", renderDesignHelpEpilog).action(async (directory, _options, command) => {
3492
- const { designAction } = await import("./design-AAjcvExu.js");
3492
+ const { designAction } = await import("./design-DJhMZpV0.js");
3493
3493
  return designAction(directory ?? ".", command.optsWithGlobals());
3494
3494
  });
3495
3495
  program.command("why <location>").description("Explain why a rule fired (or why a suppression didn't apply) at a file:line").option("--project <name>", "select projects: workspace names or directory paths (comma-separated for multiple)").option("-c, --cwd <cwd>", "working directory", process.cwd()).option("--color", "force colored output").option("--no-color", "disable colored output (also honors NO_COLOR)").action(async (location, options) => {
3496
- const { whyAction } = await import("./why-BTbl-alh.js");
3496
+ const { whyAction } = await import("./why-D0IleQEO.js");
3497
3497
  return whyAction(location, options);
3498
3498
  });
3499
3499
  program.command("install").alias("setup").description("Install the react-doctor skill into your coding agents and optional git hook").option("-y, --yes", "skip prompts, install for all detected agents").option("--dry-run", "show what would be installed without writing files").option("--agent-hooks", "install native non-blocking agent hooks for Claude Code and Cursor").option("-c, --cwd <cwd>", "working directory", process.cwd()).option("--color", "force colored output").option("--no-color", "disable colored output (also honors NO_COLOR)").addHelpText("after", renderInstallHelpEpilog).action(async (options, command) => {
3500
- const { installAction } = await import("./install-BRU4jf-Y.js");
3500
+ const { installAction } = await import("./install-BM5_akdY.js");
3501
3501
  return installAction(options, command);
3502
3502
  });
3503
3503
  const providerOption = ["--provider <name>", "ci provider: github-actions or gitlab-ci (auto-detected by default)"];
3504
3504
  const prOption = ["--pr", "open a pull request with the change instead of writing it to the working tree"];
3505
3505
  const ci = program.command("ci").description("Set up, upgrade, and configure React Doctor in your CI");
3506
3506
  ci.command("install").description("Add a CI workflow that scans every pull request").option(...providerOption).option(...prOption).option("--blocking <level>", "gate level: none (advisory, default), warning, or error").option("--scope <value>", "what a pull-request scan reports: changed (default), files, lines, full").option("--comment", "post a summary comment on each pull request").option("--no-comment", "don't post a summary comment").option("--review-comments", "add inline review comments on changed lines").option("--no-review-comments", "don't add inline review comments").option("--commit-status", "report a commit status with the health score").option("--no-commit-status", "don't report a commit status").option("-y, --yes", "skip prompts; use the defaults").option("-c, --cwd <cwd>", "working directory", process.cwd()).option("--color", "force colored output").option("--no-color", "disable colored output (also honors NO_COLOR)").addHelpText("after", renderCiHelpEpilog).action(async (_options, command) => {
3507
- const { ciInstallAction } = await import("./ci-B04VkLj2.js");
3507
+ const { ciInstallAction } = await import("./ci-DNs73md0.js");
3508
3508
  return ciInstallAction(command.optsWithGlobals());
3509
3509
  });
3510
3510
  ci.command("config").description("Change the gate, scan scope, and pull-request reporting").option(...providerOption).option("--blocking <level>", "gate level: none (advisory), warning, or error").option("--scope <value>", "what a pull-request scan reports: changed, files, lines, or full").option("--comment", "post a summary comment on each pull request").option("--no-comment", "don't post a summary comment").option("--review-comments", "add inline review comments on changed lines").option("--no-review-comments", "don't add inline review comments").option("--commit-status", "report a commit status with the health score").option("--no-commit-status", "don't report a commit status").option("-y, --yes", "skip prompts; print the current settings").option("-c, --cwd <cwd>", "working directory", process.cwd()).option("--color", "force colored output").option("--no-color", "disable colored output (also honors NO_COLOR)").action(async (_options, command) => {
3511
- const { ciConfigAction } = await import("./ci-B04VkLj2.js");
3511
+ const { ciConfigAction } = await import("./ci-DNs73md0.js");
3512
3512
  return ciConfigAction(command.optsWithGlobals());
3513
3513
  });
3514
3514
  ci.command("upgrade").description("Upgrade the CI workflow to the action's current major").option(...providerOption).option(...prOption).option("-y, --yes", "skip prompts").option("-c, --cwd <cwd>", "working directory", process.cwd()).option("--color", "force colored output").option("--no-color", "disable colored output (also honors NO_COLOR)").action(async (_options, command) => {
3515
- const { ciUpgradeAction } = await import("./ci-B04VkLj2.js");
3515
+ const { ciUpgradeAction } = await import("./ci-DNs73md0.js");
3516
3516
  return ciUpgradeAction(command.optsWithGlobals());
3517
3517
  });
3518
3518
  program.command("version").description("show the version with Node and platform info").option("--color", "force colored output").option("--no-color", "disable colored output (also honors NO_COLOR)").action(async () => {
3519
- const { versionAction } = await import("./version-CRfqT5pV.js");
3519
+ const { versionAction } = await import("./version-DEV3zEd5.js");
3520
3520
  return versionAction();
3521
3521
  });
3522
3522
  const rules = program.command("rules").description("List, explain, and configure which React Doctor rules run");
3523
3523
  rules.command("list").description("List rules and the severity they run at under your config").option("--category <name>", "only show rules in a category (e.g. Performance)").option("--tag <name>", "only show rules with a tag (e.g. design, test-noise)").option("--framework <name>", "only show rules for a framework (e.g. global, nextjs)").option("--configured", "only show rules your config has changed from the default").option("--json", "output a structured JSON array").option("-c, --cwd <cwd>", "working directory", process.cwd()).action(async (_options, command) => {
3524
- const { rulesListAction } = await import("./rules-BkLea4GL.js");
3524
+ const { rulesListAction } = await import("./rules-BHuxNUWe.js");
3525
3525
  return rulesListAction(command.optsWithGlobals());
3526
3526
  });
3527
3527
  rules.command("explain <rule>").description("Explain why a rule matters, its current severity, and how to configure it").option("--json", "output a structured JSON object").option("-c, --cwd <cwd>", "working directory", process.cwd()).action(async (rule, _options, command) => {
3528
- const { rulesExplainAction } = await import("./rules-BkLea4GL.js");
3528
+ const { rulesExplainAction } = await import("./rules-BHuxNUWe.js");
3529
3529
  return rulesExplainAction(rule, command.optsWithGlobals());
3530
3530
  });
3531
3531
  rules.command("set <rule> <severity>").description("Set a rule's severity: off, warn, or error").option("-c, --cwd <cwd>", "working directory", process.cwd()).action(async (rule, severity, _options, command) => {
3532
- const { rulesSetAction } = await import("./rules-BkLea4GL.js");
3532
+ const { rulesSetAction } = await import("./rules-BHuxNUWe.js");
3533
3533
  return rulesSetAction(rule, severity, command.optsWithGlobals());
3534
3534
  });
3535
3535
  rules.command("enable <rule>").description("Enable a rule at its recommended severity (or pass --severity)").option("--severity <level>", "severity to enable at: warn or error").option("-c, --cwd <cwd>", "working directory", process.cwd()).action(async (rule, _options, command) => {
3536
- const { rulesEnableAction } = await import("./rules-BkLea4GL.js");
3536
+ const { rulesEnableAction } = await import("./rules-BHuxNUWe.js");
3537
3537
  return rulesEnableAction(rule, command.optsWithGlobals());
3538
3538
  });
3539
3539
  rules.command("disable <rule>").description("Disable a rule so it never runs").option("-c, --cwd <cwd>", "working directory", process.cwd()).action(async (rule, _options, command) => {
3540
- const { rulesDisableAction } = await import("./rules-BkLea4GL.js");
3540
+ const { rulesDisableAction } = await import("./rules-BHuxNUWe.js");
3541
3541
  return rulesDisableAction(rule, command.optsWithGlobals());
3542
3542
  });
3543
3543
  rules.command("category <category> <severity>").description("Set the severity for a whole category (off, warn, error)").option("-c, --cwd <cwd>", "working directory", process.cwd()).action(async (category, severity, _options, command) => {
3544
- const { rulesCategoryAction } = await import("./rules-BkLea4GL.js");
3544
+ const { rulesCategoryAction } = await import("./rules-BHuxNUWe.js");
3545
3545
  return rulesCategoryAction(category, severity, command.optsWithGlobals());
3546
3546
  });
3547
3547
  rules.command("ignore-tag <tag>").description("Skip a whole rule family by tag before linting (e.g. design)").option("-c, --cwd <cwd>", "working directory", process.cwd()).action(async (tag, _options, command) => {
3548
- const { rulesIgnoreTagAction } = await import("./rules-BkLea4GL.js");
3548
+ const { rulesIgnoreTagAction } = await import("./rules-BHuxNUWe.js");
3549
3549
  return rulesIgnoreTagAction(tag, command.optsWithGlobals());
3550
3550
  });
3551
3551
  rules.command("unignore-tag <tag>").description("Stop ignoring a tag previously skipped via ignore-tag").option("-c, --cwd <cwd>", "working directory", process.cwd()).action(async (tag, _options, command) => {
3552
- const { rulesUnignoreTagAction } = await import("./rules-BkLea4GL.js");
3552
+ const { rulesUnignoreTagAction } = await import("./rules-BHuxNUWe.js");
3553
3553
  return rulesUnignoreTagAction(tag, command.optsWithGlobals());
3554
3554
  });
3555
3555
  program.command("experimental-lsp", { hidden: false }).description("[experimental] run the React Doctor language server over stdio (for editors)").allowUnknownOption().action(() => {});
3556
3556
  program.command("experimental-tui [directory]", { hidden: true }).description("[experimental] interactive, scrollable scan report").option("--blocking <level>", "severity that fails CI: error (default), warning, or none (advisory)").option("--color", "force colored output").option("--no-color", "disable colored output (also honors NO_COLOR)").option("--no-dead-code", "skip dead-code analysis").option("--no-supply-chain", "skip the dependency supply-chain scan").option("--score", "only print the numeric score (for scripts and CI)").option("--no-score", "skip the score API, the share URL, and crash reporting").option("--no-cache", "disable all scan caches for this run").option("--max-duration <seconds>", MAX_DURATION_OPTION_DESCRIPTION).option("-p, --project <names>", "scan specific workspace projects (comma-separated, or *)").option("-y, --yes", "skip the project prompt and scan every discovered project").action(async (directory = ".", _localOptions, command) => {
3557
- const { runScanCommand } = await import("./scan-C00HPxuL.js");
3557
+ const { runScanCommand } = await import("./scan-BB60TMXB.js");
3558
3558
  return runScanCommand({
3559
3559
  directory,
3560
3560
  flags: command.optsWithGlobals(),
@@ -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]="dac5c105-2ed3-5d50-962d-63be8c6c658f")}catch(e){}}();
3
- import { t as inspectAction } from "./inspect-CdQJI2XI.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]="1d2c441e-35f5-5da3-9d47-1219f9237d9e")}catch(e){}}();
3
+ import { t as inspectAction } from "./inspect-Di3W9fRk.js";
4
4
  //#region src/cli/commands/design.ts
5
5
  const designAction = async (directory, flags) => inspectAction(directory, {
6
6
  ...flags,
@@ -10,5 +10,5 @@ const designAction = async (directory, flags) => inspectAction(directory, {
10
10
  //#endregion
11
11
  export { designAction };
12
12
 
13
- //# sourceMappingURL=design-AAjcvExu.js.map
14
- //# debugId=dac5c105-2ed3-5d50-962d-63be8c6c658f
13
+ //# sourceMappingURL=design-DJhMZpV0.js.map
14
+ //# debugId=1d2c441e-35f5-5da3-9d47-1219f9237d9e
@@ -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]="78c092a4-60b1-52cf-8077-171cd2763aad")}catch(e){}}();
3
- import { d as isJsonModeActive, m as writeJsonErrorReport } from "./record-metric-CeygoJWT.js";
4
- import { s as shutdownTelemetry } from "./unref-stdin-DklpxlNQ.js";
5
- import { i as flushSentry, n as buildFooterLinkLines, r as activeScanAbortRegistry, t as buildSectionDivider } from "./build-section-divider-4ZztYtZV.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]="f292bde2-2efb-5ea5-a391-927ae5c056b6")}catch(e){}}();
3
+ import { d as isJsonModeActive, m as writeJsonErrorReport } from "./record-metric-CsNC4O_Q.js";
4
+ import { s as shutdownTelemetry } from "./unref-stdin-BS_WPjIC.js";
5
+ import { i as flushSentry, n as buildFooterLinkLines, r as activeScanAbortRegistry, t as buildSectionDivider } from "./build-section-divider-DHZDIOiT.js";
6
6
  //#region src/cli/utils/active-tui-renderer.ts
7
7
  let activeTuiRenderer = null;
8
8
  const registerActiveTuiRenderer = (renderer) => {
@@ -44,5 +44,5 @@ const exitGracefully = () => {
44
44
  //#endregion
45
45
  export { registerActiveTuiRenderer as n, exitGracefully as t };
46
46
 
47
- //# sourceMappingURL=exit-gracefully-B7v9PIJk.js.map
48
- //# debugId=78c092a4-60b1-52cf-8077-171cd2763aad
47
+ //# sourceMappingURL=exit-gracefully-CYTyitpL.js.map
48
+ //# debugId=f292bde2-2efb-5ea5-a391-927ae5c056b6
package/dist/index.d.ts CHANGED
@@ -10366,11 +10366,11 @@ interface DiagnoseResult {
10366
10366
  scannedFileCount?: number;
10367
10367
  project: ProjectInfo;
10368
10368
  /**
10369
- * Whether the scanned project resolved a React-compatible runtime (React
10370
- * or Preact). `false` means every React-runtime rule family was gated
10371
- * off, so an empty `diagnostics` array is vacuous — NOT the same as a
10372
- * clean React scan. Consumers gating on the result should treat
10373
- * `reactDetected === false` as "wrong scan target", not "all clear".
10369
+ * Whether the scanned project resolved a React-compatible runtime directly
10370
+ * or through a React-backed framework. `false` means every React-runtime
10371
+ * rule family was gated off, not that the scan target was unsupported:
10372
+ * other detected framework and library rule families still run, as do
10373
+ * framework-neutral rules on any analyzable project.
10374
10374
  * Mirrors `JsonReport.reactDetected`; same predicate as
10375
10375
  * `hasReactRuntime(result.project)`. Always set by `diagnose()`;
10376
10376
  * optional so hand-constructed results keep compiling.
@@ -10427,7 +10427,8 @@ interface DiagnoseProjectsResult {
10427
10427
  score: ScoreResult | null;
10428
10428
  /**
10429
10429
  * Whether any successfully scanned project resolved a React-compatible
10430
- * runtime (React or Preact). Absent when no project scanned successfully.
10430
+ * runtime directly or through a React-backed framework. Absent when no
10431
+ * project scanned successfully.
10431
10432
  * See `DiagnoseResult.reactDetected` for gating guidance; per-project
10432
10433
  * detail is on each `ProjectResultOk.reactDetected`.
10433
10434
  */
@@ -10660,14 +10661,13 @@ interface JsonReportV1$1 {
10660
10661
  mode: JsonReportMode;
10661
10662
  baselineDegraded?: boolean;
10662
10663
  /**
10663
- * Whether any scanned project resolved a React-compatible runtime (React
10664
- * or Preact). `false` means every React-runtime rule family was gated off,
10665
- * so an empty `diagnostics` array is vacuous — NOT the same as a clean
10666
- * React scan. Consumers gating on the report (CI, verifiers, hooks) should
10667
- * treat `reactDetected === false` as "wrong scan target", not "all clear"
10668
- * (per project, `projects[].project.reactVersion` / `preactVersion` say
10669
- * which roots were non-React). Absent when nothing was scanned (`projects`
10670
- * is empty), on error reports, and on reports from older CLI versions.
10664
+ * Whether any scanned project resolved a React-compatible runtime directly
10665
+ * or through a React-backed framework. `false` means every React-runtime
10666
+ * rule family was gated off, not that the scan target was unsupported:
10667
+ * other detected framework and library rule families still run, as do
10668
+ * framework-neutral rules on any analyzable project. Absent when
10669
+ * nothing was scanned (`projects` is empty), on error reports, and on
10670
+ * reports from older CLI versions.
10671
10671
  */
10672
10672
  reactDetected?: boolean;
10673
10673
  diff: JsonReportDiffInfo | null;
@@ -10972,13 +10972,11 @@ declare const defineConfig: (config: ReactDoctorConfig) => ReactDoctorConfig; //
10972
10972
  //#endregion
10973
10973
  //#region src/utils/has-react-runtime.d.ts
10974
10974
  /**
10975
- * Whether project discovery resolved a React-compatible runtime (React or
10976
- * Preact, which ships the same hooks + JSX model). This is the same
10977
- * predicate that grants the `react` capability, so `false` means every
10978
- * React-runtime rule family was gated off for the project.
10975
+ * Whether project discovery resolved a React-compatible runtime directly or
10976
+ * through a framework whose runtime is necessarily React-compatible.
10979
10977
  */
10980
10978
  declare const hasReactRuntime: (project: ProjectInfo) => boolean; //#endregion
10981
- //#region src/utils/filter-paths-outside-directories.d.ts
10979
+ //#region src/utils/has-supported-framework-or-library.d.ts
10982
10980
  //#endregion
10983
10981
  //#region ../api/dist/index.d.ts
10984
10982
  //#region src/diagnose.d.ts
package/dist/index.js CHANGED
@@ -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]="b86d99be-a791-5cdc-81b1-adc1959ba874")}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]="5ed02ea3-f769-5273-a8b7-d6593605c860")}catch(e){}}();
3
3
  import { i as __toESM$1, r as __require, t as __commonJSMin$1 } from "./chunk-ChKA3wi6.js";
4
4
  import { createRequire } from "node:module";
5
5
  import { ALL_REACT_DOCTOR_RULE_KEYS, CROSS_FILE_DEPENDENCY_COLLECTORS, CROSS_FILE_RULE_IDS, FRAMEWORK_SPECIFIC_RULE_KEYS, FRAMEWORK_TOKENS, MOTION_LIBRARY_PACKAGES, REACT_COMPILER_RULES, REACT_DOCTOR_RULES, REACT_DOCTOR_RULE_REGISTRY, REACT_DOCTOR_SCAN_RULES, classifySecurityScanFile, collectCrossFileDependencyProbes, resetManifestCaches, shouldReadSecurityScanContent } from "oxlint-plugin-react-doctor/core";
@@ -20673,11 +20673,11 @@ var JsonReportV1 = class extends Class("JsonReportV1")({
20673
20673
  */
20674
20674
  baselineDegraded: optional(Boolean$1),
20675
20675
  /**
20676
- * Whether any scanned project resolved a React-compatible runtime (React
20677
- * or Preact). `false` means every React-runtime rule family was gated off,
20678
- * so an empty `diagnostics` array is vacuous — NOT the same as a clean
20679
- * React scan. Consumers gating on the report (CI, verifiers, hooks) should
20680
- * treat `reactDetected === false` as "wrong scan target", not "all clear".
20676
+ * Whether any scanned project resolved a React-compatible runtime directly
20677
+ * or through a React-backed framework. `false` means every React-runtime
20678
+ * rule family was gated off, not that the scan target was unsupported:
20679
+ * other detected framework and library rule families still run, as do
20680
+ * framework-neutral rules on any analyzable project.
20681
20681
  * Absent when nothing was scanned (`projects` is empty), on error reports,
20682
20682
  * and on reports from older CLI versions.
20683
20683
  */
@@ -63958,7 +63958,7 @@ const SOCKET_FREE_USER_AGENT = "react-doctor-supply-chain";
63958
63958
  const FILE_LINT_CACHE_FILENAME = "file-lint-cache.json";
63959
63959
  const FILE_LINT_CACHE_MAX_FILE_COUNT = 5e4;
63960
63960
  const SIDECAR_LINT_CACHE_FILENAME = "sidecar-lint-cache.json";
63961
- const CORE_PACKAGE_VERSION = "0.9.11";
63961
+ const CORE_PACKAGE_VERSION = "0.9.12";
63962
63962
  const DEAD_CODE_CACHE_FILENAME = "dead-code-cache.json";
63963
63963
  const DEAD_CODE_SUMMARY_CACHE_FILENAME = "dead-code-summaries.json";
63964
63964
  const SUPPLY_CHAIN_PLUGIN = "socket";
@@ -70788,6 +70788,21 @@ function* collectSecurityScanFiles(rootDirectory, excludedDirectories = /* @__PU
70788
70788
  }
70789
70789
  }
70790
70790
  }
70791
+ const REACT_COMPATIBLE_FRAMEWORKS = new Set([
70792
+ "nextjs",
70793
+ "tanstack-start",
70794
+ "cra",
70795
+ "remix",
70796
+ "gatsby",
70797
+ "expo",
70798
+ "react-native",
70799
+ "preact"
70800
+ ]);
70801
+ /**
70802
+ * Whether project discovery resolved a React-compatible runtime directly or
70803
+ * through a framework whose runtime is necessarily React-compatible.
70804
+ */
70805
+ const hasReactRuntime = (project) => project.reactVersion !== null || project.preactVersion !== null || REACT_COMPATIBLE_FRAMEWORKS.has(project.framework);
70791
70806
  const CLIENT_ONLY_FRAMEWORKS = new Set([
70792
70807
  "vite",
70793
70808
  "cra",
@@ -70809,7 +70824,7 @@ const addVersionCapabilityLadder = (capabilities, name, detectedVersion, earlies
70809
70824
  const buildCapabilities = (project) => {
70810
70825
  const capabilities = /* @__PURE__ */ new Set();
70811
70826
  capabilities.add(project.framework);
70812
- if (project.reactVersion !== null || project.preactVersion !== null) capabilities.add("react");
70827
+ if (hasReactRuntime(project)) capabilities.add("react");
70813
70828
  if (project.framework === "expo" || project.framework === "react-native" || project.hasReactNativeWorkspace) capabilities.add("react-native");
70814
70829
  if (project.expoVersion !== null) {
70815
70830
  capabilities.add("expo");
@@ -73096,6 +73111,9 @@ const createOxlintConfig = ({ pluginPath, project, customRulesOnly = false, exte
73096
73111
  if (reactHooksJsPlugin) jsPlugins.push(reactHooksJsPlugin.entry);
73097
73112
  const capabilities = getCapabilities(project);
73098
73113
  const settingsRootDirectory = resolveSettingsRootDirectory(project.rootDirectory);
73114
+ const noMultiCompOverride = resolveRuleSeverityOverride({ ruleKey: "react-doctor/no-multi-comp" }, severityControls);
73115
+ const multiComponentFileOverride = resolveRuleSeverityOverride({ ruleKey: "react-doctor/no-multi-component-file" }, severityControls);
73116
+ const shouldUseExplicitNoMultiCompPolicy = noMultiCompOverride !== void 0 && multiComponentFileOverride === void 0;
73099
73117
  const enabledReactDoctorRules = {};
73100
73118
  for (const registryEntry of REACT_DOCTOR_RULES) {
73101
73119
  const rule = REACT_DOCTOR_RULE_REGISTRY[registryEntry.id];
@@ -73104,6 +73122,7 @@ const createOxlintConfig = ({ pluginPath, project, customRulesOnly = false, exte
73104
73122
  if (ruleSelection === "sidecar" && !CROSS_FILE_RULE_IDS.has(registryEntry.id)) continue;
73105
73123
  if (ruleSelection === "sidecar" && sidecarRuleIdFilter !== void 0 && !sidecarRuleIdFilter.has(registryEntry.id)) continue;
73106
73124
  if (rule.isScanRule) continue;
73125
+ if (registryEntry.id === "no-multi-component-file" && shouldUseExplicitNoMultiCompPolicy) continue;
73107
73126
  if (customRulesOnly && registryEntry.originallyExternal) continue;
73108
73127
  if (rule.framework !== "global" && !rule.requires) continue;
73109
73128
  if (!shouldEnableRule(rule.requires, rule.tags, capabilities, ignoredTags, rule.disabledWhen, includedTags)) continue;
@@ -73140,6 +73159,7 @@ const createOxlintConfig = ({ pluginPath, project, customRulesOnly = false, exte
73140
73159
  plugins: [],
73141
73160
  jsPlugins: [...jsPlugins, pluginPath],
73142
73161
  settings: { "react-doctor": {
73162
+ portedRuleMode: "curated",
73143
73163
  framework: project.framework,
73144
73164
  rootDirectory: settingsRootDirectory,
73145
73165
  capabilities: [...capabilities].sort(),
@@ -77226,13 +77246,6 @@ const summarizeDiagnostics = (diagnostics, worstScore = null, worstScoreLabel =
77226
77246
  scoreLabel: worstScoreLabel
77227
77247
  };
77228
77248
  };
77229
- /**
77230
- * Whether project discovery resolved a React-compatible runtime (React or
77231
- * Preact, which ships the same hooks + JSX model). This is the same
77232
- * predicate that grants the `react` capability, so `false` means every
77233
- * React-runtime rule family was gated off for the project.
77234
- */
77235
- const hasReactRuntime = (project) => project.reactVersion !== null || project.preactVersion !== null;
77236
77249
  const isScanComplete = (input) => input.analyzedFileCount !== void 0 && input.scannedFileCount !== void 0 && input.skippedCheckCount === 0 && input.skippedCheckReasonCount === 0 && input.analyzedFileCount === input.scannedFileCount;
77237
77250
  const toJsonDiff = (diff) => {
77238
77251
  if (!diff) return null;
@@ -77738,4 +77751,4 @@ const toJsonReport = (result, options) => buildJsonReport({
77738
77751
  export { AmbiguousProjectError, NoReactDependencyError, NotADirectoryError, PackageJsonNotFoundError, ProjectNotFoundError, ReactDoctorError, buildJsonReport, buildJsonReportError, clearCaches, defineConfig, diagnose, filterSourceFiles, getDiffInfo, hasReactRuntime, isProjectDiscoveryError, isReactDoctorError, summarizeDiagnostics, toJsonReport };
77739
77752
 
77740
77753
  //# sourceMappingURL=index.js.map
77741
- //# debugId=b86d99be-a791-5cdc-81b1-adc1959ba874
77754
+ //# debugId=5ed02ea3-f769-5273-a8b7-d6593605c860
@@ -1,17 +1,17 @@
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]="c230a02a-29bb-5b01-b0a5-4bd9caed97cc")}catch(e){}}();
3
- import { Cn as mapWithConcurrency, Dn as remainingDeadlineBudgetMs, En as messageFromUnknown, F as STAGED_SNAPSHOT_ADDITIONAL_CONFIG_FILENAMES, G as isCiOrCodingAgentEnvironment, Gt as discoverReactSubprojects, K as isCodingAgentEnvironment, Mn as resolveScanTarget, Nt as buildJsonReport, Ot as StagedFiles, P as STAGED_FILES_TEMP_DIR_PREFIX, Qt as getBaselineDiffPlan, R as CliInputError, Tt as STAGED_FILES_PROJECT_CONFIG_FILENAMES, V as isDebugFlagEnabled, Wt as detectAiTrainingEnvironment, Xn as gen, Y as CANONICAL_GITHUB_URL, Yt as findLegacyConfig, cn as highlighter, ct as Git, dr as provide, en as getChangedLineRanges, f as setJsonReportDirectory, g as VERSION, h as writeJsonReport, ir as runPromise, m as writeJsonErrorReport, mn as isPlainObject, n as recordDistribution, nn as getDiffInfo, on as hasReactRuntime, p as setJsonReportMode, pn as isPathInsideDirectory, t as recordCount, tr as provide$1, u as enableJsonMode, un as isErrnoException, w as METRIC, xn as listWorkspacePackages, zn as toRelativePath } from "./record-metric-CeygoJWT.js";
4
- import { c as isExpectedUserError, s as shutdownTelemetry } from "./unref-stdin-DklpxlNQ.js";
5
- import { i as flushSentry } from "./build-section-divider-4ZztYtZV.js";
6
- import { n as handleError, r as handleUserError, t as reportErrorToSentry } from "./report-error-uffmJocy.js";
7
- import { F as runGitRaw, L as cliLogger, c as spinner, i as hasDoctorScript, n as findNearestPackageDirectory, o as isSpinnerSilent, s as setSpinnerSilent } from "./install-doctor-script-Dn69YqKG.js";
8
- import { a as readReactDoctorWorkflow, c as workflowUsesV1Action, i as isReactDoctorWorkflowInstalled, l as prompts, s as upgradeWorkflowActionToV2 } from "./install-github-workflow-BwELZAhu.js";
9
- import { c as openWorkflowPullRequest, i as warnDeprecatedDiff, l as stageWorkflowFile, r as resolveScope, s as resolveBlockingLevel, t as finalizeScope, u as toForwardSlashes } from "./resolve-scope-CFro-KQO.js";
10
- import { t as shouldSkipPrompts } from "./should-skip-prompts-De37OlfL.js";
11
- import { A as resolveMergeBaseRef, B as buildEmptyReportMessage, C as copyToClipboard, D as deduplicateProjectScans, E as collectProjectSourceFileCounts, F as printDiagnosticsDump, O as createInvocationInspect, R as filterDiagnosticsByCategories, S as CLI_AGENT_BINARIES, T as buildHandoffPayload, _ as resolveCliInspectOptions, a as projectManifestChanged, b as setUpGitHubActions, c as selectProjects, d as resolveProjectChangedLineRanges, f as resolveProjectDiffIncludePaths, g as resolveWorkspaceDeadCodeOwner, h as retryMissingProjectScores, i as validateModeFlags, j as printHeadlessReport, k as inspect, l as buildCodeFrame, m as resolveProjectRelativeDirectory, n as formatSkippedProjectsMessage, o as partitionProjectScanOutcomes, p as resolveProjectSourceFilePaths, r as validateIncludeUntrackedScope, t as shouldFailScanGate, u as resolveProjectScan, v as filterScansForSurface, w as launchCliAgent, x as detectLaunchableAgents, y as countUniqueScannedFiles } from "./should-fail-scan-gate-BEoC3SoQ.js";
12
- import { a as recordGate, i as readPreference, o as runMigrations, p as SETUP_HINT_EVENT, r as isGatePending, s as writePreference, u as HANDOFF_TARGET_PREFERENCE_ID } from "./report-workflow-result-CMtcy7Eb.js";
13
- import { a as askUpgradeActionVersion, c as recordCiPromptDecision, i as installReactDoctorAgentHooks, l as hasHandledActionUpgrade, o as askAddToGitHubActions, r as findAgentsWithLegacyShellHooks, s as hasHandledCiPrompt, t as getSkillSourceDirectory, u as recordActionUpgradeDecision } from "./install-react-doctor-CcDiKPfC.js";
14
- import { t as readObjectFile } from "./read-object-file-Bsov5R1-.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]="1377002d-cec2-54b4-bd88-b828a61a841f")}catch(e){}}();
3
+ import { Cn as mapWithConcurrency, Dn as remainingDeadlineBudgetMs, En as messageFromUnknown, F as STAGED_SNAPSHOT_ADDITIONAL_CONFIG_FILENAMES, G as isCiOrCodingAgentEnvironment, Gt as discoverReactSubprojects, K as isCodingAgentEnvironment, Mn as resolveScanTarget, Nt as buildJsonReport, Ot as StagedFiles, P as STAGED_FILES_TEMP_DIR_PREFIX, Qt as getBaselineDiffPlan, R as CliInputError, Tt as STAGED_FILES_PROJECT_CONFIG_FILENAMES, V as isDebugFlagEnabled, Wt as detectAiTrainingEnvironment, Xn as gen, Y as CANONICAL_GITHUB_URL, Yt as findLegacyConfig, cn as highlighter, ct as Git, dr as provide, en as getChangedLineRanges, f as setJsonReportDirectory, g as VERSION, h as writeJsonReport, ir as runPromise, m as writeJsonErrorReport, mn as isPlainObject, n as recordDistribution, nn as getDiffInfo, on as hasSupportedFrameworkOrLibrary, p as setJsonReportMode, pn as isPathInsideDirectory, t as recordCount, tr as provide$1, u as enableJsonMode, un as isErrnoException, w as METRIC, xn as listWorkspacePackages, zn as toRelativePath } from "./record-metric-CsNC4O_Q.js";
4
+ import { c as isExpectedUserError, s as shutdownTelemetry } from "./unref-stdin-BS_WPjIC.js";
5
+ import { i as flushSentry } from "./build-section-divider-DHZDIOiT.js";
6
+ import { n as handleError, r as handleUserError, t as reportErrorToSentry } from "./report-error-DkUx4ePX.js";
7
+ import { F as runGitRaw, L as cliLogger, c as spinner, i as hasDoctorScript, n as findNearestPackageDirectory, o as isSpinnerSilent, s as setSpinnerSilent } from "./install-doctor-script-DONC221X.js";
8
+ import { a as readReactDoctorWorkflow, c as workflowUsesV1Action, i as isReactDoctorWorkflowInstalled, l as prompts, s as upgradeWorkflowActionToV2 } from "./install-github-workflow-Cn1g1qCj.js";
9
+ import { c as openWorkflowPullRequest, i as warnDeprecatedDiff, l as stageWorkflowFile, r as resolveScope, s as resolveBlockingLevel, t as finalizeScope, u as toForwardSlashes } from "./resolve-scope-VYeciHMp.js";
10
+ import { t as shouldSkipPrompts } from "./should-skip-prompts-B_13T5y9.js";
11
+ import { A as resolveMergeBaseRef, B as buildEmptyReportMessage, C as copyToClipboard, D as deduplicateProjectScans, E as collectProjectSourceFileCounts, F as printDiagnosticsDump, O as createInvocationInspect, R as filterDiagnosticsByCategories, S as CLI_AGENT_BINARIES, T as buildHandoffPayload, _ as resolveCliInspectOptions, a as projectManifestChanged, b as setUpGitHubActions, c as selectProjects, d as resolveProjectChangedLineRanges, f as resolveProjectDiffIncludePaths, g as resolveWorkspaceDeadCodeOwner, h as retryMissingProjectScores, i as validateModeFlags, j as printHeadlessReport, k as inspect, l as buildCodeFrame, m as resolveProjectRelativeDirectory, n as formatSkippedProjectsMessage, o as partitionProjectScanOutcomes, p as resolveProjectSourceFilePaths, r as validateIncludeUntrackedScope, t as shouldFailScanGate, u as resolveProjectScan, v as filterScansForSurface, w as launchCliAgent, x as detectLaunchableAgents, y as countUniqueScannedFiles } from "./should-fail-scan-gate-83kHV2TB.js";
12
+ import { a as recordGate, i as readPreference, o as runMigrations, p as SETUP_HINT_EVENT, r as isGatePending, s as writePreference, u as HANDOFF_TARGET_PREFERENCE_ID } from "./report-workflow-result-CnxQYm4L.js";
13
+ import { a as askUpgradeActionVersion, c as recordCiPromptDecision, i as installReactDoctorAgentHooks, l as hasHandledActionUpgrade, o as askAddToGitHubActions, r as findAgentsWithLegacyShellHooks, s as hasHandledCiPrompt, t as getSkillSourceDirectory, u as recordActionUpgradeDecision } from "./install-react-doctor-D-5gMlFh.js";
14
+ import { t as readObjectFile } from "./read-object-file-6XbVf1hj.js";
15
15
  import * as path$1 from "node:path";
16
16
  import * as fs$1 from "node:fs";
17
17
  import { tmpdir } from "node:os";
@@ -701,7 +701,7 @@ const buildFinalCliScanOutcome = (input) => {
701
701
  baselineDegraded,
702
702
  mode: baselineDegraded ? "diff" : input.mode,
703
703
  scansForJsonReport: filterCompletedScansByCategories(input.completedScans, input.categoryFilters),
704
- shouldWarnNoReactDetected: input.completedScans.length > 0 && !input.completedScans.some((scan) => hasReactRuntime(scan.result.project))
704
+ shouldWarnNoSupportedLibraryDetected: input.completedScans.length > 0 && !input.completedScans.some((scan) => hasSupportedFrameworkOrLibrary(scan.result.project))
705
705
  };
706
706
  };
707
707
  //#endregion
@@ -723,9 +723,9 @@ const finalizeCliScans = (input) => {
723
723
  baselineIntended: input.baselineIntended,
724
724
  categoryFilters: input.categoryFilters
725
725
  });
726
- if (outcome.shouldWarnNoReactDetected) {
726
+ if (outcome.shouldWarnNoSupportedLibraryDetected) {
727
727
  recordCount(METRIC.scanNoReactDetected, 1);
728
- cliLogger.warn(`No React project detected at ${input.resolvedDirectory} — React rules were gated off; this is not the same as a clean scan.`);
728
+ cliLogger.warn(`No supported framework or library detected at ${input.resolvedDirectory} — library-specific rules were gated off; framework-neutral rules still ran.`);
729
729
  }
730
730
  if (input.isJsonMode) writeJsonReport(buildJsonReport({
731
731
  version: VERSION,
@@ -1439,5 +1439,5 @@ const inspectAction = async (directory, flags, invocationCommand = "inspect") =>
1439
1439
  //#endregion
1440
1440
  export { warnDeprecatedFailOn as n, runProjectMigrations as r, inspectAction as t };
1441
1441
 
1442
- //# sourceMappingURL=inspect-CdQJI2XI.js.map
1443
- //# debugId=c230a02a-29bb-5b01-b0a5-4bd9caed97cc
1442
+ //# sourceMappingURL=inspect-Di3W9fRk.js.map
1443
+ //# debugId=1377002d-cec2-54b4-bd88-b828a61a841f
@@ -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]="1b04cd8c-6d2b-5b04-bf05-6ef485988eb7")}catch(e){}}();
3
- import { ar as runSync, t as recordCount, w as METRIC } from "./record-metric-CeygoJWT.js";
4
- import { c as isExpectedUserError } from "./unref-stdin-DklpxlNQ.js";
5
- import { n as handleError, r as handleUserError, t as reportErrorToSentry } from "./report-error-uffmJocy.js";
6
- import { t as printBrandedHeader } from "./print-branded-header-_kkHIAUd.js";
7
- import { n as runInstallReactDoctor } from "./install-react-doctor-CcDiKPfC.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]="595fe8cd-15f0-5f7c-802a-bc16bd92c1ac")}catch(e){}}();
3
+ import { ar as runSync, t as recordCount, w as METRIC } from "./record-metric-CsNC4O_Q.js";
4
+ import { c as isExpectedUserError } from "./unref-stdin-BS_WPjIC.js";
5
+ import { n as handleError, r as handleUserError, t as reportErrorToSentry } from "./report-error-DkUx4ePX.js";
6
+ import { t as printBrandedHeader } from "./print-branded-header-BqOTK3ep.js";
7
+ import { n as runInstallReactDoctor } from "./install-react-doctor-D-5gMlFh.js";
8
8
  //#region src/cli/commands/install.ts
9
9
  const installAction = async (options, command) => {
10
10
  recordCount(METRIC.cliInvoked, 1, { command: "install" });
@@ -28,5 +28,5 @@ const installAction = async (options, command) => {
28
28
  //#endregion
29
29
  export { installAction };
30
30
 
31
- //# sourceMappingURL=install-BRU4jf-Y.js.map
32
- //# debugId=1b04cd8c-6d2b-5b04-bf05-6ef485988eb7
31
+ //# sourceMappingURL=install-BM5_akdY.js.map
32
+ //# debugId=595fe8cd-15f0-5f7c-802a-bc16bd92c1ac
@@ -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]="d5b8d828-d22c-5ccc-8832-7c85a3144cfc")}catch(e){}}();
3
- import { Gn as log, Kn as warn, O as RUN_GIT_MAX_BUFFER_BYTES, Un as error$1, Wn as info$1, ar as runSync, cn as highlighter, z as isNonInteractiveEnvironment } from "./record-metric-CeygoJWT.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]="653877d7-0456-5dbf-9f0f-ecc8e8f30ec9")}catch(e){}}();
3
+ import { Gn as log, Kn as warn, O as RUN_GIT_MAX_BUFFER_BYTES, Un as error$1, Wn as info$1, ar as runSync, cn as highlighter, z as isNonInteractiveEnvironment } from "./record-metric-CsNC4O_Q.js";
4
4
  import { execFileSync } from "node:child_process";
5
5
  import * as path$1 from "node:path";
6
6
  import * as fs$1 from "node:fs";
@@ -3247,5 +3247,5 @@ const installReactDoctorScriptStep = (projectRoot) => {
3247
3247
  //#endregion
3248
3248
  export { packageHasNestedRecordKey as A, SIMPLE_GIT_HOOKS_CONFIG_FILE as C, getPackageJsonPath as D, ensureTrailingNewline as E, runGitRaw as F, writeJsonFile as I, cliLogger as L, readPackageJson as M, resolveGitPath as N, isRecord as O, runGit as P, REACT_DOCTOR_COMMAND as S, VITE_PLUS_HOOKS_PATH as T, LEFTHOOK_CONFIG_FILES as _, installReactDoctorScriptStep as a, OVERCOMMIT_CONFIG_FILE as b, spinner as c, stripAnsi as d, isUnicodeSupported as f, HUSKY_HOOKS_PATH as g, HOOK_RELATIVE_PATH as h, hasDoctorScript as i, packageHasRecordKey as j, packageHasDependency as k, isFullWidth as l, HOOK_FILE_NAME as m, findNearestPackageDirectory as n, isSpinnerSilent as o, chalk as p, hasDoctorDependency as r, setSpinnerSilent as s, DOCTOR_PACKAGE_NAME as t, isWide as u, LEGACY_HOOK_RUNNER_RELATIVE_PATH as v, SIMPLE_GIT_HOOKS_PACKAGE_JSON_KEY as w, PRE_COMMIT_CONFIG_FILE as x, NON_BLOCKING_REACT_DOCTOR_COMMAND as y };
3249
3249
 
3250
- //# sourceMappingURL=install-doctor-script-Dn69YqKG.js.map
3251
- //# debugId=d5b8d828-d22c-5ccc-8832-7c85a3144cfc
3250
+ //# sourceMappingURL=install-doctor-script-DONC221X.js.map
3251
+ //# debugId=653877d7-0456-5dbf-9f0f-ecc8e8f30ec9
@@ -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]="a55265fa-d121-5010-8c8f-88cee3136a64")}catch(e){}}();
3
- import { C as GH_DEFAULT_BRANCH_PROBE_TIMEOUT_MS } from "./record-metric-CeygoJWT.js";
4
- import { t as unrefStdin } from "./unref-stdin-DklpxlNQ.js";
5
- import { L as cliLogger } from "./install-doctor-script-Dn69YqKG.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]="e93829ac-194f-5c3e-8dec-40f22fc5c4c9")}catch(e){}}();
3
+ import { C as GH_DEFAULT_BRANCH_PROBE_TIMEOUT_MS } from "./record-metric-CsNC4O_Q.js";
4
+ import { t as unrefStdin } from "./unref-stdin-BS_WPjIC.js";
5
+ import { L as cliLogger } from "./install-doctor-script-DONC221X.js";
6
6
  import { createRequire } from "node:module";
7
7
  import { execFile } from "node:child_process";
8
8
  import * as path$1 from "node:path";
@@ -263,5 +263,5 @@ const upgradeReactDoctorWorkflowInPlace = (projectRoot) => {
263
263
  //#endregion
264
264
  export { readReactDoctorWorkflow as a, workflowUsesV1Action as c, detectDefaultBranch as d, runCommand as f, isReactDoctorWorkflowInstalled as i, prompts as l, getReactDoctorWorkflowPath as n, upgradeReactDoctorWorkflowInPlace as o, installReactDoctorWorkflow as r, upgradeWorkflowActionToV2 as s, buildWorkflowContent as t, isCommandAvailable as u };
265
265
 
266
- //# sourceMappingURL=install-github-workflow-BwELZAhu.js.map
267
- //# debugId=a55265fa-d121-5010-8c8f-88cee3136a64
266
+ //# sourceMappingURL=install-github-workflow-Cn1g1qCj.js.map
267
+ //# debugId=e93829ac-194f-5c3e-8dec-40f22fc5c4c9