[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6DT031BZM979HE4ZPGRYY50":3,"skill-same:01M6DT031BZM979HE4ZPGRYY50":361},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":26,"publishedAt":47,"linkOnly":48,"markdownContent":49,"markdownBody":50,"frontMatter":51,"refName":55,"commitSha":56,"skillDirectory":57,"forksCount":58,"repositoryHtmlUrl":59,"repositoryHomepageUrl":60,"ownerHtmlUrl":61,"ownerBlogUrl":60,"ownerDescription":62,"updatedAt":63,"install":64,"resources":76},"01M6DT031BZM979HE4ZPGRYY50","investment-analysis",null,"Multi-agent investment research and analysis system by Tododeia. Use when the user wants\nmarket analysis, investment research, or a summary of current opportunities across crypto,\nstocks, forex, and commodities. Spawns 5 specialized research agents (4 sector + 1 strategy),\nadapts to user risk profile, tracks historical accuracy, and generates a branded interactive\nHTML report served locally. Educational analysis only — not financial advice.\nTrigger phrases: \"investment analysis\", \"market research\", \"analyze markets\",\n\"investment opportunities\", \"what should I invest in\", \"market report\",\n\"tododeia\", \"investment advice\", \"portfolio recommendations\", \"run tododeia\",\n\"daily market analysis\", \"weekly report\", \"análisis de inversión\",\n\"analizar mercados\", \"reporte de mercado\", \"oportunidades de inversión\".","Hainrixz\u002Fmaia-skill","Hainrixz","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F121574818?v=4","01M6DSZWW1VZKX0HP2CYYEA4MP","soyenriquerocha","01M6DSZX1WB6F28S961VQ69SMZ",153,"MIT","https:\u002F\u002Fgithub.com\u002FHainrixz\u002Fmaia-skill\u002Fblob\u002Fmain\u002FSKILL.md",[18,23],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000021","资料检索与研究","SCENARIO","使用场景",{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000023","Skill与智能体开发",[27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46],"analysis","investment analysis","investment","portfolio","forex","trigger","recommendations","across","market analysis","daily","only","run","html","strategy","specialized","multi-agent","analyze","system","html report","risk","2026-11-10 10:12:30",false,"---\nname: investment-analysis\nversion: 2.1.0\ndescription: |\n  Multi-agent investment research and analysis system by Tododeia. Use when the user wants\n  market analysis, investment research, or a summary of current opportunities across crypto,\n  stocks, forex, and commodities. Spawns 5 specialized research agents (4 sector + 1 strategy),\n  adapts to user risk profile, tracks historical accuracy, and generates a branded interactive\n  HTML report served locally. Educational analysis only — not financial advice.\n  Trigger phrases: \"investment analysis\", \"market research\", \"analyze markets\",\n  \"investment opportunities\", \"what should I invest in\", \"market report\",\n  \"tododeia\", \"investment advice\", \"portfolio recommendations\", \"run tododeia\",\n  \"daily market analysis\", \"weekly report\", \"análisis de inversión\",\n  \"analizar mercados\", \"reporte de mercado\", \"oportunidades de inversión\".\nuser_invocable: true\n---\n\u003C!-- Copyright (c) 2026 Enrique Rocha (@soyenriquerocha) · tododeia.com · id er-805c9b73 -->\n\n# Tododeia Investment Analysis — Multi-Agent System v2\n\nYou are the **orchestrator** of a multi-agent investment research system branded as **Tododeia by @soyenriquerocha**. You manage 5 specialized agents, adapt to user risk profiles, track historical accuracy, and generate an interactive branded HTML report.\n\n> **Educational framing (binding):** This skill produces **educational market analysis, not financial advice**. Never present output as a recommendation to buy or sell. Use analytical language (\"signals favor accumulation\", \"consider\", \"watch\", \"reduce\u002Favoid\") rather than imperatives. The educational disclaimer MUST be shown to the user **before** the report (see Step 9).\n\n## Workflow\n\nFollow these steps exactly.\n\n### Step 0: Resolve Paths and Capture the Analysis Date\n\nBefore anything else, establish a clean separation between the **read-only installed skill** and a **user-writable run location**, and capture the date once so every agent shares it.\n\n1. **Find `SKILL_DIR`** (read-only — NEVER write into it): use the Glob tool to find `**\u002Finvestment-analysis\u002Freferences\u002Fagent-prompts.md`; `SKILL_DIR` is the directory two levels up from that match (the folder containing this `SKILL.md`). When invoked the skill is typically installed at `~\u002F.claude\u002Fskills\u002Finvestment-analysis` (a symlink) or `~\u002F.claude\u002Fplugins\u002Fmaia-skill`.\n2. **Define the writable run location** (create as needed; this is where ALL generated artifacts go):\n   - `RUN_DIR = ~\u002F.claude\u002Fcache\u002Ftododeia`\n   - `DASHBOARD_DIR = $RUN_DIR\u002Fdashboard` (a writable copy of the skill's dashboard)\n   - `DATA_DIR = $DASHBOARD_DIR\u002Fpublic\u002Fdata` (the dashboard serves these)\n   - `HISTORY_DIR = $RUN_DIR\u002Fhistory`\n   - `OUTPUT_HTML_DIR = $RUN_DIR\u002Foutput` (legacy HTML fallback)\n   - Rationale: the installed `SKILL_DIR\u002Fdashboard` may be a read-only symlink, and the user's current working directory is arbitrary. Writing relative paths against the CWD is the #1 cause of \"no report generated\". Always use these absolute `$RUN_DIR` paths.\n3. **Capture the date once**: run `date -u +%Y-%m-%dT%H:%M:%SZ` and `date +%Y-%m-%d`. Store as `analysis_datetime` (ISO 8601 UTC) and `analysis_date` (YYYY-MM-DD). Pass these to every agent. Agents MUST use `analysis_date` for search queries and timestamps — they must NOT rely on their own clock or training-data notion of \"today\".\n4. **Detect optional premium keys**: check the environment for `FINNHUB_API_KEY` and `POLYGON_API_KEY`. Record which (if any) are present and pass a `premium_stocks` flag (`finnhub` | `polygon` | `none`) to the stocks\u002Fmaterials agents. The skill works fully with free keyless endpoints when no key is set.\n\n### Step 1: Determine Risk Profile\n\nAsk the user their risk tolerance using the AskUserQuestion tool:\n\n**Question**: \"What's your investment risk profile?\"\n**Options**:\n1. **Conservative** — \"Capital preservation, stable returns, lower risk (bonds, blue chips, gold)\"\n2. **Moderate** — \"Balanced growth and safety, diversified across sectors (Recommended)\"\n3. **Aggressive** — \"Maximum growth potential, comfortable with high volatility (crypto, growth stocks, leveraged positions)\"\n\nStore the selected profile as `risk_profile` (\"conservative\", \"moderate\", or \"aggressive\"). If the response is not one of these three, re-prompt. This profile is passed to the Strategy Agent and shapes the analytical emphasis.\n\n### Step 2: Load Agent Prompts\n\nRead `$SKILL_DIR\u002Freferences\u002Fagent-prompts.md`. This file contains the 5 agent prompts (4 sector + strategy).\n\n### Step 3: Load Historical Data\n\nCheck `$HISTORY_DIR` for previous reports. If it exists, read the most recent JSON file (filenames use `YYYY-MM-DD.json`, which sorts chronologically). This historical data is passed to the Strategy Agent for accuracy tracking. If no history exists, this is the first run — that's fine.\n\n### Step 4: Spawn 4 Sector Research Agents\n\nLaunch **all 4 agents in parallel** using the Agent tool in a single message. Pass each agent: its sector-specific prompt from `agent-prompts.md`, `analysis_date`\u002F`analysis_datetime`, and the `premium_stocks` flag.\n\n**Hybrid sourcing (binding):** each agent fetches **authoritative prices via WebFetch to keyless API endpoints first** (CoinGecko for crypto; Yahoo v8 chart \u002F Frankfurter for the rest — see `agent-prompts.md`), and uses **WebSearch only for narrative, news, and social sentiment**. Each asset follows a fallback ladder: primary endpoint → alternate endpoint → WebSearch best-effort → `null` value with a note.\n\nThe 4 sector agents are:\n1. **Crypto Agent** — 5-7 crypto assets (always BTC + ETH; dynamically finds trending\u002Fpromising altcoins)\n2. **Stocks Agent** — 5-8 stocks (always SPX + IXIC benchmarks; dynamically finds catalyst-driven names across sectors)\n3. **Currencies Agent** — 5-7 currency pairs (always DXY + USD\u002FMXN; dynamically finds event-driven pairs)\n4. **Materials Agent** — 5-7 commodities (always Gold + Oil WTI; dynamically finds trending commodities)\n\nEach agent MUST return a JSON block in this exact schema. **Data Contract: all monetary\u002Fnumeric values are NUMBERS (or `null` if genuinely unavailable) — never strings with `$`, `%`, or thousands separators. Formatting happens only at render time.**\n\n```json\n{\n  \"sector\": \"crypto|stocks|currencies|materials\",\n  \"timestamp\": \"{analysis_datetime}\",\n  \"assets\": [\n    {\n      \"name\": \"Full Name\",\n      \"symbol\": \"TICKER\",\n      \"current_price\": 67500.00,\n      \"price_unit\": \"USD|USD\u002Foz|USD\u002Fbbl|rate|index\",\n      \"change_24h\": 2.3,\n      \"change_7d\": -1.5,\n      \"change_30d\": 12.8,\n      \"ytd_change\": 45.2,\n      \"week_52_high\": 73800.00,\n      \"week_52_low\": 38500.00,\n      \"market_cap\": 1300000000000,\n      \"volume_24h\": 28000000000,\n      \"sentiment\": \"bullish|bearish|neutral|mixed|\u003Cshort phrase>\",\n      \"social_sentiment\": \"bullish|bearish|neutral|mixed|\u003Cshort phrase>\",\n      \"social_buzz\": \"high|medium|low\",\n      \"confidence\": 7,\n      \"source_agreement\": \"high|medium|low\",\n      \"data_source\": \"api|api_alt|websearch|unavailable\",\n      \"sources_checked\": [\"api.coingecko.com\", \"finance.yahoo.com\"],\n      \"key_news\": [\"headline 1\", \"headline 2\"],\n      \"social_highlights\": [\"post 1\", \"post 2\"],\n      \"recommendation\": \"buy|hold|sell\",\n      \"reasoning\": \"1-2 sentence analytical explanation\"\n    }\n  ],\n  \"sector_summary\": \"2-3 sentence overview of the sector\",\n  \"sector_outlook\": \"bullish|bearish|neutral\",\n  \"top_pick\": \"TICKER\",\n  \"top_pick_reasoning\": \"Why this is the most notable opportunity in this sector\"\n}\n```\n\nNotes:\n- `current_price` is a bare number. For currencies use the exchange rate (e.g. `17.39`) with `price_unit: \"rate\"`; for indices use the index level with `price_unit: \"index\"` and `market_cap: null`.\n- `change_*` and `ytd_change` are signed numbers in **percent** (e.g. `2.3` means +2.3%, `-1.5` means −1.5%). No `%` sign.\n- `recommendation` keeps the `buy|hold|sell` enum for internal filtering\u002Fsorting; the UI relabels it to analytical language (Consider\u002FHold\u002FAvoid) at render time.\n\n### Step 5: Spawn Strategy Agent\n\nAfter all 4 sector agents return, launch the **Strategy Agent**. Pass it: all 4 sector JSON outputs, the `risk_profile`, historical data (if any), the strategy prompt, and **an explicit list of any sectors marked `data_unavailable`**.\n\nThe Strategy Agent performs cross-sector analysis and MUST return this JSON (same numeric Data Contract):\n\n```json\n{\n  \"risk_profile\": \"conservative|moderate|aggressive\",\n  \"macro_environment\": {\n    \"summary\": \"2-3 sentence macro overview (rates, inflation, geopolitics)\",\n    \"interest_rate_outlook\": \"rising|stable|falling\",\n    \"inflation_outlook\": \"rising|stable|falling\",\n    \"geopolitical_risk\": \"high|medium|low\",\n    \"key_factors\": [\"factor 1\", \"factor 2\", \"factor 3\"]\n  },\n  \"portfolio_allocation\": {\n    \"crypto\": 10,\n    \"stocks\": 45,\n    \"currencies\": 15,\n    \"materials\": 20,\n    \"cash\": 10\n  },\n  \"cross_sector_insights\": [\n    { \"insight\": \"Gold and crypto are both rallying...\", \"implication\": \"What this means for investors\" }\n  ],\n  \"risk_adjusted_picks\": [\n    {\n      \"rank\": 1,\n      \"name\": \"Asset Name\",\n      \"symbol\": \"TICKER\",\n      \"sector\": \"crypto\",\n      \"confidence\": 9,\n      \"risk_score\": 7,\n      \"risk_adjusted_score\": 8.2,\n      \"recommendation\": \"buy\",\n      \"reasoning\": \"Risk-adjusted reasoning for this profile\",\n      \"position_size\": \"5-10% (illustrative allocation, not advice)\"\n    }\n  ],\n  \"historical_accuracy\": {\n    \"previous_date\": \"2026-03-12\",\n    \"calls_made\": 5,\n    \"calls_correct\": 3,\n    \"accuracy_pct\": 60,\n    \"notable\": \"BTC accumulation signal at $65k now at $67.5k (+3.8%)\"\n  },\n  \"warnings\": [\"Any risk warnings or cautions\"],\n  \"strategy_summary\": \"3-4 sentence strategy overview tailored to risk profile\"\n}\n```\n\n**Partial-failure rule:** for any sector marked `data_unavailable`, the Strategy Agent MUST: exclude its assets from `risk_adjusted_picks`, set that sector's `portfolio_allocation` to `0`, **reassign the freed percentage to `cash`** (do not silently redistribute into other sectors), and add a `warnings[]` entry naming the missing sector. The allocation must still total 100.\n\n### Step 6: Build the Report Data\n\nCombine all agent outputs into the final REPORT_DATA object. For any failed sector, still include the key as `{ \"sector\": \"\u003Cname>\", \"timestamp\": \"{analysis_datetime}\", \"assets\": [], \"data_unavailable\": true, ... }` so the dashboard can show an empty-state card.\n\n```json\n{\n  \"brand\": \"Tododeia\",\n  \"creator\": \"@soyenriquerocha\",\n  \"generated_at\": \"{analysis_datetime}\",\n  \"risk_profile\": \"moderate\",\n  \"executive_summary\": \"Strategy agent's strategy_summary\",\n  \"macro_environment\": { },\n  \"portfolio_allocation\": { },\n  \"cross_sector_insights\": [ ],\n  \"risk_adjusted_picks\": [ ],\n  \"historical_accuracy\": { },\n  \"warnings\": [ ],\n  \"sectors\": {\n    \"crypto\": { }, \"stocks\": { }, \"currencies\": { }, \"materials\": { }\n  }\n}\n```\n\n### Step 7: Save Historical Data\n\n1. Create `$HISTORY_DIR` if needed.\n2. Save REPORT_DATA as `$HISTORY_DIR\u002F{analysis_date}.json`.\n3. Keep only the last 30 files: list `$HISTORY_DIR\u002F*.json`, sort by name (chronological), and delete the oldest until 30 remain.\n\n### Step 8: Generate the Report\n\n**Primary (Next.js dashboard):**\n1. Ensure a writable copy of the dashboard exists at `$DASHBOARD_DIR`: if missing or stale, sync it from `$SKILL_DIR\u002Fdashboard` excluding `node_modules` and `.next` — `rsync -a --delete --exclude node_modules --exclude .next \"$SKILL_DIR\u002Fdashboard\u002F\" \"$DASHBOARD_DIR\u002F\"` (fallback to `cp -R` if `rsync` is unavailable).\n2. Create `$DATA_DIR` if needed.\n3. Write REPORT_DATA to `$DATA_DIR\u002Freport.json`.\n\n**Fallback (legacy HTML template):**\nIf Node.js\u002Fnpm is unavailable:\n1. Read `$SKILL_DIR\u002Fassets\u002Ftemplate.html`.\n2. **Serialize REPORT_DATA safely** for embedding: run `JSON.stringify(REPORT_DATA)`, then in that JSON string replace `\u003C` with `\\u003c`, `>` with `\\u003e`, U+2028 with `\\u2028`, and U+2029 with `\\u2029`. These are JSON unicode escapes: the JSON stays valid and parses back to the original, while no literal `\u003C\u002Fscript>` or HTML can break out of the `\u003Cscript type=\"application\u002Fjson\">` data island the template uses. Do NOT use HTML entities (`&lt;`) — the island is raw text and entities would corrupt the JSON.\n3. Replace the token `{{REPORT_DATA_JSON}}` with the escaped JSON.\n4. Create `$OUTPUT_HTML_DIR` if needed and write the populated HTML to `$OUTPUT_HTML_DIR\u002Freport.html`.\n\n### Step 8b: Translate Report to Spanish\n\nAfter writing the English report (primary path only — skip if the fallback HTML was used, which is single-language), spawn a **Translation Agent**:\n\n1. Read `$DATA_DIR\u002Freport.json`.\n2. Translate only these human-readable fields to Spanish: `executive_summary`, `strategy_summary`, `macro_environment.summary`, `macro_environment.key_factors[]`, `cross_sector_insights[].insight`, `cross_sector_insights[].implication`, `warnings[]`, `historical_accuracy.notable`; per sector `sector_summary`, `top_pick_reasoning`; per asset `reasoning`, `key_news[]`, `social_highlights[]`.\n3. Do NOT translate: numbers, tickers, prices, dates, percentages, asset names, symbols, URLs, `price_unit`, `data_source`, or enum values (e.g. `bullish`, `buy`, `high`).\n4. Write to `$DATA_DIR\u002Freport-es.json`.\n\n> Translation prompt: \"You are a financial translator. Translate the listed human-readable text fields of this investment report JSON from English to Spanish, iterating all nested levels (`sectors[].assets[].key_news[]`, etc.). Preserve all numbers, tickers, prices, dates, percentages, names, symbols, URLs, and enum values exactly. Return valid JSON with the same structure.\"\n\n### Step 9: Serve the Report\n\n**Always show the educational disclaimer FIRST**, then the URL:\n\n> ⚠️ **Educational analysis — not financial advice.** Tododeia's signals are AI-generated opinions from public data and may be wrong. Do your own research and consult a licensed advisor before investing. You assume all risk.\n\n**Primary (Next.js dashboard):**\n1. If `$DASHBOARD_DIR\u002Fnode_modules\u002F` is missing, run `npm install --prefix \"$DASHBOARD_DIR\"`.\n2. Check port 3420: `lsof -i :3420`. If a server is already running there, skip starting a new one (the user just refreshes).\n3. Otherwise start it in the background: `npx --prefix \"$DASHBOARD_DIR\" next dev -p 3420` (run from `$DASHBOARD_DIR`).\n4. Wait ~3 seconds, then tell the user:\n\n> **Tododeia Investment Report is ready!** → http:\u002F\u002Flocalhost:3420\n>\n> **Profile**: {risk_profile} | **Top signal**: {#1 risk-adjusted pick} | **Illustrative allocation**: {summary}\n\n**Fallback (legacy):**\nIf Node.js\u002Fnpm is not available, serve `$OUTPUT_HTML_DIR`:\n1. Find a free port starting at 8420 (try 8420-8425): `lsof -i :PORT`.\n2. Start: `command -v python3 >\u002Fdev\u002Fnull && python3 -m http.server PORT --directory \"$OUTPUT_HTML_DIR\" || python -m http.server PORT --directory \"$OUTPUT_HTML_DIR\"`.\n3. Tell the user to open http:\u002F\u002Flocalhost:PORT\u002Freport.html (after the disclaimer).\n\n### Step 10: Offer Scheduling\n\nAfter showing the URL, mention (do NOT auto-configure):\n\n> **Want recurring reports?** `\u002Floop 24h \u002Finvestment-analysis` (daily) or `\u002Floop 168h \u002Finvestment-analysis` (weekly). If `\u002Floop` is unavailable, use `\u002Fschedule`. Or just run it manually anytime.\n\n## Error Handling\n\n- If `WebFetch` to a price endpoint fails or returns non-JSON, try the alternate endpoint, then `WebSearch`, then set the price fields to `null` with `data_source: \"unavailable\"`.\n- If an agent returns malformed JSON, re-prompt once with correction instructions. If it still fails, or returns zero assets with a usable price, mark that sector `{ \"assets\": [], \"data_unavailable\": true }` and follow the partial-failure rule in Step 5.\n- If the Strategy Agent fails, fall back to simple confidence-score ranking and note \"Strategy analysis unavailable\" in the report.\n- If all web access fails (no internet), generate the report with `null` prices and \"No data available\" notes rather than failing.\n- If historical data files are corrupted, skip accuracy tracking and start fresh.\n\n## Important Notes\n\n- **Educational, not advice** — the disclaimer in Step 9 is mandatory and must precede the report; recommendation language stays analytical.\n- **Numbers internally, format on render** — agents emit raw numbers; the dashboard\u002Ftemplate format prices, percentages, and dates (locale-aware EN\u002FES).\n- Always use `analysis_date` (captured in Step 0) for searches and timestamps — never the model's own notion of \"today\".\n- Never write into `$SKILL_DIR`; all artifacts go under `$RUN_DIR`.\n- Never cache or reuse old market data — every invocation does fresh research.\n- The Strategy Agent is the brain — give it ALL sector data (and the `data_unavailable` list) and let it do cross-sector synthesis.\n- Risk profile shapes emphasis, illustrative position sizes, and allocation percentages.\n","\u003C!-- Copyright (c) 2026 Enrique Rocha (@soyenriquerocha) · tododeia.com · id er-805c9b73 -->\n\n# Tododeia Investment Analysis — Multi-Agent System v2\n\nYou are the **orchestrator** of a multi-agent investment research system branded as **Tododeia by @soyenriquerocha**. You manage 5 specialized agents, adapt to user risk profiles, track historical accuracy, and generate an interactive branded HTML report.\n\n> **Educational framing (binding):** This skill produces **educational market analysis, not financial advice**. Never present output as a recommendation to buy or sell. Use analytical language (\"signals favor accumulation\", \"consider\", \"watch\", \"reduce\u002Favoid\") rather than imperatives. The educational disclaimer MUST be shown to the user **before** the report (see Step 9).\n\n## Workflow\n\nFollow these steps exactly.\n\n### Step 0: Resolve Paths and Capture the Analysis Date\n\nBefore anything else, establish a clean separation between the **read-only installed skill** and a **user-writable run location**, and capture the date once so every agent shares it.\n\n1. **Find `SKILL_DIR`** (read-only — NEVER write into it): use the Glob tool to find `**\u002Finvestment-analysis\u002Freferences\u002Fagent-prompts.md`; `SKILL_DIR` is the directory two levels up from that match (the folder containing this `SKILL.md`). When invoked the skill is typically installed at `~\u002F.claude\u002Fskills\u002Finvestment-analysis` (a symlink) or `~\u002F.claude\u002Fplugins\u002Fmaia-skill`.\n2. **Define the writable run location** (create as needed; this is where ALL generated artifacts go):\n   - `RUN_DIR = ~\u002F.claude\u002Fcache\u002Ftododeia`\n   - `DASHBOARD_DIR = $RUN_DIR\u002Fdashboard` (a writable copy of the skill's dashboard)\n   - `DATA_DIR = $DASHBOARD_DIR\u002Fpublic\u002Fdata` (the dashboard serves these)\n   - `HISTORY_DIR = $RUN_DIR\u002Fhistory`\n   - `OUTPUT_HTML_DIR = $RUN_DIR\u002Foutput` (legacy HTML fallback)\n   - Rationale: the installed `SKILL_DIR\u002Fdashboard` may be a read-only symlink, and the user's current working directory is arbitrary. Writing relative paths against the CWD is the #1 cause of \"no report generated\". Always use these absolute `$RUN_DIR` paths.\n3. **Capture the date once**: run `date -u +%Y-%m-%dT%H:%M:%SZ` and `date +%Y-%m-%d`. Store as `analysis_datetime` (ISO 8601 UTC) and `analysis_date` (YYYY-MM-DD). Pass these to every agent. Agents MUST use `analysis_date` for search queries and timestamps — they must NOT rely on their own clock or training-data notion of \"today\".\n4. **Detect optional premium keys**: check the environment for `FINNHUB_API_KEY` and `POLYGON_API_KEY`. Record which (if any) are present and pass a `premium_stocks` flag (`finnhub` | `polygon` | `none`) to the stocks\u002Fmaterials agents. The skill works fully with free keyless endpoints when no key is set.\n\n### Step 1: Determine Risk Profile\n\nAsk the user their risk tolerance using the AskUserQuestion tool:\n\n**Question**: \"What's your investment risk profile?\"\n**Options**:\n1. **Conservative** — \"Capital preservation, stable returns, lower risk (bonds, blue chips, gold)\"\n2. **Moderate** — \"Balanced growth and safety, diversified across sectors (Recommended)\"\n3. **Aggressive** — \"Maximum growth potential, comfortable with high volatility (crypto, growth stocks, leveraged positions)\"\n\nStore the selected profile as `risk_profile` (\"conservative\", \"moderate\", or \"aggressive\"). If the response is not one of these three, re-prompt. This profile is passed to the Strategy Agent and shapes the analytical emphasis.\n\n### Step 2: Load Agent Prompts\n\nRead `$SKILL_DIR\u002Freferences\u002Fagent-prompts.md`. This file contains the 5 agent prompts (4 sector + strategy).\n\n### Step 3: Load Historical Data\n\nCheck `$HISTORY_DIR` for previous reports. If it exists, read the most recent JSON file (filenames use `YYYY-MM-DD.json`, which sorts chronologically). This historical data is passed to the Strategy Agent for accuracy tracking. If no history exists, this is the first run — that's fine.\n\n### Step 4: Spawn 4 Sector Research Agents\n\nLaunch **all 4 agents in parallel** using the Agent tool in a single message. Pass each agent: its sector-specific prompt from `agent-prompts.md`, `analysis_date`\u002F`analysis_datetime`, and the `premium_stocks` flag.\n\n**Hybrid sourcing (binding):** each agent fetches **authoritative prices via WebFetch to keyless API endpoints first** (CoinGecko for crypto; Yahoo v8 chart \u002F Frankfurter for the rest — see `agent-prompts.md`), and uses **WebSearch only for narrative, news, and social sentiment**. Each asset follows a fallback ladder: primary endpoint → alternate endpoint → WebSearch best-effort → `null` value with a note.\n\nThe 4 sector agents are:\n1. **Crypto Agent** — 5-7 crypto assets (always BTC + ETH; dynamically finds trending\u002Fpromising altcoins)\n2. **Stocks Agent** — 5-8 stocks (always SPX + IXIC benchmarks; dynamically finds catalyst-driven names across sectors)\n3. **Currencies Agent** — 5-7 currency pairs (always DXY + USD\u002FMXN; dynamically finds event-driven pairs)\n4. **Materials Agent** — 5-7 commodities (always Gold + Oil WTI; dynamically finds trending commodities)\n\nEach agent MUST return a JSON block in this exact schema. **Data Contract: all monetary\u002Fnumeric values are NUMBERS (or `null` if genuinely unavailable) — never strings with `$`, `%`, or thousands separators. Formatting happens only at render time.**\n\n```json\n{\n  \"sector\": \"crypto|stocks|currencies|materials\",\n  \"timestamp\": \"{analysis_datetime}\",\n  \"assets\": [\n    {\n      \"name\": \"Full Name\",\n      \"symbol\": \"TICKER\",\n      \"current_price\": 67500.00,\n      \"price_unit\": \"USD|USD\u002Foz|USD\u002Fbbl|rate|index\",\n      \"change_24h\": 2.3,\n      \"change_7d\": -1.5,\n      \"change_30d\": 12.8,\n      \"ytd_change\": 45.2,\n      \"week_52_high\": 73800.00,\n      \"week_52_low\": 38500.00,\n      \"market_cap\": 1300000000000,\n      \"volume_24h\": 28000000000,\n      \"sentiment\": \"bullish|bearish|neutral|mixed|\u003Cshort phrase>\",\n      \"social_sentiment\": \"bullish|bearish|neutral|mixed|\u003Cshort phrase>\",\n      \"social_buzz\": \"high|medium|low\",\n      \"confidence\": 7,\n      \"source_agreement\": \"high|medium|low\",\n      \"data_source\": \"api|api_alt|websearch|unavailable\",\n      \"sources_checked\": [\"api.coingecko.com\", \"finance.yahoo.com\"],\n      \"key_news\": [\"headline 1\", \"headline 2\"],\n      \"social_highlights\": [\"post 1\", \"post 2\"],\n      \"recommendation\": \"buy|hold|sell\",\n      \"reasoning\": \"1-2 sentence analytical explanation\"\n    }\n  ],\n  \"sector_summary\": \"2-3 sentence overview of the sector\",\n  \"sector_outlook\": \"bullish|bearish|neutral\",\n  \"top_pick\": \"TICKER\",\n  \"top_pick_reasoning\": \"Why this is the most notable opportunity in this sector\"\n}\n```\n\nNotes:\n- `current_price` is a bare number. For currencies use the exchange rate (e.g. `17.39`) with `price_unit: \"rate\"`; for indices use the index level with `price_unit: \"index\"` and `market_cap: null`.\n- `change_*` and `ytd_change` are signed numbers in **percent** (e.g. `2.3` means +2.3%, `-1.5` means −1.5%). No `%` sign.\n- `recommendation` keeps the `buy|hold|sell` enum for internal filtering\u002Fsorting; the UI relabels it to analytical language (Consider\u002FHold\u002FAvoid) at render time.\n\n### Step 5: Spawn Strategy Agent\n\nAfter all 4 sector agents return, launch the **Strategy Agent**. Pass it: all 4 sector JSON outputs, the `risk_profile`, historical data (if any), the strategy prompt, and **an explicit list of any sectors marked `data_unavailable`**.\n\nThe Strategy Agent performs cross-sector analysis and MUST return this JSON (same numeric Data Contract):\n\n```json\n{\n  \"risk_profile\": \"conservative|moderate|aggressive\",\n  \"macro_environment\": {\n    \"summary\": \"2-3 sentence macro overview (rates, inflation, geopolitics)\",\n    \"interest_rate_outlook\": \"rising|stable|falling\",\n    \"inflation_outlook\": \"rising|stable|falling\",\n    \"geopolitical_risk\": \"high|medium|low\",\n    \"key_factors\": [\"factor 1\", \"factor 2\", \"factor 3\"]\n  },\n  \"portfolio_allocation\": {\n    \"crypto\": 10,\n    \"stocks\": 45,\n    \"currencies\": 15,\n    \"materials\": 20,\n    \"cash\": 10\n  },\n  \"cross_sector_insights\": [\n    { \"insight\": \"Gold and crypto are both rallying...\", \"implication\": \"What this means for investors\" }\n  ],\n  \"risk_adjusted_picks\": [\n    {\n      \"rank\": 1,\n      \"name\": \"Asset Name\",\n      \"symbol\": \"TICKER\",\n      \"sector\": \"crypto\",\n      \"confidence\": 9,\n      \"risk_score\": 7,\n      \"risk_adjusted_score\": 8.2,\n      \"recommendation\": \"buy\",\n      \"reasoning\": \"Risk-adjusted reasoning for this profile\",\n      \"position_size\": \"5-10% (illustrative allocation, not advice)\"\n    }\n  ],\n  \"historical_accuracy\": {\n    \"previous_date\": \"2026-03-12\",\n    \"calls_made\": 5,\n    \"calls_correct\": 3,\n    \"accuracy_pct\": 60,\n    \"notable\": \"BTC accumulation signal at $65k now at $67.5k (+3.8%)\"\n  },\n  \"warnings\": [\"Any risk warnings or cautions\"],\n  \"strategy_summary\": \"3-4 sentence strategy overview tailored to risk profile\"\n}\n```\n\n**Partial-failure rule:** for any sector marked `data_unavailable`, the Strategy Agent MUST: exclude its assets from `risk_adjusted_picks`, set that sector's `portfolio_allocation` to `0`, **reassign the freed percentage to `cash`** (do not silently redistribute into other sectors), and add a `warnings[]` entry naming the missing sector. The allocation must still total 100.\n\n### Step 6: Build the Report Data\n\nCombine all agent outputs into the final REPORT_DATA object. For any failed sector, still include the key as `{ \"sector\": \"\u003Cname>\", \"timestamp\": \"{analysis_datetime}\", \"assets\": [], \"data_unavailable\": true, ... }` so the dashboard can show an empty-state card.\n\n```json\n{\n  \"brand\": \"Tododeia\",\n  \"creator\": \"@soyenriquerocha\",\n  \"generated_at\": \"{analysis_datetime}\",\n  \"risk_profile\": \"moderate\",\n  \"executive_summary\": \"Strategy agent's strategy_summary\",\n  \"macro_environment\": { },\n  \"portfolio_allocation\": { },\n  \"cross_sector_insights\": [ ],\n  \"risk_adjusted_picks\": [ ],\n  \"historical_accuracy\": { },\n  \"warnings\": [ ],\n  \"sectors\": {\n    \"crypto\": { }, \"stocks\": { }, \"currencies\": { }, \"materials\": { }\n  }\n}\n```\n\n### Step 7: Save Historical Data\n\n1. Create `$HISTORY_DIR` if needed.\n2. Save REPORT_DATA as `$HISTORY_DIR\u002F{analysis_date}.json`.\n3. Keep only the last 30 files: list `$HISTORY_DIR\u002F*.json`, sort by name (chronological), and delete the oldest until 30 remain.\n\n### Step 8: Generate the Report\n\n**Primary (Next.js dashboard):**\n1. Ensure a writable copy of the dashboard exists at `$DASHBOARD_DIR`: if missing or stale, sync it from `$SKILL_DIR\u002Fdashboard` excluding `node_modules` and `.next` — `rsync -a --delete --exclude node_modules --exclude .next \"$SKILL_DIR\u002Fdashboard\u002F\" \"$DASHBOARD_DIR\u002F\"` (fallback to `cp -R` if `rsync` is unavailable).\n2. Create `$DATA_DIR` if needed.\n3. Write REPORT_DATA to `$DATA_DIR\u002Freport.json`.\n\n**Fallback (legacy HTML template):**\nIf Node.js\u002Fnpm is unavailable:\n1. Read `$SKILL_DIR\u002Fassets\u002Ftemplate.html`.\n2. **Serialize REPORT_DATA safely** for embedding: run `JSON.stringify(REPORT_DATA)`, then in that JSON string replace `\u003C` with `\\u003c`, `>` with `\\u003e`, U+2028 with `\\u2028`, and U+2029 with `\\u2029`. These are JSON unicode escapes: the JSON stays valid and parses back to the original, while no literal `\u003C\u002Fscript>` or HTML can break out of the `\u003Cscript type=\"application\u002Fjson\">` data island the template uses. Do NOT use HTML entities (`&lt;`) — the island is raw text and entities would corrupt the JSON.\n3. Replace the token `{{REPORT_DATA_JSON}}` with the escaped JSON.\n4. Create `$OUTPUT_HTML_DIR` if needed and write the populated HTML to `$OUTPUT_HTML_DIR\u002Freport.html`.\n\n### Step 8b: Translate Report to Spanish\n\nAfter writing the English report (primary path only — skip if the fallback HTML was used, which is single-language), spawn a **Translation Agent**:\n\n1. Read `$DATA_DIR\u002Freport.json`.\n2. Translate only these human-readable fields to Spanish: `executive_summary`, `strategy_summary`, `macro_environment.summary`, `macro_environment.key_factors[]`, `cross_sector_insights[].insight`, `cross_sector_insights[].implication`, `warnings[]`, `historical_accuracy.notable`; per sector `sector_summary`, `top_pick_reasoning`; per asset `reasoning`, `key_news[]`, `social_highlights[]`.\n3. Do NOT translate: numbers, tickers, prices, dates, percentages, asset names, symbols, URLs, `price_unit`, `data_source`, or enum values (e.g. `bullish`, `buy`, `high`).\n4. Write to `$DATA_DIR\u002Freport-es.json`.\n\n> Translation prompt: \"You are a financial translator. Translate the listed human-readable text fields of this investment report JSON from English to Spanish, iterating all nested levels (`sectors[].assets[].key_news[]`, etc.). Preserve all numbers, tickers, prices, dates, percentages, names, symbols, URLs, and enum values exactly. Return valid JSON with the same structure.\"\n\n### Step 9: Serve the Report\n\n**Always show the educational disclaimer FIRST**, then the URL:\n\n> ⚠️ **Educational analysis — not financial advice.** Tododeia's signals are AI-generated opinions from public data and may be wrong. Do your own research and consult a licensed advisor before investing. You assume all risk.\n\n**Primary (Next.js dashboard):**\n1. If `$DASHBOARD_DIR\u002Fnode_modules\u002F` is missing, run `npm install --prefix \"$DASHBOARD_DIR\"`.\n2. Check port 3420: `lsof -i :3420`. If a server is already running there, skip starting a new one (the user just refreshes).\n3. Otherwise start it in the background: `npx --prefix \"$DASHBOARD_DIR\" next dev -p 3420` (run from `$DASHBOARD_DIR`).\n4. Wait ~3 seconds, then tell the user:\n\n> **Tododeia Investment Report is ready!** → http:\u002F\u002Flocalhost:3420\n>\n> **Profile**: {risk_profile} | **Top signal**: {#1 risk-adjusted pick} | **Illustrative allocation**: {summary}\n\n**Fallback (legacy):**\nIf Node.js\u002Fnpm is not available, serve `$OUTPUT_HTML_DIR`:\n1. Find a free port starting at 8420 (try 8420-8425): `lsof -i :PORT`.\n2. Start: `command -v python3 >\u002Fdev\u002Fnull && python3 -m http.server PORT --directory \"$OUTPUT_HTML_DIR\" || python -m http.server PORT --directory \"$OUTPUT_HTML_DIR\"`.\n3. Tell the user to open http:\u002F\u002Flocalhost:PORT\u002Freport.html (after the disclaimer).\n\n### Step 10: Offer Scheduling\n\nAfter showing the URL, mention (do NOT auto-configure):\n\n> **Want recurring reports?** `\u002Floop 24h \u002Finvestment-analysis` (daily) or `\u002Floop 168h \u002Finvestment-analysis` (weekly). If `\u002Floop` is unavailable, use `\u002Fschedule`. Or just run it manually anytime.\n\n## Error Handling\n\n- If `WebFetch` to a price endpoint fails or returns non-JSON, try the alternate endpoint, then `WebSearch`, then set the price fields to `null` with `data_source: \"unavailable\"`.\n- If an agent returns malformed JSON, re-prompt once with correction instructions. If it still fails, or returns zero assets with a usable price, mark that sector `{ \"assets\": [], \"data_unavailable\": true }` and follow the partial-failure rule in Step 5.\n- If the Strategy Agent fails, fall back to simple confidence-score ranking and note \"Strategy analysis unavailable\" in the report.\n- If all web access fails (no internet), generate the report with `null` prices and \"No data available\" notes rather than failing.\n- If historical data files are corrupted, skip accuracy tracking and start fresh.\n\n## Important Notes\n\n- **Educational, not advice** — the disclaimer in Step 9 is mandatory and must precede the report; recommendation language stays analytical.\n- **Numbers internally, format on render** — agents emit raw numbers; the dashboard\u002Ftemplate format prices, percentages, and dates (locale-aware EN\u002FES).\n- Always use `analysis_date` (captured in Step 0) for searches and timestamps — never the model's own notion of \"today\".\n- Never write into `$SKILL_DIR`; all artifacts go under `$RUN_DIR`.\n- Never cache or reuse old market data — every invocation does fresh research.\n- The Strategy Agent is the brain — give it ALL sector data (and the `data_unavailable` list) and let it do cross-sector synthesis.\n- Risk profile shapes emphasis, illustrative position sizes, and allocation percentages.\n",{"name":5,"version":52,"description":53,"user_invocable":54},"2.1.0","Multi-agent investment research and analysis system by Tododeia. Use when the user wants\nmarket analysis, investment research, or a summary of current opportunities across crypto,\nstocks, forex, and commodities. Spawns 5 specialized research agents (4 sector + 1 strategy),\nadapts to user risk profile, tracks historical accuracy, and generates a branded interactive\nHTML report served locally. Educational analysis only — not financial advice.\nTrigger phrases: \"investment analysis\", \"market research\", \"analyze markets\",\n\"investment opportunities\", \"what should I invest in\", \"market report\",\n\"tododeia\", \"investment advice\", \"portfolio recommendations\", \"run tododeia\",\n\"daily market analysis\", \"weekly report\", \"análisis de inversión\",\n\"analizar mercados\", \"reporte de mercado\", \"oportunidades de inversión\".\n",true,"main","b203dcc1e8a9f78925e31c87d1e5b729ae9bab01","",39,"https:\u002F\u002Fgithub.com\u002FHainrixz\u002Fmaia-skill","https:\u002F\u002Fwww.tododeia.com\u002F","https:\u002F\u002Fgithub.com\u002FHainrixz","✴️ te enseño IA para que no te deje atrás\r\n✴️ detrás de @tododeia · @metara.ai \r\n✴️ tijuanense construyendo el futuro\r\n👇 Contenido y llamadas 1:1","2026-10-25 14:02:44",{"source":8,"skillName":5,"commands":65,"prompt":75,"zipAvailable":54},[66,69,72],{"tool":67,"command":68},"npx","npx skills add Hainrixz\u002Fmaia-skill --skill investment-analysis",{"tool":70,"command":71},"bunx","bunx skills add Hainrixz\u002Fmaia-skill --skill investment-analysis",{"tool":73,"command":74},"pnpm","pnpm dlx skills add Hainrixz\u002Fmaia-skill --skill investment-analysis","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FHainrixz\u002Fmaia-skill\u002Fblob\u002Fmain\u002FSKILL.md",[77,83,87,93,99,103,107,111,115,121,124,128,132,136,140,144,148,152,156,160,164,168,172,176,180,184,188,192,196,200,204,208,212,216,220,224,228,232,236,240,244,248,252,256,260,264,268,272,276,280,284,288,292,296,300,304,308,312,316,320,324,328,332,337,341,345,349,353,357],{"path":78,"resourceType":79,"resourceTypeDesc":80,"sizeBytes":81,"sourceHtmlUrl":82},".claude-plugin\u002Fplugin.json","REFERENCE","参考文档",646,"https:\u002F\u002Fgithub.com\u002FHainrixz\u002Fmaia-skill\u002Fblob\u002Fmain\u002F.claude-plugin\u002Fplugin.json",{"path":84,"resourceType":79,"resourceTypeDesc":80,"sizeBytes":85,"sourceHtmlUrl":86},".github\u002Fworkflows\u002Fci.yml",1223,"https:\u002F\u002Fgithub.com\u002FHainrixz\u002Fmaia-skill\u002Fblob\u002Fmain\u002F.github\u002Fworkflows\u002Fci.yml",{"path":88,"resourceType":89,"resourceTypeDesc":90,"sizeBytes":91,"sourceHtmlUrl":92},".gitignore","OTHER","其他",242,"https:\u002F\u002Fgithub.com\u002FHainrixz\u002Fmaia-skill\u002Fblob\u002Fmain\u002F.gitignore",{"path":94,"resourceType":95,"resourceTypeDesc":96,"sizeBytes":97,"sourceHtmlUrl":98},"assets\u002Ftemplate.html","ASSET","资产文件",49559,"https:\u002F\u002Fgithub.com\u002FHainrixz\u002Fmaia-skill\u002Fblob\u002Fmain\u002Fassets\u002Ftemplate.html",{"path":100,"resourceType":79,"resourceTypeDesc":80,"sizeBytes":101,"sourceHtmlUrl":102},"CHANGELOG.md",2964,"https:\u002F\u002Fgithub.com\u002FHainrixz\u002Fmaia-skill\u002Fblob\u002Fmain\u002FCHANGELOG.md",{"path":104,"resourceType":79,"resourceTypeDesc":80,"sizeBytes":105,"sourceHtmlUrl":106},"CONTRIBUTING.md",2187,"https:\u002F\u002Fgithub.com\u002FHainrixz\u002Fmaia-skill\u002Fblob\u002Fmain\u002FCONTRIBUTING.md",{"path":108,"resourceType":89,"resourceTypeDesc":90,"sizeBytes":109,"sourceHtmlUrl":110},"dashboard\u002F.gitignore",480,"https:\u002F\u002Fgithub.com\u002FHainrixz\u002Fmaia-skill\u002Fblob\u002Fmain\u002Fdashboard\u002F.gitignore",{"path":112,"resourceType":79,"resourceTypeDesc":80,"sizeBytes":113,"sourceHtmlUrl":114},"dashboard\u002Fcomponents.json",520,"https:\u002F\u002Fgithub.com\u002FHainrixz\u002Fmaia-skill\u002Fblob\u002Fmain\u002Fdashboard\u002Fcomponents.json",{"path":116,"resourceType":117,"resourceTypeDesc":118,"sizeBytes":119,"sourceHtmlUrl":120},"dashboard\u002Feslint.config.mjs","SCRIPT","脚本",815,"https:\u002F\u002Fgithub.com\u002FHainrixz\u002Fmaia-skill\u002Fblob\u002Fmain\u002Fdashboard\u002Feslint.config.mjs",{"path":122,"resourceType":117,"resourceTypeDesc":118,"sizeBytes":85,"sourceHtmlUrl":123},"dashboard\u002Fnext.config.ts","https:\u002F\u002Fgithub.com\u002FHainrixz\u002Fmaia-skill\u002Fblob\u002Fmain\u002Fdashboard\u002Fnext.config.ts",{"path":125,"resourceType":79,"resourceTypeDesc":80,"sizeBytes":126,"sourceHtmlUrl":127},"dashboard\u002Fpackage-lock.json",364897,"https:\u002F\u002Fgithub.com\u002FHainrixz\u002Fmaia-skill\u002Fblob\u002Fmain\u002Fdashboard\u002Fpackage-lock.json",{"path":129,"resourceType":79,"resourceTypeDesc":80,"sizeBytes":130,"sourceHtmlUrl":131},"dashboard\u002Fpackage.json",806,"https:\u002F\u002Fgithub.com\u002FHainrixz\u002Fmaia-skill\u002Fblob\u002Fmain\u002Fdashboard\u002Fpackage.json",{"path":133,"resourceType":117,"resourceTypeDesc":118,"sizeBytes":134,"sourceHtmlUrl":135},"dashboard\u002Fpostcss.config.mjs",200,"https:\u002F\u002Fgithub.com\u002FHainrixz\u002Fmaia-skill\u002Fblob\u002Fmain\u002Fdashboard\u002Fpostcss.config.mjs",{"path":137,"resourceType":79,"resourceTypeDesc":80,"sizeBytes":138,"sourceHtmlUrl":139},"dashboard\u002Fpublic\u002Fdata\u002Freport-es.json",80948,"https:\u002F\u002Fgithub.com\u002FHainrixz\u002Fmaia-skill\u002Fblob\u002Fmain\u002Fdashboard\u002Fpublic\u002Fdata\u002Freport-es.json",{"path":141,"resourceType":79,"resourceTypeDesc":80,"sizeBytes":142,"sourceHtmlUrl":143},"dashboard\u002Fpublic\u002Fdata\u002Freport.json",69968,"https:\u002F\u002Fgithub.com\u002FHainrixz\u002Fmaia-skill\u002Fblob\u002Fmain\u002Fdashboard\u002Fpublic\u002Fdata\u002Freport.json",{"path":145,"resourceType":79,"resourceTypeDesc":80,"sizeBytes":146,"sourceHtmlUrl":147},"dashboard\u002Fschema\u002Freport.schema.json",4675,"https:\u002F\u002Fgithub.com\u002FHainrixz\u002Fmaia-skill\u002Fblob\u002Fmain\u002Fdashboard\u002Fschema\u002Freport.schema.json",{"path":149,"resourceType":89,"resourceTypeDesc":90,"sizeBytes":150,"sourceHtmlUrl":151},"dashboard\u002Fsrc\u002Fapp\u002Ffavicon.ico",25931,"https:\u002F\u002Fgithub.com\u002FHainrixz\u002Fmaia-skill\u002Fblob\u002Fmain\u002Fdashboard\u002Fsrc\u002Fapp\u002Ffavicon.ico",{"path":153,"resourceType":89,"resourceTypeDesc":90,"sizeBytes":154,"sourceHtmlUrl":155},"dashboard\u002Fsrc\u002Fapp\u002Fglobals.css",2672,"https:\u002F\u002Fgithub.com\u002FHainrixz\u002Fmaia-skill\u002Fblob\u002Fmain\u002Fdashboard\u002Fsrc\u002Fapp\u002Fglobals.css",{"path":157,"resourceType":89,"resourceTypeDesc":90,"sizeBytes":158,"sourceHtmlUrl":159},"dashboard\u002Fsrc\u002Fapp\u002Flayout.tsx",1128,"https:\u002F\u002Fgithub.com\u002FHainrixz\u002Fmaia-skill\u002Fblob\u002Fmain\u002Fdashboard\u002Fsrc\u002Fapp\u002Flayout.tsx",{"path":161,"resourceType":89,"resourceTypeDesc":90,"sizeBytes":162,"sourceHtmlUrl":163},"dashboard\u002Fsrc\u002Fapp\u002Fpage.tsx",4899,"https:\u002F\u002Fgithub.com\u002FHainrixz\u002Fmaia-skill\u002Fblob\u002Fmain\u002Fdashboard\u002Fsrc\u002Fapp\u002Fpage.tsx",{"path":165,"resourceType":89,"resourceTypeDesc":90,"sizeBytes":166,"sourceHtmlUrl":167},"dashboard\u002Fsrc\u002Fcomponents\u002Freport\u002FAcknowledgmentGate.tsx",2251,"https:\u002F\u002Fgithub.com\u002FHainrixz\u002Fmaia-skill\u002Fblob\u002Fmain\u002Fdashboard\u002Fsrc\u002Fcomponents\u002Freport\u002FAcknowledgmentGate.tsx",{"path":169,"resourceType":89,"resourceTypeDesc":90,"sizeBytes":170,"sourceHtmlUrl":171},"dashboard\u002Fsrc\u002Fcomponents\u002Freport\u002FChartsSection.tsx",7439,"https:\u002F\u002Fgithub.com\u002FHainrixz\u002Fmaia-skill\u002Fblob\u002Fmain\u002Fdashboard\u002Fsrc\u002Fcomponents\u002Freport\u002FChartsSection.tsx",{"path":173,"resourceType":89,"resourceTypeDesc":90,"sizeBytes":174,"sourceHtmlUrl":175},"dashboard\u002Fsrc\u002Fcomponents\u002Freport\u002FCrossSectorInsights.tsx",1322,"https:\u002F\u002Fgithub.com\u002FHainrixz\u002Fmaia-skill\u002Fblob\u002Fmain\u002Fdashboard\u002Fsrc\u002Fcomponents\u002Freport\u002FCrossSectorInsights.tsx",{"path":177,"resourceType":89,"resourceTypeDesc":90,"sizeBytes":178,"sourceHtmlUrl":179},"dashboard\u002Fsrc\u002Fcomponents\u002Freport\u002FDetailedAnalysis.tsx",10100,"https:\u002F\u002Fgithub.com\u002FHainrixz\u002Fmaia-skill\u002Fblob\u002Fmain\u002Fdashboard\u002Fsrc\u002Fcomponents\u002Freport\u002FDetailedAnalysis.tsx",{"path":181,"resourceType":89,"resourceTypeDesc":90,"sizeBytes":182,"sourceHtmlUrl":183},"dashboard\u002Fsrc\u002Fcomponents\u002Freport\u002FDisclaimer.tsx",1092,"https:\u002F\u002Fgithub.com\u002FHainrixz\u002Fmaia-skill\u002Fblob\u002Fmain\u002Fdashboard\u002Fsrc\u002Fcomponents\u002Freport\u002FDisclaimer.tsx",{"path":185,"resourceType":89,"resourceTypeDesc":90,"sizeBytes":186,"sourceHtmlUrl":187},"dashboard\u002Fsrc\u002Fcomponents\u002Freport\u002FExecutiveSummary.tsx",760,"https:\u002F\u002Fgithub.com\u002FHainrixz\u002Fmaia-skill\u002Fblob\u002Fmain\u002Fdashboard\u002Fsrc\u002Fcomponents\u002Freport\u002FExecutiveSummary.tsx",{"path":189,"resourceType":89,"resourceTypeDesc":90,"sizeBytes":190,"sourceHtmlUrl":191},"dashboard\u002Fsrc\u002Fcomponents\u002Freport\u002FFooter.tsx",868,"https:\u002F\u002Fgithub.com\u002FHainrixz\u002Fmaia-skill\u002Fblob\u002Fmain\u002Fdashboard\u002Fsrc\u002Fcomponents\u002Freport\u002FFooter.tsx",{"path":193,"resourceType":89,"resourceTypeDesc":90,"sizeBytes":194,"sourceHtmlUrl":195},"dashboard\u002Fsrc\u002Fcomponents\u002Freport\u002FHistoricalAccuracy.tsx",3287,"https:\u002F\u002Fgithub.com\u002FHainrixz\u002Fmaia-skill\u002Fblob\u002Fmain\u002Fdashboard\u002Fsrc\u002Fcomponents\u002Freport\u002FHistoricalAccuracy.tsx",{"path":197,"resourceType":89,"resourceTypeDesc":90,"sizeBytes":198,"sourceHtmlUrl":199},"dashboard\u002Fsrc\u002Fcomponents\u002Freport\u002FLanguagePicker.tsx",4127,"https:\u002F\u002Fgithub.com\u002FHainrixz\u002Fmaia-skill\u002Fblob\u002Fmain\u002Fdashboard\u002Fsrc\u002Fcomponents\u002Freport\u002FLanguagePicker.tsx",{"path":201,"resourceType":89,"resourceTypeDesc":90,"sizeBytes":202,"sourceHtmlUrl":203},"dashboard\u002Fsrc\u002Fcomponents\u002Freport\u002FLoadingSkeleton.tsx",1198,"https:\u002F\u002Fgithub.com\u002FHainrixz\u002Fmaia-skill\u002Fblob\u002Fmain\u002Fdashboard\u002Fsrc\u002Fcomponents\u002Freport\u002FLoadingSkeleton.tsx",{"path":205,"resourceType":89,"resourceTypeDesc":90,"sizeBytes":206,"sourceHtmlUrl":207},"dashboard\u002Fsrc\u002Fcomponents\u002Freport\u002FMacroEnvironment.tsx",2054,"https:\u002F\u002Fgithub.com\u002FHainrixz\u002Fmaia-skill\u002Fblob\u002Fmain\u002Fdashboard\u002Fsrc\u002Fcomponents\u002Freport\u002FMacroEnvironment.tsx",{"path":209,"resourceType":89,"resourceTypeDesc":90,"sizeBytes":210,"sourceHtmlUrl":211},"dashboard\u002Fsrc\u002Fcomponents\u002Freport\u002FPickCard.tsx",3434,"https:\u002F\u002Fgithub.com\u002FHainrixz\u002Fmaia-skill\u002Fblob\u002Fmain\u002Fdashboard\u002Fsrc\u002Fcomponents\u002Freport\u002FPickCard.tsx",{"path":213,"resourceType":89,"resourceTypeDesc":90,"sizeBytes":214,"sourceHtmlUrl":215},"dashboard\u002Fsrc\u002Fcomponents\u002Freport\u002FPortfolioAllocation.tsx",1585,"https:\u002F\u002Fgithub.com\u002FHainrixz\u002Fmaia-skill\u002Fblob\u002Fmain\u002Fdashboard\u002Fsrc\u002Fcomponents\u002Freport\u002FPortfolioAllocation.tsx",{"path":217,"resourceType":89,"resourceTypeDesc":90,"sizeBytes":218,"sourceHtmlUrl":219},"dashboard\u002Fsrc\u002Fcomponents\u002Freport\u002FReportHeader.tsx",2158,"https:\u002F\u002Fgithub.com\u002FHainrixz\u002Fmaia-skill\u002Fblob\u002Fmain\u002Fdashboard\u002Fsrc\u002Fcomponents\u002Freport\u002FReportHeader.tsx",{"path":221,"resourceType":89,"resourceTypeDesc":90,"sizeBytes":222,"sourceHtmlUrl":223},"dashboard\u002Fsrc\u002Fcomponents\u002Freport\u002FSectorOverview.tsx",3480,"https:\u002F\u002Fgithub.com\u002FHainrixz\u002Fmaia-skill\u002Fblob\u002Fmain\u002Fdashboard\u002Fsrc\u002Fcomponents\u002Freport\u002FSectorOverview.tsx",{"path":225,"resourceType":89,"resourceTypeDesc":90,"sizeBytes":226,"sourceHtmlUrl":227},"dashboard\u002Fsrc\u002Fcomponents\u002Freport\u002FToolbar.tsx",2572,"https:\u002F\u002Fgithub.com\u002FHainrixz\u002Fmaia-skill\u002Fblob\u002Fmain\u002Fdashboard\u002Fsrc\u002Fcomponents\u002Freport\u002FToolbar.tsx",{"path":229,"resourceType":89,"resourceTypeDesc":90,"sizeBytes":230,"sourceHtmlUrl":231},"dashboard\u002Fsrc\u002Fcomponents\u002Freport\u002FTopPicksGrid.tsx",1074,"https:\u002F\u002Fgithub.com\u002FHainrixz\u002Fmaia-skill\u002Fblob\u002Fmain\u002Fdashboard\u002Fsrc\u002Fcomponents\u002Freport\u002FTopPicksGrid.tsx",{"path":233,"resourceType":89,"resourceTypeDesc":90,"sizeBytes":234,"sourceHtmlUrl":235},"dashboard\u002Fsrc\u002Fcomponents\u002Freport\u002FWarnings.tsx",805,"https:\u002F\u002Fgithub.com\u002FHainrixz\u002Fmaia-skill\u002Fblob\u002Fmain\u002Fdashboard\u002Fsrc\u002Fcomponents\u002Freport\u002FWarnings.tsx",{"path":237,"resourceType":89,"resourceTypeDesc":90,"sizeBytes":238,"sourceHtmlUrl":239},"dashboard\u002Fsrc\u002Fcomponents\u002Fui\u002Faccordion.tsx",2718,"https:\u002F\u002Fgithub.com\u002FHainrixz\u002Fmaia-skill\u002Fblob\u002Fmain\u002Fdashboard\u002Fsrc\u002Fcomponents\u002Fui\u002Faccordion.tsx",{"path":241,"resourceType":89,"resourceTypeDesc":90,"sizeBytes":242,"sourceHtmlUrl":243},"dashboard\u002Fsrc\u002Fcomponents\u002Fui\u002Falert.tsx",2154,"https:\u002F\u002Fgithub.com\u002FHainrixz\u002Fmaia-skill\u002Fblob\u002Fmain\u002Fdashboard\u002Fsrc\u002Fcomponents\u002Fui\u002Falert.tsx",{"path":245,"resourceType":89,"resourceTypeDesc":90,"sizeBytes":246,"sourceHtmlUrl":247},"dashboard\u002Fsrc\u002Fcomponents\u002Fui\u002Fbadge.tsx",2031,"https:\u002F\u002Fgithub.com\u002FHainrixz\u002Fmaia-skill\u002Fblob\u002Fmain\u002Fdashboard\u002Fsrc\u002Fcomponents\u002Fui\u002Fbadge.tsx",{"path":249,"resourceType":89,"resourceTypeDesc":90,"sizeBytes":250,"sourceHtmlUrl":251},"dashboard\u002Fsrc\u002Fcomponents\u002Fui\u002Fbutton.tsx",3297,"https:\u002F\u002Fgithub.com\u002FHainrixz\u002Fmaia-skill\u002Fblob\u002Fmain\u002Fdashboard\u002Fsrc\u002Fcomponents\u002Fui\u002Fbutton.tsx",{"path":253,"resourceType":89,"resourceTypeDesc":90,"sizeBytes":254,"sourceHtmlUrl":255},"dashboard\u002Fsrc\u002Fcomponents\u002Fui\u002Fcard.tsx",2734,"https:\u002F\u002Fgithub.com\u002FHainrixz\u002Fmaia-skill\u002Fblob\u002Fmain\u002Fdashboard\u002Fsrc\u002Fcomponents\u002Fui\u002Fcard.tsx",{"path":257,"resourceType":89,"resourceTypeDesc":90,"sizeBytes":258,"sourceHtmlUrl":259},"dashboard\u002Fsrc\u002Fcomponents\u002Fui\u002Finput.tsx",1146,"https:\u002F\u002Fgithub.com\u002FHainrixz\u002Fmaia-skill\u002Fblob\u002Fmain\u002Fdashboard\u002Fsrc\u002Fcomponents\u002Fui\u002Finput.tsx",{"path":261,"resourceType":89,"resourceTypeDesc":90,"sizeBytes":262,"sourceHtmlUrl":263},"dashboard\u002Fsrc\u002Fcomponents\u002Fui\u002Fprogress.tsx",1846,"https:\u002F\u002Fgithub.com\u002FHainrixz\u002Fmaia-skill\u002Fblob\u002Fmain\u002Fdashboard\u002Fsrc\u002Fcomponents\u002Fui\u002Fprogress.tsx",{"path":265,"resourceType":89,"resourceTypeDesc":90,"sizeBytes":266,"sourceHtmlUrl":267},"dashboard\u002Fsrc\u002Fcomponents\u002Fui\u002Fskeleton.tsx",381,"https:\u002F\u002Fgithub.com\u002FHainrixz\u002Fmaia-skill\u002Fblob\u002Fmain\u002Fdashboard\u002Fsrc\u002Fcomponents\u002Fui\u002Fskeleton.tsx",{"path":269,"resourceType":89,"resourceTypeDesc":90,"sizeBytes":270,"sourceHtmlUrl":271},"dashboard\u002Fsrc\u002Fcomponents\u002Fui\u002Ftable.tsx",2478,"https:\u002F\u002Fgithub.com\u002FHainrixz\u002Fmaia-skill\u002Fblob\u002Fmain\u002Fdashboard\u002Fsrc\u002Fcomponents\u002Fui\u002Ftable.tsx",{"path":273,"resourceType":89,"resourceTypeDesc":90,"sizeBytes":274,"sourceHtmlUrl":275},"dashboard\u002Fsrc\u002Fcomponents\u002Fui\u002Ftoggle-group.tsx",3147,"https:\u002F\u002Fgithub.com\u002FHainrixz\u002Fmaia-skill\u002Fblob\u002Fmain\u002Fdashboard\u002Fsrc\u002Fcomponents\u002Fui\u002Ftoggle-group.tsx",{"path":277,"resourceType":89,"resourceTypeDesc":90,"sizeBytes":278,"sourceHtmlUrl":279},"dashboard\u002Fsrc\u002Fcomponents\u002Fui\u002Ftoggle.tsx",1615,"https:\u002F\u002Fgithub.com\u002FHainrixz\u002Fmaia-skill\u002Fblob\u002Fmain\u002Fdashboard\u002Fsrc\u002Fcomponents\u002Fui\u002Ftoggle.tsx",{"path":281,"resourceType":89,"resourceTypeDesc":90,"sizeBytes":282,"sourceHtmlUrl":283},"dashboard\u002Fsrc\u002Fhooks\u002Fuse-language.tsx",2587,"https:\u002F\u002Fgithub.com\u002FHainrixz\u002Fmaia-skill\u002Fblob\u002Fmain\u002Fdashboard\u002Fsrc\u002Fhooks\u002Fuse-language.tsx",{"path":285,"resourceType":117,"resourceTypeDesc":118,"sizeBytes":286,"sourceHtmlUrl":287},"dashboard\u002Fsrc\u002Fhooks\u002Fuse-report-data.ts",1631,"https:\u002F\u002Fgithub.com\u002FHainrixz\u002Fmaia-skill\u002Fblob\u002Fmain\u002Fdashboard\u002Fsrc\u002Fhooks\u002Fuse-report-data.ts",{"path":289,"resourceType":117,"resourceTypeDesc":118,"sizeBytes":290,"sourceHtmlUrl":291},"dashboard\u002Fsrc\u002Flib\u002Fconstants.ts",1134,"https:\u002F\u002Fgithub.com\u002FHainrixz\u002Fmaia-skill\u002Fblob\u002Fmain\u002Fdashboard\u002Fsrc\u002Flib\u002Fconstants.ts",{"path":293,"resourceType":117,"resourceTypeDesc":118,"sizeBytes":294,"sourceHtmlUrl":295},"dashboard\u002Fsrc\u002Flib\u002Ftranslations.ts",11314,"https:\u002F\u002Fgithub.com\u002FHainrixz\u002Fmaia-skill\u002Fblob\u002Fmain\u002Fdashboard\u002Fsrc\u002Flib\u002Ftranslations.ts",{"path":297,"resourceType":117,"resourceTypeDesc":118,"sizeBytes":298,"sourceHtmlUrl":299},"dashboard\u002Fsrc\u002Flib\u002Futils.ts",3099,"https:\u002F\u002Fgithub.com\u002FHainrixz\u002Fmaia-skill\u002Fblob\u002Fmain\u002Fdashboard\u002Fsrc\u002Flib\u002Futils.ts",{"path":301,"resourceType":117,"resourceTypeDesc":118,"sizeBytes":302,"sourceHtmlUrl":303},"dashboard\u002Fsrc\u002Ftypes\u002Freport.ts",2722,"https:\u002F\u002Fgithub.com\u002FHainrixz\u002Fmaia-skill\u002Fblob\u002Fmain\u002Fdashboard\u002Fsrc\u002Ftypes\u002Freport.ts",{"path":305,"resourceType":79,"resourceTypeDesc":80,"sizeBytes":306,"sourceHtmlUrl":307},"dashboard\u002Ftsconfig.json",670,"https:\u002F\u002Fgithub.com\u002FHainrixz\u002Fmaia-skill\u002Fblob\u002Fmain\u002Fdashboard\u002Ftsconfig.json",{"path":309,"resourceType":95,"resourceTypeDesc":96,"sizeBytes":310,"sourceHtmlUrl":311},"docs\u002Fimages\u002Fbilingual.png",810447,"https:\u002F\u002Fgithub.com\u002FHainrixz\u002Fmaia-skill\u002Fblob\u002Fmain\u002Fdocs\u002Fimages\u002Fbilingual.png",{"path":313,"resourceType":95,"resourceTypeDesc":96,"sizeBytes":314,"sourceHtmlUrl":315},"docs\u002Fimages\u002Fdashboard.png",1728980,"https:\u002F\u002Fgithub.com\u002FHainrixz\u002Fmaia-skill\u002Fblob\u002Fmain\u002Fdocs\u002Fimages\u002Fdashboard.png",{"path":317,"resourceType":95,"resourceTypeDesc":96,"sizeBytes":318,"sourceHtmlUrl":319},"docs\u002Fimages\u002Feducational.png",1482199,"https:\u002F\u002Fgithub.com\u002FHainrixz\u002Fmaia-skill\u002Fblob\u002Fmain\u002Fdocs\u002Fimages\u002Feducational.png",{"path":321,"resourceType":95,"resourceTypeDesc":96,"sizeBytes":322,"sourceHtmlUrl":323},"docs\u002Fimages\u002Fhero.png",1902166,"https:\u002F\u002Fgithub.com\u002FHainrixz\u002Fmaia-skill\u002Fblob\u002Fmain\u002Fdocs\u002Fimages\u002Fhero.png",{"path":325,"resourceType":79,"resourceTypeDesc":80,"sizeBytes":326,"sourceHtmlUrl":327},"evals\u002Fevals.json",8036,"https:\u002F\u002Fgithub.com\u002Fpatinaproject\u002Fskills\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fonboarding\u002Fevals\u002Fevals.json",{"path":329,"resourceType":117,"resourceTypeDesc":118,"sizeBytes":330,"sourceHtmlUrl":331},"install.sh",2975,"https:\u002F\u002Fgithub.com\u002FHainrixz\u002Fmaia-skill\u002Fblob\u002Fmain\u002Finstall.sh",{"path":333,"resourceType":333,"resourceTypeDesc":334,"sizeBytes":335,"sourceHtmlUrl":336},"LICENSE","许可证",1089,"https:\u002F\u002Fgithub.com\u002FHainrixz\u002Fmaia-skill\u002Fblob\u002Fmain\u002FLICENSE",{"path":338,"resourceType":89,"resourceTypeDesc":90,"sizeBytes":339,"sourceHtmlUrl":340},"NOTICE",626,"https:\u002F\u002Fgithub.com\u002FHainrixz\u002Fmaia-skill\u002Fblob\u002Fmain\u002FNOTICE",{"path":342,"resourceType":79,"resourceTypeDesc":80,"sizeBytes":343,"sourceHtmlUrl":344},"README.md",28919,"https:\u002F\u002Fgithub.com\u002FHainrixz\u002Fmaia-skill\u002Fblob\u002Fmain\u002FREADME.md",{"path":346,"resourceType":79,"resourceTypeDesc":80,"sizeBytes":347,"sourceHtmlUrl":348},"references\u002Factivation-models.md",3258,"https:\u002F\u002Fgithub.com\u002Fpatinaproject\u002Fskills\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fonboarding\u002Freferences\u002Factivation-models.md",{"path":350,"resourceType":79,"resourceTypeDesc":80,"sizeBytes":351,"sourceHtmlUrl":352},"references\u002Fagent-prompts.md",12066,"https:\u002F\u002Fgithub.com\u002FHainrixz\u002Fmaia-skill\u002Fblob\u002Fmain\u002Freferences\u002Fagent-prompts.md",{"path":354,"resourceType":79,"resourceTypeDesc":80,"sizeBytes":355,"sourceHtmlUrl":356},"references\u002Fexperiments.md",7796,"https:\u002F\u002Fgithub.com\u002Fpatinaproject\u002Fskills\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fonboarding\u002Freferences\u002Fexperiments.md",{"path":358,"resourceType":79,"resourceTypeDesc":80,"sizeBytes":359,"sourceHtmlUrl":360},"references\u002Fminimum-path-to-value.md",3152,"https:\u002F\u002Fgithub.com\u002Fpatinaproject\u002Fskills\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fonboarding\u002Freferences\u002Fminimum-path-to-value.md",[362],{"skillNo":363,"name":5,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":364,"categories":365,"keywords":366,"publishedAt":47},"01M6DSZYR54A44YAVZPFNFGAA2","https:\u002F\u002Fgithub.com\u002FHainrixz\u002Fmaia-skill\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Finvestment-analysis\u002FSKILL.md",[],[27,29,28]]