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 +24 -36
- package/dist/cli.js +4 -4
- package/dist/cli.js.map +2 -2
- package/package.json +12 -17
package/README.md
CHANGED
|
@@ -1,17 +1,20 @@
|
|
|
1
1
|
# pre-claude
|
|
2
2
|
|
|
3
|
-
|
|
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
|
-
-
|
|
8
|
-
- Interactive TUI
|
|
9
|
-
- Uses
|
|
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
|
|
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 |
|
|
107
|
-
| `filename` | `string \| function` | No | Custom filename
|
|
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
|
-
|
|
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'],
|
|
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: '
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
244
|
+
### AND / OR Conditions
|
|
242
245
|
|
|
243
246
|
```typescript
|
|
244
|
-
//
|
|
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
|
-
|
|
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-
|
|
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.
|
|
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.
|
|
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
|
-
"
|
|
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
|
+
}
|