Install
$ agentstack add skill-nanorhino-weight-loss-skill-weekly-report ✓ scanned · ✓ verified, works with Claude Code, Cursor, and more.
Security review
✓ PassedNo issues found. Passed automated security review. · v0.1.0 How review works →
- ✓ Prompt-injection patterns
- ✓ Secret / credential exfiltration
- ✓ Dangerous shell & filesystem operations
- ✓ Untrusted network calls
- ✓ Known-malicious package signatures
What it can access
- ✓ Network access No
- ✓ Filesystem access No
- ✓ Shell / process execution No
- ✓ Environment & secrets No
- ✓ Dynamic code execution No
From automated source analysis of v0.1.0. “Used” means the capability is present in the source — more access means more to trust, not that it’s unsafe.
Verified badge
Passed review? Show it. Paste this badge into your README, it links to the public security report.
Reliability & compatibility
Declared compatibility
Compatibility is declared by the source manifest. End-to-end runtime verification is coming, see below.
We're building live execution health for every listing: tool-call success rate, median latency, uptime, and last-checked timestamps, measured, not self-reported. It isn't live yet, so we don't show numbers we can't stand behind.
How agent discovery & health will work →About
Weekly Report
> 🚨 OUTPUT CONTRACT: Every execution MUST produce a clickable report URL. A text-only summary without a URL = FAILED. If scripts fail, report the error — do NOT fall back to plain-text.
> ⚠️ SILENT OPERATION: Never narrate internal actions to the user. Just do it and respond with the result.
> 🚨 ALL reports use template+data separation. generate-report-html.py outputs JSON data. The HTML template renders client-side. WRITING HTML YOURSELF IS FORBIDDEN.
Principles
- Show, don't lecture. Let data speak. Short commentary.
- Celebrate consistency over perfection. 5/7 is great — don't dwell on the 2.
- One week is noise, trends are signal. No dramatic single-week conclusions.
- Personalize everything. User's name, foods, goals — never generic.
- Actionable > informational. Suggestions must be doable next week.
Execution Flow
Step 1: Get Date Range
python3 {diet-tracking-analysis:baseDir}/scripts/nutrition-calc.py local-date --tz-offset {tz_offset}
Use current_week (monday–sunday) as report range. Never calculate dates yourself.
Step 2: Gate Check (cron only)
bash {baseDir}/scripts/should-send-report.sh --workspace-dir {workspaceDir}
If output starts with "no" → reply NO_REPLY. Stop.
Step 3: Collect Data (once, reuse in Step 6)
Read PLAN.md (or health-profile.md) to extract targets for --targets:
protein_range: daily protein grams [min, max] — pass if explicitly statedfat_range: daily fat grams [min, max] — pass if explicitly statedcarb_range: daily carb grams [min, max] — pass if explicitly stated
Calorie target: Do NOT estimate or convert single values into ranges yourself. Only pass cal_min if PLAN.md already has an explicit range (e.g. "1138 - 1390"). If PLAN.md only has a single value (e.g. "1264 kcal"), omit cal_min — the script will read it and convert to ±10% range automatically.
Pass whatever you find verbatim; the script fills all missing fields from health-profile as fallback.
python3 {baseDir}/scripts/collect-weekly-data.py \
--workspace-dir {workspaceDir} \
--start-date {monday} --end-date {sunday} --tz-offset {tz_offset} \
--targets '{"protein_range":[min,max],"fat_range":[min,max],"carb_range":[min,max]}' \
2>/dev/null > /tmp/weekly-data-{username}.json
This outputs ALL data as JSON. Do NOT call individual scripts per-day. Save to a temp file (use workspace username to avoid multi-user collision) — you'll read it now for analysis and pipe it to the report generator in Step 5.
Step 4: Read Context
USER.md→ name, health flags, language preferencehealth-profile.md→ unit preference- Previous report log:
data/logs/weekly-report-{prev_monday}.json→ checknext_week_focus
All calorie/macro targets, weight loss rate, phase, progress bar, and week number are already in the collect output (meta.* and plan.*). No need to read PLAN.md separately.
Step 5: Generate Report
cat /tmp/weekly-data-{username}.json | \
python3 {baseDir}/scripts/generate-report-html.py \
--output {workspaceDir}/data/reports/weekly-data-{start_date}.html \
--workspace-dir {workspaceDir} \
--nickname {user_nickname} \
--tagline '{short fun summary of the week}' \
--plan-rate {weight_loss_rate_per_week} \
--commentary '{JSON object}' \
--highlights '{JSON array}' \
--suggestions '{JSON array}'
Script stdout = report URL. Capture it.
What the script does automatically:
- Generates JSON data file
- Copies latest + template to reports dir
- Uploads 3 files to cloud storage
- Writes report log
- Outputs public URL
What YOU provide:
| Param | Description | |-------|-------------| | --nickname | User's display name (from USER.md) | | --tagline | Short witty one-liner summarizing the week (spoken Chinese, like a friend roasting with love) | | --commentary | JSON: {"logging": "...", "calories": "...", "weight": "...", "macros": "..."} — 2-4 sentences each, casual spoken Chinese, funny/witty, backed by real numbers | | --highlights | JSON array: 2-3 specific data-backed wins | | --suggestions | JSON array of strings: 1-2 concrete actionable improvements. Each element MUST be a plain string like "🍽 标题:描述", NOT an object. | | --plan-rate | kg/week — use meta.plan_rate from collect output (default 0.5) | | --lang | Report language: zh (default) or en. Read from user's profile or infer from conversation language |
> 🚨 ALL parameters are REQUIRED with real content. Empty '{}' or '[]' = degraded experience. Read the data, think, write real commentary.
For section-by-section rules: read references/report-sections.md For edge cases (zero data, no plan, ED flags): read references/edge-cases.md
Step 6: Compose Chat Message
Use values directly from collect output (meta.*):
📊 第{meta.week_number}周周报
完整分析 👇
{report_url}
{meta.progress_bar} 已走 {meta.progress_pct}%
{meta.start_weight} → {meta.current_weight} {unit} → 目标 {meta.target_weight} {unit}
{data_hook}
- Skip progress bar line if
meta.phaseis"初始"ORmeta.progress_pctis0 - 快完成 phase: Append
只差 {remaining} {unit}after target weight
data_hook: ONE sentence citing specific data, sparking curiosity to click report. For style examples: read references/hook-examples.md
ED/avoidweightfocus flags: Omit progress bar, weight fields, and ⚖️ line. Hook focuses on consistency/variety.
Pre-send Checks (cron auto-send)
- Stage ≥ 3 → skip (still generate if manually requested)
- < 2 days data in period → short encouragement message instead
- All clear → generate and send
Schedule & Trigger
- Auto: Sunday 21:00 user local time via per-user cron
- Manual: User says "周报" / "weekly report" → most recent completed Mon–Sun
Report URLs
https://nanorhino.ai/user/{username}/weekly-report.html?week={start_date}- Latest:
https://nanorhino.ai/user/{username}/weekly-report.html(no ?week= → loads latest)
Username auto-resolved from workspace path. Do NOT pass --username manually.
Writes
| Path | When | |------|------| | data/reports/weekly-data-{start_date}.html | JSON data file | | data/logs/weekly-report-{start_date}.json | Report log (auto by script) |
Skill Routing
Priority Tier P4 (Reporting). Owns all weekly summaries including exercise data. Exercise-tracking does NOT produce separate weekly summary when this skill generates.
Performance
- Single message, no back-and-forth
- Chat message: scannable in under 10 seconds
- Commentary per section: 2-4 sentences max
Source & license
This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.
- Author: NanoRhino
- Source: NanoRhino/weight-loss-skill
- License: MIT
- Homepage: https://nanorhino.com/
Install and usage instructions live in the source repository linked above.
Reviews
No reviews yet, be the first.
Write a review
Versions
- v0.1.0 Imported from the upstream source.