alpha-visualizer 1.3.1__tar.gz → 1.3.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 (689) hide show
  1. alpha_visualizer-1.3.1/.hypothesis/constants/ebf2f53d2c001658 → alpha_visualizer-1.3.2/.hypothesis/constants/64f671cc8bd3c7e4 +1 -1
  2. alpha_visualizer-1.3.1/.hypothesis/constants/627d8d6963823a6c → alpha_visualizer-1.3.2/.hypothesis/constants/a143537c99265376 +1 -1
  3. alpha_visualizer-1.3.1/.hypothesis/constants/04b2c2a699e215f4 → alpha_visualizer-1.3.2/.hypothesis/constants/e52ef865e1fc122f +1 -1
  4. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/CHANGELOG.md +9 -0
  5. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/PKG-INFO +1 -1
  6. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/openapi.json +1 -1
  7. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/pyproject.toml +2 -2
  8. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/src/alpha_visualizer/__init__.py +1 -1
  9. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/src/alpha_visualizer/routers/maintenance.py +6 -6
  10. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/src/alpha_visualizer/routers/run.py +6 -0
  11. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/src/alpha_visualizer/routers/strategies.py +6 -1
  12. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/src/alpha_visualizer/services/forge_cli.py +31 -0
  13. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/src/alpha_visualizer/services/jobs.py +9 -2
  14. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/tests/routers/test_maintenance.py +34 -0
  15. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/tests/routers/test_run.py +29 -0
  16. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/tests/routers/test_strategy_save.py +29 -0
  17. alpha_visualizer-1.3.2/tests/services/test_forge_failure_translation.py +60 -0
  18. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/tests/services/test_jobs.py +25 -0
  19. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/uv.lock +1 -1
  20. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/.agents/skills/source-command-audit-licenses/SKILL.md +0 -0
  21. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/.agents/skills/source-command-pre-release/SKILL.md +0 -0
  22. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/.claude/commands/audit-licenses.md +0 -0
  23. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/.claude/commands/pre-release.md +0 -0
  24. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/.codex/hooks.json +0 -0
  25. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  26. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/.github/ISSUE_TEMPLATE/bug_report_ja.yml +0 -0
  27. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  28. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  29. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/.github/ISSUE_TEMPLATE/feature_request_ja.yml +0 -0
  30. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  31. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/.github/codeql/README.md +0 -0
  32. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/.github/codeql/codeql-config.yml +0 -0
  33. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/.github/dependabot.yml +0 -0
  34. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/.github/workflows/ci.yml +0 -0
  35. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/.github/workflows/codeql.yml +0 -0
  36. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/.github/workflows/lighthouse.yml +0 -0
  37. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/.github/workflows/release.yml +0 -0
  38. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/.gitignore +0 -0
  39. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/.hypothesis/.gitignore +0 -0
  40. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/.hypothesis/constants/0bf3463e8f4751b8 +0 -0
  41. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/.hypothesis/constants/0caad6595136948b +0 -0
  42. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/.hypothesis/constants/184fa6728d185660 +0 -0
  43. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/.hypothesis/constants/296b8092179c9f55 +0 -0
  44. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/.hypothesis/constants/312a7aaf12a1fd47 +0 -0
  45. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/.hypothesis/constants/316886ef98081ce9 +0 -0
  46. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/.hypothesis/constants/331e194303817b32 +0 -0
  47. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/.hypothesis/constants/36df1978b70731f9 +0 -0
  48. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/.hypothesis/constants/43f703bafb1e4b04 +0 -0
  49. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/.hypothesis/constants/4577b97f57a8a832 +0 -0
  50. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/.hypothesis/constants/4726660442f99a00 +0 -0
  51. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/.hypothesis/constants/4a1c4d1532cab28e +0 -0
  52. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/.hypothesis/constants/4b255f25d1067b71 +0 -0
  53. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/.hypothesis/constants/4fd44198986300fe +0 -0
  54. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/.hypothesis/constants/508b282112ab038e +0 -0
  55. /alpha_visualizer-1.3.1/.hypothesis/constants/b3227e2cf0b90fa4 → /alpha_visualizer-1.3.2/.hypothesis/constants/5320b01940d4c4ce +0 -0
  56. /alpha_visualizer-1.3.1/.hypothesis/constants/0e92a16981d06d97 → /alpha_visualizer-1.3.2/.hypothesis/constants/59c16b30deb5c037 +0 -0
  57. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/.hypothesis/constants/5c80be020ed7a646 +0 -0
  58. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/.hypothesis/constants/5c9eb073058f11a0 +0 -0
  59. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/.hypothesis/constants/5fca39058ed3753e +0 -0
  60. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/.hypothesis/constants/6abf3e9a1356666c +0 -0
  61. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/.hypothesis/constants/707dd0d075295200 +0 -0
  62. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/.hypothesis/constants/757b1f8305546439 +0 -0
  63. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/.hypothesis/constants/7cea79ac6c0799bb +0 -0
  64. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/.hypothesis/constants/7f90c9d611001617 +0 -0
  65. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/.hypothesis/constants/8d9ea99caee79fd4 +0 -0
  66. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/.hypothesis/constants/906238816b505c1e +0 -0
  67. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/.hypothesis/constants/98d0c8b0e6532609 +0 -0
  68. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/.hypothesis/constants/99c8a89c4a9a7859 +0 -0
  69. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/.hypothesis/constants/9c2871fc1ddbab71 +0 -0
  70. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/.hypothesis/constants/a636a4647020033d +0 -0
  71. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/.hypothesis/constants/ab4df659c6b192db +0 -0
  72. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/.hypothesis/constants/acddbf8018c5d884 +0 -0
  73. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/.hypothesis/constants/af039261f357a5c1 +0 -0
  74. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/.hypothesis/constants/b5541576e1e9aea7 +0 -0
  75. /alpha_visualizer-1.3.1/.hypothesis/constants/7c9231be4d08456f → /alpha_visualizer-1.3.2/.hypothesis/constants/b6221357177fc116 +0 -0
  76. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/.hypothesis/constants/b9ff5bcd3a53e3a7 +0 -0
  77. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/.hypothesis/constants/bfd4c6ca4462fe73 +0 -0
  78. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/.hypothesis/constants/c4312fe8499bc1f7 +0 -0
  79. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/.hypothesis/constants/c5349cb90ddc7968 +0 -0
  80. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/.hypothesis/constants/d34317036474de6e +0 -0
  81. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/.hypothesis/constants/da39a3ee5e6b4b0d +0 -0
  82. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/.hypothesis/constants/dbe657c7851479a7 +0 -0
  83. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/.hypothesis/constants/e41b0128c49db70e +0 -0
  84. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/.hypothesis/constants/e44a457d795e56c2 +0 -0
  85. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/.hypothesis/constants/ea2d606acbfff989 +0 -0
  86. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/.hypothesis/constants/eed5e66c16ae84b8 +0 -0
  87. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/.hypothesis/constants/f7c4a04c97c0daf8 +0 -0
  88. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/.hypothesis/constants/fa443af6269a6e02 +0 -0
  89. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/.hypothesis/constants/fa54b8596401d232 +0 -0
  90. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/.hypothesis/constants/ff4517cbfe51fea1 +0 -0
  91. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/AGENTS.md +0 -0
  92. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/CLAUDE.md +0 -0
  93. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/CODE_OF_CONDUCT.en.md +0 -0
  94. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/CODE_OF_CONDUCT.md +0 -0
  95. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/CONTRIBUTING.en.md +0 -0
  96. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/CONTRIBUTING.md +0 -0
  97. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/LICENSE +0 -0
  98. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/NOTICE +0 -0
  99. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/README.en.md +0 -0
  100. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/README.md +0 -0
  101. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/SECURITY.en.md +0 -0
  102. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/SECURITY.md +0 -0
  103. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/THIRDPARTY_LICENSES.txt +0 -0
  104. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/cliff.toml +0 -0
  105. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/docs/adr/0001-pages-vs-screens.md +0 -0
  106. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/docs/adr/0002-charts-visx-vs-components.md +0 -0
  107. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/docs/adr/0003-openapi-typescript-codegen.md +0 -0
  108. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/docs/adr/0004-condition-node-discriminated-union.md +0 -0
  109. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/docs/lighthouse-ci.md +0 -0
  110. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/docs/screenshots/en/backtest-tv.png +0 -0
  111. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/docs/screenshots/en/browse.png +0 -0
  112. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/docs/screenshots/en/compare-heatmap.png +0 -0
  113. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/docs/screenshots/en/compare.png +0 -0
  114. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/docs/screenshots/en/detail.png +0 -0
  115. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/docs/screenshots/en/ideas.png +0 -0
  116. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/docs/screenshots/en/live.png +0 -0
  117. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/docs/screenshots/en/optimize.png +0 -0
  118. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/docs/screenshots/en/strategy-signal-tv.png +0 -0
  119. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/docs/screenshots/en/strategy.png +0 -0
  120. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/docs/screenshots/ja/backtest-tv.png +0 -0
  121. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/docs/screenshots/ja/browse.png +0 -0
  122. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/docs/screenshots/ja/compare-heatmap.png +0 -0
  123. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/docs/screenshots/ja/compare.png +0 -0
  124. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/docs/screenshots/ja/detail.png +0 -0
  125. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/docs/screenshots/ja/ideas.png +0 -0
  126. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/docs/screenshots/ja/live.png +0 -0
  127. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/docs/screenshots/ja/optimize.png +0 -0
  128. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/docs/screenshots/ja/strategy-signal-tv.png +0 -0
  129. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/docs/screenshots/ja/strategy.png +0 -0
  130. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/docs/superpowers/plans/2026-07-25-live-equity-rich.md +0 -0
  131. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/docs/superpowers/plans/2026-07-26-browse-recipe-rollup.md +0 -0
  132. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/docs/superpowers/plans/2026-07-27-browse-symbol-coverage.md +0 -0
  133. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/docs/superpowers/plans/2026-07-27-maintenance-orphan-runs.md +0 -0
  134. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/docs/superpowers/specs/2026-07-25-live-equity-rich-design.md +0 -0
  135. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/docs/superpowers/specs/2026-07-26-browse-recipe-rollup-design.md +0 -0
  136. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/docs/superpowers/specs/2026-07-27-browse-symbol-coverage-design.md +0 -0
  137. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/docs/superpowers/specs/2026-07-27-maintenance-orphan-runs-design.md +0 -0
  138. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/.gitignore +0 -0
  139. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/.npmrc +0 -0
  140. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/.size-limit.json +0 -0
  141. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/.storybook/main.ts +0 -0
  142. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/.storybook/preview.ts +0 -0
  143. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/CLAUDE.md +0 -0
  144. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/README.md +0 -0
  145. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/THIRDPARTY_FONTS.md +0 -0
  146. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/e2e/fixtures/README.md +0 -0
  147. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/e2e/fixtures/forge/data/historical/SPY_1d.parquet +0 -0
  148. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/e2e/fixtures/forge/data/ideas/ideas.json +0 -0
  149. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/e2e/fixtures/forge/data/results/backtest_results.db +0 -0
  150. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/e2e/fixtures/forge/data/strategies/dual_symbol_qqq.json +0 -0
  151. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/e2e/fixtures/forge/data/strategies/dual_symbol_spy.json +0 -0
  152. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/e2e/fixtures/forge/data/strategies/ema_trend_v1.json +0 -0
  153. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/e2e/fixtures/forge/data/strategies/ema_trend_v2.json +0 -0
  154. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/e2e/fixtures/forge/data/strategies/ema_trend_v3.json +0 -0
  155. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/e2e/fixtures/forge/data/strategies/idle_recipe_v1.json +0 -0
  156. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/e2e/fixtures/forge/data/strategies/idle_recipe_v2.json +0 -0
  157. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/e2e/fixtures/forge/data/strategies/momo_breakout.json +0 -0
  158. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/e2e/fixtures/forge/data/strategies/no_symbol_v1.json +0 -0
  159. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/e2e/fixtures/forge/data/strategies/rsi_reversal.json +0 -0
  160. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/e2e/fixtures/forge/data/strategies/sma_cross.json +0 -0
  161. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/e2e/fixtures/forge/forge.yaml +0 -0
  162. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/e2e/helpers/locators.ts +0 -0
  163. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/e2e/samples/sample-fixture.spec.ts +0 -0
  164. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/e2e/screenshots/capture.spec.ts +0 -0
  165. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/e2e/screenshots/equity-tv.spec.ts +0 -0
  166. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/e2e/screenshots/strategy-signal-tv.spec.ts +0 -0
  167. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/e2e/specs/browse.spec.ts +0 -0
  168. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/e2e/specs/compare.spec.ts +0 -0
  169. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/e2e/specs/detail.spec.ts +0 -0
  170. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/e2e/specs/i18n.spec.ts +0 -0
  171. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/e2e/specs/maintenance.spec.ts +0 -0
  172. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/e2e/specs/share.spec.ts +0 -0
  173. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/e2e/visual/README.md +0 -0
  174. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/e2e/visual/__snapshots__/linux/equity-drawdown-tv.png +0 -0
  175. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/e2e/visual/__snapshots__/linux/strategy-signal-tv.png +0 -0
  176. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/e2e/visual/tv-charts.spec.ts +0 -0
  177. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/eslint.config.js +0 -0
  178. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/index.html +0 -0
  179. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/package.json +0 -0
  180. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/playwright.config.ts +0 -0
  181. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/playwright.samples.config.ts +0 -0
  182. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/playwright.screenshots.config.ts +0 -0
  183. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/playwright.visual.config.ts +0 -0
  184. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/pnpm-lock.yaml +0 -0
  185. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/pnpm-workspace.yaml +0 -0
  186. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/public/favicon.svg +0 -0
  187. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/public/icons.svg +0 -0
  188. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/api/__tests__/client.test.ts +0 -0
  189. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/api/client.ts +0 -0
  190. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/api/types.gen.ts +0 -0
  191. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/api/types.ts +0 -0
  192. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/charts/tv/CompareEquityTV.stories.tsx +0 -0
  193. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/charts/tv/CompareEquityTV.tsx +0 -0
  194. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/charts/tv/EquityDrawdownPaneTV.stories.tsx +0 -0
  195. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/charts/tv/EquityDrawdownPaneTV.tsx +0 -0
  196. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/charts/tv/RollingMetricsChartTV.stories.tsx +0 -0
  197. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/charts/tv/RollingMetricsChartTV.tsx +0 -0
  198. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/charts/tv/StrategySignalChartTV.stories.tsx +0 -0
  199. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/charts/tv/StrategySignalChartTV.tsx +0 -0
  200. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/charts/tv/WFOEquityTV.stories.tsx +0 -0
  201. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/charts/tv/WFOEquityTV.tsx +0 -0
  202. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/charts/tv/__tests__/CompareEquityTV.test.tsx +0 -0
  203. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/charts/tv/__tests__/EquityDrawdownPaneTV.test.tsx +0 -0
  204. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/charts/tv/__tests__/RollingMetricsChartTV.test.tsx +0 -0
  205. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/charts/tv/__tests__/StrategySignalChartTV.test.tsx +0 -0
  206. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/charts/tv/__tests__/WFOEquityTV.test.tsx +0 -0
  207. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/charts/tv/__tests__/data.test.ts +0 -0
  208. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/charts/tv/__tests__/regimeBands.test.ts +0 -0
  209. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/charts/tv/__tests__/theme.test.ts +0 -0
  210. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/charts/tv/__tests__/trades.test.ts +0 -0
  211. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/charts/tv/data.ts +0 -0
  212. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/charts/tv/regimeBands.ts +0 -0
  213. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/charts/tv/theme.ts +0 -0
  214. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/charts/tv/trades.ts +0 -0
  215. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/charts/visx/AnnualReturnsBarV.tsx +0 -0
  216. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/charts/visx/CorrelationHeatmapV.tsx +0 -0
  217. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/charts/visx/MAEMFEScatterV.tsx +0 -0
  218. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/charts/visx/MonthlyHeatmapV.tsx +0 -0
  219. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/charts/visx/OptimizeHeatmapV.tsx +0 -0
  220. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/charts/visx/OptimizeScatterV.tsx +0 -0
  221. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/charts/visx/Sparkline.stories.tsx +0 -0
  222. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/charts/visx/Sparkline.tsx +0 -0
  223. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/components/AppFooter.tsx +0 -0
  224. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/components/AppNav.tsx +0 -0
  225. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/components/CommandPalette.tsx +0 -0
  226. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/components/ConfirmActionButton.tsx +0 -0
  227. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/components/DetailToolbar.tsx +0 -0
  228. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/components/MetricsSummaryBarV2.stories.tsx +0 -0
  229. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/components/MetricsSummaryBarV2.tsx +0 -0
  230. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/components/RootLayout.tsx +0 -0
  231. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/components/RouteErrorScreen.tsx +0 -0
  232. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/components/RunLogDetails.tsx +0 -0
  233. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/components/SettingsToggles.tsx +0 -0
  234. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/components/ShareCardButton.tsx +0 -0
  235. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/components/StrategyHero.tsx +0 -0
  236. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/components/__tests__/AppFooter.test.tsx +0 -0
  237. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/components/__tests__/AppNav.test.tsx +0 -0
  238. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/components/__tests__/CommandPalette.test.tsx +0 -0
  239. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/components/__tests__/CorrelationHeatmap.test.tsx +0 -0
  240. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/components/__tests__/MetricsSummaryBarV2.test.tsx +0 -0
  241. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/components/__tests__/RootLayout.test.tsx +0 -0
  242. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/components/__tests__/RouteErrorScreen.test.tsx +0 -0
  243. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/components/__tests__/SettingsToggles.test.tsx +0 -0
  244. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/components/__tests__/ShareCardButton.test.tsx +0 -0
  245. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/components/__tests__/ShareCardXButton.test.tsx +0 -0
  246. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/components/__tests__/responsive-styles.test.tsx +0 -0
  247. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/components/browser/CollapsibleSection.tsx +0 -0
  248. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/components/browser/CompareFloatingBar.tsx +0 -0
  249. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/components/browser/CreateStrategyEntry.tsx +0 -0
  250. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/components/browser/FilterBar.tsx +0 -0
  251. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/components/browser/GroupByToggle.tsx +0 -0
  252. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/components/browser/Heroline.tsx +0 -0
  253. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/components/browser/RecipeRow.tsx +0 -0
  254. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/components/browser/RunCompareView.tsx +0 -0
  255. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/components/browser/RunHistoryTab.tsx +0 -0
  256. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/components/browser/SavedViews.tsx +0 -0
  257. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/components/browser/StrategyRow.tsx +0 -0
  258. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/components/browser/StrategySlidePanel.tsx +0 -0
  259. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/components/browser/StrategyTable.tsx +0 -0
  260. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/components/browser/StrategyTableFooter.tsx +0 -0
  261. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/components/browser/SymbolCoverageTable.tsx +0 -0
  262. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/components/browser/__tests__/CollapsibleSection.test.tsx +0 -0
  263. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/components/browser/__tests__/CreateStrategyEntry.test.tsx +0 -0
  264. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/components/browser/__tests__/FilterBar.test.tsx +0 -0
  265. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/components/browser/__tests__/RecipeRow.test.tsx +0 -0
  266. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/components/browser/__tests__/RunCompareView.test.tsx +0 -0
  267. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/components/browser/__tests__/RunHistoryTab.test.tsx +0 -0
  268. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/components/browser/__tests__/StrategyRow.test.tsx +0 -0
  269. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/components/browser/__tests__/StrategySlidePanel.test.tsx +0 -0
  270. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/components/browser/__tests__/StrategyTable.test.tsx +0 -0
  271. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/components/browser/__tests__/StrategyTableFooter.test.tsx +0 -0
  272. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/components/browser/__tests__/SymbolCoverageTable.test.tsx +0 -0
  273. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/components/charts/AnnualReturnsBar.tsx +0 -0
  274. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/components/charts/AnnualSummaryTable.tsx +0 -0
  275. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/components/charts/CorrelationHeatmap.tsx +0 -0
  276. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/components/charts/DrawdownDetailChart.tsx +0 -0
  277. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/components/charts/HoldingPeriodChart.tsx +0 -0
  278. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/components/charts/MAEMFEScatter.tsx +0 -0
  279. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/components/charts/MonteCarloChart.tsx +0 -0
  280. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/components/charts/OptimizeHeatmap.tsx +0 -0
  281. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/components/charts/OptimizeScatter.tsx +0 -0
  282. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/components/charts/ReturnDistributionChart.tsx +0 -0
  283. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/components/charts/VaRChart.tsx +0 -0
  284. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/components/charts/WFOTimeline.tsx +0 -0
  285. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/components/charts/WeekdayPerformanceChart.tsx +0 -0
  286. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/components/charts/__tests__/AnnualSummaryTable.test.tsx +0 -0
  287. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/components/charts/__tests__/HoldingPeriodChart.test.tsx +0 -0
  288. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/components/charts/__tests__/MonteCarloChart.test.tsx +0 -0
  289. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/components/jobs/JobRunnerCard.tsx +0 -0
  290. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/components/live/LiveKpiRow.tsx +0 -0
  291. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/components/live/LivePositionView.tsx +0 -0
  292. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/components/live/LivePositionsTable.tsx +0 -0
  293. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/components/live/LiveTab.tsx +0 -0
  294. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/components/live/SummaryCard.tsx +0 -0
  295. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/components/live/__tests__/LiveKpiRow.test.tsx +0 -0
  296. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/components/live/__tests__/LivePositionView.test.tsx +0 -0
  297. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/components/live/__tests__/LivePositionsTable.test.tsx +0 -0
  298. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/components/live/__tests__/LiveTab.test.tsx +0 -0
  299. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/components/live/__tests__/format.test.ts +0 -0
  300. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/components/live/format.ts +0 -0
  301. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/components/metrics/CarryAdjustedCard.tsx +0 -0
  302. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/components/metrics/CompareTable.tsx +0 -0
  303. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/components/metrics/ISOOSMetrics.tsx +0 -0
  304. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/components/metrics/MetricInfoTip.tsx +0 -0
  305. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/components/metrics/MetricsGrid.tsx +0 -0
  306. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/components/metrics/PortfolioComposer.tsx +0 -0
  307. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/components/metrics/RegimeBreakdownCards.tsx +0 -0
  308. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/components/metrics/SignalQualityBadge.tsx +0 -0
  309. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/components/metrics/SubperiodMetrics.tsx +0 -0
  310. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/components/metrics/__tests__/CompareTable.test.tsx +0 -0
  311. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/components/metrics/__tests__/MetricInfoTip.test.tsx +0 -0
  312. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/components/metrics/__tests__/MetricsGrid.hidden.test.tsx +0 -0
  313. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/components/metrics/__tests__/MetricsGrid.sentinel.test.tsx +0 -0
  314. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/components/metrics/__tests__/MetricsGrid.tooltip.test.tsx +0 -0
  315. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/components/metrics/__tests__/SignalQualityBadge.test.tsx +0 -0
  316. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/components/metrics/__tests__/SubperiodMetrics.test.tsx +0 -0
  317. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/components/metrics/__tests__/evaluateGood.test.ts +0 -0
  318. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/components/metrics/evaluate.ts +0 -0
  319. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/components/trades/TradeTable.tsx +0 -0
  320. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/components/trades/__tests__/TradeTable.test.tsx +0 -0
  321. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/components/tuning/DuplicateStrategyCard.tsx +0 -0
  322. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/components/tuning/TuningPanel.tsx +0 -0
  323. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/components/tuning/__tests__/DuplicateStrategyCard.test.tsx +0 -0
  324. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/components/tuning/__tests__/TuningPanel.test.tsx +0 -0
  325. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/constants/__tests__/metricDefinitions.test.ts +0 -0
  326. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/constants/helpLinks.ts +0 -0
  327. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/constants/metricDefinitions.ts +0 -0
  328. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/constants/runSource.ts +0 -0
  329. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/contexts/DashboardContext.tsx +0 -0
  330. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/contexts/dashboardConstants.ts +0 -0
  331. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/design/__tests__/definedTokens.test.ts +0 -0
  332. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/design/__tests__/noHardcodedColors.test.ts +0 -0
  333. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/design/__tests__/tokens.contrast.test.ts +0 -0
  334. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/design/a11y.css +0 -0
  335. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/design/primitives/Button.tsx +0 -0
  336. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/design/primitives/Card.tsx +0 -0
  337. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/design/primitives/ChartDataTable.tsx +0 -0
  338. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/design/primitives/Chip.tsx +0 -0
  339. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/design/primitives/ConfirmDialog.tsx +0 -0
  340. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/design/primitives/Divider.tsx +0 -0
  341. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/design/primitives/ErrorBanner.tsx +0 -0
  342. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/design/primitives/KeyValue.tsx +0 -0
  343. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/design/primitives/Loading.tsx +0 -0
  344. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/design/primitives/OverflowMenu.tsx +0 -0
  345. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/design/primitives/Pill.stories.tsx +0 -0
  346. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/design/primitives/Pill.tsx +0 -0
  347. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/design/primitives/SectionHeader.tsx +0 -0
  348. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/design/primitives/SortHeaderCell.tsx +0 -0
  349. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/design/primitives/Stat.stories.tsx +0 -0
  350. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/design/primitives/Stat.tsx +0 -0
  351. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/design/primitives/TabBar.tsx +0 -0
  352. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/design/primitives/Toolbar.tsx +0 -0
  353. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/design/primitives/__tests__/ChartDataTable.test.tsx +0 -0
  354. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/design/primitives/__tests__/ConfirmDialog.test.tsx +0 -0
  355. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/design/primitives/__tests__/ErrorBanner.test.tsx +0 -0
  356. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/design/primitives/__tests__/Loading.test.tsx +0 -0
  357. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/design/primitives/__tests__/OverflowMenu.test.tsx +0 -0
  358. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/design/primitives/__tests__/Pill.test.tsx +0 -0
  359. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/design/primitives/__tests__/SortHeaderCell.test.tsx +0 -0
  360. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/design/primitives/__tests__/TabBar.test.tsx +0 -0
  361. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/design/primitives/index.ts +0 -0
  362. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/design/primitives/srOnly.ts +0 -0
  363. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/design/tokens.css +0 -0
  364. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/design/useChartTheme.ts +0 -0
  365. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/hooks/__tests__/useDocumentTitle.test.tsx +0 -0
  366. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/hooks/__tests__/useEquityViewport.test.ts +0 -0
  367. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/hooks/__tests__/useFetchByKey.test.ts +0 -0
  368. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/hooks/__tests__/useJobRunner.test.tsx +0 -0
  369. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/hooks/__tests__/useLiveAvailability.test.tsx +0 -0
  370. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/hooks/__tests__/useOrphanRuns.test.tsx +0 -0
  371. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/hooks/__tests__/useRunBacktest.test.tsx +0 -0
  372. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/hooks/__tests__/useScrollRestoration.test.tsx +0 -0
  373. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/hooks/__tests__/useSparklineCache.test.tsx +0 -0
  374. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/hooks/__tests__/useStarredStrategies.test.ts +0 -0
  375. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/hooks/__tests__/useStrategyHistorical.test.tsx +0 -0
  376. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/hooks/__tests__/useStrategyList.test.tsx +0 -0
  377. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/hooks/__tests__/useSyncedTimeRange.test.tsx +0 -0
  378. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/hooks/__tests__/useTheme.test.tsx +0 -0
  379. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/hooks/__tests__/useViewerSettings.lang.test.tsx +0 -0
  380. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/hooks/__tests__/useViewerSettings.shared.test.tsx +0 -0
  381. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/hooks/useBacktestData.ts +0 -0
  382. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/hooks/useDebounce.ts +0 -0
  383. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/hooks/useDocumentTitle.ts +0 -0
  384. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/hooks/useEquityViewport.ts +0 -0
  385. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/hooks/useFetchByKey.ts +0 -0
  386. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/hooks/useIdeasList.ts +0 -0
  387. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/hooks/useJobRunner.ts +0 -0
  388. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/hooks/useLiveAvailability.ts +0 -0
  389. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/hooks/useLiveList.ts +0 -0
  390. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/hooks/useOrphanRuns.ts +0 -0
  391. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/hooks/useRecentStrategies.ts +0 -0
  392. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/hooks/useScrollRestoration.ts +0 -0
  393. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/hooks/useSparklineCache.ts +0 -0
  394. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/hooks/useStarredStrategies.ts +0 -0
  395. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/hooks/useStrategyHistorical.ts +0 -0
  396. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/hooks/useStrategyList.ts +0 -0
  397. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/hooks/useSyncedTimeRange.ts +0 -0
  398. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/hooks/useTheme.ts +0 -0
  399. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/i18n/__tests__/strings.test.ts +0 -0
  400. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/i18n/strings.ts +0 -0
  401. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/lib/__tests__/annualSummary.test.ts +0 -0
  402. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/lib/__tests__/benchmark.test.ts +0 -0
  403. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/lib/__tests__/bestSharpe.test.ts +0 -0
  404. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/lib/__tests__/correlation.test.ts +0 -0
  405. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/lib/__tests__/distribution.test.ts +0 -0
  406. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/lib/__tests__/drawdown.test.ts +0 -0
  407. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/lib/__tests__/errorMessage.test.ts +0 -0
  408. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/lib/__tests__/format.test.ts +0 -0
  409. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/lib/__tests__/holdingPeriod.test.ts +0 -0
  410. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/lib/__tests__/liveEquity.test.ts +0 -0
  411. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/lib/__tests__/metricLabel.test.ts +0 -0
  412. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/lib/__tests__/monteCarlo.properties.test.ts +0 -0
  413. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/lib/__tests__/monteCarlo.test.ts +0 -0
  414. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/lib/__tests__/optimizeHeatmap.test.ts +0 -0
  415. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/lib/__tests__/paramImportance.test.ts +0 -0
  416. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/lib/__tests__/portfolio.test.ts +0 -0
  417. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/lib/__tests__/recipes.test.ts +0 -0
  418. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/lib/__tests__/rolling.test.ts +0 -0
  419. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/lib/__tests__/searchParams.test.ts +0 -0
  420. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/lib/__tests__/searchStrategies.test.ts +0 -0
  421. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/lib/__tests__/sentinel.test.ts +0 -0
  422. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/lib/__tests__/shareCard.test.ts +0 -0
  423. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/lib/__tests__/shareCardMulti.test.ts +0 -0
  424. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/lib/__tests__/shareTweet.test.ts +0 -0
  425. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/lib/__tests__/subperiod.test.ts +0 -0
  426. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/lib/__tests__/symbolStats.test.ts +0 -0
  427. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/lib/__tests__/walkForward.test.ts +0 -0
  428. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/lib/__tests__/weekday.test.ts +0 -0
  429. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/lib/annualSummary.ts +0 -0
  430. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/lib/assetClass.ts +0 -0
  431. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/lib/benchmark.ts +0 -0
  432. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/lib/bestSharpe.ts +0 -0
  433. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/lib/correlation.ts +0 -0
  434. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/lib/csv.ts +0 -0
  435. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/lib/distribution.ts +0 -0
  436. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/lib/drawdown.ts +0 -0
  437. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/lib/errorMessage.ts +0 -0
  438. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/lib/exportPng.ts +0 -0
  439. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/lib/format.ts +0 -0
  440. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/lib/holdingPeriod.ts +0 -0
  441. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/lib/liveEquity.ts +0 -0
  442. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/lib/metricLabel.ts +0 -0
  443. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/lib/monteCarlo.ts +0 -0
  444. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/lib/optimizeHeatmap.ts +0 -0
  445. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/lib/paramImportance.ts +0 -0
  446. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/lib/portfolio.ts +0 -0
  447. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/lib/recipes.ts +0 -0
  448. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/lib/rolling.ts +0 -0
  449. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/lib/searchParams.ts +0 -0
  450. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/lib/searchStrategies.ts +0 -0
  451. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/lib/sentinel.ts +0 -0
  452. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/lib/shareCard.ts +0 -0
  453. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/lib/shareTweet.ts +0 -0
  454. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/lib/subperiod.ts +0 -0
  455. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/lib/symbolStats.ts +0 -0
  456. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/lib/walkForward.ts +0 -0
  457. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/lib/weekday.ts +0 -0
  458. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/main.tsx +0 -0
  459. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/mock/btData.ts +0 -0
  460. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/pages/BrowsePage.tsx +0 -0
  461. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/pages/ComparePage.tsx +0 -0
  462. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/pages/DetailPage.tsx +0 -0
  463. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/pages/IdeasPage.tsx +0 -0
  464. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/pages/LivePage.tsx +0 -0
  465. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/pages/MaintenancePage.tsx +0 -0
  466. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/pages/ReportPage.tsx +0 -0
  467. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/pages/RunsPage.tsx +0 -0
  468. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/pages/__tests__/BrowsePage.test.tsx +0 -0
  469. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/pages/__tests__/ComparePage.test.tsx +0 -0
  470. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/pages/__tests__/DetailPage.test.tsx +0 -0
  471. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/pages/__tests__/MaintenancePage.test.tsx +0 -0
  472. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/pages/__tests__/ReportPage.test.tsx +0 -0
  473. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/pages/__tests__/RunsPage.test.tsx +0 -0
  474. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/router.tsx +0 -0
  475. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/screens/BacktestScreen.stories.tsx +0 -0
  476. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/screens/BacktestScreen.tsx +0 -0
  477. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/screens/BrowseScreen.tsx +0 -0
  478. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/screens/CompareScreen.stories.tsx +0 -0
  479. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/screens/CompareScreen.tsx +0 -0
  480. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/screens/ISOOSScreen.tsx +0 -0
  481. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/screens/IdeasScreen.stories.tsx +0 -0
  482. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/screens/IdeasScreen.tsx +0 -0
  483. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/screens/LiveScreen.stories.tsx +0 -0
  484. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/screens/LiveScreen.tsx +0 -0
  485. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/screens/MaintenanceScreen.tsx +0 -0
  486. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/screens/OptimizeScreen.stories.tsx +0 -0
  487. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/screens/OptimizeScreen.tsx +0 -0
  488. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/screens/StrategyScreen.tsx +0 -0
  489. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/screens/WFOScreen.stories.tsx +0 -0
  490. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/screens/WFOScreen.tsx +0 -0
  491. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/screens/__tests__/BacktestScreen.test.tsx +0 -0
  492. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/screens/__tests__/CompareScreen.test.tsx +0 -0
  493. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/screens/__tests__/ISOOSScreen.test.tsx +0 -0
  494. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/screens/__tests__/LiveScreen.test.tsx +0 -0
  495. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/screens/__tests__/MaintenanceScreen.test.tsx +0 -0
  496. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/screens/__tests__/OptimizeScreen.test.tsx +0 -0
  497. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/screens/__tests__/WFOScreen.test.tsx +0 -0
  498. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/screens/strategy/SignalChartCard.tsx +0 -0
  499. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/src/test-setup.ts +0 -0
  500. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/tsconfig.app.json +0 -0
  501. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/tsconfig.e2e.json +0 -0
  502. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/tsconfig.json +0 -0
  503. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/tsconfig.node.json +0 -0
  504. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/frontend/vite.config.ts +0 -0
  505. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/lighthouserc.json +0 -0
  506. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/release.sh +0 -0
  507. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/samples/README.en.md +0 -0
  508. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/samples/README.md +0 -0
  509. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/samples/__init__.py +0 -0
  510. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/samples/_generators/__init__.py +0 -0
  511. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/samples/_generators/compatibility_matrix.py +0 -0
  512. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/samples/_generators/ideas_defs.py +0 -0
  513. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/samples/_generators/pseudo_backtest.py +0 -0
  514. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/samples/_generators/pseudo_grid.py +0 -0
  515. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/samples/_generators/pseudo_wfo.py +0 -0
  516. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/samples/_generators/strategy_defs.py +0 -0
  517. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/samples/_generators/synthetic_ohlcv.py +0 -0
  518. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/samples/_generators/writers.py +0 -0
  519. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/samples/build_samples.py +0 -0
  520. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/samples/sample-forge/data/ideas/ideas.json +0 -0
  521. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/samples/sample-forge/data/results/backtest_results.db +0 -0
  522. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/samples/sample-forge/data/strategies/bbands_breakout_v1.json +0 -0
  523. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/samples/sample-forge/data/strategies/donchian_turtle_v1.json +0 -0
  524. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/samples/sample-forge/data/strategies/ema_adx_macd_v1.json +0 -0
  525. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/samples/sample-forge/data/strategies/macd_crossover_v1.json +0 -0
  526. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/samples/sample-forge/data/strategies/range_reversion_v1.json +0 -0
  527. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/samples/sample-forge/data/strategies/rsi_reversion_v1.json +0 -0
  528. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/samples/sample-forge/data/strategies/sma_crossover_v1.json +0 -0
  529. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/samples/sample-forge/data/strategies/supertrend_adx_v1.json +0 -0
  530. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/samples/sample-forge/forge.yaml +0 -0
  531. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/scripts/compare_sqlite_dump.py +0 -0
  532. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/scripts/generate_openapi.py +0 -0
  533. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/scripts/generate_thirdparty_js.py +0 -0
  534. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/scripts/verify_build_artifacts.py +0 -0
  535. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/src/alpha_visualizer/app.py +0 -0
  536. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/src/alpha_visualizer/cli.py +0 -0
  537. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/src/alpha_visualizer/db.py +0 -0
  538. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/src/alpha_visualizer/dependencies.py +0 -0
  539. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/src/alpha_visualizer/errors.py +0 -0
  540. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/src/alpha_visualizer/forge_config.py +0 -0
  541. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/src/alpha_visualizer/log_sanitize.py +0 -0
  542. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/src/alpha_visualizer/repositories/__init__.py +0 -0
  543. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/src/alpha_visualizer/repositories/backtest_results.py +0 -0
  544. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/src/alpha_visualizer/repositories/ideas.py +0 -0
  545. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/src/alpha_visualizer/repositories/live.py +0 -0
  546. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/src/alpha_visualizer/repositories/optimization.py +0 -0
  547. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/src/alpha_visualizer/repositories/strategies.py +0 -0
  548. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/src/alpha_visualizer/routers/__init__.py +0 -0
  549. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/src/alpha_visualizer/routers/historical.py +0 -0
  550. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/src/alpha_visualizer/routers/ideas.py +0 -0
  551. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/src/alpha_visualizer/routers/jobs.py +0 -0
  552. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/src/alpha_visualizer/routers/live.py +0 -0
  553. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/src/alpha_visualizer/routers/optimize.py +0 -0
  554. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/src/alpha_visualizer/routers/results.py +0 -0
  555. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/src/alpha_visualizer/routers/wfo.py +0 -0
  556. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/src/alpha_visualizer/schemas/__init__.py +0 -0
  557. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/src/alpha_visualizer/schemas/health.py +0 -0
  558. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/src/alpha_visualizer/schemas/historical.py +0 -0
  559. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/src/alpha_visualizer/schemas/ideas.py +0 -0
  560. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/src/alpha_visualizer/schemas/live.py +0 -0
  561. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/src/alpha_visualizer/schemas/maintenance.py +0 -0
  562. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/src/alpha_visualizer/schemas/optimize.py +0 -0
  563. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/src/alpha_visualizer/schemas/results.py +0 -0
  564. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/src/alpha_visualizer/schemas/strategies.py +0 -0
  565. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/src/alpha_visualizer/schemas/wfo.py +0 -0
  566. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/src/alpha_visualizer/services/__init__.py +0 -0
  567. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/src/alpha_visualizer/services/backtest.py +0 -0
  568. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/src/alpha_visualizer/services/historical.py +0 -0
  569. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/src/alpha_visualizer/services/live.py +0 -0
  570. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/src/alpha_visualizer/services/tuning.py +0 -0
  571. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/src/alpha_visualizer/services/walk_forward.py +0 -0
  572. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/src/alpha_visualizer/static/assets/BrowsePage-BtjWf_pg.js +0 -0
  573. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/src/alpha_visualizer/static/assets/BrowsePage-BtjWf_pg.js.map +0 -0
  574. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/src/alpha_visualizer/static/assets/ChartDataTable-B_PMsr6F.js +0 -0
  575. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/src/alpha_visualizer/static/assets/ChartDataTable-B_PMsr6F.js.map +0 -0
  576. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/src/alpha_visualizer/static/assets/ComparePage-BQLtkozx.js +0 -0
  577. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/src/alpha_visualizer/static/assets/ComparePage-BQLtkozx.js.map +0 -0
  578. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/src/alpha_visualizer/static/assets/DetailPage-DkgwWfN1.js +0 -0
  579. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/src/alpha_visualizer/static/assets/DetailPage-DkgwWfN1.js.map +0 -0
  580. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/src/alpha_visualizer/static/assets/EquityDrawdownPaneTV-BqqjTDsR.js +0 -0
  581. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/src/alpha_visualizer/static/assets/EquityDrawdownPaneTV-BqqjTDsR.js.map +0 -0
  582. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/src/alpha_visualizer/static/assets/IdeasPage-CZt2Um3Q.js +0 -0
  583. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/src/alpha_visualizer/static/assets/IdeasPage-CZt2Um3Q.js.map +0 -0
  584. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/src/alpha_visualizer/static/assets/LivePage-nyToYYsN.js +0 -0
  585. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/src/alpha_visualizer/static/assets/LivePage-nyToYYsN.js.map +0 -0
  586. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/src/alpha_visualizer/static/assets/LiveTab-CB_3VlBE.js +0 -0
  587. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/src/alpha_visualizer/static/assets/LiveTab-CB_3VlBE.js.map +0 -0
  588. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/src/alpha_visualizer/static/assets/MaintenancePage-B2IUJ3dt.js +0 -0
  589. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/src/alpha_visualizer/static/assets/MaintenancePage-B2IUJ3dt.js.map +0 -0
  590. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/src/alpha_visualizer/static/assets/MetricsSummaryBarV2-BXEamLE3.js +0 -0
  591. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/src/alpha_visualizer/static/assets/MetricsSummaryBarV2-BXEamLE3.js.map +0 -0
  592. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/src/alpha_visualizer/static/assets/ReportPage-izblXE1Q.js +0 -0
  593. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/src/alpha_visualizer/static/assets/ReportPage-izblXE1Q.js.map +0 -0
  594. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/src/alpha_visualizer/static/assets/ReturnDistributionChart-D69B-itS.js +0 -0
  595. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/src/alpha_visualizer/static/assets/ReturnDistributionChart-D69B-itS.js.map +0 -0
  596. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/src/alpha_visualizer/static/assets/RunLogDetails-CG22uYt8.js +0 -0
  597. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/src/alpha_visualizer/static/assets/RunLogDetails-CG22uYt8.js.map +0 -0
  598. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/src/alpha_visualizer/static/assets/RunsPage-CXsBfoVg.js +0 -0
  599. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/src/alpha_visualizer/static/assets/RunsPage-CXsBfoVg.js.map +0 -0
  600. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/src/alpha_visualizer/static/assets/SettingsToggles-tt-Rmlqz.js +0 -0
  601. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/src/alpha_visualizer/static/assets/SettingsToggles-tt-Rmlqz.js.map +0 -0
  602. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/src/alpha_visualizer/static/assets/ShareCardButton-DEt_rFr8.js +0 -0
  603. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/src/alpha_visualizer/static/assets/ShareCardButton-DEt_rFr8.js.map +0 -0
  604. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/src/alpha_visualizer/static/assets/SortHeaderCell-CetYtnjX.js +0 -0
  605. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/src/alpha_visualizer/static/assets/SortHeaderCell-CetYtnjX.js.map +0 -0
  606. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/src/alpha_visualizer/static/assets/errorMessage-CogRMclS.js +0 -0
  607. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/src/alpha_visualizer/static/assets/errorMessage-CogRMclS.js.map +0 -0
  608. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/src/alpha_visualizer/static/assets/fonts-DJsrEZjK.css +0 -0
  609. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/src/alpha_visualizer/static/assets/format-D0fEne3x.js +0 -0
  610. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/src/alpha_visualizer/static/assets/format-D0fEne3x.js.map +0 -0
  611. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/src/alpha_visualizer/static/assets/index-CSTPOquK.js +0 -0
  612. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/src/alpha_visualizer/static/assets/index-CSTPOquK.js.map +0 -0
  613. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/src/alpha_visualizer/static/assets/index-ngPg-0Y0.css +0 -0
  614. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/src/alpha_visualizer/static/assets/inter-tight-latin-400-normal-BLrFJfvD.woff +0 -0
  615. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/src/alpha_visualizer/static/assets/inter-tight-latin-400-normal-iW8qmuJY.woff2 +0 -0
  616. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/src/alpha_visualizer/static/assets/inter-tight-latin-500-normal-BFXNXuvF.woff2 +0 -0
  617. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/src/alpha_visualizer/static/assets/inter-tight-latin-500-normal-pobXraBK.woff +0 -0
  618. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/src/alpha_visualizer/static/assets/inter-tight-latin-600-normal-BgSTtRxb.woff2 +0 -0
  619. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/src/alpha_visualizer/static/assets/inter-tight-latin-600-normal-D7bG6gX1.woff +0 -0
  620. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/src/alpha_visualizer/static/assets/jetbrains-mono-latin-500-normal-BWZEU5yA.woff2 +0 -0
  621. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/src/alpha_visualizer/static/assets/jetbrains-mono-latin-500-normal-CJOVTJB7.woff +0 -0
  622. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/src/alpha_visualizer/static/assets/react-CuMkScR3.js +0 -0
  623. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/src/alpha_visualizer/static/assets/react-CuMkScR3.js.map +0 -0
  624. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/src/alpha_visualizer/static/assets/react-router-CU9OAEs1.js +0 -0
  625. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/src/alpha_visualizer/static/assets/react-router-CU9OAEs1.js.map +0 -0
  626. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/src/alpha_visualizer/static/assets/rolldown-runtime-C0phanGV.js +0 -0
  627. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/src/alpha_visualizer/static/assets/source-serif-4-latin-600-normal-DMD1h6_f.woff +0 -0
  628. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/src/alpha_visualizer/static/assets/source-serif-4-latin-600-normal-DouSKlru.woff2 +0 -0
  629. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/src/alpha_visualizer/static/assets/tv-D3Zm-VpQ.js +0 -0
  630. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/src/alpha_visualizer/static/assets/tv-D3Zm-VpQ.js.map +0 -0
  631. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/src/alpha_visualizer/static/assets/useBacktestData-BcRTA3hv.js +0 -0
  632. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/src/alpha_visualizer/static/assets/useBacktestData-BcRTA3hv.js.map +0 -0
  633. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/src/alpha_visualizer/static/assets/useDocumentTitle-DPighAM_.js +0 -0
  634. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/src/alpha_visualizer/static/assets/useDocumentTitle-DPighAM_.js.map +0 -0
  635. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/src/alpha_visualizer/static/assets/visx-HscrFEDZ.js +0 -0
  636. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/src/alpha_visualizer/static/assets/visx-HscrFEDZ.js.map +0 -0
  637. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/src/alpha_visualizer/static/favicon.svg +0 -0
  638. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/src/alpha_visualizer/static/icons.svg +0 -0
  639. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/src/alpha_visualizer/static/index.html +0 -0
  640. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/tests/__init__.py +0 -0
  641. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/tests/conftest.py +0 -0
  642. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/tests/factories.py +0 -0
  643. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/tests/fixtures/build_e2e_fixture.py +0 -0
  644. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/tests/repositories/__init__.py +0 -0
  645. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/tests/repositories/test_backtest_results_repo.py +0 -0
  646. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/tests/repositories/test_ideas_reader.py +0 -0
  647. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/tests/repositories/test_live_repo.py +0 -0
  648. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/tests/repositories/test_optimization_repo.py +0 -0
  649. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/tests/repositories/test_strategies_repo.py +0 -0
  650. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/tests/routers/__init__.py +0 -0
  651. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/tests/routers/test_db_mode_write_paths.py +0 -0
  652. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/tests/routers/test_forge_yaml_integration.py +0 -0
  653. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/tests/routers/test_historical.py +0 -0
  654. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/tests/routers/test_ideas.py +0 -0
  655. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/tests/routers/test_jobs.py +0 -0
  656. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/tests/routers/test_live.py +0 -0
  657. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/tests/routers/test_optimize.py +0 -0
  658. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/tests/routers/test_results.py +0 -0
  659. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/tests/routers/test_sparkline.py +0 -0
  660. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/tests/routers/test_strategies.py +0 -0
  661. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/tests/routers/test_strategies_source.py +0 -0
  662. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/tests/routers/test_strategy_duplicate.py +0 -0
  663. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/tests/routers/test_wfo.py +0 -0
  664. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/tests/samples/__init__.py +0 -0
  665. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/tests/samples/test_pseudo_backtest.py +0 -0
  666. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/tests/samples/test_pseudo_grid.py +0 -0
  667. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/tests/samples/test_pseudo_wfo.py +0 -0
  668. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/tests/samples/test_sample_forge.py +0 -0
  669. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/tests/samples/test_strategy_defs.py +0 -0
  670. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/tests/samples/test_synthetic_ohlcv.py +0 -0
  671. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/tests/samples/test_writers.py +0 -0
  672. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/tests/schemas/__init__.py +0 -0
  673. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/tests/schemas/test_schemas.py +0 -0
  674. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/tests/services/__init__.py +0 -0
  675. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/tests/services/test_backtest.py +0 -0
  676. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/tests/services/test_backtest_properties.py +0 -0
  677. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/tests/services/test_forge_cli.py +0 -0
  678. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/tests/services/test_historical.py +0 -0
  679. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/tests/services/test_live.py +0 -0
  680. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/tests/services/test_tuning.py +0 -0
  681. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/tests/services/test_wfo.py +0 -0
  682. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/tests/test_app.py +0 -0
  683. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/tests/test_cli.py +0 -0
  684. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/tests/test_compare_sqlite_dump.py +0 -0
  685. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/tests/test_db.py +0 -0
  686. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/tests/test_dependencies.py +0 -0
  687. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/tests/test_errors.py +0 -0
  688. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/tests/test_forge_config.py +0 -0
  689. {alpha_visualizer-1.3.1 → alpha_visualizer-1.3.2}/tests/test_log_sanitize.py +0 -0
@@ -1,4 +1,4 @@
1
1
  # file: /home/runner/work/alpha-visualizer/alpha-visualizer/src/alpha_visualizer/services/forge_cli.py
2
2
  # hypothesis_version: 6.161.6
3
3
 
4
- ['1', 'FORGE_CONFIG', 'FORGE_NONINTERACTIVE', 'alpha-forge', 'forge.yaml', '{', '}', '~']
4
+ ['1', 'FORGE_CONFIG', 'FORGE_NONINTERACTIVE', 'alpha-forge', 'eula', 'forge.yaml', 'no such command', '{', '}', '~']
@@ -1,4 +1,4 @@
1
1
  # file: /home/runner/work/alpha-visualizer/alpha-visualizer/src/alpha_visualizer/__init__.py
2
2
  # hypothesis_version: 6.161.6
3
3
 
4
- ['1.3.1']
4
+ ['1.3.2']
@@ -1,4 +1,4 @@
1
1
  # file: /home/runner/work/alpha-visualizer/alpha-visualizer/src/alpha_visualizer/routers/maintenance.py
2
2
  # hypothesis_version: 6.161.6
3
3
 
4
- [400, 900, '--dry-run', '--json', '--strategy', '--vacuum', '-y', 'backtest', 'backtest_rows', 'bytes_after', 'bytes_before', 'count', 'deleted', 'engine', 'no such command', 'optimization_rows', 'orphans', 'prune-orphans', 'strategy_ids', 'total_bytes', 'vacuum_error']
4
+ [400, 900, '--dry-run', '--json', '--strategy', '--vacuum', '-y', 'backtest', 'backtest_rows', 'bytes_after', 'bytes_before', 'count', 'deleted', 'engine', 'optimization_rows', 'orphans', 'prune-orphans', 'strategy_ids', 'total_bytes', 'vacuum_error']
@@ -11,6 +11,15 @@ alpha-visualizer の全バージョン変更履歴です。
11
11
  _(EN) Entries below are generated from Conventional Commits (Japanese). Group names: 新機能 = Features, バグ修正 = Bug fixes, リファクタリング = Refactoring, パフォーマンス改善 = Performance, ドキュメント = Docs, テスト = Tests, その他 = Chore. Breaking commits are tagged 破壊的変更._
12
12
 
13
13
 
14
+ ## [1.3.1] - 2026-08-01
15
+
16
+
17
+ ### バグ修正
18
+
19
+ - forge CLI の実行ファイル名を alpha-forge に修正して実行系機能を復旧 (#461)
20
+
21
+
22
+
14
23
  ## [1.3.0] - 2026-08-01
15
24
 
16
25
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: alpha-visualizer
3
- Version: 1.3.1
3
+ Version: 1.3.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
@@ -3,7 +3,7 @@
3
3
  "info": {
4
4
  "title": "alpha-visualizer",
5
5
  "description": "AlphaForge バックテスト結果の Web 可視化ツール",
6
- "version": "1.3.1"
6
+ "version": "1.3.2"
7
7
  },
8
8
  "paths": {
9
9
  "/api/results": {
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "alpha-visualizer"
3
- version = "1.3.1"
3
+ version = "1.3.2"
4
4
  description = "Web visualization tool for AlphaForge backtest results"
5
5
  readme = "README.md"
6
6
  license = "Apache-2.0"
@@ -93,7 +93,7 @@ dev = [
93
93
  ]
94
94
 
95
95
  [tool.bumpversion]
96
- current_version = "1.3.1"
96
+ current_version = "1.3.2"
97
97
  commit = true
98
98
  message = "chore: バージョン {new_version} にバンプ"
99
99
  tag = true
@@ -1,3 +1,3 @@
1
1
  """alpha-visualizer: AlphaForge バックテスト結果の Web 可視化ツール"""
2
2
 
3
- __version__ = "1.3.1"
3
+ __version__ = "1.3.2"
@@ -27,11 +27,11 @@ from alpha_visualizer.schemas.maintenance import (
27
27
  )
28
28
  from alpha_visualizer.services.forge_cli import (
29
29
  FORGE_NOT_FOUND_MESSAGE,
30
- FORGE_SUBCOMMAND_NOT_FOUND_MESSAGE,
31
30
  build_forge_env,
32
31
  mask_home,
33
32
  parse_json_lenient,
34
33
  resolve_forge_exe,
34
+ translate_forge_failure,
35
35
  )
36
36
 
37
37
  logger = logging.getLogger(__name__)
@@ -65,12 +65,12 @@ def _run_forge(argv: list[str], forge_cfg: ForgeConfig, timeout: int) -> dict[st
65
65
 
66
66
  if proc.returncode != 0:
67
67
  # 空一覧を返して「掃除済み」と誤読させてはいけない
68
+ # 既知の失敗(EULA 未同意 / forge が古くサブコマンドを持たない)は、
69
+ # 生の Click 出力ではなく次の一歩を示す案内に変換する。
70
+ guidance = translate_forge_failure(proc.stdout or "", proc.stderr or "")
71
+ if guidance is not None:
72
+ raise ExternalProcessError(guidance)
68
73
  raw = proc.stderr or proc.stdout or ""
69
- # forge は導入済みだがバージョンが古く prune-orphans を持たないケース。
70
- # Click が出す生の "No such command 'xxx'." をそのまま見せず、更新を
71
- # 促す導線付きメッセージに変換する(判定は大文字小文字を無視)。
72
- if "no such command" in raw.lower():
73
- raise ExternalProcessError(FORGE_SUBCOMMAND_NOT_FOUND_MESSAGE)
74
74
  detail = mask_home(raw.strip())
75
75
  raise ExternalProcessError(f"forge が異常終了しました(exit {proc.returncode}): {detail}")
76
76
 
@@ -38,6 +38,7 @@ from alpha_visualizer.services.forge_cli import (
38
38
  mask_home,
39
39
  parse_json_lenient,
40
40
  resolve_forge_exe,
41
+ translate_forge_failure,
41
42
  )
42
43
 
43
44
  logger = logging.getLogger(__name__)
@@ -187,6 +188,11 @@ def _run_backtest_guarded(
187
188
  ) from exc
188
189
 
189
190
  if proc.returncode != 0:
191
+ # 既知の失敗(EULA 未同意等)は生の Click 出力ではなく次の一歩を示す
192
+ # 案内に変換する。プロンプト本体は stdout に出るため両方を渡す。
193
+ guidance = translate_forge_failure(proc.stdout or "", proc.stderr or "")
194
+ if guidance is not None:
195
+ raise ExternalProcessError(guidance)
190
196
  # 成功時 log_tail と同じ末尾丸め+ホームパスマスクを通し、
191
197
  # 長大なトレースバックでレスポンスが膨らまないようにする。
192
198
  detail = (
@@ -52,6 +52,7 @@ from alpha_visualizer.services.forge_cli import (
52
52
  build_forge_env,
53
53
  mask_home,
54
54
  resolve_forge_exe,
55
+ translate_forge_failure,
55
56
  )
56
57
  from alpha_visualizer.services.tuning import build_duplicate_file, build_override_file
57
58
 
@@ -404,7 +405,11 @@ def _delegate_forge_strategy_save(
404
405
  log_tail = mask_home("\n".join(tail_lines)) if tail_lines else None
405
406
 
406
407
  if proc.returncode != 0:
407
- raise ExternalProcessError(log_tail or failure_message)
408
+ # 既知の失敗(EULA 未同意等)は生の Click 出力ではなく次の一歩を示す
409
+ # 案内に変換する。forge の検証エラーは従来どおりそのまま表面化させる
410
+ # (スキーマの SSoT は forge 側にあるため)。
411
+ guidance = translate_forge_failure(proc.stdout or "", proc.stderr or "")
412
+ raise ExternalProcessError(guidance or log_tail or failure_message)
408
413
  return log_tail
409
414
 
410
415
 
@@ -32,6 +32,18 @@ FORGE_SUBCOMMAND_NOT_FOUND_MESSAGE = (
32
32
  )
33
33
 
34
34
 
35
+ # forge は導入済みだが EULA に同意していないケース。forge は同意プロンプトを
36
+ # 対話で出すが、visualizer は stdin=DEVNULL で起動するため応答できず Click が
37
+ # Abort する(stderr は "Aborted!" のみで、利用者には何も伝わらない)。EULA は
38
+ # 改訂のたびに再同意が必要になるので、初回導入時だけの問題ではない。
39
+ FORGE_EULA_NOT_ACCEPTED_MESSAGE = (
40
+ "AlphaForge の使用許諾契約(EULA)に同意していないため実行できません。"
41
+ "ターミナルで `alpha-forge system doctor` を実行し、EULA に同意してください"
42
+ " / AlphaForge EULA has not been accepted. Run `alpha-forge system doctor`"
43
+ " in a terminal and accept the EULA"
44
+ )
45
+
46
+
35
47
  #: AlphaForge CLI の実行ファイル名。v0.5.0 で ``forge`` から改名され、インストーラ
36
48
  #: (alforge-labs/install.sh)は旧 ``forge`` symlink を削除する。旧名へのフォール
37
49
  #: バックは張らない — ``forge`` は Foundry(Solidity 開発ツール)のコマンド名でも
@@ -44,6 +56,25 @@ def resolve_forge_exe() -> str | None:
44
56
  return shutil.which(FORGE_EXE_NAME)
45
57
 
46
58
 
59
+ def translate_forge_failure(stdout: str, stderr: str) -> str | None:
60
+ """forge の失敗出力を、利用者が次の一歩を踏める案内へ変換する。
61
+
62
+ 該当パターンが無ければ ``None`` を返す。呼び出し側は生の出力にフォール
63
+ バックすること(ここで既定文言に丸めると、原因不明の失敗がすべて同じ
64
+ メッセージになり調査できなくなる)。
65
+
66
+ stdout / stderr を両方受け取るのは、EULA プロンプトが rich パネルとして
67
+ stdout に出る一方、Click の "Aborted!" は stderr に出るため。どちらか
68
+ 片方だけを見る実装では取りこぼす。
69
+ """
70
+ haystack = f"{stdout}\n{stderr}".lower()
71
+ if "eula" in haystack:
72
+ return FORGE_EULA_NOT_ACCEPTED_MESSAGE
73
+ if "no such command" in haystack:
74
+ return FORGE_SUBCOMMAND_NOT_FOUND_MESSAGE
75
+ return None
76
+
77
+
47
78
  def build_forge_env(forge_cfg: ForgeConfig) -> dict[str, str]:
48
79
  """forge CLI サブプロセス用の環境変数を構築する。
49
80
 
@@ -34,6 +34,7 @@ from alpha_visualizer.services.forge_cli import (
34
34
  mask_home,
35
35
  parse_json_lenient,
36
36
  resolve_forge_exe,
37
+ translate_forge_failure,
37
38
  )
38
39
 
39
40
  logger = logging.getLogger(__name__)
@@ -629,10 +630,17 @@ class JobManager:
629
630
  await self._finish(record, "cancelled", returncode=proc.returncode)
630
631
  return
631
632
 
633
+ stdout_text = stdout_buf.decode("utf-8", errors="replace")
634
+
632
635
  if proc.returncode != 0:
636
+ # 既知の失敗(EULA 未同意等)は次の一歩を示す案内に変換する。
637
+ # ログ(stderr 由来)だけでは EULA プロンプト本体を拾えないため、
638
+ # stdout も合わせて判定する。
633
639
  _, tail = self.log_since(record.job_id, max(0, record.log_seq - 5))
640
+ log_text = "\n".join(tail)
634
641
  error = (
635
- "\n".join(tail)
642
+ translate_forge_failure(stdout_text, log_text)
643
+ or log_text
636
644
  or "ジョブの実行に失敗しました / Job execution failed"
637
645
  )
638
646
  await self._finish(
@@ -640,7 +648,6 @@ class JobManager:
640
648
  )
641
649
  return
642
650
 
643
- stdout_text = stdout_buf.decode("utf-8", errors="replace")
644
651
  data = parse_json_lenient(stdout_text)
645
652
  result = _compact_result(data) if data is not None else None
646
653
  await self._finish(record, "succeeded", returncode=0, result=result)
@@ -125,6 +125,40 @@ class TestOrphanRunsList:
125
125
 
126
126
  assert resp.status_code >= 400
127
127
 
128
+ def test_EULA未同意の場合は同意手順を案内する(
129
+ self, client_with_db: TestClient
130
+ ) -> None:
131
+ """forge は導入済みだが EULA に同意していないケース。
132
+
133
+ visualizer は stdin=DEVNULL で forge を起動するため同意プロンプトに
134
+ 応答できず、Click が "Aborted!" だけを残して落ちる。この文字列は
135
+ 利用者に何も伝えないので、ターミナルで同意するという次の一歩まで
136
+ 示すメッセージに変換する。EULA は改訂のたびに再同意が必要になるため
137
+ 初回導入時だけの問題ではない。
138
+ """
139
+ eula_stdout = (
140
+ "╭── AlphaForge エンドユーザー使用許諾契約 (EULA) — 初回起動時の確認 ──╮\n"
141
+ "│ 本ソフトウェアの利用には EULA への同意が必要です。 │\n"
142
+ "╰────────────────────────────────────────────────────────────────────╯\n"
143
+ "EULA に同意しますか? [y/n] (n): "
144
+ )
145
+ with (
146
+ mock.patch("shutil.which", return_value="/usr/local/bin/alpha-forge"),
147
+ mock.patch(
148
+ "subprocess.run",
149
+ return_value=_proc(returncode=1, stdout=eula_stdout, stderr="\nAborted!"),
150
+ ),
151
+ ):
152
+ resp = client_with_db.get("/api/maintenance/orphan-runs")
153
+
154
+ assert resp.status_code >= 400
155
+ detail = resp.json()["detail"]
156
+ # 生の Click 出力をそのまま出していない
157
+ assert "Aborted!" not in detail
158
+ # 同意手順(実行すべきコマンド)まで示している
159
+ assert "EULA" in detail
160
+ assert "alpha-forge system doctor" in detail
161
+
128
162
  def test_forgeにサブコマンドが無い場合はアップデートを促すメッセージを返す(
129
163
  self, client_with_db: TestClient
130
164
  ) -> None:
@@ -115,6 +115,35 @@ class TestRunRouter:
115
115
  assert detail.endswith("line-59")
116
116
  assert "line-9\n" not in detail
117
117
 
118
+ def test_run_eula_not_accepted_returns_guidance(
119
+ self, client_with_db: TestClient
120
+ ) -> None:
121
+ """EULA 未同意は生の "Aborted!" ではなく同意手順を案内する。
122
+
123
+ /api/run も maintenance と同じく stdin=DEVNULL で forge を起動するため
124
+ 同意プロンプトに応答できない。プロンプト本体は stdout に出るので、
125
+ 失敗時に stderr しか見ない実装では検出できない。
126
+ """
127
+ with (
128
+ mock.patch("shutil.which", return_value="/usr/local/bin/alpha-forge"),
129
+ mock.patch(
130
+ "subprocess.run",
131
+ return_value=_proc(
132
+ returncode=1,
133
+ stdout="EULA に同意しますか? [y/n] (n): ",
134
+ stderr="\nAborted!",
135
+ ),
136
+ ),
137
+ ):
138
+ resp = client_with_db.post(
139
+ "/api/run",
140
+ json={"strategy_id": "test_strategy", "symbol": "AAPL"},
141
+ )
142
+ assert resp.status_code == 500
143
+ detail = resp.json()["detail"]
144
+ assert "Aborted!" not in detail
145
+ assert "alpha-forge system doctor" in detail
146
+
118
147
  def test_run_falls_back_to_db_when_stdout_not_json(
119
148
  self, client_with_db: TestClient
120
149
  ) -> None:
@@ -93,3 +93,32 @@ class TestSaveStrategyParameters:
93
93
  )
94
94
  assert resp.status_code == 500
95
95
  assert "validation failed" in resp.json()["detail"]
96
+
97
+ def test_save_eula_not_accepted_returns_guidance(
98
+ self, client_with_strategies: TestClient
99
+ ) -> None:
100
+ """EULA 未同意は生の "Aborted!" ではなく同意手順を案内する。
101
+
102
+ パラメータ書き戻しも stdin=DEVNULL で forge を起動するため同意
103
+ プロンプトに応答できない。上の検証エラーと違い "Aborted!" は利用者に
104
+ 何も伝えないので、そのまま表面化させてはいけない。
105
+ """
106
+ with (
107
+ mock.patch("shutil.which", return_value="/usr/local/bin/alpha-forge"),
108
+ mock.patch(
109
+ "subprocess.run",
110
+ return_value=_proc(
111
+ returncode=1,
112
+ stdout="EULA に同意しますか? [y/n] (n): ",
113
+ stderr="\nAborted!",
114
+ ),
115
+ ),
116
+ ):
117
+ resp = client_with_strategies.post(
118
+ "/api/strategies/test_strategy/parameters",
119
+ json={"parameters": {"period": 30}},
120
+ )
121
+ assert resp.status_code == 500
122
+ detail = resp.json()["detail"]
123
+ assert "Aborted!" not in detail
124
+ assert "alpha-forge system doctor" in detail
@@ -0,0 +1,60 @@
1
+ """forge の失敗出力を利用者向け案内へ変換する `translate_forge_failure` のテスト。
2
+
3
+ 生の Click 出力("Aborted!" / "No such command")をそのまま画面に出すと、
4
+ 利用者は次に何をすればよいか分からない。ここでは「どの失敗を、どの案内に
5
+ 写像するか」という意図を検証する。
6
+ """
7
+
8
+ from __future__ import annotations
9
+
10
+ from alpha_visualizer.services.forge_cli import (
11
+ FORGE_EULA_NOT_ACCEPTED_MESSAGE,
12
+ FORGE_SUBCOMMAND_NOT_FOUND_MESSAGE,
13
+ translate_forge_failure,
14
+ )
15
+
16
+ # EULA プロンプトは rich パネルとして **stdout** に出る。stderr 側には Click の
17
+ # "Aborted!" しか載らないため、stderr だけを見る実装では検出できない。
18
+ _EULA_STDOUT = """╭────── AlphaForge エンドユーザー使用許諾契約 (EULA) — 初回起動時の確認 ───────╮
19
+ │ 本ソフトウェアの利用には EULA への同意が必要です。 │
20
+ ╰──────────────────────────────────────────────────────────────────────────────╯
21
+ EULA に同意しますか? [y/n] (n): """
22
+ _EULA_STDERR = "\nAborted!"
23
+
24
+
25
+ def test_EULA未同意を同意手順の案内に変換する() -> None:
26
+ """`stdin=DEVNULL` で起動する以上、同意プロンプトには絶対に応答できない。
27
+
28
+ 利用者にとって "Aborted!" は何の情報も持たないので、ターミナルで同意する
29
+ という次の一歩まで示す。EULA は改訂のたびに再同意が必要になるため、
30
+ 初回だけの問題ではない。
31
+ """
32
+ assert translate_forge_failure(_EULA_STDOUT, _EULA_STDERR) == (
33
+ FORGE_EULA_NOT_ACCEPTED_MESSAGE
34
+ )
35
+
36
+
37
+ def test_stderrにEULAが出る実装差にも追随する() -> None:
38
+ """プロンプトの出力先が stdout / stderr のどちらでも検出する。
39
+
40
+ 出力先は forge 側の実装詳細であり、visualizer が依存してよい契約ではない。
41
+ """
42
+ assert translate_forge_failure("", "EULA に同意しますか? [y/n]") == (
43
+ FORGE_EULA_NOT_ACCEPTED_MESSAGE
44
+ )
45
+
46
+
47
+ def test_サブコマンド不在は更新案内に変換する() -> None:
48
+ """既存の変換(forge が古い)も同じ入口に集約されていること。"""
49
+ assert translate_forge_failure("", "Error: No such command 'prune-orphans'.") == (
50
+ FORGE_SUBCOMMAND_NOT_FOUND_MESSAGE
51
+ )
52
+
53
+
54
+ def test_該当しない失敗はNoneを返す() -> None:
55
+ """変換できない失敗は握り潰さず、生の出力を呼び出し側に返させる。
56
+
57
+ ここで既定メッセージに丸めると、原因の分からない失敗が全部同じ文言になり
58
+ 調査できなくなる。
59
+ """
60
+ assert translate_forge_failure("", "Traceback (most recent call last): ...") is None
@@ -138,6 +138,31 @@ class TestJobLifecycle:
138
138
  assert record.error is not None
139
139
  assert "strategy not found" in record.error
140
140
 
141
+ async def test_eula_not_accepted_job_reports_guidance(
142
+ self, tmp_path: pathlib.Path
143
+ ) -> None:
144
+ """EULA 未同意で落ちたジョブも同意手順を案内する。
145
+
146
+ ジョブ(optimize / WFT / backtest)も同期実行系と同じく
147
+ stdin=DEVNULL で forge を起動するため同意プロンプトに応答できない。
148
+ EULA プロンプトは stdout に出る一方、ジョブのログは stderr 由来なので、
149
+ ログ末尾だけを error にする実装では "Aborted!" しか残らない。
150
+ """
151
+ stub = _make_stub(
152
+ tmp_path,
153
+ 'echo "EULA に同意しますか? [y/n] (n): "\n'
154
+ 'echo "Aborted!" >&2\n'
155
+ "exit 1\n",
156
+ )
157
+ manager = _manager(tmp_path, stub)
158
+ job = await manager.create(kind="backtest", strategy_id="s1", symbol="AAPL")
159
+ record = await manager.wait_terminal(job.job_id, timeout=10)
160
+
161
+ assert record.status == "failed"
162
+ assert record.error is not None
163
+ assert "Aborted!" not in record.error
164
+ assert "alpha-forge system doctor" in record.error
165
+
141
166
  async def test_log_masks_home_directory(self, tmp_path: pathlib.Path) -> None:
142
167
  """ログ行のホームパスは ~ にマスクされる(/api/run と同じ漏洩対策)"""
143
168
  stub = _make_stub(tmp_path, 'echo "saved to $HOME/data/x.parquet" >&2\n')
@@ -15,7 +15,7 @@ resolution-markers = [
15
15
 
16
16
  [[package]]
17
17
  name = "alpha-visualizer"
18
- version = "1.3.1"
18
+ version = "1.3.2"
19
19
  source = { editable = "." }
20
20
  dependencies = [
21
21
  { name = "click" },