git clone https://github.com/Aradotso/trending-skills
T=$(mktemp -d) && git clone --depth=1 https://github.com/Aradotso/trending-skills "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/clawchief-openclaw-chief-of-staff" ~/.claude/skills/aradotso-trending-skills-clawchief-openclaw-chief-of-staff && rm -rf "$T"
T=$(mktemp -d) && git clone --depth=1 https://github.com/Aradotso/trending-skills "$T" && mkdir -p ~/.openclaw/skills && cp -r "$T/skills/clawchief-openclaw-chief-of-staff" ~/.openclaw/skills/aradotso-trending-skills-clawchief-openclaw-chief-of-staff && rm -rf "$T"
skills/clawchief-openclaw-chief-of-staff/SKILL.md--- 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
Key Scripts
todoist_cli.py
— Live Task Interface
todoist_cli.pyAll 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
ea_gmail.py# 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
ea_calendar.py# 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
sheet_helper.py# 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
bd_outreach.py# 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)
Source-of-Truth Files
These files are the policy layer. Edit them to match your operating model.
clawchief/priority-map.md
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
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
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
Skills
Copy skills to
~/.openclaw/skills/ and activate them in OpenClaw.
task-system-contract
skill
task-system-contractEncodes the shared rules for how tasks are created, triaged, and closed. Always load this skill when doing any task management work.
daily-task-prep
skill
daily-task-prepRuns the morning preparation sequence:
- Pull today's tasks from Todoist
- Check calendar for the day
- Surface blockers and P1 items
- Produce a prioritized briefing
executive-assistant
skill
executive-assistantHandles Gmail triage, calendar booking, and follow-up tracking using the helper scripts.
daily-task-manager
skill
daily-task-managerHandles mid-day and end-of-day task hygiene: closing completed tasks, rescheduling, and logging.
business-development
skill
business-developmentUses
bd_outreach.py and sheet_helper.py to manage pipeline, log touchpoints, and surface follow-ups.
Cron Jobs
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.md
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.md
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)
Migration: v2 → v3
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:
commands →gog
-backed helper scriptsgws
→ Todoist viaclawchief/tasks.mdtodoist_cli.py- raw cron prompts with embedded logic → thin prompts + skill-held logic
Running Tests
cd ~/.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
Common Patterns
Morning briefing (manual trigger)
openclaw run --skill daily-task-prep --prompt "Run morning prep."
Add a high-priority task from the command line
python ~/.openclaw/workspace/clawchief/scripts/todoist_cli.py \ add \ --content "Call Marcus re: renewal risk" \ --due today \ --priority p1 \ --project Work
Triage inbox on demand
openclaw run --skill executive-assistant --prompt "Triage inbox."
Compile durable lessons back into source-of-truth
openclaw run --skill executive-assistant \ --prompt "Compile lessons from today's meeting notes into clawchief/knowledge-compiler.md."
Troubleshooting
TODOIST_API_TOKEN
not found
TODOIST_API_TOKEN# Verify it's set echo $TODOIST_API_TOKEN # Load from .env if needed source ~/.openclaw/.env
gws
commands failing in helper scripts
gws# 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
Tasks not appearing after todoist_cli.py add
todoist_cli.py add- Confirm the project name matches exactly (case-sensitive)
- Check Todoist API token has write permissions
- Run with
flag:--debugpython todoist_cli.py add --debug ...
Cron jobs not firing
# 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 ...
Skills not loading
# 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/
Meeting notes not being ingested
- Check
policy file exists and is populatedclawchief/meeting-notes.md - Verify
is writableworkspace/memory/meeting-notes-state.json - Trigger manually:
openclaw run --skill executive-assistant --prompt "Ingest latest meeting notes per meeting-notes.md policy."
Design Principles (for AI agents)
- Never write live task state to markdown. All task mutations go through
.todoist_cli.py - Never call Gmail or Calendar APIs directly. Use
andea_gmail.py
.ea_calendar.py - Always check all calendars before booking — not just the primary calendar.
- Search Gmail at message level, not thread level, to avoid missing replies.
- Keep cron prompts short. Workflow logic belongs in skill files, not in prompt strings.
- Compile durable lessons into source-of-truth files, not into chat history.
- Use
policy before escalating ambiguous decisions to the user.auto-resolver.md
is a status file, not a workflow definition.workspace/HEARTBEAT.md