turnip-prophet
使用游戏的精确算法预测《动物森友会》萝卜价格。当用户询问萝卜价格、ACNH 萝卜、秸秆市场、萝卜预测、何时出售萝卜或萝卜利润时使用。
安装 / 下载方式
TotalClaw CLI推荐
totalclaw install totalclaw:totalclaw~nicholasjackson-turnip-prophetcURL直接下载,无需登录
curl -fsSL https://skills.taituai.com/api/skills/totalclaw%3Atotalclaw~nicholasjackson-turnip-prophet/file -o nicholasjackson-turnip-prophet.mdGit 仓库获取源码
git clone https://github.com/nicholasjackson/openclaw-turnip-profit## 概述(中文)
使用游戏的精确算法预测《动物森友会》萝卜价格。当用户询问萝卜价格、ACNH 萝卜、秸秆市场、萝卜预测、何时出售萝卜或萝卜利润时使用。
## 原文
# Turnip Prophet - Animal Crossing Turnip Price Predictor
Predicts Animal Crossing: New Horizons turnip prices using the game's actual algorithm.
## ⚠️ IMPORTANT: Always Read Memory First!
**Before doing ANYTHING**, read the weekly data file:
```
memory/turnip-week.json
```
This contains the buy price, previous pattern, and all known prices for the current week. **Do not ask the user for data you already have.** Only ask for new/missing prices.
When the user gives a new price, **update `memory/turnip-week.json` immediately** with the new value before running the prediction.
### Weekly Data Format (`memory/turnip-week.json`)
```json
{
"week_start": "2026-02-15",
"buy_price": 96,
"previous_pattern": 1,
"prices": [84, 81, 78, null, null, null, null, null, null, null, null, null],
"labels": ["Mon AM", "Mon PM", "Tue AM", "Tue PM", "Wed AM", "Wed PM", "Thu AM", "Thu PM", "Fri AM", "Fri PM", "Sat AM", "Sat PM"]
}
```
On Sundays, create a fresh file with the new buy price and reset prices to all nulls.
## Triggers
Activate when user mentions:
- "turnip prices" or "turnip price"
- "ACNH turnips" or "Animal Crossing turnips"
- "stalk market"
- "turnip prophet" or "turnip prediction"
- "bell profit" with context of turnips
- Any question about when to sell turnips in Animal Crossing
## Privacy & Data Storage
This skill stores local configuration data **only on your machine** in `memory/turnip-config.json`. No data is sent to external servers.
**What gets stored (if you enable reminders):**
- Channel name (telegram/whatsapp/discord/signal)
- Your user ID on that channel
- OpenClaw binary path
- Setup timestamp
**Why:** These values are needed so the cron reminders can send messages to the correct place without hard-coded values.
**Where:** Stored locally in the skill's memory directory on your OpenClaw instance. Not shared, not uploaded, not visible to anyone else.
**How to disable/reset:**
```bash
rm ~/.openclaw/workspace/skills/turnip-prophet/memory/turnip-config.json
```
**Removing cron entries:**
```bash
# Edit crontab and remove the turnip-prophet lines
crontab -e
```
**Important:** You must explicitly confirm the setup flow before any config is saved. Declining the setup offer means nothing is stored.
## Credentials & Permissions
**The skill itself does not request or store any API keys or credentials.**
However, **if you enable cron reminders**, the installed cron jobs will:
- Use your local `openclaw` CLI binary
- Send messages using your existing OpenClaw configuration and credentials
- Operate with whatever permissions your OpenClaw instance has
**What this means:**
- Automated reminders will be sent **as you**, using your OpenClaw identity
- The cron jobs require OpenClaw to be running and properly configured
- Messages are sent through your configured channels (Telegram/WhatsApp/etc.) using your bot tokens or API credentials
**You are granting permission for:**
- Automated message sending on your behalf
- Using your existing messaging channel credentials
- Running scheduled tasks that invoke `openclaw gateway call message.send`
If you're uncomfortable with automated messaging using your credentials, **do not enable the cron reminders**. The core prediction feature works fine without them.
## Daily Reminders (Optional)
On first use, offer to set up daily reminders with an interactive flow:
### Interactive Setup Flow (Agent Instructions)
**On first trigger (when user asks about turnips for the first time):**
1. **Check if already configured:**
```bash
test -f memory/turnip-config.json && echo "configured" || echo "not configured"
```
2. **If NOT configured, offer setup:**
> "Want daily turnip reminders? I can ping you:
> • Sunday 8am: Check Daisy Mae's price
> • Mon-Sat noon + 8pm: Check Nook's prices
> • Saturday 9:45pm: Final warning
>
> Reply 'yes' to set up, or 'no' to skip."
3. **If user says yes, auto-detect config:**
- **Channel:** Extract from inbound context JSON `"channel"` field (telegram/whatsapp/discord/signal)
- **Target ID:** Extract from inbound context JSON `"sender_id"` field
- **OpenClaw path:** Run `which openclaw` or use `/usr/local/bin/openclaw`
- **Skill dir:** Use the absolute path to this skill's directory
4. **If auto-detection fails:**
- Ask user for missing values explicitly
- Validate before proceeding
**Store config in `memory/turnip-config.json`:**
```json
{
"channel": "telegram",
"target": "8577655544",
"openclaw_bin": "/usr/local/bin/openclaw",
"skill_dir": "/home/user/.openclaw/workspace/skills/turnip-prophet",
"configured_at": "2026-02-23T10:30:00Z"
}
```
**Generate and show cron entries:**
Show the user exactly what will be added, with their specific values. Example:
```bash
# Turnip Prophet reminders for telegram:8577655544
0 8 * * 0 /usr/local/bin/openclaw gateway call message.send --params '{"channel":"telegram","target":"8577655544","message":"🔔 Sunday! Check Daisy Mae'\''s turnip price (90-110 bells) and buy your turnips 🥬"}' 2>&1 | logger -t turnip-prophet
0 12 * * 1-6 /usr/local/bin/openclaw gateway call message.send --params '{"channel":"telegram","target":"8577655544","message":"🔔 Time to check Nook'\''s Cranny turnip prices!"}' 2>&1 | logger -t turnip-prophet
0 20 * * 1-6 /usr/local/bin/openclaw gateway call message.send --params '{"channel":"telegram","target":"8577655544","message":"🔔 Evening price check: Check Nook'\''s Cranny!"}' 2>&1 | logger -t turnip-prophet
45 21 * * 6 /usr/local/bin/openclaw gateway call message.send --params '{"channel":"telegram","target":"8577655544","message":"⏰ FINAL CALL: Turnips expire at 10 PM! Sell now or they'\''ll rot 🗑️"}' 2>&1 | logger -t turnip-prophet
```
Replace channel/target with detected values. Escape single quotes properly.
**Show user what will be stored (before confirmation):**
```
This will save:
• Channel: telegram
• User ID: 8577655544
• Location: memory/turnip-config.json (local only)
This data is stored locally on your machine and is needed so cron reminders can send messages to you.
You can delete the config file anytime with: rm memory/turnip-config.json
Continue? Reply 'confirm' to proceed, or 'cancel' to skip.
```
**On confirmation:**
1. Write config to `memory/turnip-config.json`
2. Generate a safe install command and show it to the user:
```bash
# Save the cron entries to a temp file
cat > /tmp/turnip-cron-$$.txt <<'TURNIP_EOF'
[generated entries]
TURNIP_EOF
# Review the file
cat /tmp/turnip-cron-$$.txt
# If it looks good, install:
(crontab -l 2>/dev/null; cat /tmp/turnip-cron-$$.txt) | crontab -
```
3. Ask user to run the commands and confirm when done
4. Reply: "✅ Reminders configured. You'll only get pings for missing data. Check `crontab -l` to verify installation. To remove: `rm memory/turnip-config.json` and remove the cron entries."
**On rejection/cancel:**
- Reply: "No problem. No data was stored. You can set this up anytime by asking about turnip prices again."
### Cron Handler (scripts/cron_handler.sh)
The cron script reads from `memory/turnip-config.json` for channel/target:
```bash
CONFIG_FILE="$SKILL_DIR/memory/turnip-config.json"
if [[ ! -f "$CONFIG_FILE" ]]; then
echo "Config not found: $CONFIG_FILE" >&2
exit 1
fi
CHANNEL=$(jq -r '.channel' "$CONFIG_FILE")
TARGET=$(jq -r '.target' "$CONFIG_FILE")
OPENCLAW_BIN=$(jq -r '.openclaw_bin' "$CONFIG_FILE")
```
**Event types:**
**sunday-daisy:**
- Check if `memory/turnip-week.json` has a buy_price for current week
- If missing: Send reminder "🔔 Sunday! Check Daisy Mae's turnip price (90-110 bells) and buy your turnips 🥬"
- If already set: Stay silent
**daily-check:**
- Determine which price slot is currently active (Mon AM/PM through Sat PM)
- Check if that slot is filled in `memory/turnip-week.json`
- If missing: Send reminder "🔔 [Day] [AM/