{"id":48206039,"url":"https://github.com/markbang/cyop","last_synced_at":"2026-04-04T18:37:22.653Z","repository":{"id":324012672,"uuid":"1095548129","full_name":"markbang/cyop","owner":"markbang","description":null,"archived":false,"fork":false,"pushed_at":"2026-03-19T07:38:45.000Z","size":488,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-03-19T23:02:51.722Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"https://cyop.bangwu.top","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/markbang.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null}},"created_at":"2025-11-13T07:42:36.000Z","updated_at":"2026-03-19T07:38:48.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/markbang/cyop","commit_stats":null,"previous_names":["markbang/cyop"],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/markbang/cyop","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/markbang%2Fcyop","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/markbang%2Fcyop/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/markbang%2Fcyop/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/markbang%2Fcyop/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/markbang","download_url":"https://codeload.github.com/markbang/cyop/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/markbang%2Fcyop/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31409407,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-04T10:20:44.708Z","status":"ssl_error","status_checked_at":"2026-04-04T10:20:06.846Z","response_time":60,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-04-04T18:37:22.566Z","updated_at":"2026-04-04T18:37:22.636Z","avatar_url":"https://github.com/markbang.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# cyop\n\ncyop 是一个面向 AI 素材生产与运营流程的内部平台原型，当前仓库已经不只是 Better-T-Stack 的初始化模板了。\n\n现在这套东西主要在做几件事：\n\n- 用 **Requirements / Datasets / Tasks** 管理素材生产流程\n- 用 **Caption Jobs / Captions / Prompt Templates** 支撑 AI 打标与批处理\n- 提供一个 **React + TanStack Router** 的 Web 控制台\n- 提供一个 **Hono + tRPC + Better Auth** 的后端服务\n- 用 **Drizzle + PostgreSQL(Neon)** 管数据\n- 支持 **S3 兼容对象存储** 和自动化回调的扩展能力\n\n## Tech Stack\n\n- Bun + TypeScript\n- Turborepo monorepo\n- React 19 + Vite + TanStack Router + React Query\n- Hono + tRPC\n- Better Auth\n- Drizzle ORM + PostgreSQL\n- Tailwind CSS + 自定义 UI package\n- Biome + Husky\n\n## Workspace Layout\n\n```text\ncyop/\n├── apps/\n│   ├── web/         # 前端控制台（Vite + React + TanStack Router）\n│   ├── server/      # API / Auth 服务（Hono + tRPC）\n│   └── fumadocs/    # 文档站点（存在但不是当前主线）\n├── packages/\n│   ├── api/         # tRPC router / context / 业务服务\n│   ├── auth/        # Better Auth 配置\n│   ├── db/          # Drizzle schema / migration / DB 入口\n│   ├── ui/          # 共享 UI 组件\n│   └── config/      # 共享配置包\n└── .github/workflows/release.yml\n```\n\n## Current Product Surface\n\n当前 Web 端已经有这些主要页面：\n\n- `/`：落地页\n- `/login`：登录 / 注册\n- `/dashboard`：需求、数据集、任务总览与录入（需登录）\n- `/media`：素材库视图（需登录）\n- `/todos`：AI 模型、Caption 批处理、任务操作台（需登录）\n- `/editor`：编辑器页面（需登录）\n\n其中 `/dashboard`、`/media`、`/todos`、`/editor` 当前都在路由层通过 `requireSession()` 做鉴权，未登录会直接跳到 `/login`。\n\n最近还做了路由 lazy load 和 devtools 拆分，说明前端已经开始进入“能持续迭代”的阶段，不再只是 demo 壳子。\n\n## Quick Start\n\n### 1) Install dependencies\n\n```bash\nbun install\n```\n\n### 2) Configure env files\n\n#### `apps/server/.env`\n\n最少需要这些：\n\n```env\nDATABASE_URL=\nBETTER_AUTH_SECRET=\nBETTER_AUTH_URL=http://localhost:3000\nCORS_ORIGIN=http://localhost:3001\n```\n\n如果你要跑素材 / 自动化 / AI caption 相关能力，再补这些：\n\n```env\nAUTOMATION_WEBHOOK_URL=\nS3_ACCESS_KEY_ID=\nS3_SECRET_ACCESS_KEY=\nS3_BUCKET=\nS3_REGION=\nS3_ENDPOINT=\nS3_FORCE_PATH_STYLE=false\nASSET_PUBLIC_URL=\nAI_CAPTION_MODEL=\nAI_CAPTION_API_KEY=\nAI_CAPTION_BASE_URL=\nAI_CAPTION_PROMPT=\n```\n\n#### `apps/web/.env.example`\n\n```env\nVITE_SERVER_URL=http://localhost:3000\n```\n\n实际使用时建议在 `apps/web/.env` 里配置：\n\n```env\nVITE_SERVER_URL=http://localhost:3000\n```\n\n#### `apps/fumadocs/.env.example`\n\n```env\nNEXT_PUBLIC_APP_URL=http://localhost:3001\nNEXT_PUBLIC_DOCS_SITE_URL=https://docs.cyop.design\n```\n\n- `NEXT_PUBLIC_APP_URL`：文档站首页“返回控制塔”按钮跳转地址\n- `NEXT_PUBLIC_DOCS_SITE_URL`：文档站公开访问域名，用于 Next.js `metadataBase` 与 OG 图片链接生成\n\n### 3) Push database schema\n\n```bash\nbun run db:push\n```\n\n### 4) Start development\n\n```bash\nbun run dev\n```\n\n默认端口：\n\n- Web: \u003chttp://localhost:3001\u003e\n- API: \u003chttp://localhost:3000\u003e\n\n## Useful Commands\n\n### Development\n\n```bash\nbun run dev\nbun run dev:web\nbun run dev:server\n```\n\n### Build\n\n```bash\nbun run build\ncd apps/web \u0026\u0026 bun run build\ncd apps/server \u0026\u0026 bun run build\n```\n\n### Type Check / Formatting\n\n```bash\nbun run check-types\nbun run check\n```\n\n注意：根目录的 `bun run check` 当前执行的是 `biome check --write .`，也就是**会直接改写文件**，它更接近“格式化 + 自动修复”，不是只读校验。\n\n这也意味着：\n\n- 本地提交前跑它没问题，顺手统一格式\n- 如果你只是想看 CI 会不会过，不要把它当成纯检查命令\n- 当前仓库还**没有**单独提供一个只读版 lint/check 脚本\n\n如果你只是想在提交前确认仓库能不能过 CI，优先跑：\n\n```bash\nbun run check-types\nbun run build\n```\n\n另外补一条容易踩坑的点：`packages/*/dist` 目前是构建产物目录，排查问题时可以参考，但日常开发应优先修改对应的 `src/` 源码，不要把产物文件当成真实实现入口。\n\n### Database\n\n```bash\nbun run db:push\nbun run db:generate\nbun run db:migrate\nbun run db:studio\n```\n\n## Notes for Contributors\n\n### Auth / cookies\n\n`packages/auth` 里默认把 cookie 设成了：\n\n- `sameSite: \"none\"`\n- `secure: true`\n- `httpOnly: true`\n\n所以如果你在本地调试登录流程，记得一起检查：\n\n- 前后端 origin 是否匹配\n- 是否走 HTTPS / 代理\n- `BETTER_AUTH_URL` / `CORS_ORIGIN` / `VITE_SERVER_URL` 是否一致\n\n### Environment propagation\n\n根目录 `turbo.json` 已经把这些环境变量列进了 `globalEnv`，改部署或接入新服务时优先同步这里：\n\n- 数据库\n- Auth\n- S3 / 资源地址\n- 自动化 webhook\n- AI caption 配置\n- `VITE_SERVER_URL`\n- `NEXT_PUBLIC_APP_URL`（文档站首页里“返回控制塔”的跳转地址）\n- `NEXT_PUBLIC_DOCS_SITE_URL`（文档站的公开基地址，用于 metadata / OG 图片）\n\n### Object storage support\n\n服务端当前走的是 **S3-compatible** 配置，不绑死某一家云厂商；`S3_FORCE_PATH_STYLE` 也已经留了开关，兼容 MinIO / R2 / 各类兼容存储会更方便。\n\n## Release\n\n仓库里目前有一个 tag release workflow：推送 `v*` tag 时会触发 `.github/workflows/release.yml`，通过 `changelogithub` 生成 release。\n\n## CI status\n\n仓库已经有 `.github/workflows/ci.yml`，当前会在 `push main` 和 `pull_request` 时执行：\n\n- `bun install --frozen-lockfile`\n- `bun run check-types`\n- `bun run build`\n\n也就是说，想提前本地对齐 CI，直接跑下面这组就行：\n\n```bash\nbun run check-types\nbun run build\n```\n\n## What still needs love\n\n这个仓库接下来比较值得继续补的方向：\n\n- 补一份真正可执行的部署文档（尤其是 Web 静态部署 + Server 独立部署）\n- 给 caption / dataset / requirement 核心流程补最小测试\n- 把 `.env.example` 再细化成“必填 / 选填 / 仅生产环境”\n- 视情况把只读 lint / format 校验拆出来，和当前会改文件的 `bun run check` 分开\n\n如果你刚接手这个仓库，先看这里，再去看 `packages/db/src/schema` 和 `packages/api/src/routers`，会比直接从模板结构猜快很多。","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmarkbang%2Fcyop","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmarkbang%2Fcyop","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmarkbang%2Fcyop/lists"}