@contentful/experience-design-system-cli 2.37.1-dev-build-c3291210.0 → 2.37.1-dev-build-0d4be259.0

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/app.js CHANGED
@@ -2018,7 +2018,7 @@ var init_cache_keys = __esm({
2018
2018
 
2019
2019
  // packages/experience-design-system-cli/app.tsx
2020
2020
  import { join as join25 } from "node:path";
2021
- import { useEffect as useEffect28, useState as useState33 } from "react";
2021
+ import { useEffect as useEffect27, useState as useState33 } from "react";
2022
2022
 
2023
2023
  // packages/experience-design-system-cli/src/tui/home/home.tsx
2024
2024
  import { useEffect as useEffect2, useState as useState2 } from "react";
@@ -2240,14 +2240,9 @@ function HomeScreen({ onNavigate }) {
2240
2240
  }
2241
2241
 
2242
2242
  // packages/experience-design-system-cli/src/tui/import/PageContainer.tsx
2243
- import { useEffect as useEffect3 } from "react";
2244
- import { Box as Box2, Text as Text3, useInput as useInput2, useStdout as useStdout2 } from "ink";
2243
+ import { Box as Box2, Text as Text3, useInput as useInput2 } from "ink";
2245
2244
  import { jsx as jsx3, jsxs as jsxs2 } from "react/jsx-runtime";
2246
2245
  function ImportScreen({ exitCode, onDone }) {
2247
- const { stdout } = useStdout2();
2248
- useEffect3(() => {
2249
- stdout.write("\x1B[H\x1B[0J");
2250
- }, [stdout]);
2251
2246
  useInput2((input, key) => {
2252
2247
  if (key.return || key.escape || input === "q") {
2253
2248
  onDone();
@@ -2455,7 +2450,7 @@ function TokenInputScreen({ onConfirm, onBack, initialPath = "" }) {
2455
2450
  }
2456
2451
 
2457
2452
  // packages/experience-design-system-cli/src/tui/import/steps/03-path-validation/screen.tsx
2458
- import { useEffect as useEffect4, useMemo, useState as useState5 } from "react";
2453
+ import { useEffect as useEffect3, useMemo, useState as useState5 } from "react";
2459
2454
  import { Box as Box5, Text as Text6 } from "ink";
2460
2455
 
2461
2456
  // packages/experience-design-system-cli/src/tui/import/steps/03-path-validation/controls.ts
@@ -16616,7 +16611,7 @@ function PathValidationScreen({
16616
16611
  }) {
16617
16612
  const resolvedPath = useMemo(() => resolveUserPath(projectPath), [projectPath]);
16618
16613
  const [scan, setScan] = useState5();
16619
- useEffect4(() => {
16614
+ useEffect3(() => {
16620
16615
  setScan(scanFiles(resolvedPath));
16621
16616
  }, [resolvedPath]);
16622
16617
  const phase = phaseOf(scan);
@@ -16984,10 +16979,10 @@ var PROGRESS_THEME = extendTheme(defaultTheme, {
16984
16979
  });
16985
16980
 
16986
16981
  // packages/experience-design-system-cli/src/tui/import/shared/running-step/use-elapsed.ts
16987
- import { useEffect as useEffect5, useState as useState7 } from "react";
16982
+ import { useEffect as useEffect4, useState as useState7 } from "react";
16988
16983
  function useElapsed() {
16989
16984
  const [seconds, setSeconds] = useState7(0);
16990
- useEffect5(() => {
16985
+ useEffect4(() => {
16991
16986
  const timer = setInterval(() => setSeconds((current) => current + 1), 1e3);
16992
16987
  return () => clearInterval(timer);
16993
16988
  }, []);
@@ -17225,7 +17220,7 @@ async function updateSettings2(patch) {
17225
17220
  }
17226
17221
 
17227
17222
  // packages/experience-design-system-cli/src/tui/import/steps/06-extraction/use-extraction.ts
17228
- import { useEffect as useEffect6, useRef as useRef2, useState as useState8 } from "react";
17223
+ import { useEffect as useEffect5, useRef as useRef2, useState as useState8 } from "react";
17229
17224
 
17230
17225
  // packages/experience-design-system-cli/src/tui/import/steps/06-extraction/run.ts
17231
17226
  import { mkdir as mkdir7 } from "node:fs/promises";
@@ -17484,7 +17479,7 @@ async function resolveSelectionPrompt(overrides) {
17484
17479
  function useExtraction(input) {
17485
17480
  const [state, setState] = useState8();
17486
17481
  const current = useRef2();
17487
- useEffect6(() => {
17482
+ useEffect5(() => {
17488
17483
  current.current = input;
17489
17484
  if (!input) {
17490
17485
  setState(void 0);
@@ -17514,7 +17509,7 @@ function useExtraction(input) {
17514
17509
  import { Box as Box20, Text as Text22 } from "ink";
17515
17510
 
17516
17511
  // packages/experience-design-system-cli/src/tui/import/steps/07-scope-gate/panels/added-column.tsx
17517
- import React7 from "react";
17512
+ import React6 from "react";
17518
17513
  import { Box as Box11, Text as Text12 } from "ink";
17519
17514
  import figures from "figures";
17520
17515
 
@@ -17715,7 +17710,7 @@ function AddedColumn(props) {
17715
17710
  const aiFlagged = aiFlaggedByKey?.get(entry.name) === true;
17716
17711
  const showSeparator = firstNonCycleIdx > 0 && i === firstNonCycleIdx;
17717
17712
  const style = sideColumnLabelStyle({ isCycle: entry.isCycle, isSelected, focused });
17718
- return /* @__PURE__ */ jsxs11(React7.Fragment, { children: [
17713
+ return /* @__PURE__ */ jsxs11(React6.Fragment, { children: [
17719
17714
  showSeparator && /* @__PURE__ */ jsx14(Text12, { dimColor: true, children: "\u2500".repeat(Math.max(0, width - 2)) }),
17720
17715
  /* @__PURE__ */ jsxs11(Box11, { children: [
17721
17716
  isCursor ? /* @__PURE__ */ jsx14(Text12, { color: PALETTE2.info, bold: true, children: figures.pointer }) : /* @__PURE__ */ jsx14(Text12, { children: " " }),
@@ -18748,7 +18743,7 @@ function GroupedSidebar(props) {
18748
18743
  }
18749
18744
 
18750
18745
  // packages/experience-design-system-cli/src/tui/import/steps/07-scope-gate/sidebar/components/HelpOverlay.tsx
18751
- import React8 from "react";
18746
+ import React7 from "react";
18752
18747
  import { Box as Box18, Text as Text20 } from "ink";
18753
18748
 
18754
18749
  // packages/experience-design-system-cli/src/tui/import/steps/07-scope-gate/sidebar/hooks/useImmediateInput.ts
@@ -18825,8 +18820,8 @@ function useImmediateInput(handler, enabled = true) {
18825
18820
  }
18826
18821
 
18827
18822
  // packages/experience-design-system-cli/src/tui/import/steps/07-scope-gate/sidebar/hooks/use-terminal-size.ts
18828
- import { useStdout as useStdout3 } from "ink";
18829
- import { useEffect as useEffect7, useState as useState9 } from "react";
18823
+ import { useStdout as useStdout2 } from "ink";
18824
+ import { useEffect as useEffect6, useState as useState9 } from "react";
18830
18825
  function readTerminalSize(stdout) {
18831
18826
  return {
18832
18827
  columns: stdout?.columns ?? 80,
@@ -18834,9 +18829,9 @@ function readTerminalSize(stdout) {
18834
18829
  };
18835
18830
  }
18836
18831
  function useTerminalSize() {
18837
- const { stdout } = useStdout3();
18832
+ const { stdout } = useStdout2();
18838
18833
  const [size, setSize] = useState9(() => readTerminalSize(stdout));
18839
- useEffect7(() => {
18834
+ useEffect6(() => {
18840
18835
  const updateSize = () => setSize(readTerminalSize(stdout));
18841
18836
  stdout?.on("resize", updateSize);
18842
18837
  updateSize();
@@ -18870,7 +18865,7 @@ function HelpOverlay(props) {
18870
18865
  overflowY: "hidden",
18871
18866
  children: [
18872
18867
  /* @__PURE__ */ jsx22(Text20, { bold: true, children: "\u2500".repeat(titleRule) + " Help " + "\u2500".repeat(titleRule) }),
18873
- props.sections.map((section) => /* @__PURE__ */ jsxs19(React8.Fragment, { children: [
18868
+ props.sections.map((section) => /* @__PURE__ */ jsxs19(React7.Fragment, { children: [
18874
18869
  /* @__PURE__ */ jsx22(Text20, { children: " " }),
18875
18870
  /* @__PURE__ */ jsx22(Text20, { bold: true, children: section.title }),
18876
18871
  section.entries.map((entry) => /* @__PURE__ */ jsx22(Text20, { children: entry.keys ? " " + entry.keys.padEnd(16) + " " + entry.label : " " + entry.label }, entry.keys + entry.label))
@@ -19019,7 +19014,7 @@ function createSidebarViewsHelpSection(includeBreaking) {
19019
19014
  }
19020
19015
 
19021
19016
  // packages/experience-design-system-cli/src/tui/import/steps/07-scope-gate/use-scope-gate.ts
19022
- import { useEffect as useEffect8, useMemo as useMemo2, useRef as useRef4, useState as useState12 } from "react";
19017
+ import { useEffect as useEffect7, useMemo as useMemo2, useRef as useRef4, useState as useState12 } from "react";
19023
19018
 
19024
19019
  // packages/experience-design-system-cli/src/tui/import/steps/07-scope-gate/graph/search-neighborhood.ts
19025
19020
  function computeDirectNeighborhood(matches, graph) {
@@ -19703,7 +19698,7 @@ function useScopeGate({ components, onConfirm, onQuit }) {
19703
19698
  return seed;
19704
19699
  });
19705
19700
  const seededGroupsRef = useRef4(closures.size > 0 || cycleParticipants.size > 0);
19706
- useEffect8(() => {
19701
+ useEffect7(() => {
19707
19702
  if (seededGroupsRef.current) return;
19708
19703
  if (closures.size === 0 && cycleParticipants.size === 0) return;
19709
19704
  seededGroupsRef.current = true;
@@ -19793,7 +19788,7 @@ function useScopeGate({ components, onConfirm, onQuit }) {
19793
19788
  entryCount: 0
19794
19789
  });
19795
19790
  const panelLayout = useMemo2(() => computePanelLayout(visibleCount), [visibleCount]);
19796
- useEffect8(() => {
19791
+ useEffect7(() => {
19797
19792
  setNav((prev) => {
19798
19793
  const maxIdx = Math.max(0, visibleRows.length - 1);
19799
19794
  const nextCursor = Math.min(prev.cursor, maxIdx);
@@ -20261,7 +20256,7 @@ function ScopeGateView({ components, onConfirm, onQuit }) {
20261
20256
  }
20262
20257
 
20263
20258
  // packages/experience-design-system-cli/src/tui/import/steps/07-scope-gate/use-scope-gate-flow.ts
20264
- import { useEffect as useEffect9, useMemo as useMemo3, useRef as useRef5, useState as useState13 } from "react";
20259
+ import { useEffect as useEffect8, useMemo as useMemo3, useRef as useRef5, useState as useState13 } from "react";
20265
20260
 
20266
20261
  // packages/experience-design-system-cli/src/tui/import/steps/07-scope-gate/cache-check.ts
20267
20262
  async function checkGenerationCache(input) {
@@ -20310,7 +20305,7 @@ function useScopeGateFlow(input, deps = realDeps2) {
20310
20305
  const loaded = useMemo3(() => sessionId ? deps.load(sessionId) : void 0, [sessionId]);
20311
20306
  const cacheCheck = useRef5(void 0);
20312
20307
  const [confirmed, setConfirmed] = useState13();
20313
- useEffect9(() => {
20308
+ useEffect8(() => {
20314
20309
  if (!input || !loaded?.ok || cacheCheck.current) return;
20315
20310
  cacheCheck.current = deps.checkCache(input.cache);
20316
20311
  }, [input, loaded]);
@@ -20381,7 +20376,7 @@ function GenerationScreen({
20381
20376
  }
20382
20377
 
20383
20378
  // packages/experience-design-system-cli/src/tui/import/steps/08-generation/use-generation.ts
20384
- import { useEffect as useEffect10, useRef as useRef6, useState as useState14 } from "react";
20379
+ import { useEffect as useEffect9, useRef as useRef6, useState as useState14 } from "react";
20385
20380
 
20386
20381
  // packages/experience-design-system-cli/src/tui/import/steps/08-generation/run.ts
20387
20382
  import { resolve as resolve23 } from "node:path";
@@ -20441,7 +20436,9 @@ async function runGeneration(input, onProgress, deps = realDeps3) {
20441
20436
  onProgress(progress);
20442
20437
  };
20443
20438
  const accepted = input.decisions.accepted;
20439
+ update({ components: { done: 0, total: accepted.length, current: "Restoring cache..." } });
20444
20440
  const handedOverNames = await input.cachedNames.catch(() => []);
20441
+ update({ components: { done: 0, total: accepted.length, current: "Starting generation..." } });
20445
20442
  try {
20446
20443
  await deps.saveDecisions({ sessionId: input.sessionId, decisions: input.decisions });
20447
20444
  } catch (error) {
@@ -20547,7 +20544,7 @@ function applyProgressEvent2(event, previous, total) {
20547
20544
  function useGeneration(input) {
20548
20545
  const [state, setState] = useState14();
20549
20546
  const current = useRef6();
20550
- useEffect10(() => {
20547
+ useEffect9(() => {
20551
20548
  current.current = input;
20552
20549
  if (!input) {
20553
20550
  setState(void 0);
@@ -20593,7 +20590,7 @@ function buildFlowStart(input) {
20593
20590
  }
20594
20591
 
20595
20592
  // packages/experience-design-system-cli/src/tui/import/steps/10-flow/flow/screen.tsx
20596
- import { useEffect as useEffect21, useRef as useRef12 } from "react";
20593
+ import { useEffect as useEffect20, useRef as useRef12 } from "react";
20597
20594
  import { Box as Box41 } from "ink";
20598
20595
 
20599
20596
  // packages/experience-design-system-types/dist/src/cdf/validate.js
@@ -20940,7 +20937,7 @@ function PreviewValidationErrorScreen({
20940
20937
  }
20941
20938
 
20942
20939
  // packages/experience-design-system-cli/src/tui/import/steps/09-review/generate-review-step.tsx
20943
- import { useCallback as useCallback5, useEffect as useEffect17, useMemo as useMemo4, useRef as useRef11, useState as useState22 } from "react";
20940
+ import { useCallback as useCallback5, useEffect as useEffect16, useMemo as useMemo4, useRef as useRef11, useState as useState22 } from "react";
20944
20941
  import figures7 from "figures";
20945
20942
 
20946
20943
  // packages/experience-design-system-cli/src/tui/import/steps/09-review/theme.ts
@@ -21212,7 +21209,7 @@ function enumerateCycleBreaks(cycle, components) {
21212
21209
  import { Box as Box27, Text as Text30 } from "ink";
21213
21210
 
21214
21211
  // packages/experience-design-system-cli/src/tui/import/steps/09-review/components/FieldEditor.tsx
21215
- import React9, { useEffect as useEffect11, useLayoutEffect as useLayoutEffect2, useState as useState15 } from "react";
21212
+ import React8, { useEffect as useEffect10, useLayoutEffect as useLayoutEffect2, useState as useState15 } from "react";
21216
21213
  import figures5 from "figures";
21217
21214
  import { Box as Box21, measureElement, Text as Text23 } from "ink";
21218
21215
 
@@ -21923,9 +21920,9 @@ function FieldEditor({
21923
21920
  const [editorState, setEditorState] = useState15(initialState);
21924
21921
  const [parseErr] = useState15(parseError);
21925
21922
  const [listScrollStart, setListScrollStart] = useState15(0);
21926
- const initialFocusScrollApplied = React9.useRef(false);
21923
+ const initialFocusScrollApplied = React8.useRef(false);
21927
21924
  const [rowHeights, setRowHeights] = useState15({});
21928
- const rowMeasureRefs = React9.useRef(/* @__PURE__ */ new Map());
21925
+ const rowMeasureRefs = React8.useRef(/* @__PURE__ */ new Map());
21929
21926
  const initialFocus = (() => {
21930
21927
  if (initialFocusTarget?.kind === "description") {
21931
21928
  return {
@@ -22012,23 +22009,23 @@ function FieldEditor({
22012
22009
  const [showHelp, setShowHelp] = useState15(false);
22013
22010
  const props = editorState.props;
22014
22011
  const slots = editorState.slots;
22015
- const contentPropIndexes = React9.useMemo(
22012
+ const contentPropIndexes = React8.useMemo(
22016
22013
  () => props.flatMap((prop, index) => prop.category === "content" ? [index] : []),
22017
22014
  [props]
22018
22015
  );
22019
- const designPropIndexes = React9.useMemo(
22016
+ const designPropIndexes = React8.useMemo(
22020
22017
  () => props.flatMap((prop, index) => prop.category === "design" ? [index] : []),
22021
22018
  [props]
22022
22019
  );
22023
- const hiddenPropIndexes = React9.useMemo(
22020
+ const hiddenPropIndexes = React8.useMemo(
22024
22021
  () => showHiddenProps ? props.flatMap((prop, index) => prop.category === "state" || prop.category === "unattached" ? [index] : []) : [],
22025
22022
  [props, showHiddenProps]
22026
22023
  );
22027
- const visiblePropIndexes = React9.useMemo(
22024
+ const visiblePropIndexes = React8.useMemo(
22028
22025
  () => [...contentPropIndexes, ...designPropIndexes, ...hiddenPropIndexes],
22029
22026
  [contentPropIndexes, designPropIndexes, hiddenPropIndexes]
22030
22027
  );
22031
- const propGroups = React9.useMemo(
22028
+ const propGroups = React8.useMemo(
22032
22029
  () => [
22033
22030
  {
22034
22031
  kind: "content",
@@ -22048,7 +22045,7 @@ function FieldEditor({
22048
22045
  ],
22049
22046
  [contentPropIndexes, designPropIndexes, hiddenPropIndexes]
22050
22047
  );
22051
- const selectableRows = React9.useMemo(
22048
+ const selectableRows = React8.useMemo(
22052
22049
  () => [
22053
22050
  ...contentPropIndexes.map((idx) => ({ kind: "prop", idx })),
22054
22051
  ...designPropIndexes.map((idx) => ({ kind: "prop", idx })),
@@ -22058,7 +22055,7 @@ function FieldEditor({
22058
22055
  [contentPropIndexes, designPropIndexes, hiddenPropIndexes, slots]
22059
22056
  );
22060
22057
  const visiblePropPosition = visiblePropIndexes.indexOf(propIdx);
22061
- const selectedSelectableIndex = React9.useMemo(
22058
+ const selectedSelectableIndex = React8.useMemo(
22062
22059
  () => selectableRows.findIndex(
22063
22060
  (row) => inSlots ? row.kind === "slot" && row.idx === slotIdx : row.kind === "prop" && row.idx === propIdx
22064
22061
  ),
@@ -22077,12 +22074,12 @@ function FieldEditor({
22077
22074
  }
22078
22075
  };
22079
22076
  const textEntryActive = focusLevel === "field" && editingField && activeField === "description" || focusLevel === "field" && editingField && activeField === "default" && (editorState.props[propIdx]?.type === "string" || editorState.props[propIdx]?.type === "token") || editingValue != null;
22080
- React9.useEffect(() => {
22077
+ React8.useEffect(() => {
22081
22078
  onTextEntryActiveChange?.(textEntryActive);
22082
22079
  }, [textEntryActive, onTextEntryActiveChange]);
22083
22080
  const currentProp = props[propIdx] ?? null;
22084
22081
  const currentSlot = slots[slotIdx] ?? null;
22085
- React9.useEffect(() => {
22082
+ React8.useEffect(() => {
22086
22083
  if (showHiddenProps || inSlots || inComponentDesc || visiblePropPosition >= 0) return;
22087
22084
  if (visiblePropIndexes.length > 0) {
22088
22085
  setPropIdx(visiblePropIndexes[0]);
@@ -22101,22 +22098,22 @@ function FieldEditor({
22101
22098
  setEditorState(next);
22102
22099
  onChange(serializeState(next, value));
22103
22100
  };
22104
- const canonicalize = React9.useCallback((json) => {
22101
+ const canonicalize = React8.useCallback((json) => {
22105
22102
  try {
22106
22103
  return JSON.stringify(JSON.parse(json));
22107
22104
  } catch {
22108
22105
  return `__unparseable__:${json}`;
22109
22106
  }
22110
22107
  }, []);
22111
- const initialStateRef = React9.useRef(initialState);
22108
+ const initialStateRef = React8.useRef(initialState);
22112
22109
  const baselineCanonical = canonicalize(serializeState(initialStateRef.current, value));
22113
22110
  const currentCanonical = canonicalize(serializeState(editorState, value));
22114
22111
  const isDirty = currentCanonical !== baselineCanonical;
22115
- React9.useEffect(() => {
22112
+ React8.useEffect(() => {
22116
22113
  onDirtyChange?.(isDirty);
22117
22114
  }, [isDirty, onDirtyChange]);
22118
- const lastDiscardTriggerRef = React9.useRef(discardTrigger);
22119
- React9.useEffect(() => {
22115
+ const lastDiscardTriggerRef = React8.useRef(discardTrigger);
22116
+ React8.useEffect(() => {
22120
22117
  if (discardTrigger === void 0) return;
22121
22118
  if (discardTrigger === lastDiscardTriggerRef.current) return;
22122
22119
  lastDiscardTriggerRef.current = discardTrigger;
@@ -22715,7 +22712,7 @@ function FieldEditor({
22715
22712
  }
22716
22713
  return Math.max(start + 1, end2);
22717
22714
  };
22718
- useEffect11(() => {
22715
+ useEffect10(() => {
22719
22716
  if (focusLevel === "field" || selectedRowIdx < 0) return;
22720
22717
  setListScrollStart((previous) => {
22721
22718
  if (initialFocusTarget && !initialFocusScrollApplied.current) {
@@ -23773,7 +23770,7 @@ function finalizeReviewSession(extractSessionId, components) {
23773
23770
  }
23774
23771
 
23775
23772
  // packages/experience-design-system-cli/src/tui/import/steps/09-review/use-review-session.ts
23776
- import { useCallback as useCallback2, useEffect as useEffect13, useRef as useRef8, useState as useState17 } from "react";
23773
+ import { useCallback as useCallback2, useEffect as useEffect12, useRef as useRef8, useState as useState17 } from "react";
23777
23774
 
23778
23775
  // packages/experience-design-system-cli/src/tui/import/steps/09-review/history.ts
23779
23776
  var DEFAULT_MAX_DEPTH = 50;
@@ -23829,7 +23826,7 @@ function createHistoryStack(seed, maxDepth = DEFAULT_MAX_DEPTH) {
23829
23826
  }
23830
23827
 
23831
23828
  // packages/experience-design-system-cli/src/tui/import/steps/09-review/use-finalize-preview.ts
23832
- import { useEffect as useEffect12, useRef as useRef7, useState as useState16 } from "react";
23829
+ import { useEffect as useEffect11, useRef as useRef7, useState as useState16 } from "react";
23833
23830
 
23834
23831
  // packages/experience-design-system-cli/src/tui/import/steps/09-review/run-live-preview.ts
23835
23832
  var TimeoutError = class extends Error {
@@ -23981,7 +23978,7 @@ function useFinalizePreview(opts) {
23981
23978
  const [scrollOffset, setScrollOffset] = useState16(0);
23982
23979
  const generationRef = useRef7(0);
23983
23980
  const acceptedKey = [...acceptedKeys].sort().join("\0");
23984
- useEffect12(() => {
23981
+ useEffect11(() => {
23985
23982
  if (!open) {
23986
23983
  setStatus("idle");
23987
23984
  setRemoved([]);
@@ -24044,7 +24041,7 @@ function useReviewSession({
24044
24041
  }));
24045
24042
  return { result, catalog };
24046
24043
  }, [loadSession, tokensPath]);
24047
- useEffect13(() => {
24044
+ useEffect12(() => {
24048
24045
  let disposed = false;
24049
24046
  void (async () => {
24050
24047
  try {
@@ -24097,7 +24094,7 @@ function useReviewSession({
24097
24094
  function useReviewMetadata({ components, selectedIdx, extractSessionId }) {
24098
24095
  const [reviewMetadata, setReviewMetadata] = useState17(null);
24099
24096
  const [componentRationale, setComponentRationale] = useState17(null);
24100
- useEffect13(() => {
24097
+ useEffect12(() => {
24101
24098
  const current = components[selectedIdx];
24102
24099
  if (!current) {
24103
24100
  setReviewMetadata(null);
@@ -24129,7 +24126,7 @@ function useReviewMetadata({ components, selectedIdx, extractSessionId }) {
24129
24126
  function useReviewHistory({ loading, components, createSnapshot, applySnapshot }) {
24130
24127
  const historyRef = useRef8(null);
24131
24128
  const historySeededRef = useRef8(false);
24132
- useEffect13(() => {
24129
+ useEffect12(() => {
24133
24130
  if (loading || historySeededRef.current) return;
24134
24131
  historySeededRef.current = true;
24135
24132
  historyRef.current = createHistoryStack(createSnapshot(components));
@@ -24180,7 +24177,7 @@ function useReviewFinalize({
24180
24177
  }
24181
24178
 
24182
24179
  // packages/experience-design-system-cli/src/tui/import/steps/09-review/use-review-editor.ts
24183
- import { useEffect as useEffect14, useRef as useRef9, useState as useState18 } from "react";
24180
+ import { useEffect as useEffect13, useRef as useRef9, useState as useState18 } from "react";
24184
24181
 
24185
24182
  // packages/experience-design-system-cli/src/tui/import/steps/09-review/token-suggestions.ts
24186
24183
  function collectTokenSuggestions(entry, availableTokens = []) {
@@ -24233,7 +24230,7 @@ function useReviewEditor({
24233
24230
  const [tokenReviewEditSelection, setTokenReviewEditSelection] = useState18(/* @__PURE__ */ new Set());
24234
24231
  const tokenReviewSuggestedRef = useRef9(/* @__PURE__ */ new Map());
24235
24232
  const pendingGRef = useRef9(false);
24236
- useEffect14(() => {
24233
+ useEffect13(() => {
24237
24234
  setTokenReviewRow(0);
24238
24235
  setTokenReviewEditing(false);
24239
24236
  setTokenReviewEditCursor(0);
@@ -24637,7 +24634,7 @@ function handleJsonPanelInput(input, key, state) {
24637
24634
  }
24638
24635
 
24639
24636
  // packages/experience-design-system-cli/src/tui/import/steps/09-review/use-review-preview.ts
24640
- import { useCallback as useCallback4, useEffect as useEffect16, useState as useState21 } from "react";
24637
+ import { useCallback as useCallback4, useEffect as useEffect15, useState as useState21 } from "react";
24641
24638
 
24642
24639
  // packages/experience-design-system-cli/src/tui/import/steps/09-review/preview-annotations.ts
24643
24640
  function applyPreviewAnnotations(preview, localNames) {
@@ -24672,7 +24669,7 @@ function applyPreviewAnnotations(preview, localNames) {
24672
24669
  }
24673
24670
 
24674
24671
  // packages/experience-design-system-cli/src/tui/import/steps/09-review/use-live-preview.ts
24675
- import { useCallback as useCallback3, useEffect as useEffect15, useRef as useRef10, useState as useState20 } from "react";
24672
+ import { useCallback as useCallback3, useEffect as useEffect14, useRef as useRef10, useState as useState20 } from "react";
24676
24673
  var DEFAULT_DEBOUNCE_MS = 500;
24677
24674
  function useLivePreview(opts) {
24678
24675
  const debounceMs = opts.debounceMs ?? DEFAULT_DEBOUNCE_MS;
@@ -24683,14 +24680,14 @@ function useLivePreview(opts) {
24683
24680
  const latestRef = useRef10(0);
24684
24681
  const inflightRef = useRef10(0);
24685
24682
  const optsRef = useRef10(opts);
24686
- useEffect15(() => {
24683
+ useEffect14(() => {
24687
24684
  optsRef.current = opts;
24688
24685
  });
24689
24686
  const disabledRef = useRef10(disabled);
24690
- useEffect15(() => {
24687
+ useEffect14(() => {
24691
24688
  disabledRef.current = disabled;
24692
24689
  }, [disabled]);
24693
- useEffect15(() => {
24690
+ useEffect14(() => {
24694
24691
  return () => {
24695
24692
  if (timerRef.current) {
24696
24693
  clearTimeout(timerRef.current);
@@ -24804,13 +24801,13 @@ function useReviewPreview({
24804
24801
  deleteAllComponents
24805
24802
  });
24806
24803
  const [spinnerTick, setSpinnerTick] = useState21(0);
24807
- useEffect16(() => {
24804
+ useEffect15(() => {
24808
24805
  if (livePreviewHook.status !== "running") return;
24809
24806
  const id = setInterval(() => setSpinnerTick((tick) => tick + 1), 80);
24810
24807
  return () => clearInterval(id);
24811
24808
  }, [livePreviewHook.status]);
24812
24809
  const livePreviewSpinner = SPINNER_FRAMES[spinnerTick % SPINNER_FRAMES.length];
24813
- useEffect16(() => {
24810
+ useEffect15(() => {
24814
24811
  if (loading) return;
24815
24812
  if (!livePreview) return;
24816
24813
  if (components.length === 0) return;
@@ -25230,7 +25227,7 @@ function GenerateReviewStepView({
25230
25227
  [components]
25231
25228
  );
25232
25229
  const closures = useMemo4(() => computeAllClosures(componentGraph), [componentGraph]);
25233
- useEffect17(() => {
25230
+ useEffect16(() => {
25234
25231
  if (seededGroupsRef.current) return;
25235
25232
  if (closures.size === 0 && slotCycles.length === 0) return;
25236
25233
  seededGroupsRef.current = true;
@@ -25257,7 +25254,7 @@ function GenerateReviewStepView({
25257
25254
  suggestedBreak: cycle.edges.length > 0 ? suggestCycleBreakEdge2(cycle, cycleView.pushBlocking) : null
25258
25255
  }));
25259
25256
  }, [slotCycles, cycleView]);
25260
- useEffect17(() => {
25257
+ useEffect16(() => {
25261
25258
  const decision = computeAutoRejectDecision({
25262
25259
  loading,
25263
25260
  autoRejectFired: autoRejectFiredRef.current,
@@ -25301,7 +25298,7 @@ function GenerateReviewStepView({
25301
25298
  applySnapshot: applyHistorySnapshot
25302
25299
  });
25303
25300
  const autoRejectPushedRef = useRef11(false);
25304
- useEffect17(() => {
25301
+ useEffect16(() => {
25305
25302
  if (loading) return;
25306
25303
  if (!historySeededRef.current) return;
25307
25304
  if (!autoRejectFiredRef.current) return;
@@ -25385,7 +25382,7 @@ function GenerateReviewStepView({
25385
25382
  const panelHeight = leftPanelHeight + 2;
25386
25383
  const panelContentHeight = Math.max(1, panelHeight - 3);
25387
25384
  const cycleViewportHeight = Math.max(1, panelHeight - 4);
25388
- useEffect17(() => {
25385
+ useEffect16(() => {
25389
25386
  if (selectableRowPositions.length === 0) return;
25390
25387
  const cursorInRange = selectableRowPositions.includes(cursorRowIdx);
25391
25388
  const maxScroll = Math.max(0, visibleRowsMemo.length - visibleCount);
@@ -26345,10 +26342,10 @@ function normalizePath(input) {
26345
26342
  }
26346
26343
 
26347
26344
  // packages/experience-design-system-cli/src/tui/import/steps/10-flow/support/use-blinking-cursor.ts
26348
- import { useEffect as useEffect18, useState as useState23 } from "react";
26345
+ import { useEffect as useEffect17, useState as useState23 } from "react";
26349
26346
  function useBlinkingCursor() {
26350
26347
  const [visible, setVisible] = useState23(true);
26351
- useEffect18(() => {
26348
+ useEffect17(() => {
26352
26349
  const interval = setInterval(() => setVisible((current) => !current), 500);
26353
26350
  return () => clearInterval(interval);
26354
26351
  }, []);
@@ -26456,12 +26453,12 @@ function StepHeader({ stepNumber, totalSteps, title }) {
26456
26453
  }
26457
26454
 
26458
26455
  // packages/experience-design-system-cli/src/tui/import/steps/10-flow/support/use-timed-spinner.tsx
26459
- import { useEffect as useEffect19, useState as useState25 } from "react";
26456
+ import { useEffect as useEffect18, useState as useState25 } from "react";
26460
26457
  import { Spinner as Spinner2 } from "@inkjs/ui";
26461
26458
  import { jsx as jsx49 } from "react/jsx-runtime";
26462
26459
  function useTimedSpinner() {
26463
26460
  const [elapsedSeconds, setElapsedSeconds] = useState25(0);
26464
- useEffect19(() => {
26461
+ useEffect18(() => {
26465
26462
  const timer = setInterval(() => setElapsedSeconds((current) => current + 1), 1e3);
26466
26463
  return () => {
26467
26464
  clearInterval(timer);
@@ -26510,7 +26507,7 @@ function PushingStep({ stepNumber, totalSteps, progress }) {
26510
26507
  }
26511
26508
 
26512
26509
  // packages/experience-design-system-cli/src/tui/import/steps/10-flow/screens/WizardPreviewStep.tsx
26513
- import { useEffect as useEffect20, useState as useState26, useMemo as useMemo5 } from "react";
26510
+ import { useEffect as useEffect19, useState as useState26, useMemo as useMemo5 } from "react";
26514
26511
  import { Box as Box40, Text as Text43 } from "ink";
26515
26512
 
26516
26513
  // packages/experience-design-system-cli/src/tui/import/steps/10-flow/support/preview-diff.ts
@@ -26895,7 +26892,7 @@ function WizardPreviewStep({
26895
26892
  const activeLines = diffExpanded ? diffLines : summaryLines;
26896
26893
  const maxScroll = Math.max(0, activeLines.length - viewportHeight);
26897
26894
  const boundedScrollOffset = Math.min(scrollOffset, maxScroll);
26898
- useEffect20(() => {
26895
+ useEffect19(() => {
26899
26896
  setScrollOffset((previous) => Math.min(previous, maxScroll));
26900
26897
  }, [maxScroll]);
26901
26898
  useImmediateInput((input, key) => {
@@ -27000,7 +26997,7 @@ function FlowScreen({
27000
26997
  const totalSteps = totalStepsFor(state);
27001
26998
  const quit = () => onExit(0);
27002
26999
  const previousStep = useRef12(state.step);
27003
- useEffect21(() => {
27000
+ useEffect20(() => {
27004
27001
  if (previousStep.current !== state.step) {
27005
27002
  onStepChange?.();
27006
27003
  previousStep.current = state.step;
@@ -27131,7 +27128,7 @@ function FlowScreen({
27131
27128
  }
27132
27129
 
27133
27130
  // packages/experience-design-system-cli/src/tui/import/steps/10-flow/flow/use-flow.ts
27134
- import { useEffect as useEffect22, useRef as useRef13, useSyncExternalStore } from "react";
27131
+ import { useEffect as useEffect21, useRef as useRef13, useSyncExternalStore } from "react";
27135
27132
 
27136
27133
  // packages/experience-design-system-cli/src/tui/import/steps/10-flow/flow/controller.ts
27137
27134
  import { appendFileSync, writeFileSync } from "node:fs";
@@ -27872,14 +27869,14 @@ function useFlow(start, deps = realFlowDeps) {
27872
27869
  (listener) => current?.subscribe(listener) ?? (() => void 0),
27873
27870
  () => current?.getState()
27874
27871
  );
27875
- useEffect22(() => {
27872
+ useEffect21(() => {
27876
27873
  if (!start) controller.current = void 0;
27877
27874
  }, [start]);
27878
27875
  return current && state ? { controller: current, state } : void 0;
27879
27876
  }
27880
27877
 
27881
27878
  // packages/experience-design-system-cli/src/tui/help/PageContainer.tsx
27882
- import { useEffect as useEffect23, useState as useState27 } from "react";
27879
+ import { useEffect as useEffect22, useState as useState27 } from "react";
27883
27880
  import { Box as Box42, Text as Text44, useInput as useInput9 } from "ink";
27884
27881
 
27885
27882
  // packages/experience-design-system-cli/src/tui/debug-store.ts
@@ -28073,7 +28070,7 @@ function Section({ title, rows }) {
28073
28070
  }
28074
28071
  function HelpScreen({ onDone }) {
28075
28072
  const [info, setInfo] = useState27();
28076
- useEffect23(() => {
28073
+ useEffect22(() => {
28077
28074
  startDebugRun({ flow: "help", step: "01-help", menuOption: "Help", inputs: {} });
28078
28075
  void readHelpInfo().then(setInfo);
28079
28076
  }, []);
@@ -28166,7 +28163,7 @@ function SettingsScreen({
28166
28163
  }
28167
28164
 
28168
28165
  // packages/experience-design-system-cli/src/tui/settings/contentful-configuration/ContentfulConfigScreen.tsx
28169
- import { useEffect as useEffect24, useState as useState29 } from "react";
28166
+ import { useEffect as useEffect23, useState as useState29 } from "react";
28170
28167
  import { Box as Box44, Text as Text46, useInput as useInput11 } from "ink";
28171
28168
  import TextInput4 from "ink-text-input";
28172
28169
 
@@ -28234,7 +28231,7 @@ function ConfigurationScreen({ onDone }) {
28234
28231
  const [lastSaved, setLastSaved] = useState29(null);
28235
28232
  const [editing, setEditing] = useState29(false);
28236
28233
  const [valueBeforeEdit, setValueBeforeEdit] = useState29("");
28237
- useEffect24(() => {
28234
+ useEffect23(() => {
28238
28235
  readCredentials().then((cfg) => {
28239
28236
  setConfig(cfg);
28240
28237
  setStage("form");
@@ -28371,7 +28368,7 @@ function ConfigurationScreen({ onDone }) {
28371
28368
  }
28372
28369
 
28373
28370
  // packages/experience-design-system-cli/src/tui/settings/opt-in-analytics/screen.tsx
28374
- import { useEffect as useEffect25, useState as useState30 } from "react";
28371
+ import { useEffect as useEffect24, useState as useState30 } from "react";
28375
28372
  import { Box as Box45, Text as Text47, useInput as useInput12 } from "ink";
28376
28373
 
28377
28374
  // packages/experience-design-system-cli/src/tui/settings/opt-in-analytics/analytics-store.ts
@@ -28394,7 +28391,7 @@ import { Fragment as Fragment18, jsx as jsx56, jsxs as jsxs46 } from "react/jsx-
28394
28391
  function OptInAnalyticsScreen({ onDone }) {
28395
28392
  const [loading, setLoading] = useState30(true);
28396
28393
  const [enabled, setEnabled] = useState30(true);
28397
- useEffect25(() => {
28394
+ useEffect24(() => {
28398
28395
  readAnalyticsSetting().then((setting) => {
28399
28396
  setEnabled(setting.enabled);
28400
28397
  setLoading(false);
@@ -28448,13 +28445,13 @@ function OptInAnalyticsScreen({ onDone }) {
28448
28445
  }
28449
28446
 
28450
28447
  // packages/experience-design-system-cli/src/tui/upgrade/PageContainer.tsx
28451
- import { useEffect as useEffect26, useState as useState31 } from "react";
28448
+ import { useEffect as useEffect25, useState as useState31 } from "react";
28452
28449
  import { Box as Box46, Text as Text48, useInput as useInput13 } from "ink";
28453
28450
  import { jsx as jsx57, jsxs as jsxs47 } from "react/jsx-runtime";
28454
28451
  var UPGRADE_COMMANDS = ["git pull", "pnpm install", "pnpm build"];
28455
28452
  function UpgradeScreen({ onDone }) {
28456
28453
  const [upgradeCheck, setUpgradeCheck] = useState31();
28457
- useEffect26(() => {
28454
+ useEffect25(() => {
28458
28455
  startDebugRun({
28459
28456
  flow: "upgrade",
28460
28457
  step: "01-upgrade",
@@ -28519,13 +28516,13 @@ function renderBody(upgradeCheck) {
28519
28516
  }
28520
28517
 
28521
28518
  // packages/experience-design-system-cli/src/tui/settings/debug-mode/screen.tsx
28522
- import { useEffect as useEffect27, useState as useState32 } from "react";
28519
+ import { useEffect as useEffect26, useState as useState32 } from "react";
28523
28520
  import { Box as Box47, Text as Text49, useInput as useInput14 } from "ink";
28524
28521
  import { jsx as jsx58, jsxs as jsxs48 } from "react/jsx-runtime";
28525
28522
  function DebugModeScreen({ onDone }) {
28526
28523
  const [loading, setLoading] = useState32(true);
28527
28524
  const [enabled, setEnabled] = useState32(true);
28528
- useEffect27(() => {
28525
+ useEffect26(() => {
28529
28526
  readDebugModeSetting().then((setting) => {
28530
28527
  setEnabled(setting.enabled);
28531
28528
  setLoading(false);
@@ -28605,7 +28602,7 @@ function App({ importOptions, inkClear }) {
28605
28602
  const [flowStart, setFlowStart] = useState33();
28606
28603
  const flow = useFlow(flowStart);
28607
28604
  const [importDefaults, setImportDefaults] = useState33();
28608
- useEffect28(() => {
28605
+ useEffect27(() => {
28609
28606
  if (screen !== "import") {
28610
28607
  setImportDefaults(void 0);
28611
28608
  return;
@@ -28663,12 +28660,12 @@ function App({ importOptions, inkClear }) {
28663
28660
  }
28664
28661
  });
28665
28662
  };
28666
- useEffect28(() => {
28663
+ useEffect27(() => {
28667
28664
  if (!extractionRun || extraction?.status !== "done" || !extraction.result.ok) return;
28668
28665
  setExtractionRun(void 0);
28669
28666
  setScopeRun({ ...extractionRun, extraction: extraction.result.extraction });
28670
28667
  }, [extraction, extractionRun]);
28671
- useEffect28(() => {
28668
+ useEffect27(() => {
28672
28669
  if (!scopeRun || scopeFlow?.status !== "confirmed" || generationInput) return;
28673
28670
  const { extraction: produced, input, generatePromptPath } = scopeRun;
28674
28671
  setGenerationInput({
@@ -28686,7 +28683,7 @@ function App({ importOptions, inkClear }) {
28686
28683
  ...generatePromptPath ? { generatePromptPath } : {}
28687
28684
  });
28688
28685
  }, [scopeFlow, scopeRun, generationInput]);
28689
- useEffect28(() => {
28686
+ useEffect27(() => {
28690
28687
  if (!scopeRun || generation?.status !== "done" || !generation.result.ok) return;
28691
28688
  const { credentialsSkipped, tokenStrategy, extraction: produced, input, generatePromptPath } = scopeRun;
28692
28689
  inkClear();
@@ -28737,10 +28734,7 @@ function App({ importOptions, inkClear }) {
28737
28734
  state: flow.state,
28738
28735
  controller: flow.controller,
28739
28736
  generatePromptPath: flowStart.generatePromptPath,
28740
- onExit: (code) => {
28741
- inkClear();
28742
- setImportExitCode(code);
28743
- },
28737
+ onExit: setImportExitCode,
28744
28738
  onStepChange: inkClear
28745
28739
  }
28746
28740
  );