aboutsummaryrefslogtreecommitdiff
Commit message (Collapse)AuthorAgeFilesLines
* chore(theme-studio): track WIP.json instead of ignoring itCraig Jennings2 days2-3/+11919
|
* chore(todo): sync child task priorities to their parentsCraig Jennings4 days1-3/+3
| | | | The cleanup pass bumped three child priority cookies up to match their parents (down-only).
* chore(todo): file org-lint follow-ups as a taskCraig Jennings4 days1-0/+5
|
* wip(theme): snapshot WIP theme and daneel palette draftCraig Jennings4 days2-156/+531
|
* chore(todo): group tasks into module projects and document statusesCraig Jennings4 days1-1869/+1889
| | | | I consolidated the loose top-level tasks under module "Open Work" parents for every module with four or more (Theme-Studio, Music, AI), and left tasks that already had subtasks as standalone projects. I marked the top-level container tasks PROJECT, top level only and never deeper, and demoted three PROJECT headings that were buried below the top level back to TODO. The priority scheme now documents every status keyword (TODO, PROJECT, DOING, WAITING, VERIFY, STALLED, DELEGATED, DONE, CANCELLED, FAILED), with PROJECT spelled out as a top-level container. I also routed the studio table-consistency task in from the roam inbox.
* feat(ui-navigation): split from the dashboard opens scratch, not the dashboardCraig Jennings4 days2-4/+40
| | | | C-x 2 / C-x 3 already show the dashboard in the new window while point stays put. The one dead spot was splitting from the dashboard itself, which put the dashboard in both panes. Now the new window shows *scratch* when the current buffer is the dashboard, and the dashboard everywhere else. I pulled the choice into a pure predicate (cj/--split-from-dashboard-p) and a companion helper, both tested.
* refactor(system-utils): remove the *scratch* background tintCraig Jennings4 days2-59/+2
| | | | I dropped the buffer-local face remap that lightened the *scratch* background 5% above the theme default. Scratch now uses the plain theme background like every other buffer. The startup hook still moves the cursor to end-of-scratch. Only the tint call, its two helpers, the defcustom, the color require, and the now-orphaned test go.
* docs(messenger): add the per-app keybinding alphabet to the unification specCraig Jennings4 days2-3/+141
| | | | | | I added a "Global Prefix Keybinding Alphabet" section to the messenger-unification spec. The per-app C-; prefix is a third keybinding surface, separate from the in-buffer chords (C-c C-c / C-c C-k / C-c C-a) and decision 6's cross-app verbs. Today the action leaf under each app is ad hoc: the same key means different things in Slack, Signal, Telega, and ERC. The section spells out the canonical actions, shows the inconsistency as a matrix, and proposes one leaf alphabet across all four, with the core seven verbs as the unifiable floor and the richer verbs as optional per-backend extensions. I also added a smoke-first parity note to Phase 1 (build the controllable signel replacement to the capability floor, not its ceiling) and promoted the todo task to [#A] "Unify Signel and All Messengers into one UX" with a direct link to the spec.
* feat(keybindings): mirror the C-; command family under C-c ;Craig Jennings5 days3-1/+46
| | | | C-; is GUI-only: terminals can't encode Control-semicolon, so the whole custom command family (calendar, AI, Slack, org, pearl, jump, and the rest) was unreachable in a terminal frame (emacs -nw, emacsclient -nw, or Emacs inside vterm/tmux). I bound the single cj/custom-keymap under C-c ; alongside C-;, so the same leaf keys reach the identical map in both GUI and TTY with no relearning and no per-module edits. C-c is the standard user prefix and always TTY-encodable. I audited every leaf key in the family and they're all TTY-safe (letters, digits, punctuation, SPC, and arrow keys), so nothing needed remapping.
* fix(theme-studio): open the palette collapsed to base colorsCraig Jennings5 days4-0/+30
| | | | The studio opened with every column's span tints expanded, so the first view was crowded with colors the user hadn't asked to see. I set paletteShowFull to false in initApp, so the palette opens showing one tile per column and the existing arrow control expands the spans. The flip lives in the boot path rather than the module default, so the palette gates keep their full-palette baseline. The two that assert span tiles (#counttest, #paltoggletest) now opt into full mode explicitly. A new #paldefaulttest gate asserts the opening collapsed state.
* fix(theme-studio): make the color picker stand out from the pageCraig Jennings5 days4-3/+46
| | | | The picker panel's background (#161412) sat a few shades off the page background (#0d0b0a), so it was hard to tell apart from the page. I gave it the studio's gold accent border (#e8bd30) and lifted the background to #1f1c19, both already used in the toolbar chrome, so the panel reads as a distinct surface. The #pickertest gate asserts the accent border and a per-channel background lift of at least 12 over the page, so the distinction can't quietly regress.
* feat(theme-studio): add gnus as a view packageCraig Jennings5 days6-3/+105
| | | | mu4e renders the open message with gnus, so the article-view headers, quote levels, signature, and inline emphasis are all gnus faces, not mu4e ones. gnus ships them as bright greens on a dark background, and the theme had no way to reach them. I added gnus as a bespoke view package: the article-view face set in face_data.py with palette seeds that mirror the mu4e header treatment, a realistic preview (header block, emphasized body, an 11-level quoted reply chain, signature), and a #gnustest gate that asserts every emitted face is a real gnus face. Theming and exporting gnus in the studio retires the green in the live view.
* fix(theme-studio): redesign the mu4e preview as a realistic headers listCraig Jennings5 days3-30/+76
| | | | The old mu4e preview was cramped and referenced faces that aren't in the mu4e inventory (mu4e-moved-face, mu4e-attach-number-face, mu4e-cited-1..7, mu4e-compose-header-face), so those rendered unthemed. I rebuilt it as a realistic mu4e screen: a status bar, a column header, and one row per message state (unread, replied, flagged, forwarded, draft, trashed, related) with the current line on the highlight background, then a compact message view and the compose separator. It now exercises all 27 mu4e inventory faces and only those. The new #mupreviewtest gate asserts every data-face is a real mu4e face.
* chore(todo): file the mu4e-theming visual VERIFYCraig Jennings5 days1-0/+6
| | | | Fix shipped in 56d105f0; visual sign-off lives under Manual testing and validation.
* fix(mail): theme mu4e buffers via a shared font-lock exclusionCraig Jennings5 days4-1/+77
| | | | mu4e paints its header lines, main menu, and view headers with manual `face' text properties. Global font-lock stripped them, so the buffers rendered unthemed, the same failure the dashboard hit. I extracted the dashboard's one-off exclusion into a shared, additive cj/exclude-from-global-font-lock helper in system-lib and repointed the dashboard to it. Then I excluded mu4e-headers-mode, mu4e-main-mode, and mu4e-view-mode. The view body renders through gnus's own washing rather than font-lock, so excluding it is safe.
* chore(todo): close the markdown-preview task, file the visual VERIFYCraig Jennings5 days1-0/+8
| | | | Built and shipped in 0682b24f. Visual sign-off lives under Manual testing and validation.
* feat(theme-studio): realistic README preview for markdown-modeCraig Jennings5 days4-4/+123
| | | | markdown-mode fell back to the generic preview (bare face names). I added renderMarkdownPreview, a realistic README that exercises the markdown faces in context: front matter, headers, bold/italic, inline and fenced code, links, lists and checkboxes, a blockquote with a footnote, a table, strikethrough, highlight, math, and inline HTML. A PREVIEW_KEYS map in app_inventory routes markdown-mode to the renderer, and the #mdtest gate checks every data-face it emits is a real markdown face.
* fix(theme-studio): scope the view-nav arrow style under .pkgbarCraig Jennings5 days2-6/+8
| | | | The generic .pkgbar button rule outweighed my .viewnav rule on specificity, so the arrows rendered at default button size. Scoping the rule under .pkgbar wins the cascade and restores the compact arrow size.
* chore(todo): drop the false-alarm empty-preview-packages taskCraig Jennings5 days1-2/+0
| | | | Craig confirmed alert does have elements, so the dropped-packages task was a false alarm.
* feat(theme-studio): prev/next arrows to step the view dropdownCraig Jennings5 days7-4/+91
| | | | I added left and right arrow buttons flanking the view dropdown. They step the selection to the previous or next item and re-render the faces table and preview, so you can walk the list without reopening the dropdown. A pure stepViewIndex helper clamps the index to the option range, no wrap. stepView sets the selection and calls onViewChange.
* chore(todo): close the contrast-cell compaction taskCraig Jennings5 days1-3/+2
| | | | Resolved by 9e99749d. Dated-rewrote the VERIFY to a log entry.
* feat(theme-studio): move the contrast verdict into a hoverCraig Jennings5 days5-4/+71
| | | | The contrast column showed "5.4 PASS". The number's color already encodes the tier (green AAA, grey AA, red fail), so the PASS/FAIL word was redundant. I dropped it and put the WCAG meaning in the cell's hover via a pure contrastTitle helper. crHtml now renders just the colored number. verdictFor stays for the covered-overlay worst-case readout, which is unchanged.
* chore(todo): file two studio tasks from the roam inboxCraig Jennings5 days1-0/+4
| | | | Routed two emacs/studio captures: move the clear-palette button, and drop dropdown packages with no preview elements. Both need design or a criterion from Craig before implementing.
* feat(theme-studio): mark per-face setting boxes that differ from defaultCraig Jennings5 days6-4/+140
| | | | A non-default height looks identical to the default in the size input, so a stray 1.1 hides in plain sight. I added a small gold corner flag on any per-face setting cell (fg, bg, style, inherit, size, box) whose value differs from the face's seed default. A pure faceBoxNonDefaults helper computes the per-box flags. buildPkgTable resolves fg/bg to hex before comparing, so a palette-name-vs-hex difference doesn't read as a change.
* chore(todo): file buffer-differs 4-way-prompt feature from the roam inboxCraig Jennings5 days1-0/+2
| | | | Routed an emacs-owned roam capture into Open Work. Needs design (which prompt, diff-then-return loop) before it's implementable.
* chore(todo): close the alphabetize-assignment-dropdown taskCraig Jennings5 days1-3/+2
| | | | Resolved by afd2ddad. Dated-rewrote the VERIFY to a log entry per the todo format.
* feat(theme-studio): alphabetize packages in the assignment dropdownCraig Jennings5 days5-14/+57
| | | | The assignment-view dropdown listed package faces in APPS build order (bespoke apps first, then inventory). generate.py builds them that way, so the list wasn't alphabetical. I added a pure appViewKeysSorted helper that orders the app keys by display label, and buildViewSel uses it. The @code and @ui editor entries above the divider are unchanged.
* chore(todo): dashboard icons (Cause C) done, reframe item-color as ↵Craig Jennings5 days1-2/+6
| | | | | | theme-studio work Cause C (per-filetype file icons) is fixed and committed. Cause B reframed per Craig: items already default to fg, coloring routes through theme-studio (task 2418), no hardcoded hex. Filed a visual-verify VERIFY.
* feat(dashboard): per-filetype icons on the list itemsCraig Jennings5 days1-0/+1
| | | | I enabled dashboard-set-file-icons so the project, bookmark, and recent-file rows show nerd-icons file icons, colored per filetype. They render now that the dashboard is out of global font-lock, which was stripping the icon faces too. Bookmarks fall back to a generic icon since there's no filetype to map.
* chore(todo): mark dashboard font-lock fix (Cause A) doneCraig Jennings5 days1-0/+20
| | | | Cause A of the dashboard-theming task is fixed and committed. Causes B (item color, themeable not hardcoded) and C (enable file/section icons, per-filetype color) stay open.
* fix(dashboard): exclude dashboard-mode from global font-lockCraig Jennings5 days2-0/+44
| | | | | | The dashboard banner title and section headings render in the default face instead of their theme colors. The faces are defined correctly. Global font-lock fontifies the dashboard buffer and strips the `face' text properties dashboard sets by hand: it owns `face' and clears props it didn't apply. Items and the navigator survive because their color rides a dashboard-items-face overlay, which font-lock leaves alone. Excluding dashboard-mode from global font-lock keeps the banner and heading faces. I set it at top level so it applies regardless of the use-package body.
* chore(todo): close gptel string-model crash, file dedup + manual-test follow-upsCraig Jennings5 days1-1/+12
| | | | Closed the gptel-switch-backend bug (fixed this session). Filed a VERIFY for the dedup decision (keep switch-backend or fold into change-model) and a manual-test VERIFY for the C-; a B interactive check.
* fix(ai-config): intern model in gptel-switch-backend (modeline hang)Craig Jennings5 days3-2/+76
| | | | | | cj/gptel-switch-backend set gptel-model to the raw completing-read string. gptel's modeline code calls symbolp on gptel-model and signals wrong-type-argument on a string, which surfaces as a redisplay hang (reachable from C-; a B). The sibling command cj/gptel-change-model already interns. This one didn't. I added a pure cj/gptel--model-to-symbol helper (mirroring cj/gptel--model-to-string) and route the model through it before the setq. The existing switch-backend test asserted the buggy string value. It now asserts a symbol plus an explicit symbolp guard.
* chore(todo): resolve :next: sweep — fixes closed, rest parked as VERIFYCraig Jennings5 days1-7/+7
| | | | Close the tasks fixed this session and park the rest as VERIFY with what's needed (fixture / measurement / design pick / confirm). Child-priority sync bumps, lint mechanical fixes, and PROPERTIES-drawer repairs from the wrap-up cleanup.
* build: add task-sorted target to archive resolved todo tasksCraig Jennings5 days2-45/+49
| | | | make task-sorted wraps todo-cleanup.el --archive-done, moving DONE/CANCELLED level-2 subtrees from Open Work into Resolved. Ran it: archived this session's closed tasks.
* chore(todo): park remaining :next: tasks as VERIFY with next-stepsCraig Jennings5 days1-12/+24
| | | | deploy-wip (mechanism), calendar-sync x2 (need .ics fixture), org-roam refile (measurement-first), dashboard icons (font approach), transcription (focused pass), music faces (theme-side colours), music tests (audit session), alphabetize + sort-newest (focused studio pass), compact-contrast (clarify intent), fullscreen-terminal (confirm gesture). Each carries what I need or the plan.
* refactor(theme-studio): drop the too-similar-colors warning boxCraig Jennings5 days6-57/+9
| | | | The warning box under the palette wasn't useful there; the same ΔE info is reachable per-chip via the nearest-ΔE tooltip and inline contrast. Remove renderPaletteWarnings, the #palwarn element, its CSS, and the #deltatest gate. paletteWarnings still runs for the per-chip nearest distance.
* chore(todo): park cannot-reassign-fg as VERIFY (need exact repro)Craig Jennings5 days1-1/+2
|
* chore(todo): close C-s C-s vertico-repeat (verified live)Craig Jennings5 days1-1/+3
|
* feat(system-utils): tint the *scratch* background a shade lighterCraig Jennings5 days3-3/+62
| | | | A buffer-local face remap lightens the *scratch* default background by cj/scratch-background-lighten percent (default 5) so it reads as the scratch buffer, applied on emacs-startup-hook. The colour math is display-dependent (verified live); the pure helper's guard contract is unit-tested.
* chore(todo): park input-needed/large :next: tasks as VERIFYCraig Jennings5 days1-6/+12
| | | | native-comp re-enable (stability judgment), stale-elpa-gptel (needs the gptel-magit dep resolved), org-agenda theme-studio app (multi-phase feature), dirvish hard-delete (confirm key + dangerous sudo rm -rf), remove system-power keys (confirm which to keep), face-consistency check (needs a spec). Each carries what I need from Craig.
* fix(vertico): Page-Up/Down scroll the candidate list, not historyCraig Jennings5 days2-8/+14
| | | | <next>/<prior> weren't bound in vertico-map, so in a long completing-read they fell through and selected-then-dismissed the list. Bind them to vertico-scroll-up / vertico-scroll-down.
* fix(custom-comments): heavy-box interiors are valid commentsCraig Jennings5 days3-42/+54
| | | | The heavy-box empty and text lines began with a bare decoration char, so in line-comment languages (elisp, Python) C-; C h injected syntax-breaking lines. Prefix the interiors with the comment char and suffix them like cj/--comment-box does. Add the missing min-length guard so small or negative widths error cleanly instead of failing inside make-string. Updated the two characterization assertions to the corrected output.
* fix(dirvish): mark-all-visible no longer skips every other fileCraig Jennings5 days5-379/+372
| | | | dired-mark advances point itself, so the loop's extra forward-line skipped every other file (and could mark a directory). Use dired-get-filename + file-directory-p with an if/else: a marked file line advances once via dired-mark, non-file/directory lines advance manually. Replaces the regex line predicate (retired with its mock test) with a real-Dired marked-count test.
* chore(todo): fix doubled :next: tag on music extract-facesCraig Jennings5 days1-87/+58
|
* chore(todo): close the no-approvals batch tasks, archive resolvedCraig Jennings5 days1-64/+74
| | | | Mark the 12 batch fixes DONE (eww, prog electric-pair/line-numbers, auth-config, system-defaults, prog-go, eshell, split-window, dashboard keys, undo-kill-buffer, ai-term, Signal launcher, groundPair) with their commit refs, then archive all newly-resolved subtrees into Resolved.
* refactor(ui-config): drop buffer-state cursor coloringCraig Jennings5 days4-260/+11
| | | | A cursor that changed color by buffer state was confusing. Remove cj/set-cursor-color-according-to-mode, its two cache defvars, and the post-command / server-after-make-frame hook registrations; the cursor now uses the theme cursor face. The cj/buffer-status-state / cj/buffer-status-color classifier stays in user-constants.el for the modeline buffer-name indicator. Delete the cursor-function integration test; keep the classifier tests.
* chore(todo): archive resolved tasksCraig Jennings5 days1-36/+34
|
* chore(todo): close audit fixes, file roam captures, note gptel deferCraig Jennings5 days1-5/+22
| | | | Close reconcile-open-repos and dupre-theme-test-failures (the latter moot since dupre was retired and its test file deleted). File four roam-inbox studio/music captures. Note on the stale-elpa-gptel task that deleting the elpa copy standalone introduces a gptel-magit activation warning, so it must be paired with the gptel-magit dependency fix.
* test(ai-term): stub default-direction in display-rule testCraig Jennings5 days1-1/+1
| | | | Same fragility as the sibling tests: it stubbed env-laptop-p (now unused by the direction logic) and passed only because the batch frame is landscape. Stub the direction directly.