{ "plan": { "id": "pure-client-transformation", "name": "纯客户端转型实现计划", "version": "1.1.0", "date": "2026-04-27", "designDoc": "docs/superpowers/specs/2026-04-27-pure-client-transformation-design.md", "goal": "将 Everything Is Suitable 从 C/S 架构转型为纯客户端 App,定位中国传统文化研究工具,通过 App Store/Google Play/国内安卓商店买断制付费分发", "architecture": "在现有 UniApp 项目基础上,将 Java 后端算法 1:1 移植为 TypeScript,替换远程 API 调用为本地计算,移除全部服务端依赖", "techStack": [ "UniApp", "Vue 3", "TypeScript", "Vitest", "Playwright", "lunar-javascript" ], "executionMode": "sequential", "phases": [ { "id": "phase-1", "name": "基础设施与类型定义", "file": "phase-1-infrastructure-and-types.json", "status": "completed", "completedAt": "2026-04-27T20:47:00+08:00" }, { "id": "phase-2", "name": "核心算法移植", "file": "phase-2-core-algorithm-migration.json", "status": "completed", "completedAt": "2026-04-27T21:18:00+08:00" }, { "id": "phase-3", "name": "本地服务层实现", "file": "phase-3-local-service-layer.json", "status": "completed", "completedAt": "2026-04-27T22:21:00+08:00" }, { "id": "phase-4", "name": "后端依赖移除与页面适配", "file": "phase-4-backend-removal-and-page-adaptation.json", "status": "completed", "completedAt": "2026-04-28T03:49:00+08:00" }, { "id": "phase-5", "name": "新增页面与功能", "file": "phase-5-new-pages-and-features.json", "status": "completed", "completedAt": "2026-04-28T03:57:24+08:00" }, { "id": "phase-6", "name": "交叉验证与质量保障", "file": "phase-6-cross-validation-and-quality.json", "status": "completed", "completedAt": "2026-04-28T04:25:00+08:00" }, { "id": "phase-7", "name": "CI/CD 与商店适配", "file": "phase-7-cicd-and-store-adaptation.json", "status": "completed", "completedAt": "2026-04-28T04:31:14+08:00" } ], "fileStructure": { "create": [ "src/algorithms/types.ts", "src/algorithms/enums.ts", "src/algorithms/ziweiAlgorithm.ts", "src/algorithms/sanFangSiZheng.ts", "src/algorithms/fortuneStrategy.ts", "src/algorithms/almanac.ts", "src/algorithms/fortune.ts", "src/algorithms/calendar.ts", "src/services/almanacService.ts", "src/services/ziweiService.ts", "src/services/fortuneService.ts", "src/services/searchService.ts", "src/services/templateService.ts", "src/utils/storage.ts", "src/utils/exportImport.ts", "src/pages/ziwei/index.vue", "src/pages/fortune/index.vue", "Jenkinsfile" ], "modify": [ "src/pages/almanac-search/index.vue", "src/types/search.ts", "package.json" ], "delete": [ "src/utils/httpClient.ts", "src/utils/tokenManager.ts", "../everything-is-suitable-api/", "../everything-is-suitable-admin/", "../everything-is-suitable-test/", "../docker-compose.yml", "../docker-compose.*.yml", "../Dockerfile*", "../.woodpecker.yml" ] }, "qualityGates": { "algorithmUnitTestCoverage": ">=90%", "serviceUnitTestCoverage": ">=80%", "crossValidationPassRate": "100%", "e2eCriticalPathPassRate": "100%", "lintErrors": 0, "typescriptStrictMode": true }, "dogfoodTesting": { "status": "completed", "completedAt": "2026-04-28T15:50:00+08:00", "summary": { "pagesTested": 3, "interactionsTested": 3, "unitTestsPassed": 361, "unitTestFiles": 19, "consoleErrors": 0, "asyncLoadingErrors": 0 }, "pages": [ { "name": "黄历搜索首页", "status": "pass", "elements": [ "搜索模板", "搜索条件", "搜索天数", "搜索按钮", "底部导航" ], "interactions": [ "添加搜索条件", "选择模板分类", "执行搜索" ] }, { "name": "紫微斗数页面", "status": "pass", "elements": [ "出生日期", "出生时辰", "性别选择", "排盘按钮" ] }, { "name": "运势分析页面", "status": "pass", "elements": [ "日运/月运切换", "日期显示", "排盘提示" ] } ], "bugsFound": [ { "id": "BUG-001", "severity": "P1", "description": "templateService.ts 缺少默认导出,导致页面加载时出现 'does not provide an export named default' 错误", "status": "fixed", "fix": "添加 const templateService = new TemplateService(); export default templateService" }, { "id": "BUG-002", "severity": "P1", "description": "TemplatePanel 组件调用 templateService.getCategories() 等不存在的方法", "status": "fixed", "fix": "在 TemplateService 中添加 getCategories(), getSearchTemplates(), getTemplatesByCategory(), searchTemplates() 方法" } ], "warnings": [ { "description": "picker 组件在单元测试中无法解析(Vue warn: Failed to resolve component: picker)", "severity": "P3", "note": "UniApp 原生组件在 vitest 环境中不可用,不影响 H5 运行时行为" } ] } } }