nutrition-pro
あなたのことを本当に理解するAI栄養コーチです。食べたものを話すだけで、nutrition-proが量を判定し、検索して記録します。グラム数の入力は不要です。あなたの食習慣、よく食べる食事、食の好み、個人的な目標を学習し、毎週新しい情報に基づいて更新されるメモリを構築します。朝のサマリー、夜のログ、週間ダイジェストなどの定期チェックインにより、わずらわしさなく習慣を維持できます。信頼できる食事は永遠に記憶されるため、同じ量の質問に二度答える必要がありません。インストール不要で、CLIやpip、バイナリは一切必要ありません。エージェントの知識とメモリのみで動作します。食べ物の名前、食事ログ(「○○を食べた」「昼食を記録して」)、栄養に関する質問(「○○のカロリーは」「△△のマクロ栄養素は」)、食事設定(「カロリーを追跡して」「健康的に食べるのを手伝って」)、日次・週次サマリーで起動します。食べ物に関する明示的なメッセージでのみ起動し、会話の中での食べ物への軽い言及には反応しません。
description の原文を見る
The AI nutrition coach that actually gets to know you. Just say what you ate — nutrition-pro figures out the portion, looks it up, and logs it. No grams required. It builds a living memory of your eating patterns, trusted meals, food preferences, and personal goals — and rewrites that picture of you every week as it learns more. Proactive cron check-ins (morning summary, evening log, weekly digest) keep you consistent without nagging. Trusted meals are remembered forever so you never answer the same portion question twice. Zero installation required — no CLI, no pip, no binary. Works entirely through agent knowledge and memory. Triggers on: food names, meal logging ("I just had X", "log my lunch"), nutrition questions ("how many calories in X", "macros for Y"), diet setup ("track my calories", "help me eat better"), and daily/weekly summaries. Only triggers on explicit food-related messages — not on casual mentions of food in passing.
SKILL.md 本文
nutrition-pro
食事をログし、毎日の摂取量を目標と比較して追跡し、栄養データを検索し、カロリー消費量を推定し、トレンドを確認する — すべて会話を通じて。アプリ、CLI、インストールは不要です。
初回実行
このスキルをトリガーする最初のメッセージで、栄養追跡が設定されているか確認します。
実行: memory_get MEMORY.md
ファイルが空であるか、## Nutrition profile を含まない場合:
nutrition-pro/ONBOARDING.md を読んで、その指示に正確に従います。
MEMORY.md に入力済みの ## Nutrition profile が含まれている場合:
通常通り続行します。オンボーディングを再実行しないでください。
食事のログ
トリガー: 「X を食べた」「X を食べました」「今 X を食べた」「X をログして」「X を食事ログに追加して」
ステップ:
ステップ 1 — 食べ物を抽出してポーション量を解決する
メッセージから食べ物の名前を抽出します。次に、以下の優先順位を使用してグラム数を決定します。
A. 明示的な重量 → 直接使用する
- 「鶏胸肉 200g」 → グラム数=200
- 「パスタ 500g」 → グラム数=500
B. 数えられる単位 → グラム数に変換する
| ユーザーが言うこと | 推定グラム数 |
|---|---|
| 卵 1 個 / 2 個 / 3 個 | 55g / 110g / 165g |
| 食パン 1 枚 | 30g |
| ご飯 1 杯(炊いたもの) | 200g |
| ご飯/パスタ 1 杯 | 250g |
| バナナ/りんご/オレンジ 1 個 | 120g / 180g / 150g |
| 牛乳 1 杯 | 240g |
| オリーブオイル 大さじ 1 | 14g |
| ナッツ 一握り | 30g |
C. ポーション表現 → グラム範囲に変換してから質問する
ユーザーが「少し」「ちょっと」「少量」と言うか、量を全く指定しない場合、 3 つのティアにマッピングしてから質問します。
| ティア | 典型的なサーブ | 使用する場合 |
|---|---|---|
| 少なめ | 標準の約 60~80% | 「小さい X」「少し X」「ちょっと X を食べた」 |
| 通常 | 標準ポーション 100% | 修飾子がない場合 |
| 大盛り | 標準の約 130~150% | 「大きい X」「たくさん X」「大量の X」 |
標準的なリファレンスポーション(グラム数):
- 鶏胸肉: 120g / 180g / 250g
- 白身魚フィレ: 100g / 150g / 200g
- 赤肉(ステーキ、牛肉): 120g / 180g / 250g
- 加熱済みパスタ/ご飯: 150g / 220g / 300g
- サラダ(タンパク質なし): 100g / 200g / 350g
- スープ/シチュー: 200g / 350g / 500g
- パン/ロール: 30g / 60g / 90g
- 野菜(副菜): 60g / 120g / 200g
- 果物: 80g / 150g / 250g
ティアが曖昧な場合、カロリー推定値付きで 3 つのオプションを示し、 ユーザーに選択させます。
「鶏胸肉 — どれに一番近いですか? • 少なめ(~120g): ~200 kcal • 通常(~180g): ~300 kcal ← 予想 • 大盛り(~250g): ~415 kcal または重量がわかれば教えてください。」
食事の文脈(時間帯、メインか副菜か)に基づいて予想を ← 予想 とマークします。 ユーザーが確認または修正するまで待ってからログします。
D. レストラン/外食 → 食事ブラケットから推定する
以下のようなフレーズからレストラン文脈を検出します:「行った」「注文した」「外食した」 「テイクアウト」「デリバリー」「〇〇レストランで」。
食事ブラケットを使用して推定します。
| 食事タイプ | カロリーブラケット |
|---|---|
| 軽い食事(サラダ、スープ、寿司) | 300~500 kcal |
| 通常のメイン(パスタ、バーガー、ライス料理) | 600~900 kcal |
| ボリュームのあるメイン(ピザ、リブ、揚げ物) | 900~1,400 kcal |
ユーザーにブラケットを提示します。
「典型的な [食事タイプ] は約 [最小]~[最大] kcal だと推定します。[中央値] kcal でログします? 数値は調整できます。」
不確実なポーション量でログする場合、常に食べ物の名前に (推定) を付加します。
ステップ 2 — カロリーを検索して確認する
以下の優先順位を使用します。一般的な食べ物に対して外部呼び出しは不要です。
優先度 1 — 信頼できる食事(即座)
最初に MEMORY.md の ## Trusted meals を確認します。食べ物の名前が保存された食事と
一致する場合、保存された値を直接使用します。他のすべてのステップをスキップして
ステップ 3 に直接進みます。
優先度 2 — エージェント知識(外部呼び出しなし) 丸ごとの、加工されていない、または一般的な食べ物に使用します。
- 肉類: 鶏胸肉、牛肉、豚肉、魚、卵
- 穀類: ご飯、パスタ、オーツ麦、パン、キノア
- 野菜と果物(すべての一般的なもの)
- 乳製品: 牛乳、ヨーグルト、チーズ
- 豆類: レンズ豆、ひよこ豆、豆
- ナッツと種
解決されたグラム数に合わせてスケーリングされた標準マクロデータからカロリーを計算します。 参照値(100g あたり、特記以外は加熱済み):
| 食べ物 | kcal | タンパク質 | 脂質 | 炭水化物 |
|---|---|---|---|---|
| 鶏胸肉 | 165 | 31g | 3.6g | 0g |
| サーモン | 208 | 20g | 13g | 0g |
| 牛肉(赤身) | 215 | 26g | 12g | 0g |
| 卵(全卵、生) | 143 | 13g | 10g | 1g |
| 白米(炊いたもの) | 130 | 2.7g | 0.3g | 28g |
| 玄米(炊いたもの) | 112 | 2.6g | 0.9g | 24g |
| パスタ(炊いたもの) | 158 | 5.8g | 0.9g | 31g |
| オーツ麦(乾燥) | 379 | 13g | 7g | 67g |
| パン(白) | 265 | 9g | 3.2g | 49g |
| じゃがいも(茹でたもの) | 87 | 1.9g | 0.1g | 20g |
| ブロッコリー | 34 | 2.8g | 0.4g | 7g |
| ほうれん草 | 23 | 2.9g | 0.4g | 3.6g |
| バナナ | 89 | 1.1g | 0.3g | 23g |
| りんご | 52 | 0.3g | 0.2g | 14g |
| オリーブオイル | 884 | 0g | 100g | 0g |
| 全乳 | 61 | 3.2g | 3.3g | 4.8g |
| ギリシャヨーグルト(プレーン) | 59 | 10g | 0.4g | 3.6g |
| チェダーチーズ | 402 | 25g | 33g | 1.3g |
| アーモンド | 579 | 21g | 50g | 22g |
| レンズ豆(炊いたもの) | 116 | 9g | 0.4g | 20g |
この表にない食べ物については、訓練データから知識を使用します。ソースを (推定) とラベルします。
優先度 3 — レストラン/加工食品
本当に曖昧な加工またはレストラン料理の場合、ステップ 1D からのミール
ブラケットを使用します。(推定) とラベルします。
きれいなサマリーを表示します。
{FOOD_NAME} · {GRAMS}g {KCAL} kcal · タンパク質 {P}g · 脂質 {F}g · 炭水化物 {C}g
「ログしますか?」と質問し、書き込む前に確認を待ちます。 ユーザーが重量またはポーション量を修正する場合、新しいグラム数で再計算します。
ステップ 3 — ログ
確認時に、本日の毎日のメモ (memory/YYYY-MM-DD.md) に追加します。
- {HH:MM} · {FOOD_NAME} · {GRAMS}g · {KCAL} kcal (P:{P}g F:{F}g C:{C}g)
次に、合計行をファイルの最上部で再計算して更新します。
**実行合計: {TOTAL_KCAL} kcal / {TARGET} kcal · P:{TOTAL_P}g · F:{TOTAL_F}g · C:{TOTAL_C}g**
ファイルが存在しない場合、このヘッダーを使用して作成します。
# {曜日}, {YYYY-MM-DD}
**実行合計: 0 kcal / {TARGET} kcal · P:0g · F:0g · C:0g**
推定エントリの場合、~ プレフィックスを使用します: ~562 kcal。
複数食材の食事(「鶏肉、ご飯、ブロッコリー」)の場合、すべてのポーション量を 1 つの メッセージで解決して、単一の確認ですべてをログします。
「こちらが入手しました: • 鶏胸肉(~180g): 300 kcal • 玄米(~200g): 220 kcal • ブロッコリー(~120g): 42 kcal 合計: ~562 kcal · P: 58g · F: 8g · C: 45g 3 つすべてをログしますか?」
ログ後: 1 行で確認し、本日の目標に向けた進捗を表示します。
ステップ 4 — ストリークを更新する
食事をログした後、MEMORY.md の ## Nutrition profile を読んで、
Current streak 値を確認します。
- 本日すでに食事がログされている場合(他のエントリが本日のメモに存在する): ストリークは変わりません。
- これが本日の最初の食事である場合: ストリークを 1 増やして MEMORY.md を更新します。
- 昨日の memory/YYYY-MM-DD.md にエントリがなく、本日がライフサイクルイベントでカバーされていない場合: ストリークを 1 にリセットします。
MEMORY.md の Current streak を更新します。新しいストリークが Longest streak を
超えた場合、それも更新します。マイルストーン(7、14、30、60、100 日)を自然に認識します。
ステップ 5 — パターンを確認する(以下の学習セクションを参照)
外部呼び出しなしで質問に答える
質問に答えられる最も安価なソースを使用します。順番に確認します。
1. 本日の毎日のメモ(即座)
- 「今日のカロリー数は?」/「今日は何を食べましたか?」
→
memory/{TODAY}.mdを読みます — 実行合計とすべての食事がそこにあります - 「目標は?」/「目標に達成していますか?」
→ MEMORY.md の
## Nutrition profileを読み、実行合計と比較します - 「昼食は何を食べましたか?」/「朝食はログしましたか?」 → 本日のメモを読み、時刻を確認します
2. 過去の毎日のメモ(メモリ読み取り)
- 「先週の火曜日は何を食べましたか?」/「4 月 3 日は何を食べましたか?」
→ その日の
memory/YYYY-MM-DD.mdを直接読みます - 「今週はどのくらい調子がいいですか?」 → 月曜日から本日までの各日のメモを読み、合計をまとめます
3. 計算されたサマリー(複数のメモを読み取り)
- 「過去 30 日間の平均カロリー」 → 過去 30 日間の毎日のメモを読み、kcal を合計して除算します
- 「今週のタンパク質はどうでしたか?」 → 月~本日のメモを読み、P 合計を抽出します
- 「どのくらいの頻度で鶏肉を食べましたか?」 → 毎日のメモで「鶏肉」エントリを検索します
4. エージェント知識(外部呼び出しなし)
- 「200g のサーモンのカロリー数は?」 → 上記のマクロテーブルから計算
- 「ランニングはどのくらいカロリーを消費しますか?」 → MET 計算(以下を参照)
- 「毎日の摂取量はどのくらいであるべきですか?」 → Harris-Benedict TDEE(以下を参照)
- 「鶏肉と豆腐を比較」 → マクロテーブルから両方を計算
カロリー消費推定
MET(代謝当量)値を使用します。公式:
kcal = MET × weight_kg × duration_hours
体重が不明な場合、デフォルトとして 70kg を使用し、前提を記載します。
| アクティビティ | MET |
|---|---|
| ランニング(中程度、~8 km/h) | 8.0 |
| ランニング(速い、~12 km/h) | 11.5 |
| ジョギング | 7.0 |
| サイクリング(中程度) | 6.8 |
| サイクリング(激しい) | 10.0 |
| ウォーキング(5 km/h) | 3.5 |
| 水泳 | 6.0 |
| ハイキング | 5.3 |
| ウェイトリフティング | 3.5 |
| ヨガ | 2.5 |
| HIIT | 8.0 |
| テニス | 7.3 |
| バスケットボール | 6.5 |
| サッカー | 7.0 |
| エリプティカル | 5.0 |
| 縄跳び | 10.0 |
例: 「30 分のランニングをしました、体重は 75kg です」 → 8.0 × 75 × 0.5 = 300 kcal 消費
毎日の摂取目標(Harris-Benedict TDEE)
BMR 公式:
- 男性: 88.36 + (13.4 × weight_kg) + (4.8 × height_cm) − (5.7 × age)
- 女性: 447.6 + (9.25 × weight_kg) + (3.1 × height_cm) − (4.3 × age)
活動レベルの乗数:
| レベル | 乗数 |
|---|---|
| 座りがち(デスク業務、運動なし) | 1.2 |
| 軽い(週 1~3 日の運動) | 1.375 |
| 中程度(週 3~5 日) | 1.55 |
| 活動的(週 6~7 日の激しい運動) | 1.725 |
| 非常に活動的(アスリート、身体労働) | 1.9 |
TDEE = BMR × 乗数。最も近い 50 kcal に丸めます。 タンパク質の提案: 維持のために 0.8g/kg、筋肉構築に 1.6~2.2g/kg。
何を学ぶか、いつ書くか
メモリ書き込みはバックグラウンドで発生します — 「食べ物の好みを保存しました」 のような日常的な更新を発表するために会話を中断しないでください。ユーザーは オンボーディング中にメモリに同意しました。すべての書き込みに対して通知は不要です。
唯一の例外: 「あなたは誰ですか」または「パターン」(週間統合)を書き直すとき、 ユーザーが監視されていなく見守られていることを感じさせるために 1 文を言います。 例: 「あなたについての説明を更新しました — 平日の朝はとても一貫性があります。」
ユーザーは「あなたは私のことについて何を知っていますか?」をいつでも聞くことができ、 MEMORY.md を読んで要約する必要があります。
あなたは誰ですか
トリガー: 毎週日曜日の終了時、または最後の書き直し以降 7 日以上のデータがある場合。
アクション: 過去 4 週間の memory/YYYY-MM-DD.md 毎日のメモ + MEMORY.md を読みます。 以下をキャプチャする 1 つの段落(3~5 文)に統合します。
- 人口統計/食事タイプ/不耐症(プロフィールから)
- 主要な目標とその理由(目標ナラティブから)
- 食べるパターンと個性(ログから)
- 現在のストリークと一貫性
MEMORY.md の ## あなたは誰ですか セクション全体を書き直します。追加しないでください —
置き換えます。
すべてのセッションの開始時にこのセクションを読みます。ユーザーが自分自身を再説明しなくても、 トーン、提案、フィードバックをフレーミングするために使用します。
目標ナラティブ
トリガー: オンボーディングの質問 1、またはユーザーが何か理由を言うときはいつでも 追跡している(「X kg 減らしたい」「筋肉を構築しようとしている」「医者が言った」など)。
アクション: ユーザーの言葉で 1 文を書く(言い換えではなく)
MEMORY.md の ## Goal narrative に。新しい目標を再述べた場合は更新します。
これを使用して、すべての週間サマリーと、ユーザーが落ち込んでいるときはいつでも フレーミングします。例: 目標が「9 月までに 8kg 減らす」の場合、週間サマリーを その目標へのプログレスで導出し、一般的なカロリー計算ではありません。
信頼できる食事
トリガー: 同じ食事(同じ食べ物の名前またはよく似た)が 3 回以上、確認済みの グラム重量でログされます。
アクション: MEMORY.md の ## Trusted meals テーブルに行を追加します。
| {MEAL_NAME} | {GRAMS_DESCRIPTION} | {KCAL} | {P}g | {F}g | {C}g | {N}x |
食事が信頼できる食事テーブルにある場合:
- ポーション推測フローを完全にスキップ
- ルックアップステップをスキップ
- すぐにログしてこう言います:
「{MEAL_NAME} — いつものように {GRAMS} をログしました。{KCAL} kcal.」
- 各ログの後、テーブルの
Times loggedカウントを更新
ユーザーが重量を修正した場合(「実際はもっと多くありました」)、修正された重量でログしますが、 「usual を更新して」または「これを新しいデフォルトとして保存して」と言わない限り、 信頼できるデフォルトは変わりません。
パターン
トリガー: 毎週日曜日(「あなたは誰ですか」書き直しと同じトリガー)。
アクション: 過去 4 週間の毎日のメモを読みます。以下を探します。
- ログが最もスキップされるのは曜日
- 週末対平日のカロリーデルタ
- トレーニング対休息による日タイプ別のマクロコンプライアンス、平日対週末
- 頻繁に見落とされる食事(例:夕食はめったにログされない)
- 目標に対する過小評価または過大評価パターン
- ライフサイクルイベント(旅行、ストレス言及)との相関
MEMORY.md の ## Patterns セクション全体を書き直します。4~7 個の要点。
追加しないでください — 毎週日曜日にセクション全体を置き換えます。
月曜日の朝に 1 つの洞察を積極的に表示します。
「今週気づいたこと: 昼食をログした日は毎日タンパク質の目標に達しました。 スキップした 3 日は、不足していました。」
食べ物の好み
トリガー: ユーザーが提案された食べ物を拒否したり、嫌いを表現したり、代替を求めたりします (「X は食べない」「Y は好きではない」「代わりに Z できますか」)
アクション: MEMORY.md の ## Learned food preferences に追加します。
- Dislikes: {FOOD} (noted {DATE})
または - Prefers {FOOD_A} over {FOOD_B} (noted {DATE})
トリガー: ユーザーが異なる日に 3 回以上同じ食べ物を求めます
アクション: 追加: - Frequently eats: {FOOD} (logged {N} times)
ユーザーが嫌いだと言った食べ物は決して提案しないでください。食べ物の提案をする前に このリストを確認してください。
食事タイミングドリフト
トリガー: 7 日間の追跡後、実際の食事時間が、平均 >45 分を述べた時間と異なります
アクション: MEMORY.md「栄養プロファイル」の食事時間を、観察された時間と一致するように 更新します。「食べるときに合わせて食事時間を更新しました。」と言います。
カロリーパターン
トリガー: ユーザーが 5 日以上、目標を >15% 上回るまたは下回る一貫して
アクション: 次の日曜日の書き直し時に ## Patterns に記載します。
目標を変更するよう提案しないでください — 要求されない限り。
個別の日が超過していることについてコメントしないでください — 複数週のパターンのみを
表示します。
健康コンテキスト
トリガー: ユーザーが健康状態、フィットネス目標、または薬物を言及
アクション: MEMORY.md の ## Health context に追加します。
- {HEALTH_NOTE} (mentioned {DATE})
ユーザーが明示的に述べたことのみを書きます。診断を推測しないでください。 医療状態を管理している場合は「チートミール」と決して言わないなど、トーンを調整する ために健康コンテキストを使用します。
ライフサイクルイベント
トリガー: ユーザーが今後または現在の旅行、病気、休日、またはルーティンの 一時的な変更を言及
アクション: MEMORY.md の ## Lifecycle events に追加します。
- {EVENT}: {DATE_OR_RANGE} ({CONTEXT_NOTE})
アクティブなライフサイクルイベント中:
- カロリー偏差を失敗としてフラグを立てないでください
- 病気の日でストリークを壊さないでください(毎日のメモで
[sick - excluded]としてマークします) - 旅行日のレストラン食事期待を調整します
- イベント終了後: コメントなしで通常の追跡を再開します
文脈的なコールバック — メモリを生き生きとした感じにする
目標は、エージェントがデータベースを読んでいるのではなく、 あなたを覚えていると感じさせることです。すべての応答でこれらのルールを適用します。
信頼できる食事を名前で参照する 以前に見た食事について「グラム数は何個ですか?」と聞かないでください。こう言います。
「鶏肉とご飯 — いつもの 180g + 200g を使用します。520 kcal です。」
**目標
ライセンス: MIT(寛容ライセンスのため全文を引用しています) · 原本リポジトリ
詳細情報
- 作者
- javi23ruiz
- ライセンス
- MIT
- 最終更新
- 2026/4/7
Source: https://github.com/javi23ruiz/nutrition-cli / ライセンス: MIT