Skip to content

20.1.3

Choose a tag to compare

@ivndev001 ivndev001 released this 18 Sep 07:49
· 97 commits to main since this release
4d9c719

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)