pre-claude 0.0.1 → 0.0.2

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/cli.js CHANGED
@@ -5,7 +5,7 @@ import { defineCommand as defineCommand4, runMain } from "citty";
5
5
 
6
6
  // package.json
7
7
  var name = "pre-claude";
8
- var version = "0.0.1";
8
+ var version = "0.0.2";
9
9
  var description = "\u{1F40D} TUI for building structured prompts for Claude";
10
10
 
11
11
  // src/cli/commands/example.tsx
@@ -1296,7 +1296,11 @@ var useFormState = (scenario) => {
1296
1296
  };
1297
1297
 
1298
1298
  // src/tui/views/ScenarioForm/-internal/FieldEditor/FieldEditor.tsx
1299
- import { Box as Box10, Text as Text11 } from "ink";
1299
+ import { spawnSync } from "node:child_process";
1300
+ import { mkdtempSync, readFileSync, rmSync, writeFileSync } from "node:fs";
1301
+ import { tmpdir } from "node:os";
1302
+ import { join as join2 } from "node:path";
1303
+ import { Box as Box10, Text as Text11, useStdin } from "ink";
1300
1304
  import { useCallback as useCallback3, useState as useState4 } from "react";
1301
1305
 
1302
1306
  // src/tui/views/ScenarioForm/-internal/FieldEditor/FieldEditorContent.tsx
@@ -1357,7 +1361,8 @@ var SimpleTextInput = ({
1357
1361
  onCancel,
1358
1362
  placeholder = "",
1359
1363
  multiline = false,
1360
- suggestions = []
1364
+ suggestions = [],
1365
+ onOpenExternalEditor
1361
1366
  }) => {
1362
1367
  const [cursorPosition, setCursorPosition] = useState3(value.length);
1363
1368
  const [suggestionIndex, setSuggestionIndex] = useState3(-1);
@@ -1405,6 +1410,10 @@ var SimpleTextInput = ({
1405
1410
  onCancel();
1406
1411
  return;
1407
1412
  }
1413
+ if (multiline && key.ctrl && input === "g") {
1414
+ onOpenExternalEditor?.();
1415
+ return;
1416
+ }
1408
1417
  if (!multiline && hasSuggestions) {
1409
1418
  if (key.upArrow) {
1410
1419
  setSuggestionIndex(
@@ -1622,7 +1631,8 @@ var TextField = ({
1622
1631
  placeholder,
1623
1632
  isTextarea,
1624
1633
  isFocused,
1625
- suggestions
1634
+ suggestions,
1635
+ onOpenExternalEditor
1626
1636
  }) => {
1627
1637
  if (isFocused) {
1628
1638
  return /* @__PURE__ */ jsxs7(
@@ -1643,10 +1653,11 @@ var TextField = ({
1643
1653
  onCancel: onTextCancel,
1644
1654
  placeholder,
1645
1655
  multiline: isTextarea,
1646
- suggestions
1656
+ suggestions,
1657
+ onOpenExternalEditor: isTextarea ? onOpenExternalEditor : void 0
1647
1658
  }
1648
1659
  ),
1649
- isTextarea && /* @__PURE__ */ jsx11(Box8, { marginTop: 1, children: /* @__PURE__ */ jsx11(Text9, { dimColor: true, children: "Enter: newline | Tab: confirm" }) })
1660
+ isTextarea && /* @__PURE__ */ jsx11(Box8, { marginTop: 1, children: /* @__PURE__ */ jsx11(Text9, { dimColor: true, children: "Enter: newline | Ctrl+G: vim | Tab: confirm" }) })
1650
1661
  ]
1651
1662
  }
1652
1663
  );
@@ -1664,7 +1675,8 @@ var FieldEditorContent = ({
1664
1675
  onEditValueChange,
1665
1676
  onTextSubmit,
1666
1677
  onTextCancel,
1667
- selectIndex
1678
+ selectIndex,
1679
+ onOpenExternalEditor
1668
1680
  }) => {
1669
1681
  if (!currentItem) {
1670
1682
  return /* @__PURE__ */ jsx12(Empty, {});
@@ -1702,7 +1714,8 @@ var FieldEditorContent = ({
1702
1714
  placeholder: field.placeholder ?? "",
1703
1715
  isTextarea: field.type === "textarea",
1704
1716
  isFocused,
1705
- suggestions: field.type === "input" ? field.suggestions : void 0
1717
+ suggestions: field.type === "input" ? field.suggestions : void 0,
1718
+ onOpenExternalEditor: field.type === "textarea" ? onOpenExternalEditor : void 0
1706
1719
  }
1707
1720
  );
1708
1721
  };
@@ -1739,6 +1752,23 @@ var FieldEditor = ({
1739
1752
  const [selectIndex, setSelectIndex] = useState4(
1740
1753
  () => getInitialSelectIndex(currentItem, stepValues)
1741
1754
  );
1755
+ const { setRawMode, isRawModeSupported } = useStdin();
1756
+ const handleOpenExternalEditor = useCallback3(() => {
1757
+ if (!isRawModeSupported) return;
1758
+ const tempDir = mkdtempSync(join2(tmpdir(), "pre-claude-"));
1759
+ const tempFile = join2(tempDir, "edit.txt");
1760
+ writeFileSync(tempFile, editValue, "utf-8");
1761
+ try {
1762
+ setRawMode(false);
1763
+ const editor = process.env["EDITOR"] || "vim";
1764
+ spawnSync(editor, [tempFile], { stdio: "inherit" });
1765
+ const newContent = readFileSync(tempFile, "utf-8");
1766
+ setEditValue(newContent);
1767
+ } finally {
1768
+ setRawMode(true);
1769
+ rmSync(tempDir, { recursive: true, force: true });
1770
+ }
1771
+ }, [editValue, setRawMode, isRawModeSupported]);
1742
1772
  useControl({
1743
1773
  onUp: () => {
1744
1774
  if (!currentItem || currentItem.type !== "field") return;
@@ -1804,7 +1834,8 @@ var FieldEditor = ({
1804
1834
  onEditValueChange: setEditValue,
1805
1835
  onTextSubmit: handleTextSubmit,
1806
1836
  onTextCancel: handleTextCancel,
1807
- selectIndex
1837
+ selectIndex,
1838
+ onOpenExternalEditor: currentItem?.type === "field" && currentItem.field.type === "textarea" ? handleOpenExternalEditor : void 0
1808
1839
  }
1809
1840
  )
1810
1841
  ]
package/dist/cli.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/cli/index.ts", "../package.json", "../src/cli/commands/example.tsx", "../src/tui/App.tsx", "../src/tui/views/Preview/Preview.tsx", "../src/tui/features/document/services.ts", "../src/tui/features/form/types.ts", "../src/tui/features/generation/services.ts", "../src/tui/hooks/useControl.ts", "../src/tui/hooks/useMount.ts", "../src/tui/layouts/CommonLayout/CommonLayout.tsx", "../src/tui/components/ControlBar/ControlBar.tsx", "../src/tui/components/Header/Header.tsx", "../src/tui/components/StatusBar/StatusBar.tsx", "../src/tui/hooks/useTerminalHeight.ts", "../src/tui/layouts/ScenarioLayout/ScenarioLayout.tsx", "../src/tui/views/ScenarioForm/ScenarioForm.tsx", "../src/schema.ts", "../src/tui/features/form/services.ts", "../src/tui/features/form/utils.ts", "../src/tui/hooks/useFormState.ts", "../src/tui/views/ScenarioForm/-internal/FieldEditor/FieldEditor.tsx", "../src/tui/views/ScenarioForm/-internal/FieldEditor/FieldEditorContent.tsx", "../src/tui/features/form/components/Checkbox.tsx", "../src/tui/features/form/components/Empty.tsx", "../src/tui/features/form/components/Select.tsx", "../src/tui/features/form/components/TextField.tsx", "../src/tui/features/form/components/SimpleTextInput.tsx", "../src/tui/views/ScenarioForm/-internal/FieldSelector/FieldSelector.tsx", "../src/tui/utils/scroll.ts", "../src/tui/views/ScenarioForm/-internal/StepSelector/StepSelector.tsx", "../src/tui/views/SelectScenario/SelectScenario.tsx", "../src/cli/commands/init.ts", "../src/cli/commands/run.tsx"],
4
- "sourcesContent": ["import { defineCommand, runMain } from 'citty';\nimport { description, name, version } from '../../package.json';\n\nimport { exampleCommand } from './commands/example';\nimport { initCommand } from './commands/init';\nimport { runCommand } from './commands/run';\n\nconst main = defineCommand({\n meta: {\n name,\n version,\n description,\n },\n subCommands: {\n run: runCommand,\n init: initCommand,\n example: exampleCommand,\n },\n});\n\nrunMain(main);\n", "{\n \"name\": \"pre-claude\",\n \"version\": \"0.0.1\",\n \"description\": \"\uD83D\uDC0D TUI for building structured prompts for Claude\",\n \"keywords\": [\n \"cli\",\n \"tui\",\n \"claude\",\n \"ai\",\n \"prompt\",\n \"structured\"\n ],\n \"author\": \"cut0\",\n \"license\": \"MIT\",\n \"type\": \"module\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/cut0/pre-claude.git\"\n },\n \"publishConfig\": {\n \"access\": \"public\"\n },\n \"types\": \"./dist/types.d.ts\",\n \"main\": \"./dist/types.js\",\n \"exports\": {\n \".\": {\n \"types\": \"./dist/types.d.ts\",\n \"import\": \"./dist/types.js\",\n \"default\": \"./dist/types.js\"\n }\n },\n \"bin\": {\n \"pre-claude\": \"./dist/cli.js\"\n },\n \"files\": [\n \"dist\"\n ],\n \"scripts\": {\n \"build\": \"pnpm build:types && pnpm build:cli\",\n \"build:cli\": \"node scripts/build-cli.ts\",\n \"build:types\": \"tsc src/types.ts --declaration --outDir dist --skipLibCheck --module ESNext --moduleResolution bundler --target ES2022\",\n \"dev\": \"pnpm build:cli && node dist/cli.js run --config examples/pre-claude.config.ts\",\n \"lint:check\": \"biome check .\",\n \"lint:fix\": \"biome check --write .\",\n \"typecheck\": \"tsc --noEmit\",\n \"prepublishOnly\": \"pnpm build\",\n \"release\": \"pnpm build && changeset publish\"\n },\n \"dependencies\": {\n \"@anthropic-ai/claude-agent-sdk\": \"0.1.75\",\n \"@inkjs/ui\": \"2.0.0\",\n \"citty\": \"0.1.6\",\n \"consola\": \"3.4.2\",\n \"ink\": \"6.6.0\",\n \"ink-select-input\": \"6.2.0\",\n \"jiti\": \"2.6.1\",\n \"react\": \"19.2.3\",\n \"react-dom\": \"19.2.3\",\n \"valibot\": \"1.2.0\"\n },\n \"devDependencies\": {\n \"@biomejs/biome\": \"1.9.4\",\n \"@changesets/cli\": \"2.28.1\",\n \"@types/node\": \"25.0.3\",\n \"@types/react\": \"19.1.8\",\n \"@types/react-dom\": \"19.1.6\",\n \"esbuild\": \"0.27.2\",\n \"typescript\": \"5.8.3\"\n },\n \"packageManager\": \"pnpm@10.26.2\"\n}\n", "import { defineCommand } from 'citty';\nimport { consola } from 'consola';\nimport { render } from 'ink';\n\nimport type { Config, Step } from '../../definitions';\nimport { App } from '../../tui/App';\n\nconst enterAlternateScreen = () => {\n process.stdout.write('\\x1b[?1049h');\n process.stdout.write('\\x1b[H');\n};\n\nconst exitAlternateScreen = () => {\n process.stdout.write('\\x1b[?1049l');\n};\n\n// =============================================================================\n// English Config\n// =============================================================================\n\nconst enSteps = [\n {\n slug: 'libraries',\n title: 'Libraries',\n description: 'Libraries to introduce',\n name: 'libraries',\n fields: [\n {\n type: 'repeatable',\n id: 'items',\n label: 'Libraries',\n minCount: 1,\n field: {\n type: 'group',\n fields: [\n {\n type: 'input',\n id: 'name',\n label: 'Library Name',\n description: 'Name of the library',\n placeholder: 'e.g., react-query, zod',\n required: true,\n },\n {\n type: 'input',\n id: 'url',\n label: 'URL',\n description: 'Link to documentation or repository',\n placeholder: 'https://...',\n inputType: 'url',\n },\n ],\n },\n },\n ],\n },\n] as const satisfies Step[];\n\nconst enPrompt = ({\n aiContext,\n formData,\n}: {\n aiContext: unknown;\n formData: unknown;\n}) => {\n return `You are a software architect. Create an introduction plan for the following libraries.\n\n## Tasks\n\n1. For each library URL provided, use WebFetch to retrieve and analyze the documentation\n2. Based on the analysis, create an introduction plan including:\n - Library overview and purpose\n - Key features and benefits\n - Installation steps\n - Basic usage examples\n - Potential risks and considerations\n - Recommended adoption timeline\n\n## Input Data\n\n### Schema\n${JSON.stringify(aiContext, null, 2)}\n\n### Form Data\n${JSON.stringify(formData, null, 2)}\n\nCreate a comprehensive library introduction plan based on the input above.`;\n};\n\nconst enConfig: Config = {\n scenarios: [\n {\n id: 'default',\n name: 'Library Introduction Plan (Example)',\n steps: enSteps,\n prompt: enPrompt,\n },\n ],\n};\n\n// =============================================================================\n// Japanese Config\n// =============================================================================\n\nconst jaSteps = [\n {\n slug: 'libraries',\n title: '\u30E9\u30A4\u30D6\u30E9\u30EA',\n description: '\u5C0E\u5165\u3059\u308B\u30E9\u30A4\u30D6\u30E9\u30EA',\n name: 'libraries',\n fields: [\n {\n type: 'repeatable',\n id: 'items',\n label: '\u30E9\u30A4\u30D6\u30E9\u30EA\u4E00\u89A7',\n minCount: 1,\n field: {\n type: 'group',\n fields: [\n {\n type: 'input',\n id: 'name',\n label: '\u30E9\u30A4\u30D6\u30E9\u30EA\u540D',\n description: '\u30E9\u30A4\u30D6\u30E9\u30EA\u306E\u540D\u524D',\n placeholder: '\u4F8B: react-query, zod',\n required: true,\n },\n {\n type: 'input',\n id: 'url',\n label: 'URL',\n description: '\u30C9\u30AD\u30E5\u30E1\u30F3\u30C8\u307E\u305F\u306F\u30EA\u30DD\u30B8\u30C8\u30EA\u3078\u306E\u30EA\u30F3\u30AF',\n placeholder: 'https://...',\n inputType: 'url',\n },\n ],\n },\n },\n ],\n },\n] as const satisfies Step[];\n\nconst jaPrompt = ({\n aiContext,\n formData,\n}: {\n aiContext: unknown;\n formData: unknown;\n}) => {\n return `\u3042\u306A\u305F\u306F\u30BD\u30D5\u30C8\u30A6\u30A7\u30A2\u30A2\u30FC\u30AD\u30C6\u30AF\u30C8\u3067\u3059\u3002\u4EE5\u4E0B\u306E\u30E9\u30A4\u30D6\u30E9\u30EA\u306E\u5C0E\u5165\u30D7\u30E9\u30F3\u3092\u4F5C\u6210\u3057\u3066\u304F\u3060\u3055\u3044\u3002\n\n## \u30BF\u30B9\u30AF\n\n1. \u5404\u30E9\u30A4\u30D6\u30E9\u30EA\u306E URL \u304C\u63D0\u4F9B\u3055\u308C\u3066\u3044\u308B\u5834\u5408\u3001WebFetch \u3092\u4F7F\u7528\u3057\u3066\u30C9\u30AD\u30E5\u30E1\u30F3\u30C8\u3092\u53D6\u5F97\u30FB\u5206\u6790\u3057\u3066\u304F\u3060\u3055\u3044\n2. \u5206\u6790\u7D50\u679C\u306B\u57FA\u3065\u304D\u3001\u4EE5\u4E0B\u3092\u542B\u3080\u5C0E\u5165\u30D7\u30E9\u30F3\u3092\u4F5C\u6210\u3057\u3066\u304F\u3060\u3055\u3044\uFF1A\n - \u30E9\u30A4\u30D6\u30E9\u30EA\u306E\u6982\u8981\u3068\u76EE\u7684\n - \u4E3B\u306A\u6A5F\u80FD\u3068\u30E1\u30EA\u30C3\u30C8\n - \u30A4\u30F3\u30B9\u30C8\u30FC\u30EB\u624B\u9806\n - \u57FA\u672C\u7684\u306A\u4F7F\u7528\u4F8B\n - \u6F5C\u5728\u7684\u306A\u30EA\u30B9\u30AF\u3068\u8003\u616E\u4E8B\u9805\n - \u63A8\u5968\u3055\u308C\u308B\u5C0E\u5165\u30B9\u30B1\u30B8\u30E5\u30FC\u30EB\n\n## \u5165\u529B\u30C7\u30FC\u30BF\n\n### \u30B9\u30AD\u30FC\u30DE\n${JSON.stringify(aiContext, null, 2)}\n\n### \u30D5\u30A9\u30FC\u30E0\u30C7\u30FC\u30BF\n${JSON.stringify(formData, null, 2)}\n\n\u4E0A\u8A18\u306E\u5165\u529B\u306B\u57FA\u3065\u3044\u3066\u3001\u5305\u62EC\u7684\u306A\u30E9\u30A4\u30D6\u30E9\u30EA\u5C0E\u5165\u30D7\u30E9\u30F3\u3092\u4F5C\u6210\u3057\u3066\u304F\u3060\u3055\u3044\u3002`;\n};\n\nconst jaConfig: Config = {\n scenarios: [\n {\n id: 'default',\n name: '\u30E9\u30A4\u30D6\u30E9\u30EA\u5C0E\u5165\u30D7\u30E9\u30F3 (Example)',\n steps: jaSteps,\n prompt: jaPrompt,\n },\n ],\n};\n\n// =============================================================================\n// Command\n// =============================================================================\n\nexport const exampleCommand = defineCommand({\n meta: {\n name: 'example',\n description: 'Run pre-claude with an example config to try it out',\n },\n args: {\n lang: {\n type: 'string',\n description: 'Language for example config (en or ja)',\n alias: 'l',\n default: 'en',\n },\n },\n async run({ args }) {\n const lang = args.lang;\n\n if (lang !== 'en' && lang !== 'ja') {\n consola.error(`Invalid language: ${lang}. Use 'en' or 'ja'.`);\n process.exit(1);\n }\n\n const config = lang === 'ja' ? jaConfig : enConfig;\n\n try {\n if (process.stdin.isTTY !== true) {\n throw new Error(\n 'TUI requires an interactive terminal. Please run this command in a terminal that supports raw mode.',\n );\n }\n\n consola.info(\n `Running example with ${lang === 'ja' ? 'Japanese' : 'English'} config...`,\n );\n\n enterAlternateScreen();\n\n const { waitUntilExit } = render(<App config={config} />);\n\n await waitUntilExit();\n exitAlternateScreen();\n } catch (error) {\n exitAlternateScreen();\n if (error instanceof Error) {\n consola.error(error.message);\n } else {\n consola.error('Failed to run example:', error);\n }\n process.exit(1);\n }\n },\n});\n", "import { Text, useApp } from 'ink';\nimport { type FC, useCallback, useState } from 'react';\n\nimport type { AiContext, Config, Scenario } from '../types';\nimport type { DocumentWithMetadata } from './features/document/types';\nimport type { FormValues } from './features/form/types';\nimport { Preview } from './views/Preview';\nimport { ScenarioForm } from './views/ScenarioForm';\nimport { SelectScenario } from './views/SelectScenario';\n\ntype AppProps = {\n config: Config;\n initialScenarioId?: string;\n};\n\ntype PreviewData = {\n formValues: FormValues;\n aiContext: AiContext;\n initialContent?: string;\n editingFilename?: string;\n};\n\ntype AppState =\n | { screen: 'select' }\n | {\n screen: 'form';\n scenarioId: string;\n initialFormValues?: FormValues;\n editingFilename?: string;\n }\n | { screen: 'preview'; scenarioId: string; previewData: PreviewData };\n\nexport const App: FC<AppProps> = ({ config, initialScenarioId }) => {\n const { exit } = useApp();\n\n const [appState, setAppState] = useState<AppState>(() => {\n if (initialScenarioId != null) {\n const scenario = config.scenarios.find((s) => s.id === initialScenarioId);\n if (scenario != null) {\n return { screen: 'form', scenarioId: initialScenarioId };\n }\n }\n return { screen: 'select' };\n });\n\n const getScenario = useCallback(\n (scenarioId: string): Scenario | undefined => {\n return config.scenarios.find((s) => s.id === scenarioId);\n },\n [config.scenarios],\n );\n\n const handleSelectNew = useCallback((scenarioId: string) => {\n setAppState({ screen: 'form', scenarioId });\n }, []);\n\n const handleSelectDocument = useCallback(\n (scenarioId: string, doc: DocumentWithMetadata) => {\n setAppState({\n screen: 'form',\n scenarioId,\n initialFormValues: (doc.metadata?.formData ?? {}) as FormValues,\n editingFilename: doc.filename,\n });\n },\n [],\n );\n\n const handleBackToSelect = useCallback(() => {\n setAppState({ screen: 'select' });\n }, []);\n\n const handleGeneratePreview = useCallback(\n (formValues: FormValues, aiContext: AiContext) => {\n if (appState.screen !== 'form') return;\n setAppState({\n screen: 'preview',\n scenarioId: appState.scenarioId,\n previewData: {\n formValues,\n aiContext,\n editingFilename: appState.editingFilename,\n },\n });\n },\n [appState],\n );\n\n const handleBackToForm = useCallback(() => {\n if (appState.screen !== 'preview') return;\n setAppState({\n screen: 'form',\n scenarioId: appState.scenarioId,\n initialFormValues: appState.previewData.formValues,\n editingFilename: appState.previewData.editingFilename,\n });\n }, [appState]);\n\n if (appState.screen === 'select') {\n return (\n <SelectScenario\n scenarios={config.scenarios}\n onSelectNew={handleSelectNew}\n onSelectDocument={handleSelectDocument}\n onExit={() => exit()}\n />\n );\n }\n\n const scenario = getScenario(appState.scenarioId);\n if (scenario == null) {\n return <Text color=\"red\">Error: Scenario not found</Text>;\n }\n\n if (appState.screen === 'form') {\n return (\n <ScenarioForm\n key={appState.scenarioId}\n scenario={scenario}\n initialFormValues={appState.initialFormValues}\n onGeneratePreview={handleGeneratePreview}\n onBack={handleBackToSelect}\n />\n );\n }\n\n if (appState.screen === 'preview') {\n return (\n <Preview\n config={config}\n scenario={scenario}\n formValues={appState.previewData.formValues}\n aiContext={appState.previewData.aiContext}\n initialContent={appState.previewData.initialContent}\n editingFilename={appState.previewData.editingFilename}\n onBack={handleBackToForm}\n />\n );\n }\n\n return <Text color=\"red\">Unknown screen</Text>;\n};\n", "import { spawn } from 'node:child_process';\nimport { Box, Text, useApp, useStdout } from 'ink';\nimport { type FC, useCallback, useMemo, useState } from 'react';\n\nimport type { AiContext, Config, Scenario } from '../../../types';\nimport type { ControlItem } from '../../components/ControlBar';\nimport { saveDocument } from '../../features/document/services';\nimport { ACCENT_COLOR, type FormValues } from '../../features/form/types';\nimport { generatePreview } from '../../features/generation/services';\nimport { useControl } from '../../hooks/useControl';\nimport { useMount } from '../../hooks/useMount';\nimport type { StatusInfo } from '../../layouts/CommonLayout';\nimport { ScenarioLayout } from '../../layouts/ScenarioLayout';\n\nexport type PreviewProps = {\n config: Config;\n scenario: Scenario;\n formValues: FormValues;\n aiContext: AiContext;\n initialContent?: string;\n editingFilename?: string;\n onBack: () => void;\n};\n\nexport const Preview: FC<PreviewProps> = ({\n config,\n scenario,\n formValues,\n aiContext,\n initialContent = '',\n editingFilename,\n onBack,\n}) => {\n const [previewContent, setPreviewContent] = useState(initialContent);\n const [isGenerating, setIsGenerating] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [isSaving, setIsSaving] = useState(false);\n const [scrollOffset, setScrollOffset] = useState(0);\n const [dataPreviewScrollOffset, setDataPreviewScrollOffset] = useState(0);\n const [savedFilename, setSavedFilename] = useState<string | null>(null);\n const [showDataPreview, setShowDataPreview] = useState(false);\n const [showContinueDialog, setShowContinueDialog] = useState(false);\n const { stdout } = useStdout();\n const [sessionId, setSessionId] = useState<string | null>(null);\n const { exit } = useApp();\n\n const isEditing = editingFilename != null;\n const canSave = previewContent !== '' && !isGenerating;\n const lines = previewContent.split('\\n');\n // Layout: padding(1) + Header(1) + content + ControlBar(1) + StatusBar(1) + padding(1) + border(2) + line info(1)\n const fixedHeight = 8;\n const maxVisible = Math.max(10, (stdout?.rows ?? 24) - fixedHeight);\n const visibleLines = lines.slice(scrollOffset, scrollOffset + maxVisible);\n\n const canContinue = sessionId != null && !isGenerating;\n const controls = useMemo<ControlItem[]>(\n () => [\n { key: '\u2191\u2193/jk', action: 'scroll' },\n { key: 'r', action: 'regenerate' },\n ...(canSave ? [{ key: 's', action: 'save' }] : []),\n ...(canContinue ? [{ key: 'c', action: 'continue in Claude' }] : []),\n { key: 'i', action: 'info' },\n { key: 'q/Esc', action: 'back' },\n ],\n [canSave, canContinue],\n );\n\n const status = useMemo((): StatusInfo | undefined => {\n if (error) {\n return { message: `Error: ${error}`, type: 'error' };\n }\n if (isGenerating) {\n return { message: 'Generating...', type: 'warning' };\n }\n if (isSaving) {\n return { message: 'Saving...', type: 'warning' };\n }\n if (savedFilename) {\n return { message: `Saved: ${savedFilename}`, type: 'success' };\n }\n return undefined;\n }, [error, isGenerating, isSaving, savedFilename]);\n\n const handleGenerate = useCallback(async () => {\n setIsGenerating(true);\n setError(null);\n setPreviewContent('');\n setSessionId(null);\n\n let accumulatedContent = '';\n\n try {\n await generatePreview({\n scenario,\n formData: formValues,\n aiContext,\n onChunk: (chunk) => {\n accumulatedContent += chunk;\n setPreviewContent(accumulatedContent);\n },\n onComplete: (result) => {\n setPreviewContent(result.content);\n setSessionId(result.sessionId);\n setIsGenerating(false);\n },\n onError: (err) => {\n setError(err.message);\n setIsGenerating(false);\n },\n });\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Unknown error');\n setIsGenerating(false);\n }\n }, [scenario, formValues, aiContext]);\n\n const handleSave = useCallback(async () => {\n if (isSaving) return;\n\n setIsSaving(true);\n setError(null);\n setSavedFilename(null);\n\n try {\n const filename = await saveDocument({\n config,\n scenario,\n formData: formValues,\n aiContext,\n content: previewContent,\n existingFilename: editingFilename,\n });\n setIsSaving(false);\n setSavedFilename(filename);\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to save');\n setIsSaving(false);\n }\n }, [\n config,\n scenario,\n formValues,\n aiContext,\n previewContent,\n editingFilename,\n isSaving,\n ]);\n\n // Memoize JSON data for scroll calculations\n const formDataLines = useMemo(\n () => JSON.stringify(formValues, null, 2).split('\\n'),\n [formValues],\n );\n const aiContextLines = useMemo(\n () => JSON.stringify(aiContext, null, 2).split('\\n'),\n [aiContext],\n );\n const maxDataLines = Math.max(formDataLines.length, aiContextLines.length);\n const handleContinueInClaude = useCallback(\n async (shouldSave: boolean) => {\n if (!sessionId) return;\n\n if (shouldSave && canSave) {\n setIsSaving(true);\n setError(null);\n try {\n await saveDocument({\n config,\n scenario,\n formData: formValues,\n aiContext,\n content: previewContent,\n existingFilename: editingFilename,\n });\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to save');\n setIsSaving(false);\n setShowContinueDialog(false);\n return;\n }\n setIsSaving(false);\n }\n\n exit();\n\n setTimeout(() => {\n const child = spawn('claude', ['--resume', sessionId], {\n stdio: 'inherit',\n shell: true,\n });\n\n child.on('close', (code) => {\n process.exit(code ?? 0);\n });\n }, 100);\n },\n [\n sessionId,\n exit,\n canSave,\n config,\n scenario,\n formValues,\n aiContext,\n previewContent,\n editingFilename,\n ],\n );\n\n useControl({\n onEscape: () => {\n if (showContinueDialog) {\n setShowContinueDialog(false);\n } else if (showDataPreview) {\n setShowDataPreview(false);\n } else {\n onBack();\n }\n },\n onQuit: showContinueDialog ? undefined : onBack,\n onSave: () => {\n if (!isGenerating && !isSaving && !showContinueDialog) {\n handleSave();\n }\n },\n onRegenerate: () => {\n if (!isGenerating && !showContinueDialog) {\n handleGenerate();\n }\n },\n onUp: () => {\n if (showContinueDialog) return;\n if (showDataPreview) {\n setDataPreviewScrollOffset((prev) => Math.max(0, prev - 1));\n } else {\n setScrollOffset((prev) => Math.max(0, prev - 1));\n }\n },\n onDown: () => {\n if (showContinueDialog) return;\n if (showDataPreview) {\n // Account for borders (2) and title (1) and hint (1)\n const maxDataVisible = Math.max(5, maxVisible - 2);\n setDataPreviewScrollOffset((prev) =>\n Math.min(prev + 1, Math.max(0, maxDataLines - maxDataVisible)),\n );\n } else {\n setScrollOffset((prev) =>\n Math.min(prev + 1, Math.max(0, lines.length - maxVisible)),\n );\n }\n setScrollOffset((prev) =>\n Math.min(prev + 1, Math.max(0, lines.length - maxVisible)),\n );\n },\n onInfo: () => {\n if (showContinueDialog) return;\n setShowDataPreview((prev) => {\n if (!prev) {\n // Reset scroll when opening data preview\n setDataPreviewScrollOffset(0);\n }\n return !prev;\n });\n },\n onContinue: () => {\n if (canContinue && !showContinueDialog) {\n setShowContinueDialog(true);\n }\n },\n onChar: (char) => {\n if (showContinueDialog) {\n if (char === 'y' || char === 'Y') {\n handleContinueInClaude(true);\n } else if (char === 'n' || char === 'N') {\n handleContinueInClaude(false);\n }\n }\n },\n });\n\n useMount(() => {\n if (previewContent === '' && !isGenerating) {\n handleGenerate();\n }\n });\n\n if (showDataPreview) {\n // Account for borders (2) and title (1) and hint (1)\n const maxDataVisible = Math.max(5, maxVisible - 2);\n const visibleFormDataLines = formDataLines.slice(\n dataPreviewScrollOffset,\n dataPreviewScrollOffset + maxDataVisible,\n );\n const visibleAiContextLines = aiContextLines.slice(\n dataPreviewScrollOffset,\n dataPreviewScrollOffset + maxDataVisible,\n );\n const hasMoreDataAbove = dataPreviewScrollOffset > 0;\n const hasMoreDataBelow =\n dataPreviewScrollOffset + maxDataVisible < maxDataLines;\n\n return (\n <ScenarioLayout controls={controls} status={status}>\n <Box flexDirection=\"row\" gap={1} flexGrow={1}>\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={ACCENT_COLOR}\n paddingX={1}\n flexGrow={1}\n flexBasis={0}\n >\n <Box marginTop={-1} marginLeft={1}>\n <Text backgroundColor=\"black\" color={ACCENT_COLOR} bold>\n {' '}\n formData{' '}\n </Text>\n </Box>\n <Box flexDirection=\"column\" overflowY=\"hidden\">\n {hasMoreDataAbove && <Text dimColor>\u2191 more</Text>}\n {visibleFormDataLines.map((line, index) => (\n <Text key={dataPreviewScrollOffset + index}>{line || ' '}</Text>\n ))}\n {hasMoreDataBelow && <Text dimColor>\u2193 more</Text>}\n </Box>\n </Box>\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={ACCENT_COLOR}\n paddingX={1}\n flexGrow={1}\n flexBasis={0}\n >\n <Box marginTop={-1} marginLeft={1}>\n <Text backgroundColor=\"black\" color={ACCENT_COLOR} bold>\n {' '}\n aiContext{' '}\n </Text>\n </Box>\n <Box flexDirection=\"column\" overflowY=\"hidden\">\n {hasMoreDataAbove && <Text dimColor>\u2191 more</Text>}\n {visibleAiContextLines.map((line, index) => (\n <Text key={dataPreviewScrollOffset + index}>{line || ' '}</Text>\n ))}\n {hasMoreDataBelow && <Text dimColor>\u2193 more</Text>}\n </Box>\n </Box>\n </Box>\n <Box paddingX={1}>\n <Text dimColor>\n Press i or Esc to close\n {maxDataLines > maxDataVisible &&\n ` | Lines ${dataPreviewScrollOffset + 1}-${Math.min(dataPreviewScrollOffset + maxDataVisible, maxDataLines)} of ${maxDataLines}`}\n </Text>\n </Box>\n </ScenarioLayout>\n );\n }\n\n return (\n <ScenarioLayout controls={controls} status={status}>\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={ACCENT_COLOR}\n paddingX={1}\n height={maxVisible + 2}\n >\n <Box marginTop={-1} marginLeft={1}>\n <Text backgroundColor=\"black\" color={ACCENT_COLOR} bold>\n {' '}\n Preview{isEditing ? ` (${editingFilename})` : ''}{' '}\n </Text>\n </Box>\n {previewContent === '' && !isGenerating && !error ? (\n <Text dimColor>No preview content yet.</Text>\n ) : (\n visibleLines.map((line, index) => (\n <Text key={scrollOffset + index}>{line || ' '}</Text>\n ))\n )}\n </Box>\n\n {lines.length > maxVisible && (\n <Box paddingX={1}>\n <Text dimColor>\n Lines {scrollOffset + 1}-\n {Math.min(scrollOffset + maxVisible, lines.length)} of{' '}\n {lines.length}\n </Text>\n </Box>\n )}\n\n {showContinueDialog && (\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor=\"yellow\"\n paddingX={1}\n paddingY={0}\n marginTop={1}\n >\n <Box marginTop={-1} marginLeft={1}>\n <Text backgroundColor=\"black\" color=\"yellow\" bold>\n {' '}\n Continue in Claude{' '}\n </Text>\n </Box>\n <Text>Save document before continuing?</Text>\n <Box marginTop={1}>\n <Text>\n <Text color=\"green\" bold>\n [y]\n </Text>{' '}\n Save and continue{' '}\n <Text color=\"blue\" bold>\n [n]\n </Text>{' '}\n Continue without saving{' '}\n <Text dimColor bold>\n [Esc]\n </Text>{' '}\n Cancel\n </Text>\n </Box>\n </Box>\n )}\n </ScenarioLayout>\n );\n};\n", "import { mkdir, readFile, readdir, writeFile } from 'node:fs/promises';\nimport { join } from 'node:path';\n\nimport type { AiContext, Config, Scenario } from '../../../types';\nimport type {\n DocumentMetadata,\n DocumentWithMetadata,\n ReadDocumentResult,\n} from './types';\n\nconst METADATA_START = '<!-- design-docs-metadata';\nconst METADATA_END = '-->';\n\nexport const serializeMetadata = (metadata: DocumentMetadata): string => {\n return `${METADATA_START}\\n${JSON.stringify(metadata, null, 2)}\\n${METADATA_END}`;\n};\n\nexport const addMetadataToContent = (\n content: string,\n metadata: DocumentMetadata,\n): string => {\n return `${content}\\n\\n${serializeMetadata(metadata)}`;\n};\n\nexport const parseMetadata = (\n content: string,\n): { metadata: DocumentMetadata | null; content: string } => {\n const metadataStartIndex = content.lastIndexOf(METADATA_START);\n if (metadataStartIndex === -1) {\n return { metadata: null, content };\n }\n\n const metadataEndIndex = content.indexOf(METADATA_END, metadataStartIndex);\n if (metadataEndIndex === -1) {\n return { metadata: null, content };\n }\n\n try {\n const metadataJson = content\n .slice(metadataStartIndex + METADATA_START.length, metadataEndIndex)\n .trim();\n const metadata = JSON.parse(metadataJson) as DocumentMetadata;\n const cleanContent = content.slice(0, metadataStartIndex).trim();\n return { metadata, content: cleanContent };\n } catch {\n return { metadata: null, content };\n }\n};\n\nexport const getOutputDir = (scenario: Scenario): string => {\n return scenario.outputDir ?? join(process.cwd(), 'output');\n};\n\nexport const getFilename = (\n scenario: Scenario,\n scenarioId: string,\n content: string,\n formData: Record<string, unknown>,\n aiContext: AiContext,\n): string => {\n const timestamp = new Date().toISOString().replace(/[:.]/g, '-');\n\n const filename = scenario.filename;\n if (filename != null) {\n return typeof filename === 'function'\n ? filename({\n scenarioId,\n timestamp,\n content,\n formData,\n aiContext,\n })\n : filename;\n }\n\n return `design-doc-${scenarioId}-${timestamp}.md`;\n};\n\ntype SaveDocumentParams = {\n config: Config;\n scenario: Scenario;\n formData: Record<string, unknown>;\n aiContext: AiContext;\n content: string;\n existingFilename?: string;\n};\n\nexport const saveDocument = async ({\n scenario,\n aiContext,\n content,\n formData,\n existingFilename,\n}: SaveDocumentParams): Promise<string> => {\n const filename =\n existingFilename ??\n getFilename(scenario, scenario.id, content, formData, aiContext);\n\n const outputDir = getOutputDir(scenario);\n const outputPath = join(outputDir, filename);\n\n const contentWithMetadata = addMetadataToContent(content, {\n scenarioId: scenario.id,\n formData,\n });\n\n await mkdir(outputDir, { recursive: true });\n await writeFile(outputPath, contentWithMetadata, 'utf-8');\n\n return outputPath;\n};\n\nexport const readDocument = async (\n scenario: Scenario,\n filename: string,\n): Promise<ReadDocumentResult> => {\n const outputDir = getOutputDir(scenario);\n const filePath = join(outputDir, filename);\n\n try {\n const rawContent = await readFile(filePath, 'utf-8');\n const { metadata, content } = parseMetadata(rawContent);\n\n if (metadata?.scenarioId !== scenario.id) {\n return { success: false, error: 'scenario_mismatch' };\n }\n\n return {\n success: true,\n doc: { filename, content, metadata },\n };\n } catch {\n return { success: false, error: 'not_found' };\n }\n};\n\nexport const getDocumentsForScenario = async (\n scenario: Scenario,\n): Promise<DocumentWithMetadata[]> => {\n const outputDir = getOutputDir(scenario);\n\n try {\n const files = await readdir(outputDir);\n const mdFiles = files.filter((file) => file.endsWith('.md'));\n\n const docs = await Promise.all(\n mdFiles.map(async (filename) => {\n const result = await readDocument(scenario, filename);\n return result.success ? result.doc : null;\n }),\n );\n\n return docs.filter((doc) => doc != null);\n } catch {\n return [];\n }\n};\n", "import type { FormField, RepeatableLayout } from '../../../types';\n\nexport type FormValues = Record<string, Record<string, unknown>>;\n\nexport const ACCENT_COLOR = 'green';\nexport const HELP_COLOR = 'blue';\n\nexport type FocusPanel = 'steps' | 'list' | 'form';\n\nexport type FlatFieldItem =\n | {\n type: 'field';\n field: FormField;\n path: string;\n label: string;\n treePrefix?: string;\n }\n | {\n type: 'repeatable-add';\n repeatable: RepeatableLayout;\n path: string;\n label: string;\n treePrefix?: string;\n }\n | {\n type: 'repeatable-header';\n repeatable: RepeatableLayout;\n path: string;\n index: number;\n label: string;\n treePrefix?: string;\n };\n", "import { query } from '@anthropic-ai/claude-agent-sdk';\n\nimport type {\n GenerateDesignDocParams,\n GeneratePreviewParams,\n StreamChunk,\n} from './types';\n\nexport async function* generateDesignDocStream({\n scenario,\n formData,\n aiContext,\n}: GenerateDesignDocParams): AsyncGenerator<StreamChunk> {\n const prompt = scenario.prompt({ formData, aiContext });\n\n for await (const msg of query({\n prompt,\n options: {\n includePartialMessages: true,\n },\n })) {\n if (msg.type === 'stream_event') {\n const event = msg.event as {\n type: string;\n delta?: { type: string; text?: string };\n };\n if (\n event.type === 'content_block_delta' &&\n event.delta?.type === 'text_delta' &&\n event.delta.text != null\n ) {\n yield { type: 'text_delta', text: event.delta.text };\n }\n }\n }\n}\n\nexport const generatePreview = async ({\n scenario,\n formData,\n aiContext,\n onChunk,\n onComplete,\n onError,\n}: GeneratePreviewParams): Promise<void> => {\n try {\n let content = '';\n let sessionId: string | null = null;\n const prompt = scenario.prompt({ formData, aiContext });\n\n for await (const msg of query({\n prompt,\n options: {\n includePartialMessages: true,\n },\n })) {\n if (msg.type === 'stream_event') {\n const event = msg.event as {\n type: string;\n delta?: { type: string; text?: string };\n };\n if (\n event.type === 'content_block_delta' &&\n event.delta?.type === 'text_delta' &&\n event.delta.text != null\n ) {\n content += event.delta.text;\n onChunk(event.delta.text);\n }\n }\n if ('session_id' in msg && msg.session_id && !sessionId) {\n sessionId = msg.session_id;\n }\n }\n onComplete({ content, sessionId });\n } catch (error) {\n onError(error instanceof Error ? error : new Error(String(error)));\n }\n};\n", "import { useInput } from 'ink';\n\nexport type ControlOptions = {\n onUp?: () => void;\n onDown?: () => void;\n onLeft?: () => void;\n onRight?: () => void;\n onEnter?: () => void;\n onEscape?: () => void;\n onQuit?: () => void;\n onGenerate?: () => void;\n onSave?: () => void;\n onDelete?: () => void;\n onNext?: () => void;\n onPrev?: () => void;\n onRegenerate?: () => void;\n onInfo?: () => void;\n onContinue?: () => void;\n onChar?: (char: string) => void;\n isActive?: boolean;\n viKeysEnabled?: boolean;\n};\n\nexport const useControl = (options: ControlOptions = {}): void => {\n const {\n onUp,\n onDown,\n onLeft,\n onRight,\n onEnter,\n onEscape,\n onQuit,\n onGenerate,\n onSave,\n onDelete,\n onNext,\n onPrev,\n onRegenerate,\n onInfo,\n onContinue,\n onChar,\n isActive = true,\n viKeysEnabled = true,\n } = options;\n\n useInput(\n (input, key) => {\n if (key.upArrow) {\n onUp?.();\n return;\n }\n if (key.downArrow) {\n onDown?.();\n return;\n }\n if (key.leftArrow) {\n onLeft?.();\n return;\n }\n if (key.rightArrow) {\n onRight?.();\n return;\n }\n\n if (key.return) {\n onEnter?.();\n return;\n }\n if (key.escape) {\n onEscape?.();\n return;\n }\n\n if (viKeysEnabled) {\n switch (input) {\n case 'k':\n onUp?.();\n return;\n case 'j':\n onDown?.();\n return;\n case 'h':\n onLeft?.();\n return;\n case 'l':\n onRight?.();\n return;\n }\n }\n\n switch (input) {\n case 'q':\n onQuit?.();\n return;\n case 'g':\n onGenerate?.();\n return;\n case 's':\n onSave?.();\n return;\n case 'd':\n onDelete?.();\n return;\n case 'n':\n onNext?.();\n return;\n case 'p':\n onPrev?.();\n return;\n case 'r':\n onRegenerate?.();\n return;\n case 'i':\n onInfo?.();\n return;\n case 'c':\n onContinue?.();\n return;\n }\n\n onChar?.(input);\n },\n { isActive },\n );\n};\n", "import { useEffect, useRef } from 'react';\n\ntype MountFunction = () => void | Promise<void>;\n\ntype StrictVoidFunction<T extends MountFunction> =\n ReturnType<T> extends void | Promise<void> ? T : never;\n\nexport const useMount = <T extends MountFunction>(\n fn: StrictVoidFunction<T>,\n) => {\n const mountedRef = useRef(false);\n\n // biome-ignore lint/correctness/useExhaustiveDependencies: <explanation>\n useEffect(() => {\n if (mountedRef.current) {\n return;\n }\n fn();\n mountedRef.current = true;\n }, []);\n};\n", "import { Box } from 'ink';\nimport type { FC, ReactNode } from 'react';\n\nimport { ControlBar, type ControlItem } from '../../components/ControlBar';\nimport { Header } from '../../components/Header';\nimport { StatusBar, type StatusType } from '../../components/StatusBar';\nimport { useTerminalHeight } from '../../hooks/useTerminalHeight';\n\nexport type StatusInfo = {\n message: string;\n type?: StatusType;\n};\n\nexport type CommonLayoutProps = {\n children: ReactNode;\n status?: StatusInfo;\n controls?: ControlItem[];\n};\n\nexport const CommonLayout: FC<CommonLayoutProps> = ({\n children,\n status,\n controls = [],\n}) => {\n const { rows } = useTerminalHeight();\n\n return (\n <Box flexDirection=\"column\" padding={1} height={rows}>\n <Header />\n <Box flexDirection=\"column\" flexGrow={1}>\n {children}\n </Box>\n {controls.length > 0 && <ControlBar items={controls} />}\n {status?.message && (\n <StatusBar message={status.message} type={status.type} />\n )}\n </Box>\n );\n};\n", "import { Box, Text } from 'ink';\nimport type { FC } from 'react';\n\nimport { HELP_COLOR } from '../../features/form/types';\n\nexport type ControlItem = {\n key: string;\n action: string;\n};\n\nexport type ControlBarProps = {\n items: ControlItem[];\n};\n\nexport const ControlBar: FC<ControlBarProps> = ({ items }) => {\n if (items.length === 0) {\n return null;\n }\n\n const helpText = items\n .map((item) => `${item.key}: ${item.action}`)\n .join(' | ');\n\n return (\n <Box paddingX={1}>\n <Text color={HELP_COLOR}>{helpText}</Text>\n </Box>\n );\n};\n", "import { Box, Text } from 'ink';\nimport type { FC } from 'react';\n\nimport { ACCENT_COLOR } from '../../features/form/types';\n\nexport type HeaderProps = {\n description?: string;\n};\n\nexport const Header: FC<HeaderProps> = ({\n description = 'Structured Prompt Builder for Claude',\n}) => {\n return (\n <Box\n borderStyle=\"double\"\n borderColor={ACCENT_COLOR}\n paddingX={1}\n justifyContent=\"space-between\"\n >\n <Text color={ACCENT_COLOR} bold>\n \uD83D\uDC0D pre-claude\n </Text>\n <Box flexDirection=\"column\" alignItems=\"flex-end\">\n <Text color={ACCENT_COLOR}>{description}</Text>\n <Text color={ACCENT_COLOR} dimColor>\n https://github.com/cut0/pre-claude\n </Text>\n </Box>\n </Box>\n );\n};\n", "import { Box, Text } from 'ink';\nimport type { FC } from 'react';\n\nexport type StatusType = 'success' | 'error' | 'warning' | 'info';\n\nexport type StatusBarProps = {\n message: string;\n type?: StatusType;\n};\n\nconst getStatusColor = (type: StatusType): string => {\n switch (type) {\n case 'success':\n return 'green';\n case 'error':\n return 'red';\n case 'warning':\n return 'yellow';\n case 'info':\n return 'blue';\n }\n};\n\nconst getStatusBackground = (\n type: StatusType,\n): 'green' | 'red' | 'yellow' | undefined => {\n switch (type) {\n case 'success':\n return 'green';\n case 'error':\n return 'red';\n case 'warning':\n return 'yellow';\n case 'info':\n return undefined;\n }\n};\n\nexport const StatusBar: FC<StatusBarProps> = ({ message, type = 'info' }) => {\n if (!message) {\n return null;\n }\n\n const backgroundColor = getStatusBackground(type);\n const color = getStatusColor(type);\n\n return (\n <Box paddingX={1}>\n {backgroundColor ? (\n <Text backgroundColor={backgroundColor} color=\"white\">\n {' '}\n {message}{' '}\n </Text>\n ) : (\n <Text color={color}>{message}</Text>\n )}\n </Box>\n );\n};\n", "import { useStdout } from 'ink';\n\n/**\n * Hook to get terminal height and calculate available content height.\n *\n * CommonLayout fixed elements breakdown:\n * - padding top: 1 line\n * - Header: 3 lines (1 content + 2 border)\n * - ControlBar: 1 line\n * - StatusBar: 1 line\n * - padding bottom: 1 line\n * Total: 7 lines\n */\nexport const useTerminalHeight = () => {\n const { stdout } = useStdout();\n const rows = stdout?.rows ?? 24;\n\n const fixedLayoutHeight = 7;\n const availableHeight = Math.max(10, rows - fixedLayoutHeight);\n\n return { rows, availableHeight };\n};\n", "import type { FC, ReactNode } from 'react';\n\nimport type { ControlItem } from '../../components/ControlBar';\nimport { CommonLayout, type StatusInfo } from '../CommonLayout';\n\nexport type ScenarioLayoutProps = {\n children: ReactNode;\n status?: StatusInfo;\n controls?: ControlItem[];\n};\n\nexport const ScenarioLayout: FC<ScenarioLayoutProps> = ({\n children,\n status,\n controls = [],\n}) => {\n return (\n <CommonLayout status={status} controls={controls}>\n {children}\n </CommonLayout>\n );\n};\n", "import { Box, Text } from 'ink';\nimport { type FC, useCallback, useMemo, useState } from 'react';\n\nimport type { AiContext, RepeatableLayout, Scenario } from '../../../types';\nimport type { ControlItem } from '../../components/ControlBar';\nimport { buildAiContext } from '../../features/form/services';\nimport type {\n FlatFieldItem,\n FocusPanel,\n FormValues,\n} from '../../features/form/types';\nimport {\n buildRepeatableItemDefaults,\n flattenFields,\n getValueByPath,\n setValueByPath,\n} from '../../features/form/utils';\nimport { useFormState } from '../../hooks/useFormState';\nimport { useMount } from '../../hooks/useMount';\nimport { useTerminalHeight } from '../../hooks/useTerminalHeight';\nimport type { StatusInfo } from '../../layouts/CommonLayout';\nimport { ScenarioLayout } from '../../layouts/ScenarioLayout';\nimport { FieldEditor } from './-internal/FieldEditor';\nimport { FieldSelector } from './-internal/FieldSelector';\nimport { StepSelector } from './-internal/StepSelector';\n\nexport type ScenarioFormProps = {\n scenario: Scenario;\n initialFormValues?: FormValues;\n onGeneratePreview: (formValues: FormValues, aiContext: AiContext) => void;\n onBack: () => void;\n};\n\nexport const ScenarioForm: FC<ScenarioFormProps> = ({\n scenario,\n initialFormValues,\n onGeneratePreview,\n onBack,\n}) => {\n const formState = useFormState(scenario);\n const [stepIndex, setStepIndex] = useState(0);\n const [focusPanel, setFocusPanel] = useState<FocusPanel>('steps');\n const [currentItem, setCurrentItem] = useState<FlatFieldItem | undefined>();\n const [validationError, setValidationError] = useState<string | null>(null);\n const { availableHeight } = useTerminalHeight();\n // Account for StepSelector (~3 lines with borders)\n const fieldSelectorHeight = Math.max(8, availableHeight - 3);\n\n const currentStep = scenario.steps[stepIndex];\n\n if (currentStep == null) {\n return <Text color=\"red\">Error: Step not found</Text>;\n }\n\n const isFirstStep = stepIndex === 0;\n const isLastStep = stepIndex === scenario.steps.length - 1;\n\n const stepValues = (formState.formValues[currentStep.name] ?? {}) as Record<\n string,\n unknown\n >;\n\n const flatItems = flattenFields(\n currentStep.fields,\n stepValues,\n formState.formValues as Record<string, unknown>,\n );\n\n const controls = useMemo<ControlItem[]>(() => {\n switch (focusPanel) {\n case 'steps':\n return [\n { key: '\u2190\u2192/hl', action: 'select step' },\n { key: '\u2193/j', action: 'to fields' },\n { key: 'Enter', action: 'confirm' },\n { key: 'g', action: 'generate' },\n { key: 'q', action: 'back' },\n ];\n case 'form':\n return [\n { key: '\u2191\u2193/jk', action: 'move' },\n { key: 'Enter', action: 'confirm' },\n { key: 'Esc', action: 'back' },\n ];\n case 'list':\n return [\n { key: '\u2191\u2193/jk', action: 'move' },\n { key: 'Enter', action: 'edit' },\n { key: 'd', action: 'delete' },\n ...(!isFirstStep ? [{ key: 'p', action: 'prev' }] : []),\n ...(!isLastStep ? [{ key: 'n', action: 'next' }] : []),\n { key: 'g', action: 'generate' },\n { key: 'q', action: 'back' },\n ];\n }\n }, [focusPanel, isFirstStep, isLastStep]);\n\n const status = useMemo((): StatusInfo | undefined => {\n if (validationError) {\n return { message: validationError, type: 'error' };\n }\n return undefined;\n }, [validationError]);\n\n const updateValue = useCallback(\n (path: string, value: unknown) => {\n const keys = path.split('.');\n if (keys.length === 1) {\n formState.updateFieldValue(currentStep.name, path, value);\n } else {\n const newStepValues = setValueByPath(stepValues, path, value);\n const rootKey = keys[0] as string;\n formState.updateFieldValue(\n currentStep.name,\n rootKey,\n newStepValues[rootKey],\n );\n }\n },\n [currentStep.name, stepValues, formState],\n );\n\n const addRepeatableItem = useCallback(\n (repeatable: RepeatableLayout, path: string) => {\n const newItem = buildRepeatableItemDefaults(repeatable);\n\n // Check if this is a nested repeatable (path contains dots)\n if (path.includes('.')) {\n const items =\n (getValueByPath(stepValues, path) as Record<string, unknown>[]) || [];\n const newStepValues = setValueByPath(stepValues, path, [\n ...items,\n newItem,\n ]);\n const rootKey = path.split('.')[0] as string;\n formState.updateFieldValue(\n currentStep.name,\n rootKey,\n newStepValues[rootKey],\n );\n } else {\n const items =\n (stepValues[repeatable.id] as Record<string, unknown>[]) || [];\n formState.updateFieldValue(currentStep.name, repeatable.id, [\n ...items,\n newItem,\n ]);\n }\n },\n [currentStep.name, stepValues, formState],\n );\n\n const removeRepeatableItem = useCallback(\n (repeatable: RepeatableLayout, index: number, path: string) => {\n // Extract the repeatable path (remove the item index from the end)\n const pathParts = path.split('.');\n pathParts.pop(); // Remove the index\n const repeatablePath = pathParts.join('.');\n\n const minCount = repeatable.minCount ?? 0;\n\n // Check if this is a nested repeatable\n if (repeatablePath.includes('.')) {\n const items =\n (getValueByPath(stepValues, repeatablePath) as\n | Record<string, unknown>[]\n | undefined) || [];\n if (items.length > minCount) {\n const newItems = items.filter((_, i) => i !== index);\n const newStepValues = setValueByPath(\n stepValues,\n repeatablePath,\n newItems,\n );\n const rootKey = repeatablePath.split('.')[0] as string;\n formState.updateFieldValue(\n currentStep.name,\n rootKey,\n newStepValues[rootKey],\n );\n }\n } else {\n const items =\n (stepValues[repeatable.id] as Record<string, unknown>[]) || [];\n if (items.length > minCount) {\n const newItems = items.filter((_, i) => i !== index);\n formState.updateFieldValue(currentStep.name, repeatable.id, newItems);\n }\n }\n },\n [currentStep.name, stepValues, formState],\n );\n\n const validateAllSteps = useCallback((): boolean => {\n for (const step of scenario.steps) {\n const values = (formState.formValues[step.name] ?? {}) as Record<\n string,\n unknown\n >;\n const items = flattenFields(\n step.fields,\n values,\n formState.formValues as Record<string, unknown>,\n );\n for (const item of items) {\n if (item.type === 'field' && item.field.required) {\n const value = getValueByPath(values, item.path);\n if (value == null || value === '') {\n return false;\n }\n }\n }\n }\n return true;\n }, [scenario.steps, formState.formValues]);\n\n const handleGenerate = useCallback(() => {\n if (!validateAllSteps()) {\n setValidationError('Required fields are missing');\n return;\n }\n setValidationError(null);\n const aiContext = buildAiContext(scenario.steps);\n onGeneratePreview(formState.formValues, aiContext);\n }, [\n validateAllSteps,\n scenario.steps,\n formState.formValues,\n onGeneratePreview,\n ]);\n\n const handleNextStep = useCallback(() => {\n const nextIndex = stepIndex + 1;\n if (nextIndex < scenario.steps.length) {\n setStepIndex(nextIndex);\n }\n }, [stepIndex, scenario.steps.length]);\n\n const handlePrevStep = useCallback(() => {\n const prevIndex = stepIndex - 1;\n if (prevIndex >= 0) {\n setStepIndex(prevIndex);\n }\n }, [stepIndex]);\n\n const handleGoToStep = useCallback(\n (index: number) => {\n if (index >= 0 && index < scenario.steps.length) {\n setStepIndex(index);\n }\n },\n [scenario.steps.length],\n );\n\n const handleFocusToForm = useCallback(\n (item: FlatFieldItem) => {\n if (item.type === 'field') {\n const field = item.field;\n if (field.type === 'checkbox') {\n const currentValue = Boolean(getValueByPath(stepValues, item.path));\n updateValue(item.path, !currentValue);\n return;\n }\n setCurrentItem(item);\n setFocusPanel('form');\n }\n },\n [stepValues, updateValue],\n );\n\n const handleFormSubmit = useCallback(\n (value: unknown) => {\n if (currentItem?.type === 'field') {\n updateValue(currentItem.path, value);\n }\n setFocusPanel('list');\n },\n [currentItem, updateValue],\n );\n\n const handleFormCancel = useCallback(() => {\n setFocusPanel('list');\n }, []);\n\n const handleAddItem = useCallback(\n (item: FlatFieldItem) => {\n if (item.type === 'repeatable-add') {\n addRepeatableItem(item.repeatable, item.path);\n }\n },\n [addRepeatableItem],\n );\n\n const handleDeleteItem = useCallback(\n (item: FlatFieldItem) => {\n if (item.type === 'repeatable-header') {\n removeRepeatableItem(item.repeatable, item.index, item.path);\n }\n },\n [removeRepeatableItem],\n );\n\n useMount(() => {\n if (initialFormValues) {\n formState.setFormValues(initialFormValues);\n }\n });\n\n return (\n <ScenarioLayout controls={controls} status={status}>\n <StepSelector\n steps={scenario.steps}\n currentStepIndex={stepIndex}\n isFocused={focusPanel === 'steps'}\n onStepSelect={handleGoToStep}\n onFocusDown={() => setFocusPanel('list')}\n onGenerate={handleGenerate}\n onBack={onBack}\n />\n\n <Box flexGrow={1}>\n <FieldSelector\n flatItems={flatItems}\n stepValues={stepValues}\n isFocused={focusPanel === 'list'}\n isFirstStep={isFirstStep}\n isLastStep={isLastStep}\n maxHeight={fieldSelectorHeight}\n onFocusUp={() => setFocusPanel('steps')}\n onFocusToForm={handleFocusToForm}\n onAddItem={handleAddItem}\n onDeleteItem={handleDeleteItem}\n onNextStep={handleNextStep}\n onPrevStep={handlePrevStep}\n onGenerate={handleGenerate}\n onBack={onBack}\n />\n\n <FieldEditor\n key={currentItem?.type === 'field' ? currentItem.path : undefined}\n currentItem={currentItem}\n stepValues={stepValues}\n isFocused={focusPanel === 'form'}\n onSubmit={handleFormSubmit}\n onCancel={handleFormCancel}\n />\n </Box>\n </ScenarioLayout>\n );\n};\n", "import * as v from 'valibot';\nimport type {\n Field,\n FieldConditionObject,\n GroupLayout,\n LayoutField,\n RepeatableLayout,\n} from './types';\n\n// =============================================================================\n// Type Guards\n// =============================================================================\n\nexport const isLayoutField = (field: Field): field is LayoutField => {\n return field.type === 'repeatable' || field.type === 'group';\n};\n\n// =============================================================================\n// Form Field Schemas\n// =============================================================================\n\n// =============================================================================\n// Field Condition Schema\n// =============================================================================\n\n// Single field condition (supports dot notation for nested paths)\nconst FieldConditionSingleSchema = v.union([\n v.object({\n field: v.string(),\n is: v.union([\n v.string(),\n v.boolean(),\n v.array(v.union([v.string(), v.boolean()])),\n ]),\n }),\n v.object({\n field: v.string(),\n isNot: v.union([\n v.string(),\n v.boolean(),\n v.array(v.union([v.string(), v.boolean()])),\n ]),\n }),\n v.object({\n field: v.string(),\n isEmpty: v.literal(true),\n }),\n v.object({\n field: v.string(),\n isNotEmpty: v.literal(true),\n }),\n]);\n\n// Full condition schema with and/or support (recursive)\nconst FieldConditionSchema: v.GenericSchema<FieldConditionObject> = v.union([\n FieldConditionSingleSchema,\n v.object({\n and: v.array(v.lazy(() => FieldConditionSchema)),\n }),\n v.object({\n or: v.array(v.lazy(() => FieldConditionSchema)),\n }),\n]) as v.GenericSchema<FieldConditionObject>;\n\nconst FieldBaseSchema = v.object({\n id: v.string(),\n label: v.string(),\n description: v.string(),\n placeholder: v.optional(v.string()),\n required: v.optional(v.boolean()),\n when: v.optional(FieldConditionSchema),\n});\n\nexport const SelectOptionSchema = v.object({\n value: v.string(),\n label: v.string(),\n});\n\nexport const InputFieldSchema = v.object({\n ...FieldBaseSchema.entries,\n type: v.literal('input'),\n inputType: v.optional(v.picklist(['text', 'date', 'url'])),\n suggestions: v.optional(v.array(v.string())),\n default: v.optional(v.string()),\n});\n\nexport const TextareaFieldSchema = v.object({\n ...FieldBaseSchema.entries,\n type: v.literal('textarea'),\n rows: v.optional(v.number()),\n default: v.optional(v.string()),\n});\n\nexport const SelectFieldSchema = v.object({\n ...FieldBaseSchema.entries,\n type: v.literal('select'),\n options: v.array(SelectOptionSchema),\n default: v.optional(v.string()),\n});\n\nexport const CheckboxFieldSchema = v.object({\n ...FieldBaseSchema.entries,\n type: v.literal('checkbox'),\n default: v.optional(v.boolean()),\n});\n\nexport const FormFieldSchema = v.union([\n InputFieldSchema,\n TextareaFieldSchema,\n SelectFieldSchema,\n CheckboxFieldSchema,\n]);\n\n// =============================================================================\n// Layout Schemas\n// =============================================================================\n\nexport const GroupLayoutSchema: v.GenericSchema<GroupLayout> = v.object({\n type: v.literal('group'),\n fields: v.array(v.lazy(() => FieldSchema)),\n});\n\nexport const RepeatableLayoutSchema: v.GenericSchema<RepeatableLayout> =\n v.object({\n type: v.literal('repeatable'),\n id: v.string(),\n label: v.string(),\n minCount: v.optional(v.number()),\n defaultCount: v.optional(v.number()),\n field: v.union([FormFieldSchema, GroupLayoutSchema]),\n });\n\nexport const FieldSchema: v.GenericSchema<Field> = v.union([\n FormFieldSchema,\n RepeatableLayoutSchema,\n GroupLayoutSchema,\n]);\n\n// =============================================================================\n// Step Schema\n// =============================================================================\n\nexport const StepSchema = v.object({\n slug: v.string(),\n title: v.string(),\n description: v.string(),\n name: v.string(),\n fields: v.array(FieldSchema),\n});\n\n// =============================================================================\n// Scenario Schema\n// =============================================================================\n\nexport const ScenarioBaseSchema = v.object({\n id: v.string(),\n name: v.string(),\n steps: v.array(StepSchema),\n prompt: v.custom<\n (params: { formData: unknown; aiContext: unknown }) => string\n >((value) => typeof value === 'function'),\n});\n\nexport const ScenarioSchema = ScenarioBaseSchema;\n\n// =============================================================================\n// Configuration Schemas\n// =============================================================================\n\nexport const ConfigSchema = v.object({\n scenarios: v.array(ScenarioSchema),\n});\n\n// =============================================================================\n// Parser Functions\n// =============================================================================\n\nexport const parseConfig = (data: unknown) => {\n return v.parse(ConfigSchema, data);\n};\n\nexport const safeParseConfig = (data: unknown) => {\n return v.safeParse(ConfigSchema, data);\n};\n", "import type {\n AiContext,\n AiContextFieldMeta,\n AiContextRepeatable,\n AiContextStep,\n Field,\n FieldConditionObject,\n FieldConditionSingle,\n FormField,\n Step,\n} from '../../../definitions';\nimport { isLayoutField } from '../../../schema';\n\nconst getValueByPath = (\n obj: Record<string, unknown>,\n path: string,\n): unknown => {\n return path.split('.').reduce<unknown>((acc, key) => {\n if (acc == null || typeof acc !== 'object') return undefined;\n return (acc as Record<string, unknown>)[key];\n }, obj);\n};\n\nconst isSingleCondition = (\n condition: FieldConditionObject,\n): condition is FieldConditionSingle => {\n return 'field' in condition;\n};\n\nconst evaluateSingleCondition = (\n condition: FieldConditionSingle,\n itemData: Record<string, unknown>,\n rootFormData: Record<string, unknown>,\n): boolean => {\n const fieldPath = condition.field;\n let fieldValue: unknown;\n\n if (fieldPath.includes('.')) {\n fieldValue = getValueByPath(rootFormData, fieldPath);\n } else {\n fieldValue =\n itemData[fieldPath] !== undefined\n ? itemData[fieldPath]\n : getValueByPath(rootFormData, fieldPath);\n }\n\n if ('is' in condition) {\n const expected = condition.is;\n if (Array.isArray(expected)) {\n return expected.includes(fieldValue as string | boolean);\n }\n return fieldValue === expected;\n }\n\n if ('isNot' in condition) {\n const expected = condition.isNot;\n if (Array.isArray(expected)) {\n return !expected.includes(fieldValue as string | boolean);\n }\n return fieldValue !== expected;\n }\n\n if ('isEmpty' in condition) {\n return fieldValue == null || fieldValue === '' || fieldValue === false;\n }\n\n if ('isNotEmpty' in condition) {\n return fieldValue != null && fieldValue !== '' && fieldValue !== false;\n }\n\n return true;\n};\n\nexport const evaluateCondition = (\n condition: FieldConditionObject,\n itemData: Record<string, unknown>,\n rootFormData: Record<string, unknown>,\n): boolean => {\n if ('and' in condition) {\n return condition.and.every((c) =>\n evaluateCondition(c, itemData, rootFormData),\n );\n }\n\n if ('or' in condition) {\n return condition.or.some((c) =>\n evaluateCondition(c, itemData, rootFormData),\n );\n }\n\n if (isSingleCondition(condition)) {\n return evaluateSingleCondition(condition, itemData, rootFormData);\n }\n\n return true;\n};\n\nexport const isFieldVisible = (\n field: FormField,\n itemData: Record<string, unknown>,\n rootFormData?: Record<string, unknown>,\n): boolean => {\n const condition = field.when;\n if (condition == null) return true;\n\n return evaluateCondition(condition, itemData, rootFormData ?? itemData);\n};\n\nconst getLayoutFields = (field: Field): Field[] => {\n if (field.type === 'group') {\n return field.fields;\n }\n if (field.type === 'repeatable') {\n return [field.field];\n }\n return [];\n};\n\nexport const extractRequiredFieldIds = (\n fields: Field[],\n formData: Record<string, unknown>,\n): string[] => {\n const result: string[] = [];\n for (const field of fields) {\n if (field.type === 'repeatable') {\n continue;\n }\n if (isLayoutField(field)) {\n result.push(...extractRequiredFieldIds(getLayoutFields(field), formData));\n } else if (field.required === true && isFieldVisible(field, formData)) {\n result.push(field.id);\n }\n }\n return result;\n};\n\nexport const getVisibleFieldIds = (\n fields: Field[],\n formData: Record<string, unknown>,\n): string[] => {\n const result: string[] = [];\n for (const field of fields) {\n if (field.type === 'repeatable') {\n result.push(field.id);\n continue;\n }\n if (isLayoutField(field)) {\n result.push(...getVisibleFieldIds(getLayoutFields(field), formData));\n } else if (isFieldVisible(field, formData)) {\n result.push(field.id);\n }\n }\n return result;\n};\n\nconst getFieldDefaultValue = (field: FormField): unknown => {\n if (field.default != null) {\n return field.default;\n }\n return field.type === 'checkbox' ? false : '';\n};\n\nexport const buildFieldDefaults = (\n fields: Field[],\n): Record<string, unknown> => {\n const defaults: Record<string, unknown> = {};\n for (const field of fields) {\n if (field.type === 'group') {\n Object.assign(defaults, buildFieldDefaults(field.fields));\n } else if (field.type === 'repeatable') {\n const count = field.defaultCount ?? field.minCount ?? 0;\n if (field.field.type === 'group') {\n const groupFields = field.field.fields;\n defaults[field.id] = Array.from({ length: count }, () =>\n buildFieldDefaults(groupFields),\n );\n } else {\n const singleField = field.field as FormField;\n defaults[field.id] = Array.from({ length: count }, () => ({\n [singleField.id]: getFieldDefaultValue(singleField),\n }));\n }\n } else if (!isLayoutField(field)) {\n defaults[field.id] = getFieldDefaultValue(field);\n }\n }\n return defaults;\n};\n\nexport const buildFormDefaultValues = (\n steps: Step[],\n): Record<string, unknown> => {\n const defaults: Record<string, unknown> = {};\n for (const step of steps) {\n defaults[step.name] = buildFieldDefaults(step.fields);\n }\n return defaults;\n};\n\nconst buildFieldMeta = (\n field: Field,\n): AiContextFieldMeta | AiContextRepeatable | null => {\n switch (field.type) {\n case 'input':\n case 'textarea':\n case 'select':\n case 'checkbox':\n return {\n label: field.label,\n description: field.description,\n };\n\n case 'repeatable': {\n const innerField = field.field;\n if (innerField.type === 'group') {\n return buildFieldsMeta(innerField.fields);\n }\n const meta = buildFieldMeta(innerField);\n if (meta != null && 'label' in meta) {\n return { [innerField.id]: meta };\n }\n return meta;\n }\n\n case 'group':\n return buildFieldsMeta(field.fields);\n\n default:\n return null;\n }\n};\n\nconst buildFieldsMeta = (\n fields: readonly Field[],\n): AiContextRepeatable | null => {\n const result: AiContextRepeatable = {};\n\n for (const field of fields) {\n if (field.type === 'group') {\n const groupMeta = buildFieldsMeta(field.fields);\n if (groupMeta != null) {\n Object.assign(result, groupMeta);\n }\n continue;\n }\n\n if (field.type === 'repeatable') {\n const meta = buildFieldMeta(field);\n if (meta != null) {\n result[field.id] = meta;\n }\n continue;\n }\n\n const meta = buildFieldMeta(field);\n if (meta != null) {\n result[field.id] = meta;\n }\n }\n\n return Object.keys(result).length > 0 ? result : null;\n};\n\nexport const buildAiContext = (steps: Step[]): AiContext => {\n const result: AiContext = {};\n\n for (const step of steps) {\n const stepContext: AiContextStep = {\n _step: {\n title: step.title,\n description: step.description,\n },\n };\n\n const fieldsMeta = buildFieldsMeta(step.fields);\n if (fieldsMeta != null) {\n Object.assign(stepContext, fieldsMeta);\n }\n\n result[step.name] = stepContext;\n }\n\n return result;\n};\n\nexport const validateStepFields = (\n step: Step,\n stepValues: Record<string, unknown>,\n _rootFormData: Record<string, unknown>,\n): { isValid: boolean; errors: string[] } => {\n const errors: string[] = [];\n const requiredFieldIds = extractRequiredFieldIds(step.fields, stepValues);\n\n for (const fieldId of requiredFieldIds) {\n const value = stepValues[fieldId];\n if (value == null || value === '') {\n const field = findFieldById(step.fields, fieldId);\n const label = field && 'label' in field ? field.label : fieldId;\n errors.push(`${label} is required`);\n }\n }\n\n return {\n isValid: errors.length === 0,\n errors,\n };\n};\n\nconst findFieldById = (fields: Field[], fieldId: string): Field | undefined => {\n for (const field of fields) {\n if ('id' in field && field.id === fieldId) {\n return field;\n }\n if (field.type === 'group') {\n const found = findFieldById(field.fields, fieldId);\n if (found) return found;\n }\n if (field.type === 'repeatable') {\n if (field.field.type === 'group') {\n const found = findFieldById(field.field.fields, fieldId);\n if (found) return found;\n } else if (field.field.id === fieldId) {\n return field.field;\n }\n }\n }\n return undefined;\n};\n", "import type {\n Field,\n FormField,\n GroupLayout,\n RepeatableLayout,\n} from '../../../types';\nimport { buildFieldDefaults, isFieldVisible } from './services';\nimport type { FlatFieldItem } from './types';\n\nexport const getValueByPath = (\n obj: Record<string, unknown>,\n path: string,\n): unknown => {\n return path.split('.').reduce<unknown>((acc, key) => {\n if (acc == null || typeof acc !== 'object') return undefined;\n return (acc as Record<string, unknown>)[key];\n }, obj);\n};\n\nexport const setValueByPath = (\n obj: Record<string, unknown>,\n path: string,\n value: unknown,\n): Record<string, unknown> => {\n const keys = path.split('.');\n const result = { ...obj };\n let current: Record<string, unknown> = result;\n\n for (let i = 0; i < keys.length - 1; i++) {\n const key = keys[i] as string;\n if (Array.isArray(current[key])) {\n current[key] = [...(current[key] as unknown[])];\n } else {\n current[key] = { ...(current[key] as Record<string, unknown>) };\n }\n current = current[key] as Record<string, unknown>;\n }\n\n current[keys[keys.length - 1] as string] = value;\n return result;\n};\n\nexport const getRepeatableInnerFields = (\n repeatable: RepeatableLayout,\n): FormField[] => {\n if (repeatable.field.type === 'group') {\n return (repeatable.field as GroupLayout).fields.filter(\n (f): f is FormField => f.type !== 'repeatable' && f.type !== 'group',\n );\n }\n return [repeatable.field as FormField];\n};\n\n/**\n * Get all inner fields including nested repeatables\n */\nexport const getAllRepeatableInnerFields = (\n repeatable: RepeatableLayout,\n): Field[] => {\n if (repeatable.field.type === 'group') {\n return (repeatable.field as GroupLayout).fields;\n }\n return [repeatable.field];\n};\n\n/**\n * Build default values for a new repeatable item\n */\nexport const buildRepeatableItemDefaults = (\n repeatable: RepeatableLayout,\n): Record<string, unknown> => {\n if (repeatable.field.type === 'group') {\n return buildFieldDefaults(repeatable.field.fields);\n }\n const singleField = repeatable.field as FormField;\n return {\n [singleField.id]: singleField.type === 'checkbox' ? false : '',\n };\n};\n\ntype FlattenContext = {\n pathPrefix: string;\n treePrefix: string; // Prefix for items at this level (e.g., \"\u251C\u2500 \" or \"\u2502 \u251C\u2500 \")\n continuationPrefix: string; // Prefix for children (e.g., \"\u2502 \" or \"\u2502 \u2502 \")\n depth: number;\n};\n\n/**\n * Flatten nested fields into a flat list with proper tree prefixes for display\n */\nexport const flattenFields = (\n fields: Field[],\n stepValues: Record<string, unknown>,\n rootFormData: Record<string, unknown>,\n pathPrefix = '',\n _depth = 0,\n): FlatFieldItem[] => {\n return flattenFieldsInternal(fields, stepValues, rootFormData, {\n pathPrefix,\n treePrefix: '',\n continuationPrefix: '',\n depth: 0,\n });\n};\n\nconst flattenFieldsInternal = (\n fields: Field[],\n stepValues: Record<string, unknown>,\n rootFormData: Record<string, unknown>,\n ctx: FlattenContext,\n): FlatFieldItem[] => {\n const result: FlatFieldItem[] = [];\n\n for (const field of fields) {\n if (field.type === 'group') {\n result.push(\n ...flattenFieldsInternal(field.fields, stepValues, rootFormData, ctx),\n );\n } else if (field.type === 'repeatable') {\n result.push(\n ...flattenRepeatableField(field, stepValues, rootFormData, ctx),\n );\n } else {\n if (isFieldVisible(field, stepValues, rootFormData)) {\n const requiredMarker = field.required ? ' *' : '';\n result.push({\n type: 'field',\n field,\n path: ctx.pathPrefix ? `${ctx.pathPrefix}.${field.id}` : field.id,\n label: `${field.label}${requiredMarker}`,\n });\n }\n }\n }\n\n return result;\n};\n\nconst flattenRepeatableField = (\n field: RepeatableLayout,\n stepValues: Record<string, unknown>,\n rootFormData: Record<string, unknown>,\n ctx: FlattenContext,\n): FlatFieldItem[] => {\n const result: FlatFieldItem[] = [];\n const repeatablePath = ctx.pathPrefix\n ? `${ctx.pathPrefix}.${field.id}`\n : field.id;\n\n // Always access by field.id since stepValues is scoped to the current context\n const repeatableData = stepValues[field.id] as\n | Record<string, unknown>[]\n | undefined;\n const items = repeatableData || [];\n const allInnerFields = getAllRepeatableInnerFields(field);\n\n items.forEach((item, itemIndex) => {\n // Header for each repeatable item - show with treePrefix (branch indicator from parent)\n result.push({\n type: 'repeatable-header',\n repeatable: field,\n path: `${repeatablePath}.${itemIndex}`,\n index: itemIndex,\n label: `${field.label || 'Item'} #${itemIndex + 1}`,\n treePrefix: ctx.treePrefix,\n });\n\n // Process inner fields with tree prefixes\n const visibleInnerFields = allInnerFields.filter((innerField) => {\n if (innerField.type === 'repeatable' || innerField.type === 'group') {\n return true;\n }\n return isFieldVisible(\n innerField,\n item as Record<string, unknown>,\n rootFormData,\n );\n });\n\n visibleInnerFields.forEach((innerField, fieldIdx) => {\n const isLast = fieldIdx === visibleInnerFields.length - 1;\n const branchChar = isLast ? '\u2514\u2500 ' : '\u251C\u2500 ';\n const nextContinuation = isLast ? ' ' : '\u2502 ';\n const currentPrefix = ctx.continuationPrefix + branchChar;\n const childContinuation = ctx.continuationPrefix + nextContinuation;\n\n if (innerField.type === 'repeatable') {\n // Nested repeatable - header uses currentPrefix, children use childContinuation\n result.push(\n ...flattenRepeatableField(\n innerField,\n item as Record<string, unknown>,\n rootFormData,\n {\n pathPrefix: `${repeatablePath}.${itemIndex}`,\n treePrefix: currentPrefix,\n continuationPrefix: childContinuation,\n depth: ctx.depth + 1,\n },\n ),\n );\n } else if (innerField.type === 'group') {\n // Group - flatten their fields\n result.push(\n ...flattenFieldsInternal(\n innerField.fields,\n item as Record<string, unknown>,\n rootFormData,\n {\n pathPrefix: `${repeatablePath}.${itemIndex}`,\n treePrefix: currentPrefix,\n continuationPrefix: childContinuation,\n depth: ctx.depth + 1,\n },\n ),\n );\n } else {\n // Form field\n const requiredMarker = innerField.required ? ' *' : '';\n result.push({\n type: 'field',\n field: innerField,\n path: `${repeatablePath}.${itemIndex}.${innerField.id}`,\n label: `${innerField.label}${requiredMarker}`,\n treePrefix: currentPrefix,\n });\n }\n });\n });\n\n // Add button for the repeatable - at same level as headers\n result.push({\n type: 'repeatable-add',\n repeatable: field,\n path: repeatablePath,\n label: `[+] Add ${field.label || 'item'}`,\n treePrefix: ctx.treePrefix,\n });\n\n return result;\n};\n\nexport const getFieldTypeIndicator = (item: FlatFieldItem): string => {\n if (item.type !== 'field') return '';\n const field = item.field;\n switch (field.type) {\n case 'checkbox':\n return '[\u2713]';\n case 'select':\n return '[\u25BC]';\n case 'textarea':\n return '[\u2261]';\n default:\n return '[_]';\n }\n};\n\nexport const getValueDisplay = (\n item: FlatFieldItem,\n stepValues: Record<string, unknown>,\n): string => {\n if (item.type !== 'field') return '';\n const value = getValueByPath(stepValues, item.path);\n\n if (item.field.type === 'checkbox') {\n return value ? '\u2713' : '';\n }\n\n if (item.field.type === 'select') {\n const strValue = String(value ?? '');\n const option = item.field.options.find((o) => o.value === strValue);\n return option ? option.label : '';\n }\n\n const strValue = String(value ?? '');\n if (strValue.length > 20) {\n return `${strValue.slice(0, 20)}...`;\n }\n return strValue;\n};\n", "import { useCallback, useState } from 'react';\n\nimport type { Scenario, Step } from '../../definitions';\nimport {\n buildAiContext,\n buildFormDefaultValues,\n} from '../features/form/services';\nimport type { FormValues } from '../features/form/types';\n\nexport const useFormState = (scenario: Scenario) => {\n const [formValues, setFormValues] = useState<FormValues>(\n () => buildFormDefaultValues(scenario.steps) as FormValues,\n );\n\n const updateStepValues = useCallback(\n (stepName: string, values: Record<string, unknown>) => {\n setFormValues((prev) => ({\n ...prev,\n [stepName]: {\n ...prev[stepName],\n ...values,\n },\n }));\n },\n [],\n );\n\n const updateFieldValue = useCallback(\n (stepName: string, fieldId: string, value: unknown) => {\n setFormValues((prev) => ({\n ...prev,\n [stepName]: {\n ...prev[stepName],\n [fieldId]: value,\n },\n }));\n },\n [],\n );\n\n const getStepValues = useCallback(\n (step: Step): Record<string, unknown> => {\n return (formValues[step.name] ?? {}) as Record<string, unknown>;\n },\n [formValues],\n );\n\n const getAiContext = useCallback(() => {\n return buildAiContext(scenario.steps);\n }, [scenario.steps]);\n\n const resetForm = useCallback(() => {\n setFormValues(buildFormDefaultValues(scenario.steps) as FormValues);\n }, [scenario.steps]);\n\n return {\n formValues,\n setFormValues,\n updateStepValues,\n updateFieldValue,\n getStepValues,\n getAiContext,\n resetForm,\n };\n};\n", "import { Box, Text } from 'ink';\nimport { type FC, useCallback, useState } from 'react';\n\nimport type { SelectField } from '../../../../../types';\nimport {\n ACCENT_COLOR,\n type FlatFieldItem,\n} from '../../../../features/form/types';\nimport { getValueByPath } from '../../../../features/form/utils';\nimport { useControl } from '../../../../hooks/useControl';\nimport { FieldEditorContent } from './FieldEditorContent';\n\nconst getInitialEditValue = (\n currentItem: FlatFieldItem | undefined,\n stepValues: Record<string, unknown>,\n): string => {\n if (currentItem?.type !== 'field') return '';\n if (\n currentItem.field.type === 'checkbox' ||\n currentItem.field.type === 'select'\n )\n return '';\n return String(getValueByPath(stepValues, currentItem.path) ?? '');\n};\n\nconst getInitialSelectIndex = (\n currentItem: FlatFieldItem | undefined,\n stepValues: Record<string, unknown>,\n): number => {\n if (currentItem?.type !== 'field' || currentItem.field.type !== 'select')\n return 0;\n const currentValue = String(\n getValueByPath(stepValues, currentItem.path) ?? '',\n );\n const idx = currentItem.field.options.findIndex(\n (o) => o.value === currentValue,\n );\n return idx >= 0 ? idx : 0;\n};\n\nexport type FieldEditorProps = {\n currentItem: FlatFieldItem | undefined;\n stepValues: Record<string, unknown>;\n isFocused: boolean;\n onSubmit: (value: unknown) => void;\n onCancel: () => void;\n};\n\nexport const FieldEditor: FC<FieldEditorProps> = ({\n currentItem,\n stepValues,\n isFocused,\n onSubmit,\n onCancel,\n}) => {\n const [editValue, setEditValue] = useState(() =>\n getInitialEditValue(currentItem, stepValues),\n );\n const [selectIndex, setSelectIndex] = useState(() =>\n getInitialSelectIndex(currentItem, stepValues),\n );\n\n useControl({\n onUp: () => {\n if (!currentItem || currentItem.type !== 'field') return;\n const field = currentItem.field as SelectField;\n setSelectIndex((prev) =>\n prev > 0 ? prev - 1 : field.options.length - 1,\n );\n },\n onDown: () => {\n if (!currentItem || currentItem.type !== 'field') return;\n const field = currentItem.field as SelectField;\n setSelectIndex((prev) =>\n prev < field.options.length - 1 ? prev + 1 : 0,\n );\n },\n onEnter: () => {\n if (!currentItem || currentItem.type !== 'field') return;\n const field = currentItem.field as SelectField;\n const selectedOption = field.options[selectIndex];\n if (selectedOption) {\n onSubmit(selectedOption.value);\n }\n },\n onEscape: onCancel,\n isActive:\n isFocused &&\n currentItem?.type === 'field' &&\n currentItem.field.type === 'select',\n });\n\n const handleTextSubmit = useCallback(() => {\n onSubmit(editValue);\n }, [editValue, onSubmit]);\n\n const handleTextCancel = useCallback(() => {\n onCancel();\n }, [onCancel]);\n\n return (\n <Box\n marginLeft={1}\n width=\"50%\"\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={isFocused ? ACCENT_COLOR : undefined}\n paddingX={1}\n >\n <Box marginTop={-1} marginLeft={1}>\n <Text\n backgroundColor=\"black\"\n color={isFocused ? ACCENT_COLOR : undefined}\n bold\n >\n {' '}\n Input{' '}\n </Text>\n </Box>\n <FieldEditorContent\n currentItem={currentItem}\n stepValues={stepValues}\n isFocused={isFocused}\n editValue={editValue}\n onEditValueChange={setEditValue}\n onTextSubmit={handleTextSubmit}\n onTextCancel={handleTextCancel}\n selectIndex={selectIndex}\n />\n </Box>\n );\n};\n", "import { Box, Text } from 'ink';\nimport type { FC } from 'react';\n\nimport { Checkbox } from '../../../../features/form/components/Checkbox';\nimport { Empty } from '../../../../features/form/components/Empty';\nimport { Select } from '../../../../features/form/components/Select';\nimport { TextField } from '../../../../features/form/components/TextField';\nimport type { FlatFieldItem } from '../../../../features/form/types';\nimport { getValueByPath } from '../../../../features/form/utils';\n\nexport type FieldEditorContentProps = {\n currentItem: FlatFieldItem | undefined;\n stepValues: Record<string, unknown>;\n isFocused: boolean;\n editValue: string;\n onEditValueChange: (value: string) => void;\n onTextSubmit: () => void;\n onTextCancel: () => void;\n selectIndex: number;\n};\n\nexport const FieldEditorContent: FC<FieldEditorContentProps> = ({\n currentItem,\n stepValues,\n isFocused,\n editValue,\n onEditValueChange,\n onTextSubmit,\n onTextCancel,\n selectIndex,\n}) => {\n if (!currentItem) {\n return <Empty />;\n }\n\n if (currentItem.type === 'repeatable-add') {\n return (\n <Box flexDirection=\"column\">\n <Text color=\"green\">Press Enter to add item</Text>\n </Box>\n );\n }\n\n if (currentItem.type === 'repeatable-header') {\n return (\n <Box flexDirection=\"column\">\n <Text dimColor>d: delete item</Text>\n </Box>\n );\n }\n\n const field = currentItem.field;\n const value = getValueByPath(stepValues, currentItem.path);\n\n if (field.type === 'checkbox') {\n return <Checkbox checked={Boolean(value)} />;\n }\n\n if (field.type === 'select') {\n return (\n <Select\n field={field}\n currentValue={String(value ?? '')}\n selectIndex={selectIndex}\n isFocused={isFocused}\n />\n );\n }\n\n return (\n <TextField\n value={String(value ?? '')}\n editValue={editValue}\n onEditValueChange={onEditValueChange}\n onTextSubmit={onTextSubmit}\n onTextCancel={onTextCancel}\n placeholder={field.placeholder ?? ''}\n isTextarea={field.type === 'textarea'}\n isFocused={isFocused}\n suggestions={field.type === 'input' ? field.suggestions : undefined}\n />\n );\n};\n", "import { Text } from 'ink';\nimport type { FC } from 'react';\n\nexport type CheckboxProps = {\n checked: boolean;\n};\n\nexport const Checkbox: FC<CheckboxProps> = ({ checked }) => (\n <Text color={checked ? 'green' : 'gray'}>{checked ? 'ON' : 'OFF'}</Text>\n);\n", "import { Text } from 'ink';\nimport type { FC } from 'react';\n\nexport const Empty: FC = () => <Text dimColor>Select an item</Text>;\n", "import { Box, Text } from 'ink';\nimport type { FC } from 'react';\n\nimport type { SelectField } from '../../../../types';\nimport { ACCENT_COLOR } from '../types';\n\nexport type SelectProps = {\n field: SelectField;\n currentValue: string;\n selectIndex: number;\n isFocused: boolean;\n};\n\nexport const Select: FC<SelectProps> = ({\n field,\n currentValue,\n selectIndex,\n isFocused,\n}) => {\n if (isFocused) {\n return (\n <Box flexDirection=\"column\">\n {field.options.map((opt, idx) => (\n <Box key={opt.value}>\n <Text\n color={idx === selectIndex ? 'black' : undefined}\n backgroundColor={idx === selectIndex ? ACCENT_COLOR : undefined}\n >\n {' '}\n {opt.label}{' '}\n </Text>\n {opt.value === currentValue && <Text color=\"gray\"> (current)</Text>}\n </Box>\n ))}\n </Box>\n );\n }\n\n const currentOption = field.options.find((o) => o.value === currentValue);\n return (\n <Text color={currentOption ? 'white' : 'gray'}>\n {currentOption ? currentOption.label : '(not selected)'}\n </Text>\n );\n};\n", "import { Box, Text } from 'ink';\nimport type { FC } from 'react';\n\nimport { ACCENT_COLOR } from '../types';\nimport { SimpleTextInput } from './SimpleTextInput';\n\nexport type TextFieldProps = {\n value: string;\n editValue: string;\n onEditValueChange: (value: string) => void;\n onTextSubmit: () => void;\n onTextCancel: () => void;\n placeholder: string;\n isTextarea: boolean;\n isFocused: boolean;\n suggestions?: string[];\n};\n\nexport const TextField: FC<TextFieldProps> = ({\n value,\n editValue,\n onEditValueChange,\n onTextSubmit,\n onTextCancel,\n placeholder,\n isTextarea,\n isFocused,\n suggestions,\n}) => {\n if (isFocused) {\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={ACCENT_COLOR}\n paddingX={1}\n minHeight={isTextarea ? 5 : 1}\n >\n <SimpleTextInput\n value={editValue}\n onChange={onEditValueChange}\n onSubmit={onTextSubmit}\n onCancel={onTextCancel}\n placeholder={placeholder}\n multiline={isTextarea}\n suggestions={suggestions}\n />\n {isTextarea && (\n <Box marginTop={1}>\n <Text dimColor>Enter: newline | Tab: confirm</Text>\n </Box>\n )}\n </Box>\n );\n }\n\n return <Text color={value ? 'white' : 'gray'}>{value || '(empty)'}</Text>;\n};\n", "import { Box, Text, useInput } from 'ink';\nimport { type FC, useEffect, useMemo, useState } from 'react';\n\nimport { ACCENT_COLOR } from '../types';\n\ntype SimpleTextInputProps = {\n value: string;\n onChange: (value: string) => void;\n onSubmit: () => void;\n onCancel: () => void;\n placeholder?: string;\n multiline?: boolean;\n suggestions?: string[];\n};\n\nconst MAX_VISIBLE_SUGGESTIONS = 5;\n\nexport const SimpleTextInput: FC<SimpleTextInputProps> = ({\n value,\n onChange,\n onSubmit,\n onCancel,\n placeholder = '',\n multiline = false,\n suggestions = [],\n}) => {\n const [cursorPosition, setCursorPosition] = useState(value.length);\n const [suggestionIndex, setSuggestionIndex] = useState(-1);\n const [scrollOffset, setScrollOffset] = useState(0);\n\n const filteredSuggestions =\n !multiline && suggestions.length > 0\n ? suggestions.filter(\n (s) =>\n s.toLowerCase().includes(value.toLowerCase()) &&\n s.toLowerCase() !== value.toLowerCase(),\n )\n : [];\n\n const hasSuggestions = filteredSuggestions.length > 0;\n\n // Reset suggestion index and scroll when filtered suggestions change\n useEffect(() => {\n if (filteredSuggestions.length === 0) {\n setSuggestionIndex(-1);\n setScrollOffset(0);\n } else if (suggestionIndex >= filteredSuggestions.length) {\n setSuggestionIndex(filteredSuggestions.length - 1);\n }\n }, [filteredSuggestions.length, suggestionIndex]);\n\n // Adjust scroll offset to keep selected item visible\n useEffect(() => {\n if (suggestionIndex < 0) return;\n\n if (suggestionIndex < scrollOffset) {\n setScrollOffset(suggestionIndex);\n } else if (suggestionIndex >= scrollOffset + MAX_VISIBLE_SUGGESTIONS) {\n setScrollOffset(suggestionIndex - MAX_VISIBLE_SUGGESTIONS + 1);\n }\n }, [suggestionIndex, scrollOffset]);\n\n // Calculate visible suggestions based on scroll offset\n const visibleSuggestions = useMemo(() => {\n return filteredSuggestions.slice(\n scrollOffset,\n scrollOffset + MAX_VISIBLE_SUGGESTIONS,\n );\n }, [filteredSuggestions, scrollOffset]);\n\n const acceptSuggestion = (index: number) => {\n const suggestion = filteredSuggestions[index];\n if (suggestion) {\n onChange(suggestion);\n setCursorPosition(suggestion.length);\n setSuggestionIndex(-1);\n }\n };\n\n useInput((input, key) => {\n if (key.escape) {\n if (suggestionIndex >= 0) {\n setSuggestionIndex(-1);\n return;\n }\n onCancel();\n return;\n }\n\n // Up/Down arrow for suggestion navigation (single-line mode with suggestions)\n if (!multiline && hasSuggestions) {\n if (key.upArrow) {\n setSuggestionIndex((prev) =>\n prev <= 0 ? filteredSuggestions.length - 1 : prev - 1,\n );\n return;\n }\n if (key.downArrow) {\n setSuggestionIndex((prev) =>\n prev >= filteredSuggestions.length - 1 ? 0 : prev + 1,\n );\n return;\n }\n }\n\n // Tab accepts current suggestion or moves to next\n if (key.tab) {\n if (multiline) {\n onSubmit();\n return;\n }\n if (hasSuggestions) {\n if (suggestionIndex >= 0) {\n // Accept current selection\n acceptSuggestion(suggestionIndex);\n } else {\n // Select first suggestion\n setSuggestionIndex(0);\n }\n return;\n }\n onSubmit();\n return;\n }\n\n if (key.return) {\n if (multiline) {\n if (key.ctrl) {\n onSubmit();\n return;\n }\n const newValue = `${value.slice(0, cursorPosition)}\\n${value.slice(cursorPosition)}`;\n onChange(newValue);\n setCursorPosition(cursorPosition + 1);\n return;\n }\n // Accept selected suggestion on Enter\n if (suggestionIndex >= 0 && filteredSuggestions[suggestionIndex]) {\n acceptSuggestion(suggestionIndex);\n return;\n }\n setSuggestionIndex(-1);\n onSubmit();\n return;\n }\n\n if (key.backspace || key.delete) {\n if (cursorPosition > 0) {\n const newValue =\n value.slice(0, cursorPosition - 1) + value.slice(cursorPosition);\n onChange(newValue);\n setCursorPosition(cursorPosition - 1);\n setSuggestionIndex(-1);\n }\n return;\n }\n\n if (key.leftArrow) {\n setCursorPosition(Math.max(0, cursorPosition - 1));\n return;\n }\n\n if (key.rightArrow) {\n setCursorPosition(Math.min(value.length, cursorPosition + 1));\n return;\n }\n\n if (multiline && key.upArrow) {\n const lines = value.slice(0, cursorPosition).split('\\n');\n if (lines.length > 1) {\n const currentLineLength = lines[lines.length - 1]?.length ?? 0;\n const prevLineLength = lines[lines.length - 2]?.length ?? 0;\n const newColPosition = Math.min(currentLineLength, prevLineLength);\n const newPosition =\n cursorPosition -\n currentLineLength -\n 1 -\n prevLineLength +\n newColPosition;\n setCursorPosition(Math.max(0, newPosition));\n }\n return;\n }\n\n if (multiline && key.downArrow) {\n const beforeCursor = value.slice(0, cursorPosition);\n const afterCursor = value.slice(cursorPosition);\n const linesBeforeCursor = beforeCursor.split('\\n');\n const currentLineLength =\n linesBeforeCursor[linesBeforeCursor.length - 1]?.length ?? 0;\n const linesAfterCursor = afterCursor.split('\\n');\n if (linesAfterCursor.length > 1) {\n const restOfCurrentLine = linesAfterCursor[0]?.length ?? 0;\n const nextLineLength = linesAfterCursor[1]?.length ?? 0;\n const newColPosition = Math.min(currentLineLength, nextLineLength);\n const newPosition =\n cursorPosition + restOfCurrentLine + 1 + newColPosition;\n setCursorPosition(Math.min(value.length, newPosition));\n }\n return;\n }\n\n if (input && !key.ctrl && !key.meta) {\n const newValue =\n value.slice(0, cursorPosition) + input + value.slice(cursorPosition);\n onChange(newValue);\n setCursorPosition(cursorPosition + input.length);\n setSuggestionIndex(-1);\n }\n });\n\n const displayValue = value || placeholder;\n const isPlaceholder = !value && placeholder;\n\n if (multiline) {\n const lines = displayValue.split('\\n');\n let charCount = 0;\n\n return (\n <Box flexDirection=\"column\">\n {lines.map((line, lineIndex) => {\n const lineStart = charCount;\n const lineEnd = charCount + line.length;\n charCount = lineEnd + 1;\n\n const cursorInLine =\n cursorPosition >= lineStart && cursorPosition <= lineEnd;\n const cursorCol = cursorPosition - lineStart;\n\n if (cursorInLine) {\n return (\n <Box key={lineIndex}>\n <Text color={isPlaceholder ? 'gray' : 'white'}>\n {line.slice(0, cursorCol)}\n </Text>\n <Text backgroundColor=\"white\" color=\"black\">\n {line[cursorCol] || ' '}\n </Text>\n <Text color={isPlaceholder ? 'gray' : 'white'}>\n {line.slice(cursorCol + 1)}\n </Text>\n </Box>\n );\n }\n\n return (\n <Text key={lineIndex} color={isPlaceholder ? 'gray' : 'white'}>\n {line || ' '}\n </Text>\n );\n })}\n </Box>\n );\n }\n\n // Highlight matching part in suggestion\n const highlightMatch = (suggestion: string, query: string) => {\n if (!query) return suggestion;\n const lowerSuggestion = suggestion.toLowerCase();\n const lowerQuery = query.toLowerCase();\n const matchIndex = lowerSuggestion.indexOf(lowerQuery);\n if (matchIndex === -1) return suggestion;\n\n const before = suggestion.slice(0, matchIndex);\n const match = suggestion.slice(matchIndex, matchIndex + query.length);\n const after = suggestion.slice(matchIndex + query.length);\n\n return { before, match, after };\n };\n\n return (\n <Box flexDirection=\"column\">\n <Box>\n <Text color={isPlaceholder ? 'gray' : 'white'}>\n {displayValue.slice(0, cursorPosition)}\n </Text>\n <Text backgroundColor=\"white\" color=\"black\">\n {displayValue[cursorPosition] || ' '}\n </Text>\n <Text color={isPlaceholder ? 'gray' : 'white'}>\n {displayValue.slice(cursorPosition + 1)}\n </Text>\n </Box>\n {hasSuggestions && (\n <Box flexDirection=\"column\" marginTop={1}>\n <Text dimColor>\u2191\u2193: select Tab/Enter: accept</Text>\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor=\"gray\"\n paddingX={1}\n >\n {visibleSuggestions.map((suggestion, visibleIndex) => {\n const actualIndex = scrollOffset + visibleIndex;\n const isSelected = actualIndex === suggestionIndex;\n const parts = highlightMatch(suggestion, value);\n\n if (typeof parts === 'string') {\n return (\n <Box key={suggestion}>\n <Text\n color={isSelected ? 'black' : undefined}\n backgroundColor={isSelected ? ACCENT_COLOR : undefined}\n >\n {isSelected ? '> ' : ' '}\n {parts}\n </Text>\n </Box>\n );\n }\n\n return (\n <Box key={suggestion}>\n <Text\n color={isSelected ? 'black' : undefined}\n backgroundColor={isSelected ? ACCENT_COLOR : undefined}\n >\n {isSelected ? '> ' : ' '}\n </Text>\n <Text\n color={isSelected ? 'black' : 'gray'}\n backgroundColor={isSelected ? ACCENT_COLOR : undefined}\n >\n {parts.before}\n </Text>\n <Text\n color={isSelected ? 'black' : 'yellow'}\n backgroundColor={isSelected ? ACCENT_COLOR : undefined}\n bold={!isSelected}\n >\n {parts.match}\n </Text>\n <Text\n color={isSelected ? 'black' : 'gray'}\n backgroundColor={isSelected ? ACCENT_COLOR : undefined}\n >\n {parts.after}\n </Text>\n </Box>\n );\n })}\n </Box>\n </Box>\n )}\n </Box>\n );\n};\n", "import { Box, Text } from 'ink';\nimport { type FC, useState } from 'react';\n\nimport {\n ACCENT_COLOR,\n type FlatFieldItem,\n} from '../../../../features/form/types';\nimport {\n getFieldTypeIndicator,\n getValueDisplay,\n} from '../../../../features/form/utils';\nimport { useControl } from '../../../../hooks/useControl';\nimport { adjustScrollOffset } from '../../../../utils/scroll';\n\nexport type FieldSelectorProps = {\n flatItems: FlatFieldItem[];\n stepValues: Record<string, unknown>;\n isFocused: boolean;\n isFirstStep: boolean;\n isLastStep: boolean;\n maxHeight: number;\n onFocusUp: () => void;\n onFocusToForm: (item: FlatFieldItem, index: number) => void;\n onAddItem: (item: FlatFieldItem) => void;\n onDeleteItem: (item: FlatFieldItem) => void;\n onNextStep: () => void;\n onPrevStep: () => void;\n onGenerate: () => void;\n onBack: () => void;\n};\n\nexport const FieldSelector: FC<FieldSelectorProps> = ({\n flatItems,\n stepValues,\n isFocused,\n isFirstStep,\n isLastStep,\n maxHeight,\n onFocusUp,\n onFocusToForm,\n onAddItem,\n onDeleteItem,\n onNextStep,\n onPrevStep,\n onGenerate,\n onBack,\n}) => {\n const [selectedIndex, setSelectedIndex] = useState(0);\n const [scrollOffset, setScrollOffset] = useState(0);\n\n const validIndex = Math.min(selectedIndex, Math.max(0, flatItems.length - 1));\n const currentItem = flatItems[validIndex];\n\n // Account for borders (2 lines) and title (1 line)\n const maxVisibleItems = Math.max(3, maxHeight - 3);\n\n const visibleItems = flatItems.slice(\n scrollOffset,\n scrollOffset + maxVisibleItems,\n );\n\n const hasMoreAbove = scrollOffset > 0;\n const hasMoreBelow = scrollOffset + maxVisibleItems < flatItems.length;\n\n useControl({\n onUp: () => {\n if (selectedIndex === 0) {\n onFocusUp();\n return;\n }\n const newIndex = selectedIndex - 1;\n setSelectedIndex(newIndex);\n setScrollOffset((prev) =>\n adjustScrollOffset(newIndex, prev, maxVisibleItems),\n );\n },\n onDown: () => {\n const newIndex =\n selectedIndex < flatItems.length - 1 ? selectedIndex + 1 : 0;\n setSelectedIndex(newIndex);\n setScrollOffset((prev) =>\n adjustScrollOffset(newIndex, prev, maxVisibleItems),\n );\n },\n onEnter: () => {\n if (!currentItem) return;\n if (currentItem.type === 'repeatable-add') {\n onAddItem(currentItem);\n } else if (currentItem.type === 'field') {\n onFocusToForm(currentItem, validIndex);\n }\n },\n onDelete: () => {\n if (currentItem?.type === 'repeatable-header') {\n onDeleteItem(currentItem);\n }\n },\n onNext: () => {\n if (!isLastStep) {\n onNextStep();\n }\n },\n onPrev: () => {\n if (!isFirstStep) {\n onPrevStep();\n }\n },\n onGenerate,\n onEscape: onBack,\n onQuit: onBack,\n isActive: isFocused,\n });\n\n return (\n <Box\n width=\"50%\"\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={isFocused ? ACCENT_COLOR : undefined}\n paddingX={1}\n >\n <Box marginTop={-1} marginLeft={1}>\n <Text\n backgroundColor=\"black\"\n color={isFocused ? ACCENT_COLOR : undefined}\n bold\n >\n {' '}\n Fields{' '}\n </Text>\n </Box>\n <Box flexDirection=\"column\" overflowY=\"hidden\">\n {hasMoreAbove && <Text dimColor>\u2191 more</Text>}\n {visibleItems.map((item, visibleIndex) => {\n const actualIndex = scrollOffset + visibleIndex;\n const isSelected = actualIndex === validIndex;\n const valueDisplay = getValueDisplay(item, stepValues);\n const typeIndicator = getFieldTypeIndicator(item);\n\n const treePrefix = item.treePrefix || '';\n\n if (item.type === 'repeatable-add') {\n return (\n <Box key={`add-${item.path}`}>\n <Text color=\"gray\">{treePrefix}</Text>\n <Text\n color={isSelected && isFocused ? 'black' : 'green'}\n backgroundColor={\n isSelected && isFocused ? ACCENT_COLOR : undefined\n }\n >\n {item.label}\n </Text>\n </Box>\n );\n }\n\n if (item.type === 'repeatable-header') {\n return (\n <Box key={`header-${item.path}`}>\n <Text color=\"gray\">{treePrefix}</Text>\n <Text\n color={isSelected && isFocused ? 'black' : ACCENT_COLOR}\n backgroundColor={\n isSelected && isFocused ? ACCENT_COLOR : undefined\n }\n bold\n >\n {item.label}\n </Text>\n </Box>\n );\n }\n\n return (\n <Box key={item.path}>\n <Text color=\"gray\">{treePrefix}</Text>\n <Text\n color={isSelected && isFocused ? 'black' : undefined}\n backgroundColor={\n isSelected && isFocused ? ACCENT_COLOR : undefined\n }\n >\n {typeIndicator} {item.label}\n </Text>\n {valueDisplay && <Text color=\"gray\"> : {valueDisplay}</Text>}\n </Box>\n );\n })}\n {hasMoreBelow && <Text dimColor>\u2193 more</Text>}\n </Box>\n </Box>\n );\n};\n", "/**\n * Adjusts scroll offset to keep the selected item visible within the viewport.\n */\nexport const adjustScrollOffset = (\n newIndex: number,\n currentOffset: number,\n maxVisible: number,\n): number => {\n if (newIndex < currentOffset) {\n return newIndex;\n }\n if (newIndex >= currentOffset + maxVisible) {\n return newIndex - maxVisible + 1;\n }\n return currentOffset;\n};\n", "import { Box, Text } from 'ink';\nimport type { FC } from 'react';\n\nimport type { Step } from '../../../../../types';\nimport { ACCENT_COLOR } from '../../../../features/form/types';\nimport { useControl } from '../../../../hooks/useControl';\n\nexport type StepSelectorProps = {\n steps: Step[];\n currentStepIndex: number;\n isFocused: boolean;\n onStepSelect: (stepIndex: number) => void;\n onFocusDown: () => void;\n onGenerate: () => void;\n onBack: () => void;\n};\n\nexport const StepSelector: FC<StepSelectorProps> = ({\n steps,\n currentStepIndex,\n isFocused,\n onStepSelect,\n onFocusDown,\n onGenerate,\n onBack,\n}) => {\n useControl({\n onLeft: () => {\n const prevIndex =\n currentStepIndex > 0 ? currentStepIndex - 1 : steps.length - 1;\n onStepSelect(prevIndex);\n },\n onRight: () => {\n const nextIndex =\n currentStepIndex < steps.length - 1 ? currentStepIndex + 1 : 0;\n onStepSelect(nextIndex);\n },\n onEnter: onFocusDown,\n onDown: onFocusDown,\n onGenerate,\n onEscape: onBack,\n onQuit: onBack,\n isActive: isFocused,\n });\n\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={isFocused ? ACCENT_COLOR : undefined}\n paddingX={1}\n >\n <Box marginTop={-1} marginLeft={1}>\n <Text\n backgroundColor=\"black\"\n color={isFocused ? ACCENT_COLOR : undefined}\n bold\n >\n {' '}\n Steps{' '}\n </Text>\n </Box>\n <Box>\n {steps.map((step, idx) => {\n const isCurrentStep = idx === currentStepIndex;\n return (\n <Box key={step.name} marginRight={1}>\n <Text\n color={isCurrentStep ? ACCENT_COLOR : 'gray'}\n bold={isCurrentStep}\n inverse={isFocused && isCurrentStep}\n >\n {' '}\n {idx + 1}.{step.title}{' '}\n </Text>\n </Box>\n );\n })}\n </Box>\n </Box>\n );\n};\n", "import { Box, Text } from 'ink';\nimport { type FC, useCallback, useMemo, useState } from 'react';\n\nimport type { Scenario } from '../../../definitions';\nimport type { ControlItem } from '../../components/ControlBar';\nimport { getDocumentsForScenario } from '../../features/document/services';\nimport type { DocumentWithMetadata } from '../../features/document/types';\nimport { ACCENT_COLOR } from '../../features/form/types';\nimport { useControl } from '../../hooks/useControl';\nimport { useMount } from '../../hooks/useMount';\nimport { useTerminalHeight } from '../../hooks/useTerminalHeight';\nimport { CommonLayout } from '../../layouts/CommonLayout';\nimport { adjustScrollOffset } from '../../utils/scroll';\n\ntype FocusPanel = 'scenarios' | 'actions';\n\ntype ActionItem =\n | { type: 'new'; label: string }\n | { type: 'document'; doc: DocumentWithMetadata };\n\nexport type SelectScenarioProps = {\n scenarios: Scenario[];\n onSelectNew: (scenarioId: string) => void;\n onSelectDocument: (scenarioId: string, doc: DocumentWithMetadata) => void;\n onExit: () => void;\n};\n\nexport const SelectScenario: FC<SelectScenarioProps> = ({\n scenarios,\n onSelectNew,\n onSelectDocument,\n onExit,\n}) => {\n const [scenarioIndex, setScenarioIndex] = useState(0);\n const [actionIndex, setActionIndex] = useState(0);\n const [focusPanel, setFocusPanel] = useState<FocusPanel>('scenarios');\n const [documents, setDocuments] = useState<DocumentWithMetadata[]>([]);\n const [isLoading, setIsLoading] = useState(false);\n const [scenarioScrollOffset, setScenarioScrollOffset] = useState(0);\n const [actionScrollOffset, setActionScrollOffset] = useState(0);\n\n const { availableHeight } = useTerminalHeight();\n // Account for panel borders (2 lines) and title (1 line)\n const maxVisibleItems = Math.max(3, availableHeight - 3);\n\n const currentScenario = scenarios[scenarioIndex];\n\n const actionItems: ActionItem[] = useMemo(\n () => [\n { type: 'new', label: '[+] New Document' },\n ...documents.map((doc) => ({ type: 'document' as const, doc })),\n ],\n [documents],\n );\n\n const visibleScenarios = scenarios.slice(\n scenarioScrollOffset,\n scenarioScrollOffset + maxVisibleItems,\n );\n\n const visibleActionItems = actionItems.slice(\n actionScrollOffset,\n actionScrollOffset + maxVisibleItems,\n );\n\n const controls = useMemo<ControlItem[]>(() => {\n if (focusPanel === 'scenarios') {\n return [\n { key: '\u2191\u2193/jk', action: 'move' },\n { key: '\u2192/l/Enter', action: 'select' },\n { key: 'q', action: 'quit' },\n ];\n }\n return [\n { key: '\u2191\u2193/jk', action: 'move' },\n { key: 'Enter', action: 'open' },\n { key: '\u2190/h/Esc', action: 'back' },\n { key: 'q', action: 'quit' },\n ];\n }, [focusPanel]);\n\n const loadDocuments = useCallback(\n (index: number) => {\n const scenario = scenarios[index];\n if (scenario == null) return;\n setIsLoading(true);\n getDocumentsForScenario(scenario)\n .then((docs) => {\n setDocuments(docs);\n setActionIndex(0);\n })\n .catch(() => {\n setDocuments([]);\n })\n .finally(() => {\n setIsLoading(false);\n });\n },\n [scenarios],\n );\n\n useControl({\n onUp: () => {\n const newIndex =\n scenarioIndex > 0 ? scenarioIndex - 1 : scenarios.length - 1;\n setScenarioIndex(newIndex);\n setScenarioScrollOffset((prev) =>\n adjustScrollOffset(newIndex, prev, maxVisibleItems),\n );\n loadDocuments(newIndex);\n },\n onDown: () => {\n const newIndex =\n scenarioIndex < scenarios.length - 1 ? scenarioIndex + 1 : 0;\n setScenarioIndex(newIndex);\n setScenarioScrollOffset((prev) =>\n adjustScrollOffset(newIndex, prev, maxVisibleItems),\n );\n loadDocuments(newIndex);\n },\n onRight: () => {\n setFocusPanel('actions');\n },\n onEnter: () => {\n setFocusPanel('actions');\n },\n onQuit: onExit,\n isActive: focusPanel === 'scenarios',\n });\n\n useControl({\n onUp: () => {\n const newIndex =\n actionIndex > 0 ? actionIndex - 1 : actionItems.length - 1;\n setActionIndex(newIndex);\n setActionScrollOffset((prev) =>\n adjustScrollOffset(newIndex, prev, maxVisibleItems),\n );\n },\n onDown: () => {\n const newIndex =\n actionIndex < actionItems.length - 1 ? actionIndex + 1 : 0;\n setActionIndex(newIndex);\n setActionScrollOffset((prev) =>\n adjustScrollOffset(newIndex, prev, maxVisibleItems),\n );\n },\n onEnter: () => {\n const item = actionItems[actionIndex];\n if (item && currentScenario) {\n if (item.type === 'new') {\n onSelectNew(currentScenario.id);\n } else {\n onSelectDocument(currentScenario.id, item.doc);\n }\n }\n },\n onEscape: () => {\n setFocusPanel('scenarios');\n },\n onLeft: () => {\n setFocusPanel('scenarios');\n },\n onQuit: onExit,\n isActive: focusPanel === 'actions',\n });\n\n useMount(() => {\n loadDocuments(0);\n });\n\n const hasMoreScenariosAbove = scenarioScrollOffset > 0;\n const hasMoreScenariosBelow =\n scenarioScrollOffset + maxVisibleItems < scenarios.length;\n const hasMoreActionsAbove = actionScrollOffset > 0;\n const hasMoreActionsBelow =\n actionScrollOffset + maxVisibleItems < actionItems.length;\n\n return (\n <CommonLayout controls={controls}>\n <Box flexGrow={1}>\n <Box\n width=\"40%\"\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={focusPanel === 'scenarios' ? ACCENT_COLOR : undefined}\n paddingX={1}\n >\n <Box marginTop={-1} marginLeft={1}>\n <Text\n backgroundColor=\"black\"\n color={focusPanel === 'scenarios' ? ACCENT_COLOR : undefined}\n bold\n >\n {' '}\n Scenarios{' '}\n </Text>\n </Box>\n <Box flexDirection=\"column\" overflowY=\"hidden\">\n {hasMoreScenariosAbove && <Text dimColor>\u2191 more</Text>}\n {visibleScenarios.map((scenario, visibleIndex) => {\n const actualIndex = scenarioScrollOffset + visibleIndex;\n const isSelected = actualIndex === scenarioIndex;\n const isFocused = focusPanel === 'scenarios';\n return (\n <Box key={scenario.id}>\n <Text\n color={isSelected && isFocused ? 'black' : undefined}\n backgroundColor={\n isSelected\n ? isFocused\n ? ACCENT_COLOR\n : 'gray'\n : undefined\n }\n >\n {' '}\n {scenario.name}{' '}\n </Text>\n </Box>\n );\n })}\n {hasMoreScenariosBelow && <Text dimColor>\u2193 more</Text>}\n </Box>\n </Box>\n\n <Box\n marginLeft={1}\n width=\"60%\"\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={focusPanel === 'actions' ? ACCENT_COLOR : undefined}\n paddingX={1}\n >\n <Box marginTop={-1} marginLeft={1}>\n <Text\n backgroundColor=\"black\"\n color={focusPanel === 'actions' ? ACCENT_COLOR : undefined}\n bold\n >\n {' '}\n {currentScenario?.name ?? 'Documents'}{' '}\n </Text>\n </Box>\n <Box flexDirection=\"column\" overflowY=\"hidden\">\n {isLoading ? (\n <Text dimColor>Loading...</Text>\n ) : (\n <>\n {hasMoreActionsAbove && <Text dimColor>\u2191 more</Text>}\n {visibleActionItems.map((item, visibleIndex) => {\n const actualIndex = actionScrollOffset + visibleIndex;\n const isSelected = actualIndex === actionIndex;\n const isFocused = focusPanel === 'actions';\n const label =\n item.type === 'new' ? item.label : item.doc.filename;\n return (\n <Box key={item.type === 'new' ? 'new' : item.doc.filename}>\n <Text\n color={\n isSelected && isFocused\n ? 'black'\n : item.type === 'new'\n ? 'green'\n : undefined\n }\n backgroundColor={\n isSelected && isFocused ? ACCENT_COLOR : undefined\n }\n >\n {' '}\n {label}{' '}\n </Text>\n </Box>\n );\n })}\n {hasMoreActionsBelow && <Text dimColor>\u2193 more</Text>}\n </>\n )}\n </Box>\n </Box>\n </Box>\n </CommonLayout>\n );\n};\n", "import * as fs from 'node:fs';\nimport * as path from 'node:path';\n\nimport { defineCommand } from 'citty';\nimport { consola } from 'consola';\n\nconst CONFIG_TEMPLATE = `// For more detailed configuration examples, see:\n\nimport { defineConfig, defineScenario } from 'pre-claude';\n\nexport default defineConfig({\n scenarios: [\n defineScenario({\n id: 'default',\n name: 'Design Doc Generator',\n steps: [\n {\n slug: 'overview',\n title: 'Overview',\n description: 'Basic information about the feature',\n name: 'overview',\n fields: [\n {\n type: 'input',\n id: 'title',\n label: 'Title',\n description: 'Feature title',\n placeholder: 'Enter feature title',\n required: true,\n },\n {\n type: 'textarea',\n id: 'description',\n label: 'Description',\n description: 'Detailed description of the feature',\n placeholder: 'Describe the feature...',\n rows: 4,\n },\n {\n type: 'select',\n id: 'priority',\n label: 'Priority',\n description: 'Feature priority level',\n placeholder: 'Select priority',\n options: [\n { value: 'high', label: 'High' },\n { value: 'medium', label: 'Medium' },\n { value: 'low', label: 'Low' },\n ],\n },\n ],\n },\n ],\n filename: ({ timestamp }) => \\`\\${timestamp}.md\\`,\n prompt: ({ formData, aiContext }) =>\n \\`Generate a design doc based on the following input:\\n\\${JSON.stringify({ formData, aiContext }, null, 2)}\\`,\n }),\n ],\n});\n`;\n\nexport const initCommand = defineCommand({\n meta: {\n name: 'init',\n description: 'Create a new pre-claude.config.ts file',\n },\n args: {\n output: {\n type: 'string',\n description: 'Output file path',\n alias: 'o',\n default: 'pre-claude.config.ts',\n },\n force: {\n type: 'boolean',\n description: 'Overwrite existing file',\n alias: 'f',\n default: false,\n },\n },\n async run({ args }) {\n const outputPath = path.resolve(process.cwd(), args.output);\n\n if (fs.existsSync(outputPath) && !args.force) {\n consola.error(`File already exists: ${outputPath}`);\n consola.info('Use --force (-f) to overwrite');\n process.exit(1);\n }\n\n try {\n fs.writeFileSync(outputPath, CONFIG_TEMPLATE, 'utf-8');\n consola.success(`Config file created: ${outputPath}`);\n } catch (error) {\n consola.error('Failed to create config file:', error);\n process.exit(1);\n }\n },\n});\n", "import * as fs from 'node:fs';\nimport * as path from 'node:path';\n\nimport { defineCommand } from 'citty';\nimport { consola } from 'consola';\nimport { createJiti } from 'jiti';\n\nimport { render } from 'ink';\nimport { type Config, safeParseConfig } from '../../definitions';\nimport { App } from '../../tui/App';\n\nconst enterAlternateScreen = () => {\n process.stdout.write('\\x1b[?1049h');\n process.stdout.write('\\x1b[H');\n};\n\nconst exitAlternateScreen = () => {\n process.stdout.write('\\x1b[?1049l');\n};\n\nconst loadConfig = async (configPath: string): Promise<Config> => {\n const absolutePath = path.resolve(process.cwd(), configPath);\n\n if (!fs.existsSync(absolutePath)) {\n throw new Error(`Config file not found: ${absolutePath}`);\n }\n\n const jiti = createJiti(import.meta.url);\n const configModule = await jiti.import(absolutePath);\n const config = (configModule as { default: Config }).default;\n\n const result = safeParseConfig(config);\n if (!result.success) {\n const issues = result.issues.map((issue) => {\n const pathStr = issue.path?.map((p) => p.key).join('.') ?? '';\n return ` - ${pathStr}: ${issue.message}`;\n });\n throw new Error(`Invalid config:\\n${issues.join('\\n')}`);\n }\n\n // hooks cannot be validated with valibot, so preserve from original config\n return config;\n};\n\nexport const runCommand = defineCommand({\n meta: {\n name: 'run',\n description: 'Start the TUI to fill out forms and generate prompts',\n },\n args: {\n config: {\n type: 'string',\n description: 'Path to config file',\n alias: 'c',\n default: 'pre-claude.config.ts',\n },\n scenario: {\n type: 'string',\n description: 'Scenario ID to start with (optional)',\n alias: 's',\n },\n },\n async run({ args }) {\n const configPath = args.config;\n\n try {\n const config = await loadConfig(configPath);\n\n // Validate scenario ID if provided\n if (args.scenario != null) {\n const scenario = config.scenarios.find((s) => s.id === args.scenario);\n if (scenario == null) {\n const availableIds = config.scenarios.map((s) => s.id).join(', ');\n throw new Error(\n `Scenario \"${args.scenario}\" not found. Available: ${availableIds}`,\n );\n }\n }\n\n // Check if terminal supports raw mode\n if (process.stdin.isTTY !== true) {\n throw new Error(\n 'TUI requires an interactive terminal. Please run this command in a terminal that supports raw mode.',\n );\n }\n\n enterAlternateScreen();\n\n const { waitUntilExit } = render(\n <App config={config} initialScenarioId={args.scenario} />,\n );\n\n await waitUntilExit();\n exitAlternateScreen();\n } catch (error) {\n exitAlternateScreen();\n if (error instanceof Error) {\n consola.error(error.message);\n } else {\n consola.error('Failed to run TUI:', error);\n }\n process.exit(1);\n }\n },\n});\n"],
5
- "mappings": "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",
6
- "names": ["defineCommand", "Text", "useApp", "useCallback", "useState", "Box", "Text", "useStdout", "Box", "Box", "Text", "jsx", "description", "Box", "Text", "Box", "Text", "jsx", "jsxs", "jsx", "jsxs", "Box", "jsx", "jsx", "jsxs", "useStdout", "Box", "Text", "Box", "Text", "useCallback", "useMemo", "useState", "path", "meta", "getValueByPath", "path", "getValueByPath", "strValue", "useCallback", "useState", "useState", "useCallback", "Box", "Text", "useCallback", "useState", "Box", "Text", "Text", "jsx", "Text", "jsx", "Box", "Text", "jsx", "jsxs", "Box", "Text", "Box", "Text", "Box", "Text", "useInput", "useEffect", "useMemo", "useState", "jsx", "jsxs", "useState", "useEffect", "useMemo", "useInput", "Box", "Text", "query", "jsx", "jsxs", "Box", "Text", "jsx", "Box", "Text", "getValueByPath", "jsx", "jsxs", "getValueByPath", "useState", "useCallback", "Box", "Text", "Box", "Text", "useState", "jsx", "jsxs", "useState", "Box", "Text", "Box", "Text", "jsx", "jsxs", "Box", "Text", "jsx", "jsxs", "useState", "Text", "useMemo", "useCallback", "path", "getValueByPath", "Box", "Box", "Text", "useCallback", "useMemo", "useState", "jsx", "jsxs", "useState", "useMemo", "useCallback", "Box", "Text", "jsx", "useApp", "useState", "scenario", "useCallback", "Text", "jsx", "defineCommand", "consola", "fs", "path", "defineCommand", "consola", "render", "jsx", "enterAlternateScreen", "exitAlternateScreen", "defineCommand", "render", "consola", "defineCommand"]
4
+ "sourcesContent": ["import { defineCommand, runMain } from 'citty';\nimport { description, name, version } from '../../package.json';\n\nimport { exampleCommand } from './commands/example';\nimport { initCommand } from './commands/init';\nimport { runCommand } from './commands/run';\n\nconst main = defineCommand({\n meta: {\n name,\n version,\n description,\n },\n subCommands: {\n run: runCommand,\n init: initCommand,\n example: exampleCommand,\n },\n});\n\nrunMain(main);\n", "{\n \"name\": \"pre-claude\",\n \"version\": \"0.0.2\",\n \"description\": \"\uD83D\uDC0D TUI for building structured prompts for Claude\",\n \"keywords\": [\n \"cli\",\n \"tui\",\n \"claude\",\n \"ai\",\n \"prompt\",\n \"structured\"\n ],\n \"author\": \"cut0\",\n \"license\": \"MIT\",\n \"type\": \"module\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/cut0/pre-claude.git\"\n },\n \"publishConfig\": {\n \"access\": \"public\"\n },\n \"types\": \"./dist/types.d.ts\",\n \"main\": \"./dist/types.js\",\n \"exports\": {\n \".\": {\n \"types\": \"./dist/types.d.ts\",\n \"import\": \"./dist/types.js\",\n \"default\": \"./dist/types.js\"\n }\n },\n \"bin\": {\n \"pre-claude\": \"./dist/cli.js\"\n },\n \"files\": [\n \"dist\"\n ],\n \"scripts\": {\n \"build\": \"pnpm build:types && pnpm build:cli\",\n \"build:cli\": \"node scripts/build-cli.ts\",\n \"build:types\": \"tsc src/types.ts --declaration --outDir dist --skipLibCheck --module ESNext --moduleResolution bundler --target ES2022\",\n \"dev\": \"pnpm build:cli && node dist/cli.js run --config examples/pre-claude.config.ts\",\n \"lint:check\": \"biome check .\",\n \"lint:fix\": \"biome check --write .\",\n \"typecheck\": \"tsc --noEmit\",\n \"prepublishOnly\": \"pnpm build\",\n \"release\": \"pnpm build && changeset publish\"\n },\n \"dependencies\": {\n \"@anthropic-ai/claude-agent-sdk\": \"0.1.75\",\n \"@inkjs/ui\": \"2.0.0\",\n \"citty\": \"0.1.6\",\n \"consola\": \"3.4.2\",\n \"ink\": \"6.6.0\",\n \"ink-select-input\": \"6.2.0\",\n \"jiti\": \"2.6.1\",\n \"react\": \"19.2.3\",\n \"react-dom\": \"19.2.3\",\n \"valibot\": \"1.2.0\"\n },\n \"devDependencies\": {\n \"@biomejs/biome\": \"1.9.4\",\n \"@changesets/cli\": \"2.28.1\",\n \"@types/node\": \"25.0.3\",\n \"@types/react\": \"19.1.8\",\n \"@types/react-dom\": \"19.1.6\",\n \"esbuild\": \"0.27.2\",\n \"typescript\": \"5.8.3\"\n },\n \"packageManager\": \"pnpm@10.26.2\"\n}\n", "import { defineCommand } from 'citty';\nimport { consola } from 'consola';\nimport { render } from 'ink';\n\nimport type { Config, Step } from '../../definitions';\nimport { App } from '../../tui/App';\n\nconst enterAlternateScreen = () => {\n process.stdout.write('\\x1b[?1049h');\n process.stdout.write('\\x1b[H');\n};\n\nconst exitAlternateScreen = () => {\n process.stdout.write('\\x1b[?1049l');\n};\n\n// =============================================================================\n// English Config\n// =============================================================================\n\nconst enSteps = [\n {\n slug: 'libraries',\n title: 'Libraries',\n description: 'Libraries to introduce',\n name: 'libraries',\n fields: [\n {\n type: 'repeatable',\n id: 'items',\n label: 'Libraries',\n minCount: 1,\n field: {\n type: 'group',\n fields: [\n {\n type: 'input',\n id: 'name',\n label: 'Library Name',\n description: 'Name of the library',\n placeholder: 'e.g., react-query, zod',\n required: true,\n },\n {\n type: 'input',\n id: 'url',\n label: 'URL',\n description: 'Link to documentation or repository',\n placeholder: 'https://...',\n inputType: 'url',\n },\n ],\n },\n },\n ],\n },\n] as const satisfies Step[];\n\nconst enPrompt = ({\n aiContext,\n formData,\n}: {\n aiContext: unknown;\n formData: unknown;\n}) => {\n return `You are a software architect. Create an introduction plan for the following libraries.\n\n## Tasks\n\n1. For each library URL provided, use WebFetch to retrieve and analyze the documentation\n2. Based on the analysis, create an introduction plan including:\n - Library overview and purpose\n - Key features and benefits\n - Installation steps\n - Basic usage examples\n - Potential risks and considerations\n - Recommended adoption timeline\n\n## Input Data\n\n### Schema\n${JSON.stringify(aiContext, null, 2)}\n\n### Form Data\n${JSON.stringify(formData, null, 2)}\n\nCreate a comprehensive library introduction plan based on the input above.`;\n};\n\nconst enConfig: Config = {\n scenarios: [\n {\n id: 'default',\n name: 'Library Introduction Plan (Example)',\n steps: enSteps,\n prompt: enPrompt,\n },\n ],\n};\n\n// =============================================================================\n// Japanese Config\n// =============================================================================\n\nconst jaSteps = [\n {\n slug: 'libraries',\n title: '\u30E9\u30A4\u30D6\u30E9\u30EA',\n description: '\u5C0E\u5165\u3059\u308B\u30E9\u30A4\u30D6\u30E9\u30EA',\n name: 'libraries',\n fields: [\n {\n type: 'repeatable',\n id: 'items',\n label: '\u30E9\u30A4\u30D6\u30E9\u30EA\u4E00\u89A7',\n minCount: 1,\n field: {\n type: 'group',\n fields: [\n {\n type: 'input',\n id: 'name',\n label: '\u30E9\u30A4\u30D6\u30E9\u30EA\u540D',\n description: '\u30E9\u30A4\u30D6\u30E9\u30EA\u306E\u540D\u524D',\n placeholder: '\u4F8B: react-query, zod',\n required: true,\n },\n {\n type: 'input',\n id: 'url',\n label: 'URL',\n description: '\u30C9\u30AD\u30E5\u30E1\u30F3\u30C8\u307E\u305F\u306F\u30EA\u30DD\u30B8\u30C8\u30EA\u3078\u306E\u30EA\u30F3\u30AF',\n placeholder: 'https://...',\n inputType: 'url',\n },\n ],\n },\n },\n ],\n },\n] as const satisfies Step[];\n\nconst jaPrompt = ({\n aiContext,\n formData,\n}: {\n aiContext: unknown;\n formData: unknown;\n}) => {\n return `\u3042\u306A\u305F\u306F\u30BD\u30D5\u30C8\u30A6\u30A7\u30A2\u30A2\u30FC\u30AD\u30C6\u30AF\u30C8\u3067\u3059\u3002\u4EE5\u4E0B\u306E\u30E9\u30A4\u30D6\u30E9\u30EA\u306E\u5C0E\u5165\u30D7\u30E9\u30F3\u3092\u4F5C\u6210\u3057\u3066\u304F\u3060\u3055\u3044\u3002\n\n## \u30BF\u30B9\u30AF\n\n1. \u5404\u30E9\u30A4\u30D6\u30E9\u30EA\u306E URL \u304C\u63D0\u4F9B\u3055\u308C\u3066\u3044\u308B\u5834\u5408\u3001WebFetch \u3092\u4F7F\u7528\u3057\u3066\u30C9\u30AD\u30E5\u30E1\u30F3\u30C8\u3092\u53D6\u5F97\u30FB\u5206\u6790\u3057\u3066\u304F\u3060\u3055\u3044\n2. \u5206\u6790\u7D50\u679C\u306B\u57FA\u3065\u304D\u3001\u4EE5\u4E0B\u3092\u542B\u3080\u5C0E\u5165\u30D7\u30E9\u30F3\u3092\u4F5C\u6210\u3057\u3066\u304F\u3060\u3055\u3044\uFF1A\n - \u30E9\u30A4\u30D6\u30E9\u30EA\u306E\u6982\u8981\u3068\u76EE\u7684\n - \u4E3B\u306A\u6A5F\u80FD\u3068\u30E1\u30EA\u30C3\u30C8\n - \u30A4\u30F3\u30B9\u30C8\u30FC\u30EB\u624B\u9806\n - \u57FA\u672C\u7684\u306A\u4F7F\u7528\u4F8B\n - \u6F5C\u5728\u7684\u306A\u30EA\u30B9\u30AF\u3068\u8003\u616E\u4E8B\u9805\n - \u63A8\u5968\u3055\u308C\u308B\u5C0E\u5165\u30B9\u30B1\u30B8\u30E5\u30FC\u30EB\n\n## \u5165\u529B\u30C7\u30FC\u30BF\n\n### \u30B9\u30AD\u30FC\u30DE\n${JSON.stringify(aiContext, null, 2)}\n\n### \u30D5\u30A9\u30FC\u30E0\u30C7\u30FC\u30BF\n${JSON.stringify(formData, null, 2)}\n\n\u4E0A\u8A18\u306E\u5165\u529B\u306B\u57FA\u3065\u3044\u3066\u3001\u5305\u62EC\u7684\u306A\u30E9\u30A4\u30D6\u30E9\u30EA\u5C0E\u5165\u30D7\u30E9\u30F3\u3092\u4F5C\u6210\u3057\u3066\u304F\u3060\u3055\u3044\u3002`;\n};\n\nconst jaConfig: Config = {\n scenarios: [\n {\n id: 'default',\n name: '\u30E9\u30A4\u30D6\u30E9\u30EA\u5C0E\u5165\u30D7\u30E9\u30F3 (Example)',\n steps: jaSteps,\n prompt: jaPrompt,\n },\n ],\n};\n\n// =============================================================================\n// Command\n// =============================================================================\n\nexport const exampleCommand = defineCommand({\n meta: {\n name: 'example',\n description: 'Run pre-claude with an example config to try it out',\n },\n args: {\n lang: {\n type: 'string',\n description: 'Language for example config (en or ja)',\n alias: 'l',\n default: 'en',\n },\n },\n async run({ args }) {\n const lang = args.lang;\n\n if (lang !== 'en' && lang !== 'ja') {\n consola.error(`Invalid language: ${lang}. Use 'en' or 'ja'.`);\n process.exit(1);\n }\n\n const config = lang === 'ja' ? jaConfig : enConfig;\n\n try {\n if (process.stdin.isTTY !== true) {\n throw new Error(\n 'TUI requires an interactive terminal. Please run this command in a terminal that supports raw mode.',\n );\n }\n\n consola.info(\n `Running example with ${lang === 'ja' ? 'Japanese' : 'English'} config...`,\n );\n\n enterAlternateScreen();\n\n const { waitUntilExit } = render(<App config={config} />);\n\n await waitUntilExit();\n exitAlternateScreen();\n } catch (error) {\n exitAlternateScreen();\n if (error instanceof Error) {\n consola.error(error.message);\n } else {\n consola.error('Failed to run example:', error);\n }\n process.exit(1);\n }\n },\n});\n", "import { Text, useApp } from 'ink';\nimport { type FC, useCallback, useState } from 'react';\n\nimport type { AiContext, Config, Scenario } from '../types';\nimport type { DocumentWithMetadata } from './features/document/types';\nimport type { FormValues } from './features/form/types';\nimport { Preview } from './views/Preview';\nimport { ScenarioForm } from './views/ScenarioForm';\nimport { SelectScenario } from './views/SelectScenario';\n\ntype AppProps = {\n config: Config;\n initialScenarioId?: string;\n};\n\ntype PreviewData = {\n formValues: FormValues;\n aiContext: AiContext;\n initialContent?: string;\n editingFilename?: string;\n};\n\ntype AppState =\n | { screen: 'select' }\n | {\n screen: 'form';\n scenarioId: string;\n initialFormValues?: FormValues;\n editingFilename?: string;\n }\n | { screen: 'preview'; scenarioId: string; previewData: PreviewData };\n\nexport const App: FC<AppProps> = ({ config, initialScenarioId }) => {\n const { exit } = useApp();\n\n const [appState, setAppState] = useState<AppState>(() => {\n if (initialScenarioId != null) {\n const scenario = config.scenarios.find((s) => s.id === initialScenarioId);\n if (scenario != null) {\n return { screen: 'form', scenarioId: initialScenarioId };\n }\n }\n return { screen: 'select' };\n });\n\n const getScenario = useCallback(\n (scenarioId: string): Scenario | undefined => {\n return config.scenarios.find((s) => s.id === scenarioId);\n },\n [config.scenarios],\n );\n\n const handleSelectNew = useCallback((scenarioId: string) => {\n setAppState({ screen: 'form', scenarioId });\n }, []);\n\n const handleSelectDocument = useCallback(\n (scenarioId: string, doc: DocumentWithMetadata) => {\n setAppState({\n screen: 'form',\n scenarioId,\n initialFormValues: (doc.metadata?.formData ?? {}) as FormValues,\n editingFilename: doc.filename,\n });\n },\n [],\n );\n\n const handleBackToSelect = useCallback(() => {\n setAppState({ screen: 'select' });\n }, []);\n\n const handleGeneratePreview = useCallback(\n (formValues: FormValues, aiContext: AiContext) => {\n if (appState.screen !== 'form') return;\n setAppState({\n screen: 'preview',\n scenarioId: appState.scenarioId,\n previewData: {\n formValues,\n aiContext,\n editingFilename: appState.editingFilename,\n },\n });\n },\n [appState],\n );\n\n const handleBackToForm = useCallback(() => {\n if (appState.screen !== 'preview') return;\n setAppState({\n screen: 'form',\n scenarioId: appState.scenarioId,\n initialFormValues: appState.previewData.formValues,\n editingFilename: appState.previewData.editingFilename,\n });\n }, [appState]);\n\n if (appState.screen === 'select') {\n return (\n <SelectScenario\n scenarios={config.scenarios}\n onSelectNew={handleSelectNew}\n onSelectDocument={handleSelectDocument}\n onExit={() => exit()}\n />\n );\n }\n\n const scenario = getScenario(appState.scenarioId);\n if (scenario == null) {\n return <Text color=\"red\">Error: Scenario not found</Text>;\n }\n\n if (appState.screen === 'form') {\n return (\n <ScenarioForm\n key={appState.scenarioId}\n scenario={scenario}\n initialFormValues={appState.initialFormValues}\n onGeneratePreview={handleGeneratePreview}\n onBack={handleBackToSelect}\n />\n );\n }\n\n if (appState.screen === 'preview') {\n return (\n <Preview\n config={config}\n scenario={scenario}\n formValues={appState.previewData.formValues}\n aiContext={appState.previewData.aiContext}\n initialContent={appState.previewData.initialContent}\n editingFilename={appState.previewData.editingFilename}\n onBack={handleBackToForm}\n />\n );\n }\n\n return <Text color=\"red\">Unknown screen</Text>;\n};\n", "import { spawn } from 'node:child_process';\nimport { Box, Text, useApp, useStdout } from 'ink';\nimport { type FC, useCallback, useMemo, useState } from 'react';\n\nimport type { AiContext, Config, Scenario } from '../../../types';\nimport type { ControlItem } from '../../components/ControlBar';\nimport { saveDocument } from '../../features/document/services';\nimport { ACCENT_COLOR, type FormValues } from '../../features/form/types';\nimport { generatePreview } from '../../features/generation/services';\nimport { useControl } from '../../hooks/useControl';\nimport { useMount } from '../../hooks/useMount';\nimport type { StatusInfo } from '../../layouts/CommonLayout';\nimport { ScenarioLayout } from '../../layouts/ScenarioLayout';\n\nexport type PreviewProps = {\n config: Config;\n scenario: Scenario;\n formValues: FormValues;\n aiContext: AiContext;\n initialContent?: string;\n editingFilename?: string;\n onBack: () => void;\n};\n\nexport const Preview: FC<PreviewProps> = ({\n config,\n scenario,\n formValues,\n aiContext,\n initialContent = '',\n editingFilename,\n onBack,\n}) => {\n const [previewContent, setPreviewContent] = useState(initialContent);\n const [isGenerating, setIsGenerating] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [isSaving, setIsSaving] = useState(false);\n const [scrollOffset, setScrollOffset] = useState(0);\n const [dataPreviewScrollOffset, setDataPreviewScrollOffset] = useState(0);\n const [savedFilename, setSavedFilename] = useState<string | null>(null);\n const [showDataPreview, setShowDataPreview] = useState(false);\n const [showContinueDialog, setShowContinueDialog] = useState(false);\n const { stdout } = useStdout();\n const [sessionId, setSessionId] = useState<string | null>(null);\n const { exit } = useApp();\n\n const isEditing = editingFilename != null;\n const canSave = previewContent !== '' && !isGenerating;\n const lines = previewContent.split('\\n');\n // Layout: padding(1) + Header(1) + content + ControlBar(1) + StatusBar(1) + padding(1) + border(2) + line info(1)\n const fixedHeight = 8;\n const maxVisible = Math.max(10, (stdout?.rows ?? 24) - fixedHeight);\n const visibleLines = lines.slice(scrollOffset, scrollOffset + maxVisible);\n\n const canContinue = sessionId != null && !isGenerating;\n const controls = useMemo<ControlItem[]>(\n () => [\n { key: '\u2191\u2193/jk', action: 'scroll' },\n { key: 'r', action: 'regenerate' },\n ...(canSave ? [{ key: 's', action: 'save' }] : []),\n ...(canContinue ? [{ key: 'c', action: 'continue in Claude' }] : []),\n { key: 'i', action: 'info' },\n { key: 'q/Esc', action: 'back' },\n ],\n [canSave, canContinue],\n );\n\n const status = useMemo((): StatusInfo | undefined => {\n if (error) {\n return { message: `Error: ${error}`, type: 'error' };\n }\n if (isGenerating) {\n return { message: 'Generating...', type: 'warning' };\n }\n if (isSaving) {\n return { message: 'Saving...', type: 'warning' };\n }\n if (savedFilename) {\n return { message: `Saved: ${savedFilename}`, type: 'success' };\n }\n return undefined;\n }, [error, isGenerating, isSaving, savedFilename]);\n\n const handleGenerate = useCallback(async () => {\n setIsGenerating(true);\n setError(null);\n setPreviewContent('');\n setSessionId(null);\n\n let accumulatedContent = '';\n\n try {\n await generatePreview({\n scenario,\n formData: formValues,\n aiContext,\n onChunk: (chunk) => {\n accumulatedContent += chunk;\n setPreviewContent(accumulatedContent);\n },\n onComplete: (result) => {\n setPreviewContent(result.content);\n setSessionId(result.sessionId);\n setIsGenerating(false);\n },\n onError: (err) => {\n setError(err.message);\n setIsGenerating(false);\n },\n });\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Unknown error');\n setIsGenerating(false);\n }\n }, [scenario, formValues, aiContext]);\n\n const handleSave = useCallback(async () => {\n if (isSaving) return;\n\n setIsSaving(true);\n setError(null);\n setSavedFilename(null);\n\n try {\n const filename = await saveDocument({\n config,\n scenario,\n formData: formValues,\n aiContext,\n content: previewContent,\n existingFilename: editingFilename,\n });\n setIsSaving(false);\n setSavedFilename(filename);\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to save');\n setIsSaving(false);\n }\n }, [\n config,\n scenario,\n formValues,\n aiContext,\n previewContent,\n editingFilename,\n isSaving,\n ]);\n\n // Memoize JSON data for scroll calculations\n const formDataLines = useMemo(\n () => JSON.stringify(formValues, null, 2).split('\\n'),\n [formValues],\n );\n const aiContextLines = useMemo(\n () => JSON.stringify(aiContext, null, 2).split('\\n'),\n [aiContext],\n );\n const maxDataLines = Math.max(formDataLines.length, aiContextLines.length);\n const handleContinueInClaude = useCallback(\n async (shouldSave: boolean) => {\n if (!sessionId) return;\n\n if (shouldSave && canSave) {\n setIsSaving(true);\n setError(null);\n try {\n await saveDocument({\n config,\n scenario,\n formData: formValues,\n aiContext,\n content: previewContent,\n existingFilename: editingFilename,\n });\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to save');\n setIsSaving(false);\n setShowContinueDialog(false);\n return;\n }\n setIsSaving(false);\n }\n\n exit();\n\n setTimeout(() => {\n const child = spawn('claude', ['--resume', sessionId], {\n stdio: 'inherit',\n shell: true,\n });\n\n child.on('close', (code) => {\n process.exit(code ?? 0);\n });\n }, 100);\n },\n [\n sessionId,\n exit,\n canSave,\n config,\n scenario,\n formValues,\n aiContext,\n previewContent,\n editingFilename,\n ],\n );\n\n useControl({\n onEscape: () => {\n if (showContinueDialog) {\n setShowContinueDialog(false);\n } else if (showDataPreview) {\n setShowDataPreview(false);\n } else {\n onBack();\n }\n },\n onQuit: showContinueDialog ? undefined : onBack,\n onSave: () => {\n if (!isGenerating && !isSaving && !showContinueDialog) {\n handleSave();\n }\n },\n onRegenerate: () => {\n if (!isGenerating && !showContinueDialog) {\n handleGenerate();\n }\n },\n onUp: () => {\n if (showContinueDialog) return;\n if (showDataPreview) {\n setDataPreviewScrollOffset((prev) => Math.max(0, prev - 1));\n } else {\n setScrollOffset((prev) => Math.max(0, prev - 1));\n }\n },\n onDown: () => {\n if (showContinueDialog) return;\n if (showDataPreview) {\n // Account for borders (2) and title (1) and hint (1)\n const maxDataVisible = Math.max(5, maxVisible - 2);\n setDataPreviewScrollOffset((prev) =>\n Math.min(prev + 1, Math.max(0, maxDataLines - maxDataVisible)),\n );\n } else {\n setScrollOffset((prev) =>\n Math.min(prev + 1, Math.max(0, lines.length - maxVisible)),\n );\n }\n setScrollOffset((prev) =>\n Math.min(prev + 1, Math.max(0, lines.length - maxVisible)),\n );\n },\n onInfo: () => {\n if (showContinueDialog) return;\n setShowDataPreview((prev) => {\n if (!prev) {\n // Reset scroll when opening data preview\n setDataPreviewScrollOffset(0);\n }\n return !prev;\n });\n },\n onContinue: () => {\n if (canContinue && !showContinueDialog) {\n setShowContinueDialog(true);\n }\n },\n onChar: (char) => {\n if (showContinueDialog) {\n if (char === 'y' || char === 'Y') {\n handleContinueInClaude(true);\n } else if (char === 'n' || char === 'N') {\n handleContinueInClaude(false);\n }\n }\n },\n });\n\n useMount(() => {\n if (previewContent === '' && !isGenerating) {\n handleGenerate();\n }\n });\n\n if (showDataPreview) {\n // Account for borders (2) and title (1) and hint (1)\n const maxDataVisible = Math.max(5, maxVisible - 2);\n const visibleFormDataLines = formDataLines.slice(\n dataPreviewScrollOffset,\n dataPreviewScrollOffset + maxDataVisible,\n );\n const visibleAiContextLines = aiContextLines.slice(\n dataPreviewScrollOffset,\n dataPreviewScrollOffset + maxDataVisible,\n );\n const hasMoreDataAbove = dataPreviewScrollOffset > 0;\n const hasMoreDataBelow =\n dataPreviewScrollOffset + maxDataVisible < maxDataLines;\n\n return (\n <ScenarioLayout controls={controls} status={status}>\n <Box flexDirection=\"row\" gap={1} flexGrow={1}>\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={ACCENT_COLOR}\n paddingX={1}\n flexGrow={1}\n flexBasis={0}\n >\n <Box marginTop={-1} marginLeft={1}>\n <Text backgroundColor=\"black\" color={ACCENT_COLOR} bold>\n {' '}\n formData{' '}\n </Text>\n </Box>\n <Box flexDirection=\"column\" overflowY=\"hidden\">\n {hasMoreDataAbove && <Text dimColor>\u2191 more</Text>}\n {visibleFormDataLines.map((line, index) => (\n <Text key={dataPreviewScrollOffset + index}>{line || ' '}</Text>\n ))}\n {hasMoreDataBelow && <Text dimColor>\u2193 more</Text>}\n </Box>\n </Box>\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={ACCENT_COLOR}\n paddingX={1}\n flexGrow={1}\n flexBasis={0}\n >\n <Box marginTop={-1} marginLeft={1}>\n <Text backgroundColor=\"black\" color={ACCENT_COLOR} bold>\n {' '}\n aiContext{' '}\n </Text>\n </Box>\n <Box flexDirection=\"column\" overflowY=\"hidden\">\n {hasMoreDataAbove && <Text dimColor>\u2191 more</Text>}\n {visibleAiContextLines.map((line, index) => (\n <Text key={dataPreviewScrollOffset + index}>{line || ' '}</Text>\n ))}\n {hasMoreDataBelow && <Text dimColor>\u2193 more</Text>}\n </Box>\n </Box>\n </Box>\n <Box paddingX={1}>\n <Text dimColor>\n Press i or Esc to close\n {maxDataLines > maxDataVisible &&\n ` | Lines ${dataPreviewScrollOffset + 1}-${Math.min(dataPreviewScrollOffset + maxDataVisible, maxDataLines)} of ${maxDataLines}`}\n </Text>\n </Box>\n </ScenarioLayout>\n );\n }\n\n return (\n <ScenarioLayout controls={controls} status={status}>\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={ACCENT_COLOR}\n paddingX={1}\n height={maxVisible + 2}\n >\n <Box marginTop={-1} marginLeft={1}>\n <Text backgroundColor=\"black\" color={ACCENT_COLOR} bold>\n {' '}\n Preview{isEditing ? ` (${editingFilename})` : ''}{' '}\n </Text>\n </Box>\n {previewContent === '' && !isGenerating && !error ? (\n <Text dimColor>No preview content yet.</Text>\n ) : (\n visibleLines.map((line, index) => (\n <Text key={scrollOffset + index}>{line || ' '}</Text>\n ))\n )}\n </Box>\n\n {lines.length > maxVisible && (\n <Box paddingX={1}>\n <Text dimColor>\n Lines {scrollOffset + 1}-\n {Math.min(scrollOffset + maxVisible, lines.length)} of{' '}\n {lines.length}\n </Text>\n </Box>\n )}\n\n {showContinueDialog && (\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor=\"yellow\"\n paddingX={1}\n paddingY={0}\n marginTop={1}\n >\n <Box marginTop={-1} marginLeft={1}>\n <Text backgroundColor=\"black\" color=\"yellow\" bold>\n {' '}\n Continue in Claude{' '}\n </Text>\n </Box>\n <Text>Save document before continuing?</Text>\n <Box marginTop={1}>\n <Text>\n <Text color=\"green\" bold>\n [y]\n </Text>{' '}\n Save and continue{' '}\n <Text color=\"blue\" bold>\n [n]\n </Text>{' '}\n Continue without saving{' '}\n <Text dimColor bold>\n [Esc]\n </Text>{' '}\n Cancel\n </Text>\n </Box>\n </Box>\n )}\n </ScenarioLayout>\n );\n};\n", "import { mkdir, readFile, readdir, writeFile } from 'node:fs/promises';\nimport { join } from 'node:path';\n\nimport type { AiContext, Config, Scenario } from '../../../types';\nimport type {\n DocumentMetadata,\n DocumentWithMetadata,\n ReadDocumentResult,\n} from './types';\n\nconst METADATA_START = '<!-- design-docs-metadata';\nconst METADATA_END = '-->';\n\nexport const serializeMetadata = (metadata: DocumentMetadata): string => {\n return `${METADATA_START}\\n${JSON.stringify(metadata, null, 2)}\\n${METADATA_END}`;\n};\n\nexport const addMetadataToContent = (\n content: string,\n metadata: DocumentMetadata,\n): string => {\n return `${content}\\n\\n${serializeMetadata(metadata)}`;\n};\n\nexport const parseMetadata = (\n content: string,\n): { metadata: DocumentMetadata | null; content: string } => {\n const metadataStartIndex = content.lastIndexOf(METADATA_START);\n if (metadataStartIndex === -1) {\n return { metadata: null, content };\n }\n\n const metadataEndIndex = content.indexOf(METADATA_END, metadataStartIndex);\n if (metadataEndIndex === -1) {\n return { metadata: null, content };\n }\n\n try {\n const metadataJson = content\n .slice(metadataStartIndex + METADATA_START.length, metadataEndIndex)\n .trim();\n const metadata = JSON.parse(metadataJson) as DocumentMetadata;\n const cleanContent = content.slice(0, metadataStartIndex).trim();\n return { metadata, content: cleanContent };\n } catch {\n return { metadata: null, content };\n }\n};\n\nexport const getOutputDir = (scenario: Scenario): string => {\n return scenario.outputDir ?? join(process.cwd(), 'output');\n};\n\nexport const getFilename = (\n scenario: Scenario,\n scenarioId: string,\n content: string,\n formData: Record<string, unknown>,\n aiContext: AiContext,\n): string => {\n const timestamp = new Date().toISOString().replace(/[:.]/g, '-');\n\n const filename = scenario.filename;\n if (filename != null) {\n return typeof filename === 'function'\n ? filename({\n scenarioId,\n timestamp,\n content,\n formData,\n aiContext,\n })\n : filename;\n }\n\n return `design-doc-${scenarioId}-${timestamp}.md`;\n};\n\ntype SaveDocumentParams = {\n config: Config;\n scenario: Scenario;\n formData: Record<string, unknown>;\n aiContext: AiContext;\n content: string;\n existingFilename?: string;\n};\n\nexport const saveDocument = async ({\n scenario,\n aiContext,\n content,\n formData,\n existingFilename,\n}: SaveDocumentParams): Promise<string> => {\n const filename =\n existingFilename ??\n getFilename(scenario, scenario.id, content, formData, aiContext);\n\n const outputDir = getOutputDir(scenario);\n const outputPath = join(outputDir, filename);\n\n const contentWithMetadata = addMetadataToContent(content, {\n scenarioId: scenario.id,\n formData,\n });\n\n await mkdir(outputDir, { recursive: true });\n await writeFile(outputPath, contentWithMetadata, 'utf-8');\n\n return outputPath;\n};\n\nexport const readDocument = async (\n scenario: Scenario,\n filename: string,\n): Promise<ReadDocumentResult> => {\n const outputDir = getOutputDir(scenario);\n const filePath = join(outputDir, filename);\n\n try {\n const rawContent = await readFile(filePath, 'utf-8');\n const { metadata, content } = parseMetadata(rawContent);\n\n if (metadata?.scenarioId !== scenario.id) {\n return { success: false, error: 'scenario_mismatch' };\n }\n\n return {\n success: true,\n doc: { filename, content, metadata },\n };\n } catch {\n return { success: false, error: 'not_found' };\n }\n};\n\nexport const getDocumentsForScenario = async (\n scenario: Scenario,\n): Promise<DocumentWithMetadata[]> => {\n const outputDir = getOutputDir(scenario);\n\n try {\n const files = await readdir(outputDir);\n const mdFiles = files.filter((file) => file.endsWith('.md'));\n\n const docs = await Promise.all(\n mdFiles.map(async (filename) => {\n const result = await readDocument(scenario, filename);\n return result.success ? result.doc : null;\n }),\n );\n\n return docs.filter((doc) => doc != null);\n } catch {\n return [];\n }\n};\n", "import type { FormField, RepeatableLayout } from '../../../types';\n\nexport type FormValues = Record<string, Record<string, unknown>>;\n\nexport const ACCENT_COLOR = 'green';\nexport const HELP_COLOR = 'blue';\n\nexport type FocusPanel = 'steps' | 'list' | 'form';\n\nexport type FlatFieldItem =\n | {\n type: 'field';\n field: FormField;\n path: string;\n label: string;\n treePrefix?: string;\n }\n | {\n type: 'repeatable-add';\n repeatable: RepeatableLayout;\n path: string;\n label: string;\n treePrefix?: string;\n }\n | {\n type: 'repeatable-header';\n repeatable: RepeatableLayout;\n path: string;\n index: number;\n label: string;\n treePrefix?: string;\n };\n", "import { query } from '@anthropic-ai/claude-agent-sdk';\n\nimport type {\n GenerateDesignDocParams,\n GeneratePreviewParams,\n StreamChunk,\n} from './types';\n\nexport async function* generateDesignDocStream({\n scenario,\n formData,\n aiContext,\n}: GenerateDesignDocParams): AsyncGenerator<StreamChunk> {\n const prompt = scenario.prompt({ formData, aiContext });\n\n for await (const msg of query({\n prompt,\n options: {\n includePartialMessages: true,\n },\n })) {\n if (msg.type === 'stream_event') {\n const event = msg.event as {\n type: string;\n delta?: { type: string; text?: string };\n };\n if (\n event.type === 'content_block_delta' &&\n event.delta?.type === 'text_delta' &&\n event.delta.text != null\n ) {\n yield { type: 'text_delta', text: event.delta.text };\n }\n }\n }\n}\n\nexport const generatePreview = async ({\n scenario,\n formData,\n aiContext,\n onChunk,\n onComplete,\n onError,\n}: GeneratePreviewParams): Promise<void> => {\n try {\n let content = '';\n let sessionId: string | null = null;\n const prompt = scenario.prompt({ formData, aiContext });\n\n for await (const msg of query({\n prompt,\n options: {\n includePartialMessages: true,\n },\n })) {\n if (msg.type === 'stream_event') {\n const event = msg.event as {\n type: string;\n delta?: { type: string; text?: string };\n };\n if (\n event.type === 'content_block_delta' &&\n event.delta?.type === 'text_delta' &&\n event.delta.text != null\n ) {\n content += event.delta.text;\n onChunk(event.delta.text);\n }\n }\n if ('session_id' in msg && msg.session_id && !sessionId) {\n sessionId = msg.session_id;\n }\n }\n onComplete({ content, sessionId });\n } catch (error) {\n onError(error instanceof Error ? error : new Error(String(error)));\n }\n};\n", "import { useInput } from 'ink';\n\nexport type ControlOptions = {\n onUp?: () => void;\n onDown?: () => void;\n onLeft?: () => void;\n onRight?: () => void;\n onEnter?: () => void;\n onEscape?: () => void;\n onQuit?: () => void;\n onGenerate?: () => void;\n onSave?: () => void;\n onDelete?: () => void;\n onNext?: () => void;\n onPrev?: () => void;\n onRegenerate?: () => void;\n onInfo?: () => void;\n onContinue?: () => void;\n onChar?: (char: string) => void;\n isActive?: boolean;\n viKeysEnabled?: boolean;\n};\n\nexport const useControl = (options: ControlOptions = {}): void => {\n const {\n onUp,\n onDown,\n onLeft,\n onRight,\n onEnter,\n onEscape,\n onQuit,\n onGenerate,\n onSave,\n onDelete,\n onNext,\n onPrev,\n onRegenerate,\n onInfo,\n onContinue,\n onChar,\n isActive = true,\n viKeysEnabled = true,\n } = options;\n\n useInput(\n (input, key) => {\n if (key.upArrow) {\n onUp?.();\n return;\n }\n if (key.downArrow) {\n onDown?.();\n return;\n }\n if (key.leftArrow) {\n onLeft?.();\n return;\n }\n if (key.rightArrow) {\n onRight?.();\n return;\n }\n\n if (key.return) {\n onEnter?.();\n return;\n }\n if (key.escape) {\n onEscape?.();\n return;\n }\n\n if (viKeysEnabled) {\n switch (input) {\n case 'k':\n onUp?.();\n return;\n case 'j':\n onDown?.();\n return;\n case 'h':\n onLeft?.();\n return;\n case 'l':\n onRight?.();\n return;\n }\n }\n\n switch (input) {\n case 'q':\n onQuit?.();\n return;\n case 'g':\n onGenerate?.();\n return;\n case 's':\n onSave?.();\n return;\n case 'd':\n onDelete?.();\n return;\n case 'n':\n onNext?.();\n return;\n case 'p':\n onPrev?.();\n return;\n case 'r':\n onRegenerate?.();\n return;\n case 'i':\n onInfo?.();\n return;\n case 'c':\n onContinue?.();\n return;\n }\n\n onChar?.(input);\n },\n { isActive },\n );\n};\n", "import { useEffect, useRef } from 'react';\n\ntype MountFunction = () => void | Promise<void>;\n\ntype StrictVoidFunction<T extends MountFunction> =\n ReturnType<T> extends void | Promise<void> ? T : never;\n\nexport const useMount = <T extends MountFunction>(\n fn: StrictVoidFunction<T>,\n) => {\n const mountedRef = useRef(false);\n\n // biome-ignore lint/correctness/useExhaustiveDependencies: <explanation>\n useEffect(() => {\n if (mountedRef.current) {\n return;\n }\n fn();\n mountedRef.current = true;\n }, []);\n};\n", "import { Box } from 'ink';\nimport type { FC, ReactNode } from 'react';\n\nimport { ControlBar, type ControlItem } from '../../components/ControlBar';\nimport { Header } from '../../components/Header';\nimport { StatusBar, type StatusType } from '../../components/StatusBar';\nimport { useTerminalHeight } from '../../hooks/useTerminalHeight';\n\nexport type StatusInfo = {\n message: string;\n type?: StatusType;\n};\n\nexport type CommonLayoutProps = {\n children: ReactNode;\n status?: StatusInfo;\n controls?: ControlItem[];\n};\n\nexport const CommonLayout: FC<CommonLayoutProps> = ({\n children,\n status,\n controls = [],\n}) => {\n const { rows } = useTerminalHeight();\n\n return (\n <Box flexDirection=\"column\" padding={1} height={rows}>\n <Header />\n <Box flexDirection=\"column\" flexGrow={1}>\n {children}\n </Box>\n {controls.length > 0 && <ControlBar items={controls} />}\n {status?.message && (\n <StatusBar message={status.message} type={status.type} />\n )}\n </Box>\n );\n};\n", "import { Box, Text } from 'ink';\nimport type { FC } from 'react';\n\nimport { HELP_COLOR } from '../../features/form/types';\n\nexport type ControlItem = {\n key: string;\n action: string;\n};\n\nexport type ControlBarProps = {\n items: ControlItem[];\n};\n\nexport const ControlBar: FC<ControlBarProps> = ({ items }) => {\n if (items.length === 0) {\n return null;\n }\n\n const helpText = items\n .map((item) => `${item.key}: ${item.action}`)\n .join(' | ');\n\n return (\n <Box paddingX={1}>\n <Text color={HELP_COLOR}>{helpText}</Text>\n </Box>\n );\n};\n", "import { Box, Text } from 'ink';\nimport type { FC } from 'react';\n\nimport { ACCENT_COLOR } from '../../features/form/types';\n\nexport type HeaderProps = {\n description?: string;\n};\n\nexport const Header: FC<HeaderProps> = ({\n description = 'Structured Prompt Builder for Claude',\n}) => {\n return (\n <Box\n borderStyle=\"double\"\n borderColor={ACCENT_COLOR}\n paddingX={1}\n justifyContent=\"space-between\"\n >\n <Text color={ACCENT_COLOR} bold>\n \uD83D\uDC0D pre-claude\n </Text>\n <Box flexDirection=\"column\" alignItems=\"flex-end\">\n <Text color={ACCENT_COLOR}>{description}</Text>\n <Text color={ACCENT_COLOR} dimColor>\n https://github.com/cut0/pre-claude\n </Text>\n </Box>\n </Box>\n );\n};\n", "import { Box, Text } from 'ink';\nimport type { FC } from 'react';\n\nexport type StatusType = 'success' | 'error' | 'warning' | 'info';\n\nexport type StatusBarProps = {\n message: string;\n type?: StatusType;\n};\n\nconst getStatusColor = (type: StatusType): string => {\n switch (type) {\n case 'success':\n return 'green';\n case 'error':\n return 'red';\n case 'warning':\n return 'yellow';\n case 'info':\n return 'blue';\n }\n};\n\nconst getStatusBackground = (\n type: StatusType,\n): 'green' | 'red' | 'yellow' | undefined => {\n switch (type) {\n case 'success':\n return 'green';\n case 'error':\n return 'red';\n case 'warning':\n return 'yellow';\n case 'info':\n return undefined;\n }\n};\n\nexport const StatusBar: FC<StatusBarProps> = ({ message, type = 'info' }) => {\n if (!message) {\n return null;\n }\n\n const backgroundColor = getStatusBackground(type);\n const color = getStatusColor(type);\n\n return (\n <Box paddingX={1}>\n {backgroundColor ? (\n <Text backgroundColor={backgroundColor} color=\"white\">\n {' '}\n {message}{' '}\n </Text>\n ) : (\n <Text color={color}>{message}</Text>\n )}\n </Box>\n );\n};\n", "import { useStdout } from 'ink';\n\n/**\n * Hook to get terminal height and calculate available content height.\n *\n * CommonLayout fixed elements breakdown:\n * - padding top: 1 line\n * - Header: 3 lines (1 content + 2 border)\n * - ControlBar: 1 line\n * - StatusBar: 1 line\n * - padding bottom: 1 line\n * Total: 7 lines\n */\nexport const useTerminalHeight = () => {\n const { stdout } = useStdout();\n const rows = stdout?.rows ?? 24;\n\n const fixedLayoutHeight = 7;\n const availableHeight = Math.max(10, rows - fixedLayoutHeight);\n\n return { rows, availableHeight };\n};\n", "import type { FC, ReactNode } from 'react';\n\nimport type { ControlItem } from '../../components/ControlBar';\nimport { CommonLayout, type StatusInfo } from '../CommonLayout';\n\nexport type ScenarioLayoutProps = {\n children: ReactNode;\n status?: StatusInfo;\n controls?: ControlItem[];\n};\n\nexport const ScenarioLayout: FC<ScenarioLayoutProps> = ({\n children,\n status,\n controls = [],\n}) => {\n return (\n <CommonLayout status={status} controls={controls}>\n {children}\n </CommonLayout>\n );\n};\n", "import { Box, Text } from 'ink';\nimport { type FC, useCallback, useMemo, useState } from 'react';\n\nimport type { AiContext, RepeatableLayout, Scenario } from '../../../types';\nimport type { ControlItem } from '../../components/ControlBar';\nimport { buildAiContext } from '../../features/form/services';\nimport type {\n FlatFieldItem,\n FocusPanel,\n FormValues,\n} from '../../features/form/types';\nimport {\n buildRepeatableItemDefaults,\n flattenFields,\n getValueByPath,\n setValueByPath,\n} from '../../features/form/utils';\nimport { useFormState } from '../../hooks/useFormState';\nimport { useMount } from '../../hooks/useMount';\nimport { useTerminalHeight } from '../../hooks/useTerminalHeight';\nimport type { StatusInfo } from '../../layouts/CommonLayout';\nimport { ScenarioLayout } from '../../layouts/ScenarioLayout';\nimport { FieldEditor } from './-internal/FieldEditor';\nimport { FieldSelector } from './-internal/FieldSelector';\nimport { StepSelector } from './-internal/StepSelector';\n\nexport type ScenarioFormProps = {\n scenario: Scenario;\n initialFormValues?: FormValues;\n onGeneratePreview: (formValues: FormValues, aiContext: AiContext) => void;\n onBack: () => void;\n};\n\nexport const ScenarioForm: FC<ScenarioFormProps> = ({\n scenario,\n initialFormValues,\n onGeneratePreview,\n onBack,\n}) => {\n const formState = useFormState(scenario);\n const [stepIndex, setStepIndex] = useState(0);\n const [focusPanel, setFocusPanel] = useState<FocusPanel>('steps');\n const [currentItem, setCurrentItem] = useState<FlatFieldItem | undefined>();\n const [validationError, setValidationError] = useState<string | null>(null);\n const { availableHeight } = useTerminalHeight();\n // Account for StepSelector (~3 lines with borders)\n const fieldSelectorHeight = Math.max(8, availableHeight - 3);\n\n const currentStep = scenario.steps[stepIndex];\n\n if (currentStep == null) {\n return <Text color=\"red\">Error: Step not found</Text>;\n }\n\n const isFirstStep = stepIndex === 0;\n const isLastStep = stepIndex === scenario.steps.length - 1;\n\n const stepValues = (formState.formValues[currentStep.name] ?? {}) as Record<\n string,\n unknown\n >;\n\n const flatItems = flattenFields(\n currentStep.fields,\n stepValues,\n formState.formValues as Record<string, unknown>,\n );\n\n const controls = useMemo<ControlItem[]>(() => {\n switch (focusPanel) {\n case 'steps':\n return [\n { key: '\u2190\u2192/hl', action: 'select step' },\n { key: '\u2193/j', action: 'to fields' },\n { key: 'Enter', action: 'confirm' },\n { key: 'g', action: 'generate' },\n { key: 'q', action: 'back' },\n ];\n case 'form':\n return [\n { key: '\u2191\u2193/jk', action: 'move' },\n { key: 'Enter', action: 'confirm' },\n { key: 'Esc', action: 'back' },\n ];\n case 'list':\n return [\n { key: '\u2191\u2193/jk', action: 'move' },\n { key: 'Enter', action: 'edit' },\n { key: 'd', action: 'delete' },\n ...(!isFirstStep ? [{ key: 'p', action: 'prev' }] : []),\n ...(!isLastStep ? [{ key: 'n', action: 'next' }] : []),\n { key: 'g', action: 'generate' },\n { key: 'q', action: 'back' },\n ];\n }\n }, [focusPanel, isFirstStep, isLastStep]);\n\n const status = useMemo((): StatusInfo | undefined => {\n if (validationError) {\n return { message: validationError, type: 'error' };\n }\n return undefined;\n }, [validationError]);\n\n const updateValue = useCallback(\n (path: string, value: unknown) => {\n const keys = path.split('.');\n if (keys.length === 1) {\n formState.updateFieldValue(currentStep.name, path, value);\n } else {\n const newStepValues = setValueByPath(stepValues, path, value);\n const rootKey = keys[0] as string;\n formState.updateFieldValue(\n currentStep.name,\n rootKey,\n newStepValues[rootKey],\n );\n }\n },\n [currentStep.name, stepValues, formState],\n );\n\n const addRepeatableItem = useCallback(\n (repeatable: RepeatableLayout, path: string) => {\n const newItem = buildRepeatableItemDefaults(repeatable);\n\n // Check if this is a nested repeatable (path contains dots)\n if (path.includes('.')) {\n const items =\n (getValueByPath(stepValues, path) as Record<string, unknown>[]) || [];\n const newStepValues = setValueByPath(stepValues, path, [\n ...items,\n newItem,\n ]);\n const rootKey = path.split('.')[0] as string;\n formState.updateFieldValue(\n currentStep.name,\n rootKey,\n newStepValues[rootKey],\n );\n } else {\n const items =\n (stepValues[repeatable.id] as Record<string, unknown>[]) || [];\n formState.updateFieldValue(currentStep.name, repeatable.id, [\n ...items,\n newItem,\n ]);\n }\n },\n [currentStep.name, stepValues, formState],\n );\n\n const removeRepeatableItem = useCallback(\n (repeatable: RepeatableLayout, index: number, path: string) => {\n // Extract the repeatable path (remove the item index from the end)\n const pathParts = path.split('.');\n pathParts.pop(); // Remove the index\n const repeatablePath = pathParts.join('.');\n\n const minCount = repeatable.minCount ?? 0;\n\n // Check if this is a nested repeatable\n if (repeatablePath.includes('.')) {\n const items =\n (getValueByPath(stepValues, repeatablePath) as\n | Record<string, unknown>[]\n | undefined) || [];\n if (items.length > minCount) {\n const newItems = items.filter((_, i) => i !== index);\n const newStepValues = setValueByPath(\n stepValues,\n repeatablePath,\n newItems,\n );\n const rootKey = repeatablePath.split('.')[0] as string;\n formState.updateFieldValue(\n currentStep.name,\n rootKey,\n newStepValues[rootKey],\n );\n }\n } else {\n const items =\n (stepValues[repeatable.id] as Record<string, unknown>[]) || [];\n if (items.length > minCount) {\n const newItems = items.filter((_, i) => i !== index);\n formState.updateFieldValue(currentStep.name, repeatable.id, newItems);\n }\n }\n },\n [currentStep.name, stepValues, formState],\n );\n\n const validateAllSteps = useCallback((): boolean => {\n for (const step of scenario.steps) {\n const values = (formState.formValues[step.name] ?? {}) as Record<\n string,\n unknown\n >;\n const items = flattenFields(\n step.fields,\n values,\n formState.formValues as Record<string, unknown>,\n );\n for (const item of items) {\n if (item.type === 'field' && item.field.required) {\n const value = getValueByPath(values, item.path);\n if (value == null || value === '') {\n return false;\n }\n }\n }\n }\n return true;\n }, [scenario.steps, formState.formValues]);\n\n const handleGenerate = useCallback(() => {\n if (!validateAllSteps()) {\n setValidationError('Required fields are missing');\n return;\n }\n setValidationError(null);\n const aiContext = buildAiContext(scenario.steps);\n onGeneratePreview(formState.formValues, aiContext);\n }, [\n validateAllSteps,\n scenario.steps,\n formState.formValues,\n onGeneratePreview,\n ]);\n\n const handleNextStep = useCallback(() => {\n const nextIndex = stepIndex + 1;\n if (nextIndex < scenario.steps.length) {\n setStepIndex(nextIndex);\n }\n }, [stepIndex, scenario.steps.length]);\n\n const handlePrevStep = useCallback(() => {\n const prevIndex = stepIndex - 1;\n if (prevIndex >= 0) {\n setStepIndex(prevIndex);\n }\n }, [stepIndex]);\n\n const handleGoToStep = useCallback(\n (index: number) => {\n if (index >= 0 && index < scenario.steps.length) {\n setStepIndex(index);\n }\n },\n [scenario.steps.length],\n );\n\n const handleFocusToForm = useCallback(\n (item: FlatFieldItem) => {\n if (item.type === 'field') {\n const field = item.field;\n if (field.type === 'checkbox') {\n const currentValue = Boolean(getValueByPath(stepValues, item.path));\n updateValue(item.path, !currentValue);\n return;\n }\n setCurrentItem(item);\n setFocusPanel('form');\n }\n },\n [stepValues, updateValue],\n );\n\n const handleFormSubmit = useCallback(\n (value: unknown) => {\n if (currentItem?.type === 'field') {\n updateValue(currentItem.path, value);\n }\n setFocusPanel('list');\n },\n [currentItem, updateValue],\n );\n\n const handleFormCancel = useCallback(() => {\n setFocusPanel('list');\n }, []);\n\n const handleAddItem = useCallback(\n (item: FlatFieldItem) => {\n if (item.type === 'repeatable-add') {\n addRepeatableItem(item.repeatable, item.path);\n }\n },\n [addRepeatableItem],\n );\n\n const handleDeleteItem = useCallback(\n (item: FlatFieldItem) => {\n if (item.type === 'repeatable-header') {\n removeRepeatableItem(item.repeatable, item.index, item.path);\n }\n },\n [removeRepeatableItem],\n );\n\n useMount(() => {\n if (initialFormValues) {\n formState.setFormValues(initialFormValues);\n }\n });\n\n return (\n <ScenarioLayout controls={controls} status={status}>\n <StepSelector\n steps={scenario.steps}\n currentStepIndex={stepIndex}\n isFocused={focusPanel === 'steps'}\n onStepSelect={handleGoToStep}\n onFocusDown={() => setFocusPanel('list')}\n onGenerate={handleGenerate}\n onBack={onBack}\n />\n\n <Box flexGrow={1}>\n <FieldSelector\n flatItems={flatItems}\n stepValues={stepValues}\n isFocused={focusPanel === 'list'}\n isFirstStep={isFirstStep}\n isLastStep={isLastStep}\n maxHeight={fieldSelectorHeight}\n onFocusUp={() => setFocusPanel('steps')}\n onFocusToForm={handleFocusToForm}\n onAddItem={handleAddItem}\n onDeleteItem={handleDeleteItem}\n onNextStep={handleNextStep}\n onPrevStep={handlePrevStep}\n onGenerate={handleGenerate}\n onBack={onBack}\n />\n\n <FieldEditor\n key={currentItem?.type === 'field' ? currentItem.path : undefined}\n currentItem={currentItem}\n stepValues={stepValues}\n isFocused={focusPanel === 'form'}\n onSubmit={handleFormSubmit}\n onCancel={handleFormCancel}\n />\n </Box>\n </ScenarioLayout>\n );\n};\n", "import * as v from 'valibot';\nimport type {\n Field,\n FieldConditionObject,\n GroupLayout,\n LayoutField,\n RepeatableLayout,\n} from './types';\n\n// =============================================================================\n// Type Guards\n// =============================================================================\n\nexport const isLayoutField = (field: Field): field is LayoutField => {\n return field.type === 'repeatable' || field.type === 'group';\n};\n\n// =============================================================================\n// Form Field Schemas\n// =============================================================================\n\n// =============================================================================\n// Field Condition Schema\n// =============================================================================\n\n// Single field condition (supports dot notation for nested paths)\nconst FieldConditionSingleSchema = v.union([\n v.object({\n field: v.string(),\n is: v.union([\n v.string(),\n v.boolean(),\n v.array(v.union([v.string(), v.boolean()])),\n ]),\n }),\n v.object({\n field: v.string(),\n isNot: v.union([\n v.string(),\n v.boolean(),\n v.array(v.union([v.string(), v.boolean()])),\n ]),\n }),\n v.object({\n field: v.string(),\n isEmpty: v.literal(true),\n }),\n v.object({\n field: v.string(),\n isNotEmpty: v.literal(true),\n }),\n]);\n\n// Full condition schema with and/or support (recursive)\nconst FieldConditionSchema: v.GenericSchema<FieldConditionObject> = v.union([\n FieldConditionSingleSchema,\n v.object({\n and: v.array(v.lazy(() => FieldConditionSchema)),\n }),\n v.object({\n or: v.array(v.lazy(() => FieldConditionSchema)),\n }),\n]) as v.GenericSchema<FieldConditionObject>;\n\nconst FieldBaseSchema = v.object({\n id: v.string(),\n label: v.string(),\n description: v.string(),\n placeholder: v.optional(v.string()),\n required: v.optional(v.boolean()),\n when: v.optional(FieldConditionSchema),\n});\n\nexport const SelectOptionSchema = v.object({\n value: v.string(),\n label: v.string(),\n});\n\nexport const InputFieldSchema = v.object({\n ...FieldBaseSchema.entries,\n type: v.literal('input'),\n inputType: v.optional(v.picklist(['text', 'date', 'url'])),\n suggestions: v.optional(v.array(v.string())),\n default: v.optional(v.string()),\n});\n\nexport const TextareaFieldSchema = v.object({\n ...FieldBaseSchema.entries,\n type: v.literal('textarea'),\n rows: v.optional(v.number()),\n default: v.optional(v.string()),\n});\n\nexport const SelectFieldSchema = v.object({\n ...FieldBaseSchema.entries,\n type: v.literal('select'),\n options: v.array(SelectOptionSchema),\n default: v.optional(v.string()),\n});\n\nexport const CheckboxFieldSchema = v.object({\n ...FieldBaseSchema.entries,\n type: v.literal('checkbox'),\n default: v.optional(v.boolean()),\n});\n\nexport const FormFieldSchema = v.union([\n InputFieldSchema,\n TextareaFieldSchema,\n SelectFieldSchema,\n CheckboxFieldSchema,\n]);\n\n// =============================================================================\n// Layout Schemas\n// =============================================================================\n\nexport const GroupLayoutSchema: v.GenericSchema<GroupLayout> = v.object({\n type: v.literal('group'),\n fields: v.array(v.lazy(() => FieldSchema)),\n});\n\nexport const RepeatableLayoutSchema: v.GenericSchema<RepeatableLayout> =\n v.object({\n type: v.literal('repeatable'),\n id: v.string(),\n label: v.string(),\n minCount: v.optional(v.number()),\n defaultCount: v.optional(v.number()),\n field: v.union([FormFieldSchema, GroupLayoutSchema]),\n });\n\nexport const FieldSchema: v.GenericSchema<Field> = v.union([\n FormFieldSchema,\n RepeatableLayoutSchema,\n GroupLayoutSchema,\n]);\n\n// =============================================================================\n// Step Schema\n// =============================================================================\n\nexport const StepSchema = v.object({\n slug: v.string(),\n title: v.string(),\n description: v.string(),\n name: v.string(),\n fields: v.array(FieldSchema),\n});\n\n// =============================================================================\n// Scenario Schema\n// =============================================================================\n\nexport const ScenarioBaseSchema = v.object({\n id: v.string(),\n name: v.string(),\n steps: v.array(StepSchema),\n prompt: v.custom<\n (params: { formData: unknown; aiContext: unknown }) => string\n >((value) => typeof value === 'function'),\n});\n\nexport const ScenarioSchema = ScenarioBaseSchema;\n\n// =============================================================================\n// Configuration Schemas\n// =============================================================================\n\nexport const ConfigSchema = v.object({\n scenarios: v.array(ScenarioSchema),\n});\n\n// =============================================================================\n// Parser Functions\n// =============================================================================\n\nexport const parseConfig = (data: unknown) => {\n return v.parse(ConfigSchema, data);\n};\n\nexport const safeParseConfig = (data: unknown) => {\n return v.safeParse(ConfigSchema, data);\n};\n", "import type {\n AiContext,\n AiContextFieldMeta,\n AiContextRepeatable,\n AiContextStep,\n Field,\n FieldConditionObject,\n FieldConditionSingle,\n FormField,\n Step,\n} from '../../../definitions';\nimport { isLayoutField } from '../../../schema';\n\nconst getValueByPath = (\n obj: Record<string, unknown>,\n path: string,\n): unknown => {\n return path.split('.').reduce<unknown>((acc, key) => {\n if (acc == null || typeof acc !== 'object') return undefined;\n return (acc as Record<string, unknown>)[key];\n }, obj);\n};\n\nconst isSingleCondition = (\n condition: FieldConditionObject,\n): condition is FieldConditionSingle => {\n return 'field' in condition;\n};\n\nconst evaluateSingleCondition = (\n condition: FieldConditionSingle,\n itemData: Record<string, unknown>,\n rootFormData: Record<string, unknown>,\n): boolean => {\n const fieldPath = condition.field;\n let fieldValue: unknown;\n\n if (fieldPath.includes('.')) {\n fieldValue = getValueByPath(rootFormData, fieldPath);\n } else {\n fieldValue =\n itemData[fieldPath] !== undefined\n ? itemData[fieldPath]\n : getValueByPath(rootFormData, fieldPath);\n }\n\n if ('is' in condition) {\n const expected = condition.is;\n if (Array.isArray(expected)) {\n return expected.includes(fieldValue as string | boolean);\n }\n return fieldValue === expected;\n }\n\n if ('isNot' in condition) {\n const expected = condition.isNot;\n if (Array.isArray(expected)) {\n return !expected.includes(fieldValue as string | boolean);\n }\n return fieldValue !== expected;\n }\n\n if ('isEmpty' in condition) {\n return fieldValue == null || fieldValue === '' || fieldValue === false;\n }\n\n if ('isNotEmpty' in condition) {\n return fieldValue != null && fieldValue !== '' && fieldValue !== false;\n }\n\n return true;\n};\n\nexport const evaluateCondition = (\n condition: FieldConditionObject,\n itemData: Record<string, unknown>,\n rootFormData: Record<string, unknown>,\n): boolean => {\n if ('and' in condition) {\n return condition.and.every((c) =>\n evaluateCondition(c, itemData, rootFormData),\n );\n }\n\n if ('or' in condition) {\n return condition.or.some((c) =>\n evaluateCondition(c, itemData, rootFormData),\n );\n }\n\n if (isSingleCondition(condition)) {\n return evaluateSingleCondition(condition, itemData, rootFormData);\n }\n\n return true;\n};\n\nexport const isFieldVisible = (\n field: FormField,\n itemData: Record<string, unknown>,\n rootFormData?: Record<string, unknown>,\n): boolean => {\n const condition = field.when;\n if (condition == null) return true;\n\n return evaluateCondition(condition, itemData, rootFormData ?? itemData);\n};\n\nconst getLayoutFields = (field: Field): Field[] => {\n if (field.type === 'group') {\n return field.fields;\n }\n if (field.type === 'repeatable') {\n return [field.field];\n }\n return [];\n};\n\nexport const extractRequiredFieldIds = (\n fields: Field[],\n formData: Record<string, unknown>,\n): string[] => {\n const result: string[] = [];\n for (const field of fields) {\n if (field.type === 'repeatable') {\n continue;\n }\n if (isLayoutField(field)) {\n result.push(...extractRequiredFieldIds(getLayoutFields(field), formData));\n } else if (field.required === true && isFieldVisible(field, formData)) {\n result.push(field.id);\n }\n }\n return result;\n};\n\nexport const getVisibleFieldIds = (\n fields: Field[],\n formData: Record<string, unknown>,\n): string[] => {\n const result: string[] = [];\n for (const field of fields) {\n if (field.type === 'repeatable') {\n result.push(field.id);\n continue;\n }\n if (isLayoutField(field)) {\n result.push(...getVisibleFieldIds(getLayoutFields(field), formData));\n } else if (isFieldVisible(field, formData)) {\n result.push(field.id);\n }\n }\n return result;\n};\n\nconst getFieldDefaultValue = (field: FormField): unknown => {\n if (field.default != null) {\n return field.default;\n }\n return field.type === 'checkbox' ? false : '';\n};\n\nexport const buildFieldDefaults = (\n fields: Field[],\n): Record<string, unknown> => {\n const defaults: Record<string, unknown> = {};\n for (const field of fields) {\n if (field.type === 'group') {\n Object.assign(defaults, buildFieldDefaults(field.fields));\n } else if (field.type === 'repeatable') {\n const count = field.defaultCount ?? field.minCount ?? 0;\n if (field.field.type === 'group') {\n const groupFields = field.field.fields;\n defaults[field.id] = Array.from({ length: count }, () =>\n buildFieldDefaults(groupFields),\n );\n } else {\n const singleField = field.field as FormField;\n defaults[field.id] = Array.from({ length: count }, () => ({\n [singleField.id]: getFieldDefaultValue(singleField),\n }));\n }\n } else if (!isLayoutField(field)) {\n defaults[field.id] = getFieldDefaultValue(field);\n }\n }\n return defaults;\n};\n\nexport const buildFormDefaultValues = (\n steps: Step[],\n): Record<string, unknown> => {\n const defaults: Record<string, unknown> = {};\n for (const step of steps) {\n defaults[step.name] = buildFieldDefaults(step.fields);\n }\n return defaults;\n};\n\nconst buildFieldMeta = (\n field: Field,\n): AiContextFieldMeta | AiContextRepeatable | null => {\n switch (field.type) {\n case 'input':\n case 'textarea':\n case 'select':\n case 'checkbox':\n return {\n label: field.label,\n description: field.description,\n };\n\n case 'repeatable': {\n const innerField = field.field;\n if (innerField.type === 'group') {\n return buildFieldsMeta(innerField.fields);\n }\n const meta = buildFieldMeta(innerField);\n if (meta != null && 'label' in meta) {\n return { [innerField.id]: meta };\n }\n return meta;\n }\n\n case 'group':\n return buildFieldsMeta(field.fields);\n\n default:\n return null;\n }\n};\n\nconst buildFieldsMeta = (\n fields: readonly Field[],\n): AiContextRepeatable | null => {\n const result: AiContextRepeatable = {};\n\n for (const field of fields) {\n if (field.type === 'group') {\n const groupMeta = buildFieldsMeta(field.fields);\n if (groupMeta != null) {\n Object.assign(result, groupMeta);\n }\n continue;\n }\n\n if (field.type === 'repeatable') {\n const meta = buildFieldMeta(field);\n if (meta != null) {\n result[field.id] = meta;\n }\n continue;\n }\n\n const meta = buildFieldMeta(field);\n if (meta != null) {\n result[field.id] = meta;\n }\n }\n\n return Object.keys(result).length > 0 ? result : null;\n};\n\nexport const buildAiContext = (steps: Step[]): AiContext => {\n const result: AiContext = {};\n\n for (const step of steps) {\n const stepContext: AiContextStep = {\n _step: {\n title: step.title,\n description: step.description,\n },\n };\n\n const fieldsMeta = buildFieldsMeta(step.fields);\n if (fieldsMeta != null) {\n Object.assign(stepContext, fieldsMeta);\n }\n\n result[step.name] = stepContext;\n }\n\n return result;\n};\n\nexport const validateStepFields = (\n step: Step,\n stepValues: Record<string, unknown>,\n _rootFormData: Record<string, unknown>,\n): { isValid: boolean; errors: string[] } => {\n const errors: string[] = [];\n const requiredFieldIds = extractRequiredFieldIds(step.fields, stepValues);\n\n for (const fieldId of requiredFieldIds) {\n const value = stepValues[fieldId];\n if (value == null || value === '') {\n const field = findFieldById(step.fields, fieldId);\n const label = field && 'label' in field ? field.label : fieldId;\n errors.push(`${label} is required`);\n }\n }\n\n return {\n isValid: errors.length === 0,\n errors,\n };\n};\n\nconst findFieldById = (fields: Field[], fieldId: string): Field | undefined => {\n for (const field of fields) {\n if ('id' in field && field.id === fieldId) {\n return field;\n }\n if (field.type === 'group') {\n const found = findFieldById(field.fields, fieldId);\n if (found) return found;\n }\n if (field.type === 'repeatable') {\n if (field.field.type === 'group') {\n const found = findFieldById(field.field.fields, fieldId);\n if (found) return found;\n } else if (field.field.id === fieldId) {\n return field.field;\n }\n }\n }\n return undefined;\n};\n", "import type {\n Field,\n FormField,\n GroupLayout,\n RepeatableLayout,\n} from '../../../types';\nimport { buildFieldDefaults, isFieldVisible } from './services';\nimport type { FlatFieldItem } from './types';\n\nexport const getValueByPath = (\n obj: Record<string, unknown>,\n path: string,\n): unknown => {\n return path.split('.').reduce<unknown>((acc, key) => {\n if (acc == null || typeof acc !== 'object') return undefined;\n return (acc as Record<string, unknown>)[key];\n }, obj);\n};\n\nexport const setValueByPath = (\n obj: Record<string, unknown>,\n path: string,\n value: unknown,\n): Record<string, unknown> => {\n const keys = path.split('.');\n const result = { ...obj };\n let current: Record<string, unknown> = result;\n\n for (let i = 0; i < keys.length - 1; i++) {\n const key = keys[i] as string;\n if (Array.isArray(current[key])) {\n current[key] = [...(current[key] as unknown[])];\n } else {\n current[key] = { ...(current[key] as Record<string, unknown>) };\n }\n current = current[key] as Record<string, unknown>;\n }\n\n current[keys[keys.length - 1] as string] = value;\n return result;\n};\n\nexport const getRepeatableInnerFields = (\n repeatable: RepeatableLayout,\n): FormField[] => {\n if (repeatable.field.type === 'group') {\n return (repeatable.field as GroupLayout).fields.filter(\n (f): f is FormField => f.type !== 'repeatable' && f.type !== 'group',\n );\n }\n return [repeatable.field as FormField];\n};\n\n/**\n * Get all inner fields including nested repeatables\n */\nexport const getAllRepeatableInnerFields = (\n repeatable: RepeatableLayout,\n): Field[] => {\n if (repeatable.field.type === 'group') {\n return (repeatable.field as GroupLayout).fields;\n }\n return [repeatable.field];\n};\n\n/**\n * Build default values for a new repeatable item\n */\nexport const buildRepeatableItemDefaults = (\n repeatable: RepeatableLayout,\n): Record<string, unknown> => {\n if (repeatable.field.type === 'group') {\n return buildFieldDefaults(repeatable.field.fields);\n }\n const singleField = repeatable.field as FormField;\n return {\n [singleField.id]: singleField.type === 'checkbox' ? false : '',\n };\n};\n\ntype FlattenContext = {\n pathPrefix: string;\n treePrefix: string; // Prefix for items at this level (e.g., \"\u251C\u2500 \" or \"\u2502 \u251C\u2500 \")\n continuationPrefix: string; // Prefix for children (e.g., \"\u2502 \" or \"\u2502 \u2502 \")\n depth: number;\n};\n\n/**\n * Flatten nested fields into a flat list with proper tree prefixes for display\n */\nexport const flattenFields = (\n fields: Field[],\n stepValues: Record<string, unknown>,\n rootFormData: Record<string, unknown>,\n pathPrefix = '',\n _depth = 0,\n): FlatFieldItem[] => {\n return flattenFieldsInternal(fields, stepValues, rootFormData, {\n pathPrefix,\n treePrefix: '',\n continuationPrefix: '',\n depth: 0,\n });\n};\n\nconst flattenFieldsInternal = (\n fields: Field[],\n stepValues: Record<string, unknown>,\n rootFormData: Record<string, unknown>,\n ctx: FlattenContext,\n): FlatFieldItem[] => {\n const result: FlatFieldItem[] = [];\n\n for (const field of fields) {\n if (field.type === 'group') {\n result.push(\n ...flattenFieldsInternal(field.fields, stepValues, rootFormData, ctx),\n );\n } else if (field.type === 'repeatable') {\n result.push(\n ...flattenRepeatableField(field, stepValues, rootFormData, ctx),\n );\n } else {\n if (isFieldVisible(field, stepValues, rootFormData)) {\n const requiredMarker = field.required ? ' *' : '';\n result.push({\n type: 'field',\n field,\n path: ctx.pathPrefix ? `${ctx.pathPrefix}.${field.id}` : field.id,\n label: `${field.label}${requiredMarker}`,\n });\n }\n }\n }\n\n return result;\n};\n\nconst flattenRepeatableField = (\n field: RepeatableLayout,\n stepValues: Record<string, unknown>,\n rootFormData: Record<string, unknown>,\n ctx: FlattenContext,\n): FlatFieldItem[] => {\n const result: FlatFieldItem[] = [];\n const repeatablePath = ctx.pathPrefix\n ? `${ctx.pathPrefix}.${field.id}`\n : field.id;\n\n // Always access by field.id since stepValues is scoped to the current context\n const repeatableData = stepValues[field.id] as\n | Record<string, unknown>[]\n | undefined;\n const items = repeatableData || [];\n const allInnerFields = getAllRepeatableInnerFields(field);\n\n items.forEach((item, itemIndex) => {\n // Header for each repeatable item - show with treePrefix (branch indicator from parent)\n result.push({\n type: 'repeatable-header',\n repeatable: field,\n path: `${repeatablePath}.${itemIndex}`,\n index: itemIndex,\n label: `${field.label || 'Item'} #${itemIndex + 1}`,\n treePrefix: ctx.treePrefix,\n });\n\n // Process inner fields with tree prefixes\n const visibleInnerFields = allInnerFields.filter((innerField) => {\n if (innerField.type === 'repeatable' || innerField.type === 'group') {\n return true;\n }\n return isFieldVisible(\n innerField,\n item as Record<string, unknown>,\n rootFormData,\n );\n });\n\n visibleInnerFields.forEach((innerField, fieldIdx) => {\n const isLast = fieldIdx === visibleInnerFields.length - 1;\n const branchChar = isLast ? '\u2514\u2500 ' : '\u251C\u2500 ';\n const nextContinuation = isLast ? ' ' : '\u2502 ';\n const currentPrefix = ctx.continuationPrefix + branchChar;\n const childContinuation = ctx.continuationPrefix + nextContinuation;\n\n if (innerField.type === 'repeatable') {\n // Nested repeatable - header uses currentPrefix, children use childContinuation\n result.push(\n ...flattenRepeatableField(\n innerField,\n item as Record<string, unknown>,\n rootFormData,\n {\n pathPrefix: `${repeatablePath}.${itemIndex}`,\n treePrefix: currentPrefix,\n continuationPrefix: childContinuation,\n depth: ctx.depth + 1,\n },\n ),\n );\n } else if (innerField.type === 'group') {\n // Group - flatten their fields\n result.push(\n ...flattenFieldsInternal(\n innerField.fields,\n item as Record<string, unknown>,\n rootFormData,\n {\n pathPrefix: `${repeatablePath}.${itemIndex}`,\n treePrefix: currentPrefix,\n continuationPrefix: childContinuation,\n depth: ctx.depth + 1,\n },\n ),\n );\n } else {\n // Form field\n const requiredMarker = innerField.required ? ' *' : '';\n result.push({\n type: 'field',\n field: innerField,\n path: `${repeatablePath}.${itemIndex}.${innerField.id}`,\n label: `${innerField.label}${requiredMarker}`,\n treePrefix: currentPrefix,\n });\n }\n });\n });\n\n // Add button for the repeatable - at same level as headers\n result.push({\n type: 'repeatable-add',\n repeatable: field,\n path: repeatablePath,\n label: `[+] Add ${field.label || 'item'}`,\n treePrefix: ctx.treePrefix,\n });\n\n return result;\n};\n\nexport const getFieldTypeIndicator = (item: FlatFieldItem): string => {\n if (item.type !== 'field') return '';\n const field = item.field;\n switch (field.type) {\n case 'checkbox':\n return '[\u2713]';\n case 'select':\n return '[\u25BC]';\n case 'textarea':\n return '[\u2261]';\n default:\n return '[_]';\n }\n};\n\nexport const getValueDisplay = (\n item: FlatFieldItem,\n stepValues: Record<string, unknown>,\n): string => {\n if (item.type !== 'field') return '';\n const value = getValueByPath(stepValues, item.path);\n\n if (item.field.type === 'checkbox') {\n return value ? '\u2713' : '';\n }\n\n if (item.field.type === 'select') {\n const strValue = String(value ?? '');\n const option = item.field.options.find((o) => o.value === strValue);\n return option ? option.label : '';\n }\n\n const strValue = String(value ?? '');\n if (strValue.length > 20) {\n return `${strValue.slice(0, 20)}...`;\n }\n return strValue;\n};\n", "import { useCallback, useState } from 'react';\n\nimport type { Scenario, Step } from '../../definitions';\nimport {\n buildAiContext,\n buildFormDefaultValues,\n} from '../features/form/services';\nimport type { FormValues } from '../features/form/types';\n\nexport const useFormState = (scenario: Scenario) => {\n const [formValues, setFormValues] = useState<FormValues>(\n () => buildFormDefaultValues(scenario.steps) as FormValues,\n );\n\n const updateStepValues = useCallback(\n (stepName: string, values: Record<string, unknown>) => {\n setFormValues((prev) => ({\n ...prev,\n [stepName]: {\n ...prev[stepName],\n ...values,\n },\n }));\n },\n [],\n );\n\n const updateFieldValue = useCallback(\n (stepName: string, fieldId: string, value: unknown) => {\n setFormValues((prev) => ({\n ...prev,\n [stepName]: {\n ...prev[stepName],\n [fieldId]: value,\n },\n }));\n },\n [],\n );\n\n const getStepValues = useCallback(\n (step: Step): Record<string, unknown> => {\n return (formValues[step.name] ?? {}) as Record<string, unknown>;\n },\n [formValues],\n );\n\n const getAiContext = useCallback(() => {\n return buildAiContext(scenario.steps);\n }, [scenario.steps]);\n\n const resetForm = useCallback(() => {\n setFormValues(buildFormDefaultValues(scenario.steps) as FormValues);\n }, [scenario.steps]);\n\n return {\n formValues,\n setFormValues,\n updateStepValues,\n updateFieldValue,\n getStepValues,\n getAiContext,\n resetForm,\n };\n};\n", "import { spawnSync } from 'node:child_process';\nimport { mkdtempSync, readFileSync, rmSync, writeFileSync } from 'node:fs';\nimport { tmpdir } from 'node:os';\nimport { join } from 'node:path';\nimport { Box, Text, useStdin } from 'ink';\nimport { type FC, useCallback, useState } from 'react';\n\nimport type { SelectField } from '../../../../../types';\nimport {\n ACCENT_COLOR,\n type FlatFieldItem,\n} from '../../../../features/form/types';\nimport { getValueByPath } from '../../../../features/form/utils';\nimport { useControl } from '../../../../hooks/useControl';\nimport { FieldEditorContent } from './FieldEditorContent';\n\nconst getInitialEditValue = (\n currentItem: FlatFieldItem | undefined,\n stepValues: Record<string, unknown>,\n): string => {\n if (currentItem?.type !== 'field') return '';\n if (\n currentItem.field.type === 'checkbox' ||\n currentItem.field.type === 'select'\n )\n return '';\n return String(getValueByPath(stepValues, currentItem.path) ?? '');\n};\n\nconst getInitialSelectIndex = (\n currentItem: FlatFieldItem | undefined,\n stepValues: Record<string, unknown>,\n): number => {\n if (currentItem?.type !== 'field' || currentItem.field.type !== 'select')\n return 0;\n const currentValue = String(\n getValueByPath(stepValues, currentItem.path) ?? '',\n );\n const idx = currentItem.field.options.findIndex(\n (o) => o.value === currentValue,\n );\n return idx >= 0 ? idx : 0;\n};\n\nexport type FieldEditorProps = {\n currentItem: FlatFieldItem | undefined;\n stepValues: Record<string, unknown>;\n isFocused: boolean;\n onSubmit: (value: unknown) => void;\n onCancel: () => void;\n};\n\nexport const FieldEditor: FC<FieldEditorProps> = ({\n currentItem,\n stepValues,\n isFocused,\n onSubmit,\n onCancel,\n}) => {\n const [editValue, setEditValue] = useState(() =>\n getInitialEditValue(currentItem, stepValues),\n );\n const [selectIndex, setSelectIndex] = useState(() =>\n getInitialSelectIndex(currentItem, stepValues),\n );\n\n const { setRawMode, isRawModeSupported } = useStdin();\n\n const handleOpenExternalEditor = useCallback(() => {\n if (!isRawModeSupported) return;\n\n // Create temp file with current content\n const tempDir = mkdtempSync(join(tmpdir(), 'pre-claude-'));\n const tempFile = join(tempDir, 'edit.txt');\n writeFileSync(tempFile, editValue, 'utf-8');\n\n try {\n // Disable raw mode for external editor\n setRawMode(false);\n\n // Launch external editor\n // biome-ignore lint/complexity/useLiteralKeys: noPropertyAccessFromIndexSignature is enabled in tsconfig\n const editor = process.env['EDITOR'] || 'vim';\n spawnSync(editor, [tempFile], { stdio: 'inherit' });\n\n // Read edited content\n const newContent = readFileSync(tempFile, 'utf-8');\n setEditValue(newContent);\n } finally {\n // Always restore raw mode\n setRawMode(true);\n\n // Cleanup temp files\n rmSync(tempDir, { recursive: true, force: true });\n }\n }, [editValue, setRawMode, isRawModeSupported]);\n\n useControl({\n onUp: () => {\n if (!currentItem || currentItem.type !== 'field') return;\n const field = currentItem.field as SelectField;\n setSelectIndex((prev) =>\n prev > 0 ? prev - 1 : field.options.length - 1,\n );\n },\n onDown: () => {\n if (!currentItem || currentItem.type !== 'field') return;\n const field = currentItem.field as SelectField;\n setSelectIndex((prev) =>\n prev < field.options.length - 1 ? prev + 1 : 0,\n );\n },\n onEnter: () => {\n if (!currentItem || currentItem.type !== 'field') return;\n const field = currentItem.field as SelectField;\n const selectedOption = field.options[selectIndex];\n if (selectedOption) {\n onSubmit(selectedOption.value);\n }\n },\n onEscape: onCancel,\n isActive:\n isFocused &&\n currentItem?.type === 'field' &&\n currentItem.field.type === 'select',\n });\n\n const handleTextSubmit = useCallback(() => {\n onSubmit(editValue);\n }, [editValue, onSubmit]);\n\n const handleTextCancel = useCallback(() => {\n onCancel();\n }, [onCancel]);\n\n return (\n <Box\n marginLeft={1}\n width=\"50%\"\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={isFocused ? ACCENT_COLOR : undefined}\n paddingX={1}\n >\n <Box marginTop={-1} marginLeft={1}>\n <Text\n backgroundColor=\"black\"\n color={isFocused ? ACCENT_COLOR : undefined}\n bold\n >\n {' '}\n Input{' '}\n </Text>\n </Box>\n <FieldEditorContent\n currentItem={currentItem}\n stepValues={stepValues}\n isFocused={isFocused}\n editValue={editValue}\n onEditValueChange={setEditValue}\n onTextSubmit={handleTextSubmit}\n onTextCancel={handleTextCancel}\n selectIndex={selectIndex}\n onOpenExternalEditor={\n currentItem?.type === 'field' && currentItem.field.type === 'textarea'\n ? handleOpenExternalEditor\n : undefined\n }\n />\n </Box>\n );\n};\n", "import { Box, Text } from 'ink';\nimport type { FC } from 'react';\n\nimport { Checkbox } from '../../../../features/form/components/Checkbox';\nimport { Empty } from '../../../../features/form/components/Empty';\nimport { Select } from '../../../../features/form/components/Select';\nimport { TextField } from '../../../../features/form/components/TextField';\nimport type { FlatFieldItem } from '../../../../features/form/types';\nimport { getValueByPath } from '../../../../features/form/utils';\n\nexport type FieldEditorContentProps = {\n currentItem: FlatFieldItem | undefined;\n stepValues: Record<string, unknown>;\n isFocused: boolean;\n editValue: string;\n onEditValueChange: (value: string) => void;\n onTextSubmit: () => void;\n onTextCancel: () => void;\n selectIndex: number;\n onOpenExternalEditor?: () => void;\n};\n\nexport const FieldEditorContent: FC<FieldEditorContentProps> = ({\n currentItem,\n stepValues,\n isFocused,\n editValue,\n onEditValueChange,\n onTextSubmit,\n onTextCancel,\n selectIndex,\n onOpenExternalEditor,\n}) => {\n if (!currentItem) {\n return <Empty />;\n }\n\n if (currentItem.type === 'repeatable-add') {\n return (\n <Box flexDirection=\"column\">\n <Text color=\"green\">Press Enter to add item</Text>\n </Box>\n );\n }\n\n if (currentItem.type === 'repeatable-header') {\n return (\n <Box flexDirection=\"column\">\n <Text dimColor>d: delete item</Text>\n </Box>\n );\n }\n\n const field = currentItem.field;\n const value = getValueByPath(stepValues, currentItem.path);\n\n if (field.type === 'checkbox') {\n return <Checkbox checked={Boolean(value)} />;\n }\n\n if (field.type === 'select') {\n return (\n <Select\n field={field}\n currentValue={String(value ?? '')}\n selectIndex={selectIndex}\n isFocused={isFocused}\n />\n );\n }\n\n return (\n <TextField\n value={String(value ?? '')}\n editValue={editValue}\n onEditValueChange={onEditValueChange}\n onTextSubmit={onTextSubmit}\n onTextCancel={onTextCancel}\n placeholder={field.placeholder ?? ''}\n isTextarea={field.type === 'textarea'}\n isFocused={isFocused}\n suggestions={field.type === 'input' ? field.suggestions : undefined}\n onOpenExternalEditor={\n field.type === 'textarea' ? onOpenExternalEditor : undefined\n }\n />\n );\n};\n", "import { Text } from 'ink';\nimport type { FC } from 'react';\n\nexport type CheckboxProps = {\n checked: boolean;\n};\n\nexport const Checkbox: FC<CheckboxProps> = ({ checked }) => (\n <Text color={checked ? 'green' : 'gray'}>{checked ? 'ON' : 'OFF'}</Text>\n);\n", "import { Text } from 'ink';\nimport type { FC } from 'react';\n\nexport const Empty: FC = () => <Text dimColor>Select an item</Text>;\n", "import { Box, Text } from 'ink';\nimport type { FC } from 'react';\n\nimport type { SelectField } from '../../../../types';\nimport { ACCENT_COLOR } from '../types';\n\nexport type SelectProps = {\n field: SelectField;\n currentValue: string;\n selectIndex: number;\n isFocused: boolean;\n};\n\nexport const Select: FC<SelectProps> = ({\n field,\n currentValue,\n selectIndex,\n isFocused,\n}) => {\n if (isFocused) {\n return (\n <Box flexDirection=\"column\">\n {field.options.map((opt, idx) => (\n <Box key={opt.value}>\n <Text\n color={idx === selectIndex ? 'black' : undefined}\n backgroundColor={idx === selectIndex ? ACCENT_COLOR : undefined}\n >\n {' '}\n {opt.label}{' '}\n </Text>\n {opt.value === currentValue && <Text color=\"gray\"> (current)</Text>}\n </Box>\n ))}\n </Box>\n );\n }\n\n const currentOption = field.options.find((o) => o.value === currentValue);\n return (\n <Text color={currentOption ? 'white' : 'gray'}>\n {currentOption ? currentOption.label : '(not selected)'}\n </Text>\n );\n};\n", "import { Box, Text } from 'ink';\nimport type { FC } from 'react';\n\nimport { ACCENT_COLOR } from '../types';\nimport { SimpleTextInput } from './SimpleTextInput';\n\nexport type TextFieldProps = {\n value: string;\n editValue: string;\n onEditValueChange: (value: string) => void;\n onTextSubmit: () => void;\n onTextCancel: () => void;\n placeholder: string;\n isTextarea: boolean;\n isFocused: boolean;\n suggestions?: string[];\n onOpenExternalEditor?: () => void;\n};\n\nexport const TextField: FC<TextFieldProps> = ({\n value,\n editValue,\n onEditValueChange,\n onTextSubmit,\n onTextCancel,\n placeholder,\n isTextarea,\n isFocused,\n suggestions,\n onOpenExternalEditor,\n}) => {\n if (isFocused) {\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={ACCENT_COLOR}\n paddingX={1}\n minHeight={isTextarea ? 5 : 1}\n >\n <SimpleTextInput\n value={editValue}\n onChange={onEditValueChange}\n onSubmit={onTextSubmit}\n onCancel={onTextCancel}\n placeholder={placeholder}\n multiline={isTextarea}\n suggestions={suggestions}\n onOpenExternalEditor={isTextarea ? onOpenExternalEditor : undefined}\n />\n {isTextarea && (\n <Box marginTop={1}>\n <Text dimColor>Enter: newline | Ctrl+G: vim | Tab: confirm</Text>\n </Box>\n )}\n </Box>\n );\n }\n\n return <Text color={value ? 'white' : 'gray'}>{value || '(empty)'}</Text>;\n};\n", "import { Box, Text, useInput } from 'ink';\nimport { type FC, useEffect, useMemo, useState } from 'react';\n\nimport { ACCENT_COLOR } from '../types';\n\ntype SimpleTextInputProps = {\n value: string;\n onChange: (value: string) => void;\n onSubmit: () => void;\n onCancel: () => void;\n placeholder?: string;\n multiline?: boolean;\n suggestions?: string[];\n onOpenExternalEditor?: () => void;\n};\n\nconst MAX_VISIBLE_SUGGESTIONS = 5;\n\nexport const SimpleTextInput: FC<SimpleTextInputProps> = ({\n value,\n onChange,\n onSubmit,\n onCancel,\n placeholder = '',\n multiline = false,\n suggestions = [],\n onOpenExternalEditor,\n}) => {\n const [cursorPosition, setCursorPosition] = useState(value.length);\n const [suggestionIndex, setSuggestionIndex] = useState(-1);\n const [scrollOffset, setScrollOffset] = useState(0);\n\n const filteredSuggestions =\n !multiline && suggestions.length > 0\n ? suggestions.filter(\n (s) =>\n s.toLowerCase().includes(value.toLowerCase()) &&\n s.toLowerCase() !== value.toLowerCase(),\n )\n : [];\n\n const hasSuggestions = filteredSuggestions.length > 0;\n\n // Reset suggestion index and scroll when filtered suggestions change\n useEffect(() => {\n if (filteredSuggestions.length === 0) {\n setSuggestionIndex(-1);\n setScrollOffset(0);\n } else if (suggestionIndex >= filteredSuggestions.length) {\n setSuggestionIndex(filteredSuggestions.length - 1);\n }\n }, [filteredSuggestions.length, suggestionIndex]);\n\n // Adjust scroll offset to keep selected item visible\n useEffect(() => {\n if (suggestionIndex < 0) return;\n\n if (suggestionIndex < scrollOffset) {\n setScrollOffset(suggestionIndex);\n } else if (suggestionIndex >= scrollOffset + MAX_VISIBLE_SUGGESTIONS) {\n setScrollOffset(suggestionIndex - MAX_VISIBLE_SUGGESTIONS + 1);\n }\n }, [suggestionIndex, scrollOffset]);\n\n // Calculate visible suggestions based on scroll offset\n const visibleSuggestions = useMemo(() => {\n return filteredSuggestions.slice(\n scrollOffset,\n scrollOffset + MAX_VISIBLE_SUGGESTIONS,\n );\n }, [filteredSuggestions, scrollOffset]);\n\n const acceptSuggestion = (index: number) => {\n const suggestion = filteredSuggestions[index];\n if (suggestion) {\n onChange(suggestion);\n setCursorPosition(suggestion.length);\n setSuggestionIndex(-1);\n }\n };\n\n useInput((input, key) => {\n if (key.escape) {\n if (suggestionIndex >= 0) {\n setSuggestionIndex(-1);\n return;\n }\n onCancel();\n return;\n }\n\n // Ctrl+G: open external editor (textarea only)\n if (multiline && key.ctrl && input === 'g') {\n onOpenExternalEditor?.();\n return;\n }\n\n // Up/Down arrow for suggestion navigation (single-line mode with suggestions)\n if (!multiline && hasSuggestions) {\n if (key.upArrow) {\n setSuggestionIndex((prev) =>\n prev <= 0 ? filteredSuggestions.length - 1 : prev - 1,\n );\n return;\n }\n if (key.downArrow) {\n setSuggestionIndex((prev) =>\n prev >= filteredSuggestions.length - 1 ? 0 : prev + 1,\n );\n return;\n }\n }\n\n // Tab accepts current suggestion or moves to next\n if (key.tab) {\n if (multiline) {\n onSubmit();\n return;\n }\n if (hasSuggestions) {\n if (suggestionIndex >= 0) {\n // Accept current selection\n acceptSuggestion(suggestionIndex);\n } else {\n // Select first suggestion\n setSuggestionIndex(0);\n }\n return;\n }\n onSubmit();\n return;\n }\n\n if (key.return) {\n if (multiline) {\n if (key.ctrl) {\n onSubmit();\n return;\n }\n const newValue = `${value.slice(0, cursorPosition)}\\n${value.slice(cursorPosition)}`;\n onChange(newValue);\n setCursorPosition(cursorPosition + 1);\n return;\n }\n // Accept selected suggestion on Enter\n if (suggestionIndex >= 0 && filteredSuggestions[suggestionIndex]) {\n acceptSuggestion(suggestionIndex);\n return;\n }\n setSuggestionIndex(-1);\n onSubmit();\n return;\n }\n\n if (key.backspace || key.delete) {\n if (cursorPosition > 0) {\n const newValue =\n value.slice(0, cursorPosition - 1) + value.slice(cursorPosition);\n onChange(newValue);\n setCursorPosition(cursorPosition - 1);\n setSuggestionIndex(-1);\n }\n return;\n }\n\n if (key.leftArrow) {\n setCursorPosition(Math.max(0, cursorPosition - 1));\n return;\n }\n\n if (key.rightArrow) {\n setCursorPosition(Math.min(value.length, cursorPosition + 1));\n return;\n }\n\n if (multiline && key.upArrow) {\n const lines = value.slice(0, cursorPosition).split('\\n');\n if (lines.length > 1) {\n const currentLineLength = lines[lines.length - 1]?.length ?? 0;\n const prevLineLength = lines[lines.length - 2]?.length ?? 0;\n const newColPosition = Math.min(currentLineLength, prevLineLength);\n const newPosition =\n cursorPosition -\n currentLineLength -\n 1 -\n prevLineLength +\n newColPosition;\n setCursorPosition(Math.max(0, newPosition));\n }\n return;\n }\n\n if (multiline && key.downArrow) {\n const beforeCursor = value.slice(0, cursorPosition);\n const afterCursor = value.slice(cursorPosition);\n const linesBeforeCursor = beforeCursor.split('\\n');\n const currentLineLength =\n linesBeforeCursor[linesBeforeCursor.length - 1]?.length ?? 0;\n const linesAfterCursor = afterCursor.split('\\n');\n if (linesAfterCursor.length > 1) {\n const restOfCurrentLine = linesAfterCursor[0]?.length ?? 0;\n const nextLineLength = linesAfterCursor[1]?.length ?? 0;\n const newColPosition = Math.min(currentLineLength, nextLineLength);\n const newPosition =\n cursorPosition + restOfCurrentLine + 1 + newColPosition;\n setCursorPosition(Math.min(value.length, newPosition));\n }\n return;\n }\n\n if (input && !key.ctrl && !key.meta) {\n const newValue =\n value.slice(0, cursorPosition) + input + value.slice(cursorPosition);\n onChange(newValue);\n setCursorPosition(cursorPosition + input.length);\n setSuggestionIndex(-1);\n }\n });\n\n const displayValue = value || placeholder;\n const isPlaceholder = !value && placeholder;\n\n if (multiline) {\n const lines = displayValue.split('\\n');\n let charCount = 0;\n\n return (\n <Box flexDirection=\"column\">\n {lines.map((line, lineIndex) => {\n const lineStart = charCount;\n const lineEnd = charCount + line.length;\n charCount = lineEnd + 1;\n\n const cursorInLine =\n cursorPosition >= lineStart && cursorPosition <= lineEnd;\n const cursorCol = cursorPosition - lineStart;\n\n if (cursorInLine) {\n return (\n <Box key={lineIndex}>\n <Text color={isPlaceholder ? 'gray' : 'white'}>\n {line.slice(0, cursorCol)}\n </Text>\n <Text backgroundColor=\"white\" color=\"black\">\n {line[cursorCol] || ' '}\n </Text>\n <Text color={isPlaceholder ? 'gray' : 'white'}>\n {line.slice(cursorCol + 1)}\n </Text>\n </Box>\n );\n }\n\n return (\n <Text key={lineIndex} color={isPlaceholder ? 'gray' : 'white'}>\n {line || ' '}\n </Text>\n );\n })}\n </Box>\n );\n }\n\n // Highlight matching part in suggestion\n const highlightMatch = (suggestion: string, query: string) => {\n if (!query) return suggestion;\n const lowerSuggestion = suggestion.toLowerCase();\n const lowerQuery = query.toLowerCase();\n const matchIndex = lowerSuggestion.indexOf(lowerQuery);\n if (matchIndex === -1) return suggestion;\n\n const before = suggestion.slice(0, matchIndex);\n const match = suggestion.slice(matchIndex, matchIndex + query.length);\n const after = suggestion.slice(matchIndex + query.length);\n\n return { before, match, after };\n };\n\n return (\n <Box flexDirection=\"column\">\n <Box>\n <Text color={isPlaceholder ? 'gray' : 'white'}>\n {displayValue.slice(0, cursorPosition)}\n </Text>\n <Text backgroundColor=\"white\" color=\"black\">\n {displayValue[cursorPosition] || ' '}\n </Text>\n <Text color={isPlaceholder ? 'gray' : 'white'}>\n {displayValue.slice(cursorPosition + 1)}\n </Text>\n </Box>\n {hasSuggestions && (\n <Box flexDirection=\"column\" marginTop={1}>\n <Text dimColor>\u2191\u2193: select Tab/Enter: accept</Text>\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor=\"gray\"\n paddingX={1}\n >\n {visibleSuggestions.map((suggestion, visibleIndex) => {\n const actualIndex = scrollOffset + visibleIndex;\n const isSelected = actualIndex === suggestionIndex;\n const parts = highlightMatch(suggestion, value);\n\n if (typeof parts === 'string') {\n return (\n <Box key={suggestion}>\n <Text\n color={isSelected ? 'black' : undefined}\n backgroundColor={isSelected ? ACCENT_COLOR : undefined}\n >\n {isSelected ? '> ' : ' '}\n {parts}\n </Text>\n </Box>\n );\n }\n\n return (\n <Box key={suggestion}>\n <Text\n color={isSelected ? 'black' : undefined}\n backgroundColor={isSelected ? ACCENT_COLOR : undefined}\n >\n {isSelected ? '> ' : ' '}\n </Text>\n <Text\n color={isSelected ? 'black' : 'gray'}\n backgroundColor={isSelected ? ACCENT_COLOR : undefined}\n >\n {parts.before}\n </Text>\n <Text\n color={isSelected ? 'black' : 'yellow'}\n backgroundColor={isSelected ? ACCENT_COLOR : undefined}\n bold={!isSelected}\n >\n {parts.match}\n </Text>\n <Text\n color={isSelected ? 'black' : 'gray'}\n backgroundColor={isSelected ? ACCENT_COLOR : undefined}\n >\n {parts.after}\n </Text>\n </Box>\n );\n })}\n </Box>\n </Box>\n )}\n </Box>\n );\n};\n", "import { Box, Text } from 'ink';\nimport { type FC, useState } from 'react';\n\nimport {\n ACCENT_COLOR,\n type FlatFieldItem,\n} from '../../../../features/form/types';\nimport {\n getFieldTypeIndicator,\n getValueDisplay,\n} from '../../../../features/form/utils';\nimport { useControl } from '../../../../hooks/useControl';\nimport { adjustScrollOffset } from '../../../../utils/scroll';\n\nexport type FieldSelectorProps = {\n flatItems: FlatFieldItem[];\n stepValues: Record<string, unknown>;\n isFocused: boolean;\n isFirstStep: boolean;\n isLastStep: boolean;\n maxHeight: number;\n onFocusUp: () => void;\n onFocusToForm: (item: FlatFieldItem, index: number) => void;\n onAddItem: (item: FlatFieldItem) => void;\n onDeleteItem: (item: FlatFieldItem) => void;\n onNextStep: () => void;\n onPrevStep: () => void;\n onGenerate: () => void;\n onBack: () => void;\n};\n\nexport const FieldSelector: FC<FieldSelectorProps> = ({\n flatItems,\n stepValues,\n isFocused,\n isFirstStep,\n isLastStep,\n maxHeight,\n onFocusUp,\n onFocusToForm,\n onAddItem,\n onDeleteItem,\n onNextStep,\n onPrevStep,\n onGenerate,\n onBack,\n}) => {\n const [selectedIndex, setSelectedIndex] = useState(0);\n const [scrollOffset, setScrollOffset] = useState(0);\n\n const validIndex = Math.min(selectedIndex, Math.max(0, flatItems.length - 1));\n const currentItem = flatItems[validIndex];\n\n // Account for borders (2 lines) and title (1 line)\n const maxVisibleItems = Math.max(3, maxHeight - 3);\n\n const visibleItems = flatItems.slice(\n scrollOffset,\n scrollOffset + maxVisibleItems,\n );\n\n const hasMoreAbove = scrollOffset > 0;\n const hasMoreBelow = scrollOffset + maxVisibleItems < flatItems.length;\n\n useControl({\n onUp: () => {\n if (selectedIndex === 0) {\n onFocusUp();\n return;\n }\n const newIndex = selectedIndex - 1;\n setSelectedIndex(newIndex);\n setScrollOffset((prev) =>\n adjustScrollOffset(newIndex, prev, maxVisibleItems),\n );\n },\n onDown: () => {\n const newIndex =\n selectedIndex < flatItems.length - 1 ? selectedIndex + 1 : 0;\n setSelectedIndex(newIndex);\n setScrollOffset((prev) =>\n adjustScrollOffset(newIndex, prev, maxVisibleItems),\n );\n },\n onEnter: () => {\n if (!currentItem) return;\n if (currentItem.type === 'repeatable-add') {\n onAddItem(currentItem);\n } else if (currentItem.type === 'field') {\n onFocusToForm(currentItem, validIndex);\n }\n },\n onDelete: () => {\n if (currentItem?.type === 'repeatable-header') {\n onDeleteItem(currentItem);\n }\n },\n onNext: () => {\n if (!isLastStep) {\n onNextStep();\n }\n },\n onPrev: () => {\n if (!isFirstStep) {\n onPrevStep();\n }\n },\n onGenerate,\n onEscape: onBack,\n onQuit: onBack,\n isActive: isFocused,\n });\n\n return (\n <Box\n width=\"50%\"\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={isFocused ? ACCENT_COLOR : undefined}\n paddingX={1}\n >\n <Box marginTop={-1} marginLeft={1}>\n <Text\n backgroundColor=\"black\"\n color={isFocused ? ACCENT_COLOR : undefined}\n bold\n >\n {' '}\n Fields{' '}\n </Text>\n </Box>\n <Box flexDirection=\"column\" overflowY=\"hidden\">\n {hasMoreAbove && <Text dimColor>\u2191 more</Text>}\n {visibleItems.map((item, visibleIndex) => {\n const actualIndex = scrollOffset + visibleIndex;\n const isSelected = actualIndex === validIndex;\n const valueDisplay = getValueDisplay(item, stepValues);\n const typeIndicator = getFieldTypeIndicator(item);\n\n const treePrefix = item.treePrefix || '';\n\n if (item.type === 'repeatable-add') {\n return (\n <Box key={`add-${item.path}`}>\n <Text color=\"gray\">{treePrefix}</Text>\n <Text\n color={isSelected && isFocused ? 'black' : 'green'}\n backgroundColor={\n isSelected && isFocused ? ACCENT_COLOR : undefined\n }\n >\n {item.label}\n </Text>\n </Box>\n );\n }\n\n if (item.type === 'repeatable-header') {\n return (\n <Box key={`header-${item.path}`}>\n <Text color=\"gray\">{treePrefix}</Text>\n <Text\n color={isSelected && isFocused ? 'black' : ACCENT_COLOR}\n backgroundColor={\n isSelected && isFocused ? ACCENT_COLOR : undefined\n }\n bold\n >\n {item.label}\n </Text>\n </Box>\n );\n }\n\n return (\n <Box key={item.path}>\n <Text color=\"gray\">{treePrefix}</Text>\n <Text\n color={isSelected && isFocused ? 'black' : undefined}\n backgroundColor={\n isSelected && isFocused ? ACCENT_COLOR : undefined\n }\n >\n {typeIndicator} {item.label}\n </Text>\n {valueDisplay && <Text color=\"gray\"> : {valueDisplay}</Text>}\n </Box>\n );\n })}\n {hasMoreBelow && <Text dimColor>\u2193 more</Text>}\n </Box>\n </Box>\n );\n};\n", "/**\n * Adjusts scroll offset to keep the selected item visible within the viewport.\n */\nexport const adjustScrollOffset = (\n newIndex: number,\n currentOffset: number,\n maxVisible: number,\n): number => {\n if (newIndex < currentOffset) {\n return newIndex;\n }\n if (newIndex >= currentOffset + maxVisible) {\n return newIndex - maxVisible + 1;\n }\n return currentOffset;\n};\n", "import { Box, Text } from 'ink';\nimport type { FC } from 'react';\n\nimport type { Step } from '../../../../../types';\nimport { ACCENT_COLOR } from '../../../../features/form/types';\nimport { useControl } from '../../../../hooks/useControl';\n\nexport type StepSelectorProps = {\n steps: Step[];\n currentStepIndex: number;\n isFocused: boolean;\n onStepSelect: (stepIndex: number) => void;\n onFocusDown: () => void;\n onGenerate: () => void;\n onBack: () => void;\n};\n\nexport const StepSelector: FC<StepSelectorProps> = ({\n steps,\n currentStepIndex,\n isFocused,\n onStepSelect,\n onFocusDown,\n onGenerate,\n onBack,\n}) => {\n useControl({\n onLeft: () => {\n const prevIndex =\n currentStepIndex > 0 ? currentStepIndex - 1 : steps.length - 1;\n onStepSelect(prevIndex);\n },\n onRight: () => {\n const nextIndex =\n currentStepIndex < steps.length - 1 ? currentStepIndex + 1 : 0;\n onStepSelect(nextIndex);\n },\n onEnter: onFocusDown,\n onDown: onFocusDown,\n onGenerate,\n onEscape: onBack,\n onQuit: onBack,\n isActive: isFocused,\n });\n\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={isFocused ? ACCENT_COLOR : undefined}\n paddingX={1}\n >\n <Box marginTop={-1} marginLeft={1}>\n <Text\n backgroundColor=\"black\"\n color={isFocused ? ACCENT_COLOR : undefined}\n bold\n >\n {' '}\n Steps{' '}\n </Text>\n </Box>\n <Box>\n {steps.map((step, idx) => {\n const isCurrentStep = idx === currentStepIndex;\n return (\n <Box key={step.name} marginRight={1}>\n <Text\n color={isCurrentStep ? ACCENT_COLOR : 'gray'}\n bold={isCurrentStep}\n inverse={isFocused && isCurrentStep}\n >\n {' '}\n {idx + 1}.{step.title}{' '}\n </Text>\n </Box>\n );\n })}\n </Box>\n </Box>\n );\n};\n", "import { Box, Text } from 'ink';\nimport { type FC, useCallback, useMemo, useState } from 'react';\n\nimport type { Scenario } from '../../../definitions';\nimport type { ControlItem } from '../../components/ControlBar';\nimport { getDocumentsForScenario } from '../../features/document/services';\nimport type { DocumentWithMetadata } from '../../features/document/types';\nimport { ACCENT_COLOR } from '../../features/form/types';\nimport { useControl } from '../../hooks/useControl';\nimport { useMount } from '../../hooks/useMount';\nimport { useTerminalHeight } from '../../hooks/useTerminalHeight';\nimport { CommonLayout } from '../../layouts/CommonLayout';\nimport { adjustScrollOffset } from '../../utils/scroll';\n\ntype FocusPanel = 'scenarios' | 'actions';\n\ntype ActionItem =\n | { type: 'new'; label: string }\n | { type: 'document'; doc: DocumentWithMetadata };\n\nexport type SelectScenarioProps = {\n scenarios: Scenario[];\n onSelectNew: (scenarioId: string) => void;\n onSelectDocument: (scenarioId: string, doc: DocumentWithMetadata) => void;\n onExit: () => void;\n};\n\nexport const SelectScenario: FC<SelectScenarioProps> = ({\n scenarios,\n onSelectNew,\n onSelectDocument,\n onExit,\n}) => {\n const [scenarioIndex, setScenarioIndex] = useState(0);\n const [actionIndex, setActionIndex] = useState(0);\n const [focusPanel, setFocusPanel] = useState<FocusPanel>('scenarios');\n const [documents, setDocuments] = useState<DocumentWithMetadata[]>([]);\n const [isLoading, setIsLoading] = useState(false);\n const [scenarioScrollOffset, setScenarioScrollOffset] = useState(0);\n const [actionScrollOffset, setActionScrollOffset] = useState(0);\n\n const { availableHeight } = useTerminalHeight();\n // Account for panel borders (2 lines) and title (1 line)\n const maxVisibleItems = Math.max(3, availableHeight - 3);\n\n const currentScenario = scenarios[scenarioIndex];\n\n const actionItems: ActionItem[] = useMemo(\n () => [\n { type: 'new', label: '[+] New Document' },\n ...documents.map((doc) => ({ type: 'document' as const, doc })),\n ],\n [documents],\n );\n\n const visibleScenarios = scenarios.slice(\n scenarioScrollOffset,\n scenarioScrollOffset + maxVisibleItems,\n );\n\n const visibleActionItems = actionItems.slice(\n actionScrollOffset,\n actionScrollOffset + maxVisibleItems,\n );\n\n const controls = useMemo<ControlItem[]>(() => {\n if (focusPanel === 'scenarios') {\n return [\n { key: '\u2191\u2193/jk', action: 'move' },\n { key: '\u2192/l/Enter', action: 'select' },\n { key: 'q', action: 'quit' },\n ];\n }\n return [\n { key: '\u2191\u2193/jk', action: 'move' },\n { key: 'Enter', action: 'open' },\n { key: '\u2190/h/Esc', action: 'back' },\n { key: 'q', action: 'quit' },\n ];\n }, [focusPanel]);\n\n const loadDocuments = useCallback(\n (index: number) => {\n const scenario = scenarios[index];\n if (scenario == null) return;\n setIsLoading(true);\n getDocumentsForScenario(scenario)\n .then((docs) => {\n setDocuments(docs);\n setActionIndex(0);\n })\n .catch(() => {\n setDocuments([]);\n })\n .finally(() => {\n setIsLoading(false);\n });\n },\n [scenarios],\n );\n\n useControl({\n onUp: () => {\n const newIndex =\n scenarioIndex > 0 ? scenarioIndex - 1 : scenarios.length - 1;\n setScenarioIndex(newIndex);\n setScenarioScrollOffset((prev) =>\n adjustScrollOffset(newIndex, prev, maxVisibleItems),\n );\n loadDocuments(newIndex);\n },\n onDown: () => {\n const newIndex =\n scenarioIndex < scenarios.length - 1 ? scenarioIndex + 1 : 0;\n setScenarioIndex(newIndex);\n setScenarioScrollOffset((prev) =>\n adjustScrollOffset(newIndex, prev, maxVisibleItems),\n );\n loadDocuments(newIndex);\n },\n onRight: () => {\n setFocusPanel('actions');\n },\n onEnter: () => {\n setFocusPanel('actions');\n },\n onQuit: onExit,\n isActive: focusPanel === 'scenarios',\n });\n\n useControl({\n onUp: () => {\n const newIndex =\n actionIndex > 0 ? actionIndex - 1 : actionItems.length - 1;\n setActionIndex(newIndex);\n setActionScrollOffset((prev) =>\n adjustScrollOffset(newIndex, prev, maxVisibleItems),\n );\n },\n onDown: () => {\n const newIndex =\n actionIndex < actionItems.length - 1 ? actionIndex + 1 : 0;\n setActionIndex(newIndex);\n setActionScrollOffset((prev) =>\n adjustScrollOffset(newIndex, prev, maxVisibleItems),\n );\n },\n onEnter: () => {\n const item = actionItems[actionIndex];\n if (item && currentScenario) {\n if (item.type === 'new') {\n onSelectNew(currentScenario.id);\n } else {\n onSelectDocument(currentScenario.id, item.doc);\n }\n }\n },\n onEscape: () => {\n setFocusPanel('scenarios');\n },\n onLeft: () => {\n setFocusPanel('scenarios');\n },\n onQuit: onExit,\n isActive: focusPanel === 'actions',\n });\n\n useMount(() => {\n loadDocuments(0);\n });\n\n const hasMoreScenariosAbove = scenarioScrollOffset > 0;\n const hasMoreScenariosBelow =\n scenarioScrollOffset + maxVisibleItems < scenarios.length;\n const hasMoreActionsAbove = actionScrollOffset > 0;\n const hasMoreActionsBelow =\n actionScrollOffset + maxVisibleItems < actionItems.length;\n\n return (\n <CommonLayout controls={controls}>\n <Box flexGrow={1}>\n <Box\n width=\"40%\"\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={focusPanel === 'scenarios' ? ACCENT_COLOR : undefined}\n paddingX={1}\n >\n <Box marginTop={-1} marginLeft={1}>\n <Text\n backgroundColor=\"black\"\n color={focusPanel === 'scenarios' ? ACCENT_COLOR : undefined}\n bold\n >\n {' '}\n Scenarios{' '}\n </Text>\n </Box>\n <Box flexDirection=\"column\" overflowY=\"hidden\">\n {hasMoreScenariosAbove && <Text dimColor>\u2191 more</Text>}\n {visibleScenarios.map((scenario, visibleIndex) => {\n const actualIndex = scenarioScrollOffset + visibleIndex;\n const isSelected = actualIndex === scenarioIndex;\n const isFocused = focusPanel === 'scenarios';\n return (\n <Box key={scenario.id}>\n <Text\n color={isSelected && isFocused ? 'black' : undefined}\n backgroundColor={\n isSelected\n ? isFocused\n ? ACCENT_COLOR\n : 'gray'\n : undefined\n }\n >\n {' '}\n {scenario.name}{' '}\n </Text>\n </Box>\n );\n })}\n {hasMoreScenariosBelow && <Text dimColor>\u2193 more</Text>}\n </Box>\n </Box>\n\n <Box\n marginLeft={1}\n width=\"60%\"\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={focusPanel === 'actions' ? ACCENT_COLOR : undefined}\n paddingX={1}\n >\n <Box marginTop={-1} marginLeft={1}>\n <Text\n backgroundColor=\"black\"\n color={focusPanel === 'actions' ? ACCENT_COLOR : undefined}\n bold\n >\n {' '}\n {currentScenario?.name ?? 'Documents'}{' '}\n </Text>\n </Box>\n <Box flexDirection=\"column\" overflowY=\"hidden\">\n {isLoading ? (\n <Text dimColor>Loading...</Text>\n ) : (\n <>\n {hasMoreActionsAbove && <Text dimColor>\u2191 more</Text>}\n {visibleActionItems.map((item, visibleIndex) => {\n const actualIndex = actionScrollOffset + visibleIndex;\n const isSelected = actualIndex === actionIndex;\n const isFocused = focusPanel === 'actions';\n const label =\n item.type === 'new' ? item.label : item.doc.filename;\n return (\n <Box key={item.type === 'new' ? 'new' : item.doc.filename}>\n <Text\n color={\n isSelected && isFocused\n ? 'black'\n : item.type === 'new'\n ? 'green'\n : undefined\n }\n backgroundColor={\n isSelected && isFocused ? ACCENT_COLOR : undefined\n }\n >\n {' '}\n {label}{' '}\n </Text>\n </Box>\n );\n })}\n {hasMoreActionsBelow && <Text dimColor>\u2193 more</Text>}\n </>\n )}\n </Box>\n </Box>\n </Box>\n </CommonLayout>\n );\n};\n", "import * as fs from 'node:fs';\nimport * as path from 'node:path';\n\nimport { defineCommand } from 'citty';\nimport { consola } from 'consola';\n\nconst CONFIG_TEMPLATE = `// For more detailed configuration examples, see:\n\nimport { defineConfig, defineScenario } from 'pre-claude';\n\nexport default defineConfig({\n scenarios: [\n defineScenario({\n id: 'default',\n name: 'Design Doc Generator',\n steps: [\n {\n slug: 'overview',\n title: 'Overview',\n description: 'Basic information about the feature',\n name: 'overview',\n fields: [\n {\n type: 'input',\n id: 'title',\n label: 'Title',\n description: 'Feature title',\n placeholder: 'Enter feature title',\n required: true,\n },\n {\n type: 'textarea',\n id: 'description',\n label: 'Description',\n description: 'Detailed description of the feature',\n placeholder: 'Describe the feature...',\n rows: 4,\n },\n {\n type: 'select',\n id: 'priority',\n label: 'Priority',\n description: 'Feature priority level',\n placeholder: 'Select priority',\n options: [\n { value: 'high', label: 'High' },\n { value: 'medium', label: 'Medium' },\n { value: 'low', label: 'Low' },\n ],\n },\n ],\n },\n ],\n filename: ({ timestamp }) => \\`\\${timestamp}.md\\`,\n prompt: ({ formData, aiContext }) =>\n \\`Generate a design doc based on the following input:\\n\\${JSON.stringify({ formData, aiContext }, null, 2)}\\`,\n }),\n ],\n});\n`;\n\nexport const initCommand = defineCommand({\n meta: {\n name: 'init',\n description: 'Create a new pre-claude.config.ts file',\n },\n args: {\n output: {\n type: 'string',\n description: 'Output file path',\n alias: 'o',\n default: 'pre-claude.config.ts',\n },\n force: {\n type: 'boolean',\n description: 'Overwrite existing file',\n alias: 'f',\n default: false,\n },\n },\n async run({ args }) {\n const outputPath = path.resolve(process.cwd(), args.output);\n\n if (fs.existsSync(outputPath) && !args.force) {\n consola.error(`File already exists: ${outputPath}`);\n consola.info('Use --force (-f) to overwrite');\n process.exit(1);\n }\n\n try {\n fs.writeFileSync(outputPath, CONFIG_TEMPLATE, 'utf-8');\n consola.success(`Config file created: ${outputPath}`);\n } catch (error) {\n consola.error('Failed to create config file:', error);\n process.exit(1);\n }\n },\n});\n", "import * as fs from 'node:fs';\nimport * as path from 'node:path';\n\nimport { defineCommand } from 'citty';\nimport { consola } from 'consola';\nimport { createJiti } from 'jiti';\n\nimport { render } from 'ink';\nimport { type Config, safeParseConfig } from '../../definitions';\nimport { App } from '../../tui/App';\n\nconst enterAlternateScreen = () => {\n process.stdout.write('\\x1b[?1049h');\n process.stdout.write('\\x1b[H');\n};\n\nconst exitAlternateScreen = () => {\n process.stdout.write('\\x1b[?1049l');\n};\n\nconst loadConfig = async (configPath: string): Promise<Config> => {\n const absolutePath = path.resolve(process.cwd(), configPath);\n\n if (!fs.existsSync(absolutePath)) {\n throw new Error(`Config file not found: ${absolutePath}`);\n }\n\n const jiti = createJiti(import.meta.url);\n const configModule = await jiti.import(absolutePath);\n const config = (configModule as { default: Config }).default;\n\n const result = safeParseConfig(config);\n if (!result.success) {\n const issues = result.issues.map((issue) => {\n const pathStr = issue.path?.map((p) => p.key).join('.') ?? '';\n return ` - ${pathStr}: ${issue.message}`;\n });\n throw new Error(`Invalid config:\\n${issues.join('\\n')}`);\n }\n\n // hooks cannot be validated with valibot, so preserve from original config\n return config;\n};\n\nexport const runCommand = defineCommand({\n meta: {\n name: 'run',\n description: 'Start the TUI to fill out forms and generate prompts',\n },\n args: {\n config: {\n type: 'string',\n description: 'Path to config file',\n alias: 'c',\n default: 'pre-claude.config.ts',\n },\n scenario: {\n type: 'string',\n description: 'Scenario ID to start with (optional)',\n alias: 's',\n },\n },\n async run({ args }) {\n const configPath = args.config;\n\n try {\n const config = await loadConfig(configPath);\n\n // Validate scenario ID if provided\n if (args.scenario != null) {\n const scenario = config.scenarios.find((s) => s.id === args.scenario);\n if (scenario == null) {\n const availableIds = config.scenarios.map((s) => s.id).join(', ');\n throw new Error(\n `Scenario \"${args.scenario}\" not found. Available: ${availableIds}`,\n );\n }\n }\n\n // Check if terminal supports raw mode\n if (process.stdin.isTTY !== true) {\n throw new Error(\n 'TUI requires an interactive terminal. Please run this command in a terminal that supports raw mode.',\n );\n }\n\n enterAlternateScreen();\n\n const { waitUntilExit } = render(\n <App config={config} initialScenarioId={args.scenario} />,\n );\n\n await waitUntilExit();\n exitAlternateScreen();\n } catch (error) {\n exitAlternateScreen();\n if (error instanceof Error) {\n consola.error(error.message);\n } else {\n consola.error('Failed to run TUI:', error);\n }\n process.exit(1);\n }\n },\n});\n"],
5
+ "mappings": "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",
6
+ "names": ["defineCommand", "Text", "useApp", "useCallback", "useState", "Box", "Text", "useStdout", "Box", "Box", "Text", "jsx", "description", "Box", "Text", "Box", "Text", "jsx", "jsxs", "jsx", "jsxs", "Box", "jsx", "jsx", "jsxs", "useStdout", "Box", "Text", "Box", "Text", "useCallback", "useMemo", "useState", "path", "meta", "getValueByPath", "path", "getValueByPath", "strValue", "useCallback", "useState", "useState", "useCallback", "join", "Box", "Text", "useCallback", "useState", "Box", "Text", "Text", "jsx", "Text", "jsx", "Box", "Text", "jsx", "jsxs", "Box", "Text", "Box", "Text", "Box", "Text", "useInput", "useEffect", "useMemo", "useState", "jsx", "jsxs", "useState", "useEffect", "useMemo", "useInput", "Box", "Text", "query", "jsx", "jsxs", "Box", "Text", "jsx", "Box", "Text", "getValueByPath", "jsx", "jsxs", "getValueByPath", "useState", "useCallback", "join", "Box", "Text", "Box", "Text", "useState", "jsx", "jsxs", "useState", "Box", "Text", "Box", "Text", "jsx", "jsxs", "Box", "Text", "jsx", "jsxs", "useState", "Text", "useMemo", "useCallback", "path", "getValueByPath", "Box", "Box", "Text", "useCallback", "useMemo", "useState", "jsx", "jsxs", "useState", "useMemo", "useCallback", "Box", "Text", "jsx", "useApp", "useState", "scenario", "useCallback", "Text", "jsx", "defineCommand", "consola", "fs", "path", "defineCommand", "consola", "render", "jsx", "enterAlternateScreen", "exitAlternateScreen", "defineCommand", "render", "consola", "defineCommand"]
7
7
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pre-claude",
3
- "version": "0.0.1",
3
+ "version": "0.0.2",
4
4
  "description": "🐍 TUI for building structured prompts for Claude",
5
5
  "keywords": [
6
6
  "cli",