Skip to content

Commit d0a80b5

Browse files
committed
feat(settings): productize stable and advanced controls
1 parent ccb06f6 commit d0a80b5

6 files changed

Lines changed: 159 additions & 53 deletions

File tree

docs/reference/settings.md

Lines changed: 21 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# Settings Reference
22

3-
Reference for dashboard and backend settings available from `codex auth login` -> `Settings`.
3+
Reference for the settings surface available from `codex auth login` -> `Settings`.
44

55
---
66

@@ -19,7 +19,11 @@ When `CODEX_MULTI_AUTH_DIR` is set, this root moves accordingly.
1919

2020
---
2121

22-
## Account List View
22+
## Everyday Settings
23+
24+
The top-level settings flow separates everyday dashboard preferences from advanced operator controls.
25+
26+
### List Appearance
2327

2428
Controls account-row display and sorting behavior:
2529

@@ -37,7 +41,7 @@ Controls account-row display and sorting behavior:
3741
- `menuSortQuickSwitchVisibleRow`
3842
- `menuLayoutMode`
3943

40-
## Summary Line
44+
### Details Line
4145

4246
Controls detail-line fields and order:
4347

@@ -46,7 +50,7 @@ Controls detail-line fields and order:
4650
- `limits`
4751
- `status`
4852

49-
## Menu Behavior
53+
### Results & Refresh
5054

5155
Controls result-screen and fetch behavior:
5256

@@ -56,17 +60,21 @@ Controls result-screen and fetch behavior:
5660
- `menuShowFetchStatus`
5761
- `menuQuotaTtlMs`
5862

59-
## Color Theme
63+
### Colors
6064

6165
Controls display style:
6266

6367
- `uiThemePreset`
6468
- `uiAccentColor`
6569
- `menuFocusStyle`
6670

67-
## Sync Center
71+
---
72+
73+
## Advanced and Operator Controls
74+
75+
### Codex CLI Sync
6876

69-
The settings hub includes a preview-first sync center for Codex CLI account sync.
77+
The advanced section includes a preview-first sync center for Codex CLI account sync.
7078
See [upgrade notes](../upgrade.md) for sync workflow changes.
7179

7280
Before applying sync, it shows:
@@ -84,9 +92,7 @@ Validation:
8492
- `npm run build`
8593
- `npm test`
8694

87-
---
88-
89-
## Experimental
95+
### Experimental
9096

9197
Experimental currently hosts:
9298

@@ -108,7 +114,11 @@ Named backup behavior:
108114
- rejects separators, traversal (`..`), `.rotate.`, `.tmp`, and `.wal` suffixes
109115
- fails safely on collisions instead of overwriting by default
110116

111-
## Backend Controls
117+
### Advanced Backend Controls
118+
119+
Expert backend controls stay available without changing the saved settings schema. They are grouped into categories so the default path can stay simpler for day-to-day use.
120+
121+
## Backend Categories
112122

113123
### Session & Sync
114124

lib/cli.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -225,6 +225,14 @@ async function promptLoginModeFallback(
225225
}
226226
return { mode: "reset" };
227227
}
228+
if (
229+
normalized === "u" ||
230+
normalized === "restore" ||
231+
normalized === "backup" ||
232+
normalized === "restore-backup"
233+
) {
234+
return { mode: "restore-backup" };
235+
}
228236
if (normalized === "c" || normalized === "check")
229237
return { mode: "check" };
230238
if (normalized === "d" || normalized === "deep") {

lib/codex-manager/settings-hub.ts

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3294,40 +3294,51 @@ async function promptSettingsHub(
32943294
},
32953295
{
32963296
label: UI_COPY.settings.accountList,
3297+
hint: UI_COPY.settings.accountListHint,
32973298
value: { type: "account-list" },
32983299
color: "green",
32993300
},
3300-
{
3301-
label: UI_COPY.settings.syncCenter,
3302-
value: { type: "sync-center" },
3303-
color: "green",
3304-
},
33053301
{
33063302
label: UI_COPY.settings.summaryFields,
3303+
hint: UI_COPY.settings.summaryFieldsHint,
33073304
value: { type: "summary-fields" },
33083305
color: "green",
33093306
},
33103307
{
33113308
label: UI_COPY.settings.behavior,
3309+
hint: UI_COPY.settings.behaviorHint,
33123310
value: { type: "behavior" },
33133311
color: "green",
33143312
},
3315-
{ label: UI_COPY.settings.theme, value: { type: "theme" }, color: "green" },
3313+
{
3314+
label: UI_COPY.settings.theme,
3315+
hint: UI_COPY.settings.themeHint,
3316+
value: { type: "theme" },
3317+
color: "green",
3318+
},
33163319
{ label: "", value: { type: "back" }, separator: true },
33173320
{
33183321
label: UI_COPY.settings.advancedTitle,
33193322
value: { type: "back" },
33203323
kind: "heading",
33213324
},
3325+
{
3326+
label: UI_COPY.settings.syncCenter,
3327+
hint: UI_COPY.settings.syncCenterHint,
3328+
value: { type: "sync-center" },
3329+
color: "yellow",
3330+
},
33223331
{
33233332
label: UI_COPY.settings.experimental,
3333+
hint: UI_COPY.settings.experimentalHint,
33243334
value: { type: "experimental" },
33253335
color: "yellow",
33263336
},
33273337
{
33283338
label: UI_COPY.settings.backend,
3339+
hint: UI_COPY.settings.backendHint,
33293340
value: { type: "backend" },
3330-
color: "green",
3341+
color: "yellow",
33313342
},
33323343
{ label: "", value: { type: "back" }, separator: true },
33333344
{

lib/ui/copy.ts

Lines changed: 34 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -62,17 +62,28 @@ export const UI_COPY = {
6262
},
6363
settings: {
6464
title: "Settings",
65-
subtitle: "Customize menu, behavior, backend, and experiments",
65+
subtitle:
66+
"Start with everyday dashboard settings. Advanced operator controls stay separate.",
6667
help: "↑↓ Move | Enter Select | Q Back",
67-
sectionTitle: "Basic",
68-
advancedTitle: "Advanced",
68+
sectionTitle: "Everyday Settings",
69+
advancedTitle: "Advanced & Operator",
6970
exitTitle: "Back",
70-
accountList: "Account List View",
71-
syncCenter: "Sync Center",
72-
summaryFields: "Summary Line",
73-
behavior: "Menu Behavior",
74-
theme: "Color Theme",
71+
accountList: "List Appearance",
72+
accountListHint:
73+
"Show badges, sorting, and how much detail each account row shows.",
74+
syncCenter: "Codex CLI Sync",
75+
syncCenterHint:
76+
"Preview and apply one-way sync from Codex CLI account files.",
77+
summaryFields: "Details Line",
78+
summaryFieldsHint: "Choose which details appear under each account row.",
79+
behavior: "Results & Refresh",
80+
behaviorHint:
81+
"Control auto-return timing and background limit refresh behavior.",
82+
theme: "Colors",
83+
themeHint: "Pick the base palette and accent color.",
7584
experimental: "Experimental",
85+
experimentalHint:
86+
"Preview sync and backup actions before they become stable.",
7687
experimentalTitle: "Experimental",
7788
experimentalSubtitle: "Preview sync and backup actions before they become stable",
7889
experimentalHelpMenu: "Enter Select | Q Back",
@@ -86,35 +97,37 @@ export const UI_COPY = {
8697
experimentalRefreshInterval: "Refresh Guard Interval",
8798
experimentalDecreaseInterval: "Decrease Refresh Interval",
8899
experimentalIncreaseInterval: "Increase Refresh Interval",
89-
backend: "Backend Controls",
100+
backend: "Advanced Backend Controls",
101+
backendHint: "Tune retry, quota, sync, recovery, and timeout internals.",
90102
back: "Back",
91103
previewHeading: "Live Preview",
92104
displayHeading: "Options",
93105
resetDefault: "Reset to Default",
94106
saveAndBack: "Save and Back",
95107
backNoSave: "Back Without Saving",
96-
accountListTitle: "Account List View",
97-
accountListSubtitle: "Choose row details and optional smart sorting",
108+
accountListTitle: "List Appearance",
109+
accountListSubtitle: "Choose badges, sorting, and row layout",
98110
accountListHelp:
99111
"Enter Toggle | Number Toggle | M Sort | L Layout | S Save | Q Back (No Save)",
100-
summaryTitle: "Account Details Row",
101-
summarySubtitle: "Choose and order detail fields",
112+
summaryTitle: "Details Line",
113+
summarySubtitle: "Choose and order the details shown under each account",
102114
summaryHelp:
103115
"Enter Toggle | 1-3 Toggle | [ ] Reorder | S Save | Q Back (No Save)",
104-
behaviorTitle: "Return Behavior",
105-
behaviorSubtitle: "Control how result screens return",
116+
behaviorTitle: "Results & Refresh",
117+
behaviorSubtitle: "Control auto-return and limit refresh behavior",
106118
behaviorHelp:
107119
"Enter Select | 1-3 Delay | P Pause | L AutoFetch | F Status | T TTL | S Save | Q Back (No Save)",
108-
themeTitle: "Color Theme",
109-
themeSubtitle: "Pick base color and accent",
120+
themeTitle: "Colors",
121+
themeSubtitle: "Pick the base palette and accent color",
110122
themeHelp: "Enter Select | 1-2 Base | S Save | Q Back (No Save)",
111-
backendTitle: "Backend Controls",
112-
backendSubtitle: "Tune sync, retry, and limit behavior",
123+
backendTitle: "Advanced Backend Controls",
124+
backendSubtitle:
125+
"Expert settings for sync, retry, quota, and timeout behavior",
113126
backendHelp:
114127
"Enter Open | 1-4 Category | S Save | R Reset | Q Back (No Save)",
115-
syncCenterTitle: "Sync Center",
128+
syncCenterTitle: "Codex CLI Sync",
116129
syncCenterSubtitle:
117-
"Inspect source paths, watcher status, and one-way preview semantics before applying sync",
130+
"Inspect source files and preview one-way sync before applying it",
118131
syncCenterHelp: "Enter Select | A Apply | R Refresh | Q Back",
119132
syncCenterOverviewHeading: "Sync Overview",
120133
syncCenterActionsHeading: "Actions",

test/codex-manager-cli.test.ts

Lines changed: 40 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -396,10 +396,10 @@ type SettingsHubMenuItem = {
396396

397397
const SETTINGS_HUB_MENU_ORDER = [
398398
"account-list",
399-
"sync-center",
400399
"summary-fields",
401400
"behavior",
402401
"theme",
402+
"sync-center",
403403
"experimental",
404404
"backend",
405405
] as const;
@@ -4104,7 +4104,7 @@ describe("codex manager cli commands", () => {
41044104
);
41054105
});
41064106

4107-
it("shows experimental settings in the settings hub", async () => {
4107+
it("shows productized everyday and advanced settings in the hub", async () => {
41084108
const now = Date.now();
41094109
setupInteractiveSettingsLogin(createSettingsStorage(now));
41104110
queueSettingsSelectSequence([{ type: "back" }]);
@@ -4114,6 +4114,44 @@ describe("codex manager cli commands", () => {
41144114

41154115
expect(exitCode).toBe(0);
41164116
expect(readSettingsHubPanelContract()).toEqual(SETTINGS_HUB_MENU_ORDER);
4117+
const firstMenuItems = (selectMock.mock.calls[0]?.[0] ?? []) as Array<{
4118+
label?: string;
4119+
hint?: string;
4120+
}>;
4121+
const firstMenuOptions = selectMock.mock.calls[0]?.[1] as
4122+
| {
4123+
message?: string;
4124+
subtitle?: string;
4125+
}
4126+
| undefined;
4127+
expect(firstMenuOptions?.message).toBe("Settings");
4128+
expect(firstMenuOptions?.subtitle).toContain(
4129+
"everyday dashboard settings",
4130+
);
4131+
const menuText = firstMenuItems
4132+
.map((item) => `${item.label ?? ""}\n${item.hint ?? ""}`)
4133+
.join("\n");
4134+
expect(menuText).toContain("Everyday Settings");
4135+
expect(menuText).toContain("List Appearance");
4136+
expect(menuText).toContain("Details Line");
4137+
expect(menuText).toContain("Results & Refresh");
4138+
expect(menuText).toContain("Colors");
4139+
expect(menuText).toContain("Advanced & Operator");
4140+
expect(menuText).toContain("Codex CLI Sync");
4141+
expect(menuText).toContain("Experimental");
4142+
expect(menuText).toContain("Advanced Backend Controls");
4143+
expect(menuText).toContain(
4144+
"Show badges, sorting, and how much detail each account row shows.",
4145+
);
4146+
expect(menuText).toContain(
4147+
"Preview and apply one-way sync from Codex CLI account files.",
4148+
);
4149+
expect(menuText).toContain(
4150+
"Preview sync and backup actions before they become stable.",
4151+
);
4152+
expect(menuText).toContain(
4153+
"Tune retry, quota, sync, recovery, and timeout internals.",
4154+
);
41174155
});
41184156

41194157
it("runs experimental oc sync with mandatory preview before apply", async () => {

test/documentation.test.ts

Lines changed: 38 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -288,15 +288,37 @@ describe("Documentation Integrity", () => {
288288
it("locks the current Experimental settings menu labels and help text", () => {
289289
expect(UI_COPY.settings.title).toBe("Settings");
290290
expect(UI_COPY.settings.subtitle).toBe(
291-
"Customize menu, behavior, backend, and experiments",
291+
"Start with everyday dashboard settings. Advanced operator controls stay separate.",
292292
);
293293
expect(UI_COPY.settings.help).toBe("↑↓ Move | Enter Select | Q Back");
294-
expect(UI_COPY.settings.accountList).toBe("Account List View");
295-
expect(UI_COPY.settings.summaryFields).toBe("Summary Line");
296-
expect(UI_COPY.settings.behavior).toBe("Menu Behavior");
297-
expect(UI_COPY.settings.theme).toBe("Color Theme");
294+
expect(UI_COPY.settings.accountList).toBe("List Appearance");
295+
expect(UI_COPY.settings.accountListHint).toBe(
296+
"Show badges, sorting, and how much detail each account row shows.",
297+
);
298+
expect(UI_COPY.settings.syncCenter).toBe("Codex CLI Sync");
299+
expect(UI_COPY.settings.syncCenterHint).toBe(
300+
"Preview and apply one-way sync from Codex CLI account files.",
301+
);
302+
expect(UI_COPY.settings.summaryFields).toBe("Details Line");
303+
expect(UI_COPY.settings.summaryFieldsHint).toBe(
304+
"Choose which details appear under each account row.",
305+
);
306+
expect(UI_COPY.settings.behavior).toBe("Results & Refresh");
307+
expect(UI_COPY.settings.behaviorHint).toBe(
308+
"Control auto-return timing and background limit refresh behavior.",
309+
);
310+
expect(UI_COPY.settings.theme).toBe("Colors");
311+
expect(UI_COPY.settings.themeHint).toBe(
312+
"Pick the base palette and accent color.",
313+
);
298314
expect(UI_COPY.settings.experimental).toBe("Experimental");
299-
expect(UI_COPY.settings.backend).toBe("Backend Controls");
315+
expect(UI_COPY.settings.experimentalHint).toBe(
316+
"Preview sync and backup actions before they become stable.",
317+
);
318+
expect(UI_COPY.settings.backend).toBe("Advanced Backend Controls");
319+
expect(UI_COPY.settings.backendHint).toBe(
320+
"Tune retry, quota, sync, recovery, and timeout internals.",
321+
);
300322
expect(UI_COPY.settings.accountListHelp).toBe(
301323
"Enter Toggle | Number Toggle | M Sort | L Layout | S Save | Q Back (No Save)",
302324
);
@@ -317,12 +339,16 @@ describe("Documentation Integrity", () => {
317339
it("keeps settings reference sections aligned with current menu labels and backend categories", () => {
318340
const settingsRef = read("docs/reference/settings.md");
319341

320-
expect(settingsRef).toContain(`## ${UI_COPY.settings.accountList}`);
321-
expect(settingsRef).toContain(`## ${UI_COPY.settings.summaryFields}`);
322-
expect(settingsRef).toContain(`## ${UI_COPY.settings.behavior}`);
323-
expect(settingsRef).toContain(`## ${UI_COPY.settings.theme}`);
324-
expect(settingsRef).toContain(`## ${UI_COPY.settings.experimental}`);
325-
expect(settingsRef).toContain(`## ${UI_COPY.settings.backend}`);
342+
expect(settingsRef).toContain("## Everyday Settings");
343+
expect(settingsRef).toContain(`### ${UI_COPY.settings.accountList}`);
344+
expect(settingsRef).toContain(`### ${UI_COPY.settings.summaryFields}`);
345+
expect(settingsRef).toContain(`### ${UI_COPY.settings.behavior}`);
346+
expect(settingsRef).toContain(`### ${UI_COPY.settings.theme}`);
347+
expect(settingsRef).toContain("## Advanced and Operator Controls");
348+
expect(settingsRef).toContain(`### ${UI_COPY.settings.syncCenter}`);
349+
expect(settingsRef).toContain(`### ${UI_COPY.settings.experimental}`);
350+
expect(settingsRef).toContain(`### ${UI_COPY.settings.backend}`);
351+
expect(settingsRef).toContain("## Backend Categories");
326352
expect(settingsRef).toContain("### Session & Sync");
327353
expect(settingsRef).toContain("### Rotation & Quota");
328354
expect(settingsRef).toContain("### Refresh & Recovery");

0 commit comments

Comments
 (0)