mirror of
https://github.com/OpenRouterTeam/spawn.git
synced 2026-04-28 03:49:31 +00:00
* fix: navigate back to list after delete/remove errors instead of exiting
Previously, choosing "Delete this server" or "Remove from history" from
the action menu would always exit the picker — even if the operation
failed. Now handleRecordAction returns "back" for delete/remove actions,
and activeServerPicker refreshes the remaining list and loops back to
the picker. Cancel on the action menu also returns to the list.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* feat: add ValueOf<T> type helper and GritQL enum ban rule
- Add shared ValueOf<T> type that extracts value unions from const objects
and readonly tuples
- Update RecordActionOutcome to use ValueOf<typeof RecordActionOutcome>
- Add lint/no-ts-enum.grit GritQL rule that bans TypeScript enum keyword
- Register new rule in biome.json plugins
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* fix: sort type export before value exports in shared index
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* feat: add biome config for shared package, fix export sort order
Add biome.json to packages/shared so lint + format + import organization
is enforced on the shared library. Fix ValueOf export position to match
biome's organizeImports sort order (type specifiers after value exports).
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* fix: hoist type re-exports to top of shared index
Split inline `type Result` and `type ValueOf` out of mixed export
statements into separate `export type { ... }` re-exports, hoisted
to the top per biome's organizeImports group config.
biome's useExportType rule doesn't flag re-exports (only locally
defined types), so these must be manually separated.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* refactor: consolidate biome config to single root biome.json
Remove per-package biome.json files (packages/cli, packages/shared,
.claude/scripts, .claude/skills/setup-spa) and consolidate into a
single root config with includes glob covering packages/**/*.ts.
Update GritQL rule exclusions to also match shared/src/ paths now
that the shared package is covered by the root config. Fix build-clouds.ts
lint issues (node: protocol, block statements, import sort) that were
newly caught.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* refactor: replace grit filename exclusions with biome-ignore comments
Remove all $filename exclusion logic from GritQL rules and instead add
biome-ignore-all comments at the top of files that legitimately need
the banned patterns (result.ts, parse.ts, type-guards.ts).
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
---------
Co-authored-by: lab <6723574+louisgv@users.noreply.github.com>
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
139 lines
3.4 KiB
JSON
139 lines
3.4 KiB
JSON
{
|
|
"$schema": "https://biomejs.dev/schemas/2.4.4/schema.json",
|
|
"vcs": {
|
|
"enabled": true,
|
|
"clientKind": "git",
|
|
"useIgnoreFile": true,
|
|
"defaultBranch": "main"
|
|
},
|
|
"files": {
|
|
"ignoreUnknown": false,
|
|
"includes": ["packages/**/*.ts"]
|
|
},
|
|
"formatter": {
|
|
"enabled": true,
|
|
"indentStyle": "space",
|
|
"indentWidth": 2,
|
|
"lineWidth": 120
|
|
},
|
|
"linter": {
|
|
"enabled": true,
|
|
"rules": {
|
|
"recommended": true,
|
|
"complexity": {
|
|
"useLiteralKeys": "off",
|
|
"noForEach": "off",
|
|
"noUselessSwitchCase": "off"
|
|
},
|
|
"style": {
|
|
"noNonNullAssertion": "off",
|
|
"useNodejsImportProtocol": "error",
|
|
"useTemplate": "off",
|
|
"useBlockStatements": "error",
|
|
"noParameterAssign": "off",
|
|
"useConst": "error",
|
|
"useDefaultParameterLast": "error",
|
|
"useSelfClosingElements": "error",
|
|
"useSingleVarDeclarator": "error",
|
|
"noUnusedTemplateLiteral": "error",
|
|
"useNumberNamespace": "error",
|
|
"noInferrableTypes": "error",
|
|
"noUselessElse": "error",
|
|
"useImportType": {
|
|
"level": "error",
|
|
"options": {
|
|
"style": "separatedType"
|
|
}
|
|
}
|
|
},
|
|
"correctness": {
|
|
"noUnusedImports": "error",
|
|
"noUnusedVariables": "error",
|
|
"noUnusedFunctionParameters": "warn",
|
|
"noInnerDeclarations": "error"
|
|
},
|
|
"suspicious": {
|
|
"noExplicitAny": "warn",
|
|
"noAssignInExpressions": "error",
|
|
"noFallthroughSwitchClause": "error",
|
|
"noDoubleEquals": "error",
|
|
"noExtraNonNullAssertion": "error",
|
|
"noTemplateCurlyInString": "off",
|
|
"noImplicitAnyLet": "error",
|
|
"noGlobalIsNan": "error",
|
|
"noGlobalIsFinite": "error",
|
|
"noControlCharactersInRegex": "off"
|
|
},
|
|
"performance": {
|
|
"recommended": true,
|
|
"noAccumulatingSpread": "error"
|
|
},
|
|
"security": {
|
|
"recommended": true
|
|
}
|
|
}
|
|
},
|
|
"javascript": {
|
|
"formatter": {
|
|
"expand": "always",
|
|
"arrowParentheses": "always",
|
|
"quoteStyle": "double",
|
|
"trailingCommas": "all",
|
|
"semicolons": "always",
|
|
"bracketSpacing": true,
|
|
"bracketSameLine": false
|
|
}
|
|
},
|
|
"overrides": [
|
|
{
|
|
"includes": ["packages/cli/src/__tests__/**"],
|
|
"linter": {
|
|
"rules": {
|
|
"suspicious": {
|
|
"noExplicitAny": "off",
|
|
"noImplicitAnyLet": "off",
|
|
"noAssignInExpressions": "off"
|
|
},
|
|
"correctness": {
|
|
"noUnusedVariables": "off",
|
|
"noUnusedFunctionParameters": "off"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
],
|
|
"plugins": [
|
|
"./lint/no-type-assertion.grit",
|
|
"./lint/no-typeof-string-number.grit",
|
|
"./lint/no-try-catch.grit",
|
|
"./lint/no-try-finally.grit",
|
|
"./lint/no-ts-enum.grit"
|
|
],
|
|
"assist": {
|
|
"actions": {
|
|
"source": {
|
|
"organizeImports": {
|
|
"level": "on",
|
|
"options": {
|
|
"groups": [
|
|
{
|
|
"type": true
|
|
},
|
|
":BLANK_LINE:",
|
|
{
|
|
"type": false
|
|
},
|
|
[":NODE:"],
|
|
":BLANK_LINE:",
|
|
["!@openrouter/**"],
|
|
":BLANK_LINE:",
|
|
["@openrouter/**"],
|
|
":BLANK_LINE:",
|
|
":ALIAS:"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|