noraneko-registry

noraneko の drop(コード一つで降ってくる機能。actor の xpi = 入れ物 + JSWindowActor、Firefox の about:newtab と同じ形)の台帳。 「誰かの判があるから入れる」ではなく、「入れる本人が中身を見られる」を一番前に置く。 ここの判は証言であって、門番ではない。

registry の中で完結する。drop の source そのものがここに置かれ、build もここで行い、判もここが押す。外の repo は使わない。

  1. 作者は PR に drops/<name>/drop.toml(uuid、name、note、連絡先、actors)と drops/<name>/src/<actor>/actor.ts を置く。 PR の diff がそのまま「実際に xpi になる source」なので、レビューはそれを読む。 正体は uuid(uuidgen で一つ振る。一度振ったら変えない)、name は札(dir と同じ。この registry の中で一つ)。 Julia の General と同じ絵: 別の registry に同じ名前があっても、uuid が違えば別のもの。
  2. CI が tooling/(noraneko から vendor した build の道具、commit を pin)で build する(reproducible)。
  3. 人がレビューする(この repo の main への PR レビューが門)。
  4. main に入ると、CI が build し、manifest に連絡先を写し、registry の identity で manifest.json に keyless の判を押して、 xpi と一緒に dl.f3liz.casa/drop/<uuid> に POST する。置く側(Cloudflare Worker)がその判と xpi の sha256 と uuid を確かめてから B2 に書き、配るときも判が通るものだけ返す。この repo は B2 の鍵を持たない(判そのものが門)。attestations.json に Rekor と run のリンク。 manifest の source は「この registry の、この commit の、drops/<name>/src」。xpi の中にも source が同梱される。
  5. ブラウザ(noraneko)は registry の一覧を持つ(既定はこの repo。設定で足せる・外せる: iOS の代替ストアと同じ絵)。 uuid を入れると(一覧の registry に順に訊いて、持っているところから落とす)、整合性(sha256)と「その registry の identity で押されているか」を確かめて、 権限シート、source、実際に実行されるファイル、連絡先を見せる。合っていれば緑、違えば赤(止めない)。それから本人が「入れる」。

置きかた

drops/<name>/drop.toml                       uuid / name / note / contact / actors(PR に要るのはこれと src/)
drops/<name>/src/<actor>/actor.ts            実際に xpi になる source
drops/<name>/manifest.json                   build の産物 + 連絡先(main で CI が書く)
drops/<name>/manifest.json.sigstore.json     registry の判(main で CI が押す)
drops/<name>/attestations.json               判とリンクの一覧(CI が書く)
tooling/                                     build の道具(noraneko から vendor。tooling/VENDORED.md に commit)
drops/std-actor/src/lib/                     drop の殻(logic の三つの door を呼んで、view を描き、effect を carry out する)。
                                             lib なので、どの drop の xpi にも入らない -- 配られるのは一枚だけ
trusted_root.json                            sigstore の trust root(sigstore/root-signing の pin)

ブラウザが持つこの registry の情報:

name     = "f3liz"
base     = "https://dl.f3liz.casa/drop"        → <base>/<uuid>/manifest.json
identity = "https://github.com/f3liz-casa/noraneko-registry/.github/workflows/verify-and-sign.yml@refs/heads/main"
issuer   = "https://token.actions.githubusercontent.com"

自分の registry を建てるなら、この repo を fork して、base(配る URL)と identity(自分の workflow)を ブラウザの「レジストリを足す」に書く。信用の根は、その registry の main を誰がレビューするか。

手元で

mise install
npm install
mise exec -- ruby scripts/dev.rb drops/<name>                   # 書いているあいだの輪(見張って、組んで、棚に置く)
mise exec -- ruby scripts/build.rb drops/<name>                 # 一度だけ組む。_build/<name>/ に xpi と manifest
node scripts/verify.mjs drops/<name>/manifest.json.sigstore.json drops/<name>/manifest.json <registry の identity>

信用の根

静的な「信用する identity の一覧」は持たない。判の「誰か」は drop.toml に書いてあるそのままで、 それを読んで通すかどうかは、この repo の main への PR レビューで人が決める。