{
  "$schema": "./node_modules/oxlint/configuration_schema.json",
  "plugins": [],
  "categories": {
    "correctness": "off"
  },
  "options": {
    "reportUnusedDisableDirectives": "warn",
    "typeAware": true
  },
  "env": {
    "builtin": true
  },
  "ignorePatterns": [
    "**/lib/**",
    "**/node_modules/**",
    "**/.sessions/**",
    ".claude/**", // Harness-local state belongs to other checkouts, not this checkout's sources.
    "**/.doc-typecheck-*/**",
    "**/.node-next-types-*/**",
    "**/.oxlint-contract-*/**", // Scratch files created by the executable lint-contract tests.
    "**/oxlint-contract-*", // Flat probes use real TypeScript project include paths.
    "packages/typert/generator/tests/fixtures/type-model/**", // tsgolint rejects this fixture's preserved project shapes before rules run.
    "website/.generated/**",
    "vendor/**", // Vendored source keeps upstream style and idioms.
    "native/**", // The imported landlock-run subtree has its own gates; see native/README.md.
    "**/*.js",
    "**/*.mjs",
    "**/*.config.ts", // Tool and app configs are outside the repository TypeScript programs.
    "packages/client/tsdown.client.ts" // Shared client build preset, also outside a TypeScript program.
  ],
  "overrides": [
    {
      // Shared strict type-aware rules. Source/test differences stay in the short overrides below.
      "files": [
        "packages/*/*/src/**/*.{ts,tsx}",
        "packages/*/*/tests/**/*.{ts,tsx}",
        "apps/*/src/**/*.{ts,tsx}",
        "apps/*/tests/**/*.{ts,tsx}",
        "examples/**/*.{ts,tsx}",
        "scripts/**/*.{ts,tsx}",
        "website/**/*.{ts,tsx}"
      ],
      "rules": {
        "no-var": "error",
        "prefer-const": "error",
        "prefer-rest-params": "error",
        "prefer-spread": "error",
        "no-array-constructor": "error",
        "no-unused-expressions": "error",
        "no-unused-vars": [
          "error",
          {
            "argsIgnorePattern": "^_",
            "varsIgnorePattern": "^_",
            "caughtErrorsIgnorePattern": "^_"
          }
        ],
        "no-useless-constructor": "error",
        "typescript/await-thenable": "error",
        "typescript/ban-ts-comment": [
          "error",
          {
            "minimumDescriptionLength": 10
          }
        ],
        "typescript/no-array-delete": "error",
        "typescript/no-base-to-string": "error",
        "typescript/no-confusing-void-expression": "error",
        "typescript/no-deprecated": "error",
        "typescript/no-duplicate-enum-values": "error",
        "typescript/no-duplicate-type-constituents": "error",
        "typescript/no-dynamic-delete": "error",
        "typescript/no-empty-object-type": "off", // Merge-extensible maps intentionally use empty object types.
        "typescript/no-explicit-any": "error", // Every intentional any needs a narrow suppression with rationale.
        "typescript/no-extra-non-null-assertion": "error",
        "typescript/no-extraneous-class": "error",
        // Lost promises in the agent loop are the repository's highest-value linted bug class.
        "typescript/no-floating-promises": "error",
        "typescript/no-for-in-array": "error",
        "typescript/no-implied-eval": "error",
        "typescript/no-invalid-void-type": "off", // Event signatures intentionally use void in source.
        "typescript/no-meaningless-void-operator": "error",
        "typescript/no-misused-new": "error",
        "typescript/no-misused-promises": "error",
        "typescript/no-misused-spread": "error",
        "typescript/no-mixed-enums": "error",
        "typescript/no-namespace": "off", // Cordis Config namespaces are the repository idiom.
        "typescript/no-non-null-asserted-nullish-coalescing": "error",
        "typescript/no-non-null-asserted-optional-chain": "error",
        "typescript/no-redundant-type-constituents": "error",
        "typescript/no-require-imports": "error",
        "typescript/no-this-alias": "error",
        "typescript/no-unnecessary-boolean-literal-compare": "error",
        "typescript/no-unnecessary-template-expression": "error",
        "typescript/no-unnecessary-type-arguments": "error",
        "typescript/no-unnecessary-type-assertion": "error",
        "typescript/no-unnecessary-type-constraint": "error",
        "typescript/no-unnecessary-type-conversion": "error",
        "typescript/no-unnecessary-type-parameters": "error",
        "typescript/no-unsafe-argument": "error",
        "typescript/no-unsafe-assignment": "error",
        "typescript/no-unsafe-call": "error",
        "typescript/no-unsafe-declaration-merging": "error",
        "typescript/no-unsafe-enum-comparison": "error",
        "typescript/no-unsafe-function-type": "error",
        "typescript/no-unsafe-member-access": "error",
        "typescript/no-unsafe-return": "error",
        "typescript/no-unsafe-unary-minus": "error",
        "typescript/no-useless-default-assignment": "error",
        "typescript/no-wrapper-object-types": "error",
        "typescript/prefer-as-const": "error",
        "typescript/prefer-literal-enum-member": "error",
        "typescript/prefer-namespace-keyword": "error",
        "typescript/prefer-promise-reject-errors": "error",
        "typescript/prefer-reduce-type-parameter": "error",
        "typescript/prefer-return-this-type": "error",
        "typescript/related-getter-setter-pairs": "error",
        "typescript/restrict-plus-operands": [
          "error",
          {
            "allowAny": false,
            "allowBoolean": false,
            "allowNullish": false,
            "allowNumberAndString": false,
            "allowRegExp": false
          }
        ],
        "typescript/return-await": [
          "error",
          "error-handling-correctness-only"
        ],
        "typescript/triple-slash-reference": "error",
        "typescript/unbound-method": "error",
        "typescript/unified-signatures": "error",
        "typescript/use-unknown-in-catch-callback-variable": "error",
        "no-void": "off" // void foo() marks deliberate fire-and-forget arrow listeners.
      },
      "plugins": [
        "typescript"
      ]
    },
    {
      "files": [
        "packages/*/*/src/**/*.{ts,tsx}",
        "apps/*/src/**/*.{ts,tsx}",
        "examples/**/*.{ts,tsx}",
        "scripts/**/*.{ts,tsx}",
        "website/**/*.{ts,tsx}"
      ],
      "rules": {
        "typescript/no-non-null-assertion": "error",
        "typescript/no-unnecessary-condition": [
          "error",
          {
            "allowConstantLoopConditions": true
          }
        ],
        "typescript/only-throw-error": "error",
        "typescript/require-await": "error",
        "typescript/restrict-template-expressions": [
          "error",
          {
            "allowNumber": true,
            "allowBoolean": true
          }
        ],
        "typescript/switch-exhaustiveness-check": [
          "error",
          {
            "considerDefaultExhaustiveForUnions": true
          }
        ]
      },
      "plugins": [
        "typescript"
      ]
    },
    {
      "files": [
        "examples/**/*.ts"
      ],
      "rules": {
        "typescript/require-await": "off" // Demo callbacks conform to async interfaces without awaiting.
      },
      "plugins": [
        "typescript"
      ]
    },
    {
      "files": [
        "packages/*/*/tests/**/*.{ts,tsx}",
        "apps/*/tests/**/*.{ts,tsx}",
        "examples/*/tests/**/*.{ts,tsx}",
        "scripts/**/*.spec.{ts,tsx}"
      ],
      "rules": {
        "typescript/no-invalid-void-type": "error",
        "typescript/no-non-null-assertion": "off", // Assertions commonly follow an expect() that proves presence.
        "typescript/no-unnecessary-condition": "off",
        "typescript/only-throw-error": "off", // Tests deliberately exercise non-Error throws.
        "typescript/require-await": "off", // Mock execute() implementations must retain async signatures.
        "typescript/restrict-template-expressions": "off"
      },
      "plugins": [
        "typescript"
      ]
    },
    {
      "files": [
        "packages/**/*.{ts,tsx}",
        "apps/**/*.{ts,tsx}",
        "examples/**/*.{ts,tsx}",
        "scripts/**/*.{ts,tsx}",
        "website/**/*.{ts,tsx}"
      ],
      "rules": {
        "sonarjs/duplicates-in-character-class": "error",
        "sonarjs/no-all-duplicated-branches": "error",
        "sonarjs/no-duplicate-in-composite": "error",
        "sonarjs/no-duplicate-test-title": "error",
        "sonarjs/no-identical-conditions": "error",
        "sonarjs/no-identical-expressions": "error",
        "sonarjs/no-identical-functions": "error",
        "sonarjs/no-duplicated-branches": "error"
      },
      "jsPlugins": [
        "eslint-plugin-sonarjs"
      ]
    },
    {
      "files": [
        "packages/**/*.{ts,tsx}",
        "apps/**/*.{ts,tsx}",
        "examples/**/*.{ts,tsx}",
        "scripts/**/*.{ts,tsx}",
        "website/**/*.{ts,tsx}"
      ],
      "rules": {
        "@stylistic/indent": [
          "error",
          2
        ],
        "@stylistic/semi": [
          "error",
          "never"
        ],
        "@stylistic/quotes": [
          "error",
          "single",
          {
            "avoidEscape": true
          }
        ],
        "@stylistic/comma-dangle": [
          "error",
          "always-multiline"
        ],
        "@stylistic/eol-last": [
          "error",
          "always"
        ],
        "@stylistic/no-trailing-spaces": "error",
        "@stylistic/object-curly-spacing": [
          "error",
          "always"
        ],
        "@stylistic/arrow-parens": [
          "error",
          "as-needed",
          {
            "requireForBlockBody": true
          }
        ],
        "@stylistic/member-delimiter-style": [
          "error",
          {
            "multiline": {
              "delimiter": "none"
            },
            "singleline": {
              "delimiter": "semi",
              "requireLast": false
            }
          }
        ],
        // Validation-only: line length has no safe formatter fix.
        "@stylistic/max-len": [
          "error",
          {
            "code": 140,
            "ignoreUrls": true,
            "ignoreStrings": true,
            "ignoreTemplateLiterals": true
          }
        ]
      },
      "jsPlugins": [
        "@stylistic/eslint-plugin"
      ]
    }
  ]
}
