aria-code 4.1.3__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- agents/__init__.py +32 -0
- agents/base.py +190 -0
- agents/deep/__init__.py +37 -0
- agents/deep/calibration_loop.py +144 -0
- agents/deep/critic.py +125 -0
- agents/deep/deepen.py +193 -0
- agents/deep/models.py +149 -0
- agents/deep/pipeline.py +164 -0
- agents/deep/quant_fusion.py +192 -0
- agents/deep/themes.py +95 -0
- agents/deep/tiers.py +106 -0
- agents/financial/__init__.py +10 -0
- agents/financial/catalyst.py +279 -0
- agents/financial/debate.py +145 -0
- agents/financial/earnings.py +303 -0
- agents/financial/fundamental.py +159 -0
- agents/financial/macro.py +99 -0
- agents/financial/news.py +207 -0
- agents/financial/risk.py +132 -0
- agents/financial/sector.py +279 -0
- agents/financial/synthesis.py +274 -0
- agents/financial/technical.py +258 -0
- agents/portfolio_agent.py +333 -0
- agents/realty/__init__.py +62 -0
- agents/realty/asset_diagnosis.py +150 -0
- agents/realty/business_match.py +165 -0
- agents/realty/cashflow_verify.py +208 -0
- agents/realty/contract_rules.py +209 -0
- agents/realty/energy_anomaly.py +188 -0
- agents/realty/exit_settlement.py +207 -0
- agents/realty/fulfillment_risk.py +205 -0
- agents/realty/ops_optimize.py +159 -0
- agents/realty/revenue_share.py +214 -0
- agents/registry.py +144 -0
- agents/sports/__init__.py +0 -0
- agents/sports/football_agent.py +169 -0
- agents/team.py +289 -0
- aliyun_data_client.py +660 -0
- apps/README.md +12 -0
- apps/__init__.py +2 -0
- apps/channels/README.md +15 -0
- apps/cli/README.md +13 -0
- apps/cli/__init__.py +2 -0
- apps/cli/bootstrap.py +99 -0
- apps/cli/codegen_paths.py +29 -0
- apps/cli/commands/__init__.py +16 -0
- apps/cli/commands/analysis_cmds.py +288 -0
- apps/cli/commands/backtest_cmds.py +1887 -0
- apps/cli/commands/broker_cmds.py +1154 -0
- apps/cli/commands/business_workflow_cmds.py +289 -0
- apps/cli/commands/catalog.py +84 -0
- apps/cli/commands/data_cmds.py +405 -0
- apps/cli/commands/diagnostic_cmds.py +179 -0
- apps/cli/commands/diagnostic_ops_cmds.py +696 -0
- apps/cli/commands/finance_render.py +12 -0
- apps/cli/commands/market.py +399 -0
- apps/cli/commands/market_cmds.py +1276 -0
- apps/cli/commands/market_context.py +425 -0
- apps/cli/commands/market_render.py +7 -0
- apps/cli/commands/model_cmds.py +1579 -0
- apps/cli/commands/ops_cmds.py +668 -0
- apps/cli/commands/portfolio_cmds.py +962 -0
- apps/cli/commands/report.py +377 -0
- apps/cli/commands/scaffold_templates.py +617 -0
- apps/cli/commands/session_cmds.py +179 -0
- apps/cli/commands/session_ux_cmds.py +280 -0
- apps/cli/commands/team.py +588 -0
- apps/cli/commands/team_render.py +8 -0
- apps/cli/commands/ui_cmds.py +358 -0
- apps/cli/commands/workflow_cmds.py +279 -0
- apps/cli/commands/workspace_cmds.py +1414 -0
- apps/cli/config_paths.py +70 -0
- apps/cli/config_store.py +61 -0
- apps/cli/deterministic.py +122 -0
- apps/cli/direct.py +48 -0
- apps/cli/github_app_auth.py +135 -0
- apps/cli/handlers/__init__.py +11 -0
- apps/cli/handlers/broker_handlers.py +122 -0
- apps/cli/handlers/chart_handlers.py +1309 -0
- apps/cli/handlers/market_handlers.py +2509 -0
- apps/cli/handlers/realty_handlers.py +114 -0
- apps/cli/handlers/strategy_advice.py +82 -0
- apps/cli/hooks.py +180 -0
- apps/cli/i18n.py +284 -0
- apps/cli/intent.py +136 -0
- apps/cli/intent_router.py +217 -0
- apps/cli/lifecycle_hooks.py +48 -0
- apps/cli/main.py +29 -0
- apps/cli/market_metadata.py +135 -0
- apps/cli/market_universe.py +265 -0
- apps/cli/message_processing.py +257 -0
- apps/cli/plan_mode.py +139 -0
- apps/cli/plotly_html.py +15 -0
- apps/cli/prediction_feedback.py +202 -0
- apps/cli/preflight.py +497 -0
- apps/cli/project_aria.py +60 -0
- apps/cli/prompts/__init__.py +0 -0
- apps/cli/prompts/coding.py +658 -0
- apps/cli/prompts/system_prompts.py +531 -0
- apps/cli/prompts/ui.py +434 -0
- apps/cli/providers/__init__.py +1 -0
- apps/cli/providers/base.py +271 -0
- apps/cli/providers/chat_routing.py +80 -0
- apps/cli/providers/llm/__init__.py +1 -0
- apps/cli/providers/llm/ollama_stream.py +1170 -0
- apps/cli/providers/llm/sse_stream.py +216 -0
- apps/cli/providers/runtime_bridge.py +185 -0
- apps/cli/runtime_consumer.py +489 -0
- apps/cli/session_export.py +87 -0
- apps/cli/session_jsonl.py +207 -0
- apps/cli/session_store.py +112 -0
- apps/cli/todo_tracker.py +190 -0
- apps/cli/tools/__init__.py +40 -0
- apps/cli/tools/context.py +46 -0
- apps/cli/tools/file_tools.py +112 -0
- apps/cli/tools/market_tools.py +549 -0
- apps/cli/tools/notebook_tools.py +111 -0
- apps/cli/tools/system_tools.py +669 -0
- apps/cli/tools/write_tools.py +715 -0
- apps/cli/tradingview_bridge.py +434 -0
- apps/cli/update_check.py +152 -0
- apps/cli/utils/__init__.py +0 -0
- apps/cli/utils/market_detect.py +1578 -0
- apps/daemon/README.md +14 -0
- apps/vscode/README.md +115 -0
- apps/vscode/package.json +70 -0
- aria_cli.py +11636 -0
- aria_code-4.1.3.dist-info/METADATA +952 -0
- aria_code-4.1.3.dist-info/RECORD +284 -0
- aria_code-4.1.3.dist-info/WHEEL +5 -0
- aria_code-4.1.3.dist-info/entry_points.txt +2 -0
- aria_code-4.1.3.dist-info/licenses/LICENSE +121 -0
- aria_code-4.1.3.dist-info/top_level.txt +50 -0
- aria_daemon.py +1295 -0
- aria_feishu_bot.py +1359 -0
- aria_relay_client.py +182 -0
- aria_relay_server.py +405 -0
- aria_telegram_bot.py +202 -0
- ariarc.py +328 -0
- artifacts.py +491 -0
- backtest_report.py +472 -0
- brokers/__init__.py +72 -0
- brokers/base.py +207 -0
- brokers/capabilities.py +264 -0
- brokers/cn/__init__.py +10 -0
- brokers/cn/easytrader_broker.py +193 -0
- brokers/cn/futu_broker.py +194 -0
- brokers/cn/longbridge_broker.py +190 -0
- brokers/cn/tiger_broker.py +196 -0
- brokers/cn/xtquant_broker.py +175 -0
- brokers/config.py +364 -0
- brokers/intl/__init__.py +5 -0
- brokers/intl/alpaca_broker.py +183 -0
- brokers/intl/ibkr_broker.py +215 -0
- brokers/intl/webull_broker.py +156 -0
- brokers/paper_broker.py +259 -0
- brokers/planning.py +296 -0
- brokers/registry.py +181 -0
- brokers/trading.py +237 -0
- change_store.py +127 -0
- command_safety.py +19 -0
- computer_use_tools.py +504 -0
- dashboard_generator.py +578 -0
- data_analysis_tools.py +808 -0
- data_cleaner.py +483 -0
- data_service.py +481 -0
- datasources/__init__.py +23 -0
- datasources/base.py +166 -0
- datasources/router.py +221 -0
- datasources/sources/__init__.py +15 -0
- datasources/sources/akshare_source.py +269 -0
- datasources/sources/alpha_vantage_source.py +202 -0
- datasources/sources/edgar_source.py +218 -0
- datasources/sources/finnhub_source.py +197 -0
- datasources/sources/fred_source.py +219 -0
- datasources/sources/tushare_source.py +141 -0
- datasources/sources/web_scraper_source.py +278 -0
- datasources/sources/world_bank_source.py +205 -0
- datasources/sources/yfinance_source.py +152 -0
- demo_player.py +204 -0
- doctor.py +508 -0
- file_analysis_tools.py +734 -0
- finance_formulas.py +389 -0
- football_data_client.py +1670 -0
- intent_classifier.py +358 -0
- local_finance_tools.py +3221 -0
- local_llm_provider.py +552 -0
- macro_tools.py +368 -0
- market_data_client.py +1899 -0
- mcp_client.py +506 -0
- memory_manager.py +245 -0
- model_capability.py +416 -0
- notification_tools.py +248 -0
- packages/__init__.py +23 -0
- packages/aria_agents/__init__.py +5 -0
- packages/aria_agents/manifest.py +69 -0
- packages/aria_core/__init__.py +34 -0
- packages/aria_core/architecture.py +192 -0
- packages/aria_core/export.py +124 -0
- packages/aria_core/manifest.py +65 -0
- packages/aria_infra/__init__.py +15 -0
- packages/aria_infra/arthera.py +52 -0
- packages/aria_infra/doctor.py +246 -0
- packages/aria_infra/product.py +37 -0
- packages/aria_mcp/__init__.py +25 -0
- packages/aria_mcp/bridge.py +38 -0
- packages/aria_mcp/config.py +97 -0
- packages/aria_mcp/tools.py +61 -0
- packages/aria_sdk/__init__.py +19 -0
- packages/aria_sdk/client.py +396 -0
- packages/aria_sdk/providers.py +70 -0
- packages/aria_sdk/streaming.py +73 -0
- packages/aria_sdk/types.py +86 -0
- packages/aria_services/__init__.py +55 -0
- packages/aria_services/context.py +258 -0
- packages/aria_services/data.py +11 -0
- packages/aria_services/provider_health.py +189 -0
- packages/aria_services/registry.py +213 -0
- packages/aria_services/usage.py +138 -0
- packages/aria_skills/__init__.py +5 -0
- packages/aria_skills/registry.py +59 -0
- packages/aria_tools/__init__.py +5 -0
- packages/aria_tools/registry.py +128 -0
- packages/quant_engine/__init__.py +6 -0
- packages/quant_engine/sports/__init__.py +72 -0
- packages/quant_engine/sports/calibrator.py +353 -0
- packages/quant_engine/sports/dixon_coles.py +234 -0
- packages/quant_engine/sports/elo.py +299 -0
- packages/quant_engine/sports/form.py +188 -0
- packages/quant_engine/sports/h2h.py +195 -0
- packages/quant_engine/sports/ml_model.py +354 -0
- packages/quant_engine/sports/predictor.py +311 -0
- packages/quant_engine/sports/tracker.py +664 -0
- packages/quant_engine/stochastic/__init__.py +27 -0
- packages/quant_engine/stochastic/gbm_enhanced.py +195 -0
- packages/quant_engine/stochastic/ito_calculus.py +477 -0
- packages/quant_engine/stochastic/kelly_criterion.py +181 -0
- packages/quant_engine/stochastic/monte_carlo_advanced.py +95 -0
- packages/quant_engine/stochastic/options_pricing.py +573 -0
- packages/quant_engine/stochastic/stochastic_processes.py +90 -0
- plan_utils.py +194 -0
- plugin_loader.py +328 -0
- portfolio_ledger.py +262 -0
- privacy/__init__.py +5 -0
- privacy/feedback.py +123 -0
- project_tools.py +525 -0
- providers/__init__.py +30 -0
- providers/llm/__init__.py +19 -0
- providers/llm/anthropic.py +184 -0
- providers/llm/base.py +139 -0
- providers/llm/ollama.py +128 -0
- providers/llm/openai_compat.py +282 -0
- providers/llm/registry.py +358 -0
- realty_data_tools.py +659 -0
- report_generator.py +1314 -0
- runtime/__init__.py +103 -0
- runtime/agent_loop.py +1183 -0
- runtime/approval.py +51 -0
- runtime/events.py +102 -0
- runtime/gateway.py +128 -0
- runtime/lsp.py +346 -0
- runtime/subagent.py +258 -0
- runtime/tool_executor.py +104 -0
- runtime/tool_policy.py +106 -0
- safety/__init__.py +21 -0
- safety/permissions.py +275 -0
- setup_wizard.py +653 -0
- strategy_vault.py +420 -0
- ui/__init__.py +100 -0
- ui/banner.py +310 -0
- ui/completer.py +391 -0
- ui/console.py +271 -0
- ui/image_render.py +243 -0
- ui/input_box.py +376 -0
- ui/picker.py +195 -0
- ui/render/__init__.py +11 -0
- ui/render/finance.py +1480 -0
- ui/render/market.py +225 -0
- ui/render/output.py +681 -0
- ui/render/team.py +346 -0
- ui/robot.py +235 -0
- workspace/__init__.py +6 -0
- workspace/files.py +170 -0
- workspace/verify.py +113 -0
apps/cli/prompts/ui.py
ADDED
|
@@ -0,0 +1,434 @@
|
|
|
1
|
+
"""
|
|
2
|
+
ui.py — Aria UI Skill System Prompt
|
|
3
|
+
Bloomberg-quality HTML generation for financial dashboards, reports, and data views.
|
|
4
|
+
"""
|
|
5
|
+
|
|
6
|
+
UI_SYSTEM_PROMPT = """\
|
|
7
|
+
You are Aria UI, a specialist in generating professional financial-grade HTML interfaces.
|
|
8
|
+
Your output style is modeled on Bloomberg Terminal and Bloomberg Professional — dense, precise, and zero-decoration.
|
|
9
|
+
|
|
10
|
+
## CORE PHILOSOPHY
|
|
11
|
+
Information density over aesthetics. Every pixel earns its place.
|
|
12
|
+
The user reads data, not art. Clarity beats beauty.
|
|
13
|
+
|
|
14
|
+
## ABSOLUTE OUTPUT RULES
|
|
15
|
+
1. Output ONLY a single complete HTML file. No explanation, no markdown fences.
|
|
16
|
+
2. ALL data must be real — fetched via Python (yfinance / akshare) and embedded as JavaScript variables.
|
|
17
|
+
NEVER hardcode placeholder prices like "150.00" or "N/A" for fields you could compute.
|
|
18
|
+
3. The HTML must be fully self-contained: no external fetch calls at runtime, no CDN dependencies.
|
|
19
|
+
Google Fonts (@import) is the ONLY allowed external resource.
|
|
20
|
+
4. Always save to os.path.expanduser('~/Documents/Aria Code/generated/<descriptive_name>.html').
|
|
21
|
+
5. After write_file, open in browser: run_command: open ~/Documents/Aria Code/generated/<name>.html (macOS) or start <name>.html (Windows).
|
|
22
|
+
|
|
23
|
+
## DESIGN SYSTEM — BLOOMBERG STYLE
|
|
24
|
+
|
|
25
|
+
### Typography
|
|
26
|
+
- Body / labels: 'IBM Plex Sans', system-ui, sans-serif
|
|
27
|
+
- Numbers / prices / codes: 'IBM Plex Mono', 'Courier New', monospace
|
|
28
|
+
- Load via: @import url('https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@400;600&family=IBM+Plex+Sans:wght@400;600;700&display=swap');
|
|
29
|
+
- All prices, percentages, and quantities: font-family: var(--font-mono); font-variant-numeric: tabular-nums;
|
|
30
|
+
- Section headers: font-size: 10px; font-weight: 700; text-transform: uppercase; letter-spacing: 0.12em;
|
|
31
|
+
- NO emojis anywhere — use text indicators instead:
|
|
32
|
+
- Up trend: [+] or ▲ or colored text
|
|
33
|
+
- Down trend: [-] or ▼ or colored text
|
|
34
|
+
- Active: [ON] Inactive: [OFF]
|
|
35
|
+
- Warning: [!] OK: [OK]
|
|
36
|
+
|
|
37
|
+
### Color System — CSS Variables (MUST use these exact names)
|
|
38
|
+
```css
|
|
39
|
+
:root {
|
|
40
|
+
/* Dark mode (default) */
|
|
41
|
+
--bg-primary: #000000;
|
|
42
|
+
--bg-secondary: #111111;
|
|
43
|
+
--bg-tertiary: #1A1A1A;
|
|
44
|
+
--bg-hover: #222222;
|
|
45
|
+
--border: #2A2A2A;
|
|
46
|
+
--border-strong: #444444;
|
|
47
|
+
--text-primary: #E8E9EA;
|
|
48
|
+
--text-secondary:#A0A0A0;
|
|
49
|
+
--text-muted: #606060;
|
|
50
|
+
--accent: #F5A623; /* Bloomberg orange */
|
|
51
|
+
--accent-dim: #7A5010;
|
|
52
|
+
--positive: #00CC66;
|
|
53
|
+
--positive-dim: #004422;
|
|
54
|
+
--negative: #FF3B3B;
|
|
55
|
+
--negative-dim: #440000;
|
|
56
|
+
--neutral: #4A9EFF;
|
|
57
|
+
--warning: #FFB800;
|
|
58
|
+
}
|
|
59
|
+
@media (prefers-color-scheme: light) {
|
|
60
|
+
:root {
|
|
61
|
+
--bg-primary: #FFFFFF;
|
|
62
|
+
--bg-secondary: #F4F4F4;
|
|
63
|
+
--bg-tertiary: #EAEAEA;
|
|
64
|
+
--bg-hover: #E0E0E0;
|
|
65
|
+
--border: #CCCCCC;
|
|
66
|
+
--border-strong: #999999;
|
|
67
|
+
--text-primary: #111111;
|
|
68
|
+
--text-secondary:#444444;
|
|
69
|
+
--text-muted: #888888;
|
|
70
|
+
--accent: #B8520A;
|
|
71
|
+
--accent-dim: #FAE0C8;
|
|
72
|
+
--positive: #006B2E;
|
|
73
|
+
--positive-dim: #D4F0E0;
|
|
74
|
+
--negative: #B30000;
|
|
75
|
+
--negative-dim: #FFE0E0;
|
|
76
|
+
--neutral: #0057B7;
|
|
77
|
+
--warning: #8B6000;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
### Layout Rules
|
|
83
|
+
- border-radius: 0 everywhere — flat, terminal aesthetic
|
|
84
|
+
- Base spacing unit: 4px. Use 4, 8, 12, 16, 20, 24, 32px — never odd values
|
|
85
|
+
- Max content width: 1440px, centered
|
|
86
|
+
- Grid: use CSS Grid with explicit columns, never flexbox for multi-column layouts
|
|
87
|
+
- Body padding: 16px on sides, 12px top
|
|
88
|
+
- Section gap: 20px
|
|
89
|
+
- Card padding: 12px
|
|
90
|
+
- Table row height: 28px (compact), 36px (comfortable)
|
|
91
|
+
|
|
92
|
+
### Component Patterns
|
|
93
|
+
|
|
94
|
+
**Section Header:**
|
|
95
|
+
```html
|
|
96
|
+
<div class="section-header">SECTION TITLE</div>
|
|
97
|
+
```
|
|
98
|
+
```css
|
|
99
|
+
.section-header {
|
|
100
|
+
font-size: 10px; font-weight: 700; text-transform: uppercase;
|
|
101
|
+
letter-spacing: 0.12em; color: var(--text-muted);
|
|
102
|
+
border-bottom: 1px solid var(--border);
|
|
103
|
+
padding-bottom: 6px; margin-bottom: 10px;
|
|
104
|
+
}
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
**Quote Tile (compact, for index grids):**
|
|
108
|
+
```html
|
|
109
|
+
<div class="qt">
|
|
110
|
+
<div class="qt-sym">SPX</div>
|
|
111
|
+
<div class="qt-name">S&P 500</div>
|
|
112
|
+
<div class="qt-price">5,847.23</div>
|
|
113
|
+
<div class="qt-change up">+0.84%</div>
|
|
114
|
+
</div>
|
|
115
|
+
```
|
|
116
|
+
```css
|
|
117
|
+
.qt { background: var(--bg-secondary); border: 1px solid var(--border); padding: 10px 12px; display: flex; flex-direction: column; gap: 2px; }
|
|
118
|
+
.qt-sym { font-family: var(--font-mono); font-size: 11px; color: var(--accent); font-weight: 600; }
|
|
119
|
+
.qt-name { font-size: 10px; color: var(--text-muted); }
|
|
120
|
+
.qt-price { font-family: var(--font-mono); font-size: 20px; font-weight: 600; color: var(--text-primary); letter-spacing: -0.01em; }
|
|
121
|
+
.qt-change { font-family: var(--font-mono); font-size: 12px; font-weight: 600; }
|
|
122
|
+
.up { color: var(--positive); }
|
|
123
|
+
.down { color: var(--negative); }
|
|
124
|
+
.flat { color: var(--text-muted); }
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
**Data Table (dense, financial):**
|
|
128
|
+
```html
|
|
129
|
+
<table class="data-table">
|
|
130
|
+
<thead><tr><th>SYMBOL</th><th class="r">PRICE</th><th class="r">CHG%</th></tr></thead>
|
|
131
|
+
<tbody>
|
|
132
|
+
<tr><td class="sym">AAPL</td><td class="num">185.42</td><td class="num up">+1.23%</td></tr>
|
|
133
|
+
</tbody>
|
|
134
|
+
</table>
|
|
135
|
+
```
|
|
136
|
+
```css
|
|
137
|
+
.data-table { width: 100%; border-collapse: collapse; font-size: 12px; }
|
|
138
|
+
.data-table th { background: var(--bg-tertiary); color: var(--text-muted); font-size: 10px;
|
|
139
|
+
font-weight: 700; text-transform: uppercase; letter-spacing: 0.08em;
|
|
140
|
+
padding: 6px 10px; text-align: left; border-bottom: 1px solid var(--border-strong);
|
|
141
|
+
white-space: nowrap; }
|
|
142
|
+
.data-table th.r, .data-table td.r { text-align: right; }
|
|
143
|
+
.data-table td { padding: 5px 10px; border-bottom: 1px solid var(--border); vertical-align: middle; }
|
|
144
|
+
.data-table tr:hover td { background: var(--bg-hover); }
|
|
145
|
+
.data-table tr:last-child td { border-bottom: none; }
|
|
146
|
+
.sym { font-family: var(--font-mono); font-weight: 600; color: var(--accent); font-size: 12px; }
|
|
147
|
+
.num { font-family: var(--font-mono); text-align: right; }
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
**Metric Card (KPI summary):**
|
|
151
|
+
```html
|
|
152
|
+
<div class="metric">
|
|
153
|
+
<div class="metric-label">TOTAL PNL</div>
|
|
154
|
+
<div class="metric-val up">+¥12,480</div>
|
|
155
|
+
<div class="metric-sub">unrealized</div>
|
|
156
|
+
</div>
|
|
157
|
+
```
|
|
158
|
+
```css
|
|
159
|
+
.metric { background: var(--bg-secondary); border: 1px solid var(--border); padding: 14px 16px; }
|
|
160
|
+
.metric-label { font-size: 10px; font-weight: 700; text-transform: uppercase;
|
|
161
|
+
letter-spacing: 0.1em; color: var(--text-muted); margin-bottom: 6px; }
|
|
162
|
+
.metric-val { font-family: var(--font-mono); font-size: 24px; font-weight: 600;
|
|
163
|
+
color: var(--text-primary); letter-spacing: -0.02em; }
|
|
164
|
+
.metric-sub { font-size: 10px; color: var(--text-muted); margin-top: 4px; }
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
**Status Badge (no emoji):**
|
|
168
|
+
```html
|
|
169
|
+
<span class="badge badge-on">ACTIVE</span>
|
|
170
|
+
<span class="badge badge-off">STOPPED</span>
|
|
171
|
+
<span class="badge badge-warn">WARNING</span>
|
|
172
|
+
```
|
|
173
|
+
```css
|
|
174
|
+
.badge { font-family: var(--font-mono); font-size: 9px; font-weight: 700;
|
|
175
|
+
padding: 2px 6px; letter-spacing: 0.08em; border: 1px solid; }
|
|
176
|
+
.badge-on { color: var(--positive); border-color: var(--positive); background: var(--positive-dim); }
|
|
177
|
+
.badge-off { color: var(--text-muted); border-color: var(--border); background: transparent; }
|
|
178
|
+
.badge-warn { color: var(--warning); border-color: var(--warning); background: transparent; }
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
**Top Bar / Header:**
|
|
182
|
+
```html
|
|
183
|
+
<header class="topbar">
|
|
184
|
+
<div class="topbar-brand">ARIA <span>TERMINAL</span></div>
|
|
185
|
+
<div class="topbar-meta">Generated 2026-06-17 10:45 · Data: yfinance + Local DB</div>
|
|
186
|
+
</header>
|
|
187
|
+
```
|
|
188
|
+
```css
|
|
189
|
+
.topbar { display: flex; align-items: baseline; justify-content: space-between;
|
|
190
|
+
border-bottom: 2px solid var(--accent); padding: 10px 0 8px; margin-bottom: 20px; }
|
|
191
|
+
.topbar-brand { font-family: var(--font-mono); font-size: 18px; font-weight: 700;
|
|
192
|
+
color: var(--accent); letter-spacing: 0.04em; }
|
|
193
|
+
.topbar-brand span { color: var(--text-secondary); font-weight: 400; margin-left: 4px; }
|
|
194
|
+
.topbar-meta { font-size: 10px; color: var(--text-muted); letter-spacing: 0.04em; }
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
**Change Indicator with direction marker:**
|
|
198
|
+
```html
|
|
199
|
+
<span class="chg up">+1.84%</span>
|
|
200
|
+
<span class="chg down">-2.31%</span>
|
|
201
|
+
```
|
|
202
|
+
Always prepend sign: positive gets "+", negative already has "-", zero shows "0.00%".
|
|
203
|
+
|
|
204
|
+
### FORBIDDEN patterns
|
|
205
|
+
- NO emojis (no , no , no , no — anywhere)
|
|
206
|
+
- NO rounded corners (border-radius: 0 always)
|
|
207
|
+
- NO gradient backgrounds
|
|
208
|
+
- NO box shadows
|
|
209
|
+
- NO animations except: cursor blink on live data indicators (optional)
|
|
210
|
+
- NO external JS libraries (no Chart.js, no D3, no jQuery)
|
|
211
|
+
- NO placeholder data that you did not fetch
|
|
212
|
+
- NO inline styles for colors — use CSS variables only
|
|
213
|
+
|
|
214
|
+
## WORKFLOW
|
|
215
|
+
|
|
216
|
+
When user requests a UI artifact (dashboard, report, heatmap, etc.):
|
|
217
|
+
|
|
218
|
+
1. **Plan data requirements**: what symbols / metrics are needed
|
|
219
|
+
2. **write_file**: write complete Python script to ~/Documents/Aria Code/generated/aria_ui_<name>_generator.py
|
|
220
|
+
- Script fetches ALL data, embeds as JS constants, renders full HTML
|
|
221
|
+
- Script saves to ~/Documents/Aria Code/generated/aria_<name>_<YYYYMMDD>.html
|
|
222
|
+
3. **run_command**: python3 ~/Documents/Aria Code/generated/aria_ui_<name>_generator.py
|
|
223
|
+
4. **run_command**: open ~/Documents/Aria Code/generated/aria_<name>_<date>.html
|
|
224
|
+
|
|
225
|
+
The generator script structure:
|
|
226
|
+
```python
|
|
227
|
+
import os, json
|
|
228
|
+
from datetime import datetime
|
|
229
|
+
import yfinance as yf # or akshare for A-share
|
|
230
|
+
|
|
231
|
+
# --- Fetch data ---
|
|
232
|
+
# ... fetch all required data ...
|
|
233
|
+
|
|
234
|
+
# --- Render HTML ---
|
|
235
|
+
now = datetime.now().strftime("%Y-%m-%d %H:%M")
|
|
236
|
+
data_json = json.dumps(data, ensure_ascii=False)
|
|
237
|
+
|
|
238
|
+
html = f\\'\\'\\'<!DOCTYPE html>
|
|
239
|
+
<html lang="zh"><head>
|
|
240
|
+
<meta charset="UTF-8">
|
|
241
|
+
<meta name="viewport" content="width=device-width,initial-scale=1.0">
|
|
242
|
+
<title>ARIA TERMINAL — {title}</title>
|
|
243
|
+
<style>
|
|
244
|
+
@import url(\\'https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@400;600&family=IBM+Plex+Sans:wght@400;600;700&display=swap\\');
|
|
245
|
+
/* ... full Bloomberg design system CSS ... */
|
|
246
|
+
</style>
|
|
247
|
+
</head><body>
|
|
248
|
+
<!-- Bloomberg-style layout with all data embedded -->
|
|
249
|
+
</body></html>\\'\\'\\'
|
|
250
|
+
|
|
251
|
+
out = os.path.expanduser(f\\'~/Documents/Aria Code/generated/aria_{name}_{datetime.now().strftime("%Y%m%d")}.html\\')
|
|
252
|
+
with open(out, \\'w\\', encoding=\\'utf-8\\') as f: f.write(html)
|
|
253
|
+
print(f\\'Saved: {out}\\')
|
|
254
|
+
```
|
|
255
|
+
|
|
256
|
+
## WHAT TO GENERATE FOR COMMON REQUESTS
|
|
257
|
+
|
|
258
|
+
- "行情看板 / market dashboard" → quote tiles grid (4x4), top movers table, volume leaders, sector heatmap (text-based color cells)
|
|
259
|
+
- "持仓报告 / portfolio report" → positions table, P&L summary metrics, allocation bar (ASCII-style), trade history
|
|
260
|
+
- "策略回测报告 / backtest report" → equity curve (SVG path), drawdown chart (SVG), trade log table, metrics card grid
|
|
261
|
+
- "因子分析 / factor analysis" → factor table, z-score heatmap (color cells), quintile return bar chart (SVG bars)
|
|
262
|
+
- "晨报 / morning brief" → compact layout, indices strip, overnight changes, key events calendar table
|
|
263
|
+
- "股票分析 / stock analysis" → header with key metrics, price + volume SVG chart, technical indicators table, company fundamentals
|
|
264
|
+
|
|
265
|
+
For SVG charts: generate them inline, no external SVG libraries.
|
|
266
|
+
Use <path> for line charts, <rect> for bar charts, <text> for labels.
|
|
267
|
+
Scale data to viewport coordinates mathematically (min-max normalization).
|
|
268
|
+
"""
|
|
269
|
+
|
|
270
|
+
UI_STYLE_GUIDE = {
|
|
271
|
+
"fonts": {
|
|
272
|
+
"sans": "'IBM Plex Sans', system-ui, sans-serif",
|
|
273
|
+
"mono": "'IBM Plex Mono', 'Courier New', monospace",
|
|
274
|
+
},
|
|
275
|
+
"colors": {
|
|
276
|
+
"dark": {
|
|
277
|
+
"bg_primary": "#000000",
|
|
278
|
+
"bg_secondary": "#111111",
|
|
279
|
+
"bg_tertiary": "#1A1A1A",
|
|
280
|
+
"accent": "#F5A623",
|
|
281
|
+
"positive": "#00CC66",
|
|
282
|
+
"negative": "#FF3B3B",
|
|
283
|
+
"text": "#E8E9EA",
|
|
284
|
+
"muted": "#606060",
|
|
285
|
+
"border": "#2A2A2A",
|
|
286
|
+
},
|
|
287
|
+
"light": {
|
|
288
|
+
"bg_primary": "#FFFFFF",
|
|
289
|
+
"bg_secondary": "#F4F4F4",
|
|
290
|
+
"bg_tertiary": "#EAEAEA",
|
|
291
|
+
"accent": "#B8520A",
|
|
292
|
+
"positive": "#006B2E",
|
|
293
|
+
"negative": "#B30000",
|
|
294
|
+
"text": "#111111",
|
|
295
|
+
"muted": "#888888",
|
|
296
|
+
"border": "#CCCCCC",
|
|
297
|
+
},
|
|
298
|
+
},
|
|
299
|
+
"principles": [
|
|
300
|
+
"No emojis — use [+]/[-]/[!]/[ON]/[OFF] text indicators",
|
|
301
|
+
"No border-radius — flat terminal aesthetic",
|
|
302
|
+
"No gradients or shadows",
|
|
303
|
+
"IBM Plex Mono for all numbers and prices",
|
|
304
|
+
"Tabular-nums for all numeric columns",
|
|
305
|
+
"prefers-color-scheme for auto dark/light",
|
|
306
|
+
"All data embedded at generation time — zero runtime API calls",
|
|
307
|
+
],
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
|
|
311
|
+
def get_ui_css_base() -> str:
|
|
312
|
+
"""Return the complete Bloomberg-style CSS base as a string for embedding in generated HTML."""
|
|
313
|
+
return """
|
|
314
|
+
@import url('https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@400;600&family=IBM+Plex+Sans:wght@400;600;700&display=swap');
|
|
315
|
+
|
|
316
|
+
:root {
|
|
317
|
+
--bg-primary: #000000;
|
|
318
|
+
--bg-secondary: #111111;
|
|
319
|
+
--bg-tertiary: #1A1A1A;
|
|
320
|
+
--bg-hover: #222222;
|
|
321
|
+
--border: #2A2A2A;
|
|
322
|
+
--border-strong: #444444;
|
|
323
|
+
--text-primary: #E8E9EA;
|
|
324
|
+
--text-secondary:#A0A0A0;
|
|
325
|
+
--text-muted: #606060;
|
|
326
|
+
--accent: #F5A623;
|
|
327
|
+
--accent-dim: #7A5010;
|
|
328
|
+
--positive: #00CC66;
|
|
329
|
+
--positive-dim: #003318;
|
|
330
|
+
--negative: #FF3B3B;
|
|
331
|
+
--negative-dim: #3D0000;
|
|
332
|
+
--neutral: #4A9EFF;
|
|
333
|
+
--warning: #FFB800;
|
|
334
|
+
--font-sans: 'IBM Plex Sans', system-ui, sans-serif;
|
|
335
|
+
--font-mono: 'IBM Plex Mono', 'Courier New', monospace;
|
|
336
|
+
}
|
|
337
|
+
@media (prefers-color-scheme: light) {
|
|
338
|
+
:root {
|
|
339
|
+
--bg-primary: #FFFFFF;
|
|
340
|
+
--bg-secondary: #F4F4F4;
|
|
341
|
+
--bg-tertiary: #EAEAEA;
|
|
342
|
+
--bg-hover: #E0E0E0;
|
|
343
|
+
--border: #CCCCCC;
|
|
344
|
+
--border-strong: #999999;
|
|
345
|
+
--text-primary: #111111;
|
|
346
|
+
--text-secondary:#444444;
|
|
347
|
+
--text-muted: #888888;
|
|
348
|
+
--accent: #B8520A;
|
|
349
|
+
--accent-dim: #FAE0C8;
|
|
350
|
+
--positive: #006B2E;
|
|
351
|
+
--positive-dim: #D4F0E0;
|
|
352
|
+
--negative: #B30000;
|
|
353
|
+
--negative-dim: #FFE0E0;
|
|
354
|
+
--neutral: #0057B7;
|
|
355
|
+
--warning: #8B6000;
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
|
|
359
|
+
html { font-size: 13px; }
|
|
360
|
+
body {
|
|
361
|
+
font-family: var(--font-sans);
|
|
362
|
+
background: var(--bg-primary);
|
|
363
|
+
color: var(--text-primary);
|
|
364
|
+
padding: 12px 16px 32px;
|
|
365
|
+
max-width: 1440px;
|
|
366
|
+
margin: 0 auto;
|
|
367
|
+
line-height: 1.4;
|
|
368
|
+
}
|
|
369
|
+
/* ── Top bar ── */
|
|
370
|
+
.topbar { display: flex; align-items: baseline; justify-content: space-between;
|
|
371
|
+
border-bottom: 2px solid var(--accent); padding-bottom: 8px; margin-bottom: 20px; }
|
|
372
|
+
.topbar-brand { font-family: var(--font-mono); font-size: 16px; font-weight: 700;
|
|
373
|
+
color: var(--accent); letter-spacing: 0.06em; }
|
|
374
|
+
.topbar-brand span { color: var(--text-secondary); font-weight: 400; }
|
|
375
|
+
.topbar-meta { font-size: 10px; color: var(--text-muted); letter-spacing: 0.04em; font-family: var(--font-mono); }
|
|
376
|
+
/* ── Section header ── */
|
|
377
|
+
.sh { font-size: 10px; font-weight: 700; text-transform: uppercase; letter-spacing: 0.12em;
|
|
378
|
+
color: var(--text-muted); border-bottom: 1px solid var(--border);
|
|
379
|
+
padding-bottom: 5px; margin-bottom: 10px; }
|
|
380
|
+
/* ── Layout ── */
|
|
381
|
+
.section { margin-bottom: 20px; }
|
|
382
|
+
.grid { display: grid; gap: 1px; background: var(--border); border: 1px solid var(--border); }
|
|
383
|
+
.g2 { grid-template-columns: 1fr 1fr; }
|
|
384
|
+
.g3 { grid-template-columns: repeat(3, 1fr); }
|
|
385
|
+
.g4 { grid-template-columns: repeat(4, 1fr); }
|
|
386
|
+
.g5 { grid-template-columns: repeat(5, 1fr); }
|
|
387
|
+
.g6 { grid-template-columns: repeat(6, 1fr); }
|
|
388
|
+
.gcol2 { grid-template-columns: 2fr 1fr; }
|
|
389
|
+
.gcol3 { grid-template-columns: 3fr 1fr; }
|
|
390
|
+
/* ── Quote tile ── */
|
|
391
|
+
.qt { background: var(--bg-secondary); padding: 10px 12px;
|
|
392
|
+
display: flex; flex-direction: column; gap: 2px; }
|
|
393
|
+
.qt-sym { font-family: var(--font-mono); font-size: 11px; color: var(--accent); font-weight: 600; }
|
|
394
|
+
.qt-name { font-size: 10px; color: var(--text-muted); }
|
|
395
|
+
.qt-price { font-family: var(--font-mono); font-size: 20px; font-weight: 600;
|
|
396
|
+
color: var(--text-primary); letter-spacing: -0.01em; font-variant-numeric: tabular-nums; }
|
|
397
|
+
.qt-chg { font-family: var(--font-mono); font-size: 12px; font-weight: 600; }
|
|
398
|
+
.up { color: var(--positive); }
|
|
399
|
+
.down { color: var(--negative); }
|
|
400
|
+
.flat { color: var(--text-muted); }
|
|
401
|
+
/* ── Metric card ── */
|
|
402
|
+
.metric { background: var(--bg-secondary); padding: 14px 16px; }
|
|
403
|
+
.metric-label { font-size: 10px; font-weight: 700; text-transform: uppercase;
|
|
404
|
+
letter-spacing: 0.1em; color: var(--text-muted); margin-bottom: 6px; }
|
|
405
|
+
.metric-val { font-family: var(--font-mono); font-size: 22px; font-weight: 600;
|
|
406
|
+
color: var(--text-primary); letter-spacing: -0.02em; font-variant-numeric: tabular-nums; }
|
|
407
|
+
.metric-sub { font-size: 10px; color: var(--text-muted); margin-top: 3px; font-family: var(--font-mono); }
|
|
408
|
+
/* ── Data table ── */
|
|
409
|
+
.data-table { width: 100%; border-collapse: collapse; font-size: 12px; }
|
|
410
|
+
.data-table th { background: var(--bg-tertiary); color: var(--text-muted); font-size: 10px;
|
|
411
|
+
font-weight: 700; text-transform: uppercase; letter-spacing: 0.08em;
|
|
412
|
+
padding: 6px 10px; text-align: left; border-bottom: 1px solid var(--border-strong);
|
|
413
|
+
white-space: nowrap; font-family: var(--font-sans); }
|
|
414
|
+
.data-table td { padding: 5px 10px; border-bottom: 1px solid var(--border); vertical-align: middle; }
|
|
415
|
+
.data-table tr:hover td { background: var(--bg-hover); }
|
|
416
|
+
.data-table tr:last-child td { border-bottom: none; }
|
|
417
|
+
.r { text-align: right; }
|
|
418
|
+
.sym { font-family: var(--font-mono); font-weight: 600; color: var(--accent); font-size: 12px; }
|
|
419
|
+
.num { font-family: var(--font-mono); text-align: right; font-variant-numeric: tabular-nums; }
|
|
420
|
+
.dim { color: var(--text-muted); font-size: 11px; }
|
|
421
|
+
/* ── Badge ── */
|
|
422
|
+
.badge { font-family: var(--font-mono); font-size: 9px; font-weight: 700;
|
|
423
|
+
padding: 1px 5px; letter-spacing: 0.06em; border: 1px solid; }
|
|
424
|
+
.badge-on { color: var(--positive); border-color: var(--positive); background: var(--positive-dim); }
|
|
425
|
+
.badge-off { color: var(--text-muted); border-color: var(--border); background: transparent; }
|
|
426
|
+
.badge-warn { color: var(--warning); border-color: var(--warning); background: transparent; }
|
|
427
|
+
/* ── Card ── */
|
|
428
|
+
.card { background: var(--bg-secondary); border: 1px solid var(--border); padding: 14px; }
|
|
429
|
+
/* ── Divider ── */
|
|
430
|
+
hr { border: none; border-top: 1px solid var(--border); margin: 16px 0; }
|
|
431
|
+
/* ── Responsive ── */
|
|
432
|
+
@media (max-width: 960px) { .g4,.g5,.g6 { grid-template-columns: repeat(2, 1fr); } }
|
|
433
|
+
@media (max-width: 600px) { .g2,.g3,.g4 { grid-template-columns: 1fr; } }
|
|
434
|
+
"""
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"""apps/cli/providers — LLM provider utilities."""
|