Repository navigation
feat!: SYS-440 move the frontend stack here as its own repository - #7
Conversation
…d the ui-state and storybook-testing packs here Copied from systemfsoftware/systemfsoftware main at d1ab631935c9439bcd16abf2894b09b843494701, with every file systemfsoftware/systemfsoftware#763 adds or modifies taken from its head c08bc10b4005a8fc70d84d0f49e5de26232136d7 (the effect-atom-react useSyncExternalStore rewrite, its tests and fixtures, and the ui-state README and react-runs-no-effect rule) and the four files #763 deletes left out. Package names and versions are unchanged. Edits after the copy: - package.json repository, homepage and bugs point at this repository. - Every systemfsoftware dependency is the range that repository publishes, resolved to the pinned flake tarball by a root override, never a workspace link. - The preset dependency and each oxlint.config.ts name @systemfsoftware/oxlint-config-frontend. - effect-atom and effect-atom-react take playwright from the catalog (1.63.0), the version the Nix browsers ship. - Five pack lint lines name the frontend preset and @systemfsoftware/ui-state/no-react-effect. - The three etc/*.api.md reports carry CRLF bytes upstream; this repository's `* text=auto eol=lf` stores them as LF, and api:check passes on that form.
… UI rules @systemfsoftware/oxlint-config-frontend@0.1.0 spreads the pinned @systemfsoftware/oxlint-config-recommended@4.0.0 and adds what the UI packs mechanize: the server-state import ban (ui-state/server-data-lives-in-atoms), the .tsx fetch ban (ui-state/components-perform-no-io), the story page.screenshot ban (storybook-testing/visual-evidence-comes-from-the-runner), and from systemfsoftware/systemfsoftware#763 the React plugin rules, the useEffect / useLayoutEffect / useInsertionEffect / useEffectEvent import ban and the no-react-effect rule. no-react-effect ships inside the preset as a local JS plugin loaded by URL from dist/plugin.mjs, named @systemfsoftware/ui-state so it cannot collide with the generic preset's @systemfsoftware/effect-platform plugin. The preset replaces the generic preset's ui-state patterns in every no-restricted-imports value it inherits, so each banned import is reported once and a later override cannot drop them. Moved tests only: fetch-in-tsx, server-state-imports, story-screenshot, react-effect, react-rules, the oxlint-diagnostics fixture, the ui-state-fixture directory and the rule's RuleTester suite. Edits after the copy: the rule id @systemfsoftware/effect-platform/no-react-effect becomes @systemfsoftware/ui-state/no-react-effect in the rule config, its test, the react-effect test's diagnostic code and four directive fixtures; three fixture configs import @systemfsoftware/oxlint-config-frontend.
…export this workspace's The systemfsoftware input is pinned to d1ab631935c9439bcd16abf2894b09b843494701 and pnpm-release-management to its pin there. The sandbox store is that repository's lib.mkConsumerStore over the 24 systemfsoftware packages this workspace installs; every @systemfsoftware/* lockfile entry is a file:.sfs-deps tarball, none a workspace link or registry fetch. @systemfsoftware/arethetypeswrong-cli, which the moved packages' attw scripts run, is built from source at the released 4.2.0 tag (the pinned are-the-types-wrong-effect input) the way the xstate flake builds it, with the effect-cell-types 7 build it resolves. Its builder, store and manifest overlays are copied from xstate; the two overlay lockfiles record the integrity of the pinned tsconfig and npm-package tarballs. The flake exports packages.<system> from mkPnpmWorkspacePackages (one tarball per public package plus workspace-tarballs) and its own lib.mkConsumerStore, so another repository consumes effect-atom, effect-atom-react, storybook-gherkin and oxlint-config-frontend by flake input. Workspace: globs for packages/atom, packages/gherkin and packages/oxlint-presets; the catalog moves to the versions the moved packages are tested on (effect 4.0.5, @effect/tsgo 0.51.1, vitest 5.0.5, vite 8.3.4, oxlint 1.87.0, oxlint-tsgolint 7.0.2003) plus their own dependencies; peers, oxlint and stryker named catalogs; the rolldown-plugin-dts 0.28.6 patch with an override that keeps it resolved. Gates: turbo gains test:types, lint:tsgo and test:browser, and build inputs gain the api-extractor config and etc/*.api.md. lint runs lint:tsgo, typecheck runs test:types, test and gate:tasks run test:browser, gate:dist runs attw. lint:suppressions passes every tracked source file except the two moved fixture paths whose directives the tests read: oxlint-config-frontend/ui-state-fixture/src/react-effect/ and storybook-gherkin/test/browser/scenario-title.deny.ts. dprint skips etc/*.api.md, which api-extractor writes. The dev shell gives the sandboxed chromium a fonts.conf (DejaVu); without one it lays text out at zero height and the moved storybook-gherkin visibility story fails.
The six systemfsoftware/systemfsoftware intents still pending for effect-atom, effect-atom-react and storybook-gherkin, bodies byte-identical, frontmatter narrowed to those three packages: effect-4-0-1-floor, effect-4-0-5-peer-floor, full-version-dependency-ranges and funny-goats-repeat (patch), loose-moons-assert (storybook-gherkin minor), and #763's quiet-hooks-subscribe (effect-atom-react major: useAtomSubscribe, HydrationBoundary and useAtomInitialValues leave the public API).
…ystemfsoftware packs they lean on Local packs: ui-state, storybook-testing. From systemfsoftware/systemfsoftware at the full sha d1ab631935c9439bcd16abf2894b09b843494701, chosen by applies_when: cell-architecture (atoms, services and Layers in effect-atom and apps/site), boundary-testing (AtomHttpApi and AtomRpc adapters, port fakes in stories), schema-laws (Effect Schema and schema-law tests), package-topology (published packages now live here), mutation-discipline (stryker configs of the moved packages), turbo-task-graph (this turbo.json). ci-wall-clock stays out: turbo-task-graph's README keeps its enrolment in systemfsoftware/systemfsoftware. path-trust names no directory authorization root here.
… ranges as systemfsoftware does oxlint-config-frontend's ui-state-fixture imports the package by name, which resolves to its own dist, so typecheck depends on build as in systemfsoftware's turbo.json; under gate:tasks' --continue it otherwise raced the build and failed with TS2307. react, react-dom, type-fest and vitest reach published dependencies and peerDependencies through catalog:, which pnpm pack writes literally. The catalog now carries the caret ranges systemfsoftware's catalog has, so the exported effect-atom-react and storybook-gherkin manifests read exactly like the ones systemfsoftware published. Resolved versions are unchanged.
…tbook removal steps
There was a problem hiding this comment.
Reviewed at a268ca700 (10 signed commits, no AI trailers; the delta since the lane-reviewed 14b91ccfe is six files and I read all six).
Delta read: .mergify.yml (queue conditions + the declared bootstrap note), one changeset for the moved oxlint preset, and four package.json author fields changed from a personal address to a placeholder. The lane move itself carries a six-lens review receipt at 14b91ccfe; the delta is configuration and metadata only, and I found no correctness issue in it.
Non-blocking finding: the placeholder is "author": "TODO <todo@example.com>". It is faceless, which is right, but it ships a TODO in published package metadata; a follow-up should set the org identity (e.g. systemfsoftware) instead.
Merge path: check-success = rules is a queue condition and is red because .github/rulesets/gates.json is not installed as an active branch ruleset. Once an admin installs it and the check re-runs green, Mergify merges this on the approval — no bootstrap hand-merge is needed. I am not taking the --match-head-commit path.
Reviewed by the workstation root as its own read of PR #7 and the six-file delta since the lane-reviewed head 14b91cc; no omp-acp session reviewed that delta.
Fixes SYS-440
systemfsoftware/frontendnow owns the frontend stack. The UI packages, their compound packs and the UI lint rules move here fromsystemfsoftware/systemfsoftware. The generic toolchain stays there and comes in as pinned tarballs through its flake.What moved
Copied with
git archivefromsystemfsoftware/systemfsoftwaremain atd1ab631935c9439bcd16abf2894b09b843494701. Files changed by PR #763 (headc08bc10b4005a8fc70d84d0f49e5de26232136d7) are taken from #763's head. #763'sdocs/plans/*.mdare not carried, and neither is anything from #751.packages/atom/effect-atom@systemfsoftware/effect-atom6.0.0, name and version unchangedpackages/atom/effect-atom-react@systemfsoftware/effect-atom-react2.0.0, with #763'suseSyncExternalStorerewrite;useAtomSubscribeleaves the public APIpackages/gherkin/storybook-gherkin@systemfsoftware/storybook-gherkin5.0.0, unchangedcompound-packs/ui-state,compound-packs/storybook-testingreact-runs-no-effect.mdand READMEoxlint-config-recommendedandno-react-effectinoxlint-plugin-effect-platformpackages/oxlint-presets/oxlint-config-frontend@systemfsoftware/oxlint-config-frontend0.1.0Every moved file matches its source byte for byte (CR stripped), except for these edits:
repository,homepageandbugspoint at this repo. Every dependency on systemfsoftware packages becomes a version range backed by a.sfs-depstarball instead ofworkspace:. Each package's lint preset becomes@systemfsoftware/oxlint-config-frontend(workspace:^). The two exact"playwright": "1.64.0"pins becomecatalog:(1.63.0, the version the Nix browsers provide).oxlint.config.tsfiles import the new preset.Lint:lines name the new preset.@systemfsoftware/effect-platform/no-react-effectbecomes@systemfsoftware/ui-state/no-react-effectin the moved rule, its config, tests and directive fixtures.The new preset
@systemfsoftware/oxlint-config-frontendspreads the default export of the pinned generic@systemfsoftware/oxlint-config-recommended4.0.0. It then:no-react-effectas a local JS plugin (dist/plugin.mjs);no-restricted-importsat the root and in every inherited override, so the server-state and React import bans can't be dropped by a later override;.tsxfetch ban and the storypage.screenshotban.Nothing is removed from the generic preset here; that removal is a separate lane. The moved tests come along unchanged apart from the rule-ID and import-path edits:
fetch-in-tsx,server-state-imports,story-screenshot,react-effect,react-rules,no-react-effect, and theui-state-fixture/directory.Toolchain and flake
systemfsoftwareis pinned atd1ab631935c9439bcd16abf2894b09b843494701. The pnpm store comes from itslib.mkConsumerStoreover 24 SYS tarballs: the generic set plus its runtime dependencies. The stryker-js-effect and xstate tarballs ride in the store'ssrc.@systemfsoftware/arethetypeswrong-cliis built as a tarball from theare-the-types-wrong-effectinput, at the revision xstate's lock pins, the same way xstate's flake builds it. It is not taken from the npm registry.check:sfs-sourcesis unchanged and green.packages.<system>.{effect-atom, effect-atom-react, storybook-gherkin, oxlint-config-frontend, workspace-tarballs}pluslib.mkConsumerStore..sfs-depsfrom its existingshellHook. No shell script is added.FONTCONFIG_FILE(DejaVu). Without it, sandboxed chromium lays text out at zero height and the moved storybook-gherkin visibility story fails.Gate changes
Suppression exemption (declared under CONST-W3; operator-approved): this edits a judgment surface, which CONST-E9 bans.
lint:suppressions(package.json) excludes exactly two moved fixture paths from theno-inline-suppressioncheck:packages/oxlint-presets/oxlint-config-frontend/ui-state-fixture/src/react-effect/packages/gherkin/storybook-gherkin/test/browser/scenario-title.deny.tsTheir directives are the inputs the moved tests read to prove the bans. Every other tracked source file is still checked.
New turbo tasks:
test:types,lint:tsgoandtest:browserare added, mirroring SYS.gate:tasksnow runslint lint:tsgo lint:suppressions typecheck typecheck:node test:types test test:browser.typecheckdepends onbuild(as in SYS) so the fixture can resolve the preset'sdist.build.inputsgainsapi-extractor.json,api-extractor.*.jsonandetc/*.api.md, as in SYS.dprint.jsonexcludes**/etc/*.api.md, as SYS does; api-extractor'sapi:checkgates those reports..mergify.ymlis added: the queue rules for this repo.Verification (local, inside
nix develop)Exit codes at head
792645ae315fc20eca5b71a4cc5016aea252c5e8:pnpm format:check0,pnpm check:ci0. The pushed heada268ca700e74c64aa29d34a84a8d991ada03b620changes only theauthorfield of four manifests toTODO <todo@example.com>and adds the.changeset/hungry-doors-stare.mdintent naming@systemfsoftware/oxlint-config-frontendthat thechangeset · shared toolinggate requires.At
2f8a573aa, before the README and.mergify.ymlcommits:pnpm check:sfs-sources0,pnpm lint0,pnpm typecheck0,pnpm test0,pnpm gate:dist0.pnpm journeyscan't run in the authoring container:curlthere points outside the sandbox closure, and the same is true onmain. Thejourneyscheck on this PR is the proof.nix build .#workspace-tarballs .#effect-atom .#effect-atom-react .#storybook-gherkin .#oxlint-config-frontendbuilds. The packed runtime fields of the three moved packages match SYS's published tarballs. Stryker was not run.Code review receipt
ce-code-reviewcovered the branch against base949d20e, with reviewed head14b91ccfe. The final pushed head isa268ca700e74c64aa29d34a84a8d991ada03b620. The commits after the reviewed head are only the.mergify.ymlthe conductor specified, the author-placeholder fix the conductor ordered, and the changeset intent thechangeset · shared toolinggate required; the conductor reviewed all three at that final head.Seven reviewers ran: correctness, project-standards, testing, maintainability, api-contract, adversarial and learnings. An independent validator confirmed all 6 findings it checked. Verdict: Ready with fixes. No P0.
apps/sitelint preset:apps/sitestill extends the generic preset, so the React Effect ban does not lint the app yet. This is by ruling:oxlint.shared.tsstays on the generic preset in this PR. Follow-up: SYS-455.00cc6a6tof3dee06#2, suppression exemption not declared: resolved by the "Gate changes" declaration above.Follow-ups (P2/P3 and settled items, not fixed here)
apps/siteonto@systemfsoftware/oxlint-config-frontendand replace its twouseEffectcall sites..changeset/effect-4-0-1-floor.mdstates a^4.0.1peer floor, andeffect-4-0-5-peer-floor.mdstates 4.0.5.catalogs.peers.effectpublishes^4. The carried bodies are kept byte-identical by ruling.full-version-dependency-ranges.mdandfunny-goats-repeat.mddescribe ranges for packages this repo does not release.storybook-gherkin/AGENTS.md: it says the package has no api-extractor; it has one. The moved text is unedited.@systemfsoftware/sourcecondition, the preset's plugin URL resolves tosrc/plugin.mjs, which does not exist. Published consumers resolvedist/.quiet-hooks-subscribe.mdwould publish effect-atom-react 3.0.0, because the manifest is already 2.0.0. The first releases from this repo reuse SYS's version numbers (6.0.0, 2.0.0, 5.0.0); that is accepted by ruling.ui-state/message prefix. A reworded generic preset would double-report.homepagepoints at a README that does not exist yet.