You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
This commit was created on GitHub.com and signed with GitHub’s verified signature.
Fixed
x g job/x g task no longer assume a feature has a tenant. Both templates hard-coded input: t.object({ id, orgId }), tenant: (input) => input.orgId and calls to repo.byId/repo.listByOrg, on the assumption that x g entity always scaffolds tenant: 'orgId'. A feature's entity need not be tenant-scoped — x g task purgeOrphans --feature links into a feature with no orgId column and no byId/listByOrg in repo.ts
produced a job that did not compile. The generator now reads the feature's own entity.ts/ repo.ts off disk (the same pattern sliceErrors already uses for x g action) and emits a tenant: 'none'-shaped job with a neutral body — no ../entity, no ../repo, no orgId — when
the entity declares no real tenant column or the repo lacks the pair the tenant-scoped body
calls. The tenant-scoped output is unchanged. Also fixed sliceExports (used to make that
decision): it never recognised export async function <name>, so it always read a real byId/listByOrg as absent. (#447)
x dev now declares ULTIMATE_ENV=development for the app it boots when neither ULTIMATE_ENV nor NODE_ENV is already set. tryResolveEnvironment answers development only
by DEFAULT in that case — indistinguishable from a process that never named its environment at
all — which is why a scaffolded app's apps/web/app/auth/dev-actor.ts had to fail OPEN. That
template now fails CLOSED (fallback: 'production'), and this is what keeps a bare x dev
installing its dev viewer regardless.
x shot --island no longer fails every state of a live island. A component whose mount()
unconditionally dials @ultimat3/realtime's LiveClient.connect() (or any WebSocket / EventSource) used to fail X_SHOT_ISLAND_UNSTUBBED_REQUEST in every state, and the error's own fix: named a stub match the harness's grammar could never accept (WS ws://… fails isStubMatch). The harness now gives WebSocket/EventSource an inert stand-in — it constructs,
never opens, close()/send() are no-ops — recorded on its own sockets list rather than on unstubbed; a real unanswered fetch/XHR still fails the run unchanged. (#448)
x shot launches Chrome with the same container flags the e2e driver already needed. cdp-launch.ts's launcher (x verify's e2e step) passed --no-sandbox and --disable-dev-shm-usage; x shot's launcher — a different process, puppeteer-core's own launch() — passed neither, so on Ubuntu 23.10+ (AppArmor restricts the unprivileged user
namespace the sandbox needs) Chrome exited "No usable sandbox" and x shot could not run on a
box where the e2e gate ran green. Both launchers now read the same exported CONTAINER_CHROME_ARGS. An attach (--cdp-url) is unaffected — it starts nothing locally. (#444)
x verify/x test no longer leak .env.development into the bun test children they
spawn. Bun auto-loads .env.development/.env.development.local into the parent x process
whenever NODE_ENV is unset; exec.ts then spread that whole environment onto every bun test
child regardless, even though the child itself runs with NODE_ENV=test and would never load
those files on its own. A key is now dropped from a spawned test process when the parent's
current value for it matches exactly what .env.development/.env.development.local would have
set (test-dotenv.ts's testEnvOverrides, wired into test-shards.ts, verify-tests.ts, verify-test-run.ts and mcp-host.ts's runTests). x dev is unaffected.
:global() in a CSS module is unwrapped instead of shipped.scopeClasses
(packages/render/src/css-modules.ts) rewrote .class selectors and knew nothing of :global(...), so it reached the browser as written — an unknown pseudo-class, which drops the
WHOLE rule. @ultimat3/ui has twelve such rules: Table.module.scss's cell padding, row
borders, header ground, density and striping, and ErrorState's <dt>/<dd> styling. Every app's
catalog table therefore rendered flush, centred and unruled, under a green gate — nothing but a
browser ever parsed the CSS. The wrapper now closes on its OWN parenthesis
(:global(tr:nth-child(even) td)), a class inside it keeps its unscoped name, and an unclosed
wrapper is left as written rather than swallowing the sheet.
Commits
fix(render): unwrap :global() in a CSS module instead of shipping it (#455)
fix(cli): x verify/x test no longer leak .env.development into bun test children (#458)
fix(cli): x shot launches Chrome with the same container flags e2e needs (#451)
fix(cli): x shot --island gives a live socket an inert stand-in (#449)
fix(cli): x dev declares ULTIMATE_ENV=development so a fail-closed dev-actor still boots (#459)
fix(cli): x g job / x g task no longer assume a feature has a tenant (#457)