{
  "schemaVersion": "1.0",
  "item": {
    "slug": "ical-cli",
    "name": "ical",
    "source": "tencent",
    "type": "skill",
    "category": "效率提升",
    "sourceUrl": "https://clawhub.ai/BRO3886/ical-cli",
    "canonicalUrl": "https://clawhub.ai/BRO3886/ical-cli",
    "targetPlatform": "OpenClaw"
  },
  "install": {
    "downloadMode": "redirect",
    "downloadUrl": "/downloads/ical-cli",
    "sourceDownloadUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=ical-cli",
    "sourcePlatform": "tencent",
    "targetPlatform": "OpenClaw",
    "installMethod": "Manual import",
    "extraction": "Extract archive",
    "prerequisites": [
      "OpenClaw"
    ],
    "packageFormat": "ZIP package",
    "includedAssets": [
      "SKILL.md",
      "references/commands.md",
      "references/dates.md"
    ],
    "primaryDoc": "SKILL.md",
    "quickSetup": [
      "Download the package from Yavira.",
      "Extract the archive and review SKILL.md first.",
      "Import or place the package into your OpenClaw setup."
    ],
    "agentAssist": {
      "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
      "steps": [
        "Download the package from Yavira.",
        "Extract it into a folder your agent can access.",
        "Paste one of the prompts below and point your agent at the extracted folder."
      ],
      "prompts": [
        {
          "label": "New install",
          "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete."
        },
        {
          "label": "Upgrade existing",
          "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run."
        }
      ]
    },
    "sourceHealth": {
      "source": "tencent",
      "status": "healthy",
      "reason": "direct_download_ok",
      "recommendedAction": "download",
      "checkedAt": "2026-04-30T16:55:25.780Z",
      "expiresAt": "2026-05-07T16:55:25.780Z",
      "httpStatus": 200,
      "finalUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=network",
      "contentType": "application/zip",
      "probeMethod": "head",
      "details": {
        "probeUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=network",
        "contentDisposition": "attachment; filename=\"network-1.0.0.zip\"",
        "redirectLocation": null,
        "bodySnippet": null
      },
      "scope": "source",
      "summary": "Source download looks usable.",
      "detail": "Yavira can redirect you to the upstream package for this source.",
      "primaryActionLabel": "Download for OpenClaw",
      "primaryActionHref": "/downloads/ical-cli"
    },
    "validation": {
      "installChecklist": [
        "Use the Yavira download entry.",
        "Review SKILL.md after the package is downloaded.",
        "Confirm the extracted package contains the expected setup assets."
      ],
      "postInstallChecks": [
        "Confirm the extracted package includes the expected docs or setup files.",
        "Validate the skill or prompts are available in your target agent workspace.",
        "Capture any manual follow-up steps the agent could not complete."
      ]
    },
    "downloadPageUrl": "https://openagent3.xyz/downloads/ical-cli",
    "agentPageUrl": "https://openagent3.xyz/skills/ical-cli/agent",
    "manifestUrl": "https://openagent3.xyz/skills/ical-cli/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/ical-cli/agent.md"
  },
  "agentAssist": {
    "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
    "steps": [
      "Download the package from Yavira.",
      "Extract it into a folder your agent can access.",
      "Paste one of the prompts below and point your agent at the extracted folder."
    ],
    "prompts": [
      {
        "label": "New install",
        "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete."
      },
      {
        "label": "Upgrade existing",
        "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run."
      }
    ]
  },
  "documentation": {
    "source": "clawhub",
    "primaryDoc": "SKILL.md",
    "sections": [
      {
        "title": "ical — CLI for macOS Calendar",
        "body": "A Go CLI that wraps macOS Calendar. Sub-millisecond reads via cgo + EventKit. Single binary, no dependencies at runtime."
      },
      {
        "title": "Installation",
        "body": "go install github.com/BRO3886/ical/cmd/ical@latest\n\nOr build from source:\n\ngit clone <repo-url> && cd ical\nmake build    # produces bin/ical"
      },
      {
        "title": "Quick Start",
        "body": "# List all calendars (shows sources, colors, types)\nical calendars\n\n# Create a new calendar\nical calendars create \"Projects\" --source iCloud --color \"#FF6961\"\n\n# Show today's agenda\nical today\n\n# List events this week\nical list --from today --to \"end of week\"\n\n# Add an event with natural language dates\nical add \"Team standup\" --start \"tomorrow at 9am\" --end \"tomorrow at 9:30am\" --calendar Work --alert 15m\n\n# Show event details (row number from last listing)\nical show 2\n\n# Delete an event (--force skips confirmation prompt, required in scripts/agents)\nical delete 2 --force\n\n# Search for events\nical search \"meeting\" --from \"30 days ago\" --to \"next month\"\n\n# Export events to ICS\nical export --format ics --from today --to \"in 30 days\" --output-file events.ics"
      },
      {
        "title": "Event CRUD",
        "body": "CommandAliasesDescriptionical addcreate, newCreate an eventical showget, infoShow full event detailsical updateeditUpdate event propertiesical deleterm, removeDelete an event"
      },
      {
        "title": "Event Views",
        "body": "CommandAliasesDescriptionical listls, eventsList events in a date rangeical today—Show today's eventsical upcomingnext, soonShow events in the next N days"
      },
      {
        "title": "Search & Export",
        "body": "CommandAliasesDescriptionical searchfindSearch events by title, location, notesical export—Export events to JSON, CSV, or ICSical import—Import events from JSON or CSV file"
      },
      {
        "title": "Calendar Management",
        "body": "CommandAliasesDescriptionical calendarsicalsList all calendarsical calendars createadd, newCreate a new calendarical calendars updateedit, renameUpdate a calendar (rename, recolor)ical calendars deleterm, removeDelete a calendar and all its events"
      },
      {
        "title": "Skills & Other",
        "body": "CommandAliasesDescriptionical skills install—Install ical agent skill for Claude Code / Codexical skills uninstall—Remove ical agent skillical skills status—Show skill installation statusical version—Print version and build infoical completion—Generate shell completions (bash/zsh/fish)\n\nFor full flag details on every command, see references/commands.md."
      },
      {
        "title": "Row Numbers",
        "body": "Event listings display row numbers (#1, #2, #3...) alongside events. These are cached to ~/.ical-last-list so you can reference them in subsequent commands:\n\nical list --from today --to \"next week\"   # Shows #1, #2, #3...\nical show 2                                # Show details for row #2\nical update 3 --title \"New title\"          # Update row #3\nical delete 1 --force                      # Delete row #1 (skip confirmation)\nical delete 1                              # Delete row #1 (prompts for confirmation)\n\nRow numbers reset each time you run a list/today/upcoming command. With no arguments, show, update, and delete launch an interactive picker instead."
      },
      {
        "title": "Event ID flag (for scripts and agents)",
        "body": "When you have a full event ID (from -o json output), use --id for exact lookup with no prefix matching:\n\n# Get event ID from JSON output\nEVENT_ID=$(ical today -o json | jq -r '.[0].id')\n\n# Use --id for reliable exact lookup\nical show --id \"$EVENT_ID\"\nical update --id \"$EVENT_ID\" --title \"New title\"\nical delete --id \"$EVENT_ID\" --force\n\nImportant for scripting:\n\nical delete prompts for interactive confirmation by default. Always pass --force (or -f) when running non-interactively. There is no --confirm flag.\nical update does not require confirmation and has no --force flag — just run it directly with the flags you want to change.\n--id and a positional argument are mutually exclusive — passing both returns an error."
      },
      {
        "title": "Natural Language Dates",
        "body": "Date flags (--from, --to, --start, --end, --due) accept natural language:\n\nical list --from today --to \"next friday\"\nical add \"Lunch\" --start \"tomorrow at noon\" --end \"tomorrow at 1pm\"\nical search \"standup\" --from \"2 weeks ago\"\nical upcoming --days 14\n\nSupported patterns: today, tomorrow, next monday, in 3 hours, eod, eow, this week, 5pm, mar 15, 2 days ago, and more. See references/dates.md for the full list."
      },
      {
        "title": "Interactive Mode",
        "body": "The add and update commands support -i for guided form-based input:\n\nical add -i        # Multi-page form: title, calendar, dates, location, recurrence\nical update 2 -i   # Pre-filled form with current event values\n\nThe show, update, and delete commands accept 0 arguments to launch an interactive event picker:\n\nical show          # Pick from upcoming events\nical delete        # Pick an event to delete"
      },
      {
        "title": "Output Formats",
        "body": "All read commands support -o / --output:\n\ntable (default) — formatted table with borders and color\njson — machine-readable JSON (ISO 8601 dates)\nplain — simple text, one item per line\n\nThe NO_COLOR environment variable and --no-color flag are respected."
      },
      {
        "title": "Recurrence",
        "body": "Events can repeat with flexible rules:\n\n# Daily standup\nical add \"Standup\" --start \"tomorrow at 9am\" --repeat daily\n\n# Every 2 weeks on Mon and Wed\nical add \"Team sync\" --start \"next monday at 10am\" --repeat weekly --repeat-interval 2 --repeat-days mon,wed\n\n# Monthly for 6 months\nical add \"Review\" --start \"mar 1 at 2pm\" --repeat monthly --repeat-count 6\n\n# Yearly until a date\nical add \"Anniversary\" --start \"jun 15\" --repeat yearly --repeat-until \"2030-06-15\"\n\nUse --repeat none on update to remove recurrence. Use --span future to update/delete this and all future occurrences."
      },
      {
        "title": "Alerts",
        "body": "Add reminders before an event with the --alert flag (repeatable):\n\nical add \"Meeting\" --start \"tomorrow at 2pm\" --alert 15m          # 15 minutes before\nical add \"Flight\" --start \"mar 15 at 8am\" --alert 1h --alert 1d   # 1 hour + 1 day before\n\nSupported units: m (minutes), h (hours), d (days)."
      },
      {
        "title": "Daily review",
        "body": "ical today                                 # See today's agenda\nical upcoming --days 1                     # Same as today\nical list --from today --to \"end of week\"  # Rest of the week"
      },
      {
        "title": "Weekly planning",
        "body": "ical upcoming --days 7                           # Full week view\nical add \"Planning\" --start \"monday at 9am\" -i  # Add events interactively"
      },
      {
        "title": "Scripting with JSON output",
        "body": "# Count today's events\nical today -o json | jq 'length'\n\n# Get titles of upcoming events\nical upcoming -o json | jq -r '.[].title'\n\n# Find events on a specific calendar\nical list --from today --to \"in 30 days\" --calendar Work -o json | jq '.[].title'\n\n# List calendar names (field is \"title\", not \"name\")\nical calendars -o json | jq -r '.[].title'\n\n# Get calendar IDs and names\nical calendars -o json | jq -r '.[] | \"\\(.id) \\(.title)\"'\n\nCalendar JSON fields: id, title, type, color, source, readOnly\nEvent JSON fields: id, title, start_date, end_date, calendar, calendar_id, location, notes, url, all_day, recurrence, alerts"
      },
      {
        "title": "Backup and restore",
        "body": "# Export all events from the past year\nical export --from \"12 months ago\" --to \"in 12 months\" --format json --output-file backup.json\n\n# Export as ICS for other calendar apps\nical export --from today --to \"in 6 months\" --format ics --output-file events.ics\n\n# Import from backup\nical import backup.json --calendar \"Restored\""
      },
      {
        "title": "Public Go API",
        "body": "For programmatic access to macOS Calendar, use go-eventkit directly:\n\nimport \"github.com/BRO3886/go-eventkit/calendar\"\n\nclient, _ := calendar.New()\nevents, _ := client.Events(from, to, calendar.WithCalendarName(\"Work\"))\nevent, _ := client.CreateEvent(calendar.CreateEventInput{\n    Title:        \"Team Meeting\",\n    StartDate:    start,\n    EndDate:      end,\n    CalendarName: \"Work\",\n})\n\nSee go-eventkit docs for the full API surface."
      },
      {
        "title": "Limitations",
        "body": "macOS only — requires EventKit framework via cgo\nNo attendee management — attendees and organizer are read-only (Apple limitation)\nSubscribed/birthday calendars are read-only — cannot create events on these\nEvent IDs are calendar-scoped — the UUID prefix before : is the calendar ID, not event-specific. Use row numbers or the interactive picker instead of raw IDs"
      }
    ],
    "body": "ical — CLI for macOS Calendar\n\nA Go CLI that wraps macOS Calendar. Sub-millisecond reads via cgo + EventKit. Single binary, no dependencies at runtime.\n\nInstallation\ngo install github.com/BRO3886/ical/cmd/ical@latest\n\n\nOr build from source:\n\ngit clone <repo-url> && cd ical\nmake build    # produces bin/ical\n\nQuick Start\n# List all calendars (shows sources, colors, types)\nical calendars\n\n# Create a new calendar\nical calendars create \"Projects\" --source iCloud --color \"#FF6961\"\n\n# Show today's agenda\nical today\n\n# List events this week\nical list --from today --to \"end of week\"\n\n# Add an event with natural language dates\nical add \"Team standup\" --start \"tomorrow at 9am\" --end \"tomorrow at 9:30am\" --calendar Work --alert 15m\n\n# Show event details (row number from last listing)\nical show 2\n\n# Delete an event (--force skips confirmation prompt, required in scripts/agents)\nical delete 2 --force\n\n# Search for events\nical search \"meeting\" --from \"30 days ago\" --to \"next month\"\n\n# Export events to ICS\nical export --format ics --from today --to \"in 30 days\" --output-file events.ics\n\nCommand Reference\nEvent CRUD\nCommand\tAliases\tDescription\nical add\tcreate, new\tCreate an event\nical show\tget, info\tShow full event details\nical update\tedit\tUpdate event properties\nical delete\trm, remove\tDelete an event\nEvent Views\nCommand\tAliases\tDescription\nical list\tls, events\tList events in a date range\nical today\t—\tShow today's events\nical upcoming\tnext, soon\tShow events in the next N days\nSearch & Export\nCommand\tAliases\tDescription\nical search\tfind\tSearch events by title, location, notes\nical export\t—\tExport events to JSON, CSV, or ICS\nical import\t—\tImport events from JSON or CSV file\nCalendar Management\nCommand\tAliases\tDescription\nical calendars\ticals\tList all calendars\nical calendars create\tadd, new\tCreate a new calendar\nical calendars update\tedit, rename\tUpdate a calendar (rename, recolor)\nical calendars delete\trm, remove\tDelete a calendar and all its events\nSkills & Other\nCommand\tAliases\tDescription\nical skills install\t—\tInstall ical agent skill for Claude Code / Codex\nical skills uninstall\t—\tRemove ical agent skill\nical skills status\t—\tShow skill installation status\nical version\t—\tPrint version and build info\nical completion\t—\tGenerate shell completions (bash/zsh/fish)\n\nFor full flag details on every command, see references/commands.md.\n\nKey Concepts\nRow Numbers\n\nEvent listings display row numbers (#1, #2, #3...) alongside events. These are cached to ~/.ical-last-list so you can reference them in subsequent commands:\n\nical list --from today --to \"next week\"   # Shows #1, #2, #3...\nical show 2                                # Show details for row #2\nical update 3 --title \"New title\"          # Update row #3\nical delete 1 --force                      # Delete row #1 (skip confirmation)\nical delete 1                              # Delete row #1 (prompts for confirmation)\n\n\nRow numbers reset each time you run a list/today/upcoming command. With no arguments, show, update, and delete launch an interactive picker instead.\n\nEvent ID flag (for scripts and agents)\n\nWhen you have a full event ID (from -o json output), use --id for exact lookup with no prefix matching:\n\n# Get event ID from JSON output\nEVENT_ID=$(ical today -o json | jq -r '.[0].id')\n\n# Use --id for reliable exact lookup\nical show --id \"$EVENT_ID\"\nical update --id \"$EVENT_ID\" --title \"New title\"\nical delete --id \"$EVENT_ID\" --force\n\n\nImportant for scripting:\n\nical delete prompts for interactive confirmation by default. Always pass --force (or -f) when running non-interactively. There is no --confirm flag.\nical update does not require confirmation and has no --force flag — just run it directly with the flags you want to change.\n--id and a positional argument are mutually exclusive — passing both returns an error.\nNatural Language Dates\n\nDate flags (--from, --to, --start, --end, --due) accept natural language:\n\nical list --from today --to \"next friday\"\nical add \"Lunch\" --start \"tomorrow at noon\" --end \"tomorrow at 1pm\"\nical search \"standup\" --from \"2 weeks ago\"\nical upcoming --days 14\n\n\nSupported patterns: today, tomorrow, next monday, in 3 hours, eod, eow, this week, 5pm, mar 15, 2 days ago, and more. See references/dates.md for the full list.\n\nInteractive Mode\n\nThe add and update commands support -i for guided form-based input:\n\nical add -i        # Multi-page form: title, calendar, dates, location, recurrence\nical update 2 -i   # Pre-filled form with current event values\n\n\nThe show, update, and delete commands accept 0 arguments to launch an interactive event picker:\n\nical show          # Pick from upcoming events\nical delete        # Pick an event to delete\n\nOutput Formats\n\nAll read commands support -o / --output:\n\ntable (default) — formatted table with borders and color\njson — machine-readable JSON (ISO 8601 dates)\nplain — simple text, one item per line\n\nThe NO_COLOR environment variable and --no-color flag are respected.\n\nRecurrence\n\nEvents can repeat with flexible rules:\n\n# Daily standup\nical add \"Standup\" --start \"tomorrow at 9am\" --repeat daily\n\n# Every 2 weeks on Mon and Wed\nical add \"Team sync\" --start \"next monday at 10am\" --repeat weekly --repeat-interval 2 --repeat-days mon,wed\n\n# Monthly for 6 months\nical add \"Review\" --start \"mar 1 at 2pm\" --repeat monthly --repeat-count 6\n\n# Yearly until a date\nical add \"Anniversary\" --start \"jun 15\" --repeat yearly --repeat-until \"2030-06-15\"\n\n\nUse --repeat none on update to remove recurrence. Use --span future to update/delete this and all future occurrences.\n\nAlerts\n\nAdd reminders before an event with the --alert flag (repeatable):\n\nical add \"Meeting\" --start \"tomorrow at 2pm\" --alert 15m          # 15 minutes before\nical add \"Flight\" --start \"mar 15 at 8am\" --alert 1h --alert 1d   # 1 hour + 1 day before\n\n\nSupported units: m (minutes), h (hours), d (days).\n\nCommon Workflows\nDaily review\nical today                                 # See today's agenda\nical upcoming --days 1                     # Same as today\nical list --from today --to \"end of week\"  # Rest of the week\n\nWeekly planning\nical upcoming --days 7                           # Full week view\nical add \"Planning\" --start \"monday at 9am\" -i  # Add events interactively\n\nScripting with JSON output\n# Count today's events\nical today -o json | jq 'length'\n\n# Get titles of upcoming events\nical upcoming -o json | jq -r '.[].title'\n\n# Find events on a specific calendar\nical list --from today --to \"in 30 days\" --calendar Work -o json | jq '.[].title'\n\n# List calendar names (field is \"title\", not \"name\")\nical calendars -o json | jq -r '.[].title'\n\n# Get calendar IDs and names\nical calendars -o json | jq -r '.[] | \"\\(.id) \\(.title)\"'\n\n\nCalendar JSON fields: id, title, type, color, source, readOnly Event JSON fields: id, title, start_date, end_date, calendar, calendar_id, location, notes, url, all_day, recurrence, alerts\n\nBackup and restore\n# Export all events from the past year\nical export --from \"12 months ago\" --to \"in 12 months\" --format json --output-file backup.json\n\n# Export as ICS for other calendar apps\nical export --from today --to \"in 6 months\" --format ics --output-file events.ics\n\n# Import from backup\nical import backup.json --calendar \"Restored\"\n\nPublic Go API\n\nFor programmatic access to macOS Calendar, use go-eventkit directly:\n\nimport \"github.com/BRO3886/go-eventkit/calendar\"\n\nclient, _ := calendar.New()\nevents, _ := client.Events(from, to, calendar.WithCalendarName(\"Work\"))\nevent, _ := client.CreateEvent(calendar.CreateEventInput{\n    Title:        \"Team Meeting\",\n    StartDate:    start,\n    EndDate:      end,\n    CalendarName: \"Work\",\n})\n\n\nSee go-eventkit docs for the full API surface.\n\nLimitations\nmacOS only — requires EventKit framework via cgo\nNo attendee management — attendees and organizer are read-only (Apple limitation)\nSubscribed/birthday calendars are read-only — cannot create events on these\nEvent IDs are calendar-scoped — the UUID prefix before : is the calendar ID, not event-specific. Use row numbers or the interactive picker instead of raw IDs"
  },
  "trust": {
    "sourceLabel": "tencent",
    "provenanceUrl": "https://clawhub.ai/BRO3886/ical-cli",
    "publisherUrl": "https://clawhub.ai/BRO3886/ical-cli",
    "owner": "BRO3886",
    "version": "0.6.0",
    "license": null,
    "verificationStatus": "Indexed source record"
  },
  "links": {
    "detailUrl": "https://openagent3.xyz/skills/ical-cli",
    "downloadUrl": "https://openagent3.xyz/downloads/ical-cli",
    "agentUrl": "https://openagent3.xyz/skills/ical-cli/agent",
    "manifestUrl": "https://openagent3.xyz/skills/ical-cli/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/ical-cli/agent.md"
  }
}