PortfolioBuddy2-迁移跟踪器Skill migration-tracker

这是一个用于持续从旧的Portfolio Buddy应用迁移的上下文跟踪器。它记录了迁移过程中的核心功能、完成状态、已知问题以及实施细节,帮助开发团队理解和维护迁移进度。

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

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)

  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行)
  • 在操作列中的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个TypeScript any违规

    • 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
修复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评分最高的优先级

  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. 修复最高影响的TypeScript any违规

短期(接下来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核心功能完成)