@cspeach/cli 1.1.13 → 1.1.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.
@@ -1,6 +1,6 @@
1
1
  // GENERATED FILE — bundled skills for local mode.
2
2
  // Source: https://manifest.cspeach.dev/v1.json
3
- // Generated: 2026-09-17T21:24:04.334Z
3
+ // Generated: 2026-09-17T22:46:40.872Z
4
4
  // Manifest signature verified at build time.
5
5
  export const BUNDLED_SKILLS = {
6
6
  "abap-atc-fix": {
@@ -199,8 +199,16 @@ export function AskForm({ request, onResolve }) {
199
199
  const values = q.options
200
200
  .filter((o) => multiSel[focus].has(o.value))
201
201
  .map((o) => o.value);
202
- if (values.length === 0)
203
- return; // nothing toggled yet — toggle or use Other
202
+ if (values.length === 0) {
203
+ // 2026-09-17 — nothing toggled: Enter used to do NOTHING, silently.
204
+ // Every other question answers on Enter, so a user who arrows to a
205
+ // row and presses Enter (Glenn's first session) sat there stuck.
206
+ // Enter alone now picks the highlighted option, single-choice style.
207
+ const opt = q.options[cursor];
208
+ if (opt)
209
+ answerAndAdvance(focus, opt.value);
210
+ return;
211
+ }
204
212
  answerAndAdvance(focus, values.join(','));
205
213
  }
206
214
  else {
@@ -220,7 +228,7 @@ export function AskForm({ request, onResolve }) {
220
228
  const cur = i === focus;
221
229
  const done = answers[i] !== null;
222
230
  return (_jsxs(Text, { color: cur ? PEACH : undefined, bold: cur, dimColor: !cur, children: [i > 0 ? ' ' : '', done ? '✓ ' : '', qq.header ?? qq.id] }, qq.id));
223
- }) }) }), isSubmit ? (_jsx(Text, { dimColor: true, wrap: "truncate-end", children: "All questions answered \u2014 Tab/\u2190 to review, Enter to submit \u00B7 Esc cancel" })) : q ? (_jsxs(_Fragment, { children: [_jsx(Text, { bold: true, wrap: "truncate-end", children: q.question }), q.context && _jsx(Text, { dimColor: true, wrap: "truncate-end", children: q.context }), !q.freeText && (_jsxs(_Fragment, { children: [winStart > 0 && _jsxs(Text, { dimColor: true, wrap: "truncate-end", children: [" \u2191 ", winStart, " more"] }), visible.map((o, vi) => {
231
+ }) }) }), isSubmit ? (_jsx(Text, { dimColor: true, wrap: "truncate-end", children: "All questions answered \u2014 Tab/\u2190 to review, Enter to submit \u00B7 Esc cancel" })) : q ? (_jsxs(_Fragment, { children: [_jsxs(Text, { bold: true, wrap: "truncate-end", children: [q.question, q.multiSelect ? ' (choose one or more)' : ''] }), q.context && _jsx(Text, { dimColor: true, wrap: "truncate-end", children: q.context }), !q.freeText && (_jsxs(_Fragment, { children: [winStart > 0 && _jsxs(Text, { dimColor: true, wrap: "truncate-end", children: [" \u2191 ", winStart, " more"] }), visible.map((o, vi) => {
224
232
  const idx = winStart + vi;
225
233
  const isCur = !otherFocused && idx === cursor;
226
234
  const mark = q.multiSelect
@@ -24,7 +24,9 @@ import TextInput from '../text-input.js';
24
24
  const PEACH = '#FFCBA4';
25
25
  export function askHelpLine(kind, opts) {
26
26
  switch (kind) {
27
- case 'multi': return 'Space toggle · Enter confirm · Esc cancel';
27
+ // 2026-09-17 — spelled out after a first-session user could not tell a
28
+ // multi-select from a single pick ("was it a multi select?").
29
+ case 'multi': return 'Space ticks a row · Enter confirms · Enter alone picks the highlighted row · Esc cancels';
28
30
  case 'pick': return opts?.single ? 'Enter pick · Esc cancel' : 'Enter pick · Tab next · Esc cancel';
29
31
  default: return opts?.single ? 'Enter submit · Esc cancel' : 'Tab next · Esc cancel';
30
32
  }
@@ -153,14 +155,20 @@ function MultiForm({ params, onResolve }) {
153
155
  .filter((c) => selected.has(c.value))
154
156
  .map((c) => c.value);
155
157
  if (values.length === 0) {
156
- onResolve({ answer: null, cancelled: true });
158
+ // 2026-09-17 — nothing toggled: Enter alone picks the highlighted
159
+ // option (single-choice muscle memory) instead of cancelling.
160
+ const current = params.choices[cursor];
161
+ if (current)
162
+ onResolve({ answer: current.value });
163
+ else
164
+ onResolve({ answer: null, cancelled: true });
157
165
  }
158
166
  else {
159
167
  onResolve({ answer: values.join(',') });
160
168
  }
161
169
  }
162
170
  }, { isActive: true });
163
- return (_jsxs(Box, { flexDirection: "column", paddingX: 1, flexShrink: 0, children: [_jsx(Text, { bold: true, children: params.question }), params.context && (_jsx(Box, { marginTop: 1, children: _jsx(Text, { dimColor: true, children: params.context }) })), _jsx(Box, { marginTop: 1, flexDirection: "column", children: params.choices.map((c, i) => {
171
+ return (_jsxs(Box, { flexDirection: "column", paddingX: 1, flexShrink: 0, children: [_jsxs(Text, { bold: true, children: [params.question, " (choose one or more)"] }), params.context && (_jsx(Box, { marginTop: 1, children: _jsx(Text, { dimColor: true, children: params.context }) })), _jsx(Box, { marginTop: 1, flexDirection: "column", children: params.choices.map((c, i) => {
164
172
  const isCursor = i === cursor;
165
173
  const isSelected = selected.has(c.value);
166
174
  const mark = isSelected ? '◉' : '○';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cspeach/cli",
3
- "version": "1.1.13",
3
+ "version": "1.1.14",
4
4
  "description": "CSPeach — AI-assisted ABAP development CLI. Direct SAP access, 34 skills, safety gates.",
5
5
  "keywords": [
6
6
  "abap",