mirror of
https://github.com/got-feedBack/feedBack.git
synced 2026-07-25 14:21:21 +00:00
* 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>
126 lines
4.6 KiB
YAML
126 lines
4.6 KiB
YAML
name: ci
|
|
|
|
# Runs only as a reusable workflow invoked by ship-ci.yml (for PRs into main
|
|
# and release/**). It deliberately has no standalone pull_request trigger: a
|
|
# direct run would publish unprefixed "<job>" checks, but the org rulesets
|
|
# require the "ci / <job>" names produced when ship-ci.yml calls this workflow.
|
|
on:
|
|
workflow_call:
|
|
|
|
permissions:
|
|
contents: read
|
|
pull-requests: read
|
|
checks: read
|
|
|
|
jobs:
|
|
|
|
test:
|
|
name: test
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
|
|
- uses: actions/setup-python@v5
|
|
with:
|
|
python-version: '3.12'
|
|
cache: 'pip'
|
|
|
|
- name: Guard against print() / traceback.print_exc() in server.py, lib/, and bundled plugin routes
|
|
run: |
|
|
# git grep: tracked files only — no .pyc / __pycache__ noise from
|
|
# later pytest runs. Covers both audited patterns from #155 / #242.
|
|
# `(^|[^A-Za-z0-9_])` anchor avoids matching suffixes like `myprint(`;
|
|
# POSIX leaves `\b` undefined, so we use an explicit character class.
|
|
hits=$(git grep -nE '(^|[^A-Za-z0-9_])(print|traceback\.print_exc)[[:space:]]*\(' \
|
|
-- server.py lib/ \
|
|
$(git ls-files 'plugins/*/routes.py') || true)
|
|
if [ -n "$hits" ]; then
|
|
echo "$hits"
|
|
first=$(printf '%s\n' "$hits" | head -n1)
|
|
file=$(printf '%s' "$first" | cut -d: -f1)
|
|
line=$(printf '%s' "$first" | cut -d: -f2)
|
|
echo "::error file=${file},line=${line}::print() or traceback.print_exc() found in server.py, lib/, or a bundled plugin routes.py. Use the feedBack logger (lib/logging_setup.py) — see issues #155 / #242."
|
|
exit 1
|
|
fi
|
|
|
|
- name: Install dependencies
|
|
run: |
|
|
python -m pip install --upgrade pip
|
|
pip install -r requirements.txt -r requirements-test.txt
|
|
|
|
- name: Run pytest
|
|
run: pytest
|
|
|
|
- name: Run JS plugin-API tests
|
|
run: node --test tests/js/*.test.js 'tests/plugins/*/js/*.test.js'
|
|
|
|
tailwind-fresh:
|
|
# Guard that the committed static/tailwind.min.css is in sync with source.
|
|
# The Play CDN's runtime JIT was removed (feedBack-desktop#110); a prebuilt
|
|
# stylesheet only contains classes the scanner saw at build time, so stale
|
|
# CSS silently ships unstyled elements. Rebuild and fail on any diff.
|
|
name: tailwind-fresh
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
|
|
- uses: actions/setup-node@v4
|
|
with:
|
|
node-version: '20'
|
|
|
|
- name: Rebuild Tailwind CSS
|
|
run: bash scripts/build-tailwind.sh
|
|
|
|
- name: Verify committed static/tailwind.min.css is fresh
|
|
run: |
|
|
# Hard-fail (matches the print() guard convention) — do NOT auto-commit.
|
|
if ! git diff --quiet -- static/tailwind.min.css; then
|
|
echo "::error file=static/tailwind.min.css::static/tailwind.min.css is stale. Run 'bash scripts/build-tailwind.sh' and commit the regenerated file."
|
|
git diff -- static/tailwind.min.css
|
|
exit 1
|
|
fi
|
|
|
|
manifest-validation:
|
|
name: manifest-validation
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
|
|
- uses: actions/setup-python@v5
|
|
with:
|
|
python-version: '3.12'
|
|
|
|
- name: Validate plugin manifests
|
|
run: |
|
|
python - <<'EOF'
|
|
import json, sys
|
|
from pathlib import Path
|
|
|
|
errors = []
|
|
manifests = sorted(Path("plugins").glob("*/plugin.json"))
|
|
|
|
for manifest in manifests:
|
|
try:
|
|
data = json.loads(manifest.read_text())
|
|
except json.JSONDecodeError as e:
|
|
errors.append(f"{manifest}: invalid JSON — {e}")
|
|
continue
|
|
for field in ("id", "name"):
|
|
if field not in data:
|
|
errors.append(f"{manifest}: missing required field '{field}'")
|
|
pid = data.get("id", "")
|
|
if pid and pid != pid.lower():
|
|
errors.append(f"{manifest}: 'id' must be lowercase, got '{pid}'")
|
|
# The plugin loader treats each plugins/<dir> as a Python module,
|
|
# so the manifest 'id' must match its directory name.
|
|
dirname = manifest.parent.name
|
|
if pid and pid != dirname:
|
|
errors.append(f"{manifest}: 'id' ({pid!r}) must match directory name ({dirname!r})")
|
|
|
|
if errors:
|
|
for e in errors:
|
|
print(f"::error::{e}")
|
|
sys.exit(1)
|
|
print(f"Validated {len(manifests)} manifest(s) — OK")
|
|
EOF
|