alpha-visualizer 0.7.1__tar.gz → 0.7.2__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 (489) hide show
  1. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/.github/workflows/ci.yml +70 -7
  2. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/.github/workflows/lighthouse.yml +1 -1
  3. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/.github/workflows/release.yml +6 -1
  4. alpha_visualizer-0.7.2/.hypothesis/constants/296b8092179c9f55 +4 -0
  5. alpha_visualizer-0.7.1/.hypothesis/constants/94f1f85ed364d969 → alpha_visualizer-0.7.2/.hypothesis/constants/65993953f7ccf191 +1 -1
  6. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/CHANGELOG.md +45 -0
  7. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/PKG-INFO +5 -1
  8. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/README.en.md +4 -0
  9. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/README.md +4 -0
  10. alpha_visualizer-0.7.2/docs/screenshots/en/browse.png +0 -0
  11. alpha_visualizer-0.7.2/docs/screenshots/en/compare-heatmap.png +0 -0
  12. alpha_visualizer-0.7.2/docs/screenshots/en/compare.png +0 -0
  13. alpha_visualizer-0.7.2/docs/screenshots/en/detail.png +0 -0
  14. alpha_visualizer-0.7.2/docs/screenshots/en/optimize.png +0 -0
  15. alpha_visualizer-0.7.2/docs/screenshots/en/strategy.png +0 -0
  16. alpha_visualizer-0.7.2/docs/screenshots/ja/browse.png +0 -0
  17. alpha_visualizer-0.7.2/docs/screenshots/ja/compare-heatmap.png +0 -0
  18. alpha_visualizer-0.7.2/docs/screenshots/ja/compare.png +0 -0
  19. alpha_visualizer-0.7.2/docs/screenshots/ja/detail.png +0 -0
  20. alpha_visualizer-0.7.2/docs/screenshots/ja/optimize.png +0 -0
  21. alpha_visualizer-0.7.2/docs/screenshots/ja/strategy.png +0 -0
  22. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/e2e/fixtures/forge/data/results/backtest_results.db +0 -0
  23. alpha_visualizer-0.7.2/frontend/e2e/screenshots/capture.spec.ts +211 -0
  24. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/api/types.ts +25 -0
  25. alpha_visualizer-0.7.2/frontend/src/components/live/LivePositionView.tsx +162 -0
  26. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/components/live/LiveTab.tsx +16 -66
  27. alpha_visualizer-0.7.2/frontend/src/components/live/SummaryCard.tsx +80 -0
  28. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/components/live/__tests__/LiveTab.test.tsx +110 -0
  29. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/components/live/format.ts +4 -1
  30. alpha_visualizer-0.7.2/frontend/src/hooks/useLiveList.ts +37 -0
  31. alpha_visualizer-0.7.2/frontend/src/pages/LivePage.tsx +64 -0
  32. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/router.tsx +4 -0
  33. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/screens/BrowseScreen.tsx +22 -17
  34. alpha_visualizer-0.7.2/frontend/src/screens/LiveScreen.stories.tsx +49 -0
  35. alpha_visualizer-0.7.2/frontend/src/screens/LiveScreen.tsx +204 -0
  36. alpha_visualizer-0.7.2/frontend/src/screens/__tests__/LiveScreen.test.tsx +111 -0
  37. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/pyproject.toml +11 -2
  38. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/samples/sample-forge/data/results/backtest_results.db +0 -0
  39. alpha_visualizer-0.7.2/scripts/compare_sqlite_dump.py +66 -0
  40. alpha_visualizer-0.7.2/scripts/verify_build_artifacts.py +93 -0
  41. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/src/alpha_visualizer/__init__.py +1 -1
  42. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/src/alpha_visualizer/app.py +11 -1
  43. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/src/alpha_visualizer/cli.py +5 -2
  44. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/src/alpha_visualizer/forge_config.py +30 -5
  45. alpha_visualizer-0.7.2/src/alpha_visualizer/static/assets/BrowsePage-B7NJWk-W.js +2 -0
  46. alpha_visualizer-0.7.2/src/alpha_visualizer/static/assets/BrowsePage-B7NJWk-W.js.map +1 -0
  47. alpha_visualizer-0.7.2/src/alpha_visualizer/static/assets/ComparePage-Brk6b7s3.js +2 -0
  48. alpha_visualizer-0.7.2/src/alpha_visualizer/static/assets/ComparePage-Brk6b7s3.js.map +1 -0
  49. alpha_visualizer-0.7.2/src/alpha_visualizer/static/assets/DetailPage-RbPDGMb3.js +2 -0
  50. alpha_visualizer-0.7.2/src/alpha_visualizer/static/assets/DetailPage-RbPDGMb3.js.map +1 -0
  51. alpha_visualizer-0.7.2/src/alpha_visualizer/static/assets/IdeasPage-BEPzOoeJ.js +2 -0
  52. alpha_visualizer-0.7.2/src/alpha_visualizer/static/assets/IdeasPage-BEPzOoeJ.js.map +1 -0
  53. alpha_visualizer-0.7.2/src/alpha_visualizer/static/assets/LivePage-DeKnCzqb.js +2 -0
  54. alpha_visualizer-0.7.2/src/alpha_visualizer/static/assets/LivePage-DeKnCzqb.js.map +1 -0
  55. alpha_visualizer-0.7.2/src/alpha_visualizer/static/assets/LiveTab-B9tKV9zX.js +2 -0
  56. alpha_visualizer-0.7.2/src/alpha_visualizer/static/assets/LiveTab-B9tKV9zX.js.map +1 -0
  57. alpha_visualizer-0.7.2/src/alpha_visualizer/static/assets/SettingsToggles-CM8XnjQC.js +2 -0
  58. alpha_visualizer-0.7.2/src/alpha_visualizer/static/assets/SettingsToggles-CM8XnjQC.js.map +1 -0
  59. alpha_visualizer-0.7.2/src/alpha_visualizer/static/assets/Sparkline-BcO_EWxr.js +2 -0
  60. alpha_visualizer-0.7.2/src/alpha_visualizer/static/assets/Sparkline-BcO_EWxr.js.map +1 -0
  61. alpha_visualizer-0.7.2/src/alpha_visualizer/static/assets/featureFlags-A2oZeWlh.js +3 -0
  62. alpha_visualizer-0.7.2/src/alpha_visualizer/static/assets/featureFlags-A2oZeWlh.js.map +1 -0
  63. alpha_visualizer-0.7.2/src/alpha_visualizer/static/assets/fonts-DJsrEZjK.css +1 -0
  64. alpha_visualizer-0.7.2/src/alpha_visualizer/static/assets/format-D00KW3px.js +2 -0
  65. alpha_visualizer-0.7.2/src/alpha_visualizer/static/assets/format-D00KW3px.js.map +1 -0
  66. alpha_visualizer-0.7.2/src/alpha_visualizer/static/assets/index-Cbl7J_5s.css +1 -0
  67. alpha_visualizer-0.7.2/src/alpha_visualizer/static/assets/index-Drd2-lJN.js +6 -0
  68. alpha_visualizer-0.7.2/src/alpha_visualizer/static/assets/index-Drd2-lJN.js.map +1 -0
  69. alpha_visualizer-0.7.2/src/alpha_visualizer/static/assets/inter-tight-latin-400-normal-BLrFJfvD.woff +0 -0
  70. alpha_visualizer-0.7.2/src/alpha_visualizer/static/assets/inter-tight-latin-400-normal-iW8qmuJY.woff2 +0 -0
  71. alpha_visualizer-0.7.2/src/alpha_visualizer/static/assets/inter-tight-latin-500-normal-BFXNXuvF.woff2 +0 -0
  72. alpha_visualizer-0.7.2/src/alpha_visualizer/static/assets/inter-tight-latin-500-normal-pobXraBK.woff +0 -0
  73. alpha_visualizer-0.7.2/src/alpha_visualizer/static/assets/inter-tight-latin-600-normal-BgSTtRxb.woff2 +0 -0
  74. alpha_visualizer-0.7.2/src/alpha_visualizer/static/assets/inter-tight-latin-600-normal-D7bG6gX1.woff +0 -0
  75. alpha_visualizer-0.7.2/src/alpha_visualizer/static/assets/jetbrains-mono-latin-500-normal-BWZEU5yA.woff2 +0 -0
  76. alpha_visualizer-0.7.2/src/alpha_visualizer/static/assets/jetbrains-mono-latin-500-normal-CJOVTJB7.woff +0 -0
  77. alpha_visualizer-0.7.2/src/alpha_visualizer/static/assets/react-cUP_GJAW.js +10 -0
  78. alpha_visualizer-0.7.2/src/alpha_visualizer/static/assets/react-cUP_GJAW.js.map +1 -0
  79. alpha_visualizer-0.7.2/src/alpha_visualizer/static/assets/rolldown-runtime-DDdRRPPX.js +1 -0
  80. alpha_visualizer-0.7.2/src/alpha_visualizer/static/assets/source-serif-4-latin-600-normal-DMD1h6_f.woff +0 -0
  81. alpha_visualizer-0.7.2/src/alpha_visualizer/static/assets/source-serif-4-latin-600-normal-DouSKlru.woff2 +0 -0
  82. alpha_visualizer-0.7.2/src/alpha_visualizer/static/assets/tv-rsB_oRi5.js +2 -0
  83. alpha_visualizer-0.7.2/src/alpha_visualizer/static/assets/tv-rsB_oRi5.js.map +1 -0
  84. alpha_visualizer-0.7.2/src/alpha_visualizer/static/assets/useBacktestData-BehdHkgb.js +2 -0
  85. alpha_visualizer-0.7.2/src/alpha_visualizer/static/assets/useBacktestData-BehdHkgb.js.map +1 -0
  86. alpha_visualizer-0.7.2/src/alpha_visualizer/static/assets/visx-D9BH_cru.js +2 -0
  87. alpha_visualizer-0.7.2/src/alpha_visualizer/static/assets/visx-D9BH_cru.js.map +1 -0
  88. alpha_visualizer-0.7.2/src/alpha_visualizer/static/favicon.svg +1 -0
  89. alpha_visualizer-0.7.2/src/alpha_visualizer/static/icons.svg +24 -0
  90. alpha_visualizer-0.7.2/src/alpha_visualizer/static/index.html +53 -0
  91. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/tests/fixtures/build_e2e_fixture.py +23 -11
  92. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/tests/test_app.py +53 -0
  93. alpha_visualizer-0.7.2/tests/test_compare_sqlite_dump.py +81 -0
  94. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/tests/test_forge_config.py +41 -3
  95. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/uv.lock +1 -1
  96. alpha_visualizer-0.7.1/docs/screenshots/en/browse.png +0 -0
  97. alpha_visualizer-0.7.1/docs/screenshots/en/compare.png +0 -0
  98. alpha_visualizer-0.7.1/docs/screenshots/en/detail.png +0 -0
  99. alpha_visualizer-0.7.1/docs/screenshots/en/optimize.png +0 -0
  100. alpha_visualizer-0.7.1/docs/screenshots/en/strategy.png +0 -0
  101. alpha_visualizer-0.7.1/docs/screenshots/ja/browse.png +0 -0
  102. alpha_visualizer-0.7.1/docs/screenshots/ja/compare.png +0 -0
  103. alpha_visualizer-0.7.1/docs/screenshots/ja/detail.png +0 -0
  104. alpha_visualizer-0.7.1/docs/screenshots/ja/optimize.png +0 -0
  105. alpha_visualizer-0.7.1/docs/screenshots/ja/strategy.png +0 -0
  106. alpha_visualizer-0.7.1/frontend/e2e/screenshots/capture.spec.ts +0 -113
  107. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/.agents/skills/source-command-audit-licenses/SKILL.md +0 -0
  108. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/.agents/skills/source-command-pre-release/SKILL.md +0 -0
  109. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/.claude/commands/audit-licenses.md +0 -0
  110. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/.claude/commands/pre-release.md +0 -0
  111. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/.codex/hooks.json +0 -0
  112. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  113. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/.github/ISSUE_TEMPLATE/bug_report_ja.yml +0 -0
  114. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  115. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  116. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/.github/ISSUE_TEMPLATE/feature_request_ja.yml +0 -0
  117. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  118. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/.github/codeql/README.md +0 -0
  119. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/.github/codeql/codeql-config.yml +0 -0
  120. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/.github/dependabot.yml +0 -0
  121. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/.github/workflows/codeql.yml +0 -0
  122. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/.gitignore +0 -0
  123. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/.hypothesis/.gitignore +0 -0
  124. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/.hypothesis/constants/0bf3463e8f4751b8 +0 -0
  125. /alpha_visualizer-0.7.1/.hypothesis/constants/dd2b62c354789905 → /alpha_visualizer-0.7.2/.hypothesis/constants/0f38aca28193156b +0 -0
  126. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/.hypothesis/constants/10d56fd11d90e91d +0 -0
  127. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/.hypothesis/constants/2826595e28fa870a +0 -0
  128. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/.hypothesis/constants/291dc4c40995bea6 +0 -0
  129. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/.hypothesis/constants/312a7aaf12a1fd47 +0 -0
  130. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/.hypothesis/constants/331e194303817b32 +0 -0
  131. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/.hypothesis/constants/368f2bae545df6be +0 -0
  132. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/.hypothesis/constants/3f7b61d4b4a660e1 +0 -0
  133. /alpha_visualizer-0.7.1/.hypothesis/constants/11405f641e79317e → /alpha_visualizer-0.7.2/.hypothesis/constants/43f703bafb1e4b04 +0 -0
  134. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/.hypothesis/constants/4577b97f57a8a832 +0 -0
  135. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/.hypothesis/constants/4726660442f99a00 +0 -0
  136. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/.hypothesis/constants/4a1c4d1532cab28e +0 -0
  137. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/.hypothesis/constants/508b282112ab038e +0 -0
  138. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/.hypothesis/constants/757b1f8305546439 +0 -0
  139. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/.hypothesis/constants/7d3b67d825fc154a +0 -0
  140. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/.hypothesis/constants/7f90c9d611001617 +0 -0
  141. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/.hypothesis/constants/828ed73d45fcee28 +0 -0
  142. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/.hypothesis/constants/82e279d41edd645d +0 -0
  143. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/.hypothesis/constants/89aaa48f251cd53d +0 -0
  144. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/.hypothesis/constants/89d70ebe84c5b2b7 +0 -0
  145. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/.hypothesis/constants/8add761403393fca +0 -0
  146. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/.hypothesis/constants/90fccc12da2fa6c9 +0 -0
  147. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/.hypothesis/constants/96ca93165140d446 +0 -0
  148. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/.hypothesis/constants/97982d8e7c8d4a95 +0 -0
  149. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/.hypothesis/constants/a636a4647020033d +0 -0
  150. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/.hypothesis/constants/ab4df659c6b192db +0 -0
  151. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/.hypothesis/constants/b76328deebb21ae6 +0 -0
  152. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/.hypothesis/constants/b9ff5bcd3a53e3a7 +0 -0
  153. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/.hypothesis/constants/bd75c3c18e8ba4f4 +0 -0
  154. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/.hypothesis/constants/c5349cb90ddc7968 +0 -0
  155. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/.hypothesis/constants/c5f6cf064ffb412d +0 -0
  156. /alpha_visualizer-0.7.1/.hypothesis/constants/aadcc0d08f3b7739 → /alpha_visualizer-0.7.2/.hypothesis/constants/cd09731f3dfbf59f +0 -0
  157. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/.hypothesis/constants/d4cc884f331eee77 +0 -0
  158. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/.hypothesis/constants/da39a3ee5e6b4b0d +0 -0
  159. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/.hypothesis/constants/e44a457d795e56c2 +0 -0
  160. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/.hypothesis/constants/ea2d606acbfff989 +0 -0
  161. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/.hypothesis/constants/ee487c54cd5ca7dc +0 -0
  162. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/.hypothesis/constants/eed5e66c16ae84b8 +0 -0
  163. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/.hypothesis/constants/f2f91c7f9b44111d +0 -0
  164. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/.hypothesis/constants/f7c4a04c97c0daf8 +0 -0
  165. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/.hypothesis/constants/f7f9c6b3c86f63a8 +0 -0
  166. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/.hypothesis/constants/fa443af6269a6e02 +0 -0
  167. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/.hypothesis/constants/fe325b4404aa1121 +0 -0
  168. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/.hypothesis/constants/ff4517cbfe51fea1 +0 -0
  169. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/AGENTS.md +0 -0
  170. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/CLAUDE.md +0 -0
  171. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/CODE_OF_CONDUCT.en.md +0 -0
  172. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/CODE_OF_CONDUCT.md +0 -0
  173. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/CONTRIBUTING.en.md +0 -0
  174. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/CONTRIBUTING.md +0 -0
  175. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/LICENSE +0 -0
  176. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/NOTICE +0 -0
  177. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/SECURITY.en.md +0 -0
  178. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/SECURITY.md +0 -0
  179. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/THIRDPARTY_LICENSES.txt +0 -0
  180. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/cliff.toml +0 -0
  181. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/docs/adr/0001-pages-vs-screens.md +0 -0
  182. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/docs/adr/0002-charts-visx-vs-components.md +0 -0
  183. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/docs/adr/0003-openapi-typescript-codegen.md +0 -0
  184. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/docs/adr/0004-condition-node-discriminated-union.md +0 -0
  185. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/docs/lighthouse-ci.md +0 -0
  186. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/docs/screenshots/en/ideas.png +0 -0
  187. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/docs/screenshots/en/strategy-signal-tv.png +0 -0
  188. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/docs/screenshots/ja/ideas.png +0 -0
  189. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/docs/screenshots/ja/strategy-signal-tv.png +0 -0
  190. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/.gitignore +0 -0
  191. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/.npmrc +0 -0
  192. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/.size-limit.json +0 -0
  193. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/.storybook/main.ts +0 -0
  194. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/.storybook/preview.ts +0 -0
  195. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/CLAUDE.md +0 -0
  196. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/README.md +0 -0
  197. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/THIRDPARTY_FONTS.md +0 -0
  198. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/e2e/fixtures/README.md +0 -0
  199. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/e2e/fixtures/forge/data/historical/SPY_1d.parquet +0 -0
  200. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/e2e/fixtures/forge/data/ideas/ideas.json +0 -0
  201. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/e2e/fixtures/forge/data/strategies/momo_breakout.json +0 -0
  202. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/e2e/fixtures/forge/data/strategies/rsi_reversal.json +0 -0
  203. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/e2e/fixtures/forge/data/strategies/sma_cross.json +0 -0
  204. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/e2e/fixtures/forge/forge.yaml +0 -0
  205. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/e2e/helpers/locators.ts +0 -0
  206. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/e2e/samples/sample-fixture.spec.ts +0 -0
  207. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/e2e/screenshots/equity-tv.spec.ts +0 -0
  208. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/e2e/screenshots/strategy-signal-tv.spec.ts +0 -0
  209. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/e2e/specs/browse.spec.ts +0 -0
  210. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/e2e/specs/compare.spec.ts +0 -0
  211. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/e2e/specs/detail.spec.ts +0 -0
  212. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/e2e/specs/i18n.spec.ts +0 -0
  213. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/eslint.config.js +0 -0
  214. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/index.html +0 -0
  215. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/openapi.json +0 -0
  216. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/package.json +0 -0
  217. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/playwright.config.ts +0 -0
  218. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/playwright.samples.config.ts +0 -0
  219. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/playwright.screenshots.config.ts +0 -0
  220. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/pnpm-lock.yaml +0 -0
  221. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/pnpm-workspace.yaml +0 -0
  222. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/public/favicon.svg +0 -0
  223. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/public/icons.svg +0 -0
  224. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/api/__tests__/client.test.ts +0 -0
  225. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/api/client.ts +0 -0
  226. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/api/types.gen.ts +0 -0
  227. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/charts/tv/CompareEquityTV.stories.tsx +0 -0
  228. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/charts/tv/CompareEquityTV.tsx +0 -0
  229. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/charts/tv/EquityDrawdownPaneTV.stories.tsx +0 -0
  230. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/charts/tv/EquityDrawdownPaneTV.tsx +0 -0
  231. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/charts/tv/RollingMetricsChartTV.stories.tsx +0 -0
  232. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/charts/tv/RollingMetricsChartTV.tsx +0 -0
  233. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/charts/tv/StrategySignalChartTV.stories.tsx +0 -0
  234. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/charts/tv/StrategySignalChartTV.tsx +0 -0
  235. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/charts/tv/WFOEquityTV.stories.tsx +0 -0
  236. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/charts/tv/WFOEquityTV.tsx +0 -0
  237. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/charts/tv/__tests__/CompareEquityTV.test.tsx +0 -0
  238. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/charts/tv/__tests__/EquityDrawdownPaneTV.test.tsx +0 -0
  239. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/charts/tv/__tests__/RollingMetricsChartTV.test.tsx +0 -0
  240. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/charts/tv/__tests__/StrategySignalChartTV.test.tsx +0 -0
  241. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/charts/tv/__tests__/WFOEquityTV.test.tsx +0 -0
  242. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/charts/tv/__tests__/data.test.ts +0 -0
  243. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/charts/tv/__tests__/theme.test.ts +0 -0
  244. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/charts/tv/__tests__/trades.test.ts +0 -0
  245. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/charts/tv/data.ts +0 -0
  246. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/charts/tv/theme.ts +0 -0
  247. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/charts/tv/trades.ts +0 -0
  248. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/charts/visx/AnnualReturnsBarV.tsx +0 -0
  249. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/charts/visx/CompareEquityV.tsx +0 -0
  250. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/charts/visx/CorrelationHeatmapV.tsx +0 -0
  251. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/charts/visx/DrawdownChartV.tsx +0 -0
  252. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/charts/visx/EquityChartV.tsx +0 -0
  253. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/charts/visx/MAEMFEScatterV.tsx +0 -0
  254. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/charts/visx/MonthlyHeatmapV.tsx +0 -0
  255. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/charts/visx/OptimizeScatterV.tsx +0 -0
  256. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/charts/visx/Sparkline.stories.tsx +0 -0
  257. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/charts/visx/Sparkline.tsx +0 -0
  258. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/charts/visx/__tests__/EquityChartV.regime.test.ts +0 -0
  259. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/charts/visx/regimeBands.ts +0 -0
  260. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/components/CommandPalette.tsx +0 -0
  261. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/components/DetailToolbar.tsx +0 -0
  262. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/components/MetricsSummaryBarV2.stories.tsx +0 -0
  263. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/components/MetricsSummaryBarV2.tsx +0 -0
  264. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/components/RootLayout.tsx +0 -0
  265. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/components/SettingsToggles.tsx +0 -0
  266. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/components/StrategyHero.tsx +0 -0
  267. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/components/__tests__/CommandPalette.test.tsx +0 -0
  268. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/components/__tests__/CorrelationHeatmap.test.tsx +0 -0
  269. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/components/__tests__/responsive-styles.test.tsx +0 -0
  270. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/components/browser/CompareFloatingBar.tsx +0 -0
  271. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/components/browser/FilterBar.tsx +0 -0
  272. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/components/browser/GroupByToggle.tsx +0 -0
  273. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/components/browser/Heroline.tsx +0 -0
  274. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/components/browser/RunHistoryTab.tsx +0 -0
  275. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/components/browser/SavedViews.tsx +0 -0
  276. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/components/browser/StrategySlidePanel.tsx +0 -0
  277. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/components/browser/StrategyTable.tsx +0 -0
  278. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/components/browser/SymbolAtlas.tsx +0 -0
  279. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/components/browser/SymbolCard.tsx +0 -0
  280. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/components/charts/AnnualReturnsBar.tsx +0 -0
  281. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/components/charts/CorrelationHeatmap.tsx +0 -0
  282. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/components/charts/DrawdownDetailChart.tsx +0 -0
  283. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/components/charts/MAEMFEScatter.tsx +0 -0
  284. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/components/charts/MonteCarloChart.tsx +0 -0
  285. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/components/charts/OptimizeScatter.tsx +0 -0
  286. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/components/charts/ReturnDistributionChart.tsx +0 -0
  287. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/components/charts/RollingMetricsChart.tsx +0 -0
  288. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/components/charts/VaRChart.tsx +0 -0
  289. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/components/charts/WFOTimeline.tsx +0 -0
  290. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/components/charts/WeekdayPerformanceChart.tsx +0 -0
  291. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/components/live/__tests__/format.test.ts +0 -0
  292. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/components/metrics/CompareTable.tsx +0 -0
  293. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/components/metrics/ISOOSMetrics.tsx +0 -0
  294. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/components/metrics/MetricsGrid.tsx +0 -0
  295. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/components/metrics/RegimeBreakdownCards.tsx +0 -0
  296. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/components/metrics/SignalQualityBadge.tsx +0 -0
  297. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/components/metrics/__tests__/evaluateGood.test.ts +0 -0
  298. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/components/metrics/evaluate.ts +0 -0
  299. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/components/nav.ts +0 -0
  300. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/components/trades/TradeTable.tsx +0 -0
  301. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/constants/featureFlags.ts +0 -0
  302. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/constants/metricDefinitions.ts +0 -0
  303. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/contexts/DashboardContext.tsx +0 -0
  304. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/contexts/dashboardConstants.ts +0 -0
  305. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/design/a11y.css +0 -0
  306. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/design/primitives/Button.tsx +0 -0
  307. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/design/primitives/Card.tsx +0 -0
  308. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/design/primitives/Chip.tsx +0 -0
  309. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/design/primitives/Divider.tsx +0 -0
  310. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/design/primitives/KeyValue.tsx +0 -0
  311. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/design/primitives/OverflowMenu.tsx +0 -0
  312. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/design/primitives/Pill.stories.tsx +0 -0
  313. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/design/primitives/Pill.tsx +0 -0
  314. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/design/primitives/SectionHeader.tsx +0 -0
  315. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/design/primitives/Stat.stories.tsx +0 -0
  316. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/design/primitives/Stat.tsx +0 -0
  317. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/design/primitives/TabBar.tsx +0 -0
  318. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/design/primitives/Toolbar.tsx +0 -0
  319. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/design/primitives/__tests__/OverflowMenu.test.tsx +0 -0
  320. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/design/primitives/index.ts +0 -0
  321. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/design/tokens.css +0 -0
  322. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/design/useChartTheme.ts +0 -0
  323. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/hooks/__tests__/useEquityViewport.test.ts +0 -0
  324. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/hooks/__tests__/useFetchByKey.test.ts +0 -0
  325. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/hooks/__tests__/useScrollRestoration.test.tsx +0 -0
  326. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/hooks/__tests__/useStrategyHistorical.test.tsx +0 -0
  327. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/hooks/__tests__/useStrategyList.test.tsx +0 -0
  328. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/hooks/__tests__/useTheme.test.tsx +0 -0
  329. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/hooks/useBacktestData.ts +0 -0
  330. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/hooks/useDebounce.ts +0 -0
  331. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/hooks/useEquityViewport.ts +0 -0
  332. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/hooks/useFetchByKey.ts +0 -0
  333. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/hooks/useIdeasList.ts +0 -0
  334. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/hooks/useRecentStrategies.ts +0 -0
  335. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/hooks/useScrollRestoration.ts +0 -0
  336. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/hooks/useSparklineCache.ts +0 -0
  337. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/hooks/useStrategyHistorical.ts +0 -0
  338. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/hooks/useStrategyList.ts +0 -0
  339. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/hooks/useSymbolStats.ts +0 -0
  340. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/hooks/useTheme.ts +0 -0
  341. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/i18n/__tests__/strings.test.ts +0 -0
  342. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/i18n/strings.ts +0 -0
  343. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/lib/__tests__/correlation.test.ts +0 -0
  344. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/lib/__tests__/distribution.test.ts +0 -0
  345. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/lib/__tests__/drawdown.test.ts +0 -0
  346. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/lib/__tests__/format.test.ts +0 -0
  347. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/lib/__tests__/monteCarlo.properties.test.ts +0 -0
  348. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/lib/__tests__/monteCarlo.test.ts +0 -0
  349. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/lib/__tests__/rolling.test.ts +0 -0
  350. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/lib/__tests__/searchParams.test.ts +0 -0
  351. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/lib/__tests__/searchStrategies.test.ts +0 -0
  352. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/lib/__tests__/walkForward.test.ts +0 -0
  353. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/lib/__tests__/weekday.test.ts +0 -0
  354. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/lib/assetClass.ts +0 -0
  355. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/lib/correlation.ts +0 -0
  356. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/lib/csv.ts +0 -0
  357. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/lib/distribution.ts +0 -0
  358. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/lib/drawdown.ts +0 -0
  359. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/lib/exportPng.ts +0 -0
  360. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/lib/format.ts +0 -0
  361. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/lib/monteCarlo.ts +0 -0
  362. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/lib/rolling.ts +0 -0
  363. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/lib/searchParams.ts +0 -0
  364. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/lib/searchStrategies.ts +0 -0
  365. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/lib/walkForward.ts +0 -0
  366. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/lib/weekday.ts +0 -0
  367. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/main.tsx +0 -0
  368. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/mock/btData.ts +0 -0
  369. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/pages/BrowsePage.tsx +0 -0
  370. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/pages/ComparePage.tsx +0 -0
  371. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/pages/DetailPage.tsx +0 -0
  372. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/pages/IdeasPage.tsx +0 -0
  373. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/screens/BacktestScreen.stories.tsx +0 -0
  374. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/screens/BacktestScreen.tsx +0 -0
  375. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/screens/CompareScreen.stories.tsx +0 -0
  376. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/screens/CompareScreen.tsx +0 -0
  377. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/screens/ISOOSScreen.tsx +0 -0
  378. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/screens/IdeasScreen.stories.tsx +0 -0
  379. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/screens/IdeasScreen.tsx +0 -0
  380. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/screens/OptimizeScreen.stories.tsx +0 -0
  381. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/screens/OptimizeScreen.tsx +0 -0
  382. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/screens/StrategyScreen.tsx +0 -0
  383. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/screens/WFOScreen.stories.tsx +0 -0
  384. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/screens/WFOScreen.tsx +0 -0
  385. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/screens/strategy/SignalChartCard.tsx +0 -0
  386. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/test-setup.ts +0 -0
  387. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/tsconfig.app.json +0 -0
  388. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/tsconfig.e2e.json +0 -0
  389. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/tsconfig.json +0 -0
  390. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/tsconfig.node.json +0 -0
  391. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/vite.config.ts +0 -0
  392. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/lighthouserc.json +0 -0
  393. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/release.sh +0 -0
  394. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/samples/README.en.md +0 -0
  395. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/samples/README.md +0 -0
  396. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/samples/__init__.py +0 -0
  397. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/samples/_generators/__init__.py +0 -0
  398. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/samples/_generators/compatibility_matrix.py +0 -0
  399. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/samples/_generators/ideas_defs.py +0 -0
  400. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/samples/_generators/pseudo_backtest.py +0 -0
  401. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/samples/_generators/pseudo_grid.py +0 -0
  402. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/samples/_generators/pseudo_wfo.py +0 -0
  403. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/samples/_generators/strategy_defs.py +0 -0
  404. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/samples/_generators/synthetic_ohlcv.py +0 -0
  405. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/samples/_generators/writers.py +0 -0
  406. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/samples/build_samples.py +0 -0
  407. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/samples/sample-forge/data/ideas/ideas.json +0 -0
  408. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/samples/sample-forge/data/strategies/bbands_breakout_v1.json +0 -0
  409. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/samples/sample-forge/data/strategies/donchian_turtle_v1.json +0 -0
  410. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/samples/sample-forge/data/strategies/ema_adx_macd_v1.json +0 -0
  411. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/samples/sample-forge/data/strategies/macd_crossover_v1.json +0 -0
  412. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/samples/sample-forge/data/strategies/range_reversion_v1.json +0 -0
  413. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/samples/sample-forge/data/strategies/rsi_reversion_v1.json +0 -0
  414. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/samples/sample-forge/data/strategies/sma_crossover_v1.json +0 -0
  415. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/samples/sample-forge/data/strategies/supertrend_adx_v1.json +0 -0
  416. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/samples/sample-forge/forge.yaml +0 -0
  417. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/scripts/generate_openapi.py +0 -0
  418. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/src/alpha_visualizer/db.py +0 -0
  419. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/src/alpha_visualizer/dependencies.py +0 -0
  420. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/src/alpha_visualizer/errors.py +0 -0
  421. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/src/alpha_visualizer/log_sanitize.py +0 -0
  422. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/src/alpha_visualizer/repositories/__init__.py +0 -0
  423. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/src/alpha_visualizer/repositories/backtest_results.py +0 -0
  424. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/src/alpha_visualizer/repositories/ideas.py +0 -0
  425. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/src/alpha_visualizer/repositories/live.py +0 -0
  426. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/src/alpha_visualizer/repositories/optimization.py +0 -0
  427. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/src/alpha_visualizer/repositories/strategies.py +0 -0
  428. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/src/alpha_visualizer/routers/__init__.py +0 -0
  429. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/src/alpha_visualizer/routers/historical.py +0 -0
  430. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/src/alpha_visualizer/routers/ideas.py +0 -0
  431. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/src/alpha_visualizer/routers/live.py +0 -0
  432. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/src/alpha_visualizer/routers/optimize.py +0 -0
  433. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/src/alpha_visualizer/routers/results.py +0 -0
  434. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/src/alpha_visualizer/routers/run.py +0 -0
  435. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/src/alpha_visualizer/routers/strategies.py +0 -0
  436. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/src/alpha_visualizer/routers/wfo.py +0 -0
  437. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/src/alpha_visualizer/schemas/__init__.py +0 -0
  438. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/src/alpha_visualizer/schemas/historical.py +0 -0
  439. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/src/alpha_visualizer/schemas/ideas.py +0 -0
  440. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/src/alpha_visualizer/schemas/live.py +0 -0
  441. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/src/alpha_visualizer/schemas/optimize.py +0 -0
  442. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/src/alpha_visualizer/schemas/results.py +0 -0
  443. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/src/alpha_visualizer/schemas/strategies.py +0 -0
  444. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/src/alpha_visualizer/schemas/wfo.py +0 -0
  445. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/src/alpha_visualizer/services/__init__.py +0 -0
  446. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/src/alpha_visualizer/services/backtest.py +0 -0
  447. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/src/alpha_visualizer/services/historical.py +0 -0
  448. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/src/alpha_visualizer/services/live.py +0 -0
  449. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/src/alpha_visualizer/services/walk_forward.py +0 -0
  450. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/tests/__init__.py +0 -0
  451. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/tests/conftest.py +0 -0
  452. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/tests/factories.py +0 -0
  453. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/tests/repositories/__init__.py +0 -0
  454. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/tests/repositories/test_backtest_results_repo.py +0 -0
  455. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/tests/repositories/test_ideas_reader.py +0 -0
  456. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/tests/repositories/test_live_repo.py +0 -0
  457. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/tests/repositories/test_optimization_repo.py +0 -0
  458. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/tests/repositories/test_strategies_repo.py +0 -0
  459. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/tests/routers/__init__.py +0 -0
  460. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/tests/routers/test_forge_yaml_integration.py +0 -0
  461. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/tests/routers/test_historical.py +0 -0
  462. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/tests/routers/test_ideas.py +0 -0
  463. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/tests/routers/test_live.py +0 -0
  464. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/tests/routers/test_optimize.py +0 -0
  465. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/tests/routers/test_results.py +0 -0
  466. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/tests/routers/test_run.py +0 -0
  467. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/tests/routers/test_strategies.py +0 -0
  468. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/tests/routers/test_wfo.py +0 -0
  469. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/tests/samples/__init__.py +0 -0
  470. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/tests/samples/test_pseudo_backtest.py +0 -0
  471. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/tests/samples/test_pseudo_grid.py +0 -0
  472. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/tests/samples/test_pseudo_wfo.py +0 -0
  473. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/tests/samples/test_sample_forge.py +0 -0
  474. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/tests/samples/test_strategy_defs.py +0 -0
  475. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/tests/samples/test_synthetic_ohlcv.py +0 -0
  476. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/tests/samples/test_writers.py +0 -0
  477. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/tests/schemas/__init__.py +0 -0
  478. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/tests/schemas/test_schemas.py +0 -0
  479. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/tests/services/__init__.py +0 -0
  480. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/tests/services/test_backtest.py +0 -0
  481. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/tests/services/test_backtest_properties.py +0 -0
  482. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/tests/services/test_historical.py +0 -0
  483. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/tests/services/test_live.py +0 -0
  484. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/tests/services/test_wfo.py +0 -0
  485. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/tests/test_cli.py +0 -0
  486. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/tests/test_db.py +0 -0
  487. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/tests/test_dependencies.py +0 -0
  488. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/tests/test_errors.py +0 -0
  489. {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/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
@@ -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
@@ -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.2']
@@ -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.2
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,211 @@
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: 「エクイティ vs Buy&Hold」カード(タイトル+チャート)をクロップ
155
+ test('detail', async ({ page }) => {
156
+ await gotoDetail(page, STRATEGY_ID)
157
+ await setLang(page, lang)
158
+ // backtest-equity-chart の親 div = セクションラベル+エクイティチャート
159
+ const equitySection = page.getByTestId('backtest-equity-chart').locator('..')
160
+ await captureElement(page, lang, 'detail', equitySection, 280)
161
+ })
162
+
163
+ // strategy: 戦略構造カード群(パラメータ/指標/ルール)
164
+ test('detail-strategy', async ({ page }) => {
165
+ await gotoDetail(page, STRATEGY_ID)
166
+ await setLang(page, lang)
167
+ await openDetailTab(page, '戦略構成', 'Strategy', lang)
168
+ await captureElement(page, lang, 'strategy', page.getByTestId('strategy-screen'))
169
+ })
170
+
171
+ // optimize: 最適化トライアル分析(パラメータ感度散布図+上位トライアル)
172
+ test('detail-optimize', async ({ page }) => {
173
+ await gotoDetail(page, OPTIMIZE_STRATEGY_ID)
174
+ await setLang(page, lang)
175
+ await openDetailTab(page, '最適化', 'Optimize', lang)
176
+ await captureElement(page, lang, 'optimize', page.getByTestId('optimize-screen'), 400)
177
+ })
178
+
179
+ // compare(主): 正規化エクイティ+指標比較
180
+ test('compare', async ({ page }) => {
181
+ await gotoCompare(page, COMPARE_IDS)
182
+ await setLang(page, lang)
183
+ await captureElement(page, lang, 'compare', page.getByTestId('compare-main-grid'))
184
+ })
185
+
186
+ // compare(相関ヒートマップ): README 採用検討用に別撮り
187
+ test('compare-heatmap', async ({ page }) => {
188
+ await gotoCompare(page, COMPARE_IDS)
189
+ await setLang(page, lang)
190
+ await captureElement(
191
+ page,
192
+ lang,
193
+ // testid はラベル div に付くため、親 Card(ラベル+説明+ヒートマップ本体)を撮る
194
+ 'compare-heatmap',
195
+ page.getByTestId('correlation-heatmap-card').locator('..'),
196
+ 240,
197
+ )
198
+ })
199
+
200
+ // ideas: 既存どおりページ全体(README 未掲載)
201
+ test('ideas', async ({ page }) => {
202
+ await page.goto('/ideas')
203
+ await setLang(page, lang)
204
+ const filePath = resolve(SCREENSHOT_DIR, lang, 'ideas.png')
205
+ await ensureDir(filePath)
206
+ await settle(page)
207
+ await page.screenshot({ path: filePath })
208
+ })
209
+ })
210
+ }
211
+ })
@@ -334,6 +334,21 @@ export interface IdeaItem {
334
334
 
335
335
  // ===== Live (issue #57) =====
336
336
 
337
+ /**
338
+ * position ベース combine portfolio の live metrics
339
+ * (backend ``services/live.py`` の ``position_detail`` 互換)。
340
+ *
341
+ * ``max_drawdown_pct`` / ``volatility_pct`` は **正値**(大きいほど悪い)。
342
+ * trade 単位の ``LiveSummary.max_drawdown_pct``(負値)と符号規約が異なる点に注意。
343
+ */
344
+ export interface LivePositionMetrics {
345
+ total_return_pct?: number | null
346
+ cagr_pct?: number | null
347
+ sharpe_ratio?: number | null
348
+ max_drawdown_pct?: number | null
349
+ volatility_pct?: number | null
350
+ }
351
+
337
352
  /** LiveSummary: backend 側は ``LiveSection.summary: dict[str, unknown]`` のため手書き。 */
338
353
  export interface LiveSummary {
339
354
  strategy_id: string
@@ -351,6 +366,16 @@ export interface LiveSummary {
351
366
  total_commission?: number
352
367
  max_drawdown_pct?: number
353
368
  symbols?: string[]
369
+ /** 'position' = combine portfolio(``live_position_summaries`` 由来、#221) */
370
+ kind?: 'strategy' | 'position'
371
+ portfolio_id?: string | null
372
+ metrics?: LivePositionMetrics | null
373
+ backtest_metrics?: LivePositionMetrics | null
374
+ /** ``[[ISO 日時, equity 値], ...]`` の日次系列 */
375
+ equity?: [string, number][]
376
+ receipts_count?: number | null
377
+ sub_strategies?: string[]
378
+ updated_at?: string | null
354
379
  }
355
380
 
356
381
  /** LiveTrade: ``side: 'long' | 'short'`` に narrow(生成型は string)。 */