InsForge 开源贡献指南:从克隆仓库到合并 PR 的完整开发工作流
【免费下载链接】InsForgeThe all-in-one, open-source backend platform for agentic coding. InsForge gives your coding agent database, auth, storage, compute, hosting, and AI gateway to ship full-stack apps end-to-end.项目地址: https://gitcode.com/GitHub_Trending/in/InsForge
本文以仓库根目录的 CONTRIBUTING.md 为骨架,结合 InsForge 实际的
package.json、docker-compose.yml、.env.example、后端测试体系(backend/tests/README.md)与 ESLint 配置(eslint.config.js)源码,为希望向 InsForge 提交代码的开发者提供一条端到端的实操路径:理解单体仓库结构 → 搭建本地开发环境 → 认领 Issue → 按规范开发与测试 → 提交并维护 PR。读完本文,你将掌握 InsForge 的分支命名、提交信息格式、测试运行方式、代码风格约定与文档资源规范,能够独立完成一次合规的贡献闭环。
先看懂 InsForge 的单体仓库(Monorepo)布局
InsForge 是一个基于 npm workspaces + Turborepo 管理的单体仓库。根目录的 package.json 定义了三个工作区:
"workspaces": [ "backend", "frontend", "packages/*" ]结合 CONTRIBUTING.md 中的 Project Structure 说明与实际目录,各模块职责如下:
| 目录 | 职责 |
|---|---|
backend/ | 核心后端服务,基于 Express.js + PostgreSQL + PostgREST,并集成 Better Auth;包含 API 路由(backend/src/api/routes)、基础设施(backend/src/infra)、各领域服务与 67 个 SQL 迁移文件(backend/src/infra/database) |
frontend/ | React 管理后台(Vite 构建),用于管理数据库、用户与存储 |
packages/shared-schemas/ | 前后端共享的 Zod schema 与 TypeScript 类型,是"线上契约"(wire contract)的唯一事实来源 |
packages/dashboard/、packages/ui/ | 仪表盘应用与可复用 UI 组件库 |
docs/ | 面向用户的 MCP / 产品文档(含多语言版本) |
functions/ | 基于 Deno 的 Serverless 边缘函数,用于自定义业务逻辑 |
openapi/ | 各服务的 OpenAPI 规范文件(openapi) |
docker-compose.yml | 一键启动整个开发栈的 Docker 编排文件 |
这种布局意味着:修改跨包公共类型时应改packages/shared-schemas,而不是在前端或后端各改一份——这正是shared-schemas存在的原因。根目录的turbo.json负责跨工作区任务的编排,常用脚本在 package.json 中均可直接调用(如npm run dev、npm run build、npm run test、npm run lint)。
环境准备
开始开发前,CONTRIBUTING.md 要求你准备好两样基础工具:
- Docker——用于启动 PostgreSQL、PostgREST、Deno 运行时等依赖服务;
- Node.js(建议 LTS 版本)——根目录
package.json声明packageManager: "npm@11.3.0",使用 npm 即可管理全部工作区依赖。
从源码结构看,InsForge 的开发环境高度依赖 Docker 编排,本地直接起后端(npm run dev:backend对应tsx watch src/server.ts)也需要 Postgres 与 PostgREST 可用,因此不要跳过 Docker 安装步骤。
本地开发环境搭建(Getting Started)
1. Fork 并克隆仓库
- 将仓库 fork 到你的 GitHub 账户;
- 克隆你的 fork 到本地并进入目录:
git clone <your-fork-url> cd insforge注:后续所有修改都应提交到你的 fork,再通过 Pull Request 合回上游
main分支。
2. 准备环境变量文件
仓库根目录提供了完整的 .env.example(未被 .gitignore 忽略的模板),复制为.env即可:
Unix 系系统:
cp .env.example .envWindows 系统:
copy .env.example .env模板文件头部明确要求:不要把.env提交进版本控制,生产环境务必使用强随机密钥(如openssl rand -base64 32生成 JWT_SECRET)。开发阶段可直接使用模板默认值,其中关键项包括:
COMPOSE_PROJECT_NAME=insforge:Compose 项目名,保持稳定可避免容器/卷被误接管;JWT_SECRET(≥32 字符)与独立的ENCRYPTION_KEY:ENCRYPTION_KEY未设置时会回退到JWT_SECRET,但一旦日后轮换 JWT_SECRET,将永久损坏已存储的密钥类数据(API Key、OAuth Token 等),因此建议一开始就分开设置;ROOT_ADMIN_USERNAME=admin/ROOT_ADMIN_PASSWORD=change-this-password:根管理员凭证,生产环境必须修改;- 端口默认值:
APP_PORT=7130、AUTH_PORT=7131、UI_PORT=7132、DENO_PORT=7133、POSTGRES_PORT=5432、POSTGREST_PORT=5430。
3. 启动开发栈
docker compose up这里执行的开发栈定义在根目录 docker-compose.yml,共包含 4 个相互依赖的服务:
- postgres:使用
ghcr.io/insforge/postgres:v15.13.4镜像,挂载了 deploy/docker-init/db/db-init.sql 与 deploy/docker-init/db/jwt.sql 初始化脚本,并带健康检查; - postgrest:PostgREST v12,直连 Postgres 的
publicschema,PGRST_JWT_SECRET与后端JWT_SECRET保持一致; - insforge:构建自根目录 Dockerfile 的
dev目标,容器启动命令会先npm install、构建 shared-schemas/ui/dashboard 三个包、执行npm run migrate:up跑数据库迁移,最后用concurrently同时启动后端与前端开发服务(backend/src/server.ts与frontend),并把仓库源码以卷挂载方式映射进容器,实现热更新; - deno:
denoland/deno:alpine-2.0.6运行时,负责 Serverless 边缘函数(监听 7133),工作目录挂载 functions。
启动完成后,后端 API 位于http://localhost:7130,管理后台位于http://localhost:7132(浏览器访问端口以UI_PORT实际值为准)。
4. 日常开发命令
根目录 package.json 提供了一组与 Turborepo 集成的脚本,覆盖整个开发循环:
npm run dev # turbo 并行启动前后端开发服务 npm run dev:backend # 仅启动后端(tsx watch) npm run dev:frontend # 仅启动前端 npm run build # turbo 构建全部工作区 npm run test # turbo 运行全部测试 npm run test:e2e # 运行后端端到端测试 npm run lint # turbo 运行 ESLint npm run typecheck # turbo 运行 tsc --noEmit npm run format # prettier 全量格式化提示:如需在后端侧查看迁移相关脚本(
migrate:up、migrate:down、migrate:create、migrate:check-duplicates),可查看 backend/package.json。
Issue 优先的工作流:先认领,再动手
InsForge 采用issue-first(Issue 优先)工作流:先开或找到一个 Issue,等待分配给你,然后才开始写 PR。这能保证工作可追踪、避免两人重复造轮子、也让评审更顺畅。完整流程如下:
- 找到或新建 Issue:描述 bug 或新功能,若不存在对应 Issue 先新建一个;
- 认领 Issue:在 Issue 评论区留言申请分配(例如 "I'd like to work on this" 或 "please assign this to me")。仓库维护者 Agent章北海(Zhang Beihai)会自动为你分配;
- 等待分配后再开 PR:PR 描述中必须链接对应 Issue(例如
Closes #123)。
认领规则
- 每位贡献者在所有 InsForge 仓库同时持有的已分配 Issue 数上限为3 个(不是按单仓计算)。完成或释放一个后才能认领下一个;释放请在该 Issue 下评论
unassign me; - 如果 Agent 因账户权限不足无法自动分配,维护者会手动分配;
- Drive-by 修复(未认领直接提 PR)依然会被评审,但 Agent 会为其打上
needs-issue或needs-assignment标签并留言提醒,且未关联 Issue 的工作更容易失联。认领后再动手是阻力最小的路径。
从源码佐证看,章北海 Agent 的工作资料存放在仓库根目录 .agents(含 .agents/docs/deployment.md 与 .agents/skills/insforge-dev 等技能文档),贡献者可以参考这些资料理解 Agent 期望的开发规范。
开发工作流:分支、提交与质量关卡
1. 创建功能分支
git checkout -b type/description # 示例:git checkout -b feat/site-deployment分支名使用类型前缀/简短描述格式,前缀语义如下:
| 前缀 | 含义 |
|---|---|
feat/ | 新功能 |
fix/ | Bug 修复 |
docs/ | 文档变更 |
refactor/ | 代码重构 |
test/ | 测试相关改动 |
chore/ | 构建过程或工具链改动 |
2. 编码与自检
- 遵循下文"代码风格"一节;
- 为新功能补充测试(测试规范见下一节);
- 运行测试套件与 linter:
npm run test:e2e npm run lint- 确保所有测试通过、代码格式正确。
3. 提交信息:Conventional Commits
提交信息必须遵循 Conventional Commits 格式:
type(scope): description [optional body] [optional screenshots / videos] [optional footer(s)]type与分支前缀一一对应(feat、fix、docs、refactor、test、chore等),scope用于标注影响范围(如feat(site-deployment): add custom domain support)。
4. 推送并开 PR
git push origin type/description随后在你的 fork 页面向上游仓库的main分支发起 Pull Request。
测试体系:从单元测试到端到端
CONTRIBUTING.md 要求所有贡献必须包含恰当的测试:新功能写单元测试、提 PR 前确保测试全绿、行为受影响时更新既有测试、遵循现有测试模式、在适用环境跨环境验证。InsForge 的测试体系分为三层:
单元 / 组件测试(Vitest)
后端使用 Vitest,配置见 backend/vitest.config.ts:environment: 'node'、globals: true、加载 backend/tests/setup.ts(每个用例前后清理./test-data目录)。值得注意的两个细节:
- 测试顺序执行(
pool: 'forks'+maxWorkers: 1),注释明确说明这是为了避免数据库冲突,且刻意不设isolate: false,以免破坏依赖每文件模块重置的用例; - 集成测试目录
tests/integration被默认排除,需单独通过npm run test:integration运行(见 backend/package.json)。
后端已有 200+ 个单元测试文件(如 backend/tests/unit/auth-email-otp-route.test.ts、backend/tests/unit/s3-gateway-dispatch.test.ts),写新测试前建议先阅读同类文件对齐写法。
端到端测试(Shell + curl)
根目录npm run test:e2e对应 backend/package.json 中的./tests/run-all-tests.sh。整套脚本的组织与约定记录在 backend/tests/README.md:
- 测试前置:后端运行在
http://localhost:7130、根管理员root/change-this-password、存储操作需要 API Key; - 环境变量:
ACCESS_API_KEY用于 API 鉴权;ROOT_ADMIN_USERNAME/ROOT_ADMIN_PASSWORD/TEST_API_BASE有默认值;云/S3 测试还需AWS_S3_BUCKET、AWS_REGION、AWS 凭证与APP_KEY(7-9 字符的租户标识); - 测试分类:backend/tests/local 覆盖本地 Docker 部署 + 本地文件存储(鉴权、数据库 CRUD、E2E 工作流、公开存储桶、RPC、计划任务、密钥管理等);backend/tests/cloud 覆盖云端 S3 多租户存储;
- 统一入口:backend/tests/run-all-tests.sh 会先加载仓库根
.env,再执行 backend/tests/preflight.sh 做健康检查与管理员登录预检,之后逐个运行local/test-*.sh,并在配置了 S3 时运行cloud/test-*.sh,最后输出汇总(退出码 0 = 全部通过,1 = 存在失败,便于 CI 集成)。也支持--preflight-only仅检查环境; - 自动清理:所有测试会自动删除
testuser_前缀用户、测试表与测试存储桶;如需彻底清理可运行./cleanup-all-test-data.sh; - 写新 E2E 测试:在
local/或cloud/新建脚本,sourcebackend/tests/test-config.sh(提供共享配置、彩色输出与错误跟踪),用register_test_user/register_test_table/register_test_bucket注册清理资源,用print_success/print_fail/print_info输出结果,脚本退出时自动清理。
Pull Request 流程
CONTRIBUTING.md 对 PR 阶段给出了明确要求:
- 开 PR 前确保你解决的 Issue已分配给你;
- 尽早创建 Draft PR以便讨论;
- 在描述中链接 Issue(如
Closes #123); - 确保所有测试通过、构建成功;
- 按需更新文档;
- 保持 PR 聚焦在单一功能或单一 bug 修复上;
- 积极回应评审意见;
- 修完评审意见后,务必对被指派的评审人 re-request review(点击其名字旁的 🔁 按钮)。这是评审人收到"可以再看一次"通知的唯一方式——不做这一步,PR 可能被长时间搁置。
代码风格:TypeScript、ESLint 与 Prettier
CONTRIBUTING.md 的 Code Style 章节给出以下原则:
- 遵循既有代码风格;
- 有效使用 TypeScript 类型与接口;
- 保持函数小而专注;
- 使用有意义的变量名与函数名;
- 为复杂逻辑添加注释;
- 修改 API 时同步更新相关文档。
这些原则在仓库的 eslint.config.js 中有具体落地,可归纳为三类硬性约束:
TypeScript 规则:未使用变量(忽略_前缀)、悬浮 Promise(no-floating-promises)、误用 Promise(no-misused-promises)、await-thenable、require-await均为 error 级别。
命名规范(@typescript-eslint/naming-convention):参数与函数使用camelCase/PascalCase(允许前导下划线、禁止尾随下划线);类型、接口、类型参数与类使用PascalCase;枚举成员使用UPPER_CASE;React 组件(大写开头的函数)使用PascalCase。packages/shared-schemas额外放宽:对象字面量键允许snake_case(因为 schema 对外模拟线上契约),并强制@typescript-eslint/no-explicit-any: 'error'。
通用与格式规则:prefer-const、禁止var、强制eqeqeq、强制curly,并通过eslint-plugin-prettier把 Prettier 格式问题提升为 error(prettier/prettier: 'error')。全局忽略docs/**、openapi/**、测试文件与各类配置文件。格式化可一键执行:npm run format(prettier --write .)。
文档与资源贡献:asset 规范
若你的 PR 涉及图片、视频、SVG 等媒体文件,CONTRIBUTING.md 要求先阅读 docs/asset-guidelines.md。其核心约束包括:
- 超过 5 MB 的文件需谨慎评审:大文件会拖慢仓库克隆、拉低文档加载速度并造成 Git 历史膨胀;
- 视频优先使用 MP4,压缩屏幕录制后再提交(仓库给出示例命令:
ffmpeg -i input.mp4 -vcodec libx264 -crf 28 -preset slow -an output.mp4),并避免提交同一视频的重复版本; - PNG用
pngquant --force --ext .png image.png压缩;JPEG用jpegoptim image.jpg优化; - SVG尽量保持矢量数据,不要内嵌大尺寸 base64 位图,导出前清理冗余元数据。
小结:一次合规贡献的自检清单
完成开发后,对照以下清单自查,即可放心提交:
- 已认领 Issue 且已分配(或确认为 drive-by 修复并接受标签提醒),PR 中已用
Closes #N链接 Issue; - 分支命名符合
type/description,提交信息符合 Conventional Commits 格式; - 已为新功能补充单元测试(Vitest)与必要的 E2E 测试(
local/或cloud/),npm run test:e2e与npm run lint全部通过; - 代码通过 ESLint(命名规范、Promise 处理、Prettier 格式)与
npm run typecheck; - API 变更已同步更新 docs 文档;新增媒体资源满足 docs/asset-guidelines.md 的压缩要求;
- 已创建(或转正)PR,保持单一功能聚焦,评审意见修复后已对被指派人 re-request review。
遵循这条工作流,你的贡献就能顺畅地进入 InsForge 的评审与合并管线,成为这个开源后端平台演进的一部分。
【免费下载链接】InsForgeThe all-in-one, open-source backend platform for agentic coding. InsForge gives your coding agent database, auth, storage, compute, hosting, and AI gateway to ship full-stack apps end-to-end.项目地址: https://gitcode.com/GitHub_Trending/in/InsForge
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考