[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6N08WN1YDK098WS5THRTECP":3,"skill-same:01M6N08WN1YDK098WS5THRTECP":88},{"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":18,"publishedAt":40,"linkOnly":41,"markdownContent":42,"markdownBody":43,"frontMatter":44,"refName":66,"commitSha":67,"skillDirectory":68,"forksCount":69,"repositoryHtmlUrl":70,"repositoryHomepageUrl":6,"ownerHtmlUrl":71,"ownerBlogUrl":72,"ownerDescription":73,"updatedAt":74,"install":75,"resources":87},"01M6N08WN1YDK098WS5THRTECP","google-loops",null,"Set up and operate the Gmail\u002FCalendar\u002FContacts connector and the open-loop\nengine: who is waiting on the user, what they promised, and the context\nneeded to respond. Covers painless BYO OAuth setup (exactly two user\ninteractions), the daily `gbrain waiting` digest, loop closing\u002Fmuting, and\ntroubleshooting via the typed error catalog.","garrytan\u002Fgbrain","garrytan","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F19957?v=4","01M6DJCCDDG53MTYYRTXAXFG17","Garry Tan","01M6MZQZCEN3RRMD33E1X9ZZR9",32517,"MIT","https:\u002F\u002Fgithub.com\u002Fgarrytan\u002Fgbrain\u002Fblob\u002Fmaster\u002Fplugin\u002Fskills\u002Fgoogle-loops\u002FSKILL.md",[],[19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39],"google loops","loops","google","close","when","painless","contacts","closing","operate","respond","error","people","false","me","Connector","up","ingestion","loop","open","SET","connect","2026-11-10 10:12:30",false,"---\nname: google-loops\nversion: 1.0.0\ndescription: |\n  Set up and operate the Gmail\u002FCalendar\u002FContacts connector and the open-loop\n  engine: who is waiting on the user, what they promised, and the context\n  needed to respond. Covers painless BYO OAuth setup (exactly two user\n  interactions), the daily `gbrain waiting` digest, loop closing\u002Fmuting, and\n  troubleshooting via the typed error catalog.\ntriggers:\n  - \"connect gmail\"\n  - \"connect google\"\n  - \"connect calendar\"\n  - \"connect contacts\"\n  - \"who is waiting on me\"\n  - \"what do I owe people\"\n  - \"open loops\"\n  - \"unanswered email\"\n  - \"set up email ingestion\"\n  - \"gbrain waiting\"\ntools:\n  - open_loops\n  - loops_close\n  - loops_mute\n  - entity\n  - context_pack\nmutating: true\nwrites_pages: false\nwhen_to_use: \"Use when the user asks: \\\"connect gmail\\\", \\\"connect google\\\", \\\"connect calendar\\\", \\\"connect contacts\\\", \\\"who is waiting on me\\\".\"\n---\n\n# Google Loops — Setup and Daily Operation\n\nThe connector ingests Gmail threads, calendar events, and contacts into the\nbrain and maintains the open-loop record behind `gbrain waiting`. Full\nreferences: `docs\u002Fguides\u002Fgoogle-connect.md` (setup + every error and its\nfix) and `docs\u002Fguides\u002Fopen-loops.md` (how detection works).\n\n## Contract for the harness (read first)\n\n1. **Relay `[SHOW USER]` blocks verbatim.** Setup commands print fenced\n   `[SHOW USER] ... [\u002FSHOW USER]` blocks — numbered steps with deep links.\n   Pass them to the user unchanged (paraphrasing loses load-bearing detail\n   like \"Desktop app, NOT Web application\"). Batch everything into ONE\n   message per block.\n2. **The whole setup is exactly two user interactions.** (1) The Google\n   Cloud checklist + the user hands back the downloaded client JSON.\n   (2) The user clicks one consent URL. If you find yourself asking a third\n   question, re-read the block you skipped.\n3. **Never put secrets in argv or chat when avoidable.** When the user drops\n   `client_secret_*.json` into chat, save it to a file (mode 0600) and pass\n   the path: `gbrain google connect --client-json \u003Cpath>`. Env\n   (`GOOGLE_CLIENT_ID`\u002F`GOOGLE_CLIENT_SECRET`) also works. Raw\n   `--client-id\u002F--client-secret` flags are the last resort.\n4. **Every command speaks JSON.** Add `--json` and read\n   `{ ok, status, next_action: { command, user_message }, error }`. When\n   `next_action.user_message` is present, that IS the message to show the\n   user; when `next_action.command` is present, that is your next call.\n   Errors carry `{ code, problem, cause, fix, doc_url }` — show the user\n   `problem` + `fix`, nothing else.\n5. **Re-running is always safe.** `gbrain google connect` and\n   `gbrain google setup` are idempotent state machines — the documented fix\n   for most errors is \"run it again.\"\n\n## Setup (the one command)\n\n```bash\ngbrain google setup --json\n```\n\nHandles: credential intake (prints the GCP checklist when nothing is on\nfile) → consent (loopback locally; auto paste-back over SSH\u002Fheadless —\nnon-TTY flows complete via a second call:\n`gbrain google connect --code \"\u003Cpasted-redirect-url>\"`) → source\nregistration → a budgeted first sync (newest mail first; the deep backfill\nresumes on later syncs automatically) → the first `gbrain waiting` digest.\n\nMultiple accounts: repeat with `--account work@example.com`.\n\nAlready holding Google access another way (a Google CLI with its own auth,\n`gcloud`, a credential gateway that mints tokens)? Skip OAuth and point the\nsource at it — no credential enters gbrain:\n\n```bash\ngbrain sources add gmail-work --kind google --account you@example.com \\\n  --access command --token-command \"\u003Ccommand that prints an access token>\"\n```\n\n(`--access env --token-env \u003CVAR>` reads an externally-refreshed token from\nthe environment instead.) Then `gbrain sync --source gmail-work` and\n`gbrain waiting` work identically.\n\nVerify health afterwards: `gbrain google status --json` (per-account\nrefresh probe) — and `gbrain doctor` carries a `google_oauth` check that\nwarns once a Testing-mode account goes 5+ days without a successful\nrefresh. An actively-syncing account gets no pre-warning before the 7-day\nTesting-mode expiry — publishing to Production is the real fix.\n\n## Daily operation\n\n```bash\ngbrain waiting --json        # the killer output: ranked people waiting\ngbrain loops done \u003Cid>       # user handled it\ngbrain loops drop \u003Cid>       # user is not going to do it\ngbrain loops mute sender \u003Cemail>   # never track this sender again (closes its open reply-owed loops)\ngbrain loops unmute sender \u003Cemail> # undo; the loops it closed are re-checked on the next sync\ngbrain loops drop sender \u003Cemail> --dry-run   # preview closing one sender's reply-owed loops\n```\n\n- `waiting` may end with `withheld_noise`: open reply-owed loops from senders\n  whose mail is automated (bank or shipping alerts). Show the user each\n  `preview_command`, run it (`--dry-run` changes nothing), and drop only after\n  the user agrees: a drop cannot be undone. Offer `loops mute sender` when the\n  user wants a stop they can reverse.\n\n- `waiting` REFUSES on stale data (no successful sync in 24h) and names the\n  exact fix (`gbrain sync --source \u003Cid>`). Run the sync, then retry. Only\n  use `--stale-ok` when the user explicitly accepts stale results.\n- `completeness: \"partial\"` means some mail in the last 14 days is held after\n  repeated import failures (listed in `held`). Present the answer as partial:\n  name each held item (sender, and subject when shown) and its retry command\n  (`gbrain sources retry-held \u003Cid>`). Never say \"you are clean\" on a partial\n  answer.\n- When presenting loops, show: the counterparty, what's owed (summary), the\n  evidence quote, the deep link (opens the exact Gmail thread in the right\n  account), and the due date when present. The trusted-local result already\n  carries a paste-ready `text` digest — reuse it.\n- For \"context to respond\": each group carries the counterparty's entity\n  card (summary, recent history, other open threads). Need more, call\n  `context_pack` with the counterparty slug.\n- After the user says they replied\u002Fhandled something, close the loop\n  (`loops done`) — thread loops also self-close on the next sync when the\n  reply is visible in Gmail.\n\n## Continuous ingestion\n\nGoogle sources sync like any source: autopilot and `gbrain sync --all` pick\nthem up automatically. No cron of its own. A bare un-targeted `gbrain sync`\ndoes NOT reach them — use `--source \u003Cid>` or `--all`.\n\n## Troubleshooting\n\nEvery failure has a typed code with the fix attached —\n`docs\u002Fguides\u002Fgoogle-connect.md#troubleshooting` is the canonical table. The\nthree the user will actually hit:\n\n- **\"Google hasn't verified this app\"** during consent → expected; it's the\n  user's own app: Advanced → Continue. Warn them BEFORE they click the URL.\n- **`access_denied_test_user`** → they forgot to add themselves as a test\n  user (the error carries the deep link).\n- **`invalid_grant_testing_expiry`** (everything silently stopped ~day 7) →\n  their consent screen is still in Testing; publish to Production, then\n  `gbrain google connect --reauth \u003Cemail>`.\n\n## Cost honesty\n\nCommitment extraction sends recent email text (≤30 days, ≤50 threads\u002Fsweep)\nto the configured chat provider. Tell the user once during setup; the off\nswitch is `gbrain config set loops.extraction_enabled false`. The\nunanswered-thread detector is free and unaffected.\n\n## Output Format\n\nWhen relaying `gbrain waiting`, present per counterparty, most urgent first, then the `## No counterparty` section (loops that name no person) last:\n\n```\n## \u003CCounterparty> (\u003CN> open)\n- [\u003Cloop_type>] \u003Cwhat's owed> (\u003Cage>) — due \u003Cdate if any>\n  > \"\u003Cevidence quote>\"\n  \u003CGmail deep link>\n```\n\nThe trusted-local `--json` result already carries this as a paste-ready\n`text` field — prefer relaying it over re-rendering. For setup commands,\nrelay `[SHOW USER]` blocks verbatim and `error.problem` + `error.fix` on\nfailures; never dump raw JSON envelopes at the user.\n\n## When it fails\n\nFollow the [agent operator protocol](..\u002Fconventions\u002Fagent-operator-protocol.md) for any gbrain error `code`, exit code, `[AGENT]` block or notice block. Specific to this skill:\n\n- Setup prints `[SHOW USER]` blocks: relay them verbatim, one message per block. `gbrain mcp expose` and `gbrain google` still exit 2 when they need the user's confirmation (documented legacy), so read the block, not just the exit code.\n- A Google credential error (`invalid_grant_revoked`, `consent_timeout`, `wrong_account_consented`, …) carries `{ code, problem, cause, fix }`: show the user the problem and fix; most fixes are \"run it again\" by the user.\n- `gbrain waiting` refuses on stale data or reports partial coverage from held items: run the sync it names, or `gbrain sources status \u003Cid>` then, after the user agrees, `gbrain sources retry-held \u003Cid>`.\n\n## Anti-Patterns\n\n- **Paraphrasing a `[SHOW USER]` block.** The checklists carry load-bearing\n  detail (\"Desktop app, NOT Web application\", the test-user step). Relay\n  verbatim, one message per block.\n- **Asking the user for client_id\u002Fclient_secret as chat text.** Take the\n  downloaded JSON as a 0600 file (`--client-json \u003Cpath>`) or env vars;\n  secrets in argv\u002Fchat are the last resort, never the default.\n- **Answering \"who is waiting on me\" from `query`\u002F`search`.** The open-loop\n  record is `open_loops` \u002F `gbrain waiting` — search results have no\n  loop-state semantics and will happily surface answered threads.\n- **Dropping `completeness: \"partial\"`.** A partial answer with no loops is\n  not an empty inbox; say which items are held and how to re-attempt them.\n- **Bypassing the staleness refusal with `--stale-ok` silently.** Run the\n  named `gbrain sync --source \u003Cid>` first; only pass `--stale-ok` when the\n  user explicitly accepts possibly-outdated loops.\n- **Marking loops done for the user.** Close (`gbrain loops done \u003Cid>`) only\n  after the user says it's handled; thread loops self-close on the next sync\n  when the reply is visible in Gmail.\n","# Google Loops — Setup and Daily Operation\n\nThe connector ingests Gmail threads, calendar events, and contacts into the\nbrain and maintains the open-loop record behind `gbrain waiting`. Full\nreferences: `docs\u002Fguides\u002Fgoogle-connect.md` (setup + every error and its\nfix) and `docs\u002Fguides\u002Fopen-loops.md` (how detection works).\n\n## Contract for the harness (read first)\n\n1. **Relay `[SHOW USER]` blocks verbatim.** Setup commands print fenced\n   `[SHOW USER] ... [\u002FSHOW USER]` blocks — numbered steps with deep links.\n   Pass them to the user unchanged (paraphrasing loses load-bearing detail\n   like \"Desktop app, NOT Web application\"). Batch everything into ONE\n   message per block.\n2. **The whole setup is exactly two user interactions.** (1) The Google\n   Cloud checklist + the user hands back the downloaded client JSON.\n   (2) The user clicks one consent URL. If you find yourself asking a third\n   question, re-read the block you skipped.\n3. **Never put secrets in argv or chat when avoidable.** When the user drops\n   `client_secret_*.json` into chat, save it to a file (mode 0600) and pass\n   the path: `gbrain google connect --client-json \u003Cpath>`. Env\n   (`GOOGLE_CLIENT_ID`\u002F`GOOGLE_CLIENT_SECRET`) also works. Raw\n   `--client-id\u002F--client-secret` flags are the last resort.\n4. **Every command speaks JSON.** Add `--json` and read\n   `{ ok, status, next_action: { command, user_message }, error }`. When\n   `next_action.user_message` is present, that IS the message to show the\n   user; when `next_action.command` is present, that is your next call.\n   Errors carry `{ code, problem, cause, fix, doc_url }` — show the user\n   `problem` + `fix`, nothing else.\n5. **Re-running is always safe.** `gbrain google connect` and\n   `gbrain google setup` are idempotent state machines — the documented fix\n   for most errors is \"run it again.\"\n\n## Setup (the one command)\n\n```bash\ngbrain google setup --json\n```\n\nHandles: credential intake (prints the GCP checklist when nothing is on\nfile) → consent (loopback locally; auto paste-back over SSH\u002Fheadless —\nnon-TTY flows complete via a second call:\n`gbrain google connect --code \"\u003Cpasted-redirect-url>\"`) → source\nregistration → a budgeted first sync (newest mail first; the deep backfill\nresumes on later syncs automatically) → the first `gbrain waiting` digest.\n\nMultiple accounts: repeat with `--account work@example.com`.\n\nAlready holding Google access another way (a Google CLI with its own auth,\n`gcloud`, a credential gateway that mints tokens)? Skip OAuth and point the\nsource at it — no credential enters gbrain:\n\n```bash\ngbrain sources add gmail-work --kind google --account you@example.com \\\n  --access command --token-command \"\u003Ccommand that prints an access token>\"\n```\n\n(`--access env --token-env \u003CVAR>` reads an externally-refreshed token from\nthe environment instead.) Then `gbrain sync --source gmail-work` and\n`gbrain waiting` work identically.\n\nVerify health afterwards: `gbrain google status --json` (per-account\nrefresh probe) — and `gbrain doctor` carries a `google_oauth` check that\nwarns once a Testing-mode account goes 5+ days without a successful\nrefresh. An actively-syncing account gets no pre-warning before the 7-day\nTesting-mode expiry — publishing to Production is the real fix.\n\n## Daily operation\n\n```bash\ngbrain waiting --json        # the killer output: ranked people waiting\ngbrain loops done \u003Cid>       # user handled it\ngbrain loops drop \u003Cid>       # user is not going to do it\ngbrain loops mute sender \u003Cemail>   # never track this sender again (closes its open reply-owed loops)\ngbrain loops unmute sender \u003Cemail> # undo; the loops it closed are re-checked on the next sync\ngbrain loops drop sender \u003Cemail> --dry-run   # preview closing one sender's reply-owed loops\n```\n\n- `waiting` may end with `withheld_noise`: open reply-owed loops from senders\n  whose mail is automated (bank or shipping alerts). Show the user each\n  `preview_command`, run it (`--dry-run` changes nothing), and drop only after\n  the user agrees: a drop cannot be undone. Offer `loops mute sender` when the\n  user wants a stop they can reverse.\n\n- `waiting` REFUSES on stale data (no successful sync in 24h) and names the\n  exact fix (`gbrain sync --source \u003Cid>`). Run the sync, then retry. Only\n  use `--stale-ok` when the user explicitly accepts stale results.\n- `completeness: \"partial\"` means some mail in the last 14 days is held after\n  repeated import failures (listed in `held`). Present the answer as partial:\n  name each held item (sender, and subject when shown) and its retry command\n  (`gbrain sources retry-held \u003Cid>`). Never say \"you are clean\" on a partial\n  answer.\n- When presenting loops, show: the counterparty, what's owed (summary), the\n  evidence quote, the deep link (opens the exact Gmail thread in the right\n  account), and the due date when present. The trusted-local result already\n  carries a paste-ready `text` digest — reuse it.\n- For \"context to respond\": each group carries the counterparty's entity\n  card (summary, recent history, other open threads). Need more, call\n  `context_pack` with the counterparty slug.\n- After the user says they replied\u002Fhandled something, close the loop\n  (`loops done`) — thread loops also self-close on the next sync when the\n  reply is visible in Gmail.\n\n## Continuous ingestion\n\nGoogle sources sync like any source: autopilot and `gbrain sync --all` pick\nthem up automatically. No cron of its own. A bare un-targeted `gbrain sync`\ndoes NOT reach them — use `--source \u003Cid>` or `--all`.\n\n## Troubleshooting\n\nEvery failure has a typed code with the fix attached —\n`docs\u002Fguides\u002Fgoogle-connect.md#troubleshooting` is the canonical table. The\nthree the user will actually hit:\n\n- **\"Google hasn't verified this app\"** during consent → expected; it's the\n  user's own app: Advanced → Continue. Warn them BEFORE they click the URL.\n- **`access_denied_test_user`** → they forgot to add themselves as a test\n  user (the error carries the deep link).\n- **`invalid_grant_testing_expiry`** (everything silently stopped ~day 7) →\n  their consent screen is still in Testing; publish to Production, then\n  `gbrain google connect --reauth \u003Cemail>`.\n\n## Cost honesty\n\nCommitment extraction sends recent email text (≤30 days, ≤50 threads\u002Fsweep)\nto the configured chat provider. Tell the user once during setup; the off\nswitch is `gbrain config set loops.extraction_enabled false`. The\nunanswered-thread detector is free and unaffected.\n\n## Output Format\n\nWhen relaying `gbrain waiting`, present per counterparty, most urgent first, then the `## No counterparty` section (loops that name no person) last:\n\n```\n## \u003CCounterparty> (\u003CN> open)\n- [\u003Cloop_type>] \u003Cwhat's owed> (\u003Cage>) — due \u003Cdate if any>\n  > \"\u003Cevidence quote>\"\n  \u003CGmail deep link>\n```\n\nThe trusted-local `--json` result already carries this as a paste-ready\n`text` field — prefer relaying it over re-rendering. For setup commands,\nrelay `[SHOW USER]` blocks verbatim and `error.problem` + `error.fix` on\nfailures; never dump raw JSON envelopes at the user.\n\n## When it fails\n\nFollow the [agent operator protocol](..\u002Fconventions\u002Fagent-operator-protocol.md) for any gbrain error `code`, exit code, `[AGENT]` block or notice block. Specific to this skill:\n\n- Setup prints `[SHOW USER]` blocks: relay them verbatim, one message per block. `gbrain mcp expose` and `gbrain google` still exit 2 when they need the user's confirmation (documented legacy), so read the block, not just the exit code.\n- A Google credential error (`invalid_grant_revoked`, `consent_timeout`, `wrong_account_consented`, …) carries `{ code, problem, cause, fix }`: show the user the problem and fix; most fixes are \"run it again\" by the user.\n- `gbrain waiting` refuses on stale data or reports partial coverage from held items: run the sync it names, or `gbrain sources status \u003Cid>` then, after the user agrees, `gbrain sources retry-held \u003Cid>`.\n\n## Anti-Patterns\n\n- **Paraphrasing a `[SHOW USER]` block.** The checklists carry load-bearing\n  detail (\"Desktop app, NOT Web application\", the test-user step). Relay\n  verbatim, one message per block.\n- **Asking the user for client_id\u002Fclient_secret as chat text.** Take the\n  downloaded JSON as a 0600 file (`--client-json \u003Cpath>`) or env vars;\n  secrets in argv\u002Fchat are the last resort, never the default.\n- **Answering \"who is waiting on me\" from `query`\u002F`search`.** The open-loop\n  record is `open_loops` \u002F `gbrain waiting` — search results have no\n  loop-state semantics and will happily surface answered threads.\n- **Dropping `completeness: \"partial\"`.** A partial answer with no loops is\n  not an empty inbox; say which items are held and how to re-attempt them.\n- **Bypassing the staleness refusal with `--stale-ok` silently.** Run the\n  named `gbrain sync --source \u003Cid>` first; only pass `--stale-ok` when the\n  user explicitly accepts possibly-outdated loops.\n- **Marking loops done for the user.** Close (`gbrain loops done \u003Cid>`) only\n  after the user says it's handled; thread loops self-close on the next sync\n  when the reply is visible in Gmail.\n",{"name":5,"tools":45,"version":51,"mutating":52,"triggers":53,"description":64,"when_to_use":65,"writes_pages":41},[46,47,48,49,50],"open_loops","loops_close","loops_mute","entity","context_pack","1.0.0",true,[54,55,56,57,58,59,60,61,62,63],"connect gmail","connect google","connect calendar","connect contacts","who is waiting on me","what do I owe people","open loops","unanswered email","set up email ingestion","gbrain waiting","Set up and operate the Gmail\u002FCalendar\u002FContacts connector and the open-loop\nengine: who is waiting on the user, what they promised, and the context\nneeded to respond. Covers painless BYO OAuth setup (exactly two user\ninteractions), the daily `gbrain waiting` digest, loop closing\u002Fmuting, and\ntroubleshooting via the typed error catalog.\n","Use when the user asks: \"connect gmail\", \"connect google\", \"connect calendar\", \"connect contacts\", \"who is waiting on me\".","master","074ec301549ded4930f04d2c3b22d709a6c095cc","plugin\u002Fskills\u002Fgoogle-loops",4842,"https:\u002F\u002Fgithub.com\u002Fgarrytan\u002Fgbrain","https:\u002F\u002Fgithub.com\u002Fgarrytan","https:\u002F\u002Fblog.garrytan.com","Writes software, dreams. ","2026-11-11 10:24:08",{"source":8,"skillName":5,"commands":76,"prompt":86,"zipAvailable":52},[77,80,83],{"tool":78,"command":79},"npx","npx skills add garrytan\u002Fgbrain --skill google-loops",{"tool":81,"command":82},"bunx","bunx skills add garrytan\u002Fgbrain --skill google-loops",{"tool":84,"command":85},"pnpm","pnpm dlx skills add garrytan\u002Fgbrain --skill google-loops","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fgarrytan\u002Fgbrain\u002Fblob\u002Fmaster\u002Fplugin\u002Fskills\u002Fgoogle-loops\u002FSKILL.md",[],[89,101,107,128,152,166],{"skillNo":90,"name":91,"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":92,"categories":93,"keywords":94,"publishedAt":40},"01M6N109FNGH1PK49T734PZXGB","query-helper","https:\u002F\u002Fgithub.com\u002Fgarrytan\u002Fgbrain\u002Fblob\u002Fmaster\u002Ftest\u002Ffixtures\u002Fskill-catalog\u002Fskills\u002Fquery-helper\u002FSKILL.md",[],[95,96,97,98,99,100,31],"query helper","helper","query","search","page","find",{"skillNo":102,"name":103,"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":104,"categories":105,"keywords":106,"publishedAt":40},"01M6N108A23GW6NGQEQ0E7GV0A","broken","https:\u002F\u002Fgithub.com\u002Fgarrytan\u002Fgbrain\u002Fblob\u002Fmaster\u002Ftest\u002Ffixtures\u002Fskill-catalog\u002Fskills\u002Fbroken\u002FSKILL.md",[],[103],{"skillNo":108,"name":109,"nameZh":6,"description":110,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":111,"categories":112,"keywords":113,"publishedAt":40},"01M6N105E88C5K2H03H0CC79G1","brain-ops","Read, enrich, and write brain pages with source attribution.","https:\u002F\u002Fgithub.com\u002Fgarrytan\u002Fgbrain\u002Fblob\u002Fmaster\u002Ftest\u002Ffixtures\u002Fskill-catalog\u002Fskills\u002Fbrain-ops\u002FSKILL.md",[],[114,115,116,117,118,99,119,120,34,121,97,122,30,123,124,125,126,127,98],"brain ops","brain","ops","true","attribution","read","write","look","pages","with","enrich","web","path","source",{"skillNo":129,"name":130,"nameZh":6,"description":131,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":132,"categories":133,"keywords":139,"publishedAt":40},"01M6N102GRMF22TVCNT6RK5MRD","meeting-prep","Build a briefing before you meet someone, from their recent threads, open loops and what they care about.","https:\u002F\u002Fgithub.com\u002Fgarrytan\u002Fgbrain\u002Fblob\u002Fmaster\u002Ftest\u002Ffixtures\u002Fskill-catalog-query\u002Fskills\u002Fmeeting-prep\u002FSKILL.md",[134],{"categoryNo":135,"categoryName":136,"taxonomyType":137,"taxonomyTypeDesc":138},"01JBSEEDCAT000000000000034","行政与办公人员","PROFESSION","适用职业",[140,141,142,32,143,98,144,37,145,97,31,20,146,147,148,149,150,151],"meeting","prep","meeting prep","prepare","brief","build","about","you","briefing","threads","for","Meet",{"skillNo":153,"name":154,"nameZh":6,"description":155,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":156,"categories":157,"keywords":158,"publishedAt":40},"01M6N1005QK7REHX5KGMNR5PF0","inbox-zero","Triage the inbox into replies, delegations and archives.","https:\u002F\u002Fgithub.com\u002Fgarrytan\u002Fgbrain\u002Fblob\u002Fmaster\u002Ftest\u002Ffixtures\u002Fskill-catalog-query\u002Fskills\u002Finbox-zero\u002FSKILL.md",[],[159,160,161,98,162,31,163,164,165],"inbox zero","ZeRO","inbox","clear","replies","my","triage",{"skillNo":167,"name":168,"nameZh":6,"description":169,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":170,"categories":171,"keywords":172,"publishedAt":40},"01M6N0ZXQ8RRRW71PNV61T57GP","deal-memo","Draft an investment memo from the deal pages and the founder history already in the brain.","https:\u002F\u002Fgithub.com\u002Fgarrytan\u002Fgbrain\u002Fblob\u002Fmaster\u002Ftest\u002Ffixtures\u002Fskill-catalog-query\u002Fskills\u002Fdeal-memo\u002FSKILL.md",[],[173,174,175,122,115,176,177,120,178,117,98,179],"deal memo","deal","memo","draft","investment","history","founder"]