- Docker release workflow now pushes to both GHCR and Docker Hub (gated on DOCKERHUB_TOKEN and DOCKERHUB_USERNAME secrets), and builds linux/amd64 + linux/arm64.
- Manual publish workflow renamed, gains concurrency guard, input validation, pre-publish smoke, and a safer default tag (v1.0.0 instead of latest).
- Windows desktop backend log lines are decoded as streaming UTF-8 with a GBK fallback when replacement chars appear; PYTHONIOENCODING=utf-8 and python -X utf8 are injected to match.
- Docs: publish official image registries, direct docker run usage, and .env/volume mapping guidance; EN compose example synced with the real docker/docker-compose.yml layout.
- CHANGELOG updated under [Unreleased] in flat format.
- Remove duplicate [3.11.0] section that had flat-format entries mixed into structured format
- Remove duplicate Docker WebUI entry from [Unreleased]
- Move misplaced entries (SerpAPI, A股中文资讯, 回测次日验证, LiteLLM简化, Docker配置) into new v3.12.0
- Add missing entry for concurrent shared state locking fix
- Organize all entries since v3.11.0 into proper v3.12.0 release section with structured categories
Replace the CHANGELOG grep gate with a check that the release tag is an
annotated tag with a non-empty message. This means:
- No need to update CHANGELOG before every tag push
- Tag annotation itself serves as the release notes source
- Lightweight tags (no -m message) still fail fast with a clear error
- EfinanceFetcher: switch ETF from ef.fund.get_quote_history (NAV only)
to ef.stock.get_quote_history (full OHLCV) so ETFs get proper
open/high/low/close/volume/amount data instead of zeros
- Remove obsolete NAV column mappings from _normalize_data
- Pin tiktoken>=0.8.0,<0.12.0 to avoid 'Unknown encoding cl100k_base'
plugin registration issue in tiktoken 0.12.0
Fixes#541Fixes#527Fixes#537
- Refresh config.stock_list from .env before each scheduled analysis
so that runtime changes to STOCK_LIST take effect without restart.
- Resolve MIME type explicitly in serve_spa to prevent browsers from
rejecting JS module scripts served as text/plain.
fixes#529fixes#520
Cache ~/Library/Caches/electron on macOS runners keyed by
package-lock.json hash, so electron-builder does not re-download
the Electron zip from GitHub on every run.
Add to both Windows and macOS build scripts so
PyInstaller includes litellm's JSON data files (e.g.
model_prices_and_context_window_backup.json) in the packaged executable.
Without this, litellm raises FileNotFoundError at startup when it tries
to load the model cost map via pathlib.Path.read_text().
Affected files:
- scripts/build-backend.ps1
- scripts/build-backend-macos.sh
- Disable Spotlight indexing (sudo mdutil -a -i off) before Electron DMG
build to prevent hdiutil detach race condition on GitHub Actions runners
- Extract current version section from CHANGELOG.md as Release body
- Keep generate_release_notes: true to supplement with auto PR list
- Guard against None/empty response.choices in LLMToolAdapter._call_api()
before accessing choices[0]; raise descriptive ValueError instead of
cryptic TypeError (Fixes#390)
- Change history detail/news endpoint record_id type from int to str;
add _resolve_record() that tries integer PK first then falls back to
query_id lookup; add get_latest_analysis_by_query_id() in storage layer
(Fixes#432)
- Enhance _extract_sniper_points() with multi-level dashboard traversal
(standard path → dashboard dict → raw_response); add _find_sniper_in_dashboard()
recursive search; improve _parse_sniper_value() edge case handling for zero
values, full-width commas, and placeholder strings (Fixes#436)
#patch
- Add prepare_webui_frontend_assets() to main.py: auto-runs npm install && npm
run build in apps/dsa-web before starting FastAPI server
- New env var WEBUI_AUTO_BUILD (default: true) to control auto-build behavior
- Replace bare JSON root response with styled HTML guide page when frontend
static files are not present (api/app.py)
- Remove unused RootResponse import from api/app.py
- Update README.md startup instructions and .env.example documentation
- Add changelog entry in docs/CHANGELOG.md
#patch
Both keys were supported in src/config.py but missing from the workflow
env section, causing them to be silently ignored in GitHub Actions.
- Add AIHUBMIX_KEY (auto-sets base_url to aihubmix.com/v1)
- Add ANTHROPIC_API_KEY + ANTHROPIC_MODEL
- Update config check echo block to show all four AI providers
#patch
- analyzer: Added `decision_type` field (buy/hold/sell) to the AI output schema and system prompt.
- analyzer: Updated `AnalysisResult` dataclass and parsing logic to extract and store the decision type, adding an inference fallback.
- notification: Refactored statistics counting in all report generation methods to use the explicit `decision_type` field instead of fuzzy keyword matching.
- Fixed the discrepancy between individual stock recommendations and- the summary counts in the dashboard.
- akshare_fetcher: Parse volume_ratio (49), PE (39), PB (46), and market cap (44/45) from Tencent API.
- efinance_fetcher: Add parsing for volume_ratio, PE, and market capitalization.
- base.py: Integrated Tushare Pro as an optional real-time quote source.
- config: Reordered default priority to prioritize Tencent (tencent > akshare_sina > efinance > akshare_em).
- documentation: Updated .env.example and GitHub Actions workflow with real-time source priority instructions.
This fix ensures critical indicators like volume ratio (量比) and turnover rate are correctly fetched and displayed across different data sources.
Closes#155
- Implement US stock history fetching in AkshareFetcher
- Implement US stock realtime quotes in YfinanceFetcher
- Add US stock filter to unsupported fetchers (Baostock, Tushare, etc.) to trigger fallback
- Optimize realtime quote fallback strategy to prioritize Yfinance for US stocks
fixes#153
# minor
- Add triple-source fallback for A-share data (EM → Sina → Tencent)
- Add multi-source fallback for chip distribution (Akshare → Tushare → Efinance)
- Fix efinance ETF API parameter errors and OHLC data completion
- Fix tushare index realtime quote code format (sh/sz prefix)
- Fix stock name display issue showing code instead of name
- Upgrade SerpAPI to Google search with Knowledge Graph support
Fixes#206, #171, #139
Related #207
#minor
- Upgrade Tushare priority to -1 when token configured
- Implement realtime quote with Pro/legacy API fallback
- Load .env earlier for proper proxy setup
- Remove unreliable north-bound capital from market analyzer
- Add ETF test scenario, extend stale issue timer (3d -> 7d)
- Refactor proxy config: controlled by USE_PROXY env var, disabled by default
- Fix WeChat message type case sensitivity (store as lowercase)
- Fix HK stock code format hint in error messages (hk -> HK)
- Add Pytdx (通达信) to data sources list
- Add multi-source stock name resolution feature
- Add enhanced search fallback feature
- Update roadmap with Pytdx data source
- Expand .gitignore to block all *.env files (prevents accidental credential leaks like #57)
- Update bug_report.md template to require version confirmation before submitting issues