2026-07-29 14:32:11 +08:00
{
"$schema" : "./node_modules/oxlint/configuration_schema.json" ,
"plugins" : [ ] ,
"categories" : {
"correctness" : "off"
} ,
"options" : {
2026-07-29 23:35:10 +08:00
"reportUnusedDisableDirectives" : "warn" ,
2026-07-29 14:32:11 +08:00
"typeAware" : true
} ,
"env" : {
"builtin" : true
} ,
"ignorePatterns" : [
"**/lib/**" ,
"**/node_modules/**" ,
"**/.sessions/**" ,
2026-07-29 22:38:20 +08:00
".claude/**" , // Harness-local state belongs to other checkouts, not this checkout's sources.
2026-07-29 14:32:11 +08:00
"**/.doc-typecheck-*/**" ,
"**/.node-next-types-*/**" ,
2026-07-29 22:38:20 +08:00
"**/.oxlint-contract-*/**" , // Scratch files created by the executable lint-contract tests.
2026-07-29 23:28:32 +08:00
"**/oxlint-contract-*" , // Flat probes use real TypeScript project include paths.
2026-07-30 01:18:28 +08:00
"packages/typert/generator/tests/fixtures/type-model/**" , // tsgolint rejects this fixture's preserved project shapes before rules run.
2026-07-29 14:32:11 +08:00
"website/.generated/**" ,
2026-07-29 22:38:20 +08:00
"vendor/**" , // Vendored source keeps upstream style and idioms.
"native/**" , // The imported landlock-run subtree has its own gates; see native/README.md.
2026-07-29 14:32:11 +08:00
"**/*.js" ,
"**/*.mjs" ,
2026-07-29 22:38:20 +08:00
"**/*.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.
2026-07-29 14:32:11 +08:00
] ,
"overrides" : [
{
2026-07-29 22:38:20 +08:00
// Shared strict type-aware rules. Source/test differences stay in the short overrides below.
2026-07-29 14:32:11 +08:00
"files" : [
"packages/*/*/src/**/*.{ts,tsx}" ,
2026-07-29 22:38:20 +08:00
"packages/*/*/tests/**/*.{ts,tsx}" ,
2026-07-29 14:32:11 +08:00
"apps/*/src/**/*.{ts,tsx}" ,
2026-07-29 22:38:20 +08:00
"apps/*/tests/**/*.{ts,tsx}" ,
2026-07-29 14:32:11 +08:00
"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" ,
2026-08-21 00:57:37 +08:00
"no-restricted-properties" : [
"error" ,
{
"object" : "crypto" ,
"property" : "randomUUID" ,
"message" : "browsers withhold crypto.randomUUID outside secure contexts (plain-HTTP LAN pages); mint through @deepseek-ai/dsh-util-crypto instead"
}
] ,
2026-07-29 14:32:11 +08:00
"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" ,
2026-07-29 22:38:20 +08:00
"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.
2026-07-29 14:32:11 +08:00
"typescript/no-extra-non-null-assertion" : "error" ,
"typescript/no-extraneous-class" : "error" ,
2026-07-29 22:38:20 +08:00
// Lost promises in the agent loop are the repository's highest-value linted bug class.
2026-07-29 14:32:11 +08:00
"typescript/no-floating-promises" : "error" ,
"typescript/no-for-in-array" : "error" ,
"typescript/no-implied-eval" : "error" ,
2026-07-29 22:38:20 +08:00
"typescript/no-invalid-void-type" : "off" , // Event signatures intentionally use void in source.
2026-07-29 14:32:11 +08:00
"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" ,
2026-07-29 22:38:20 +08:00
"typescript/no-namespace" : "off" , // Cordis Config namespaces are the repository idiom.
2026-07-29 14:32:11 +08:00
"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" ,
2026-07-29 22:38:20 +08:00
"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
}
] ,
2026-07-29 14:32:11 +08:00
"typescript/switch-exhaustiveness-check" : [
"error" ,
{
"considerDefaultExhaustiveForUnions" : true
}
]
} ,
"plugins" : [
"typescript"
]
} ,
{
"files" : [
"examples/**/*.ts"
] ,
"rules" : {
2026-07-29 22:38:20 +08:00
"typescript/require-await" : "off" // Demo callbacks conform to async interfaces without awaiting.
2026-07-29 14:32:11 +08:00
} ,
"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" ,
2026-07-29 22:38:20 +08:00
"typescript/no-non-null-assertion" : "off" , // Assertions commonly follow an expect() that proves presence.
2026-07-29 14:32:11 +08:00
"typescript/no-unnecessary-condition" : "off" ,
2026-07-29 22:38:20 +08:00
"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"
2026-07-29 14:32:11 +08:00
} ,
"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
}
}
] ,
2026-07-29 23:34:30 +08:00
// Validation-only: line length has no safe formatter fix.
2026-07-29 14:32:11 +08:00
"@stylistic/max-len" : [
"error" ,
{
"code" : 140 ,
"ignoreUrls" : true ,
"ignoreStrings" : true ,
"ignoreTemplateLiterals" : true
}
]
} ,
"jsPlugins" : [
"@stylistic/eslint-plugin"
]
2026-08-09 14:55:06 +08:00
} ,
{
// The project-free staged profile re-includes this syntax-coverage fixture.
"files" : [
"packages/typert/generator/tests/fixtures/type-model/**/*.{ts,tsx}"
] ,
"rules" : {
"typescript/no-explicit-any" : "off"
}
} ,
{
// TypeGraph coverage must retain source-authored syntax that the normal quote rule forbids.
"files" : [
"packages/typert/generator/tests/fixtures/type-model/packages/host/src/models.ts"
] ,
"rules" : {
"@stylistic/quotes" : "off"
}
2026-08-20 19:20:53 +08:00
} ,
{
"files" : [
"packages/experimental/webworker-runtime/src/node/**/*.ts" ,
"packages/experimental/webworker-runtime/src/storage/memory.ts" ,
"packages/experimental/webworker-runtime/src/module-system/module-loader.ts" ,
"packages/experimental/webworker-runtime/src/transport/synthetic-http.ts"
] ,
"rules" : {
"typescript/require-await" : "off" , // Async faces Node and Cordis define (fs promises, the module seam) reject rather than throw; the VFS beneath them never awaits.
"typescript/no-extraneous-class" : "off" // Node constructs these (`new Script()`, `new Worker()`), so a stub that refuses must still be a class.
} ,
"plugins" : [
"typescript"
]
2026-07-29 14:32:11 +08:00
}
]
}