[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6FPATQTVE48EXYHZQF7XT4C":3,"skill-same:01M6FPATQTVE48EXYHZQF7XT4C":94},{"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":17,"publishedAt":28,"linkOnly":29,"markdownContent":30,"markdownBody":31,"frontMatter":32,"refName":33,"commitSha":34,"skillDirectory":35,"forksCount":36,"repositoryHtmlUrl":37,"repositoryHomepageUrl":6,"ownerHtmlUrl":38,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":39,"install":40,"resources":53},"01M6FPATQTVE48EXYHZQF7XT4C","garmin-connect",null,"Garmin Connect integration for Clawdbot: sync fitness data (steps, HR, calories, workouts, sleep) every 5 minutes using OAuth.","kbarbel640-del\u002Fskills","kbarbel640-del","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F255315490?v=4","01M6CJPPQGCCESXMG3K7BBGQ5J","01M6CJPPX2PB2BCZERFVM2C2B3",1,"MIT","https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fgodsboy\u002Fgarmin-connect-fixed\u002FSKILL.md",[],[18,19,20,21,22,23,24,25,26,27],"connect","garmin connect","sync","integration","data","OAuth","clawdbot","hr","sleep","minutes","2026-11-10 10:12:30",false,"---\nname: garmin-connect\ndescription: \"Garmin Connect integration for Clawdbot: sync fitness data (steps, HR, calories, workouts, sleep) every 5 minutes using OAuth.\"\n---\n\n# Garmin Connect Skill\n\nSync all your Garmin fitness data to Clawdbot:\n- ? **Daily Activity**: Steps, heart rate, calories, active minutes, distance\n- ? **Sleep**: Duration, quality, deep\u002FREM\u002Flight sleep breakdown\n- ?️ **Workouts**: Recent activities with distance, duration, calories, heart rate\n- ⏱️ **Real-time sync**: Every 5 minutes via cron\n\n## Quick Start\n\n### 1. Install Dependencies\n\n```bash\npip install -r requirements.txt\n```\n\n### 2. OAuth Authentication (One-time)\n\n```bash\npython3 scripts\u002Fgarmin-auth.py your-email@gmail.com your-password\n```\n\nThis saves your OAuth session to `~\u002F.garth\u002Fsession.json` — fully local and secure.\n\n### 3. Test Sync\n\n```bash\npython3 scripts\u002Fgarmin-sync.py\n```\n\nYou should see JSON output with today's stats.\n\n### 4. Set Up 5-Minute Cron\n\nAdd to your crontab:\n\n```bash\n*\u002F5 * * * * \u002Fhome\u002Fuser\u002Fgarmin-connect-clawdbot\u002Fscripts\u002Fgarmin-cron.sh\n```\n\nOr manually:\n\n```bash\n*\u002F5 * * * * python3 \u002Fhome\u002Fuser\u002Fgarmin-connect-clawdbot\u002Fscripts\u002Fgarmin-sync.py ~\u002F.clawdbot\u002F.garmin-cache.json\n```\n\n### 5. Use in Clawdbot\n\nImport and use in your scripts:\n\n```python\nfrom scripts.garmin_formatter import format_all, get_as_dict\n\n# Get all formatted data\nprint(format_all())\n\n# Or get raw dict\ndata = get_as_dict()\nprint(f\"Steps today: {data['summary']['steps']}\")\n```\n\n## Features\n\n✅ OAuth-based (secure, no password storage)\n✅ All metrics: activity, sleep, workouts\n✅ Local caching (fast access)\n✅ Cron-friendly (5-minute intervals)\n✅ Easy Clawdbot integration\n✅ Multi-user support\n\n## Data Captured\n\n### Daily Activity (`summary`)\n- `steps`: Daily step count\n- `heart_rate_resting`: Resting heart rate (bpm)\n- `calories`: Total calories burned\n- `active_minutes`: Intensity minutes\n- `distance_km`: Distance traveled\n\n### Sleep (`sleep`)\n- `duration_hours`: Total sleep time\n- `duration_minutes`: Sleep in minutes\n- `quality_percent`: Sleep quality score (0-100)\n- `deep_sleep_hours`: Deep sleep duration\n- `rem_sleep_hours`: REM sleep duration\n- `light_sleep_hours`: Light sleep duration\n- `awake_minutes`: Time awake during sleep\n\n### Workouts (`workouts`)\nFor each recent workout:\n- `type`: Activity type (Running, Cycling, etc.)\n- `name`: Activity name\n- `distance_km`: Distance traveled\n- `duration_minutes`: Duration of activity\n- `calories`: Calories burned\n- `heart_rate_avg`: Average heart rate\n- `heart_rate_max`: Max heart rate\n\n## Cache Location\n\nBy default, data is cached at: `~\u002F.clawdbot\u002F.garmin-cache.json`\n\nCustomize with:\n```bash\npython3 scripts\u002Fgarmin-sync.py \u002Fcustom\u002Fpath\u002Fcache.json\n```\n\n## Files\n\n| File | Purpose |\n|------|---------|\n| `garmin-auth.py` | OAuth setup (run once) |\n| `garmin-sync.py` | Main sync logic (run every 5 min) |\n| `garmin-formatter.py` | Format data for display |\n| `garmin-cron.sh` | Cron wrapper script |\n| `requirements.txt` | Python dependencies |\n\n## Troubleshooting\n\n### OAuth authentication fails\n\n- Check email\u002Fpassword\n- Disable 2FA on Garmin account (or use app password)\n- Garmin servers might be rate-limiting — wait 5 minutes\n\n### No data appears\n\n1. Sync your Garmin device with the Garmin Connect app\n2. Wait 2-3 minutes for data to sync\n3. Check that data appears in Garmin Connect web\u002Fapp\n4. Then run `garmin-sync.py` again\n\n### Permission denied on cron\n\n```bash\nchmod +x scripts\u002Fgarmin-cron.sh\nchmod +x scripts\u002Fgarmin-sync.py\nchmod +x scripts\u002Fgarmin-auth.py\n```\n\n### Cache file not found\n\nRun `garmin-sync.py` at least once to create cache:\n```bash\npython3 scripts\u002Fgarmin-sync.py\n```\n\n## Usage Examples\n\n```python\nfrom scripts.garmin_formatter import format_all, get_as_dict\n\n# Get formatted output\nprint(format_all())\n\n# Get raw data\ndata = get_as_dict()\nif data:\n    print(f\"Sleep: {data['sleep']['duration_hours']}h\")\n    print(f\"Steps: {data['summary']['steps']:,}\")\n```\n\n## License\n\nMIT — Use, fork, modify freely.\n\n---\n\nMade for [Clawdbot](https:\u002F\u002Fclawd.bot) | Available on [ClawdHub](https:\u002F\u002Fclawdhub.com)\n","# Garmin Connect Skill\n\nSync all your Garmin fitness data to Clawdbot:\n- ? **Daily Activity**: Steps, heart rate, calories, active minutes, distance\n- ? **Sleep**: Duration, quality, deep\u002FREM\u002Flight sleep breakdown\n- ?️ **Workouts**: Recent activities with distance, duration, calories, heart rate\n- ⏱️ **Real-time sync**: Every 5 minutes via cron\n\n## Quick Start\n\n### 1. Install Dependencies\n\n```bash\npip install -r requirements.txt\n```\n\n### 2. OAuth Authentication (One-time)\n\n```bash\npython3 scripts\u002Fgarmin-auth.py your-email@gmail.com your-password\n```\n\nThis saves your OAuth session to `~\u002F.garth\u002Fsession.json` — fully local and secure.\n\n### 3. Test Sync\n\n```bash\npython3 scripts\u002Fgarmin-sync.py\n```\n\nYou should see JSON output with today's stats.\n\n### 4. Set Up 5-Minute Cron\n\nAdd to your crontab:\n\n```bash\n*\u002F5 * * * * \u002Fhome\u002Fuser\u002Fgarmin-connect-clawdbot\u002Fscripts\u002Fgarmin-cron.sh\n```\n\nOr manually:\n\n```bash\n*\u002F5 * * * * python3 \u002Fhome\u002Fuser\u002Fgarmin-connect-clawdbot\u002Fscripts\u002Fgarmin-sync.py ~\u002F.clawdbot\u002F.garmin-cache.json\n```\n\n### 5. Use in Clawdbot\n\nImport and use in your scripts:\n\n```python\nfrom scripts.garmin_formatter import format_all, get_as_dict\n\n# Get all formatted data\nprint(format_all())\n\n# Or get raw dict\ndata = get_as_dict()\nprint(f\"Steps today: {data['summary']['steps']}\")\n```\n\n## Features\n\n✅ OAuth-based (secure, no password storage)\n✅ All metrics: activity, sleep, workouts\n✅ Local caching (fast access)\n✅ Cron-friendly (5-minute intervals)\n✅ Easy Clawdbot integration\n✅ Multi-user support\n\n## Data Captured\n\n### Daily Activity (`summary`)\n- `steps`: Daily step count\n- `heart_rate_resting`: Resting heart rate (bpm)\n- `calories`: Total calories burned\n- `active_minutes`: Intensity minutes\n- `distance_km`: Distance traveled\n\n### Sleep (`sleep`)\n- `duration_hours`: Total sleep time\n- `duration_minutes`: Sleep in minutes\n- `quality_percent`: Sleep quality score (0-100)\n- `deep_sleep_hours`: Deep sleep duration\n- `rem_sleep_hours`: REM sleep duration\n- `light_sleep_hours`: Light sleep duration\n- `awake_minutes`: Time awake during sleep\n\n### Workouts (`workouts`)\nFor each recent workout:\n- `type`: Activity type (Running, Cycling, etc.)\n- `name`: Activity name\n- `distance_km`: Distance traveled\n- `duration_minutes`: Duration of activity\n- `calories`: Calories burned\n- `heart_rate_avg`: Average heart rate\n- `heart_rate_max`: Max heart rate\n\n## Cache Location\n\nBy default, data is cached at: `~\u002F.clawdbot\u002F.garmin-cache.json`\n\nCustomize with:\n```bash\npython3 scripts\u002Fgarmin-sync.py \u002Fcustom\u002Fpath\u002Fcache.json\n```\n\n## Files\n\n| File | Purpose |\n|------|---------|\n| `garmin-auth.py` | OAuth setup (run once) |\n| `garmin-sync.py` | Main sync logic (run every 5 min) |\n| `garmin-formatter.py` | Format data for display |\n| `garmin-cron.sh` | Cron wrapper script |\n| `requirements.txt` | Python dependencies |\n\n## Troubleshooting\n\n### OAuth authentication fails\n\n- Check email\u002Fpassword\n- Disable 2FA on Garmin account (or use app password)\n- Garmin servers might be rate-limiting — wait 5 minutes\n\n### No data appears\n\n1. Sync your Garmin device with the Garmin Connect app\n2. Wait 2-3 minutes for data to sync\n3. Check that data appears in Garmin Connect web\u002Fapp\n4. Then run `garmin-sync.py` again\n\n### Permission denied on cron\n\n```bash\nchmod +x scripts\u002Fgarmin-cron.sh\nchmod +x scripts\u002Fgarmin-sync.py\nchmod +x scripts\u002Fgarmin-auth.py\n```\n\n### Cache file not found\n\nRun `garmin-sync.py` at least once to create cache:\n```bash\npython3 scripts\u002Fgarmin-sync.py\n```\n\n## Usage Examples\n\n```python\nfrom scripts.garmin_formatter import format_all, get_as_dict\n\n# Get formatted output\nprint(format_all())\n\n# Get raw data\ndata = get_as_dict()\nif data:\n    print(f\"Sleep: {data['sleep']['duration_hours']}h\")\n    print(f\"Steps: {data['summary']['steps']:,}\")\n```\n\n## License\n\nMIT — Use, fork, modify freely.\n\n---\n\nMade for [Clawdbot](https:\u002F\u002Fclawd.bot) | Available on [ClawdHub](https:\u002F\u002Fclawdhub.com)\n",{"name":5,"description":7},"main","e7e336ac628c3e3bd771aff1aaa469c93778f94a","skills\u002Fgodsboy\u002Fgarmin-connect-fixed",0,"https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills","https:\u002F\u002Fgithub.com\u002Fkbarbel640-del","2026-08-23 22:39:37",{"source":8,"skillName":5,"commands":41,"prompt":51,"zipAvailable":52},[42,45,48],{"tool":43,"command":44},"npx","npx skills add kbarbel640-del\u002Fskills --skill garmin-connect",{"tool":46,"command":47},"bunx","bunx skills add kbarbel640-del\u002Fskills --skill garmin-connect",{"tool":49,"command":50},"pnpm","pnpm dlx skills add kbarbel640-del\u002Fskills --skill garmin-connect","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fgodsboy\u002Fgarmin-connect-fixed\u002FSKILL.md",true,[54,60,64,68,74,78,82,86,90],{"path":55,"resourceType":56,"resourceTypeDesc":57,"sizeBytes":58,"sourceHtmlUrl":59},"_meta.json","REFERENCE","参考文档",295,"https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fgodsboy\u002Fgarmin-connect-fixed\u002F_meta.json",{"path":61,"resourceType":56,"resourceTypeDesc":57,"sizeBytes":62,"sourceHtmlUrl":63},"README.md",3570,"https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fgodsboy\u002Fgarmin-connect-fixed\u002FREADME.md",{"path":65,"resourceType":56,"resourceTypeDesc":57,"sizeBytes":66,"sourceHtmlUrl":67},"requirements.txt",62,"https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fgodsboy\u002Fgarmin-connect-fixed\u002Frequirements.txt",{"path":69,"resourceType":70,"resourceTypeDesc":71,"sizeBytes":72,"sourceHtmlUrl":73},"scripts\u002Fgarmin-auth-oauth.py","SCRIPT","脚本",2066,"https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fgodsboy\u002Fgarmin-connect-fixed\u002Fscripts\u002Fgarmin-auth-oauth.py",{"path":75,"resourceType":70,"resourceTypeDesc":71,"sizeBytes":76,"sourceHtmlUrl":77},"scripts\u002Fgarmin-auth.py",1548,"https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fgodsboy\u002Fgarmin-connect-fixed\u002Fscripts\u002Fgarmin-auth.py",{"path":79,"resourceType":70,"resourceTypeDesc":71,"sizeBytes":80,"sourceHtmlUrl":81},"scripts\u002Fgarmin-cron.sh",434,"https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fgodsboy\u002Fgarmin-connect-fixed\u002Fscripts\u002Fgarmin-cron.sh",{"path":83,"resourceType":70,"resourceTypeDesc":71,"sizeBytes":84,"sourceHtmlUrl":85},"scripts\u002Fgarmin-formatter.py",3112,"https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fgodsboy\u002Fgarmin-connect-fixed\u002Fscripts\u002Fgarmin-formatter.py",{"path":87,"resourceType":70,"resourceTypeDesc":71,"sizeBytes":88,"sourceHtmlUrl":89},"scripts\u002Fgarmin-sync-oauth.py",4453,"https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fgodsboy\u002Fgarmin-connect-fixed\u002Fscripts\u002Fgarmin-sync-oauth.py",{"path":91,"resourceType":70,"resourceTypeDesc":71,"sizeBytes":92,"sourceHtmlUrl":93},"scripts\u002Fgarmin-sync.py",5563,"https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fgodsboy\u002Fgarmin-connect-fixed\u002Fscripts\u002Fgarmin-sync.py",[95,126,155,176,182,202],{"skillNo":96,"name":97,"nameZh":6,"description":98,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":99,"categories":100,"keywords":106,"publishedAt":28},"01M6G8J55967D6281ACMKAKTEQ","crowd-prompting","A marketplace where AI agents improve prompts, system instructions, tool descriptions, and other text-based content with domain expertise from real-world operations — and earn tokens for valuable contributions.","https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fzzadrian\u002Fcrowd-prompting\u002FSKILL.md",[101],{"categoryNo":102,"categoryName":103,"taxonomyType":104,"taxonomyTypeDesc":105},"01JBSEEDCAT000000000000036","内容创作者","PROFESSION","适用职业",[107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125],"crowd prompting","prompting","api","with","tokens","domain","world","prompts","operations","instructions","text","tool","system","improve","productivity","marketplace","https","content","ai agents",{"skillNo":127,"name":128,"nameZh":6,"description":129,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":130,"categories":131,"keywords":137,"publishedAt":28},"01M6G8J0PKPAYVET6BWE8W4C26","dilemm-ai","Compete in DilemmAI, the prisoner's dilemma AI arena at dilemm.ai. Use when an OpenClaw agent wants to create an account, design and submit strategy prompts for their bot, enter matchmaking, analyze historical matches and leaderboards, and iterate on bot strategy. Requires headless browser automation (no API available yet).","https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fzyori\u002Fdilemm-ai\u002FSKILL.md",[132],{"categoryNo":133,"categoryName":134,"taxonomyType":135,"taxonomyTypeDesc":136},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",[138,109,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,114,154],"dilemm ai","arena","analyze","browser","openclaw agent","create","automation","browser automation","bot","openclaw","design","strategy","headless","compete","submit","matchmaking","use",{"skillNo":156,"name":157,"nameZh":6,"description":158,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":159,"categories":160,"keywords":164,"publishedAt":28},"01M6G8HWAF3K9SW7NP3Z83CPJ6","arxiv-paper-reviews","Interact with arXiv Crawler API to fetch papers, read reviews, and submit comments. Use when working with arXiv papers, fetching paper lists by date\u002Fcategory\u002Finterest, viewing paper details with comments, or submitting paper reviews via API at http:\u002F\u002F150.158.152.82:8000.","https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fzxrys\u002Fweak-accept\u002FSKILL.md",[161],{"categoryNo":162,"categoryName":163,"taxonomyType":135,"taxonomyTypeDesc":136},"01JBSEEDCAT000000000000021","资料检索与研究",[165,166,167,168,169,170,171,110,172,152,154,173,109,174,175],"arxiv paper reviews","reviews","arxiv","paper","crawler","papers","comments","fetch","read","http","via",{"skillNo":177,"name":157,"nameZh":6,"description":158,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":178,"categories":179,"keywords":181,"publishedAt":28},"01M6G8HQJ7N7WMY6YV7D7SSJ16","https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fzxrys\u002Farxiv-paper-reviews\u002FSKILL.md",[180],{"categoryNo":162,"categoryName":163,"taxonomyType":135,"taxonomyTypeDesc":136},[168,167,166,165,175,170,171,110,169,152,154,172,173,109,174],{"skillNo":183,"name":184,"nameZh":6,"description":185,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":186,"categories":187,"keywords":188,"publishedAt":28},"01M6G8HM95Y64JNVFC2HN4E2BG","git-summary","Get a quick summary of the current Git repository including status, recent commits, branches, and contributors.","https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fzweack\u002Fgit-summary\u002FSKILL.md",[],[189,190,191,192,193,194,195,196,197,198,199,200,201],"git","summary","git summary","commits","repository","win32","status","linux","contributors","true","quick","get","branches",{"skillNo":203,"name":204,"nameZh":6,"description":205,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":206,"categories":207,"keywords":212,"publishedAt":28},"01M6G8HGEGF05CNEJCGVYFSC4R","agent-constitution","Interact with AgentConstitution governance contracts on Base Sepolia. Check compliance, read rules, log actions, query governance state.","https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fztsalexey\u002Fagent-constitution\u002FSKILL.md",[208,209],{"categoryNo":133,"categoryName":134,"taxonomyType":135,"taxonomyTypeDesc":136},{"categoryNo":210,"categoryName":211,"taxonomyType":104,"taxonomyTypeDesc":105},"01JBSEEDCAT000000000000037","律师与法务",[213,214,215,216,110,217,218,33,219,173,220,221,222,223,224,123,225,226,227],"agent constitution","constitution","contracts","tree","query","base","log","check","Rules","projects","compliance","actions","state","governance","github"]