Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 20 additions & 6 deletions nanobot/skills/weather/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,31 +11,45 @@ Two free services, no API keys needed.

## wttr.in (primary)

Quick one-liner:
Platform notes:
- On Windows PowerShell, use `curl.exe`; bare `curl` may resolve to
`Invoke-WebRequest`.
- On macOS and Linux, use `curl`.

Current conditions only:
```bash
curl -s "wttr.in/London?format=3"
curl -s "https://wttr.in/London?format=3"
# Output: London: ⛅️ +8°C
```

Compact format:
Custom current conditions format:
```bash
curl -s "wttr.in/London?format=%l:+%c+%t+%h+%w"
curl -s "https://wttr.in/London?format=%l:+%c+%t+%h+%w"
# Output: London: ⛅️ +8°C 71% ↙5km/h
```

Today's weather, including current conditions (use this single request for
questions about today's weather):
```bash
curl -s "https://wttr.in/London?1&m"
```

Full forecast:
```bash
curl -s "wttr.in/London?T"
curl -s "https://wttr.in/London?T&m"
```

On Windows PowerShell, replace `curl` with `curl.exe` in the commands above.

Format codes: `%c` condition · `%t` temp · `%h` humidity · `%w` wind · `%l` location · `%m` moon

Tips:
- URL-encode spaces: `wttr.in/New+York`
- Airport codes: `wttr.in/JFK`
- Units: `?m` (metric) `?u` (USCS)
- Today only: `?1` · Current only: `?0`
- PNG: `curl -s "wttr.in/Berlin.png" -o /tmp/weather.png`
- PNG (macOS/Linux): `curl -s "https://wttr.in/Berlin.png" -o weather.png`
- PNG (Windows PowerShell): `curl.exe -s "https://wttr.in/Berlin.png" -o weather.png`

## Open-Meteo (fallback, JSON)

Expand Down
16 changes: 16 additions & 0 deletions tests/agent/test_builtin_weather_skill.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
from nanobot.agent.skills import BUILTIN_SKILLS_DIR


def test_weather_skill_uses_windows_safe_single_today_request() -> None:
content = (BUILTIN_SKILLS_DIR / "weather" / "SKILL.md").read_text(encoding="utf-8")
normalized = " ".join(content.split())

assert "On Windows PowerShell, use `curl.exe`" in normalized
assert "bare `curl` may resolve to `Invoke-WebRequest`" in normalized
assert "https://wttr.in/London?1&m" in content
assert 'curl.exe -s "https://wttr.in/Berlin.png" -o weather.png' in content
assert "/tmp/weather.png" not in content
assert (
"use this single request for"
" questions about today's weather"
) in normalized
Loading