{"id":"1b497716-b34b-4393-87bb-76ee0e4291c8","entityType":"agent","slug":"clawhub-minibeanai-business-data-analysis","name":"Order Analytics","canonicalUrl":"https://www.xpersona.co/agent/clawhub-minibeanai-business-data-analysis","canonicalPath":"/agent/clawhub-minibeanai-business-data-analysis","generatedAt":"2026-10-09T18:41:14.327Z","source":"CLAWHUB","claimStatus":"UNCLAIMED","verificationTier":"NONE","summary":{"evidence":{"source":"editorial-content","verified":true,"confidence":"high","updatedAt":"2026-10-09T10:24:40.288Z","emptyReason":null},"description":"订单数据业务分析仪表盘生成器。当用户提供订单Excel/CSV数据（含日期、金额、用户ID、场地/商品、时段等字段），需要生成业务分析报告、经营诊断、用户留存/频次分析、时段热力图、趋势对比、运营方案时，使用本技能。适用场景：场馆运营（羽毛球/网球/篮球/游泳）、餐饮门店、零售订单、服务业预约等任何有订单记录的业务场景。支持自定义配色（上传Logo图片或提供HEX/RGB色值）或选择预设主题。触发词：订单分析、经营诊断、用户分析、场次分析、留存分析、趋势分析、运营仪表盘、业务报告、数据报告。 Skill: Order Analytics Owner: minibeanai Summary: 订单数据业务分析仪表盘生成器。当用户提供订单Excel/CSV数据（含日期、金额、用户ID、场地/商品、时段等字段），需要生成业务分析报告、经营诊断、用户留存/频次分析、时段热力图、趋势对比、运营方案时，使用本技能。适用场景：场馆运营（羽毛球/网球/篮球/游泳）、餐饮门店、零售订单、服务业预约等任何有订单记录的业务场景。支持自定义配色（上传Logo图片或提供HEX/RGB色值）或选择预设主题。触发词：订单分析、经营诊断、用户分析、场次分析、留存分析、趋势分析、运营仪表盘、业务报告、数据报告。 Tags: latest:0.1.0 Version history: v0.1.0 | 2026-07-25T16:26:48.892Z | auto order-analytics v0.1.0 — Initial Release - C","descriptionLabel":"Technical summary","evidenceSummary":"Capability contract not published. No trust telemetry is available yet. 3K downloads reported by the source. Last updated 10/9/2026.","installCommand":"clawhub skill install s17b01j3yq2xecvwp3zcr41adh83nyep:business-data-analysis","sourceUrl":"https://clawhub.ai/minibeanai/business-data-analysis","homepage":"https://clawhub.ai/minibeanai/skills/business-data-analysis","primaryLinks":[{"label":"View on ClawHub","url":"https://clawhub.ai/minibeanai/business-data-analysis","kind":"source"},{"label":"Homepage","url":"https://clawhub.ai/minibeanai/skills/business-data-analysis","kind":"homepage"}],"safetyScore":84,"overallRank":62,"popularityScore":69,"trustScore":null,"claimedByName":null,"isOwner":false,"seoDescription":"订单数据业务分析仪表盘生成器。当用户提供订单Excel/CSV数据（含日期、金额、用户ID、场地/商品、时段等字段），需要生成业务分析报告、经营诊断、用户留存/频次分析、时段热力图、趋势对比、运营方案时，使用本技能。适用场景：场馆运营（羽毛球/网球/篮球/游泳）、餐饮门店、零售订单、服务业预约等任何有订单记录的业务场景"},"coverage":{"evidence":{"source":"public-profile","verified":false,"confidence":"medium","updatedAt":"2026-10-09T10:24:40.288Z","emptyReason":null},"protocols":[{"protocol":"OPENCLEW","label":"OpenClaw","status":"self-declared","notes":"Declared in the public agent profile."}],"capabilities":[],"verifiedCount":0,"selfDeclaredCount":1,"capabilityMatrix":{"rows":[{"key":"OPENCLEW","type":"protocol","support":"unknown","confidenceSource":"profile","notes":"Listed on profile"}],"flattenedTokens":"protocol:OPENCLEW|unknown|profile"}},"adoption":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-09T10:24:40.288Z","emptyReason":null},"stars":null,"forks":null,"downloads":2979,"packageName":null,"latestVersion":"0.1.0","tractionLabel":"3K downloads"},"release":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-09T10:24:40.288Z","emptyReason":null},"lastUpdatedAt":"2026-10-09T10:24:40.288Z","lastCrawledAt":"2026-10-09T10:24:40.288Z","lastIndexedAt":null,"nextCrawlAt":"2026-10-10T10:24:40.288Z","lastVerifiedAt":null,"highlights":[{"version":"0.1.0","createdAt":"2026-07-25T16:26:48.892Z","changelog":"order-analytics v0.1.0 — Initial Release - Converts raw order data (Excel/CSV) into an interactive HTML business analytics dashboard, suitable for venues, retail, F&B, and service industries. - Covers comprehensive business analysis across 6 tabs: Trends, Comparison, Time Slots, User Structure, Dianping Traffic (if applicable), and Operational Strategy. - Implements strict monthly average metrics (no partial-month or non-equivalent comparisons). - Supports custom color themes via logo extraction, HEX/RGB input, or preset themes. - Mobile-responsive by default, with all grids and charts adapting for small screens. - Provides reference example, code snippets, and verification checks for report completeness.","fileCount":11,"zipByteSize":40056}]},"execution":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No published capability contract is available yet."},"installCommand":"clawhub skill install s17b01j3yq2xecvwp3zcr41adh83nyep:business-data-analysis","setupComplexity":"low","setupSteps":["Setup complexity is LOW. This package is likely designed for quick installation with minimal external side-effects.","Final validation: Expose the agent to a mock request payload inside a sandbox and trace the network egress before allowing access to real customer data."],"contract":{"contractStatus":"missing","authModes":[],"requires":[],"forbidden":[],"supportsMcp":false,"supportsA2a":false,"supportsStreaming":false,"inputSchemaRef":null,"outputSchemaRef":null,"dataRegion":null,"contractUpdatedAt":null,"sourceUpdatedAt":null,"freshnessSeconds":null},"invocationGuide":{"preferredApi":{"snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-minibeanai-business-data-analysis/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-minibeanai-business-data-analysis/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-minibeanai-business-data-analysis/trust"},"curlExamples":["curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-minibeanai-business-data-analysis/snapshot\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-minibeanai-business-data-analysis/contract\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-minibeanai-business-data-analysis/trust\""],"jsonRequestTemplate":{"query":"summarize this repo","constraints":{"maxLatencyMs":2000,"protocolPreference":["OPENCLEW"]}},"jsonResponseTemplate":{"ok":true,"result":{"summary":"...","confidence":0.9},"meta":{"source":"CLAWHUB","generatedAt":"2026-10-09T18:41:14.327Z"}},"retryPolicy":{"maxAttempts":3,"backoffMs":[500,1500,3500],"retryableConditions":["HTTP_429","HTTP_503","NETWORK_TIMEOUT"]}},"endpoints":{"dossierUrl":"https://www.xpersona.co/api/v1/agents/clawhub-minibeanai-business-data-analysis/dossier","snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-minibeanai-business-data-analysis/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-minibeanai-business-data-analysis/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-minibeanai-business-data-analysis/trust"}},"reliability":{"evidence":{"source":"runtime-metrics","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No trust, reliability, or runtime telemetry is available."},"trust":{"status":"unavailable","handshakeStatus":"UNKNOWN","verificationFreshnessHours":null,"reputationScore":null,"p95LatencyMs":null,"successRate30d":null,"fallbackRate":null,"attempts30d":null,"trustUpdatedAt":null,"trustConfidence":"unknown","sourceUpdatedAt":null,"freshnessSeconds":null},"decisionGuardrails":{"doNotUseIf":["Contract metadata is missing or unavailable for deterministic execution."],"safeUseWhen":[],"riskFlags":["missing_or_unavailable_contract","trust_data_unavailable","schema_references_missing"],"operationalConfidence":"low"},"executionMetrics":{"observedLatencyMsP50":null,"observedLatencyMsP95":null,"estimatedCostUsd":null,"uptime30d":null,"rateLimitRpm":null,"rateLimitBurst":null,"lastVerifiedAt":null,"verificationSource":null},"runtimeMetrics":{"successRate":null,"avgLatencyMs":null,"avgCostUsd":null,"hallucinationRate":null,"retryRate":null,"disputeRate":null,"p50Latency":null,"p95Latency":null,"lastUpdated":null}},"benchmarks":{"evidence":{"source":"no-benchmark-data","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No benchmark suites or observed failure patterns are available."},"suites":[],"failurePatterns":[]},"artifacts":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"high","updatedAt":"2026-10-09T10:24:40.288Z","emptyReason":null},"readme":"Skill: Order Analytics\n\nOwner: minibeanai\n\nSummary: 订单数据业务分析仪表盘生成器。当用户提供订单Excel/CSV数据（含日期、金额、用户ID、场地/商品、时段等字段），需要生成业务分析报告、经营诊断、用户留存/频次分析、时段热力图、趋势对比、运营方案时，使用本技能。适用场景：场馆运营（羽毛球/网球/篮球/游泳）、餐饮门店、零售订单、服务业预约等任何有订单记录的业务场景。支持自定义配色（上传Logo图片或提供HEX/RGB色值）或选择预设主题。触发词：订单分析、经营诊断、用户分析、场次分析、留存分析、趋势分析、运营仪表盘、业务报告、数据报告。\n\nTags: latest:0.1.0\n\nVersion history:\n\nv0.1.0 | 2026-07-25T16:26:48.892Z | auto\n\norder-analytics v0.1.0 — Initial Release\n\n- Converts raw order data (Excel/CSV) into an interactive HTML business analytics dashboard, suitable for venues, retail, F&B, and service industries.\n- Covers comprehensive business analysis across 6 tabs: Trends, Comparison, Time Slots, User Structure, Dianping Traffic (if applicable), and Operational Strategy.\n- Implements strict monthly average metrics (no partial-month or non-equivalent comparisons).\n- Supports custom color themes via logo extraction, HEX/RGB input, or preset themes.\n- Mobile-responsive by default, with all grids and charts adapting for small screens.\n- Provides reference example, code snippets, and verification checks for report completeness.\n\nArchive index:\n\nArchive v0.1.0: 11 files, 40056 bytes\n\nFiles: README.md (2150b), references (0b), references/color-themes.md (6082b), references/data-processing.md (8501b), references/example-badminton.html (56102b), references/html-template.md (18798b), scripts (0b), scripts/extract_colors.py (6269b), skill-card.md (3070b), SKILL.md (11033b), _meta.json (141b)\n\nFile v0.1.0:SKILL.md\n\n---\nname: order-analytics\ndescription: 订单数据业务分析仪表盘生成器。当用户提供订单Excel/CSV数据（含日期、金额、用户ID、场地/商品、时段等字段），需要生成业务分析报告、经营诊断、用户留存/频次分析、时段热力图、趋势对比、运营方案时，使用本技能。适用场景：场馆运营（羽毛球/网球/篮球/游泳）、餐饮门店、零售订单、服务业预约等任何有订单记录的业务场景。支持自定义配色（上传Logo图片或提供HEX/RGB色值）或选择预设主题。触发词：订单分析、经营诊断、用户分析、场次分析、留存分析、趋势分析、运营仪表盘、业务报告、数据报告。\n---\n\n# 订单业务分析仪表盘技能\n\n## 概述\n\n将原始订单数据转化为**交互式HTML分析报告**，6个Tab完整覆盖趋势→对比→时段→用户→流量→运营方案，支持桌面和手机端。**全程使用整月日均口径**，不做半月/等长截取对比。\n\n> 📎 完整案例：`references/example-badminton.html` — 星辰羽毛球馆，紫色主题，6Tab\n\n---\n\n## 第一步：确认输入与配置\n\n开始前确认以下信息（已在对话中提供则直接使用）：\n\n### 1.1 数据文件\n- 格式：`.xlsx`（用 `calamine` 引擎）/ `.csv`\n- 必须字段：**订单日期、订单金额（或实收金额）、用户标识（手机号/用户ID）**\n- 可选字段：场地/商品/服务类型、时段、订单状态、优惠金额\n\n### 1.2 配色方案（四选一）\n```\nA. 上传Logo图片 → 运行 scripts/extract_colors.py 提取主色\nB. 提供HEX色值 → 如 #7B5EA7（主色）+ #5B8DD9（辅色）\nC. 提供RGB色值 → 如 rgb(123,94,167)\nD. 选择预设主题（见 references/color-themes.md）：\n   1. 紫蓝（精品/运动）  2. 橙绿（活力/场馆）\n   3. 深蓝（科技/金融）  4. 米棕（优雅/餐饮）  5. 深色（夜间/高端）\n```\n\n### 1.3 业务场景说明（影响 Tab5 内容）\n- 是否已开通大众点评商户通？\n  - **已开通** → Tab5 展示点评流量分析（渠道来源、转化漏斗、团购表现、评价口碑）\n  - **未开通** → Tab5 展示开通调研分析（新客来源现状、开通收益测算）\n- 是否有竞品信息？→ Tab6 运营方案末尾加竞品对比表\n\n---\n\n## 第二步：数据处理\n\n> 完整规范见 `references/data-processing.md`\n\n### 2.1 读取与字段识别\n```python\nimport pandas as pd\ndf = pd.read_excel(path, engine='calamine')  # 或 read_csv\n\nFIELD_PATTERNS = {\n    'date':    ['预订日期','下单时间','订单日期','日期','date','order_date'],\n    'amount':  ['订单最终金额','实收金额','订单金额','金额','amount','price'],\n    'user_id': ['手机号','用户ID','会员号','user_id','phone'],\n    'item':    ['场地','商品','服务','项目','item','product'],\n    'slot':    ['预订时段','时段','slot','time_slot'],\n}\n```\n\n### 2.2 核心计算口径（⚠️ 关键原则）\n\n**所有月度对比一律使用整月日均，不得用绝对总场次比较不同天数的月份。**\n\n```python\n# 整月日均（排除节假日锁场期，如春节）\nmonthly = df_clean.groupby('month').agg(\n    op_days=('date', lambda x: x.dt.date.nunique()),\n    total_orders=('amount','count'),\n    total_rev=('amount','sum'),\n    active_users=('user_id','nunique'),\n)\nmonthly['daily_orders'] = (monthly['total_orders'] / monthly['op_days']).round(1)\nmonthly['daily_rev']    = (monthly['total_rev']    / monthly['op_days']).round(0)\n```\n\n**新老用户判断：**\n```python\nold_pool_months = sorted(df['month'].unique())[:3]  # 前3个月为老用户基准\nold_pool = set(df[df['month'].isin(old_pool_months)]['user_id'])\n```\n\n**新用户次月留存：**\n```python\nfirst_order = df.groupby('user_id')['date'].min()\nfor mo, next_mo in zip(months[:-1], months[1:]):\n    new_this = {u for u in set(df[df['month']==mo]['user_id'])\n                if u not in old_pool and first_order[u] >= pd.Timestamp(f'{mo}-01')}\n    retained  = new_this & set(df[df['month']==next_mo]['user_id'])\n    retention = len(retained) / len(new_this)\n```\n\n**逐小时日均（整月，带 tooltip index mode）：**\n```python\nfor mo in months:\n    m = df_clean[df_clean['month']==mo]\n    days = m['date'].dt.date.nunique()\n    hourly[mo] = {h: round(len(m[m['hour']==h])/days, 2) for h in range(8,22)}\n\nhchg = {h: round((hourly[last_mo][h]-hourly[ref_mo][h]) /\n                  max(hourly[ref_mo][h],0.01)*100, 1)\n        for h in range(8,22)}\n```\n\n---\n\n## 第三步：配色主题\n\n> 完整代码见 `references/color-themes.md`\n\n### 3.1 预设主题速查\n\n**主题1 — 紫蓝（本技能示例主题）**\n```css\n:root{\n  --bg:#F5F3FA; --s1:#FFFFFF; --s2:#EDE8F5; --bd:#D8D0EC;\n  --c1:#7B5EA7; --c2:#5B8DD9; --c3:#9B7DC7; --c4:#A390C8;\n  --red:#B04848; --t:#1A1525; --mu:#7A6E90; --mu2:#C8C0DC; --tx:#2D2640;\n}\n/* Hero */ background: linear-gradient(135deg,#5B3A8A,#6B4A9A,#4A3A7A);\n/* Tab  */ background: #4A3080; border-bottom: 3px solid #35206A;\n/* Chart colors: C1='#7B5EA7', C2='#5B8DD9', RED='#B04848', PUR='#A040A0' */\n```\n\n**主题2 — 橙绿**\n```css\n:root{--bg:#F8F6F2;--s1:#FFFFFF;--s2:#F4F1EC;--bd:#E8E3DA;\n  --c1:#4A7C59;--c2:#C97040;--c3:#D4884A;--c4:#5A8A6A;\n  --red:#B04848;--t:#1A1A1A;--mu:#666666;--mu2:#CCCCCC;--tx:#333333}\n/* Hero */ background:linear-gradient(135deg,#B8694A,#985234);\n/* Tab  */ background:#4E7A62; border-bottom:3px solid #3A6550;\n```\n\n**主题3–5** → 见 `references/color-themes.md`\n\n---\n\n## 第四步：HTML报告结构\n\n> 完整CSS组件库 + JS配置见 `references/html-template.md`\n\n### 4.1 六Tab标准结构\n\n| Tab | 标题 | 主要内容 |\n|-----|------|---------|\n| t1 | 📊 总体趋势 | 日均实收折线、场次+用户双轴柱、频次堆叠、新老用户堆叠、留存率、老用户活跃率 |\n| t2 | 🔍 月度环比 | **5列整月对比卡** + 日均场次/实收 + 时段分类柱 + 工作日/周末 + 频次 + 新老用户 |\n| t3 | ⏱ 时段分析 | 5期整月折线（tooltip mode:index）+ 热力图 + 时段分类柱 + 双侧洞察框 |\n| t4 | 👤 用户结构 | 新老堆叠柱、频次分布、留存率、老用户活跃率 |\n| t5 | 📍 点评流量 | **已开通**：来源饼+转化漏斗+团购表+评价分布+趋势图 / **未开通**：现状+测算 |\n| t6 | 🎯 运营方案 | 3+3张策略卡（P0/P1/P2）+ 可选竞品对比表 |\n\n### 4.2 关键组件规范\n\n**Tab2 — 5列整月对比卡（用 auto-fit，不用固定4列）：**\n```html\n<div style=\"display:grid;grid-template-columns:repeat(auto-fit,minmax(130px,1fr));gap:10px;margin-bottom:14px\">\n  <div class=\"cbox c1\"><!-- 最早月：基准 --></div>\n  <div class=\"cbox c1\">...</div>\n  <div class=\"cbox c2\">...</div>\n  <div class=\"cbox c3\">...</div>\n  <div class=\"cbox c4\"><!-- 最新月：红/绿标注变化 --></div>\n</div>\n```\n\n**Tab3 — 时段折线 Tooltip（必须 mode:index）：**\n```javascript\noptions: {\n  interaction: { mode: 'index', intersect: false },\n  plugins: {\n    tooltip: {\n      mode: 'index', intersect: false,\n      callbacks: {\n        title: items => `${items[0].label}  日均场次`,\n        label: item  => `  ${item.dataset.label}：${item.raw} 场/日`\n      }\n    }\n  }\n}\n```\n\n**Tab5已开通 — 转化漏斗：**\n```html\n<div class=\"funnel\">\n  <div class=\"f-row\">\n    <div class=\"f-lbl\">店铺浏览</div>\n    <div class=\"f-bar-wrap\">\n      <div class=\"f-bar\" style=\"width:100%;background:linear-gradient(90deg,var(--c1),var(--c3))\">1,240</div>\n    </div>\n  </div>\n  <!-- width = 当层值 / 最大值 × 100% -->\n</div>\n```\n\n**热力图颜色（适配浅色主题）：**\n```javascript\nfunction heatmapColor(v) {\n  if (v >= 15)  return 'rgba(60,120,80,.85)';\n  if (v >= 0)   return 'rgba(80,140,100,.55)';\n  if (v >= -20) return 'rgba(180,150,40,.60)';\n  if (v >= -40) return 'rgba(180,80,50,.65)';\n  return 'rgba(150,40,120,.75)';  // 重跌用品牌深色\n}\n```\n\n**所有网格用 auto-fit（手机天然折叠）：**\n```css\n.g2   { grid-template-columns: repeat(auto-fit, minmax(280px,1fr)); }\n.sps  { grid-template-columns: repeat(auto-fit, minmax(260px,1fr)); }\n/* 5列对比卡 */ grid-template-columns: repeat(auto-fit, minmax(130px,1fr));\n```\n\n**@media(max-width:600px) 必须包含：**\n```css\n@media (max-width:600px) {\n  .g2,.g3 { grid-template-columns:1fr; }\n  .sps    { grid-template-columns:1fr; }\n  .strip  { flex-direction:column; }\n  .st     { min-width:100%; flex:none; }\n  /* 图表高度 ≤ 200px */\n}\n```\n\n### 4.3 表格和热力图必须滚动包裹\n```html\n<!-- 表格 -->\n<div class=\"dtbl-wrap\">  <!-- overflow-x:auto -->\n  <table class=\"dtbl\" style=\"min-width:360px\">...</table>\n</div>\n\n<!-- 热力图 -->\n<div class=\"hm-wrap\">  <!-- overflow-x:auto -->\n  <div id=\"hm\" class=\"hm\" style=\"min-width:480px\">...</div>\n</div>\n```\n\n---\n\n## 第五步：运营方案（Tab6）\n\n### 优先级框架（3+3卡片）\n\n```\n第一行:\n  P0 🔥  本周 — 最紧急（通常：流失用户召回 / 时段分流对冲）\n  P1 ⚡  2周  — 中优先（通常：新客留存链路 / 特定时段产品）\n  P1 ⚡  2周  — 中优先（通常：平台流量优化）\n\n第二行:\n  P1b📊  1个月 — 场景专项（如：拼场机制 / 企业团建）\n  P2 📈  长效  — 固定档位 / 月卡产品\n  P2 📈  差异化 — 教练课 / 独家产品线\n```\n\n每张卡：优先级标签 + 标题（颜色跟随优先级）+ 行动要点（**strong高亮数字**）+ 标签组\n\n### 价格三原则\n1. 对冲竞品：下午/闲时次卡低于竞品同类 5–10%\n2. 保护黄金时段：晚场保持折扣，竞品晚场通常更贵\n3. 首单吸引：体验价低于竞品但高于边际成本\n\n---\n\n## 第六步：输出检查\n\n```python\nimport re\n\ndef verify(html):\n    errors = []\n    # Canvas vs JS 完整性\n    canvas = set(re.findall(r'<canvas id=\"([^\"]+)\"', html))\n    js_ref = set(re.findall(r\"getElementById\\('([^']+)'\\)\", html))\n    orphan = js_ref - canvas - {'hm'}\n    if orphan: errors.append(f\"孤立JS引用: {orphan}\")\n    # 过时表述\n    for bad in ['上半月', '等长15天', '等长时间段', '半月']:\n        if bad in html: errors.append(f\"过时表述: {bad}\")\n    # 移动端\n    if '@media (max-width' not in html: errors.append(\"缺移动端@media\")\n    # 热力图包裹\n    if 'id=\"hm\"' in html:\n        idx = html.find('id=\"hm\"')\n        if 'overflow-x:auto' not in html[max(0,idx-200):idx]:\n            errors.append(\"热力图缺滚动包裹\")\n    return errors\n```\n\n---\n\n## 参考文件\n\n| 文件 | 内容 |\n|------|------|\n| `references/data-processing.md` | 字段识别、多行拆分、所有指标计算完整代码 |\n| `references/color-themes.md` | 5套预设主题CSS + 从Logo/色值构建主题工具函数 |\n| `references/html-template.md` | 完整CSS组件库 + Chart.js基础配置 + 验证函数 |\n| `references/example-badminton.html` | 星辰羽毛球馆完整案例（紫色主题，6Tab，可直接参考） |\n| `scripts/extract_colors.py` | 从Logo图片提取主色调工具 |\n\nFile v0.1.0:README.md\n\n# Business Data Analysis Skill\n\nTransform raw order data into **interactive HTML analysis reports** with 6 tabs covering trends→comparison→time slots→users→traffic→operations, supporting desktop and mobile.\n\n## Features\n\n- 📊 **Overall Trends** - Daily average revenue line chart, orders+users dual-axis bars, frequency stack, new/old user stack, retention rate\n- 🔍 **Monthly Comparison** - 5-period monthly comparison cards, daily avg orders/revenue, time slot breakdown, weekday/weekend analysis\n- ⏱ **Time Analysis** - 5-period monthly line charts, heatmap, time slot bars, insight panels\n- 👤 **User Structure** - New/old user stacked bars, frequency distribution, retention rate, active old user rate\n- 📍 **Review Traffic** - Enabled: source pie + conversion funnel + deal table / Not enabled: status + analysis\n- 🎯 **Operations Plan** - 3+3 strategy cards (P0/P1/P2) + competitor comparison\n\n## Use Cases\n\n- Venue operations (badminton/tennis/basketball/swimming)\n- Restaurant stores\n- Retail orders\n- Service appointments\n- Any business with order records\n\n## Supported Data Formats\n\n- Format: `.xlsx` / `.csv`\n- Required fields: order date, order amount, user ID (phone/user ID)\n- Optional fields: venue/product/service type, time slot, order status, discount amount\n\n## Color Themes\n\n5 preset themes available:\n1. Purple-Blue (Premium/Sports)\n2. Orange-Green (Vibrant/Venue)\n3. Deep Blue (Tech/Finance)\n4. Beige-Brown (Elegant/Restaurant)\n5. Dark (Night/Luxury)\n\nAlso supports extracting main colors from logo images.\n\n## Core Calculation Standard\n\nAll monthly comparisons use **full-month daily average** - no half-month or equal-length截取 comparison.\n\n## Usage\n\n1. Provide order Excel/CSV data file\n2. Choose color theme (preset or custom)\n3. Explain business scenario (has Dianping store or not)\n4. AI automatically generates interactive analysis report\n\n## Example\n\nFull example: `references/example-badminton.html` — Xingchen Badminton Center, purple theme, 6 tabs\n\n## Tech Stack\n\n- Python (Pandas) - Data processing\n- Chart.js - Data visualization\n- HTML/CSS - Responsive reports\n\n## License\n\nMIT License\n\nFile v0.1.0:_meta.json\n\n{\n  \"ownerId\": \"kn73gm1jmjpw7wv3xmg636vved822xw9\",\n  \"slug\": \"business-data-analysis\",\n  \"version\": \"0.1.0\",\n  \"publishedAt\": 1784996808892\n}\n\nFile v0.1.0:references/color-themes.md\n\n# 配色主题规范\n\n## 1. 预设主题（直接复制使用）\n\n### 主题1 — 紫蓝（精品/运动，技能示例主题）\n此主题来自「星辰羽毛球馆」案例，参考图片：薰衣草色运动服+星空深紫背景。\n\n```css\n:root{\n  --bg:#F5F3FA; --s1:#FFFFFF; --s2:#EDE8F5; --bd:#D8D0EC;\n  --c1:#7B5EA7; --c2:#5B8DD9; --c3:#9B7DC7; --c4:#A390C8;\n  --red:#B04848; --t:#1A1525; --mu:#7A6E90; --mu2:#C8C0DC; --tx:#2D2640;\n}\n```\n- Hero: `background:linear-gradient(135deg,#5B3A8A,#6B4A9A,#4A3A7A); border-bottom:3px solid #3D2A6A`\n- Tab:  `background:#4A3080; border-bottom:3px solid #35206A`\n- Tab激活: `border-bottom-color:#CDB8F5`\n- 图表配色: `C1='#7B5EA7', C2='#5B8DD9', C3='#9B7DC7', C4='#A390C8', RED='#B04848', PUR='#A040A0'`\n- 新用户色: `C2+'55'`（蓝色），老用户色: `C1+'66'`（紫色）\n\n### 主题2 — 橙绿（活力/运动场馆）\n```css\n:root{\n  --bg:#F8F6F2; --s1:#FFFFFF; --s2:#F4F1EC; --bd:#E8E3DA;\n  --c1:#4A7C59; --c2:#C97040; --c3:#D4884A; --c4:#5A8A6A;\n  --red:#B04848; --t:#1A1A1A; --mu:#666666; --mu2:#CCCCCC; --tx:#333333;\n}\n```\n- Hero: `background:linear-gradient(135deg,#B8694A,#A85C40,#985234); border-bottom:3px solid #8A4A2C`\n- Tab:  `background:#4E7A62; border-bottom:3px solid #3A6550`\n- Tab激活: `border-bottom-color:#C97040`\n- 图表配色: `C1='#4A7C59', C2='#C97040', C3='#D4884A', C4='#5A8A6A', RED='#B04848'`\n\n### 主题3 — 深蓝（科技/金融）\n```css\n:root{\n  --bg:#F0F4FA; --s1:#FFFFFF; --s2:#E8EEFA; --bd:#D0DAEE;\n  --c1:#2563EB; --c2:#F59E0B; --c3:#FBB040; --c4:#3B82F6;\n  --red:#DC2626; --t:#0F172A; --mu:#64748B; --mu2:#CBD5E1; --tx:#1E293B;\n}\n```\n- Hero: `background:linear-gradient(135deg,#1E3A8A,#1E40AF); border-bottom:3px solid #1A3570`\n- Tab:  `background:#1E4080; border-bottom:3px solid #1A3570`\n\n### 主题4 — 米棕（精品/餐饮/咖啡）\n```css\n:root{\n  --bg:#FAF8F4; --s1:#FFFFFF; --s2:#F4F0E8; --bd:#E4DCCB;\n  --c1:#8B6F47; --c2:#C4813D; --c3:#D4956A; --c4:#A08060;\n  --red:#A84040; --t:#2C1F12; --mu:#7A6550; --mu2:#D0C4B0; --tx:#3D2E1C;\n}\n```\n- Hero: `background:linear-gradient(135deg,#7A5A38,#5A3A20); border-bottom:3px solid #4A2A10`\n- Tab:  `background:#6B5540; border-bottom:3px solid #5A4530`\n\n### 主题5 — 深色（夜间/高端）\n```css\n:root{\n  --bg:#0F1A0D; --s1:#162014; --s2:#1E2E1A; --bd:#2A4024;\n  --c1:#4ADE80; --c2:#FB923C; --c3:#FACC15; --c4:#34D399;\n  --red:#F87171; --t:#D8F0D0; --mu:#7AAA68; --mu2:#2A4024; --tx:#C8E8C0;\n}\n```\n- Hero: `background:linear-gradient(135deg,#0D1F0A,#0F1A0D); border-bottom:3px solid #080F06`\n- Tab:  `background:#1A3020; border-bottom:3px solid #0D2018`\n- 热力图颜色需调整（深色背景）：使用更亮的颜色\n\n---\n\n## 2. 从Logo图片提取颜色\n\n运行 `scripts/extract_colors.py`：\n\n```bash\npython3 scripts/extract_colors.py /path/to/logo.png --output css\n```\n\n输出示例：\n```\n提取颜色: #7B5EA7 (主), #5B8DD9 (辅)\n:root {\n  --c1: #7B5EA7;\n  --c2: #5B8DD9;\n  ...\n}\n```\n\n---\n\n## 3. 从HEX/RGB手动构建主题\n\n给定主色 `primary` 和辅色 `accent`，套用如下规则：\n\n```\n--bg:  primary 极浅化 (lighten 90%+, desaturate)\n--s1:  #FFFFFF\n--s2:  primary 浅化 (lighten 85%)\n--bd:  primary 浅化 (lighten 70%)\n--c1:  primary  (主色，老用户/主指标/卡片左边条)\n--c2:  accent   (辅色，新用户/次指标/强调)\n--c3:  accent 浅一档\n--c4:  primary 浅一档\n--t:   非常深的同色系色（正文）\n--mu:  中灰偏主色调（次要文字）\n\nHero bg:  primary 深化渐变（-10% → -20% → -30% lightness）\nTab bg:   primary 深化 -20%\n```\n\nPython 辅助函数：\n```python\ndef lighten(hex_color, amount):\n    \"\"\"amount: 0.0-1.0，越大越浅\"\"\"\n    r,g,b = int(hex_color[1:3],16), int(hex_color[3:5],16), int(hex_color[5:7],16)\n    r = int(r + (255-r)*amount)\n    g = int(g + (255-g)*amount)\n    b = int(b + (255-b)*amount)\n    return f\"#{r:02X}{g:02X}{b:02X}\"\n\ndef darken(hex_color, amount):\n    r,g,b = int(hex_color[1:3],16), int(hex_color[3:5],16), int(hex_color[5:7],16)\n    return f\"#{int(r*(1-amount)):02X}{int(g*(1-amount)):02X}{int(b*(1-amount)):02X}\"\n```\n\n---\n\n## 4. 图表颜色使用约定\n\n| 用途 | 颜色 |\n|------|------|\n| 老用户 | `C1+'66'`（主色，稍透明） |\n| 新用户 | `C2+'55'`（辅色，稍透明） |\n| 主折线/主柱 | `C1`（实色边框）|\n| 次折线/辅助 | `C2` |\n| 频次1次 | `C1+'44'`（淡） |\n| 频次2次 | `C3+'cc'` |\n| 频次3-5次 | `C2+'cc'` 或 `PUR+'cc'` |\n| 高频5次+ | `RED+'cc'` |\n| 日均实收折线 | `PUR`（紫色，区别于场次） |\n| 留存率（高）| `C3`（浅色辅） |\n| 留存率（低）| `RED` |\n| 图表网格线 | `'#EDE8F5'`（主题1）/ `'#EEEEEE'`（其他浅色主题） |\n| 刻度文字 | `'#8A80A0'`（主题1）/ `'#666666'`（其他） |\n\n---\n\n## 5. 热力图颜色（浅色主题通用）\n\n```javascript\nfunction heatmapColor(pctChange) {\n  if (pctChange >= 15)  return 'rgba(60,120,80,.85)';   // 强增长 深绿\n  if (pctChange >= 0)   return 'rgba(80,140,100,.55)';   // 微增   中绿\n  if (pctChange >= -20) return 'rgba(180,150,40,.60)';   // 轻跌   黄\n  if (pctChange >= -40) return 'rgba(180,80,50,.65)';    // 中跌   橙红\n  return 'rgba(150,40,120,.75)';                          // 重跌   深紫/深红\n}\n// 热力图单元格文字颜色: '#FFFFFF'，fontWeight:'600'\n```\n\n深色主题（主题5）需改用更亮的版本：\n```javascript\nfunction heatmapColorDark(pctChange) {\n  if (pctChange >= 15)  return 'rgba(80,220,120,.85)';\n  if (pctChange >= 0)   return 'rgba(80,180,100,.6)';\n  if (pctChange >= -20) return 'rgba(240,200,50,.65)';\n  if (pctChange >= -40) return 'rgba(240,120,50,.7)';\n  return 'rgba(240,80,80,.8)';\n}\n```\n\n---\n\n## 6. 字体配置\n\n```css\n@import url('https://fonts.googleapis.com/css2?family=Noto+Serif+SC:wght@300;400;500;600&family=Noto+Sans+SC:wght@300;400;500&family=DM+Mono:wght@400;500&display=swap');\n\n/* 标题（.pt, h1）*/  font-family: 'Noto Serif SC', serif;\n/* 正文（body）  */  font-family: 'Noto Sans SC', sans-serif;\n/* 数字（.sv等）*/  font-family: 'DM Mono', monospace;\n```\n\nFile v0.1.0:references/data-processing.md\n\n# 数据处理详细规范\n\n## 1. 字段识别\n\n### 自动映射规则（模糊匹配，优先级从高到低）\n\n```python\nFIELD_PATTERNS = {\n    'date': ['预订日期', '下单时间', '订单日期', '日期', 'date', 'order_date', 'created_at'],\n    'amount': ['订单最终金额', '实收金额', '实付金额', '订单金额', '金额', 'amount', 'price', 'total'],\n    'order_amount': ['订单金额', '原价', 'original_price'],\n    'user_id': ['手机号', '用户ID', '会员号', 'user_id', 'phone', 'member_id', 'customer_id'],\n    'item': ['场地', '商品', '服务', '项目', '品类', 'item', 'product', 'service', 'court'],\n    'slot': ['预订时段', '时段', '时间段', 'slot', 'time_slot', 'hour'],\n    'status': ['订单状态', '状态', 'status', 'order_status'],\n    'discount': ['优惠金额', '折扣', 'discount', 'coupon'],\n}\n\ndef detect_fields(df):\n    mapping = {}\n    for std_name, patterns in FIELD_PATTERNS.items():\n        for col in df.columns:\n            if any(p.lower() in col.lower() for p in patterns):\n                mapping[std_name] = col\n                break\n    return mapping\n```\n\n### 必须字段处理\n- `date`：缺失则报错，提示用户指定日期列\n- `amount`：缺失则尝试用 `order_amount` 代替，仍缺则只统计场次不统计收入\n- `user_id`：缺失则只做订单分析，跳过用户留存分析\n\n---\n\n## 2. 多行拆分（场馆/多项目场景）\n\n### 触发条件\n字段值包含 `;` 分隔符，如：\n- `场地`: `场地01;场地03`\n- `时段`: `08:00~09:00;09:00~10:00`\n\n### 拆分逻辑\n\n```python\nfrom itertools import product\n\ndef expand_row(row, item_col, slot_col):\n    items = str(row[item_col]).split(';') if item_col else ['unknown']\n    slots = str(row[slot_col]).split(';') if slot_col else ['unknown']\n    \n    # 判断展开模式\n    if len(items) == 1 or len(slots) == 1:\n        combos = list(product(items, slots))\n    else:\n        # 先尝试配对（1:1映射）\n        n = max(len(items), len(slots))\n        paired = [(items[min(i,len(items)-1)], slots[min(i,len(slots)-1)]) for i in range(n)]\n        # 验证配对总价是否接近原始金额\n        # 如不匹配则改用笛卡尔积\n        combos = paired  # 默认配对\n    \n    return combos\n\ndef split_amount(total, std_prices, total_std):\n    \"\"\"按标准单价比例分摊金额\"\"\"\n    if total_std == 0:\n        return [total / len(std_prices)] * len(std_prices)\n    return [total * p / total_std for p in std_prices]\n```\n\n---\n\n## 3. 核心指标计算规范\n\n### 3.1 时间处理\n\n```python\ndf['date'] = pd.to_datetime(df['date'], errors='coerce', infer_datetime_format=True)\ndf['month'] = df['date'].dt.to_period('M').astype(str)\ndf['day'] = df['date'].dt.day\ndf['weekday'] = df['date'].dt.weekday  # 0=周一, 6=周日\ndf['is_weekend'] = df['weekday'] >= 5\ndf['hour'] = df['date'].dt.hour  # 如果时段是时间戳\n# 如果时段是字符串如\"08:00~09:00\"，提取起始小时：\ndf['hour'] = df['slot'].str.extract(r'(\\d+):').astype(float)\n```\n\n### 3.2 月度日均指标（推荐口径，排除天数差异）\n\n```python\ndef calc_monthly(df, exclude_dates=None):\n    \"\"\"\n    exclude_dates: list of (month, day_start, day_end) tuples for lockout periods\n    e.g., [('2026-02', 15, 22)] for CNY lockout\n    \"\"\"\n    if exclude_dates:\n        for month, d1, d2 in exclude_dates:\n            mask = (df['month'] == month) & df['day'].between(d1, d2)\n            df = df[~mask]\n    \n    monthly = df.groupby('month').agg(\n        total_orders=('amount', 'count'),\n        total_rev=('amount', 'sum'),\n        active_users=('user_id', 'nunique'),\n        op_days=('date', lambda x: x.dt.date.nunique())\n    ).reset_index()\n    \n    monthly['daily_orders'] = (monthly['total_orders'] / monthly['op_days']).round(1)\n    monthly['daily_rev'] = (monthly['total_rev'] / monthly['op_days']).round(0)\n    return monthly\n```\n\n### 3.3 新老用户判断\n\n```python\ndef classify_users(df, old_pool_months=None, old_pool_users=None):\n    \"\"\"\n    方式A: 指定月份作为老用户基准期（前N个月已订过=老用户）\n    方式B: 直接提供老用户集合\n    \"\"\"\n    first_order = df.groupby('user_id')['date'].min().reset_index()\n    first_order.columns = ['user_id', 'first_order_date']\n    first_order['first_month'] = first_order['first_order_date'].dt.to_period('M').astype(str)\n    \n    if old_pool_months:\n        old_users = set(first_order[first_order['first_month'].isin(old_pool_months)]['user_id'])\n    elif old_pool_users:\n        old_users = set(old_pool_users)\n    else:\n        # 默认：数据集中最早出现的月份用户为老用户基准\n        earliest_months = sorted(first_order['first_month'].unique())[:3]\n        old_users = set(first_order[first_order['first_month'].isin(earliest_months)]['user_id'])\n    \n    return old_users, first_order\n```\n\n### 3.4 新用户次月留存\n\n```python\ndef calc_retention(df, first_order_df, old_pool):\n    months = sorted(df['month'].unique())\n    retention = []\n    \n    for i, mo in enumerate(months[:-1]):\n        next_mo = months[i+1]\n        # 本月首次订单的新用户（不在老用户池中）\n        new_users = set(\n            first_order_df[\n                (first_order_df['first_month'] == mo) &\n                (~first_order_df['user_id'].isin(old_pool))\n            ]['user_id']\n        )\n        if not new_users:\n            continue\n        next_month_users = set(df[df['month'] == next_mo]['user_id'])\n        retained = new_users & next_month_users\n        retention.append({\n            'period': f\"{mo}→{next_mo}\",\n            'new_users': len(new_users),\n            'retained': len(retained),\n            'rate': round(len(retained) / len(new_users) * 100, 1)\n        })\n    return retention\n```\n\n### 3.5 逐小时日均（整月数据）\n\n```python\ndef calc_hourly(df, exclude_dates=None):\n    if exclude_dates:\n        for month, d1, d2 in exclude_dates:\n            mask = (df['month'] == month) & df['day'].between(d1, d2)\n            df = df[~mask]\n    \n    result = {}\n    for mo in df['month'].unique():\n        m = df[df['month'] == mo]\n        op_days = m['date'].dt.date.nunique()\n        hourly = m.groupby('hour').size() / op_days\n        result[mo] = {int(h): round(v, 2) for h, v in hourly.items()}\n    return result\n```\n\n### 3.6 频次分布\n\n```python\ndef freq_distribution(df_period, user_col='user_id'):\n    uf = df_period.groupby(user_col).size()\n    return {\n        '1次': int((uf == 1).sum()),\n        '2次': int((uf == 2).sum()),\n        '3-5次': int(((uf >= 3) & (uf <= 5)).sum()),\n        '5+次': int((uf > 5).sum())\n    }\n```\n\n---\n\n## 4. 等长时间段对比（阶段环比）\n\n```python\ndef get_comparable_periods(df, period_days=15):\n    \"\"\"\n    自动选取最近若干个月，各取前N天做等长对比\n    支持春节等特殊期补全\n    \"\"\"\n    months = sorted(df['month'].unique())[-4:]  # 最近4个月\n    periods = []\n    \n    for mo in months:\n        m_data = df[df['month'] == mo]\n        m_data = m_data[m_data['day'] <= period_days]\n        periods.append({\n            'label': mo,\n            'data': m_data,\n            'days': period_days\n        })\n    return periods\n```\n\n### 特殊期补全（如春节锁场）\n\n```python\ndef fill_missing_period(real_data, ref_data, fill_dates, weekday_map):\n    \"\"\"\n    real_data: 实际有数据的部分\n    ref_data: 同月非特殊期数据\n    fill_dates: 需要补全的日期列表\n    weekday_map: {weekday: avg_value} 按星期的平均值\n    \"\"\"\n    fill_values = {}\n    for d in fill_dates:\n        dow = d.weekday()\n        fill_values[d] = weekday_map.get(dow, weekday_map.get('avg', 0))\n    return fill_values\n```\n\n---\n\n## 5. 数据质量检查\n\n处理前自动检查：\n```python\ndef data_quality_check(df, field_map):\n    issues = []\n    \n    # 1. 缺失值\n    for std, col in field_map.items():\n        null_pct = df[col].isna().mean()\n        if null_pct > 0.05:\n            issues.append(f\"字段 {col} 缺失率 {null_pct:.1%}\")\n    \n    # 2. 日期范围\n    date_col = field_map.get('date')\n    if date_col:\n        date_range = df[date_col].agg(['min', 'max'])\n        issues.append(f\"数据范围：{date_range['min']:%Y-%m-%d} 至 {date_range['max']:%Y-%m-%d}\")\n    \n    # 3. 金额异常\n    amt_col = field_map.get('amount')\n    if amt_col:\n        neg = (df[amt_col] < 0).sum()\n        if neg > 0:\n            issues.append(f\"存在 {neg} 条负金额记录\")\n    \n    return issues\n```\n\nFile v0.1.0:references/html-template.md\n\n# HTML报告模板规范\n\n## 1. 完整CSS（基于紫蓝主题，替换 :root 变量即可换主题）\n\n```html\n<!DOCTYPE html>\n<html lang=\"zh-CN\">\n<head>\n<meta charset=\"UTF-8\">\n<meta name=\"viewport\" content=\"width=device-width,initial-scale=1.0\">\n<title>{业务名称} · 经营诊断报告</title>\n<script src=\"https://cdnjs.cloudflare.com/ajax/libs/Chart.js/4.4.1/chart.umd.min.js\"></script>\n<style>\n@import url('https://fonts.googleapis.com/css2?family=Noto+Serif+SC:wght@300;400;500;600&family=Noto+Sans+SC:wght@300;400;500&family=DM+Mono:wght@400;500&display=swap');\n\n/* ── 色彩变量（替换此块即可换主题）── */\n:root{\n  --bg:#F5F3FA; --s1:#FFFFFF; --s2:#EDE8F5; --bd:#D8D0EC;\n  --c1:#7B5EA7; --c2:#5B8DD9; --c3:#9B7DC7; --c4:#A390C8;\n  --red:#B04848; --t:#1A1525; --mu:#7A6E90; --mu2:#C8C0DC; --tx:#2D2640;\n}\n\n*{margin:0;padding:0;box-sizing:border-box}\nbody{background:var(--bg);color:var(--t);font-family:'Noto Sans SC',sans-serif;\n     font-size:13px;line-height:1.7;min-height:100vh;\n     -webkit-font-smoothing:antialiased;letter-spacing:.01em}\n\n/* HERO */\n.hero{padding:28px 20px 22px;\n      background:linear-gradient(135deg,#5B3A8A 0%,#6B4A9A 40%,#4A3A7A 100%);\n      border-bottom:3px solid #3D2A6A;position:relative;overflow:hidden}\n.hero::after{content:'';position:absolute;inset:0;\n  background:radial-gradient(ellipse at 80% 40%,rgba(180,160,255,.15),transparent 60%);\n  pointer-events:none}\n.hi{position:relative;z-index:1}\n.hl{font-size:10px;letter-spacing:.18em;color:rgba(255,255,255,.75);\n    text-transform:uppercase;margin-bottom:8px}\nh1{font-family:'Noto Serif SC',serif;font-size:26px;font-weight:600;\n   color:#FFF;line-height:1.2;text-shadow:0 2px 8px rgba(0,0,0,.2)}\nh1 em{font-style:normal;color:#CDB8F5}\n.hsub{font-size:11px;color:rgba(255,255,255,.65);margin-top:6px;\n      line-height:1.65;font-weight:300}\n.kpis{display:flex;gap:14px;margin-top:14px;flex-wrap:wrap}\n.kpi{display:flex;flex-direction:column;gap:2px}\n.kv{font-family:'DM Mono',monospace;font-size:16px;font-weight:500;color:#FFF;\n    text-shadow:0 1px 4px rgba(0,0,0,.25)}\n.kv.dn{color:#FFD0D8}.kv.up{color:#C8E8FF}\n.kl{font-size:10px;color:rgba(255,255,255,.72)}\n\n/* TABS */\n.tabs{display:flex;background:#4A3080;border-bottom:3px solid #35206A;\n      padding:0 10px;overflow-x:auto;-webkit-overflow-scrolling:touch}\n.tab{background:none;border:none;color:rgba(255,255,255,.55);\n     font-family:'Noto Sans SC',sans-serif;font-size:12px;\n     padding:11px 13px;cursor:pointer;border-bottom:2px solid transparent;\n     white-space:nowrap;transition:all .15s}\n.tab:hover{color:#FFF}.tab.on{color:#FFF;border-bottom-color:#CDB8F5;font-weight:500}\n\n/* PAGES */\n.pg{display:none;padding:22px 16px}.pg.on{display:block}\n.pt{font-family:'Noto Serif SC',serif;font-size:18px;font-weight:600;\n    color:#2D1A4A;margin-bottom:3px}\n.ps{font-size:11px;color:var(--mu);margin-bottom:18px;line-height:1.6}\n\n/* GRIDS — auto-fit，天然响应式 */\n.g2{display:grid;grid-template-columns:repeat(auto-fit,minmax(280px,1fr));gap:14px;margin-bottom:14px}\n.g3{display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:14px;margin-bottom:14px}\n.full{grid-column:1/-1}\n\n/* CARD */\n.card{background:var(--s1);border:1px solid var(--bd);border-radius:10px;\n      padding:18px;box-shadow:0 1px 4px rgba(90,50,150,.06)}\n.ct{font-size:10px;font-weight:500;letter-spacing:.09em;color:#9A90B0;\n    text-transform:uppercase;margin-bottom:12px;display:flex;align-items:center;gap:7px}\n.ct::before{content:'';display:inline-block;width:2px;height:10px;\n            background:var(--c1);border-radius:2px;flex-shrink:0}\n.ct.bl::before{background:var(--c2)}.ct.ye::before{background:#D4A040}\n.ct.tl::before{background:var(--c4)}.ct.re::before{background:var(--red)}\n\n/* STAT STRIP */\n.strip{display:flex;gap:10px;margin-bottom:14px;flex-wrap:wrap}\n.st{flex:1;min-width:130px;background:var(--s1);border:1px solid var(--bd);\n    border-radius:9px;padding:13px 15px;position:relative;overflow:hidden}\n.st::after{content:'';position:absolute;top:0;left:0;right:0;\n           height:2px;background:var(--c1);opacity:.7}\n.st.bl::after{background:var(--c2)}.st.ye::after{background:#D4A040}\n.st.tl::after{background:var(--c4)}.st.re::after{background:var(--red)}\n.sv{font-family:'DM Mono',monospace;font-size:17px;font-weight:500;\n    color:var(--t);margin-bottom:3px}\n.sl{font-size:10px;color:var(--mu)}\n.sd{font-size:10px;color:var(--red);margin-top:3px}.sd.pos{color:var(--c1)}\n\n/* 5列对比卡（Tab2 整月对比，也可用于Tab5 KV）*/\n/* 使用 auto-fit 而非 repeat(5,1fr)，手机上自动折为2列或1列 */\n.cbox{background:var(--s2);border:1px solid var(--bd);border-radius:9px;\n      padding:14px;text-align:center}\n.cbox.c1{border-color:rgba(123,94,167,.45);border-top:3px solid var(--c1)}\n.cbox.c2{border-color:rgba(91,141,217,.35);border-top:3px solid var(--c2)}\n.cbox.c3{border-color:rgba(180,100,80,.35);border-top:3px solid var(--c2)}\n.cbox.c4{border-color:rgba(176,72,72,.4);border-top:3px solid var(--red)}\n.cbl{font-size:10px;letter-spacing:.07em;color:var(--mu);\n     text-transform:uppercase;margin-bottom:7px}\n.cbv{font-family:'DM Mono',monospace;font-size:20px;font-weight:500;\n     color:var(--t);margin-bottom:2px}\n.cbs{font-size:11px;color:var(--mu);margin-bottom:5px}\n.cbr{margin-top:7px}\n.cbn{font-family:'DM Mono',monospace;font-size:14px;color:var(--t);\n     line-height:1;margin-bottom:1px}\n.cbd{font-size:10px;color:var(--mu);margin-top:6px}\n.cbd.dn{color:var(--red)}.cbd.pos{color:var(--c1)}\nhr.sep{margin:7px 0;border:none;border-top:1px solid var(--bd)}\n\n/* SECTION DIVIDER */\n.sdiv{font-size:10px;font-weight:600;letter-spacing:.13em;text-transform:uppercase;\n      color:var(--c1);margin:18px 0 12px;padding-bottom:5px;border-bottom:1px solid var(--bd)}\n\n/* INSIGHT BOXES */\n.ins{background:rgba(123,94,167,.05);border:1px solid rgba(123,94,167,.18);\n     border-left:3px solid var(--c1);border-radius:8px;\n     padding:12px 15px;font-size:12px;color:var(--tx);line-height:1.85;margin-bottom:12px}\n.ins.bl{background:rgba(91,141,217,.05);border-color:rgba(91,141,217,.18);border-left-color:var(--c2)}\n.ins.dn{background:rgba(176,72,72,.04);border-color:rgba(176,72,72,.18);border-left-color:var(--red)}\n.ins.ye{background:rgba(212,160,64,.05);border-color:rgba(212,160,64,.2);border-left-color:#D4A040}\n.it{font-size:10px;font-weight:700;letter-spacing:.09em;text-transform:uppercase;\n    margin-bottom:5px;color:var(--c1)}\n.ins.bl .it{color:var(--c2)}.ins.dn .it{color:var(--red)}.ins.ye .it{color:#C49030}\n.ins strong{color:var(--c1);font-weight:600}\n.ins.bl strong{color:var(--c2)}.ins.dn strong{color:var(--red)}.ins.ye strong{color:#C49030}\n/* 绿色strong（Tab3 逆势增长框）*/\n.ins-green strong{color:var(--c1)!important}\n\n/* DATA TABLE */\n.dtbl-wrap{overflow-x:auto;-webkit-overflow-scrolling:touch;max-width:100%}\n.dtbl{width:100%;border-collapse:collapse;font-size:12px;min-width:360px}\n.dtbl th{text-align:left;padding:8px 11px;background:var(--s2);color:var(--c1);\n         font-size:10px;font-weight:600;letter-spacing:.07em;text-transform:uppercase;\n         border-bottom:1px solid var(--bd)}\n.dtbl td{padding:9px 11px;border-bottom:1px solid rgba(100,80,150,.07);\n         vertical-align:top;line-height:1.5}\n.dtbl tr:nth-child(even) td{background:rgba(123,94,167,.03)}\n.dtbl tr:hover td{background:rgba(91,141,217,.05)}\n.dtbl td.dn{color:var(--red);font-weight:500}\n.dtbl td.up{color:var(--c1);font-weight:500}\n.dtbl td.bold{font-weight:600;color:var(--c1)}\n.bdg{display:inline-block;padding:2px 8px;border-radius:10px;font-size:10px;font-weight:600}\n.bdg-r{background:rgba(176,72,72,.12);color:var(--red);border:1px solid rgba(176,72,72,.3)}\n.bdg-p{background:rgba(123,94,167,.12);color:var(--c1);border:1px solid rgba(123,94,167,.3)}\n.bdg-b{background:rgba(91,141,217,.12);color:var(--c2);border:1px solid rgba(91,141,217,.3)}\n\n/* HEATMAP */\n.hm-wrap{overflow-x:auto;-webkit-overflow-scrolling:touch;max-width:100%}\n.hm{display:grid;grid-template-columns:52px repeat(14,minmax(26px,1fr));\n    gap:2px;min-width:480px}\n.hmh{text-align:center;font-size:9px;color:#9A8AB0;\n     font-family:'DM Mono',monospace;padding:2px 0}\n.hml{font-family:'DM Mono',monospace;font-size:10px;color:var(--mu);\n     display:flex;align-items:center}\n.hmc{border-radius:3px;padding:5px 2px;text-align:center;\n     font-family:'DM Mono',monospace;font-size:10px;font-weight:600;\n     cursor:default;transition:transform .1s}\n.hmc:hover{transform:scale(1.1);z-index:5;position:relative}\n\n/* STRATEGY CARDS */\n.sps{display:grid;grid-template-columns:repeat(auto-fit,minmax(260px,1fr));\n     gap:12px;margin-bottom:14px}\n.sc{background:var(--s1);border:1px solid var(--bd);border-radius:10px;\n    padding:17px;position:relative;overflow:hidden;\n    box-shadow:0 1px 4px rgba(90,50,150,.05)}\n.sc::before{content:'';position:absolute;top:0;left:0;right:0;height:3px}\n.sc.p0::before{background:linear-gradient(90deg,#A040A0,#7B5EA7)}\n.sc.p1::before{background:linear-gradient(90deg,#5B8DD9,#7B5EA7)}\n.sc.p1b::before{background:linear-gradient(90deg,#5B8DD9,#4070C0)}\n.sc.p2::before{background:linear-gradient(90deg,#9B7DC7,#7B5EA7)}\n.p0 .spt{color:#A040A0}.p1 .spt{color:var(--c1)}\n.p1b .spt{color:var(--c2)}.p2 .spt{color:var(--c3)}\n.p0 .sph{color:#A040A0}.p1 .sph{color:var(--c1)}\n.p1b .sph{color:var(--c2)}.p2 .sph{color:var(--c3)}\n.spt{font-size:10px;font-weight:600;letter-spacing:.08em;margin-bottom:7px}\n.sph{font-family:'Noto Serif SC',serif;font-size:13px;font-weight:600;margin-bottom:8px}\n.spb{font-size:12px;color:#5A5070;line-height:1.85}\n.spb li{margin-left:14px;margin-bottom:3px}\n.spb strong{color:var(--c1);font-weight:600}\n.tags{display:flex;flex-wrap:wrap;gap:5px;margin-top:9px}\n.tag{font-size:10px;padding:2px 8px;border-radius:10px;\n     background:var(--s2);color:var(--mu);border:1px solid var(--bd)}\n\n/* KV ROW（Tab5 点评概览数字）*/\n.kv-row{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));\n        gap:10px;margin-bottom:14px}\n.kv-box{background:var(--s2);border:1px solid var(--bd);border-radius:9px;\n        padding:16px;text-align:center}\n.kvn{font-family:'DM Mono',monospace;font-size:24px;font-weight:400;\n     color:var(--c1);margin-bottom:4px}\n.kvl{font-size:11px;color:var(--mu)}\n\n/* FUNNEL（Tab5 已开通点评场景）*/\n.funnel{display:flex;flex-direction:column;gap:6px;margin:10px 0}\n.f-row{display:flex;align-items:center;gap:10px}\n.f-bar-wrap{flex:1;height:28px;background:var(--s2);border-radius:5px;overflow:hidden}\n.f-bar{height:100%;border-radius:5px;display:flex;align-items:center;\n       padding-left:10px;font-size:11px;font-weight:500;color:#FFF;\n       font-family:'DM Mono',monospace;transition:width .6s ease}\n.f-lbl{font-size:11px;color:var(--mu);min-width:60px;text-align:right}\n.f-num{font-family:'DM Mono',monospace;font-size:12px;font-weight:500;\n       color:var(--t);min-width:40px}\n\nhr.dv{border:none;border-top:1px solid var(--bd);margin:18px 0}\n::-webkit-scrollbar{width:5px;height:5px}\n::-webkit-scrollbar-track{background:var(--bg)}\n::-webkit-scrollbar-thumb{background:var(--mu2);border-radius:3px}\n\n/* ── MOBILE ── */\n@media (max-width:600px){\n  .hero{padding:16px 14px}\n  h1{font-size:19px}\n  .hsub{font-size:10px}\n  .kpis{gap:10px}\n  .kv{font-size:14px}\n  .tabs{padding:0 4px}\n  .tab{font-size:11px;padding:9px 9px}\n  .pg{padding:14px 12px}\n  .pt{font-size:15px}\n  .ps{font-size:10px}\n  .g2,.g3{grid-template-columns:1fr}\n  .sps{grid-template-columns:1fr}\n  .kv-row{grid-template-columns:1fr}\n  .strip{flex-direction:column}\n  .st{min-width:100%;flex:none}\n  .card{padding:13px}\n  .ins{font-size:11px;padding:10px 12px}\n  .dtbl{font-size:11px}\n  .dtbl th,.dtbl td{padding:6px 8px}\n  .hm{grid-template-columns:40px repeat(14,minmax(22px,1fr))}\n  .hmc{font-size:8.5px;padding:4px 1px}\n  .cbv{font-size:17px}\n  .kvn{font-size:20px}\n  .sph{font-size:12px}\n  .spb{font-size:11px}\n  hr.dv{margin:12px 0}\n}\n</style>\n```\n\n---\n\n## 2. JS 基础配置（Chart.js，复制到 `<script>` 开头）\n\n```javascript\n// 全局主题色（从CSS变量读取，换主题时自动跟随）\nconst CS = getComputedStyle(document.documentElement);\nconst C1  = CS.getPropertyValue('--c1').trim();\nconst C2  = CS.getPropertyValue('--c2').trim();\nconst C3  = CS.getPropertyValue('--c3').trim();\nconst C4  = CS.getPropertyValue('--c4').trim();\nconst RED = CS.getPropertyValue('--red').trim();\nconst PUR = '#A040A0';  // 用于折线点评等紫色细节\n\n// Chart.js 默认值\nChart.defaults.color        = '#8A80A0';  // 调整为当前主题 --mu 色\nChart.defaults.borderColor  = '#D8D0EC';  // 调整为当前主题 --bd 色\nChart.defaults.font.family  = \"'Noto Sans SC', sans-serif\";\nChart.defaults.font.size    = 11;\n\n// 基础配置对象（复用）\nconst B = {\n  responsive: true,\n  maintainAspectRatio: false,\n  plugins: {\n    legend: { display: false },\n    tooltip: {\n      backgroundColor: '#1A1525',  // --t 深色\n      borderColor: C1,\n      borderWidth: 1,\n      titleColor: '#E8E0F5',\n      bodyColor: '#B0A8CC',\n      padding: 10,\n      cornerRadius: 6\n    }\n  },\n  scales: {\n    x: { grid: { color: '#EDE8F5' }, ticks: { color: '#8A80A0' } },\n    y: { grid: { color: '#EDE8F5' }, ticks: { color: '#8A80A0' } }\n  }\n};\n\n// 图例配置\nconst LG = { display: true, labels: { color: '#8A80A0', boxWidth: 11, font: { size: 10 } } };\n\n// 渐变辅助（用于折线填充）\nfunction makeGrad(ctx, color, alpha1 = 0.28, alpha2 = 0.04) {\n  const g = ctx.createLinearGradient(0, 0, 0, 200);\n  g.addColorStop(0, color + Math.round(alpha1 * 255).toString(16).padStart(2, '0'));\n  g.addColorStop(1, color + Math.round(alpha2 * 255).toString(16).padStart(2, '0'));\n  return g;\n}\n\n// 热力图颜色\nfunction heatmapColor(pctChange) {\n  if (pctChange >= 15)  return 'rgba(60,120,80,.85)';\n  if (pctChange >= 0)   return 'rgba(80,140,100,.55)';\n  if (pctChange >= -20) return 'rgba(180,150,40,.60)';\n  if (pctChange >= -40) return 'rgba(180,80,50,.65)';\n  return 'rgba(150,40,120,.75)';\n}\n\n// Tab切换\nfunction show(id, btn) {\n  document.querySelectorAll('.pg').forEach(p => p.classList.remove('on'));\n  document.querySelectorAll('.tab').forEach(b => b.classList.remove('on'));\n  document.getElementById(id).classList.add('on');\n  btn.classList.add('on');\n}\n```\n\n---\n\n## 3. 时段折线图（带全列 Tooltip）\n\n```javascript\n// ⚠️ 必须设置 interaction.mode:'index' 才能悬浮显示所有月份\nnew Chart(ctx, {\n  type: 'line',\n  data: { labels: hLbl, datasets: [\n    { label:'11月', data:hNov, borderColor:'#B0A0D0', borderWidth:1.5, pointRadius:2, borderDash:[4,3], tension:.35 },\n    { label:'12月', data:hDec, borderColor:C1, borderWidth:2.5, pointRadius:3, pointBackgroundColor:C1, tension:.35 },\n    { label:'1月',  data:hJan, borderColor:C3, borderWidth:2, pointRadius:2, borderDash:[3,2], tension:.35 },\n    { label:'2月',  data:hFeb, borderColor:C2, borderWidth:2, pointRadius:2, borderDash:[5,3], tension:.35 },\n    { label:'3月',  data:hMar, borderColor:RED, borderWidth:2.5, pointRadius:3, pointBackgroundColor:RED, tension:.35 },\n  ]},\n  options: {\n    ...B,\n    maintainAspectRatio: false,\n    interaction: { mode: 'index', intersect: false },\n    plugins: {\n      ...B.plugins,\n      legend: { ...LG, position: 'top' },\n      tooltip: {\n        ...B.plugins.tooltip,\n        mode: 'index',\n        intersect: false,\n        callbacks: {\n          title: items => `${items[0].label}  日均场次`,\n          label: item  => `  ${item.dataset.label}：${item.raw} 场/日`\n        }\n      }\n    }\n  }\n});\n```\n\n---\n\n## 4. 热力图生成函数\n\n```javascript\nfunction buildHeatmap(containerId, months, hourlyData, hChg, hours) {\n  const con = document.getElementById(containerId);\n  const hLbl = hours.map(h => h + '时');\n\n  // 表头\n  const emptyCell = document.createElement('div');\n  emptyCell.className = 'hmh';\n  con.appendChild(emptyCell);\n  hLbl.forEach(lbl => {\n    const d = document.createElement('div');\n    d.className = 'hmh';\n    d.textContent = lbl;\n    con.appendChild(d);\n  });\n\n  // 数据行\n  months.forEach(([label, vals]) => {\n    const lb = document.createElement('div');\n    lb.className = 'hml';\n    lb.textContent = label;\n    con.appendChild(lb);\n\n    vals.forEach((v, i) => {\n      const cell = document.createElement('div');\n      cell.className = 'hmc';\n      cell.style.background = heatmapColor(hChg[i]);\n      cell.style.color = '#FFFFFF';\n      cell.style.fontWeight = '600';\n      cell.textContent = v.toFixed(1);\n      cell.title = `${label} ${hours[i]}时 日均${v}场 · 12→3月${hChg[i] >= 0 ? '+' : ''}${hChg[i]}%`;\n      con.appendChild(cell);\n    });\n  });\n}\n\n// 调用示例\nbuildHeatmap('hm',\n  [['11月',hNov],['12月',hDec],['1月',hJan],['2月',hFeb],['3月',hMar]],\n  hourlyData, hChg, Array.from({length:14}, (_,i)=>i+8)\n);\n```\n\n---\n\n## 5. 输出验证函数\n\n```javascript\n// 在 HTML 生成后运行（Python端）\nfunction verifyHTML(html) {\n  const errors = [];\n  const canvas = new Set([...html.matchAll(/<canvas id=\"([^\"]+)\"/g)].map(m=>m[1]));\n  const jsRef  = new Set([...html.matchAll(/getElementById\\('([^']+)'\\)/g)].map(m=>m[1]));\n  const orphan = [...jsRef].filter(id => !canvas.has(id) && id !== 'hm');\n  if (orphan.length) errors.push(`孤立JS引用: ${orphan}`);\n  if (!html.includes('@media (max-width')) errors.push('缺移动端@media');\n  ['上半月','等长15天','半月'].forEach(bad => {\n    if (html.includes(bad)) errors.push(`过时表述: ${bad}`);\n  });\n  return errors;\n}\n```\n\n---\n\n## 6. Tab5 点评流量分析 — HTML结构\n\n### 已开通商户通版本\n```html\n<!-- KV 概览数字 -->\n<div class=\"kv-row\">\n  <div class=\"kv-box\"><div class=\"kvn\">112</div><div class=\"kvl\">月新客/月</div></div>\n  <div class=\"kv-box\"><div class=\"kvn\">4.8</div><div class=\"kvl\">综合评分</div></div>\n  <div class=\"kv-box\"><div class=\"kvn\">¥8,036</div><div class=\"kvl\">点评渠道净收入</div></div>\n</div>\n\n<!-- 转化漏斗 -->\n<div class=\"funnel\">\n  <div class=\"f-row\">\n    <div class=\"f-lbl\">店铺浏览</div>\n    <div class=\"f-bar-wrap\">\n      <div class=\"f-bar\" style=\"width:100%;background:linear-gradient(90deg,var(--c1),var(--c3))\">1,240</div>\n    </div>\n  </div>\n  <div class=\"f-row\">\n    <div class=\"f-lbl\">查看团购</div>\n    <div class=\"f-bar-wrap\">\n      <div class=\"f-bar\" style=\"width:54.8%;background:linear-gradient(90deg,var(--c2),var(--c4))\">680 <span style=\"font-size:9px;opacity:.8\">55%</span></div>\n    </div>\n  </div>\n  <!-- width = 当层值/最大值 × 100% -->\n</div>\n```\n\n### 未开通商户通版本（调研分析）\n```html\n<!-- 替换为：当前新客渠道饼图 + 开通收益测算表 -->\n<canvas id=\"c_source\"></canvas>  <!-- 饼图 -->\n<div class=\"ins ye\">测算：开通后月净新增¥X vs 当前¥Y</div>\n```\n\nFile v0.1.0:skill-card.md\n\n## Description:\n\nOrder Analytics converts Excel or CSV order data into an interactive six-tab HTML dashboard covering revenue trends, monthly comparisons, time slots, customer structure, review-channel traffic, and operational recommendations.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[minibeanai](https://clawhub.ai/user/minibeanai)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nExternal business operators and analysts use this skill to turn order records for venues, restaurants, retail, or service appointments into a responsive HTML analytics report and practical operating plan.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: Order data can contain customer identifiers such as phone numbers or user IDs.\n\nMitigation: Use pseudonymous customer IDs where possible and avoid placing raw identifiers in generated reports.\n\nRisk: Generated dashboards can expose sensitive business metrics and operational recommendations.\n\nMitigation: Treat generated HTML reports as sensitive business material and limit storage and sharing accordingly.\n\nRisk: The HTML template can load Chart.js and Google Fonts from public CDNs.\n\nMitigation: For safer offline or controlled deployment, replace CDN references with bundled or integrity-pinned assets.\n\nRisk: The optional Pillow install advice in the artifact uses a system-package override.\n\nMitigation: Install optional Python dependencies in an isolated virtual environment with pinned versions.\n\n## Reference(s):\n\n- [ClawHub skill page](https://clawhub.ai/minibeanai/skills/business-data-analysis)\n- [Server-resolved GitHub repository](https://github.com/MinibeanAI/business-data-analysis)\n- [Data processing specification](references/data-processing.md)\n- [Color theme specification](references/color-themes.md)\n- [HTML report template specification](references/html-template.md)\n- [Example badminton dashboard](references/example-badminton.html)\n- [Chart.js CDN dependency](https://cdnjs.cloudflare.com/ajax/libs/Chart.js/4.4.1/chart.umd.min.js)\n- [Google Fonts stylesheet dependency](https://fonts.googleapis.com/css2?family=Noto+Serif+SC:wght@300;400;500;600&family=Noto+Sans+SC:wght@300;400;500&family=DM+Mono:wght@400;500&display=swap)\n\n## Skill Output:\n\n**Output Type(s):** [Text, Markdown, Code, Shell commands, Configuration, Guidance]\n\n**Output Format:** [Markdown guidance with inline Python, HTML, CSS, and JavaScript snippets that supports producing an interactive HTML report.]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Uses local Excel or CSV order inputs and optional logo or color-theme inputs; generated HTML may load Chart.js and Google Fonts unless assets are bundled or pinned.]\n\n## Skill Version(s):\n\n0.1.0 (source: server release metadata)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.","readmeExcerpt":"Skill: Order Analytics Owner: minibeanai Summary: 订单数据业务分析仪表盘生成器。当用户提供订单Excel/CSV数据（含日期、金额、用户ID、场地/商品、时段等字段），需要生成业务分析报告、经营诊断、用户留存/频次分析、时段热力图、趋势对比、运营方案时，使用本技能。适用场景：场馆运营（羽毛球/网球/篮球/游泳）、餐饮门店、零售订单、服务业预约等任何有订单记录的业务场景。支持自定义配色（上传Logo图片或提供HEX/RGB色值）或选择预设主题。触发词：订单分析、经营诊断、用户分析、场次分析、留存分析、趋势分析、运营仪表盘、业务报告、数据报告。 Tags: latest:0.1.0 Version history: v0.1.0 | 2026-07-25T16:26:48.892Z | auto order-analytics v0.1.0 — Initial Release - C","codeSnippets":[],"executableExamples":[{"language":"text","snippet":"A. 上传Logo图片 → 运行 scripts/extract_colors.py 提取主色\nB. 提供HEX色值 → 如 #7B5EA7（主色）+ #5B8DD9（辅色）\nC. 提供RGB色值 → 如 rgb(123,94,167)\nD. 选择预设主题（见 references/color-themes.md）：\n   1. 紫蓝（精品/运动）  2. 橙绿（活力/场馆）\n   3. 深蓝（科技/金融）  4. 米棕（优雅/餐饮）  5. 深色（夜间/高端）"},{"language":"python","snippet":"import pandas as pd\ndf = pd.read_excel(path, engine='calamine')  # 或 read_csv\n\nFIELD_PATTERNS = {\n    'date':    ['预订日期','下单时间','订单日期','日期','date','order_date'],\n    'amount':  ['订单最终金额','实收金额','订单金额','金额','amount','price'],\n    'user_id': ['手机号','用户ID','会员号','user_id','phone'],\n    'item':    ['场地','商品','服务','项目','item','product'],\n    'slot':    ['预订时段','时段','slot','time_slot'],\n}"},{"language":"python","snippet":"# 整月日均（排除节假日锁场期，如春节）\nmonthly = df_clean.groupby('month').agg(\n    op_days=('date', lambda x: x.dt.date.nunique()),\n    total_orders=('amount','count'),\n    total_rev=('amount','sum'),\n    active_users=('user_id','nunique'),\n)\nmonthly['daily_orders'] = (monthly['total_orders'] / monthly['op_days']).round(1)\nmonthly['daily_rev']    = (monthly['total_rev']    / monthly['op_days']).round(0)"},{"language":"python","snippet":"old_pool_months = sorted(df['month'].unique())[:3]  # 前3个月为老用户基准\nold_pool = set(df[df['month'].isin(old_pool_months)]['user_id'])"},{"language":"python","snippet":"first_order = df.groupby('user_id')['date'].min()\nfor mo, next_mo in zip(months[:-1], months[1:]):\n    new_this = {u for u in set(df[df['month']==mo]['user_id'])\n                if u not in old_pool and first_order[u] >= pd.Timestamp(f'{mo}-01')}\n    retained  = new_this & set(df[df['month']==next_mo]['user_id'])\n    retention = len(retained) / len(new_this)"},{"language":"python","snippet":"for mo in months:\n    m = df_clean[df_clean['month']==mo]\n    days = m['date'].dt.date.nunique()\n    hourly[mo] = {h: round(len(m[m['hour']==h])/days, 2) for h in range(8,22)}\n\nhchg = {h: round((hourly[last_mo][h]-hourly[ref_mo][h]) /\n                  max(hourly[ref_mo][h],0.01)*100, 1)\n        for h in range(8,22)}"}],"parameters":null,"dependencies":[],"permissions":[],"extractedFiles":[{"path":"SKILL.md","content":"---\nname: order-analytics\ndescription: 订单数据业务分析仪表盘生成器。当用户提供订单Excel/CSV数据（含日期、金额、用户ID、场地/商品、时段等字段），需要生成业务分析报告、经营诊断、用户留存/频次分析、时段热力图、趋势对比、运营方案时，使用本技能。适用场景：场馆运营（羽毛球/网球/篮球/游泳）、餐饮门店、零售订单、服务业预约等任何有订单记录的业务场景。支持自定义配色（上传Logo图片或提供HEX/RGB色值）或选择预设主题。触发词：订单分析、经营诊断、用户分析、场次分析、留存分析、趋势分析、运营仪表盘、业务报告、数据报告。\n---\n\n# 订单业务分析仪表盘技能\n\n## 概述\n\n将原始订单数据转化为**交互式HTML分析报告**，6个Tab完整覆盖趋势→对比→时段→用户→流量→运营方案，支持桌面和手机端。**全程使用整月日均口径**，不做半月/等长截取对比。\n\n> 📎 完整案例：`references/example-badminton.html` — 星辰羽毛球馆，紫色主题，6Tab\n\n---\n\n## 第一步：确认输入与配置\n\n开始前确认以下信息（已在对话中提供则直接使用）：\n\n### 1.1 数据文件\n- 格式：`.xlsx`（用 `calamine` 引擎）/ `.csv`\n- 必须字段：**订单日期、订单金额（或实收金额）、用户标识（手机号/用户ID）**\n- 可选字段：场地/商品/服务类型、时段、订单状态、优惠金额\n\n### 1.2 配色方案（四选一）\n```\nA. 上传Logo图片 → 运行 scripts/extract_colors.py 提取主色\nB. 提供HEX色值 → 如 #7B5EA7（主色）+ #5B8DD9（辅色）\nC. 提供RGB色值 → 如 rgb(123,94,167)\nD. 选择预设主题（见 references/color-themes.md）：\n   1. 紫蓝（精品/运动）  2. 橙绿（活力/场馆）\n   3. 深蓝（科技/金融）  4. 米棕（优雅/餐饮）  5. 深色（夜间/高端）\n```\n\n### 1.3 业务场景说明（影响 Tab5 内容）\n- 是否已开通大众点评商户通？\n  - **已开通** → Tab5 展示点评流量分析（渠道来源、转化漏斗、团购表现、评价口碑）\n  - **未开通** → Tab5 展示开通调研分析（新客来源现状、开通收益测算）\n- 是否有竞品信息？→ Tab6 运营方案末尾加竞品对比表\n\n---\n\n## 第二步：数据处理\n\n> 完整规范见 `references/data-processing.md`\n\n### 2.1 读取与字段识别\n```python\nimport pandas as pd\ndf = pd.read_excel(path, engine='calamine')  # 或 read_csv\n\nFIELD_PATTERNS = {\n    'date':    ['预订日期','下单时间','订单日期','日期','date','order_date'],\n    'amount':  ['订单最终金额','实收金额','订单金额','金额','amount','price'],\n    'user_id': ['手机号','用户ID','会员号','user_id','phone'],\n    'item':    ['场地','商品','服务','项目','item','product'],\n    'slot':    ['预订时段','时段','slot','time_slot'],\n}\n```\n\n### 2.2 核心计算口径（⚠️ 关键原则）\n\n**所有月度对比一律使用整月日均，不得用绝对总场次比较不同天数的月份。**\n\n```python\n# 整月日均（排除节假日锁场期，如春节）\nmonthly = df_clean.groupby('month').agg(\n    op_days=('date', lambda x: x.dt.date.nunique()),\n    total_orders=('amount','count'),\n    total_rev=('amount','sum'),\n    active_users=('user_id','nunique'),\n)\nmonthly['daily_orders'] = (monthly['total_orders'] / monthly['op_days']).round(1)\nmonthly['daily_rev']    = (monthly['total_rev']    / monthly['op_days']).round(0)\n```\n\n**新老用户判断：**\n```python\nold_pool_months = sorted(df['month'].unique())[:3]  # 前3个月为老用户基准\nold_pool = set(df[df['month'].isin(old_pool_months)]['user_id'])\n```\n\n**新用户次月留存：**\n```python\nfirst_order = df.groupby('user_id')['date'].min()\nfor mo, next_mo in zip(months[:-1], months[1:]):\n    new_this = {u for u in set(df[df['month']==mo]['user_id'])\n                if u not in old_pool and first_order[u] >= pd.Timestamp(f'{mo}-01')}\n    retained  = new_this & set(df[df['month']==next_mo]['user_id'])\n    retention = len(retained) / len(new_this)\n```\n\n**逐小时日均（整月，带 tooltip index mode）：**\n```python\nfor mo in months:\n    m = df_clean[df_clean['month']==mo]\n    days = m['date'].dt.date.nunique()\n    hourly[mo] = {h: round(len(m[m['hour']==h])/days, 2) for h in range(8,22)}\n\nhchg = {h: round((hourly[last_mo][h]-hourly[ref_mo][h]) /\n                  max(hourly[ref_mo][h],0.01)*100, 1)\n        for h in range(8,22)}\n```\n\n---\n\n## 第三步：配色主题\n\n> 完整代码见 `references/color-themes.md`\n\n### 3.1 预"},{"path":"README.md","content":"# Business Data Analysis Skill\n\nTransform raw order data into **interactive HTML analysis reports** with 6 tabs covering trends→comparison→time slots→users→traffic→operations, supporting desktop and mobile.\n\n## Features\n\n- 📊 **Overall Trends** - Daily average revenue line chart, orders+users dual-axis bars, frequency stack, new/old user stack, retention rate\n- 🔍 **Monthly Comparison** - 5-period monthly comparison cards, daily avg orders/revenue, time slot breakdown, weekday/weekend analysis\n- ⏱ **Time Analysis** - 5-period monthly line charts, heatmap, time slot bars, insight panels\n- 👤 **User Structure** - New/old user stacked bars, frequency distribution, retention rate, active old user rate\n- 📍 **Review Traffic** - Enabled: source pie + conversion funnel + deal table / Not enabled: status + analysis\n- 🎯 **Operations Plan** - 3+3 strategy cards (P0/P1/P2) + competitor comparison\n\n## Use Cases\n\n- Venue operations (badminton/tennis/basketball/swimming)\n- Restaurant stores\n- Retail orders\n- Service appointments\n- Any business with order records\n\n## Supported Data Formats\n\n- Format: `.xlsx` / `.csv`\n- Required fields: order date, order amount, user ID (phone/user ID)\n- Optional fields: venue/product/service type, time slot, order status, discount amount\n\n## Color Themes\n\n5 preset themes available:\n1. Purple-Blue (Premium/Sports)\n2. Orange-Green (Vibrant/Venue)\n3. Deep Blue (Tech/Finance)\n4. Beige-Brown (Elegant/Restaurant)\n5. Dark (Night/Luxury)\n\nAlso supports extracting main colors from logo images.\n\n## Core Calculation Standard\n\nAll monthly comparisons use **full-month daily average** - no half-month or equal-length截取 comparison.\n\n## Usage\n\n1. Provide order Excel/CSV data file\n2. Choose color theme (preset or custom)\n3. Explain business scenario (has Dianping store or not)\n4. AI automatically generates interactive analysis report\n\n## Example\n\nFull example: `references/example-badminton.html` — Xingchen Badminton Center, purple theme, 6 tabs\n\n## Tech Stack\n\n- Python (Pandas) - Data processing\n- Chart.js - Data visualization\n- HTML/CSS - Responsive reports\n\n## License\n\nMIT License"},{"path":"_meta.json","content":"{\n  \"ownerId\": \"kn73gm1jmjpw7wv3xmg636vved822xw9\",\n  \"slug\": \"business-data-analysis\",\n  \"version\": \"0.1.0\",\n  \"publishedAt\": 1784996808892\n}"},{"path":"references/color-themes.md","content":"# 配色主题规范\n\n## 1. 预设主题（直接复制使用）\n\n### 主题1 — 紫蓝（精品/运动，技能示例主题）\n此主题来自「星辰羽毛球馆」案例，参考图片：薰衣草色运动服+星空深紫背景。\n\n```css\n:root{\n  --bg:#F5F3FA; --s1:#FFFFFF; --s2:#EDE8F5; --bd:#D8D0EC;\n  --c1:#7B5EA7; --c2:#5B8DD9; --c3:#9B7DC7; --c4:#A390C8;\n  --red:#B04848; --t:#1A1525; --mu:#7A6E90; --mu2:#C8C0DC; --tx:#2D2640;\n}\n```\n- Hero: `background:linear-gradient(135deg,#5B3A8A,#6B4A9A,#4A3A7A); border-bottom:3px solid #3D2A6A`\n- Tab:  `background:#4A3080; border-bottom:3px solid #35206A`\n- Tab激活: `border-bottom-color:#CDB8F5`\n- 图表配色: `C1='#7B5EA7', C2='#5B8DD9', C3='#9B7DC7', C4='#A390C8', RED='#B04848', PUR='#A040A0'`\n- 新用户色: `C2+'55'`（蓝色），老用户色: `C1+'66'`（紫色）\n\n### 主题2 — 橙绿（活力/运动场馆）\n```css\n:root{\n  --bg:#F8F6F2; --s1:#FFFFFF; --s2:#F4F1EC; --bd:#E8E3DA;\n  --c1:#4A7C59; --c2:#C97040; --c3:#D4884A; --c4:#5A8A6A;\n  --red:#B04848; --t:#1A1A1A; --mu:#666666; --mu2:#CCCCCC; --tx:#333333;\n}\n```\n- Hero: `background:linear-gradient(135deg,#B8694A,#A85C40,#985234); border-bottom:3px solid #8A4A2C`\n- Tab:  `background:#4E7A62; border-bottom:3px solid #3A6550`\n- Tab激活: `border-bottom-color:#C97040`\n- 图表配色: `C1='#4A7C59', C2='#C97040', C3='#D4884A', C4='#5A8A6A', RED='#B04848'`\n\n### 主题3 — 深蓝（科技/金融）\n```css\n:root{\n  --bg:#F0F4FA; --s1:#FFFFFF; --s2:#E8EEFA; --bd:#D0DAEE;\n  --c1:#2563EB; --c2:#F59E0B; --c3:#FBB040; --c4:#3B82F6;\n  --red:#DC2626; --t:#0F172A; --mu:#64748B; --mu2:#CBD5E1; --tx:#1E293B;\n}\n```\n- Hero: `background:linear-gradient(135deg,#1E3A8A,#1E40AF); border-bottom:3px solid #1A3570`\n- Tab:  `background:#1E4080; border-bottom:3px solid #1A3570`\n\n### 主题4 — 米棕（精品/餐饮/咖啡）\n```css\n:root{\n  --bg:#FAF8F4; --s1:#FFFFFF; --s2:#F4F0E8; --bd:#E4DCCB;\n  --c1:#8B6F47; --c2:#C4813D; --c3:#D4956A; --c4:#A08060;\n  --red:#A84040; --t:#2C1F12; --mu:#7A6550; --mu2:#D0C4B0; --tx:#3D2E1C;\n}\n```\n- Hero: `background:linear-gradient(135deg,#7A5A38,#5A3A20); border-bottom:3px solid #4A2A10`\n- Tab:  `background:#6B5540; border-bottom:3px solid #5A4530`\n\n### 主题5 — 深色（夜间/高端）\n```css\n:root{\n  --bg:#0F1A0D; --s1:#162014; --s2:#1E2E1A; --bd:#2A4024;\n  --c1:#4ADE80; --c2:#FB923C; --c3:#FACC15; --c4:#34D399;\n  --red:#F87171; --t:#D8F0D0; --mu:#7AAA68; --mu2:#2A4024; --tx:#C8E8C0;\n}\n```\n- Hero: `background:linear-gradient(135deg,#0D1F0A,#0F1A0D); border-bottom:3px solid #080F06`\n- Tab:  `background:#1A3020; border-bottom:3px solid #0D2018`\n- 热力图颜色需调整（深色背景）：使用更亮的颜色\n\n---\n\n## 2. 从Logo图片提取颜色\n\n运行 `scripts/extract_colors.py`：\n\n```bash\npython3 scripts/extract_colors.py /path/to/logo.png --output css\n```\n\n输出示例：\n```\n提取颜色: #7B5EA7 (主), #5B8DD9 (辅)\n:root {\n  --c1: #7B5EA7;\n  --c2: #5B8DD9;\n  ...\n}\n```\n\n---\n\n## 3. 从HEX/RGB手动构建主题\n\n给定主色 `primary` 和辅色 `accent`，套用如下规则：\n\n```\n--bg:  primary 极浅化 (lighten 90%+, desaturate)\n--s1:  #FFFFFF\n--s2:  primary 浅化 (lighten 85%)\n--bd:  primary 浅化 (lighten 70%)\n--c1:  primary  (主色，老用户/主指标/卡片左边条)\n--c2:  accent   (辅色，新用户/次指标/强调)\n--c3:  accent 浅一档\n--c4:  primary 浅一档\n--t:   非常深的同色系色（正文）\n--mu:  中灰偏主色调（次要文字）\n\nHero bg:  primary 深化渐变（-10% → -20% → -30% lightness）\nTab bg:   primary 深化 -20%\n```\n\nP"},{"path":"references/data-processing.md","content":"# 数据处理详细规范\n\n## 1. 字段识别\n\n### 自动映射规则（模糊匹配，优先级从高到低）\n\n```python\nFIELD_PATTERNS = {\n    'date': ['预订日期', '下单时间', '订单日期', '日期', 'date', 'order_date', 'created_at'],\n    'amount': ['订单最终金额', '实收金额', '实付金额', '订单金额', '金额', 'amount', 'price', 'total'],\n    'order_amount': ['订单金额', '原价', 'original_price'],\n    'user_id': ['手机号', '用户ID', '会员号', 'user_id', 'phone', 'member_id', 'customer_id'],\n    'item': ['场地', '商品', '服务', '项目', '品类', 'item', 'product', 'service', 'court'],\n    'slot': ['预订时段', '时段', '时间段', 'slot', 'time_slot', 'hour'],\n    'status': ['订单状态', '状态', 'status', 'order_status'],\n    'discount': ['优惠金额', '折扣', 'discount', 'coupon'],\n}\n\ndef detect_fields(df):\n    mapping = {}\n    for std_name, patterns in FIELD_PATTERNS.items():\n        for col in df.columns:\n            if any(p.lower() in col.lower() for p in patterns):\n                mapping[std_name] = col\n                break\n    return mapping\n```\n\n### 必须字段处理\n- `date`：缺失则报错，提示用户指定日期列\n- `amount`：缺失则尝试用 `order_amount` 代替，仍缺则只统计场次不统计收入\n- `user_id`：缺失则只做订单分析，跳过用户留存分析\n\n---\n\n## 2. 多行拆分（场馆/多项目场景）\n\n### 触发条件\n字段值包含 `;` 分隔符，如：\n- `场地`: `场地01;场地03`\n- `时段`: `08:00~09:00;09:00~10:00`\n\n### 拆分逻辑\n\n```python\nfrom itertools import product\n\ndef expand_row(row, item_col, slot_col):\n    items = str(row[item_col]).split(';') if item_col else ['unknown']\n    slots = str(row[slot_col]).split(';') if slot_col else ['unknown']\n    \n    # 判断展开模式\n    if len(items) == 1 or len(slots) == 1:\n        combos = list(product(items, slots))\n    else:\n        # 先尝试配对（1:1映射）\n        n = max(len(items), len(slots))\n        paired = [(items[min(i,len(items)-1)], slots[min(i,len(slots)-1)]) for i in range(n)]\n        # 验证配对总价是否接近原始金额\n        # 如不匹配则改用笛卡尔积\n        combos = paired  # 默认配对\n    \n    return combos\n\ndef split_amount(total, std_prices, total_std):\n    \"\"\"按标准单价比例分摊金额\"\"\"\n    if total_std == 0:\n        return [total / len(std_prices)] * len(std_prices)\n    return [total * p / total_std for p in std_prices]\n```\n\n---\n\n## 3. 核心指标计算规范\n\n### 3.1 时间处理\n\n```python\ndf['date'] = pd.to_datetime(df['date'], errors='coerce', infer_datetime_format=True)\ndf['month'] = df['date'].dt.to_period('M').astype(str)\ndf['day'] = df['date'].dt.day\ndf['weekday'] = df['date'].dt.weekday  # 0=周一, 6=周日\ndf['is_weekend'] = df['weekday'] >= 5\ndf['hour'] = df['date'].dt.hour  # 如果时段是时间戳\n# 如果时段是字符串如\"08:00~09:00\"，提取起始小时：\ndf['hour'] = df['slot'].str.extract(r'(\\d+):').astype(float)\n```\n\n### 3.2 月度日均指标（推荐口径，排除天数差异）\n\n```python\ndef calc_monthly(df, exclude_dates=None):\n    \"\"\"\n    exclude_dates: list of (month, day_start, day_end) tuples for lockout periods\n    e.g., [('2026-02', 15, 22)] for CNY lockout\n    \"\"\"\n    if exclude_dates:\n        for month, d1, d2 in exclude_dates:\n            mask = (df['month'] == month) & df['day'].between(d1, d2)\n            df = df[~mask]\n    \n    monthly = df.groupby('month').agg(\n        total_orders=('amount', 'count'),\n        total_rev=('amount', 'sum'),\n        active_users=('user_id', 'nunique'),\n        op_days=('date', la"}],"languages":[],"docsSourceLabel":"CLAWHUB","editorialOverview":"订单数据业务分析仪表盘生成器。当用户提供订单Excel/CSV数据（含日期、金额、用户ID、场地/商品、时段等字段），需要生成业务分析报告、经营诊断、用户留存/频次分析、时段热力图、趋势对比、运营方案时，使用本技能。适用场景：场馆运营（羽毛球/网球/篮球/游泳）、餐饮门店、零售订单、服务业预约等任何有订单记录的业务场景。支持自定义配色（上传Logo图片或提供HEX/RGB色值）或选择预设主题。触发词：订单分析、经营诊断、用户分析、场次分析、留存分析、趋势分析、运营仪表盘、业务报告、数据报告。 Skill: Order Analytics Owner: minibeanai Summary: 订单数据业务分析仪表盘生成器。当用户提供订单Excel/CSV数据（含日期、金额、用户ID、场地/商品、时段等字段），需要生成业务分析报告、经营诊断、用户留存/频次分析、时段热力图、趋势对比、运营方案时，使用本技能。适用场景：场馆运营（羽毛球/网球/篮球/游泳）、餐饮门店、零售订单、服务业预约等任何有订单记录的业务场景。支持自定义配色（上传Logo图片或提供HEX/RGB色值）或选择预设主题。触发词：订单分析、经营诊断、用户分析、场次分析、留存分析、趋势分析、运营仪表盘、业务报告、数据报告。 Tags: latest:0.1.0 Version history: v0.1.0 | 2026-07-25T16:26:48.892Z | auto order-analytics v0.1.0 — Initial Release - C","editorialQuality":{"score":100,"threshold":65,"status":"ready","wordCount":980,"uniquenessScore":61,"reasons":[]}},"media":{"evidence":{"source":"no-media","verified":false,"confidence":"low","updatedAt":"2026-10-09T10:24:40.288Z","emptyReason":"No screenshots, media assets, or demo links are available."},"primaryImageUrl":null,"mediaAssetCount":0,"assets":[],"demoUrl":null},"ownerResources":{"evidence":{"source":"unclaimed","verified":false,"confidence":"low","updatedAt":"2026-10-09T10:24:40.288Z","emptyReason":"This page has not been claimed by the agent owner."},"hasCustomPage":false,"customPageUpdatedAt":null,"customLinks":[],"structuredLinks":{"docsUrl":null,"demoUrl":null,"supportUrl":null,"pricingUrl":null,"statusUrl":null},"customPage":null},"relatedAgents":{"evidence":{"source":"protocol-neighbors","verified":false,"confidence":"medium","updatedAt":"2026-10-09T18:41:14.327Z","emptyReason":null},"items":[{"id":"b917f68a-ebff-438e-84f8-3f4b2494c0bc","entityType":"agent","canonicalPath":"/agent/activepieces-activepieces","slug":"activepieces-activepieces","name":"activepieces","description":"AI Agents & MCPs & AI Workflow Automation • (~400 MCP servers for AI agents) • AI Automation / AI Agent with MCPs • AI Workflows & AI Agents • MCPs for AI Agents","url":"https://github.com/activepieces/activepieces","homepage":"https://www.activepieces.com","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-15T02:22:12.426Z","createdAt":"2026-02-25T03:38:12.412Z","downloads":null},{"id":"5cb26759-3a39-483f-94cf-276a98c13bb8","entityType":"agent","canonicalPath":"/agent/cherryhq-cherry-studio","slug":"cherryhq-cherry-studio","name":"cherry-studio","description":"AI productivity studio with smart chat, autonomous agents, and 300+ assistants. Unified access to frontier LLMs","url":"https://github.com/CherryHQ/cherry-studio","homepage":"https://cherry-ai.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-11T14:38:40.986Z","createdAt":"2026-02-25T03:38:19.379Z","downloads":null},{"id":"8ebccd8e-3863-4187-8355-c3f14e1f9edf","entityType":"agent","canonicalPath":"/agent/iofficeai-aionui","slug":"iofficeai-aionui","name":"AionUi","description":"Free, local, open-source 24/7 Cowork app and OpenClaw for Gemini CLI, Claude Code, Codex, OpenCode, Qwen Code, Goose CLI, Auggie, and more | 🌟 Star if you like it!","url":"https://github.com/iOfficeAI/AionUi","homepage":"https://www.aionui.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-10T18:48:31.762Z","createdAt":"2026-02-25T03:38:16.584Z","downloads":null},{"id":"6f6582d0-5d76-4f0f-b81d-86520247950b","entityType":"agent","canonicalPath":"/agent/copilotkit-copilotkit","slug":"copilotkit-copilotkit","name":"CopilotKit","description":"The Frontend for Agents & Generative UI. React + Angular","url":"https://github.com/CopilotKit/CopilotKit","homepage":"https://docs.copilotkit.ai","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-03-25T09:50:57.846Z","createdAt":"2026-02-25T03:39:14.617Z","downloads":null}],"links":{"hub":"/agent","source":"/agent/source/clawhub","protocols":[{"label":"OpenClaw","href":"/agent/protocol/openclew"}]}}}