Claude bb33bcbb61 fix(main): broaden anchor selector and show inline "can't anchor" note
findAnchorElement used a narrow selector ('button[name="train"],
a[href*="train"]') that often missed Torn's actual gym page DOM.
When it missed, applyMode fell through to dialog.setMode('free'),
snapping the dialog to the default bottom-right position — which the
user perceived as a 'bounce' when clicking 'Above training UI'.

Widen the selector to a priority-ordered candidate list and prefer the
form ancestor of any matched element. As a last-ditch, look for a form
inside the gym panel. This covers more of Torn's gym-page variations.

When the anchor selector still misses, do NOT snap to the default free
position. Instead, keep the dialog where it is, set anchorError on the
state, and let the dialog render an inline note so the user gets
visible feedback explaining what happened.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-01 18:45:40 -05:00

Torn Attribute Training Tracker

A userscript for torn.com that shows a floating dialog on the gym page with your current attribute, target, rate of gain, and an ETA to the target.

Install

  1. Install Tampermonkey (or Violentmonkey / Greasemonkey).
  2. Open torn-attribute-tracker.user.js in your editor, copy its contents.
  3. In Tampermonkey, click the dashboard → + (Create new script) → paste → save.
  4. Visit https://www.torn.com/gym.php. The dialog appears in the bottom-right.

Use

  • Type a target value in the Target field, or pick a milestone from the dropdown.
  • The dialog updates live as you train.
  • Drag the header to reposition. Click Above training UI to anchor above the gym form. Click Float free to drag again.
  • The closes the dialog for the current page session; it returns on next visit.

Targets, dialog position, and the 30-day train history are stored in localStorage.

Self-test

Load the script with #tat-test in the URL:

https://www.torn.com/gym.php#tat-test

Open the browser console; you'll see [tat] self-test results: followed by OK … / FAIL … lines.

Tests

npm install   # no deps; node:test ships with Node 18+
npm test

Files

  • torn-attribute-tracker.user.js — the script you install in Tampermonkey.
  • src/pure.js, src/store.js, src/dom.js, src/interceptor.js, src/ui.js, src/main.js — source split for testability; the user-facing file is the bundle in step 11.
  • tests/ — Node test runner (node --test).

Notes

The DOM scraper and request interceptor are best-effort matches for the current Torn gym page. If Torn updates the markup, you may need to adjust the selectors in src/dom.js and re-bundle by copying the new source into the embedded section in torn-attribute-tracker.user.js.

S
Description
No description provided
Readme 216 KiB
Languages
JavaScript 100%