🐛 Fixed
- Setup wizard was missing the "Category Sync" and "Notifications" toggles on every client-instance section, so users configuring aMuTorrent for the first time couldn't opt out of either behavior during the initial installation flow — they had to complete setup and then edit each instance individually to change the defaults. Backend behavior was unaffected (missing fields default to
true, meaning sync + notifications on), so this was purely a first-run UX gap, not a functional break. Root cause: the wizard's per-client sections used their own hand-coded field blocks instead of consuming the sameCLIENT_FIELDSschema the "edit instance" modal uses, so any new field added to the modal quietly missed the wizard. See the "Improved" entry below for the structural fix (#68).
♻️ Improved
- Single source of truth for client-instance fields. Extracted the per-client-type field schema (
CLIENT_FIELDS,TYPE_LABELS,DAEMON_LABELS, theF.*factories,TYPE_DEFAULTS) and the field renderer into a new shared modulestatic/components/settings/clientFields.js. BothClientInstanceModal(edit an existing instance) andSetupWizardView(initial installation flow) now consume the same<ClientFieldsRenderer>component. Adding a field to the schema surfaces in both surfaces automatically — no more "we shipped a toggle in the modal but forgot to wire it in the wizard" bugs like the one that hit us with #68. Adapter layer is deliberately thin: each surface passes its ownonFieldChange(field, value)wrapper andisFieldFromEnv(field) => boolaccessor, letting the wizard and modal keep their native state models (wizard's flat client-prefixedfromEnvmap, modal's per-instance_fromEnvobject). Net −464 lines across both consumers; bundle 729 KB → 721 KB from string + JSX dedupe.