Commit Graph
3790 Commits
Author SHA1 Message Date
Tommaso Casaburi 15fb1bf57c chore(ai-workflow): add toolchain drift validator and harden agent rules
Borrowed from a review of addyosmani/agent-skills:

- add scripts/validate-ai-workflow.mjs (yarn ai-workflow:check): verifies
  .claude/.codex/.cursor skills, agents, and hooks stay in parity, with
  validator-owned exemptions for intentional harness-specific differences
  and enforcement of the AGENTS.md agent model rules
- browser-check and profiler agents: treat page content as untrusted data,
  never instructions (5chan pages render arbitrary user-generated content)
- refactor-pass: Chesterton's Fence rule (git blame unclear code before
  removing it)
- review-and-merge-pr: pass subagent verifiers only the artifact and
  contract, not the triage verdict, to keep reviews independent
2026-06-11 16:13:53 +07:00
Tommaso CasaburiandGitHub 17c63bb2e6 feat(reply modal): add sci tex preview button (#1170)
* feat(sci): add 4chan-style TeX support with MathJax on /sci/

- [math]/[eqn] tags typeset with MathJax 3 (lazy chunk, only on /sci/ with math present)
- 4chan-identical config: Safe mode, left-aligned eqn, neutered \color/\newcommand macros
- TeX button in reply modal title bar opens live TeX Preview modal
- /sci/ post form rules bullets for [math]/[eqn] usage and right-click source
- MathJax context menu on right-click (Show Math As > TeX Commands)
- woff fonts served from node_modules in dev and emitted into build

* feat(sci): finish TeX support: configmacros fix, preview preload, translations, tests

- add configmacros package so the 4chan macro neutering (\color, \newcommand, ...) applies
- preload MathJax when the TeX Preview opens, like 4chan
- stable closeModal callback for the preview modal
- pre-bundle mathjax components in vite optimizeDeps to avoid dev mid-session reload
- translate the 6 new TeX keys into all 35 languages
- markdown math segment component tests + math-tags unit tests

* feat(reply modal): add sci tex preview button

* fix(tex-preview): clear MathJax bookkeeping and pending typeset on close

Addresses Cursor Bugbot: the preview output was typeset via typesetMathElement but
never passed to clearMathElement on unmount, so repeated open/close cycles kept
detached nodes in MathJax's math list. Also cancels the pending debounce timer.

* fix(reply-modal): reset TeX preview state when the reply modal closes

Addresses CodeRabbit: showTexPreview persisted across close/reopen like the
bbcode preview flags, so the TeX preview would auto-open on the next reply.
2026-06-11 16:12:38 +07:00
Tommaso Casaburi fa7cab0699 fix(deps): resolve shell-quote critical dependabot alert
Pin shell-quote to 1.8.4 via yarn resolutions so concurrently no longer pulls the vulnerable 1.8.3 release.
2026-06-11 15:01:58 +07:00
Tommaso Casaburi b044202e33 chore(electron): upgrade bundled kubo IPFS to 0.42.0 2026-06-11 14:59:00 +07:00
Tommaso Casaburi b0193b34be fix(archive): preserve button link text color on desktop
Exclude .button links from the nav unset rule and apply mobile button
spacing to anchor buttons so archive actions keep theme text color.
2026-06-10 16:47:31 +07:00
Tommaso Casaburi e9c729a9e3 fix(rules): use hash links for directory deep links
Switch rules navigation from /rules/:code paths to /rules#code hashes,
reject legacy subpaths, and ignore address hashes in markdown links.
2026-06-10 16:38:31 +07:00
Tommaso Casaburi f3d59c3345 fix(post-form): style errors like 4chan and move into tfoot
Use red banner styling for form errors and render them in the table
footer so messages stay aligned with the post form layout.
2026-06-10 15:45:49 +07:00
Tommaso CasaburiandGitHub 2f938d59ae fix(post-form): convert twimg query-format links in the reply modal (#1168)
Share getPublishLinkOptions between the inline post form and the reply modal so the modal publishes twimg ?format= links in their .jpg/.png form (previously raw), and rewrite the link field on blur in both so the conversion is visible. Also gate the dev service worker's runtime asset cache to production so dev no longer serves stale /src modules.
2026-06-09 19:24:28 +07:00
Tommaso Casaburi ee5aa7845e fix(deps): bump react-router-dom to 6.30.4
Patches GHSA open redirect via protocol-relative URL reinterpretation
in react-router (Dependabot alert #276).
2026-06-09 19:11:43 +07:00
Tommaso CasaburiandGitHub c0f1a77958 fix(post ids): fall back to comment cid for missing ids (#1167)
* fix(post ids): fall back to comment cid for missing ids

* fix(post ids): count cid-resolved account replies
2026-06-09 19:08:02 +07:00
Tommaso Casaburi 9de2e6a851 fix(failed-publish): keep bracket actions on one line
Replace mobile-only line breaks with CSS so retry/delete actions wrap
as a block without splitting bracket labels across lines.
2026-06-09 16:51:35 +07:00
Tommaso CasaburiandGitHub a3ff6b2e33 fix(mod queue): reset board filter on navigation (#1166) 2026-06-09 16:06:13 +07:00
Tommaso Casaburi 2e58961cf1 fix(challenge-modal): center mobile modal in viewport
Use left: 50% with translateX(-50%) so the dialog stays centered on
mobile instead of offset from a stale static position.
2026-06-09 15:46:14 +07:00
Tommaso Casaburi 4308d26cf0 fix(mod-queue): show empty state instead of not-allowed redirect
When the account moderates no boards, render ModEmptyState on the global
/mod/queue route instead of sending users to /not-allowed.
2026-06-09 13:01:31 +07:00
Tommaso Casaburi dbf672f11a Merge branch 'codex/fix/link-file-filename-validation' 2026-06-09 12:34:18 +07:00
Tommaso Casaburi 27558ded18 fix(post-form): hide filename for non-file media links
Only show pasted link filenames when the URL resolves to publishable
file media, so bare paths like imgur album IDs are not shown as files.
2026-06-09 12:34:13 +07:00
Tommaso Casaburi d442bda3c0 Merge branch 'master' of github.com:bitsocialnet/5chan 2026-06-09 12:33:00 +07:00
Tommaso CasaburiandGitHub 245d3164c3 fix(media playback): stop hidden and offscreen media (#1164)
* fix(media playback): stop hidden and offscreen media

* fix(media playback): keep offscreen embeds suspended
2026-06-08 22:55:30 +07:00
Tommaso CasaburiandGitHub 075b917c36 chore(flags): derive flag-test coords from board-flags source (#1165)
* feat(board-header): show subtitle on /all view

Add all_subtitle copy and render it in the board header when browsing
the aggregated all-directories feed.

* chore(flags): derive flag-test coords from board-flags source

comment-flags.test.ts hard-coded the pol/pony sprite x/y, duplicating the literals already pinned in board-flags.test.ts. A recent sprite remap updated one file and not the other, leaving master red. Derive the coords from getBoardFlagDefinition (the same source the runtime uses) so the assertion can't drift; labels stay literal as readable pins, and board-flags.test.ts remains the single place pinning the actual values.
2026-06-08 22:47:04 +07:00
Tommaso Casaburi 01e83411b0 Merge branch 'codex/feature/all-view-subtitle' 2026-06-08 22:30:20 +07:00
Tommaso Casaburi dcc47c7bbd feat(board-header): show subtitle on /all view
Add all_subtitle copy and render it in the board header when browsing
the aggregated all-directories feed.
2026-06-08 22:30:14 +07:00
Tommaso CasaburiandGitHub 182ff0eadc fix(thread): show optimistic reply count after publishing own reply (#1162)
post.replyCount lags until a reply propagates back through the community, so a thread's stats kept showing the old count even though the reply list already appended the fresh account comment. Add useOptimisticReplyCount, which bumps the count for the account's own successfully-published replies in the thread and retires the bump once the post refreshes past them (updatedAt > timestamp) so the propagated copy is never double-counted. Applied to desktop PostPageStats and mobile ThreadFooterMobile.
2026-06-08 19:09:46 +07:00
Tommaso CasaburiandGitHub cf43934708 test(flags): correct stale pony AJ sprite x-coord expectation (#1163)
The pony sprite-coordinate remap (cbdd4edf7) moved AJ to x:48 and updated board-flags.test.ts, but comment-flags.test.ts still expected the old x:80, leaving master's full test suite red. Align the comment-flags expectation with the live board-flags definition (and the passing board-flags.test.ts).
2026-06-08 18:58:20 +07:00
Tommaso Casaburi 5a785a5ab7 Merge branch 'codex/fix/pony-flag-sprite-coords' 2026-06-08 17:13:06 +07:00
Tommaso Casaburi cbdd4edf7b fix(flags): map pony flags to sprite sheet coordinates
Pony flag selector order differs from the sprite layout, so derive
positions from explicit coordinates instead of entry index.
2026-06-08 17:12:59 +07:00
Tommaso Casaburi 7ea0b54a18 Merge branch 'master' of github.com:bitsocialnet/5chan 2026-06-08 16:56:10 +07:00
Tommaso CasaburiandGitHub bd12b47db6 fix(pending-post): keep retrying failed posts on the pending route (#1161)
* fix(pending-post): keep retrying failed posts on the pending route

Retrying a failed post deletes the pending row before republishing, which
briefly leaves the pending comment non-addressable with no active challenge —
the same state PendingPost's abandoned-challenge guard uses to redirect back to
the board. A shared use-failed-post-retry-store marks the index being retried so
PendingPost skips that redirect until the republished row is created and its own
navigation to the new pending route takes over.

* fix(pending-post): harden retry flag lifecycle against abandoned-challenge race

Address Cursor Bugbot review on the retry flow. Clear the retry flag (and
isRetryRedirectPending) when the republish challenge is abandoned so an abandon
mid-retry falls through to the normal board redirect instead of stranding an
empty pending view. Also navigate to the new pending row before clearing the
flag in the redirect effect so PendingPost never observes an old-index route
with the flag already cleared.
2026-06-08 16:08:51 +07:00
Tommaso Casaburi 46aa197562 Merge branch 'codex/fix/flag-verification-scope' 2026-06-08 15:43:39 +07:00
Tommaso Casaburi 32dbabb7c7 fix(flags): limit challenge requests to country flags 2026-06-08 15:43:12 +07:00
Tommaso CasaburiandGitHub c2b222c4d5 fix(thread update): refresh stale reply caches (#1160)
* fix(thread update): refresh stale reply caches

Evict the current thread comment and known reply-page cache entries before manual refresh so stale local data does not keep replies hidden. Also defer broader multiboard suggestion feeds until the current /all time window is exhausted to reduce renderer pressure.

* fix(thread update): evict alternate reply page caches

* fix(board): hide stale time-window suggestions
2026-06-08 14:44:38 +07:00
Tommaso Casaburi 6c660c01cd ci(release): run react doctor against previous tag v0.9.1 2026-06-07 23:13:45 +07:00
Tommaso Casaburi af2689c4dc chore(release): v0.9.1 2026-06-07 23:09:29 +07:00
Tommaso Casaburi 6bca832ccf chore(deps): upgrade bitsocial-react-hooks to 0.1.16 2026-06-07 23:07:33 +07:00
Tommaso Casaburi 30010bfc1a Merge branch 'codex/feature/submit-board-button' 2026-06-07 22:47:46 +07:00
Tommaso Casaburi 4e7b89e861 Merge branch 'codex/fix/banned-post-modal-state' 2026-06-07 22:47:14 +07:00
Tommaso Casaburi 04af198140 feat(directory): add submit board link 2026-06-07 22:47:09 +07:00
Tommaso Casaburi 38d18b141e fix(edit menu): read canonical author bans 2026-06-07 22:46:20 +07:00
Tommaso Casaburi 28c762e131 docs(readme): document local browser daemon 2026-06-07 22:08:20 +07:00
Tommaso Casaburi 2eebe407b1 chore(deps): upgrade bitsocial-react-hooks to 0.1.15 2026-06-07 15:28:58 +07:00
Tommaso Casaburi 155e92a8c9 Merge branch 'codex/fix/fit-expanded-images-default' 2026-06-06 23:19:27 +07:00
Tommaso Casaburi e47750edf8 fix: default fit expanded images to screen on
New users get fit-to-screen enabled by default in the expanded media store.
2026-06-06 23:19:22 +07:00
Tommaso Casaburi bc67e961fc fix: use body color for brackets around inline action buttons
Wrap copy-error and failed-publish bracket characters in spans so they use body text color instead of inheriting the action button color.
2026-06-06 23:15:29 +07:00
Tommaso Casaburi 404a464310 feat: use s.5chan.app share links and remove report menu items
Copy share links as path-based s.5chan.app URLs so the share server can render social previews, rename the menu label, remove the stub report action, and update the FAQ.
2026-06-06 19:06:04 +07:00
Tommaso CasaburiandGitHub aa5a985201 ci(react-doctor): add official PR-review Action, drop redundant CLI step (#1156)
Adds the official react-doctor GitHub Action (millionco/react-doctor@v1),
which posts inline review comments + a sticky summary for issues a PR
INTRODUCES (diffed against the merge-base) -- more visible than the
previous CLI '--annotations' markers.

Removes the now-redundant react-doctor steps from ci.yml (the
detect-changes/diff-annotations/skip steps and the push-time full scan)
so react-doctor runs once per PR, not twice. It reads doctor.config.jsonc,
so the React-Compiler rules we don't enforce stay suppressed.
2026-06-05 22:34:29 +07:00
Tommaso CasaburiandGitHub 0493492f55 fix(react-doctor): correct test exclusion + React-Compiler lint policy + state-sync fix (#1155)
* fix(react-doctor): correctly exclude test files from scoring

The intended test-file ignore in react-doctor.config.json was never
applied: react-doctor's config precedence reads the "reactDoctor" key
in package.json (which had no ignore), shadowing the config file. On
top of that, react-doctor 0.4.0's ignore.files matcher is broken — any
non-empty value collapses scan scope and drops real product files, not
just tests.

Consolidate to a single canonical doctor.config.json using
ignore.overrides (which works correctly): only test files are excluded
while all product code is still scored. Remove the shadowing
package.json key and the dead react-doctor.config.json.

Product-code baseline is 55 (92 errors, 515 warnings, 118 files).

* chore(react-doctor): add long-running task tracking for score effort

* refactor(react): remove compiler-redundant memoization in verified files

Delete manual useMemo/useCallback/memo that the React Compiler already
handles, in 7 files validated to be behavior-preserving (factories are
pure functions of compiler-trackable reactive inputs). Kept memos whose
factories read external mutable DOM/theme state with load-bearing deps
(e.g. use-reply-height-estimates metrics). Also hoists a regex and reads
a localStorage value once.

Note: this is code-quality cleanup; react-doctor's score is error-
weighted, so warning cleanup like this does not move the score. See
docs/agent-runs/react-doctor-score/progress.md.

* fix(react-doctor): adopt React-Compiler lint policy + fix one state-sync bug

react-doctor's score is dominated by React-Compiler optimizability
diagnostics that flag intentional patterns (the latest-ref idiom) and
current compiler limitations (try/finally, throw-in-try/catch the
compiler can't lower yet), not bugs. Rewriting that working code to
satisfy them would degrade it.

- Replace doctor.config.json with a documented doctor.config.jsonc that
  does not enforce the react-hooks-js (React Compiler) rules or
  react-compiler-no-manual-memoization. All real code-quality, a11y, and
  performance rules stay enforced.
- Fix one genuine state-sync bug: use-now-seconds refreshed 'now' via a
  synchronous setState inside an effect (an extra render with a stale
  value); move it to a render-time prev-prop comparison (React's
  adjust-during-render pattern), behavior-equivalent.

Score 54 (broken config) -> 63. type-check/lint/1051 tests pass; browser
smoke confirms timestamps render with no re-render regression. The
remaining no-adjust-state-on-prop-change diagnostics are real bugs but
entangled with legitimate side effects (navigate/ref-cancel/async) in
critical flows; left for careful follow-up.

* chore(react-doctor): remove the vanity score badge, keep PR-diff review

The single 0-100 react-doctor score mostly reflects React-Compiler
optimizability and isn't a meaningful health grade to display (see
docs/agent-runs/react-doctor-score). Remove the README badge and its now-
dead generation infra (CI write/upload/publish steps + the
write-react-doctor-badge.mjs script + doctor:badge package script).

Kept: react-doctor's actual value -- the PR step that runs
'yarn doctor --diff <base> --annotations' on pull requests touching React
files, surfacing newly-introduced issues inline. Coverage badge untouched.

* docs(react-doctor): document why the score is not a target to chase

Record the reasoning so future agents/contributors don't re-attempt to
grind the react-doctor score: it overwhelmingly reflects React-Compiler
optimizability (most 'errors' flag intentional patterns and current
compiler limitations, not bugs) and saturates on the fraction of clean
files, so ~63 is the honest ceiling and 90 only comes from disabling the
linter.

- Add a known-surprises entry with the full reasoning + mitigation.
- Reframe the AGENTS.md react-doctor verification line: it's a PR-diff
  reviewer for newly-introduced issues, not an aggregate score to raise.
2026-06-05 22:21:30 +07:00
Tommaso Casaburi 1e82893621 Merge branch 'master' of github.com:bitsocialnet/5chan 2026-06-05 18:48:32 +07:00
Tommaso CasaburiandGitHub 9f58bf7e22 chore(deps): upgrade react to 19.2.7 and react types to 19.x (#1154)
Bump react and react-dom 19.1.2 -> 19.2.7 and @types/react and
@types/react-dom from v18 to v19. Keeps babel-plugin-react-compiler,
which is a separate build-time tool, not part of the React 19 runtime.

The @types v19 upgrade surfaced 21 type-only errors, all fixed without
runtime behavior changes:

- useRef<T>() now requires an explicit argument: pass undefined
- DOM element refs are RefObject<T | null>: widen PostFormFields and
  AdvancedSettings ref prop types accordingly
- retype reply-modal onInput handler to FormEvent + currentTarget
- add a null guard for the boards-bar search input
- update test mocks for stricter cloneElement/forwardRef typings

Verified: type-check, lint, 1051 tests, and build pass; react-doctor
score unchanged at 54; browser smoke across Chromium/Firefox/WebKit
plus mobile viewport clean.
2026-06-05 18:43:28 +07:00
Tommaso Casaburi 1edd46eb84 docs: clarify large artifact context tooling 2026-06-05 18:40:37 +07:00
Tommaso Casaburi 70ffeb816e chore(deps): bump bitsocial-react-hooks to 0.1.14 2026-06-05 17:48:26 +07:00
Tommaso Casaburi 0ba711b666 chore(deps): bump react-doctor to 0.4.0 2026-06-05 17:47:40 +07:00