* Update GitHub repo references from feedback* to feedBack* * rename: slopsmith -> feedBack, byron -> got-feedBack Renames across the entire codebase: - slopsmith/Slopsmith/SLOPSMITH/SlopSmith -> feedBack/FeedBack/FEEDBACK/FeedBack - byron/Byron/Byrongamatos -> got-feedBack/got-feedBack/got-feedBack - /home/byron/ -> /opt/got-feedBack/ - byron@ougsoft.com -> hi@got-feedBack.org - github.com/byrongamatos/ -> github.com/got-feedback/ - com.byron. -> com.got-feedback. - SLOPSMITH_ env vars -> FEEDBACK_ with backward-compat fallback - Protocol/storage strings migrated with read-old/write-new pattern - window.slopsmith JS API -> window.feedBack (canonical) + backward-compat alias Refs: #rename-slopsmith * rename: complete regen against current main + fix backward-compat alias Regenerated the slopsmith->feedBack / byron->got-feedBack rename on top of current main (3 commits had landed since the branch: #572/#554/#574), resolving the four content conflicts in favour of main's newer content (autoplay/auto-exit, accuracy-badge, Virtuoso re-home, feedpak badge). Completion fixes on top of the mechanical rename: - Re-apply rename to post-branch content the original rename never saw: window.slopsmith(.Tour) consumers in lessons.js / notifications.js / onboarding-tour.js, and the matching JS + python tests (autoplay_exit, progression_*, test_feedpak_extension FEEDBACK_* env vars). The test env vars now match server.py (which reads FEEDBACK_SYNC_STARTUP / FEEDBACK_SKIP_STARTUP_TASKS), so the sync-startup test exercises the real path again. - Restore the window.slopsmith backward-compat alias dropped during conflict resolution, and move the bus aliases to AFTER the _feedBackExisting merge block so they reference the fully-assembled object (also fixes the loop_api.test.js API-surface regex, which the original PR latently broke). - Drop the stray empty data/web_library.db (runtime DB lives in CONFIG_DIR) and gitignore it. - Fix stale tone-source test: feed[dB]ack -> fee[dB]ack to match shipped source labels. Verified locally (org CI billing-blocked): JS 819/819 pass; pytest 1669 passed / 1683 collected with 0 import errors; zero residual slopsmith/byron except the two intentional window.slopsmith aliases. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * rename: implement advertised backward-compat + prune dead community plugins Address gaps where PR #537's "Backward compatibility" section was advertised but not implemented, and clean up the community plugin list. Env vars (FEEDBACK_* canonical, legacy SLOPSMITH_* honoured): - New lib/env_compat.py (getenv_compat / env_flag_compat) + tests. server.py (_env_flag + all FEEDBACK_* reads), diagnostics_hardware, gp2midi and tailwind_rebuild now resolve the legacy alias, so existing SLOPSMITH_UI / SLOPSMITH_PLUGINS_DIR / etc. deployments keep working. - Fix the rename collapsing plugins/__init__.py and minigames/routes.py from `FEEDBACK_PLUGINS_DIR or SLOPSMITH_PLUGINS_DIR` into a redundant `FEEDBACK_ or FEEDBACK_` (the fallback was silently lost). Storage (app.js update-channel): - Read feedBack-update-channel, fall back to legacy slopsmith-update-channel, and clear the legacy key on write — so a user's update-channel preference survives the rename instead of resetting to "stable". Community plugin list (README): the rename rewrote third-party repo URLs we don't own. Probed every one; their owners never renamed, so: - Restore the 13 live community plugins to their real slopsmith-* names. - Prune 6 that are 404 to the public (topkoa splitscreen/stems, OmikronApex tuner, Jafz2001 nam-rig-builder, DeathlySin song-preview, Erikcb91 shuffle). - Fix a pre-existing Guitar Theory clone-command typo (nam-tone -> guitar-theory). Verified: env_compat 7/7, JS 819/819, pytest 1690 collected / 0 import errors, rename-sensitive + startup suites green. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> --------- Co-authored-by: byrongamatos <xasiklas@gmail.com> Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
3.1 KiB
feedBack-plugin-minigames
The minigame framework for FeedBack.
This plugin provides:
- A Minigames hub screen that discovers every installed minigame plugin and lists them as tiles with leaderboards.
- A shared profile (XP, level, unlocks, totals) that aggregates runs across every minigame.
- A JS SDK exposed at
window.feedBackMinigamesthat minigame plugins use to access scoring, HUD primitives, run persistence, and a scheduler — so individual minigames do not need their own DSP or backend.
Writing a minigame
A minigame is a standard FeedBack plugin that:
-
Adds a
minigameblock to itsplugin.json:{ "id": "my_game", "name": "My Game", "version": "0.1.0", "script": "game.js", "minigame": { "title": "My Game", "tagline": "Short pitch", "type": "chart-free", "scoring": "pitch-continuous", "thumbnail": "thumb.png" } } -
On script load, registers itself with the SDK using the safe late-binding pattern (minigame plugins may load before the SDK; the pending queue handles both orderings — the SDK drains it on init, and the
feedBack-minigames-readyevent is an alternative for plugins that prefer event-driven registration):Important:
spec.idmust exactly match theidfield inplugin.json. The backend registry usesplugin_id(sourced fromplugin.json) and the hub UI merges manifest metadata (title, tagline, thumbnail, modifiers) by that key. Ifspec.idandplugin.jsoniddiverge, runs and leaderboard data will be attributed to an unrecognised game and display metadata (title, thumbnail) will fall back to JS-spec values rather than the richer manifest values.const spec = { id: 'my_game', start: ({ container, modifiers, sdk }) => { /* mount game into container */ }, stop: () => { /* tear down */ }, }; if (window.feedBackMinigames) { window.feedBackMinigames.register(spec); } else { (window.__feedBackMinigamesPending = window.__feedBackMinigamesPending || []).push(spec); } -
Calls
window.feedBackMinigames.end({ score, durationMs, modifiers, meta })when the run ends.
See feedBack-plugin-flappy-bend for a working example.
SDK reference
window.feedBackMinigames exposes:
register(spec)— declare a minigamestart(gameId, opts)/end(result)— lifecyclescoring.createContinuous(opts)— emits per-frame pitch (YIN, ~60 Hz)scoring.createDiscrete(opts)— wrapscreateNoteDetector, emits hit/missscoring.createChord(opts)— full chord scorer (delegates to note_detect)ui.mountHUD(html)/ui.runSummary(result)/ui.modifierPicker(defs)submitRun(...)/getLeaderboard(...)/getProfile()scheduler.every(ms, cb)/in(ms, cb)/cancel(id)
Dependencies
feedBack-plugin-notedetect>= 1.10.0 — required for discrete/chord scoring modes (continuous mode is self-contained).