aboutsummaryrefslogtreecommitdiff
path: root/docs
Commit message (Collapse)AuthorAgeFilesLines
* docs(theme-studio): reconcile stale spec prose with resolved decisionsCraig Jennings17 hours1-9/+23
| | | | Round-3 Codex review flagged one blocker: summary/readiness/risk text still described the superseded contracts (native color capture, build-inventory.el, dual dir-row sources). Reconciled the Scope tiers, For-the-implementer summary, legend source paragraph, three readiness dimensions, and the Risks section to match the resolved decisions. No decision changed, only the lagging prose. Findings 10/10, decisions 6/6, Ready pending go.
* docs(theme-studio): incorporate round-2 spec-review into nerd-icons specCraig Jennings18 hours1-12/+75
| | | | Folded the six round-2 Codex blockers into the spec. Added the explicit 13-row v1 legend table and the missing-key rule. Settled dir-color precedence (the dir advice prepends nerd-icons-yellow, so it wins) and cross-package ownership (the bespoke pane owns only nerd-icons faces; nerd-icons-completion-dir-face stays in its own app). Named the concrete legend artifact and its failure behavior, reordered into an atomic assign-then-drop-tint phase, and added a contract-by-contract test plan. Findings 9/9, decisions 6/6. Ready pending go.
* docs(theme-studio): render real nerd-icons glyphs in the legend (v1)Craig Jennings18 hours1-9/+14
| | | | Flipped the legend-rendering decision: v1 draws the actual nerd-font glyph in its assigned color rather than a swatch + label. The deferral rested on an unverified font dependency; Nerd Fonts are installed system-wide, so Chrome renders the glyphs from a font-family rule with no @font-face or font file. Monospace fallback for absent fonts; the gate asserts the glyph char and inline color.
* docs(theme-studio): incorporate spec-review into nerd-icons colors specCraig Jennings18 hours1-22/+58
| | | | Folded the three blocking Codex findings into the spec. Added the legend data contract (row schema, per-category sources, v1 scope). Corrected the native-color seed to ride the existing default-face pipeline rather than a new build-inventory.el capture that would double-seed. Resolved all six decisions. Spec is Ready pending Craig's go.
* docs(theme-studio): spec theme-driven nerd-icons colors + filetype legendCraig Jennings19 hours1-0/+157
| | | | Drafts the spec to drop the runtime nerd-icons tint (so icon color is theme-driven) and add a theme-studio filetype-legend representation over the 34 nerd-icons-* color faces. Five decisions left open for review: color model, legend scope, seed source, config sequencing, and the dir advice. Filed the cross-linked task in todo.org.
* chore(ai): archive gptel and remove it from the live configCraig Jennings21 hours4-3110/+0
| | | | | | | | | | I archived gptel to archive/gptel/ since I rarely use it. Moved there: the six gptel modules (ai-config, ai-conversations, ai-conversations-browser, ai-mcp, ai-quick-ask, ai-rewrite), the gptel-tools/ directory, custom/gptel-prompts.el, their test files and utilities, and the four gptel-only specs. Scrubbed from the live config: the ai-config require in init.el, which also drops the whole C-; a keymap; the gptel-mode emojify hook in font-config.el; the gptel-tools entries in the Makefile clean target and the coverage runner; and the gptel feature notes in README. Cancelled the open gptel tasks in todo.org (the AI Open Work issues, the feature-extension brainstorm, the velox gptel-magit bug). ai-term stays. It is the ghostel Claude launcher, independent of gptel. Verified: every module loads, a batch init launch reaches completion clean, and the full test suite shows only pre-existing coverage failures unrelated to this change.
* docs(theme-studio): draft completion-preview specCraig Jennings21 hours1-0/+211
| | | | A single inventory-composed "minibuffer completion" preview entry: a vanilla baseline always shown, a container radio plus modifier checkboxes selecting the completion stack, a two-family model (default/Vertico vs Ivy). Discoverability rides the preview-locate feature it depends on. Draft only, not yet ready to build: open implementation-readiness blockers remain.
* feat(theme-studio): locate preview elements by hover and clickCraig Jennings21 hours1-34/+237
| | | | | | | | Hovering a data-face preview element shows its section, face, and effective value in the preview-label info line, and the element's title carries the full record: effective fg/bg plus a per-attribute source note (direct, inherited-from-X, default, or cleared-rendering-as-default). Clicking an on-pane element scrolls to and flashes its assignment row. Off-pane and cross-surface elements stay hover-only. A single owner-qualified registry keyed by {owner, face} backs both data-face surfaces, package and UI, so the same face name under two owners never collides. The pure helpers in app-core.js take all state as arguments and return data. The one stateful adapter, previewSpan, lives in previews.js and emits the escaped markup. os() stays a package-owner wrapper over previewSpan, and a unified locateClick dispatcher replaces the per-surface click branches. Covered by test-locate.mjs and four new browser gates. Full harness green.
* docs: add VAMP standalone music-player designCraig Jennings2 days1-0/+340
|
* docs: explain native-comp vs primitive-mocking, refine the insightCraig Jennings4 days1-0/+159
| | | | A reference for the native-comp + subr-mocking trap: the mechanism, the three failure modes, the research with URLs, and the decision (variadic mocks + a meta-test now, migrate off primitive-mocking long-term). Refines the CLAUDE.md codified insight, whose old 'don't mock subrs' framing was too broad, and points it at the new doc.
* fix: load games-config via the malyon hook, not an autoload chainCraig Jennings4 days1-1/+1
| | | | | | | | The previous deferral (03d8b587) autoloaded malyon to games-config, but games-config doesn't define malyon. It leaves the command to the malyon package, so M-x malyon loaded games-config, found malyon still undefined, and errored "Autoloading games-config.el failed to define function malyon". Emacs won't chain through a second autoload. malyon and 2048-game autoload their own commands via package.el, so games-config should never own them. init.el now loads games-config via (with-eval-after-load 'malyon ...), and games-config just sets malyon-stories-directory when malyon loads. M-x malyon loads the package as a real command, then games-config applies its config. The earlier batch check loaded the files by hand and missed the autoload failure. The new test resolves the autoload the way M-x does (autoload-do-load), so the real path is covered now.
* refactor: defer games-config behind autoloads (load-graph Phase 4)Craig Jennings4 days1-1/+1
| | | | | | init.el eagerly required games-config at startup just to configure two on-demand game packages. package.el already autoloads malyon and 2048-game, so the eager require bought nothing but the one setting the module adds (malyon-stories-directory). init.el now autoloads malyon and 2048-game to games-config instead of requiring it. The first game command loads the module, which configures then loads the package. Startup no longer touches games-config, and both the commands and the stories-directory setting still work. This is the first module of the Phase 4 low-risk batch.
* docs(messenger): add the per-app keybinding alphabet to the unification specCraig Jennings8 days1-0/+138
| | | | | | 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.
* docs: spec the theme-studio preview-locate feature; file org-agenda app taskCraig Jennings9 days1-0/+148
| | | | Spec the general preview interaction: hover any element for its section/face/value, click a current-pane element to flash and jump to its assignment row, off-pane elements hover-only via a derived face->owning-app registry that previews also read for cross-pane live rendering. Decisions 5/5 settled. File the locate feature and the dependent org-agenda app (break the agenda faces out of the org-mode pane into their own, with a representative week-agenda preview) as tasks; org-agenda depends on the locate feature.
* feat(face-diagnostic): Phase 4 render, command, and init wiringCraig Jennings9 days1-2/+2
| | | | Phase 4 completes the face/font diagnostic. cj/describe-face-at-point renders cj/--face-diagnosis-at into a read-only *Face Diagnosis* buffer (cj/face-diagnostic-mode), with a region-scan mode over distinct face-runs (capped at 20) and an out-of-scope banner. It is required in init.el. The render is split into small section formatters tested on captured plists, and the command is smoke-tested and live-verified in the daemon, where it already surfaces the active auto-dim remaps. The command name is settled as cj/describe-face-at-point. The keybinding stays Craig's pick, and face-name buttons plus the module-header allowlist entry are filed as a follow-up. The spec is marked implemented and renamed to its lifecycle filename. 35 ERT tests, byte-compile clean.
* feat(face-diagnostic): Phase 2 merged attributes and real fontCraig Jennings9 days1-4/+4
| | | | Extend the diagnostic core with the effective merged attributes and the real-font layer. cj/--face-diag-merged-attributes folds the ordered, remap-expanded spec stack (overlays over text-props over default), taking the first non-unspecified value per attribute, labeled "computed". cj/--face-diag-real-font reports font-at's font, or "unavailable" under batch and on terminals. cj/--face-diagnosis-at now returns groups 0-4. Settles spec decision #7 (the hand-fold approach), pinned by fixtures: overlay-over-text-prop, a default remap, a face-symbol attribute. 23 ERT tests, byte-compile clean.
* refactor(themes): retire dupre, fall back to modus-vivendiCraig Jennings9 days1-1/+1
| | | | WIP, the theme-studio export, is the active theme. dupre was only the fallback and a structural reference. Move the fallback to the built-in modus-vivendi, guaranteed present everywhere this config loads. Delete the three dupre files plus its test and palette assets, and fix the stale comments that pointed at dupre-faces.el for the auto-dim and org-keyword faces (those moved to org-faces-config.el). Repoint the dupre-clear-theme spec's palette reference to git history.
* docs: move the two docs-root specs into docs/specs/Craig Jennings9 days2-8/+16
| | | | Finish the reorg: theme-studio-palette-generator (doing — core planner, UI, and generatortest gate shipped, one refinement open) and theme-studio-semantic-theme-architecture (not-started) lived in docs/ root. Moved both into docs/specs/ with status filenames, ID and STATUS drawers, and id-linked references. Fixed their Related links from ../todo.org to ../../todo.org for the deeper path.
* docs: move specs to docs/specs/ with lifecycle-status filenamesCraig Jennings9 days34-28/+289
| | | | | | Separate the 27 formal specs from working notes. Specs move to docs/specs/, notes stay in docs/design/. Each spec carries its lifecycle in the filename (-spec, -spec-doing, -spec-implemented, -spec-superseded) plus an authoritative ID and STATUS property drawer. The status came from checking each spec against the code, not the doc's own field: 6 implemented, 8 in progress, 12 not started, 1 superseded. Inbound links become org-id links so future status renames don't break them; code-comment paths repoint to docs/specs/. Working notes, inventories, reviews, and brainstorms stay in docs/design/.
* docs: file roam-inbox tasks, face/font diagnostic spec, close org-facesCraig Jennings9 days1-0/+193
| | | | File the roam-inbox backlog (face/font diagnostic popup, gold-text-in-dimmed-buffers, and the theme-studio bugs: elfeed all-white, dashboard preview icons, converter :inherit gap, cursor row controls, sample renames). Add the face/font diagnostic spec the lead task references. Close the org-faces feature as DONE and file its residual visual round-trip as a VERIFY under Manual testing and validation.
* feat(org): themeable agenda header-row faces via org-faces-configCraig Jennings10 days1-0/+150
| | | | | | Each TODO keyword and priority cookie gets its own named face instead of sharing org's built-in org-todo / org-done / org-priority. org-faces-config.el defines org-faces-<keyword> and org-faces-priority-a..d (plus -dim variants for auto-dim), each with a real default color, and wires them through org-todo-keyword-faces and org-priority-faces once org loads. The file is org-faces-config, not org-faces, because org ships its own org-faces feature that the bare name would shadow. This re-introduces the per-keyword/priority coloring that was stripped earlier, now as a named, theme-agnostic layer a theme can override. The design and the four resolved decisions are in docs/design/org-faces-spec.org; a theme-studio "org-faces" app and the auto-dim repoint follow in later phases.
* feat(theme-studio): palette generator and preview fidelityCraig Jennings10 days2-146/+461
| | | | | | | | | | Two strands land together because the generated theme-studio.html bundles every source file into one page and can't be split cleanly. The palette generator is a preview-first panel: palette-generator-core.js plans the palette and palette-generator-ui.js draws it. Generated colors stay inspectable and tunable through the existing selector, and committing one creates a normal base column. It adds source-mode and scheme controls, a configurable accent count, and color names from color-names.json. For preview fidelity, syntax and UI colors now resolve through the real Emacs inherit chains, so the preview matches how Emacs renders the theme. resolveSyntaxFg pins dec to ty (Emacs has no decorator face) and otherwise follows comment-delimiter to comment, doc to string, property to variable, function-call to function-name. resolveUiAttr walks mode-line-inactive to mode-line and line-number-current-line to line-number. The decorator label now reads "decorator to type" to match the type face Emacs uses for it. Design recorded in the two theme-studio specs under docs/.
* Add theme studio palette generator specCraig Jennings11 days1-0/+241
|
* docs(spec): restructure keybinding spec to Path 2, defer the prefixCraig Jennings12 days1-85/+493
| | | | | | | | | | Processed the latest review comments on the keybinding-console-safety spec. Phase 0 is now a pure revert that unblocks the held push. Consolidation (migrate the common set, retire the translation block) is the primary phase. Binding the console-safe prefix becomes an optional, deferred Phase 3. The decisions gate splits to match: D2/D4/D5 gate the primary work, D1/D3 gate only Phase 3, so the work runs to the prefix-assignment point and stops there even if the prefix is never chosen. Corrected Appendix C: Meta transmits in the Linux console as an ESC prefix, so a free M-<punctuation> is a viable console-safe class, not just Control+letter. C-' is rejected: console-dead like C-;, and already bound to flyspell. Added Appendix D: every personal keybinding set outside the C-; tree and the M-S- family, as a checkbox pruning tree for a one-time audit of set-and-forgotten chords.
* docs(spec): messenger unification — settle decisions 3/6/9, smoke ↵Craig Jennings12 days1-13/+34
| | | | reference backend
* docs(spec): add keybinding console-safety spec (draft for review)Craig Jennings12 days1-0/+531
|
* docs: add messenger window/key unification spec (draft)Craig Jennings13 days1-0/+187
|
* feat(signal): route message toasts through the notify scriptCraig Jennings13 days1-0/+22
| | | | Incoming messages now notify through cj/signel--notify, installed as the fork's signel-notify-function. It suppresses the toast while that chat is in the selected window of a focused frame, collapses and truncates the body to 120 characters, and sends through the notify script (info type, --silent unless cj/signel-notify-sound is set). Without the script on PATH it falls back to notifications-notify and warns at load. The decisions are in the Notification slice addendum of docs/design/signal-client.org.
* docs(spec): draft declared-palette-columns specCraig Jennings14 days1-0/+119
|
* docs(design): add theme-studio color-harmony explainerCraig Jennings2026-06-101-0/+77
|
* chore(todo): mark color-families spec Ready, break out build tasksCraig Jennings2026-06-101-1/+5
| | | | Craig confirmed the spec Ready. The six phases become tracked tasks under the color-families parent — family model and sort cores, strip rendering, the count control, the ground strip plus ramp-panel retirement, and the warnings/seeding/export/README close-out — all :solo:. Three manual aesthetic checks (hue grouping matches the eye, regenerate-replace reads as deliberate, removed-step references read as "(gone)") go under the Manual testing parent.
* docs(theme-studio): record the palette-ramps spec Ready verificationCraig Jennings2026-06-091-4/+8
| | | | Codex re-reviewed the updated palette-ramps spec and confirmed it implementation-ready; the history gets a Ready-verification entry and the metadata table is realigned. The spec was already built and shipped, so this just closes its review trail.
* docs(theme-studio): fold the color-families review and pivot to hex groupingCraig Jennings2026-06-091-98/+128
| | | | | | | | Resolved both open decisions per Craig: theme.json stays flat, and the standalone ramp panel goes away in favor of the per-strip control. The bigger change is the grouping mechanism: families are now derived from OKLCH hue off the hex, never from a name convention, so renaming a color to anything never moves it between strips. That pivot designs out the Codex review's two hardest blockers. There's no step-name grammar and no import inference, because grouping isn't name-based. And the palette stays a flat, individually-editable list rather than transferring ownership to family objects, so per-chip rename/remove/edit keep working and there's no ownership contract to invent. Families are a display view over the existing palette. The rest of the review is folded as written, adapted to the flat model: the ground strip is synthesized from the bg/fg assignments (pinned, editable, de-duped by hex), removed-step references degrade to a visible "(gone)" rather than a silent jump, n=0 is handled without ramp(), and the neutral (0.02) and hue-gap (25) thresholds and sort tie-breakers are pinned. Review file consumed and deleted; dispositions and a responder entry are in the spec.
* docs(theme-studio): spec live color families for the paletteCraig Jennings2026-06-091-0/+168
| | | | | | The palette panel becomes color families instead of a flat row of chips: a base color plus its tonal ramp, shown as a dark-to-light strip with a per-family symmetric step count (N gives base ±N). Families are live, so changing the count or the base regenerates the strip; regeneration is authoritative. fg and bg share a fixed ground strip, other standalone colors are singletons, and strips sort by hue across the panel with steps sorted by lightness within. The spec keeps theme.json a flat palette (families derived from the ramp naming on import) and reuses the shipped ramp() and assignment re-point. Two decisions are left open for Craig: flat-vs-structured persistence, and whether the per-family count control should replace the standalone ramp panel. Six phases, each leaving the tree green; the v1 build it extends is cross-linked from the task.
* docs(theme-studio): fold Codex review into palette-ramps specCraig Jennings2026-06-091-21/+84
| | | | | | | | | | Resolved both open decisions. The contrast target is WCAG AA by default, with AAA selectable and APCA shown as a diagnostic only. The v1 foreground set is the distinct syntax-assignment hexes plus the default foreground, with locked background-only roles excluded. Pinned what the review flagged as underspecified: a closed five-face covered set (region, hl-line, highlight, lazy-highlight, isearch), ramp defaults and palette-insertion rules (n/stepL/chromaEase, naming, collisions, clamp display), and explicit-state structured-error contracts for ramp, fgSetFor, floor, and lMax. Package and non-overlay UI cells stay single-pair in v1. Closed the v1 face set rather than keeping the review's open-ended "any face the buffer renders text over" clause, since an open set reintroduces the gap the foreground-set decision exists to close. Kept throwing for genuine programmer error while returning structured results for bad user input, matching colormath.js. The spec is implementation-ready. The six implementation tasks get created once Craig confirms the go. Review file consumed and deleted.
* docs(theme-studio): spec palette ramp generation + background-contrast safetyCraig Jennings2026-06-091-0/+152
| | | | Design doc (spec-create workflow) for two coupled v1 features: generating a harmonized tonal ramp from a base color, and a worst-case-contrast readout that caps a background tint at the lightness where every foreground on it stays readable. Cross-linked from the color-harmony task; harmonic fill deferred to vNext.
* docs(theme-studio): separate Design Rules from Fidelity RulesCraig Jennings2026-06-091-0/+47
|
* docs(theme-studio): add seeding-engine specCraig Jennings2026-06-081-0/+350
| | | | The seeding engine turns the color guide's seed table into executable defaults: a role-to-treatment table, a face-to-role map per tier (syntax, UI, org), and a pure seed() that opens the tool guide-correct and reseeds dupre-revised to the compact mapping. v1 generates the shades with OKLCH, reusing the perceptual-metrics colormath.js core, so it sequences after that feature's Phase 1. todo.org carries the two implementation phases.
* docs(theme-studio): add perceptual color metrics specCraig Jennings2026-06-081-0/+576
| | | | The spec adds OKLCH editing, perceptual-lightness and APCA readouts, and a pairwise ΔE distinguishability check to the theme-studio, so it can build deliberately low-contrast themes by metric instead of by eye. The testing strategy extracts the color math into a Node-unit-tested colormath.js core, with the browser hash tests reduced to UI wiring and coverage measured on that core. todo.org carries the five implementation phases and the manual-validation checklist.
* refactor(theme-studio): rename theme-selector to theme-studioCraig Jennings2026-06-081-9/+9
| | | | The tool authors themes from scratch -- palette, faces across every tier, live preview, export to a loadable deftheme. It never selects among existing themes, so "selector" mis-described it. Renamed the directory, the generated HTML and its title, the design spec, and every reference in the code, README, tests, and todo. No behavior change.
* docs(theme-selector): document underline and strike in the theme.json contractCraig Jennings2026-06-081-1/+2
| | | | Record the two new face booleans in the README contract and the spec's state-and-export-policy block, including that the converter writes them as :underline t and :strike-through t.
* feat(theme-selector): add relative height to the package-face schemaCraig Jennings2026-06-081-18/+85
| | | | | | I folded a relative height field into the tier-3 spec and brought Phase 1's schema in line. A face's height is a float multiplier off the base font (1.3 is 1.3x the running font, never a point size), so it stays portable across fonts and machines, and it's omitted from export at 1.0. The font family itself stays in font-config.el, where it belongs; the theme owns only relative size. Height is read straight off the face and does not cascade through inherit, because Emacs multiplies float heights along an inherit chain and headings should each size off the body, not compound off the level above. The org starter now seeds heading heights and the fixed-pitch inherits that keep code and tables monospace under variable-pitch prose. The self-test gained a height assertion and still reports PASS.
* docs(theme-selector): finalize package-faces spec and emit implementation tasksCraig Jennings2026-06-081-8/+8
| | | | | | Craig resolved the last two opens: hybrid-and-split inventory (org/magit/elfeed bespoke first, the generated all-package inventory as a later phase) and the custom color picker built after tier 3. With inheritance already settled, the rubric moves to Ready. I emitted the phase breakdown into todo.org under Emacs Open Work: one task per implementation phase plus a test-surface task, all marked solo since each builds and self-verifies through node, headless screenshots, and import/export round-trips. A Manual testing task collects the two human judgments that aren't solo: whether the seeded package defaults look right and whether the large org and magit tables stay usable.
* docs(theme-selector): settle inheritance as model-and-override in the specCraig Jennings2026-06-071-22/+29
| | | | Craig settled the inheritance question: model it rather than flatten it. Each face's resolved color shows in the table marked as inherited, the mock preview paints every face with its effective color, and overriding any face is one assignment that flips it from inherited to explicit. Export keeps the :inherit relationship for faces left alone and writes explicit attributes only for the ones overridden. Seeded defaults open showing org's real cascade. That clears one of the three open decisions; inventory split and picker timing remain.
* docs(theme-selector): incorporate Codex review into the package-faces specCraig Jennings2026-06-071-11/+154
| | | | | | I ran spec-response against Codex's review. Added implementation phases, acceptance criteria, the package-face inventory source, and state/export semantics with a source field that distinguishes seeded defaults from user edits from deliberate clears. The inventory is hybrid and split: the generated all-package path is its own phase after org, magit, and elfeed, so the three bespoke apps don't wait on it and the scope-explosion risk Codex flagged stays contained. Two findings I modified with reasons in the dispositions section, the rest accepted. Renamed the spec to -spec.org for the workflow precondition. The rubric is now Ready with caveats, and three decisions stay open for me: the inheritance representation, hybrid-vs-curated-only inventory, and the custom picker timing.
* docs(theme-selector): fold first-round answers into the package-faces specCraig Jennings2026-06-071-38/+186
| | | | I folded the first-round answers into the tier-3 spec. org now carries its complete defface set instead of an 18-face sample, v1 apps are org, magit, and elfeed, and the generic fallback is a fully editable table so any package can be themed. I answered the inheritance question with an optional inherit field (absolute default, opt-in cascade) and added a custom-color-picker proposal. Two decisions stay open: confirming the inheritance representation and when to build the picker.
* docs(theme-selector): spec the tier-3 package-faces sectionCraig Jennings2026-06-071-0/+220
| | | | I spec'd a third tier for the tool: package-specific faces, edited one application at a time, org-mode first. It covers the app dropdown, a per-app face table, a bespoke org-document preview, the theme.json packages schema, and how the build step consumes it. It's awaiting review and ends with five open questions.
* docs(design): spec the dupre-clear contrast-first theme, add taskCraig Jennings2026-06-071-0/+89
| | | | A plan for a contrast-first AAA sibling of the dupre theme. It keeps dupre's hues but builds them Prot's way, with contrast as the founding constraint, where the in-progress dupre revision is mood-first and lands at AA. The spec records the modus methodology analysis, the AA-to-AAA starting palette, the hard blue-keyword decision, and enough context to resume cold months from now. The task in Emacs Open Work links to it.
* feat(pearl): add multi-account config, rename module to pearl-configCraig Jennings2026-06-061-1/+1
| | | | | | The pearl package moved from a single Linear workspace to multi-account, so the config follows. pearl-accounts now declares two workspaces, one for work and one personal, each resolving its own API key from authinfo and rendering to its own Org file. pearl-default-account picks which one opens, and pearl-switch-account swaps at runtime. This replaces the old single-account setup (pearl-org-file-path plus one pearl-api-key lookup). The module file moves from linear-config.el to pearl-config.el to match the package name. init.el, the module-headers allowlist, and the module-inventory row follow the rename.
* fix(term): make F9 and F12 reach Emacs inside ghostel buffersCraig Jennings2026-06-051-3/+8
| | | | | | | | F9 did nothing in an agent buffer: ghostel's semi-char mode forwards every key not in ghostel-keymap-exceptions to the pty, and ghostel-semi-char-mode-map outranks the major-mode map, so the F9-family and F12 bindings I'd put in ghostel-mode-map never fired. The keys went to Claude/the shell, which ignored them. I added the F9 family (in ai-term) and F12 plus C-; (in term-config) to ghostel-keymap-exceptions and rebuilt the semi-char map with ghostel--rebuild-semi-char-keymap. add-to-list updates the list but not the already-built map, so the rebuild is what actually lets the keys through. C-; had the same latent bug for the same reason. Two regression tests assert the keys are in the exceptions and that the rebuilt semi-char map no longer forwards them. I also corrected the spec note that claimed binding in ghostel-mode-map was enough (true for vterm, wrong for ghostel) and codified the gotcha.