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.
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/.github/workflows/ci.yml +70 -7
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/.github/workflows/lighthouse.yml +1 -1
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/.github/workflows/release.yml +6 -1
- alpha_visualizer-0.7.2/.hypothesis/constants/296b8092179c9f55 +4 -0
- alpha_visualizer-0.7.1/.hypothesis/constants/94f1f85ed364d969 → alpha_visualizer-0.7.2/.hypothesis/constants/65993953f7ccf191 +1 -1
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/CHANGELOG.md +45 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/PKG-INFO +5 -1
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/README.en.md +4 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/README.md +4 -0
- alpha_visualizer-0.7.2/docs/screenshots/en/browse.png +0 -0
- alpha_visualizer-0.7.2/docs/screenshots/en/compare-heatmap.png +0 -0
- alpha_visualizer-0.7.2/docs/screenshots/en/compare.png +0 -0
- alpha_visualizer-0.7.2/docs/screenshots/en/detail.png +0 -0
- alpha_visualizer-0.7.2/docs/screenshots/en/optimize.png +0 -0
- alpha_visualizer-0.7.2/docs/screenshots/en/strategy.png +0 -0
- alpha_visualizer-0.7.2/docs/screenshots/ja/browse.png +0 -0
- alpha_visualizer-0.7.2/docs/screenshots/ja/compare-heatmap.png +0 -0
- alpha_visualizer-0.7.2/docs/screenshots/ja/compare.png +0 -0
- alpha_visualizer-0.7.2/docs/screenshots/ja/detail.png +0 -0
- alpha_visualizer-0.7.2/docs/screenshots/ja/optimize.png +0 -0
- alpha_visualizer-0.7.2/docs/screenshots/ja/strategy.png +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/e2e/fixtures/forge/data/results/backtest_results.db +0 -0
- alpha_visualizer-0.7.2/frontend/e2e/screenshots/capture.spec.ts +211 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/api/types.ts +25 -0
- alpha_visualizer-0.7.2/frontend/src/components/live/LivePositionView.tsx +162 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/components/live/LiveTab.tsx +16 -66
- alpha_visualizer-0.7.2/frontend/src/components/live/SummaryCard.tsx +80 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/components/live/__tests__/LiveTab.test.tsx +110 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/components/live/format.ts +4 -1
- alpha_visualizer-0.7.2/frontend/src/hooks/useLiveList.ts +37 -0
- alpha_visualizer-0.7.2/frontend/src/pages/LivePage.tsx +64 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/router.tsx +4 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/screens/BrowseScreen.tsx +22 -17
- alpha_visualizer-0.7.2/frontend/src/screens/LiveScreen.stories.tsx +49 -0
- alpha_visualizer-0.7.2/frontend/src/screens/LiveScreen.tsx +204 -0
- alpha_visualizer-0.7.2/frontend/src/screens/__tests__/LiveScreen.test.tsx +111 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/pyproject.toml +11 -2
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/samples/sample-forge/data/results/backtest_results.db +0 -0
- alpha_visualizer-0.7.2/scripts/compare_sqlite_dump.py +66 -0
- alpha_visualizer-0.7.2/scripts/verify_build_artifacts.py +93 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/src/alpha_visualizer/__init__.py +1 -1
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/src/alpha_visualizer/app.py +11 -1
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/src/alpha_visualizer/cli.py +5 -2
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/src/alpha_visualizer/forge_config.py +30 -5
- alpha_visualizer-0.7.2/src/alpha_visualizer/static/assets/BrowsePage-B7NJWk-W.js +2 -0
- alpha_visualizer-0.7.2/src/alpha_visualizer/static/assets/BrowsePage-B7NJWk-W.js.map +1 -0
- alpha_visualizer-0.7.2/src/alpha_visualizer/static/assets/ComparePage-Brk6b7s3.js +2 -0
- alpha_visualizer-0.7.2/src/alpha_visualizer/static/assets/ComparePage-Brk6b7s3.js.map +1 -0
- alpha_visualizer-0.7.2/src/alpha_visualizer/static/assets/DetailPage-RbPDGMb3.js +2 -0
- alpha_visualizer-0.7.2/src/alpha_visualizer/static/assets/DetailPage-RbPDGMb3.js.map +1 -0
- alpha_visualizer-0.7.2/src/alpha_visualizer/static/assets/IdeasPage-BEPzOoeJ.js +2 -0
- alpha_visualizer-0.7.2/src/alpha_visualizer/static/assets/IdeasPage-BEPzOoeJ.js.map +1 -0
- alpha_visualizer-0.7.2/src/alpha_visualizer/static/assets/LivePage-DeKnCzqb.js +2 -0
- alpha_visualizer-0.7.2/src/alpha_visualizer/static/assets/LivePage-DeKnCzqb.js.map +1 -0
- alpha_visualizer-0.7.2/src/alpha_visualizer/static/assets/LiveTab-B9tKV9zX.js +2 -0
- alpha_visualizer-0.7.2/src/alpha_visualizer/static/assets/LiveTab-B9tKV9zX.js.map +1 -0
- alpha_visualizer-0.7.2/src/alpha_visualizer/static/assets/SettingsToggles-CM8XnjQC.js +2 -0
- alpha_visualizer-0.7.2/src/alpha_visualizer/static/assets/SettingsToggles-CM8XnjQC.js.map +1 -0
- alpha_visualizer-0.7.2/src/alpha_visualizer/static/assets/Sparkline-BcO_EWxr.js +2 -0
- alpha_visualizer-0.7.2/src/alpha_visualizer/static/assets/Sparkline-BcO_EWxr.js.map +1 -0
- alpha_visualizer-0.7.2/src/alpha_visualizer/static/assets/featureFlags-A2oZeWlh.js +3 -0
- alpha_visualizer-0.7.2/src/alpha_visualizer/static/assets/featureFlags-A2oZeWlh.js.map +1 -0
- alpha_visualizer-0.7.2/src/alpha_visualizer/static/assets/fonts-DJsrEZjK.css +1 -0
- alpha_visualizer-0.7.2/src/alpha_visualizer/static/assets/format-D00KW3px.js +2 -0
- alpha_visualizer-0.7.2/src/alpha_visualizer/static/assets/format-D00KW3px.js.map +1 -0
- alpha_visualizer-0.7.2/src/alpha_visualizer/static/assets/index-Cbl7J_5s.css +1 -0
- alpha_visualizer-0.7.2/src/alpha_visualizer/static/assets/index-Drd2-lJN.js +6 -0
- alpha_visualizer-0.7.2/src/alpha_visualizer/static/assets/index-Drd2-lJN.js.map +1 -0
- alpha_visualizer-0.7.2/src/alpha_visualizer/static/assets/inter-tight-latin-400-normal-BLrFJfvD.woff +0 -0
- alpha_visualizer-0.7.2/src/alpha_visualizer/static/assets/inter-tight-latin-400-normal-iW8qmuJY.woff2 +0 -0
- alpha_visualizer-0.7.2/src/alpha_visualizer/static/assets/inter-tight-latin-500-normal-BFXNXuvF.woff2 +0 -0
- alpha_visualizer-0.7.2/src/alpha_visualizer/static/assets/inter-tight-latin-500-normal-pobXraBK.woff +0 -0
- alpha_visualizer-0.7.2/src/alpha_visualizer/static/assets/inter-tight-latin-600-normal-BgSTtRxb.woff2 +0 -0
- alpha_visualizer-0.7.2/src/alpha_visualizer/static/assets/inter-tight-latin-600-normal-D7bG6gX1.woff +0 -0
- alpha_visualizer-0.7.2/src/alpha_visualizer/static/assets/jetbrains-mono-latin-500-normal-BWZEU5yA.woff2 +0 -0
- alpha_visualizer-0.7.2/src/alpha_visualizer/static/assets/jetbrains-mono-latin-500-normal-CJOVTJB7.woff +0 -0
- alpha_visualizer-0.7.2/src/alpha_visualizer/static/assets/react-cUP_GJAW.js +10 -0
- alpha_visualizer-0.7.2/src/alpha_visualizer/static/assets/react-cUP_GJAW.js.map +1 -0
- alpha_visualizer-0.7.2/src/alpha_visualizer/static/assets/rolldown-runtime-DDdRRPPX.js +1 -0
- alpha_visualizer-0.7.2/src/alpha_visualizer/static/assets/source-serif-4-latin-600-normal-DMD1h6_f.woff +0 -0
- alpha_visualizer-0.7.2/src/alpha_visualizer/static/assets/source-serif-4-latin-600-normal-DouSKlru.woff2 +0 -0
- alpha_visualizer-0.7.2/src/alpha_visualizer/static/assets/tv-rsB_oRi5.js +2 -0
- alpha_visualizer-0.7.2/src/alpha_visualizer/static/assets/tv-rsB_oRi5.js.map +1 -0
- alpha_visualizer-0.7.2/src/alpha_visualizer/static/assets/useBacktestData-BehdHkgb.js +2 -0
- alpha_visualizer-0.7.2/src/alpha_visualizer/static/assets/useBacktestData-BehdHkgb.js.map +1 -0
- alpha_visualizer-0.7.2/src/alpha_visualizer/static/assets/visx-D9BH_cru.js +2 -0
- alpha_visualizer-0.7.2/src/alpha_visualizer/static/assets/visx-D9BH_cru.js.map +1 -0
- alpha_visualizer-0.7.2/src/alpha_visualizer/static/favicon.svg +1 -0
- alpha_visualizer-0.7.2/src/alpha_visualizer/static/icons.svg +24 -0
- alpha_visualizer-0.7.2/src/alpha_visualizer/static/index.html +53 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/tests/fixtures/build_e2e_fixture.py +23 -11
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/tests/test_app.py +53 -0
- alpha_visualizer-0.7.2/tests/test_compare_sqlite_dump.py +81 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/tests/test_forge_config.py +41 -3
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/uv.lock +1 -1
- alpha_visualizer-0.7.1/docs/screenshots/en/browse.png +0 -0
- alpha_visualizer-0.7.1/docs/screenshots/en/compare.png +0 -0
- alpha_visualizer-0.7.1/docs/screenshots/en/detail.png +0 -0
- alpha_visualizer-0.7.1/docs/screenshots/en/optimize.png +0 -0
- alpha_visualizer-0.7.1/docs/screenshots/en/strategy.png +0 -0
- alpha_visualizer-0.7.1/docs/screenshots/ja/browse.png +0 -0
- alpha_visualizer-0.7.1/docs/screenshots/ja/compare.png +0 -0
- alpha_visualizer-0.7.1/docs/screenshots/ja/detail.png +0 -0
- alpha_visualizer-0.7.1/docs/screenshots/ja/optimize.png +0 -0
- alpha_visualizer-0.7.1/docs/screenshots/ja/strategy.png +0 -0
- alpha_visualizer-0.7.1/frontend/e2e/screenshots/capture.spec.ts +0 -113
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/.agents/skills/source-command-audit-licenses/SKILL.md +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/.agents/skills/source-command-pre-release/SKILL.md +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/.claude/commands/audit-licenses.md +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/.claude/commands/pre-release.md +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/.codex/hooks.json +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/.github/ISSUE_TEMPLATE/bug_report_ja.yml +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/.github/ISSUE_TEMPLATE/feature_request_ja.yml +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/.github/codeql/README.md +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/.github/codeql/codeql-config.yml +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/.github/dependabot.yml +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/.github/workflows/codeql.yml +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/.gitignore +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/.hypothesis/.gitignore +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/.hypothesis/constants/0bf3463e8f4751b8 +0 -0
- /alpha_visualizer-0.7.1/.hypothesis/constants/dd2b62c354789905 → /alpha_visualizer-0.7.2/.hypothesis/constants/0f38aca28193156b +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/.hypothesis/constants/10d56fd11d90e91d +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/.hypothesis/constants/2826595e28fa870a +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/.hypothesis/constants/291dc4c40995bea6 +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/.hypothesis/constants/312a7aaf12a1fd47 +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/.hypothesis/constants/331e194303817b32 +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/.hypothesis/constants/368f2bae545df6be +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/.hypothesis/constants/3f7b61d4b4a660e1 +0 -0
- /alpha_visualizer-0.7.1/.hypothesis/constants/11405f641e79317e → /alpha_visualizer-0.7.2/.hypothesis/constants/43f703bafb1e4b04 +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/.hypothesis/constants/4577b97f57a8a832 +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/.hypothesis/constants/4726660442f99a00 +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/.hypothesis/constants/4a1c4d1532cab28e +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/.hypothesis/constants/508b282112ab038e +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/.hypothesis/constants/757b1f8305546439 +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/.hypothesis/constants/7d3b67d825fc154a +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/.hypothesis/constants/7f90c9d611001617 +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/.hypothesis/constants/828ed73d45fcee28 +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/.hypothesis/constants/82e279d41edd645d +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/.hypothesis/constants/89aaa48f251cd53d +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/.hypothesis/constants/89d70ebe84c5b2b7 +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/.hypothesis/constants/8add761403393fca +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/.hypothesis/constants/90fccc12da2fa6c9 +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/.hypothesis/constants/96ca93165140d446 +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/.hypothesis/constants/97982d8e7c8d4a95 +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/.hypothesis/constants/a636a4647020033d +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/.hypothesis/constants/ab4df659c6b192db +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/.hypothesis/constants/b76328deebb21ae6 +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/.hypothesis/constants/b9ff5bcd3a53e3a7 +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/.hypothesis/constants/bd75c3c18e8ba4f4 +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/.hypothesis/constants/c5349cb90ddc7968 +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/.hypothesis/constants/c5f6cf064ffb412d +0 -0
- /alpha_visualizer-0.7.1/.hypothesis/constants/aadcc0d08f3b7739 → /alpha_visualizer-0.7.2/.hypothesis/constants/cd09731f3dfbf59f +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/.hypothesis/constants/d4cc884f331eee77 +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/.hypothesis/constants/da39a3ee5e6b4b0d +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/.hypothesis/constants/e44a457d795e56c2 +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/.hypothesis/constants/ea2d606acbfff989 +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/.hypothesis/constants/ee487c54cd5ca7dc +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/.hypothesis/constants/eed5e66c16ae84b8 +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/.hypothesis/constants/f2f91c7f9b44111d +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/.hypothesis/constants/f7c4a04c97c0daf8 +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/.hypothesis/constants/f7f9c6b3c86f63a8 +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/.hypothesis/constants/fa443af6269a6e02 +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/.hypothesis/constants/fe325b4404aa1121 +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/.hypothesis/constants/ff4517cbfe51fea1 +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/AGENTS.md +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/CLAUDE.md +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/CODE_OF_CONDUCT.en.md +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/CODE_OF_CONDUCT.md +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/CONTRIBUTING.en.md +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/CONTRIBUTING.md +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/LICENSE +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/NOTICE +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/SECURITY.en.md +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/SECURITY.md +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/THIRDPARTY_LICENSES.txt +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/cliff.toml +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/docs/adr/0001-pages-vs-screens.md +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/docs/adr/0002-charts-visx-vs-components.md +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/docs/adr/0003-openapi-typescript-codegen.md +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/docs/adr/0004-condition-node-discriminated-union.md +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/docs/lighthouse-ci.md +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/docs/screenshots/en/ideas.png +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/docs/screenshots/en/strategy-signal-tv.png +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/docs/screenshots/ja/ideas.png +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/docs/screenshots/ja/strategy-signal-tv.png +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/.gitignore +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/.npmrc +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/.size-limit.json +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/.storybook/main.ts +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/.storybook/preview.ts +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/CLAUDE.md +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/README.md +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/THIRDPARTY_FONTS.md +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/e2e/fixtures/README.md +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/e2e/fixtures/forge/data/historical/SPY_1d.parquet +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/e2e/fixtures/forge/data/ideas/ideas.json +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/e2e/fixtures/forge/data/strategies/momo_breakout.json +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/e2e/fixtures/forge/data/strategies/rsi_reversal.json +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/e2e/fixtures/forge/data/strategies/sma_cross.json +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/e2e/fixtures/forge/forge.yaml +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/e2e/helpers/locators.ts +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/e2e/samples/sample-fixture.spec.ts +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/e2e/screenshots/equity-tv.spec.ts +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/e2e/screenshots/strategy-signal-tv.spec.ts +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/e2e/specs/browse.spec.ts +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/e2e/specs/compare.spec.ts +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/e2e/specs/detail.spec.ts +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/e2e/specs/i18n.spec.ts +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/eslint.config.js +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/index.html +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/openapi.json +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/package.json +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/playwright.config.ts +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/playwright.samples.config.ts +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/playwright.screenshots.config.ts +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/pnpm-lock.yaml +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/pnpm-workspace.yaml +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/public/favicon.svg +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/public/icons.svg +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/api/__tests__/client.test.ts +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/api/client.ts +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/api/types.gen.ts +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/charts/tv/CompareEquityTV.stories.tsx +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/charts/tv/CompareEquityTV.tsx +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/charts/tv/EquityDrawdownPaneTV.stories.tsx +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/charts/tv/EquityDrawdownPaneTV.tsx +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/charts/tv/RollingMetricsChartTV.stories.tsx +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/charts/tv/RollingMetricsChartTV.tsx +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/charts/tv/StrategySignalChartTV.stories.tsx +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/charts/tv/StrategySignalChartTV.tsx +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/charts/tv/WFOEquityTV.stories.tsx +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/charts/tv/WFOEquityTV.tsx +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/charts/tv/__tests__/CompareEquityTV.test.tsx +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/charts/tv/__tests__/EquityDrawdownPaneTV.test.tsx +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/charts/tv/__tests__/RollingMetricsChartTV.test.tsx +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/charts/tv/__tests__/StrategySignalChartTV.test.tsx +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/charts/tv/__tests__/WFOEquityTV.test.tsx +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/charts/tv/__tests__/data.test.ts +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/charts/tv/__tests__/theme.test.ts +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/charts/tv/__tests__/trades.test.ts +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/charts/tv/data.ts +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/charts/tv/theme.ts +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/charts/tv/trades.ts +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/charts/visx/AnnualReturnsBarV.tsx +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/charts/visx/CompareEquityV.tsx +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/charts/visx/CorrelationHeatmapV.tsx +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/charts/visx/DrawdownChartV.tsx +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/charts/visx/EquityChartV.tsx +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/charts/visx/MAEMFEScatterV.tsx +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/charts/visx/MonthlyHeatmapV.tsx +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/charts/visx/OptimizeScatterV.tsx +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/charts/visx/Sparkline.stories.tsx +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/charts/visx/Sparkline.tsx +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/charts/visx/__tests__/EquityChartV.regime.test.ts +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/charts/visx/regimeBands.ts +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/components/CommandPalette.tsx +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/components/DetailToolbar.tsx +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/components/MetricsSummaryBarV2.stories.tsx +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/components/MetricsSummaryBarV2.tsx +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/components/RootLayout.tsx +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/components/SettingsToggles.tsx +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/components/StrategyHero.tsx +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/components/__tests__/CommandPalette.test.tsx +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/components/__tests__/CorrelationHeatmap.test.tsx +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/components/__tests__/responsive-styles.test.tsx +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/components/browser/CompareFloatingBar.tsx +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/components/browser/FilterBar.tsx +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/components/browser/GroupByToggle.tsx +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/components/browser/Heroline.tsx +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/components/browser/RunHistoryTab.tsx +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/components/browser/SavedViews.tsx +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/components/browser/StrategySlidePanel.tsx +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/components/browser/StrategyTable.tsx +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/components/browser/SymbolAtlas.tsx +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/components/browser/SymbolCard.tsx +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/components/charts/AnnualReturnsBar.tsx +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/components/charts/CorrelationHeatmap.tsx +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/components/charts/DrawdownDetailChart.tsx +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/components/charts/MAEMFEScatter.tsx +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/components/charts/MonteCarloChart.tsx +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/components/charts/OptimizeScatter.tsx +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/components/charts/ReturnDistributionChart.tsx +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/components/charts/RollingMetricsChart.tsx +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/components/charts/VaRChart.tsx +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/components/charts/WFOTimeline.tsx +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/components/charts/WeekdayPerformanceChart.tsx +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/components/live/__tests__/format.test.ts +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/components/metrics/CompareTable.tsx +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/components/metrics/ISOOSMetrics.tsx +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/components/metrics/MetricsGrid.tsx +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/components/metrics/RegimeBreakdownCards.tsx +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/components/metrics/SignalQualityBadge.tsx +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/components/metrics/__tests__/evaluateGood.test.ts +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/components/metrics/evaluate.ts +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/components/nav.ts +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/components/trades/TradeTable.tsx +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/constants/featureFlags.ts +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/constants/metricDefinitions.ts +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/contexts/DashboardContext.tsx +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/contexts/dashboardConstants.ts +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/design/a11y.css +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/design/primitives/Button.tsx +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/design/primitives/Card.tsx +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/design/primitives/Chip.tsx +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/design/primitives/Divider.tsx +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/design/primitives/KeyValue.tsx +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/design/primitives/OverflowMenu.tsx +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/design/primitives/Pill.stories.tsx +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/design/primitives/Pill.tsx +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/design/primitives/SectionHeader.tsx +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/design/primitives/Stat.stories.tsx +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/design/primitives/Stat.tsx +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/design/primitives/TabBar.tsx +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/design/primitives/Toolbar.tsx +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/design/primitives/__tests__/OverflowMenu.test.tsx +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/design/primitives/index.ts +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/design/tokens.css +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/design/useChartTheme.ts +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/hooks/__tests__/useEquityViewport.test.ts +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/hooks/__tests__/useFetchByKey.test.ts +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/hooks/__tests__/useScrollRestoration.test.tsx +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/hooks/__tests__/useStrategyHistorical.test.tsx +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/hooks/__tests__/useStrategyList.test.tsx +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/hooks/__tests__/useTheme.test.tsx +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/hooks/useBacktestData.ts +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/hooks/useDebounce.ts +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/hooks/useEquityViewport.ts +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/hooks/useFetchByKey.ts +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/hooks/useIdeasList.ts +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/hooks/useRecentStrategies.ts +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/hooks/useScrollRestoration.ts +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/hooks/useSparklineCache.ts +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/hooks/useStrategyHistorical.ts +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/hooks/useStrategyList.ts +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/hooks/useSymbolStats.ts +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/hooks/useTheme.ts +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/i18n/__tests__/strings.test.ts +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/i18n/strings.ts +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/lib/__tests__/correlation.test.ts +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/lib/__tests__/distribution.test.ts +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/lib/__tests__/drawdown.test.ts +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/lib/__tests__/format.test.ts +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/lib/__tests__/monteCarlo.properties.test.ts +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/lib/__tests__/monteCarlo.test.ts +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/lib/__tests__/rolling.test.ts +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/lib/__tests__/searchParams.test.ts +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/lib/__tests__/searchStrategies.test.ts +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/lib/__tests__/walkForward.test.ts +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/lib/__tests__/weekday.test.ts +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/lib/assetClass.ts +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/lib/correlation.ts +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/lib/csv.ts +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/lib/distribution.ts +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/lib/drawdown.ts +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/lib/exportPng.ts +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/lib/format.ts +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/lib/monteCarlo.ts +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/lib/rolling.ts +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/lib/searchParams.ts +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/lib/searchStrategies.ts +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/lib/walkForward.ts +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/lib/weekday.ts +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/main.tsx +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/mock/btData.ts +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/pages/BrowsePage.tsx +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/pages/ComparePage.tsx +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/pages/DetailPage.tsx +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/pages/IdeasPage.tsx +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/screens/BacktestScreen.stories.tsx +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/screens/BacktestScreen.tsx +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/screens/CompareScreen.stories.tsx +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/screens/CompareScreen.tsx +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/screens/ISOOSScreen.tsx +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/screens/IdeasScreen.stories.tsx +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/screens/IdeasScreen.tsx +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/screens/OptimizeScreen.stories.tsx +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/screens/OptimizeScreen.tsx +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/screens/StrategyScreen.tsx +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/screens/WFOScreen.stories.tsx +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/screens/WFOScreen.tsx +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/screens/strategy/SignalChartCard.tsx +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/src/test-setup.ts +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/tsconfig.app.json +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/tsconfig.e2e.json +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/tsconfig.json +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/tsconfig.node.json +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/frontend/vite.config.ts +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/lighthouserc.json +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/release.sh +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/samples/README.en.md +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/samples/README.md +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/samples/__init__.py +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/samples/_generators/__init__.py +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/samples/_generators/compatibility_matrix.py +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/samples/_generators/ideas_defs.py +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/samples/_generators/pseudo_backtest.py +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/samples/_generators/pseudo_grid.py +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/samples/_generators/pseudo_wfo.py +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/samples/_generators/strategy_defs.py +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/samples/_generators/synthetic_ohlcv.py +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/samples/_generators/writers.py +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/samples/build_samples.py +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/samples/sample-forge/data/ideas/ideas.json +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/samples/sample-forge/data/strategies/bbands_breakout_v1.json +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/samples/sample-forge/data/strategies/donchian_turtle_v1.json +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/samples/sample-forge/data/strategies/ema_adx_macd_v1.json +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/samples/sample-forge/data/strategies/macd_crossover_v1.json +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/samples/sample-forge/data/strategies/range_reversion_v1.json +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/samples/sample-forge/data/strategies/rsi_reversion_v1.json +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/samples/sample-forge/data/strategies/sma_crossover_v1.json +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/samples/sample-forge/data/strategies/supertrend_adx_v1.json +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/samples/sample-forge/forge.yaml +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/scripts/generate_openapi.py +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/src/alpha_visualizer/db.py +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/src/alpha_visualizer/dependencies.py +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/src/alpha_visualizer/errors.py +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/src/alpha_visualizer/log_sanitize.py +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/src/alpha_visualizer/repositories/__init__.py +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/src/alpha_visualizer/repositories/backtest_results.py +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/src/alpha_visualizer/repositories/ideas.py +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/src/alpha_visualizer/repositories/live.py +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/src/alpha_visualizer/repositories/optimization.py +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/src/alpha_visualizer/repositories/strategies.py +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/src/alpha_visualizer/routers/__init__.py +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/src/alpha_visualizer/routers/historical.py +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/src/alpha_visualizer/routers/ideas.py +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/src/alpha_visualizer/routers/live.py +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/src/alpha_visualizer/routers/optimize.py +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/src/alpha_visualizer/routers/results.py +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/src/alpha_visualizer/routers/run.py +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/src/alpha_visualizer/routers/strategies.py +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/src/alpha_visualizer/routers/wfo.py +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/src/alpha_visualizer/schemas/__init__.py +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/src/alpha_visualizer/schemas/historical.py +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/src/alpha_visualizer/schemas/ideas.py +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/src/alpha_visualizer/schemas/live.py +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/src/alpha_visualizer/schemas/optimize.py +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/src/alpha_visualizer/schemas/results.py +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/src/alpha_visualizer/schemas/strategies.py +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/src/alpha_visualizer/schemas/wfo.py +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/src/alpha_visualizer/services/__init__.py +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/src/alpha_visualizer/services/backtest.py +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/src/alpha_visualizer/services/historical.py +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/src/alpha_visualizer/services/live.py +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/src/alpha_visualizer/services/walk_forward.py +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/tests/__init__.py +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/tests/conftest.py +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/tests/factories.py +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/tests/repositories/__init__.py +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/tests/repositories/test_backtest_results_repo.py +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/tests/repositories/test_ideas_reader.py +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/tests/repositories/test_live_repo.py +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/tests/repositories/test_optimization_repo.py +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/tests/repositories/test_strategies_repo.py +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/tests/routers/__init__.py +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/tests/routers/test_forge_yaml_integration.py +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/tests/routers/test_historical.py +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/tests/routers/test_ideas.py +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/tests/routers/test_live.py +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/tests/routers/test_optimize.py +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/tests/routers/test_results.py +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/tests/routers/test_run.py +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/tests/routers/test_strategies.py +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/tests/routers/test_wfo.py +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/tests/samples/__init__.py +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/tests/samples/test_pseudo_backtest.py +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/tests/samples/test_pseudo_grid.py +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/tests/samples/test_pseudo_wfo.py +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/tests/samples/test_sample_forge.py +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/tests/samples/test_strategy_defs.py +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/tests/samples/test_synthetic_ohlcv.py +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/tests/samples/test_writers.py +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/tests/schemas/__init__.py +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/tests/schemas/test_schemas.py +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/tests/services/__init__.py +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/tests/services/test_backtest.py +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/tests/services/test_backtest_properties.py +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/tests/services/test_historical.py +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/tests/services/test_live.py +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/tests/services/test_wfo.py +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/tests/test_cli.py +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/tests/test_db.py +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/tests/test_dependencies.py +0 -0
- {alpha_visualizer-0.7.1 → alpha_visualizer-0.7.2}/tests/test_errors.py +0 -0
- {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: "
|
|
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: "
|
|
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: "
|
|
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 !
|
|
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: "
|
|
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 !
|
|
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: "
|
|
243
|
+
version: "0.11.19"
|
|
181
244
|
|
|
182
245
|
- name: Set up Python
|
|
183
246
|
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: "
|
|
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
|
|
@@ -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.
|
|
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
|
|  |  |
|
|
106
106
|
|
|
107
|
+
**Compare — 戦略間相関ヒートマップ**
|
|
108
|
+
|
|
109
|
+

|
|
110
|
+
|
|
107
111
|
| Optimize | Strategy 構造 |
|
|
108
112
|
|---|---|
|
|
109
113
|
|  |  |
|
|
@@ -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
|
|  |  |
|
|
73
73
|
|
|
74
|
+
**Compare — Strategy correlation heatmap**
|
|
75
|
+
|
|
76
|
+

|
|
77
|
+
|
|
74
78
|
| Optimize | Strategy structure |
|
|
75
79
|
|---|---|
|
|
76
80
|
|  |  |
|
|
@@ -71,6 +71,10 @@ alpha-vis serve --no-open
|
|
|
71
71
|
|---|---|
|
|
72
72
|
|  |  |
|
|
73
73
|
|
|
74
|
+
**Compare — 戦略間相関ヒートマップ**
|
|
75
|
+
|
|
76
|
+

|
|
77
|
+
|
|
74
78
|
| Optimize | Strategy 構造 |
|
|
75
79
|
|---|---|
|
|
76
80
|
|  |  |
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -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)。 */
|