BikeControl (SwiftControl)
使用 Zwift Click、Zwift Play、Shimano Di2 或任何藍牙控制器,搭配 MyWhoosh、Rouvy、Zwift 等。iOS、Android、Windows、macOS 均可免費試用。
AI 翻译
尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证正在加载完整 README。 以下为已保存的摘录。
Interface mobile personnelle posée au-dessus d’intervals.icu : un plan d’entraînement de deux semaines qui se corrige tout seul, sans ouvrir le site web. Construite comme une PWA installable — une app web qui s’ajoute à l’écran d’accueil d’Android et se comporte comme une app native. Voir CLAUDE.md pour le contexte, les règles métier et les contraintes, et docs/section-5-regles-adaptation.md pour la spécification qui fait foi.查看完整 README ↗
Interface mobile personnelle posée au-dessus d’intervals.icu : un plan d’entraînement de deux semaines qui se corrige tout seul, sans ouvrir le site web. Construite comme une PWA installable — une app web qui s’ajoute à l’écran d’accueil d’Android et se comporte comme une app native.
Voir CLAUDE.md pour le contexte, les règles métier et les contraintes, et
docs/section-5-regles-adaptation.md pour la spécification qui fait foi.
L’app ne fait que lire. Garmin verse les activités dans intervals.icu, intervals.icu calcule la charge, la forme et la fatigue, Makigawa lit tout cela et en déduit ce qu’il y a à faire les quatorze jours qui viennent. Elle n’écrit rien dans le calendrier — la seule exception est la suppression d’un événement, derrière un appui long de deux secondes.
Ce qu’elle sait faire :
Local-first : ce que l’athlète choisit — sa marque de trajet, un refus, une décharge acceptée — reste dans le stockage du navigateur, sur le téléphone. Pas de compte, pas de serveur, pas de synchronisation. Corollaire à garder en tête : effacer les données du site depuis Chrome efface ces choix ; les activités et le calendrier, eux, vivent dans intervals.icu et se relisent.
La page porte une balise noindex : elle n’est pas indexée par les moteurs de
recherche. Un robots.txt ne conviendrait pas ici, il n’est lu qu’à la racine
du domaine, qui dépend d’un autre dépôt.
Saisir ensuite l’identifiant athlète et la clé API intervals.icu, puis Tester la connexion. Les identifiants restent dans le stockage local du téléphone et ne sont envoyés qu’à intervals.icu.
Pour vérifier le mode hors-ligne : activer le mode avion, puis relancer l’app depuis l’écran d’accueil. Elle doit démarrer normalement.
npm install
npm run dev # serveur local, service worker actif
npm run build # vérification des types + build de production dans dist/
npm run preview # sert dist/ comme en production
npm run typecheck # types seuls
npm run icons # régénère les icônes PNG depuis scripts/generate-icons.mjs
npm run dev écoute sur toutes les interfaces (--host) : depuis un téléphone
sur le même réseau Wi-Fi, l’URL est http://<ip-de-la-machine>:5173/Makigawa/.
Attention, en HTTP simple le navigateur bloque le GPS et le service worker —
seul le site déployé en HTTPS permet de tout tester.
Chaque push sur main ou claude/mobile-execution-m4j7mk déclenche
.github/workflows/deploy.yml, qui construit le site et le publie sur GitHub
Pages.
Réglage à faire une seule fois : dans Settings → Pages du dépôt, choisir Source : GitHub Actions. Tant que ce n’est pas fait, le workflow échoue à l’étape « Configurer Pages » — le jeton d’un workflow n’a pas le droit de créer le site Pages lui-même, seul le propriétaire du dépôt peut l’activer.
Deux contraintes propres aux dépôts privés :
Si aucune des deux ne convient, les alternatives qui déploient un dépôt privé
sans le rendre public sont Vercel, Netlify et Cloudflare Pages (niveaux
gratuits) : il suffit alors de remplacer ce workflow et de construire avec
VITE_BASE=/.
L’horodatage du build est affiché en haut de l’app : il permet de confirmer d’un coup d’œil que le téléphone a bien reçu la dernière version. Quand une nouvelle version est déployée, l’app affiche une bannière « Mettre à jour » plutôt que de se recharger toute seule — utile pour ne pas perdre l’écran en pleine sortie.
Le site est servi sous /Makigawa/, d’où base: '/Makigawa/' dans
vite.config.ts. Pour un domaine personnalisé ou un déploiement à la racine,
construire avec VITE_BASE=/ npm run build.
.github/workflows/deploy.yml Build + déploiement GitHub Pages
docs/ La spécification des règles, qui fait foi
scripts/generate-icons.mjs Génération des icônes PNG (sans dépendance)
public/ Icônes, favicon — copiés tels quels
src/api/ Lecture d’intervals.icu (et la seule suppression)
src/rules/ Le moteur : l’échelle de charge, la question du
E.2, la reprise, la décharge, la vitesse de montée
src/workouts/ Les familles de séances, leur composition, les
niveaux par zone, la routine de souplesse
src/storage/ Ce que le téléphone retient, et rien de plus
src/components/ L’interface
vite.config.ts Build + manifest de la PWA
Le moteur est une fonction pure : il ne connaît pas le réseau, ne touche à rien, et produit des propositions. C’est ce qui le rend testable — 250 tests environ, dont plusieurs gardent des décisions de fond plutôt que du code (aucune intensité en watts, aucune charge inventée, aucune écriture depuis l’interface).