// pilot 主题清单(spec §9.1;类型面 = contracts 冻结的 ThemeManifest——守卫 isThemeManifest // 在测试里钉死通过)。import type 编译期擦除:astro build 不产生对 @sf/contracts 的运行时依赖。 // // appliesTo 约定(声明性提示,派发真值在 Task 4 的模板分派器): // 'route:' 精确路由命中(home= '/',not-found = '/404') // 'type:' 按内容类型分派(详情页) // 'path-prefix:' 按路径前缀分派(列表页;product-list 的 /category/ 别名前缀 // 由 Task 4 分派器一并处理——单一 appliesTo 字符串不承载多前缀; // /products/ 产品主列表同此先例:Task 5 集成补面的 ProductList // 模板由分派器精确路由特判,不另立模板键) import type { ThemeManifest } from '@sf/contracts' export const themeManifest: ThemeManifest = { key: 'pilot-minimal', version: '0.1.0', renderContractVersion: '1', // 快线三类内容(与 build_input_snapshots 物化面一致);'basic_page' 覆盖 generic page supportedContentTypes: ['news_article', 'product', 'basic_page'], // site.json 必须提供的键(publish 首版 config v1 恰好满足;brand 刻意不在必填列—— // Task 1 审查移交:brand 恒可能 {},主题对 brand 全缺省容忍) requiredSiteConfig: ['name', 'origin', 'locale'], templates: [ { key: 'home', appliesTo: 'route:/' }, { key: 'page', appliesTo: 'type:basic_page' }, { key: 'product-list', appliesTo: 'path-prefix:/product-category/' }, { key: 'product-detail', appliesTo: 'type:product' }, { key: 'news-list', appliesTo: 'path-prefix:/news/' }, { key: 'news-detail', appliesTo: 'type:news_article' }, { key: 'not-found', appliesTo: 'route:/404' }, ], } export default themeManifest