Skip to content

Commit 101c03c

Browse files
committed
feat(tooling): migrate from ESLint + Biome to oxlint + oxfmt
Replace ESLint and Biome with oxlint and oxfmt, matching the PSYLOCKE-GG config. Convert all biome-ignore directives to oxlint-disable equivalents, remove noDefaultExport suppressions (not needed), fix interface→type, and update CI workflow.
1 parent 3bb9f11 commit 101c03c

28 files changed

+751
-2514
lines changed

.github/workflows/linting.yml

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,16 @@ jobs:
99
steps:
1010
- name: Checkout
1111
uses: actions/checkout@v4
12-
- name: Setup Biome
13-
uses: biomejs/setup-biome@v2
14-
- name: Run Biome
15-
run: biome ci .
12+
- name: Setup pnpm
13+
uses: pnpm/action-setup@v4
14+
- name: Setup Node.js
15+
uses: actions/setup-node@v4
16+
with:
17+
node-version: 22
18+
cache: pnpm
19+
- name: Install dependencies
20+
run: pnpm install --frozen-lockfile
21+
- name: Run oxlint
22+
run: pnpm oxlint
23+
- name: Run oxfmt
24+
run: pnpm oxfmt

.impeccable.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,15 @@
11
## Design Context
22

33
### Users
4+
45
A mixed audience of potential clients (gaming/Minecraft industry), employers, fellow developers, and the broader community. Visitors are evaluating Stella's work, personality, and technical ability. They want to quickly understand what she does, see compelling examples, and get a sense of who she is as a person.
56

67
### Brand Personality
8+
79
**Warm, approachable, fun.** The site should feel like meeting someone genuinely enthusiastic about their craft. Not corporate, not cold — personality shines through in every detail. Think: a friend showing you their coolest work over coffee.
810

911
### Aesthetic Direction
12+
1013
- **Visual tone:** Portfolio showcase — image-heavy, visual storytelling, project cards that invite exploration
1114
- **Typography:** Instrument Serif for headings (editorial warmth), Switzer for body (clean readability)
1215
- **Color:** Purple primary (#9145FF) is the brand identity. Blue (#0085FF) and yellow (#FAC230) as playful accents. Both light and dark themes supported.

.oxfmtrc.json

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
{
2+
"$schema": "./node_modules/oxfmt/configuration_schema.json",
3+
"useTabs": false,
4+
"tabWidth": 2,
5+
"printWidth": 120,
6+
"singleQuote": false,
7+
"jsxSingleQuote": false,
8+
"quoteProps": "as-needed",
9+
"trailingComma": "es5",
10+
"semi": true,
11+
"arrowParens": "always",
12+
"bracketSameLine": false,
13+
"bracketSpacing": true,
14+
"endOfLine": "lf",
15+
"insertFinalNewline": true,
16+
"sortTailwindcss": {
17+
"stylesheet": "src/app/globals.css",
18+
"functions": ["clsx", "cva", "cn"]
19+
},
20+
"ignorePatterns": [".claude", "**/.next", "**/.velite"]
21+
}

.oxlintrc.json

Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
{
2+
"$schema": "./node_modules/oxlint/configuration_schema.json",
3+
"plugins": ["nextjs", "typescript", "react", "jsx-a11y", "import", "unicorn", "oxc", "promise", "node"],
4+
"categories": {
5+
"correctness": "warn",
6+
"suspicious": "warn",
7+
"perf": "warn"
8+
},
9+
"env": {
10+
"browser": true,
11+
"node": true,
12+
"builtin": true
13+
},
14+
"options": {
15+
"reportUnusedDisableDirectives": "warn"
16+
},
17+
"ignorePatterns": [".claude", ".next/**", ".velite/**", "out/**", "build/**", "dist/**"],
18+
"rules": {
19+
// TypeScript
20+
"typescript/consistent-type-definitions": ["error", "type"],
21+
"typescript/no-explicit-any": "error",
22+
"typescript/no-inferrable-types": "error",
23+
"typescript/no-duplicate-enum-values": "error",
24+
"typescript/no-import-type-side-effects": "error",
25+
"typescript/prefer-includes": "error",
26+
"typescript/only-throw-error": "error",
27+
"typescript/return-await": "error",
28+
"typescript/no-deprecated": "warn",
29+
30+
// Correctness
31+
"no-unused-vars": "warn",
32+
"react-hooks/exhaustive-deps": "warn",
33+
"array-callback-return": "error",
34+
"no-self-compare": "error",
35+
"no-constructor-return": "error",
36+
"no-promise-executor-return": "error",
37+
"eqeqeq": "error",
38+
"react/rules-of-hooks": "error",
39+
40+
// Suspicious
41+
"no-alert": "error",
42+
"no-template-curly-in-string": "error",
43+
"no-shadow-restricted-names": "error",
44+
"no-unused-expressions": "error",
45+
"no-empty": "error",
46+
"no-proto": "error",
47+
"no-return-assign": "error",
48+
"no-multi-assign": "error",
49+
"unicorn/no-document-cookie": "error",
50+
51+
// Unicorn
52+
"unicorn/prefer-set-has": "error",
53+
"unicorn/no-new-array": "warn",
54+
"unicorn/no-useless-spread": "warn",
55+
"unicorn/no-single-promise-in-promise-methods": "warn",
56+
"unicorn/prefer-node-protocol": "error",
57+
"unicorn/no-typeof-undefined": "error",
58+
"unicorn/no-useless-promise-resolve-reject": "error",
59+
"unicorn/prefer-array-some": "error",
60+
"unicorn/no-object-as-default-parameter": "warn",
61+
62+
// Noisy rules - disable
63+
"no-shadow": "off",
64+
"no-await-in-loop": "off",
65+
"unicorn/no-array-sort": "off",
66+
"unicorn/prefer-add-event-listener": "off",
67+
"unicorn/require-post-message-target-origin": "off",
68+
"import/no-unassigned-import": "off",
69+
"import/no-named-as-default": "off",
70+
"import/no-named-as-default-member": "off",
71+
"typescript/no-unsafe-type-assertion": "off",
72+
73+
// File size
74+
"max-lines": ["warn", { "max": 300, "skipBlankLines": true, "skipComments": true }],
75+
76+
// Performance
77+
"oxc/no-barrel-file": "error",
78+
"import/no-cycle": "off",
79+
80+
// Next.js
81+
"@next/next/no-html-link-for-pages": "error",
82+
"@next/next/no-sync-scripts": "error",
83+
"@next/next/inline-script-id": "error",
84+
"@next/next/no-assign-module-variable": "error",
85+
"@next/next/no-document-import-in-page": "error",
86+
"@next/next/no-duplicate-head": "error",
87+
"@next/next/no-head-import-in-document": "error",
88+
"@next/next/no-script-component-in-head": "error",
89+
"@next/next/no-img-element": "off",
90+
91+
// React
92+
"react/jsx-no-target-blank": "off",
93+
"react/no-unknown-property": "off",
94+
"react/no-unsafe": "off",
95+
"react/react-in-jsx-scope": "off",
96+
97+
// jsx-a11y
98+
"jsx-a11y/alt-text": "warn",
99+
"jsx-a11y/aria-props": "warn",
100+
"jsx-a11y/aria-proptypes": "warn",
101+
"jsx-a11y/aria-unsupported-elements": "warn",
102+
"jsx-a11y/role-has-required-aria-props": "warn",
103+
"jsx-a11y/role-supports-aria-props": "warn"
104+
}
105+
}

README.md

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
11
# koding.dev
22

33
Hello, world!
4-

biome.jsonc

Lines changed: 0 additions & 164 deletions
This file was deleted.

0 commit comments

Comments
 (0)