Files
qize 25971a4cb8 feat: add email and calendar skills with unified expression rules (#42)
* feat: unify email and calendar skill expression, point icloud setup at the CLI page

- tiered talk rules: product words allowed, implementation terms never
- PATH-first CLI resolution with bundled scripts/bin fallback
- zh trigger phrases and usage-scenario sections
- version + requires metadata in frontmatter
- icloud setup now opens the CLI's own configuration page; the app-center form
  it referenced was removed along with the icloud preset
- calendar CLI binaries carry the Cola-styled callback pages
- keep build artifacts out of the repository

* fix: address review findings on credentials, resolution and mailbox naming

- app passwords and authorization codes go to the secure local prompt, never
  into a chat message
- a PATH Himalaya reporting another version now falls back to the bundled
  v2.0.0 instead of leaving the skill unusable
- --save resolves the account's real Sent mailbox instead of assuming the alias
- proxy wording no longer implies OS settings are inherited automatically
- version moves under metadata so the frontmatter keeps only accepted top-level keys

* fix: run the bundled executable instead of whatever is on PATH

Now that these ship as plain skills there is no managed PATH entry, so PATH
could only ever resolve an unrelated build. Each skill resolves its own copy
under scripts/bin/<platform>/, determining the architecture with uname -m,
which also removes the version mismatch the previous rule could deadlock on.

* fix: apply the bundled-path and secret-input rules to the reference guides

The configuration guide still sent normal operations to a PATH himalaya and
forbade the packaged binary outright, contradicting the rule SKILL.md now sets
and breaking setup on a machine that only has the bundled copy. The generic
IMAP/SMTP guide also listed the credential among the values to ask for.

* fix: preserve icloud event fields on update, and close platform gaps in the guides

The iCloud CLI rebuilt the whole VEVENT on update, so changing a title dropped
the location, description, attendees, recurrence and alarms the stored resource
carried — a silent data loss the server reports as success. Update now fetches
the object, replaces only the requested properties and writes it back under the
same If-Match guard.

The guides also assumed Unix and macOS-or-Windows throughout: Linux has no
bundled build, PowerShell has no 'env -u', and '~/.himalayarc' belongs to the
v1 configuration family this skill rejects.

* fix: expand recurring iCloud instances, and correct platform and backend assumptions

The iCloud list query asked for raw calendar data, so a recurring event came
back as its master component and a weekly meeting was reported at its original
date whatever week was requested; the CalDAV report now expands occurrences
over the queried range.

The guides also resolved Windows binaries without their .exe suffix, promised
the Google account timezone under scopes that exclude settings, presented
events.update as interchangeable with patch, added Google attendees without
sendUpdates so nobody was invited, and pointed Graph mailboxes at SMTP-only
send commands.

* fix: drop the v1 config path entirely and normalize the gws.exe file mode

* fix: stop occurrence writes hitting whole series, page Outlook results, and notify guests

Expanding recurring occurrences made a new hazard reachable: every occurrence
carries the series' resource id, so editing one displayed instance rewrote the
series and deleting one cancelled every meeting in it. Both writes now refuse a
recurring resource and say why, and list marks which results are occurrences.

Outlook list follows Graph pagination instead of returning only the first page,
and moving an event with just a new start derives the end from its stored
duration rather than leaving the old one in place.

The Google guide now notifies guests on edits and cancellations, carries the
mandatory timezone in every agenda example, requires QQ's RFC 2971 ID exchange,
scopes the PowerShell proxy test to a child process, and stops three calendar
skills from claiming the same provider-neutral trigger phrase.

* fix: emit every expanded occurrence, and close the gaps the audit found

Expansion returns each occurrence as its own VEVENT inside one response, but
list emitted one record per response, so a weekly meeting appeared once and the
rest of the week's instances were missing. Each component is now split into a
self-contained calendar object.

The recurrence guard matched RRULE anywhere in the payload, which would have
locked a one-off event out of every write because its notes mentioned the word;
it now matches property lines. Moving an all-day Outlook event with only a new
start is refused rather than sent as a request Graph rejects. Adds tests for
splitting, the guard and the text-mention case, carries the timezone in the
agenda synopsis, and moves the disambiguation rule below the list it broke.

* fix: document the proxy variables the binary reads, and cover all-day and Meet cases

The pinned build resolves routes from all_proxy and https_proxy only; http_proxy
is never consulted, so a proxy supplied through it was silently ignored while
the guide promised otherwise. The PowerShell recipe also emptied the variables
rather than removing them, which is not the same signal to a client that checks
for presence.

The all-day guard added last round made the documented Outlook move flow stop
outright, and the attendee-notifying insert dropped the Meet link the canonical
example asks for. A custom domain no longer picks a provider guide by its name
alone — it is usually hosted elsewhere.
2026-08-20 20:41:00 +08:00
..