Skip to content

市场种子(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 式」组件(零构建、无 .jsxlocalStorage 持久

目录结构(每个种子)

seeds/<id>/
  meta.json     # { id, name, description, accent, tags } —— 市场元数据
  schema.aml    # AML 数据模型(被 @agentaily/aml check 校验)
  files/        # 零构建前端 VFS:index.html 入口 + 相对引用的 css/js/资源

preview 不在源文件里 —— 由 assemble.mjsmeta(名称 + 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 跑)断言每个种子: 是良构的 AppEntryfilesindex.htmlindex.html 相对引用的文件都在 VFS 里、AML 能过 @agentaily/amlcheck