Skip to content

Commit ef2dbe7

Browse files
authored
Merge pull request #19 from ZDOSS/codex/settings-ai-bridge-milestone
Decompose settings and clarify AI bridge readiness
2 parents 87354ba + e70c14e commit ef2dbe7

19 files changed

Lines changed: 1623 additions & 930 deletions

AI.md

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -194,9 +194,11 @@ The core domain in `packages/core/src/domain/` covers the entities the plan call
194194
- work-item modal relationship selectors now memoize item and relationship derivations, so transient local-state changes such as typing in comments do not rebuild every relationship group on large projects
195195
- comment editing disables `Save comment` until the body is non-empty and actually changed; the new-comment composer has a stable `aria-label="New comment"` instead of depending on placeholder text for its accessible name
196196
- shared `Modal` supports `closeOnEscape={false}` for stacked modal cases; `WorkItemModal` disables its Escape handler while the permanent-delete `ConfirmDialog` is open so Escape only cancels the top confirmation and preserves item-detail drafts
197-
- settings view with theme, left-panel visibility, editable members, editable statuses, editable priorities, editable types, labels, milestones, custom fields, workflow guardrails, automation rules, plugins, export/import, AI bridge
198-
- settings workflow and automation sections now live in focused `WorkflowSettings.tsx` and `AutomationSettings.tsx` files instead of expanding the main `SettingsView.tsx` switch further
199-
- settings sections now expose tab semantics, the edit icon comes from `lucide-react`, and import failures render as inline alerts instead of browser-native `alert()`
197+
- settings view is now a shell plus focused panels: `SettingsView.tsx` owns grouped tab navigation/tabpanel semantics only, while `GeneralSettings`, `AppearanceSettings`, `StorageSettings`, `ViewsSettings`, `MembersSettings`, `WorkflowSettings`, `LabelsMilestonesSettings`, `CustomFieldsSettings`, `PluginsSettings`, `AutomationSettings`, `ImportExportSettings`, and `BridgeSettings` own their own command wiring
198+
- settings workflow, automation, and bridge sections should stay out of the shell; add future settings surfaces as focused files under `packages/ui/src/views/settings/` and register them through the shell tab list
199+
- settings sections expose keyboard-accessible tab semantics with Arrow/Home/End navigation; inactive settings panels stay mounted with `hidden` instead of being unmounted so unsaved local form drafts survive section switches
200+
- settings edit icons come from `lucide-react`, and import failures render as inline alerts instead of browser-native `alert()`
201+
- `BridgeSettings.tsx` is truth-in-UI for future AI/MCP integration: it documents real core command coverage and explicitly says no installable bridge/server binary/client config is shipped yet, so do not add setup commands until a bridge runtime exists
200202
- settings registry tables now follow a consistent edit flow for members/statuses/priorities/types:
201203
- read-only rows by default
202204
- explicit edit affordance
@@ -279,6 +281,7 @@ The core domain in `packages/core/src/domain/` covers the entities the plan call
279281
- bug triage filters for needs-repro and command-backed accept/decline/snooze/assign/duplicate actions
280282
- bug triage severity/priority filtering, plugin-owned source/context editing, and the configured severity-or-priority intake exit gate
281283
- automation rule create/update/delete/enable/disable/dry-run commands, dispatcher execution through automation source commands, and Settings automation rule preview/save/toggle/delete flows
284+
- settings section decomposition, keyboard tab navigation, draft preservation across panel switches, and AI bridge future-capability copy that avoids placeholder install instructions
282285
- board-context item creation that uses the first board column default status
283286
- my-work item creation that preselects the active local member as assignee
284287
- table priority and updated-date sort direction behavior
@@ -497,6 +500,13 @@ The core domain in `packages/core/src/domain/` covers the entities the plan call
497500
- redirecting stale archived/deleted doc routes to the first active doc instead of showing the generic empty-docs state
498501
- suppressing the Markdown Docs section when every document is archived
499502
- allowing public `doc.create` payloads without a title to create an `Untitled` blank document
503+
- continued the July 2026 polish/trust pass with settings decomposition and AI bridge truth-in-UI by:
504+
- replacing the monolithic Settings switch with a keyboard-accessible grouped tab shell and focused settings panel files
505+
- keeping inactive settings panels mounted behind `hidden` so unsaved form drafts are not lost when users switch sections
506+
- grouping status, priority, type defaults, and bug-intake guardrails inside the Workflow settings panel
507+
- combining labels/milestones and import/export into clearer workflow panels while preserving the existing command paths
508+
- replacing placeholder AI bridge install/setup copy with real command-coverage documentation and explicit "not shipped yet" runtime gaps
509+
- adding SettingsView regression coverage for panel splitting, keyboard navigation, and bridge truth copy
500510

501511
## Open follow-on planning
502512

Readme.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ The MVP implementation is in place. The current build supports:
1818
- **Bug triage** with severity, priority, source/context metadata, reproduction steps, expected/actual behavior, environment, affected version, shared work-card metadata, practical triage filters, accept/decline/snooze/assign/duplicate actions, configurable severity-or-priority intake gates, workflow-safe decline handling, and a visible new-bug entry point that defaults to the Intake lane without starving Ready in custom planned workflows
1919
- **My work** filtered to the locally selected member with a real member select control, shared work rows, and assigned-to-me creation
2020
- **Search** across items, docs, comments, and labels with shared search controls and grouped results
21-
- **Settings** for theme, left-panel visibility, editable members, statuses, priorities, types, labels, milestones, custom fields, workflow guardrails, automation rules, plugins, export, AI bridge, semantic section tabs, and inline import errors
21+
- **Settings** split into focused panels for general project identity, appearance, storage, visible views, members, workflow, labels/milestones, custom fields, plugin trust, automation rules, import/export, and a truthful AI bridge readiness panel with keyboard-accessible section tabs that preserve in-progress drafts while switching sections
2222
- **Consistent settings editing** for members, statuses, priorities, types, and plugin trust with explicit edit or save/cancel flows instead of always-live row inputs
2323
- **Shared navigation config** so sidebar navigation and left-panel visibility toggles stay in sync
2424
- **Saved planning views** in the project view bar, with board/backlog/table save, update, delete, and reorder flows backed by validated shared filters that preserve multi-value saved filters
@@ -30,7 +30,7 @@ The MVP implementation is in place. The current build supports:
3030
- **Light and dark themes** with system preference detection
3131
- **PWA support** with offline service worker
3232
- **Desktop shell (Tauri)** with folder-backed storage adapter wired to registered Rust commands
33-
- **Validated command surface** for UI, automation, import, and AI/MCP bridge parity
33+
- **Validated command surface** for UI, automation, import, and future AI/MCP bridge parity, with the current bridge UI clearly labeled as not yet shipped
3434
- **Automation rules** with command-backed create/update/delete/enable/disable, dry-run preview, item-event triggers, validated actions for field updates, labels, status, milestones, subtasks, and generated docs, and audited action failures that do not abort the originating item command
3535

3636
## Quick start
@@ -98,7 +98,7 @@ The UI/UX overhaul planning package lives in `docs/superpowers/specs/2026-07-02-
9898
| Suite | Count | Notes |
9999
| --- | --- | --- |
100100
| `packages/core` | 57 | Domain, storage, dispatcher, document sections/templates, automation rules, export, import |
101-
| `packages/ui` | 88 | AppShell, ProjectRouter, OverviewView, shared button and surface primitives, WorkItemModal attachment/reminder/custom-field coverage, TrashView, BoardView, saved planning views, BacklogView, BugTriageView, MyWorkView, TableView, RoadmapView, CalendarView, CommandPalette, CreateItemDialog, launcher, docs, settings, automation settings |
101+
| `packages/ui` | 92 | AppShell, ProjectRouter, OverviewView, shared button and surface primitives, WorkItemModal attachment/reminder/custom-field coverage, TrashView, BoardView, saved planning views, BacklogView, BugTriageView, MyWorkView, TableView, RoadmapView, CalendarView, CommandPalette, CreateItemDialog, launcher, docs, settings, automation settings |
102102
| `apps/desktop` | 2 | Desktop storage adapter command wiring |
103103
| `tests/e2e` | 7 | Hybrid parity, project workflow, theme, palette, export, search |
104104

docs/plans/July 2026 plan.md

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -533,6 +533,8 @@ This combines the original saved-views slice and backlog/table parity slice into
533533

534534
**Intent:** Reduce settings risk and remove placeholder bridge promises.
535535

536+
**Delivery note:** This slice shipped the focused settings panel decomposition, keyboard-accessible grouped settings tabs, and an AI bridge panel that documents real command coverage while clearly stating that no installable bridge runtime is shipped yet. Broader responsive/release polish remains in PR 11.
537+
536538
**Files:**
537539

538540
- Split: `packages/ui/src/views/settings/SettingsView.tsx`
@@ -541,11 +543,11 @@ This combines the original saved-views slice and backlog/table parity slice into
541543
- Modify: `AI.md`
542544
- Modify: `Readme.md`
543545

544-
- [ ] Split settings into focused components: general, appearance, storage, views, members, workflow, labels/milestones, fields, plugins, automation, import/export, AI bridge.
545-
- [ ] Replace placeholder AI bridge install copy with either implemented instructions or clearly labeled future capability copy.
546-
- [ ] Add a bridge capability checklist tied to real command coverage.
547-
- [ ] Keep plugin trust language risk-aware.
548-
- [ ] Verify settings navigation remains keyboard accessible.
546+
- [x] Split settings into focused components: general, appearance, storage, views, members, workflow, labels/milestones, fields, plugins, automation, import/export, AI bridge.
547+
- [x] Replace placeholder AI bridge install copy with either implemented instructions or clearly labeled future capability copy.
548+
- [x] Add a bridge capability checklist tied to real command coverage.
549+
- [x] Keep plugin trust language risk-aware.
550+
- [x] Verify settings navigation remains keyboard accessible.
549551

550552
### PR 11: Responsive, Accessibility, And Release Polish
551553

packages/ui/src/theme/global.css

Lines changed: 210 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1871,6 +1871,185 @@
18711871
.tag-bad { background: var(--color-bg-status-blocked); color: var(--color-text-on-status); }
18721872
.tag-info { background: var(--color-accent-soft); color: var(--color-text-primary); }
18731873

1874+
/* ---- Settings ---- */
1875+
.settings-view {
1876+
flex: 1;
1877+
min-height: 0;
1878+
overflow: auto;
1879+
padding: var(--space-4);
1880+
display: flex;
1881+
flex-direction: column;
1882+
gap: var(--space-4);
1883+
}
1884+
.settings-page-header {
1885+
display: flex;
1886+
align-items: flex-end;
1887+
justify-content: space-between;
1888+
gap: var(--space-4);
1889+
}
1890+
.settings-page-header h2 {
1891+
margin: 0 0 4px;
1892+
}
1893+
.settings-page-header p,
1894+
.settings-panel-header p,
1895+
.settings-card-header p,
1896+
.settings-capability-row p {
1897+
margin: 0;
1898+
}
1899+
.settings-shell {
1900+
display: grid;
1901+
grid-template-columns: minmax(220px, 260px) minmax(0, 1fr);
1902+
gap: var(--space-4);
1903+
align-items: start;
1904+
}
1905+
.settings-nav {
1906+
position: sticky;
1907+
top: var(--space-4);
1908+
align-self: start;
1909+
max-height: calc(100vh - 132px);
1910+
overflow: auto;
1911+
padding: var(--space-2);
1912+
border: 1px solid var(--color-border-subtle);
1913+
border-radius: var(--radius-md);
1914+
background: var(--color-bg-surface);
1915+
}
1916+
.settings-tablist,
1917+
.settings-nav-group,
1918+
.settings-panel-stack,
1919+
.settings-section-card,
1920+
.settings-card-header,
1921+
.settings-capability-list {
1922+
display: flex;
1923+
flex-direction: column;
1924+
}
1925+
.settings-tablist {
1926+
gap: var(--space-3);
1927+
}
1928+
.settings-nav-group {
1929+
gap: 4px;
1930+
}
1931+
.settings-nav-group-title {
1932+
padding: 0 var(--space-2);
1933+
font-size: var(--font-size-2xs);
1934+
font-weight: 700;
1935+
text-transform: uppercase;
1936+
letter-spacing: 0.08em;
1937+
color: var(--color-text-secondary);
1938+
}
1939+
.settings-tab {
1940+
display: grid;
1941+
gap: 2px;
1942+
width: 100%;
1943+
padding: 8px 10px;
1944+
border: 1px solid transparent;
1945+
border-radius: var(--radius-sm);
1946+
background: transparent;
1947+
color: var(--color-text-primary);
1948+
text-align: left;
1949+
cursor: pointer;
1950+
}
1951+
.settings-tab:hover {
1952+
background: var(--color-bg-row-hover);
1953+
}
1954+
.settings-tab:focus-visible {
1955+
outline: 2px solid var(--color-accent);
1956+
outline-offset: 2px;
1957+
}
1958+
.settings-tab span {
1959+
font-size: var(--font-size-sm);
1960+
font-weight: 700;
1961+
}
1962+
.settings-tab small {
1963+
color: var(--color-text-secondary);
1964+
font-size: var(--font-size-2xs);
1965+
line-height: 1.35;
1966+
}
1967+
.settings-tab-active {
1968+
background: var(--color-accent-soft);
1969+
border-color: var(--color-border-subtle);
1970+
box-shadow: inset 3px 0 0 var(--color-accent);
1971+
}
1972+
.settings-content-panel {
1973+
min-width: 0;
1974+
border: 1px solid var(--color-border-subtle);
1975+
border-radius: var(--radius-md);
1976+
background: var(--color-bg-elevated);
1977+
padding: var(--space-4);
1978+
}
1979+
.settings-content-panel:focus-visible {
1980+
outline: 2px solid var(--color-accent);
1981+
outline-offset: 2px;
1982+
}
1983+
.settings-panel-stack {
1984+
gap: var(--space-4);
1985+
max-width: 760px;
1986+
}
1987+
.settings-panel-wide {
1988+
max-width: 1180px;
1989+
}
1990+
.settings-panel-header {
1991+
display: flex;
1992+
flex-direction: column;
1993+
gap: 4px;
1994+
}
1995+
.settings-panel-header h3,
1996+
.settings-card-header h4 {
1997+
margin: 0;
1998+
}
1999+
.settings-section-card {
2000+
gap: var(--space-3);
2001+
padding: var(--space-4);
2002+
border: 1px solid var(--color-border-subtle);
2003+
border-radius: var(--radius-md);
2004+
background: var(--color-bg-surface);
2005+
}
2006+
.settings-card-header {
2007+
gap: 4px;
2008+
}
2009+
.settings-inline-form {
2010+
align-items: center;
2011+
flex-wrap: wrap;
2012+
}
2013+
.settings-inline-form .input,
2014+
.settings-inline-form .select {
2015+
min-width: 180px;
2016+
}
2017+
.settings-simple-row {
2018+
display: flex;
2019+
align-items: center;
2020+
justify-content: space-between;
2021+
gap: var(--space-3);
2022+
padding: 10px 0;
2023+
border-top: 1px solid var(--color-border-subtle);
2024+
}
2025+
.settings-truth-callout {
2026+
display: flex;
2027+
flex-direction: column;
2028+
gap: 4px;
2029+
padding: var(--space-3);
2030+
border: 1px solid var(--color-border-subtle);
2031+
border-left: 4px solid var(--color-accent);
2032+
border-radius: var(--radius-sm);
2033+
background: var(--color-accent-soft);
2034+
}
2035+
.settings-bridge-grid {
2036+
display: grid;
2037+
grid-template-columns: minmax(0, 1.2fr) minmax(280px, 0.8fr);
2038+
gap: var(--space-4);
2039+
align-items: start;
2040+
}
2041+
.settings-capability-list {
2042+
gap: var(--space-2);
2043+
}
2044+
.settings-capability-row {
2045+
display: grid;
2046+
grid-template-columns: minmax(112px, auto) minmax(0, 1fr);
2047+
gap: var(--space-3);
2048+
align-items: start;
2049+
padding: 10px 0;
2050+
border-top: 1px solid var(--color-border-subtle);
2051+
}
2052+
18742053
/* ---- Settings grids ---- */
18752054
.settings-grid {
18762055
display: grid;
@@ -1963,7 +2142,7 @@
19632142
flex-wrap: wrap;
19642143
}
19652144

1966-
/* ── Visual pass additions ─────────────────────────────────────────────────── */
2145+
/* ---- Visual pass additions ---- */
19672146

19682147
/* Sidebar brand block (replaces plain h1) */
19692148
.sidebar-brand {
@@ -2086,6 +2265,36 @@
20862265
.overview-metrics {
20872266
grid-template-columns: 1fr;
20882267
}
2268+
.settings-view {
2269+
padding: var(--space-3);
2270+
}
2271+
.settings-page-header {
2272+
align-items: flex-start;
2273+
flex-direction: column;
2274+
}
2275+
.settings-shell,
2276+
.settings-bridge-grid {
2277+
grid-template-columns: 1fr;
2278+
}
2279+
.settings-nav {
2280+
position: static;
2281+
max-height: none;
2282+
}
2283+
.settings-tablist {
2284+
display: grid;
2285+
grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
2286+
}
2287+
.settings-inline-form {
2288+
align-items: stretch;
2289+
flex-direction: column;
2290+
}
2291+
.settings-inline-form .input,
2292+
.settings-inline-form .select {
2293+
min-width: 0;
2294+
}
2295+
.settings-capability-row {
2296+
grid-template-columns: 1fr;
2297+
}
20892298
.settings-table-header,
20902299
.settings-table-row,
20912300
.settings-table-row-member,
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
import { useTheme } from "../../theme/theme-provider";
2+
import { SettingsPanelHeader } from "./settings-shared";
3+
4+
export function AppearanceSettings() {
5+
const { setTheme, theme } = useTheme();
6+
7+
return (
8+
<div className="settings-panel-stack">
9+
<SettingsPanelHeader
10+
title="Appearance"
11+
description="Keep the workspace readable in light, dark, or system-controlled mode."
12+
/>
13+
<label className="label label-row">
14+
Theme
15+
<select className="select" value={theme} onChange={(event) => setTheme(event.target.value as "light" | "dark" | "system")}>
16+
<option value="system">System</option>
17+
<option value="light">Light</option>
18+
<option value="dark">Dark</option>
19+
</select>
20+
</label>
21+
</div>
22+
);
23+
}

0 commit comments

Comments
 (0)