fit-ride-studio について
サイクリング、ランニング、ハイキングの FIT・KML トラックをローカルで分析し、根拠に基づくレポートを作成するスキルです。ローカルの Ride Relief レポートページも準備でき、エクスポートは依頼があった場合に限ります。
主な機能
- 01FIT と KML のトラックをローカルで分析
- 02単独または複数アクティビティをレポート
- 03重複候補を除外し無効ファイルを報告
- 04利用可能な指標とデータ範囲を要約
- 05ローカルの Ride Relief レポートページを準備
- 06依頼に応じて画像や動画をエクスポート
活用シーン
- 01サイクリング、ランニング、ハイキングの記録確認
- 02複数の有効なトラックファイルをまとめて分析
- 03センサーの記録範囲と活動指標を確認
- 04共有用のアクティビティ画像や動画を作成
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ op7418/ guizang-sports-skill --skill fit-ride-studioインストール後、Claude Code で/fit-ride-studioを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
LICENSE.gitignorepackage.jsonpackage-lock.jsonREADME.mdindex.htmlvite.config.jsagents/openai.yamldocs/media/.gitkeeppublic/README.txtsample-route.jsonskill-analysis.jsonreferences/ui-report-contract.mdlocation-enrichment.mdreport-contract.mdexport-workflow.mdsamples/demo.kmlscripts/analyze-fit.mjscheck-install.mjscheck-report-runtime.mjscheck-export-config.mjsprepare-report.mjssrc/export-composer.jsdata.jsexport-config.jsmain.jsroute-scene.jsphotos.jsstyles.css詳細
FIT & KML アクティビティスタジオ
ローカルのサイクリング、ランニング、ハイキングのトラックを、根拠に基づくレポートとローカルで楽しめるビジュアル体験に変換します。次の手順に従ってください。
- FIT/KML ファイルが提供されていない場合はファイルを依頼します。デモを希望された場合は、同梱の合成データを使用します。
- インストール状況を確認し、不足しているロック済みの依存関係を自動でインストールして、有効なすべてのファイルを分析します。
- 結果を提示し、非公開のランタイムファイルをステージングして、ローカルのブラウザーにアクセスできる場合は同梱の Ride Relief レポートページを開きます。
ユーザーが共有可能な画像、アニメーション、または動画を求めた場合に限り、エクスポート作成画面に進みます。Ride Relief はこの Skill に同梱されているウェブアプリであり、別途インストールする製品ではありません。
ワークフロー
1. トラックファイルを取得する
- ユーザーが明示的にデモを求めた場合は、
<skill-root>/samples/demo.kmlを使用します。架空のデータであることを伝えてください。 - それ以外の場合、読み取り可能な
.fitまたは.kmlが提供されていなければ、ユーザーの言語で添付ファイルまたはローカルパスを尋ねてください。中国語での例:「请把.fit或.kml拖进对话,或告诉我文件路径(例如~/Downloads/ride.fit);可以一次给多个。」 - 不足している入力を依頼した後はそこで停止してください。アクティビティデータを捏造したり、プロジェクトの設定をユーザーに求めたりしないでください。
- 少なくとも1つのファイルにアクセスできる場合は、すぐに処理を進めてください。有効なファイル数から、単一モードと集計モードを判断します。
- ディレクトリはユーザーが対象として指定した場合に限り受け付け、直下にある FIT/KML ファイルのみを展開します。
- トラックはローカルで処理してください。正確な GPS トラックをアップロードしたり、座標を応答に含めたりしないでください。
- 1つのファイルが破損していても、別のトラックが有効であればバッチ処理を続行してください。スキップしたベース名を報告します。
- 開始時刻、距離、所要時間から重複の可能性を判定します。重複は合計から除外し、該当するものを示します。
2. 準備状況を確認して分析する
<skill-root> を、この SKILL.md が含まれるディレクトリとして解決します。そのディレクトリから実行してください。
node scripts/check-install.mjs
1行のステータスを、次のように処理してください。
OK— 続行します。NEED_INSTALL—npm ciを実行し、確認を再実行してから続行します。ロックファイルを使用し、npm installに置き換えないでください。UNSUPPORTED_NODE— 報告された Node の要件を説明し、アプリを実行する前に停止します。ERROR— 不足または破損している Skill ファイルを報告し、続行する前に Skill を再インストールまたは更新します。
npm ci は内部的な準備として扱い、通常のユーザーステップにはしないでください。サンドボックスによってネットワークアクセスがブロックされている場合は、環境で承認を利用できるときにネットワークの許可を求めてください。許可を利用できない場合は、ユーザーに <skill-root> から npm ci を一度実行するよう伝えてください。Skill ディレクトリが読み取り専用の場合は、書き込み可能なインストール先またはチェックアウトが必要であると説明してください。インストールを繰り返したり、成功したと主張したりしないでください。
決定論的アナライザーを実行します。
node scripts/analyze-fit.mjs --format json <fit-or-kml-path> [more-track-paths...]
すぐに読めるローカルレポートで十分な場合は --format markdown を使用します。一致するアクティビティが別々のものだとユーザーが確認した場合に限り、--keep-duplicates を使用します。フィールドの解釈、重み付けルールの確認、またはレポートの動作変更を行う場合は、references/report-contract.md を参照してください。
3. 結果を提示する
依存関係やパーサーの詳細ではなく、まず結果を示します。
1件のアクティビティについて、次の内容を提示します。
- 地形やルートについての簡潔な評価と、最も重要な所見。
- 利用可能な場合は距離と累積標高上昇量。記録で確認できる場合に限り、所要時間、速度/ペース、カロリー、一時停止も示します。
- スポーツに適した記録メトリクス:サイクリングでは速度/ケイデンス、ランニングではペース/歩数ケイデンス、ハイキングでは標高/累積標高上昇量。加えて、記録がある場合は心拍数、パワー、気温、勾配も示します。
- データ品質のカバレッジ。特にケイデンス、心拍数、パワー、勾配を確認します。
- 影響の大きい順に、具体的な提案を2~8件示します。
複数のアクティビティについて、次の内容を提示します。
- 全体の合計と期間。
- スポーツとソース形式を含む、アクティビティごとの表。
- 最長、累積標高上昇量が最大、最速のアクティビティ。ただし、時間データがあり、比較可能なアクティビティ同士に限ります。
- 最も古い記録から最新の記録への変化。体力が向上した証拠ではなく、所見として示します。
- センサーの一貫性、重複、スキップしたファイル。
- 全体的な提案と、特に重要な個別アクティビティの例外。
データの欠落とゼロを区別します。センサーが利用できなかった場合、ゼロとはせず、「未記録」または「カバレッジ不足」と示します。ユーザーが必要な閾値を提供し、分析を明示的に依頼しない限り、FTP、パワーゾーン、心拍ゾーン、VO₂max、トレーニング負荷、回復状態、医学的な結論を推測してはいけません。
次のルールを適用します。
- 全体の平均速度は、総移動距離を総移動時間で割って算出します。
- ジオメトリのみのKMLから、所要時間、速度、ペース、一時停止、写真の撮影時刻との照合を推測してはいけません。
- 宣言されたスポーツ、距離、累積標高上昇量、累積標高下降量には、KMLのドキュメントメタデータを優先します。最長の
LineStringまたはgx:Trackを使用し、ソースのベース名を保持します。 - ケイデンス、心拍数、パワー、気温は、有効なサンプル数で重み付けします。
- カロリーはデバイスによる推定値、気温は外気温またはデバイス温度として扱います。
- 勾配のカバレッジが十分な場合は、距離で重み付けした勾配区分、平滑化した代表勾配P99、連続する登坂区間を最大3件報告します。デバイスの最大値には「未加工」と明記します。
- 暑さや水分補給に関する提案は、記録された移動時間に合わせます。
- ルートの大部分が非公開にされている場合は、共有前に警告し、最初と最後の300~500mを非表示にすることを推奨します。
根拠に基づく詳細分析を2~6項目選びます。空の項目や推測にすぎない項目は省きます。
場所を考慮したアドバイスによって結果が大きく改善する場合は、references/location-enrichment.mdを読みます。曖昧な公共の場所名を確認し、座標ではなく確認済みの名称で検索します。現在の状況を扱う場合は、時刻を明記します。過去のアクティビティを、現在そのルートが通行可能である証拠として扱ってはいけません。
4. レポートページを準備して開く
分析が正常に完了したら自動で試みますが、環境に応じて対応してください。
- references/ui-report-contract.md を読みます。
- モデルが作成したレポート契約を、書き込み可能な一時 JSON ファイルに保存します。ユーザーごとの分析を
public/skill-analysis.jsonに保存しないでください。 - 一括処理の場合は、ユーザーが指定したアクティビティを選択します。それ以外の場合は、重複していないアクティビティのうち最長のものを代表ルートとして使用し、テキストでの回答は集計した内容にします。
- 選択したトラックと分析を、OS のプライベートな一時ディレクトリに準備します。
node scripts/prepare-report.mjs --track <selected-track> --analysis <temporary-report-json>
- 返された JSON オブジェクトを読み込みます。
urlとsessionを保持してください。URL は 24 時間後に期限切れとなり、古いファイルは次回の準備時に削除されます。リポジトリには何も保存されません。 http://127.0.0.1:5174/を取得し、返された HTML に<title>Route Reliefとid="fit-input"の両方が含まれている場合に限り、このプロジェクトのものとして扱います。それ以外の場合は、<skill-root>からnpm run devを起動します。サーバーはstrictPortを指定してポート 5174 を使用します。ポートが別のアプリケーションに使われている場合は、黙ってポートを切り替えず、競合を報告してください。- 利用可能なブラウザー起動機能またはブラウザー自動化機能を使って、返された URL を開きます。URL によりトラックと分析が自動で読み込まれるため、ファイル入力の設定には頼らないでください。
- スクリーンショット/視覚機能がある場合は、読み込まれたソース、
Fit Ride Studio Skillの分析バッジ、おすすめのレイアウト、および表示のはみ出しを確認します。視覚機能がない場合は、視覚的に確認したかのような説明はせず、開いたページをユーザーに確認してもらってください。
以下のフォールバックを誠実に適用してください。
- エージェントが URL を開けてもページの操作を自動化できない場合は、URL を開いてください。レポートを表示するために、それ以上の操作は必要ありません。
- ブラウザーツールがなく、ユーザーが同じマシンを使っている場合は、返された URL を伝え、手動で開くよう案内してください。
- リモート環境またはクラウドコンテナーで、ユーザーのブラウザーからループバックアドレスにアクセスできない場合は、テキストレポートと一時分析 JSON を代わりに提供してください。ページを開いたと主張しないでください。
- 書き込み可能な一時領域がすべてブロックされ、準備できない場合は、既存のファイル入力ワークフローに切り替え、簡潔な手順を案内してください。
Vite の起動に使ったターミナル/プロセスハンドルを記録します。完了前に、ローカルサーバーがまだ実行中かどうかと、その特定のプロセスを停止する方法(例:そのターミナルで Ctrl+C を押す)を伝えてください。広範囲にプロセスを終了するコマンドは使わないでください。可能であれば、ユーザーの作業が終わった後に、準備したレポートを削除してください。
node scripts/prepare-report.mjs --cleanup <session-id>
レポートページを開く許可は、エクスポートや 导出创作 への切り替えを許可するものではありません。
5. エクスポートのリクエストに対応する
エクスポート UI を操作する前に、references/export-workflow.md を読みます。
- ユーザーが選択したアクティビティに従います。指定がない場合は、最新、最長、または最も登りの多いものなど、明確な優先基準を使用します。
- ユーザーのメディアを優先します。組み込みの抽象的な背景を使う場合は、その旨を伝えます。
- 既定では、縦横比 9:16、モーション用に H.264 MP4、アクティビティ全体のサマリーカード、ウォーターマーク有効、安全な配置とします。背景 1 枚のローテーションは 10 秒、ルート写真 1 枚あたりは 2.5 秒にします。
- レンダリング前に、Chromium がネイティブの保存ダイアログを開く場合があり、その際はユーザー自身のクリックが必要になることを伝えます。それ以外の場合は、ブラウザーのダウンロードフォルダーが使用されます。
- 視覚機能がある場合は、プレビューを確認します。ない場合は、境界が確認済みだと主張せず、高負荷のレンダリングを始める前にプレビューを確認するようユーザーに依頼します。
- 静止画には PNG、アニメーション/動画には MP4 を選択します。
- レンダリングが完了し、保存/ダウンロードが確認されるまでは、成功したと主張しないでください。
使いやすさのための既定値
- レポートとウォーターマークではベース名を使い、絶対パスは省略します。
- 欠損しているセンサーについては、データ品質セクションで一度だけ説明します。
- コンポーザーを再度開くときは、現在のエクスポートレイアウトを維持します。
- スポーツが混在している場合、「平均的なアクティビティ」という結論を 1 つにまとめないでください。
- ユーザーファイルと生成したレポートをリポジトリに保存しないでください。実行時のコピーは OS の一時ディレクトリに置きます。npm パッケージは Skill ディレクトリに置き、アップデートで置き換えられる場合があります。
例
- ファイルなしで「运动分析を一度してください。」→ 中国語で、ファイルをドラッグするかローカルパスを指定するよう依頼します。
- 「デモを見せてください。」→
samples/demo.kmlを使用し、合成データであることを伝えて分析し、アクセス可能になったらローカルレポートを開きます。 - ユーザーが FIT ファイルを 1 つ提供する → 確認/インストールし、分析、提示、ステージングを行って、URL から読み込んだレポートを開きます。
- 「この 8 回のライドをまとめて分析してください。」→ 有効な重複していないデータを分析し、別のライドが指定されていない限り、最長のライドを代表レポートとして開きます。
- 「データを見るだけにして、エクスポートはまだしないでください。」→ 分析してレポートページを開きますが、エクスポート作成画面には進みません。
- リモートエージェントからループバックにアクセスできない → テキストレポートと JSON を提供し、ローカルページを利用できない理由を説明します。開いたふりはしません。