[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6KD973AENA2NPGCSCESS3EN":3,"skill-same:01M6KD973AENA2NPGCSCESS3EN":60},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":15,"categories":16,"keywords":22,"publishedAt":33,"linkOnly":34,"markdownContent":35,"markdownBody":36,"frontMatter":37,"refName":38,"commitSha":39,"skillDirectory":40,"forksCount":41,"repositoryHtmlUrl":42,"repositoryHomepageUrl":43,"ownerHtmlUrl":44,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":45,"install":46,"resources":59},"01M6KD973AENA2NPGCSCESS3EN","meeting-request-parsing",null,"Parse meeting request emails from JSON format and extract duration and time constraints","cxcscmu\u002FSkillLearnBench","cxcscmu","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F142838272?v=4","01M6KCQDFQWPDSN0MKZY96MSQP","01M6KCQDM7G70TKJ28NTSQC0RZ",92,"MIT","https:\u002F\u002Fgithub.com\u002Fcxcscmu\u002FSkillLearnBench\u002Fblob\u002Fmain\u002Fskills\u002Fb1-one-shot-claude-haiku-4-5\u002Fschedule-planning\u002Fmeeting-request-parsing\u002FSKILL.md",[17],{"categoryNo":18,"categoryName":19,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000034","行政与办公人员","PROFESSION","适用职业",[23,24,25,26,27,28,29,30,31,32],"parsing","meeting","request","meeting request parsing","constraints","json","format","extract","time","emails","2026-11-10 10:12:30",false,"---\nname: meeting-request-parsing\ndescription: Parse meeting request emails from JSON format and extract duration and time constraints\n---\n\n# Meeting Request Parsing Skill\n\n## Overview\nThis skill covers parsing JSON-formatted meeting request emails to extract key scheduling information: meeting duration, date constraints, time window constraints, and sender email.\n\n## Key Concepts\n\n### Meeting Request Structure\nTypical meeting request contains:\n- **Duration**: stated explicitly (e.g., \"one-hour\", \"1.5 hour\")\n- **Date**: specific date requested\n- **Time Window**: earliest and latest times when person is available\n- **Time Zone**: explicitly stated or inferred\n- **Sender**: email address for reply\n\n### Email Text Parsing Patterns\nCommon patterns in email bodies:\n- Duration: \"one-hour meeting\", \"1.5 hour\", \"45-minute\", \"30 min\"\n- Date: \"March 9th, 2026\", \"March 9, 2026\", \"on March 9\"\n- Availability: \"available from 10am to 2pm\", \"between 1:00 PM and 5:00 PM\"\n- Time zone: \"PST\", \"EST\", \"UTC-8\", etc.\n\n## Code Examples\n\n### JSON Loading and Basic Parsing\n```python\nimport json\nimport re\n\n# Load email requests\nwith open('\u002Froot\u002Ftest_input.json') as f:\n    requests = json.load(f)\n\nfor request in requests:\n    email_text = request['email_text']\n    sender = request['from_email']\n    print(f\"From: {sender}\")\n    print(f\"Body: {email_text}\")\n```\n\n### Extracting Duration\n```python\ndef extract_duration(email_text):\n    \"\"\"Extract meeting duration in hours\"\"\"\n    # Match patterns: \"one-hour\", \"1 hour\", \"1.5 hours\", \"45 minute\", \"30 min\"\n    patterns = [\n        r'(\\d+\\.?\\d*)\\s*hour',\n        r'(\\d+)\\s*minute',\n        r'(\\d+)\\s*min(?!ute)',\n    ]\n\n    for pattern in patterns:\n        match = re.search(pattern, email_text, re.IGNORECASE)\n        if match:\n            duration_str = match.group(1)\n            if 'minute' in pattern:\n                return float(duration_str) \u002F 60  # Convert minutes to hours\n            else:\n                return float(duration_str)\n\n    # Handle written-out numbers\n    if 'one hour' in email_text.lower():\n        return 1.0\n    if 'one and a half' in email_text.lower() or '1.5 hour' in email_text.lower():\n        return 1.5\n\n    return None\n```\n\n### Extracting Date\n```python\nfrom datetime import datetime\n\ndef extract_date(email_text):\n    \"\"\"Extract meeting date from email\"\"\"\n    # Match patterns: \"March 9th, 2026\", \"March 9, 2026\", \"on March 9\"\n    pattern = r'(January|February|March|April|May|June|July|August|September|October|November|December)\\s+(\\d{1,2})(?:st|nd|rd|th)?,?\\s+(\\d{4})'\n\n    match = re.search(pattern, email_text, re.IGNORECASE)\n    if match:\n        month_str, day_str, year_str = match.groups()\n        date_obj = datetime.strptime(f'{month_str} {day_str} {year_str}', '%B %d %Y')\n        return date_obj\n\n    return None\n```\n\n### Extracting Time Window\n```python\ndef extract_time_window(email_text):\n    \"\"\"Extract available time window (earliest to latest)\"\"\"\n    # Match patterns: \"from 10:00am to 2:00pm\", \"between 1:00 PM and 5:00 PM\"\n    pattern = r'(?:from|between)\\s+(\\d{1,2}):?(\\d{2})?\\s*(?:AM|PM|am|pm)?\\s+(?:to|and)\\s+(\\d{1,2}):?(\\d{2})?\\s*(AM|PM|am|pm|PST|EST|UTC-\\d+)?'\n\n    match = re.search(pattern, email_text, re.IGNORECASE)\n    if match:\n        start_hour, start_min, end_hour, end_min, tz = match.groups()\n        start_hour = int(start_hour)\n        end_hour = int(end_hour)\n        start_min = int(start_min) if start_min else 0\n        end_min = int(end_min) if end_min else 0\n\n        return {\n            'start': (start_hour, start_min),\n            'end': (end_hour, end_min),\n            'timezone': tz.upper() if tz else None\n        }\n\n    return None\n```\n\n### Complete Request Parsing\n```python\ndef parse_meeting_request(request_dict):\n    \"\"\"Parse a complete meeting request\"\"\"\n    email_text = request_dict['email_text']\n    sender = request_dict['from_email']\n\n    duration_hours = extract_duration(email_text)\n    date = extract_date(email_text)\n    time_window = extract_time_window(email_text)\n\n    return {\n        'sender': sender,\n        'duration_hours': duration_hours,\n        'requested_date': date,\n        'available_times': time_window,\n        'raw_text': email_text\n    }\n```\n\n## Time Zone Handling\n```python\ndef normalize_timezone(tz_string):\n    \"\"\"Normalize timezone to standard format\"\"\"\n    tz_map = {\n        'PST': 'US\u002FPacific',\n        'EST': 'US\u002FEastern',\n        'CST': 'US\u002FCentral',\n        'MST': 'US\u002FMountain'\n    }\n    return tz_map.get(tz_string, tz_string)\n\ndef convert_time_zones(start_hour, start_min, from_tz, to_tz):\n    \"\"\"Convert time from one timezone to another\"\"\"\n    from datetime import datetime, timezone\n    import pytz\n\n    # Create a datetime in source timezone\n    src_tz = pytz.timezone(from_tz)\n    dst_tz = pytz.timezone(to_tz)\n\n    dt = src_tz.localize(datetime(2026, 3, 9, start_hour, start_min))\n    converted = dt.astimezone(dst_tz)\n\n    return converted.hour, converted.minute\n```\n\n## Common Patterns to Handle\n- Duration with\u002Fwithout articles: \"a one-hour meeting\" vs \"one hour meeting\"\n- Time with\u002Fwithout colons: \"10:00am\" vs \"10am\"\n- Ordinal suffixes: \"March 9th\" vs \"March 9\"\n- Written-out numbers: \"one hour\" vs \"1 hour\"\n- Time zone abbreviations: \"PST\", \"EST\", \"CST\"\n\n## Best Practices\n1. Always validate extracted values (reasonable hours, future dates)\n2. Handle both written and numeric forms of durations\n3. Normalize time zones before comparison\n4. Extract sender email for reply tracking\n5. Store raw text for debugging and validation\n","# Meeting Request Parsing Skill\n\n## Overview\nThis skill covers parsing JSON-formatted meeting request emails to extract key scheduling information: meeting duration, date constraints, time window constraints, and sender email.\n\n## Key Concepts\n\n### Meeting Request Structure\nTypical meeting request contains:\n- **Duration**: stated explicitly (e.g., \"one-hour\", \"1.5 hour\")\n- **Date**: specific date requested\n- **Time Window**: earliest and latest times when person is available\n- **Time Zone**: explicitly stated or inferred\n- **Sender**: email address for reply\n\n### Email Text Parsing Patterns\nCommon patterns in email bodies:\n- Duration: \"one-hour meeting\", \"1.5 hour\", \"45-minute\", \"30 min\"\n- Date: \"March 9th, 2026\", \"March 9, 2026\", \"on March 9\"\n- Availability: \"available from 10am to 2pm\", \"between 1:00 PM and 5:00 PM\"\n- Time zone: \"PST\", \"EST\", \"UTC-8\", etc.\n\n## Code Examples\n\n### JSON Loading and Basic Parsing\n```python\nimport json\nimport re\n\n# Load email requests\nwith open('\u002Froot\u002Ftest_input.json') as f:\n    requests = json.load(f)\n\nfor request in requests:\n    email_text = request['email_text']\n    sender = request['from_email']\n    print(f\"From: {sender}\")\n    print(f\"Body: {email_text}\")\n```\n\n### Extracting Duration\n```python\ndef extract_duration(email_text):\n    \"\"\"Extract meeting duration in hours\"\"\"\n    # Match patterns: \"one-hour\", \"1 hour\", \"1.5 hours\", \"45 minute\", \"30 min\"\n    patterns = [\n        r'(\\d+\\.?\\d*)\\s*hour',\n        r'(\\d+)\\s*minute',\n        r'(\\d+)\\s*min(?!ute)',\n    ]\n\n    for pattern in patterns:\n        match = re.search(pattern, email_text, re.IGNORECASE)\n        if match:\n            duration_str = match.group(1)\n            if 'minute' in pattern:\n                return float(duration_str) \u002F 60  # Convert minutes to hours\n            else:\n                return float(duration_str)\n\n    # Handle written-out numbers\n    if 'one hour' in email_text.lower():\n        return 1.0\n    if 'one and a half' in email_text.lower() or '1.5 hour' in email_text.lower():\n        return 1.5\n\n    return None\n```\n\n### Extracting Date\n```python\nfrom datetime import datetime\n\ndef extract_date(email_text):\n    \"\"\"Extract meeting date from email\"\"\"\n    # Match patterns: \"March 9th, 2026\", \"March 9, 2026\", \"on March 9\"\n    pattern = r'(January|February|March|April|May|June|July|August|September|October|November|December)\\s+(\\d{1,2})(?:st|nd|rd|th)?,?\\s+(\\d{4})'\n\n    match = re.search(pattern, email_text, re.IGNORECASE)\n    if match:\n        month_str, day_str, year_str = match.groups()\n        date_obj = datetime.strptime(f'{month_str} {day_str} {year_str}', '%B %d %Y')\n        return date_obj\n\n    return None\n```\n\n### Extracting Time Window\n```python\ndef extract_time_window(email_text):\n    \"\"\"Extract available time window (earliest to latest)\"\"\"\n    # Match patterns: \"from 10:00am to 2:00pm\", \"between 1:00 PM and 5:00 PM\"\n    pattern = r'(?:from|between)\\s+(\\d{1,2}):?(\\d{2})?\\s*(?:AM|PM|am|pm)?\\s+(?:to|and)\\s+(\\d{1,2}):?(\\d{2})?\\s*(AM|PM|am|pm|PST|EST|UTC-\\d+)?'\n\n    match = re.search(pattern, email_text, re.IGNORECASE)\n    if match:\n        start_hour, start_min, end_hour, end_min, tz = match.groups()\n        start_hour = int(start_hour)\n        end_hour = int(end_hour)\n        start_min = int(start_min) if start_min else 0\n        end_min = int(end_min) if end_min else 0\n\n        return {\n            'start': (start_hour, start_min),\n            'end': (end_hour, end_min),\n            'timezone': tz.upper() if tz else None\n        }\n\n    return None\n```\n\n### Complete Request Parsing\n```python\ndef parse_meeting_request(request_dict):\n    \"\"\"Parse a complete meeting request\"\"\"\n    email_text = request_dict['email_text']\n    sender = request_dict['from_email']\n\n    duration_hours = extract_duration(email_text)\n    date = extract_date(email_text)\n    time_window = extract_time_window(email_text)\n\n    return {\n        'sender': sender,\n        'duration_hours': duration_hours,\n        'requested_date': date,\n        'available_times': time_window,\n        'raw_text': email_text\n    }\n```\n\n## Time Zone Handling\n```python\ndef normalize_timezone(tz_string):\n    \"\"\"Normalize timezone to standard format\"\"\"\n    tz_map = {\n        'PST': 'US\u002FPacific',\n        'EST': 'US\u002FEastern',\n        'CST': 'US\u002FCentral',\n        'MST': 'US\u002FMountain'\n    }\n    return tz_map.get(tz_string, tz_string)\n\ndef convert_time_zones(start_hour, start_min, from_tz, to_tz):\n    \"\"\"Convert time from one timezone to another\"\"\"\n    from datetime import datetime, timezone\n    import pytz\n\n    # Create a datetime in source timezone\n    src_tz = pytz.timezone(from_tz)\n    dst_tz = pytz.timezone(to_tz)\n\n    dt = src_tz.localize(datetime(2026, 3, 9, start_hour, start_min))\n    converted = dt.astimezone(dst_tz)\n\n    return converted.hour, converted.minute\n```\n\n## Common Patterns to Handle\n- Duration with\u002Fwithout articles: \"a one-hour meeting\" vs \"one hour meeting\"\n- Time with\u002Fwithout colons: \"10:00am\" vs \"10am\"\n- Ordinal suffixes: \"March 9th\" vs \"March 9\"\n- Written-out numbers: \"one hour\" vs \"1 hour\"\n- Time zone abbreviations: \"PST\", \"EST\", \"CST\"\n\n## Best Practices\n1. Always validate extracted values (reasonable hours, future dates)\n2. Handle both written and numeric forms of durations\n3. Normalize time zones before comparison\n4. Extract sender email for reply tracking\n5. Store raw text for debugging and validation\n",{"name":5,"description":7},"main","726e1f79b96b0cb3d729d0e55a1c847e0b5353ae","skills\u002Fb1-one-shot-claude-haiku-4-5\u002Fschedule-planning\u002Fmeeting-request-parsing",7,"https:\u002F\u002Fgithub.com\u002Fcxcscmu\u002FSkillLearnBench","https:\u002F\u002Fcxcscmu.github.io\u002FSkillLearnBench","https:\u002F\u002Fgithub.com\u002Fcxcscmu","2026-10-02 22:55:36",{"source":8,"skillName":5,"commands":47,"prompt":57,"zipAvailable":58},[48,51,54],{"tool":49,"command":50},"npx","npx skills add cxcscmu\u002FSkillLearnBench --skill meeting-request-parsing",{"tool":52,"command":53},"bunx","bunx skills add cxcscmu\u002FSkillLearnBench --skill meeting-request-parsing",{"tool":55,"command":56},"pnpm","pnpm dlx skills add cxcscmu\u002FSkillLearnBench --skill meeting-request-parsing","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fcxcscmu\u002FSkillLearnBench\u002Fblob\u002Fmain\u002Fskills\u002Fb1-one-shot-claude-haiku-4-5\u002Fschedule-planning\u002Fmeeting-request-parsing\u002FSKILL.md",true,[],[61,79,104,122,141,153],{"skillNo":62,"name":63,"nameZh":6,"description":64,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":65,"categories":66,"keywords":72,"publishedAt":33},"01M6KM5KH175P5ABP5JMX2SBDQ","object_counter","Count occurrences of an object in the image using computer vision algorithm.","https:\u002F\u002Fgithub.com\u002Fcxcscmu\u002FSkillLearnBench\u002Fblob\u002Fmain\u002Fskills\u002Fhuman_authored\u002Fvideo-object-counting\u002Fobject_counter\u002FSKILL.md",[67],{"categoryNo":68,"categoryName":69,"taxonomyType":70,"taxonomyTypeDesc":71},"01JBSEEDCAT000000000000016","图像与多媒体","SCENARIO","使用场景",[73,74,75,76,77,78],"object counter","object","vision","computer","Computer Vision","image",{"skillNo":80,"name":81,"nameZh":6,"description":82,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":83,"categories":84,"keywords":88,"publishedAt":33},"01M6KM51TMVXG79MMPCS6Y8G86","travel-planning-workflow","Invoke this skill when performing travel planning. It defines a structured workflow for generating itineraries. Following this workflow is essential to ensure the final plan satisfies user requirements.","https:\u002F\u002Fgithub.com\u002Fcxcscmu\u002FSkillLearnBench\u002Fblob\u002Fmain\u002Fskills\u002Fhuman_authored\u002Ftravel-planning\u002Ftravel-planning-workflow\u002FSKILL.md",[85],{"categoryNo":86,"categoryName":87,"taxonomyType":70,"taxonomyTypeDesc":71},"01JBSEEDCAT000000000000023","Skill与智能体开发",[89,90,91,92,93,94,95,96,97,98,99,100,101,102,103],"workflow","planning","planning workflow","travel","travel planning","travel planning workflow","structured","performing","plan","for","user","it","requirements","essential","itineraries",{"skillNo":105,"name":106,"nameZh":6,"description":107,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":108,"categories":109,"keywords":110,"publishedAt":33},"01M6KM4DY820XHS9YTSK5QP5HD","bundled-dataset-search-tool","invoke this skill when you need to perform database search for travel planning. This skill provides some useful pre-packaged tools to look up accommodations, attractions, cities, driving distance, flights, and restaurants from the bundled dataset.","https:\u002F\u002Fgithub.com\u002Fcxcscmu\u002FSkillLearnBench\u002Fblob\u002Fmain\u002Fskills\u002Fhuman_authored\u002Ftravel-planning\u002Fbundled-dataset-search-tool\u002FSKILL.md",[],[111,112,113,114,115,116,117,92,118,119,93,120,98,121,90],"search","tool","dataset","bundled dataset search tool","restaurants","Tools","up","look","flights","you","database",{"skillNo":123,"name":124,"nameZh":6,"description":125,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":126,"categories":127,"keywords":128,"publishedAt":33},"01M6KM465BB9PQ0B548HQSVAWZ","glm-output","Output-processing guidance for GLM tasks. Especially useful after glm-basics and glm-calibration when you need verifier-matching metrics from output.nc and a final \u002Froot\u002Fmetrics.json.","https:\u002F\u002Fgithub.com\u002Fcxcscmu\u002FSkillLearnBench\u002Fblob\u002Fmain\u002Fskills\u002Fhuman_authored\u002Ftemperature-simulation\u002Fglm-output\u002FSKILL.md",[],[129,130,131,98,132,133,28,134,135,136,137,138,120,139,140],"glm output","output","glm","tasks","metrics","basics","guidance","matching","verifier","processing","root","calibration",{"skillNo":142,"name":143,"nameZh":6,"description":144,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":145,"categories":146,"keywords":148,"publishedAt":33},"01M6KM40KY3QWDW5W97S39R2BC","glm-calibration","Calibration guidance for GLM tasks. Often most effective after glm-basics has clarified the setup; glm-output is the companion skill for exact final metric computation.","https:\u002F\u002Fgithub.com\u002Fcxcscmu\u002FSkillLearnBench\u002Fblob\u002Fmain\u002Fskills\u002Fhuman_authored\u002Ftemperature-simulation\u002Fglm-calibration\u002FSKILL.md",[147],{"categoryNo":86,"categoryName":87,"taxonomyType":70,"taxonomyTypeDesc":71},[149,140,131,130,135,134,132,150,151,98,152],"glm calibration","setup","companion","metric",{"skillNo":154,"name":155,"nameZh":6,"description":156,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":157,"categories":158,"keywords":159,"publishedAt":33},"01M6KM3VHHVSGMGHJQB3PPT6YG","glm-basics","A good starting point for GLM calibration tasks. Use to inspect glm3.nml, confirm how GLM runs, and identify the relevant files before moving on to calibration and output evaluation.","https:\u002F\u002Fgithub.com\u002Fcxcscmu\u002FSkillLearnBench\u002Fblob\u002Fmain\u002Fskills\u002Fhuman_authored\u002Ftemperature-simulation\u002Fglm-basics\u002FSKILL.md",[],[160,131,134,161,149,140,98,130,162,163,164,165,166,167,132],"glm basics","inspect","relevant","files","good","use","how","Evaluation"]