workspace:, link: and file: resolve only inside the monorepo that
declares them, so any of the three in a published manifest is a
consumer install that dies. The rewrite handled workspace: alone, and
it trusted the manifest it had just written — but npm pack runs
prepack and prepare, which are free to rewrite package.json again.
Cover all three protocols and read the manifest back out of the
archive before pushing it. A version is immutable once it lands:
@hanzogui/[email protected] still carries eleven of these and no publish can
repair it.
Co-authored-by: Hanzo Dev <[email protected]>
The CJS pass ran only where a manifest named a require entry, so an
ESM-only package could drift into the tree and a package marked
commonjs could carry ESM files. Now every package gets all three emits
from tsgo; a .cjs.ts sibling answers for the one file that needs
import.meta, and the CommonJS output is parsed as a script so a module
that cannot load there fails the build by name.
Co-authored-by: Hanzo Dev <[email protected]>
serve:railway just binds 0.0.0.0 (any container host, not a Railway
particular); call it serve:host and update the CI wrapper's three
call sites to match. The health-check comment drops the same
name-drop. RAILWAY_DEPLOYMENT_ID in setup.server.ts is Railway's own
env var and stays — it's the actual boot-time production guard.
Co-authored-by: Hanzo Dev <[email protected]>
Babel and esbuild were never here for TypeScript. Babel carried the static
optimizing compiler and one plugin that appended extensions to esbuild's
emitted imports; source now names its own extensions and the compiler rewrites
them on emit. A sixty-line runner replaces the tool: an ESM emit with
declarations, a CommonJS emit where a manifest states a require entry, and a
native emit where a .native sibling takes its sibling's name. The compiler
packages keep Babel as their own substrate; nothing else runs over the code.
Eighteen packages still carry type errors the previous tool never checked.
The alias step looked up meta['hanzogui'], and the umbrella is NAMED
@hanzo/gui in the tree — so it matched neither that lookup nor the
@hanzogui/* target filter, and published nothing. Every primitive went to the
registry at 8.3.1 while the one package consumers actually depend on stayed
behind, which is the worst shape of all: @hanzo/[email protected] resolved to nothing,
so a pin on it failed outright rather than quietly serving the old code.
Take it by either name, and say so loudly when neither is there — a publish
that silently omits the umbrella looks exactly like one that succeeded.
gui's whole CI lane has been red since Aug 5 and the cause was `oxfmt --check`
inside `bun run lint`, which the `Test` step reaches about eighty seconds in.
Nine authored files had drifted from the format — mechanical, no behaviour — and
two more were machine-written.
Those two are the real finding. The generated per-app gui config moved from
`.hanzogui/` to `.gui/` and `.gitignore` did not follow it, so every app's
generated config sat untracked-but-unignored. The formatter checks what git does
not ignore, so a gate that exists to keep AUTHORED code consistent was failing on
an esbuild bundle. `.gui` is ignored now, beside the old name.
`bun run check` and `bun run lint` both exit 0.
The gate read its own result out of the compiler's prose — `grep -q "error"`
over the captured output — which passes anything that fails without writing
that word. A missing compiler is exactly that: the shell answers `tsgo: command
not found`, the grep misses, and the script prints "Type check passed" having
typechecked nothing. Proven both ways on this tree with tsgo off PATH: the old
script exits 0, this one exits 127.
Diagnostics now stream as they are produced instead of arriving in one block
after the run.
Co-authored-by: Hanzo Dev <[email protected]>
The config was written for a compiler that no longer accepts it: `module: System`,
`moduleResolution: node10`, `baseUrl` and `downlevelIteration` are all removed in
TypeScript 7, and non-relative `paths` targets now need a leading './'. tsgo
reported 692 config errors across ~115 project tsconfigs before this; it reports
zero after.
Measured, not assumed. On apps/kitchen-sink the two compilers agree exactly —
2321 errors at identical file:line:code — and tsgo runs it in 6.0s against tsc's
34.1s. The one diagnostic tsc lacks is TS2882 (side-effect import with no type
declaration), which apps/gui.hanzo.ai/css-modules.d.ts now answers for '*.css'
and for '@docsearch/css', whose specifier carries no extension for the wildcard
to match.
The change is also not the cause of this repo's standing type errors: the same
project reports 2335 errors under the old System/node10 settings and 2321 under
these, so the migration removes fourteen and adds none. Those ~2321 pre-existing
TS2322 errors are a separate problem — committed types/ has drifted from src/ —
and are unrelated to which compiler runs.
Emit is untouched: hanzogui-build still calls the TypeScript API for .d.ts.
Co-authored-by: Hanzo Dev <[email protected]>
The transplant rebuilt the tree on upstream tamagui and carried our own
packages forward by hand, which silently lost seven @hanzo_network/*
packages and apps/team — 735 files with no other home in the workspace.
They are back at the tip of the old lineage's content.
pkgs/ai is NOT restored: @hanzo/ai is published from hanzo-js/ai, so a
copy here would be the duplicate we are trying to avoid.
templates/expo-router is NOT restored: apps/starters/expo-router already
declares that exact package name upstream.
Also fixes a rebrand defect: the blanket tamagui->hanzogui rule rewrote
upstream's GitHub path into github.com/hanzogui/hanzogui, a repo that has
never existed, and it shipped in repository.url for every published
package. The transform now maps the remote to hanzoai/gui and repairs a
tree already branded wrong, so a future sync cannot reintroduce it.
Co-authored-by: Hanzo Dev <[email protected]>
This repo could never sync. There was NO merge-base with tamagui — 372 commits
here against 15,791 there, unrelated histories — because it began as a
copy-paste rebrand with a flattened layout. Every "sync" since was a hand
re-application that drifted, which is why the tree sat on 7.3.1 while upstream
shipped fixes we then rediscovered by hand.
This commit's PARENT IS TAMAGUI. A future sync is `git merge tama/main` then
`node scripts/rebrand.mjs` — a real merge, because the history is now shared.
174 packages: 166 upstream, our 8 restored (chrome, shell, telemetry, recipes,
get, font-geist-{sans,mono}, @hanzo/booker), bento-get gained. 170/170 build.
Our patches to files UPSTREAM ALSO OWNS are carried, which the package-level
delta missed and which was where the value actually was:
- useMedia's server snapshot (`initState ?? getMedia()`). Upstream still
returns undefined there, so every Tamagui Dialog kills a prerender — the
exact crash hanzo.app spent a day on.
- data-slot on web host nodes, absent upstream entirely.
Both applied ONTO upstream's newer files (it rewrote useMedia +150/-63 and
createComponent +160/-55), marked `PATCH (ours, carried across the transplant)`.
Seven traps are encoded in scripts/rebrand.mjs, each found by a gate:
skip itself and lockfiles; special-case the double-branded names in BOTH scoped
and bare form; map path strings, not just paths; drop a level for the flattened
group; check disk rather than a stale index.
Rust build artifacts are NOT committed. An earlier draft of this commit swept
apps/desktop/src-tauri/target/debug in via `git add -A` — 3,859 files including
a 272MB .a, over GitHub's 100MB cap, so the push could never have landed. They
are gitignored now.
Co-Authored-By: Hanzo Dev <[email protected]>
BREAKING CHANGE: @tamagui/lucide-icons renamed to @tamagui/lucide-icons-2
due to npm registry metadata limit (100MB, 1400+ versions). Update imports:
- import { X } from '@tamagui/lucide-icons'
+ import { X } from '@tamagui/lucide-icons-2'
Also disables skipPublishIfUnchanged on all leaf packages to avoid
version mismatches where deps point to unpublished versions.
peerDeps with "*" caused bun to install non-canary versions during canary
releases. Move font-size, font-inter, font-silkscreen, core etc back to
regular dependencies. Add "skipPublishIfUnchanged": true field to leaf
packages (fonts, icons) and update release script to use that instead of
the dependency-graph heuristic.