← Back to Skills Marketplace
netanel-abergel

Heleni Meetings

by Netanel Abergel · GitHub ↗ · v1.0.0 · MIT-0
cross-platform ⚠ suspicious
89
Downloads
0
Stars
0
Active Installs
1
Versions
Install in OpenClaw
/install heleni-meetings
Description
All-in-one meetings skill. Section 1: Schedule a meeting by coordinating with another PA, finding free slots, and sending a calendar invite. Section 2: Paste...
README (SKILL.md)

Meetings Skill

Minimum Model

Any model. For timezone reasoning or complex scheduling constraints, use a medium model.

Trigger Phrases

  • "schedule a meeting" / "set up a meeting with X" / "book a call with Y"
  • "summarize meeting notes" / "take notes" / "action items from meeting" / "extract tasks from this transcript"

Section 1 — Schedule a Meeting

End-to-end meeting coordination: find availability, contact the other PA, book the calendar invite.

Step 1 — Understand the Request

Before acting, confirm:

  • Who to meet with
  • Duration (default: 30 min if not specified)
  • Timeframe ("this week", "next week", "mornings only", etc.)
  • Meeting type (video, in-person, phone)

If the request is vague (e.g. "set up a call with Jane") → ask one clarifying question before proceeding.


Step 2 — Find the Other PA

Check data/pa-directory.json:

python3 -c "
import json, sys
try:
    with open('data/pa-directory.json') as f:
        d = json.load(f)
except FileNotFoundError:
    print('ERROR: data/pa-directory.json not found')
    sys.exit(1)

name = 'PERSON_NAME'  # replace with actual name
matches = [p for p in d.get('pas', []) if name.lower() in p['owner'].lower()]

if not matches:
    print('No PA found for:', name)
else:
    for p in matches:
        print('PA:', p['name'], '| Phone:', p['phone'])
"

If no PA found → skip to Step 4 and contact the person directly by email.


Step 3 — Check Owner's Availability

#!/bin/bash
TODAY=$(date -u +%Y-%m-%dT%H:%M:%SZ)
NEXT_WEEK=$(date -u -d '+7 days' +%Y-%m-%dT%H:%M:%SZ 2>/dev/null \
  || date -u -v+7d +%Y-%m-%dT%H:%M:%SZ)

[email protected] gog calendar events primary \
  --from "$TODAY" \
  --to "$NEXT_WEEK" \
  2>/dev/null \
  | python3 -c "
import sys, json
try:
    events = json.load(sys.stdin)
except:
    events = []

print('Upcoming events:')
for e in sorted(events, key=lambda x: x.get('start', {}).get('dateTime', '')):
    start = e.get('start', {}).get('dateTime', '')[:16].replace('T', ' ')
    print(' ', start, '—', e.get('summary', 'Untitled'))
"

Find free slots automatically:

#!/usr/bin/env python3
import subprocess, json, sys
from datetime import datetime, timedelta, timezone

OWNER_EMAIL = "[email protected]"  # replace
DURATION_MIN = 30
DAYS_AHEAD = 7
WORK_START_HOUR = 9
WORK_END_HOUR = 18

try:
    result = subprocess.run(
        ['gog', 'calendar', 'events', 'primary',
         '--from', datetime.now(timezone.utc).isoformat(),
         '--to', (datetime.now(timezone.utc) + timedelta(days=DAYS_AHEAD)).isoformat()],
        env={'GOG_ACCOUNT': OWNER_EMAIL, 'PATH': '/usr/bin:/usr/local/bin:/bin'},
        capture_output=True, text=True, timeout=30
    )
    events = json.loads(result.stdout) if result.stdout.strip() else []
except Exception as e:
    print("Could not fetch calendar:", e)
    sys.exit(1)

busy = []
for e in events:
    start = e.get('start', {}).get('dateTime')
    end = e.get('end', {}).get('dateTime')
    if start and end:
        busy.append((start, end))

suggestions = []
for day_offset in range(1, DAYS_AHEAD + 1):
    day = datetime.now(timezone.utc) + timedelta(days=day_offset)
    if day.weekday() >= 5:
        continue
    for hour in range(WORK_START_HOUR, WORK_END_HOUR):
        slot_start = day.replace(hour=hour, minute=0, second=0, microsecond=0)
        slot_end = slot_start + timedelta(minutes=DURATION_MIN)
        if slot_end.hour > WORK_END_HOUR:
            continue
        conflict = any(
            slot_start.isoformat() \x3C b[1] and slot_end.isoformat() > b[0]
            for b in busy
        )
        if not conflict:
            suggestions.append(slot_start)
        if len(suggestions) >= 5:
            break
    if len(suggestions) >= 5:
        break

if not suggestions:
    print("No slots found in the next 7 days during working hours.")
else:
    print(f"Available {DURATION_MIN}-min slots:")
    for s in suggestions:
        print(" •", s.strftime('%A %b %d'), "at", s.strftime('%H:%M'), "UTC")

Step 4 — Contact the Other PA

Propose 3–5 specific slots:

"Hey [PA Name], [your owner] would like to meet [their owner] for [duration].
Slots that work:
• [Day Date] at [HH:MM TZ]
• [Day Date] at [HH:MM TZ]
• [Day Date] at [HH:MM TZ]
Do any work? Or what times work best?"

If no response within 2 hours on a business day → follow up once. If still no response after 4 hours → tell owner and suggest direct contact.


Step 5 — Book the Meeting

Once both sides agree:

[email protected] gog calendar create primary \
  --summary "Meeting: [Owner A] + [Owner B]" \
  --start "YYYY-MM-DDTHH:MM:SS+00:00" \
  --end "YYYY-MM-DDTHH:MM:SS+00:00" \
  --attendees "[email protected]" \
  --description "Scheduled via PA coordination"

For video calls, add:

  --description "Video call: https://meet.google.com/xxx-xxxx-xxx"

Step 6 — Confirm Both Sides

To your owner:
"✅ Done — [Date] at [Time] with [Person]. Calendar invite sent."

To the other PA:
"✅ Invite sent to [Their Owner] for [Date] [Time]. Let me know if anything changes."

Quick Templates

Situation Template
Initial request "Hey [PA], [Owner A] wants to connect with [Owner B] for ~30 min [this/next] week. What works?"
Propose slots "Here are 3 options: [A], [B], [C]. Any work?"
Confirm "✅ Booked for [time]. Invite sent to [email]."
Reschedule "[Owner] can't make [time]. Can we try [alternative]?"
Cancel "[Owner] needs to cancel [time]. Apologies."

Rescheduling

# Find the event
[email protected] gog calendar events primary \
  --from "$(date -u +%Y-%m-%dT%H:%M:%SZ)" \
  --to "$(date -u -d '+14 days' +%Y-%m-%dT%H:%M:%SZ)"

# Delete old event (use ID from above)
[email protected] gog calendar delete primary EVENT_ID

# Re-coordinate and create new event

Section 2 — Meeting Notes & Action Items

Paste any meeting notes, transcript, or text → get a clean summary with action items, owners, and deadlines.

Response Format (MANDATORY — One Message Only)

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
📋 [MEETING TITLE] — [YYYY-MM-DD]
Duration: [X min] | Attendees: [Names]
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

SUMMARY
[2-3 sentence overview]

⚡ ACTION ITEMS ([X] of [Total])
1. [ ] @Owner: Task — Deadline
2. [ ] @Owner: Task — Deadline
3. [ ] @Owner: Task — Deadline

✅ KEY DECISIONS
• Decision 1
• Decision 2

📎 Saved: meeting-notes/YYYY-MM-DD_topic-name.md

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Add to your to-do list?
• "all" — Add all [X] items
• "1,2,4" — Add specific items
• "none" — Skip

Rules:

  • ONE message only — never split into multiple
  • Filename format: YYYY-MM-DD_topic.md (date first, always)
  • Always show numbered action items
  • Always include the to-do prompt if action items exist

What to Extract

Section Description
Summary 2-3 sentence overview
Action Items - [ ] @Owner: Task — Deadline
Decisions What was agreed upon
Open Questions Unresolved items
Next Steps What happens after this meeting

File Storage

Save all meeting notes to meeting-notes/YYYY-MM-DD_topic.md:

---
date: YYYY-MM-DD
title: Meeting Title
attendees: [Name1, Name2]
source: pasted notes | transcript | email
---

# Meeting Title

## Summary
[2-3 sentences]

## Action Items
- [ ] **@Owner**: Task description — *Deadline*

## Decisions
- Decision 1

## Open Questions
- Question 1

\x3Cdetails>
\x3Csummary>📝 Raw Notes\x3C/summary>
[Original input preserved]
\x3C/details>

To-Do List Integration

After extracting action items:

  • "all" → Add all items to todo.md
  • "1,3,5" → Add specific items
  • "none" → Skip

File: todo.md in workspace root. Organized by: Overdue → Due Today → This Week → No Deadline → Completed.

Referencing Previous Meetings

Ask things like:

  • "What did we decide about the budget?" → search meeting-notes/ Decisions sections
  • "What action items does @Sarah have?" → search for @Sarah across all files
  • "Show me last week's meetings" → list files from date range

Edge Cases

Situation Action
Very short notes Still extract what's there
No clear topic Ask: "What should I call this meeting?"
Multiple meetings in one paste Ask if they should be separated into files
Not meeting notes Still extract actionable items; adjust filename

Cost Tips

  • Scheduling: Cheap — any small model works for slot-finding and coordination.
  • Notes extraction: Medium model recommended for complex transcripts with many action items.
  • Batch: Propose 3–5 slots at once instead of one at a time.
  • Don't re-fetch calendar repeatedly — fetch once, extract 5 slots, propose them all.
Usage Guidance
This skill's instructions expect a local PA directory file and the 'gog' calendar CLI plus access to an owner's calendar, but the package metadata doesn't declare those requirements or how authentication is handled. Before installing or enabling it: (1) confirm whether your agent environment actually has the 'gog' tool and how it authenticates (service account, OAuth cached creds, etc.); (2) inspect data/pa-directory.json for PII and ensure you are comfortable the agent may read it; (3) ask the skill author to declare required binaries/env vars and to provide the missing Section 2 (transcript summarization) if you need it; (4) if you don't want the agent to autonomously create invites or follow up, restrict its permissions or disable autonomous invocation until you understand how it will send messages; and (5) test in a safe account first (no real calendar invites) to confirm behavior. These mismatches explain why the skill is suspicious rather than clearly benign.
Capability Analysis
Type: OpenClaw Skill Name: heleni-meetings Version: 1.0.0 The skill bundle provides legitimate functionality for scheduling meetings and summarizing notes. It uses a calendar CLI tool (referred to as 'gog') and standard Python/Bash scripts to manage availability and file storage, with no evidence of data exfiltration, obfuscation, or malicious intent in SKILL.md or the associated scripts.
Capability Assessment
Purpose & Capability
The skill claims to coordinate and book meetings and to summarize meeting notes, which is reasonable, but its runtime instructions call the 'gog' CLI and rely on a local data/pa-directory.json and an OWNER email address. The registry metadata declares no required binaries, no env vars, and no install — yet the instructions implicitly require the 'gog' command and authenticated access to an owner's calendar. That mismatch (no declared requirements but clear runtime requirements) is incoherent.
Instruction Scope
SKILL.md instructs the agent to read data/pa-directory.json (which may contain PII like phone numbers), list/fetch calendar events and create events via the 'gog' CLI, and perform follow-ups within hours. It also contains hardcoded placeholder OWNER_EMAIL values ([email protected]) without explaining where credentials or auth come from. The instructions do not specify how outbound communications (email/IM) are sent; they only give templates. Section 2 referenced in the skill description (summaries/actions from transcripts) is not present in the provided SKILL.md content, which is another inconsistency.
Install Mechanism
There is no install spec and no code files; that lowers risk because nothing in the package will be written to disk by an installer. However, the instructions still expect external tools (gog) to exist in the runtime environment.
Credentials
The skill declares no required environment variables or primary credential, but the instructions repeatedly use GOG_ACCOUNT and owner email addresses and run commands that require authenticated calendar access. The skill also reads a local pa-directory.json without declaring it. These undeclared secrets/credentials and local file access are disproportionate to the registry metadata and need explicit declaration and justification.
Persistence & Privilege
The skill does not request always:true or other elevated platform privileges and does not claim to modify other skills. It does instruct autonomous follow-ups (timed follow-up messages within business hours), but the skill's flags are default (user-invocable, model invocation allowed). That is normal, though you should be conscious that the agent could autonomously send calendar invites if it has credentials and the platform allows it.
How to Use
  1. Make sure OpenClaw is installed (local or Docker)
  2. Run the install command in chat: /install heleni-meetings
  3. After installation, invoke the skill by name or use /heleni-meetings
  4. Provide required inputs per the skill's parameter spec and get structured output
Version History
v1.0.0
Initial publish
Metadata
Slug heleni-meetings
Version 1.0.0
License MIT-0
All-time Installs 0
Active Installs 0
Total Versions 1
Frequently Asked Questions

What is Heleni Meetings?

All-in-one meetings skill. Section 1: Schedule a meeting by coordinating with another PA, finding free slots, and sending a calendar invite. Section 2: Paste... It is an AI Agent Skill for Claude Code / OpenClaw, with 89 downloads so far.

How do I install Heleni Meetings?

Run "/install heleni-meetings" in the OpenClaw or Claude Code chat to install it in one step — no extra setup required.

Is Heleni Meetings free?

Yes, Heleni Meetings is completely free, licensed under MIT-0. You can download, install and use it at no cost.

Which platforms does Heleni Meetings support?

Heleni Meetings is cross-platform and runs anywhere OpenClaw / Claude Code is available (cross-platform).

Who created Heleni Meetings?

It is built and maintained by Netanel Abergel (@netanel-abergel); the current version is v1.0.0.

💬 Comments