mirror of
https://github.com/sinanyuntu/trade-message-center.git
synced 2026-09-17 13:22:11 +08:00
chore: standardize repository formatting and editor setup
This commit is contained in:
@@ -0,0 +1,11 @@
|
||||
root = true
|
||||
|
||||
[*]
|
||||
charset = utf-8
|
||||
end_of_line = lf
|
||||
indent_style = space
|
||||
indent_size = 4
|
||||
insert_final_newline = true
|
||||
|
||||
[*.md]
|
||||
trim_trailing_whitespace = false
|
||||
+10
-1
@@ -1,4 +1,13 @@
|
||||
{
|
||||
"$schema": "./node_modules/oxfmt/configuration_schema.json",
|
||||
"ignorePatterns": [".agents/**", ".codex/**", ".trellis/**", "AGENTS.md", "pnpm-lock.yaml"]
|
||||
"tabWidth": 4,
|
||||
"useTabs": false,
|
||||
"ignorePatterns": [
|
||||
".agents/**",
|
||||
".codex/**",
|
||||
".trellis/**",
|
||||
"AGENTS.md",
|
||||
"pnpm-lock.yaml",
|
||||
"prd.html"
|
||||
]
|
||||
}
|
||||
|
||||
@@ -8,6 +8,7 @@
|
||||
- 仓库统一使用 Oxfmt;lint-staged 只格式化暂存文件,Husky 在 `pre-commit` 阶段触发该检查。
|
||||
- 扩展包使用 Vite `6.x` 和 TypeScript `5.7.x`。`typecheck` 执行 `tsc -p tsconfig.json --noEmit`,`build` 先检查类型再执行 `vite build`,`test` 使用 Node 内置 test runner;尚无 lint 脚本。
|
||||
- Vite 依赖的 `esbuild` 安装脚本在根 `pnpm-workspace.yaml` 的 `allowBuilds` 中显式允许。
|
||||
- 代码格式统一使用根目录 Oxfmt,缩进为 4 个空格;VSCode 保存格式化使用工作区推荐的 `oxc.oxc-vscode`,不得使用其它 formatter。
|
||||
|
||||
## 必须遵守
|
||||
|
||||
@@ -32,6 +33,8 @@ pnpm build
|
||||
pnpm test
|
||||
```
|
||||
|
||||
编辑器保存格式化必须与 `pnpm format` 相同。VSCode 使用 `.vscode/settings.json` 指向根 `.oxfmtrc.json`;未安装 Oxc 扩展时关闭 `formatOnSave`,不要让内置 TypeScript formatter 或其它 formatter 生成提交前会被改写的代码。
|
||||
|
||||
其中 `typecheck` 会执行严格 TypeScript 检查,`build` 会生成 `apps/chrome-extension/dist/`,`test` 会执行 `apps/chrome-extension/test/*.test.js`。新增非平凡逻辑时,应补充最小可运行测试。
|
||||
|
||||
## 评审清单
|
||||
@@ -43,3 +46,4 @@ pnpm test
|
||||
- Popup 移动后,Vite input、TypeScript include、Manifest 路径和 `dist/` 产物是否一致?
|
||||
- 是否覆盖了用户可见的加载、空、错误和键盘交互状态?
|
||||
- 是否执行了当前可用的根级验证命令,并如实说明跳过项?
|
||||
- 编辑器保存后的代码是否仍通过 Oxfmt 检查,并保持 4 个空格缩进?
|
||||
|
||||
@@ -174,6 +174,16 @@ types / constants
|
||||
|
||||
这里的“主函数”是文件中负责组织其它声明完成该文件主要职责的函数,通常是入口函数、编排函数或主要公开函数;不是按函数长度判断,也不是强制命名为 `main`。
|
||||
|
||||
### 3.8 格式化器唯一来源与编辑器保存
|
||||
|
||||
仓库统一使用根目录 [`package.json`](../../package.json) 声明的 Oxfmt。缩进使用 4 个空格,不使用 Tab;具体格式规则由根目录 [`.oxfmtrc.json`](../../.oxfmtrc.json) 维护,基础编辑器空白行为由 [`.editorconfig`](../../.editorconfig) 对齐。
|
||||
|
||||
1. `pnpm format` 是修改格式的唯一标准命令,`pnpm format:check` 是提交前的格式门禁。
|
||||
2. VSCode 保存格式化只能使用 `oxc.oxc-vscode`,并且必须读取仓库的 `.oxfmtrc.json`;工作区设置位于 `.vscode/settings.json`,推荐扩展位于 `.vscode/extensions.json`。
|
||||
3. 未安装 Oxc 扩展时,不得让 VSCode 内置 TypeScript formatter、Prettier、Biome 或其它 formatter 接管保存格式化;应先安装 Oxc 扩展,或关闭 `formatOnSave` 后执行 `pnpm format`。
|
||||
4. `.editorconfig` 只提供缩进、换行和文件末尾换行等基础编辑器行为,不能替代 Oxfmt,也不能成为第二套格式规则。
|
||||
5. 提交钩子、编辑器保存和 CI 检查必须产生同一份 Oxfmt 结果;若保存后再次运行 `pnpm format` 仍产生差异,视为格式化配置冲突,必须先修复配置。
|
||||
|
||||
## 4. Validation & Error Matrix
|
||||
|
||||
| 发现的代码形态 | 处理 |
|
||||
@@ -190,6 +200,8 @@ types / constants
|
||||
| 文件头缺少职责注释,或正文少于 10 / 多于 30 个字符 | 补充或改写为 10–30 个字符的职责描述 |
|
||||
| 入口文件头只描述“这是入口” | 改为描述入口所在目录的整体职责 |
|
||||
| 有主函数但主函数前没有独立职责注释 | 在主函数声明正上方补充职责说明 |
|
||||
| 编辑器保存后与 Oxfmt 结果不同 | 将保存 formatter 切换为 Oxc,或关闭保存格式化后运行 `pnpm format` |
|
||||
| 代码使用 2 空格或 Tab,与项目约定不一致 | 按 `.oxfmtrc.json` 和 `.editorconfig` 统一为 4 个空格 |
|
||||
|
||||
## 5. Good / Base / Bad Cases
|
||||
|
||||
@@ -208,6 +220,8 @@ types / constants
|
||||
- 入口、分发和分支重构应保留原有行为测试,证明只改变职责归属,没有改变输出契约。
|
||||
- 新增或修改手写代码时,检查文件第一行职责注释的正文长度为 10–30 个字符;入口文件还要检查注释描述的是目录职责。
|
||||
- 检查主函数前存在独立职责注释,且主函数是最后一个函数声明;允许其后出现直接启动调用或显式导出。
|
||||
- 检查手工保存后的文件通过 `pnpm format:check`,且 VSCode 使用 `oxc.oxc-vscode` 读取根 `.oxfmtrc.json`。
|
||||
- 检查代码缩进为 4 个空格,未混入 Tab、Prettier 或其它 formatter 的结果。
|
||||
|
||||
## 7. Wrong vs Correct
|
||||
|
||||
@@ -261,6 +275,27 @@ export function parseFeatureInput(data: unknown): DomainModel[] {
|
||||
}
|
||||
```
|
||||
|
||||
```jsonc
|
||||
// 正确:VSCode 保存与提交钩子使用同一 Oxfmt 配置。
|
||||
{
|
||||
"oxc.fmt.configPath": "${workspaceFolder}/.oxfmtrc.json",
|
||||
"[typescript]": {
|
||||
"editor.defaultFormatter": "oxc.oxc-vscode",
|
||||
"editor.formatOnSave": true
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
```jsonc
|
||||
// 错误:保存时使用未声明的其它 formatter。
|
||||
{
|
||||
"[typescript]": {
|
||||
"editor.defaultFormatter": "some.other-formatter",
|
||||
"editor.formatOnSave": true
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
```ts
|
||||
// 组装并启动当前目录的历史同步能力
|
||||
import { fetchPage } from "./sdk.ts";
|
||||
@@ -286,6 +321,7 @@ export function syncHistory(): void {
|
||||
- `utils.ts` 是否仍然不含业务流程、重要类型和业务常量?
|
||||
- 基础原语是否保持无业务语义,而不是通过业务化命名制造无行为差异的包装?
|
||||
- 重要常量是否位于使用它的所有者或功能级 `constants.ts`?
|
||||
- 编辑器保存是否与 Oxfmt 结果一致,并且缩进是否统一为 4 个空格?
|
||||
- 文件第一行是否有 10–30 个字符的职责注释,入口文件是否描述目录职责?
|
||||
- 主函数是否有独立职责注释并位于所有依赖声明之后?
|
||||
- 入口函数是否是最后一个函数声明,其后是否只有启动调用或显式导出?
|
||||
|
||||
Vendored
+3
@@ -0,0 +1,3 @@
|
||||
{
|
||||
"recommendations": ["oxc.oxc-vscode"]
|
||||
}
|
||||
Vendored
+29
@@ -0,0 +1,29 @@
|
||||
{
|
||||
"oxc.fmt.configPath": "${workspaceFolder}/.oxfmtrc.json",
|
||||
"oxc.path.oxfmt": "${workspaceFolder}/node_modules/.bin/oxfmt",
|
||||
"editor.formatOnSaveMode": "file",
|
||||
"[javascript]": {
|
||||
"editor.defaultFormatter": "oxc.oxc-vscode",
|
||||
"editor.formatOnSave": true
|
||||
},
|
||||
"[javascriptreact]": {
|
||||
"editor.defaultFormatter": "oxc.oxc-vscode",
|
||||
"editor.formatOnSave": true
|
||||
},
|
||||
"[typescript]": {
|
||||
"editor.defaultFormatter": "oxc.oxc-vscode",
|
||||
"editor.formatOnSave": true
|
||||
},
|
||||
"[typescriptreact]": {
|
||||
"editor.defaultFormatter": "oxc.oxc-vscode",
|
||||
"editor.formatOnSave": true
|
||||
},
|
||||
"[json]": {
|
||||
"editor.defaultFormatter": "oxc.oxc-vscode",
|
||||
"editor.formatOnSave": true
|
||||
},
|
||||
"[jsonc]": {
|
||||
"editor.defaultFormatter": "oxc.oxc-vscode",
|
||||
"editor.formatOnSave": true
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
# Trade Message Center
|
||||
|
||||
## VSCode 开发环境
|
||||
|
||||
本项目统一使用 Oxfmt 格式化代码,缩进为 4 个空格。请在 VSCode 中安装 Oxc 插件 `oxc.oxc-vscode`,否则保存文件时可能使用其它 formatter,导致代码在提交钩子中再次变化。
|
||||
|
||||
安装方式:
|
||||
|
||||
1. 打开 VSCode 扩展面板(macOS 快捷键:`⇧⌘X`)。
|
||||
2. 搜索 `Oxc`,安装扩展 `oxc.oxc-vscode`。
|
||||
3. 重新打开项目窗口,确认右下角或状态栏使用 Oxc formatter。
|
||||
|
||||
仓库已经在 `.vscode/settings.json` 中配置 Oxc 保存格式化,并通过 `.oxfmtrc.json` 固定 4 空格规则。项目本地依赖已经包含 Oxfmt,不需要单独全局安装。
|
||||
|
||||
如果暂时不安装插件,请关闭 VSCode 的 `formatOnSave`,需要格式化时在项目根目录执行:
|
||||
|
||||
```bash
|
||||
pnpm format
|
||||
pnpm format:check
|
||||
```
|
||||
|
||||
不要同时启用 Prettier、Biome 或 VSCode 内置 TypeScript formatter。
|
||||
@@ -195,7 +195,9 @@ test("converts SDK request failures to a stable secret-free error", async () =>
|
||||
throw new Error("chatToken=PAGE-SECRET&contactAccountIdEncrypt=BUYER-SECRET");
|
||||
};
|
||||
|
||||
const error = await syncCurrentConversationHistory(fixture.pageWindow).catch((reason) => reason);
|
||||
const error = await syncCurrentConversationHistory(fixture.pageWindow).catch(
|
||||
(reason) => reason,
|
||||
);
|
||||
assert.equal(error.message, "onetalk_history_message_request_failed");
|
||||
assert.equal(error.message.includes("SECRET"), false);
|
||||
});
|
||||
|
||||
@@ -31,7 +31,8 @@ export default defineConfig({
|
||||
),
|
||||
},
|
||||
output: {
|
||||
banner: (chunk) => (chunk.isEntry ? `console.info("Build hash: ${buildHash}");` : ""),
|
||||
banner: (chunk) =>
|
||||
chunk.isEntry ? `console.info("Build hash: ${buildHash}");` : "",
|
||||
entryFileNames: "[name].js",
|
||||
chunkFileNames: "chunks/[name]-[hash].js",
|
||||
assetFileNames: "assets/[name]-[hash][extname]",
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "@trade-message-center/server",
|
||||
"private": true,
|
||||
"version": "0.1.0",
|
||||
"private": true,
|
||||
"type": "module",
|
||||
"dependencies": {
|
||||
"fastify": "^5.12.1"
|
||||
|
||||
Reference in New Issue
Block a user