Breaking changes

Updated Oct 14, 2026

1.1.1 — Narrowed store key helper input types

repositoryStoreKey, branchStoreKey, and blobStoreKey now accept narrower input shapes rather than the GitHubRepository, GitHubBranch, and GitHubBlob entity types. Calls passing complete entity objects continue to work, but explicit parameter type annotations must use the new input shapes.

repositoryStoreKey

The helper now takes only an owner's login and repository name:

import {repositoryStoreKey} from 'simulacat-core';

const key = repositoryStoreKey({owner: 'acme', name: 'awesome-repo'});
console.log(key);

branchStoreKey

The branch helper takes only an owner's login, repository name, and branch name:

import {branchStoreKey} from 'simulacat-core';

const key = branchStoreKey({owner: 'acme', repo: 'awesome-repo', name: 'main'});
console.log(key);

blobStoreKey

The blob helper takes repository coordinates and either a path or SHA:

import {blobStoreKey} from 'simulacat-core';

const key = blobStoreKey({owner: 'acme', repo: 'awesome-repo', path: 'README.md'});
console.log(key);

1.2.1 — Request-scoped actor resolution

GET /user, GET /user/memberships/orgs, and Query.viewer no longer fall back to the first seeded user when no actor header is present. They now return HTTP 401 with Authentication required for unauthenticated requests.

Scenario Before 1.2.1 After 1.2.1
No actor header sent First seeded user returned 401 {"message":"Authentication required"}
x-simulacat-user: <login> sent Named user returned (unchanged) Named user returned (unchanged)
x-simulacat-actor: user:<login> sent Not supported Named user returned

Set x-simulacat-actor: user:<login> (or a legacy alias) on every request that must exercise /user, /user/memberships/orgs, or viewer.

For REST authenticated-user routes, both GET /user and GET /user/memberships/orgs require x-simulacat-actor: user:<login> or a legacy user alias. Without an actor that resolves to a seeded user, these routes return HTTP 401 with {"message":"Authentication required"}.