name: migration-tracker description: “持续从旧的Portfolio Buddy应用迁移的上下文。使用场景:修复错误、添加迁移功能、检查功能一致性或理解某些代码存在的原因。包含正在迁移的40个功能列表和已知问题。”
Portfolio Buddy 2 - 迁移跟踪器
迁移状态:40个功能
✅ 已完成 (36/40 - 90%)
迁移的核心功能和工作:
-
CSV上传和解析与PapaParse
-
Supabase存储集成
-
基本指标计算(夏普比率、最大回撤、CAGR、胜率等)
-
Sortino比率(完成提交258ba3a, 9f25040)
-
无风险利率输入(完成提交258ba3a)
-
资产相关性矩阵(斯皮尔曼和皮尔逊)
-
投资组合比较图表(Chart.js)
-
股权曲线可视化
-
响应式UI与Tailwind CSS
-
shadcn/ui颜色系统集成
-
日期范围过滤(完成提交258ba3a)
-
期货合约乘数(useContractMultipliers钩子)
-
高级多列排序(useSorting钩子)
-
错误处理和验证
-
文件上传进度跟踪
-
多文件管理
-
数据库集成(2025年11月16日)- 生产就绪 ✓
- Python脚本自动上传交易 ✓
- 新数据库架构(投资组合、策略、交易) ✓
- 前端数据库获取 ✓(提交c4fa57c至ee7cec8)
- 双重CSV/数据库支持 ✓
- 格式自动检测(1行与2行) ✓
- 用户测试并验证 ✓
- 合并到主分支并部署 ✓
- 参见:
dev-docs/supabase-migration-plan.md
🚧 进行中 (3/40)
- 高级过滤 - 部分实现
- 日期过滤完成 ✓
- 需要符号过滤
- 需要策略过滤
- 导出功能 - 仅CSV导出
- 待Excel导出
- 待PDF报告
- 历史比较 - 后端准备就绪,UI待定
- 需要UI比较多个时间段
❌ 未开始 (2/40)
- 多周期分析 - 复杂,低优先级
- 跨不同时间窗口比较性能
- 需要显著的UI工作
- 风险情景建模 - 需要新的后端逻辑
- 蒙特卡洛模拟
- 压力测试
最近完成的功能
数据库获取实现(2025年11月16日)✅ 已完成
状态:生产就绪 - 测试并部署 提交:c4fa57c, a5ce0ec, 676de06, eba4c8d, ee7cec8, ae9202d 合并到主分支:d56497a(PR #1)
实施旅程(6次提交):
-
初始实施(c4fa57c)
- 在dataUtils.ts中添加
calculateMetricsFromDatabase()和buildFilenameFromMetadata() - 在App.tsx中重写
fetchFromSupabase() - 从旧的
csv_files表更改为新的strategies+trades架构 - 添加TypeScript接口:DatabaseTrade, StrategyMetadata
- 在dataUtils.ts中添加
-
修复查询语法(a5ce0ec)
- 修复Supabase顺序子句语法错误
- 将
order('trades.trade_date')更改为带有foreignTable参数的order('trade_date') - 错误:“failed to parse order (trades.trade_date.asc)”
-
修复交易计数限制(676de06)
- 发现Supabase嵌入式资源限制(约60行)
- 分离查询:首先获取策略,然后单独获取交易
- 添加明确的
.limit(10000)以获取所有交易 - 修复:59笔交易 → 119笔交易 ✅
-
修复TypeScript构建错误(eba4c8d)
- 添加具有可选
trades?属性的StrategyFromDB接口 - 在App.tsx中添加DatabaseTrade接口
- 修复:"属性’trades’不存在"错误
- 添加具有可选
-
修复指标计算(ee7cec8)⭐ 关键修复
- 自动检测格式:2行(入场/出场)与1行(数据库)
- 修改
calculateMetrics()以检查"入场/出场"列 - 如果存在 → 按2循环(旧CSV格式)
- 如果不存在 → 按1循环(新数据库格式)
- 修复:所有119笔交易的指标现在正确计算 ✅
-
更新文档(ae9202d)
- 更新迁移跟踪器技能,增加实施细节
- 文档化所有更改和行号
最终结果:
- ✅ 从数据库加载119笔交易(不是59)
- ✅ 所有指标正确计算(胜率、利润因子等)
- ✅ 保留CSV上传向后兼容性
- ✅ 同时支持双重模式:CSV和数据库
- ✅ 格式自动检测无缝工作
- ✅ 用户测试并验证工作
- ✅ 部署到生产
修改的文件:
src/utils/dataUtils.ts:+235行(函数、接口、自动检测)src/App.tsx:+145行(数据库获取,TypeScript类型).claude/skills/migration-tracker/SKILL.md:文档更新
工作原理:
- 用户点击"加载数据"按钮
- 应用从Supabase获取策略
- 对于每个策略,单独获取所有交易(无60行限制)
- 根据元数据构建文件名(例如,SI_Long_Test_TestStrategy1.csv)
- 转换为cleanedData格式,具有3列(无入场/出场列)
calculateMetrics()自动检测格式并正确处理- 从数据库预填充合约乘数
- 自动选择策略并显示指标/图表
向后兼容性:
- ✅ CSV上传,具有4列(包括入场/出场)→ 2行处理
- ✅ 数据库,具有3列(无入场/出场)→ 1行处理
- ✅ 两种格式同时工作
- ✅ 所有现有组件、钩子、图表不变
数据库集成计划(2025年11月16日)
状态:计划完成,准备实施 变化:
- 创建全面的迁移计划(
dev-docs/supabase-migration-plan.md) - 分析新的Supabase数据库架构(投资组合、策略、交易表)
- 设计双重模式支持(CSV上传+数据库获取)
- 计划数据转换策略(单行交易与入场/出场对)
新数据库架构:
portfolios:具有is_master标志的投资组合定义strategies:策略元数据(市场、方向、合约乘数等)trades:单个交易记录(交易日期、交易时间、利润)portfolio_strategies:将投资组合链接到策略
实施计划:
- 在dataUtils.ts中添加
calculateMetricsFromDatabase()函数(约80行) - 在App.tsx中更新
fetchFromSupabase()查询(约60行更改) - 将数据库数据转换为匹配cleanedData格式
- 从数据库预填充合约乘数
- 测试119个现有交易
当前状态:
- Python脚本在Windows VPS上自动上传交易 ✓
- 数据库包含1个策略,有119笔交易 ✓
- 前端仍然查询旧的
csv_files表(需要更新)
下一步:
- 实施第一阶段:新的计算函数
- 实施第二阶段:更新Supabase查询
- 测试双重CSV/数据库支持
- 部署到生产
策略删除功能(2025年11月19日)✅
提交:c372ab7a92d267eda3e540b298872484ef09e38d 文件:App.tsx(+47), MetricsTable.tsx(+18), PortfolioSection.tsx(+8)
功能:
- 永久删除数据库策略(红色垃圾桶图标,带确认)
- 从视图中移除CSV策略(灰色垃圾桶图标,立即)
- strategyIdMap跟踪DB与CSV(App.tsx第67行)
- handleDeleteStrategy与Supabase删除(App.tsx第423-458行)
- 在操作列中的Trash2图标(MetricsTable.tsx第1、239-246行)
Git法医恢复(2025年12月2日)✅
问题:删除功能"丢失"(本地仓库落后于origin/main)
解决方案:
git fetch origin
git merge origin/main # 快进到c372ab7
关键教训:当工作似乎丢失时,始终检查git log origin/main
Sortino比率(2025年10月)
提交:258ba3a, 9f25040 变化:
- 在PortfolioSection中添加无风险利率输入字段(第131行:
useState<number>(0)) - 在PortfolioSection中实现Sortino计算(第133-158行)
- 修正下行偏差计算(现在使用sqrt(365)正确年化)
- 更正方差计算(除以总回报,而不仅仅是负回报)
- 在投资组合统计部分显示(第535行)
修改的文件:
PortfolioSection.tsx:添加无风险利率状态,下行偏差计算和显示
实施细节:
- 不在dataUtils.ts中 - Sortino在PortfolioSection中使用
useMemo行内计算 - 不在MetricsTable中 - 仅在投资组合统计区域显示
- 保留在组件中,由于投资组合级上下文要求:
- 需要用户输入(无风险利率)
- 在投资组合日回报上操作(不是交易级指标)
- 与胜率、利润因子等不同计算范围
日期范围过滤(2025年10月)
提交:258ba3a 变化:
- usePortfolio钩子现在接受日期范围参数
- 根据开始/结束日期过滤交易
- 仅重新计算过滤期间的指标
- PortfolioSection中的UI控件
修改的文件:
usePortfolio.ts:添加日期过滤逻辑PortfolioSection.tsx:添加日期选择器控件
增强错误处理(2025年9月)
提交:9fb7fdb 变化:
- 更好的Supabase错误消息
- 上传前客户端验证
- 错误列表组件显示所有错误
- 吐司通知用户反馈
修改的文件:
UploadSection.tsx:增强错误处理ErrorList.tsx:新的错误显示组件usePortfolio.ts:更好的错误传播
当前技术债务
高优先级
-
PortfolioSection.tsx是591行(3倍于200行限制)
- 需要重构为:
EquityChartSection.tsxPortfolioStats.tsxContractControls.tsx
- 估计工作量:4-6小时
- 需要重构为:
-
移除未使用的Recharts依赖(11.5KB浪费)
- 目前使用Chart.js
- Recharts从未在任何地方导入
- 运行:
npm uninstall recharts
-
修复15个TypeScript
any违规- usePortfolio.ts:11个实例
- useMetrics.ts:4个实例
- dataUtils.ts:1个实例
- 需要适当的Trade和Metric类型接口
中等优先级
-
App.tsx是351行(175%的限制)
- 提取部分为组件
- 估计工作量:2-3小时
-
MetricsTable.tsx是242行(121%的限制)
- 从350行改进
- 仍然超出限制,可以提取更多
-
未实现错误边界
- 应该包装风险组件
- 防止整个应用崩溃
低优先级
-
未设置测试
- 应该测试关键计算
- Vitest推荐用于Vite项目
-
未设置CI/CD管道
- 手动Cloudflare部署
- 可以使用GitHub Actions自动化
已知问题
问题1:Supabase 500错误
状态:部分修复(提交9fb7fdb) 根本原因:免费层超过行限制 当前解决方案:
- 增强错误处理显示用户友好消息
- 推荐分批上传较小的块 长期解决方案:在存储前实现数据聚合
问题2:大型组件文件
状态:已记录但未修复 问题:在迁移过程中组件增长 受影响:
- PortfolioSection.tsx:591行(之前是280,现在更糟!)
- App.tsx:351行
- MetricsTable.tsx:242行(从350改进) 需要修复:系统重构为更小的组件
问题3:无全选按钮
状态:功能不存在 注意:之前的技能版本记录了"全选错误",但这个功能要么被移除,要么从未实现。MetricsTable具有单独选择功能,但没有"全选"功能。
问题4:丢失/缺失代码
状态:可通过git法医恢复 问题:找不到最近添加的功能或代码似乎消失了 解决方案:
- 检查远程:
git log origin/main --oneline -10 - 搜索提交:
git log --all --grep=“keyword” - 如果落后,快进:
git merge origin/main - 使用reflog查看最近的HEAD位置:
git reflog示例:在2025年12月2日,通过快进从f4e752a恢复删除功能到c372ab7
迁移优先级(ICE评分)
| 功能 | 影响 | 信心 | 易用性 | ICE评分 | 状态 |
|---|---|---|---|---|---|
| 重构PortfolioSection | 6 | 8 | 4 | 19.2 | ❌ |
| 移除Recharts | 3 | 10 | 10 | 30 | ❌ |
修复TypeScript any |
5 | 9 | 6 | 27 | ❌ |
| 导出到Excel | 8 | 8 | 7 | 44.8 | 🚧 |
| 高级过滤器 | 7 | 6 | 5 | 21 | 🚧 |
| 历史比较UI | 6 | 7 | 4 | 16.8 | 🚧 |
| 错误边界 | 7 | 9 | 8 | 50.4 | ❌ |
| 测试设置 | 6 | 8 | 5 | 24 | ❌ |
| 风险情景 | 5 | 4 | 2 | 4 | ❌ |
ICE评分最高的优先级:
- 错误边界(50.4)- 高影响,易于实施
- 导出到Excel(44.8)- 用户请求的功能
- 移除Recharts(30)- 快速获胜,技术清理
- 修复TypeScript违规(27)- 代码质量
- 测试设置(24)- 长期可维护性
与旧应用的变化
技术栈演变
| 组件 | 旧应用 | 新应用 | 原因 |
|---|---|---|---|
| React | 16.x | 19.x | 最新功能,更好的性能 |
| 语言 | JavaScript | TypeScript | 类型安全,更好的开发体验 |
| 构建工具 | Create React App | Vite | 10倍更快的构建,现代 |
| 样式 | Material-UI v4 | Tailwind + shadcn | 更灵活,更轻量 |
| 图表 | Recharts | Chart.js | 更好的性能,更多功能 |
| 状态 | Redux | 纯React钩子 | 更简单,更少样板代码 |
| 后端 | 自定义Node.js | Supabase | 更快的开发,PostgreSQL |
状态管理迁移
- 旧:Redux与动作、减速器、中间件(复杂)
- 新:纯React钩子(useState, useMemo, useCallback)
- 结果:减少70%的样板代码,更容易理解
注意:之前声称迁移到TanStack Query + Zustand,但实际实现仅使用纯React钩子。
为什么没有全局状态库?
Portfolio Buddy 2足够简单,可以使用React内置的状态:
- 组件树小(14个组件)
- 状态很少跨远距离组件共享
- 自定义钩子有效地封装共享逻辑
- 不需要复杂的异步状态管理
迁移经验教训
进展顺利
- Vite采用 - 构建时间从30秒降低到2秒
- TypeScript迁移 - 早期捕获许多错误
- Chart.js优于Recharts - 大数据集更好的性能
- 简化状态 - 没有Redux复杂性
- Supabase集成 - 快速后端设置
可以改进的地方
- 组件大小纪律 - 让组件增长过大
- TypeScript严格性 - 太多
any逃逸 - 从开始测试 - 尚未编写测试(技术债务)
- 代码审查 - 在添加更多功能之前需要重构
- 文档 - 应该持续更新技能
迁移速度
- 第1-4周:核心功能(上传、解析、基本指标)
- 第5-8周:图表、相关性、UI抛光
- 第9-12周:高级功能(Sortino, 日期过滤,排序)
- 当前:维护、重构、优化
下一步
立即(本冲刺)
- 移除Recharts依赖
- 为风险组件添加错误边界
- 修复最高影响的TypeScript
any违规
短期(接下来2个冲刺)
- 将PortfolioSection重构为更小的组件
- 实施Excel导出
- 完成符号/策略过滤
长期(下个季度)
- 设置Vitest测试框架
- 使用GitHub Actions添加CI/CD
- 多周期分析UI
- 风险情景建模
功能一致性检查表
与旧的Portfolio Buddy v1相比:
| 功能 | 旧应用 | 新应用 | 注释 |
|---|---|---|---|
| CSV上传 | ✅ | ✅ | 改进错误处理 |
| 夏普比率 | ✅ | ✅ | 相同计算 |
| Sortino比率 | ✅ | ✅ | 修复计算(9f25040) |
| 最大回撤 | ✅ | ✅ | 相同计算 |
| CAGR | ✅ | ✅ | 相同计算 |
| 相关性矩阵 | ✅ | ✅ | 添加皮尔逊+斯皮尔曼 |
| 股权曲线 | ✅ | ✅ | 使用缩放/平移的更好图表 |
| 合约乘数 | ❌ | ✅ | 新功能 |
| 日期过滤 | ❌ | ✅ | 新功能 |
| 多列排序 | ✅ | ✅ | 改进使用useSorting |
| 导出到CSV | ✅ | ✅ | 相同功能 |
| 导出到Excel | ✅ | ❌ | 回归 - 需要重新实现 |
| 导出到PDF | ✅ | ❌ | 回归 - 低优先级 |
| 符号过滤 | ✅ | ❌ | 回归 - 进行中 |
| 历史比较 | ✅ | ❌ | 回归 - 后端准备就绪 |
一致性状态:85%(11/13核心功能完成)