市场种子(market seeds)
给市场(market_apps)预置的一批零构建 VFS 种子 app —— 让核心价值(市场)开箱即非空。 每个种子 = 一个 AppEntry(@agentaily/presets):{ id, name, description, aml, files, preview, tags }, 符合 REFACTOR.md §9 的零构建文件模型(1 个 index.html 入口 + 按需 .css/.js, 相对路径 / CDN ESM,禁 .jsx/.tsx/构建)。
种子清单
| id | 名称 | 演示的能力 |
|---|---|---|
seed-form | 活动报名表单 | 多文件 VFS(html + 相对引用的 css/js)· 答卷(answers Json,零迁移)· window.agentaily.submit() 数据桥(无桥降级演示) |
seed-landing | 产品落地页(等候名单) | import map → CDN ESM 直引 canvas-confetti(零打包引库)· 邮箱写入 Lead 表 |
seed-todo | 待办清单(Preact + htm) | Preact + htm 经 CDN ESM 写「JSX 式」组件(零构建、无 .jsx)· localStorage 持久 |
目录结构(每个种子)
seeds/<id>/
meta.json # { id, name, description, accent, tags } —— 市场元数据
schema.aml # AML 数据模型(被 @agentaily/aml check 校验)
files/ # 零构建前端 VFS:index.html 入口 + 相对引用的 css/js/资源preview 不在源文件里 —— 由 assemble.mjs 从 meta(名称 + accent)合成一张品牌化 SVG 预览图(真实截图是市场 M3 的活,不在本批范围)。assemble.mjs 是装配器:把上面的目录读成 AppEntry[], 加载器和测试共用它,确保「插进去的行」== 「测试校验的行」,不漂移。
加载进 D1(幂等)
加载器 scripts/seed-market.mjs 按稳定 id upsert(ON CONFLICT(id) DO UPDATE), 每行固定 owner(agentaily-seed)+ 固定时间戳,所以重复跑是 no-op、绝不重复插。可放进每次部署。
前提:先应用迁移(
market_apps表要先存在):bash# 在 apps/web 下 pnpm exec wrangler d1 migrations apply agentaily-db --local # 或 --remote
bash
# 在 apps/web 下
pnpm seed:market # 灌进本地 D1(miniflare sqlite,.wrangler/)
pnpm seed:market --remote # 灌进生产 D1(账号受限,老板来跑)
pnpm seed:market --dry-run # 只打印将执行的 SQL,不执行校验
seeds.test.ts(随 pnpm test / pnpm --filter @agentaily/web test 跑)断言每个种子: 是良构的 AppEntry、files 含 index.html、index.html 相对引用的文件都在 VFS 里、AML 能过 @agentaily/aml 的 check。