--- name: catalog-babysitter-users description: Discover public GitHub repositories that import defineTask from @a5c-ai/babysitter-sdk and maintain a deduplicated catalog of those repositories in docs/repo-with-babysitter-processes.md. Excludes any repo named "babysitter" (to filter out forks of this monorepo). Invoke when asked to find, discover, catalog, or refresh "repos using babysitter", "babysitter in the wild", or "who else is using babysitter". --- # Catalog Babysitter Users Produce a curated, deduplicated catalog of public GitHub repositories that import `defineTask` from `@a5c-ai/babysitter-sdk`, stored at `docs/repo-with-babysitter-processes.md`. Refresh the catalog in-place when re-run; do not delete entries that no longer match (mark them as "last seen" instead, so the catalog is additive over time). ## When to use - User asks "who's using babysitter in the wild?", "find repos with babysitter processes", "refresh the catalog", "update the babysitter-users list". - After a release, to see whether new adopters have appeared. - Before a retrospective across external runs (see the sibling skill `retrospect-external-babysitter-run`). ## Prerequisites - `gh` CLI installed and authenticated (`gh auth status` must be OK). GitHub code search requires an authenticated user. - Writable working tree (the catalog file gets updated). ## Exact search Search the literal import statement across public code: ```bash gh search code \ "import { defineTask } from '@a5c-ai/babysitter-sdk'" \ --json repository,path,url \ --limit 200 ``` Also run the double-quote variant to catch formatter differences: ```bash gh search code \ 'import { defineTask } from "@a5c-ai/babysitter-sdk"' \ --json repository,path,url \ --limit 200 ``` Union the two result sets. If the CLI caps out at 100 per query, paginate by adding `language:javascript`, `language:typescript`, and `extension:js`, `extension:ts` qualifiers to split the search space. ## Filtering rules (apply in order) 1. Drop any hit whose `repository.name` (case-insensitive) equals `babysitter`. This excludes forks of this monorepo. 2. Drop any hit whose `repository.nameWithOwner` starts with `a5c-ai/` -- those are first-party and already known. 3. Drop archived repos (`repository.isArchived === true`). Enrich via `gh api repos//` if the search JSON lacks it. 4. Dedupe by `repository.nameWithOwner` -- one entry per repo, even if multiple files match. Keep the count of matching files as evidence. 5. Drop private-visible-as-public fluke hits (repository.visibility !== 'public'). ## Enrichment per surviving repo For each repo, fetch: ```bash gh api repos// \ --jq '{nameWithOwner, description, stargazerCount: .stargazers_count, pushedAt: .pushed_at, defaultBranch: .default_branch, license: .license.spdx_id, topics}' ``` Also record: - `processFiles`: the list of matching file paths from the search (cap at 10 per repo in the catalog; note total count if higher). - `firstSeen`: if the repo is new to the catalog, today's date (ISO). If already present, preserve the existing value. - `lastSeen`: today's date (ISO) for every repo that matched this run. ## Catalog file format Maintain `docs/repo-with-babysitter-processes.md` as an additive, idempotent document. Structure: ```markdown # Repositories Using Babysitter Last refreshed: YYYY-MM-DD Total repos tracked: N New this run: M No longer matching: K ## Active | Repository | Stars | Description | License | Pushed | Process files | First seen | Last seen | |------------|-------|-------------|---------|--------|---------------|------------|-----------| | [owner/name](https://github.com/owner/name) | 123 | ... | MIT | 2026-04-01 | 3 | 2026-03-15 | 2026-04-12 | ### owner/name - Default branch: `main` - Topics: `a5c`, `orchestration` - Matching files: - [`src/processes/build.js`](https://github.com/owner/name/blob/main/src/processes/build.js) - ... ## Stale (no longer matching at last refresh) | Repository | Last seen | Notes | |------------|-----------|-------| | ... | ... | Import removed / repo archived / ... | ``` Rules when updating: - Preserve every existing entry's `firstSeen`. - Move a repo from Active to Stale only if it didn't match this run AND was Active last run. Include the reason if derivable (archived, 404, import removed). - Never delete a Stale entry; only update its `lastSeen` note if the situation changes (e.g. re-matched -> move back to Active). - Sort Active rows by stars descending, then by `pushedAt` descending. - Keep the summary counters at the top accurate. ## Procedure 1. Read the current `docs/repo-with-babysitter-processes.md` (if absent, treat as an empty catalog). 2. Parse existing entries into a map keyed by `nameWithOwner`. 3. Run both `gh search code` queries above; union results. 4. Apply the filtering rules. 5. Enrich each surviving repo via `gh api repos/...`. 6. Build the merged catalog: existing entries + new entries; move absent-this-run Active entries to Stale. 7. Write the updated markdown file. 8. Print a short summary to the user: N total, M new, K moved to stale, top 5 new repos by stars. ## Notes on rate limits `gh search code` is throttled (30 req/min for authenticated users). If the first pass returns the default cap, split by `language:` qualifier and by file `extension:` rather than spamming retries. Always include `--limit 100` (max) and paginate via qualifier-splitting, not `--page` (code search doesn't page). ## After running Suggest the sibling skill `retrospect-external-babysitter-run` to go deeper on any specific entry -- "pick a repo from the catalog and retrospect on one of its runs".