instar 1.2.13 → 1.2.14
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/commands/setup-wizard/codex-driver.d.ts.map +1 -1
- package/dist/commands/setup-wizard/codex-driver.js +68 -2
- package/dist/commands/setup-wizard/codex-driver.js.map +1 -1
- package/dist/commands/setup-wizard/state-machine.d.ts +26 -0
- package/dist/commands/setup-wizard/state-machine.d.ts.map +1 -1
- package/dist/commands/setup-wizard/state-machine.js +53 -10
- package/dist/commands/setup-wizard/state-machine.js.map +1 -1
- package/package.json +1 -1
- package/src/data/builtin-manifest.json +2 -2
- package/upgrades/1.2.14.md +79 -0
- package/upgrades/side-effects/fix-wizard-validation.md +98 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"codex-driver.d.ts","sourceRoot":"","sources":["../../../src/commands/setup-wizard/codex-driver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;
|
|
1
|
+
{"version":3,"file":"codex-driver.d.ts","sourceRoot":"","sources":["../../../src/commands/setup-wizard/codex-driver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAeH,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB;;;;OAIG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AA+ZD;;GAEG;AACH,wBAAsB,cAAc,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAiC/E"}
|
|
@@ -112,13 +112,46 @@ const FALLBACK_NARRATIVES = {
|
|
|
112
112
|
autonomy: 'A starting point — you can change this anytime.',
|
|
113
113
|
messaging: 'Messaging is the interface you\'ll use day-to-day.',
|
|
114
114
|
};
|
|
115
|
+
/**
|
|
116
|
+
* Spinner state for the composing indicator. Animates a single line
|
|
117
|
+
* during the codex narrative call so the user sees feedback instead
|
|
118
|
+
* of a silent terminal. Cleared (via carriage-return + spaces)
|
|
119
|
+
* before the narrative paragraph is printed.
|
|
120
|
+
*/
|
|
121
|
+
const SPINNER_FRAMES = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'];
|
|
122
|
+
function startSpinner(label) {
|
|
123
|
+
let i = 0;
|
|
124
|
+
const tty = process.stdout.isTTY;
|
|
125
|
+
if (!tty) {
|
|
126
|
+
process.stdout.write(` ${label}\n`);
|
|
127
|
+
return { stop: () => { } };
|
|
128
|
+
}
|
|
129
|
+
const render = () => {
|
|
130
|
+
process.stdout.write(`\r ${pc.cyan(SPINNER_FRAMES[i % SPINNER_FRAMES.length])} ${pc.dim(label)}`);
|
|
131
|
+
i++;
|
|
132
|
+
};
|
|
133
|
+
render();
|
|
134
|
+
const handle = setInterval(render, 100);
|
|
135
|
+
return {
|
|
136
|
+
stop: () => {
|
|
137
|
+
clearInterval(handle);
|
|
138
|
+
// Clear the spinner line so the narrative paragraph renders cleanly.
|
|
139
|
+
process.stdout.write(`\r${' '.repeat(label.length + 6)}\r`);
|
|
140
|
+
},
|
|
141
|
+
};
|
|
142
|
+
}
|
|
115
143
|
/**
|
|
116
144
|
* Run `codex exec` for one narrative-generation turn. Returns the
|
|
117
145
|
* text body of Codex's response (stdout), or null on failure /
|
|
118
146
|
* timeout. Bounded to a short per-turn timeout so a flaky network
|
|
119
147
|
* doesn't stall the wizard.
|
|
148
|
+
*
|
|
149
|
+
* Shows a spinner while the call is running so the user sees
|
|
150
|
+
* visible feedback during the latency window (avoids the
|
|
151
|
+
* "is-it-frozen?" reflex that triggers buffered-Enter bugs).
|
|
120
152
|
*/
|
|
121
153
|
function runCodexNarrative(codexPath, prompt, options) {
|
|
154
|
+
const spinner = startSpinner('composing…');
|
|
122
155
|
try {
|
|
123
156
|
const result = spawnSync(codexPath, [
|
|
124
157
|
'exec',
|
|
@@ -153,6 +186,9 @@ function runCodexNarrative(codexPath, prompt, options) {
|
|
|
153
186
|
catch {
|
|
154
187
|
return null;
|
|
155
188
|
}
|
|
189
|
+
finally {
|
|
190
|
+
spinner.stop();
|
|
191
|
+
}
|
|
156
192
|
}
|
|
157
193
|
/**
|
|
158
194
|
* Prompt the user with readline. Returns the trimmed answer (may be
|
|
@@ -169,10 +205,23 @@ async function askUser(promptText) {
|
|
|
169
205
|
}
|
|
170
206
|
/**
|
|
171
207
|
* Render a state to the user: narrative paragraph (LLM-generated) +
|
|
172
|
-
* structural prompt (verbatim). Then read the answer
|
|
208
|
+
* structural prompt (verbatim). Then read the answer, validating it
|
|
209
|
+
* against the state's `validate` function. On invalid input, prints
|
|
210
|
+
* the validator's friendly retry message and re-asks WITHOUT
|
|
211
|
+
* regenerating the narrative paragraph (cheap loop, no extra codex
|
|
212
|
+
* exec calls). Returns the first answer that passes validation.
|
|
213
|
+
*
|
|
214
|
+
* This is the structural answer to the buffered-Enter bug from
|
|
215
|
+
* v1.2.13 — the user could press Enter during the silent codex
|
|
216
|
+
* narrative window, that Enter would buffer in stdin, and the next
|
|
217
|
+
* readline would consume it as an empty answer to a required field
|
|
218
|
+
* (silently defaulting agent-name to "agent"). With validate +
|
|
219
|
+
* retry-loop, an empty submission to a required field surfaces a
|
|
220
|
+
* friendly reprompt instead of accepting the default.
|
|
173
221
|
*/
|
|
174
222
|
async function renderNarrativeState(state, answers, options) {
|
|
175
|
-
// Generate narrative
|
|
223
|
+
// Generate narrative once per state entry (re-asks on validation
|
|
224
|
+
// failure skip this and just re-print the question).
|
|
176
225
|
let narrative = null;
|
|
177
226
|
if (options.enableNarrative !== false) {
|
|
178
227
|
const prompt = narrativeFor(state.id, answers, { projectDir: options.projectDir });
|
|
@@ -193,6 +242,23 @@ async function renderNarrativeState(state, answers, options) {
|
|
|
193
242
|
: '';
|
|
194
243
|
if (placeholderHint)
|
|
195
244
|
console.log(placeholderHint);
|
|
245
|
+
// Retry loop: at most 5 attempts so a wedged input doesn't trap
|
|
246
|
+
// the wizard forever. After 5 invalid attempts we let the answer
|
|
247
|
+
// through; the state machine's `next` function still has its own
|
|
248
|
+
// resolveChoice fallback so the wizard doesn't crash.
|
|
249
|
+
for (let attempt = 0; attempt < 5; attempt++) {
|
|
250
|
+
const answer = await askUser(' > ');
|
|
251
|
+
if (!state.validate)
|
|
252
|
+
return answer;
|
|
253
|
+
const validationMsg = state.validate(answer);
|
|
254
|
+
if (validationMsg === null)
|
|
255
|
+
return answer;
|
|
256
|
+
console.log();
|
|
257
|
+
console.log(pc.yellow(` ${validationMsg}`));
|
|
258
|
+
console.log();
|
|
259
|
+
}
|
|
260
|
+
// Last-resort: take whatever was last typed even if invalid. The
|
|
261
|
+
// state machine's `next` should still produce a usable transition.
|
|
196
262
|
return askUser(' > ');
|
|
197
263
|
}
|
|
198
264
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"codex-driver.js","sourceRoot":"","sources":["../../../src/commands/setup-wizard/codex-driver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AACpE,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,QAAQ,MAAM,eAAe,CAAC;AACrC,OAAO,EAAE,MAAM,YAAY,CAAC;AAC5B,OAAO,EACL,wBAAwB,EACxB,aAAa,
|
|
1
|
+
{"version":3,"file":"codex-driver.js","sourceRoot":"","sources":["../../../src/commands/setup-wizard/codex-driver.ts"],"names":[],"mappings":"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"}
|
|
@@ -53,6 +53,7 @@ export interface NarrativeState {
|
|
|
53
53
|
input: {
|
|
54
54
|
kind: 'text';
|
|
55
55
|
placeholder?: string;
|
|
56
|
+
required?: boolean;
|
|
56
57
|
} | {
|
|
57
58
|
kind: 'choice';
|
|
58
59
|
choices: Array<{
|
|
@@ -60,6 +61,16 @@ export interface NarrativeState {
|
|
|
60
61
|
label: string;
|
|
61
62
|
}>;
|
|
62
63
|
};
|
|
64
|
+
/**
|
|
65
|
+
* Validate the user's raw answer BEFORE the driver routes it through
|
|
66
|
+
* `next`. Return `null` to accept; return a friendly message to
|
|
67
|
+
* surface to the user and re-render the same state. This is how
|
|
68
|
+
* the wizard catches buffered-Enter empty submissions on required
|
|
69
|
+
* fields and unmatched choice inputs — surfaces an "I think
|
|
70
|
+
* something slipped through, try again" reprompt instead of
|
|
71
|
+
* silently defaulting.
|
|
72
|
+
*/
|
|
73
|
+
validate?: (answer: string) => string | null;
|
|
63
74
|
/** Where to go next based on the user's answer. Driver invokes this. */
|
|
64
75
|
next: (answer: string, answers: WizardAnswers) => {
|
|
65
76
|
state: string;
|
|
@@ -92,6 +103,21 @@ export declare function resolveChoice(answer: string, choices: Array<{
|
|
|
92
103
|
value: string;
|
|
93
104
|
label: string;
|
|
94
105
|
}>): string | null;
|
|
106
|
+
/**
|
|
107
|
+
* Standard validator: require non-empty trimmed text. Surfaces a
|
|
108
|
+
* friendly reprompt when the user submits whitespace-only (the
|
|
109
|
+
* classic buffered-Enter problem).
|
|
110
|
+
*/
|
|
111
|
+
export declare function requireNonEmpty(fieldLabel: string): (answer: string) => string | null;
|
|
112
|
+
/**
|
|
113
|
+
* Standard validator for a choice prompt: surfaces a friendly retry
|
|
114
|
+
* when the user's input matches none of the offered choices (by
|
|
115
|
+
* number, value, or label prefix).
|
|
116
|
+
*/
|
|
117
|
+
export declare function requireChoice(choices: Array<{
|
|
118
|
+
value: string;
|
|
119
|
+
label: string;
|
|
120
|
+
}>): (answer: string) => string | null;
|
|
95
121
|
/**
|
|
96
122
|
* Build the wizard state machine for a fresh project-bound install
|
|
97
123
|
* (the most common entry point — and the one observed broken in the
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"state-machine.d.ts","sourceRoot":"","sources":["../../../src/commands/setup-wizard/state-machine.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,MAAM,MAAM,QAAQ,GAAG,QAAQ,GAAG,WAAW,GAAG,YAAY,CAAC;AAC7D,MAAM,MAAM,SAAS,GAAG,UAAU,GAAG,UAAU,GAAG,OAAO,GAAG,MAAM,CAAC;AAEnE,MAAM,WAAW,aAAa;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,MAAM,gBAAgB,GACxB,MAAM,GACN,UAAU,GACV,wBAAwB,GACxB,wBAAwB,GACxB,qBAAqB,GACrB,eAAe,GACf,cAAc,GACd,mBAAmB,GACnB,eAAe,CAAC;AAEpB,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,gBAAgB,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,MAAM,SAAS,GAAG,uBAAuB,GAAG,QAAQ,GAAG,UAAU,CAAC;AAExE,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,uBAAuB,CAAC;IAC9B;;;;;OAKG;IACH,MAAM,EAAE,MAAM,CAAC;IACf,kFAAkF;IAClF,gBAAgB,EAAE,MAAM,CAAC;IACzB,KAAK,EACD;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,
|
|
1
|
+
{"version":3,"file":"state-machine.d.ts","sourceRoot":"","sources":["../../../src/commands/setup-wizard/state-machine.ts"],"names":[],"mappings":"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"}
|
|
@@ -39,6 +39,32 @@ export function resolveChoice(answer, choices) {
|
|
|
39
39
|
}
|
|
40
40
|
return null;
|
|
41
41
|
}
|
|
42
|
+
/**
|
|
43
|
+
* Standard validator: require non-empty trimmed text. Surfaces a
|
|
44
|
+
* friendly reprompt when the user submits whitespace-only (the
|
|
45
|
+
* classic buffered-Enter problem).
|
|
46
|
+
*/
|
|
47
|
+
export function requireNonEmpty(fieldLabel) {
|
|
48
|
+
return (answer) => {
|
|
49
|
+
if (answer.trim().length === 0) {
|
|
50
|
+
return `That looked blank — did an extra Enter slip through? Try typing a ${fieldLabel}.`;
|
|
51
|
+
}
|
|
52
|
+
return null;
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Standard validator for a choice prompt: surfaces a friendly retry
|
|
57
|
+
* when the user's input matches none of the offered choices (by
|
|
58
|
+
* number, value, or label prefix).
|
|
59
|
+
*/
|
|
60
|
+
export function requireChoice(choices) {
|
|
61
|
+
return (answer) => {
|
|
62
|
+
if (resolveChoice(answer, choices) === null) {
|
|
63
|
+
return `I didn't recognize that — try typing one of the numbers (1-${choices.length}) or the option name.`;
|
|
64
|
+
}
|
|
65
|
+
return null;
|
|
66
|
+
};
|
|
67
|
+
}
|
|
42
68
|
/**
|
|
43
69
|
* Build the wizard state machine for a fresh project-bound install
|
|
44
70
|
* (the most common entry point — and the one observed broken in the
|
|
@@ -67,11 +93,15 @@ export function buildFreshProjectInstall() {
|
|
|
67
93
|
{ value: 'no', label: 'Not right now' },
|
|
68
94
|
],
|
|
69
95
|
},
|
|
96
|
+
validate: requireChoice([
|
|
97
|
+
{ value: 'yes', label: 'Yes, let\'s go' },
|
|
98
|
+
{ value: 'no', label: 'Not right now' },
|
|
99
|
+
]),
|
|
70
100
|
next: (answer) => {
|
|
71
101
|
const choice = resolveChoice(answer, [
|
|
72
102
|
{ value: 'yes', label: 'Yes, let\'s go' },
|
|
73
103
|
{ value: 'no', label: 'Not right now' },
|
|
74
|
-
])
|
|
104
|
+
]); // validator guarantees non-null here
|
|
75
105
|
return choice === 'no'
|
|
76
106
|
? { state: 'declined', updates: {} }
|
|
77
107
|
: { state: 'agent-name', updates: {} };
|
|
@@ -82,10 +112,11 @@ export function buildFreshProjectInstall() {
|
|
|
82
112
|
kind: 'narrative-then-prompt',
|
|
83
113
|
narrativeContext: 'agent-name',
|
|
84
114
|
prompt: 'What would you like to call your agent? (a single word works best)',
|
|
85
|
-
input: { kind: 'text', placeholder: 'e.g. echo, scout, codey' },
|
|
115
|
+
input: { kind: 'text', placeholder: 'e.g. echo, scout, codey', required: true },
|
|
116
|
+
validate: requireNonEmpty('name'),
|
|
86
117
|
next: (answer) => ({
|
|
87
118
|
state: 'agent-role',
|
|
88
|
-
updates: { agentName: answer.trim()
|
|
119
|
+
updates: { agentName: answer.trim() },
|
|
89
120
|
}),
|
|
90
121
|
},
|
|
91
122
|
'agent-role': {
|
|
@@ -93,10 +124,11 @@ export function buildFreshProjectInstall() {
|
|
|
93
124
|
kind: 'narrative-then-prompt',
|
|
94
125
|
narrativeContext: 'agent-role',
|
|
95
126
|
prompt: 'In one sentence, what should this agent focus on? (you can change this anytime)',
|
|
96
|
-
input: { kind: 'text', placeholder: 'e.g. coding assistant for this project' },
|
|
127
|
+
input: { kind: 'text', placeholder: 'e.g. coding assistant for this project', required: true },
|
|
128
|
+
validate: requireNonEmpty('focus or purpose'),
|
|
97
129
|
next: (answer) => ({
|
|
98
130
|
state: 'user-name',
|
|
99
|
-
updates: { agentRole: answer.trim()
|
|
131
|
+
updates: { agentRole: answer.trim() },
|
|
100
132
|
}),
|
|
101
133
|
},
|
|
102
134
|
'user-name': {
|
|
@@ -104,10 +136,11 @@ export function buildFreshProjectInstall() {
|
|
|
104
136
|
kind: 'narrative-then-prompt',
|
|
105
137
|
narrativeContext: 'user-name',
|
|
106
138
|
prompt: 'And what should the agent call you?',
|
|
107
|
-
input: { kind: 'text', placeholder: 'your first name is fine' },
|
|
139
|
+
input: { kind: 'text', placeholder: 'your first name is fine', required: true },
|
|
140
|
+
validate: requireNonEmpty('name'),
|
|
108
141
|
next: (answer) => ({
|
|
109
142
|
state: 'autonomy',
|
|
110
|
-
updates: { userName: answer.trim()
|
|
143
|
+
updates: { userName: answer.trim() },
|
|
111
144
|
}),
|
|
112
145
|
},
|
|
113
146
|
autonomy: {
|
|
@@ -127,13 +160,18 @@ export function buildFreshProjectInstall() {
|
|
|
127
160
|
{ value: 'autonomous', label: 'Autonomous' },
|
|
128
161
|
],
|
|
129
162
|
},
|
|
163
|
+
validate: requireChoice([
|
|
164
|
+
{ value: 'guided', label: 'Guided' },
|
|
165
|
+
{ value: 'proactive', label: 'Proactive' },
|
|
166
|
+
{ value: 'autonomous', label: 'Autonomous' },
|
|
167
|
+
]),
|
|
130
168
|
next: (answer) => {
|
|
131
169
|
const a = resolveChoice(answer, [
|
|
132
170
|
{ value: 'guided', label: 'Guided' },
|
|
133
171
|
{ value: 'proactive', label: 'Proactive' },
|
|
134
172
|
{ value: 'autonomous', label: 'Autonomous' },
|
|
135
173
|
]);
|
|
136
|
-
return { state: 'do-init', updates: { autonomy: a
|
|
174
|
+
return { state: 'do-init', updates: { autonomy: a } };
|
|
137
175
|
},
|
|
138
176
|
},
|
|
139
177
|
'do-init': {
|
|
@@ -167,14 +205,19 @@ export function buildFreshProjectInstall() {
|
|
|
167
205
|
{ value: 'skip', label: 'Skip' },
|
|
168
206
|
],
|
|
169
207
|
},
|
|
208
|
+
validate: requireChoice([
|
|
209
|
+
{ value: 'telegram', label: 'Telegram' },
|
|
210
|
+
{ value: 'whatsapp', label: 'WhatsApp' },
|
|
211
|
+
{ value: 'slack', label: 'Slack' },
|
|
212
|
+
{ value: 'skip', label: 'Skip' },
|
|
213
|
+
]),
|
|
170
214
|
next: (answer) => {
|
|
171
|
-
const
|
|
215
|
+
const messaging = resolveChoice(answer, [
|
|
172
216
|
{ value: 'telegram', label: 'Telegram' },
|
|
173
217
|
{ value: 'whatsapp', label: 'WhatsApp' },
|
|
174
218
|
{ value: 'slack', label: 'Slack' },
|
|
175
219
|
{ value: 'skip', label: 'Skip' },
|
|
176
220
|
]);
|
|
177
|
-
const messaging = m ?? 'skip';
|
|
178
221
|
if (messaging === 'telegram')
|
|
179
222
|
return { state: 'do-telegram', updates: { messaging } };
|
|
180
223
|
if (messaging === 'whatsapp')
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"state-machine.js","sourceRoot":"","sources":["../../../src/commands/setup-wizard/state-machine.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;
|
|
1
|
+
{"version":3,"file":"state-machine.js","sourceRoot":"","sources":["../../../src/commands/setup-wizard/state-machine.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "./builtin-manifest.schema.json",
|
|
3
3
|
"schemaVersion": 1,
|
|
4
|
-
"generatedAt": "2026-05-
|
|
5
|
-
"instarVersion": "1.2.
|
|
4
|
+
"generatedAt": "2026-05-21T23:32:22.253Z",
|
|
5
|
+
"instarVersion": "1.2.14",
|
|
6
6
|
"entryCount": 191,
|
|
7
7
|
"entries": {
|
|
8
8
|
"hook:session-start": {
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
# Upgrade Guide — v1.2.14 (wizard validation + composing indicator)
|
|
2
|
+
|
|
3
|
+
<!-- bump: patch -->
|
|
4
|
+
<!-- patch = bug fixes, refactors, test additions, doc updates -->
|
|
5
|
+
|
|
6
|
+
## What Changed
|
|
7
|
+
|
|
8
|
+
**Fix: the wizard now catches buffered-Enter and surfaces a visible
|
|
9
|
+
indicator during Codex narrative calls.**
|
|
10
|
+
|
|
11
|
+
End-to-end testing v1.2.13 on a real Codex install surfaced a UX
|
|
12
|
+
failure. The user typed an answer and pressed Enter, then — because
|
|
13
|
+
the next Codex-narrative call took several seconds with no visible
|
|
14
|
+
feedback — pressed Enter again thinking the terminal was frozen. The
|
|
15
|
+
extra Enter buffered in stdin, was consumed by the next prompt as
|
|
16
|
+
an empty submission, and the wizard silently defaulted the agent's
|
|
17
|
+
name to "agent". The user ended up with an agent that had a generic
|
|
18
|
+
identity they never picked.
|
|
19
|
+
|
|
20
|
+
Two structural fixes, both in `src/commands/setup-wizard/`:
|
|
21
|
+
|
|
22
|
+
1. **Per-state validators** on the state machine. Each
|
|
23
|
+
narrative-then-prompt state can now declare a `validate` function
|
|
24
|
+
that rejects invalid input and surfaces a friendly retry message
|
|
25
|
+
without re-generating the Codex narrative paragraph (cheap loop,
|
|
26
|
+
no extra LLM calls). Reusable validators:
|
|
27
|
+
- `requireNonEmpty(fieldLabel)`: rejects whitespace-only
|
|
28
|
+
submissions on required text fields with an explicit
|
|
29
|
+
"did an extra Enter slip through?" nudge.
|
|
30
|
+
- `requireChoice(choices)`: rejects unmatched input on choice
|
|
31
|
+
prompts with a "try one of these numbers" nudge.
|
|
32
|
+
|
|
33
|
+
Wired on every narrative state in the fresh-project-install
|
|
34
|
+
graph. Bounded at 5 retry attempts to prevent infinite loops
|
|
35
|
+
on wedged input.
|
|
36
|
+
|
|
37
|
+
2. **Composing spinner** during codex narrative calls. A braille
|
|
38
|
+
spinner ("⠋ composing…") animates on a single line while
|
|
39
|
+
`codex exec` runs; clears cleanly when the paragraph arrives.
|
|
40
|
+
On non-TTY (CI, piped output) it prints "composing…" once and
|
|
41
|
+
stops. Eliminates the silent-dead-air window that triggered
|
|
42
|
+
buffered-Enter in the first place.
|
|
43
|
+
|
|
44
|
+
The silent-default fallback that accepted empty agent-name as
|
|
45
|
+
"agent" is removed. With validators upstream, the state machine
|
|
46
|
+
only ever sees valid input.
|
|
47
|
+
|
|
48
|
+
Spec: `specs/dev-infrastructure/wizard-validation.md`.
|
|
49
|
+
ELI16: `specs/dev-infrastructure/wizard-validation.eli16.md`.
|
|
50
|
+
Side-effects review: `upgrades/side-effects/fix-wizard-validation.md`.
|
|
51
|
+
|
|
52
|
+
## What to Tell Your User
|
|
53
|
+
|
|
54
|
+
The setup wizard now shows a spinner while it's thinking, so you
|
|
55
|
+
can tell the system is working during the longer steps. If you
|
|
56
|
+
accidentally press Enter twice (which is easy to do during the
|
|
57
|
+
think pauses), the wizard will catch it and re-ask the question
|
|
58
|
+
instead of silently moving on with a blank answer.
|
|
59
|
+
|
|
60
|
+
## Summary of New Capabilities
|
|
61
|
+
|
|
62
|
+
No new capabilities. UX hardening on top of v1.2.13's hybrid wizard.
|
|
63
|
+
|
|
64
|
+
## Evidence
|
|
65
|
+
|
|
66
|
+
Reproduction prior to fix: v1.2.13 install on `instar-codey` with
|
|
67
|
+
Codex CLI. User entered "1" + Enter at welcome, then pressed Enter
|
|
68
|
+
again during the silent codex-narrative call. The second Enter was
|
|
69
|
+
consumed by the agent-name prompt as an empty submission;
|
|
70
|
+
agentName defaulted to "agent"; wizard proceeded with the generic
|
|
71
|
+
identity.
|
|
72
|
+
|
|
73
|
+
After fix:
|
|
74
|
+
- 14 new state-machine unit tests cover the two validator helpers
|
|
75
|
+
and the per-state validator wiring (welcome, agent-name,
|
|
76
|
+
agent-role, user-name, autonomy, messaging).
|
|
77
|
+
- Existing 12 state-graph tests still pass.
|
|
78
|
+
- Existing 5 dispatch canary tests still pass.
|
|
79
|
+
- Manual end-to-end re-test pending on publish.
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
# Side-effects review — Wizard input validation + spinner
|
|
2
|
+
|
|
3
|
+
Per L6. Seven dimensions.
|
|
4
|
+
|
|
5
|
+
## 1. Over-block / under-block
|
|
6
|
+
|
|
7
|
+
Before: UNDER. The v1.2.13 hybrid wizard accepted empty submissions
|
|
8
|
+
on required identity fields with a silent fallback default
|
|
9
|
+
(agentName: 'agent'). Combined with the invisible-latency window on
|
|
10
|
+
codex-narrative calls, this produced the buffered-Enter bug Justin
|
|
11
|
+
hit on his first real Codex install — agent named "agent" without
|
|
12
|
+
the user ever typing a name.
|
|
13
|
+
|
|
14
|
+
After: precisely targeted. Validators enforce non-empty input on
|
|
15
|
+
required text fields and reject unmatched input on choice prompts.
|
|
16
|
+
Spinner during codex calls eliminates the silent-dead-air window
|
|
17
|
+
that triggers buffered-Enter in the first place. No over-block:
|
|
18
|
+
optional/derived fields keep their defaults; the validation
|
|
19
|
+
machinery only kicks in for fields the wizard explicitly marks as
|
|
20
|
+
required.
|
|
21
|
+
|
|
22
|
+
## 2. Level-of-abstraction fit
|
|
23
|
+
|
|
24
|
+
The `validate?` field is an optional addition to the existing
|
|
25
|
+
`NarrativeState` interface. Two reusable validators
|
|
26
|
+
(`requireNonEmpty`, `requireChoice`) live alongside the state
|
|
27
|
+
graph in `state-machine.ts`. The driver's `renderNarrativeState`
|
|
28
|
+
adds a bounded retry loop around `askUser`. The spinner is a
|
|
29
|
+
single utility function with a `{stop}` handle pattern.
|
|
30
|
+
|
|
31
|
+
No new module, no new abstraction layer. The state machine's API
|
|
32
|
+
grew by exactly one optional field.
|
|
33
|
+
|
|
34
|
+
## 3. Signal vs Authority compliance
|
|
35
|
+
|
|
36
|
+
- The validator's return value is the AUTHORITY for "is this
|
|
37
|
+
answer accepted." The driver respects it without second-guessing.
|
|
38
|
+
- The user's input remains the SIGNAL; the validator transforms
|
|
39
|
+
invalid SIGNALs into "retry with this hint" rather than silently
|
|
40
|
+
defaulting.
|
|
41
|
+
- The spinner is purely visual feedback — no authority, no signal.
|
|
42
|
+
|
|
43
|
+
## 4. Interactions with adjacent systems
|
|
44
|
+
|
|
45
|
+
- **State machine `next` functions**: simplified. The pre-fix code
|
|
46
|
+
on agent-name etc. was `answer.trim() || 'agent'`; post-fix is
|
|
47
|
+
`answer.trim()`. The validator ensures `next` only sees non-empty
|
|
48
|
+
trimmed input.
|
|
49
|
+
- **Codex driver dispatch in setup.ts**: unchanged. setup.ts still
|
|
50
|
+
routes codex-cli installs through `runCodexWizard`.
|
|
51
|
+
- **runCodexNarrative**: now wraps its spawnSync in a spinner
|
|
52
|
+
start/stop. Spinner is a no-op on non-TTY (CI, piped output) so
|
|
53
|
+
test environments aren't affected.
|
|
54
|
+
- **Existing canary test** (`tests/unit/setup-codex-model-canary.test.ts`):
|
|
55
|
+
unchanged. Asserts the same dispatch contract; the validator
|
|
56
|
+
additions don't touch the dispatch shape.
|
|
57
|
+
- **State-machine unit tests**: expanded from 12 to 26 cases.
|
|
58
|
+
Added validator-specific tests (requireNonEmpty, requireChoice,
|
|
59
|
+
per-state validator wiring).
|
|
60
|
+
- **Claude wizard path**: completely unaffected. Validators live on
|
|
61
|
+
the state-machine API, but the Claude path doesn't go through
|
|
62
|
+
the state machine — it spawns the existing /setup-wizard
|
|
63
|
+
slash-command directly.
|
|
64
|
+
|
|
65
|
+
## 5. Rollback cost
|
|
66
|
+
|
|
67
|
+
Low. New optional `validate` field on NarrativeState; new
|
|
68
|
+
validators; new spinner helper; one retry loop in the driver.
|
|
69
|
+
`git revert` restores v1.2.13 (with the buffered-Enter bug).
|
|
70
|
+
|
|
71
|
+
## 6. Backwards compatibility / drift surface
|
|
72
|
+
|
|
73
|
+
Fully backwards-compatible.
|
|
74
|
+
|
|
75
|
+
- States without a `validate` function skip validation entirely
|
|
76
|
+
and accept the answer immediately. No existing state is broken
|
|
77
|
+
by the addition.
|
|
78
|
+
- Validators are pure functions with stable contracts. Drift
|
|
79
|
+
surface: validator messages. If a message text needs to change,
|
|
80
|
+
update the validator's return value — visible in PR diff.
|
|
81
|
+
- No config schema change. No agent-installed-files change. No
|
|
82
|
+
PostUpdateMigrator work.
|
|
83
|
+
|
|
84
|
+
## 7. Authorization / Trust posture
|
|
85
|
+
|
|
86
|
+
No new authority. The validator is run inside the same wizard
|
|
87
|
+
process with the same user. No new privilege, no new sandbox, no
|
|
88
|
+
new auth.
|
|
89
|
+
|
|
90
|
+
## Outcome
|
|
91
|
+
|
|
92
|
+
Ship. Closes the broken-on-buffered-Enter UX hole that the
|
|
93
|
+
instar-codey real-user test surfaced. Structural validation +
|
|
94
|
+
visible composing indicator together address the failure-mode
|
|
95
|
+
chain (silent latency → user reflex → buffered Enter → empty
|
|
96
|
+
submission accepted). Validator extensibility lands cleanly on
|
|
97
|
+
the existing state-machine API. 26 unit tests cover the
|
|
98
|
+
validators + wiring.
|