mirror of
https://github.com/deepseek-ai/deepseek-harness.git
synced 2026-10-26 16:55:08 +00:00
- Disposal cancels detached runs before the engine waits for timer callbacks, so a callback parked in a $ call ends instead of blocking unload. - A forgotten band wakes and ends its watch streams; a refresh asked for during a pass joins one more pass that settles after it; the Web band drops an ended stream so the next subscriber opens a fresh one. - $ has Claude Code's namespaces: an unserved member rejects with 'no implementation for <namespace>.<member>' instead of a TypeError. - A .catch handler's next makes the rewrite check; a tool rename is refused like an argument rewrite; a null op answer is reported as no answer; defineMod returns its disposer from apply; the live turn record is copied before the chain freezes it; prompt.submit is raised only for batches with a human message and names the submitting mod as origin. - $.http.fetch bounds the body while streaming; bandColumns/bandRows are Config; the client package drops its stale gateway edges; the source overlay lives in the package and anchors its entries to the file, and the dsh installation no longer depends on the experimental packages.
359 lines
12 KiB
JSON
359 lines
12 KiB
JSON
{
|
|
"$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.
|
|
"packages/experimental/claude-code-mods/examples/*/{hooks,tests,types}/**", // Claude Code's published example mods and their tests keep the upstream style; see the headers.
|
|
"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",
|
|
"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"
|
|
}
|
|
],
|
|
"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": {
|
|
// Session assertions inspect the log; other deprecated APIs remain errors.
|
|
"typescript/no-deprecated": [
|
|
"error",
|
|
{
|
|
"allow": [
|
|
{
|
|
"from": "file",
|
|
"name": ["snapshotEvents", "eventAt", "ownEvents"],
|
|
"path": "packages/core/session/src/index.ts"
|
|
}
|
|
]
|
|
}
|
|
],
|
|
"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"
|
|
]
|
|
},
|
|
{
|
|
// 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"
|
|
}
|
|
},
|
|
{
|
|
"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"
|
|
]
|
|
}
|
|
]
|
|
}
|