alpha-visualizer 0.7.1__tar.gz → 0.7.3__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (490) hide show
  1. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/.github/workflows/ci.yml +138 -7
  2. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/.github/workflows/lighthouse.yml +1 -1
  3. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/.github/workflows/release.yml +6 -1
  4. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/.gitignore +1 -0
  5. alpha_visualizer-0.7.3/.hypothesis/constants/296b8092179c9f55 +4 -0
  6. alpha_visualizer-0.7.1/.hypothesis/constants/94f1f85ed364d969 → alpha_visualizer-0.7.3/.hypothesis/constants/efa1548145a8bfba +1 -1
  7. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/CHANGELOG.md +45 -0
  8. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/PKG-INFO +5 -1
  9. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/README.en.md +4 -0
  10. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/README.md +4 -0
  11. alpha_visualizer-0.7.3/docs/screenshots/en/browse.png +0 -0
  12. alpha_visualizer-0.7.3/docs/screenshots/en/compare-heatmap.png +0 -0
  13. alpha_visualizer-0.7.3/docs/screenshots/en/compare.png +0 -0
  14. alpha_visualizer-0.7.3/docs/screenshots/en/detail.png +0 -0
  15. alpha_visualizer-0.7.3/docs/screenshots/en/optimize.png +0 -0
  16. alpha_visualizer-0.7.3/docs/screenshots/en/strategy.png +0 -0
  17. alpha_visualizer-0.7.3/docs/screenshots/ja/browse.png +0 -0
  18. alpha_visualizer-0.7.3/docs/screenshots/ja/compare-heatmap.png +0 -0
  19. alpha_visualizer-0.7.3/docs/screenshots/ja/compare.png +0 -0
  20. alpha_visualizer-0.7.3/docs/screenshots/ja/detail.png +0 -0
  21. alpha_visualizer-0.7.3/docs/screenshots/ja/optimize.png +0 -0
  22. alpha_visualizer-0.7.3/docs/screenshots/ja/strategy.png +0 -0
  23. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/e2e/fixtures/forge/data/results/backtest_results.db +0 -0
  24. alpha_visualizer-0.7.3/frontend/e2e/screenshots/capture.spec.ts +212 -0
  25. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/e2e/screenshots/equity-tv.spec.ts +4 -2
  26. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/e2e/specs/compare.spec.ts +4 -3
  27. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/e2e/specs/detail.spec.ts +9 -2
  28. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/playwright.samples.config.ts +1 -1
  29. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/src/api/types.ts +25 -0
  30. alpha_visualizer-0.7.3/frontend/src/components/live/LivePositionView.tsx +162 -0
  31. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/src/components/live/LiveTab.tsx +16 -66
  32. alpha_visualizer-0.7.3/frontend/src/components/live/SummaryCard.tsx +80 -0
  33. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/src/components/live/__tests__/LiveTab.test.tsx +110 -0
  34. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/src/components/live/format.ts +4 -1
  35. alpha_visualizer-0.7.3/frontend/src/constants/__tests__/featureFlags.test.ts +120 -0
  36. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/src/constants/featureFlags.ts +10 -6
  37. alpha_visualizer-0.7.3/frontend/src/hooks/useLiveList.ts +37 -0
  38. alpha_visualizer-0.7.3/frontend/src/pages/LivePage.tsx +64 -0
  39. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/src/router.tsx +4 -0
  40. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/src/screens/BacktestScreen.tsx +21 -18
  41. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/src/screens/BrowseScreen.tsx +22 -17
  42. alpha_visualizer-0.7.3/frontend/src/screens/LiveScreen.stories.tsx +49 -0
  43. alpha_visualizer-0.7.3/frontend/src/screens/LiveScreen.tsx +204 -0
  44. alpha_visualizer-0.7.3/frontend/src/screens/__tests__/LiveScreen.test.tsx +111 -0
  45. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/src/screens/strategy/SignalChartCard.tsx +4 -4
  46. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/pyproject.toml +11 -2
  47. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/samples/sample-forge/data/results/backtest_results.db +0 -0
  48. alpha_visualizer-0.7.3/scripts/compare_sqlite_dump.py +66 -0
  49. alpha_visualizer-0.7.3/scripts/verify_build_artifacts.py +93 -0
  50. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/src/alpha_visualizer/__init__.py +1 -1
  51. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/src/alpha_visualizer/app.py +11 -1
  52. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/src/alpha_visualizer/cli.py +5 -2
  53. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/src/alpha_visualizer/forge_config.py +30 -5
  54. alpha_visualizer-0.7.3/src/alpha_visualizer/static/assets/BrowsePage-D_oh_f9q.js +2 -0
  55. alpha_visualizer-0.7.3/src/alpha_visualizer/static/assets/BrowsePage-D_oh_f9q.js.map +1 -0
  56. alpha_visualizer-0.7.3/src/alpha_visualizer/static/assets/ComparePage-DtDelizG.js +2 -0
  57. alpha_visualizer-0.7.3/src/alpha_visualizer/static/assets/ComparePage-DtDelizG.js.map +1 -0
  58. alpha_visualizer-0.7.3/src/alpha_visualizer/static/assets/DetailPage-DelKLR38.js +2 -0
  59. alpha_visualizer-0.7.3/src/alpha_visualizer/static/assets/DetailPage-DelKLR38.js.map +1 -0
  60. alpha_visualizer-0.7.3/src/alpha_visualizer/static/assets/IdeasPage-CCohB3id.js +2 -0
  61. alpha_visualizer-0.7.3/src/alpha_visualizer/static/assets/IdeasPage-CCohB3id.js.map +1 -0
  62. alpha_visualizer-0.7.3/src/alpha_visualizer/static/assets/LivePage-q72oTm92.js +2 -0
  63. alpha_visualizer-0.7.3/src/alpha_visualizer/static/assets/LivePage-q72oTm92.js.map +1 -0
  64. alpha_visualizer-0.7.3/src/alpha_visualizer/static/assets/LiveTab-B3SvCjHQ.js +2 -0
  65. alpha_visualizer-0.7.3/src/alpha_visualizer/static/assets/LiveTab-B3SvCjHQ.js.map +1 -0
  66. alpha_visualizer-0.7.3/src/alpha_visualizer/static/assets/SettingsToggles-D_8he1u5.js +2 -0
  67. alpha_visualizer-0.7.3/src/alpha_visualizer/static/assets/SettingsToggles-D_8he1u5.js.map +1 -0
  68. alpha_visualizer-0.7.3/src/alpha_visualizer/static/assets/Sparkline-BcO_EWxr.js +2 -0
  69. alpha_visualizer-0.7.3/src/alpha_visualizer/static/assets/Sparkline-BcO_EWxr.js.map +1 -0
  70. alpha_visualizer-0.7.3/src/alpha_visualizer/static/assets/featureFlags-B5arCULb.js +3 -0
  71. alpha_visualizer-0.7.3/src/alpha_visualizer/static/assets/featureFlags-B5arCULb.js.map +1 -0
  72. alpha_visualizer-0.7.3/src/alpha_visualizer/static/assets/fonts-DJsrEZjK.css +1 -0
  73. alpha_visualizer-0.7.3/src/alpha_visualizer/static/assets/format-D00KW3px.js +2 -0
  74. alpha_visualizer-0.7.3/src/alpha_visualizer/static/assets/format-D00KW3px.js.map +1 -0
  75. alpha_visualizer-0.7.3/src/alpha_visualizer/static/assets/index-BdNp8jFI.js +6 -0
  76. alpha_visualizer-0.7.3/src/alpha_visualizer/static/assets/index-BdNp8jFI.js.map +1 -0
  77. alpha_visualizer-0.7.3/src/alpha_visualizer/static/assets/index-Cbl7J_5s.css +1 -0
  78. alpha_visualizer-0.7.3/src/alpha_visualizer/static/assets/inter-tight-latin-400-normal-BLrFJfvD.woff +0 -0
  79. alpha_visualizer-0.7.3/src/alpha_visualizer/static/assets/inter-tight-latin-400-normal-iW8qmuJY.woff2 +0 -0
  80. alpha_visualizer-0.7.3/src/alpha_visualizer/static/assets/inter-tight-latin-500-normal-BFXNXuvF.woff2 +0 -0
  81. alpha_visualizer-0.7.3/src/alpha_visualizer/static/assets/inter-tight-latin-500-normal-pobXraBK.woff +0 -0
  82. alpha_visualizer-0.7.3/src/alpha_visualizer/static/assets/inter-tight-latin-600-normal-BgSTtRxb.woff2 +0 -0
  83. alpha_visualizer-0.7.3/src/alpha_visualizer/static/assets/inter-tight-latin-600-normal-D7bG6gX1.woff +0 -0
  84. alpha_visualizer-0.7.3/src/alpha_visualizer/static/assets/jetbrains-mono-latin-500-normal-BWZEU5yA.woff2 +0 -0
  85. alpha_visualizer-0.7.3/src/alpha_visualizer/static/assets/jetbrains-mono-latin-500-normal-CJOVTJB7.woff +0 -0
  86. alpha_visualizer-0.7.3/src/alpha_visualizer/static/assets/react-cUP_GJAW.js +10 -0
  87. alpha_visualizer-0.7.3/src/alpha_visualizer/static/assets/react-cUP_GJAW.js.map +1 -0
  88. alpha_visualizer-0.7.3/src/alpha_visualizer/static/assets/rolldown-runtime-DDdRRPPX.js +1 -0
  89. alpha_visualizer-0.7.3/src/alpha_visualizer/static/assets/source-serif-4-latin-600-normal-DMD1h6_f.woff +0 -0
  90. alpha_visualizer-0.7.3/src/alpha_visualizer/static/assets/source-serif-4-latin-600-normal-DouSKlru.woff2 +0 -0
  91. alpha_visualizer-0.7.3/src/alpha_visualizer/static/assets/tv-rsB_oRi5.js +2 -0
  92. alpha_visualizer-0.7.3/src/alpha_visualizer/static/assets/tv-rsB_oRi5.js.map +1 -0
  93. alpha_visualizer-0.7.3/src/alpha_visualizer/static/assets/useBacktestData-B0uqJGPi.js +2 -0
  94. alpha_visualizer-0.7.3/src/alpha_visualizer/static/assets/useBacktestData-B0uqJGPi.js.map +1 -0
  95. alpha_visualizer-0.7.3/src/alpha_visualizer/static/assets/visx-D9BH_cru.js +2 -0
  96. alpha_visualizer-0.7.3/src/alpha_visualizer/static/assets/visx-D9BH_cru.js.map +1 -0
  97. alpha_visualizer-0.7.3/src/alpha_visualizer/static/favicon.svg +1 -0
  98. alpha_visualizer-0.7.3/src/alpha_visualizer/static/icons.svg +24 -0
  99. alpha_visualizer-0.7.3/src/alpha_visualizer/static/index.html +53 -0
  100. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/tests/fixtures/build_e2e_fixture.py +23 -11
  101. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/tests/test_app.py +53 -0
  102. alpha_visualizer-0.7.3/tests/test_compare_sqlite_dump.py +81 -0
  103. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/tests/test_forge_config.py +41 -3
  104. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/uv.lock +4 -4
  105. alpha_visualizer-0.7.1/docs/screenshots/en/browse.png +0 -0
  106. alpha_visualizer-0.7.1/docs/screenshots/en/compare.png +0 -0
  107. alpha_visualizer-0.7.1/docs/screenshots/en/detail.png +0 -0
  108. alpha_visualizer-0.7.1/docs/screenshots/en/optimize.png +0 -0
  109. alpha_visualizer-0.7.1/docs/screenshots/en/strategy.png +0 -0
  110. alpha_visualizer-0.7.1/docs/screenshots/ja/browse.png +0 -0
  111. alpha_visualizer-0.7.1/docs/screenshots/ja/compare.png +0 -0
  112. alpha_visualizer-0.7.1/docs/screenshots/ja/detail.png +0 -0
  113. alpha_visualizer-0.7.1/docs/screenshots/ja/optimize.png +0 -0
  114. alpha_visualizer-0.7.1/docs/screenshots/ja/strategy.png +0 -0
  115. alpha_visualizer-0.7.1/frontend/e2e/screenshots/capture.spec.ts +0 -113
  116. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/.agents/skills/source-command-audit-licenses/SKILL.md +0 -0
  117. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/.agents/skills/source-command-pre-release/SKILL.md +0 -0
  118. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/.claude/commands/audit-licenses.md +0 -0
  119. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/.claude/commands/pre-release.md +0 -0
  120. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/.codex/hooks.json +0 -0
  121. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  122. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/.github/ISSUE_TEMPLATE/bug_report_ja.yml +0 -0
  123. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  124. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  125. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/.github/ISSUE_TEMPLATE/feature_request_ja.yml +0 -0
  126. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  127. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/.github/codeql/README.md +0 -0
  128. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/.github/codeql/codeql-config.yml +0 -0
  129. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/.github/dependabot.yml +0 -0
  130. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/.github/workflows/codeql.yml +0 -0
  131. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/.hypothesis/.gitignore +0 -0
  132. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/.hypothesis/constants/0bf3463e8f4751b8 +0 -0
  133. /alpha_visualizer-0.7.1/.hypothesis/constants/dd2b62c354789905 → /alpha_visualizer-0.7.3/.hypothesis/constants/0f38aca28193156b +0 -0
  134. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/.hypothesis/constants/10d56fd11d90e91d +0 -0
  135. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/.hypothesis/constants/2826595e28fa870a +0 -0
  136. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/.hypothesis/constants/291dc4c40995bea6 +0 -0
  137. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/.hypothesis/constants/312a7aaf12a1fd47 +0 -0
  138. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/.hypothesis/constants/331e194303817b32 +0 -0
  139. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/.hypothesis/constants/368f2bae545df6be +0 -0
  140. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/.hypothesis/constants/3f7b61d4b4a660e1 +0 -0
  141. /alpha_visualizer-0.7.1/.hypothesis/constants/11405f641e79317e → /alpha_visualizer-0.7.3/.hypothesis/constants/43f703bafb1e4b04 +0 -0
  142. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/.hypothesis/constants/4577b97f57a8a832 +0 -0
  143. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/.hypothesis/constants/4726660442f99a00 +0 -0
  144. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/.hypothesis/constants/4a1c4d1532cab28e +0 -0
  145. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/.hypothesis/constants/508b282112ab038e +0 -0
  146. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/.hypothesis/constants/757b1f8305546439 +0 -0
  147. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/.hypothesis/constants/7d3b67d825fc154a +0 -0
  148. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/.hypothesis/constants/7f90c9d611001617 +0 -0
  149. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/.hypothesis/constants/828ed73d45fcee28 +0 -0
  150. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/.hypothesis/constants/82e279d41edd645d +0 -0
  151. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/.hypothesis/constants/89aaa48f251cd53d +0 -0
  152. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/.hypothesis/constants/89d70ebe84c5b2b7 +0 -0
  153. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/.hypothesis/constants/8add761403393fca +0 -0
  154. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/.hypothesis/constants/90fccc12da2fa6c9 +0 -0
  155. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/.hypothesis/constants/96ca93165140d446 +0 -0
  156. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/.hypothesis/constants/97982d8e7c8d4a95 +0 -0
  157. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/.hypothesis/constants/a636a4647020033d +0 -0
  158. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/.hypothesis/constants/ab4df659c6b192db +0 -0
  159. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/.hypothesis/constants/b76328deebb21ae6 +0 -0
  160. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/.hypothesis/constants/b9ff5bcd3a53e3a7 +0 -0
  161. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/.hypothesis/constants/bd75c3c18e8ba4f4 +0 -0
  162. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/.hypothesis/constants/c5349cb90ddc7968 +0 -0
  163. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/.hypothesis/constants/c5f6cf064ffb412d +0 -0
  164. /alpha_visualizer-0.7.1/.hypothesis/constants/aadcc0d08f3b7739 → /alpha_visualizer-0.7.3/.hypothesis/constants/cd09731f3dfbf59f +0 -0
  165. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/.hypothesis/constants/d4cc884f331eee77 +0 -0
  166. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/.hypothesis/constants/da39a3ee5e6b4b0d +0 -0
  167. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/.hypothesis/constants/e44a457d795e56c2 +0 -0
  168. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/.hypothesis/constants/ea2d606acbfff989 +0 -0
  169. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/.hypothesis/constants/ee487c54cd5ca7dc +0 -0
  170. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/.hypothesis/constants/eed5e66c16ae84b8 +0 -0
  171. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/.hypothesis/constants/f2f91c7f9b44111d +0 -0
  172. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/.hypothesis/constants/f7c4a04c97c0daf8 +0 -0
  173. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/.hypothesis/constants/f7f9c6b3c86f63a8 +0 -0
  174. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/.hypothesis/constants/fa443af6269a6e02 +0 -0
  175. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/.hypothesis/constants/fe325b4404aa1121 +0 -0
  176. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/.hypothesis/constants/ff4517cbfe51fea1 +0 -0
  177. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/AGENTS.md +0 -0
  178. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/CLAUDE.md +0 -0
  179. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/CODE_OF_CONDUCT.en.md +0 -0
  180. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/CODE_OF_CONDUCT.md +0 -0
  181. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/CONTRIBUTING.en.md +0 -0
  182. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/CONTRIBUTING.md +0 -0
  183. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/LICENSE +0 -0
  184. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/NOTICE +0 -0
  185. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/SECURITY.en.md +0 -0
  186. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/SECURITY.md +0 -0
  187. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/THIRDPARTY_LICENSES.txt +0 -0
  188. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/cliff.toml +0 -0
  189. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/docs/adr/0001-pages-vs-screens.md +0 -0
  190. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/docs/adr/0002-charts-visx-vs-components.md +0 -0
  191. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/docs/adr/0003-openapi-typescript-codegen.md +0 -0
  192. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/docs/adr/0004-condition-node-discriminated-union.md +0 -0
  193. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/docs/lighthouse-ci.md +0 -0
  194. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/docs/screenshots/en/ideas.png +0 -0
  195. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/docs/screenshots/en/strategy-signal-tv.png +0 -0
  196. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/docs/screenshots/ja/ideas.png +0 -0
  197. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/docs/screenshots/ja/strategy-signal-tv.png +0 -0
  198. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/.gitignore +0 -0
  199. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/.npmrc +0 -0
  200. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/.size-limit.json +0 -0
  201. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/.storybook/main.ts +0 -0
  202. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/.storybook/preview.ts +0 -0
  203. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/CLAUDE.md +0 -0
  204. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/README.md +0 -0
  205. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/THIRDPARTY_FONTS.md +0 -0
  206. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/e2e/fixtures/README.md +0 -0
  207. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/e2e/fixtures/forge/data/historical/SPY_1d.parquet +0 -0
  208. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/e2e/fixtures/forge/data/ideas/ideas.json +0 -0
  209. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/e2e/fixtures/forge/data/strategies/momo_breakout.json +0 -0
  210. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/e2e/fixtures/forge/data/strategies/rsi_reversal.json +0 -0
  211. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/e2e/fixtures/forge/data/strategies/sma_cross.json +0 -0
  212. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/e2e/fixtures/forge/forge.yaml +0 -0
  213. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/e2e/helpers/locators.ts +0 -0
  214. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/e2e/samples/sample-fixture.spec.ts +0 -0
  215. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/e2e/screenshots/strategy-signal-tv.spec.ts +0 -0
  216. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/e2e/specs/browse.spec.ts +0 -0
  217. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/e2e/specs/i18n.spec.ts +0 -0
  218. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/eslint.config.js +0 -0
  219. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/index.html +0 -0
  220. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/openapi.json +0 -0
  221. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/package.json +0 -0
  222. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/playwright.config.ts +0 -0
  223. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/playwright.screenshots.config.ts +0 -0
  224. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/pnpm-lock.yaml +0 -0
  225. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/pnpm-workspace.yaml +0 -0
  226. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/public/favicon.svg +0 -0
  227. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/public/icons.svg +0 -0
  228. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/src/api/__tests__/client.test.ts +0 -0
  229. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/src/api/client.ts +0 -0
  230. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/src/api/types.gen.ts +0 -0
  231. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/src/charts/tv/CompareEquityTV.stories.tsx +0 -0
  232. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/src/charts/tv/CompareEquityTV.tsx +0 -0
  233. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/src/charts/tv/EquityDrawdownPaneTV.stories.tsx +0 -0
  234. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/src/charts/tv/EquityDrawdownPaneTV.tsx +0 -0
  235. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/src/charts/tv/RollingMetricsChartTV.stories.tsx +0 -0
  236. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/src/charts/tv/RollingMetricsChartTV.tsx +0 -0
  237. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/src/charts/tv/StrategySignalChartTV.stories.tsx +0 -0
  238. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/src/charts/tv/StrategySignalChartTV.tsx +0 -0
  239. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/src/charts/tv/WFOEquityTV.stories.tsx +0 -0
  240. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/src/charts/tv/WFOEquityTV.tsx +0 -0
  241. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/src/charts/tv/__tests__/CompareEquityTV.test.tsx +0 -0
  242. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/src/charts/tv/__tests__/EquityDrawdownPaneTV.test.tsx +0 -0
  243. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/src/charts/tv/__tests__/RollingMetricsChartTV.test.tsx +0 -0
  244. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/src/charts/tv/__tests__/StrategySignalChartTV.test.tsx +0 -0
  245. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/src/charts/tv/__tests__/WFOEquityTV.test.tsx +0 -0
  246. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/src/charts/tv/__tests__/data.test.ts +0 -0
  247. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/src/charts/tv/__tests__/theme.test.ts +0 -0
  248. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/src/charts/tv/__tests__/trades.test.ts +0 -0
  249. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/src/charts/tv/data.ts +0 -0
  250. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/src/charts/tv/theme.ts +0 -0
  251. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/src/charts/tv/trades.ts +0 -0
  252. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/src/charts/visx/AnnualReturnsBarV.tsx +0 -0
  253. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/src/charts/visx/CompareEquityV.tsx +0 -0
  254. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/src/charts/visx/CorrelationHeatmapV.tsx +0 -0
  255. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/src/charts/visx/DrawdownChartV.tsx +0 -0
  256. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/src/charts/visx/EquityChartV.tsx +0 -0
  257. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/src/charts/visx/MAEMFEScatterV.tsx +0 -0
  258. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/src/charts/visx/MonthlyHeatmapV.tsx +0 -0
  259. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/src/charts/visx/OptimizeScatterV.tsx +0 -0
  260. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/src/charts/visx/Sparkline.stories.tsx +0 -0
  261. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/src/charts/visx/Sparkline.tsx +0 -0
  262. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/src/charts/visx/__tests__/EquityChartV.regime.test.ts +0 -0
  263. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/src/charts/visx/regimeBands.ts +0 -0
  264. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/src/components/CommandPalette.tsx +0 -0
  265. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/src/components/DetailToolbar.tsx +0 -0
  266. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/src/components/MetricsSummaryBarV2.stories.tsx +0 -0
  267. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/src/components/MetricsSummaryBarV2.tsx +0 -0
  268. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/src/components/RootLayout.tsx +0 -0
  269. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/src/components/SettingsToggles.tsx +0 -0
  270. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/src/components/StrategyHero.tsx +0 -0
  271. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/src/components/__tests__/CommandPalette.test.tsx +0 -0
  272. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/src/components/__tests__/CorrelationHeatmap.test.tsx +0 -0
  273. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/src/components/__tests__/responsive-styles.test.tsx +0 -0
  274. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/src/components/browser/CompareFloatingBar.tsx +0 -0
  275. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/src/components/browser/FilterBar.tsx +0 -0
  276. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/src/components/browser/GroupByToggle.tsx +0 -0
  277. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/src/components/browser/Heroline.tsx +0 -0
  278. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/src/components/browser/RunHistoryTab.tsx +0 -0
  279. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/src/components/browser/SavedViews.tsx +0 -0
  280. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/src/components/browser/StrategySlidePanel.tsx +0 -0
  281. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/src/components/browser/StrategyTable.tsx +0 -0
  282. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/src/components/browser/SymbolAtlas.tsx +0 -0
  283. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/src/components/browser/SymbolCard.tsx +0 -0
  284. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/src/components/charts/AnnualReturnsBar.tsx +0 -0
  285. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/src/components/charts/CorrelationHeatmap.tsx +0 -0
  286. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/src/components/charts/DrawdownDetailChart.tsx +0 -0
  287. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/src/components/charts/MAEMFEScatter.tsx +0 -0
  288. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/src/components/charts/MonteCarloChart.tsx +0 -0
  289. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/src/components/charts/OptimizeScatter.tsx +0 -0
  290. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/src/components/charts/ReturnDistributionChart.tsx +0 -0
  291. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/src/components/charts/RollingMetricsChart.tsx +0 -0
  292. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/src/components/charts/VaRChart.tsx +0 -0
  293. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/src/components/charts/WFOTimeline.tsx +0 -0
  294. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/src/components/charts/WeekdayPerformanceChart.tsx +0 -0
  295. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/src/components/live/__tests__/format.test.ts +0 -0
  296. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/src/components/metrics/CompareTable.tsx +0 -0
  297. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/src/components/metrics/ISOOSMetrics.tsx +0 -0
  298. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/src/components/metrics/MetricsGrid.tsx +0 -0
  299. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/src/components/metrics/RegimeBreakdownCards.tsx +0 -0
  300. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/src/components/metrics/SignalQualityBadge.tsx +0 -0
  301. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/src/components/metrics/__tests__/evaluateGood.test.ts +0 -0
  302. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/src/components/metrics/evaluate.ts +0 -0
  303. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/src/components/nav.ts +0 -0
  304. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/src/components/trades/TradeTable.tsx +0 -0
  305. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/src/constants/metricDefinitions.ts +0 -0
  306. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/src/contexts/DashboardContext.tsx +0 -0
  307. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/src/contexts/dashboardConstants.ts +0 -0
  308. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/src/design/a11y.css +0 -0
  309. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/src/design/primitives/Button.tsx +0 -0
  310. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/src/design/primitives/Card.tsx +0 -0
  311. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/src/design/primitives/Chip.tsx +0 -0
  312. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/src/design/primitives/Divider.tsx +0 -0
  313. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/src/design/primitives/KeyValue.tsx +0 -0
  314. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/src/design/primitives/OverflowMenu.tsx +0 -0
  315. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/src/design/primitives/Pill.stories.tsx +0 -0
  316. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/src/design/primitives/Pill.tsx +0 -0
  317. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/src/design/primitives/SectionHeader.tsx +0 -0
  318. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/src/design/primitives/Stat.stories.tsx +0 -0
  319. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/src/design/primitives/Stat.tsx +0 -0
  320. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/src/design/primitives/TabBar.tsx +0 -0
  321. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/src/design/primitives/Toolbar.tsx +0 -0
  322. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/src/design/primitives/__tests__/OverflowMenu.test.tsx +0 -0
  323. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/src/design/primitives/index.ts +0 -0
  324. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/src/design/tokens.css +0 -0
  325. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/src/design/useChartTheme.ts +0 -0
  326. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/src/hooks/__tests__/useEquityViewport.test.ts +0 -0
  327. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/src/hooks/__tests__/useFetchByKey.test.ts +0 -0
  328. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/src/hooks/__tests__/useScrollRestoration.test.tsx +0 -0
  329. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/src/hooks/__tests__/useStrategyHistorical.test.tsx +0 -0
  330. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/src/hooks/__tests__/useStrategyList.test.tsx +0 -0
  331. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/src/hooks/__tests__/useTheme.test.tsx +0 -0
  332. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/src/hooks/useBacktestData.ts +0 -0
  333. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/src/hooks/useDebounce.ts +0 -0
  334. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/src/hooks/useEquityViewport.ts +0 -0
  335. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/src/hooks/useFetchByKey.ts +0 -0
  336. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/src/hooks/useIdeasList.ts +0 -0
  337. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/src/hooks/useRecentStrategies.ts +0 -0
  338. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/src/hooks/useScrollRestoration.ts +0 -0
  339. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/src/hooks/useSparklineCache.ts +0 -0
  340. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/src/hooks/useStrategyHistorical.ts +0 -0
  341. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/src/hooks/useStrategyList.ts +0 -0
  342. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/src/hooks/useSymbolStats.ts +0 -0
  343. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/src/hooks/useTheme.ts +0 -0
  344. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/src/i18n/__tests__/strings.test.ts +0 -0
  345. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/src/i18n/strings.ts +0 -0
  346. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/src/lib/__tests__/correlation.test.ts +0 -0
  347. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/src/lib/__tests__/distribution.test.ts +0 -0
  348. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/src/lib/__tests__/drawdown.test.ts +0 -0
  349. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/src/lib/__tests__/format.test.ts +0 -0
  350. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/src/lib/__tests__/monteCarlo.properties.test.ts +0 -0
  351. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/src/lib/__tests__/monteCarlo.test.ts +0 -0
  352. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/src/lib/__tests__/rolling.test.ts +0 -0
  353. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/src/lib/__tests__/searchParams.test.ts +0 -0
  354. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/src/lib/__tests__/searchStrategies.test.ts +0 -0
  355. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/src/lib/__tests__/walkForward.test.ts +0 -0
  356. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/src/lib/__tests__/weekday.test.ts +0 -0
  357. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/src/lib/assetClass.ts +0 -0
  358. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/src/lib/correlation.ts +0 -0
  359. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/src/lib/csv.ts +0 -0
  360. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/src/lib/distribution.ts +0 -0
  361. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/src/lib/drawdown.ts +0 -0
  362. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/src/lib/exportPng.ts +0 -0
  363. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/src/lib/format.ts +0 -0
  364. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/src/lib/monteCarlo.ts +0 -0
  365. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/src/lib/rolling.ts +0 -0
  366. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/src/lib/searchParams.ts +0 -0
  367. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/src/lib/searchStrategies.ts +0 -0
  368. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/src/lib/walkForward.ts +0 -0
  369. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/src/lib/weekday.ts +0 -0
  370. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/src/main.tsx +0 -0
  371. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/src/mock/btData.ts +0 -0
  372. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/src/pages/BrowsePage.tsx +0 -0
  373. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/src/pages/ComparePage.tsx +0 -0
  374. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/src/pages/DetailPage.tsx +0 -0
  375. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/src/pages/IdeasPage.tsx +0 -0
  376. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/src/screens/BacktestScreen.stories.tsx +0 -0
  377. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/src/screens/CompareScreen.stories.tsx +0 -0
  378. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/src/screens/CompareScreen.tsx +0 -0
  379. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/src/screens/ISOOSScreen.tsx +0 -0
  380. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/src/screens/IdeasScreen.stories.tsx +0 -0
  381. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/src/screens/IdeasScreen.tsx +0 -0
  382. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/src/screens/OptimizeScreen.stories.tsx +0 -0
  383. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/src/screens/OptimizeScreen.tsx +0 -0
  384. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/src/screens/StrategyScreen.tsx +0 -0
  385. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/src/screens/WFOScreen.stories.tsx +0 -0
  386. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/src/screens/WFOScreen.tsx +0 -0
  387. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/src/test-setup.ts +0 -0
  388. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/tsconfig.app.json +0 -0
  389. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/tsconfig.e2e.json +0 -0
  390. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/tsconfig.json +0 -0
  391. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/tsconfig.node.json +0 -0
  392. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/frontend/vite.config.ts +0 -0
  393. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/lighthouserc.json +0 -0
  394. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/release.sh +0 -0
  395. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/samples/README.en.md +0 -0
  396. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/samples/README.md +0 -0
  397. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/samples/__init__.py +0 -0
  398. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/samples/_generators/__init__.py +0 -0
  399. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/samples/_generators/compatibility_matrix.py +0 -0
  400. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/samples/_generators/ideas_defs.py +0 -0
  401. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/samples/_generators/pseudo_backtest.py +0 -0
  402. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/samples/_generators/pseudo_grid.py +0 -0
  403. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/samples/_generators/pseudo_wfo.py +0 -0
  404. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/samples/_generators/strategy_defs.py +0 -0
  405. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/samples/_generators/synthetic_ohlcv.py +0 -0
  406. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/samples/_generators/writers.py +0 -0
  407. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/samples/build_samples.py +0 -0
  408. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/samples/sample-forge/data/ideas/ideas.json +0 -0
  409. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/samples/sample-forge/data/strategies/bbands_breakout_v1.json +0 -0
  410. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/samples/sample-forge/data/strategies/donchian_turtle_v1.json +0 -0
  411. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/samples/sample-forge/data/strategies/ema_adx_macd_v1.json +0 -0
  412. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/samples/sample-forge/data/strategies/macd_crossover_v1.json +0 -0
  413. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/samples/sample-forge/data/strategies/range_reversion_v1.json +0 -0
  414. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/samples/sample-forge/data/strategies/rsi_reversion_v1.json +0 -0
  415. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/samples/sample-forge/data/strategies/sma_crossover_v1.json +0 -0
  416. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/samples/sample-forge/data/strategies/supertrend_adx_v1.json +0 -0
  417. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/samples/sample-forge/forge.yaml +0 -0
  418. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/scripts/generate_openapi.py +0 -0
  419. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/src/alpha_visualizer/db.py +0 -0
  420. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/src/alpha_visualizer/dependencies.py +0 -0
  421. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/src/alpha_visualizer/errors.py +0 -0
  422. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/src/alpha_visualizer/log_sanitize.py +0 -0
  423. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/src/alpha_visualizer/repositories/__init__.py +0 -0
  424. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/src/alpha_visualizer/repositories/backtest_results.py +0 -0
  425. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/src/alpha_visualizer/repositories/ideas.py +0 -0
  426. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/src/alpha_visualizer/repositories/live.py +0 -0
  427. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/src/alpha_visualizer/repositories/optimization.py +0 -0
  428. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/src/alpha_visualizer/repositories/strategies.py +0 -0
  429. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/src/alpha_visualizer/routers/__init__.py +0 -0
  430. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/src/alpha_visualizer/routers/historical.py +0 -0
  431. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/src/alpha_visualizer/routers/ideas.py +0 -0
  432. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/src/alpha_visualizer/routers/live.py +0 -0
  433. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/src/alpha_visualizer/routers/optimize.py +0 -0
  434. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/src/alpha_visualizer/routers/results.py +0 -0
  435. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/src/alpha_visualizer/routers/run.py +0 -0
  436. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/src/alpha_visualizer/routers/strategies.py +0 -0
  437. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/src/alpha_visualizer/routers/wfo.py +0 -0
  438. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/src/alpha_visualizer/schemas/__init__.py +0 -0
  439. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/src/alpha_visualizer/schemas/historical.py +0 -0
  440. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/src/alpha_visualizer/schemas/ideas.py +0 -0
  441. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/src/alpha_visualizer/schemas/live.py +0 -0
  442. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/src/alpha_visualizer/schemas/optimize.py +0 -0
  443. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/src/alpha_visualizer/schemas/results.py +0 -0
  444. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/src/alpha_visualizer/schemas/strategies.py +0 -0
  445. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/src/alpha_visualizer/schemas/wfo.py +0 -0
  446. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/src/alpha_visualizer/services/__init__.py +0 -0
  447. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/src/alpha_visualizer/services/backtest.py +0 -0
  448. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/src/alpha_visualizer/services/historical.py +0 -0
  449. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/src/alpha_visualizer/services/live.py +0 -0
  450. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/src/alpha_visualizer/services/walk_forward.py +0 -0
  451. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/tests/__init__.py +0 -0
  452. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/tests/conftest.py +0 -0
  453. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/tests/factories.py +0 -0
  454. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/tests/repositories/__init__.py +0 -0
  455. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/tests/repositories/test_backtest_results_repo.py +0 -0
  456. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/tests/repositories/test_ideas_reader.py +0 -0
  457. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/tests/repositories/test_live_repo.py +0 -0
  458. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/tests/repositories/test_optimization_repo.py +0 -0
  459. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/tests/repositories/test_strategies_repo.py +0 -0
  460. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/tests/routers/__init__.py +0 -0
  461. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/tests/routers/test_forge_yaml_integration.py +0 -0
  462. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/tests/routers/test_historical.py +0 -0
  463. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/tests/routers/test_ideas.py +0 -0
  464. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/tests/routers/test_live.py +0 -0
  465. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/tests/routers/test_optimize.py +0 -0
  466. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/tests/routers/test_results.py +0 -0
  467. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/tests/routers/test_run.py +0 -0
  468. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/tests/routers/test_strategies.py +0 -0
  469. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/tests/routers/test_wfo.py +0 -0
  470. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/tests/samples/__init__.py +0 -0
  471. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/tests/samples/test_pseudo_backtest.py +0 -0
  472. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/tests/samples/test_pseudo_grid.py +0 -0
  473. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/tests/samples/test_pseudo_wfo.py +0 -0
  474. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/tests/samples/test_sample_forge.py +0 -0
  475. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/tests/samples/test_strategy_defs.py +0 -0
  476. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/tests/samples/test_synthetic_ohlcv.py +0 -0
  477. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/tests/samples/test_writers.py +0 -0
  478. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/tests/schemas/__init__.py +0 -0
  479. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/tests/schemas/test_schemas.py +0 -0
  480. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/tests/services/__init__.py +0 -0
  481. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/tests/services/test_backtest.py +0 -0
  482. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/tests/services/test_backtest_properties.py +0 -0
  483. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/tests/services/test_historical.py +0 -0
  484. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/tests/services/test_live.py +0 -0
  485. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/tests/services/test_wfo.py +0 -0
  486. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/tests/test_cli.py +0 -0
  487. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/tests/test_db.py +0 -0
  488. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/tests/test_dependencies.py +0 -0
  489. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/tests/test_errors.py +0 -0
  490. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.3}/tests/test_log_sanitize.py +0 -0
@@ -15,7 +15,7 @@ jobs:
15
15
  - name: Install uv
16
16
  uses: astral-sh/setup-uv@v7
17
17
  with:
18
- version: "latest"
18
+ version: "0.11.19"
19
19
 
20
20
  - name: Set up Python
21
21
  run: uv python install 3.12
@@ -64,6 +64,50 @@ jobs:
64
64
  - name: Bundle size check (size-limit)
65
65
  run: pnpm run size
66
66
 
67
+ # issue #225: wheel / sdist に frontend の static/ が同梱されることを PR 時点で検証する。
68
+ # (static/ は .gitignore 管理のため hatchling の既定挙動では除外される。
69
+ # pyproject の force-include 設定が欠落・破損していないかをここで検出する)
70
+ packaging:
71
+ name: Packaging (wheel/sdist contain static)
72
+ runs-on: ubuntu-latest
73
+ timeout-minutes: 10
74
+ steps:
75
+ - uses: actions/checkout@v6
76
+
77
+ - name: Install uv
78
+ uses: astral-sh/setup-uv@v7
79
+ with:
80
+ version: "0.11.19"
81
+
82
+ - name: Set up Python
83
+ run: uv python install 3.12
84
+
85
+ - name: Setup pnpm
86
+ uses: pnpm/action-setup@v6
87
+ with:
88
+ version: 11
89
+
90
+ - name: Set up Node.js
91
+ uses: actions/setup-node@v6
92
+ with:
93
+ node-version: '22'
94
+ cache: 'pnpm'
95
+ cache-dependency-path: frontend/pnpm-lock.yaml
96
+
97
+ - name: Install pnpm dependencies
98
+ working-directory: frontend
99
+ run: pnpm install --frozen-lockfile
100
+
101
+ - name: Build frontend
102
+ working-directory: frontend
103
+ run: pnpm run build
104
+
105
+ - name: Build wheel and sdist
106
+ run: uv build
107
+
108
+ - name: Verify build artifacts contain frontend assets
109
+ run: uv run python scripts/verify_build_artifacts.py dist/
110
+
67
111
  openapi-types:
68
112
  name: OpenAPI types drift check
69
113
  runs-on: ubuntu-latest
@@ -74,7 +118,7 @@ jobs:
74
118
  - name: Install uv
75
119
  uses: astral-sh/setup-uv@v7
76
120
  with:
77
- version: "latest"
121
+ version: "0.11.19"
78
122
 
79
123
  - name: Set up Python
80
124
  run: uv python install 3.12
@@ -120,7 +164,7 @@ jobs:
120
164
  - name: Install uv
121
165
  uses: astral-sh/setup-uv@v7
122
166
  with:
123
- version: "latest"
167
+ version: "0.11.19"
124
168
 
125
169
  - name: Set up Python
126
170
  run: uv python install 3.12
@@ -128,12 +172,22 @@ jobs:
128
172
  - name: Install Python dependencies
129
173
  run: uv sync --all-extras
130
174
 
175
+ # SQLite DB はヘッダに書き込みライブラリのバージョンを記録するため、
176
+ # バイナリ git diff ではなく SQL ダンプの論理比較で検証する(#223)。
177
+ - name: Snapshot committed fixture DB
178
+ run: cp frontend/e2e/fixtures/forge/data/results/backtest_results.db /tmp/committed_fixture.db
179
+
131
180
  - name: Regenerate E2E fixture
132
181
  run: uv run python tests/fixtures/build_e2e_fixture.py
133
182
 
134
183
  - name: Verify fixture is committed
135
184
  run: |
136
- if ! git diff --exit-code frontend/e2e/fixtures/; then
185
+ if ! uv run python scripts/compare_sqlite_dump.py /tmp/committed_fixture.db frontend/e2e/fixtures/forge/data/results/backtest_results.db; then
186
+ echo "::error::E2E fixture DB is out of date (logical dump differs)."
187
+ echo "Run 'uv run python tests/fixtures/build_e2e_fixture.py' locally and commit the changes."
188
+ exit 1
189
+ fi
190
+ if ! git diff --exit-code -- frontend/e2e/fixtures/ ':(exclude)frontend/e2e/fixtures/forge/data/results/backtest_results.db'; then
137
191
  echo "::error::E2E fixture is out of date."
138
192
  echo "Run 'uv run python tests/fixtures/build_e2e_fixture.py' locally and commit the changes."
139
193
  exit 1
@@ -149,7 +203,7 @@ jobs:
149
203
  - name: Install uv
150
204
  uses: astral-sh/setup-uv@v7
151
205
  with:
152
- version: "latest"
206
+ version: "0.11.19"
153
207
 
154
208
  - name: Set up Python
155
209
  run: uv python install 3.12
@@ -157,12 +211,21 @@ jobs:
157
211
  - name: Install Python dependencies
158
212
  run: uv sync --all-extras
159
213
 
214
+ # SQLite DB はバイナリ比較ではなく SQL ダンプの論理比較で検証する(#223)。
215
+ - name: Snapshot committed samples DB
216
+ run: cp samples/sample-forge/data/results/backtest_results.db /tmp/committed_samples.db
217
+
160
218
  - name: Regenerate OSS sample dataset
161
219
  run: uv run python samples/build_samples.py
162
220
 
163
221
  - name: Verify sample-forge is committed (determinism)
164
222
  run: |
165
- if ! git diff --exit-code samples/sample-forge/; then
223
+ if ! uv run python scripts/compare_sqlite_dump.py /tmp/committed_samples.db samples/sample-forge/data/results/backtest_results.db; then
224
+ echo "::error::samples/sample-forge/ DB is out of date (logical dump differs)."
225
+ echo "Run 'uv run python samples/build_samples.py' locally and commit the changes."
226
+ exit 1
227
+ fi
228
+ if ! git diff --exit-code -- samples/sample-forge/ ':(exclude)samples/sample-forge/data/results/backtest_results.db'; then
166
229
  echo "::error::samples/sample-forge/ is out of date."
167
230
  echo "Run 'uv run python samples/build_samples.py' locally and commit the changes."
168
231
  exit 1
@@ -177,7 +240,7 @@ jobs:
177
240
  - name: Install uv
178
241
  uses: astral-sh/setup-uv@v7
179
242
  with:
180
- version: "latest"
243
+ version: "0.11.19"
181
244
 
182
245
  - name: Set up Python
183
246
  run: uv python install 3.12
@@ -243,3 +306,71 @@ jobs:
243
306
  name: playwright-traces
244
307
  path: frontend/test-results/
245
308
  retention-days: 14
309
+
310
+ e2e-samples:
311
+ runs-on: ubuntu-latest
312
+ timeout-minutes: 20
313
+ steps:
314
+ - uses: actions/checkout@v6
315
+
316
+ - name: Install uv
317
+ uses: astral-sh/setup-uv@v7
318
+ with:
319
+ version: "0.11.19"
320
+
321
+ - name: Set up Python
322
+ run: uv python install 3.12
323
+
324
+ - name: Install Python dependencies
325
+ run: uv sync --all-extras
326
+
327
+ - name: Setup pnpm
328
+ uses: pnpm/action-setup@v6
329
+ with:
330
+ version: 11
331
+
332
+ - name: Set up Node.js
333
+ uses: actions/setup-node@v6
334
+ with:
335
+ node-version: '22'
336
+ cache: 'pnpm'
337
+ cache-dependency-path: frontend/pnpm-lock.yaml
338
+
339
+ - name: Install pnpm dependencies
340
+ working-directory: frontend
341
+ run: pnpm install --frozen-lockfile
342
+
343
+ - name: Cache Playwright browsers
344
+ uses: actions/cache@v5
345
+ id: playwright-cache
346
+ with:
347
+ path: ~/.cache/ms-playwright
348
+ key: playwright-${{ runner.os }}-${{ hashFiles('frontend/pnpm-lock.yaml') }}
349
+
350
+ - name: Install Playwright browsers (cold)
351
+ working-directory: frontend
352
+ if: steps.playwright-cache.outputs.cache-hit != 'true'
353
+ run: pnpm exec playwright install --with-deps chromium
354
+
355
+ - name: Install Playwright system deps (cache hit)
356
+ working-directory: frontend
357
+ if: steps.playwright-cache.outputs.cache-hit == 'true'
358
+ run: pnpm exec playwright install-deps chromium
359
+
360
+ - name: Build frontend
361
+ working-directory: frontend
362
+ run: pnpm run build
363
+
364
+ - name: Run Playwright samples smoke
365
+ working-directory: frontend
366
+ env:
367
+ CI: 'true'
368
+ run: pnpm run e2e:samples
369
+
370
+ - name: Upload Playwright report
371
+ if: always()
372
+ uses: actions/upload-artifact@v7
373
+ with:
374
+ name: playwright-report-samples
375
+ path: frontend/playwright-report-samples/
376
+ retention-days: 14
@@ -26,7 +26,7 @@ jobs:
26
26
  - name: Install uv
27
27
  uses: astral-sh/setup-uv@v7
28
28
  with:
29
- version: "latest"
29
+ version: "0.11.19"
30
30
 
31
31
  - name: Set up Python
32
32
  run: uv python install 3.12
@@ -18,7 +18,7 @@ jobs:
18
18
  - name: Install uv
19
19
  uses: astral-sh/setup-uv@v7
20
20
  with:
21
- version: "latest"
21
+ version: "0.11.19"
22
22
 
23
23
  - name: Set up Python
24
24
  run: uv python install 3.12
@@ -58,5 +58,10 @@ jobs:
58
58
  - name: Build
59
59
  run: uv build
60
60
 
61
+ # issue #225: v0.7.1 で wheel に static/ が同梱されないまま公開された事故の再発防止。
62
+ # 公開前に wheel / sdist の中身を検証し、欠落していたらリリースを止める。
63
+ - name: Verify build artifacts contain frontend assets (issue #225)
64
+ run: uv run python scripts/verify_build_artifacts.py dist/
65
+
61
66
  - name: Publish to PyPI
62
67
  uses: pypa/gh-action-pypi-publish@release/v1
@@ -28,6 +28,7 @@ frontend/.tsbuildinfo
28
28
 
29
29
  # Playwright artifacts
30
30
  frontend/playwright-report/
31
+ frontend/playwright-report-samples/
31
32
  frontend/test-results/
32
33
  frontend/blob-report/
33
34
  frontend/playwright/.cache/
@@ -0,0 +1,4 @@
1
+ # file: /home/runner/work/alpha-visualizer/alpha-visualizer/scripts/compare_sqlite_dump.py
2
+ # hypothesis_version: 6.155.1
3
+
4
+ ['__main__']
@@ -1,4 +1,4 @@
1
1
  # file: /home/runner/work/alpha-visualizer/alpha-visualizer/src/alpha_visualizer/__init__.py
2
2
  # hypothesis_version: 6.155.1
3
3
 
4
- ['0.7.1']
4
+ ['0.7.3']
@@ -5,6 +5,51 @@ alpha-visualizer の全バージョン変更履歴です。
5
5
  > **License Change Notice (v0.6.0+):** v0.6.0 以降、ライセンスは MIT から Apache-2.0 に変更されました。v0.5.0 以前のリリースは引き続き MIT ライセンスです。詳細は [LICENSE](LICENSE) を参照してください。
6
6
 
7
7
 
8
+ ## [0.7.1] - 2026-06-02
9
+
10
+
11
+ ### CI/CD
12
+
13
+ - **deps**: bump idna from 3.13 to 3.15 (#203)
14
+
15
+
16
+ - **deps**: Python の Dependabot を pip から uv エコシステムへ切替 (#213)
17
+
18
+
19
+
20
+ ### その他
21
+
22
+ - **deps-dev**: bump @types/node from 25.7.0 to 25.9.1 in /frontend (#207)
23
+
24
+
25
+ - **deps**: bump sqlalchemy from 2.0.49 to 2.0.50 (#214)
26
+
27
+
28
+ - **deps-dev**: bump ruff from 0.15.12 to 0.15.15 (#216)
29
+
30
+
31
+ - **deps**: bump fastapi from 0.136.1 to 0.136.3 (#217)
32
+
33
+
34
+ - **deps-dev**: bump hypothesis from 6.152.4 to 6.155.1 (#218)
35
+
36
+
37
+ - **deps**: bump pandas from 3.0.2 to 3.0.3 (#215)
38
+
39
+
40
+ - **deps-dev**: bump @vitejs/plugin-react in /frontend (#208)
41
+
42
+
43
+ - バージョン 0.7.1 にバンプ
44
+
45
+
46
+
47
+ ### ドキュメント
48
+
49
+ - CHANGELOG を v0.7.0 に更新
50
+
51
+
52
+
8
53
  ## [0.7.0] - 2026-05-30
9
54
 
10
55
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: alpha-visualizer
3
- Version: 0.7.1
3
+ Version: 0.7.3
4
4
  Summary: Web visualization tool for AlphaForge backtest results
5
5
  Project-URL: Homepage, https://github.com/alforge-labs/alpha-visualizer
6
6
  Project-URL: Repository, https://github.com/alforge-labs/alpha-visualizer
@@ -104,6 +104,10 @@ alpha-vis serve --no-open
104
104
  |---|---|
105
105
  | ![Detail](docs/screenshots/ja/detail.png) | ![Compare](docs/screenshots/ja/compare.png) |
106
106
 
107
+ **Compare — 戦略間相関ヒートマップ**
108
+
109
+ ![相関ヒートマップ](docs/screenshots/ja/compare-heatmap.png)
110
+
107
111
  | Optimize | Strategy 構造 |
108
112
  |---|---|
109
113
  | ![Optimize](docs/screenshots/ja/optimize.png) | ![Strategy](docs/screenshots/ja/strategy.png) |
@@ -71,6 +71,10 @@ If `alpha-vis serve --forge-dir /path/to/A` seems to be reading a different DB t
71
71
  |---|---|
72
72
  | ![Detail](docs/screenshots/en/detail.png) | ![Compare](docs/screenshots/en/compare.png) |
73
73
 
74
+ **Compare — Strategy correlation heatmap**
75
+
76
+ ![Correlation heatmap](docs/screenshots/en/compare-heatmap.png)
77
+
74
78
  | Optimize | Strategy structure |
75
79
  |---|---|
76
80
  | ![Optimize](docs/screenshots/en/optimize.png) | ![Strategy](docs/screenshots/en/strategy.png) |
@@ -71,6 +71,10 @@ alpha-vis serve --no-open
71
71
  |---|---|
72
72
  | ![Detail](docs/screenshots/ja/detail.png) | ![Compare](docs/screenshots/ja/compare.png) |
73
73
 
74
+ **Compare — 戦略間相関ヒートマップ**
75
+
76
+ ![相関ヒートマップ](docs/screenshots/ja/compare-heatmap.png)
77
+
74
78
  | Optimize | Strategy 構造 |
75
79
  |---|---|
76
80
  | ![Optimize](docs/screenshots/ja/optimize.png) | ![Strategy](docs/screenshots/ja/strategy.png) |
@@ -0,0 +1,212 @@
1
+ import { expect, test, type Locator, type Page } from '@playwright/test'
2
+ import { mkdir } from 'node:fs/promises'
3
+ import { dirname, resolve } from 'node:path'
4
+ import { fileURLToPath } from 'node:url'
5
+ import {
6
+ clearViewerSettings,
7
+ gotoBrowse,
8
+ gotoCompare,
9
+ gotoDetail,
10
+ switchLanguage,
11
+ type Lang,
12
+ } from '../helpers/locators'
13
+
14
+ const __filename = fileURLToPath(import.meta.url)
15
+ const __dirname = dirname(__filename)
16
+
17
+ /**
18
+ * README / alforge-labs サイト掲載用スクリーンショットを ja/en 両言語で撮影する。
19
+ * 出力先: <repo-root>/docs/screenshots/{ja,en}/<name>.png
20
+ *
21
+ * playwright.screenshots.config.ts から実行することを想定。
22
+ *
23
+ * 撮影方針(issue: README スクショ撮り直し):
24
+ * - 「アピールしたい主役(チャート・構造)」がヘッダー/メトリクスで切れないよう、
25
+ * グリッド掲載分(detail/compare/optimize/strategy)は showcase コンポーネントを
26
+ * element 単位でタイトにクロップする。
27
+ * - hero(browse)はコンテキスト維持のため縦長 viewport でヘッダー+銘柄アトラスを収める。
28
+ */
29
+
30
+ const STRATEGY_ID = 'sma_cross'
31
+ // 最適化(パラメータ感度散布図)はトライアル列を持つ戦略でないと空になる。
32
+ // フィクスチャでは rsi_reversal が 20 トライアルの scatter データを持つ
33
+ // (sma_cross は WFO 形式・momo_breakout は最適化データ無し)。
34
+ const OPTIMIZE_STRATEGY_ID = 'rsi_reversal'
35
+ const COMPARE_IDS = ['sma_cross', 'rsi_reversal', 'momo_breakout'] as const
36
+
37
+ const SCREENSHOT_DIR = resolve(__dirname, '../../../docs/screenshots')
38
+
39
+ // チャート/キャンバス(visx・lightweight-charts)の描画が落ち着くまでの待機(ms)。
40
+ const CHART_SETTLE_MS = 500
41
+
42
+ async function ensureDir(filePath: string): Promise<void> {
43
+ await mkdir(dirname(filePath), { recursive: true })
44
+ }
45
+
46
+ async function settle(page: Page): Promise<void> {
47
+ // データ取得・チャート描画が落ち着くのを待つ
48
+ await page.waitForLoadState('networkidle')
49
+ await page.waitForTimeout(CHART_SETTLE_MS)
50
+ }
51
+
52
+ /**
53
+ * visx / lightweight-charts は ResizeObserver で遅延測定されるため、
54
+ * スクロール直後は要素高さが潰れていることがある。高さが下限以上で
55
+ * 安定するまでポーリングしてからクロップする。
56
+ */
57
+ async function waitForStableHeight(target: Locator, minHeight: number): Promise<void> {
58
+ let last = -1
59
+ for (let i = 0; i < 25; i += 1) {
60
+ const box = await target.boundingBox()
61
+ const height = box?.height ?? 0
62
+ if (height >= minHeight && height === last) {
63
+ return
64
+ }
65
+ last = height
66
+ await target.page().waitForTimeout(150)
67
+ }
68
+ }
69
+
70
+ /**
71
+ * ページ全体ではなく、訴求対象の要素そのものをタイトにクロップして撮る。
72
+ * ヘッダー・メトリクス・タブで主役が切れる問題を回避する。
73
+ *
74
+ * 実装メモ: visx の ParentSize 系チャート(OptimizeScatter / CorrelationHeatmap 等)は
75
+ * 親要素が可視領域内に無いと width=0 で描画されない。`Locator.screenshot()` は要素を
76
+ * 分割スクロールして撮るため off-screen 部分のチャートが潰れる。そこで縦長 viewport に
77
+ * 要素全体を収めて描画させ、boundingBox を clip した `page.screenshot()` で撮る。
78
+ */
79
+ async function captureElement(
80
+ page: Page,
81
+ lang: Lang,
82
+ name: string,
83
+ target: Locator,
84
+ minHeight = 200,
85
+ ): Promise<void> {
86
+ const filePath = resolve(SCREENSHOT_DIR, lang, `${name}.png`)
87
+ await ensureDir(filePath)
88
+ // 想定要素(最大 strategy-screen ≈ 1100px)が丸ごと収まる高さにする。
89
+ await page.setViewportSize({ width: 1440, height: 1800 })
90
+ await target.evaluate((el) => el.scrollIntoView({ block: 'center', behavior: 'instant' }))
91
+ await target.waitFor({ state: 'visible' })
92
+ // visx ParentSize は mount 時に width=0 で測れていることがあるため、
93
+ // 可視化後に resize を発火させて再測定を促す。
94
+ await page.evaluate(() => window.dispatchEvent(new Event('resize')))
95
+ await settle(page)
96
+ await waitForStableHeight(target, minHeight)
97
+ const box = await target.boundingBox()
98
+ if (!box) {
99
+ throw new Error(`boundingBox を取得できませんでした: ${name}`)
100
+ }
101
+ await page.screenshot({ path: filePath, clip: box })
102
+ }
103
+
104
+ /**
105
+ * hero など、アプリのコンテキストを保ったまま縦長 viewport で撮る。
106
+ */
107
+ async function captureViewport(
108
+ page: Page,
109
+ lang: Lang,
110
+ name: string,
111
+ height: number,
112
+ ): Promise<void> {
113
+ const filePath = resolve(SCREENSHOT_DIR, lang, `${name}.png`)
114
+ await ensureDir(filePath)
115
+ await page.setViewportSize({ width: 1440, height })
116
+ await page.evaluate(() => window.scrollTo(0, 0))
117
+ await settle(page)
118
+ await page.screenshot({ path: filePath })
119
+ }
120
+
121
+ async function setLang(page: Page, lang: Lang): Promise<void> {
122
+ if (lang === 'ja') {
123
+ return
124
+ }
125
+ await switchLanguage(page, lang)
126
+ // 言語切替直後はテキストの再描画があるので少し待つ
127
+ await page.waitForLoadState('networkidle')
128
+ }
129
+
130
+ async function openDetailTab(page: Page, ja: string, en: string, lang: Lang): Promise<void> {
131
+ const name = lang === 'ja' ? ja : en
132
+ const tab = page.getByRole('tab', { name, exact: true })
133
+ // click() は要素の出現(actionability)を待つため、goto 直後でも取りこぼさない。
134
+ await tab.click()
135
+ // タブが実際に選択状態へ切り替わったことを確認してから本文ロードを待つ。
136
+ await expect(tab).toHaveAttribute('aria-selected', 'true')
137
+ await page.waitForLoadState('networkidle')
138
+ }
139
+
140
+ test.describe.serial('README / docs 用スクリーンショット撮影', () => {
141
+ for (const lang of ['ja', 'en'] as const) {
142
+ test.describe(`lang=${lang}`, () => {
143
+ test.beforeEach(async ({ page }) => {
144
+ await clearViewerSettings(page)
145
+ })
146
+
147
+ // hero: ヘッダー+銘柄アトラスが収まる縦長 viewport
148
+ test('browse', async ({ page }) => {
149
+ await gotoBrowse(page)
150
+ await setLang(page, lang)
151
+ await captureViewport(page, lang, 'browse', 1180)
152
+ })
153
+
154
+ // detail: 「エクイティ & ドローダウン」カード(タイトル+チャート)をクロップ
155
+ test('detail', async ({ page }) => {
156
+ await gotoDetail(page, STRATEGY_ID)
157
+ await setLang(page, lang)
158
+ // backtest-equity-chart-tv の親 div = セクションラベル+エクイティチャート
159
+ // (issue #231 以降は TV レンダラが既定)
160
+ const equitySection = page.getByTestId('backtest-equity-chart-tv').locator('..')
161
+ await captureElement(page, lang, 'detail', equitySection, 280)
162
+ })
163
+
164
+ // strategy: 戦略構造カード群(パラメータ/指標/ルール)
165
+ test('detail-strategy', async ({ page }) => {
166
+ await gotoDetail(page, STRATEGY_ID)
167
+ await setLang(page, lang)
168
+ await openDetailTab(page, '戦略構成', 'Strategy', lang)
169
+ await captureElement(page, lang, 'strategy', page.getByTestId('strategy-screen'))
170
+ })
171
+
172
+ // optimize: 最適化トライアル分析(パラメータ感度散布図+上位トライアル)
173
+ test('detail-optimize', async ({ page }) => {
174
+ await gotoDetail(page, OPTIMIZE_STRATEGY_ID)
175
+ await setLang(page, lang)
176
+ await openDetailTab(page, '最適化', 'Optimize', lang)
177
+ await captureElement(page, lang, 'optimize', page.getByTestId('optimize-screen'), 400)
178
+ })
179
+
180
+ // compare(主): 正規化エクイティ+指標比較
181
+ test('compare', async ({ page }) => {
182
+ await gotoCompare(page, COMPARE_IDS)
183
+ await setLang(page, lang)
184
+ await captureElement(page, lang, 'compare', page.getByTestId('compare-main-grid'))
185
+ })
186
+
187
+ // compare(相関ヒートマップ): README 採用検討用に別撮り
188
+ test('compare-heatmap', async ({ page }) => {
189
+ await gotoCompare(page, COMPARE_IDS)
190
+ await setLang(page, lang)
191
+ await captureElement(
192
+ page,
193
+ lang,
194
+ // testid はラベル div に付くため、親 Card(ラベル+説明+ヒートマップ本体)を撮る
195
+ 'compare-heatmap',
196
+ page.getByTestId('correlation-heatmap-card').locator('..'),
197
+ 240,
198
+ )
199
+ })
200
+
201
+ // ideas: 既存どおりページ全体(README 未掲載)
202
+ test('ideas', async ({ page }) => {
203
+ await page.goto('/ideas')
204
+ await setLang(page, lang)
205
+ const filePath = resolve(SCREENSHOT_DIR, lang, 'ideas.png')
206
+ await ensureDir(filePath)
207
+ await settle(page)
208
+ await page.screenshot({ path: filePath })
209
+ })
210
+ })
211
+ }
212
+ })
@@ -39,7 +39,9 @@ test.describe.serial('lightweight-charts (TV) 用スクリーンショット', (
39
39
  }
40
40
 
41
41
  test('backtest-tv (ja, gotoDetail helper)', async ({ page }) => {
42
- // gotoDetail を経由しても feature flag が ON のまま維持されることの回帰確認
42
+ // gotoDetail を経由しても feature flag が ON のまま維持されることの回帰確認。
43
+ // renderer-mode バッジは issue #231 以降 ?tv クエリ無しの本番ビルドでは
44
+ // 表示されないため、TV チャート本体の testid で検証する。
43
45
  await clearViewerSettings(page)
44
46
  await page.addInitScript(() => {
45
47
  try {
@@ -50,6 +52,6 @@ test.describe.serial('lightweight-charts (TV) 用スクリーンショット', (
50
52
  })
51
53
  await gotoDetail(page, STRATEGY_ID)
52
54
  await page.waitForLoadState('networkidle')
53
- await page.getByTestId('renderer-mode').waitFor({ state: 'visible' })
55
+ await page.locator('[data-testid="backtest-equity-chart-tv"]').waitFor({ state: 'visible' })
54
56
  })
55
57
  })
@@ -11,10 +11,11 @@ test.describe('Compare スモーク', () => {
11
11
 
12
12
  await expect(page.getByTestId('compare-main-grid')).toBeVisible()
13
13
 
14
- const chart = page.getByLabel(/Compare equity chart, 2 strategies/)
14
+ // issue #231 以降は TV レンダラが既定(canvas 描画)
15
+ const chart = page.getByTestId('compare-equity-tv')
15
16
  await expect(chart).toBeVisible()
16
- // visx SVG パスが少なくとも 1 本描画されていること
17
- await expect(chart.locator('path').first()).toBeVisible()
17
+ await expect(chart.getByLabel(/Compare equity chart, 2 strategies/)).toBeVisible()
18
+ await expect(chart.locator('canvas').first()).toBeVisible()
18
19
 
19
20
  const table = page.getByTestId('compare-table')
20
21
  await expect(table).toBeVisible()
@@ -9,9 +9,9 @@ test.describe('Detail スモーク', () => {
9
9
  test('sma_cross の主要タブを順次切り替えられる', async ({ page }) => {
10
10
  await gotoDetail(page, 'sma_cross')
11
11
 
12
- // backtest タブ(既定)
12
+ // backtest タブ(既定)— issue #231 以降は TV レンダラが既定
13
13
  await expect(page.getByTestId('backtest-screen')).toBeVisible()
14
- await expect(page.getByTestId('backtest-equity-chart')).toBeVisible()
14
+ await expect(page.getByTestId('backtest-equity-chart-tv')).toBeVisible()
15
15
 
16
16
  // IS / OOS タブ
17
17
  await page.getByRole('tab', { name: 'IS / OOS' }).click()
@@ -36,4 +36,11 @@ test.describe('Detail スモーク', () => {
36
36
  await page.getByRole('tab', { name: /最適化|Optimize/ }).click()
37
37
  await expect(page.getByTestId('optimize-screen')).toBeVisible()
38
38
  })
39
+
40
+ test('?tv=0 で visx レンダラに fallback できる', async ({ page }) => {
41
+ // issue #231: TV 既定化後も visx を opt-out 経路として維持していることの回帰確認
42
+ await page.goto('/detail/sma_cross?tv=0')
43
+ await expect(page.getByTestId('backtest-equity-chart')).toBeVisible()
44
+ await expect(page.getByTestId('backtest-equity-chart-tv')).not.toBeVisible()
45
+ })
39
46
  })