SKILL.md
$28
- Prefer
async/awaitover callbacks or.then()chains
- Prefer async APIs over sync ones (avoid
*Sync)
- Use promise-based variants:
import { readFile } from 'fs/promises'
- Use
Promise.all,Promise.racefor concurrent operations where safe
Imports
-
This project uses simple-import-sort/imports and consistent-type-imports (fixStyle: 'separate-type-imports')
-
Separate type imports: always use import type { ... } for type-only imports, NOT import { type ... } inline syntax
-
When a file already has import type { ... } from a package and you need to add a value import, keep them as two separate statements:
import type { ChatTopicBotContext } from '@lobechat/types';
import { RequestTrigger } from '@lobechat/types';
-
Within each import statement, specifiers are sorted alphabetically by name
Code Structure
- Prefer object destructuring
- Use consistent, descriptive naming; avoid obscure abbreviations
- Replace magic numbers/strings with well-named constants
- Defer formatting to tooling
- Prefer named exports over
export default— keeps refactor renames and IDE auto-import in sync, and avoids thedefaultre-naming drift you get withimport Foo from './foo'. Reserveexport defaultfor files where the framework requires it (Next.js page/route/layout, React.lazy targets, config files likevitest.config.ts)
UI and Theming
- Use
@lobehub/ui, Ant Design components instead of raw HTML tags
- Design for dark mode and mobile responsiveness
- Use
antd-styletoken system instead of hard-coded colors
Performance
- Reuse existing utils in
packages/utilsor installed npm packages
- Query only required columns from database
Time Consistency
- Assign
Date.now()to a constant once and reuse for consistency
Logging
- Never log user private information (API keys, etc.)
- Don't use
import { log } from 'debug'directly (logs to console)
- Use
console.errorin catch blocks instead of debug package
- Always log the error in
.catch()callbacks — silent.catch(() => fallback)swallows failures and makes debugging impossible