[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6EERTYFJNGW657XW2VP48F5":3,"skill-same:01M6EERTYFJNGW657XW2VP48F5":45},{"skillNo":4,"name":5,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":15,"categories":16,"keywords":17,"publishedAt":18,"linkOnly":19,"markdownContent":20,"markdownBody":20,"frontMatter":21,"refName":22,"commitSha":23,"skillDirectory":24,"forksCount":25,"repositoryHtmlUrl":26,"repositoryHomepageUrl":27,"ownerHtmlUrl":28,"ownerBlogUrl":6,"ownerDescription":29,"updatedAt":30,"install":31,"resources":44},"01M6EERTYFJNGW657XW2VP48F5","dagster",null,"ComeOnOliver\u002Fskillshub","ComeOnOliver","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F43215937?v=4","01M6E5JNFECJAAVFE0W7SMWWD2","Haoran Shu","01M6E5JNNDQS7AJZDYFQ8TPZCK",67,"MIT","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002FTerminalSkills\u002Fskills\u002Fdagster\u002FSKILL.md",[],[5],"2026-11-10 10:12:30",false,"# Dagster\n\nDagster organizes data pipelines around software-defined assets — declarations of the data artifacts your pipeline produces. Assets track lineage, enable incremental computation, and integrate with the Dagster UI.\n\n## Installation\n\n```bash\n# Install Dagster and UI\npip install dagster dagster-webserver\n\n# Create a new project\ndagster project scaffold --name my_pipeline\ncd my_pipeline\npip install -e \".[dev]\"\n\n# Start the dev server\ndagster dev\n# UI at http:\u002F\u002Flocalhost:3000\n```\n\n## Software-Defined Assets\n\n```python\n# my_pipeline\u002Fassets.py: Define assets that produce data\nfrom dagster import asset, AssetExecutionContext\nimport pandas as pd\n\n@asset(group_name=\"raw\")\ndef raw_users(context: AssetExecutionContext) -> pd.DataFrame:\n    \"\"\"Fetch raw user data from API.\"\"\"\n    import httpx\n    response = httpx.get(\"https:\u002F\u002Fapi.example.com\u002Fusers\")\n    df = pd.DataFrame(response.json())\n    context.log.info(f\"Fetched {len(df)} users\")\n    return df\n\n@asset(group_name=\"raw\")\ndef raw_orders(context: AssetExecutionContext) -> pd.DataFrame:\n    \"\"\"Fetch raw order data from API.\"\"\"\n    import httpx\n    response = httpx.get(\"https:\u002F\u002Fapi.example.com\u002Forders\")\n    return pd.DataFrame(response.json())\n\n@asset(group_name=\"analytics\", deps=[raw_users, raw_orders])\ndef revenue_by_user(raw_users: pd.DataFrame, raw_orders: pd.DataFrame) -> pd.DataFrame:\n    \"\"\"Calculate total revenue per user.\"\"\"\n    merged = raw_orders.merge(raw_users, left_on=\"user_id\", right_on=\"id\")\n    result = (\n        merged.groupby([\"user_id\", \"name\"])\n        .agg(total_revenue=(\"amount\", \"sum\"), order_count=(\"id_x\", \"count\"))\n        .reset_index()\n    )\n    return result\n```\n\n## Resources\n\n```python\n# my_pipeline\u002Fresources.py: Configurable resources for external systems\nfrom dagster import resource, ConfigurableResource\nimport sqlalchemy\n\nclass DatabaseResource(ConfigurableResource):\n    connection_string: str\n\n    def query(self, sql: str) -> list:\n        engine = sqlalchemy.create_engine(self.connection_string)\n        with engine.connect() as conn:\n            result = conn.execute(sqlalchemy.text(sql))\n            return [dict(row._mapping) for row in result]\n\n    def execute(self, sql: str):\n        engine = sqlalchemy.create_engine(self.connection_string)\n        with engine.connect() as conn:\n            conn.execute(sqlalchemy.text(sql))\n            conn.commit()\n```\n\n## Assets with Resources\n\n```python\n# my_pipeline\u002Fdb_assets.py: Assets that use database resources\nfrom dagster import asset, AssetExecutionContext\nfrom .resources import DatabaseResource\n\n@asset(group_name=\"warehouse\")\ndef dim_users(context: AssetExecutionContext, database: DatabaseResource):\n    \"\"\"Load cleaned user dimension table into warehouse.\"\"\"\n    users = database.query(\"SELECT id, name, email, created_at FROM raw_users\")\n    context.log.info(f\"Loaded {len(users)} users into warehouse\")\n    return users\n```\n\n## Definitions\n\n```python\n# my_pipeline\u002F__init__.py: Wire everything together\nfrom dagster import Definitions, load_assets_from_modules\nfrom . import assets, db_assets\nfrom .resources import DatabaseResource\n\nall_assets = load_assets_from_modules([assets, db_assets])\n\ndefs = Definitions(\n    assets=all_assets,\n    resources={\n        \"database\": DatabaseResource(\n            connection_string=\"postgresql:\u002F\u002Fuser:pass@localhost:5432\u002Fanalytics\"\n        ),\n    },\n)\n```\n\n## Schedules and Sensors\n\n```python\n# my_pipeline\u002Fschedules.py: Time-based and event-based triggers\nfrom dagster import (\n    ScheduleDefinition,\n    define_asset_job,\n    sensor,\n    RunRequest,\n    SensorEvaluationContext,\n    AssetSelection,\n)\n\n# Job that materializes specific assets\nanalytics_job = define_asset_job(\n    name=\"analytics_job\",\n    selection=AssetSelection.groups(\"analytics\"),\n)\n\n# Cron schedule\ndaily_analytics = ScheduleDefinition(\n    job=analytics_job,\n    cron_schedule=\"0 6 * * *\",  # 6 AM daily\n)\n\n# Sensor — trigger on external event\n@sensor(job=analytics_job, minimum_interval_seconds=60)\ndef new_file_sensor(context: SensorEvaluationContext):\n    import os\n    files = os.listdir(\"\u002Fdata\u002Fincoming\")\n    new_files = [f for f in files if f.endswith(\".csv\")]\n    if new_files:\n        context.log.info(f\"Found {len(new_files)} new files\")\n        yield RunRequest(run_key=new_files[0])\n```\n\n## Partitioned Assets\n\n```python\n# my_pipeline\u002Fpartitioned.py: Time-partitioned assets for incremental processing\nfrom dagster import asset, DailyPartitionsDefinition\n\ndaily_partitions = DailyPartitionsDefinition(start_date=\"2026-01-01\")\n\n@asset(partitions_def=daily_partitions, group_name=\"raw\")\ndef daily_events(context):\n    \"\"\"Fetch events for a specific date partition.\"\"\"\n    date = context.partition_key  # e.g., \"2026-02-19\"\n    context.log.info(f\"Processing events for {date}\")\n    # Fetch only this date's data\n    return fetch_events(date)\n```\n\n## CLI Reference\n\n```bash\n# cli.sh: Common Dagster CLI commands\n# Development server\ndagster dev\n\n# Materialize assets\ndagster asset materialize --select raw_users,raw_orders\n\n# List assets\ndagster asset list\n\n# Run a job\ndagster job execute -j analytics_job\n\n# Check definitions\ndagster definitions validate\n```\n",{},"main","def8531e65114c0fca8fb8551c1871ee0eed705c","skills\u002FTerminalSkills\u002Fskills\u002Fdagster",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":7,"skillName":5,"commands":32,"prompt":42,"zipAvailable":43},[33,36,39],{"tool":34,"command":35},"npx","npx skills add ComeOnOliver\u002Fskillshub --skill dagster",{"tool":37,"command":38},"bunx","bunx skills add ComeOnOliver\u002Fskillshub --skill dagster",{"tool":40,"command":41},"pnpm","pnpm dlx skills add ComeOnOliver\u002Fskillshub --skill dagster","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002FTerminalSkills\u002Fskills\u002Fdagster\u002FSKILL.md",true,[],[46,60,70,79,85,92],{"skillNo":47,"name":48,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":49,"categories":50,"keywords":56,"publishedAt":18},"01M6FKJN13GMG4KY57J3QD8GY5","model-hierarchy-skill","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzscole\u002Fmodel-hierarchy-skill\u002Fmodel-hierarchy-skill\u002FSKILL.md",[51],{"categoryNo":52,"categoryName":53,"taxonomyType":54,"taxonomyTypeDesc":55},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",[57,58,59],"model","model hierarchy","model hierarchy skill",{"skillNo":61,"name":62,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":63,"categories":64,"keywords":66,"publishedAt":18},"01M6FKJJJ6GCAMR4PPPRD12M5X","zoom-mcp","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fzoom-mcp\u002FSKILL.md",[65],{"categoryNo":52,"categoryName":53,"taxonomyType":54,"taxonomyTypeDesc":55},[67,68,69],"MCP","zoom","zoom mcp",{"skillNo":71,"name":72,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":73,"categories":74,"keywords":75,"publishedAt":18},"01M6FKJE3KYT3KPEZMEEHYKA6K","zoom-apps-sdk","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fzoom-apps-sdk\u002FSKILL.md",[],[76,77,78,68],"sdk","zoom apps sdk","apps",{"skillNo":80,"name":81,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":82,"categories":83,"keywords":84,"publishedAt":18},"01M6FKJ9EDH9Q5VWDF8HAJRSP0","windows","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwindows\u002FSKILL.md",[],[81],{"skillNo":86,"name":87,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":88,"categories":89,"keywords":91,"publishedAt":18},"01M6FKJ666BEEFC3AE9GJ72Q93","whiteboard","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwhiteboard\u002FSKILL.md",[90],{"categoryNo":52,"categoryName":53,"taxonomyType":54,"taxonomyTypeDesc":55},[87],{"skillNo":93,"name":94,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":95,"categories":96,"keywords":97,"publishedAt":18},"01M6FKJ21WFCDGTJQ2Q91T9DVW","websockets","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwebsockets\u002FSKILL.md",[],[94]]