~bigbes/sourcehut-root

76024fae71502810161e229ff694adc080e5edbc — Eugene Blikh 8 days ago 672bd2d
docs: document the new hut submodule

Updates CLAUDE.md (workspace layout) and the sourcehut-refresh skill to
explain that hut lives at ~xenrox, won't be discovered by the upstream
scrape, and must be bumped manually. INDEX.md timestamp bump.
3 files changed, 3 insertions(+), 442 deletions(-)

M .claude/INDEX.md
M .claude/skills/sourcehut-refresh/SKILL.md
M CLAUDE.md
M .claude/INDEX.md => .claude/INDEX.md +1 -441
@@ 4,452 4,12 @@ Auto-generated by `.claude/scripts/build-index.sh`. Regenerated at the end of ev

Read this **before** grepping. Each section gives you the canonical place to look for symbols in that repo.

_Generated: 2026-05-19 05:22:31 UTC_
_Generated: 2026-05-19 10:09:28 UTC_

## Repos

- `api.sr.ht` — master
- `builds.sr.ht` — 0.103.12
- `core-go` — master
- `core.sr.ht` — 0.83.3
- `forgeperf` — master
- `gensokyo` — master
- `git-am.io` — master
- `git-rebase.io` — master
- `git-send-email.io` — 0.1.17
- `git.sr.ht` — 0.97.6
- `go-away-config` — main
- `gql.sr.ht` — master
- `hub.sr.ht` — 0.27.6
- `lists.sr.ht` — 0.70.6
- `man.sr.ht` — 0.19.27
- `meta.sr.ht` — 0.88.4
- `pages.sr.ht` — 0.17.12
- `paste.sr.ht` — 0.19.1
- `sourcehut-go` — master
- `sourcehut-migrate` — v0.3.1
- `sourcehut-ssh` — 0.5.0
- `sourcehut.org` — master
- `sr.ht-apkbuilds` — master
- `sr.ht-docs` — master
- `sr.ht-nginx` — master
- `sr.ht-pkgbuilds` — master
- `srht.site` — master
- `status.sr.ht` — main
- `todo.sr.ht` — 0.84.4

## api.sr.ht

_Tag:_ `(branch: master)`

**Go files (root)**: auth.go, main.go

---

## builds.sr.ht

_Tag:_ `0.103.12`

**GraphQL types** (`buildsrht/schema.graphqls`)

- `type`: Artifact, EmailTrigger, Job, JobCursor, JobEvent, JobGroup, Log, Mutation, OAuthClient, PGPKey, Query, SSHKey, SecretCursor, SecretFile, Settings, Task, User, UserWebhookSubscription, Version, WebhookDelivery, WebhookDeliveryCursor, WebhookSubscriptionCursor, WebhookTrigger
- `input`: EmailTriggerInput, TriggerInput, UserWebhookInput, WebhookTriggerInput
- `enum`: AccessKind, AccessScope, JobStatus, TaskStatus, TriggerCondition, TriggerType, Visibility, WebhookEvent
- `interface`: Entity, Secret, Trigger, WebhookPayload, WebhookSubscription
- `scalar`: Binary, Cursor, File, Time

**SQL tables** (`schema.sql`)

artifact, gql_user_wh_delivery, gql_user_wh_sub, job, job_group, secret, task, trigger, user

_Migrations: 2 files, latest `migrations/0002_drop_legacy_tables.sql`_

**Python blueprints** (`buildsrht/blueprints/`): admin, jobs, secrets, settings

**Python GraphQL queries** (`buildsrht/graphql/`): builds, secrets

**Go binaries** (`cmd/`): api, worker

**Go packages**: `api, worker`

---

## core-go

_Tag:_ `(branch: master)`

**Go binaries** (`cmd/`): token

**Go files (root)**: placeholder.go

**Go packages**: `auth, client, config, crypto, database, email, errors, feature, model, objects, redis, server, valid, webhooks`

---

## core.sr.ht

_Tag:_ `0.83.3`

**Python modules** (`srht/`): api, assets, cache, config, crypto, database, debug, email, flagtype, gql_lexer, markdown, metrics, redis, rid, search, validation

**Python subpackages** (`srht/`): app, ariadne, graphql, icons, oauth, templates, webhook

---

## forgeperf

_Tag:_ `(branch: master)`

**Go files (root)**: main.go

**Go packages**: `schema`

---

## gensokyo

_Tag:_ `(branch: master)`

---

## git-am.io

_Tag:_ `(branch: master)`

---

## git-rebase.io

_Tag:_ `(branch: master)`

---

## git-send-email.io

_Tag:_ `0.1.17`

---

## git.sr.ht

_Tag:_ `0.97.6`

**GraphQL types** (`gitsrht/schema.graphqls`)

- `type`: ACL, ACLCursor, Artifact, ArtifactCursor, BinaryBlob, Commit, CommitCursor, Features, GitEvent, GitWebhookSubscription, Mutation, OAuthClient, Query, Redirect, Reference, ReferenceCursor, Repository, RepositoryCursor, RepositoryEvent, Settings, Signature, Tag, TextBlob, Trailer, Tree, TreeEntry, TreeEntryCursor, UpdatedRef, User, UserWebhookSubscription, Version, WebhookDelivery, WebhookDeliveryCursor, WebhookSubscriptionCursor
- `input`: Filter, GitEventInput, GitWebhookInput, RepoInput, UpdatedRefInput, UserWebhookInput
- `enum`: AccessKind, AccessMode, AccessScope, ObjectType, Visibility, WebhookEvent
- `interface`: Blob, Entity, Object, WebhookPayload, WebhookSubscription
- `scalar`: Cursor, Time, URL, Upload

**SQL tables** (`schema.sql`)

access, artifacts, gql_git_wh_delivery, gql_git_wh_sub, gql_user_wh_delivery, gql_user_wh_sub, redirect, repository, user

_Migrations: 6 files, latest `migrations/0006_add_resource_ids.sql`_

**Python blueprints** (`gitsrht/blueprints/`): artifacts, email, manage, public, repo

**Python GraphQL queries** (`gitsrht/graphql/`): artifacts, manage, settings

**Go binaries** (`cmd/`): api, http-clone, shell, update-hook

**Go packages**: `update-hook`

---

## go-away-config

_Tag:_ `(branch: main)`

---

## gql.sr.ht

_Tag:_ `(branch: master)`

**Go files (root)**: directives.go, email.go, server.go

**Go packages**: `auth, client, config, crypto, database, model, redis`

---

## hub.sr.ht

_Tag:_ `0.27.6`

**GraphQL types** (`hubsrht/schema.graphqls`)

- `type`: Features, MailingList, MailingListCursor, Mutation, Project, ProjectCursor, Query, SourceRepo, SourceRepoCursor, Tracker, TrackerCursor, User, Version
- `enum`: AccessKind, AccessScope, RepoType, Visibility
- `interface`: Entity, ProjectResource
- `scalar`: Cursor, Time, Upload

**SQL tables** (`schema.sql`)

event, event_project_association, features, mailing_list, project, redirect, source_repo, tracker, user, user_webhooks

_Migrations: 8 files, latest `migrations/0008_repo-type_enum.sql`_

**Python blueprints** (`hubsrht/blueprints/`): mailing_lists, projects, public, sources, trackers, users, webhooks

**Go packages**: `api`

---

## lists.sr.ht

_Tag:_ `0.70.6`

**GraphQL types** (`api/graph/schema.graphqls`)

- `type`: ActivitySubscriptionCursor, ByteRange, Email, EmailCursor, EmailEvent, GeneralACL, Mailbox, MailingList, MailingListACL, MailingListACLCursor, MailingListCursor, MailingListEvent, MailingListSubscription, MailingListWebhookSubscription, Mutation, OAuthClient, Patch, Patchset, PatchsetCursor, PatchsetEvent, PatchsetTool, Preferences, Query, Thread, ThreadBlock, ThreadCursor, Trailer, User, UserWebhookSubscription, Version, WebhookDelivery, WebhookDeliveryCursor, WebhookSubscriptionCursor
- `input`: ACLInput, MailingListInput, MailingListWebhookInput, PreferencesInput, UserWebhookInput
- `enum`: AccessKind, AccessScope, PatchsetStatus, ToolIcon, Visibility, WebhookEvent
- `interface`: ACL, ActivitySubscription, Entity, WebhookPayload, WebhookSubscription
- `scalar`: ConfirmationToken, Cursor, Time, URL, Upload

**SQL tables** (`schema.sql`)

access, email, gql_list_wh_delivery, gql_list_wh_sub, gql_user_wh_delivery, gql_user_wh_sub, list, mirror, patchset, patchset_tool, subscription, subscription_request, user

_Migrations: 10 files, latest `migrations/0010_add_supersedes_id.sql`_

**Python blueprints** (`listssrht/blueprints/`): archives, patches, settings, user

**Python GraphQL queries** (`listssrht/graphql/`): queries

**Go packages**: `api, ingress`

---

## man.sr.ht

_Tag:_ `0.19.27`

**GraphQL types** (`api/graph/schema.graphqls`)

- `type`: Mutation, Query, Version
- `scalar`: Cursor, Time, Upload

**SQL tables** (`schema.sql`)

backing_repo, root_wiki, user, wiki

_Migrations: 3 files, latest `migrations/0003_remove_backing_repo.sql`_

**Python blueprints** (`mansrht/blueprints/`): create, html, manage, public

**Go binaries** (`cmd/`): api

---

## meta.sr.ht

_Tag:_ `0.88.4`

**GraphQL types** (`metasrht/schema.graphqls`)

- `type`: AuditLogCursor, AuditLogEntry, BillingAddress, BillingSubscription, Features, Invoice, InvoiceCursor, LoginSecurity, Mutation, OAuthClient, OAuthClientRegistration, OAuthGrant, OAuthGrantRegistration, OAuthPersonalToken, OAuthPersonalTokenRegistration, PGPKey, PGPKeyCursor, PGPKeyEvent, PaymentMethod, PaymentOutcome, Product, ProductPrice, ProfileUpdateEvent, ProfileWebhookSubscription, Query, SSHKey, SSHKeyCursor, SSHKeyEvent, StripePaymentIntent, StripeSetupIntent, TOTPConfig, User, Version, WebhookDelivery, WebhookDeliveryCursor, WebhookSubscriptionCursor
- `input`: BillingAddressInput, ProductPriceInput, ProfileWebhookInput, UpdateBillingSubscriptionInput, UserInput
- `enum`: AccessKind, AccessScope, Currency, PaymentIntentStatus, PaymentInterval, PaymentStatus, SetupIntentStatus, SubscriptionStatus, UserType, WebhookEvent
- `interface`: Entity, PaymentIntent, SetupIntent, WebhookPayload, WebhookSubscription
- `scalar`: Country, Cursor, Time, URL, Upload

**SQL tables** (`schema.sql`)

audit_log_entry, billing_address, gql_profile_wh_delivery, gql_profile_wh_sub, invoice, oauth2_client, oauth2_grant, oauthclient, oauthtoken, payment_method, pgpkey, product, product_price, reserved_usernames, sshkey, subscription, user, user_auth_factor, user_email_change, user_notes, user_password_change, user_payment_processor, user_registration, user_webhook_delivery, user_webhook_subscription, webhook_subscription

_Migrations: 12 files, latest `migrations/0012_make_fingerprint_nullable.sql`_

**Python blueprints** (`metasrht/blueprints/`): auth, billing, keys, oauth2, privacy, profile, security, users

**Python GraphQL queries** (`metasrht/graphql/`): admin, auth, billing, email, keys, oauth2, profile, security

**Go binaries** (`cmd/`): api

---

## pages.sr.ht

_Tag:_ `0.17.12`

**GraphQL types** (`graph/schema.graphqls`)

- `type`: Mutation, OAuthClient, Query, Site, SiteACL, SiteACLCursor, SiteCursor, SiteEvent, User, UserWebhookSubscription, Version, WebhookDelivery, WebhookDeliveryCursor, WebhookSubscriptionCursor
- `input`: ACLInput, FileConfig, FileOptions, SiteConfig, UserWebhookInput
- `enum`: AccessKind, AccessScope, Protocol, WebhookEvent
- `interface`: ACL, Entity, WebhookPayload, WebhookSubscription
- `scalar`: Cursor, Time, Upload

**SQL tables** (`schema.sql`)

gql_user_wh_delivery, gql_user_wh_sub, site_access, sites, user

_Migrations: 1 files, latest `migrations/0001_switch_to_brant.sql`_

**Go binaries** (`cmd/`): daily, pages.sr.ht

**Go packages**: `account, graph, webhooks`

---

## paste.sr.ht

_Tag:_ `0.19.1`

**GraphQL types** (`pastesrht/schema.graphqls`)

- `type`: File, Mutation, OAuthClient, Paste, PasteCursor, PasteEvent, Query, User, UserWebhookSubscription, Version, WebhookDelivery, WebhookDeliveryCursor, WebhookSubscriptionCursor
- `input`: UserWebhookInput
- `enum`: AccessKind, AccessScope, Visibility, WebhookEvent
- `interface`: Entity, WebhookPayload, WebhookSubscription
- `scalar`: Cursor, Time, URL, Upload

**SQL tables** (`schema.sql`)

blob, gql_user_wh_delivery, gql_user_wh_sub, paste, paste_file, user

_Migrations: 3 files, latest `migrations/0003_drop_legacy_tables.sql`_

**Python blueprints** (`pastesrht/blueprints/`): public

**Python GraphQL queries** (`pastesrht/graphql/`): mutations

**Go binaries** (`cmd/`): api

---

## sourcehut-go

_Tag:_ `(branch: master)`

**Go binaries** (`cmd/`): git.sr.ht, meta.sr.ht

**Go files (root)**: client.go, config.go, doc.go, entry.go, resources.go

**Go packages**: `git.sr.ht, meta.sr.ht`

---

## sourcehut-migrate

_Tag:_ `v0.3.1`

**Go binaries** (`cmd/`): sourcehut-migrate

---

## sourcehut-ssh

_Tag:_ `0.5.0`

**Go binaries** (`cmd/`): sourcehut-ssh

**Go packages**: `dispatch, handler, meta, shell, ssh`

---

## sourcehut.org

_Tag:_ `(branch: master)`

---

## sr.ht-apkbuilds

_Tag:_ `(branch: master)`

---

## sr.ht-docs

_Tag:_ `(branch: master)`

---

## sr.ht-nginx

_Tag:_ `(branch: master)`

---

## sr.ht-pkgbuilds

_Tag:_ `(branch: master)`

---

## srht.site

_Tag:_ `(branch: master)`

---

## status.sr.ht

_Tag:_ `(branch: main)`

---

## todo.sr.ht

_Tag:_ `0.84.4`

**GraphQL types** (`todosrht/schema.graphqls`)

- `type`: ACLCursor, ActivitySubscriptionCursor, Assignment, Comment, Created, DefaultACL, EmailAddress, Event, EventCreated, EventCursor, ExternalUser, Label, LabelCursor, LabelEvent, LabelUpdate, Mutation, OAuthClient, Preferences, Query, StatusChange, Ticket, TicketCursor, TicketDeletedEvent, TicketEvent, TicketMention, TicketSubscription, TicketWebhookSubscription, Tracker, TrackerACL, TrackerCursor, TrackerEvent, TrackerSubscription, TrackerWebhookSubscription, User, UserMention, UserWebhookSubscription, Version, WebhookDelivery, WebhookDeliveryCursor, WebhookSubscriptionCursor
- `input`: ACLInput, ImportInput, PreferencesInput, SubmitCommentEmailInput, SubmitCommentInput, SubmitTicketEmailInput, SubmitTicketInput, TicketWebhookInput, TrackerInput, TrackerWebhookInput, UpdateLabelInput, UpdateStatusInput, UpdateTicketInput, UserWebhookInput
- `enum`: AccessKind, AccessScope, Authenticity, EmailCmd, EventType, TicketResolution, TicketStatus, Visibility, WebhookEvent
- `interface`: ACL, ActivitySubscription, Entity, EventDetail, WebhookPayload, WebhookSubscription
- `scalar`: Cursor, Time, URL, Upload

**SQL tables** (`schema.sql`)

event, event_notification, gql_ticket_wh_delivery, gql_ticket_wh_sub, gql_tracker_wh_delivery, gql_tracker_wh_sub, gql_user_wh_delivery, gql_user_wh_sub, label, participant, redirect, ticket, ticket_assignee, ticket_comment, ticket_label, ticket_subscription, tracker, user, user_access

_Migrations: 5 files, latest `migrations/0005_add_resource_ids.sql`_

**Python blueprints** (`todosrht/blueprints/`): html, settings, ticket, tracker

**Python GraphQL queries** (`todosrht/graphql/`): lmtp, settings, tickets, trackers

**Go binaries** (`cmd/`): api

**Go packages**: `api`

---

## Cross-repo GraphQL type map

When the same type name appears in multiple repos, it is a *different* type in each — they are not federated as one. Use this map to pick the right service before reading.

- `ACLCursor` → git.sr.ht, todo.sr.ht
- `ACLInput` → lists.sr.ht, pages.sr.ht, todo.sr.ht
- `AccessKind` → builds.sr.ht, git.sr.ht, hub.sr.ht, lists.sr.ht, meta.sr.ht, pages.sr.ht, paste.sr.ht, todo.sr.ht
- `AccessScope` → builds.sr.ht, git.sr.ht, hub.sr.ht, lists.sr.ht, meta.sr.ht, pages.sr.ht, paste.sr.ht, todo.sr.ht
- `ActivitySubscriptionCursor` → lists.sr.ht, todo.sr.ht
- `Artifact` → builds.sr.ht, git.sr.ht
- `Features` → git.sr.ht, hub.sr.ht, meta.sr.ht
- `MailingList` → hub.sr.ht, lists.sr.ht
- `MailingListCursor` → hub.sr.ht, lists.sr.ht
- `Mutation` → builds.sr.ht, git.sr.ht, hub.sr.ht, lists.sr.ht, man.sr.ht, meta.sr.ht, pages.sr.ht, paste.sr.ht, todo.sr.ht
- `OAuthClient` → builds.sr.ht, git.sr.ht, lists.sr.ht, meta.sr.ht, pages.sr.ht, paste.sr.ht, todo.sr.ht
- `PGPKey` → builds.sr.ht, meta.sr.ht
- `Preferences` → lists.sr.ht, todo.sr.ht
- `PreferencesInput` → lists.sr.ht, todo.sr.ht
- `Query` → builds.sr.ht, git.sr.ht, hub.sr.ht, lists.sr.ht, man.sr.ht, meta.sr.ht, pages.sr.ht, paste.sr.ht, todo.sr.ht
- `SSHKey` → builds.sr.ht, meta.sr.ht
- `Settings` → builds.sr.ht, git.sr.ht
- `Tracker` → hub.sr.ht, todo.sr.ht
- `TrackerCursor` → hub.sr.ht, todo.sr.ht
- `Trailer` → git.sr.ht, lists.sr.ht
- `User` → builds.sr.ht, git.sr.ht, hub.sr.ht, lists.sr.ht, meta.sr.ht, pages.sr.ht, paste.sr.ht, todo.sr.ht
- `UserWebhookInput` → builds.sr.ht, git.sr.ht, lists.sr.ht, pages.sr.ht, paste.sr.ht, todo.sr.ht
- `UserWebhookSubscription` → builds.sr.ht, git.sr.ht, lists.sr.ht, pages.sr.ht, paste.sr.ht, todo.sr.ht
- `Version` → builds.sr.ht, git.sr.ht, hub.sr.ht, lists.sr.ht, man.sr.ht, meta.sr.ht, pages.sr.ht, paste.sr.ht, todo.sr.ht
- `Visibility` → builds.sr.ht, git.sr.ht, hub.sr.ht, lists.sr.ht, paste.sr.ht, todo.sr.ht
- `WebhookDelivery` → builds.sr.ht, git.sr.ht, lists.sr.ht, meta.sr.ht, pages.sr.ht, paste.sr.ht, todo.sr.ht
- `WebhookDeliveryCursor` → builds.sr.ht, git.sr.ht, lists.sr.ht, meta.sr.ht, pages.sr.ht, paste.sr.ht, todo.sr.ht
- `WebhookEvent` → builds.sr.ht, git.sr.ht, lists.sr.ht, meta.sr.ht, pages.sr.ht, paste.sr.ht, todo.sr.ht
- `WebhookSubscriptionCursor` → builds.sr.ht, git.sr.ht, lists.sr.ht, meta.sr.ht, pages.sr.ht, paste.sr.ht, todo.sr.ht

M .claude/skills/sourcehut-refresh/SKILL.md => .claude/skills/sourcehut-refresh/SKILL.md +1 -0
@@ 134,3 134,4 @@ Summarize counts of NEW / UPDATED / OK / NOTAG / FAIL. Highlight any FAIL lines.
- Submodule updates are serial because they share the superproject's index lockfile. Do not parallelize.
- Never remove submodules that disappear from upstream listings — flag them in the report and let the user decide whether to `git submodule deinit && git rm <name>`.
- `.clone-repos.sh` is now legacy/historical. Keep it as documentation of the original bootstrap; do not edit it as part of refresh.
- A few submodules live outside `~sircmpwn` and therefore won't appear in the discovered list — they must be refreshed manually. Currently: `hut` (from `~xenrox/hut`). The loop above already skips them because they're absent from `/tmp/srht-repos.txt`; do not delete them. To bump them, `cd <name>`, `git fetch --tags --prune`, `git checkout <latest tag>`, then `git add <name>` from the superproject.

M CLAUDE.md => CLAUDE.md +1 -1
@@ 39,7 39,7 @@ SourceHut is a federation of services that share a common architecture. Categori
- **Shared libraries**: `core.sr.ht` (Python — `srht` package: ORM, OAuth, GraphQL helpers, templates, SCSS/Bootstrap assets) and `core-go` (Go equivalent: `auth`, `client`, `config`, `database`, `redis`, `server`, `webhooks`, `crypto`).
- **Static sites / docs**: `sourcehut.org` and `srht.site` (Hugo), `sr.ht-docs` (man.sr.ht content), `git-am.io`, `git-rebase.io`, `git-send-email.io`.
- **Ops / infra**: `gensokyo` (Kubernetes YAML for the production cluster), `sr.ht-nginx` (nginx configs), `sr.ht-apkbuilds` / `sr.ht-pkgbuilds` (Alpine/Arch packaging), `sourcehut-migrate` (data migration tooling), `status.sr.ht`, `go-away-config`.
- **Misc Go clients/tools**: `sourcehut-go` (Go client library and CLI examples), `forgeperf` (forge performance benchmark harness using Chromium+Lighthouse).
- **Misc Go clients/tools**: `sourcehut-go` (Go client library and CLI examples), `forgeperf` (forge performance benchmark harness using Chromium+Lighthouse), `hut` (third-party CLI client for SourceHut from `~xenrox` — *not* part of the `~sircmpwn` umbrella but the de-facto CLI users reach for; covers builds/git/lists/meta/paste/pages/todo/hub via the GraphQL APIs).

## Build commands