Repository navigation
feat(calendar): task CRUD + deterministic action-item extraction (ODIAA-2329) - #32
Merged
Merged
Conversation
…AA-2329) Adds VTODO task list/create/update through a trimmed, vendored calendar_tasks Experiment API (cal.manager/CalTodo), surfaced consistently across extension routes, CLI (`tb tasks`), and MCP tools, plus a deterministic (no LLM) action-item extractor for turning an email body into a checklist (`tb action-items`). Every new write path is access-controlled behind a default-false `tasksWrite` switch. Live-smoke-tested against a real, isolated Thunderbird instance (separate profile/port, --no-remote) per the required manual verification, which surfaced and fixed two real bugs in the Experiment API glue that the unit tests couldn't catch since they don't exercise real cal.manager objects: - `calIDateTime.getInTimezone(...).jsDate` is unreliable (always undefined) on any date handed back by the storage calendar after an adoptItem/ modifyItem round-trip; switched to reading `nativeTime` directly. - The WebExtension schema layer normalizes optional `CalendarTaskProperties` fields the caller didn't set to `null`, not `undefined`, so the partial-update logic's `!== undefined` checks were spuriously true for every field on every update — wiping title/priority and resetting due dates on updates that only meant to change one field. Checks now use `!= null`. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Resolves conflicts from ODIAA-2328 (calendar events CRUD + clash detection) landing on main after this branch's tasks CRUD + action-item extraction work, across access control, background.js route handlers, MCP tool catalog, tests, and docs. Tool count reconciled to 31; all test suites (quick, extension, mcp, docs) pass. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
calendar_tasksExperiment API (cal.manager/CalTodo), per the CEO's Option-A vendoring decision.POST /tasks/list|create|update), CLI (tb tasks list|create|update), MCP tools (task_list,task_create,task_update).POST /messages/:id/action-items,tb action-items <id>,email_action_items(MCP).falsetasksWriteaccess switch, classified inextension/src/access-control.jsand documented indocs/ACCESS-CONTROL.md/access.example.json.strict_max_versionleft at the required155.*ceiling.Live smoke test (required manual verification)
Ran against a real, isolated Thunderbird instance — separate profile,
--no-remote, separate bridge port (7800/7801), signature checks disabled locally only for this test — with realcal.managerstorage-calendar internals, not mocks:This surfaced and fixed two real bugs the unit tests can't catch (they don't exercise real
cal.managerobjects):calIDateTime.getInTimezone(...).jsDateis unreliable (alwaysundefined) on any date handed back by the storage calendar after anadoptItem/modifyItemround-trip — even for a correctly-set date. Switched to readingnativeTime(epoch microseconds) directly.CalendarTaskPropertiesfields tonull, notundefined— so the partial-update logic's!== undefinedchecks were spuriously true for every field on everyupdate()call, silently wipingtitle/priorityand resettingdueon updates that only meant to touch one field (e.g.--completed). Checks now use!= null.action-itemswasn't exercised live (this bare smoke-test profile has no mail account/messages to extract from) — covered instead by the 29 dedicated unit tests plus the access-control suite.Test plan
npm test(57/57),node --test test/access-control.test.mjs(80/80),node --test test/action-items.test.mjs(29/29) all passcal.managerinternals (isolated profile/port) — see abovestrict_max_versionunchanged at155.*🤖 Generated with Claude Code