spec-snake 0.0.1-beta.0 → 0.0.1-beta.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.ja.md CHANGED
@@ -25,10 +25,15 @@ AI を活用した設計ドキュメントジェネレーター
25
25
  ## インストール
26
26
 
27
27
  ```bash
28
- pnpm add @cut0/spec-snake
29
- ```
28
+ # npm
29
+ npm install spec-snake@beta
30
+
31
+ # yarn
32
+ yarn add spec-snake@beta
30
33
 
31
- **Note**: GitHub Packages で公開されている
34
+ # pnpm
35
+ pnpm add spec-snake@beta
36
+ ```
32
37
 
33
38
  ## 環境
34
39
 
@@ -107,32 +112,37 @@ npx spec-snake-beta start --host 0.0.0.0
107
112
  ### 設定構造
108
113
 
109
114
  ```typescript
110
- import { defineConfig, defineScenario } from '@cut0/spec-snake';
115
+ import { defineConfig, defineScenario } from "spec-snake";
111
116
 
112
117
  export default defineConfig({
113
118
  scenarios: [
114
119
  defineScenario({
115
- id: 'design-doc',
116
- name: '設計ドキュメント',
120
+ id: "design-doc",
121
+ name: "設計ドキュメント",
117
122
  steps: [
118
123
  {
119
- slug: 'overview',
120
- title: '概要',
121
- description: 'プロジェクトの概要',
124
+ slug: "overview",
125
+ title: "概要",
126
+ description: "プロジェクトの概要",
122
127
  section: {
123
- type: 'single',
124
- name: 'overview',
128
+ type: "single",
129
+ name: "overview",
125
130
  fields: [
126
- { id: 'title', type: 'input', label: 'タイトル', description: '' },
131
+ {
132
+ id: "title",
133
+ type: "input",
134
+ label: "タイトル",
135
+ description: "",
136
+ },
127
137
  ],
128
138
  },
129
139
  },
130
140
  ],
131
- prompt: '...',
132
- outputDir: 'docs',
141
+ prompt: "...",
142
+ outputDir: "docs",
133
143
  overrides: {
134
144
  filename: ({ formData, timestamp }) =>
135
- `${formData.overview?.title ?? 'untitled'}-${timestamp}.md`,
145
+ `${formData.overview?.title ?? "untitled"}-${timestamp}.md`,
136
146
  },
137
147
  }),
138
148
  ],
package/README.md CHANGED
@@ -27,10 +27,15 @@ Documents are managed based on three core concepts:
27
27
  ## Installation
28
28
 
29
29
  ```bash
30
- pnpm add @cut0/spec-snake
31
- ```
30
+ # npm
31
+ npm install spec-snake@beta
32
+
33
+ # yarn
34
+ yarn add spec-snake@beta
32
35
 
33
- **Note**: Published on GitHub Packages
36
+ # pnpm
37
+ pnpm add spec-snake@beta
38
+ ```
34
39
 
35
40
  ## Requirements
36
41
 
@@ -109,32 +114,32 @@ Also refer to [src/types.ts](./src/types.ts) for configurable options.
109
114
  ### Config Structure
110
115
 
111
116
  ```typescript
112
- import { defineConfig, defineScenario } from '@cut0/spec-snake';
117
+ import { defineConfig, defineScenario } from "spec-snake";
113
118
 
114
119
  export default defineConfig({
115
120
  scenarios: [
116
121
  defineScenario({
117
- id: 'design-doc',
118
- name: 'Design Document',
122
+ id: "design-doc",
123
+ name: "Design Document",
119
124
  steps: [
120
125
  {
121
- slug: 'overview',
122
- title: 'Overview',
123
- description: 'Project overview',
126
+ slug: "overview",
127
+ title: "Overview",
128
+ description: "Project overview",
124
129
  section: {
125
- type: 'single',
126
- name: 'overview',
130
+ type: "single",
131
+ name: "overview",
127
132
  fields: [
128
- { id: 'title', type: 'input', label: 'Title', description: '' },
133
+ { id: "title", type: "input", label: "Title", description: "" },
129
134
  ],
130
135
  },
131
136
  },
132
137
  ],
133
- prompt: '...',
134
- outputDir: 'docs',
138
+ prompt: "...",
139
+ outputDir: "docs",
135
140
  overrides: {
136
141
  filename: ({ formData, timestamp }) =>
137
- `${formData.overview?.title ?? 'untitled'}-${timestamp}.md`,
142
+ `${formData.overview?.title ?? "untitled"}-${timestamp}.md`,
138
143
  },
139
144
  }),
140
145
  ],
@@ -155,31 +160,31 @@ export default defineConfig({
155
160
 
156
161
  **`Permissions`** - Permission settings
157
162
 
158
- | Property | Type | Description |
159
- | ----------- | --------- | ------------------------------ |
160
- | `allowSave` | `boolean` | Whether to allow saving docs |
163
+ | Property | Type | Description |
164
+ | ----------- | --------- | ---------------------------- |
165
+ | `allowSave` | `boolean` | Whether to allow saving docs |
161
166
 
162
167
  **`Scenario`** - Scenario definition. Each scenario represents one document type
163
168
 
164
- | Property | Type | Required | Description |
165
- | ------------ | -------------------- | -------- | ------------------------------------ |
166
- | `id` | `string` | Yes | Unique identifier used in URL |
167
- | `name` | `string` | Yes | Display name |
168
- | `steps` | `Step[]` | Yes | Form wizard steps |
169
- | `prompt` | `string \| Function` | Yes | Prompt template sent to Claude |
170
- | `outputDir` | `string` | No | Directory for saving documents |
171
- | `aiSettings` | `AiSettings` | No | Claude Agent SDK settings |
172
- | `hooks` | `ScenarioHooks` | No | Lifecycle hooks |
173
- | `overrides` | `ScenarioOverrides` | No | Override default behaviors |
169
+ | Property | Type | Required | Description |
170
+ | ------------ | -------------------- | -------- | ------------------------------ |
171
+ | `id` | `string` | Yes | Unique identifier used in URL |
172
+ | `name` | `string` | Yes | Display name |
173
+ | `steps` | `Step[]` | Yes | Form wizard steps |
174
+ | `prompt` | `string \| Function` | Yes | Prompt template sent to Claude |
175
+ | `outputDir` | `string` | No | Directory for saving documents |
176
+ | `aiSettings` | `AiSettings` | No | Claude Agent SDK settings |
177
+ | `hooks` | `ScenarioHooks` | No | Lifecycle hooks |
178
+ | `overrides` | `ScenarioOverrides` | No | Override default behaviors |
174
179
 
175
180
  **`Step`** - Each step in the multi-step form
176
181
 
177
- | Property | Type | Required | Description |
178
- | ------------- | --------- | -------- | ---------------------------------- |
179
- | `slug` | `string` | Yes | URL-friendly identifier |
180
- | `title` | `string` | Yes | Title displayed in step header |
181
- | `description` | `string` | Yes | Description shown below title |
182
- | `section` | `Section` | Yes | Section containing step fields |
182
+ | Property | Type | Required | Description |
183
+ | ------------- | --------- | -------- | ------------------------------ |
184
+ | `slug` | `string` | Yes | URL-friendly identifier |
185
+ | `title` | `string` | Yes | Title displayed in step header |
186
+ | `description` | `string` | Yes | Description shown below title |
187
+ | `section` | `Section` | Yes | Section containing step fields |
183
188
 
184
189
  ### `Section` - Two types available
185
190
 
@@ -262,18 +267,18 @@ ArraySection - A group of fields that can have multiple entries
262
267
 
263
268
  ### `AiSettings` - Claude Agent SDK settings
264
269
 
265
- | Property | Type | Description |
266
- | --------------------------------- | --------------------------------- | --------------------------------------------------------- |
267
- | `model` | `string` | Model to use (e.g., `claude-sonnet-4-5-20250929`) |
268
- | `fallbackModel` | `string` | Fallback model |
269
- | `maxTurns` | `number` | Maximum turns |
270
- | `maxBudgetUsd` | `number` | Budget limit in USD |
270
+ | Property | Type | Description |
271
+ | --------------------------------- | --------------------------------- | ----------------------------------------------------------- |
272
+ | `model` | `string` | Model to use (e.g., `claude-sonnet-4-5-20250929`) |
273
+ | `fallbackModel` | `string` | Fallback model |
274
+ | `maxTurns` | `number` | Maximum turns |
275
+ | `maxBudgetUsd` | `number` | Budget limit in USD |
271
276
  | `tools` | `object` | Tool settings (`{ type: 'preset', preset: 'claude_code' }`) |
272
- | `allowedTools` | `string[]` | Allowed tools |
273
- | `disallowedTools` | `string[]` | Disallowed tools |
274
- | `permissionMode` | `PermissionMode` | Permission mode |
275
- | `allowDangerouslySkipPermissions` | `boolean` | Skip permission checks |
276
- | `mcpServers` | `Record<string, McpServerConfig>` | MCP server config |
277
+ | `allowedTools` | `string[]` | Allowed tools |
278
+ | `disallowedTools` | `string[]` | Disallowed tools |
279
+ | `permissionMode` | `PermissionMode` | Permission mode |
280
+ | `allowDangerouslySkipPermissions` | `boolean` | Skip permission checks |
281
+ | `mcpServers` | `Record<string, McpServerConfig>` | MCP server config |
277
282
 
278
283
  #### Available Tools
279
284
 
package/dist/cli.js CHANGED
@@ -3,15 +3,18 @@
3
3
  // src/cli/index.ts
4
4
  import { defineCommand as defineCommand3, runMain } from "citty";
5
5
 
6
+ // package.json
7
+ var version = "0.0.1-beta.2";
8
+
6
9
  // src/cli/commands/init.ts
7
10
  import * as fs from "node:fs";
8
11
  import * as path from "node:path";
9
12
  import { defineCommand } from "citty";
10
13
  import { consola } from "consola";
11
14
  var CONFIG_TEMPLATE = `// For more detailed configuration examples, see:
12
- // https://github.com/cut0/spec-snake/blob/main/examples/spec-snake.ts
15
+ // https://github.com/cut0/spec-snake/blob/main/examples
13
16
 
14
- import { defineConfig, defineScenario } from '@cut0/spec-snake';
17
+ import { defineConfig, defineScenario } from 'spec-snake';
15
18
 
16
19
  export default defineConfig({
17
20
  scenarios: [
@@ -252,7 +255,8 @@ var PermissionsSchema = v.object({
252
255
  });
253
256
  var ConfigSchema = v.object({
254
257
  scenarios: v.array(ScenarioSchema),
255
- permissions: PermissionsSchema
258
+ permissions: PermissionsSchema,
259
+ hosted: v.optional(v.boolean(), false)
256
260
  });
257
261
  var safeParseConfig = (data) => {
258
262
  return v.safeParse(ConfigSchema, data);
@@ -637,8 +641,12 @@ var buildSectionInfoMap = (steps) => {
637
641
  };
638
642
 
639
643
  // src/server/api.ts
640
- var createApiServer = (config) => {
644
+ var createApiServer = (rawConfig) => {
641
645
  const app = new Hono3();
646
+ const config = rawConfig.hosted ? {
647
+ ...rawConfig,
648
+ permissions: { ...rawConfig.permissions, allowSave: false }
649
+ } : rawConfig;
642
650
  const scenarioInfoMap = new Map(
643
651
  config.scenarios.map((scenario) => [
644
652
  scenario.id,
@@ -770,9 +778,9 @@ var startCommand = defineCommand2({
770
778
  // src/cli/index.ts
771
779
  var main = defineCommand3({
772
780
  meta: {
773
- name: "design-docs-generator",
774
- version: "0.0.1",
775
- description: "Design Docs Generator CLI"
781
+ name: "spec-snake",
782
+ version,
783
+ description: "AI-powered design document generator CLI"
776
784
  },
777
785
  subCommands: {
778
786
  init: initCommand,
package/dist/cli.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../src/cli/index.ts", "../src/cli/commands/init.ts", "../src/cli/commands/start.ts", "../src/schema.ts", "../src/server/api.ts", "../src/server/apps/docs.ts", "../src/server/helpers/docs/transform.ts", "../src/server/repositories/document.ts", "../src/server/helpers/docs/metadata.ts", "../src/server/usecases/docs/generate-doc.ts", "../src/server/apps/scenarios.ts", "../src/server/helpers/scenarios/build-form-defaults.ts", "../src/server/helpers/scenarios/build-section-info.ts"],
4
- "sourcesContent": ["import { defineCommand, runMain } from 'citty';\n\nimport { initCommand } from './commands/init';\nimport { startCommand } from './commands/start';\n\nconst main = defineCommand({\n meta: {\n name: 'design-docs-generator',\n version: '0.0.1',\n description: 'Design Docs Generator CLI',\n },\n subCommands: {\n init: initCommand,\n start: startCommand,\n },\n});\n\nrunMain(main);\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/spec-snake/blob/main/examples/spec-snake.ts\n\nimport { defineConfig, defineScenario } from '@cut0/spec-snake';\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 section: {\n type: 'single',\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 ],\n overrides: {\n filename: (params) => {\n return \\`\\${params.timestamp}.md\\`;\n },\n },\n prompt:\n 'Generate a design doc based on the following input: {{INPUT_JSON}}',\n }),\n ],\n permissions: {\n allowSave: true,\n },\n});\n`;\n\nexport const initCommand = defineCommand({\n meta: {\n name: 'init',\n description:\n 'Initialize a new spec-snake.config.ts file in the current directory',\n },\n args: {\n output: {\n type: 'string',\n description: 'Output file path',\n alias: 'o',\n default: 'spec-snake.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';\nimport * as url from 'node:url';\n\nimport { serve } from '@hono/node-server';\nimport { serveStatic } from '@hono/node-server/serve-static';\nimport { defineCommand } from 'citty';\nimport { consola } from 'consola';\nimport { createJiti } from 'jiti';\n\nimport { type Config, safeParseConfig } from '../../definitions';\nimport { createApiServer } from '../../server/api';\n\nconst getDistClientDir = (): string => {\n const __filename = url.fileURLToPath(import.meta.url);\n const __dirname = path.dirname(__filename);\n\n // \u30D3\u30EB\u30C9\u5F8C: dist/cli.js \u2192 dist/client (\u540C\u3058 dist \u914D\u4E0B)\n // \u958B\u767A\u6642: src/cli/commands/start.ts \u2192 dist/client (3\u968E\u5C64\u4E0A\u306E dist \u914D\u4E0B)\n const isBuilt = __dirname.endsWith('/dist') || __dirname.includes('/dist/');\n return isBuilt\n ? path.resolve(__dirname, 'client')\n : path.resolve(__dirname, '../../../dist/client');\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 \u306F valibot \u3067\u30D0\u30EA\u30C7\u30FC\u30B7\u30E7\u30F3\u3067\u304D\u306A\u3044\u305F\u3081\u3001\u5143\u306E config \u304B\u3089\u4FDD\u6301\n return config;\n};\n\nconst runServer = async (\n config: Config,\n options: { distDir: string; port: number; host: string },\n) => {\n consola.start('Starting server...');\n\n const app = createApiServer(config);\n\n app.use(\n '/*',\n serveStatic({\n root: options.distDir,\n rewriteRequestPath: (requestPath) => {\n const fullPath = path.join(options.distDir, requestPath);\n if (fs.existsSync(fullPath) && fs.statSync(fullPath).isFile()) {\n return requestPath;\n }\n return '/index.html';\n },\n }),\n );\n\n const server = serve(\n {\n fetch: app.fetch,\n port: options.port,\n hostname: options.host,\n },\n (info) => {\n const displayHost =\n info.address === '::1' || info.address === '127.0.0.1'\n ? 'localhost'\n : info.address;\n consola.success('Server started');\n consola.info(` \u279C Local: http://${displayHost}:${info.port}/`);\n },\n );\n\n const cleanup = () => {\n consola.info('Shutting down server...');\n server.close(() => {\n process.exit(0);\n });\n };\n\n process.on('SIGINT', cleanup);\n process.on('SIGTERM', cleanup);\n};\n\nexport const startCommand = defineCommand({\n meta: {\n name: 'start',\n description: 'Start the server with the specified config',\n },\n args: {\n config: {\n type: 'string',\n description: 'Path to config file',\n alias: 'c',\n default: 'spec-snake.config.ts',\n },\n port: {\n type: 'string',\n description: 'Port to run the server on',\n alias: 'p',\n default: '3000',\n },\n host: {\n type: 'string',\n description: 'Host to bind the server to',\n default: 'localhost',\n },\n },\n async run({ args }) {\n const configPath = args.config;\n const port = Number.parseInt(args.port, 10);\n\n consola.start(`Loading config from: ${configPath}`);\n\n try {\n const config = await loadConfig(configPath);\n consola.success(\n `Config loaded successfully (${config.scenarios.length} scenarios)`,\n );\n\n await runServer(config, {\n distDir: getDistClientDir(),\n port,\n host: args.host,\n });\n } catch (error) {\n if (error instanceof Error) {\n consola.error(error.message);\n } else {\n consola.error('Failed to start server:', error);\n }\n process.exit(1);\n }\n },\n});\n", "import * as v from 'valibot';\nimport type { Field, GridLayout, LayoutField } from './types';\n\n// =============================================================================\n// Type Guards\n// =============================================================================\n\nexport const isLayoutField = (field: Field): field is LayoutField => {\n return field.type === 'grid';\n};\n\n// =============================================================================\n// Form Field Schemas\n// =============================================================================\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});\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});\n\nexport const TextareaFieldSchema = v.object({\n ...FieldBaseSchema.entries,\n type: v.literal('textarea'),\n rows: v.optional(v.number()),\n});\n\nexport const SelectFieldSchema = v.object({\n ...FieldBaseSchema.entries,\n type: v.literal('select'),\n options: v.array(SelectOptionSchema),\n});\n\nexport const CheckboxFieldSchema = v.object({\n ...FieldBaseSchema.entries,\n type: v.literal('checkbox'),\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 GridLayoutSchema: v.GenericSchema<GridLayout> = v.object({\n type: v.literal('grid'),\n columns: v.number(),\n fields: v.array(v.lazy(() => FieldSchema)),\n});\n\nexport const FieldSchema: v.GenericSchema<Field> = v.union([\n FormFieldSchema,\n GridLayoutSchema,\n]);\n\n// =============================================================================\n// Section Schemas\n// =============================================================================\n\nexport const SingleSectionSchema = v.object({\n type: v.literal('single'),\n name: v.string(),\n fields: v.array(FieldSchema),\n});\n\nexport const ArraySectionSchema = v.object({\n type: v.literal('array'),\n name: v.string(),\n fields: v.array(FieldSchema),\n minFieldCount: v.optional(v.number()),\n});\n\nexport const SectionSchema = v.union([SingleSectionSchema, ArraySectionSchema]);\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 section: SectionSchema,\n});\n\n// =============================================================================\n// AI Settings Schemas (Claude Agent SDK)\n// =============================================================================\n\nexport const McpServerConfigSchema = v.union([\n v.object({\n type: v.optional(v.literal('stdio')),\n command: v.string(),\n args: v.optional(v.array(v.string())),\n env: v.optional(v.record(v.string(), v.string())),\n }),\n v.object({\n type: v.literal('sse'),\n url: v.string(),\n headers: v.optional(v.record(v.string(), v.string())),\n }),\n v.object({\n type: v.literal('http'),\n url: v.string(),\n headers: v.optional(v.record(v.string(), v.string())),\n }),\n]);\n\nexport const AiSettingsSchema = v.optional(\n v.object({\n model: v.optional(v.string()),\n fallbackModel: v.optional(v.string()),\n maxThinkingTokens: v.optional(v.number()),\n maxTurns: v.optional(v.number()),\n maxBudgetUsd: v.optional(v.number()),\n allowedTools: v.optional(v.array(v.string())),\n disallowedTools: v.optional(v.array(v.string())),\n tools: v.optional(\n v.union([\n v.array(v.string()),\n v.object({\n type: v.literal('preset'),\n preset: v.literal('claude_code'),\n }),\n ]),\n ),\n permissionMode: v.optional(\n v.picklist([\n 'default',\n 'acceptEdits',\n 'bypassPermissions',\n 'plan',\n 'delegate',\n 'dontAsk',\n ]),\n ),\n allowDangerouslySkipPermissions: v.optional(v.boolean()),\n mcpServers: v.optional(v.record(v.string(), McpServerConfigSchema)),\n strictMcpConfig: v.optional(v.boolean()),\n }),\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.string(),\n aiSettings: AiSettingsSchema,\n});\n\nexport const ScenarioSchema = ScenarioBaseSchema;\n\n// =============================================================================\n// Configuration Schemas\n// =============================================================================\n\nexport const PermissionsSchema = v.object({\n allowSave: v.boolean(),\n});\n\nexport const ConfigSchema = v.object({\n scenarios: v.array(ScenarioSchema),\n permissions: PermissionsSchema,\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 { Hono } from 'hono';\n\nimport type { Config } from '../definitions';\n\nimport { createDocsApp } from './apps/docs';\nimport { createScenariosApp } from './apps/scenarios';\nimport { buildSectionInfoMap } from './helpers/scenarios/build-section-info';\n\nexport const createApiServer = (config: Config) => {\n const app = new Hono();\n\n // \u30B7\u30CA\u30EA\u30AA\u3054\u3068\u306E\u60C5\u5831\u3092\u4E8B\u524D\u306B\u30D3\u30EB\u30C9\n const scenarioInfoMap = new Map(\n config.scenarios.map((scenario) => [\n scenario.id,\n {\n scenario,\n sectionInfoMap: buildSectionInfoMap(scenario.steps),\n },\n ]),\n );\n\n // Scenarios App\n const scenariosApp = createScenariosApp(config, scenarioInfoMap);\n\n // Docs App\n const docsApp = createDocsApp(config, scenarioInfoMap);\n\n // Mount sub-apps\n app.route('/', scenariosApp);\n app.route('/', docsApp);\n\n return app;\n};\n", "import { Hono } from 'hono';\nimport { createMiddleware } from 'hono/factory';\n\nimport type { Config } from '../../definitions';\nimport { transformFormData } from '../helpers/docs/transform';\nimport {\n getDocumentsForScenario,\n getFilename,\n readDocument,\n saveDocument,\n} from '../repositories/document';\nimport { generateDesignDoc } from '../usecases/docs/generate-doc';\n\nimport type { ScenarioInfoMapEntry } from './scenarios';\n\ntype Variables = {\n scenarioInfo: ScenarioInfoMapEntry;\n};\n\ntype CreateDocBody = {\n content: string;\n formData: Record<string, unknown>;\n};\n\ntype UpdateDocBody = {\n content: string;\n formData: Record<string, unknown>;\n};\n\nconst createScenarioMiddleware = (\n scenarioInfoMap: Map<string, ScenarioInfoMapEntry>,\n) =>\n createMiddleware<{ Variables: Variables }>(async (c, next) => {\n const scenarioId = c.req.param('scenarioId');\n\n if (scenarioId == null) {\n return c.json({ error: 'Scenario ID is required' }, 400);\n }\n\n const scenarioInfo = scenarioInfoMap.get(scenarioId);\n\n if (scenarioInfo == null) {\n return c.json({ error: 'Scenario not found' }, 404);\n }\n\n c.set('scenarioInfo', scenarioInfo);\n await next();\n });\n\nexport const createDocsApp = (\n config: Config,\n scenarioInfoMap: Map<string, ScenarioInfoMapEntry>,\n) => {\n const app = new Hono<{ Variables: Variables }>();\n\n app.use(\n '/api/scenarios/:scenarioId/*',\n createScenarioMiddleware(scenarioInfoMap),\n );\n\n app.get('/api/scenarios/:scenarioId/docs', async (c) => {\n const { scenario } = c.get('scenarioInfo');\n const docs = await getDocumentsForScenario(scenario);\n\n return c.json({ docs });\n });\n\n app.post('/api/scenarios/:scenarioId/docs/preview', async (c) => {\n const { scenario, sectionInfoMap } = c.get('scenarioInfo');\n\n const formData = (await c.req.json()) as Record<string, unknown>;\n const inputData = transformFormData(formData, sectionInfoMap);\n const content = await generateDesignDoc({ scenario, formData, inputData });\n\n if (scenario.hooks?.onPreview != null) {\n await scenario.hooks.onPreview({ formData, inputData, content });\n }\n\n return c.json({ success: true, content });\n });\n\n app.post('/api/scenarios/:scenarioId/docs', async (c) => {\n const scenarioId = c.req.param('scenarioId');\n const { scenario, sectionInfoMap } = c.get('scenarioInfo');\n\n if (!config.permissions.allowSave) {\n return c.json({ error: 'Save is not allowed' }, 403);\n }\n\n const { content, formData } = (await c.req.json()) as CreateDocBody;\n const inputData = transformFormData(formData, sectionInfoMap);\n const filename = getFilename(\n scenario,\n scenarioId,\n content,\n formData,\n inputData,\n );\n const { outputPath } = await saveDocument({\n scenario,\n scenarioId,\n filename,\n content,\n formData,\n });\n\n if (scenario.hooks?.onSave != null) {\n await scenario.hooks.onSave({\n content,\n filename,\n outputPath,\n formData,\n inputData,\n });\n }\n\n return c.json({ success: true, filename });\n });\n\n app.get('/api/scenarios/:scenarioId/docs/:filename', async (c) => {\n const filename = c.req.param('filename');\n const { scenario } = c.get('scenarioInfo');\n\n const result = await readDocument(scenario, filename);\n\n if (!result.success) {\n return c.json({ error: 'Document not found' }, 404);\n }\n\n return c.json({ doc: result.doc });\n });\n\n app.put('/api/scenarios/:scenarioId/docs/:filename', async (c) => {\n const scenarioId = c.req.param('scenarioId');\n const filename = c.req.param('filename');\n const { scenario, sectionInfoMap } = c.get('scenarioInfo');\n\n if (!config.permissions.allowSave) {\n return c.json({ error: 'Save is not allowed' }, 403);\n }\n\n const { content, formData } = (await c.req.json()) as UpdateDocBody;\n const inputData = transformFormData(formData, sectionInfoMap);\n const { outputPath } = await saveDocument({\n scenario,\n scenarioId,\n filename,\n content,\n formData,\n });\n\n if (scenario.hooks?.onSave != null) {\n await scenario.hooks.onSave({\n content,\n filename,\n outputPath,\n formData,\n inputData,\n });\n }\n\n return c.json({ success: true, filename });\n });\n\n return app;\n};\n", "import type { InputData } from '../../../definitions';\nimport type { SectionInfo } from '../scenarios/build-section-info';\n\nexport const transformFormData = (\n body: Record<string, unknown>,\n sectionInfoMap: Map<string, SectionInfo>,\n): InputData => {\n const items: InputData['items'] = [];\n\n for (const [sectionName, sectionValue] of Object.entries(body)) {\n const sectionInfo = sectionInfoMap.get(sectionName);\n\n if (sectionInfo == null) {\n continue;\n }\n\n const fieldInfoMap = new Map(sectionInfo.fields.map((f) => [f.id, f]));\n\n const values = (\n Array.isArray(sectionValue) ? sectionValue : [sectionValue]\n ).map((item: Record<string, unknown>) => {\n const itemValues: Array<{\n label: string;\n description: string;\n value: unknown;\n }> = Object.entries(item)\n .map(([fieldId, fieldValue]) => {\n const fieldInfo = fieldInfoMap.get(fieldId);\n if (fieldInfo) {\n return {\n label: fieldInfo.label,\n description: fieldInfo.description,\n value: fieldValue,\n };\n }\n return null;\n })\n .filter((value) => value != null);\n\n return itemValues;\n });\n\n items.push({\n title: sectionInfo.title,\n description: sectionInfo.description,\n values,\n });\n }\n\n return { items };\n};\n", "import { mkdir, readFile, readdir, writeFile } from 'node:fs/promises';\nimport { join } from 'node:path';\n\nimport type { InputData, Scenario } from '../../definitions';\nimport {\n type DocumentWithMetadata,\n addMetadataToContent,\n parseMetadata,\n} from '../helpers/docs/metadata';\n\nexport const getOutputDir = (scenario: Scenario): string => {\n return scenario.outputDir ?? join(process.cwd(), 'output');\n};\n\ntype ReadDocumentResult =\n | { success: true; doc: DocumentWithMetadata }\n | { success: false; error: 'not_found' | 'scenario_mismatch' };\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\ntype SaveDocumentOptions = {\n scenario: Scenario;\n scenarioId: string;\n filename: string;\n content: string;\n formData: Record<string, unknown>;\n};\n\nexport const saveDocument = async ({\n scenario,\n scenarioId,\n filename,\n content,\n formData,\n}: SaveDocumentOptions): Promise<{ outputPath: string }> => {\n const outputDir = getOutputDir(scenario);\n const outputPath = join(outputDir, filename);\n\n const contentWithMetadata = addMetadataToContent(content, {\n scenarioId,\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 getFilename = (\n scenario: Scenario,\n scenarioId: string,\n content: string,\n formData: Record<string, unknown>,\n inputData: InputData,\n): string => {\n const timestamp = new Date().toISOString().replace(/[:.]/g, '-');\n\n const filenameOverride = scenario.overrides?.filename;\n if (filenameOverride != null) {\n return typeof filenameOverride === 'function'\n ? filenameOverride({\n scenarioId,\n timestamp,\n content,\n formData,\n inputData,\n })\n : filenameOverride;\n }\n\n return `design-doc-${scenarioId}-${timestamp}.md`;\n};\n", "export type DocumentMetadata = {\n scenarioId: string;\n formData: Record<string, unknown>;\n};\n\nexport type DocumentWithMetadata = {\n filename: string;\n content: string;\n metadata: DocumentMetadata | null;\n};\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 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 addMetadataToContent = (\n content: string,\n metadata: DocumentMetadata,\n): string => {\n return `${content}\\n\\n${serializeMetadata(metadata)}`;\n};\n", "import {\n type Options,\n type SDKResultMessage,\n query,\n} from '@anthropic-ai/claude-agent-sdk';\n\nimport type { InputData, Scenario } from '../../../definitions';\n\ntype GenerateDesignDocParams = {\n scenario: Scenario;\n formData: Record<string, unknown>;\n inputData: InputData;\n};\n\nexport const generateDesignDoc = async ({\n scenario,\n formData,\n inputData,\n}: GenerateDesignDocParams): Promise<string> => {\n const promptTemplate =\n typeof scenario.prompt === 'function'\n ? scenario.prompt({ formData, inputData })\n : scenario.prompt;\n const prompt = promptTemplate.replace(\n '{{INPUT_JSON}}',\n JSON.stringify(inputData, null, 2),\n );\n\n let message: SDKResultMessage | null = null;\n\n for await (const msg of query({\n prompt,\n options: scenario.aiSettings as Options,\n })) {\n if (msg.type === 'result' && msg.subtype === 'success') {\n message = msg;\n }\n }\n\n if (message == null) {\n throw new Error('Query failed');\n }\n\n return message.result;\n};\n", "import { Hono } from 'hono';\n\nimport type { Config, Scenario } from '../../definitions';\nimport { buildFormDefaultValues } from '../helpers/scenarios/build-form-defaults';\nimport type { buildSectionInfoMap } from '../helpers/scenarios/build-section-info';\n\nexport type ScenarioInfo = {\n sectionInfoMap: ReturnType<typeof buildSectionInfoMap>;\n};\n\nexport type ScenarioInfoMapEntry = {\n scenario: Scenario;\n sectionInfoMap: ReturnType<typeof buildSectionInfoMap>;\n};\n\nexport const createScenariosApp = (\n config: Config,\n scenarioInfoMap: Map<string, ScenarioInfoMapEntry>,\n) => {\n const app = new Hono();\n\n // \u5168\u30B7\u30CA\u30EA\u30AA\u53D6\u5F97\n app.get('/api/scenarios', (c) => {\n return c.json({\n scenarios: config.scenarios,\n });\n });\n\n // \u5358\u4E00\u30B7\u30CA\u30EA\u30AA\u53D6\u5F97\n app.get('/api/scenarios/:scenarioId', (c) => {\n const scenarioId = c.req.param('scenarioId');\n const scenarioInfo = scenarioInfoMap.get(scenarioId);\n\n if (scenarioInfo == null) {\n return c.json({ error: 'Scenario not found' }, 404);\n }\n\n const formDefaultValues = buildFormDefaultValues(\n scenarioInfo.scenario.steps,\n );\n\n return c.json({\n scenario: scenarioInfo.scenario,\n formDefaultValues,\n permissions: config.permissions,\n });\n });\n\n return app;\n};\n", "import { type Field, type Step, isLayoutField } from '../../../definitions';\n\nexport const buildFieldDefaults = (\n fields: Field[],\n): Record<string, unknown> => {\n const getFieldDefaultValue = (field: Field): unknown => {\n if (isLayoutField(field)) {\n return undefined;\n }\n switch (field.type) {\n case 'checkbox':\n return false;\n default:\n return '';\n }\n };\n\n const defaults: Record<string, unknown> = {};\n for (const field of fields) {\n if (isLayoutField(field)) {\n Object.assign(defaults, buildFieldDefaults(field.fields));\n } else {\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 config of steps) {\n if (config.section.type === 'single') {\n defaults[config.section.name] = buildFieldDefaults(config.section.fields);\n } else {\n const minCount = config.section.minFieldCount ?? 1;\n defaults[config.section.name] = Array.from({ length: minCount }, () =>\n buildFieldDefaults(config.section.fields),\n );\n }\n }\n return defaults;\n};\n", "import { type Field, type Step, isLayoutField } from '../../../definitions';\n\nexport type FieldInfo = {\n id: string;\n label: string;\n description: string;\n};\n\nexport type SectionInfo = {\n name: string;\n title: string;\n description: string;\n fields: FieldInfo[];\n};\n\nexport const extractFieldInfos = (fields: Field[]): FieldInfo[] => {\n const result: FieldInfo[] = [];\n for (const field of fields) {\n if (isLayoutField(field)) {\n result.push(...extractFieldInfos(field.fields));\n } else {\n result.push({\n id: field.id,\n label: field.label,\n description: field.description,\n });\n }\n }\n return result;\n};\n\nexport const buildSectionInfoMap = (\n steps: Step[],\n): Map<string, SectionInfo> => {\n const sectionMap = new Map<string, SectionInfo>(\n steps.map((step) => [\n step.section.name,\n {\n name: step.section.name,\n title: step.title,\n description: step.description,\n fields: extractFieldInfos(step.section.fields),\n },\n ]),\n );\n\n return sectionMap;\n};\n"],
5
- "mappings": "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",
3
+ "sources": ["../src/cli/index.ts", "../package.json", "../src/cli/commands/init.ts", "../src/cli/commands/start.ts", "../src/schema.ts", "../src/server/api.ts", "../src/server/apps/docs.ts", "../src/server/helpers/docs/transform.ts", "../src/server/repositories/document.ts", "../src/server/helpers/docs/metadata.ts", "../src/server/usecases/docs/generate-doc.ts", "../src/server/apps/scenarios.ts", "../src/server/helpers/scenarios/build-form-defaults.ts", "../src/server/helpers/scenarios/build-section-info.ts"],
4
+ "sourcesContent": ["import { defineCommand, runMain } from 'citty';\n\nimport { version } from '../../package.json';\nimport { initCommand } from './commands/init';\nimport { startCommand } from './commands/start';\n\nconst main = defineCommand({\n meta: {\n name: 'spec-snake',\n version,\n description: 'AI-powered design document generator CLI',\n },\n subCommands: {\n init: initCommand,\n start: startCommand,\n },\n});\n\nrunMain(main);\n", "{\n \"name\": \"spec-snake\",\n \"version\": \"0.0.1-beta.2\",\n \"type\": \"module\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/cut0/spec-snake.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 \"spec-snake\": \"./dist/cli.js\"\n },\n \"files\": [\n \"dist\"\n ],\n \"scripts\": {\n \"build\": \"pnpm build:types && pnpm build:cli && pnpm build:client\",\n \"build:cli\": \"tsx scripts/build-cli.ts\",\n \"build:client\": \"vite build\",\n \"build:types\": \"tsc src/types.ts --declaration --outDir dist --skipLibCheck --module ESNext --moduleResolution bundler --target ES2022\",\n \"dev\": \"NODE_ENV=development SPEC_SNAKE_CONFIG=examples/local/spec-snake.config.ts vite\",\n \"prd\": \"pnpm build && pnpm build:client && node dist/cli.js\",\n \"i18n\": \"lingui extract && lingui compile\",\n \"i18n:compile\": \"lingui compile\",\n \"i18n:extract\": \"lingui extract\",\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 \"citty\": \"0.1.6\",\n \"consola\": \"3.4.2\",\n \"hono\": \"4.11.1\",\n \"jiti\": \"2.6.1\",\n \"valibot\": \"1.2.0\"\n },\n \"devDependencies\": {\n \"@base-ui/react\": \"1.0.0\",\n \"@biomejs/biome\": \"1.9.4\",\n \"@changesets/cli\": \"2.28.1\",\n \"@hono/vite-dev-server\": \"0.23.0\",\n \"@hookform/resolvers\": \"5.2.2\",\n \"@lingui/babel-plugin-lingui-macro\": \"5.7.0\",\n \"@lingui/cli\": \"5.7.0\",\n \"@lingui/conf\": \"5.7.0\",\n \"@lingui/core\": \"5.7.0\",\n \"@lingui/react\": \"5.7.0\",\n \"@lingui/vite-plugin\": \"5.7.0\",\n \"@tailwindcss/typography\": \"0.5.19\",\n \"@tailwindcss/vite\": \"4.1.18\",\n \"@tanstack/react-query\": \"5.35.1\",\n \"@tanstack/react-router\": \"1.141.6\",\n \"@tanstack/router-plugin\": \"1.141.7\",\n \"@types/node\": \"^25.0.3\",\n \"@types/react\": \"19.1.8\",\n \"@types/react-dom\": \"19.1.6\",\n \"@vitejs/plugin-react\": \"4.5.2\",\n \"esbuild\": \"0.27.2\",\n \"motion\": \"12.23.26\",\n \"react\": \"19.2.3\",\n \"react-dom\": \"19.2.3\",\n \"react-hook-form\": \"7.69.0\",\n \"react-markdown\": \"10.1.0\",\n \"remark-gfm\": \"4.0.1\",\n \"tailwindcss\": \"4.1.18\",\n \"tsx\": \"4.20.6\",\n \"typescript\": \"5.8.3\",\n \"vite\": \"7.3.0\",\n \"zustand\": \"5.0.9\"\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/spec-snake/blob/main/examples\n\nimport { defineConfig, defineScenario } from 'spec-snake';\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 section: {\n type: 'single',\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 ],\n overrides: {\n filename: (params) => {\n return \\`\\${params.timestamp}.md\\`;\n },\n },\n prompt:\n 'Generate a design doc based on the following input: {{INPUT_JSON}}',\n }),\n ],\n permissions: {\n allowSave: true,\n },\n});\n`;\n\nexport const initCommand = defineCommand({\n meta: {\n name: 'init',\n description:\n 'Initialize a new spec-snake.config.ts file in the current directory',\n },\n args: {\n output: {\n type: 'string',\n description: 'Output file path',\n alias: 'o',\n default: 'spec-snake.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';\nimport * as url from 'node:url';\n\nimport { serve } from '@hono/node-server';\nimport { serveStatic } from '@hono/node-server/serve-static';\nimport { defineCommand } from 'citty';\nimport { consola } from 'consola';\nimport { createJiti } from 'jiti';\n\nimport { type Config, safeParseConfig } from '../../definitions';\nimport { createApiServer } from '../../server/api';\n\nconst getDistClientDir = (): string => {\n const __filename = url.fileURLToPath(import.meta.url);\n const __dirname = path.dirname(__filename);\n\n // \u30D3\u30EB\u30C9\u5F8C: dist/cli.js \u2192 dist/client (\u540C\u3058 dist \u914D\u4E0B)\n // \u958B\u767A\u6642: src/cli/commands/start.ts \u2192 dist/client (3\u968E\u5C64\u4E0A\u306E dist \u914D\u4E0B)\n const isBuilt = __dirname.endsWith('/dist') || __dirname.includes('/dist/');\n return isBuilt\n ? path.resolve(__dirname, 'client')\n : path.resolve(__dirname, '../../../dist/client');\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 \u306F valibot \u3067\u30D0\u30EA\u30C7\u30FC\u30B7\u30E7\u30F3\u3067\u304D\u306A\u3044\u305F\u3081\u3001\u5143\u306E config \u304B\u3089\u4FDD\u6301\n return config;\n};\n\nconst runServer = async (\n config: Config,\n options: { distDir: string; port: number; host: string },\n) => {\n consola.start('Starting server...');\n\n const app = createApiServer(config);\n\n app.use(\n '/*',\n serveStatic({\n root: options.distDir,\n rewriteRequestPath: (requestPath) => {\n const fullPath = path.join(options.distDir, requestPath);\n if (fs.existsSync(fullPath) && fs.statSync(fullPath).isFile()) {\n return requestPath;\n }\n return '/index.html';\n },\n }),\n );\n\n const server = serve(\n {\n fetch: app.fetch,\n port: options.port,\n hostname: options.host,\n },\n (info) => {\n const displayHost =\n info.address === '::1' || info.address === '127.0.0.1'\n ? 'localhost'\n : info.address;\n consola.success('Server started');\n consola.info(` \u279C Local: http://${displayHost}:${info.port}/`);\n },\n );\n\n const cleanup = () => {\n consola.info('Shutting down server...');\n server.close(() => {\n process.exit(0);\n });\n };\n\n process.on('SIGINT', cleanup);\n process.on('SIGTERM', cleanup);\n};\n\nexport const startCommand = defineCommand({\n meta: {\n name: 'start',\n description: 'Start the server with the specified config',\n },\n args: {\n config: {\n type: 'string',\n description: 'Path to config file',\n alias: 'c',\n default: 'spec-snake.config.ts',\n },\n port: {\n type: 'string',\n description: 'Port to run the server on',\n alias: 'p',\n default: '3000',\n },\n host: {\n type: 'string',\n description: 'Host to bind the server to',\n default: 'localhost',\n },\n },\n async run({ args }) {\n const configPath = args.config;\n const port = Number.parseInt(args.port, 10);\n\n consola.start(`Loading config from: ${configPath}`);\n\n try {\n const config = await loadConfig(configPath);\n consola.success(\n `Config loaded successfully (${config.scenarios.length} scenarios)`,\n );\n\n await runServer(config, {\n distDir: getDistClientDir(),\n port,\n host: args.host,\n });\n } catch (error) {\n if (error instanceof Error) {\n consola.error(error.message);\n } else {\n consola.error('Failed to start server:', error);\n }\n process.exit(1);\n }\n },\n});\n", "import * as v from 'valibot';\nimport type { Field, GridLayout, LayoutField } from './types';\n\n// =============================================================================\n// Type Guards\n// =============================================================================\n\nexport const isLayoutField = (field: Field): field is LayoutField => {\n return field.type === 'grid';\n};\n\n// =============================================================================\n// Form Field Schemas\n// =============================================================================\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});\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});\n\nexport const TextareaFieldSchema = v.object({\n ...FieldBaseSchema.entries,\n type: v.literal('textarea'),\n rows: v.optional(v.number()),\n});\n\nexport const SelectFieldSchema = v.object({\n ...FieldBaseSchema.entries,\n type: v.literal('select'),\n options: v.array(SelectOptionSchema),\n});\n\nexport const CheckboxFieldSchema = v.object({\n ...FieldBaseSchema.entries,\n type: v.literal('checkbox'),\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 GridLayoutSchema: v.GenericSchema<GridLayout> = v.object({\n type: v.literal('grid'),\n columns: v.number(),\n fields: v.array(v.lazy(() => FieldSchema)),\n});\n\nexport const FieldSchema: v.GenericSchema<Field> = v.union([\n FormFieldSchema,\n GridLayoutSchema,\n]);\n\n// =============================================================================\n// Section Schemas\n// =============================================================================\n\nexport const SingleSectionSchema = v.object({\n type: v.literal('single'),\n name: v.string(),\n fields: v.array(FieldSchema),\n});\n\nexport const ArraySectionSchema = v.object({\n type: v.literal('array'),\n name: v.string(),\n fields: v.array(FieldSchema),\n minFieldCount: v.optional(v.number()),\n});\n\nexport const SectionSchema = v.union([SingleSectionSchema, ArraySectionSchema]);\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 section: SectionSchema,\n});\n\n// =============================================================================\n// AI Settings Schemas (Claude Agent SDK)\n// =============================================================================\n\nexport const McpServerConfigSchema = v.union([\n v.object({\n type: v.optional(v.literal('stdio')),\n command: v.string(),\n args: v.optional(v.array(v.string())),\n env: v.optional(v.record(v.string(), v.string())),\n }),\n v.object({\n type: v.literal('sse'),\n url: v.string(),\n headers: v.optional(v.record(v.string(), v.string())),\n }),\n v.object({\n type: v.literal('http'),\n url: v.string(),\n headers: v.optional(v.record(v.string(), v.string())),\n }),\n]);\n\nexport const AiSettingsSchema = v.optional(\n v.object({\n model: v.optional(v.string()),\n fallbackModel: v.optional(v.string()),\n maxThinkingTokens: v.optional(v.number()),\n maxTurns: v.optional(v.number()),\n maxBudgetUsd: v.optional(v.number()),\n allowedTools: v.optional(v.array(v.string())),\n disallowedTools: v.optional(v.array(v.string())),\n tools: v.optional(\n v.union([\n v.array(v.string()),\n v.object({\n type: v.literal('preset'),\n preset: v.literal('claude_code'),\n }),\n ]),\n ),\n permissionMode: v.optional(\n v.picklist([\n 'default',\n 'acceptEdits',\n 'bypassPermissions',\n 'plan',\n 'delegate',\n 'dontAsk',\n ]),\n ),\n allowDangerouslySkipPermissions: v.optional(v.boolean()),\n mcpServers: v.optional(v.record(v.string(), McpServerConfigSchema)),\n strictMcpConfig: v.optional(v.boolean()),\n }),\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.string(),\n aiSettings: AiSettingsSchema,\n});\n\nexport const ScenarioSchema = ScenarioBaseSchema;\n\n// =============================================================================\n// Configuration Schemas\n// =============================================================================\n\nexport const PermissionsSchema = v.object({\n allowSave: v.boolean(),\n});\n\nexport const ConfigSchema = v.object({\n scenarios: v.array(ScenarioSchema),\n permissions: PermissionsSchema,\n hosted: v.optional(v.boolean(), false),\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 { Hono } from 'hono';\n\nimport type { Config } from '../definitions';\n\nimport { createDocsApp } from './apps/docs';\nimport { createScenariosApp } from './apps/scenarios';\nimport { buildSectionInfoMap } from './helpers/scenarios/build-section-info';\n\nexport const createApiServer = (rawConfig: Config) => {\n const app = new Hono();\n\n // In hosted mode, allowSave is always false\n const config: Config = rawConfig.hosted\n ? {\n ...rawConfig,\n permissions: { ...rawConfig.permissions, allowSave: false },\n }\n : rawConfig;\n\n // \u30B7\u30CA\u30EA\u30AA\u3054\u3068\u306E\u60C5\u5831\u3092\u4E8B\u524D\u306B\u30D3\u30EB\u30C9\n const scenarioInfoMap = new Map(\n config.scenarios.map((scenario) => [\n scenario.id,\n {\n scenario,\n sectionInfoMap: buildSectionInfoMap(scenario.steps),\n },\n ]),\n );\n\n // Scenarios App\n const scenariosApp = createScenariosApp(config, scenarioInfoMap);\n\n // Docs App\n const docsApp = createDocsApp(config, scenarioInfoMap);\n\n // Mount sub-apps\n app.route('/', scenariosApp);\n app.route('/', docsApp);\n\n return app;\n};\n", "import { Hono } from 'hono';\nimport { createMiddleware } from 'hono/factory';\n\nimport type { Config } from '../../definitions';\nimport { transformFormData } from '../helpers/docs/transform';\nimport {\n getDocumentsForScenario,\n getFilename,\n readDocument,\n saveDocument,\n} from '../repositories/document';\nimport { generateDesignDoc } from '../usecases/docs/generate-doc';\n\nimport type { ScenarioInfoMapEntry } from './scenarios';\n\ntype Variables = {\n scenarioInfo: ScenarioInfoMapEntry;\n};\n\ntype CreateDocBody = {\n content: string;\n formData: Record<string, unknown>;\n};\n\ntype UpdateDocBody = {\n content: string;\n formData: Record<string, unknown>;\n};\n\nconst createScenarioMiddleware = (\n scenarioInfoMap: Map<string, ScenarioInfoMapEntry>,\n) =>\n createMiddleware<{ Variables: Variables }>(async (c, next) => {\n const scenarioId = c.req.param('scenarioId');\n\n if (scenarioId == null) {\n return c.json({ error: 'Scenario ID is required' }, 400);\n }\n\n const scenarioInfo = scenarioInfoMap.get(scenarioId);\n\n if (scenarioInfo == null) {\n return c.json({ error: 'Scenario not found' }, 404);\n }\n\n c.set('scenarioInfo', scenarioInfo);\n await next();\n });\n\nexport const createDocsApp = (\n config: Config,\n scenarioInfoMap: Map<string, ScenarioInfoMapEntry>,\n) => {\n const app = new Hono<{ Variables: Variables }>();\n\n app.use(\n '/api/scenarios/:scenarioId/*',\n createScenarioMiddleware(scenarioInfoMap),\n );\n\n app.get('/api/scenarios/:scenarioId/docs', async (c) => {\n const { scenario } = c.get('scenarioInfo');\n const docs = await getDocumentsForScenario(scenario);\n\n return c.json({ docs });\n });\n\n app.post('/api/scenarios/:scenarioId/docs/preview', async (c) => {\n const { scenario, sectionInfoMap } = c.get('scenarioInfo');\n\n const formData = (await c.req.json()) as Record<string, unknown>;\n const inputData = transformFormData(formData, sectionInfoMap);\n const content = await generateDesignDoc({ scenario, formData, inputData });\n\n if (scenario.hooks?.onPreview != null) {\n await scenario.hooks.onPreview({ formData, inputData, content });\n }\n\n return c.json({ success: true, content });\n });\n\n app.post('/api/scenarios/:scenarioId/docs', async (c) => {\n const scenarioId = c.req.param('scenarioId');\n const { scenario, sectionInfoMap } = c.get('scenarioInfo');\n\n if (!config.permissions.allowSave) {\n return c.json({ error: 'Save is not allowed' }, 403);\n }\n\n const { content, formData } = (await c.req.json()) as CreateDocBody;\n const inputData = transformFormData(formData, sectionInfoMap);\n const filename = getFilename(\n scenario,\n scenarioId,\n content,\n formData,\n inputData,\n );\n const { outputPath } = await saveDocument({\n scenario,\n scenarioId,\n filename,\n content,\n formData,\n });\n\n if (scenario.hooks?.onSave != null) {\n await scenario.hooks.onSave({\n content,\n filename,\n outputPath,\n formData,\n inputData,\n });\n }\n\n return c.json({ success: true, filename });\n });\n\n app.get('/api/scenarios/:scenarioId/docs/:filename', async (c) => {\n const filename = c.req.param('filename');\n const { scenario } = c.get('scenarioInfo');\n\n const result = await readDocument(scenario, filename);\n\n if (!result.success) {\n return c.json({ error: 'Document not found' }, 404);\n }\n\n return c.json({ doc: result.doc });\n });\n\n app.put('/api/scenarios/:scenarioId/docs/:filename', async (c) => {\n const scenarioId = c.req.param('scenarioId');\n const filename = c.req.param('filename');\n const { scenario, sectionInfoMap } = c.get('scenarioInfo');\n\n if (!config.permissions.allowSave) {\n return c.json({ error: 'Save is not allowed' }, 403);\n }\n\n const { content, formData } = (await c.req.json()) as UpdateDocBody;\n const inputData = transformFormData(formData, sectionInfoMap);\n const { outputPath } = await saveDocument({\n scenario,\n scenarioId,\n filename,\n content,\n formData,\n });\n\n if (scenario.hooks?.onSave != null) {\n await scenario.hooks.onSave({\n content,\n filename,\n outputPath,\n formData,\n inputData,\n });\n }\n\n return c.json({ success: true, filename });\n });\n\n return app;\n};\n", "import type { InputData } from '../../../definitions';\nimport type { SectionInfo } from '../scenarios/build-section-info';\n\nexport const transformFormData = (\n body: Record<string, unknown>,\n sectionInfoMap: Map<string, SectionInfo>,\n): InputData => {\n const items: InputData['items'] = [];\n\n for (const [sectionName, sectionValue] of Object.entries(body)) {\n const sectionInfo = sectionInfoMap.get(sectionName);\n\n if (sectionInfo == null) {\n continue;\n }\n\n const fieldInfoMap = new Map(sectionInfo.fields.map((f) => [f.id, f]));\n\n const values = (\n Array.isArray(sectionValue) ? sectionValue : [sectionValue]\n ).map((item: Record<string, unknown>) => {\n const itemValues: Array<{\n label: string;\n description: string;\n value: unknown;\n }> = Object.entries(item)\n .map(([fieldId, fieldValue]) => {\n const fieldInfo = fieldInfoMap.get(fieldId);\n if (fieldInfo) {\n return {\n label: fieldInfo.label,\n description: fieldInfo.description,\n value: fieldValue,\n };\n }\n return null;\n })\n .filter((value) => value != null);\n\n return itemValues;\n });\n\n items.push({\n title: sectionInfo.title,\n description: sectionInfo.description,\n values,\n });\n }\n\n return { items };\n};\n", "import { mkdir, readFile, readdir, writeFile } from 'node:fs/promises';\nimport { join } from 'node:path';\n\nimport type { InputData, Scenario } from '../../definitions';\nimport {\n type DocumentWithMetadata,\n addMetadataToContent,\n parseMetadata,\n} from '../helpers/docs/metadata';\n\nexport const getOutputDir = (scenario: Scenario): string => {\n return scenario.outputDir ?? join(process.cwd(), 'output');\n};\n\ntype ReadDocumentResult =\n | { success: true; doc: DocumentWithMetadata }\n | { success: false; error: 'not_found' | 'scenario_mismatch' };\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\ntype SaveDocumentOptions = {\n scenario: Scenario;\n scenarioId: string;\n filename: string;\n content: string;\n formData: Record<string, unknown>;\n};\n\nexport const saveDocument = async ({\n scenario,\n scenarioId,\n filename,\n content,\n formData,\n}: SaveDocumentOptions): Promise<{ outputPath: string }> => {\n const outputDir = getOutputDir(scenario);\n const outputPath = join(outputDir, filename);\n\n const contentWithMetadata = addMetadataToContent(content, {\n scenarioId,\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 getFilename = (\n scenario: Scenario,\n scenarioId: string,\n content: string,\n formData: Record<string, unknown>,\n inputData: InputData,\n): string => {\n const timestamp = new Date().toISOString().replace(/[:.]/g, '-');\n\n const filenameOverride = scenario.overrides?.filename;\n if (filenameOverride != null) {\n return typeof filenameOverride === 'function'\n ? filenameOverride({\n scenarioId,\n timestamp,\n content,\n formData,\n inputData,\n })\n : filenameOverride;\n }\n\n return `design-doc-${scenarioId}-${timestamp}.md`;\n};\n", "export type DocumentMetadata = {\n scenarioId: string;\n formData: Record<string, unknown>;\n};\n\nexport type DocumentWithMetadata = {\n filename: string;\n content: string;\n metadata: DocumentMetadata | null;\n};\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 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 addMetadataToContent = (\n content: string,\n metadata: DocumentMetadata,\n): string => {\n return `${content}\\n\\n${serializeMetadata(metadata)}`;\n};\n", "import {\n type Options,\n type SDKResultMessage,\n query,\n} from '@anthropic-ai/claude-agent-sdk';\n\nimport type { InputData, Scenario } from '../../../definitions';\n\ntype GenerateDesignDocParams = {\n scenario: Scenario;\n formData: Record<string, unknown>;\n inputData: InputData;\n};\n\nexport const generateDesignDoc = async ({\n scenario,\n formData,\n inputData,\n}: GenerateDesignDocParams): Promise<string> => {\n const promptTemplate =\n typeof scenario.prompt === 'function'\n ? scenario.prompt({ formData, inputData })\n : scenario.prompt;\n const prompt = promptTemplate.replace(\n '{{INPUT_JSON}}',\n JSON.stringify(inputData, null, 2),\n );\n\n let message: SDKResultMessage | null = null;\n\n for await (const msg of query({\n prompt,\n options: scenario.aiSettings as Options,\n })) {\n if (msg.type === 'result' && msg.subtype === 'success') {\n message = msg;\n }\n }\n\n if (message == null) {\n throw new Error('Query failed');\n }\n\n return message.result;\n};\n", "import { Hono } from 'hono';\n\nimport type { Config, Scenario } from '../../definitions';\nimport { buildFormDefaultValues } from '../helpers/scenarios/build-form-defaults';\nimport type { buildSectionInfoMap } from '../helpers/scenarios/build-section-info';\n\nexport type ScenarioInfo = {\n sectionInfoMap: ReturnType<typeof buildSectionInfoMap>;\n};\n\nexport type ScenarioInfoMapEntry = {\n scenario: Scenario;\n sectionInfoMap: ReturnType<typeof buildSectionInfoMap>;\n};\n\nexport const createScenariosApp = (\n config: Config,\n scenarioInfoMap: Map<string, ScenarioInfoMapEntry>,\n) => {\n const app = new Hono();\n\n // \u5168\u30B7\u30CA\u30EA\u30AA\u53D6\u5F97\n app.get('/api/scenarios', (c) => {\n return c.json({\n scenarios: config.scenarios,\n });\n });\n\n // \u5358\u4E00\u30B7\u30CA\u30EA\u30AA\u53D6\u5F97\n app.get('/api/scenarios/:scenarioId', (c) => {\n const scenarioId = c.req.param('scenarioId');\n const scenarioInfo = scenarioInfoMap.get(scenarioId);\n\n if (scenarioInfo == null) {\n return c.json({ error: 'Scenario not found' }, 404);\n }\n\n const formDefaultValues = buildFormDefaultValues(\n scenarioInfo.scenario.steps,\n );\n\n return c.json({\n scenario: scenarioInfo.scenario,\n formDefaultValues,\n permissions: config.permissions,\n });\n });\n\n return app;\n};\n", "import { type Field, type Step, isLayoutField } from '../../../definitions';\n\nexport const buildFieldDefaults = (\n fields: Field[],\n): Record<string, unknown> => {\n const getFieldDefaultValue = (field: Field): unknown => {\n if (isLayoutField(field)) {\n return undefined;\n }\n switch (field.type) {\n case 'checkbox':\n return false;\n default:\n return '';\n }\n };\n\n const defaults: Record<string, unknown> = {};\n for (const field of fields) {\n if (isLayoutField(field)) {\n Object.assign(defaults, buildFieldDefaults(field.fields));\n } else {\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 config of steps) {\n if (config.section.type === 'single') {\n defaults[config.section.name] = buildFieldDefaults(config.section.fields);\n } else {\n const minCount = config.section.minFieldCount ?? 1;\n defaults[config.section.name] = Array.from({ length: minCount }, () =>\n buildFieldDefaults(config.section.fields),\n );\n }\n }\n return defaults;\n};\n", "import { type Field, type Step, isLayoutField } from '../../../definitions';\n\nexport type FieldInfo = {\n id: string;\n label: string;\n description: string;\n};\n\nexport type SectionInfo = {\n name: string;\n title: string;\n description: string;\n fields: FieldInfo[];\n};\n\nexport const extractFieldInfos = (fields: Field[]): FieldInfo[] => {\n const result: FieldInfo[] = [];\n for (const field of fields) {\n if (isLayoutField(field)) {\n result.push(...extractFieldInfos(field.fields));\n } else {\n result.push({\n id: field.id,\n label: field.label,\n description: field.description,\n });\n }\n }\n return result;\n};\n\nexport const buildSectionInfoMap = (\n steps: Step[],\n): Map<string, SectionInfo> => {\n const sectionMap = new Map<string, SectionInfo>(\n steps.map((step) => [\n step.section.name,\n {\n name: step.section.name,\n title: step.title,\n description: step.description,\n fields: extractFieldInfos(step.section.fields),\n },\n ]),\n );\n\n return sectionMap;\n};\n"],
5
+ "mappings": "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",
6
6
  "names": ["defineCommand", "fs", "path", "defineCommand", "consola", "Hono", "Hono", "Hono", "Hono", "consola", "defineCommand", "defineCommand"]
7
7
  }
@@ -1 +1 @@
1
- import{j as o}from"./index-D6usLrOW.js";const e=r=>o.jsx("svg",{"aria-hidden":"true",width:"16",height:"16",viewBox:"0 0 16 16",fill:"none",xmlns:"http://www.w3.org/2000/svg",...r,children:o.jsx("path",{d:"M6 4L10 8L6 12",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round",strokeLinejoin:"round"})});export{e as C};
1
+ import{j as o}from"./index-DzfYNFpx.js";const e=r=>o.jsx("svg",{"aria-hidden":"true",width:"16",height:"16",viewBox:"0 0 16 16",fill:"none",xmlns:"http://www.w3.org/2000/svg",...r,children:o.jsx("path",{d:"M6 4L10 8L6 12",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round",strokeLinejoin:"round"})});export{e as C};
@@ -1 +1 @@
1
- import{j as o}from"./index-D6usLrOW.js";const e=t=>o.jsx("svg",{"aria-hidden":"true",width:"16",height:"16",viewBox:"0 0 16 16",fill:"none",xmlns:"http://www.w3.org/2000/svg",...t,children:o.jsx("path",{d:"M9 1H4C3.44772 1 3 1.44772 3 2V14C3 14.5523 3.44772 15 4 15H12C12.5523 15 13 14.5523 13 14V5M9 1L13 5M9 1V5H13M5 8H11M5 11H11",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round",strokeLinejoin:"round"})});export{e as D};
1
+ import{j as o}from"./index-DzfYNFpx.js";const e=t=>o.jsx("svg",{"aria-hidden":"true",width:"16",height:"16",viewBox:"0 0 16 16",fill:"none",xmlns:"http://www.w3.org/2000/svg",...t,children:o.jsx("path",{d:"M9 1H4C3.44772 1 3 1.44772 3 2V14C3 14.5523 3.44772 15 4 15H12C12.5523 15 13 14.5523 13 14V5M9 1L13 5M9 1V5H13M5 8H11M5 11H11",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round",strokeLinejoin:"round"})});export{e as D};
@@ -1 +1 @@
1
- import{S as P,g as R,P as D,Q as E,U as L,V as B,W as N,X as A,Y as Q,n as F,r as d,k as H,j as n,Z as W,_,u as z,$ as V,L as Z}from"./index-D6usLrOW.js";var $=class extends P{constructor(t,e){super(),this.options=e,this.#s=t,this.#i=null,this.bindMethods(),this.setOptions(e)}#s;#t=void 0;#f=void 0;#e=void 0;#n;#u;#i;#p;#c;#l;#o;#a;#r;#d=new Set;bindMethods(){this.refetch=this.refetch.bind(this)}onSubscribe(){this.listeners.size===1&&(this.#t.addObserver(this),I(this.#t,this.options)?this.#h():this.updateResult(),this.#y())}onUnsubscribe(){this.hasListeners()||this.destroy()}shouldFetchOnReconnect(){return C(this.#t,this.options,this.options.refetchOnReconnect)}shouldFetchOnWindowFocus(){return C(this.#t,this.options,this.options.refetchOnWindowFocus)}destroy(){this.listeners=new Set,this.#x(),this.#R(),this.#t.removeObserver(this)}setOptions(t,e){const s=this.options,i=this.#t;if(this.options=this.#s.defaultQueryOptions(t),this.options.enabled!==void 0&&typeof this.options.enabled!="boolean")throw new Error("Expected enabled to be a boolean");this.#C(),this.#t.setOptions(this.options),s._defaulted&&!R(this.options,s)&&this.#s.getQueryCache().notify({type:"observerOptionsUpdated",query:this.#t,observer:this});const a=this.hasListeners();a&&U(this.#t,i,this.options,s)&&this.#h(),this.updateResult(e),a&&(this.#t!==i||this.options.enabled!==s.enabled||this.options.staleTime!==s.staleTime)&&this.#g();const u=this.#v();a&&(this.#t!==i||this.options.enabled!==s.enabled||u!==this.#r)&&this.#b(u)}getOptimisticResult(t){const e=this.#s.getQueryCache().build(this.#s,t),s=this.createResult(e,t);return K(this,s)&&(this.#e=s,this.#u=this.options,this.#n=this.#t.state),s}getCurrentResult(){return this.#e}trackResult(t,e){const s={};return Object.keys(t).forEach(i=>{Object.defineProperty(s,i,{configurable:!1,enumerable:!0,get:()=>(this.trackProp(i),e?.(i),t[i])})}),s}trackProp(t){this.#d.add(t)}getCurrentQuery(){return this.#t}refetch({...t}={}){return this.fetch({...t})}fetchOptimistic(t){const e=this.#s.defaultQueryOptions(t),s=this.#s.getQueryCache().build(this.#s,e);return s.isFetchingOptimistic=!0,s.fetch().then(()=>this.createResult(s,e))}fetch(t){return this.#h({...t,cancelRefetch:t.cancelRefetch??!0}).then(()=>(this.updateResult(),this.#e))}#h(t){this.#C();let e=this.#t.fetch(this.options,t);return t?.throwOnError||(e=e.catch(D)),e}#g(){if(this.#x(),E||this.#e.isStale||!L(this.options.staleTime))return;const e=B(this.#e.dataUpdatedAt,this.options.staleTime)+1;this.#o=setTimeout(()=>{this.#e.isStale||this.updateResult()},e)}#v(){return(typeof this.options.refetchInterval=="function"?this.options.refetchInterval(this.#t):this.options.refetchInterval)??!1}#b(t){this.#R(),this.#r=t,!(E||this.options.enabled===!1||!L(this.#r)||this.#r===0)&&(this.#a=setInterval(()=>{(this.options.refetchIntervalInBackground||N.isFocused())&&this.#h()},this.#r))}#y(){this.#g(),this.#b(this.#v())}#x(){this.#o&&(clearTimeout(this.#o),this.#o=void 0)}#R(){this.#a&&(clearInterval(this.#a),this.#a=void 0)}createResult(t,e){const s=this.#t,i=this.options,a=this.#e,u=this.#n,o=this.#u,f=t!==s?t.state:this.#f,{state:p}=t;let r={...p},O=!1,l;if(e._optimisticResults){const c=this.hasListeners(),x=!c&&I(t,e),T=c&&U(t,s,e,i);(x||T)&&(r={...r,...A(p.data,t.options)}),e._optimisticResults==="isRestoring"&&(r.fetchStatus="idle")}let{error:w,errorUpdatedAt:S,status:g}=r;if(e.select&&r.data!==void 0)if(a&&r.data===u?.data&&e.select===this.#p)l=this.#c;else try{this.#p=e.select,l=e.select(r.data),l=Q(a?.data,l,e),this.#c=l,this.#i=null}catch(c){this.#i=c}else l=r.data;if(e.placeholderData!==void 0&&l===void 0&&g==="pending"){let c;if(a?.isPlaceholderData&&e.placeholderData===o?.placeholderData)c=a.data;else if(c=typeof e.placeholderData=="function"?e.placeholderData(this.#l?.state.data,this.#l):e.placeholderData,e.select&&c!==void 0)try{c=e.select(c),this.#i=null}catch(x){this.#i=x}c!==void 0&&(g="success",l=Q(a?.data,c,e),O=!0)}this.#i&&(w=this.#i,l=this.#c,S=Date.now(),g="error");const v=r.fetchStatus==="fetching",b=g==="pending",y=g==="error",k=b&&v,j=l!==void 0;return{status:g,fetchStatus:r.fetchStatus,isPending:b,isSuccess:g==="success",isError:y,isInitialLoading:k,isLoading:k,data:l,dataUpdatedAt:r.dataUpdatedAt,error:w,errorUpdatedAt:S,failureCount:r.fetchFailureCount,failureReason:r.fetchFailureReason,errorUpdateCount:r.errorUpdateCount,isFetched:r.dataUpdateCount>0||r.errorUpdateCount>0,isFetchedAfterMount:r.dataUpdateCount>f.dataUpdateCount||r.errorUpdateCount>f.errorUpdateCount,isFetching:v,isRefetching:v&&!b,isLoadingError:y&&!j,isPaused:r.fetchStatus==="paused",isPlaceholderData:O,isRefetchError:y&&j,isStale:m(t,e),refetch:this.refetch}}updateResult(t){const e=this.#e,s=this.createResult(this.#t,this.options);if(this.#n=this.#t.state,this.#u=this.options,this.#n.data!==void 0&&(this.#l=this.#t),R(s,e))return;this.#e=s;const i={},a=()=>{if(!e)return!0;const{notifyOnChangeProps:u}=this.options,o=typeof u=="function"?u():u;if(o==="all"||!o&&!this.#d.size)return!0;const h=new Set(o??this.#d);return this.options.throwOnError&&h.add("error"),Object.keys(this.#e).some(f=>{const p=f;return this.#e[p]!==e[p]&&h.has(p)})};t?.listeners!==!1&&a()&&(i.listeners=!0),this.#m({...i,...t})}#C(){const t=this.#s.getQueryCache().build(this.#s,this.options);if(t===this.#t)return;const e=this.#t;this.#t=t,this.#f=t.state,this.hasListeners()&&(e?.removeObserver(this),t.addObserver(this))}onQueryUpdate(){this.updateResult(),this.hasListeners()&&this.#y()}#m(t){F.batch(()=>{t.listeners&&this.listeners.forEach(e=>{e(this.#e)}),this.#s.getQueryCache().notify({query:this.#t,type:"observerResultsUpdated"})})}};function G(t,e){return e.enabled!==!1&&t.state.data===void 0&&!(t.state.status==="error"&&e.retryOnMount===!1)}function I(t,e){return G(t,e)||t.state.data!==void 0&&C(t,e,e.refetchOnMount)}function C(t,e,s){if(e.enabled!==!1){const i=typeof s=="function"?s(t):s;return i==="always"||i!==!1&&m(t,e)}return!1}function U(t,e,s,i){return(t!==e||i.enabled===!1)&&(!s.suspense||t.state.status!=="error")&&m(t,s)}function m(t,e){return e.enabled!==!1&&t.isStaleByTime(e.staleTime)}function K(t,e){return!R(t.getCurrentResult(),e)}var M=d.createContext(!1),X=()=>d.useContext(M);M.Provider;function Y(){let t=!1;return{clearReset:()=>{t=!1},reset:()=>{t=!0},isReset:()=>t}}var q=d.createContext(Y()),J=()=>d.useContext(q);function tt(t,e){return typeof t=="function"?t(...e):!!t}function vt(){}var et=(t,e)=>{(t.suspense||t.throwOnError)&&(e.isReset()||(t.retryOnMount=!1))},st=t=>{d.useEffect(()=>{t.clearReset()},[t])},it=({result:t,errorResetBoundary:e,throwOnError:s,query:i})=>t.isError&&!e.isReset()&&!t.isFetching&&i&&tt(s,[t.error,i]),rt=(t,e)=>e.state.data===void 0,nt=t=>{t.suspense&&typeof t.staleTime!="number"&&(t.staleTime=1e3)},ot=(t,e)=>t?.suspense&&e.isPending,at=(t,e,s)=>e.fetchOptimistic(t).catch(()=>{s.clearReset()});function ht(t,e,s){const i=H(),a=X(),u=J(),o=i.defaultQueryOptions(t);o._optimisticResults=a?"isRestoring":"optimistic",nt(o),et(o,u),st(u);const[h]=d.useState(()=>new e(i,o)),f=h.getOptimisticResult(o);if(d.useSyncExternalStore(d.useCallback(p=>{const r=a?()=>{}:h.subscribe(F.batchCalls(p));return h.updateResult(),r},[h,a]),()=>h.getCurrentResult(),()=>h.getCurrentResult()),d.useEffect(()=>{h.setOptions(o,{listeners:!1})},[o,h]),ot(o,f))throw at(o,h,u);if(it({result:f,errorResetBoundary:u,throwOnError:o.throwOnError,query:i.getQueryCache().get(o.queryHash)}))throw f.error;return o.notifyOnChangeProps?f:h.trackResult(f)}function bt(t,e){return ht({...t,enabled:!0,suspense:!0,throwOnError:rt,placeholderData:void 0},$)}const ut=()=>n.jsx("svg",{"aria-hidden":"true",width:"16",height:"16",viewBox:"0 0 16 16",fill:"none",xmlns:"http://www.w3.org/2000/svg",children:n.jsx("path",{d:"M4 4L12 12M12 4L4 12",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round",strokeLinejoin:"round"})}),ct=()=>n.jsxs("svg",{"aria-hidden":"true",width:"16",height:"16",viewBox:"0 0 16 16",fill:"none",xmlns:"http://www.w3.org/2000/svg",children:[n.jsx("path",{d:"M0.666992 8.00004C0.666992 8.00004 3.33366 2.66671 8.00033 2.66671C12.667 2.66671 15.3337 8.00004 15.3337 8.00004C15.3337 8.00004 12.667 13.3334 8.00033 13.3334C3.33366 13.3334 0.666992 8.00004 0.666992 8.00004Z",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round",strokeLinejoin:"round"}),n.jsx("path",{d:"M8.00033 10C9.10489 10 10.0003 9.10461 10.0003 8.00004C10.0003 6.89547 9.10489 6.00004 8.00033 6.00004C6.89576 6.00004 6.00033 6.89547 6.00033 8.00004C6.00033 9.10461 6.89576 10 8.00033 10Z",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round",strokeLinejoin:"round"})]}),lt=()=>n.jsx("svg",{"aria-hidden":"true",width:"16",height:"16",viewBox:"0 0 16 16",fill:"none",xmlns:"http://www.w3.org/2000/svg",children:n.jsx("path",{d:"M2 4H14M2 8H14M2 12H14",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round",strokeLinejoin:"round"})}),dt=({locale:t,isActive:e,onClick:s})=>{const i=d.useCallback(()=>{s(t)},[t,s]);return n.jsx("button",{className:`px-2 py-1 text-xs rounded transition-colors cursor-pointer focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-indigo-300 focus-visible:ring-offset-2 ${e?"bg-indigo-500 text-white":"bg-gray-100 text-gray-600 hover:bg-gray-200"}`,type:"button",onClick:i,children:t.toUpperCase()})},ft=({currentLocale:t})=>{const e=d.useCallback(s=>{W(s),window.location.reload()},[]);return n.jsx("div",{className:"flex gap-1",children:Object.keys(_).map(s=>n.jsx(dt,{locale:s,isActive:t===s,onClick:e},s))})},yt=({isMenuOpen:t,onToggleMenu:e,onOpenPreview:s})=>{const{_:i}=z(),a=V();return n.jsxs("header",{className:"flex items-center justify-between h-14 px-4 xl:px-6 bg-white rounded-2xl border border-gray-100",children:[n.jsxs("div",{className:"flex items-center gap-2",children:[e!=null&&n.jsx("button",{"aria-label":i(t?{id:"vcpc5o"}:{id:"GSr0rF"}),className:"xl:hidden p-2 rounded-lg text-gray-500 hover:text-gray-700 hover:bg-gray-100 transition-colors cursor-pointer *:size-5 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-indigo-300 focus-visible:ring-offset-2",type:"button",onClick:e,children:t?n.jsx(ut,{}):n.jsx(lt,{})}),n.jsx(Z,{to:"/scenarios",className:"text-lg font-bold text-gray-900 hover:text-indigo-600 transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-indigo-300 focus-visible:ring-offset-2 rounded",children:"Spec Snake Beta"})]}),n.jsxs("div",{className:"flex items-center gap-2",children:[n.jsx(ft,{currentLocale:a}),s!=null&&n.jsx("button",{"aria-label":i({id:"fsyAH8"}),className:"lg:hidden p-2 rounded-lg text-gray-500 hover:text-gray-700 hover:bg-gray-100 transition-colors cursor-pointer *:size-5 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-indigo-300 focus-visible:ring-offset-2",type:"button",onClick:s,children:n.jsx(ct,{})})]})]})};export{ut as C,ct as E,yt as H,vt as n,tt as s,bt as u};
1
+ import{S as P,g as R,P as D,Q as E,U as L,V as B,W as N,X as A,Y as Q,n as F,r as d,k as H,j as n,Z as W,_,u as z,$ as V,L as Z}from"./index-DzfYNFpx.js";var $=class extends P{constructor(t,e){super(),this.options=e,this.#s=t,this.#i=null,this.bindMethods(),this.setOptions(e)}#s;#t=void 0;#f=void 0;#e=void 0;#n;#u;#i;#p;#c;#l;#o;#a;#r;#d=new Set;bindMethods(){this.refetch=this.refetch.bind(this)}onSubscribe(){this.listeners.size===1&&(this.#t.addObserver(this),I(this.#t,this.options)?this.#h():this.updateResult(),this.#y())}onUnsubscribe(){this.hasListeners()||this.destroy()}shouldFetchOnReconnect(){return C(this.#t,this.options,this.options.refetchOnReconnect)}shouldFetchOnWindowFocus(){return C(this.#t,this.options,this.options.refetchOnWindowFocus)}destroy(){this.listeners=new Set,this.#x(),this.#R(),this.#t.removeObserver(this)}setOptions(t,e){const s=this.options,i=this.#t;if(this.options=this.#s.defaultQueryOptions(t),this.options.enabled!==void 0&&typeof this.options.enabled!="boolean")throw new Error("Expected enabled to be a boolean");this.#C(),this.#t.setOptions(this.options),s._defaulted&&!R(this.options,s)&&this.#s.getQueryCache().notify({type:"observerOptionsUpdated",query:this.#t,observer:this});const a=this.hasListeners();a&&U(this.#t,i,this.options,s)&&this.#h(),this.updateResult(e),a&&(this.#t!==i||this.options.enabled!==s.enabled||this.options.staleTime!==s.staleTime)&&this.#g();const u=this.#v();a&&(this.#t!==i||this.options.enabled!==s.enabled||u!==this.#r)&&this.#b(u)}getOptimisticResult(t){const e=this.#s.getQueryCache().build(this.#s,t),s=this.createResult(e,t);return K(this,s)&&(this.#e=s,this.#u=this.options,this.#n=this.#t.state),s}getCurrentResult(){return this.#e}trackResult(t,e){const s={};return Object.keys(t).forEach(i=>{Object.defineProperty(s,i,{configurable:!1,enumerable:!0,get:()=>(this.trackProp(i),e?.(i),t[i])})}),s}trackProp(t){this.#d.add(t)}getCurrentQuery(){return this.#t}refetch({...t}={}){return this.fetch({...t})}fetchOptimistic(t){const e=this.#s.defaultQueryOptions(t),s=this.#s.getQueryCache().build(this.#s,e);return s.isFetchingOptimistic=!0,s.fetch().then(()=>this.createResult(s,e))}fetch(t){return this.#h({...t,cancelRefetch:t.cancelRefetch??!0}).then(()=>(this.updateResult(),this.#e))}#h(t){this.#C();let e=this.#t.fetch(this.options,t);return t?.throwOnError||(e=e.catch(D)),e}#g(){if(this.#x(),E||this.#e.isStale||!L(this.options.staleTime))return;const e=B(this.#e.dataUpdatedAt,this.options.staleTime)+1;this.#o=setTimeout(()=>{this.#e.isStale||this.updateResult()},e)}#v(){return(typeof this.options.refetchInterval=="function"?this.options.refetchInterval(this.#t):this.options.refetchInterval)??!1}#b(t){this.#R(),this.#r=t,!(E||this.options.enabled===!1||!L(this.#r)||this.#r===0)&&(this.#a=setInterval(()=>{(this.options.refetchIntervalInBackground||N.isFocused())&&this.#h()},this.#r))}#y(){this.#g(),this.#b(this.#v())}#x(){this.#o&&(clearTimeout(this.#o),this.#o=void 0)}#R(){this.#a&&(clearInterval(this.#a),this.#a=void 0)}createResult(t,e){const s=this.#t,i=this.options,a=this.#e,u=this.#n,o=this.#u,f=t!==s?t.state:this.#f,{state:p}=t;let r={...p},O=!1,l;if(e._optimisticResults){const c=this.hasListeners(),x=!c&&I(t,e),T=c&&U(t,s,e,i);(x||T)&&(r={...r,...A(p.data,t.options)}),e._optimisticResults==="isRestoring"&&(r.fetchStatus="idle")}let{error:w,errorUpdatedAt:S,status:g}=r;if(e.select&&r.data!==void 0)if(a&&r.data===u?.data&&e.select===this.#p)l=this.#c;else try{this.#p=e.select,l=e.select(r.data),l=Q(a?.data,l,e),this.#c=l,this.#i=null}catch(c){this.#i=c}else l=r.data;if(e.placeholderData!==void 0&&l===void 0&&g==="pending"){let c;if(a?.isPlaceholderData&&e.placeholderData===o?.placeholderData)c=a.data;else if(c=typeof e.placeholderData=="function"?e.placeholderData(this.#l?.state.data,this.#l):e.placeholderData,e.select&&c!==void 0)try{c=e.select(c),this.#i=null}catch(x){this.#i=x}c!==void 0&&(g="success",l=Q(a?.data,c,e),O=!0)}this.#i&&(w=this.#i,l=this.#c,S=Date.now(),g="error");const v=r.fetchStatus==="fetching",b=g==="pending",y=g==="error",k=b&&v,j=l!==void 0;return{status:g,fetchStatus:r.fetchStatus,isPending:b,isSuccess:g==="success",isError:y,isInitialLoading:k,isLoading:k,data:l,dataUpdatedAt:r.dataUpdatedAt,error:w,errorUpdatedAt:S,failureCount:r.fetchFailureCount,failureReason:r.fetchFailureReason,errorUpdateCount:r.errorUpdateCount,isFetched:r.dataUpdateCount>0||r.errorUpdateCount>0,isFetchedAfterMount:r.dataUpdateCount>f.dataUpdateCount||r.errorUpdateCount>f.errorUpdateCount,isFetching:v,isRefetching:v&&!b,isLoadingError:y&&!j,isPaused:r.fetchStatus==="paused",isPlaceholderData:O,isRefetchError:y&&j,isStale:m(t,e),refetch:this.refetch}}updateResult(t){const e=this.#e,s=this.createResult(this.#t,this.options);if(this.#n=this.#t.state,this.#u=this.options,this.#n.data!==void 0&&(this.#l=this.#t),R(s,e))return;this.#e=s;const i={},a=()=>{if(!e)return!0;const{notifyOnChangeProps:u}=this.options,o=typeof u=="function"?u():u;if(o==="all"||!o&&!this.#d.size)return!0;const h=new Set(o??this.#d);return this.options.throwOnError&&h.add("error"),Object.keys(this.#e).some(f=>{const p=f;return this.#e[p]!==e[p]&&h.has(p)})};t?.listeners!==!1&&a()&&(i.listeners=!0),this.#m({...i,...t})}#C(){const t=this.#s.getQueryCache().build(this.#s,this.options);if(t===this.#t)return;const e=this.#t;this.#t=t,this.#f=t.state,this.hasListeners()&&(e?.removeObserver(this),t.addObserver(this))}onQueryUpdate(){this.updateResult(),this.hasListeners()&&this.#y()}#m(t){F.batch(()=>{t.listeners&&this.listeners.forEach(e=>{e(this.#e)}),this.#s.getQueryCache().notify({query:this.#t,type:"observerResultsUpdated"})})}};function G(t,e){return e.enabled!==!1&&t.state.data===void 0&&!(t.state.status==="error"&&e.retryOnMount===!1)}function I(t,e){return G(t,e)||t.state.data!==void 0&&C(t,e,e.refetchOnMount)}function C(t,e,s){if(e.enabled!==!1){const i=typeof s=="function"?s(t):s;return i==="always"||i!==!1&&m(t,e)}return!1}function U(t,e,s,i){return(t!==e||i.enabled===!1)&&(!s.suspense||t.state.status!=="error")&&m(t,s)}function m(t,e){return e.enabled!==!1&&t.isStaleByTime(e.staleTime)}function K(t,e){return!R(t.getCurrentResult(),e)}var M=d.createContext(!1),X=()=>d.useContext(M);M.Provider;function Y(){let t=!1;return{clearReset:()=>{t=!1},reset:()=>{t=!0},isReset:()=>t}}var q=d.createContext(Y()),J=()=>d.useContext(q);function tt(t,e){return typeof t=="function"?t(...e):!!t}function vt(){}var et=(t,e)=>{(t.suspense||t.throwOnError)&&(e.isReset()||(t.retryOnMount=!1))},st=t=>{d.useEffect(()=>{t.clearReset()},[t])},it=({result:t,errorResetBoundary:e,throwOnError:s,query:i})=>t.isError&&!e.isReset()&&!t.isFetching&&i&&tt(s,[t.error,i]),rt=(t,e)=>e.state.data===void 0,nt=t=>{t.suspense&&typeof t.staleTime!="number"&&(t.staleTime=1e3)},ot=(t,e)=>t?.suspense&&e.isPending,at=(t,e,s)=>e.fetchOptimistic(t).catch(()=>{s.clearReset()});function ht(t,e,s){const i=H(),a=X(),u=J(),o=i.defaultQueryOptions(t);o._optimisticResults=a?"isRestoring":"optimistic",nt(o),et(o,u),st(u);const[h]=d.useState(()=>new e(i,o)),f=h.getOptimisticResult(o);if(d.useSyncExternalStore(d.useCallback(p=>{const r=a?()=>{}:h.subscribe(F.batchCalls(p));return h.updateResult(),r},[h,a]),()=>h.getCurrentResult(),()=>h.getCurrentResult()),d.useEffect(()=>{h.setOptions(o,{listeners:!1})},[o,h]),ot(o,f))throw at(o,h,u);if(it({result:f,errorResetBoundary:u,throwOnError:o.throwOnError,query:i.getQueryCache().get(o.queryHash)}))throw f.error;return o.notifyOnChangeProps?f:h.trackResult(f)}function bt(t,e){return ht({...t,enabled:!0,suspense:!0,throwOnError:rt,placeholderData:void 0},$)}const ut=()=>n.jsx("svg",{"aria-hidden":"true",width:"16",height:"16",viewBox:"0 0 16 16",fill:"none",xmlns:"http://www.w3.org/2000/svg",children:n.jsx("path",{d:"M4 4L12 12M12 4L4 12",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round",strokeLinejoin:"round"})}),ct=()=>n.jsxs("svg",{"aria-hidden":"true",width:"16",height:"16",viewBox:"0 0 16 16",fill:"none",xmlns:"http://www.w3.org/2000/svg",children:[n.jsx("path",{d:"M0.666992 8.00004C0.666992 8.00004 3.33366 2.66671 8.00033 2.66671C12.667 2.66671 15.3337 8.00004 15.3337 8.00004C15.3337 8.00004 12.667 13.3334 8.00033 13.3334C3.33366 13.3334 0.666992 8.00004 0.666992 8.00004Z",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round",strokeLinejoin:"round"}),n.jsx("path",{d:"M8.00033 10C9.10489 10 10.0003 9.10461 10.0003 8.00004C10.0003 6.89547 9.10489 6.00004 8.00033 6.00004C6.89576 6.00004 6.00033 6.89547 6.00033 8.00004C6.00033 9.10461 6.89576 10 8.00033 10Z",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round",strokeLinejoin:"round"})]}),lt=()=>n.jsx("svg",{"aria-hidden":"true",width:"16",height:"16",viewBox:"0 0 16 16",fill:"none",xmlns:"http://www.w3.org/2000/svg",children:n.jsx("path",{d:"M2 4H14M2 8H14M2 12H14",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round",strokeLinejoin:"round"})}),dt=({locale:t,isActive:e,onClick:s})=>{const i=d.useCallback(()=>{s(t)},[t,s]);return n.jsx("button",{className:`px-2 py-1 text-xs rounded transition-colors cursor-pointer focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-indigo-300 focus-visible:ring-offset-2 ${e?"bg-indigo-500 text-white":"bg-gray-100 text-gray-600 hover:bg-gray-200"}`,type:"button",onClick:i,children:t.toUpperCase()})},ft=({currentLocale:t})=>{const e=d.useCallback(s=>{W(s),window.location.reload()},[]);return n.jsx("div",{className:"flex gap-1",children:Object.keys(_).map(s=>n.jsx(dt,{locale:s,isActive:t===s,onClick:e},s))})},yt=({isMenuOpen:t,onToggleMenu:e,onOpenPreview:s})=>{const{_:i}=z(),a=V();return n.jsxs("header",{className:"flex items-center justify-between h-14 px-4 xl:px-6 bg-white rounded-2xl border border-gray-100",children:[n.jsxs("div",{className:"flex items-center gap-2",children:[e!=null&&n.jsx("button",{"aria-label":i(t?{id:"vcpc5o"}:{id:"GSr0rF"}),className:"xl:hidden p-2 rounded-lg text-gray-500 hover:text-gray-700 hover:bg-gray-100 transition-colors cursor-pointer *:size-5 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-indigo-300 focus-visible:ring-offset-2",type:"button",onClick:e,children:t?n.jsx(ut,{}):n.jsx(lt,{})}),n.jsx(Z,{to:"/scenarios",className:"text-lg font-bold text-gray-900 hover:text-indigo-600 transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-indigo-300 focus-visible:ring-offset-2 rounded",children:"Spec Snake Beta"})]}),n.jsxs("div",{className:"flex items-center gap-2",children:[n.jsx(ft,{currentLocale:a}),s!=null&&n.jsx("button",{"aria-label":i({id:"fsyAH8"}),className:"lg:hidden p-2 rounded-lg text-gray-500 hover:text-gray-700 hover:bg-gray-100 transition-colors cursor-pointer *:size-5 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-indigo-300 focus-visible:ring-offset-2",type:"button",onClick:s,children:n.jsx(ct,{})})]})]})};export{ut as C,ct as E,yt as H,vt as n,tt as s,bt as u};
@@ -1 +1 @@
1
- import{j as o}from"./index-D6usLrOW.js";const e=r=>o.jsx("svg",{"aria-hidden":"true",width:"16",height:"16",viewBox:"0 0 16 16",fill:"none",xmlns:"http://www.w3.org/2000/svg",...r,children:o.jsx("path",{d:"M8 3V13M3 8H13",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round",strokeLinejoin:"round"})});export{e as P};
1
+ import{j as o}from"./index-DzfYNFpx.js";const e=r=>o.jsx("svg",{"aria-hidden":"true",width:"16",height:"16",viewBox:"0 0 16 16",fill:"none",xmlns:"http://www.w3.org/2000/svg",...r,children:o.jsx("path",{d:"M8 3V13M3 8H13",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round",strokeLinejoin:"round"})});export{e as P};