{
  "schemaVersion": "1.0",
  "item": {
    "slug": "meeting-prep",
    "name": "meeting-prep",
    "source": "tencent",
    "type": "skill",
    "category": "效率提升",
    "sourceUrl": "https://clawhub.ai/hougangdev/meeting-prep",
    "canonicalUrl": "https://clawhub.ai/hougangdev/meeting-prep",
    "targetPlatform": "OpenClaw"
  },
  "install": {
    "downloadMode": "redirect",
    "downloadUrl": "/downloads/meeting-prep",
    "sourceDownloadUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=meeting-prep",
    "sourcePlatform": "tencent",
    "targetPlatform": "OpenClaw",
    "installMethod": "Manual import",
    "extraction": "Extract archive",
    "prerequisites": [
      "OpenClaw"
    ],
    "packageFormat": "ZIP package",
    "includedAssets": [
      "SKILL.md"
    ],
    "primaryDoc": "SKILL.md",
    "quickSetup": [
      "Download the package from Yavira.",
      "Extract the archive and review SKILL.md first.",
      "Import or place the package into your OpenClaw setup."
    ],
    "agentAssist": {
      "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
      "steps": [
        "Download the package from Yavira.",
        "Extract it into a folder your agent can access.",
        "Paste one of the prompts below and point your agent at the extracted folder."
      ],
      "prompts": [
        {
          "label": "New install",
          "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete."
        },
        {
          "label": "Upgrade existing",
          "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run."
        }
      ]
    },
    "sourceHealth": {
      "source": "tencent",
      "status": "healthy",
      "reason": "direct_download_ok",
      "recommendedAction": "download",
      "checkedAt": "2026-04-30T16:55:25.780Z",
      "expiresAt": "2026-05-07T16:55:25.780Z",
      "httpStatus": 200,
      "finalUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=network",
      "contentType": "application/zip",
      "probeMethod": "head",
      "details": {
        "probeUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=network",
        "contentDisposition": "attachment; filename=\"network-1.0.0.zip\"",
        "redirectLocation": null,
        "bodySnippet": null
      },
      "scope": "source",
      "summary": "Source download looks usable.",
      "detail": "Yavira can redirect you to the upstream package for this source.",
      "primaryActionLabel": "Download for OpenClaw",
      "primaryActionHref": "/downloads/meeting-prep"
    },
    "validation": {
      "installChecklist": [
        "Use the Yavira download entry.",
        "Review SKILL.md after the package is downloaded.",
        "Confirm the extracted package contains the expected setup assets."
      ],
      "postInstallChecks": [
        "Confirm the extracted package includes the expected docs or setup files.",
        "Validate the skill or prompts are available in your target agent workspace.",
        "Capture any manual follow-up steps the agent could not complete."
      ]
    },
    "downloadPageUrl": "https://openagent3.xyz/downloads/meeting-prep",
    "agentPageUrl": "https://openagent3.xyz/skills/meeting-prep/agent",
    "manifestUrl": "https://openagent3.xyz/skills/meeting-prep/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/meeting-prep/agent.md"
  },
  "agentAssist": {
    "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
    "steps": [
      "Download the package from Yavira.",
      "Extract it into a folder your agent can access.",
      "Paste one of the prompts below and point your agent at the extracted folder."
    ],
    "prompts": [
      {
        "label": "New install",
        "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete."
      },
      {
        "label": "Upgrade existing",
        "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run."
      }
    ]
  },
  "documentation": {
    "source": "clawhub",
    "primaryDoc": "SKILL.md",
    "sections": [
      {
        "title": "Meeting Prep",
        "body": "Automated meeting preparation and daily commit summaries for development teams."
      },
      {
        "title": "Capabilities",
        "body": "Meeting Prep — Check Google Calendar for upcoming meetings with video links, notify user, generate commit-based updates\nDaily Summary — End-of-day summary of all commits across all developers"
      },
      {
        "title": "Google Calendar OAuth",
        "body": "Create OAuth credentials in Google Cloud Console:\n\nEnable Google Calendar API\nCreate OAuth 2.0 Desktop credentials\nStore client_secret.json in credentials/\nAuthorize with scopes: https://www.googleapis.com/auth/calendar\nStore tokens in credentials/calendar_tokens.json\n\nFor multiple accounts, store separate token files per account."
      },
      {
        "title": "GitHub Token",
        "body": "Create a classic Personal Access Token with repo scope. Store at credentials/github_token."
      },
      {
        "title": "Meeting Prep Check",
        "body": "Trigger: Cron every 15 minutes or heartbeat.\n\nQuery configured calendars for events in next 45 minutes\nFilter for events with Google Meet links (hangoutLink or conferenceData)\nIf meeting 30-45 min away and not yet notified:\n\nAsk user: \"Meeting [title] in X min. When was your last update? Which repos should I check?\"\nTrack in state file to avoid duplicates\n\n\nIf meeting 10-20 min away:\n\nGenerate update from commits\nSend formatted update"
      },
      {
        "title": "Daily Commit Summary",
        "body": "Trigger: Cron at end of day.\n\nFetch all commits from configured repos for current day\nInclude all developers\nGroup by repo and subdirectory\nFormat with author names\nSend summary"
      },
      {
        "title": "Check Calendar",
        "body": "NOW=$(date -u +%Y-%m-%dT%H:%M:%SZ)\nLATER=$(date -u -d \"+45 minutes\" +%Y-%m-%dT%H:%M:%SZ)\nTOKEN=$(jq -r '.access_token' credentials/calendar_tokens.json)\n\ncurl -s \"https://www.googleapis.com/calendar/v3/calendars/primary/events?timeMin=$NOW&timeMax=$LATER&singleEvents=true\" \\\n  -H \"Authorization: Bearer $TOKEN\" | \\\n  jq '[.items[] | select(.hangoutLink != null or .conferenceData != null)]'\n\nRefresh Token\n\nCLIENT_ID=$(jq -r '.installed.client_id' credentials/client_secret.json)\nCLIENT_SECRET=$(jq -r '.installed.client_secret' credentials/client_secret.json)\nREFRESH_TOKEN=$(jq -r '.refresh_token' credentials/calendar_tokens.json)\n\ncurl -s -X POST https://oauth2.googleapis.com/token \\\n  -d \"client_id=$CLIENT_ID\" \\\n  -d \"client_secret=$CLIENT_SECRET\" \\\n  -d \"refresh_token=$REFRESH_TOKEN\" \\\n  -d \"grant_type=refresh_token\"\n\nFetch Commits\n\nTOKEN=$(cat credentials/github_token)\nSINCE=$(date -u -d \"-7 days\" +%Y-%m-%dT%H:%M:%SZ)\n\n# List org repos\ncurl -s -H \"Authorization: Bearer $TOKEN\" \\\n  \"https://api.github.com/orgs/ORG_NAME/repos?per_page=50&sort=pushed\"\n\n# Get commits\ncurl -s -H \"Authorization: Bearer $TOKEN\" \\\n  \"https://api.github.com/repos/ORG/REPO/commits?since=$SINCE&per_page=30\"\n\nOutput Format\n\nPlain text, no markdown, no emojis:\n\nUpdate - [DATE]\n\n[repo-name]\n\n[subdirectory]\n• Verbose description of change (Author)\n• Another change (Author)\n\nToday\n• [user input]\n\nBlockers\n• None\n\nDiscussion\n• None\n\nFormatting Rules\n\n• Group by repo, then subdirectory\n• Summarize commits into meaningful descriptions\n• Include author names\n• Plain text only for easy copy-paste\nState Management\n\nTrack state in data/meeting-prep-state.json:\n\n{\n  \"notified\": {},\n  \"config\": {\n    \"repoFilter\": \"org-name/*\"\n  }\n}"
      }
    ],
    "body": "Meeting Prep\n\nAutomated meeting preparation and daily commit summaries for development teams.\n\nCapabilities\nMeeting Prep — Check Google Calendar for upcoming meetings with video links, notify user, generate commit-based updates\nDaily Summary — End-of-day summary of all commits across all developers\nSetup Requirements\nGoogle Calendar OAuth\n\nCreate OAuth credentials in Google Cloud Console:\n\nEnable Google Calendar API\nCreate OAuth 2.0 Desktop credentials\nStore client_secret.json in credentials/\nAuthorize with scopes: https://www.googleapis.com/auth/calendar\nStore tokens in credentials/calendar_tokens.json\n\nFor multiple accounts, store separate token files per account.\n\nGitHub Token\n\nCreate a classic Personal Access Token with repo scope. Store at credentials/github_token.\n\nWorkflows\nMeeting Prep Check\n\nTrigger: Cron every 15 minutes or heartbeat.\n\nQuery configured calendars for events in next 45 minutes\nFilter for events with Google Meet links (hangoutLink or conferenceData)\nIf meeting 30-45 min away and not yet notified:\nAsk user: \"Meeting [title] in X min. When was your last update? Which repos should I check?\"\nTrack in state file to avoid duplicates\nIf meeting 10-20 min away:\nGenerate update from commits\nSend formatted update\nDaily Commit Summary\n\nTrigger: Cron at end of day.\n\nFetch all commits from configured repos for current day\nInclude all developers\nGroup by repo and subdirectory\nFormat with author names\nSend summary\nAPI Reference\nCheck Calendar\nNOW=$(date -u +%Y-%m-%dT%H:%M:%SZ)\nLATER=$(date -u -d \"+45 minutes\" +%Y-%m-%dT%H:%M:%SZ)\nTOKEN=$(jq -r '.access_token' credentials/calendar_tokens.json)\n\ncurl -s \"https://www.googleapis.com/calendar/v3/calendars/primary/events?timeMin=$NOW&timeMax=$LATER&singleEvents=true\" \\\n  -H \"Authorization: Bearer $TOKEN\" | \\\n  jq '[.items[] | select(.hangoutLink != null or .conferenceData != null)]'\n\nRefresh Token\n\nCLIENT_ID=$(jq -r '.installed.client_id' credentials/client_secret.json)\nCLIENT_SECRET=$(jq -r '.installed.client_secret' credentials/client_secret.json)\nREFRESH_TOKEN=$(jq -r '.refresh_token' credentials/calendar_tokens.json)\n\ncurl -s -X POST https://oauth2.googleapis.com/token \\\n  -d \"client_id=$CLIENT_ID\" \\\n  -d \"client_secret=$CLIENT_SECRET\" \\\n  -d \"refresh_token=$REFRESH_TOKEN\" \\\n  -d \"grant_type=refresh_token\"\n\nFetch Commits\n\nTOKEN=$(cat credentials/github_token)\nSINCE=$(date -u -d \"-7 days\" +%Y-%m-%dT%H:%M:%SZ)\n\n# List org repos\ncurl -s -H \"Authorization: Bearer $TOKEN\" \\\n  \"https://api.github.com/orgs/ORG_NAME/repos?per_page=50&sort=pushed\"\n\n# Get commits\ncurl -s -H \"Authorization: Bearer $TOKEN\" \\\n  \"https://api.github.com/repos/ORG/REPO/commits?since=$SINCE&per_page=30\"\n\nOutput Format\n\nPlain text, no markdown, no emojis:\n\nUpdate - [DATE]\n\n[repo-name]\n\n[subdirectory]\n• Verbose description of change (Author)\n• Another change (Author)\n\nToday\n• [user input]\n\nBlockers\n• None\n\nDiscussion\n• None\n\nFormatting Rules\n\n• Group by repo, then subdirectory\n• Summarize commits into meaningful descriptions\n• Include author names\n• Plain text only for easy copy-paste\nState Management\n\nTrack state in data/meeting-prep-state.json:\n\n{\n  \"notified\": {},\n  \"config\": {\n    \"repoFilter\": \"org-name/*\"\n  }\n}"
  },
  "trust": {
    "sourceLabel": "tencent",
    "provenanceUrl": "https://clawhub.ai/hougangdev/meeting-prep",
    "publisherUrl": "https://clawhub.ai/hougangdev/meeting-prep",
    "owner": "hougangdev",
    "version": "1.0.0",
    "license": null,
    "verificationStatus": "Indexed source record"
  },
  "links": {
    "detailUrl": "https://openagent3.xyz/skills/meeting-prep",
    "downloadUrl": "https://openagent3.xyz/downloads/meeting-prep",
    "agentUrl": "https://openagent3.xyz/skills/meeting-prep/agent",
    "manifestUrl": "https://openagent3.xyz/skills/meeting-prep/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/meeting-prep/agent.md"
  }
}