pawmode 1.0.1 → 1.3.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.
@@ -0,0 +1,4 @@
1
+ import { addJob, canRunWithinBudget, getJob, getTodaysCost, installSystemJob, listJobs, parseHumanSchedule, readCostTracker, readScheduleConfig, recordCost, removeJob, removeSystemJob, runJob, toggleJob, writeScheduleConfig } from "./scheduler-DAmd0GzB.js";
2
+ import "./skills-CMqq9k1-.js";
3
+
4
+ export { writeScheduleConfig };
@@ -1,3 +1,3 @@
1
- import { getDefaultSkillsDir, getInstalledSkillPath, getSkillTemplatePath, installSkill, isSkillInstalled, listInstalledSkills, removeSkill } from "./skills-CJ_pyPlv.js";
1
+ import { getDefaultSkillsDir, getInstalledSkillPath, getSkillTemplatePath, installSkill, isSkillInstalled, listInstalledSkills, removeSkill } from "./skills-CMqq9k1-.js";
2
2
 
3
3
  export { installSkill };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pawmode",
3
- "version": "1.0.1",
3
+ "version": "1.3.0",
4
4
  "description": "Open-source Personal Assistant Wizard for Claude Code. Turn Claude Code into your PA with CLI tools and skills.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -0,0 +1,53 @@
1
+ ---
2
+ name: c-clipboard
3
+ description: System clipboard — copy, paste, transform content between clipboard and files.
4
+ tags: [clipboard, copy, paste, pbcopy, pbpaste]
5
+ ---
6
+
7
+ # Clipboard — Copy & Paste
8
+
9
+ Read from and write to the system clipboard. Built into macOS, no install needed.
10
+
11
+ ## Commands
12
+
13
+ ```bash
14
+ # Read clipboard contents
15
+ pbpaste
16
+
17
+ # Copy text to clipboard
18
+ echo "hello world" | pbcopy
19
+
20
+ # Copy file contents to clipboard
21
+ pbcopy < /path/to/file.txt
22
+
23
+ # Save clipboard to file
24
+ pbpaste > /path/to/output.txt
25
+
26
+ # Copy command output to clipboard
27
+ ls -la | pbcopy
28
+ date | pbcopy
29
+
30
+ # Transform clipboard content
31
+ pbpaste | tr '[:lower:]' '[:upper:]' | pbcopy # uppercase
32
+ pbpaste | sort | pbcopy # sort lines
33
+ pbpaste | wc -w # word count
34
+
35
+ # Copy with no trailing newline
36
+ printf "%s" "exact text" | pbcopy
37
+ ```
38
+
39
+ ## Linux Equivalents
40
+
41
+ ```bash
42
+ # If on Linux, use xclip or xsel
43
+ xclip -selection clipboard # copy (pipe into)
44
+ xclip -selection clipboard -o # paste
45
+ ```
46
+
47
+ ## Guidelines
48
+
49
+ - When the user says "copy this" or "put this in my clipboard", use `pbcopy`
50
+ - When the user says "what's in my clipboard?" or "paste", use `pbpaste`
51
+ - For transformations, pipe `pbpaste` through the transform and back to `pbcopy`
52
+ - Always confirm what was copied with a brief summary
53
+ - Never display clipboard contents unless asked — they may contain sensitive data
@@ -0,0 +1,63 @@
1
+ ---
2
+ name: c-contacts
3
+ description: macOS Contacts — search, list, and look up contact details via AppleScript.
4
+ tags: [contacts, address-book, people, phone]
5
+ ---
6
+
7
+ # Contacts — Address Book
8
+
9
+ Access macOS Contacts app via AppleScript. No CLI tool needed.
10
+
11
+ ## Commands
12
+
13
+ ```bash
14
+ # Search for a contact by name
15
+ osascript -e 'tell application "Contacts"
16
+ set results to (every person whose name contains "John")
17
+ set output to ""
18
+ repeat with p in results
19
+ set output to output & name of p & linefeed
20
+ repeat with e in emails of p
21
+ set output to output & " Email: " & value of e & linefeed
22
+ end repeat
23
+ repeat with ph in phones of p
24
+ set output to output & " Phone: " & value of ph & linefeed
25
+ end repeat
26
+ set output to output & linefeed
27
+ end repeat
28
+ return output
29
+ end tell'
30
+
31
+ # Get all contact names
32
+ osascript -e 'tell application "Contacts" to get name of every person'
33
+
34
+ # Get a specific contact's email
35
+ osascript -e 'tell application "Contacts"
36
+ set p to first person whose name is "John Smith"
37
+ get value of every email of p
38
+ end tell'
39
+
40
+ # Get a specific contact's phone
41
+ osascript -e 'tell application "Contacts"
42
+ set p to first person whose name is "John Smith"
43
+ get value of every phone of p
44
+ end tell'
45
+
46
+ # Count contacts
47
+ osascript -e 'tell application "Contacts" to count every person'
48
+
49
+ # Search by email
50
+ osascript -e 'tell application "Contacts"
51
+ set results to (every person whose value of emails contains "john@")
52
+ get name of results
53
+ end tell'
54
+ ```
55
+
56
+ ## Guidelines
57
+
58
+ - Always search by partial name (uses `contains`) to be flexible
59
+ - Return name, email, and phone by default
60
+ - If multiple matches, list all and let the user pick
61
+ - Contacts app does not need to be running — AppleScript handles it
62
+ - Never store contact details in memory files for privacy
63
+ - If asked "what's [name]'s number?", search contacts first, then memory
@@ -43,7 +43,6 @@ You are running in **PAW MODE** — full personal assistant mode powered by Open
43
43
  | c-calendar | Google Cal / Apple Calendar |
44
44
  | c-messaging | iMessage / WhatsApp |
45
45
  | c-slack | Slack channels + DMs |
46
- | c-social | Twitter/X |
47
46
  | c-music | Spotify playback |
48
47
  | c-video | YouTube + video tools |
49
48
  | c-screen | Screenshots + OCR |
@@ -52,12 +51,20 @@ You are running in **PAW MODE** — full personal assistant mode powered by Open
52
51
  | c-speakers | Sonos speakers |
53
52
  | c-bluetooth | Bluetooth devices |
54
53
  | c-browser | Headless browser |
54
+ | c-schedule | Smart scheduling with cost control |
55
55
  | c-cron | Scheduled jobs |
56
+ | c-briefing | Daily morning briefing |
57
+ | c-video-edit | Programmatic video creation |
58
+ | c-telegram | Telegram bridge |
59
+ | c-clipboard | System clipboard |
60
+ | c-contacts | macOS Contacts |
61
+ | c-timer | Timers + pomodoro |
56
62
  | c-system | macOS system control |
57
63
  | c-apps | Mac App Store |
58
64
  | c-files | Cloud file sync |
59
65
  | c-display | Brightness + trash |
60
66
  | c-notify | macOS notifications |
67
+ | c-weather | Weather forecasts + conditions |
61
68
  | c-research | Web research + summarization |
62
69
  | c-location | Maps + nearby places |
63
70
  | c-tracking | Package tracking |
@@ -68,6 +75,15 @@ You are running in **PAW MODE** — full personal assistant mode powered by Open
68
75
  | c-linear | Linear issues |
69
76
  | c-jira | Jira issues |
70
77
 
78
+ ## Dashboard
79
+
80
+ OpenPaw includes a local task dashboard:
81
+ - Start with `openpaw dashboard` — opens a kanban board in your browser
82
+ - 3 themes: paw (warm brown), midnight (cool blue), neon (cyber green)
83
+ - Drag-and-drop tasks between Todo, In Progress, and Done
84
+ - Data stored locally at `~/.config/openpaw/dashboard.json`
85
+ - Default port: 3141
86
+
71
87
  ## Routing
72
88
 
73
89
  - Match the user's intent to the most specific skill
@@ -84,3 +84,35 @@ echo "## $(date +%Y-%m-%d)" >> ~/.claude/memory/journal.md
84
84
  - Always ask before overwriting existing memory entries
85
85
  - If memory files don't exist, create them on first write
86
86
  - Keep MEMORY.md focused — move details to topic-specific files
87
+
88
+ ## Obsidian Sync (Auto)
89
+
90
+ If `c-obsidian` is also installed (check `ls ~/.claude/skills/c-obsidian/`), automatically sync memory to Obsidian:
91
+
92
+ ### On Memory Write
93
+ When saving to any memory file, also mirror to Obsidian in an `AI/` folder:
94
+ ```bash
95
+ obsidian-cli create "AI/Memory" --content "$(cat ~/.claude/memory/MEMORY.md)"
96
+ obsidian-cli create "AI/People" --content "$(cat ~/.claude/memory/people.md)"
97
+ obsidian-cli create "AI/Preferences" --content "$(cat ~/.claude/memory/preferences.md)"
98
+ obsidian-cli create "AI/Projects" --content "$(cat ~/.claude/memory/projects.md)"
99
+ ```
100
+
101
+ ### Journal → Daily Note
102
+ Append session logs to both `journal.md` and Obsidian's daily note:
103
+ ```bash
104
+ obsidian-cli append "$(date +%Y-%m-%d)" "### Claude Session $(date +%H:%M)\n- [summary]"
105
+ echo "## $(date +%Y-%m-%d %H:%M)\n- [summary]" >> ~/.claude/memory/journal.md
106
+ ```
107
+
108
+ ### On Session Start
109
+ After reading `~/.claude/memory/MEMORY.md`, check Obsidian for newer content:
110
+ ```bash
111
+ obsidian-cli search --folder "AI" "Memory"
112
+ ```
113
+ If the Obsidian version has additional facts, merge them into `~/.claude/memory/MEMORY.md`.
114
+
115
+ ### Conflict Resolution
116
+ - `~/.claude/memory/` is the authoritative quick-access cache
117
+ - Obsidian is the long-term archive and rich knowledge base
118
+ - When in doubt, prefer the most recently modified version
@@ -47,12 +47,31 @@ Append a session log entry at the end of each session:
47
47
  obsidian-cli append "$(date +%Y-%m-%d)" "### Session $(date +%H:%M)\n- [summary of what was done]\n"
48
48
  ```
49
49
 
50
- ## Memory Sync
50
+ ## Memory Sync (Auto)
51
51
 
52
- If both c-memory and c-obsidian are installed, keep them in sync:
53
- - Key facts in `~/.claude/memory/MEMORY.md` should also appear in an Obsidian note (e.g., `AI/Memory.md`)
52
+ If both c-memory and c-obsidian are installed (check `ls ~/.claude/skills/c-memory/`), keep them in sync automatically:
53
+
54
+ ### Bidirectional Sync
55
+ - `~/.claude/memory/` → Obsidian `AI/` folder (on every memory write)
56
+ - Obsidian `AI/` → `~/.claude/memory/` (on session start, if Obsidian has newer content)
57
+
58
+ ### Sync Commands
59
+ ```bash
60
+ # Push memory to Obsidian
61
+ obsidian-cli create "AI/Memory" --content "$(cat ~/.claude/memory/MEMORY.md)"
62
+ obsidian-cli create "AI/People" --content "$(cat ~/.claude/memory/people.md)"
63
+
64
+ # Pull from Obsidian to check for updates
65
+ obsidian-cli search --folder "AI" "Memory"
66
+
67
+ # Append session log to daily note
68
+ obsidian-cli append "$(date +%Y-%m-%d)" "### Claude Session $(date +%H:%M)\n- [summary]"
69
+ ```
70
+
71
+ ### Rules
54
72
  - When the user says "remember this", save to both systems
55
73
  - Obsidian is the long-term archive; `~/.claude/memory/` is the quick-access cache
74
+ - MEMORY.md is authoritative for quick facts; Obsidian is richer context
56
75
 
57
76
  ## Guidelines
58
77
 
@@ -0,0 +1,98 @@
1
+ ---
2
+ name: c-schedule
3
+ description: Smart scheduling — automate recurring Claude tasks with cost control. Deliver results to Telegram, file, or notification. Built into OpenPaw.
4
+ tags: [schedule, automation, cron, recurring, proactive, cost-control]
5
+ ---
6
+
7
+ # Smart Scheduling
8
+
9
+ Automate recurring tasks with Claude. Jobs run on a schedule via launchd (macOS) or cron (Linux), with built-in cost caps to prevent runaway spending.
10
+
11
+ ## Managing Schedules
12
+
13
+ ```bash
14
+ # Add a scheduled job (inline)
15
+ openpaw schedule add "weekdays 8am" --run "check email and summarize the important ones"
16
+ openpaw schedule add "daily 9pm" --run "review today's GitHub notifications"
17
+ openpaw schedule add "every 30 minutes" --run "check if any urgent emails arrived" --model haiku
18
+
19
+ # Interactive mode (prompts for all options)
20
+ openpaw schedule add
21
+
22
+ # List all jobs
23
+ openpaw schedule list
24
+
25
+ # Remove a job
26
+ openpaw schedule remove <id>
27
+
28
+ # Manually trigger a job
29
+ openpaw schedule run <id>
30
+
31
+ # Enable/disable without removing
32
+ openpaw schedule enable <id>
33
+ openpaw schedule disable <id>
34
+
35
+ # View cost usage
36
+ openpaw schedule costs
37
+
38
+ # Set daily cost cap
39
+ openpaw schedule set-cap 10.00
40
+ ```
41
+
42
+ ## Schedule Syntax
43
+
44
+ Human-readable formats:
45
+ - `weekdays 8am` or `weekdays 08:00`
46
+ - `daily 9pm` or `daily 21:00`
47
+ - `weekends 10am`
48
+ - `every 30 minutes`
49
+ - `every 2 hours`
50
+ - `monday 9am`, `friday 5pm`, etc.
51
+ - Raw cron: `0 8 * * 1-5`
52
+
53
+ ## Cost Control
54
+
55
+ - **Daily cap**: $5/day by default — jobs are skipped if the cap would be exceeded
56
+ - **Per-run budget**: Each job has its own budget cap (default $1.00)
57
+ - **Cost tracking**: All costs logged to `~/.config/openpaw/schedule-costs.json`
58
+ - **30-day history**: Old entries auto-pruned
59
+ - **View anytime**: `openpaw schedule costs`
60
+
61
+ ## Delivery Methods
62
+
63
+ - **telegram** — results sent directly to your Telegram (requires Telegram bridge setup)
64
+ - **file** — saved to `~/.config/openpaw/schedule-results/` (always saved as backup)
65
+ - **notify** — macOS notification via terminal-notifier
66
+
67
+ ## How It Works
68
+
69
+ 1. Jobs are stored in `~/.config/openpaw/schedules.json`
70
+ 2. Each job registers as a system scheduler:
71
+ - **macOS**: launchd plist in `~/Library/LaunchAgents/`
72
+ - **Linux**: crontab entry
73
+ 3. When triggered, `openpaw schedule run <id>` is called
74
+ 4. Claude runs with the job's prompt via the Agent SDK
75
+ 5. Results are delivered to the configured channel
76
+ 6. Cost is recorded
77
+
78
+ ## Guidelines
79
+
80
+ - Use **haiku** for simple, frequent checks (cheapest)
81
+ - Use **sonnet** for routine tasks like email summaries
82
+ - Use **opus** only for complex analysis (expensive)
83
+ - Test jobs manually first: `openpaw schedule run <id>`
84
+ - Start with a higher per-run budget and reduce once you know typical costs
85
+ - Check `openpaw schedule costs` to monitor spending
86
+
87
+ ## Common Recipes
88
+
89
+ ```bash
90
+ # Morning briefing to Telegram
91
+ openpaw schedule add "weekdays 8am" --run "give me a morning briefing: check email, calendar, and any GitHub notifications" --delivery telegram
92
+
93
+ # Evening project summary
94
+ openpaw schedule add "daily 6pm" --run "summarize what I worked on today based on git commits and recent files" --delivery file
95
+
96
+ # Urgent email monitor
97
+ openpaw schedule add "every 30 minutes" --run "check for urgent emails and notify me if any" --model haiku --budget 0.25 --delivery notify
98
+ ```
@@ -0,0 +1,59 @@
1
+ ---
2
+ name: c-timer
3
+ description: Timers, alarms, and pomodoro — set countdowns with native notifications.
4
+ tags: [timer, alarm, pomodoro, countdown, reminder]
5
+ ---
6
+
7
+ # Timer — Countdowns & Pomodoro
8
+
9
+ Set timers and get notified via native macOS notifications. Uses `terminal-notifier` and background sleep.
10
+
11
+ ## Commands
12
+
13
+ ```bash
14
+ # Simple timer (runs in background)
15
+ (sleep 300 && terminal-notifier -title "Timer" -message "5 minutes is up!" -sound default) &
16
+
17
+ # Timer with custom message
18
+ (sleep 1800 && terminal-notifier -title "Timer" -message "Break time!" -sound Glass) &
19
+
20
+ # Pomodoro (25 min work, 5 min break)
21
+ (sleep 1500 && terminal-notifier -title "Pomodoro" -message "Time for a break!" -sound Purr) &
22
+
23
+ # Quick reminder (with say for audio)
24
+ (sleep 60 && say "One minute timer done" && terminal-notifier -title "Timer" -message "1 minute" -sound default) &
25
+ ```
26
+
27
+ ## Time Conversions
28
+
29
+ | Duration | Seconds |
30
+ |----------|---------|
31
+ | 1 minute | 60 |
32
+ | 5 minutes | 300 |
33
+ | 10 minutes | 600 |
34
+ | 15 minutes | 900 |
35
+ | 25 minutes | 1500 |
36
+ | 30 minutes | 1800 |
37
+ | 1 hour | 3600 |
38
+
39
+ ## Notification Sounds
40
+
41
+ Available: `default`, `Basso`, `Blow`, `Bottle`, `Frog`, `Funk`, `Glass`, `Hero`, `Morse`, `Ping`, `Pop`, `Purr`, `Sosumi`, `Submarine`, `Tink`
42
+
43
+ ## Pomodoro Workflow
44
+
45
+ When the user asks for pomodoro:
46
+ 1. Start 25-minute work timer
47
+ 2. Notify when work session ends
48
+ 3. Start 5-minute break timer
49
+ 4. Notify when break ends
50
+ 5. Repeat (ask user after 4 cycles if they want a 15-min long break)
51
+
52
+ ## Guidelines
53
+
54
+ - Always confirm the timer was set with the exact duration
55
+ - Use `&` to run in background so the terminal stays responsive
56
+ - Default sound: `default` for timers, `Purr` for pomodoro
57
+ - If `terminal-notifier` is not installed, fall back to `say` command
58
+ - For "remind me in X minutes", treat as a timer
59
+ - Convert natural language: "half hour" = 1800s, "quarter hour" = 900s
@@ -0,0 +1,147 @@
1
+ ---
2
+ name: c-video-edit
3
+ description: Programmatic video creation using Remotion (React-based) and Editly (JSON-based declarative). Create, render, and compose videos from code.
4
+ tags: [video, editing, remotion, editly, react, rendering, creative]
5
+ ---
6
+
7
+ # Video Editing — Remotion & Editly
8
+
9
+ Create, render, and compose videos programmatically. Use Remotion for React-based dynamic videos or Editly for quick JSON-based assembly.
10
+
11
+ ## Remotion (React-based video creation)
12
+
13
+ ### Project Setup
14
+ ```bash
15
+ # Create a new Remotion project
16
+ npx create-video@latest my-video
17
+ cd my-video
18
+
19
+ # Start interactive studio
20
+ npx remotion studio
21
+ ```
22
+
23
+ ### Rendering
24
+ ```bash
25
+ # Render a composition to video
26
+ npx remotion render src/index.ts MyComposition out/video.mp4
27
+
28
+ # Render a still frame (thumbnail)
29
+ npx remotion still src/index.ts MyComposition out/thumbnail.png --frame=30
30
+
31
+ # List available compositions
32
+ npx remotion compositions src/index.ts
33
+ ```
34
+
35
+ ### Render Options
36
+ ```bash
37
+ # Resolution and FPS
38
+ npx remotion render src/index.ts MyComp out.mp4 --width 1920 --height 1080 --fps 30
39
+
40
+ # Codec (h264, h265, vp8, vp9, prores)
41
+ npx remotion render src/index.ts MyComp out.mp4 --codec h264
42
+
43
+ # Quality (CRF 0-51, lower = better)
44
+ npx remotion render src/index.ts MyComp out.mp4 --crf 18
45
+
46
+ # Speed preset
47
+ npx remotion render src/index.ts MyComp out.mp4 --x264-preset fast
48
+
49
+ # Pass data as props
50
+ npx remotion render src/index.ts MyComp out.mp4 --props='{"title":"Hello","color":"blue"}'
51
+
52
+ # Parallel rendering (faster)
53
+ npx remotion render src/index.ts MyComp out.mp4 --concurrency 4
54
+
55
+ # Benchmark render time
56
+ npx remotion benchmark src/index.ts MyComp
57
+ ```
58
+
59
+ ### Composition Structure
60
+ ```tsx
61
+ // src/Root.tsx — register compositions
62
+ import { Composition } from "remotion";
63
+ import { MyVideo } from "./MyVideo";
64
+
65
+ export const RemotionRoot = () => (
66
+ <Composition id="MyVideo" component={MyVideo}
67
+ durationInFrames={150} fps={30} width={1920} height={1080} />
68
+ );
69
+
70
+ // src/MyVideo.tsx — video content
71
+ import { useCurrentFrame, interpolate, AbsoluteFill, Sequence } from "remotion";
72
+
73
+ export const MyVideo = () => {
74
+ const frame = useCurrentFrame();
75
+ const opacity = interpolate(frame, [0, 30], [0, 1]);
76
+ return (
77
+ <AbsoluteFill style={{ backgroundColor: "black" }}>
78
+ <Sequence from={0} durationInFrames={60}>
79
+ <h1 style={{ color: "white", opacity }}>Hello World</h1>
80
+ </Sequence>
81
+ </AbsoluteFill>
82
+ );
83
+ };
84
+ ```
85
+
86
+ ## Editly (JSON-based declarative editing)
87
+
88
+ ### Quick Assembly
89
+ ```bash
90
+ # Simple concatenation with titles
91
+ editly title:'Intro' clip1.mov clip2.mov title:'THE END' --out output.mp4
92
+
93
+ # From JSON spec
94
+ editly spec.json5 --fast --out output.mp4
95
+
96
+ # Add background music
97
+ editly spec.json5 --audio-file-path music.mp3 --out output.mp4
98
+ ```
99
+
100
+ ### JSON Spec Format
101
+ ```json
102
+ {
103
+ "width": 1920,
104
+ "height": 1080,
105
+ "fps": 30,
106
+ "outPath": "output.mp4",
107
+ "defaults": {
108
+ "duration": 4,
109
+ "transition": { "name": "fade", "duration": 0.5 }
110
+ },
111
+ "clips": [
112
+ {
113
+ "duration": 3,
114
+ "layers": [{ "type": "title-background", "text": "My Video", "background": { "type": "linear-gradient" } }]
115
+ },
116
+ {
117
+ "layers": [{ "type": "video", "path": "clip1.mp4", "cutFrom": 0, "cutTo": 10 }]
118
+ },
119
+ {
120
+ "layers": [
121
+ { "type": "image", "path": "photo.jpg" },
122
+ { "type": "title", "text": "Caption", "position": "bottom" }
123
+ ]
124
+ }
125
+ ],
126
+ "audioFilePath": "background.mp3",
127
+ "keepSourceAudio": false
128
+ }
129
+ ```
130
+
131
+ ### Layer Types
132
+ - `video` — video clip (cutFrom/cutTo for trimming)
133
+ - `audio` — audio track
134
+ - `image` — static image
135
+ - `title-background` — full-screen title card with background
136
+ - `title` — text overlay
137
+ - `subtitle` — subtitle text
138
+ - `gl` — WebGL shader transition/effect
139
+
140
+ ## Guidelines
141
+
142
+ - **Remotion** — best for complex, data-driven, animated videos (dashboards, branded content, social media)
143
+ - **Editly** — best for quick assembly (concatenation, transitions, title cards, slideshows)
144
+ - Both require `ffmpeg` (installed automatically with this skill)
145
+ - Remotion renders can be CPU-intensive — warn user about duration for long compositions
146
+ - Always confirm output path before rendering to avoid overwriting
147
+ - Use `--fast` flag with Editly for quick previews before final render
@@ -0,0 +1,61 @@
1
+ ---
2
+ name: c-weather
3
+ description: Weather forecasts and conditions — current, hourly, multi-day. No API key needed.
4
+ tags: [weather, forecast, temperature, assistant]
5
+ ---
6
+
7
+ # Weather — Forecasts & Conditions
8
+
9
+ Get weather information using `curl` and wttr.in. No API key required, no tool to install.
10
+
11
+ ## Commands
12
+
13
+ ```bash
14
+ # Current weather (auto-detects location)
15
+ curl -s "wttr.in?format=3"
16
+
17
+ # Detailed current conditions
18
+ curl -s "wttr.in?format=%l:+%c+%t+%h+%w+%p"
19
+
20
+ # Full forecast (today + 2 days)
21
+ curl -s "wttr.in"
22
+
23
+ # Specific city
24
+ curl -s "wttr.in/London"
25
+ curl -s "wttr.in/New+York"
26
+ curl -s "wttr.in/Tokyo"
27
+
28
+ # Compact one-line
29
+ curl -s "wttr.in/Paris?format=%l:+%c+%t+(feels+like+%f)+%h+humidity+%w+wind"
30
+
31
+ # Today only
32
+ curl -s "wttr.in/Berlin?1"
33
+
34
+ # JSON output for parsing
35
+ curl -s "wttr.in/London?format=j1"
36
+
37
+ # Moon phase
38
+ curl -s "wttr.in/Moon"
39
+ ```
40
+
41
+ ## Format Codes
42
+
43
+ | Code | Meaning |
44
+ |------|---------|
45
+ | `%c` | Weather icon |
46
+ | `%t` | Temperature |
47
+ | `%f` | Feels like |
48
+ | `%h` | Humidity |
49
+ | `%w` | Wind |
50
+ | `%p` | Precipitation |
51
+ | `%l` | Location |
52
+ | `%S` | Sunrise |
53
+ | `%s` | Sunset |
54
+
55
+ ## Guidelines
56
+
57
+ - Default to the user's location (check memory/SOUL.md for city)
58
+ - Use compact format (`format=3`) for quick checks
59
+ - Use full output for detailed forecasts
60
+ - If the user asks about weather, always provide temperature and conditions
61
+ - Mention "feels like" temperature when it differs significantly
@@ -1,3 +0,0 @@
1
- import { addPermissions, getPermissionRule, readSettings, removePermissions, writeSettings } from "./permissions-BHOAvP8i.js";
2
-
3
- export { writeSettings };
File without changes