1cd309d56d
Plan 4 Task 3:
- themes/pilot-minimal 入 workspace(astro ^5.18 纯静态;依赖仅 astro)
- theme.manifest:contracts isThemeManifest 守卫通过——key=pilot-minimal/
七模板条目(home/page/product-list/product-detail/news-list/news-detail/
not-found);brand 刻意不入 requiredSiteConfig(恒可能 {},Task 1 移交契约)
- load-render-data:全主题唯一取数入口(五禁纪律结构保证,JSDoc 钉死)——
SF_BUILD_INPUT 六文件、缺文件/形状破裂明确错误不静默空、同目录缓存单例、
name 空→'Untitled Site'/brand 缺席→{}、编码 slug 原样贯穿(源码令牌扫描
禁 percent-decode)
- 布局/组件:BaseLayout/SeoHead(title/desc/canonical/og)/SiteHeader(导航
路由缺席容忍隐藏)/SiteFooter/RichText(信任链:清洗+重写后直出)/
ResponsiveMedia/Breadcrumbs/ProductCard/NewsCard/Pagination(V1 禁用态)/
NotFound + tokens.css(75rem/系统字体/4-8-16-24-48/中性色+单 accent)
- 根 test 链并入主题(vitest 3 + astro getViteConfig,Container API 组件
渲染测试);typecheck 四段变五段;.astro/ 入 gitignore
354 根测试 + 16 主题测试全绿。
Co-Authored-By: Claude Code <noreply@anthropic.com>
31 lines
949 B
JSON
31 lines
949 B
JSON
{
|
|
"name": "siteforge",
|
|
"private": true,
|
|
"type": "module",
|
|
"packageManager": "pnpm@10.7.1",
|
|
"engines": {
|
|
"node": ">=22.12"
|
|
},
|
|
"scripts": {
|
|
"test": "vitest run && pnpm --filter @sf/theme-pilot-minimal test",
|
|
"typecheck": "tsc -p tsconfig.json --noEmit && pnpm --filter @sf/api typecheck && pnpm --filter @sf/contracts typecheck && pnpm --filter @sf/adapter-wp typecheck && pnpm --filter @sf/theme-pilot-minimal typecheck",
|
|
"lint": "eslint .",
|
|
"db:up": "docker compose -f infra/docker-compose.yml up -d --wait",
|
|
"db:migrate": "pnpm --filter @sf/api db:migrate",
|
|
"db:test": "bash scripts/migrate-test.sh",
|
|
"sf": "tsx scripts/sf.ts"
|
|
},
|
|
"dependencies": {
|
|
"commander": "^14.0.0"
|
|
},
|
|
"devDependencies": {
|
|
"@eslint/js": "^9.39.0",
|
|
"@types/node": "^22",
|
|
"eslint": "^9.39.0",
|
|
"tsx": "^4.19.0",
|
|
"typescript": "^5.6.0",
|
|
"typescript-eslint": "^8.46.4",
|
|
"vitest": "^2.1.0"
|
|
}
|
|
}
|