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.
- package/LICENSE +21 -0
- package/README.md +337 -0
- package/dist/index.js +2925 -0
- package/dist/permissions-BHOAvP8i.js +55 -0
- package/dist/permissions-CoaVX2ZM.js +3 -0
- package/dist/skills-CJ_pyPlv.js +53 -0
- package/dist/skills-DwMXaN3R.js +3 -0
- package/package.json +60 -0
- package/skills/c-ai/SKILL.md +68 -0
- package/skills/c-apps/SKILL.md +42 -0
- package/skills/c-bluetooth/SKILL.md +42 -0
- package/skills/c-briefing/SKILL.md +80 -0
- package/skills/c-browser/SKILL.md +66 -0
- package/skills/c-calendar/SKILL.md +47 -0
- package/skills/c-core/SKILL.md +83 -0
- package/skills/c-cron/SKILL.md +58 -0
- package/skills/c-display/SKILL.md +45 -0
- package/skills/c-email/SKILL.md +54 -0
- package/skills/c-files/SKILL.md +52 -0
- package/skills/c-github/SKILL.md +61 -0
- package/skills/c-jira/SKILL.md +66 -0
- package/skills/c-lights/SKILL.md +55 -0
- package/skills/c-linear/SKILL.md +64 -0
- package/skills/c-location/SKILL.md +47 -0
- package/skills/c-memory/SKILL.md +86 -0
- package/skills/c-messaging/SKILL.md +51 -0
- package/skills/c-music/SKILL.md +59 -0
- package/skills/c-network/SKILL.md +71 -0
- package/skills/c-notes/SKILL.md +45 -0
- package/skills/c-notify/SKILL.md +39 -0
- package/skills/c-notion/SKILL.md +53 -0
- package/skills/c-obsidian/SKILL.md +63 -0
- package/skills/c-research/SKILL.md +45 -0
- package/skills/c-screen/SKILL.md +55 -0
- package/skills/c-secrets/SKILL.md +62 -0
- package/skills/c-slack/SKILL.md +46 -0
- package/skills/c-social/SKILL.md +57 -0
- package/skills/c-speakers/SKILL.md +59 -0
- package/skills/c-system/SKILL.md +72 -0
- package/skills/c-tasks/SKILL.md +60 -0
- package/skills/c-telegram/SKILL.md +66 -0
- package/skills/c-tracking/SKILL.md +46 -0
- package/skills/c-video/SKILL.md +56 -0
- 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,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 };
|
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
|