贡献指南
感谢您对 Terminal Electron 项目的关注!本文档将指导您如何参与项目开发,包括代码贡献、问题报告、功能建议等。
贡献方式
1. 报告问题 (Bug Reports)
问题报告模板
markdown
**问题描述**
简要描述问题
**复现步骤**
1. 打开应用
2. 点击某个功能
3. 观察错误行为
**预期行为**
描述您期望的正确行为
**实际行为**
描述实际发生的错误行为
**环境信息**
- 操作系统: [如 macOS 12.0]
- 应用版本: [如 v1.0.0]
- Node.js 版本: [如 18.0.0]
**附加信息**
- 错误截图 (如果适用)
- 错误日志 (如果适用)
- 其他相关信息报告渠道
- GitHub Issues: 主要问题报告渠道
- Discord: 实时讨论和快速反馈
- Email: 安全相关问题
2. 功能建议 (Feature Requests)
功能建议模板
markdown
**功能描述**
详细描述您希望添加的功能
**使用场景**
描述这个功能的使用场景和用户价值
**实现建议**
如果有的话,提供实现思路或技术方案
**优先级**
- [ ] 高优先级 (核心功能)
- [ ] 中优先级 (重要功能)
- [ ] 低优先级 (优化功能)
**附加信息**
- 相关截图或设计稿
- 类似功能的参考
- 其他相关信息3. 代码贡献 (Code Contributions)
贡献流程
1. Fork 项目
bash
# Fork 项目到您的 GitHub 账户
# 访问 https://github.com/shzjj82/terminal-electron
# 点击 "Fork" 按钮2. 克隆您的 Fork
bash
# 克隆您的 Fork
git clone https://github.com/shzjj82/terminal-electron.git
# 添加上游仓库
git remote add upstream https://github.com/original-owner/terminal-electron.git
# 验证远程仓库
git remote -v3. 创建功能分支
bash
# 更新主分支
git checkout main
git pull upstream main
# 创建功能分支
git checkout -b feature/your-feature-name
# 或创建修复分支
git checkout -b fix/your-fix-name4. 开发功能
bash
# 安装依赖
yarn install
# 启动开发服务器
yarn dev
# 运行测试
yarn test
# 检查代码质量
yarn lint
yarn typecheck5. 提交代码
bash
# 添加修改的文件
git add .
# 提交代码 (使用 Conventional Commits)
git commit -m "feat: add new feature description"
# 推送到您的 Fork
git push origin feature/your-feature-name6. 创建 Pull Request
- 访问您的 GitHub Fork
- 点击 "Compare & pull request"
- 填写详细的 PR 描述
- 等待代码审查
提交规范
使用 Conventional Commits 规范:
bash
# 新功能
git commit -m "feat: add SSH key management"
# 修复 Bug
git commit -m "fix: resolve connection timeout issue"
# 文档更新
git commit -m "docs: update API documentation"
# 代码重构
git commit -m "refactor: improve error handling"
# 性能优化
git commit -m "perf: optimize database queries"
# 测试相关
git commit -m "test: add unit tests for auth module"
# 构建相关
git commit -m "build: update electron builder config"
# 其他
git commit -m "chore: update dependencies"代码审查标准
代码质量
- [ ] 代码符合项目编码规范
- [ ] 通过了所有自动化测试
- [ ] 没有引入新的警告或错误
- [ ] 代码有适当的注释和文档
功能完整性
- [ ] 功能按预期工作
- [ ] 包含了必要的测试用例
- [ ] 更新了相关文档
- [ ] 考虑了向后兼容性
安全性
- [ ] 没有引入安全漏洞
- [ ] 敏感信息得到适当保护
- [ ] 输入验证和错误处理完善
开发环境设置
1. 环境准备
系统要求
- Node.js 18.x+
- Yarn 1.22.x+
- Git 2.30.x+
- 支持的操作系统 (Windows/macOS/Linux)
开发工具
- VS Code (推荐)
- TypeScript 扩展
- ESLint 扩展
- Prettier 扩展
- GitLens 扩展
2. 项目设置
bash
# 克隆项目
git clone https://github.com/shzjj82/terminal-electron.git
cd terminal-electron
# 安装依赖
yarn install
# 配置环境变量
cp env/env.example env/development.env
# 启动开发服务器
yarn dev3. 开发工作流
日常开发
bash
# 1. 更新主分支
git checkout main
git pull upstream main
# 2. 创建功能分支
git checkout -b feature/your-feature
# 3. 开发功能
# ... 编写代码 ...
# 4. 运行测试
yarn test
# 5. 检查代码质量
yarn lint
yarn typecheck
# 6. 提交代码
git add .
git commit -m "feat: your feature description"
# 7. 推送分支
git push origin feature/your-feature代码审查
bash
# 1. 确保测试通过
yarn test
# 2. 检查代码覆盖率
yarn test:coverage
# 3. 运行集成测试
yarn test:integration
# 4. 检查构建
yarn build
# 5. 更新文档
# 确保相关文档已更新代码规范
1. TypeScript 规范
类型定义
typescript
// 使用接口定义对象结构
interface Server {
id: string;
name: string;
host: string;
port: number;
username: string;
}
// 使用类型别名定义联合类型
type AuthType = 'password' | 'key' | 'agent';
// 使用泛型提高代码复用性
interface ApiResponse<T> {
data: T;
message: string;
success: boolean;
}函数定义
typescript
// 使用箭头函数
const connectServer = async (server: Server): Promise<Connection> => {
// 实现逻辑
};
// 使用可选参数和默认值
const createServer = (
config: ServerConfig,
options: CreateOptions = {}
): Server => {
// 实现逻辑
};2. React 规范
组件定义
typescript
// 使用函数组件
interface ServerListProps {
servers: Server[];
onSelect: (server: Server) => void;
}
const ServerList: React.FC<ServerListProps> = ({ servers, onSelect }) => {
return (
<div className="server-list">
{servers.map(server => (
<ServerItem key={server.id} server={server} onSelect={onSelect} />
))}
</div>
);
};Hooks 使用
typescript
// 使用自定义 Hooks
const useServers = () => {
const [servers, setServers] = useState<Server[]>([]);
const [loading, setLoading] = useState(false);
const fetchServers = useCallback(async () => {
setLoading(true);
try {
const response = await api.getServers();
setServers(response.data);
} catch (error) {
console.error('Failed to fetch servers:', error);
} finally {
setLoading(false);
}
}, []);
return { servers, loading, fetchServers };
};3. 后端规范
控制器定义
typescript
@Controller('servers')
export class ServersController {
constructor(private readonly serversService: ServersService) {}
@Get()
async findAll(@Query() query: GetServersDto): Promise<Server[]> {
return this.serversService.findAll(query);
}
@Post()
async create(@Body() createServerDto: CreateServerDto): Promise<Server> {
return this.serversService.create(createServerDto);
}
}服务定义
typescript
@Injectable()
export class ServersService {
constructor(
@InjectRepository(Server)
private readonly serverRepository: Repository<Server>
) {}
async findAll(query: GetServersDto): Promise<Server[]> {
const { namespace, status } = query;
const queryBuilder = this.serverRepository.createQueryBuilder('server');
if (namespace) {
queryBuilder.where('server.namespace = :namespace', { namespace });
}
if (status) {
queryBuilder.andWhere('server.status = :status', { status });
}
return queryBuilder.getMany();
}
}4. 测试规范
单元测试
typescript
describe('ServersService', () => {
let service: ServersService;
let repository: Repository<Server>;
beforeEach(async () => {
const module = await Test.createTestingModule({
providers: [
ServersService,
{
provide: getRepositoryToken(Server),
useClass: Repository,
},
],
}).compile();
service = module.get<ServersService>(ServersService);
repository = module.get<Repository<Server>>(getRepositoryToken(Server));
});
it('should be defined', () => {
expect(service).toBeDefined();
});
describe('findAll', () => {
it('should return all servers', async () => {
const mockServers = [/* mock data */];
jest.spyOn(repository, 'find').mockResolvedValue(mockServers);
const result = await service.findAll({});
expect(result).toEqual(mockServers);
});
});
});集成测试
typescript
describe('ServersController (e2e)', () => {
let app: INestApplication;
beforeEach(async () => {
const moduleFixture = await Test.createTestingModule({
imports: [AppModule],
}).compile();
app = moduleFixture.createNestApplication();
await app.init();
});
it('/servers (GET)', () => {
return request(app.getHttpServer())
.get('/servers')
.expect(200);
});
});文档贡献
1. 文档类型
API 文档
- 更新 API 接口文档
- 添加请求/响应示例
- 完善错误码说明
用户指南
- 编写功能使用教程
- 添加截图和示例
- 更新安装和配置说明
开发文档
- 更新架构文档
- 添加开发指南
- 完善部署文档
2. 文档规范
Markdown 格式
markdown
# 标题使用 #
## 二级标题
### 三级标题
**粗体文本**
*斜体文本*
`代码片段`
```bash
# 代码块
yarn install引用文本
- 列表项 1
- 列表项 2
- 有序列表 1
- 有序列表 2
#### 文档结构
- 使用清晰的标题层次
- 保持一致的格式风格
- 添加适当的链接和引用
- 包含必要的截图和示例
## 社区参与
### 1. 讨论参与
#### GitHub Discussions
- 参与功能讨论
- 回答用户问题
- 分享使用经验
#### Discord 社区
- 实时技术交流
- 问题快速反馈
- 开发者协作
### 2. 代码审查
#### 审查他人代码
- 提供建设性反馈
- 关注代码质量和安全性
- 帮助改进实现方案
#### 接受审查反馈
- 积极回应审查意见
- 及时修改问题代码
- 学习最佳实践
### 3. 知识分享
#### 技术博客
- 分享开发经验
- 介绍新功能特性
- 提供使用教程
#### 技术演讲
- 参与技术会议
- 分享项目经验
- 推广开源文化
## 发布流程
### 1. 版本发布
#### 版本号规范
使用 [语义化版本](https://semver.org/):
- **主版本号**: 不兼容的 API 修改
- **次版本号**: 向下兼容的功能性新增
- **修订号**: 向下兼容的问题修正
#### 发布步骤
```bash
# 1. 更新版本号
yarn version --patch # 或 --minor, --major
# 2. 构建发布版本
yarn build:electron:all
# 3. 运行测试
yarn test
# 4. 创建发布标签
git tag -a v1.0.0 -m "Release version 1.0.0"
# 5. 推送标签
git push origin v1.0.02. 发布说明
发布说明模板
markdown
# v1.0.0
## 🎉 新功能
- 添加 SSH 密钥管理功能
- 支持端口转发配置
- 新增团队协作功能
## 🐛 修复
- 修复连接超时问题
- 解决内存泄漏问题
- 修复 UI 显示异常
## 📚 文档
- 更新 API 文档
- 添加用户指南
- 完善开发文档
## 🔧 技术改进
- 优化构建性能
- 提升应用启动速度
- 改进错误处理机制行为准则
1. 社区准则
尊重他人
- 保持友好和专业的交流态度
- 尊重不同的观点和经验
- 避免人身攻击和歧视性言论
建设性反馈
- 提供具体和有建设性的反馈
- 关注问题本身而非个人
- 帮助他人改进和学习
包容性
- 欢迎不同背景的贡献者
- 支持新手学习和成长
- 创造包容的开发环境
2. 技术准则
代码质量
- 编写清晰、可维护的代码
- 遵循项目编码规范
- 添加必要的测试和文档
安全性
- 关注代码安全性
- 及时报告安全漏洞
- 遵循安全最佳实践
性能
- 考虑代码性能影响
- 优化资源使用
- 进行必要的性能测试
获取帮助
1. 常见问题
开发环境问题
代码问题
- 查看项目文档
- 搜索现有 Issues
- 在 Discussions 中提问
2. 联系方式
官方渠道
- GitHub Issues: 问题报告和功能建议
- GitHub Discussions: 技术讨论和问答
- Discord: 实时交流和协作
社区资源
- 项目文档: 详细的使用和开发指南
- 代码示例: 查看现有代码实现
- 贡献者指南: 本文档
3. 学习资源
技术文档
开发工具
致谢
感谢所有为 Terminal Electron 项目做出贡献的开发者!
贡献者名单
特别感谢
- 感谢所有报告问题和提供建议的用户
- 感谢所有参与代码审查的开发者
- 感谢所有提供文档和教程的贡献者
让我们一起构建更好的 Terminal Electron! 🚀