实现小游戏与小程序项目创建发布

This commit is contained in:
2026-08-09 13:31:06 +08:00
parent a6fe14a8d6
commit 493b31cff0
26 changed files with 1827 additions and 39 deletions

View File

@@ -0,0 +1,71 @@
# Task: 实现小游戏小程序和自定义项目类型
## Identity
- Task ID: 20260809-project-types-impl-3f7a
- Mode: Feature
- Branch: main
- Worktree: D:\Datas\OthersProjects\makelore
- Base commit: a6fe14a8d60ae5bfd83529b36bead34b8b8c3348
- Owner: codex
- Status: Ready for Integration
## Scope
- 为 AI 编程项目引入创建时选择且不可变的 `ProjectType``mini_game``mini_program``custom`
- 在核心配置、目录初始化和安全打包层贯通项目类型;为小游戏和小程序生成可真实 `npm ci`、Vite build 的固定版本模板。
- 旧配置缺少类型时归一为 `custom`;自定义项目拒绝进入受控发布打包。
- 更新配置、初始化和打包聚焦测试Renderer、Host API 路由和 README 由同任务根代理负责。
## Intent And Constraints
- `ProjectType` 是不可变产品类型,`BuildPreset` 是平台内部构建实现,两者不得混用;第一期两个可发布类型都使用受控 Vite preset。
- 直接复用已有项目时,显式请求的类型必须与已有配置一致;未传类型的旧 API 调用保留既有复用行为。
- 模板在 staging 目录完整生成后沿用现有排他复制与回滚机制,不覆盖用户文件。
- `custom` 和旧配置不得被打包为可发布作品;安全扫描、敏感文件排除、符号链接和包体限制不得削弱。
- 只修改任务记录,不写 canonical `.project-docs` 文件;不提交代码。
## Plan
1. 固定配置类型、旧配置归一和保存/复用不可变规则,并用单元测试锁定。
2. 增加两个受控 Vite 项目模板和真实 npm 锁文件,接入原子目录初始化。
3. 按项目类型生成带 `project_type` 的发布清单,并拒绝 `custom`
4. 运行聚焦测试、模板 `npm ci`/build、typecheck、scoped lint、build 和文档漂移检查。
## Outcome
- 新增不可变 `ProjectType` 契约:`mini_game``mini_program``custom`。新配置明确保存类型;旧配置仅在字段缺失时归一为 `custom`,显式未知值会判为无效配置。
- 项目配置保存不能改变已有类型;直接复用所选文件夹时,显式类型必须与已有配置一致,未传类型的旧 API 调用仍可按原行为复用。
- 小游戏和小程序都在 staging 中生成固定 Vite 7.3.1、真实 npm v3 锁文件、相对资源构建配置和可运行示例。小游戏包含 `game.json`/`game.js` 与 Canvas 示例;小程序包含 `app.json`/`app.js`/`pages/index` 与交互首页。自定义项目保持原最小结构。
- 模板继续使用排他复制和失败回滚;目标文件冲突时不会在用户文件夹留下 `.niancode` 或其他半成品。
- 安全打包先读取项目类型:`custom` 返回 `PROJECT_TYPE_UNPUBLISHABLE`;两种可发布类型继续使用内部受控 Vite preset并在生成的 `niancode.yml` 顶层写入 `project_type`。既有敏感文件排除、符号链接、稳定读取和包体限制未放宽。
- 同任务根代理已贯通创建对话框、Renderer store、Host API、发布入口/分类和 README本记录仅描述已观察到的共享任务结果不改 canonical 项目文档。
- 新建弹窗默认选择“小游戏”,同时提供“小程序”和“自定义项目”两种明确选项;自定义项目的配置页不显示“一键提交审核”,而是说明需新建小游戏或小程序项目。
- 一键提交的作品分类随项目类型发送;模板文件缺失时不再要求非专业用户手工补三个文件,而是提示让开发助手修复项目模板。
## Verification
- `pnpm exec vitest run tests/unit/project-config.test.ts tests/unit/project-directory-initialization.test.ts tests/unit/project-packager.test.ts`3 files / 24 tests passed。
- `pnpm exec vitest run tests/unit/works-routes.test.ts`1 file / 27 tests passed可发布路由 fixture 已明确写入 `mini_game` 配置,避免旧的隐式“任意 Vite 项目都可发布”前提。
- 使用真实 `initializeProjectDirectory` 生成临时 `mini_game``mini_program` 项目后,分别执行 `npm ci --ignore-scripts --no-audit --no-fund``npm run build`:两者均安装 14 个锁定依赖并由 Vite 7.3.1 构建成功;验证结束已清理临时项目与临时测试工具。
- `pnpm run typecheck`:通过。
- 对核心配置、初始化、模板、打包及三份聚焦测试执行 scoped ESLint通过。
- `pnpm run build:vite`Renderer、Electron Main、Preload 均构建成功;仅有仓库既有 chunk/dynamic-import 提示。
- `git diff --check`:通过;仅有 Git 的 LF/CRLF 工作区提示。
- `pnpm exec vitest run tests/unit/project-config.test.ts tests/unit/project-directory-initialization.test.ts tests/unit/project-packager.test.ts tests/unit/opencode-routes.test.ts tests/unit/opencode-store.test.ts tests/unit/sidebar-opencode-projects.test.tsx tests/unit/project-configuration-page.test.tsx tests/unit/project-publish-action.test.tsx tests/unit/works-project-publish.test.ts tests/unit/works-routes.test.ts`10 files / 310 tests passed。
- `pnpm exec playwright test tests/e2e/project-superpowers-toggle.spec.ts --reporter=line`1 passed真实 Electron 新建弹窗验证三种项目类型、默认小游戏及小游戏/小程序切换。
- `pnpm test` 的全仓尝试结果为 1471 passed / 20 failed14 项因本机缺少 `zip` 可执行文件、1 项因仓库缺少 `.opencode/agent` 夹具;其余为未修改的图片认证/项目进度同步用例和 1 项时序用例(该时序用例单独重跑通过)。这些失败不位于本任务变更链路,已保留为基线信息,未扩张本任务去修改无关模块。
## Follow-ups
- Works Square 服务端已在兄弟任务 `20260809-project-types-server-8d2c` 接受并校验顶层 `project_type`,并继续映射到内部受控 Vite preset两仓变更需成组集成后才能进行真实发布验收。
- 完成服务端类型分流后,使用真实账号执行“小程序/小游戏创建 → 一键提交 → 构建 → 运营审核 → 发布”的生产整链验收。
## Promotion Candidates
- Target: `.project-docs/40-domain/business-rules.md` 与 README 当前产品状态。
- Proposal: 记录 `ProjectType` 是创建时选择且不可变的产品类型;小游戏和小程序创建即具备平台受控发布骨架,自定义及旧项目默认不可一键发布。
- Evidence: 本任务配置/初始化/打包实现24 项核心回归,两类真实 `npm ci` + Vite build以及同任务 Renderer/Host API 回归。
- Future impact: 后续不得把 `custom` 当成构建 preset也不得通过任意 Shell 命令绕过平台受控构建边界。
- Semantic conflicts: 需要服务端同步接受 `project_type`;与现有 Main-owned 安全打包和单入口发布边界一致。
- Human confirmation required: 是用户已确认三种创建类型和“参照微信、自有平台实现”的方向canonical promotion 仍由 Integration Gate 执行。