wellness-nourish 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (90) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +146 -0
  3. package/SECURITY.md +9 -0
  4. package/dist/cli/commands.d.ts +3 -0
  5. package/dist/cli/commands.js +467 -0
  6. package/dist/cli/commands.js.map +1 -0
  7. package/dist/constants.d.ts +8 -0
  8. package/dist/constants.js +9 -0
  9. package/dist/constants.js.map +1 -0
  10. package/dist/index.d.ts +3 -0
  11. package/dist/index.js +153 -0
  12. package/dist/index.js.map +1 -0
  13. package/dist/prompts/nourish-prompts.d.ts +2 -0
  14. package/dist/prompts/nourish-prompts.js +17 -0
  15. package/dist/prompts/nourish-prompts.js.map +1 -0
  16. package/dist/providers/open-food-facts.d.ts +5 -0
  17. package/dist/providers/open-food-facts.js +141 -0
  18. package/dist/providers/open-food-facts.js.map +1 -0
  19. package/dist/providers/usda.d.ts +6 -0
  20. package/dist/providers/usda.js +157 -0
  21. package/dist/providers/usda.js.map +1 -0
  22. package/dist/resources/nourish-resources.d.ts +2 -0
  23. package/dist/resources/nourish-resources.js +26 -0
  24. package/dist/resources/nourish-resources.js.map +1 -0
  25. package/dist/schemas/common.d.ts +224 -0
  26. package/dist/schemas/common.js +224 -0
  27. package/dist/schemas/common.js.map +1 -0
  28. package/dist/services/agent-manifest.d.ts +27 -0
  29. package/dist/services/agent-manifest.js +80 -0
  30. package/dist/services/agent-manifest.js.map +1 -0
  31. package/dist/services/capabilities.d.ts +12 -0
  32. package/dist/services/capabilities.js +27 -0
  33. package/dist/services/capabilities.js.map +1 -0
  34. package/dist/services/config.d.ts +3 -0
  35. package/dist/services/config.js +32 -0
  36. package/dist/services/config.js.map +1 -0
  37. package/dist/services/connection-status.d.ts +13 -0
  38. package/dist/services/connection-status.js +34 -0
  39. package/dist/services/connection-status.js.map +1 -0
  40. package/dist/services/food-normalization.d.ts +3 -0
  41. package/dist/services/food-normalization.js +14 -0
  42. package/dist/services/food-normalization.js.map +1 -0
  43. package/dist/services/format.d.ts +13 -0
  44. package/dist/services/format.js +58 -0
  45. package/dist/services/format.js.map +1 -0
  46. package/dist/services/goals-store.d.ts +7 -0
  47. package/dist/services/goals-store.js +87 -0
  48. package/dist/services/goals-store.js.map +1 -0
  49. package/dist/services/hydration-store.d.ts +12 -0
  50. package/dist/services/hydration-store.js +96 -0
  51. package/dist/services/hydration-store.js.map +1 -0
  52. package/dist/services/intake-store.d.ts +15 -0
  53. package/dist/services/intake-store.js +170 -0
  54. package/dist/services/intake-store.js.map +1 -0
  55. package/dist/services/meal-estimator.d.ts +22 -0
  56. package/dist/services/meal-estimator.js +178 -0
  57. package/dist/services/meal-estimator.js.map +1 -0
  58. package/dist/services/nutrients.d.ts +4 -0
  59. package/dist/services/nutrients.js +31 -0
  60. package/dist/services/nutrients.js.map +1 -0
  61. package/dist/services/portion-engine.d.ts +4 -0
  62. package/dist/services/portion-engine.js +50 -0
  63. package/dist/services/portion-engine.js.map +1 -0
  64. package/dist/services/privacy-audit.d.ts +12 -0
  65. package/dist/services/privacy-audit.js +19 -0
  66. package/dist/services/privacy-audit.js.map +1 -0
  67. package/dist/services/summary.d.ts +28 -0
  68. package/dist/services/summary.js +84 -0
  69. package/dist/services/summary.js.map +1 -0
  70. package/dist/services/usage-guide.d.ts +12 -0
  71. package/dist/services/usage-guide.js +57 -0
  72. package/dist/services/usage-guide.js.map +1 -0
  73. package/dist/tools/nourish-tools.d.ts +2 -0
  74. package/dist/tools/nourish-tools.js +603 -0
  75. package/dist/tools/nourish-tools.js.map +1 -0
  76. package/dist/types.d.ts +97 -0
  77. package/dist/types.js +2 -0
  78. package/dist/types.js.map +1 -0
  79. package/examples/claude-desktop.json +13 -0
  80. package/examples/codex.json +13 -0
  81. package/examples/cursor.json +13 -0
  82. package/examples/hermes.md +18 -0
  83. package/examples/openclaw.md +18 -0
  84. package/examples/windsurf.json +13 -0
  85. package/fixtures/open-food-facts/barcode-peanut-butter.json +23 -0
  86. package/fixtures/usda/food-banana.json +16 -0
  87. package/fixtures/usda/search-banana.json +17 -0
  88. package/package.json +52 -0
  89. package/server.json +16 -0
  90. package/tsconfig.json +21 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 David Mosiah
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,146 @@
1
+ # Wellness Nourish MCP
2
+
3
+ ## Overview
4
+
5
+ Wellness Nourish is a local MCP server for nutrition search, barcode lookup, meal estimation, intake logging, hydration, goals, exports, and daily or weekly summaries. It runs over stdio by default for MCP clients and can also run a Streamable HTTP endpoint at `POST /mcp`.
6
+
7
+ The connector uses USDA FoodData Central as the primary food search provider. Open Food Facts is used for packaged-food barcode lookup when enabled. It does not provide hosted sync, photo analysis, recipe generation, or medical advice.
8
+
9
+ ## Install
10
+
11
+ ```bash
12
+ npm install
13
+ npm run build
14
+ ```
15
+
16
+ Run the MCP server over stdio:
17
+
18
+ ```bash
19
+ npm start
20
+ ```
21
+
22
+ Run Streamable HTTP locally:
23
+
24
+ ```bash
25
+ node dist/index.js --http
26
+ ```
27
+
28
+ Optional environment:
29
+
30
+ ```bash
31
+ FDC_API_KEY=your_usda_key
32
+ NOURISH_OFF_ENABLED=1
33
+ NOURISH_LOCAL_DIR=~/.wellness-nourish
34
+ NOURISH_MCP_PORT=3000
35
+ ```
36
+
37
+ Agents should never ask users to paste API keys, tokens, raw health exports, or private food logs into chat. Configure secrets through environment variables or local files.
38
+
39
+ ## CLI Commands
40
+
41
+ ```bash
42
+ nourish-mcp status
43
+ nourish-mcp doctor
44
+ nourish-mcp setup --client claude
45
+ nourish-mcp search banana
46
+ nourish-mcp barcode 0000000000000
47
+ nourish-mcp log --preview --meal breakfast "2 eggs and banana"
48
+ nourish-mcp log "2 eggs and banana"
49
+ nourish-mcp list 2026-05-05
50
+ nourish-mcp edit --entry intake_id --meal snack --notes "corrected"
51
+ nourish-mcp today --format markdown
52
+ nourish-mcp weekly --format markdown
53
+ nourish-mcp goals --set-calories 2200 --set-protein 120 --set-water 2500
54
+ nourish-mcp water 500 --date 2026-05-05
55
+ nourish-mcp water today --date 2026-05-05
56
+ nourish-mcp export --format csv
57
+ nourish-mcp clear-day 2026-05-05 --yes
58
+ nourish-mcp delete --entry intake_id
59
+ ```
60
+
61
+ No arguments start the stdio MCP server. `--http` starts HTTP transport, `--version` prints the package version, and `--help` prints usage.
62
+
63
+ `log --preview` estimates without writing. Mutating MCP tools require explicit user intent; CLI commands are treated as explicit user actions, while destructive clear-day requires `--yes`.
64
+
65
+ The local estimator understands common lightweight portions such as `g`, `oz`, `cup`, `tbsp`, `tsp`, `slice`, `piece`, and `serving`. It still reports confidence and warnings because these are conservative tracking estimates, not lab-grade nutrition facts.
66
+
67
+ ## MCP Client Config Examples
68
+
69
+ Ready-to-use examples live in `examples/`:
70
+
71
+ - `examples/claude-desktop.json`
72
+ - `examples/codex.json`
73
+ - `examples/cursor.json`
74
+ - `examples/windsurf.json`
75
+ - `examples/hermes.md`
76
+ - `examples/openclaw.md`
77
+
78
+ Claude Desktop style:
79
+
80
+ ```json
81
+ {
82
+ "mcpServers": {
83
+ "nourish": {
84
+ "command": "npx",
85
+ "args": ["-y", "wellness-nourish"],
86
+ "env": {
87
+ "FDC_API_KEY": "${FDC_API_KEY}",
88
+ "NOURISH_OFF_ENABLED": "1"
89
+ }
90
+ }
91
+ }
92
+ }
93
+ ```
94
+
95
+ Local build:
96
+
97
+ ```json
98
+ {
99
+ "mcpServers": {
100
+ "nourish": {
101
+ "command": "node",
102
+ "args": ["/absolute/path/to/wellness-nourish/dist/index.js"],
103
+ "env": {
104
+ "NOURISH_LOCAL_DIR": "/absolute/path/to/.wellness-nourish"
105
+ }
106
+ }
107
+ }
108
+ }
109
+ ```
110
+
111
+ ## Provider Attribution
112
+
113
+ USDA FoodData Central is the primary provider for generic food search and nutrient data. USDA data is public domain or otherwise provided by USDA FoodData Central terms; keep provider attribution with derived results.
114
+
115
+ Open Food Facts barcode data is licensed under the Open Database License (ODbL). Open Food Facts metadata has share-alike obligations, so agents and downstream tools should preserve attribution and license metadata when exporting or reusing packaged-food records.
116
+
117
+ ## Privacy
118
+
119
+ Intake data is stored locally under `~/.wellness-nourish/intake.jsonl` unless `NOURISH_LOCAL_DIR` is set. Hydration is stored in `hydration.jsonl`, and goals are stored in `goals.json` in the same local directory. The connector does not require hosted accounts and does not send local intake logs to Delx Wellness. Provider lookups may contact USDA FoodData Central or Open Food Facts unless fixture mode is enabled.
120
+
121
+ Use `nourish-mcp export` to print the local JSONL export, `nourish-mcp export --format csv` for CSV, `nourish-mcp delete --entry <id>` to delete a specific intake entry, or `nourish-mcp clear-day <date> --yes` to delete all intake entries for a day.
122
+
123
+ ## Not Medical Advice
124
+
125
+ Nutrition estimates are approximate and intended for personal tracking and agent workflow context. They are not diagnosis, treatment, or medical advice. Confirm important nutrition decisions with a qualified professional.
126
+
127
+ ## Development And Tests
128
+
129
+ ```bash
130
+ npm run typecheck
131
+ npm run build
132
+ npm run smoke:http
133
+ npm run test:cli-ux
134
+ npm run test:agent-readiness
135
+ npm test
136
+ ```
137
+
138
+ Fixture mode:
139
+
140
+ ```bash
141
+ NOURISH_FIXTURE_MODE=1 NOURISH_FIXTURE_DIR=fixtures npm run test:cli-ux
142
+ ```
143
+
144
+ ## Delx Wellness
145
+
146
+ Project page: <https://wellness.delx.ai/connectors/nourish>
package/SECURITY.md ADDED
@@ -0,0 +1,9 @@
1
+ # Security Policy
2
+
3
+ Do not paste API keys, tokens, raw health exports, or private food logs into chats, tickets, prompts, or public issues.
4
+
5
+ Wellness Nourish stores local intake data at `~/.wellness-nourish/intake.jsonl` by default. Set `NOURISH_LOCAL_DIR` to move that storage path.
6
+
7
+ Use `nourish-mcp export` to review/export local intake JSONL. Use `nourish-mcp delete --entry <id>` to remove a local intake entry.
8
+
9
+ Report security issues privately to the repository owner. Do not publish private food logs, local storage files, tokens, or exploit details publicly before coordination.
@@ -0,0 +1,3 @@
1
+ export declare function isCliCommand(args: string[]): boolean;
2
+ export declare function isUnknownCliCommand(args: string[]): boolean;
3
+ export declare function runCliCommand(args: string[]): Promise<number>;
@@ -0,0 +1,467 @@
1
+ import { lookupOpenFoodFactsBarcode } from "../providers/open-food-facts.js";
2
+ import { searchUsdaFoods } from "../providers/usda.js";
3
+ import { buildConnectionStatus } from "../services/connection-status.js";
4
+ import { getGoals, updateGoals } from "../services/goals-store.js";
5
+ import { buildHydrationSummary, logWater } from "../services/hydration-store.js";
6
+ import { addIntakeEntry, clearIntakeDay, deleteIntakeEntry, exportIntakeCsvData, exportIntakeData, listIntakeEntries, updateIntakeEntry, } from "../services/intake-store.js";
7
+ import { estimateMeal } from "../services/meal-estimator.js";
8
+ import { buildDailySummary, buildWeeklySummary } from "../services/summary.js";
9
+ const COMMANDS = new Set([
10
+ "status",
11
+ "doctor",
12
+ "setup",
13
+ "search",
14
+ "barcode",
15
+ "log",
16
+ "list",
17
+ "edit",
18
+ "today",
19
+ "weekly",
20
+ "export",
21
+ "delete",
22
+ "clear-day",
23
+ "goals",
24
+ "water",
25
+ ]);
26
+ const MEAL_TYPES = ["breakfast", "lunch", "dinner", "snack", "other"];
27
+ export function isCliCommand(args) {
28
+ const command = args[0];
29
+ return command !== undefined && COMMANDS.has(command);
30
+ }
31
+ export function isUnknownCliCommand(args) {
32
+ const command = args[0];
33
+ return command !== undefined && !command.startsWith("-") && !COMMANDS.has(command);
34
+ }
35
+ export async function runCliCommand(args) {
36
+ const [command, ...rest] = args;
37
+ try {
38
+ switch (command) {
39
+ case "status":
40
+ return printStatus();
41
+ case "doctor":
42
+ return doctorCommand();
43
+ case "setup":
44
+ return setupCommand(rest);
45
+ case "search":
46
+ return await searchCommand(rest);
47
+ case "barcode":
48
+ return await barcodeCommand(rest);
49
+ case "log":
50
+ return await logCommand(rest);
51
+ case "list":
52
+ return await listCommand(rest);
53
+ case "edit":
54
+ return await editCommand(rest);
55
+ case "today":
56
+ return await todayCommand(rest);
57
+ case "weekly":
58
+ return await weeklyCommand(rest);
59
+ case "export":
60
+ return await exportCommand(rest);
61
+ case "delete":
62
+ return await deleteCommand(rest);
63
+ case "clear-day":
64
+ return await clearDayCommand(rest);
65
+ case "goals":
66
+ return await goalsCommand(rest);
67
+ case "water":
68
+ return await waterCommand(rest);
69
+ default:
70
+ console.error("Unknown command");
71
+ return 1;
72
+ }
73
+ }
74
+ catch (error) {
75
+ console.error(error instanceof Error ? error.message : String(error));
76
+ return 1;
77
+ }
78
+ }
79
+ function printStatus() {
80
+ console.log("Nourish MCP");
81
+ console.log(JSON.stringify(buildConnectionStatus(), null, 2));
82
+ return 0;
83
+ }
84
+ function doctorCommand() {
85
+ const status = buildConnectionStatus();
86
+ console.log(JSON.stringify({
87
+ ok: true,
88
+ checks: [
89
+ {
90
+ name: "storage",
91
+ ok: true,
92
+ detail: status.local_dir,
93
+ },
94
+ {
95
+ name: "mcp",
96
+ ok: true,
97
+ detail: "stdio ready; Streamable HTTP available with --http",
98
+ },
99
+ {
100
+ name: "usda",
101
+ ok: true,
102
+ detail: status.usda_mode,
103
+ },
104
+ {
105
+ name: "open_food_facts",
106
+ ok: status.open_food_facts_enabled,
107
+ detail: status.open_food_facts_enabled ? "enabled" : "disabled",
108
+ },
109
+ ],
110
+ status,
111
+ }, null, 2));
112
+ return 0;
113
+ }
114
+ function setupCommand(args) {
115
+ const parsed = parseArgs(args);
116
+ const client = optionString(parsed, "client") ?? "generic";
117
+ const config = {
118
+ mcpServers: {
119
+ nourish: {
120
+ command: "npx",
121
+ args: ["-y", "wellness-nourish"],
122
+ env: {
123
+ FDC_API_KEY: "${FDC_API_KEY}",
124
+ NOURISH_OFF_ENABLED: "1",
125
+ NOURISH_LOCAL_DIR: "~/.wellness-nourish",
126
+ },
127
+ },
128
+ },
129
+ };
130
+ console.log(JSON.stringify({
131
+ client,
132
+ config,
133
+ next_steps: [
134
+ "Run nourish-mcp doctor.",
135
+ "In agents, call nourish_connection_status before provider-backed tools.",
136
+ "Use preview before write for food logs.",
137
+ ],
138
+ }, null, 2));
139
+ return 0;
140
+ }
141
+ async function searchCommand(args) {
142
+ const query = args.join(" ").trim();
143
+ if (query.length === 0) {
144
+ console.error("Usage: nourish-mcp search <query>");
145
+ return 1;
146
+ }
147
+ const result = await searchUsdaFoods(query, 10);
148
+ for (const food of result.foods) {
149
+ const calories = food.nutrients_per_100g.calories_kcal ?? "unknown";
150
+ console.log(`${food.name}\t${food.source}\t${calories} kcal/100g`);
151
+ }
152
+ return 0;
153
+ }
154
+ async function barcodeCommand(args) {
155
+ const barcode = args[0];
156
+ if (barcode === undefined || barcode.trim().length === 0) {
157
+ console.error("Usage: nourish-mcp barcode <barcode>");
158
+ return 1;
159
+ }
160
+ const result = await lookupOpenFoodFactsBarcode(barcode);
161
+ console.log(JSON.stringify(result.food, null, 2));
162
+ return 0;
163
+ }
164
+ async function logCommand(args) {
165
+ const parsed = parseArgs(args);
166
+ const text = parsed.positionals.join(" ").trim();
167
+ if (text.length === 0) {
168
+ console.error("Usage: nourish-mcp log [--preview] [--meal breakfast] [--timestamp ISO] <text...>");
169
+ return 1;
170
+ }
171
+ const mealType = parseMealType(optionString(parsed, "meal") ?? "other");
172
+ const estimate = await estimateMeal({
173
+ text,
174
+ meal_type: mealType,
175
+ locale: "en-US",
176
+ });
177
+ const entryInput = {
178
+ meal_type: mealType,
179
+ food_ref: {
180
+ source: "estimate",
181
+ source_id: stableEstimateId(text),
182
+ name: text,
183
+ },
184
+ quantity: 1,
185
+ unit: "meal",
186
+ nutrients: estimate.total_nutrients,
187
+ confidence: estimate.confidence,
188
+ source_trace: "estimate",
189
+ tags: [],
190
+ wellness_context_refs: [],
191
+ };
192
+ const timestamp = optionString(parsed, "timestamp") ?? dateToNoonTimestamp(optionString(parsed, "date"));
193
+ const notes = optionString(parsed, "notes");
194
+ const gramsEstimate = sumGrams(estimate.items);
195
+ if (timestamp !== undefined) {
196
+ entryInput.timestamp = timestamp;
197
+ }
198
+ if (notes !== undefined) {
199
+ entryInput.notes = notes;
200
+ }
201
+ if (gramsEstimate !== undefined) {
202
+ entryInput.grams_estimate = gramsEstimate;
203
+ }
204
+ if (hasFlag(parsed, "preview")) {
205
+ console.log(JSON.stringify({
206
+ would_write: false,
207
+ estimate,
208
+ entry_preview: entryInput,
209
+ }, null, 2));
210
+ return 0;
211
+ }
212
+ const entry = await addIntakeEntry(entryInput);
213
+ console.log(JSON.stringify(entry, null, 2));
214
+ return 0;
215
+ }
216
+ async function listCommand(args) {
217
+ const parsed = parseArgs(args);
218
+ const date = optionString(parsed, "date") ?? parsed.positionals[0];
219
+ const entries = await listIntakeEntries(date === undefined ? {} : { date });
220
+ console.log(JSON.stringify({ entries }, null, 2));
221
+ return 0;
222
+ }
223
+ async function editCommand(args) {
224
+ const parsed = parseArgs(args);
225
+ const id = optionString(parsed, "entry") ?? parsed.positionals[0];
226
+ if (id === undefined) {
227
+ console.error("Usage: nourish-mcp edit --entry <id> [--meal snack] [--quantity 2] [--notes text]");
228
+ return 1;
229
+ }
230
+ const patch = {};
231
+ const meal = optionString(parsed, "meal");
232
+ const quantity = optionString(parsed, "quantity");
233
+ const unit = optionString(parsed, "unit");
234
+ const timestamp = optionString(parsed, "timestamp");
235
+ const notes = optionString(parsed, "notes");
236
+ if (meal !== undefined) {
237
+ patch.meal_type = parseMealType(meal);
238
+ }
239
+ if (quantity !== undefined) {
240
+ patch.quantity = parsePositiveNumber(quantity, "quantity");
241
+ }
242
+ if (unit !== undefined) {
243
+ patch.unit = unit;
244
+ }
245
+ if (timestamp !== undefined) {
246
+ patch.timestamp = timestamp;
247
+ }
248
+ if (notes !== undefined) {
249
+ patch.notes = notes;
250
+ }
251
+ console.log(JSON.stringify(await updateIntakeEntry(id, patch), null, 2));
252
+ return 0;
253
+ }
254
+ async function todayCommand(args) {
255
+ const parsed = parseArgs(args);
256
+ const summary = await buildDailySummary(optionString(parsed, "date"));
257
+ printSummary(summary, optionString(parsed, "format"));
258
+ return 0;
259
+ }
260
+ async function weeklyCommand(args) {
261
+ const parsed = parseArgs(args);
262
+ const summary = await buildWeeklySummary(optionString(parsed, "start-date"));
263
+ printWeeklySummary(summary, optionString(parsed, "format"));
264
+ return 0;
265
+ }
266
+ async function exportCommand(args) {
267
+ const parsed = parseArgs(args);
268
+ const format = optionString(parsed, "format") ?? "jsonl";
269
+ if (format === "csv") {
270
+ process.stdout.write(await exportIntakeCsvData());
271
+ return 0;
272
+ }
273
+ if (format !== "jsonl") {
274
+ throw new Error("export --format must be jsonl or csv.");
275
+ }
276
+ process.stdout.write(await exportIntakeData());
277
+ return 0;
278
+ }
279
+ async function deleteCommand(args) {
280
+ const id = parseDeleteId(args);
281
+ if (id === undefined) {
282
+ console.error("Usage: nourish-mcp delete --entry <id>");
283
+ return 1;
284
+ }
285
+ const deleted = await deleteIntakeEntry(id);
286
+ console.log(JSON.stringify({ deleted, id }, null, 2));
287
+ return 0;
288
+ }
289
+ async function clearDayCommand(args) {
290
+ const parsed = parseArgs(args);
291
+ const date = optionString(parsed, "date") ?? parsed.positionals[0];
292
+ if (date === undefined || !hasFlag(parsed, "yes")) {
293
+ console.error("Usage: nourish-mcp clear-day <YYYY-MM-DD> --yes");
294
+ return 1;
295
+ }
296
+ console.log(JSON.stringify(await clearIntakeDay(date), null, 2));
297
+ return 0;
298
+ }
299
+ async function goalsCommand(args) {
300
+ const parsed = parseArgs(args);
301
+ const daily = {};
302
+ const calories = optionString(parsed, "set-calories");
303
+ const protein = optionString(parsed, "set-protein");
304
+ const carbs = optionString(parsed, "set-carbs");
305
+ const fat = optionString(parsed, "set-fat");
306
+ const water = optionString(parsed, "set-water");
307
+ if (calories !== undefined) {
308
+ daily.calories_kcal = parsePositiveNumber(calories, "set-calories");
309
+ }
310
+ if (protein !== undefined) {
311
+ daily.protein_g = parsePositiveNumber(protein, "set-protein");
312
+ }
313
+ if (carbs !== undefined) {
314
+ daily.carbohydrates_g = parsePositiveNumber(carbs, "set-carbs");
315
+ }
316
+ if (fat !== undefined) {
317
+ daily.fat_g = parsePositiveNumber(fat, "set-fat");
318
+ }
319
+ if (Object.keys(daily).length === 0 && water === undefined) {
320
+ console.log(JSON.stringify(await getGoals(), null, 2));
321
+ return 0;
322
+ }
323
+ const input = {};
324
+ if (Object.keys(daily).length > 0) {
325
+ input.daily = daily;
326
+ }
327
+ if (water !== undefined) {
328
+ input.hydration_ml = parsePositiveNumber(water, "set-water");
329
+ }
330
+ console.log(JSON.stringify(await updateGoals(input), null, 2));
331
+ return 0;
332
+ }
333
+ async function waterCommand(args) {
334
+ const parsed = parseArgs(args);
335
+ const action = parsed.positionals[0];
336
+ const date = optionString(parsed, "date");
337
+ if (action === "today") {
338
+ console.log(JSON.stringify(await buildHydrationSummary(date), null, 2));
339
+ return 0;
340
+ }
341
+ const amount = action === undefined ? undefined : Number.parseFloat(action);
342
+ if (amount === undefined || !Number.isFinite(amount) || amount <= 0) {
343
+ console.error("Usage: nourish-mcp water <amount_ml> [--date YYYY-MM-DD]");
344
+ return 1;
345
+ }
346
+ const waterInput = {
347
+ amount_ml: amount,
348
+ source: "manual",
349
+ };
350
+ const timestamp = optionString(parsed, "timestamp") ?? dateToNoonTimestamp(date);
351
+ const notes = optionString(parsed, "notes");
352
+ if (timestamp !== undefined) {
353
+ waterInput.timestamp = timestamp;
354
+ }
355
+ if (notes !== undefined) {
356
+ waterInput.notes = notes;
357
+ }
358
+ console.log(JSON.stringify(await logWater(waterInput), null, 2));
359
+ return 0;
360
+ }
361
+ function parseDeleteId(args) {
362
+ if (args[0] === "--entry") {
363
+ return args[1];
364
+ }
365
+ return args[0];
366
+ }
367
+ function printSummary(summary, format) {
368
+ if (format === "markdown") {
369
+ console.log(dailySummaryMarkdown(summary));
370
+ return;
371
+ }
372
+ console.log(JSON.stringify(summary, null, 2));
373
+ }
374
+ function printWeeklySummary(summary, format) {
375
+ if (format === "markdown") {
376
+ console.log(weeklySummaryMarkdown(summary));
377
+ return;
378
+ }
379
+ console.log(JSON.stringify(summary, null, 2));
380
+ }
381
+ function dailySummaryMarkdown(summary) {
382
+ return [
383
+ "# Nourish Daily Summary",
384
+ "",
385
+ `- date: ${summary.date}`,
386
+ `- entries: ${summary.entry_count}`,
387
+ `- calories_kcal: ${summary.total_nutrients.calories_kcal ?? 0}`,
388
+ `- protein_g: ${summary.total_nutrients.protein_g ?? 0}`,
389
+ `- hydration_ml: ${summary.hydration.total_ml}`,
390
+ `- confidence: ${summary.confidence}`,
391
+ "",
392
+ "| meal | calories_kcal | protein_g |",
393
+ "| --- | --- | --- |",
394
+ ...MEAL_TYPES.map((mealType) => `| ${mealType} | ${summary.by_meal[mealType].calories_kcal ?? 0} | ${summary.by_meal[mealType].protein_g ?? 0} |`),
395
+ ].join("\n");
396
+ }
397
+ function weeklySummaryMarkdown(summary) {
398
+ return [
399
+ "# Nourish Weekly Summary",
400
+ "",
401
+ `- start_date: ${summary.start_date}`,
402
+ `- end_date: ${summary.end_date}`,
403
+ `- entries: ${summary.entry_count}`,
404
+ `- calories_kcal: ${summary.total_nutrients.calories_kcal ?? 0}`,
405
+ "",
406
+ "| date | entries | calories_kcal | hydration_ml |",
407
+ "| --- | --- | --- | --- |",
408
+ ...summary.days.map((day) => `| ${day.date} | ${day.entry_count} | ${day.total_nutrients.calories_kcal ?? 0} | ${day.hydration.total_ml} |`),
409
+ ].join("\n");
410
+ }
411
+ function parseArgs(args) {
412
+ const options = {};
413
+ const positionals = [];
414
+ for (let index = 0; index < args.length; index += 1) {
415
+ const arg = args[index];
416
+ if (arg === undefined) {
417
+ continue;
418
+ }
419
+ if (!arg.startsWith("--")) {
420
+ positionals.push(arg);
421
+ continue;
422
+ }
423
+ const key = arg.slice(2);
424
+ const next = args[index + 1];
425
+ if (next !== undefined && !next.startsWith("--")) {
426
+ options[key] = next;
427
+ index += 1;
428
+ }
429
+ else {
430
+ options[key] = true;
431
+ }
432
+ }
433
+ return { options, positionals };
434
+ }
435
+ function optionString(parsed, key) {
436
+ const value = parsed.options[key];
437
+ return typeof value === "string" ? value : undefined;
438
+ }
439
+ function hasFlag(parsed, key) {
440
+ return parsed.options[key] === true;
441
+ }
442
+ function parseMealType(value) {
443
+ if (MEAL_TYPES.includes(value)) {
444
+ return value;
445
+ }
446
+ throw new Error(`Invalid meal type: ${value}`);
447
+ }
448
+ function parsePositiveNumber(value, label) {
449
+ const parsed = Number.parseFloat(value);
450
+ if (!Number.isFinite(parsed) || parsed <= 0) {
451
+ throw new Error(`${label} must be a positive number.`);
452
+ }
453
+ return parsed;
454
+ }
455
+ function dateToNoonTimestamp(date) {
456
+ return date === undefined ? undefined : `${date}T12:00:00.000Z`;
457
+ }
458
+ function sumGrams(items) {
459
+ if (items.length === 0) {
460
+ return undefined;
461
+ }
462
+ return items.reduce((total, item) => total + item.grams, 0);
463
+ }
464
+ function stableEstimateId(text) {
465
+ return `estimate:${Buffer.from(text).toString("base64url").slice(0, 48)}`;
466
+ }
467
+ //# sourceMappingURL=commands.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commands.js","sourceRoot":"","sources":["../../src/cli/commands.ts"],"names":[],"mappings":"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"}