PortfolioBuddy2-迁移跟踪器Skill migration-tracker

这是一个用于跟踪从旧版Portfolio Buddy应用迁移到新版本的过程的技能。它包含了40个正在迁移的功能列表、已知问题和完成状态。

前端开发 0 次安装 0 次浏览 更新于 2/28/2026

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)

  1. 高级过滤 - 部分实现
    • 日期过滤完成✓
    • 需要符号过滤
    • 需要策略过滤
  2. 导出功能 - 仅CSV导出
    • 待Excel导出
    • 待PDF报告
  3. 历史比较 - 后端就绪,UI待定
    • 需要UI比较多个时间段

❌ 未开始 (2/40)

  1. 多周期分析 - 复杂,低优先级
    • 跨不同时间窗口比较性能
    • 需要显著的UI工作
  2. 风险情景建模 - 需要新的后端逻辑
    • 蒙特卡洛模拟
    • 压力测试

最近完成的功能

数据库获取实现(2025年11月16日)✅ 完成

状态:生产就绪 - 测试并部署 提交:c4fa57c,a5ce0ec,676de06,eba4c8d,ee7cec8,ae9202d 合并到主分支:d56497a(PR #1)

实施旅程(6次提交):

  1. 初始实现(c4fa57c)

    • 在dataUtils.ts中添加calculateMetricsFromDatabase()buildFilenameFromMetadata()
    • 在App.tsx中重写fetchFromSupabase()
    • 从旧的csv_files表更改为新的strategies + trades架构
    • 添加TypeScript接口:DatabaseTrade,StrategyMetadata
  2. 修复查询语法(a5ce0ec)

    • 修复Supabase顺序子句语法错误
    • order('trades.trade_date')更改为带有foreignTable参数的order('trade_date')
    • 错误:“failed to parse order (trades.trade_date.asc)”
  3. 修复交易数量限制(676de06)

    • 发现Supabase嵌入式资源限制(约60行)
    • 分离查询:首先获取策略,然后单独获取交易
    • 添加明确的.limit(10000)以获取所有交易
    • 修复:59笔交易 → 119笔交易✅
  4. 修复TypeScript构建错误(eba4c8d)

    • 添加具有可选trades?属性的StrategyFromDB接口
    • 在App.tsx中添加DatabaseTrade接口
    • 修复:"属性’trades’不存在"错误
  5. 修复指标计算(ee7cec8)⭐ 关键修复

    • 自动检测格式:2行(入场/出场)与1行(数据库)
    • 修改calculateMetrics()以检查"入场/出场"列
    • 如果存在 → 按2循环(旧CSV格式)
    • 如果不存在 → 按1循环(新数据库格式)
    • 修复:所有119笔交易的指标现在正确计算✅
  6. 更新文档(ae9202d)

    • 更新迁移跟踪器技能,添加实施细节
    • 记录所有更改和行号

最终结果

  • ✅ 从数据库加载119笔交易(不是59)
  • ✅ 所有指标正确计算(胜率,利润因子等)
  • ✅ 保留CSV上传向后兼容性
  • ✅ 同时支持双重模式:CSV和数据库
  • ✅ 格式自动检测无缝工作
  • ✅ 用户测试并验证工作
  • ✅ 部署到生产

修改的文件

  • src/utils/dataUtils.ts:+235行(功能,接口,自动检测)
  • src/App.tsx:+145行(数据库获取,TypeScript类型)
  • .claude/skills/migration-tracker/SKILL.md:文档更新

工作原理

  1. 用户点击"加载数据"按钮
  2. 应用从Supabase获取策略
  3. 对于每个策略,单独获取所有交易(无60行限制)
  4. 从元数据构建文件名(例如,SI_Long_Test_TestStrategy1.csv)
  5. 转换为cleanedData格式,具有3列(无入场/出场列)
  6. calculateMetrics()自动检测格式并正确处理
  7. 从数据库预填充合约乘数
  8. 自动选择策略并显示指标/图表

向后兼容性

  • ✅ CSV上传,具有4列(包括入场/出场)→ 2行处理
  • ✅ 数据库,具有3列(无入场/出场)→ 1行处理
  • ✅ 两种格式同时工作
  • ✅ 所有现有组件,钩子,图表不变

数据库集成计划(2025年11月16日)

状态:计划完成,准备实施 变化

  • 创建全面的迁移计划(dev-docs/supabase-migration-plan.md
  • 分析新的Supabase数据库架构(投资组合,策略,交易表)
  • 设计双重模式支持(CSV上传 + 数据库获取)
  • 计划数据转换策略(单行交易与入场/出场对)

新数据库架构

  • portfolios:具有is_master标志的投资组合定义
  • strategies:策略元数据(市场,方向,合约乘数等)
  • trades:单个交易记录(交易日期,交易时间,利润)
  • portfolio_strategies:将投资组合链接到策略

实施计划

  1. 在dataUtils.ts中添加calculateMetricsFromDatabase()功能(约80行)
  2. 在App.tsx中更新fetchFromSupabase()查询(约60行更改)
  3. 将数据库数据转换为匹配cleanedData格式
  4. 从数据库预填充合约乘数
  5. 测试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行)
  • Actions列中的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:更好的错误传播

当前技术债务

高优先级

  1. PortfolioSection.tsx是591行(3倍于200行限制)

    • 需要重构为:
      • EquityChartSection.tsx
      • PortfolioStats.tsx
      • ContractControls.tsx
    • 估计工作量:4-6小时
  2. 移除未使用的Recharts依赖(11.5KB浪费)

    • 目前使用Chart.js
    • Recharts从未在任何地方导入
    • 运行:npm uninstall recharts
  3. 修复15个TypeScriptany违规

    • usePortfolio.ts:11个实例
    • useMetrics.ts:4个实例
    • dataUtils.ts:1个实例
    • 需要适当的Trade和Metric类型接口

中等优先级

  1. App.tsx是351行(175%的限制)

    • 提取部分为组件
    • 估计工作量:2-3小时
  2. MetricsTable.tsx是242行(121%的限制)

    • 从350行改善
    • 仍然超出限制,可以提取更多
  3. 未实现错误边界

    • 应该包装风险组件
    • 防止整个应用崩溃

低优先级

  1. 未设置测试

    • 应该测试关键计算
    • 推荐Vitest用于Vite项目
  2. 未设置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法医恢复 问题:找不到最近添加的功能或代码似乎消失了 解决方案

  1. 检查远程:git log origin/main --oneline -10
  2. 搜索提交:git log --all --grep=“keyword”
  3. 如果落后,快速前进:git merge origin/main
  4. 使用reflog查看最近的HEAD位置:git reflog 示例:在2025年12月2日,通过从f4e752a快速前进到c372ab7,恢复了删除功能

迁移优先级(ICE评分)

功能 影响 信心 容易 ICE评分 状态
重构PortfolioSection 6 8 4 19.2
移除Recharts 3 10 10 30
修复TypeScriptany 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评分的顶级优先级

  1. 错误边界(50.4) - 高影响,易于实施
  2. 导出到Excel(44.8) - 用户请求的功能
  3. 移除Recharts(30) - 快速获胜,技术清理
  4. 修复TypeScript违规(27) - 代码质量
  5. 测试设置(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个组件)
  • 状态很少跨远距离组件共享
  • 自定义钩子有效地封装共享逻辑
  • 不需要复杂的异步状态管理

迁移经验教训

进展顺利

  1. Vite采用 - 构建时间从30秒降低到2秒
  2. TypeScript迁移 - 早期发现许多错误
  3. Chart.js优于Recharts - 大数据集更好的性能
  4. 简化状态 - 没有Redux复杂性
  5. Supabase集成 - 快速后端设置

可以更好

  1. 组件大小纪律 - 让组件长得太大
  2. TypeScript严格性 - 太多any逃逸
  3. 从开始测试 - 尚未编写测试(技术债务)
  4. 代码审查 - 在添加更多功能之前需要重构
  5. 文档 - 应该不断更新技能

迁移速度

  • 第1-4周:核心功能(上传,解析,基本指标)
  • 第5-8周:图表,相关性,UI抛光
  • 第9-12周:高级功能(Sortino,日期过滤,排序)
  • 当前:维护,重构,优化

下一步

立即(本冲刺)

  1. 移除Recharts依赖
  2. 为风险组件添加错误边界
  3. 修复最高影响的TypeScriptany违规

短期(接下来2个冲刺)

  1. 将PortfolioSection重构为更小的组件
  2. 实施Excel导出
  3. 完成符号/策略过滤

长期(下个季度)

  1. 设置Vitest测试框架
  2. 使用GitHub Actions添加CI/CD
  3. 多周期分析UI
  4. 风险情景建模

功能一致性检查表

与旧版Portfolio Buddy v1相比:

功能 旧应用 新应用 注释
CSV上传 改进的错误处理
夏普比率 相同计算
Sortino比率 修复计算(9f25040)
最大回撤 相同计算
CAGR 相同计算
相关性矩阵 添加皮尔逊+斯皮尔曼
股权曲线 带有缩放/平移的更好图表
合约乘数 新功能
日期过滤 新功能
多列排序 改进使用useSorting
导出到CSV 相同功能
导出到Excel 回归 - 需要重新实现
导出到PDF 回归 - 低优先级
符号过滤 回归 - 进行中
历史比较 回归 - 后端准备

一致性状态:85%(11/13核心功能完成)