From aradotso-trending-skills-37
Transforms OpenClaw into chief-of-staff OS with Todoist task management, Python scripts for Gmail/Calendar/Sheets automation, and cron workflows. For founder daily task orchestration.
npx claudepluginhub joshuarweaver/cascade-ai-ml-agents-misc-1 --plugin aradotso-trending-skills-37This skill uses the workspace's default tool permissions.
```markdown
Guides Next.js Cache Components and Partial Prerendering (PPR) with cacheComponents enabled. Implements 'use cache', cacheLife(), cacheTag(), revalidateTag(), static/dynamic optimization, and cache debugging.
Guides building MCP servers enabling LLMs to interact with external services via tools. Covers best practices, TypeScript/Node (MCP SDK), Python (FastMCP).
Generates original PNG/PDF visual art via design philosophy manifestos for posters, graphics, and static designs on user request.
---
name: clawchief-openclaw-chief-of-staff
description: Turn OpenClaw into a founder/chief-of-staff operating system with Todoist-backed tasks, Gmail/Calendar automation, and deterministic cron workflows
triggers:
- set up clawchief
- configure openclaw chief of staff
- automate my daily tasks with clawchief
- integrate todoist with openclaw
- set up executive assistant workflow
- clawchief cron jobs
- migrate clawchief v2 to v3
- clawchief helper scripts
---
# clawchief: OpenClaw Chief of Staff Operating System
> Skill by [ara.so](https://ara.so) — Daily 2026 Skills collection.
`clawchief` is an opinionated starter kit that turns [OpenClaw](https://openclaw.dev) into a founder/chief-of-staff OS. It separates prioritization policy, resolution policy, live task state (Todoist), and recurring orchestration (cron) into discrete, composable layers.
---
## Architecture Overview
clawchief/ ├── priority-map.md # What matters and why ├── auto-resolver.md # How to resolve ambiguous decisions ├── meeting-notes.md # Meeting-note ingestion policy ├── location-awareness.md # Place-based task curation ├── knowledge-compiler.md # System compilation / linting policy ├── task-system-acceptance.md ├── scripts/ │ ├── todoist_cli.py # Live task system interface │ ├── ea_gmail.py # Gmail helper │ ├── ea_calendar.py # Calendar helper │ ├── sheet_helper.py # Google Sheets helper │ └── bd_outreach.py # Business development outreach └── tests/
skills/ ├── task-system-contract/ # Shared task rules ├── executive-assistant/ ├── business-development/ ├── daily-task-manager/ └── daily-task-prep/
workspace/ ├── HEARTBEAT.md # Thin recurring orchestration doc ├── TOOLS.md # Local environment details └── memory/ └── meeting-notes-state.json
cron/ └── jobs.template.json
**Core design principle:** live task state lives in Todoist, not in markdown files. Google workflows go through `gws`-backed helper scripts, not raw API calls.
---
## Installation
### Prerequisites
- OpenClaw installed and configured
- `gws` (Google Workspace CLI) set up
- Todoist account with API token
- Python 3.10+
### Step-by-step
```bash
# 1. Clone the repo
git clone https://github.com/snarktank/clawchief
cd clawchief
# 2. Copy skills into OpenClaw
cp -r skills/* ~/.openclaw/skills/
# 3. Copy source-of-truth and workspace files
cp -r clawchief/ ~/.openclaw/workspace/clawchief/
cp -r workspace/ ~/.openclaw/workspace/
# 4. Set your Todoist API token
echo 'TODOIST_API_TOKEN=your_token_here' >> ~/.openclaw/.env
# or export it in your shell profile:
export TODOIST_API_TOKEN="your_token_here"
# 5. Customize your environment
$EDITOR ~/.openclaw/workspace/TOOLS.md
# 6. Set up gws for Google Workspace access
# Follow SETUP-GWS.md in the repo
# 7. Create cron jobs from the template
cat cron/jobs.template.json # review, then install with your cron manager
# 8. Run the install checklist
cat INSTALL-CHECKLIST.md
todoist_cli.py — Live Task InterfaceAll live task operations go through this script. It is the only canonical interface to the task system.
# clawchief/scripts/todoist_cli.py usage patterns
import subprocess
def run_todoist(args: list[str]) -> str:
result = subprocess.run(
["python", "clawchief/scripts/todoist_cli.py"] + args,
capture_output=True, text=True
)
return result.stdout
# List tasks in a project
print(run_todoist(["list", "--project", "Work"]))
# Add a task
print(run_todoist(["add", "--content", "Review Q2 OKRs", "--due", "today", "--priority", "p1"]))
# Complete a task by ID
print(run_todoist(["complete", "--id", "12345678"]))
# List tasks due today
print(run_todoist(["list", "--filter", "today"]))
Direct Python usage (import pattern):
import os
from todoist_api_python.api import TodoistAPI
api = TodoistAPI(os.environ["TODOIST_API_TOKEN"])
# Get all tasks due today
tasks = api.get_tasks(filter="today")
for task in tasks:
print(f"[{task.priority}] {task.content} — due {task.due}")
# Add a task
new_task = api.add_task(
content="Prepare board update",
due_string="tomorrow",
priority=2, # p2
project_id="your_project_id"
)
print(f"Created: {new_task.id} — {new_task.content}")
# Complete a task
api.close_task(task_id="12345678")
ea_gmail.py — Gmail Helper# clawchief/scripts/ea_gmail.py usage
# Uses gws under the hood — do not call Gmail APIs directly
import subprocess
def gmail_search(query: str) -> str:
"""Search at message level, not thread level."""
result = subprocess.run(
["python", "clawchief/scripts/ea_gmail.py", "search", "--query", query],
capture_output=True, text=True
)
return result.stdout
# Always search at message level
results = gmail_search("from:partner@example.com subject:contract after:2026/04/01")
print(results)
# Draft a reply
subprocess.run([
"python", "clawchief/scripts/ea_gmail.py",
"draft-reply",
"--message-id", "msg_abc123",
"--body", "Thanks for reaching out. I'll review and follow up by EOD."
])
ea_calendar.py — Calendar Helper# clawchief/scripts/ea_calendar.py usage
# Checks ALL relevant calendars before suggesting a booking
import subprocess
def check_availability(date: str, duration_minutes: int = 60) -> str:
result = subprocess.run(
[
"python", "clawchief/scripts/ea_calendar.py",
"check-availability",
"--date", date,
"--duration", str(duration_minutes)
],
capture_output=True, text=True
)
return result.stdout
# Always check all calendars before booking
slots = check_availability("2026-04-10", duration_minutes=45)
print(slots)
# Book a meeting
subprocess.run([
"python", "clawchief/scripts/ea_calendar.py",
"book",
"--title", "1:1 with Sarah",
"--date", "2026-04-10",
"--time", "14:00",
"--duration", "45",
"--attendees", "sarah@example.com"
])
sheet_helper.py — Google Sheets# clawchief/scripts/sheet_helper.py usage
import subprocess
def append_row(spreadsheet_id: str, sheet_name: str, row: list) -> None:
subprocess.run([
"python", "clawchief/scripts/sheet_helper.py",
"append",
"--spreadsheet-id", spreadsheet_id,
"--sheet", sheet_name,
"--values", ",".join(str(v) for v in row)
])
# Log an outreach touchpoint
append_row(
spreadsheet_id=os.environ["BD_SHEET_ID"],
sheet_name="Outreach",
row=["2026-04-08", "Acme Corp", "intro email sent", "sarah@acme.com"]
)
bd_outreach.py — Business Development# clawchief/scripts/bd_outreach.py usage
import subprocess
# Log a new outreach contact
subprocess.run([
"python", "clawchief/scripts/bd_outreach.py",
"log",
"--company", "Acme Corp",
"--contact", "sarah@acme.com",
"--stage", "intro",
"--notes", "Met at SaaStr, strong fit for enterprise tier"
])
# List follow-ups due this week
result = subprocess.run(
["python", "clawchief/scripts/bd_outreach.py", "followups", "--due", "this_week"],
capture_output=True, text=True
)
print(result.stdout)
These files are the policy layer. Edit them to match your operating model.
clawchief/priority-map.md# Priority Map
## P1 — Revenue and retention
- Customer escalations
- Closing deals in final stage
- Renewal risks
## P2 — Team unblocking
- Decisions that are blocking >1 person
- Hiring decisions in final round
## P3 — Strategic
- OKR reviews
- Partner development
## P4 — Operational
- Recurring admin
- Reporting
clawchief/auto-resolver.md# Auto-Resolver Policy
When ambiguity arises, resolve with:
1. Does the priority-map clearly rank one option higher? → take the higher-ranked action.
2. Does the action affect a P1 stakeholder (customer, investor, key hire)? → escalate before acting.
3. Is the decision reversible within 24 hours? → act and log it.
4. Otherwise → surface to the user before proceeding.
clawchief/task-system-acceptance.md# Task System Acceptance Criteria
- Every task has: content, project, priority (p1–p4), due date
- "Inbox" project is triaged daily
- Completed tasks are closed in Todoist, not moved to a markdown file
- No live task state lives in markdown
Copy skills to ~/.openclaw/skills/ and activate them in OpenClaw.
task-system-contract skillEncodes the shared rules for how tasks are created, triaged, and closed. Always load this skill when doing any task management work.
daily-task-prep skillRuns the morning preparation sequence:
executive-assistant skillHandles Gmail triage, calendar booking, and follow-up tracking using the helper scripts.
daily-task-manager skillHandles mid-day and end-of-day task hygiene: closing completed tasks, rescheduling, and logging.
business-development skillUses bd_outreach.py and sheet_helper.py to manage pipeline, log touchpoints, and surface follow-ups.
cron/jobs.template.json defines deterministic recurring triggers. Keep prompts short — workflow logic lives in skills, not in cron.
[
{
"id": "morning-prep",
"schedule": "0 7 * * 1-5",
"prompt": "Run daily-task-prep skill.",
"skill": "daily-task-prep"
},
{
"id": "eod-close",
"schedule": "0 17 * * 1-5",
"prompt": "Run daily-task-manager EOD close.",
"skill": "daily-task-manager"
},
{
"id": "inbox-triage",
"schedule": "0 9,13 * * 1-5",
"prompt": "Triage Gmail inbox using executive-assistant skill.",
"skill": "executive-assistant"
},
{
"id": "bd-followups",
"schedule": "0 8 * * 1",
"prompt": "Surface BD follow-ups due this week.",
"skill": "business-development"
}
]
Install cron jobs (example with system cron):
# Convert jobs.template.json to actual crontab entries
python -c "
import json, sys
with open('cron/jobs.template.json') as f:
jobs = json.load(f)
for job in jobs:
print(f\"{job['schedule']} openclaw run --skill {job['skill']} --prompt '{job['prompt']}'\")
" >> /tmp/claw_cron.txt
crontab -l > /tmp/existing_cron.txt
cat /tmp/existing_cron.txt /tmp/claw_cron.txt | crontab -
workspace/HEARTBEAT.mdKeep this file thin. It is a pointer to cron jobs, not a workflow definition.
# Heartbeat
Recurring work is owned by cron jobs defined in `cron/jobs.template.json`.
This file records the last known healthy state:
- Last morning-prep: 2026-04-08 07:00
- Last inbox-triage: 2026-04-08 13:00
- Last eod-close: 2026-04-07 17:00
- Last bd-followup run: 2026-04-07 08:00
workspace/TOOLS.mdReplace all placeholders with your real environment details.
# Tools
## Task system
- Provider: Todoist
- API token env var: TODOIST_API_TOKEN
- Default project for inbox: Inbox
- Default project for work tasks: Work
## Google Workspace
- gws profile: personal
- Primary calendar: your.email@gmail.com
- Secondary calendars: team-calendar-id, personal-calendar-id
## Sheets
- BD pipeline sheet: (set BD_SHEET_ID env var)
## Email
- Primary inbox: your.email@gmail.com
- Signature footer: (your name / title)
If you used the older clawchief/tasks.md model:
# 1. Export existing tasks to Todoist
python clawchief/scripts/todoist_cli.py import-from-markdown \
--file ~/.openclaw/workspace/clawchief/tasks.md \
--project "Migrated"
# 2. Archive the old file
mv ~/.openclaw/workspace/clawchief/tasks.md \
~/.openclaw/workspace/clawchief/archive/tasks-v2-backup.md
# 3. Replace workspace/tasks/current.md with deprecation pointer
echo "# Deprecated\nLive tasks now in Todoist. See clawchief/scripts/todoist_cli.py." \
> ~/.openclaw/workspace/tasks/current.md
# 4. Update skills — remove any skill referencing tasks.md directly
grep -r "tasks.md" ~/.openclaw/skills/ # find and update references
# 5. Install new skills
cp -r skills/* ~/.openclaw/skills/
Key behavioral changes in v3:
gog commands → gws-backed helper scriptsclawchief/tasks.md → Todoist via todoist_cli.pycd ~/.openclaw/workspace/clawchief
python -m pytest clawchief/tests/ -v
# Run a specific test
python -m pytest clawchief/tests/test_todoist_cli.py -v
# Check that all source-of-truth files are present and well-formed
python -m pytest clawchief/tests/test_pack_alignment.py -v
openclaw run --skill daily-task-prep --prompt "Run morning prep."
python ~/.openclaw/workspace/clawchief/scripts/todoist_cli.py \
add \
--content "Call Marcus re: renewal risk" \
--due today \
--priority p1 \
--project Work
openclaw run --skill executive-assistant --prompt "Triage inbox."
openclaw run --skill executive-assistant \
--prompt "Compile lessons from today's meeting notes into clawchief/knowledge-compiler.md."
TODOIST_API_TOKEN not found# Verify it's set
echo $TODOIST_API_TOKEN
# Load from .env if needed
source ~/.openclaw/.env
gws commands failing in helper scripts# Verify gws is authenticated
gws auth status
# Re-authenticate if needed
gws auth login
# Check which profile the scripts expect
grep "gws" ~/.openclaw/workspace/TOOLS.md
todoist_cli.py add--debug flag: python todoist_cli.py add --debug ...# Check crontab is installed
crontab -l | grep openclaw
# Check openclaw is on PATH for cron
which openclaw
# Add full path to crontab if needed
# e.g.: 0 7 * * 1-5 /usr/local/bin/openclaw run --skill daily-task-prep ...
# Verify skills are in the right location
ls ~/.openclaw/skills/
# Expected skills:
# task-system-contract/
# executive-assistant/
# business-development/
# daily-task-manager/
# daily-task-prep/
# Each skill directory must contain SKILL.md
ls ~/.openclaw/skills/daily-task-prep/
clawchief/meeting-notes.md policy file exists and is populatedworkspace/memory/meeting-notes-state.json is writableopenclaw run --skill executive-assistant --prompt "Ingest latest meeting notes per meeting-notes.md policy."todoist_cli.py.ea_gmail.py and ea_calendar.py.auto-resolver.md policy before escalating ambiguous decisions to the user.workspace/HEARTBEAT.md is a status file, not a workflow definition.