pre-claude 0.0.1-beta.0 → 0.0.1-beta.3

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/README.md CHANGED
@@ -1,17 +1,20 @@
1
1
  # pre-claude
2
2
 
3
- A TUI tool for building structured prompts for Claude. Define form structures in config files, fill them out interactively in the terminal, and generate documents using your local Claude Code settings.
3
+ [日本語版](./README-ja.md)
4
+
5
+ **Pre** Claude is a tool for creating prompts via TUI when running Claude.
6
+ You can define forms in TypeScript config files and share them with your team.
4
7
 
5
8
  ## Features
6
9
 
7
- - Form structure defined in TypeScript config files
8
- - Interactive TUI for filling out prompts
9
- - Uses your local Claude Code configuration as-is
10
+ - TypeScript-based form configuration
11
+ - Interactive TUI form wizard
12
+ - Uses local Claude Code settings
10
13
 
11
14
  ## Requirements
12
15
 
13
16
  - Node.js 18+
14
- - Claude Code installed
17
+ - Claude Code
15
18
 
16
19
  ## Installation
17
20
 
@@ -103,14 +106,14 @@ export default defineConfig({
103
106
  | `name` | `string` | Yes | Display name |
104
107
  | `steps` | `Step[]` | Yes | Form wizard steps |
105
108
  | `prompt` | `function` | Yes | Prompt generator function |
106
- | `outputDir` | `string` | No | Directory for saved documents |
107
- | `filename` | `string \| function` | No | Custom filename for saved documents |
109
+ | `outputDir` | `string` | No | Output directory |
110
+ | `filename` | `string \| function` | No | Custom filename |
108
111
 
109
112
  ## Field Types
110
113
 
111
114
  ### input
112
115
 
113
- Text input field with optional type variants and autocomplete suggestions.
116
+ Single-line text input. Supports type variants (`text`, `date`, `url`) and autocomplete suggestions.
114
117
 
115
118
  ```typescript
116
119
  {
@@ -121,14 +124,14 @@ Text input field with optional type variants and autocomplete suggestions.
121
124
  placeholder: 'My Project',
122
125
  required: true,
123
126
  inputType: 'text', // 'text' | 'date' | 'url'
124
- suggestions: ['Option A', 'Option B'], // autocomplete suggestions
127
+ suggestions: ['Option A', 'Option B'],
125
128
  default: 'Default Value',
126
129
  }
127
130
  ```
128
131
 
129
132
  ### textarea
130
133
 
131
- Multi-line text input.
134
+ Multi-line text input. The `rows` property controls the display height.
132
135
 
133
136
  ```typescript
134
137
  {
@@ -143,7 +146,7 @@ Multi-line text input.
143
146
 
144
147
  ### select
145
148
 
146
- Dropdown selection.
149
+ Dropdown selection from predefined options.
147
150
 
148
151
  ```typescript
149
152
  {
@@ -162,14 +165,14 @@ Dropdown selection.
162
165
 
163
166
  ### checkbox
164
167
 
165
- Boolean toggle.
168
+ Boolean toggle for true/false values.
166
169
 
167
170
  ```typescript
168
171
  {
169
172
  id: 'agree',
170
173
  type: 'checkbox',
171
174
  label: 'I agree to the terms',
172
- description: 'You must agree to continue',
175
+ description: 'Required to continue',
173
176
  required: true,
174
177
  default: false,
175
178
  }
@@ -179,7 +182,7 @@ Boolean toggle.
179
182
 
180
183
  ### repeatable
181
184
 
182
- Dynamically add/remove field instances.
185
+ Allows dynamic addition and removal of field instances. Use `minCount` to set minimum items and `defaultCount` for initial count.
183
186
 
184
187
  ```typescript
185
188
  {
@@ -200,7 +203,7 @@ Dynamically add/remove field instances.
200
203
 
201
204
  ### group
202
205
 
203
- Visual grouping of fields.
206
+ Groups multiple fields together visually without affecting data structure.
204
207
 
205
208
  ```typescript
206
209
  {
@@ -216,7 +219,7 @@ Visual grouping of fields.
216
219
 
217
220
  Fields support conditional visibility via the `when` property.
218
221
 
219
- ### Simple Condition
222
+ ### Simple Conditions
220
223
 
221
224
  ```typescript
222
225
  // Show when priority is 'high'
@@ -238,10 +241,10 @@ Fields support conditional visibility via the `when` property.
238
241
  { ..., when: { field: 'notes', isEmpty: true } }
239
242
  ```
240
243
 
241
- ### AND Condition
244
+ ### AND / OR Conditions
242
245
 
243
246
  ```typescript
244
- // Show when both conditions are true
247
+ // AND: both conditions must be true
245
248
  {
246
249
  ...,
247
250
  when: {
@@ -251,12 +254,8 @@ Fields support conditional visibility via the `when` property.
251
254
  ]
252
255
  }
253
256
  }
254
- ```
255
257
 
256
- ### OR Condition
257
-
258
- ```typescript
259
- // Show when either condition is true
258
+ // OR: either condition must be true
260
259
  {
261
260
  ...,
262
261
  when: {
@@ -271,7 +270,6 @@ Fields support conditional visibility via the `when` property.
271
270
  ### Nested Conditions
272
271
 
273
272
  ```typescript
274
- // Complex nested condition
275
273
  {
276
274
  ...,
277
275
  when: {
@@ -288,24 +286,14 @@ Fields support conditional visibility via the `when` property.
288
286
  }
289
287
  ```
290
288
 
291
- ### Cross-Section References
289
+ ### Cross-Step References
292
290
 
293
- Use dot notation to reference fields in other steps:
291
+ Use dot notation to reference fields in other steps.
294
292
 
295
293
  ```typescript
296
294
  { ..., when: { field: 'overview.priority', is: 'high' } }
297
295
  ```
298
296
 
299
- ## Development
300
-
301
- ```bash
302
- pnpm install
303
- pnpm build
304
- pnpm dev
305
- pnpm lint:fix
306
- pnpm typecheck
307
- ```
308
-
309
297
  ## License
310
298
 
311
299
  MIT
package/dist/cli.js CHANGED
@@ -5,7 +5,7 @@ import { defineCommand as defineCommand3, runMain } from "citty";
5
5
 
6
6
  // package.json
7
7
  var name = "pre-claude";
8
- var version = "0.0.1-beta.0";
8
+ var version = "0.0.1-beta.3";
9
9
  var description = "\u{1F40D} TUI for building structured prompts for Claude";
10
10
 
11
11
  // src/cli/commands/init.ts
@@ -118,6 +118,9 @@ import { render } from "ink";
118
118
 
119
119
  // src/schema.ts
120
120
  import * as v from "valibot";
121
+ var isLayoutField = (field) => {
122
+ return field.type === "repeatable" || field.type === "group";
123
+ };
121
124
  var FieldConditionSingleSchema = v.union([
122
125
  v.object({
123
126
  field: v.string(),
@@ -834,9 +837,6 @@ import { Box as Box13, Text as Text14 } from "ink";
834
837
  import { useCallback as useCallback4, useMemo as useMemo3, useState as useState6 } from "react";
835
838
 
836
839
  // src/tui/features/form/services.ts
837
- var isLayoutField = (field) => {
838
- return field.type === "repeatable" || field.type === "group";
839
- };
840
840
  var getValueByPath = (obj, path3) => {
841
841
  return path3.split(".").reduce((acc, key) => {
842
842
  if (acc == null || typeof acc !== "object") return void 0;
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/init.ts", "../src/cli/commands/run.tsx", "../src/schema.ts", "../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/layouts/ScenarioLayout/ScenarioLayout.tsx", "../src/tui/views/ScenarioForm/ScenarioForm.tsx", "../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/views/ScenarioForm/-internal/StepSelector/StepSelector.tsx", "../src/tui/views/SelectScenario/SelectScenario.tsx"],
4
- "sourcesContent": ["import { defineCommand, runMain } from 'citty';\nimport { description, name, version } from '../../package.json';\n\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 },\n});\n\nrunMain(main);\n", "{\n \"name\": \"pre-claude\",\n \"version\": \"0.0.1-beta.0\",\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\": \"tsx 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-ja.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 \"@hono/node-server\": \"1.19.7\",\n \"@inkjs/ui\": \"2.0.0\",\n \"citty\": \"0.1.6\",\n \"consola\": \"3.4.2\",\n \"hono\": \"4.11.1\",\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 \"tsx\": \"4.20.6\",\n \"typescript\": \"5.8.3\"\n },\n \"packageManager\": \"pnpm@10.26.2\"\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// https://github.com/cut0/pre-claude/blob/main/examples\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 permissions: {\n allowSave: true,\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", "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 { 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 { Box, Text } 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 [savedFilename, setSavedFilename] = useState<string | null>(null);\n const [showDataPreview, setShowDataPreview] = useState(false);\n\n const isEditing = editingFilename != null;\n const canSave = previewContent !== '' && !isGenerating;\n const lines = previewContent.split('\\n');\n const maxVisible = 15;\n const visibleLines = lines.slice(scrollOffset, scrollOffset + maxVisible);\n\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 { key: 'i', action: 'info' },\n { key: 'q/Esc', action: 'back' },\n ],\n [canSave],\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\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: (content) => {\n setPreviewContent(content);\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 useControl({\n onEscape: () => {\n if (showDataPreview) {\n setShowDataPreview(false);\n } else {\n onBack();\n }\n },\n onQuit: onBack,\n onSave: () => {\n if (!isGenerating && !isSaving) {\n handleSave();\n }\n },\n onRegenerate: () => {\n if (!isGenerating) {\n handleGenerate();\n }\n },\n onUp: () => {\n setScrollOffset((prev) => Math.max(0, prev - 1));\n },\n onDown: () => {\n setScrollOffset((prev) => prev + 1);\n },\n onInfo: () => {\n setShowDataPreview((prev) => !prev);\n },\n });\n\n useMount(() => {\n if (previewContent === '' && !isGenerating) {\n handleGenerate();\n }\n });\n\n if (showDataPreview) {\n const formDataJson = JSON.stringify(formValues, null, 2);\n const aiContextJson = JSON.stringify(aiContext, null, 2);\n\n return (\n <ScenarioLayout controls={controls} status={status}>\n <Box flexDirection=\"row\" gap={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 {formDataJson.split('\\n').map((line, index) => (\n <Text key={index}>{line || ' '}</Text>\n ))}\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 {aiContextJson.split('\\n').map((line, index) => (\n <Text key={index}>{line || ' '}</Text>\n ))}\n </Box>\n </Box>\n <Box paddingX={1}>\n <Text dimColor>Press i or Esc to close</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 </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 for await (const chunk of generateDesignDocStream({\n scenario,\n formData,\n aiContext,\n })) {\n content += chunk.text;\n onChunk(chunk.text);\n }\n onComplete(content);\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 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 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 }\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';\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 return (\n <Box flexDirection=\"column\" padding={1}>\n <Header />\n {children}\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\nconst ASCII_LOGO = ` _ _\n _ __ _ __ ___ ___| | __ _ _ _ __| | ___\n| '_ \\\\| '__/ _ \\\\_____/ __| |/ _\\` | | | |/ _\\` |/ _ \\\\\n| |_) | | | __/_____| (__| | (_| | |_| | (_| | __/\n| .__/|_| \\\\___| \\\\___|_|\\\\__,_|\\\\__,_|\\\\__,_|\\\\___|\n|_|`;\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 flexDirection=\"column\"\n borderStyle=\"double\"\n borderColor={ACCENT_COLOR}\n paddingX={1}\n >\n <Text color={ACCENT_COLOR}>{ASCII_LOGO}</Text>\n <Box marginTop={1} justifyContent=\"flex-end\">\n <Text color={ACCENT_COLOR}>\uD83D\uDC0D {description}</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 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 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\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 height={16}>\n <FieldSelector\n flatItems={flatItems}\n stepValues={stepValues}\n isFocused={focusPanel === 'list'}\n isFirstStep={isFirstStep}\n isLastStep={isLastStep}\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 type {\n AiContext,\n AiContextFieldMeta,\n AiContextRepeatable,\n AiContextStep,\n Field,\n FieldConditionObject,\n FieldConditionSingle,\n FormField,\n LayoutField,\n Step,\n} from '../../../definitions';\n\nconst isLayoutField = (field: Field): field is LayoutField => {\n return field.type === 'repeatable' || field.type === 'group';\n};\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';\n\nexport type FieldSelectorProps = {\n flatItems: FlatFieldItem[];\n stepValues: Record<string, unknown>;\n isFocused: boolean;\n isFirstStep: boolean;\n isLastStep: boolean;\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 onFocusUp,\n onFocusToForm,\n onAddItem,\n onDeleteItem,\n onNextStep,\n onPrevStep,\n onGenerate,\n onBack,\n}) => {\n const [selectedIndex, setSelectedIndex] = useState(0);\n\n const validIndex = Math.min(selectedIndex, Math.max(0, flatItems.length - 1));\n const currentItem = flatItems[validIndex];\n\n useControl({\n onUp: () => {\n if (selectedIndex === 0) {\n onFocusUp();\n return;\n }\n setSelectedIndex((prev) => prev - 1);\n },\n onDown: () => {\n setSelectedIndex((prev) => (prev < flatItems.length - 1 ? prev + 1 : 0));\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 {flatItems.map((item, index) => {\n const isSelected = index === 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 </Box>\n </Box>\n );\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 { CommonLayout } from '../../layouts/CommonLayout';\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\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 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 loadDocuments(newIndex);\n },\n onDown: () => {\n const newIndex =\n scenarioIndex < scenarios.length - 1 ? scenarioIndex + 1 : 0;\n setScenarioIndex(newIndex);\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 setActionIndex((prev) => (prev > 0 ? prev - 1 : actionItems.length - 1));\n },\n onDown: () => {\n setActionIndex((prev) => (prev < actionItems.length - 1 ? prev + 1 : 0));\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 return (\n <CommonLayout controls={controls}>\n <Box>\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\">\n {scenarios.map((scenario, index) => {\n const isSelected = index === 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 </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\">\n {isLoading ? (\n <Text dimColor>Loading...</Text>\n ) : (\n actionItems.map((item, index) => {\n const isSelected = index === 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 )}\n </Box>\n </Box>\n </Box>\n </CommonLayout>\n );\n};\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { defineCommand, runMain } from 'citty';\nimport { description, name, version } from '../../package.json';\n\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 },\n});\n\nrunMain(main);\n", "{\n \"name\": \"pre-claude\",\n \"version\": \"0.0.1-beta.3\",\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-ja.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 * 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// https://github.com/cut0/pre-claude/blob/main/examples\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 permissions: {\n allowSave: true,\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", "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 { 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 { Box, Text } 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 [savedFilename, setSavedFilename] = useState<string | null>(null);\n const [showDataPreview, setShowDataPreview] = useState(false);\n\n const isEditing = editingFilename != null;\n const canSave = previewContent !== '' && !isGenerating;\n const lines = previewContent.split('\\n');\n const maxVisible = 15;\n const visibleLines = lines.slice(scrollOffset, scrollOffset + maxVisible);\n\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 { key: 'i', action: 'info' },\n { key: 'q/Esc', action: 'back' },\n ],\n [canSave],\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\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: (content) => {\n setPreviewContent(content);\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 useControl({\n onEscape: () => {\n if (showDataPreview) {\n setShowDataPreview(false);\n } else {\n onBack();\n }\n },\n onQuit: onBack,\n onSave: () => {\n if (!isGenerating && !isSaving) {\n handleSave();\n }\n },\n onRegenerate: () => {\n if (!isGenerating) {\n handleGenerate();\n }\n },\n onUp: () => {\n setScrollOffset((prev) => Math.max(0, prev - 1));\n },\n onDown: () => {\n setScrollOffset((prev) => prev + 1);\n },\n onInfo: () => {\n setShowDataPreview((prev) => !prev);\n },\n });\n\n useMount(() => {\n if (previewContent === '' && !isGenerating) {\n handleGenerate();\n }\n });\n\n if (showDataPreview) {\n const formDataJson = JSON.stringify(formValues, null, 2);\n const aiContextJson = JSON.stringify(aiContext, null, 2);\n\n return (\n <ScenarioLayout controls={controls} status={status}>\n <Box flexDirection=\"row\" gap={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 {formDataJson.split('\\n').map((line, index) => (\n <Text key={index}>{line || ' '}</Text>\n ))}\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 {aiContextJson.split('\\n').map((line, index) => (\n <Text key={index}>{line || ' '}</Text>\n ))}\n </Box>\n </Box>\n <Box paddingX={1}>\n <Text dimColor>Press i or Esc to close</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 </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 for await (const chunk of generateDesignDocStream({\n scenario,\n formData,\n aiContext,\n })) {\n content += chunk.text;\n onChunk(chunk.text);\n }\n onComplete(content);\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 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 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 }\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';\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 return (\n <Box flexDirection=\"column\" padding={1}>\n <Header />\n {children}\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\nconst ASCII_LOGO = ` _ _\n _ __ _ __ ___ ___| | __ _ _ _ __| | ___\n| '_ \\\\| '__/ _ \\\\_____/ __| |/ _\\` | | | |/ _\\` |/ _ \\\\\n| |_) | | | __/_____| (__| | (_| | |_| | (_| | __/\n| .__/|_| \\\\___| \\\\___|_|\\\\__,_|\\\\__,_|\\\\__,_|\\\\___|\n|_|`;\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 flexDirection=\"column\"\n borderStyle=\"double\"\n borderColor={ACCENT_COLOR}\n paddingX={1}\n >\n <Text color={ACCENT_COLOR}>{ASCII_LOGO}</Text>\n <Box marginTop={1} justifyContent=\"flex-end\">\n <Text color={ACCENT_COLOR}>\uD83D\uDC0D {description}</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 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 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\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 height={16}>\n <FieldSelector\n flatItems={flatItems}\n stepValues={stepValues}\n isFocused={focusPanel === 'list'}\n isFirstStep={isFirstStep}\n isLastStep={isLastStep}\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 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';\n\nexport type FieldSelectorProps = {\n flatItems: FlatFieldItem[];\n stepValues: Record<string, unknown>;\n isFocused: boolean;\n isFirstStep: boolean;\n isLastStep: boolean;\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 onFocusUp,\n onFocusToForm,\n onAddItem,\n onDeleteItem,\n onNextStep,\n onPrevStep,\n onGenerate,\n onBack,\n}) => {\n const [selectedIndex, setSelectedIndex] = useState(0);\n\n const validIndex = Math.min(selectedIndex, Math.max(0, flatItems.length - 1));\n const currentItem = flatItems[validIndex];\n\n useControl({\n onUp: () => {\n if (selectedIndex === 0) {\n onFocusUp();\n return;\n }\n setSelectedIndex((prev) => prev - 1);\n },\n onDown: () => {\n setSelectedIndex((prev) => (prev < flatItems.length - 1 ? prev + 1 : 0));\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 {flatItems.map((item, index) => {\n const isSelected = index === 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 </Box>\n </Box>\n );\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 { CommonLayout } from '../../layouts/CommonLayout';\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\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 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 loadDocuments(newIndex);\n },\n onDown: () => {\n const newIndex =\n scenarioIndex < scenarios.length - 1 ? scenarioIndex + 1 : 0;\n setScenarioIndex(newIndex);\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 setActionIndex((prev) => (prev > 0 ? prev - 1 : actionItems.length - 1));\n },\n onDown: () => {\n setActionIndex((prev) => (prev < actionItems.length - 1 ? prev + 1 : 0));\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 return (\n <CommonLayout controls={controls}>\n <Box>\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\">\n {scenarios.map((scenario, index) => {\n const isSelected = index === 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 </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\">\n {isLoading ? (\n <Text dimColor>Loading...</Text>\n ) : (\n actionItems.map((item, index) => {\n const isSelected = index === 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 )}\n </Box>\n </Box>\n </Box>\n </CommonLayout>\n );\n};\n"],
5
+ "mappings": "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",
6
6
  "names": ["defineCommand", "fs", "path", "defineCommand", "consola", "Text", "useCallback", "useState", "Box", "Text", "Box", "Box", "Text", "jsx", "description", "Box", "Text", "Box", "Text", "jsx", "jsxs", "jsx", "jsxs", "Box", "jsx", "jsx", "jsxs", "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", "useState", "scenario", "useCallback", "Text", "jsx", "defineCommand", "consola", "defineCommand"]
7
7
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pre-claude",
3
- "version": "0.0.1-beta.0",
3
+ "version": "0.0.1-beta.3",
4
4
  "description": "🐍 TUI for building structured prompts for Claude",
5
5
  "keywords": [
6
6
  "cli",
@@ -35,24 +35,11 @@
35
35
  "files": [
36
36
  "dist"
37
37
  ],
38
- "scripts": {
39
- "build": "pnpm build:types && pnpm build:cli",
40
- "build:cli": "tsx scripts/build-cli.ts",
41
- "build:types": "tsc src/types.ts --declaration --outDir dist --skipLibCheck --module ESNext --moduleResolution bundler --target ES2022",
42
- "dev": "pnpm build:cli && node dist/cli.js run --config examples/pre-claude-ja.config.ts",
43
- "lint:check": "biome check .",
44
- "lint:fix": "biome check --write .",
45
- "typecheck": "tsc --noEmit",
46
- "prepublishOnly": "pnpm build",
47
- "release": "pnpm build && changeset publish"
48
- },
49
38
  "dependencies": {
50
39
  "@anthropic-ai/claude-agent-sdk": "0.1.75",
51
- "@hono/node-server": "1.19.7",
52
40
  "@inkjs/ui": "2.0.0",
53
41
  "citty": "0.1.6",
54
42
  "consola": "3.4.2",
55
- "hono": "4.11.1",
56
43
  "ink": "6.6.0",
57
44
  "ink-select-input": "6.2.0",
58
45
  "jiti": "2.6.1",
@@ -67,8 +54,16 @@
67
54
  "@types/react": "19.1.8",
68
55
  "@types/react-dom": "19.1.6",
69
56
  "esbuild": "0.27.2",
70
- "tsx": "4.20.6",
71
57
  "typescript": "5.8.3"
72
58
  },
73
- "packageManager": "pnpm@10.26.2"
74
- }
59
+ "scripts": {
60
+ "build": "pnpm build:types && pnpm build:cli",
61
+ "build:cli": "node scripts/build-cli.ts",
62
+ "build:types": "tsc src/types.ts --declaration --outDir dist --skipLibCheck --module ESNext --moduleResolution bundler --target ES2022",
63
+ "dev": "pnpm build:cli && node dist/cli.js run --config examples/pre-claude-ja.config.ts",
64
+ "lint:check": "biome check .",
65
+ "lint:fix": "biome check --write .",
66
+ "typecheck": "tsc --noEmit",
67
+ "release": "pnpm build && changeset publish"
68
+ }
69
+ }