typescript 7.0.2 is the native compiler and exports no JavaScript API, so
@glint/core cannot read it. It comes in aliased as tsgo and does the
typechecking; typescript stays on the 6 line for glint.
jsconfig.json is the only program here — it has no .ts files, and jsconfig
implies checkJs, so the check runs over the .js and .gjs the paths map. 172
diagnostics, the same set on 6.0.3 and on 7.0.2.
Co-authored-by: Hanzo Dev <[email protected]>
The committed lockfile could not be installed: it still carried a patch entry for
@ember-compat/tracked-built-ins that pnpm-workspace.yaml no longer declares, so
pnpm refused a frozen install outright, and it held typescript 5.6.3 against a
catalog that declared 7.0.2. Nothing had ever installed that pin.
typescript 7 is the native compiler and exports no JavaScript API. @glint/core
loads that API, and glint is the only thing typechecking this repo, so the
declared 7.0.2 would have taken glint out the moment anyone installed it. The
catalog holds typescript on the 6 line, and the lockfile now reproduces the
ranges around it.
Co-authored-by: Hanzo Dev <[email protected]>
A version written into a manifest is written into every manifest that wants it,
which is how eslint came to exist in a hundred and four forms across this estate
and how a package came to resolve twice at run time. The catalog moves the number
out of the manifest: a manifest names the package, the workspace names the
version.
Four are held below their latest because the newer release cannot be used, and
the reason is recorded rather than the version alone: @noble/hashes 2 renamed
every subpath the web3 stack imports, @splinetool/runtime 2 depends on a package
that was never published, @dynamic-labs 5.4.1 the same, and react-resizable-panels
3 points its types condition at the bundle.
point the registry at our verdaccio, which proxies and caches all of npm
alongside our own scoped packages. lockfiles are untouched: npm and pnpm
both honor .npmrc at fetch time, so no re-resolution is needed.
Co-authored-by: Hanzo Dev <[email protected]>
One family. Font stacks name Zen and fall back to the native faces, tokens
name the role rather than a face, and the packages that used to supply a
face now point at @hanzo/font.
Self-hosted @font-face blocks are removed rather than renamed: rewriting the
family in one would leave a src pointing at a file this repo no longer ships.
@hanzo/font carries the binaries and declares the faces, so the local copies
go with the declaration that used them.
Comments naming a face we no longer use are deleted, not reworded.
The forge takes a repo's workflows from the first of its search paths that
exists, and .hanzo/workflows comes before .github/workflows. This repo has
carried .hanzo/workflows/cicd.yml since it adopted the canonical lane, so
everything under .github/workflows has been inert since that day. The run
history says the same: of eight runs, four are the live cicd lane and the other
four — linting, licenses and two stale-pr-closer — were all cancelled, queued
against ubuntu-latest and debian-12, labels no runner here answers.
So this deletes dead files rather than migrating live ones, and nothing is
revived:
- check-pr-body, labeler, stale-pr-closer and dependabot-pnpm-dedupe are
GitHub-platform automation: a dependabot body rewrite, a pull request
labeller, a stale closer, and a lockfile dedupe on branches that do not exist
here.
- linting, licenses, migration-tests and tests hold the real value, and all four
want the same harness — a discourse_test container, a bundle install of the
whole Gemfile, a pnpm install of a monorepo this size, and for the suites a
Postgres and a Redis. hanzo.yml already records why that is a harness rather
than a push gate, and this repo's gate stays what it says it is: every tracked
Ruby file parses.
- release-notes turned bin/rake release_note:generate into a step summary and an
artifact. The rake task is untouched and still runs by hand.
What goes with them, none of which has run since the lane moved: rubocop,
syntax_tree, eslint, prettier, ember template lint, stylelint, glint, the i18n
lint, the RubyGems and JS licence checks, and the rspec, qunit and migration
suites.
`ruby -c` resolves a script the way the loader does, so a first line
naming another interpreter makes it hunt for a `#!...ruby` line. Rakefile
says `#!/usr/bin/env rake`; ruby finds no ruby line and reports "no Ruby
script found in input" on a file that parses fine. That was the red.
parse_file reads the file as source, which is the fact the gate asserts,
and one interpreter replaces 5851 process spawns.
Co-authored-by: Hanzo Dev <[email protected]>
kv named the wrong server binary (kv-server, not valkey-server) and assumed a C
compiler the reusable installs only for Go callers; forum assumed a ruby the
reusable never provisions; rocm-rs left gpu-sort on, whose nested nightly
build-std step no stock runner can do; insights-rs asked for --all-features,
which selects the live-endpoint e2e feature.
Co-authored-by: Hanzo Dev <[email protected]>
github.com has no runner for hanzo-build-linux-amd64, so a caller under
.github/workflows is a gate that can never be scheduled. This is the ~7-line
caller on the plane that can (git.hanzo.ai git-runner fleet), pinned @v1.
Co-authored-by: Hanzo Dev <[email protected]>
The README was Discourse's, verbatim: their logo, their mission, their team,
their accessibility contact — and a hosting pitch linking to
discourse.org/pricing, which sent anyone landing here to a third party's
checkout. Read as ours it claims a community platform we do not run;
forum.hanzo.ai 404s and the only Hanzo commits on the fork are CI, a hero
banner and agent docs.
Now says what it is: a tracking fork of Discourse with nothing built on top,
nothing deployed, where to go for Discourse and where to go for Hanzo. Kept
the upstream dev-setup links, which are the ones that actually apply. Lineage
and GPL-2.0 attribution kept and made explicit.
Superseded: the Hanzo GitHub App pushes a webhook, so the forge tracks GitHub
without a per-repo workflow. This file called git.hanzo.ai/api/v1/.../mirror-sync
— a Gitea API for a system we no longer drive — and would sit inert in every repo.
One mechanism, in one place, instead of ~350 copies of a cron.
git.hanzo.ai mirrors this repo by PULL on a ~10-minute interval, and arcd runs
CI/CD there — so every push waited out that interval before anything built.
This asks Gitea to pull HEAD immediately.
Latency only: the repo already mirrors via the App webhook, so a missing
HANZO_GIT_TOKEN or a failed curl is non-fatal and never fails the push.
Idempotent (mirror-sync just pulls HEAD) and concurrency-coalesced.
Adds https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/enterkeyhint
to the search inputs.
This hint is used for mobile devices to guide what label
is shown on the onscreen keyboard. By default `return` is
shown, now for search we will see `search`.
Also add `type="search"` to the full page search input for
further guidance.
This feature was originally experimental. We made it baseline in #29572, however this was met with some pushback, so we have decided to make it experimental again.
The original PR couldn't be reverted, but this one basically does the same by cherry-picking all the changes back.
This PR does some things to the about page:
- Hide the stat if there are 0 admins/moderators.
- Count admins and moderators separately, so a user who is both will add
to both counts.
- A user who is both will still show up as a moderator, even if `admins`
is hidden.
Follow-up to https://github.com/discourse/discourse/pull/31271
In the linked PR, we made `<GroupChooser />` use the site's preloaded
list of groups instead of fetching the list from the servers every time
the component is triggered. However, when a site has thousands of
groups, the performance issue has shifted from the server to the browser
— `<GroupChooser />` takes several seconds to render in the browser for
a site with thousands of groups and the sites becomes completely
unresponsive while the component is rendering.
This PR changes the `<GroupChooser />` so it limits the displayed groups
to 100, with ability to filter the list to show more groups when there
are more than 100 groups.
This uses the new `triggerComponent` functionality to implement a button
without the default `DButton` component classes, which helps themes
avoid applying unintentional styling.
A regression introduced in 06907ce96c
incorrectly passes label to the trigger component, but also passes
translatedLabel instead of label to the menu.
The existing test was checking for the presence of "label", but it was
actually returning true because the test was showing "en.label". The
test has been modified in consequences.
In a few places throughout the app, when we render the `<GroupChooser
/>` component, we fetch the full groups list of the site from the
`/groups/search` endpoint. This is wasteful because the full groups list
is already included in the preloaded data that's sent to the client app
on the initial page load, so we can just use this preloaded list for
`<GroupChooser />` and we can avoid making an HTTP request.
Internal topic: t/147297.
This property allows to have a custom component for the DMenu trigger
instead of using a `DButton` which comes with its own css class for
example.
Example:
```gjs
const myComponent = <template><span ...attributes>test</span></template>;
<DMenu @triggerComponent={{myComponent}}>...</DMenu>
```
⚠️ It's important to pass the attributes otherwise your custom
trigger won't work.
Empty slugs for topics break Discourse. This makes sure that we always
fall back to "topic" as default. And it also uses the configured slug
generation method instead of always using ASCII.
A previous refactor of the `Service::Base::Step` class introduced a
non thread-safe behavior. `#call` mutates instance variables at runtime,
and since a step instance is the same for any given service class, this
can sometimes lead to `context` being the wrong one for the running
service.
This patch makes use of `Concurrent::ThreadLocalVar` to fix the issue.
The weekly job can take more than 2 hours to run on larger sites. It is
ideal for the jobs to be as small as possible and this is what this
commit attempts.