grimoire-wizard 0.3.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (37) hide show
  1. package/README.md +173 -18
  2. package/dist/cli.js +503 -97
  3. package/dist/cli.js.map +1 -1
  4. package/dist/index.d.ts +107 -3
  5. package/dist/index.js +832 -367
  6. package/dist/index.js.map +1 -1
  7. package/examples/json/all-features.json +66 -0
  8. package/examples/json/appstore-screenshot-wizard.json +362 -0
  9. package/examples/json/appstore-upload.json +104 -0
  10. package/examples/json/basic.json +72 -0
  11. package/examples/json/batch-generate.json +186 -0
  12. package/examples/json/brief-builder.json +519 -0
  13. package/examples/json/conditional.json +155 -0
  14. package/examples/json/cost-analyzer.json +83 -0
  15. package/examples/json/demo.json +130 -0
  16. package/examples/json/scraper-selector.json +63 -0
  17. package/examples/json/themed-catppuccin.json +39 -0
  18. package/examples/json/themed.json +103 -0
  19. package/examples/json/with-checks.json +47 -0
  20. package/examples/yaml/appstore-screenshot-wizard.yaml +321 -0
  21. package/examples/yaml/appstore-upload.yaml +84 -0
  22. package/examples/yaml/batch-generate.yaml +156 -0
  23. package/examples/yaml/brief-builder.yaml +429 -0
  24. package/examples/yaml/cost-analyzer.yaml +69 -0
  25. package/examples/yaml/pipeline.yaml +35 -0
  26. package/examples/yaml/scraper-selector.yaml +52 -0
  27. package/examples/yaml/themed-catppuccin.yaml +31 -0
  28. package/package.json +5 -1
  29. /package/examples/{all-features.yaml → yaml/all-features.yaml} +0 -0
  30. /package/examples/{base.yaml → yaml/base.yaml} +0 -0
  31. /package/examples/{basic.yaml → yaml/basic.yaml} +0 -0
  32. /package/examples/{conditional.yaml → yaml/conditional.yaml} +0 -0
  33. /package/examples/{demo.yaml → yaml/demo.yaml} +0 -0
  34. /package/examples/{ebay-mcp-setup.yaml → yaml/ebay-mcp-setup.yaml} +0 -0
  35. /package/examples/{extended.yaml → yaml/extended.yaml} +0 -0
  36. /package/examples/{themed.yaml → yaml/themed.yaml} +0 -0
  37. /package/examples/{with-checks.yaml → yaml/with-checks.yaml} +0 -0
@@ -0,0 +1,429 @@
1
+ meta:
2
+ name: "Concept Brief Builder"
3
+ description: "Create a design concept brief for AI-powered screenshot generation"
4
+ version: "1.0.0"
5
+ review: true
6
+
7
+ theme:
8
+ preset: dracula
9
+
10
+ steps:
11
+ # ── Platform ──────────────────────────────────────────────
12
+ - id: platform
13
+ type: select
14
+ group: "Platform"
15
+ message: "Platform type"
16
+ options:
17
+ - { value: mobile-ios, label: "iOS App", hint: "iPhone and iPad" }
18
+ - { value: mobile-android, label: "Android App", hint: "Android phone and tablet" }
19
+ - { value: mobile-game, label: "Mobile Game", hint: "iOS or Android game" }
20
+ - { value: web-saas, label: "Web SaaS", hint: "Web application / SaaS" }
21
+ - { value: landing-page, label: "Landing Page", hint: "Marketing landing page" }
22
+ - { value: desktop-app, label: "Desktop App", hint: "macOS or Windows app" }
23
+
24
+ # ── Product Info ──────────────────────────────────────────
25
+ - id: product-name
26
+ type: text
27
+ group: "Product Info"
28
+ message: "Product name"
29
+ validate:
30
+ - rule: required
31
+
32
+ - id: product-description
33
+ type: text
34
+ group: "Product Info"
35
+ message: "Product description"
36
+ validate:
37
+ - rule: required
38
+ - rule: minLength
39
+ value: 10
40
+
41
+ # ── Target Dimensions ────────────────────────────────────
42
+ - id: targets-ios
43
+ type: multiselect
44
+ group: "Target Dimensions"
45
+ message: "Target dimensions"
46
+ when:
47
+ field: platform
48
+ equals: mobile-ios
49
+ options:
50
+ - { value: iphone-6.7, label: 'iPhone 6.7"' }
51
+ - { value: ipad-pro, label: "iPad Pro" }
52
+ min: 1
53
+
54
+ - id: targets-android
55
+ type: multiselect
56
+ group: "Target Dimensions"
57
+ message: "Target dimensions"
58
+ when:
59
+ field: platform
60
+ equals: mobile-android
61
+ options:
62
+ - { value: android-phone, label: "Android Phone" }
63
+ - { value: android-7-tablet, label: 'Android 7" Tablet' }
64
+ - { value: android-10-tablet, label: 'Android 10" Tablet' }
65
+ min: 1
66
+
67
+ - id: targets-game
68
+ type: multiselect
69
+ group: "Target Dimensions"
70
+ message: "Target dimensions"
71
+ when:
72
+ field: platform
73
+ equals: mobile-game
74
+ options:
75
+ - { value: iphone-6.7, label: 'iPhone 6.7"' }
76
+ - { value: ipad-pro, label: "iPad Pro" }
77
+ - { value: android-phone, label: "Android Phone" }
78
+ - { value: android-7-tablet, label: 'Android 7" Tablet' }
79
+ min: 1
80
+
81
+ - id: targets-web
82
+ type: multiselect
83
+ group: "Target Dimensions"
84
+ message: "Target dimensions"
85
+ when:
86
+ any:
87
+ - { field: platform, equals: web-saas }
88
+ - { field: platform, equals: landing-page }
89
+ options:
90
+ - { value: desktop-1920, label: "Desktop 1920px" }
91
+ - { value: tablet-1024, label: "Tablet 1024px" }
92
+ - { value: mobile-390, label: "Mobile 390px" }
93
+ min: 1
94
+
95
+ - id: targets-desktop
96
+ type: multiselect
97
+ group: "Target Dimensions"
98
+ message: "Target dimensions"
99
+ when:
100
+ field: platform
101
+ equals: desktop-app
102
+ options:
103
+ - { value: macos-2880x1800, label: "macOS 2880x1800" }
104
+ - { value: windows-2560x1440, label: "Windows 2560x1440" }
105
+ min: 1
106
+
107
+ # ── Design System ────────────────────────────────────────
108
+ - id: font-family
109
+ type: text
110
+ group: "Design System"
111
+ message: "Font family"
112
+ default: "Inter, system-ui"
113
+ placeholder: "e.g., SF Pro, Roboto, Inter"
114
+
115
+ - id: color-primary
116
+ type: text
117
+ group: "Design System"
118
+ message: "Primary color"
119
+ default: "#6366F1"
120
+
121
+ - id: color-secondary
122
+ type: text
123
+ group: "Design System"
124
+ message: "Secondary color"
125
+ default: "#EC4899"
126
+
127
+ - id: color-accent
128
+ type: text
129
+ group: "Design System"
130
+ message: "Accent color"
131
+ default: "#10B981"
132
+
133
+ - id: color-background
134
+ type: text
135
+ group: "Design System"
136
+ message: "Background color"
137
+ default: "#FAFAFA"
138
+
139
+ - id: color-surface
140
+ type: text
141
+ group: "Design System"
142
+ message: "Surface color"
143
+ default: "#FFFFFF"
144
+
145
+ - id: color-text
146
+ type: text
147
+ group: "Design System"
148
+ message: "Text color"
149
+ default: "#111827"
150
+
151
+ - id: color-text-secondary
152
+ type: text
153
+ group: "Design System"
154
+ message: "Secondary text color"
155
+ default: "#6B7280"
156
+
157
+ - id: corner-radius
158
+ type: select
159
+ group: "Design System"
160
+ message: "Corner radius"
161
+ default: rounded
162
+ options:
163
+ - { value: sharp, label: "Sharp (0-2px)", hint: "Minimal rounding" }
164
+ - { value: rounded, label: "Rounded (8-12px)", hint: "Standard corners" }
165
+ - { value: pill, label: "Pill (999px)", hint: "Fully rounded" }
166
+
167
+ - id: button-style
168
+ type: text
169
+ group: "Design System"
170
+ message: "Button style"
171
+ default: "filled with label"
172
+
173
+ - id: card-style
174
+ type: text
175
+ group: "Design System"
176
+ message: "Card style"
177
+ default: "elevated with shadow"
178
+
179
+ - id: spacing
180
+ type: select
181
+ group: "Design System"
182
+ message: "Spacing"
183
+ default: comfortable
184
+ options:
185
+ - { value: compact, label: "Compact", hint: "Dense layout" }
186
+ - { value: comfortable, label: "Comfortable", hint: "Balanced whitespace" }
187
+ - { value: spacious, label: "Spacious", hint: "Generous whitespace" }
188
+
189
+ # ── Design Direction ─────────────────────────────────────
190
+ - id: mood
191
+ type: text
192
+ group: "Design Direction"
193
+ message: "Design mood"
194
+ placeholder: "e.g., vibrant-competitive, calm-professional"
195
+ validate:
196
+ - rule: required
197
+
198
+ - id: references
199
+ type: text
200
+ group: "Design Direction"
201
+ message: "Style references"
202
+ placeholder: "Comma-separated app names for style inspiration"
203
+ default: ""
204
+ required: false
205
+
206
+ # ── Screens ──────────────────────────────────────────────
207
+ - id: screen-1-name
208
+ type: text
209
+ group: "Screens"
210
+ message: "Screen 1 name"
211
+ validate:
212
+ - rule: required
213
+
214
+ - id: screen-1-description
215
+ type: text
216
+ group: "Screens"
217
+ message: "Screen 1 description"
218
+ validate:
219
+ - rule: required
220
+ - rule: minLength
221
+ value: 5
222
+
223
+ - id: screen-1-elements
224
+ type: text
225
+ group: "Screens"
226
+ message: "Screen 1 UI elements"
227
+ placeholder: "Comma-separated UI elements"
228
+ validate:
229
+ - rule: required
230
+
231
+ - id: screen-2-name
232
+ type: text
233
+ group: "Screens"
234
+ message: "Screen 2 name"
235
+ validate:
236
+ - rule: required
237
+
238
+ - id: screen-2-description
239
+ type: text
240
+ group: "Screens"
241
+ message: "Screen 2 description"
242
+ validate:
243
+ - rule: required
244
+ - rule: minLength
245
+ value: 5
246
+
247
+ - id: screen-2-elements
248
+ type: text
249
+ group: "Screens"
250
+ message: "Screen 2 UI elements"
251
+ placeholder: "Comma-separated UI elements"
252
+ validate:
253
+ - rule: required
254
+
255
+ - id: add-more-screens
256
+ type: confirm
257
+ group: "Screens"
258
+ message: "Add more screen definitions in the output file?"
259
+ default: false
260
+
261
+ # ── Game-Specific ────────────────────────────────────────
262
+ - id: character-1-archetype
263
+ type: text
264
+ group: "Game-Specific"
265
+ message: "Character 1 archetype"
266
+ when:
267
+ field: platform
268
+ equals: mobile-game
269
+ validate:
270
+ - rule: required
271
+
272
+ - id: character-1-traits
273
+ type: text
274
+ group: "Game-Specific"
275
+ message: "Character 1 traits"
276
+ when:
277
+ field: platform
278
+ equals: mobile-game
279
+ validate:
280
+ - rule: required
281
+
282
+ - id: character-1-ability
283
+ type: text
284
+ group: "Game-Specific"
285
+ message: "Character 1 special ability"
286
+ when:
287
+ field: platform
288
+ equals: mobile-game
289
+ validate:
290
+ - rule: required
291
+
292
+ - id: character-1-visual
293
+ type: text
294
+ group: "Game-Specific"
295
+ message: "Character 1 visual description"
296
+ when:
297
+ field: platform
298
+ equals: mobile-game
299
+ validate:
300
+ - rule: required
301
+
302
+ - id: game-stats
303
+ type: text
304
+ group: "Game-Specific"
305
+ message: "Game stats"
306
+ when:
307
+ field: platform
308
+ equals: mobile-game
309
+ placeholder: "Comma-separated stats (e.g., HP, Attack, Defense)"
310
+ validate:
311
+ - rule: required
312
+
313
+ - id: game-obstacles
314
+ type: text
315
+ group: "Game-Specific"
316
+ message: "Obstacles"
317
+ when:
318
+ field: platform
319
+ equals: mobile-game
320
+ placeholder: "Comma-separated obstacles"
321
+ validate:
322
+ - rule: required
323
+
324
+ - id: game-resources
325
+ type: text
326
+ group: "Game-Specific"
327
+ message: "Resources"
328
+ when:
329
+ field: platform
330
+ equals: mobile-game
331
+ placeholder: "Comma-separated resources"
332
+ validate:
333
+ - rule: required
334
+
335
+ - id: game-win-condition
336
+ type: text
337
+ group: "Game-Specific"
338
+ message: "Win condition"
339
+ when:
340
+ field: platform
341
+ equals: mobile-game
342
+ validate:
343
+ - rule: required
344
+
345
+ - id: has-multiplayer
346
+ type: confirm
347
+ group: "Game-Specific"
348
+ message: "Has multiplayer?"
349
+ when:
350
+ field: platform
351
+ equals: mobile-game
352
+ default: false
353
+
354
+ - id: max-players
355
+ type: number
356
+ group: "Game-Specific"
357
+ message: "Max players"
358
+ when:
359
+ all:
360
+ - { field: platform, equals: mobile-game }
361
+ - { field: has-multiplayer, equals: true }
362
+ default: 4
363
+ min: 2
364
+ max: 100
365
+
366
+ - id: multiplayer-mode
367
+ type: text
368
+ group: "Game-Specific"
369
+ message: "Multiplayer mode"
370
+ when:
371
+ all:
372
+ - { field: platform, equals: mobile-game }
373
+ - { field: has-multiplayer, equals: true }
374
+ default: "co-op"
375
+ placeholder: "e.g., co-op, PvP"
376
+
377
+ - id: online-multiplayer
378
+ type: confirm
379
+ group: "Game-Specific"
380
+ message: "Online multiplayer?"
381
+ when:
382
+ all:
383
+ - { field: platform, equals: mobile-game }
384
+ - { field: has-multiplayer, equals: true }
385
+ default: true
386
+
387
+ # ── Web-Specific ─────────────────────────────────────────
388
+ - id: web-layout
389
+ type: text
390
+ group: "Web-Specific"
391
+ message: "Layout"
392
+ when:
393
+ any:
394
+ - { field: platform, equals: web-saas }
395
+ - { field: platform, equals: landing-page }
396
+ placeholder: "e.g., sidebar, top-nav"
397
+ validate:
398
+ - rule: required
399
+
400
+ - id: web-features
401
+ type: text
402
+ group: "Web-Specific"
403
+ message: "Key features"
404
+ when:
405
+ any:
406
+ - { field: platform, equals: web-saas }
407
+ - { field: platform, equals: landing-page }
408
+ placeholder: "Comma-separated features"
409
+ validate:
410
+ - rule: required
411
+
412
+ # ── Save Brief ───────────────────────────────────────────
413
+ - id: brief-name
414
+ type: text
415
+ group: "Save Brief"
416
+ message: "Save brief as"
417
+ placeholder: "my-app-brief"
418
+ validate:
419
+ - rule: required
420
+
421
+ - id: confirm-brief
422
+ type: confirm
423
+ group: "Save Brief"
424
+ message: "Confirm brief?"
425
+ default: true
426
+
427
+ output:
428
+ format: yaml
429
+ path: concept-brief.yaml
@@ -0,0 +1,69 @@
1
+ meta:
2
+ name: "Cost Analysis Report"
3
+ description: "Configure and view AI generation cost analysis"
4
+ version: "1.0.0"
5
+
6
+ theme:
7
+ preset: tokyonight
8
+
9
+ steps:
10
+ - id: report-type
11
+ type: select
12
+ group: "Report Type"
13
+ message: "What kind of cost report?"
14
+ options:
15
+ - { value: full, label: "Full Report", hint: "Complete cost breakdown across all runs" }
16
+ - { value: today, label: "Today's Costs", hint: "Filter to today's runs only" }
17
+ - { value: since, label: "Since Date", hint: "Filter runs since a specific date" }
18
+ - { value: single-run, label: "Single Run", hint: "Inspect a specific run by ID" }
19
+ default: full
20
+
21
+ - id: since-date
22
+ type: text
23
+ group: "Report Type"
24
+ message: "Start date"
25
+ placeholder: "YYYY-MM-DD"
26
+ when:
27
+ field: report-type
28
+ equals: since
29
+ validate:
30
+ - rule: required
31
+ - rule: pattern
32
+ value: "^\\d{4}-\\d{2}-\\d{2}$"
33
+ message: "Must be in YYYY-MM-DD format"
34
+
35
+ - id: run-id
36
+ type: text
37
+ group: "Report Type"
38
+ message: "Run ID to inspect"
39
+ when:
40
+ field: report-type
41
+ equals: single-run
42
+ validate:
43
+ - rule: required
44
+
45
+ - id: output-format
46
+ type: select
47
+ group: "Output Options"
48
+ message: "Output format"
49
+ options:
50
+ - { value: interactive, label: "Interactive", hint: "Browse runs and inspect details" }
51
+ - { value: summary, label: "Summary", hint: "Cost analytics overview only" }
52
+ - { value: json, label: "JSON", hint: "Machine-readable JSON output" }
53
+ - { value: markdown, label: "Markdown Report", hint: "Save as docs/costs-report.md" }
54
+ default: interactive
55
+
56
+ - id: save-report
57
+ type: confirm
58
+ group: "Output Options"
59
+ message: "Save report to docs/costs-report.md?"
60
+ default: true
61
+
62
+ - id: confirm-analyze
63
+ type: confirm
64
+ group: "Output Options"
65
+ message: "Run cost analysis?"
66
+ default: true
67
+
68
+ output:
69
+ format: json
@@ -0,0 +1,35 @@
1
+ meta:
2
+ name: Pipeline Demo
3
+ description: A multi-stage wizard demonstrating the pipeline concept
4
+
5
+ steps:
6
+ - id: stage
7
+ type: note
8
+ message: Stage 1 - Project Setup
9
+ description: First we'll set up your project basics
10
+
11
+ - id: project-name
12
+ type: text
13
+ message: What is your project name?
14
+ validate:
15
+ - rule: required
16
+
17
+ - id: stage2
18
+ type: note
19
+ message: Stage 2 - Configuration
20
+ description: Now let's configure your project
21
+
22
+ - id: language
23
+ type: select
24
+ message: Programming language?
25
+ options:
26
+ - { value: typescript, label: TypeScript }
27
+ - { value: javascript, label: JavaScript }
28
+
29
+ - id: confirm
30
+ type: confirm
31
+ message: Looks good?
32
+ default: true
33
+
34
+ output:
35
+ format: json
@@ -0,0 +1,52 @@
1
+ meta:
2
+ name: "Web Scraper CLI"
3
+ description: "Choose and run a web scraper for app store data collection"
4
+ version: "1.0.0"
5
+
6
+ theme:
7
+ preset: catppuccin
8
+
9
+ steps:
10
+ - id: scraper-info
11
+ type: note
12
+ group: "Scraper Selection"
13
+ message: "Available Scrapers"
14
+ description: "Select a scraper to run. Each scraper collects app metadata from its respective platform."
15
+
16
+ - id: scraper
17
+ type: select
18
+ group: "Scraper Selection"
19
+ message: "Pick a scraper"
20
+ options:
21
+ - { value: reelshort, label: "ReelShort", hint: "Scrape all shows from reelshort.com" }
22
+ - { value: dramabox, label: "DramaBox", hint: "Scrape all shows from dramaboxdb.com" }
23
+ - { value: goodshort, label: "GoodShort", hint: "Scrape dramas from goodshort.com" }
24
+ - { value: netshort, label: "NetShort", hint: "Scrape dramas from netshort.com" }
25
+ - { value: shorttv, label: "ShortTV", hint: "Scrape dramas from shorttv.live/ShortMax" }
26
+ - { value: mydrama, label: "MyDrama", hint: "Scrape dramas from my-drama.com" }
27
+ - { value: dribbble, label: "Dribbble Inspirations", hint: "Scrape App Store preview shots from Dribbble" }
28
+
29
+ - id: output-dir
30
+ type: path
31
+ group: "Output Settings"
32
+ message: "Output directory for scraped data"
33
+ default: "./data/scraped"
34
+ placeholder: "./data/scraped"
35
+
36
+ - id: output-format
37
+ type: select
38
+ group: "Output Settings"
39
+ message: "Output format for scraped data"
40
+ options:
41
+ - { value: json, label: "JSON" }
42
+ - { value: csv, label: "CSV" }
43
+ default: json
44
+
45
+ - id: confirm-scrape
46
+ type: confirm
47
+ group: "Confirmation"
48
+ message: "Start scraping?"
49
+ default: true
50
+
51
+ output:
52
+ format: json
@@ -0,0 +1,31 @@
1
+ meta:
2
+ name: Catppuccin Themed Setup
3
+ description: A project setup wizard using the Catppuccin color preset
4
+
5
+ theme:
6
+ preset: catppuccin
7
+
8
+ steps:
9
+ - id: project-name
10
+ type: text
11
+ message: What is your project name?
12
+ validate:
13
+ - rule: required
14
+ - rule: minLength
15
+ value: 2
16
+
17
+ - id: framework
18
+ type: select
19
+ message: Choose a framework
20
+ options:
21
+ - { value: nextjs, label: "Next.js" }
22
+ - { value: remix, label: Remix }
23
+ - { value: astro, label: Astro }
24
+
25
+ - id: confirm
26
+ type: confirm
27
+ message: Create project?
28
+ default: true
29
+
30
+ output:
31
+ format: json
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "grimoire-wizard",
3
- "version": "0.3.0",
3
+ "version": "0.4.0",
4
4
  "description": "Config-driven CLI wizard framework. Define interactive terminal wizards in YAML/JSON with back-navigation, conditional branching, theming, and structured output.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -47,6 +47,10 @@
47
47
  "inquirer",
48
48
  "clack"
49
49
  ],
50
+ "repository": {
51
+ "type": "git",
52
+ "url": "https://github.com/YosefHayim/grimoire.git"
53
+ },
50
54
  "author": "Yosef Hayim (https://github.com/YosefHayim)",
51
55
  "license": "MIT",
52
56
  "engines": {
File without changes
File without changes
File without changes
File without changes
File without changes