pawmode 1.0.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.
Files changed (44) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +337 -0
  3. package/dist/index.js +2925 -0
  4. package/dist/permissions-BHOAvP8i.js +55 -0
  5. package/dist/permissions-CoaVX2ZM.js +3 -0
  6. package/dist/skills-CJ_pyPlv.js +53 -0
  7. package/dist/skills-DwMXaN3R.js +3 -0
  8. package/package.json +60 -0
  9. package/skills/c-ai/SKILL.md +68 -0
  10. package/skills/c-apps/SKILL.md +42 -0
  11. package/skills/c-bluetooth/SKILL.md +42 -0
  12. package/skills/c-briefing/SKILL.md +80 -0
  13. package/skills/c-browser/SKILL.md +66 -0
  14. package/skills/c-calendar/SKILL.md +47 -0
  15. package/skills/c-core/SKILL.md +83 -0
  16. package/skills/c-cron/SKILL.md +58 -0
  17. package/skills/c-display/SKILL.md +45 -0
  18. package/skills/c-email/SKILL.md +54 -0
  19. package/skills/c-files/SKILL.md +52 -0
  20. package/skills/c-github/SKILL.md +61 -0
  21. package/skills/c-jira/SKILL.md +66 -0
  22. package/skills/c-lights/SKILL.md +55 -0
  23. package/skills/c-linear/SKILL.md +64 -0
  24. package/skills/c-location/SKILL.md +47 -0
  25. package/skills/c-memory/SKILL.md +86 -0
  26. package/skills/c-messaging/SKILL.md +51 -0
  27. package/skills/c-music/SKILL.md +59 -0
  28. package/skills/c-network/SKILL.md +71 -0
  29. package/skills/c-notes/SKILL.md +45 -0
  30. package/skills/c-notify/SKILL.md +39 -0
  31. package/skills/c-notion/SKILL.md +53 -0
  32. package/skills/c-obsidian/SKILL.md +63 -0
  33. package/skills/c-research/SKILL.md +45 -0
  34. package/skills/c-screen/SKILL.md +55 -0
  35. package/skills/c-secrets/SKILL.md +62 -0
  36. package/skills/c-slack/SKILL.md +46 -0
  37. package/skills/c-social/SKILL.md +57 -0
  38. package/skills/c-speakers/SKILL.md +59 -0
  39. package/skills/c-system/SKILL.md +72 -0
  40. package/skills/c-tasks/SKILL.md +60 -0
  41. package/skills/c-telegram/SKILL.md +66 -0
  42. package/skills/c-tracking/SKILL.md +46 -0
  43. package/skills/c-video/SKILL.md +56 -0
  44. package/skills/c-voice/SKILL.md +58 -0
@@ -0,0 +1,55 @@
1
+ import os from "node:os";
2
+ import fs from "node:fs";
3
+ import path from "node:path";
4
+
5
+ //#region src/core/permissions.ts
6
+ const SETTINGS_PATH = path.join(os.homedir(), ".claude", "settings.json");
7
+ function readSettings() {
8
+ try {
9
+ if (!fs.existsSync(SETTINGS_PATH)) return {};
10
+ const content = fs.readFileSync(SETTINGS_PATH, "utf8");
11
+ return JSON.parse(content);
12
+ } catch {
13
+ return {};
14
+ }
15
+ }
16
+ function writeSettings(settings) {
17
+ const dir = path.dirname(SETTINGS_PATH);
18
+ fs.mkdirSync(dir, { recursive: true });
19
+ const tmpPath = `${SETTINGS_PATH}.tmp`;
20
+ fs.writeFileSync(tmpPath, JSON.stringify(settings, null, 2) + "\n", "utf8");
21
+ fs.renameSync(tmpPath, SETTINGS_PATH);
22
+ }
23
+ function getPermissionRule(tool) {
24
+ return `Bash(${tool.command} *)`;
25
+ }
26
+ function addPermissions(tools) {
27
+ const settings = readSettings();
28
+ if (!settings.permissions) settings.permissions = {};
29
+ if (!Array.isArray(settings.permissions.allow)) settings.permissions.allow = [];
30
+ const existing = new Set(settings.permissions.allow);
31
+ const added = [];
32
+ for (const tool of tools) {
33
+ const rule = getPermissionRule(tool);
34
+ if (!existing.has(rule)) {
35
+ settings.permissions.allow.push(rule);
36
+ existing.add(rule);
37
+ added.push(rule);
38
+ }
39
+ }
40
+ if (added.length > 0) writeSettings(settings);
41
+ return added;
42
+ }
43
+ function removePermissions(tools) {
44
+ const settings = readSettings();
45
+ if (!settings.permissions?.allow) return [];
46
+ const toRemove = new Set(tools.map(getPermissionRule));
47
+ const before = settings.permissions.allow.length;
48
+ settings.permissions.allow = settings.permissions.allow.filter((rule) => !toRemove.has(rule));
49
+ const removed = before - settings.permissions.allow.length;
50
+ if (removed > 0) writeSettings(settings);
51
+ return tools.map(getPermissionRule).filter((r) => toRemove.has(r));
52
+ }
53
+
54
+ //#endregion
55
+ export { addPermissions, getPermissionRule, readSettings, removePermissions, writeSettings };
@@ -0,0 +1,3 @@
1
+ import { addPermissions, getPermissionRule, readSettings, removePermissions, writeSettings } from "./permissions-BHOAvP8i.js";
2
+
3
+ export { writeSettings };
@@ -0,0 +1,53 @@
1
+ import os from "node:os";
2
+ import fs from "node:fs";
3
+ import path from "node:path";
4
+ import { fileURLToPath } from "node:url";
5
+
6
+ //#region src/core/skills.ts
7
+ const __dirname = path.dirname(fileURLToPath(import.meta.url));
8
+ function getDefaultSkillsDir() {
9
+ return path.join(os.homedir(), ".claude", "skills");
10
+ }
11
+ function getSkillTemplatePath(skillId) {
12
+ const candidates = [
13
+ path.resolve(__dirname, "..", "..", "skills", `c-${skillId}`, "SKILL.md"),
14
+ path.resolve(__dirname, "..", "skills", `c-${skillId}`, "SKILL.md"),
15
+ path.resolve(__dirname, "skills", `c-${skillId}`, "SKILL.md")
16
+ ];
17
+ for (const candidate of candidates) if (fs.existsSync(candidate)) return candidate;
18
+ return candidates[0];
19
+ }
20
+ function getInstalledSkillPath(skillId, skillsDir) {
21
+ const dir = skillsDir ?? getDefaultSkillsDir();
22
+ return path.join(dir, `c-${skillId}`, "SKILL.md");
23
+ }
24
+ function isSkillInstalled(skillId, skillsDir) {
25
+ return fs.existsSync(getInstalledSkillPath(skillId, skillsDir));
26
+ }
27
+ function installSkill(skillId, skillsDir) {
28
+ const templatePath = getSkillTemplatePath(skillId);
29
+ const targetPath = getInstalledSkillPath(skillId, skillsDir);
30
+ if (!fs.existsSync(templatePath)) return false;
31
+ const targetDir = path.dirname(targetPath);
32
+ fs.mkdirSync(targetDir, { recursive: true });
33
+ fs.copyFileSync(templatePath, targetPath);
34
+ return true;
35
+ }
36
+ function removeSkill(skillId, skillsDir) {
37
+ const dir = skillsDir ?? getDefaultSkillsDir();
38
+ const skillDir = path.join(dir, `c-${skillId}`);
39
+ if (!fs.existsSync(skillDir)) return false;
40
+ fs.rmSync(skillDir, {
41
+ recursive: true,
42
+ force: true
43
+ });
44
+ return true;
45
+ }
46
+ function listInstalledSkills(skillsDir) {
47
+ const dir = skillsDir ?? getDefaultSkillsDir();
48
+ if (!fs.existsSync(dir)) return [];
49
+ return fs.readdirSync(dir).filter((name) => name.startsWith("c-") && fs.existsSync(path.join(dir, name, "SKILL.md"))).map((name) => name.replace("c-", ""));
50
+ }
51
+
52
+ //#endregion
53
+ export { getDefaultSkillsDir, getInstalledSkillPath, getSkillTemplatePath, installSkill, isSkillInstalled, listInstalledSkills, removeSkill };
@@ -0,0 +1,3 @@
1
+ import { getDefaultSkillsDir, getInstalledSkillPath, getSkillTemplatePath, installSkill, isSkillInstalled, listInstalledSkills, removeSkill } from "./skills-CJ_pyPlv.js";
2
+
3
+ export { installSkill };
package/package.json ADDED
@@ -0,0 +1,60 @@
1
+ {
2
+ "name": "pawmode",
3
+ "version": "1.0.0",
4
+ "description": "Open-source Personal Assistant Wizard for Claude Code. Turn Claude Code into your PA with CLI tools and skills.",
5
+ "type": "module",
6
+ "bin": {
7
+ "openpaw": "dist/index.js"
8
+ },
9
+ "files": [
10
+ "dist",
11
+ "skills"
12
+ ],
13
+ "scripts": {
14
+ "build": "tsdown && node -e \"const fs=require('fs');const f='dist/index.js';fs.writeFileSync(f,'#!/usr/bin/env node\\n'+fs.readFileSync(f,'utf8'));fs.chmodSync(f,0o755)\"",
15
+ "dev": "tsdown --watch",
16
+ "test": "vitest run",
17
+ "test:watch": "vitest",
18
+ "typecheck": "tsc --noEmit",
19
+ "lint": "biome check .",
20
+ "prepublishOnly": "npm run build"
21
+ },
22
+ "keywords": [
23
+ "claude",
24
+ "claude-code",
25
+ "personal-assistant",
26
+ "ai",
27
+ "skills",
28
+ "cli",
29
+ "wizard",
30
+ "openpaw",
31
+ "telegram"
32
+ ],
33
+ "author": "daxaur",
34
+ "license": "MIT",
35
+ "repository": {
36
+ "type": "git",
37
+ "url": "git+https://github.com/daxaur/openpaw.git"
38
+ },
39
+ "homepage": "https://github.com/daxaur/openpaw",
40
+ "engines": {
41
+ "node": ">=18"
42
+ },
43
+ "dependencies": {
44
+ "@anthropic-ai/claude-agent-sdk": "^0.2.63",
45
+ "@clack/prompts": "^0.10.0",
46
+ "@grammyjs/hydrate": "^1.6.0",
47
+ "chalk": "^5.4.1",
48
+ "commander": "^14.0.0",
49
+ "gradient-string": "^3.0.0",
50
+ "grammy": "^1.40.1"
51
+ },
52
+ "devDependencies": {
53
+ "@biomejs/biome": "^1.9.0",
54
+ "@types/gradient-string": "^1.1.6",
55
+ "@types/node": "^22.0.0",
56
+ "tsdown": "^0.11.0",
57
+ "typescript": "^5.7.0",
58
+ "vitest": "^3.0.0"
59
+ }
60
+ }
@@ -0,0 +1,68 @@
1
+ ---
2
+ name: c-ai
3
+ description: Query LLMs from the CLI — pipe text for summarization, chat interactively, use local or cloud models with llm or aichat.
4
+ tags: [ai, llm, summarize, chat]
5
+ ---
6
+
7
+ # AI / LLM Tools
8
+
9
+ ## llm (Simon Willison)
10
+
11
+ ```bash
12
+ # Quick prompt
13
+ llm "What is the capital of France?"
14
+
15
+ # Pipe text for processing
16
+ cat article.txt | llm "Summarize this in 3 bullet points"
17
+ git diff | llm "Write a commit message for these changes"
18
+ pbpaste | llm "Fix the grammar in this text"
19
+
20
+ # Interactive chat
21
+ llm chat
22
+
23
+ # Use specific model
24
+ llm -m claude-3.5-sonnet "Explain quantum computing"
25
+ llm -m gpt-4o "Review this code"
26
+
27
+ # List available models
28
+ llm models
29
+
30
+ # Install model plugins
31
+ llm install llm-claude-3
32
+ llm install llm-ollama # local models
33
+
34
+ # View prompt/response history
35
+ llm logs list
36
+ llm logs last
37
+ ```
38
+
39
+ ## aichat
40
+
41
+ ```bash
42
+ # Quick prompt
43
+ aichat "Explain Docker in simple terms"
44
+
45
+ # Pipe input
46
+ cat code.py | aichat "Find bugs in this code"
47
+
48
+ # Interactive REPL
49
+ aichat
50
+
51
+ # Shell assistant (generates and runs commands)
52
+ aichat -e "find all files larger than 100MB"
53
+
54
+ # Specific model
55
+ aichat -m claude-3.5-sonnet "Hello"
56
+
57
+ # List models
58
+ aichat --list-models
59
+ ```
60
+
61
+ ## Guidelines
62
+
63
+ - Use `llm` for piping text through LLMs (summarize, translate, analyze)
64
+ - Use `aichat -e` for generating shell commands from natural language
65
+ - Both tools store API keys locally — set up once with auth commands
66
+ - `llm` has the richest plugin ecosystem (100+ model providers)
67
+ - `aichat` is faster (Rust) and has built-in RAG support
68
+ - These tools use separate API keys from Claude Code — user pays per token
@@ -0,0 +1,42 @@
1
+ ---
2
+ name: c-apps
3
+ description: Install, update, and search Mac App Store apps from the command line using mas.
4
+ tags: [apps, appstore, macos, install]
5
+ ---
6
+
7
+ # Mac App Store (mas)
8
+
9
+ ```bash
10
+ # Search for apps
11
+ mas search Xcode
12
+ mas search "Bear Notes"
13
+
14
+ # Install by app ID
15
+ mas install 497799835 # Xcode
16
+
17
+ # List installed apps
18
+ mas list
19
+
20
+ # Check for outdated apps
21
+ mas outdated
22
+
23
+ # Upgrade all outdated apps
24
+ mas upgrade
25
+
26
+ # Upgrade specific app
27
+ mas upgrade 497799835
28
+
29
+ # Show app info
30
+ mas info 497799835
31
+
32
+ # Open app page in App Store
33
+ mas open 497799835
34
+ ```
35
+
36
+ ## Guidelines
37
+
38
+ - User must be signed into the Mac App Store
39
+ - On macOS 15+, install/upgrade requires admin password
40
+ - Use `mas search` to find app IDs before installing
41
+ - `mas upgrade` updates all apps — confirm with user first
42
+ - Free and paid apps both work (paid requires prior purchase)
@@ -0,0 +1,42 @@
1
+ ---
2
+ name: c-bluetooth
3
+ description: Manage Bluetooth devices on macOS using the blucli (`blu`) CLI. List paired and available devices, connect to headphones/speakers/keyboards, and disconnect devices by name or MAC address.
4
+ tags: [bluetooth, hardware, macos, devices, audio]
5
+ ---
6
+
7
+ ## What This Skill Does
8
+
9
+ Manages Bluetooth device connections on macOS using `blu` (blucli). You can list available devices, connect to a device by name or MAC address, and disconnect active devices.
10
+
11
+ ## CLI Tool: `blu`
12
+
13
+ ### Common Commands
14
+
15
+ ```bash
16
+ # List all paired/known devices
17
+ blu list
18
+
19
+ # Connect to a device (by name or MAC)
20
+ blu connect "AirPods Pro"
21
+ blu connect AA:BB:CC:DD:EE:FF
22
+
23
+ # Disconnect a device
24
+ blu disconnect "AirPods Pro"
25
+ blu disconnect AA:BB:CC:DD:EE:FF
26
+
27
+ # Check connection status
28
+ blu status
29
+ ```
30
+
31
+ ## Usage Guidelines
32
+
33
+ 1. Run `blu list` first to identify the exact device name or MAC address.
34
+ 2. Device names are case-sensitive — use the exact name from `blu list`.
35
+ 3. If connecting by name fails, fall back to MAC address.
36
+ 4. After connecting, confirm success by checking for a non-error exit code or running `blu status`.
37
+
38
+ ## Notes
39
+
40
+ - `blu` only manages already-paired devices. New device pairing must be done via macOS System Settings.
41
+ - Some commands may require Bluetooth to be enabled in macOS before running.
42
+ - If `blu` is not installed: `brew install blucli`
@@ -0,0 +1,80 @@
1
+ ---
2
+ name: c-briefing
3
+ description: Daily briefing — morning summary of email, calendar, tasks, weather. Can run on a schedule via launchd/cron.
4
+ tags: [briefing, daily, morning, summary, schedule]
5
+ ---
6
+
7
+ # Daily Briefing
8
+
9
+ Compile a morning summary from your installed skills. Checks what's available and builds the briefing accordingly.
10
+
11
+ ## What to Include
12
+
13
+ Check which skills are installed and pull from each:
14
+
15
+ | If installed | Include in briefing |
16
+ |---|---|
17
+ | c-email | Unread email count + top 5 subjects |
18
+ | c-calendar | Today's events + tomorrow preview |
19
+ | c-tasks | Due today + overdue items |
20
+ | c-notes | Recently modified notes |
21
+ | c-github | Open PRs, review requests, CI failures |
22
+ | c-slack | Unread DM count + mentions |
23
+ | c-tracking | Package delivery updates |
24
+
25
+ ## Briefing Format
26
+
27
+ ```
28
+ Good morning, {name}! Here's your briefing for {date}:
29
+
30
+ 📧 Email: 12 unread — 3 flagged
31
+ → "Q4 Budget Review" from Sarah
32
+ → "Deploy approval needed" from CI Bot
33
+ → "Lunch tomorrow?" from Mike
34
+
35
+ 📅 Calendar:
36
+ → 9:00 AM Team standup (30 min)
37
+ → 11:00 AM 1:1 with Alex (45 min)
38
+ → 2:00 PM Sprint review (1 hr)
39
+
40
+ ✅ Tasks: 3 due today, 1 overdue
41
+ → [overdue] Fix login bug
42
+ → Write API docs
43
+ → Review PR #234
44
+
45
+ 🔔 Other:
46
+ → 2 GitHub PRs need review
47
+ → Package arriving today (Amazon)
48
+ ```
49
+
50
+ ## Scheduled Briefing
51
+
52
+ To run automatically each morning, set up a launchd job (macOS) or cron job:
53
+
54
+ ```bash
55
+ # Create a briefing script
56
+ cat > ~/.claude/briefing.sh << 'SCRIPT'
57
+ #!/bin/bash
58
+ claude --print "Run my daily briefing using the c-briefing skill. Be concise." \
59
+ | terminal-notifier -title "Morning Briefing" -message "Ready" 2>/dev/null
60
+ SCRIPT
61
+ chmod +x ~/.claude/briefing.sh
62
+
63
+ # Schedule with cron (every weekday at 8:00 AM)
64
+ (crontab -l 2>/dev/null; echo "0 8 * * 1-5 ~/.claude/briefing.sh") | crontab -
65
+
66
+ # Or use lunchy-go for launchd (macOS)
67
+ lunchy-go install ~/.claude/briefing.plist
68
+ ```
69
+
70
+ ## Manual Briefing
71
+
72
+ Just ask Claude: "Give me my daily briefing" or "What's on my plate today?"
73
+
74
+ ## Guidelines
75
+
76
+ - Read the user's name from SOUL.md or MEMORY.md
77
+ - Only include sections for skills that are actually installed
78
+ - Keep it concise — no section should exceed 5 items
79
+ - Flag urgent items at the top
80
+ - Include the date and day of week
@@ -0,0 +1,66 @@
1
+ ---
2
+ name: c-browser
3
+ description: Headless browser automation — navigate pages, click elements, fill forms, take screenshots, scrape content using agent-browser or playwright-cli.
4
+ tags: [browser, automation, scraping, web]
5
+ ---
6
+
7
+ # Browser Automation
8
+
9
+ ## agent-browser (Vercel)
10
+
11
+ Navigate and interact with web pages using structured snapshots:
12
+
13
+ ```bash
14
+ # Open a URL
15
+ agent-browser open "https://example.com"
16
+
17
+ # Get interactive element snapshot (shows clickable refs)
18
+ agent-browser snapshot -i
19
+
20
+ # Click an element by ref
21
+ agent-browser click @e2
22
+
23
+ # Fill a form field
24
+ agent-browser fill @e5 "search query"
25
+
26
+ # Take annotated screenshot
27
+ agent-browser screenshot --annotate
28
+
29
+ # Type text
30
+ agent-browser type "hello world"
31
+
32
+ # Press keys
33
+ agent-browser press Enter
34
+ ```
35
+
36
+ ## playwright-cli (Microsoft)
37
+
38
+ Token-efficient browser automation designed for AI agents:
39
+
40
+ ```bash
41
+ # Install browser (first time)
42
+ playwright-cli install-browser
43
+
44
+ # Navigate to URL
45
+ playwright-cli navigate "https://example.com"
46
+
47
+ # Get page snapshot
48
+ playwright-cli snapshot
49
+
50
+ # Click element
51
+ playwright-cli click "Submit button"
52
+
53
+ # Fill input
54
+ playwright-cli fill "Search" "query text"
55
+
56
+ # Screenshot
57
+ playwright-cli screenshot
58
+ ```
59
+
60
+ ## Guidelines
61
+
62
+ - Use agent-browser for AI-driven web interaction (snapshot-ref pattern)
63
+ - Use playwright-cli for structured automation and testing flows
64
+ - Always check snapshots before clicking — element refs change between pages
65
+ - For login flows, navigate step by step and verify each page loads
66
+ - Respect robots.txt and rate limits when scraping
@@ -0,0 +1,47 @@
1
+ ---
2
+ name: c-calendar
3
+ description: View and create calendar events via gog (Google Calendar) or icalpal (Apple Calendar). Check availability, list upcoming events, create/update/delete events, and manage multiple calendars.
4
+ tags: [calendar, google-calendar, apple-calendar, gog, icalpal, events]
5
+ ---
6
+
7
+ This skill manages calendars via `gog` (Google Calendar) or `icalpal` (Apple Calendar). Check availability with `which gog icalpal`.
8
+
9
+ ## Google Calendar — `gog cal` (gogcli)
10
+
11
+ ```bash
12
+ gog cal list # List upcoming events
13
+ gog cal list --days 7 # Next 7 days
14
+ gog cal list --calendar "Work" # Specific calendar
15
+ gog cal list --start "2026-03-01" --end "2026-03-07"
16
+ gog cal get <event-id> # Get event details
17
+ gog cal create --title "Meeting" --start "2026-03-01T10:00" --end "2026-03-01T11:00"
18
+ gog cal create --title "Event" --start "tomorrow 2pm" --duration 1h --calendar "Work"
19
+ gog cal create --attendees "alice@x.com,bob@x.com" --title "Sync"
20
+ gog cal update <event-id> --title "New Title"
21
+ gog cal delete <event-id>
22
+ gog cal calendars # List all calendars
23
+ gog cal freebusy --start "tomorrow" --end "tomorrow 5pm"
24
+ ```
25
+
26
+ ## Apple Calendar — `icalpal`
27
+
28
+ ```bash
29
+ icalpal events # Today's events
30
+ icalpal events --from "2026-03-01" --to "2026-03-07"
31
+ icalpal events --calendar "Work"
32
+ icalpal calendars # List all calendars/accounts
33
+ icalpal reminders # List calendar-based reminders
34
+ ```
35
+
36
+ ## Usage Guidelines
37
+
38
+ - Use `gog cal freebusy` to check availability before scheduling.
39
+ - `icalpal` is read-only for Apple Calendar — use it for viewing, not creating.
40
+ - For creating Apple Calendar events programmatically, prefer `gog` with Google Calendar or use AppleScript via the `osascript` fallback.
41
+ - Dates accept natural language with `gog` ("tomorrow 2pm", "next Monday 9am").
42
+
43
+ ## Notes
44
+
45
+ - `gog` requires Google OAuth: `gog auth`.
46
+ - `icalpal` reads directly from the local Calendar database (no auth needed).
47
+ - Multiple Google accounts supported via `gog cal --account work list`.
@@ -0,0 +1,83 @@
1
+ ---
2
+ name: c
3
+ description: OpenPaw coordinator — routes requests to skills, manages memory, knows what's installed. Use /c for any task.
4
+ tags: [coordinator, routing, skills, meta, openpaw]
5
+ ---
6
+
7
+ # OpenPaw — Personal Assistant Coordinator
8
+
9
+ You are powered by **OpenPaw**, an open-source personal assistant system for Claude Code. You have access to CLI tools and skills that let you control apps, services, and system features.
10
+
11
+ ## PAW MODE Active
12
+
13
+ You are running in **PAW MODE** — full personal assistant mode powered by OpenPaw.
14
+
15
+ - Greet the user by name (check SOUL.md)
16
+ - At the start of each session, briefly acknowledge PAW MODE (e.g., "PAW MODE active, ready to help! 🐾")
17
+ - Proactively help with tasks when appropriate
18
+ - If asked about your mode: "I'm in PAW MODE — your personal assistant is ready"
19
+
20
+ ## Session Start Checklist
21
+
22
+ 1. Read `~/.claude/SOUL.md` if it exists — this defines your personality and the user's preferences
23
+ 2. Read `~/.claude/memory/MEMORY.md` if it exists — this has persistent facts and context
24
+ 3. Check `ls ~/.claude/skills/` to see what skills are installed
25
+
26
+ ## Memory
27
+
28
+ - Save important facts to `~/.claude/memory/MEMORY.md` when the user shares them
29
+ - Log session summaries to `~/.claude/memory/journal.md`
30
+ - Track people in `~/.claude/memory/people.md`
31
+ - Track preferences in `~/.claude/memory/preferences.md`
32
+
33
+ ## Available Skills
34
+
35
+ | Skill | Purpose |
36
+ |---|---|
37
+ | c-memory | Persistent memory across sessions |
38
+ | c-notes | Apple Notes + Reminders |
39
+ | c-obsidian | Obsidian vault management |
40
+ | c-notion | Notion pages/databases |
41
+ | c-tasks | Todoist / Things / Taskwarrior |
42
+ | c-email | Gmail / IMAP email |
43
+ | c-calendar | Google Cal / Apple Calendar |
44
+ | c-messaging | iMessage / WhatsApp |
45
+ | c-slack | Slack channels + DMs |
46
+ | c-social | Twitter/X |
47
+ | c-music | Spotify playback |
48
+ | c-video | YouTube + video tools |
49
+ | c-screen | Screenshots + OCR |
50
+ | c-voice | Speech-to-text + TTS |
51
+ | c-lights | Philips Hue |
52
+ | c-speakers | Sonos speakers |
53
+ | c-bluetooth | Bluetooth devices |
54
+ | c-browser | Headless browser |
55
+ | c-cron | Scheduled jobs |
56
+ | c-system | macOS system control |
57
+ | c-apps | Mac App Store |
58
+ | c-files | Cloud file sync |
59
+ | c-display | Brightness + trash |
60
+ | c-notify | macOS notifications |
61
+ | c-research | Web research + summarization |
62
+ | c-location | Maps + nearby places |
63
+ | c-tracking | Package tracking |
64
+ | c-secrets | Password managers |
65
+ | c-network | DNS + HTTP tools |
66
+ | c-ai | Query other LLMs |
67
+ | c-github | GitHub PRs, issues, repos |
68
+ | c-linear | Linear issues |
69
+ | c-jira | Jira issues |
70
+
71
+ ## Routing
72
+
73
+ - Match the user's intent to the most specific skill
74
+ - If multiple skills apply, use them in sequence
75
+ - If a skill isn't installed, suggest: `openpaw add <skill-name>`
76
+ - Check availability with `which <tool>` or `ls ~/.claude/skills/c-<name>/`
77
+
78
+ ## Identity
79
+
80
+ - You are an OpenPaw-powered assistant
81
+ - Open-source, no daemon, no extra cost
82
+ - If asked about your setup: "I'm powered by OpenPaw — open-source personal assistant skills for Claude Code"
83
+ - Project: https://github.com/daxaur/openpaw
@@ -0,0 +1,58 @@
1
+ ---
2
+ name: c-cron
3
+ description: Manage cron jobs and macOS launchctl services — schedule recurring tasks, start/stop services using lunchy-go.
4
+ tags: [cron, scheduling, launchctl, automation]
5
+ ---
6
+
7
+ # Scheduling & Cron
8
+
9
+ ## lunchy-go (launchctl wrapper)
10
+
11
+ Friendly wrapper around macOS `launchctl`:
12
+
13
+ ```bash
14
+ # List all services (pattern match)
15
+ lunchy-go ls
16
+ lunchy-go ls redis
17
+
18
+ # Start a service
19
+ lunchy-go start com.example.service
20
+ lunchy-go start redis # pattern match
21
+
22
+ # Stop a service
23
+ lunchy-go stop redis
24
+
25
+ # Restart a service
26
+ lunchy-go restart redis
27
+
28
+ # Show service status
29
+ lunchy-go status redis
30
+ ```
31
+
32
+ ## crontab (built-in)
33
+
34
+ Standard Unix cron scheduler:
35
+
36
+ ```bash
37
+ # List current cron jobs
38
+ crontab -l
39
+
40
+ # Edit cron jobs (opens editor)
41
+ crontab -e
42
+
43
+ # Cron syntax: MIN HOUR DOM MON DOW command
44
+ # Every day at 9am:
45
+ # 0 9 * * * /path/to/script.sh
46
+ # Every 5 minutes:
47
+ # */5 * * * * /path/to/script.sh
48
+ # Weekdays at 8:30am:
49
+ # 30 8 * * 1-5 /path/to/script.sh
50
+ ```
51
+
52
+ ## Guidelines
53
+
54
+ - Prefer lunchy-go for macOS services (launchd plists)
55
+ - Use crontab for simple recurring commands
56
+ - Always use full paths in cron jobs
57
+ - Redirect output to log files: `command >> /tmp/cron.log 2>&1`
58
+ - Test commands manually before scheduling them