🎁 Get the FREE AI Skills Starter Guide β€” Subscribe β†’
BytesAgainBytesAgain
πŸ¦€ ClawHub

A-Share Review and Analyse

by @donvink

A-share market automated review and analysis system, generating daily market insights with Gemini AI, supporting publishing to Hugo blog and WeChat Official...

Versionv1.0.1
Downloads739
Stars⭐ 1
TERMINAL
clawhub install stock-review-ai

πŸ“– About This Skill


name: stock-review description: A-share market automated review and analysis system, generating daily market insights with Gemini AI, supporting publishing to Hugo blog and WeChat Official Account version: 1.0.1 metadata: openclaw: homepage: https://github.com/donvink/stock-review requires: anyBins: - python3 - python

πŸš€ Stock Review

πŸ‘‰ Live Demo Blog

GitHub: πŸ‘‰ https://github.com/Donvink/stock-review

Language

Match user's language: Respond in the same language the user uses. If the user writes in Chinese, respond in Chinese. If the user writes in English, respond in English.

Script Directory

Agent Execution: Determine this SKILL.md directory as {baseDir}, then use {baseDir}/scripts/.py. Ensure Python 3.10+ is installed and dependencies are configured.

| Script | Purpose | |------|------| | scripts/fetch_data.py | Fetch A-share market data (indices, stocks, sectors, etc.) | | scripts/analyze.py | Gemini AI analysis of market data | | scripts/post_to_hugo.py | Publish to Hugo blog | | scripts/post_to_wechat.py | Publish to WeChat Official Account | | scripts/main.py | Main execution script, coordinates the entire workflow |

Configuration Preferences

1. Check if config.yaml exists: {baseDir}/stock-review/config.yaml

2. Check if .env file exists and is configured with GEMINI_API_KEY, WECHAT_APP_ID, WECHAT_APP_SECRET: {baseDir}/stock-review/.env

config.yaml supports: Default publishing platforms | Whether to skip AI analysis by default | Default data backtracking days | Default request delay | Default retry count | API key configuration .env supports: API key configuration

Minimum supported keys (case-insensitive, accepts 1/0 or true/false):

| Key | Default | Description | |-----|---------|------| | date | null | Date in YYYYMMDD format | | force_refresh | false | Whether to force refresh already fetched data | | skip_ai_analysis | false | Whether to skip AI analysis | | platforms | ["hugo"] | Default publishing platforms (['hugo']/['wechat']/['hugo', 'wechat']) | | data_dir | null | Directory for data storage | | max_retries | 3 | Default retry count | | request_delay | 0.5 | Default request delay (seconds) | | backtrack_days | 0 | Default data backtracking days | | type | gemini | Model type | | model_name | gemini-2.5-flash | Model name |

Recommended config.yaml example:

# default configuration for stock review skill
review:
  markets:                          # can include "shanghai", "shenzhen", "hongkong"
    - "shanghai"
    - "shenzhen"
    - "hongkong"
  default_period: "daily"           # can be "daily", "weekly", "monthly"
  date: null                        # can be specific date "YYYYMMDD" like "20260101" or null for today
  force_refresh: false              # whether to force refresh data even if cached data is available
  skip_ai_analysis: false           # whether to skip AI analysis and just return raw data
  platforms: ["hugo"]               # platforms to publish the report, e.g. ['hugo', 'wechat'] or ['hugo'] or ['wechat']

paths: data_dir: null # directory to store fetched data and cache, null means current project directory

parameters: max_retries: 3 request_delay: 0.5 backtrack_days: 0 models: type: "gemini" model_name: "gemini-2.5-flash"

.env example:

# Gemini API Key
GEMINI_API_KEY="your_gemini_api_key"

WeChat Official Account Configuration

WECHAT_APP_ID="your_wechat_app_id" WECHAT_APP_SECRET="your_wechat_app_secret"

How to Get a Gemini API Key:

1. Visit the official portal: Go to https://aistudio.google.com/ and log in with your Google account.

2. Create an API Key: Click "Get API key" in the left sidebar, click "Create API key in new project", and copy the generated string (please save it securelyβ€”you won't be able to see the full key again after closing the window).

3. Important Notes: Free Tier: Provides free quota but with request frequency limits (RPM/RPD). Data Privacy: Free tier data may be used for model improvement. For commercially sensitive data, consider enabling the paid mode.

How to Get WeChat Official Account Credentials:

1. Visit https://developers.weixin.qq.com/platform/ 2. Navigate: My Business β†’ Official Account β†’ Development Keys 3. Add a development key, copy the AppID and AppSecret 4. Add the IP address of your machine to the whitelist

Environment Check

Before first use, install the dependencies.

pip install -r {baseDir}/requirements.txt

Check items: Python version | Dependencies | API keys | Network connection | Directory permissions

If any check fails, provide fix guidance:

| Check Item | Fix Method | |-------|----------| | Python version | Install Python 3.10+: brew install python@3.10 (macOS) or apt install python3.10 (Linux) | | Dependencies | Run pip install -r {baseDir}/requirements.txt | | Gemini API key | Configure in .env or via environment variables | | WeChat Official Account credentials | Configure in .env or via environment variables | | Network connection | Check network proxy settings | | Directory permissions | Ensure data/ and content/posts/ directories are writable |

Workflow Overview

Copy this checklist and check items as you progress:

Review Analysis Progress:
  • [ ] Step 0: Load preferences (config.yaml, .env), determine execution parameters
  • [ ] Step 1: Fetch market data
  • [ ] Step 2: Run AI analysis (optional)
  • [ ] Step 3: Generate report
  • [ ] Step 4: Publish to platforms
  • [ ] Step 5: Report complete
  • Step 0: Load Preferences

    Check and load config.yaml settings (see Configuration Preferences section above), parse and store default values for subsequent steps.

    Step 1: Fetch Market Data

    Fetch the following data for the specified date:

    | Data Type | Source | File | |----------|------|------| | Index data | stock_zh_index_spot_sina | data/{date}/index_{date}.csv | | Limit-up pool | stock_zt_pool_em | data/{date}/zt_pool_{date}.csv | | Limit-down pool | stock_zt_pool_dtgc_em | data/{date}/dt_pool_{date}.csv | | Failed limit-up pool | stock_zt_pool_zbgc_em | data/{date}/zb_pool_{date}.csv | | Full market data | stock_zh_a_spot_em | data/{date}/A_stock_{date}.csv | | Top 20 by turnover | Calculated | data/{date}/top_amount_stocks_{date}.csv | | Concept sectors | stock_board_concept_name_em | data/{date}/concept_summary_{date}.csv | | Top traders list | stock_lhb_detail_daily_sina | data/{date}/lhb_{date}.csv | | Watchlist | Calculated | data/{date}/watchlist*_{date}.csv |

    Retry Mechanism:

  • Default 3 retries
  • 0.5 second request interval
  • Automatic fallback to alternative interfaces on failure
  • Step 2: Run AI Analysis

    CRITICAL: Run AI analysis only if:

  • --skip-ai is not set
  • GEMINI_API_KEY is configured (via config.yaml or environment variables)
  • AI Analysis Prompt:

    prompt = f"""
    Role Setting: You are a seasoned A-share strategy analyst with 20 years of experience...

    Task Description: Conduct a multi-dimensional review based on the [daily review data]: 1. 🚩 Market Sentiment Diagnosis 2. πŸ’° Core Themes and Capital Flow 3. πŸͺœ Consecutive Limit-up Gradient and Space Game 4. ⚑ Key Stocks with Abnormal Movements Analysis 5. 🧭 Next Trading Day Strategy Recommendations

    πŸ“Š Daily Review Data: {market_summary} """

    Output: data/{date}/ai_analysis_{date}.md

    Step 3: Generate Reports

    Market Summary Report:

  • File: data/{date}/market_summary_{date}.md
  • Format: Markdown
  • Content: Tabular summary of all data
  • AI Analysis Report (if run):

  • File: data/{date}/ai_analysis_{date}.md
  • Format: Markdown
  • Content: In-depth analysis generated by Gemini
  • Step 4: Publish to Platforms

    Hugo Blog Publishing:

    python3 {baseDir}/scripts/post_to_hugo.py --market-summary  --ai-analysis  --date 
    

    Output: content/posts/stock-analysis-{YYYY-MM-DD}.md

    WeChat Official Account Publishing (requires API credentials):

    python3 {baseDir}/scripts/post_to_wechat.py --market-summary-file  --ai-analysis-file  --date  --cover-file  --title 
    </code></pre></p><p style="margin:8px 0"><strong style="color:#e5e7eb">WeChat Official Account API Request Rules</strong>:
    <li style="color:#94a3b8;margin:3px 0">Endpoint: <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">POST https://api.weixin.qq.com/cgi-bin/draft/add?access_token=ACCESS_TOKEN</code></li>
    <li style="color:#94a3b8;margin:3px 0"><code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">article_type</code>: <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">news</code></li>
    <li style="color:#94a3b8;margin:3px 0">Requires <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">thumb_media_id</code> (cover image)</li>
    <li style="color:#94a3b8;margin:3px 0">Comment settings: <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">need_open_comment=1</code>, <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">only_fans_can_comment=0</code></li></p><p style="margin:8px 0"><h4 style="color:#d1d5db;margin:14px 0 6px;font-size:.95em">Step 5: Completion Report</h4></p><p style="margin:8px 0"><strong style="color:#e5e7eb">Success Report</strong>:</p><p style="margin:8px 0"><pre style="background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0"><code style="color:#a5f3fc;background:none;padding:0;font-size:1em">βœ… A-share Review Analysis Complete!</p><p style="margin:8px 0">Date: 2026-03-04
    Data: data/20260304/ (12 files)
    AI Analysis: βœ“ Generated (Gemini 2.0 Flash)</p><p style="margin:8px 0">Published Platforms:
    β†’ Hugo Blog: content/posts/stock-analysis-2026-03-04.md
    β†’ WeChat Official Account: Draft ID: abc123def456</p><p style="margin:8px 0">Market Snapshot:
    β€’ Shanghai Composite: 3350.52 (+1.02%)
    β€’ Turnover: 1.95 trillion
    β€’ Advance/Decline: 2857 / 2058
    β€’ Limit-up/Limit-down: 78 / 3</p><p style="margin:8px 0">View Blog: https://donvink.github.io/stock-review/
    </code></pre></p><p style="margin:8px 0"><strong style="color:#e5e7eb">Error Report</strong>:</p><p style="margin:8px 0"><pre style="background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0"><code style="color:#a5f3fc;background:none;padding:0;font-size:1em">❌ Review Analysis Failed</p><p style="margin:8px 0">Error: Unable to fetch limit-up pool data
    Suggestions: 
    1. Check network connection
    2. Try --force parameter to force refresh
    3. Use --date to specify another date
    </code></pre></p><p style="margin:8px 0"><h3 style="color:#e5e7eb;margin:18px 0 8px;font-size:1.05em">Detailed Feature Description</h3></p><p style="margin:8px 0"><h4 style="color:#d1d5db;margin:14px 0 6px;font-size:.95em">Data Fetching Module</h4></p><p style="margin:8px 0">| Function | Purpose | Retry | Cache |
    |------|------|------|------|
    | <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">stock_summary()</code> | Fetch index data | βœ“ | βœ“ |
    | <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">stock_zt_dt_pool()</code> | Fetch limit-up/down data | βœ“ | βœ“ |
    | <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">fetch_all_stock_data()</code> | Fetch full market data | βœ“ (3 times) | βœ“ |
    | <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">get_top_amount_stocks()</code> | Fetch top 20 by turnover | βœ“ | βœ“ |
    | <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">get_concept_summary()</code> | Fetch concept sectors | βœ“ | βœ“ |
    | <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">get_lhb_data()</code> | Fetch top traders list | βœ“ | βœ“ |</p><p style="margin:8px 0"><h4 style="color:#d1d5db;margin:14px 0 6px;font-size:.95em">AI Analysis Module</h4></p><p style="margin:8px 0"><strong style="color:#e5e7eb">Model</strong>: <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">gemini-2.5-flash</code></p><p style="margin:8px 0"><strong style="color:#e5e7eb">Analysis Dimensions</strong>:
    1. <strong style="color:#e5e7eb">Market Sentiment Diagnosis</strong> - Advance/decline ratio, limit-up/down comparison, turnover
    2. <strong style="color:#e5e7eb">Core Theme Tracking</strong> - Capital flow, hot sectors
    3. <strong style="color:#e5e7eb">Consecutive Limit-up Gradient Analysis</strong> - Space board height, limit-up structure
    4. <strong style="color:#e5e7eb">Abnormal Movement Stock Analysis</strong> - High turnover, top traders list
    5. <strong style="color:#e5e7eb">Next Day Strategy Recommendations</strong> - Data-based trading suggestions</p><p style="margin:8px 0"><h4 style="color:#d1d5db;margin:14px 0 6px;font-size:.95em">Publishing Module</h4></p><p style="margin:8px 0">| Platform | Method | Requirements | Output |
    |------|------|------|------|
    | Hugo Blog | File write | None | Markdown file |
    | WeChat Official Account | API | AppID/Secret | Draft ID |</p><p style="margin:8px 0"><h3 style="color:#e5e7eb;margin:18px 0 8px;font-size:1.05em">Feature Comparison</h3></p><p style="margin:8px 0">| Feature | Data Fetching | AI Analysis | Hugo Publishing | WeChat Publishing |
    |------|----------|--------|----------|----------|
    | Auto-fetch latest date | βœ“ | - | - | - |
    | Data caching | βœ“ | - | - | - |
    | Retry mechanism | βœ“ | - | - | - |
    | Multi-source backup | βœ“ | - | - | - |
    | Format values (hundreds millions/ten thousands) | βœ“ | - | - | - |
    | Filter ST stocks | βœ“ | - | - | - |
    | Watchlist construction | βœ“ | - | - | - |
    | Market sentiment diagnosis | - | βœ“ | - | - |
    | Limit-up gradient analysis | - | βœ“ | - | - |
    | Strategy recommendations | - | βœ“ | - | - |
    | Markdown format | - | βœ“ | βœ“ | βœ“ |
    | Timezone handling | - | - | βœ“ | - |
    | Hugo frontmatter | - | - | βœ“ | - |
    | WeChat HTML conversion | - | - | - | βœ“ |
    | Comment settings | - | - | - | βœ“ |</p><p style="margin:8px 0"><h3 style="color:#e5e7eb;margin:18px 0 8px;font-size:1.05em">Prerequisites</h3></p><p style="margin:8px 0"><strong style="color:#e5e7eb">Required</strong>:
    <li style="color:#94a3b8;margin:3px 0">Python 3.10+</li>
    <li style="color:#94a3b8;margin:3px 0">Dependencies: <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">pip install -r requirements.txt</code></li>
    <li style="color:#94a3b8;margin:3px 0">Gemini API key (for AI analysis)</li></p><p style="margin:8px 0"><strong style="color:#e5e7eb">Optional</strong>:
    <li style="color:#94a3b8;margin:3px 0">WeChat Official Account AppID and AppSecret (for WeChat publishing)</li>
    <li style="color:#94a3b8;margin:3px 0">Hugo blog environment (for blog publishing)</li></p><p style="margin:8px 0"><strong style="color:#e5e7eb">Configuration Locations</strong> (priority order):
    1. CLI parameters
    2. config.yaml, .env (project-level/user-level)
    3. Environment variables
    4. Default values</p><p style="margin:8px 0"><h3 style="color:#e5e7eb;margin:18px 0 8px;font-size:1.05em">Troubleshooting</h3></p><p style="margin:8px 0">| Issue | Solution |
    |------|----------|
    | Unable to fetch data | Check network, specify another date |
    | Gemini API error | Check if API key is valid, quota is sufficient |
    | Limit-up pool data empty | Possibly non-trading day, try backtracking to another date |
    | WeChat publishing failed | Check AppID/Secret, <strong style="color:#e5e7eb">confirm IP is whitelisted</strong> |
    | Chinese character encoding issues | Ensure file encoding is UTF-8 |
    | Data format error | Check CSV files, ensure code column isn't converted to numbers |
    | Timeout error | Increase <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">request_delay</code> or <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">max_retries</code> |
    | Insufficient memory | Reduce data volume or process in batches |</p><p style="margin:8px 0"><h3 style="color:#e5e7eb;margin:18px 0 8px;font-size:1.05em">Extension Support</h3></p><p style="margin:8px 0">Customize via config.yaml. See the <strong style="color:#e5e7eb">Configuration Preferences</strong> section for supported options.</p><p style="margin:8px 0"><h3 style="color:#e5e7eb;margin:18px 0 8px;font-size:1.05em">Related References</h3></p><p style="margin:8px 0">| Topic | Reference |
    |------|------|
    | AkShare Documentation | https://akshare.akfamily.xyz/index.html |
    | Gemini API | https://aistudio.google.com/ |
    | WeChat Official Account API | https://developers.weixin.qq.com/platform |
    | Hugo Documentation | https://gohugo.io/ |</p><p style="margin:8px 0"><h3 style="color:#e5e7eb;margin:18px 0 8px;font-size:1.05em">Version History</h3></p><p style="margin:8px 0">| Version | Date | Changes |
    |------|------|------|
    | 1.0.0 | 2026-03-11 | Initial version |
    </p></div></section><section class="skill-card" style="margin-bottom:20px"><h2 style="color:#f8fafc;font-size:1.2em;font-weight:800;margin:0 0 16px;display:flex;align-items:center;gap:8px">βš™οΈ Configuration</h2><div style="font-size:.92em;color:#94a3b8;line-height:1.75"><p style="margin:8px 0"><strong style="color:#e5e7eb">Required</strong>:
    <li style="color:#94a3b8;margin:3px 0">Python 3.10+</li>
    <li style="color:#94a3b8;margin:3px 0">Dependencies: <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">pip install -r requirements.txt</code></li>
    <li style="color:#94a3b8;margin:3px 0">Gemini API key (for AI analysis)</li></p><p style="margin:8px 0"><strong style="color:#e5e7eb">Optional</strong>:
    <li style="color:#94a3b8;margin:3px 0">WeChat Official Account AppID and AppSecret (for WeChat publishing)</li>
    <li style="color:#94a3b8;margin:3px 0">Hugo blog environment (for blog publishing)</li></p><p style="margin:8px 0"><strong style="color:#e5e7eb">Configuration Locations</strong> (priority order):
    1. CLI parameters
    2. config.yaml, .env (project-level/user-level)
    3. Environment variables
    4. Default values</p></div></section><section class="skill-card" style="margin-bottom:20px"><h2 style="color:#f8fafc;font-size:1.2em;font-weight:800;margin:0 0 16px;display:flex;align-items:center;gap:8px">πŸ“‹ Tips & Best Practices</h2><div style="font-size:.92em;color:#94a3b8;line-height:1.75"><p style="margin:8px 0">| Issue | Solution |
    |------|----------|
    | Unable to fetch data | Check network, specify another date |
    | Gemini API error | Check if API key is valid, quota is sufficient |
    | Limit-up pool data empty | Possibly non-trading day, try backtracking to another date |
    | WeChat publishing failed | Check AppID/Secret, <strong style="color:#e5e7eb">confirm IP is whitelisted</strong> |
    | Chinese character encoding issues | Ensure file encoding is UTF-8 |
    | Data format error | Check CSV files, ensure code column isn't converted to numbers |
    | Timeout error | Increase <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">request_delay</code> or <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">max_retries</code> |
    | Insufficient memory | Reduce data volume or process in batches |</p></div></section></div><div class="two-col-side"></div></div></div><script>
            document.querySelectorAll('.copy-btn, .script-copy-btn').forEach(btn => {
              btn.addEventListener('click', () => {
                const cmd = btn.getAttribute('data-cmd');
                if (!cmd) return;
                navigator.clipboard.writeText(cmd).then(() => {
                  const orig = btn.textContent;
                  btn.textContent = 'Copied!';
                  setTimeout(() => btn.textContent = orig, 1500);
                }).catch(() => {});
              });
            });
          </script><!--$--><!--/$--></main><footer style="background:var(--bg-primary);border-top:1px solid var(--border-secondary);margin-top:60px"><div style="border-top:1px solid var(--border-light);max-width:1200px;margin:0 auto;padding:24px 20px"><div style="display:flex;justify-content:space-between;flex-wrap:wrap;gap:24px;margin-bottom:24px"><div><div style="font-weight:700;color:var(--text-muted);margin-bottom:8px">BytesAgain</div><div style="color:var(--text-muted3);font-size:.82em;max-width:200px">Discover the best AI agent skills for your workflow.</div></div><div><div style="color:var(--text-muted);font-size:.75em;text-transform:uppercase;letter-spacing:1px;margin-bottom:10px">Explore</div><div style="margin-bottom:6px"><a href="/skills" style="color:var(--text-muted2);text-decoration:none;font-size:.85em">Skills</a></div><div style="margin-bottom:6px"><a href="/articles" style="color:var(--text-muted2);text-decoration:none;font-size:.85em">Articles</a></div><div style="margin-bottom:6px"><a href="/use-case" style="color:var(--text-muted2);text-decoration:none;font-size:.85em">Cases</a></div></div><div><div style="color:var(--text-muted);font-size:.75em;text-transform:uppercase;letter-spacing:1px;margin-bottom:10px">Company</div><div style="margin-bottom:6px"><a href="/about" style="color:var(--text-muted2);text-decoration:none;font-size:.85em">About</a></div><div style="margin-bottom:6px"><a href="/contact" style="color:var(--text-muted2);text-decoration:none;font-size:.85em">Contact</a></div><div style="margin-bottom:6px"><a href="/privacy-policy" style="color:var(--text-muted2);text-decoration:none;font-size:.85em">Privacy Policy</a></div><div style="margin-bottom:6px"><a href="/terms" style="color:var(--text-muted2);text-decoration:none;font-size:.85em">Terms</a></div><div style="margin-bottom:6px"><a href="/feedback" style="color:var(--text-muted2);text-decoration:none;font-size:.85em">Feedback</a></div></div></div><div style="border-top:1px solid var(--border-light);padding-top:16px"><div style="color:var(--text-muted4);font-size:.8em;margin-bottom:8px">Β© <!-- -->2026<!-- --> BytesAgain. All rights reserved.</div><div style="color:var(--text-muted5);font-size:.75em;line-height:1.6;max-width:720px">BytesAgain is an independent skill directory. We index and link to third-party content (ClawHub, GitHub, LobeHub, Dify, etc.) for informational purposes only. All trademarks, skill names, and content are the property of their respective owners. BytesAgain does not claim ownership of any indexed content.</div></div></div></footer><button style="position:fixed;bottom:28px;right:28px;z-index:1000;width:48px;height:48px;border-radius:50%;border:none;cursor:pointer;background:linear-gradient(135deg,#667eea,#00d4ff);color:#fff;font-size:1.3em;box-shadow:0 4px 20px #667eea66;display:flex;align-items:center;justify-content:center;transition:transform .2s">πŸ’¬</button><script src="/_next/static/chunks/0ze4gu236oq96.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[62894,[\"/_next/static/chunks/0ph_0rx9ah5dc.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"/_next/static/chunks/0i_x3w546rsb3.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"/_next/static/chunks/06ig5gym-0n-u.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\"],\"LangProvider\"]\n3:I[89220,[\"/_next/static/chunks/0ph_0rx9ah5dc.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"/_next/static/chunks/0i_x3w546rsb3.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"/_next/static/chunks/06ig5gym-0n-u.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\"],\"ThemeProvider\"]\n4:I[16988,[\"/_next/static/chunks/0ph_0rx9ah5dc.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"/_next/static/chunks/0i_x3w546rsb3.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"/_next/static/chunks/06ig5gym-0n-u.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\"],\"default\"]\ne:I[68027,[\"/_next/static/chunks/0ph_0rx9ah5dc.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"/_next/static/chunks/0i_x3w546rsb3.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"/_next/static/chunks/06ig5gym-0n-u.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\"],\"default\",1]\n:HL[\"/_next/static/chunks/051nc0vy_6.rl.css?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"style\"]\n:HL[\"/_next/static/media/caa3a2e1cccd8315-s.p.09~u27dqhyhd6.woff2?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"font\",{\"crossOrigin\":\"\",\"type\":\"font/woff2\"}]\n5:Td5e,"])</script><script>self.__next_f.push([1,"[{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"BytesAgain\",\"url\":\"https://bytesagain.com\",\"description\":\"Search 60,000+ verified AI agent skills via MCP API or REST. Supports 7 languages. Free, no auth required.\",\"inLanguage\":[\"en\",\"zh\",\"es\",\"fr\",\"de\",\"ja\",\"ko\"],\"potentialAction\":{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https://bytesagain.com/skills?q={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}},{\"@context\":\"https://schema.org\",\"@type\":\"Organization\",\"name\":\"BytesAgain\",\"url\":\"https://bytesagain.com\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://bytesagain.com/og-image.png\"},\"description\":\"AI agent skill directory. Search 60,000+ skills, 1,000+ use cases, and community requests.\",\"foundingDate\":\"2026\",\"foundingLocation\":{\"@type\":\"Place\",\"name\":\"Global\"},\"sameAs\":[\"https://x.com/bytesagain\",\"https://github.com/bytesagain/ai-skills\",\"https://clawhub.ai/profile/bytesagain\"],\"contactPoint\":{\"@type\":\"ContactPoint\",\"email\":\"hello@bytesagain.com\",\"contactType\":\"customer support\"},\"numberOfEmployees\":{\"@type\":\"QuantitativeValue\",\"value\":1}},{\"@context\":\"https://schema.org\",\"@type\":\"WebApplication\",\"name\":\"BytesAgain AI Skills Search\",\"url\":\"https://bytesagain.com\",\"applicationCategory\":\"DeveloperApplication\",\"operatingSystem\":\"Web\",\"description\":\"Search engine and MCP API for 60,000+ AI agent skills. Semantic search, role recommendations, and use case packs.\",\"offers\":{\"@type\":\"Offer\",\"price\":\"0\",\"priceCurrency\":\"USD\"},\"featureList\":[\"Search 60,000+ AI agent skills\",\"Role-based recommendations for developers, creators, and traders\",\"1,000+ curated use case packs\",\"Free MCP API and REST API\",\"Multi-language search (EN, ZH, ES, FR, DE, JA, KO)\"],\"potentialAction\":{\"@type\":\"SearchAction\",\"target\":\"https://bytesagain.com/skills?q={search_term_string}\",\"query-input\":\"required name=search_term_string\"},\"dateModified\":\"2026-07-22\"},{\"@context\":\"https://schema.org\",\"@type\":\"FAQPage\",\"mainEntity\":[{\"@type\":\"Question\",\"name\":\"What is BytesAgain?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"BytesAgain is a curated directory of 60,000+ AI agent skills from ClawHub, GitHub, LobeHub, and Dify. Search skills by keyword in 7 languages, browse by role (developer, creator, trader, marketer) or by use case.\"}},{\"@type\":\"Question\",\"name\":\"How do I find AI skills on BytesAgain?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"Use the search bar on BytesAgain.com to search by keyword in 7 languages. You can also browse by role (developer, creator, trader, marketer) or by use case. Each skill shows install instructions for Claude, Cursor, OpenClaw, Continue, and more.\"}},{\"@type\":\"Question\",\"name\":\"Is BytesAgain free?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"Yes, BytesAgain is completely free. No registration required for searching skills. The MCP API is also free with rate limits.\"}},{\"@type\":\"Question\",\"name\":\"Does BytesAgain have an API for AI agents?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"Yes! BytesAgain provides a free MCP SSE endpoint at /api/mcp/sse for AI agents, plus a REST API at /api/mcp?action=search\u0026q=\u003cquery\u003e. No authentication needed.\"}},{\"@type\":\"Question\",\"name\":\"Can I request a new AI skill on BytesAgain?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"Yes! Visit the Requests page on BytesAgain.com to submit a skill request. Your request will be visible to the community and notified to the site admin.\"}}]}]"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"c\":[\"\",\"skill\",\"stock-review-ai\"],\"q\":\"\",\"i\":false,\"f\":[[[\"\",{\"children\":[\"skill\",{\"children\":[[\"slug\",\"stock-review-ai\",\"d\",null],{\"children\":[\"__PAGE__\",{}]}]}]},\"$undefined\",\"$undefined\",16],[[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/051nc0vy_6.rl.css?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-0\",{\"src\":\"/_next/static/chunks/0ph_0rx9ah5dc.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"async\":true,\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-1\",{\"src\":\"/_next/static/chunks/0i_x3w546rsb3.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"async\":true,\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-2\",{\"src\":\"/_next/static/chunks/06ig5gym-0n-u.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"async\":true,\"nonce\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"en\",\"children\":[[\"$\",\"head\",null,{\"children\":[[\"$\",\"link\",null,{\"rel\":\"llms\",\"href\":\"/llms.txt\"}],[\"$\",\"link\",null,{\"rel\":\"llms-full\",\"href\":\"/llms-full.txt\"}],[\"$\",\"script\",null,{\"async\":true,\"src\":\"https://www.googletagmanager.com/gtag/js?id=G-3C1MM9FWYF\"}],[\"$\",\"script\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"\\n          window.dataLayer = window.dataLayer || [];\\n          function gtag(){dataLayer.push(arguments);}\\n          gtag('js', new Date());\\n          gtag('config', 'G-3C1MM9FWYF');\\n        \"}}]]}],[\"$\",\"body\",null,{\"className\":\"geist_9e050971-module__05dp7a__className\",\"style\":{\"margin\":0},\"children\":[\"$\",\"$L2\",null,{\"children\":[\"$\",\"$L3\",null,{\"children\":[[\"$\",\"div\",null,{\"style\":{\"width\":\"100%\",\"background\":\"var(--bg-subscribe)\",\"borderBottom\":\"1px solid var(--border-primary)\",\"padding\":\"8px 20px\",\"textAlign\":\"center\",\"fontSize\":\".82em\",\"color\":\"#818cf8\"},\"children\":[\"🎁 \",[\"$\",\"strong\",null,{\"style\":{\"color\":\"var(--text-primary)\"},\"children\":\"Get the FREE AI Skills Starter Guide\"}],\" β€” \",[\"$\",\"a\",null,{\"href\":\"/register\",\"style\":{\"color\":\"#00d4ff\",\"textDecoration\":\"underline\"},\"children\":\"Subscribe β†’\"}]]}],[\"$\",\"$L4\",null,{}],[\"$\",\"script\",null,{\"type\":\"application/ld+json\",\"dangerouslySetInnerHTML\":{\"__html\":\"$5\"}}],\"$L6\",\"$L7\",\"$L8\"]}]}]}]]}]]}],{\"children\":[\"$L9\",{\"children\":[\"$La\",{\"children\":[\"$Lb\",{},null,false,null]},null,false,\"$@c\"]},null,false,\"$@c\"]},null,false,null],\"$Ld\",false]],\"m\":\"$undefined\",\"G\":[\"$e\",[\"$Lf\"]],\"S\":true,\"h\":null,\"s\":\"$undefined\",\"l\":\"$undefined\",\"p\":\"$undefined\",\"d\":\"$undefined\"}\n"])</script><script>self.__next_f.push([1,"10:I[39756,[\"/_next/static/chunks/0ph_0rx9ah5dc.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"/_next/static/chunks/0i_x3w546rsb3.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"/_next/static/chunks/06ig5gym-0n-u.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\"],\"default\"]\n11:I[37457,[\"/_next/static/chunks/0ph_0rx9ah5dc.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"/_next/static/chunks/0i_x3w546rsb3.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"/_next/static/chunks/06ig5gym-0n-u.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\"],\"default\"]\n12:I[22016,[\"/_next/static/chunks/0ph_0rx9ah5dc.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"/_next/static/chunks/0i_x3w546rsb3.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"/_next/static/chunks/06ig5gym-0n-u.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"/_next/static/chunks/0ka051yepewro.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\"],\"\"]\n13:I[90940,[\"/_next/static/chunks/0ph_0rx9ah5dc.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"/_next/static/chunks/0i_x3w546rsb3.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"/_next/static/chunks/06ig5gym-0n-u.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\"],\"default\"]\n14:I[16397,[\"/_next/static/chunks/0ph_0rx9ah5dc.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"/_next/static/chunks/0i_x3w546rsb3.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"/_next/static/chunks/06ig5gym-0n-u.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\"],\"default\"]\n16:I[97367,[\"/_next/static/chunks/0ph_0rx9ah5dc.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"/_next/static/chunks/0i_x3w546rsb3.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"/_next/static/chunks/06ig5gym-0n-u.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\"],\"OutletBoundary\"]\n17:\"$Sreact.suspense\"\n1a:I[97367,[\"/_next/static/chunks/0ph_0rx9ah5dc.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"/_next/static/chunks/0i_x3w546rsb3.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"/_next/static/chunks/06ig5gym-0n-u.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\"],\"ViewportBoundary\"]\n1c:I[97367,[\"/_next/static/chunks/0ph_0rx9ah5dc.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"/_next/static/chunks/0i_x3w546rsb3.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"/_next/static/chunks/06ig5gym-0n-u.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\"],\"MetadataBoundary\"]\n"])</script><script>self.__next_f.push([1,"6:[\"$\",\"main\",null,{\"children\":[\"$\",\"$L10\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L11\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":[[\"$\",\"main\",null,{\"style\":{\"minHeight\":\"100vh\",\"display\":\"flex\",\"alignItems\":\"center\",\"justifyContent\":\"center\",\"background\":\"#050611\",\"color\":\"#e5e7eb\"},\"children\":[[\"$\",\"style\",null,{\"children\":\"\\n        .nf-box { text-align: center; padding: 60px 32px; }\\n        .nf-code { font-size: 6rem; font-weight: 900; color: #22d3ee; line-height: 1; margin: 0; }\\n        .nf-title { font-size: 1.8rem; font-weight: 800; margin: 12px 0 8px; }\\n        .nf-desc { color: var(--text-muted2); font-size: 1rem; margin-bottom: 32px; max-width: 440px; }\\n        .nf-link { display: inline-block; padding: 12px 28px; background: linear-gradient(135deg,#34d399,#22d3ee); color: #000; font-weight: 900; border-radius: 12px; text-decoration: none; }\\n      \"}],[\"$\",\"div\",null,{\"className\":\"nf-box\",\"children\":[[\"$\",\"p\",null,{\"className\":\"nf-code\",\"children\":\"404\"}],[\"$\",\"h1\",null,{\"className\":\"nf-title\",\"children\":\"Page Not Found\"}],[\"$\",\"p\",null,{\"className\":\"nf-desc\",\"children\":\"The skill or page you're looking for doesn't exist or has been moved.\"}],[\"$\",\"$L12\",null,{\"className\":\"nf-link\",\"href\":\"/\",\"children\":\"Back to BytesAgain\"}]]}]]}],[]],\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]}]\n"])</script><script>self.__next_f.push([1,"7:[\"$\",\"$L13\",null,{}]\n8:[\"$\",\"$L14\",null,{}]\n9:[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L10\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L11\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}]\na:[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L10\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L11\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}]\nb:[\"$\",\"$1\",\"c\",{\"children\":[\"$L15\",[[\"$\",\"script\",\"script-0\",{\"src\":\"/_next/static/chunks/12w5ognupk9fb.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"async\":true,\"nonce\":\"$undefined\"}]],[\"$\",\"$L16\",null,{\"children\":[\"$\",\"$17\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@18\"}]}]]}]\n19:[]\nc:\"$W19\"\nd:[\"$\",\"$1\",\"h\",{\"children\":[null,[\"$\",\"$L1a\",null,{\"children\":\"$L1b\"}],[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$L1c\",null,{\"children\":[\"$\",\"$17\",null,{\"name\":\"Next.Metadata\",\"children\":\"$L1d\"}]}]}],[\"$\",\"meta\",null,{\"name\":\"next-size-adjust\",\"content\":\"\"}]]}]\nf:[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/051nc0vy_6.rl.css?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}]\n"])</script><script>self.__next_f.push([1,"1b:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n"])</script><script>self.__next_f.push([1,"1e:I[27201,[\"/_next/static/chunks/0ph_0rx9ah5dc.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"/_next/static/chunks/0i_x3w546rsb3.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"/_next/static/chunks/06ig5gym-0n-u.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\"],\"IconMark\"]\n18:null\n"])</script><script>self.__next_f.push([1,"1d:[[\"$\",\"title\",\"0\",{\"children\":\"A-Share Review and Analyse β€” AI Agent Skill | BytesAgain | BytesAgain\"}],[\"$\",\"meta\",\"1\",{\"name\":\"description\",\"content\":\"A-share market automated review and analysis system, generating daily market insights with Gemini AI, supporting publishing to Hugo blog and WeChat Official...\"}],[\"$\",\"meta\",\"2\",{\"name\":\"robots\",\"content\":\"index, follow\"}],[\"$\",\"meta\",\"3\",{\"name\":\"googlebot\",\"content\":\"index, follow, max-image-preview:large, max-snippet:-1\"}],[\"$\",\"meta\",\"4\",{\"name\":\"llms-txt\",\"content\":\"https://bytesagain.com/llms.txt\"}],[\"$\",\"meta\",\"5\",{\"name\":\"llms-full-txt\",\"content\":\"https://bytesagain.com/llms-full.txt\"}],[\"$\",\"link\",\"6\",{\"rel\":\"canonical\",\"href\":\"https://bytesagain.com/skill/stock-review-ai\"}],[\"$\",\"meta\",\"7\",{\"name\":\"baidu-site-verification\",\"content\":\"codeva-0evUqX1TFs\"}],[\"$\",\"meta\",\"8\",{\"property\":\"og:title\",\"content\":\"A-Share Review and Analyse β€” AI Agent Skill | BytesAgain\"}],[\"$\",\"meta\",\"9\",{\"property\":\"og:description\",\"content\":\"A-share market automated review and analysis system, generating daily market insights with Gemini AI, supporting publishing to Hugo blog and WeChat Official...\"}],[\"$\",\"meta\",\"10\",{\"property\":\"og:url\",\"content\":\"https://bytesagain.com/skill/stock-review-ai\"}],[\"$\",\"meta\",\"11\",{\"property\":\"og:site_name\",\"content\":\"BytesAgain\"}],[\"$\",\"meta\",\"12\",{\"property\":\"og:image\",\"content\":\"https://bytesagain.com/social-preview.png\"}],[\"$\",\"meta\",\"13\",{\"property\":\"og:image:width\",\"content\":\"1200\"}],[\"$\",\"meta\",\"14\",{\"property\":\"og:image:height\",\"content\":\"630\"}],[\"$\",\"meta\",\"15\",{\"property\":\"og:type\",\"content\":\"website\"}],[\"$\",\"meta\",\"16\",{\"name\":\"twitter:card\",\"content\":\"summary_large_image\"}],[\"$\",\"meta\",\"17\",{\"name\":\"twitter:title\",\"content\":\"A-Share Review and Analyse β€” AI Agent Skill | BytesAgain\"}],[\"$\",\"meta\",\"18\",{\"name\":\"twitter:description\",\"content\":\"A-share market automated review and analysis system, generating daily market insights with Gemini AI, supporting publishing to Hugo blog and WeChat Official...\"}],[\"$\",\"meta\",\"19\",{\"name\":\"twitter:image\",\"content\":\"https://bytesagain.com/social-preview.png\"}],[\"$\",\"meta\",\"20\",{\"name\":\"twitter:image:width\",\"content\":\"1200\"}],[\"$\",\"meta\",\"21\",{\"name\":\"twitter:image:height\",\"content\":\"630\"}],[\"$\",\"link\",\"22\",{\"rel\":\"icon\",\"href\":\"/favicon.ico?favicon.0x3dzn~oxb6tn.ico\",\"sizes\":\"256x256\",\"type\":\"image/x-icon\"}],[\"$\",\"$L1e\",\"23\",{}]]\n"])</script><script>self.__next_f.push([1,"1f:T1562,"])</script><script>self.__next_f.push([1,"\n        .skill-page { max-width: 1100px; margin: 0 auto; padding: 32px 20px 80px; }\n        .two-col { display: flex; gap: 32px; align-items: flex-start; }\n        .two-col-main { flex: 1; min-width: 0; }\n        .two-col-side { width: 300px; flex-shrink: 0; }\n        @media (max-width: 860px) {\n          .two-col { flex-direction: column; }\n          .two-col-side { width: 100%; }\n        }\n        .breadcrumb { font-size: .82em; color: var(--text-muted2); margin-bottom: 28px; }\n        .breadcrumb a { color: #818cf8; text-decoration: none; }\n        .breadcrumb a:hover { text-decoration: underline; }\n        .skill-card { background: var(--bg-card); border: 1px solid var(--border-card); border-radius: 20px; padding: 28px; margin-bottom: 24px; }\n        .skill-header { display: flex; align-items: flex-start; justify-content: space-between; gap: 16px; margin-bottom: 20px; flex-wrap: wrap; }\n        .skill-badges { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }\n        .skill-top-actions { display: flex; align-items: center; gap: 10px; margin-left: auto; }\n        .badge { display: inline-flex; align-items: center; gap: 5px; font-size: .75em; font-weight: 600; padding: 4px 12px; border-radius: 999px; border: 1px solid transparent; }\n        .skill-title { font-size: 1.6em; font-weight: 800; color: var(--text-primary); margin: 0 0 4px; line-height: 1.2; }\n        .skill-owner { font-size: .82em; color: var(--text-muted2); margin: 0 0 14px; }\n        .skill-owner span { color: #818cf8; }\n        .skill-desc { font-size: .92em; color: var(--text-secondary); line-height: 1.65; margin: 0 0 16px; }\n        .skill-meta { display: flex; gap: 16px; flex-wrap: wrap; margin-bottom: 18px; padding-bottom: 16px; border-bottom: 1px solid var(--border-card); }\n        .meta-item { display: flex; flex-direction: column; gap: 2px; }\n        .meta-label { font-size: .7em; color: var(--text-muted5); text-transform: uppercase; letter-spacing: 1px; font-weight: 600; }\n        .meta-value { font-size: .92em; color: var(--text-muted2); font-weight: 600; }\n        .tags-row { display: flex; gap: 6px; flex-wrap: wrap; }\n        .tag { font-size: .75em; color: #6366f1; background: #6366f115; border: 1px solid #6366f130; border-radius: 6px; padding: 3px 10px; text-decoration: none; }\n        .tag:hover { background: #6366f125; }\n        .install-box { background: var(--bg-deep); border: 1px solid var(--border-card); border-radius: 12px; overflow: hidden; margin-bottom: 24px; }\n        .install-header { display: flex; align-items: center; justify-content: space-between; padding: 10px 16px; border-bottom: 1px solid var(--border-card); }\n        .install-dots { display: flex; gap: 6px; }\n        .dot { width: 10px; height: 10px; border-radius: 50%; }\n        .install-label { font-size: .72em; color: var(--text-muted5); font-family: monospace; letter-spacing: 1px; }\n        .install-body { padding: 16px 20px; display: flex; align-items: center; justify-content: space-between; gap: 12px; }\n        .install-cmd { color: var(--text-code);\n font-family: 'Courier New', monospace; font-size: 1em; }\n        .copy-btn { font-size: .75em; color: #6366f1; background: #6366f115; border: 1px solid #6366f130; border-radius: 6px; padding: 5px 12px; cursor: pointer; white-space: nowrap; transition: all .15s; }\n        .copy-btn:hover { background: #6366f125; }\n        .btn-secondary { display: inline-flex; align-items: center; gap: 8px; padding: 13px 24px; background: transparent; border: 1px solid var(--border-card); border-radius: 10px; color: #6b7280; text-decoration: none; font-weight: 600; font-size: .95em; transition: all .15s; }\n        .btn-secondary:hover { border-color: #818cf8; color: #818cf8; }\n        .ours-badge { display: inline-flex; align-items: center; gap: 6px; font-size: .72em; font-weight: 700; color: #22d3ee; background: #22d3ee10; border: 1px solid #22d3ee30; border-radius: 999px; padding: 4px 14px; }\n        .section-card { background: var(--bg-card); border: 1px solid var(--border-card); border-radius: 16px; padding: 22px 24px; margin-bottom: 20px; }\n        .section-title { color: var(--text-primary); font-size: 1.08em; font-weight: 800; margin: 0 0 12px; display: flex; align-items: center; gap: 8px; }\n        /* Script box */\n        .script-header { display: flex; align-items: center; justify-content: space-between; padding: 8px 14px; background: var(--bg-input); border-bottom: 1px solid var(--border-card); }\n        .script-filename { font-size: .72em; color: var(--text-muted2); font-family: 'Courier New', monospace; }\n        .script-copy-btn { font-size: .72em; color: #6366f1; background: none; border: 1px solid #6366f130; border-radius: 4px; padding: 2px 10px; cursor: pointer; }\n        .script-copy-btn:hover { background: #6366f115; }\n        .script-body { padding: 14px 16px; font-family: 'Courier New', monospace; font-size: .82em; line-height: 1.6; color: var(--text-code); overflow-x: auto; max-height: 420px; overflow-y: auto; white-space: pre; }\n        /* Articles */\n        .article-card { display: block; background: var(--bg-secondary); border: 1px solid var(--border-primary); border-radius: 10px; padding: 14px 16px; text-decoration: none; transition: border-color .15s; }\n        .article-card:hover { border-color: #6366f1; }\n        @media (max-width: 600px) {\n          .skill-card { padding: 20px; }\n          .skill-title { font-size: 1.5em; }\n        }\n      "])</script><script>self.__next_f.push([1,"15:[[\"$\",\"style\",null,{\"children\":\"$1f\"}],\"$L20\",\"$L21\"]\n"])</script><script>self.__next_f.push([1,"22:I[78297,[\"/_next/static/chunks/0ph_0rx9ah5dc.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"/_next/static/chunks/0i_x3w546rsb3.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"/_next/static/chunks/06ig5gym-0n-u.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"/_next/static/chunks/12w5ognupk9fb.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\"],\"default\"]\n23:T6f4e,"])</script><script>self.__next_f.push([1,"\u003cp style=\"margin:8px 0\"\u003e\u003chr style=\"border:none;border-top:1px solid #1e1e3f;margin:12px 0\"\u003e\nname: stock-review\ndescription: A-share market automated review and analysis system, generating daily market insights with Gemini AI, supporting publishing to Hugo blog and WeChat Official Account\nversion: 1.0.1\nmetadata:\n  openclaw:\n    homepage: https://github.com/donvink/stock-review\n    requires:\n      anyBins:\n        - python3\n        - python\n\u003chr style=\"border:none;border-top:1px solid #1e1e3f;margin:12px 0\"\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch2 style=\"color:#f3f4f6;margin:20px 0 10px;font-size:1.15em\"\u003eπŸš€ Stock Review\u003c/h2\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003eπŸ‘‰ \u003cstrong style=\"color:#e5e7eb\"\u003e\u003ca href=\"https://donvink.github.io/stock-review/\" target=\"_blank\" rel=\"noopener\" style=\"color:#6366f1\"\u003eLive Demo Blog\u003c/a\u003e\u003c/strong\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch4 style=\"color:#d1d5db;margin:14px 0 6px;font-size:.95em\"\u003eGitHub: πŸ‘‰ \u003cstrong style=\"color:#e5e7eb\"\u003e\u003ca href=\"https://github.com/Donvink/stock-review\" target=\"_blank\" rel=\"noopener\" style=\"color:#6366f1\"\u003ehttps://github.com/Donvink/stock-review\u003c/a\u003e\u003c/strong\u003e\u003c/h4\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch3 style=\"color:#e5e7eb;margin:18px 0 8px;font-size:1.05em\"\u003eLanguage\u003c/h3\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cstrong style=\"color:#e5e7eb\"\u003eMatch user's language\u003c/strong\u003e: Respond in the same language the user uses. If the user writes in Chinese, respond in Chinese. If the user writes in English, respond in English.\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch3 style=\"color:#e5e7eb;margin:18px 0 8px;font-size:1.05em\"\u003eScript Directory\u003c/h3\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cstrong style=\"color:#e5e7eb\"\u003eAgent Execution\u003c/strong\u003e: Determine this SKILL.md directory as \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003e{baseDir}\u003c/code\u003e, then use \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003e{baseDir}/scripts/\u003cname\u003e.py\u003c/code\u003e. Ensure Python 3.10+ is installed and dependencies are configured.\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e| Script | Purpose |\n|------|------|\n| \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003escripts/fetch_data.py\u003c/code\u003e | Fetch A-share market data (indices, stocks, sectors, etc.) |\n| \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003escripts/analyze.py\u003c/code\u003e | Gemini AI analysis of market data |\n| \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003escripts/post_to_hugo.py\u003c/code\u003e | Publish to Hugo blog |\n| \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003escripts/post_to_wechat.py\u003c/code\u003e | Publish to WeChat Official Account |\n| \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003escripts/main.py\u003c/code\u003e | Main execution script, coordinates the entire workflow |\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch3 style=\"color:#e5e7eb;margin:18px 0 8px;font-size:1.05em\"\u003eConfiguration Preferences\u003c/h3\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e1. Check if config.yaml exists: \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003e{baseDir}/stock-review/config.yaml\u003c/code\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e2. Check if .env file exists and is configured with \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003eGEMINI_API_KEY\u003c/code\u003e, \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003eWECHAT_APP_ID\u003c/code\u003e, \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003eWECHAT_APP_SECRET\u003c/code\u003e: \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003e{baseDir}/stock-review/.env\u003c/code\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cstrong style=\"color:#e5e7eb\"\u003econfig.yaml supports\u003c/strong\u003e: Default publishing platforms | Whether to skip AI analysis by default | Default data backtracking days | Default request delay | Default retry count | API key configuration\n\u003cstrong style=\"color:#e5e7eb\"\u003e.env supports\u003c/strong\u003e: API key configuration\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cstrong style=\"color:#e5e7eb\"\u003eMinimum supported keys\u003c/strong\u003e (case-insensitive, accepts \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003e1/0\u003c/code\u003e or \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003etrue/false\u003c/code\u003e):\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e| Key | Default | Description |\n|-----|---------|------|\n| \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003edate\u003c/code\u003e | \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003enull\u003c/code\u003e | Date in YYYYMMDD format |\n| \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003eforce_refresh\u003c/code\u003e | \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003efalse\u003c/code\u003e | Whether to force refresh already fetched data |\n| \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003eskip_ai_analysis\u003c/code\u003e | \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003efalse\u003c/code\u003e | Whether to skip AI analysis |\n| \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003eplatforms\u003c/code\u003e | \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003e[\"hugo\"]\u003c/code\u003e | Default publishing platforms (['hugo']/['wechat']/['hugo', 'wechat']) |\n| \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003edata_dir\u003c/code\u003e | \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003enull\u003c/code\u003e | Directory for data storage |\n| \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003emax_retries\u003c/code\u003e | \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003e3\u003c/code\u003e | Default retry count |\n| \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003erequest_delay\u003c/code\u003e | \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003e0.5\u003c/code\u003e | Default request delay (seconds) |\n| \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003ebacktrack_days\u003c/code\u003e | \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003e0\u003c/code\u003e | Default data backtracking days |\n| \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003etype\u003c/code\u003e | \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003egemini\u003c/code\u003e | Model type |\n| \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003emodel_name\u003c/code\u003e | \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003egemini-2.5-flash\u003c/code\u003e | Model name |\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cstrong style=\"color:#e5e7eb\"\u003eRecommended config.yaml example\u003c/strong\u003e:\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cpre style=\"background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0\"\u003e\u003ccode style=\"color:#a5f3fc;background:none;padding:0;font-size:1em\"\u003e# default configuration for stock review skill\nreview:\n  markets:                          # can include \"shanghai\", \"shenzhen\", \"hongkong\"\n    - \"shanghai\"\n    - \"shenzhen\"\n    - \"hongkong\"\n  default_period: \"daily\"           # can be \"daily\", \"weekly\", \"monthly\"\n  date: null                        # can be specific date \"YYYYMMDD\" like \"20260101\" or null for today\n  force_refresh: false              # whether to force refresh data even if cached data is available\n  skip_ai_analysis: false           # whether to skip AI analysis and just return raw data\n  platforms: [\"hugo\"]               # platforms to publish the report, e.g. ['hugo', 'wechat'] or ['hugo'] or ['wechat']\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003epaths:\n  data_dir: null                    # directory to store fetched data and cache, null means current project directory\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003eparameters:\n  max_retries: 3\n  request_delay: 0.5\n  backtrack_days: 0\n  \nmodels:\n  type: \"gemini\"\n  model_name: \"gemini-2.5-flash\"\n\u003c/code\u003e\u003c/pre\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cstrong style=\"color:#e5e7eb\"\u003e.env example\u003c/strong\u003e:\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cpre style=\"background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0\"\u003e\u003ccode style=\"color:#a5f3fc;background:none;padding:0;font-size:1em\"\u003e# Gemini API Key\nGEMINI_API_KEY=\"your_gemini_api_key\"\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch2 style=\"color:#f3f4f6;margin:20px 0 10px;font-size:1.15em\"\u003eWeChat Official Account Configuration\u003c/h2\u003e\nWECHAT_APP_ID=\"your_wechat_app_id\"\nWECHAT_APP_SECRET=\"your_wechat_app_secret\"\n\u003c/code\u003e\u003c/pre\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch4 style=\"color:#d1d5db;margin:14px 0 6px;font-size:.95em\"\u003eHow to Get a Gemini API Key:\u003c/h4\u003e\n1. Visit the official portal: Go to https://aistudio.google.com/ and log in with your Google account.\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e2. Create an API Key: Click \"Get API key\" in the left sidebar, click \"Create API key in new project\", and copy the generated string (please save it securelyβ€”you won't be able to see the full key again after closing the window).\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e3. Important Notes:\n\u003cstrong style=\"color:#e5e7eb\"\u003eFree Tier\u003c/strong\u003e: Provides free quota but with request frequency limits (RPM/RPD).\n\u003cstrong style=\"color:#e5e7eb\"\u003eData Privacy\u003c/strong\u003e: Free tier data may be used for model improvement. For commercially sensitive data, consider enabling the paid mode.\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch4 style=\"color:#d1d5db;margin:14px 0 6px;font-size:.95em\"\u003eHow to Get WeChat Official Account Credentials:\u003c/h4\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e1. Visit https://developers.weixin.qq.com/platform/\n2. Navigate: My Business β†’ Official Account β†’ Development Keys\n3. Add a development key, copy the AppID and AppSecret\n4. \u003cstrong style=\"color:#e5e7eb\"\u003eAdd the IP address of your machine to the whitelist\u003c/strong\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch3 style=\"color:#e5e7eb;margin:18px 0 8px;font-size:1.05em\"\u003eEnvironment Check\u003c/h3\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003eBefore first use, install the dependencies.\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cpre style=\"background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0\"\u003e\u003ccode style=\"color:#a5f3fc;background:none;padding:0;font-size:1em\"\u003epip install -r {baseDir}/requirements.txt\n\u003c/code\u003e\u003c/pre\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003eCheck items: Python version | Dependencies | API keys | Network connection | Directory permissions\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cstrong style=\"color:#e5e7eb\"\u003eIf any check fails\u003c/strong\u003e, provide fix guidance:\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e| Check Item | Fix Method |\n|-------|----------|\n| Python version | Install Python 3.10+: \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003ebrew install python@3.10\u003c/code\u003e (macOS) or \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003eapt install python3.10\u003c/code\u003e (Linux) |\n| Dependencies | Run \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003epip install -r {baseDir}/requirements.txt\u003c/code\u003e |\n| Gemini API key | Configure in .env or via environment variables |\n| WeChat Official Account credentials | Configure in .env or via environment variables |\n| Network connection | Check network proxy settings |\n| Directory permissions | Ensure data/ and content/posts/ directories are writable |\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch3 style=\"color:#e5e7eb;margin:18px 0 8px;font-size:1.05em\"\u003eWorkflow Overview\u003c/h3\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003eCopy this checklist and check items as you progress:\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cpre style=\"background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0\"\u003e\u003ccode style=\"color:#a5f3fc;background:none;padding:0;font-size:1em\"\u003eReview Analysis Progress:\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003e[ ] Step 0: Load preferences (config.yaml, .env), determine execution parameters\u003c/li\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003e[ ] Step 1: Fetch market data\u003c/li\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003e[ ] Step 2: Run AI analysis (optional)\u003c/li\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003e[ ] Step 3: Generate report\u003c/li\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003e[ ] Step 4: Publish to platforms\u003c/li\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003e[ ] Step 5: Report complete\u003c/li\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch4 style=\"color:#d1d5db;margin:14px 0 6px;font-size:.95em\"\u003eStep 0: Load Preferences\u003c/h4\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003eCheck and load config.yaml settings (see Configuration Preferences section above), parse and store default values for subsequent steps.\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch4 style=\"color:#d1d5db;margin:14px 0 6px;font-size:.95em\"\u003eStep 1: Fetch Market Data\u003c/h4\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003eFetch the following data for the specified date:\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e| Data Type | Source | File |\n|----------|------|------|\n| Index data | stock_zh_index_spot_sina | \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003edata/{date}/index_{date}.csv\u003c/code\u003e |\n| Limit-up pool | stock_zt_pool_em | \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003edata/{date}/zt_pool_{date}.csv\u003c/code\u003e |\n| Limit-down pool | stock_zt_pool_dtgc_em | \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003edata/{date}/dt_pool_{date}.csv\u003c/code\u003e |\n| Failed limit-up pool | stock_zt_pool_zbgc_em | \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003edata/{date}/zb_pool_{date}.csv\u003c/code\u003e |\n| Full market data | stock_zh_a_spot_em | \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003edata/{date}/A_stock_{date}.csv\u003c/code\u003e |\n| Top 20 by turnover | Calculated | \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003edata/{date}/top_amount_stocks_{date}.csv\u003c/code\u003e |\n| Concept sectors | stock_board_concept_name_em | \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003edata/{date}/concept_summary_{date}.csv\u003c/code\u003e |\n| Top traders list | stock_lhb_detail_daily_sina | \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003edata/{date}/lhb_{date}.csv\u003c/code\u003e |\n| Watchlist | Calculated | \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003edata/{date}/watchlist*_{date}.csv\u003c/code\u003e |\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cstrong style=\"color:#e5e7eb\"\u003eRetry Mechanism\u003c/strong\u003e:\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003eDefault 3 retries\u003c/li\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003e0.5 second request interval\u003c/li\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003eAutomatic fallback to alternative interfaces on failure\u003c/li\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch4 style=\"color:#d1d5db;margin:14px 0 6px;font-size:.95em\"\u003eStep 2: Run AI Analysis\u003c/h4\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cstrong style=\"color:#e5e7eb\"\u003eCRITICAL\u003c/strong\u003e: Run AI analysis only if:\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003e\u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003e--skip-ai\u003c/code\u003e is not set\u003c/li\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003e\u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003eGEMINI_API_KEY\u003c/code\u003e is configured (via config.yaml or environment variables)\u003c/li\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cstrong style=\"color:#e5e7eb\"\u003eAI Analysis Prompt\u003c/strong\u003e:\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cpre style=\"background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0\"\u003e\u003ccode style=\"color:#a5f3fc;background:none;padding:0;font-size:1em\"\u003eprompt = f\"\"\"\nRole Setting: You are a seasoned A-share strategy analyst with 20 years of experience...\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003eTask Description: Conduct a multi-dimensional review based on the [daily review data]:\n1. 🚩 Market Sentiment Diagnosis\n2. πŸ’° Core Themes and Capital Flow\n3. πŸͺœ Consecutive Limit-up Gradient and Space Game\n4. ⚑ Key Stocks with Abnormal Movements Analysis\n5. 🧭 Next Trading Day Strategy Recommendations\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003eπŸ“Š Daily Review Data:\n{market_summary}\n\"\"\"\n\u003c/code\u003e\u003c/pre\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cstrong style=\"color:#e5e7eb\"\u003eOutput\u003c/strong\u003e: \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003edata/{date}/ai_analysis_{date}.md\u003c/code\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch4 style=\"color:#d1d5db;margin:14px 0 6px;font-size:.95em\"\u003eStep 3: Generate Reports\u003c/h4\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cstrong style=\"color:#e5e7eb\"\u003eMarket Summary Report\u003c/strong\u003e:\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003eFile: \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003edata/{date}/market_summary_{date}.md\u003c/code\u003e\u003c/li\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003eFormat: Markdown\u003c/li\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003eContent: Tabular summary of all data\u003c/li\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cstrong style=\"color:#e5e7eb\"\u003eAI Analysis Report\u003c/strong\u003e (if run):\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003eFile: \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003edata/{date}/ai_analysis_{date}.md\u003c/code\u003e\u003c/li\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003eFormat: Markdown\u003c/li\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003eContent: In-depth analysis generated by Gemini\u003c/li\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch4 style=\"color:#d1d5db;margin:14px 0 6px;font-size:.95em\"\u003eStep 4: Publish to Platforms\u003c/h4\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cstrong style=\"color:#e5e7eb\"\u003eHugo Blog Publishing\u003c/strong\u003e:\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cpre style=\"background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0\"\u003e\u003ccode style=\"color:#a5f3fc;background:none;padding:0;font-size:1em\"\u003epython3 {baseDir}/scripts/post_to_hugo.py --market-summary \u003cfile\u003e --ai-analysis \u003cfile\u003e --date \u003cdate\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cstrong style=\"color:#e5e7eb\"\u003eOutput\u003c/strong\u003e: \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003econtent/posts/stock-analysis-{YYYY-MM-DD}.md\u003c/code\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cstrong style=\"color:#e5e7eb\"\u003eWeChat Official Account Publishing\u003c/strong\u003e (requires API credentials):\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cpre style=\"background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0\"\u003e\u003ccode style=\"color:#a5f3fc;background:none;padding:0;font-size:1em\"\u003epython3 {baseDir}/scripts/post_to_wechat.py --market-summary-file \u003cfile\u003e --ai-analysis-file \u003cfile\u003e --date \u003cdate\u003e --cover-file \u003cfile\u003e --title \u003ctitle\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cstrong style=\"color:#e5e7eb\"\u003eWeChat Official Account API Request Rules\u003c/strong\u003e:\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003eEndpoint: \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003ePOST https://api.weixin.qq.com/cgi-bin/draft/add?access_token=ACCESS_TOKEN\u003c/code\u003e\u003c/li\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003e\u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003earticle_type\u003c/code\u003e: \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003enews\u003c/code\u003e\u003c/li\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003eRequires \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003ethumb_media_id\u003c/code\u003e (cover image)\u003c/li\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003eComment settings: \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003eneed_open_comment=1\u003c/code\u003e, \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003eonly_fans_can_comment=0\u003c/code\u003e\u003c/li\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch4 style=\"color:#d1d5db;margin:14px 0 6px;font-size:.95em\"\u003eStep 5: Completion Report\u003c/h4\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cstrong style=\"color:#e5e7eb\"\u003eSuccess Report\u003c/strong\u003e:\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cpre style=\"background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0\"\u003e\u003ccode style=\"color:#a5f3fc;background:none;padding:0;font-size:1em\"\u003eβœ… A-share Review Analysis Complete!\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003eDate: 2026-03-04\nData: data/20260304/ (12 files)\nAI Analysis: βœ“ Generated (Gemini 2.0 Flash)\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003ePublished Platforms:\nβ†’ Hugo Blog: content/posts/stock-analysis-2026-03-04.md\nβ†’ WeChat Official Account: Draft ID: abc123def456\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003eMarket Snapshot:\nβ€’ Shanghai Composite: 3350.52 (+1.02%)\nβ€’ Turnover: 1.95 trillion\nβ€’ Advance/Decline: 2857 / 2058\nβ€’ Limit-up/Limit-down: 78 / 3\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003eView Blog: https://donvink.github.io/stock-review/\n\u003c/code\u003e\u003c/pre\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cstrong style=\"color:#e5e7eb\"\u003eError Report\u003c/strong\u003e:\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cpre style=\"background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0\"\u003e\u003ccode style=\"color:#a5f3fc;background:none;padding:0;font-size:1em\"\u003e❌ Review Analysis Failed\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003eError: Unable to fetch limit-up pool data\nSuggestions: \n1. Check network connection\n2. Try --force parameter to force refresh\n3. Use --date to specify another date\n\u003c/code\u003e\u003c/pre\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch3 style=\"color:#e5e7eb;margin:18px 0 8px;font-size:1.05em\"\u003eDetailed Feature Description\u003c/h3\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch4 style=\"color:#d1d5db;margin:14px 0 6px;font-size:.95em\"\u003eData Fetching Module\u003c/h4\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e| Function | Purpose | Retry | Cache |\n|------|------|------|------|\n| \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003estock_summary()\u003c/code\u003e | Fetch index data | βœ“ | βœ“ |\n| \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003estock_zt_dt_pool()\u003c/code\u003e | Fetch limit-up/down data | βœ“ | βœ“ |\n| \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003efetch_all_stock_data()\u003c/code\u003e | Fetch full market data | βœ“ (3 times) | βœ“ |\n| \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003eget_top_amount_stocks()\u003c/code\u003e | Fetch top 20 by turnover | βœ“ | βœ“ |\n| \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003eget_concept_summary()\u003c/code\u003e | Fetch concept sectors | βœ“ | βœ“ |\n| \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003eget_lhb_data()\u003c/code\u003e | Fetch top traders list | βœ“ | βœ“ |\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch4 style=\"color:#d1d5db;margin:14px 0 6px;font-size:.95em\"\u003eAI Analysis Module\u003c/h4\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cstrong style=\"color:#e5e7eb\"\u003eModel\u003c/strong\u003e: \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003egemini-2.5-flash\u003c/code\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cstrong style=\"color:#e5e7eb\"\u003eAnalysis Dimensions\u003c/strong\u003e:\n1. \u003cstrong style=\"color:#e5e7eb\"\u003eMarket Sentiment Diagnosis\u003c/strong\u003e - Advance/decline ratio, limit-up/down comparison, turnover\n2. \u003cstrong style=\"color:#e5e7eb\"\u003eCore Theme Tracking\u003c/strong\u003e - Capital flow, hot sectors\n3. \u003cstrong style=\"color:#e5e7eb\"\u003eConsecutive Limit-up Gradient Analysis\u003c/strong\u003e - Space board height, limit-up structure\n4. \u003cstrong style=\"color:#e5e7eb\"\u003eAbnormal Movement Stock Analysis\u003c/strong\u003e - High turnover, top traders list\n5. \u003cstrong style=\"color:#e5e7eb\"\u003eNext Day Strategy Recommendations\u003c/strong\u003e - Data-based trading suggestions\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch4 style=\"color:#d1d5db;margin:14px 0 6px;font-size:.95em\"\u003ePublishing Module\u003c/h4\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e| Platform | Method | Requirements | Output |\n|------|------|------|------|\n| Hugo Blog | File write | None | Markdown file |\n| WeChat Official Account | API | AppID/Secret | Draft ID |\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch3 style=\"color:#e5e7eb;margin:18px 0 8px;font-size:1.05em\"\u003eFeature Comparison\u003c/h3\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e| Feature | Data Fetching | AI Analysis | Hugo Publishing | WeChat Publishing |\n|------|----------|--------|----------|----------|\n| Auto-fetch latest date | βœ“ | - | - | - |\n| Data caching | βœ“ | - | - | - |\n| Retry mechanism | βœ“ | - | - | - |\n| Multi-source backup | βœ“ | - | - | - |\n| Format values (hundreds millions/ten thousands) | βœ“ | - | - | - |\n| Filter ST stocks | βœ“ | - | - | - |\n| Watchlist construction | βœ“ | - | - | - |\n| Market sentiment diagnosis | - | βœ“ | - | - |\n| Limit-up gradient analysis | - | βœ“ | - | - |\n| Strategy recommendations | - | βœ“ | - | - |\n| Markdown format | - | βœ“ | βœ“ | βœ“ |\n| Timezone handling | - | - | βœ“ | - |\n| Hugo frontmatter | - | - | βœ“ | - |\n| WeChat HTML conversion | - | - | - | βœ“ |\n| Comment settings | - | - | - | βœ“ |\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch3 style=\"color:#e5e7eb;margin:18px 0 8px;font-size:1.05em\"\u003ePrerequisites\u003c/h3\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cstrong style=\"color:#e5e7eb\"\u003eRequired\u003c/strong\u003e:\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003ePython 3.10+\u003c/li\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003eDependencies: \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003epip install -r requirements.txt\u003c/code\u003e\u003c/li\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003eGemini API key (for AI analysis)\u003c/li\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cstrong style=\"color:#e5e7eb\"\u003eOptional\u003c/strong\u003e:\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003eWeChat Official Account AppID and AppSecret (for WeChat publishing)\u003c/li\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003eHugo blog environment (for blog publishing)\u003c/li\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cstrong style=\"color:#e5e7eb\"\u003eConfiguration Locations\u003c/strong\u003e (priority order):\n1. CLI parameters\n2. config.yaml, .env (project-level/user-level)\n3. Environment variables\n4. Default values\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch3 style=\"color:#e5e7eb;margin:18px 0 8px;font-size:1.05em\"\u003eTroubleshooting\u003c/h3\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e| Issue | Solution |\n|------|----------|\n| Unable to fetch data | Check network, specify another date |\n| Gemini API error | Check if API key is valid, quota is sufficient |\n| Limit-up pool data empty | Possibly non-trading day, try backtracking to another date |\n| WeChat publishing failed | Check AppID/Secret, \u003cstrong style=\"color:#e5e7eb\"\u003econfirm IP is whitelisted\u003c/strong\u003e |\n| Chinese character encoding issues | Ensure file encoding is UTF-8 |\n| Data format error | Check CSV files, ensure code column isn't converted to numbers |\n| Timeout error | Increase \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003erequest_delay\u003c/code\u003e or \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003emax_retries\u003c/code\u003e |\n| Insufficient memory | Reduce data volume or process in batches |\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch3 style=\"color:#e5e7eb;margin:18px 0 8px;font-size:1.05em\"\u003eExtension Support\u003c/h3\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003eCustomize via config.yaml. See the \u003cstrong style=\"color:#e5e7eb\"\u003eConfiguration Preferences\u003c/strong\u003e section for supported options.\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch3 style=\"color:#e5e7eb;margin:18px 0 8px;font-size:1.05em\"\u003eRelated References\u003c/h3\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e| Topic | Reference |\n|------|------|\n| AkShare Documentation | https://akshare.akfamily.xyz/index.html |\n| Gemini API | https://aistudio.google.com/ |\n| WeChat Official Account API | https://developers.weixin.qq.com/platform |\n| Hugo Documentation | https://gohugo.io/ |\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch3 style=\"color:#e5e7eb;margin:18px 0 8px;font-size:1.05em\"\u003eVersion History\u003c/h3\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e| Version | Date | Changes |\n|------|------|------|\n| 1.0.0 | 2026-03-11 | Initial version |\n\u003c/p\u003e"])</script><script>self.__next_f.push([1,"20:[\"$\",\"div\",null,{\"className\":\"skill-page\",\"children\":[[\"$\",\"script\",null,{\"type\":\"application/ld+json\",\"dangerouslySetInnerHTML\":{\"__html\":\"{\\\"@context\\\":\\\"https://schema.org\\\",\\\"@type\\\":\\\"SoftwareApplication\\\",\\\"name\\\":\\\"A-Share Review and Analyse\\\",\\\"description\\\":\\\"A-share market automated review and analysis system, generating daily market insights with Gemini AI, supporting publishing to Hugo blog and WeChat Official...\\\",\\\"url\\\":\\\"https://bytesagain.com/skill/stock-review-ai\\\",\\\"applicationCategory\\\":\\\"clawhub\\\",\\\"operatingSystem\\\":\\\"Any\\\",\\\"offers\\\":{\\\"@type\\\":\\\"Offer\\\",\\\"price\\\":\\\"0\\\",\\\"priceCurrency\\\":\\\"USD\\\"},\\\"publisher\\\":{\\\"@type\\\":\\\"Organization\\\",\\\"name\\\":\\\"BytesAgain\\\",\\\"url\\\":\\\"https://bytesagain.com\\\"}}\"}}],[\"$\",\"div\",null,{\"className\":\"breadcrumb\",\"children\":[[\"$\",\"a\",null,{\"href\":\"/\",\"children\":\"BytesAgain\"}],\" β€Ί \",[\"$\",\"a\",null,{\"href\":\"/skills\",\"children\":\"Skills\"}],\" β€Ί \",\"A-Share Review and Analyse\"]}],[\"$\",\"div\",null,{\"className\":\"two-col\",\"children\":[[\"$\",\"div\",null,{\"className\":\"two-col-main\",\"children\":[[\"$\",\"div\",null,{\"className\":\"skill-card\",\"children\":[[\"$\",\"div\",null,{\"className\":\"skill-header\",\"children\":[[\"$\",\"div\",null,{\"className\":\"skill-badges\",\"children\":[[\"$\",\"span\",null,{\"className\":\"badge\",\"style\":{\"color\":\"#818cf8\",\"background\":\"#818cf822\",\"borderColor\":\"#818cf844\"},\"children\":[\"πŸ¦€\",\" \",\"ClawHub\"]}],false]}],[\"$\",\"div\",null,{\"className\":\"skill-top-actions\",\"children\":[\"$\",\"$L22\",null,{\"slug\":\"stock-review-ai\"}]}]]}],[\"$\",\"h1\",null,{\"className\":\"skill-title\",\"children\":\"A-Share Review and Analyse\"}],[\"$\",\"p\",null,{\"className\":\"skill-owner\",\"children\":[\"by \",[\"$\",\"span\",null,{\"children\":[\"@\",\"donvink\"]}]]}],[\"$\",\"p\",null,{\"className\":\"skill-desc\",\"children\":\"A-share market automated review and analysis system, generating daily market insights with Gemini AI, supporting publishing to Hugo blog and WeChat Official...\"}],[\"$\",\"div\",null,{\"className\":\"skill-meta\",\"children\":[[\"$\",\"div\",null,{\"className\":\"meta-item\",\"children\":[[\"$\",\"span\",null,{\"className\":\"meta-label\",\"children\":\"Version\"}],[\"$\",\"span\",null,{\"className\":\"meta-value\",\"children\":[\"v\",\"1.0.1\"]}]]}],[\"$\",\"div\",null,{\"className\":\"meta-item\",\"children\":[[\"$\",\"span\",null,{\"className\":\"meta-label\",\"children\":\"Downloads\"}],[\"$\",\"span\",null,{\"className\":\"meta-value\",\"children\":\"739\"}]]}],false,[\"$\",\"div\",null,{\"className\":\"meta-item\",\"children\":[[\"$\",\"span\",null,{\"className\":\"meta-label\",\"children\":\"Stars\"}],[\"$\",\"span\",null,{\"className\":\"meta-value\",\"children\":[\"⭐ \",\"1\"]}]]}],false,[\"$\",\"div\",null,{\"className\":\"meta-item\",\"style\":{\"flexDirection\":\"row\",\"gap\":6,\"alignItems\":\"center\"},\"children\":[[\"$\",\"a\",\"clawhub\",{\"href\":\"/?q=clawhub\",\"className\":\"tag\",\"children\":[\"#\",\"clawhub\"]}]]}]]}],[\"$\",\"div\",null,{\"style\":{\"marginTop\":6},\"children\":[\"$\",\"a\",null,{\"href\":\"https://clawhub.ai/donvink/stock-review-ai\",\"target\":\"_blank\",\"rel\":\"noopener\",\"className\":\"btn-secondary\",\"style\":{\"padding\":\"6px 12px\",\"fontSize\":\".82em\",\"borderRadius\":8,\"background\":\"transparent\",\"border\":\"1px solid var(--border-card)\",\"color\":\"var(--text-muted2)\",\"textDecoration\":\"none\",\"whiteSpace\":\"nowrap\"},\"children\":[\"View on \",\"ClawHub\",\" β†’\"]}]}]]}],[\"$\",\"div\",null,{\"className\":\"install-box\",\"children\":[[\"$\",\"div\",null,{\"className\":\"install-header\",\"children\":[[\"$\",\"div\",null,{\"className\":\"install-dots\",\"children\":[[\"$\",\"div\",null,{\"className\":\"dot\",\"style\":{\"background\":\"#ef4444\"}}],[\"$\",\"div\",null,{\"className\":\"dot\",\"style\":{\"background\":\"#eab308\"}}],[\"$\",\"div\",null,{\"className\":\"dot\",\"style\":{\"background\":\"#22c55e\"}}]]}],[\"$\",\"span\",null,{\"className\":\"install-label\",\"children\":\"TERMINAL\"}]]}],[\"$\",\"div\",null,{\"className\":\"install-body\",\"style\":{\"flexWrap\":\"wrap\"},\"children\":[[\"$\",\"code\",null,{\"className\":\"install-cmd\",\"children\":\"clawhub install stock-review-ai\"}],[\"$\",\"button\",null,{\"className\":\"copy-btn\",\"data-cmd\":\"clawhub install stock-review-ai\",\"style\":{\"fontWeight\":700},\"children\":\"Copy\"}]]}]]}],[\"$\",\"section\",null,{\"className\":\"skill-card\",\"style\":{\"marginBottom\":20},\"children\":[[\"$\",\"h2\",null,{\"style\":{\"color\":\"#f8fafc\",\"fontSize\":\"1.2em\",\"fontWeight\":800,\"margin\":\"0 0 16px\",\"display\":\"flex\",\"alignItems\":\"center\",\"gap\":8},\"children\":\"πŸ“– About This Skill\"}],[\"$\",\"div\",null,{\"style\":{\"fontSize\":\".92em\",\"color\":\"#94a3b8\",\"lineHeight\":1.75},\"dangerouslySetInnerHTML\":{\"__html\":\"$23\"}}]]}],null,null,\"$L24\",\"$L25\",null,null,null,false,false]}],\"$L26\"]}]]}]\n"])</script><script>self.__next_f.push([1,"21:[\"$\",\"script\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"\\n        document.querySelectorAll('.copy-btn, .script-copy-btn').forEach(btn =\u003e {\\n          btn.addEventListener('click', () =\u003e {\\n            const cmd = btn.getAttribute('data-cmd');\\n            if (!cmd) return;\\n            navigator.clipboard.writeText(cmd).then(() =\u003e {\\n              const orig = btn.textContent;\\n              btn.textContent = 'Copied!';\\n              setTimeout(() =\u003e btn.textContent = orig, 1500);\\n            }).catch(() =\u003e {});\\n          });\\n        });\\n      \"}}]\n"])</script><script>self.__next_f.push([1,"27:I[71521,[\"/_next/static/chunks/0ph_0rx9ah5dc.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"/_next/static/chunks/0i_x3w546rsb3.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"/_next/static/chunks/06ig5gym-0n-u.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"/_next/static/chunks/12w5ognupk9fb.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\"],\"default\"]\n24:[\"$\",\"section\",null,{\"className\":\"skill-card\",\"style\":{\"marginBottom\":20},\"children\":[[\"$\",\"h2\",null,{\"style\":{\"color\":\"#f8fafc\",\"fontSize\":\"1.2em\",\"fontWeight\":800,\"margin\":\"0 0 16px\",\"display\":\"flex\",\"alignItems\":\"center\",\"gap\":8},\"children\":\"βš™οΈ Configuration\"}],[\"$\",\"div\",null,{\"style\":{\"fontSize\":\".92em\",\"color\":\"#94a3b8\",\"lineHeight\":1.75},\"dangerouslySetInnerHTML\":{\"__html\":\"\u003cp style=\\\"margin:8px 0\\\"\u003e\u003cstrong style=\\\"color:#e5e7eb\\\"\u003eRequired\u003c/strong\u003e:\\n\u003cli style=\\\"color:#94a3b8;margin:3px 0\\\"\u003ePython 3.10+\u003c/li\u003e\\n\u003cli style=\\\"color:#94a3b8;margin:3px 0\\\"\u003eDependencies: \u003ccode style=\\\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\\\"\u003epip install -r requirements.txt\u003c/code\u003e\u003c/li\u003e\\n\u003cli style=\\\"color:#94a3b8;margin:3px 0\\\"\u003eGemini API key (for AI analysis)\u003c/li\u003e\u003c/p\u003e\u003cp style=\\\"margin:8px 0\\\"\u003e\u003cstrong style=\\\"color:#e5e7eb\\\"\u003eOptional\u003c/strong\u003e:\\n\u003cli style=\\\"color:#94a3b8;margin:3px 0\\\"\u003eWeChat Official Account AppID and AppSecret (for WeChat publishing)\u003c/li\u003e\\n\u003cli style=\\\"color:#94a3b8;margin:3px 0\\\"\u003eHugo blog environment (for blog publishing)\u003c/li\u003e\u003c/p\u003e\u003cp style=\\\"margin:8px 0\\\"\u003e\u003cstrong style=\\\"color:#e5e7eb\\\"\u003eConfiguration Locations\u003c/strong\u003e (priority order):\\n1. CLI parameters\\n2. config.yaml, .env (project-level/user-level)\\n3. Environment variables\\n4. Default values\u003c/p\u003e\"}}]]}]\n25:[\"$\",\"section\",null,{\"className\":\"skill-card\",\"style\":{\"marginBottom\":20},\"children\":[[\"$\",\"h2\",null,{\"style\":{\"color\":\"#f8fafc\",\"fontSize\":\"1.2em\",\"fontWeight\":800,\"margin\":\"0 0 16px\",\"display\":\"flex\",\"alignItems\":\"center\",\"gap\":8},\"children\":\"πŸ“‹ Tips \u0026 Best Practices\"}],[\"$\",\"div\",null,{\"style\":{\"fontSize\":\".92em\",\"color\":\"#94a3b8\",\"lineHeight\":1.75},\"dangerouslySetInnerHTML\":{\"__html\":\"\u003cp style=\\\"margin:8px 0\\\"\u003e| Issue | Solution |\\n|------|----------|\\n| Unable to fetch data | Check network, specify another date |\\n| Gemini API error | Check if API key is valid, quota is sufficient |\\n| Limit-up pool data empty | Possibly non-trading day, try backtracking to another date |\\n| WeChat publishing failed | Check AppID/Secret, \u003cstrong style=\\\"color:#e5e7eb\\\"\u003econfirm IP is whitelisted\u003c/strong\u003e |\\n| Chinese character encoding issues | Ensure file encoding is UTF-8 |\\n| Data format error | Check CSV files, ensure code column isn't converted to numbers |\\n| Timeout error | Increase \u003ccode style=\\\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\\\"\u003erequest_delay\u003c/code\u003e or \u003ccode style=\\\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\\\"\u003emax_retries\u003c/code\u003e |\\n| Insufficient memory | Reduce data volume or process in batches |\u003c/p\u003e\"}}]]}]\n26:[\"$\",\"div\",null,{\"className\":\"two-col-side\",\"children\":[\"$\",\"$L27\",null,{\"category\":\"clawhub\",\"currentSlug\":\"stock-review-ai\",\"name\":\"A-Share Review and Analyse\",\"tags\":[\"clawhub\"]}]}]\n"])</script></body></html>