BikeControl (SwiftControl)
使用 Zwift Click、Zwift Play、Shimano Di2,或任何藍牙控制器搭配 MyWhoosh、Rouvy、Zwift 等。可於 iOS、Android、Windows 與 macOS 免費試用。
AI 翻譯
尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證正在載入完整 README。 以下為已儲存的摘錄。
An AI sports-passport and pathway app for athletes aged 18 and over. Live at
golsz.com.
An athlete records what they have actually done — sport, position, club,
benchmarks with the method and date each was measured — names a goal, and gets
a route with dated steps. An assistant called Scout reads that record and
answers in the athlete's own context.
npm run check must pass before any push. Pushing to main auto-deploys
production; there is no separate deploy step.
If you edit the JSX inside golsz-app.html:
The tests are the thing to read first檢視完整 README ↗An AI sports-passport and pathway app for athletes aged 18 and over. Live at golsz.com.
An athlete records what they have actually done — sport, position, club, benchmarks with the method and date each was measured — names a goal, and gets a route with dated steps. An assistant called Scout reads that record and answers in the athlete's own context.
npm ci # required: 8 suites need @babel/parser and @babel/traverse
npm run check # the gate — syntax-checks api/*.js and js/*.js, then the suite
npm run check must pass before any push. Pushing to main auto-deploys
production; there is no separate deploy step.
If you edit the JSX inside golsz-app.html:
npm run compile # regenerates js/app.js — the gate fails if you forget
| Path | What it is |
|---|---|
index.html, css/, js/main.js | The marketing site. Static, English only. |
golsz-app.html | The whole app — one ~1MB file, React via CDN, JSX in one text/babel-deferred block. |
js/app.js | Generated. tools/precompile.cjs compiles the JSX at author time; the browser never compiles. Do not hand-edit. |
api/*.js | Vercel serverless functions. At the 12-function ceiling — adding one means removing one. |
supabase-migration-NNN-*.sql | The database, one numbered migration at a time. Each carries its reasoning. |
supabase-schema.sql | Reference for what is deployed. See the warning below. |
tests/*.cjs | 110 suites, 5,252 assertions (as of 2026-10-22; node tests/run-all.cjs prints the current count). Plain Node, no framework. |
There is no framework. tests/run-all.cjs runs every test_*.cjs. Many suites
lift real expressions out of the source and eval them, so they fail when the
source changes rather than when a mock does, and several have been verified to
fail when the bug they guard is reintroduced.
They are also where the codebase keeps its history: most suites open with the
specific failure that motivated them. test_hook_order.cjs,
test_write_error_checked.cjs, test_client_scope.cjs and
test_features_off.cjs are the ones that explain the most about how this app
breaks.
supabase-schema.sql is an append-only ledger, not a clean dump. It is
safe to run against a brand-new project and unsafe against the live one — it
contains drop policy / create policy pairs and data statements. Change the
live database with a new numbered migration instead.&& ( or ? ( and its element parses as an
object literal and has taken the app down five times. Comments go above the
guard.test_hook_order.cjs
guards it.{ error } rather than throwing. Every write
must check it. test_write_error_checked.cjs guards it.STRIPE_PORTAL_LINK is correct (this bullet used to say it was wrong;
corrected 2026-10-22). It holds a genuine billing.stripe.com/p/login/...
customer-portal link. It shares its short code with the CAD Basic Payment Link
only because Stripe reuses short codes across the two hosts (verified against
the live account on 2026-10-09), so do not "fix" it. Subscribers can cancel at
period end, update their card and see invoices there; plan switching is off.PARENT_ACCOUNTS_ENABLED in
golsz-app.html; the plumbing is intact and production had zero of them.search_players(). The function and athletes.scout_visible are kept so it
returns by decision rather than by rebuild.PublicPassport looks dead to a
grep but is mounted via React.createElement — it is live.CLAUDE.md is the long-form version of all of this, including the reasoning
behind most decisions. SETUP.md covers standing up a fresh environment.