[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6F88ZK0YRSC2ZDX3TZBB0DB":3,"skill-same:01M6F88ZK0YRSC2ZDX3TZBB0DB":81},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":23,"publishedAt":44,"linkOnly":45,"markdownContent":46,"markdownBody":47,"frontMatter":48,"refName":58,"commitSha":59,"skillDirectory":60,"forksCount":61,"repositoryHtmlUrl":62,"repositoryHomepageUrl":63,"ownerHtmlUrl":64,"ownerBlogUrl":6,"ownerDescription":65,"updatedAt":66,"install":67,"resources":80},"01M6F88ZK0YRSC2ZDX3TZBB0DB","clari-core-workflow-a",null,"Build a Clari forecast export pipeline to your data warehouse.\nUse when exporting forecast calls, quota data, and CRM totals\nfrom Clari to Snowflake, BigQuery, or a local database.\nTrigger with phrases like \"clari forecast export\", \"clari data pipeline\",\n\"clari to snowflake\", \"clari to bigquery\", \"export clari data\".","ComeOnOliver\u002Fskillshub","ComeOnOliver","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F43215937?v=4","01M6E5JNFECJAAVFE0W7SMWWD2","Haoran Shu","01M6E5JNNDQS7AJZDYFQ8TPZCK",66,"MIT","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fjeremylongshore\u002Fclaude-code-plugins-plus-skills\u002Fclari-core-workflow-a\u002FSKILL.md",[18],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",[24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43],"core","clari core workflow a","clari","workflow","edit","code","revenue","io","local","intelligence","crm","export","data pipeline","write","read","Bash","pipeline","data","snowflake","database","2026-11-10 10:12:30",false,"---\nname: clari-core-workflow-a\ndescription: |\n  Build a Clari forecast export pipeline to your data warehouse.\n  Use when exporting forecast calls, quota data, and CRM totals\n  from Clari to Snowflake, BigQuery, or a local database.\n  Trigger with phrases like \"clari forecast export\", \"clari data pipeline\",\n  \"clari to snowflake\", \"clari to bigquery\", \"export clari data\".\nallowed-tools: Read, Write, Edit, Bash(python3:*), Bash(curl:*), Grep\nversion: 1.0.0\nlicense: MIT\nauthor: Jeremy Longshore \u003Cjeremy@intentsolutions.io>\ntags: [saas, revenue-intelligence, forecasting, clari]\ncompatible-with: claude-code\n---\n\n# Clari Core Workflow: Forecast Export Pipeline\n\n## Overview\n\nPrimary workflow: build an automated pipeline that exports forecast submissions, quota, adjustments, and CRM data from Clari to your data warehouse. Supports Snowflake, BigQuery, and PostgreSQL as targets.\n\n## Prerequisites\n\n- Completed `clari-install-auth` and `clari-sdk-patterns` setup\n- Target database or data warehouse with write access\n- Python 3.10+ with `requests` and your DB driver\n\n## Instructions\n\n### Step 1: Define Export Configuration\n\n```python\n# config.py\nfrom dataclasses import dataclass\n\n@dataclass\nclass ExportConfig:\n    forecast_name: str          # From Clari forecast list\n    time_periods: list[str]     # e.g., [\"2026_Q1\", \"2025_Q4\"]\n    export_types: list[str] = None\n    currency: str = \"USD\"\n    include_historical: bool = True\n\n    def __post_init__(self):\n        if self.export_types is None:\n            self.export_types = [\n                \"forecast\",           # Submitted forecast call\n                \"forecast_updated\",   # Updated forecast history\n                \"quota\",              # Quota values\n                \"adjustment\",         # Manager adjustments\n                \"crm_total\",          # Total CRM pipeline\n                \"crm_closed\",         # Closed-won CRM amounts\n            ]\n```\n\n### Step 2: Build the Export Pipeline\n\n```python\n# export_pipeline.py\nfrom clari_client import ClariClient\nfrom config import ExportConfig\nimport json\nfrom datetime import datetime\n\ndef run_export(config: ExportConfig) -> list[dict]:\n    client = ClariClient()\n    all_entries = []\n\n    for period in config.time_periods:\n        print(f\"Exporting {config.forecast_name} for {period}...\")\n\n        data = client.export_and_download(\n            forecast_name=config.forecast_name,\n            time_period=period,\n        )\n\n        entries = data.get(\"entries\", [])\n        for entry in entries:\n            entry[\"_exported_at\"] = datetime.utcnow().isoformat()\n            entry[\"_forecast_name\"] = config.forecast_name\n\n        all_entries.extend(entries)\n        print(f\"  {len(entries)} records exported\")\n\n    return all_entries\n\ndef transform_forecast_data(entries: list[dict]) -> dict:\n    total_forecast = sum(e.get(\"forecastAmount\", 0) for e in entries)\n    total_quota = sum(e.get(\"quotaAmount\", 0) for e in entries)\n    total_closed = sum(e.get(\"crmClosed\", 0) for e in entries)\n\n    return {\n        \"total_forecast\": total_forecast,\n        \"total_quota\": total_quota,\n        \"total_closed\": total_closed,\n        \"attainment_percent\": (total_closed \u002F total_quota * 100) if total_quota else 0,\n        \"coverage_ratio\": (total_forecast \u002F total_quota) if total_quota else 0,\n        \"rep_count\": len(entries),\n        \"reps\": entries,\n    }\n```\n\n### Step 3: Load to Snowflake\n\n```python\n# load_snowflake.py\nimport snowflake.connector\n\ndef load_to_snowflake(entries: list[dict], table: str = \"CLARI_FORECASTS\"):\n    conn = snowflake.connector.connect(\n        account=os.environ[\"SNOWFLAKE_ACCOUNT\"],\n        user=os.environ[\"SNOWFLAKE_USER\"],\n        password=os.environ[\"SNOWFLAKE_PASSWORD\"],\n        database=\"REVENUE_DATA\",\n        schema=\"CLARI\",\n    )\n\n    cursor = conn.cursor()\n    cursor.execute(f\"\"\"\n        CREATE TABLE IF NOT EXISTS {table} (\n            owner_name VARCHAR,\n            owner_email VARCHAR,\n            forecast_amount FLOAT,\n            quota_amount FLOAT,\n            crm_total FLOAT,\n            crm_closed FLOAT,\n            adjustment_amount FLOAT,\n            time_period VARCHAR,\n            exported_at TIMESTAMP,\n            forecast_name VARCHAR\n        )\n    \"\"\")\n\n    for entry in entries:\n        cursor.execute(f\"\"\"\n            INSERT INTO {table} VALUES (\n                %(ownerName)s, %(ownerEmail)s, %(forecastAmount)s,\n                %(quotaAmount)s, %(crmTotal)s, %(crmClosed)s,\n                %(adjustmentAmount)s, %(timePeriod)s,\n                %(_exported_at)s, %(_forecast_name)s\n            )\n        \"\"\", entry)\n\n    conn.commit()\n    print(f\"Loaded {len(entries)} records to {table}\")\n```\n\n### Step 4: Schedule with Cron or Airflow\n\n```python\n# Run daily export\nif __name__ == \"__main__\":\n    config = ExportConfig(\n        forecast_name=\"company_forecast\",\n        time_periods=[\"2026_Q1\"],\n    )\n    entries = run_export(config)\n    summary = transform_forecast_data(entries)\n    print(f\"Pipeline complete: {summary['rep_count']} reps, \"\n          f\"${summary['total_forecast']:,.0f} forecast, \"\n          f\"{summary['attainment_percent']:.1f}% attainment\")\n    load_to_snowflake(entries)\n```\n\n## Error Handling\n\n| Error | Cause | Solution |\n|-------|-------|----------|\n| Empty entries | No submitted forecasts for period | Verify period has data in Clari UI |\n| Job timeout | Large export | Increase `max_poll_attempts` |\n| Snowflake auth error | Wrong credentials | Check env vars |\n| Duplicate records | Re-run without dedup | Add upsert logic with `MERGE` |\n\n## Resources\n\n- [Clari Export API](https:\u002F\u002Fdeveloper.clari.com\u002Fdocumentation\u002Fexternal_spec)\n- [Snowflake Python Connector](https:\u002F\u002Fdocs.snowflake.com\u002Fen\u002Fdeveloper-guide\u002Fpython-connector)\n\n## Next Steps\n\nFor pipeline analytics and deal inspection, see `clari-core-workflow-b`.\n\n","# Clari Core Workflow: Forecast Export Pipeline\n\n## Overview\n\nPrimary workflow: build an automated pipeline that exports forecast submissions, quota, adjustments, and CRM data from Clari to your data warehouse. Supports Snowflake, BigQuery, and PostgreSQL as targets.\n\n## Prerequisites\n\n- Completed `clari-install-auth` and `clari-sdk-patterns` setup\n- Target database or data warehouse with write access\n- Python 3.10+ with `requests` and your DB driver\n\n## Instructions\n\n### Step 1: Define Export Configuration\n\n```python\n# config.py\nfrom dataclasses import dataclass\n\n@dataclass\nclass ExportConfig:\n    forecast_name: str          # From Clari forecast list\n    time_periods: list[str]     # e.g., [\"2026_Q1\", \"2025_Q4\"]\n    export_types: list[str] = None\n    currency: str = \"USD\"\n    include_historical: bool = True\n\n    def __post_init__(self):\n        if self.export_types is None:\n            self.export_types = [\n                \"forecast\",           # Submitted forecast call\n                \"forecast_updated\",   # Updated forecast history\n                \"quota\",              # Quota values\n                \"adjustment\",         # Manager adjustments\n                \"crm_total\",          # Total CRM pipeline\n                \"crm_closed\",         # Closed-won CRM amounts\n            ]\n```\n\n### Step 2: Build the Export Pipeline\n\n```python\n# export_pipeline.py\nfrom clari_client import ClariClient\nfrom config import ExportConfig\nimport json\nfrom datetime import datetime\n\ndef run_export(config: ExportConfig) -> list[dict]:\n    client = ClariClient()\n    all_entries = []\n\n    for period in config.time_periods:\n        print(f\"Exporting {config.forecast_name} for {period}...\")\n\n        data = client.export_and_download(\n            forecast_name=config.forecast_name,\n            time_period=period,\n        )\n\n        entries = data.get(\"entries\", [])\n        for entry in entries:\n            entry[\"_exported_at\"] = datetime.utcnow().isoformat()\n            entry[\"_forecast_name\"] = config.forecast_name\n\n        all_entries.extend(entries)\n        print(f\"  {len(entries)} records exported\")\n\n    return all_entries\n\ndef transform_forecast_data(entries: list[dict]) -> dict:\n    total_forecast = sum(e.get(\"forecastAmount\", 0) for e in entries)\n    total_quota = sum(e.get(\"quotaAmount\", 0) for e in entries)\n    total_closed = sum(e.get(\"crmClosed\", 0) for e in entries)\n\n    return {\n        \"total_forecast\": total_forecast,\n        \"total_quota\": total_quota,\n        \"total_closed\": total_closed,\n        \"attainment_percent\": (total_closed \u002F total_quota * 100) if total_quota else 0,\n        \"coverage_ratio\": (total_forecast \u002F total_quota) if total_quota else 0,\n        \"rep_count\": len(entries),\n        \"reps\": entries,\n    }\n```\n\n### Step 3: Load to Snowflake\n\n```python\n# load_snowflake.py\nimport snowflake.connector\n\ndef load_to_snowflake(entries: list[dict], table: str = \"CLARI_FORECASTS\"):\n    conn = snowflake.connector.connect(\n        account=os.environ[\"SNOWFLAKE_ACCOUNT\"],\n        user=os.environ[\"SNOWFLAKE_USER\"],\n        password=os.environ[\"SNOWFLAKE_PASSWORD\"],\n        database=\"REVENUE_DATA\",\n        schema=\"CLARI\",\n    )\n\n    cursor = conn.cursor()\n    cursor.execute(f\"\"\"\n        CREATE TABLE IF NOT EXISTS {table} (\n            owner_name VARCHAR,\n            owner_email VARCHAR,\n            forecast_amount FLOAT,\n            quota_amount FLOAT,\n            crm_total FLOAT,\n            crm_closed FLOAT,\n            adjustment_amount FLOAT,\n            time_period VARCHAR,\n            exported_at TIMESTAMP,\n            forecast_name VARCHAR\n        )\n    \"\"\")\n\n    for entry in entries:\n        cursor.execute(f\"\"\"\n            INSERT INTO {table} VALUES (\n                %(ownerName)s, %(ownerEmail)s, %(forecastAmount)s,\n                %(quotaAmount)s, %(crmTotal)s, %(crmClosed)s,\n                %(adjustmentAmount)s, %(timePeriod)s,\n                %(_exported_at)s, %(_forecast_name)s\n            )\n        \"\"\", entry)\n\n    conn.commit()\n    print(f\"Loaded {len(entries)} records to {table}\")\n```\n\n### Step 4: Schedule with Cron or Airflow\n\n```python\n# Run daily export\nif __name__ == \"__main__\":\n    config = ExportConfig(\n        forecast_name=\"company_forecast\",\n        time_periods=[\"2026_Q1\"],\n    )\n    entries = run_export(config)\n    summary = transform_forecast_data(entries)\n    print(f\"Pipeline complete: {summary['rep_count']} reps, \"\n          f\"${summary['total_forecast']:,.0f} forecast, \"\n          f\"{summary['attainment_percent']:.1f}% attainment\")\n    load_to_snowflake(entries)\n```\n\n## Error Handling\n\n| Error | Cause | Solution |\n|-------|-------|----------|\n| Empty entries | No submitted forecasts for period | Verify period has data in Clari UI |\n| Job timeout | Large export | Increase `max_poll_attempts` |\n| Snowflake auth error | Wrong credentials | Check env vars |\n| Duplicate records | Re-run without dedup | Add upsert logic with `MERGE` |\n\n## Resources\n\n- [Clari Export API](https:\u002F\u002Fdeveloper.clari.com\u002Fdocumentation\u002Fexternal_spec)\n- [Snowflake Python Connector](https:\u002F\u002Fdocs.snowflake.com\u002Fen\u002Fdeveloper-guide\u002Fpython-connector)\n\n## Next Steps\n\nFor pipeline analytics and deal inspection, see `clari-core-workflow-b`.\n\n",{"name":5,"tags":49,"author":53,"license":15,"version":54,"description":55,"allowed-tools":56,"compatible-with":57},[50,51,52,26],"saas","revenue-intelligence","forecasting","Jeremy Longshore \u003Cjeremy@intentsolutions.io>","1.0.0","Build a Clari forecast export pipeline to your data warehouse.\nUse when exporting forecast calls, quota data, and CRM totals\nfrom Clari to Snowflake, BigQuery, or a local database.\nTrigger with phrases like \"clari forecast export\", \"clari data pipeline\",\n\"clari to snowflake\", \"clari to bigquery\", \"export clari data\".\n","Read, Write, Edit, Bash(python3:*), Bash(curl:*), Grep","claude-code","main","def8531e65114c0fca8fb8551c1871ee0eed705c","skills\u002Fjeremylongshore\u002Fclaude-code-plugins-plus-skills\u002Fclari-core-workflow-a",24,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub","https:\u002F\u002Fskillshub.wtf","https:\u002F\u002Fgithub.com\u002FComeOnOliver","AI & Blockchain Engineer\r\n","2026-06-24 22:07:19",{"source":8,"skillName":5,"commands":68,"prompt":78,"zipAvailable":79},[69,72,75],{"tool":70,"command":71},"npx","npx skills add ComeOnOliver\u002Fskillshub --skill clari-core-workflow-a",{"tool":73,"command":74},"bunx","bunx skills add ComeOnOliver\u002Fskillshub --skill clari-core-workflow-a",{"tool":76,"command":77},"pnpm","pnpm dlx skills add ComeOnOliver\u002Fskillshub --skill clari-core-workflow-a","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fjeremylongshore\u002Fclaude-code-plugins-plus-skills\u002Fclari-core-workflow-a\u002FSKILL.md",true,[],[82,92,102,111,117,124],{"skillNo":83,"name":84,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":85,"categories":86,"keywords":88,"publishedAt":44},"01M6FKJN13GMG4KY57J3QD8GY5","model-hierarchy-skill","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzscole\u002Fmodel-hierarchy-skill\u002Fmodel-hierarchy-skill\u002FSKILL.md",[87],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},[89,90,91],"model","model hierarchy","model hierarchy skill",{"skillNo":93,"name":94,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":95,"categories":96,"keywords":98,"publishedAt":44},"01M6FKJJJ6GCAMR4PPPRD12M5X","zoom-mcp","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fzoom-mcp\u002FSKILL.md",[97],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},[99,100,101],"MCP","zoom","zoom mcp",{"skillNo":103,"name":104,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":105,"categories":106,"keywords":107,"publishedAt":44},"01M6FKJE3KYT3KPEZMEEHYKA6K","zoom-apps-sdk","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fzoom-apps-sdk\u002FSKILL.md",[],[108,109,110,100],"sdk","zoom apps sdk","apps",{"skillNo":112,"name":113,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":114,"categories":115,"keywords":116,"publishedAt":44},"01M6FKJ9EDH9Q5VWDF8HAJRSP0","windows","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwindows\u002FSKILL.md",[],[113],{"skillNo":118,"name":119,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":120,"categories":121,"keywords":123,"publishedAt":44},"01M6FKJ666BEEFC3AE9GJ72Q93","whiteboard","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwhiteboard\u002FSKILL.md",[122],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},[119],{"skillNo":125,"name":126,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":127,"categories":128,"keywords":129,"publishedAt":44},"01M6FKJ21WFCDGTJQ2Q91T9DVW","websockets","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwebsockets\u002FSKILL.md",[],[126]]