pawmode 1.0.0 → 1.2.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.
- package/README.md +229 -72
- package/dist/dashboard-server--wwlA0Pa.js +426 -0
- package/dist/dashboard-server-Cg_1CvKn.js +3 -0
- package/dist/index.js +684 -872
- package/dist/permissions-AJXigU7k.js +3 -0
- package/dist/scheduler-DAmd0GzB.js +888 -0
- package/dist/scheduler-DppXPNqK.js +4 -0
- package/dist/{skills-DwMXaN3R.js → skills-CUY0swcW.js} +1 -1
- package/package.json +1 -1
- package/skills/c-calendar/SKILL.md +12 -11
- package/skills/c-clipboard/SKILL.md +53 -0
- package/skills/c-contacts/SKILL.md +63 -0
- package/skills/c-core/SKILL.md +17 -1
- package/skills/c-memory/SKILL.md +32 -0
- package/skills/c-obsidian/SKILL.md +22 -3
- package/skills/c-schedule/SKILL.md +98 -0
- package/skills/c-timer/SKILL.md +59 -0
- package/skills/c-video-edit/SKILL.md +147 -0
- package/skills/c-weather/SKILL.md +61 -0
- package/dist/permissions-CoaVX2ZM.js +0 -3
- package/skills/c-social/SKILL.md +0 -57
- /package/dist/{permissions-BHOAvP8i.js → permissions-BlGEHCXO.js} +0 -0
- /package/dist/{skills-CJ_pyPlv.js → skills-CMqq9k1-.js} +0 -0
|
@@ -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-
|
|
1
|
+
import { getDefaultSkillsDir, getInstalledSkillPath, getSkillTemplatePath, installSkill, isSkillInstalled, listInstalledSkills, removeSkill } from "./skills-CMqq9k1-.js";
|
|
2
2
|
|
|
3
3
|
export { installSkill };
|
package/package.json
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: c-calendar
|
|
3
|
-
description: View and create calendar events via gog (Google Calendar) or
|
|
4
|
-
tags: [calendar, google-calendar, apple-calendar, gog,
|
|
3
|
+
description: View and create calendar events via gog (Google Calendar) or icalBuddy (Apple Calendar). Check availability, list upcoming events, create/update/delete events, and manage multiple calendars.
|
|
4
|
+
tags: [calendar, google-calendar, apple-calendar, gog, icalBuddy, events]
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
-
This skill manages calendars via `gog` (Google Calendar) or `
|
|
7
|
+
This skill manages calendars via `gog` (Google Calendar) or `icalBuddy` (Apple Calendar). Check availability with `which gog icalBuddy`.
|
|
8
8
|
|
|
9
9
|
## Google Calendar — `gog cal` (gogcli)
|
|
10
10
|
|
|
@@ -23,25 +23,26 @@ gog cal calendars # List all calendars
|
|
|
23
23
|
gog cal freebusy --start "tomorrow" --end "tomorrow 5pm"
|
|
24
24
|
```
|
|
25
25
|
|
|
26
|
-
## Apple Calendar — `
|
|
26
|
+
## Apple Calendar — `icalBuddy`
|
|
27
27
|
|
|
28
28
|
```bash
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
29
|
+
icalBuddy eventsToday # Today's events
|
|
30
|
+
icalBuddy eventsToday+3 # Events today through next 3 days
|
|
31
|
+
icalBuddy eventsFrom:"2026-03-01" to:"2026-03-07"
|
|
32
|
+
icalBuddy -ic "Work" eventsToday # Specific calendar
|
|
33
|
+
icalBuddy calendars # List all calendars
|
|
34
|
+
icalBuddy uncompletedTasks # Incomplete reminders/tasks
|
|
34
35
|
```
|
|
35
36
|
|
|
36
37
|
## Usage Guidelines
|
|
37
38
|
|
|
38
39
|
- Use `gog cal freebusy` to check availability before scheduling.
|
|
39
|
-
- `
|
|
40
|
+
- `icalBuddy` is read-only for Apple Calendar — use it for viewing, not creating.
|
|
40
41
|
- For creating Apple Calendar events programmatically, prefer `gog` with Google Calendar or use AppleScript via the `osascript` fallback.
|
|
41
42
|
- Dates accept natural language with `gog` ("tomorrow 2pm", "next Monday 9am").
|
|
42
43
|
|
|
43
44
|
## Notes
|
|
44
45
|
|
|
45
46
|
- `gog` requires Google OAuth: `gog auth`.
|
|
46
|
-
- `
|
|
47
|
+
- `icalBuddy` reads directly from the local Calendar database (no auth needed).
|
|
47
48
|
- Multiple Google accounts supported via `gog cal --account work list`.
|
|
@@ -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
|
package/skills/c-core/SKILL.md
CHANGED
|
@@ -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
|
package/skills/c-memory/SKILL.md
CHANGED
|
@@ -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
|
-
|
|
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
|