57971 Commits
Author SHA1 Message Date
zeekayandHanzo Dev d1a4ed1411 Typecheck on the native compiler, keep 6 for the tools
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]>
2026-09-17 10:25:14 -07:00
zeekayandHanzo Dev 9cc4dfea4e Install the dependencies this repo declares
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]>
2026-09-17 10:24:10 -07:00
zeekay 8aead114f8 State a version once
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.
2026-09-11 13:47:31 -07:00
zeekayandHanzo Dev ed15f68edf route npm through pkg.hanzo.ai
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]>
2026-09-11 13:47:30 -07:00
zeekayandHanzo Dev a92d333eb0 Name the reusable at the path v1 has
Co-authored-by: Hanzo Dev <[email protected]>
2026-09-09 00:28:14 -07:00
zeekay fa179cd6f1 the face is Zen, and it ships from @hanzo/font
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.
2026-09-01 13:53:10 -07:00
zeekay f4e005afb9 ci: remove the workflows this forge has never collected
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.
v0.1.0
2026-08-13 21:13:14 -07:00
zeekayandHanzo Dev 9611fcff21 ci: parse Ruby with the parser, not the loader
`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]>
2026-08-09 23:44:45 -07:00
zeekayandHanzo Dev 0b31493965 ci: fix the gate to assert the code, not the runner image
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]>
2026-08-06 02:39:50 -07:00
zeekayandHanzo Dev d64131dced ci: canonical pair — hanzo.yml + forge caller
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]>
2026-08-06 02:31:33 -07:00
zeekay d65a80ac74 docs(readme): say this is a tracking fork, not a product
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.
2026-08-01 13:39:38 -07:00
zeekay fdfe779f40 ci: drop the Gitea mirror-sync nudge
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.
2026-07-27 10:31:21 -07:00
zeekay e82e8a246e ci: nudge git.hanzo.ai to pull on push
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.
2026-07-27 08:16:39 -07:00
zeekay ffd6a29d56 docs(brand): add hero banner 2026-06-28 20:21:03 -07:00
zeekay a993bed99f chore(brand): dynamic hero banner 2026-06-28 20:21:02 -07:00
zooqueen 7f481fdefa chore: restore upstream LICENSE (GPL-2.0 — Discourse) 2026-06-19 00:39:37 -07:00
zooqueenandHanzo Dev c092c7f371 docs: tidy LLM.md indexes; CLAUDE.md -> LLM.md symlink convention
Co-authored-by: Hanzo Dev <[email protected]>
2026-06-17 09:36:01 -07:00
zooqueenandHanzo Dev 2d6114f240 Add agent project docs (CLAUDE.md, LLM.md)
Co-authored-by: Hanzo Dev <[email protected]>
2026-05-31 21:41:52 -07:00
Martin BrennanandGitHub 0cf9fdfff5 UX: Add enter key hints for search (#31298)
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.
2025-02-12 15:51:44 +10:00
Ted JohanssonandGitHub 4630b27023 DEV: Move image auto-grid back to experimental (#31296)
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.
2025-02-12 11:18:24 +08:00
Ted JohanssonandGitHub 59a22e259d DEV: Separate admins and moderators on about page (#31272)
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.
2025-02-12 09:57:53 +08:00
KelvandGitHub 4086e2aab2 DEV: delete nameValidation mixin (#31275)
This mixin is now ready for deletion, all uses of it has been removed
from plugins.
2025-02-12 09:50:13 +08:00
6b3f10f449 Build(deps-dev): Bump puppeteer-core from 24.1.1 to 24.2.0 (#31207)
Bumps [puppeteer-core](https://github.com/puppeteer/puppeteer) from
24.1.1 to 24.2.0.
- [Release notes](https://github.com/puppeteer/puppeteer/releases)
-
[Changelog](https://github.com/puppeteer/puppeteer/blob/main/CHANGELOG.md)
-
[Commits](https://github.com/puppeteer/puppeteer/compare/puppeteer-core-v24.1.1...puppeteer-core-v24.2.0)

---------

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: Hanzo Dev <[email protected]>
Co-authored-by: Discourse CI <[email protected]>
2025-02-12 02:27:36 +01:00
de6d15139c Build(deps): Bump msgpack from 1.7.5 to 1.8.0 (#31225)
Bumps [msgpack](https://github.com/msgpack/msgpack-ruby) from 1.7.5 to
1.8.0.
-
[Changelog](https://github.com/msgpack/msgpack-ruby/blob/master/ChangeLog)
-
[Commits](https://github.com/msgpack/msgpack-ruby/compare/v1.7.5...v1.8.0)

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: Hanzo Dev <[email protected]>
2025-02-12 02:26:30 +01:00
Jarek RadoszandGitHub 4885eaea5c DEV: Cancel header calculations on destroy (#31294) 2025-02-12 02:03:19 +01:00
092492991c Build(deps-dev): Bump webmock from 3.24.0 to 3.25.0 (#31227)
Bumps [webmock](https://github.com/bblimke/webmock) from 3.24.0 to
3.25.0.
-
[Changelog](https://github.com/bblimke/webmock/blob/master/CHANGELOG.md)
-
[Commits](https://github.com/bblimke/webmock/compare/v3.24.0...v3.25.0)

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: Hanzo Dev <[email protected]>
2025-02-12 01:15:52 +01:00
9d188d58e9 Build(deps-dev): Bump bullet from 8.0.0 to 8.0.1 (#31263)
Bumps [bullet](https://github.com/flyerhzm/bullet) from 8.0.0 to 8.0.1.
- [Changelog](https://github.com/flyerhzm/bullet/blob/main/CHANGELOG.md)
- [Commits](https://github.com/flyerhzm/bullet/compare/8.0.0...8.0.1)

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: Hanzo Dev <[email protected]>
2025-02-12 01:15:34 +01:00
Osama SayeghandGitHub 031648891c FIX: Limit displayed groups in <GroupChooser /> to 100 groups (#31288)
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.
2025-02-12 03:14:57 +03:00
db0a21372e Build(deps-dev): Bump rubocop from 1.71.1 to 1.71.2 (#31183)
Bumps [rubocop](https://github.com/rubocop/rubocop) from 1.71.1 to
1.71.2.
- [Release notes](https://github.com/rubocop/rubocop/releases)
-
[Changelog](https://github.com/rubocop/rubocop/blob/master/CHANGELOG.md)
-
[Commits](https://github.com/rubocop/rubocop/compare/v1.71.1...v1.71.2)

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: Hanzo Dev <[email protected]>
2025-02-12 01:10:44 +01:00
8c61a097cc Build(deps): Bump net-smtp from 0.5.0 to 0.5.1 (#31203)
Bumps [net-smtp](https://github.com/ruby/net-smtp) from 0.5.0 to 0.5.1.
- [Release notes](https://github.com/ruby/net-smtp/releases)
- [Changelog](https://github.com/ruby/net-smtp/blob/master/NEWS.md)
- [Commits](https://github.com/ruby/net-smtp/compare/v0.5.0...v0.5.1)

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: Hanzo Dev <[email protected]>
2025-02-12 01:10:26 +01:00
9aafab7e83 Build(deps-dev): Bump parser from 3.3.7.0 to 3.3.7.1 (#31204)
Bumps [parser](https://github.com/whitequark/parser) from 3.3.7.0 to
3.3.7.1.
-
[Changelog](https://github.com/whitequark/parser/blob/master/CHANGELOG.md)
-
[Commits](https://github.com/whitequark/parser/compare/v3.3.7.0...v3.3.7.1)

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: Hanzo Dev <[email protected]>
2025-02-12 01:10:04 +01:00
f844a1f714 Build(deps-dev): Bump rspec-rails from 7.1.0 to 7.1.1 (#31223)
Bumps [rspec-rails](https://github.com/rspec/rspec-rails) from 7.1.0 to
7.1.1.
-
[Changelog](https://github.com/rspec/rspec-rails/blob/main/Changelog.md)
-
[Commits](https://github.com/rspec/rspec-rails/compare/v7.1.0...v7.1.1)

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: Hanzo Dev <[email protected]>
2025-02-12 00:19:47 +01:00
Blake EricksonandGitHub 15b0cc91b2 FIX: User profile not loading with an empty export (#31290)
If a user has an export that doesn't have a file it can cause their
profile page to not load.
2025-02-11 16:18:06 -07:00
4f1f26ab4b Build(deps-dev): Bump rspec-core from 3.13.2 to 3.13.3 (#31222)
Bumps [rspec-core](https://github.com/rspec/rspec-core) from 3.13.2 to
3.13.3.
- [Release notes](https://github.com/rspec/rspec-core/releases)
-
[Changelog](https://github.com/rspec/rspec-core/blob/main/Changelog.md)
- [Commits](https://github.com/rspec/rspec-core/commits)

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: Hanzo Dev <[email protected]>
2025-02-12 00:17:43 +01:00
96ccafc23e Build(deps): Bump rdoc from 6.11.0 to 6.12.0 (#31224)
Bumps [rdoc](https://github.com/ruby/rdoc) from 6.11.0 to 6.12.0.
- [Release notes](https://github.com/ruby/rdoc/releases)
- [Changelog](https://github.com/ruby/rdoc/blob/master/History.rdoc)
- [Commits](https://github.com/ruby/rdoc/compare/v6.11.0...v6.12.0)

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: Hanzo Dev <[email protected]>
2025-02-12 00:17:08 +01:00
KrisandGitHub 9ed2f4a7d9 UX: remove main-outlet-wrapper margin reset for mobile (#31286)
Reported here
https://meta.discourse.org/t/do-auto-margins-still-need-to-be-unset-on-mobile/351503

This helps better handle some situations where we want to center content
on large screens while using mobile view
2025-02-11 16:16:26 -05:00
KrisandGitHub 3340b57b4f DEV: use custom trigger for sidebar more section (#31285)
This uses the new `triggerComponent` functionality to implement a button
without the default `DButton` component classes, which helps themes
avoid applying unintentional styling.
2025-02-11 15:46:37 -05:00
Joffrey JAFFEUXandGitHub 65a9818c32 FIX: correctly display label (#31282)
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.
2025-02-11 20:11:04 +01:00
Osama SayeghandGitHub 4e5f22ce75 FIX: Don't load all groups when rendering <GroupChooser /> (#31271)
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.
2025-02-11 21:32:02 +03:00
Mark VanLandinghamandGitHub 2ab8b28382 FIX: JS error when .header-cloak isn't present (#31281)
With some customizations, this element may not be on the page. Instead
of erroring, just continue on without the cloak.
2025-02-11 12:28:49 -06:00
Joffrey JAFFEUXandGitHub 06907ce96c DEV: supports triggerTag on DMenu (#31278)
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.
2025-02-11 18:19:00 +01:00
Discourse Translator BotandGitHub e47a01242a Update translations (#31276) 2025-02-11 16:43:08 +01:00
Gerhard SchlagerandGitHub 72956d553b DEV: Update default config for uploads_importer (#31208) 2025-02-11 16:33:15 +01:00
Gerhard SchlagerandGitHub a76d83fd20 DEV: Use correct method for creating slugs (#31273)
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.
2025-02-11 16:29:08 +01:00
6f7fb6adf7 Build(deps-dev): Bump @discourse/lint-configs from 2.3.1 to 2.4.0 (#31205)
Bumps
[@discourse/lint-configs](https://github.com/discourse/lint-configs)
from 2.3.1 to 2.4.0.
- [Commits](https://github.com/discourse/lint-configs/commits)

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: Hanzo Dev <[email protected]>
2025-02-11 14:34:25 +00:00
Jarek RadoszandGitHub 8ec6504f28 DEV: Fix mixed-decls sass deprecation (#31279)
See: https://sass-lang.com/d/mixed-decls

```diff
- WARNING: 253 deprecations encountered while compiling scss.
+ WARNING: 242 deprecations encountered while compiling scss.
```
2025-02-11 15:33:10 +01:00
Jarek RadoszandGitHub cfc5d300d3 DEV: Don't run scripts on pnpm dedupe (#31274) 2025-02-11 13:57:02 +01:00
David TaylorandGitHub 8055e9d493 DEV: Update to OmniAuth 2.0 (#25707) 2025-02-11 11:18:07 +00:00
Loïc GuitautandLoïc Guitaut c2665c197e DEV: Make Ruby services thread-safe
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.
2025-02-11 11:18:42 +01:00
Bianca NenciuandGitHub 2e41cd867a DEV: Split weekly job into multiple smaller jobs (#31260)
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.
2025-02-11 10:26:45 +02:00