diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..ef5d5f7 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,187 @@ +# 贡献指南 / Contributing Guide + +感谢你对开源市集(Open Source Bazaar)的关注!本文档说明如何参与项目贡献。 + +--- + +## 快速开始 / Quick Start + +### 环境要求 / Requirements + +- **Node.js >= 20**(必须,构建在 20+ 上验证) +- **pnpm**(包管理器,不要用 npm/yarn) +- Git + +### 安装依赖 + +```bash +pnpm install +``` + +> 首次安装需要 1–3 分钟,请勿中断。 + +### 本地开发 + +```bash +pnpm dev +``` + +启动后访问 http://localhost:3000。 + +--- + +## 代码规范 / Code Standards + +### 技术栈 + +| 类别 | 技术 | +|------|------| +| 框架 | Next.js 16 (App Router + webpack) | +| 语言 | TypeScript ~6.0 | +| UI | React Bootstrap 2.10 | +| 状态管理 | MobX 6 | +| 国际化 | mobx-i18n | +| 样式 | LESS + CSS Modules | +| 格式化 | Prettier + ESLint | +| Git Hooks | Husky + lint-staged | + +### 编码规范 + +1. **使用 React Bootstrap 组件**,不要用原生 HTML 元素加 className: + + ```tsx + // ✅ 正确 + import { Button, Badge } from 'react-bootstrap'; + + 标签 + + // ❌ 错误 + 点击 + ``` + +2. **所有用户可见文本必须走 i18n**,禁止硬编码: + + ```tsx + import { useI18n } from 'mobx-i18n'; + const { t } = useI18n(); + {t('some_key')} + ``` + + 新增翻译 key 时,同步更新 `translation/zh-CN.ts`、`translation/en-US.ts`、`translation/zh-TW.ts`。 + +3. **组件文件命名**:`ComponentName.tsx`(PascalCase),样式文件 `ComponentName.module.less`。 + +4. **分页路由**遵循 Next.js App Router 约定:`pages/finance/index.tsx`、`pages/project/[id]/index.tsx`。 + +5. **Prettier 配置**:单引号、trailingComma all、printWidth 100、tabWidth 4、avoid arrow parens。 + +--- + +## 提 PR 流程 / PR Workflow + +### 1. Fork & 创建分支 + +```bash +git checkout -b feat/your-feature-name +# 或 +git checkout -b fix/your-bug-fix +``` + +### 2. 开发 & 自测 + +```bash +# 启动开发服务器 +pnpm dev + +# 确保构建通过 +pnpm build + +# 运行类型检查和 lint +pnpm test +``` + +### 3. 提交规范 + +Commit message 遵循 [Conventional Commits](https://www.conventionalcommits.org/): + +``` +feat: add finance page filter +fix: resolve i18n key missing in zh-TW +docs: update contributing guide +chore: bump next to 16.3.0 +``` + +### 4. 创建 Pull Request + +填写 PR 描述,包含: + +- **变更内容**(改了什么、为什么改) +- **测试方法**(如何验证) +- **关联 Issue**(如 `Closes #123`) + +PR 模板已预置,请在 Checklist 中勾选: + +- [ ] Labels 已添加 +- [ ] Assignees 已指定 +- [ ] Reviewers 已请求 + +### 5. CI 检查 + +PR 触发后会自动运行: + +- `main.yml`:TypeScript 类型检查 + lint +- `self-scan.yml`:安全扫描 + +请确保所有检查通过后再请求 review。 + +--- + +## Issue 类型 + +- **Bug**:描述复现步骤、预期行为、实际行为 +- **Feature**:说明需求背景、目标用户、验收标准 +- **Reward Task**:使用 [Reward Task 模板](.github/ISSUE_TEMPLATE/reward-task.yml) 创建,需标注赏金金额和货币 + +--- + +## 翻译贡献 + +1. 在对应语言的 `translation/xx-XX.ts` 文件中添加 key +2. 确保所有语言文件中的 key 集合一致(移除废弃 key) +3. 使用通用术语,如 `t('knowledge_base')` 而非 `t('policy_documents')` + +--- + +## 赏金任务 / Bounty Tasks + +项目设有赏金任务,参与方式: + +1. 在目标 Issue 下评论 `I claim this bounty`(或中文「我来处理」) +2. Maintainer 确认后开始工作 +3. 提交 PR 并关联 Issue(`Closes #XXX`) +4. PR 合并后赏金自动发放 + +> 详见各 Issue 中的认领说明。 + +--- + +## 行为准则 / Code of Conduct + +请遵守项目 [Code of Conduct](pages/about/code-of-conduct.mdx),尊重每一位贡献者。 + +--- + +## 常见问题 / FAQ + +**Q: 可以用 npm/yarn 代替 pnpm 吗?** +A: 不建议。项目配置了 pnpm workspace,混用可能导致依赖解析异常。 + +**Q: 本地开发时 build 报错怎么办?** +A: 先确认 Node.js 版本 >= 20,再运行 `pnpm install` 重装依赖。 + +**Q: 如何测试移动端布局?** +A: 在浏览器 DevTools 中切换设备模拟器,或访问 Vercel 预览链接。 + +--- + +感谢你的贡献!🎉