aboutsummaryrefslogtreecommitdiffstats
path: root/docs/superpowers/plans/2026-08-03-post-0.1.0-usability.md
diff options
context:
space:
mode:
authorDanilo M. <danix@danix.xyz>2026-09-18 14:29:48 +0200
committerDanilo M. <danix@danix.xyz>2026-09-18 14:29:48 +0200
commit7d4654536de5be4bd3555eb4b81a2e07c1d4148d (patch)
tree03ca3f3e14811d109ad4e9aafcf690ffd16c4a8b /docs/superpowers/plans/2026-08-03-post-0.1.0-usability.md
parent196bfaeefdbbbd2ff23dc2648e21ae86d41a57b6 (diff)
downloadqtmaildir-7d4654536de5be4bd3555eb4b81a2e07c1d4148d.tar.gz
qtmaildir-7d4654536de5be4bd3555eb4b81a2e07c1d4148d.zip
docs: add the contact completion implementation plan
Item 204, six tasks, no spec: the shape was settled with the user on 2026-09-18 rather than brainstormed, so the plan carries the four decisions itself (the config key, loading once, matching on name and address, and the four vCard fields that matter). No new dependency. libical is installed but its vCard parser is 4.0 and this machine has 3.0.20, and libicalvcal is the old vCalendar converter rather than a vCard reader, so four fields of a hand parse is proportionate. The measurements are in the plan because two of them change what a correct implementation looks like. Of 117 cards in the real store only 14 carry an address, so a short candidate list is right rather than broken, and a fixture where every card completes would not be representative. The store is unfolded, so the folded-card fixture is the one the real data could never have caught. The largest trap is one this repository has already paid for twice: QLineEdit::setCompleter() is unusable for a field holding a list, and a test written with setText() passes against that bug because setText does not drive a completer at all. The plan requires typed keys and a mutation check on the second-recipient case. The query bar half comes with a correction: querycompleter.cpp:652-656 says addresses need an enumerator libnotmuch does not expose, which stops being true for from: and to: the moment the store exists. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Diffstat (limited to 'docs/superpowers/plans/2026-08-03-post-0.1.0-usability.md')
-rw-r--r--docs/superpowers/plans/2026-08-03-post-0.1.0-usability.md7
1 files changed, 4 insertions, 3 deletions
diff --git a/docs/superpowers/plans/2026-08-03-post-0.1.0-usability.md b/docs/superpowers/plans/2026-08-03-post-0.1.0-usability.md
index 5380b32..30c0031 100644
--- a/docs/superpowers/plans/2026-08-03-post-0.1.0-usability.md
+++ b/docs/superpowers/plans/2026-08-03-post-0.1.0-usability.md
@@ -141,7 +141,7 @@ taking that too literally.
| 70 | Pane icons are a private set where the main window uses the system theme | presentation | M | **done** 2026-08-11; six shipped SVGs |
| 71 | A toolbar action does not sync, so the edit sits until the next cron run | workflow | S | **done** 2026-08-11; 2s default, `auto_sync_delay_ms` |
| 72 | No khard/khal integration | workflow | ? | **split 2026-09-18** into 204 (recipient completion), 205 (contact editing), 206 (calendar window) and 207 (invitations), after the user named what they want. Nothing is planned under this number any more; it stays as the index entry the notes' single line maps to. The edge-tts reminder half is out of scope: its own project |
-| 204 | No recipient completion, in the composer or the query bar | workflow | S | open, 2026-09-18, from 72's split and the user's own words: "I have to copy-paste the addresses for any new email from somewhere." Read-only over the 117 synced vcards. **Widened the same day at the user's request** to feed `from:`/`to:` in the query bar, which `QueryCompleter` completes with nothing today. Independent of 205, 206 and 207 and blocks none of them; the user starts here. **No brainstorm needed**, the shape is settled: see the entry |
+| 204 | No recipient completion, in the composer or the query bar | workflow | S | open, 2026-09-18, from 72's split and the user's own words: "I have to copy-paste the addresses for any new email from somewhere." Read-only over the 117 synced vcards. **Widened the same day at the user's request** to feed `from:`/`to:` in the query bar, which `QueryCompleter` completes with nothing today. Independent of 205, 206 and 207 and blocks none of them; the user starts here. **No brainstorm needed**, the shape is settled and the plan is written (`plans/2026-09-18-contact-completion.md`, six tasks, not started): see the entry |
| 205 | Contacts can be read but not edited from the app | workflow | M | open, 2026-09-18, from 72's split, **asked for by the user** while settling 204. Writing a vdir, so it shares the write-during-sync question with 206 and the fold/escape rules with 204's parser. Needs a brainstorm of its own |
| 206 | No calendar: events cannot be viewed, added or edited | workflow | L | open, 2026-09-18, from 72's split, **asked for by the user** in place of khal. Its own TOP-LEVEL WINDOW and **libical**, both settled by the user. Spec-and-branch scale, not a Tuesday pickup. Blocks 207 |
| 207 | An invitation cannot be accepted, refused or sent | workflow | M | open, 2026-09-18, from 72's split, **asked for by the user**: "as it is today I don't have a way of accepting an invitation." `text/calendar` in the pane, an iMIP reply through the existing `send_command`. **Blocked on 206**, which owns the calendar it writes to |
@@ -1682,8 +1682,9 @@ grammar, so it inserts a bare address rather than `Name <addr>`, and the value
goes through `SearchTerm::quote()` like everything else this application puts in
a query, since a display name can hold a space and a quote.
-**No brainstorm is needed for this item.** Four decisions were taken with the
-user on 2026-09-18 and are not open questions:
+**No brainstorm is needed for this item, and the plan is written**:
+`plans/2026-09-18-contact-completion.md`, six tasks. Four decisions were taken
+with the user on 2026-09-18 and are not open questions:
1. The path is a `[general]` key, defaulting to
`~/.local/share/vdirsyncer/contacts/`. Empty means the feature is off, with