Commit graph

23 commits

Author SHA1 Message Date
f7e21c212e next-site: extend verify-deploy.mjs with OG-tag and admin-auth checks 2026-08-15 12:20:50 -04:00
ff775d8d97 next-site: admin auth, admin UI, override/channel write endpoints 2026-08-15 12:19:13 -04:00
98999b57f3 next-site: plugin detail page with per-plugin OG tags 2026-08-15 12:17:09 -04:00
c52eb517b8 next-site: browse page 2026-08-15 12:14:45 -04:00
84b4ac96f5 next-site: D1 access layer, dynamic public index.json merge 2026-08-15 12:13:12 -04:00
ef25876bfb next-site: scaffold worker, D1 database, and deploy wiring 2026-08-15 12:11:40 -04:00
9cc2a7a849 docs: implementation plan for the next.jarviscli.dev site 2026-08-15 12:02:44 -04:00
9be9438599 docs: design spec for the next.jarviscli.dev site 2026-08-15 11:57:19 -04:00
13800ddf01 staff-tags: fix existingTag lookup in member list, bump to 1.0.10
1.0.9 fixed the pairing bug and correctly located ret.props.label, but
still used findInReactFiber to search within it for the existing
BotTag element - confirmed live that findInReactFiber never matches
here. It's built for real React fiber nodes, not the plain element
tree innerRender() returns pre-reconciliation, so it silently found
nothing and every row bailed out before ever calling getTag(). Since
label.props.children is already a known flat array, a direct .find()
locates the same BotTag element findInReactFiber was missing. Live
end-to-end verified: OWNER tag now renders correctly in the member
list for the actual guild owner.
2026-08-09 01:52:54 -04:00
abd21f3be1 staff-tags: fix member list tags for real, bump to 1.0.9
1.0.8 fixed the row-pairing bug but kept patching the shared UserRow
memo wrapper's .type via @revenge-mod/patcher's after() - confirmed
live that this breaks member list rendering outright, unconditionally,
even as a single non-stacking patch on a fresh app process. Replaced
with afterJSX() intercepting each createElement(UserRow, props) call
and a plain property assignment (el.type = a single stable function),
never touching the shared object via after()'s Proxy machinery.

Also fixed the actual tag-injection logic, live-verified end to end:
UserRow renders a single TableRow with name+tag at ret.props.label (a
prop, not a child reachable by the old generic tree search - that
mismatch was the reason tags never appeared even before the crash).
The existing tag element found there is Discord's own BotTag, which
derives its label purely from a type enum and ignores any custom
text/color props - so the old "mutate BotTag in place" path was a
silent no-op. Now always injects the plugin's own GradientTag
instead, confirmed live to actually render custom tag text and color.
2026-08-09 01:05:20 -04:00
d128252024 Remove next-eval-checks diagnostic plugin
Live debugging is now handled through the revenge-devtools MCP
server (eval, react_tree, patch_method, etc.), which supersedes
one-shot diagnostic plugins built for a single investigation.
2026-08-09 00:32:19 -04:00
e9000107f6 staff-tags: fix member list tags never landing, bump to 1.0.8
UserRow is React.memo()-wrapped, so every row shares one inner render
function. The old afterJSX+afterRendered approach registered a new
self-unpatching hook on that shared function per row; since every
currently-stacked hook fires on any row's actual render (not just its
own), pairing broke almost immediately and hooks piled up unbounded,
eventually breaking member list rendering outright (confirmed live).
Replaced with a single persistent after() patch on the shared inner
render function, reading props fresh from args[0] each call - same
pattern chat.ts already uses successfully for getTagProperties.
2026-08-09 00:25:29 -04:00
d5e2c25e15 staff-tags: fix afterRendered crash on memo-wrapped components, bump to 1.0.7
Confirmed live: opening the member list crashed with "TypeError: target is
not callable" inside React's renderWithHooks. afterRendered patched
element.type directly, which works for plain function components but not
for UserRow (React.memo()-wrapped): patching the non-callable memo wrapper
object replaces it with a proxy whose *own* stub is callable, which makes
`typeof element.type === 'function'` true even though the real value is a
memo object - React's reconciler checks that before checking $$typeof, so it
takes the plain-function-component path and calls the proxy directly, whose
apply trap forwards to Reflect.apply(realMemoWrapper, ...) and throws, since
the real wrapper was never callable.

Fix: detect a memo-wrapped type and patch its inner .type (the actual render
function memo hides) instead of the wrapper itself - genuinely callable, and
leaves the wrapper's own shape untouched so React's type detection stays
correct. Shared in lib/afterRendered.ts, so it fixes UserRow now and any
future memo-wrapped target automatically.
2026-08-08 22:51:28 -04:00
980f1b33eb Bump versions for the author-name change (staff-tags 1.0.6, next-eval-checks 1.0.5) 2026-08-08 22:38:15 -04:00
ce57431385 Show author as Rosie instead of everestmcarthur 2026-08-08 22:37:41 -04:00
74cc0e61a4 verify-deploy: retry with backoff and check res.ok
The previous deploy (staff-tags 1.0.5) failed CI at this exact step with a
raw "Failed to parse JSON" error, even though the deploy itself had
succeeded seconds earlier (confirmed live) - Cloudflare's edge needs a
moment to propagate a fresh deploy, and the script had no res.ok check to
turn a transient non-OK response into a clear message, let alone retry it.
2026-08-08 20:59:13 -04:00
0439a6a67b staff-tags: fix UserRow/HeaderName lookups, bump to 1.0.5
Two of the three previously-broken module lookups now have well-evidenced
fixes (from live sweeps run during an earlier debugging session that were
never actually applied to the code):

- details.tsx: UserRow is React.memo()-wrapped, so a plain withName('UserRow')
  can never match it (memo wrapper objects have no .name). Added
  withMemoDefaultName (lib/filters.ts), a custom filter checking the wrapper's
  inner .type.name instead, matching on the full module namespace so the
  callback gets the wrapper itself - the exact reference afterJSX needs.

- name.tsx: HeaderName doesn't exist under that name anymore; ChannelHeader
  is the confirmed replacement (a plain, non-memo function, found via a
  name-sweep).

DisplayName (the message-author-name row) remains unresolved - never found
under any name across two live sweep sessions, likely inlined into a bigger
component now. Left as a documented, still-guarded no-op rather than guessed
at.
2026-08-08 20:56:46 -04:00
e999719b21 Fix Phase 1 final-review findings: lockfile, pinned tool versions, CI verification and safety
- Commit bun.lock (removes bun.lock/bun.lockb/package-lock.json/deno.lock
  from .gitignore) so CI reads a pinned revision of the git-dependency
  @revenge-mod/plugin-cli, which build.gradle.kts already declared as a
  buildJs input but never had a committed file to read.
- Pin wrangler as a devDependency (4.120.0, matching the version already
  live) so `bunx wrangler deploy` resolves the local pinned install instead
  of "latest" at every run; verified empirically that bunx follows the
  local pin, not the cache/latest version.
- Pin bun-version in oven-sh/setup-bun@v2 to 1.3.14, the version already in
  use, so CI's toolchain isn't a moving target either.
- Add a post-deploy CI step (.github/scripts/verify-deploy.mjs) that fetches
  the live index.json, and downloads and sha256-verifies one artifact against
  the hash the index claims for it, failing the workflow on any mismatch.
  This promotes the manual verification done during implementation into a
  permanent regression check.
- Add concurrency (cancel superseded deploys on rapid pushes),
  workflow_dispatch (manual redeploy without an empty commit), and an
  explicit permissions: contents: read block to deploy.yml.
- Document in README.md that next.jarviscli.dev auto-deploys on every push
  to main, and that a plugin change without a manifest.json version bump
  silently republishes the same version pointer with different bytes,
  so already-installed clients never see the update.
2026-08-08 20:34:13 -04:00
cb9dc75323 Add GitHub Actions workflow: build, package, and deploy to Cloudflare Workers 2026-08-08 19:53:35 -04:00
bd62cde522 Add wrangler.toml: assets-only Worker on next.jarviscli.dev 2026-08-08 19:51:21 -04:00
869556245c Import revenge-next-plugs working tree
Includes the already-applied package.json fix (build/build:dev/generate-index/serve
now invoke @revenge-mod/plugin-cli via bun directly, bypassing its broken
node-shebang delegation that crashed both bun run build and Gradle's
packageAllPlugins).
2026-08-08 18:42:50 -04:00
0928974784 Add implementation plan for Phase 1: Next plugin repo hosting 2026-08-08 18:11:20 -04:00
96fd198b28 Add Phase 1 design doc: Next plugin repo hosting
Scopes the immediate blocker (no reachable install URL for the phone) separately
from the showcase site and draft-editing phases, which depend on Classic's
single-file plugin model in ways Next's zip+manifest format doesn't share.
2026-08-08 18:04:17 -04:00