cascivo 1.5.0 → 1.7.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 (44) hide show
  1. package/README.md +7 -1
  2. package/dist/{args-CtmltI1S.mjs → args-DEL5BZq7.mjs} +2 -2
  3. package/dist/args-DEL5BZq7.mjs.map +1 -0
  4. package/dist/audit-Boq9kXpR.mjs +11 -0
  5. package/dist/audit-Boq9kXpR.mjs.map +1 -0
  6. package/dist/cmdspec.json +976 -0
  7. package/dist/config-CpoAu8C-.mjs +2 -0
  8. package/dist/config-CpoAu8C-.mjs.map +1 -0
  9. package/dist/{create-xLiwiyNv.mjs → create-BcfPWm1F.mjs} +2579 -317
  10. package/dist/create-BcfPWm1F.mjs.map +1 -0
  11. package/dist/{drift-BCtn9Ua_.mjs → drift-DiXM2Rag.mjs} +2 -2
  12. package/dist/drift-DiXM2Rag.mjs.map +1 -0
  13. package/dist/{eject-B94ujtUo.mjs → eject-CCb1WqVx.mjs} +2 -2
  14. package/dist/eject-CCb1WqVx.mjs.map +1 -0
  15. package/dist/email-BzLRydvR.mjs +5 -0
  16. package/dist/email-BzLRydvR.mjs.map +1 -0
  17. package/dist/fs-B7O-fNID.mjs.map +1 -1
  18. package/dist/generated/audit-contract.json +234 -6
  19. package/dist/{http-Dx1cFJ5S.mjs → http-B52v4-hw.mjs} +2 -2
  20. package/dist/http-B52v4-hw.mjs.map +1 -0
  21. package/dist/index.d.mts +3 -3
  22. package/dist/index.d.mts.map +1 -1
  23. package/dist/index.mjs +43 -26
  24. package/dist/index.mjs.map +1 -1
  25. package/dist/{lock-BwLjTQmQ.mjs → lock-C6ILDVCl.mjs} +2 -2
  26. package/dist/lock-C6ILDVCl.mjs.map +1 -0
  27. package/dist/mcp-jwnfOQIt.mjs.map +1 -1
  28. package/dist/peer-versions-DIPdOfWj.mjs.map +1 -1
  29. package/dist/template-init-BFlRHOxK.mjs.map +1 -1
  30. package/dist/tokens-VSJC9GgT.mjs.map +1 -1
  31. package/package.json +8 -6
  32. package/readme.body.md +7 -0
  33. package/dist/args-CtmltI1S.mjs.map +0 -1
  34. package/dist/audit-BAbfvNmR.mjs +0 -11
  35. package/dist/audit-BAbfvNmR.mjs.map +0 -1
  36. package/dist/config-DT-Cs7bC.mjs +0 -2
  37. package/dist/config-DT-Cs7bC.mjs.map +0 -1
  38. package/dist/create-xLiwiyNv.mjs.map +0 -1
  39. package/dist/drift-BCtn9Ua_.mjs.map +0 -1
  40. package/dist/eject-B94ujtUo.mjs.map +0 -1
  41. package/dist/email-CwQcZ-mB.mjs +0 -4
  42. package/dist/email-CwQcZ-mB.mjs.map +0 -1
  43. package/dist/http-Dx1cFJ5S.mjs.map +0 -1
  44. package/dist/lock-BwLjTQmQ.mjs.map +0 -1
@@ -0,0 +1,976 @@
1
+ {
2
+ "$schema": "https://docspack.dev/cmdspec/schema/v0.1.json",
3
+ "cmdspec": "0.1",
4
+ "info": {
5
+ "name": "cascivo",
6
+ "version": "1.7.0",
7
+ "summary": "Add, update and audit cascivo components in your project",
8
+ "description": "The cascivo CLI. Components are copied into your project as source you own (the shadcn model); the CLI resolves their dependencies, installs the runtime packages they need, and checks your code against the cascivo contract.\n\nRun it without installing: `npx cascivo <command>`.",
9
+ "homepage": "https://cascivo.com",
10
+ "license": {
11
+ "identifier": "MIT"
12
+ }
13
+ },
14
+ "subcommandRequired": true,
15
+ "exits": {
16
+ "0": {
17
+ "meaning": "success"
18
+ },
19
+ "1": {
20
+ "meaning": "the command failed or was used wrongly"
21
+ }
22
+ },
23
+ "options": [
24
+ {
25
+ "name": "--help",
26
+ "aliases": [
27
+ "-h"
28
+ ],
29
+ "summary": "Show this help, or a command's help",
30
+ "inherited": true
31
+ },
32
+ {
33
+ "name": "--version",
34
+ "aliases": [
35
+ "-v"
36
+ ],
37
+ "summary": "Print the CLI version"
38
+ }
39
+ ],
40
+ "commands": [
41
+ {
42
+ "name": "create",
43
+ "summary": "Scaffold a new ready-to-run app (shell + nav + theme)",
44
+ "description": "Scaffold a new app pre-wired with the cascivo app shell, side navigation, header and a theme. Writes a new directory; it does not install dependencies.",
45
+ "arguments": [
46
+ {
47
+ "name": "name",
48
+ "summary": "Directory and package name of the new app"
49
+ }
50
+ ],
51
+ "options": [
52
+ {
53
+ "name": "--framework",
54
+ "summary": "App framework",
55
+ "description": "`cloudflare` is a client app and its API, deployed as one Cloudflare Worker.",
56
+ "value": {
57
+ "name": "name",
58
+ "enum": [
59
+ "react-vite",
60
+ "astro",
61
+ "cloudflare"
62
+ ],
63
+ "default": "react-vite"
64
+ }
65
+ },
66
+ {
67
+ "name": "--runtime",
68
+ "summary": "UI runtime, for --framework cloudflare",
69
+ "value": {
70
+ "name": "name",
71
+ "enum": [
72
+ "preact",
73
+ "react"
74
+ ],
75
+ "default": "preact"
76
+ }
77
+ },
78
+ {
79
+ "name": "--example",
80
+ "summary": "Add a Worker-backed example page (cloudflare only)",
81
+ "description": "board (multiplayer page on a Durable Object), agent (AI assistant that answers with UI; needs --runtime react), notes (local-first, offline edits), import (CSV import on a Workflow), files (uploads into R2), export (PDF/PNG via Browser Run), usage (Workers Analytics Engine charts), crud (a D1 table behind DataTable's server mode), live (ops dashboard fed by a Queue), voice (Workers AI speech in and out), publish (views published as pages in D1), webhooks (signed GitHub deliveries), digest (weekly PDF email on a Cron Trigger), search (Vectorize + Workers AI), checkout (Stripe Checkout), newsletter (double opt-in via Amazon SES), social (post to Bluesky, Mastodon, LinkedIn, Threads and Buffer; needs --auth).",
82
+ "value": {
83
+ "name": "name",
84
+ "enum": [
85
+ "board",
86
+ "agent",
87
+ "notes",
88
+ "import",
89
+ "files",
90
+ "export",
91
+ "usage",
92
+ "crud",
93
+ "live",
94
+ "voice",
95
+ "publish",
96
+ "webhooks",
97
+ "digest",
98
+ "search",
99
+ "checkout",
100
+ "newsletter",
101
+ "social"
102
+ ]
103
+ }
104
+ },
105
+ {
106
+ "name": "--auth",
107
+ "summary": "Guard the Worker: access, email, oauth, or email,oauth (cloudflare only)",
108
+ "description": "`access` refuses every request Cloudflare Access did not let through. `email` adds accounts with emailed sign-in links; `oauth` adds GitHub, Google and LinkedIn sign-in. With either, every API write needs a signed-in user. `email,oauth` enables both.",
109
+ "value": {
110
+ "name": "mode"
111
+ }
112
+ },
113
+ {
114
+ "name": "--template",
115
+ "summary": "Start from a marketplace template (@ns/name or owner/repo/name)",
116
+ "value": {
117
+ "name": "spec"
118
+ },
119
+ "effects": [
120
+ "read",
121
+ "write",
122
+ "network"
123
+ ]
124
+ },
125
+ {
126
+ "name": "--theme",
127
+ "summary": "Theme to install",
128
+ "value": {
129
+ "name": "name",
130
+ "enum": [
131
+ "light",
132
+ "dark",
133
+ "warm",
134
+ "flat",
135
+ "minimal",
136
+ "midnight",
137
+ "pastel",
138
+ "brutalist",
139
+ "corporate",
140
+ "terminal",
141
+ "cyberpunk",
142
+ "arcade"
143
+ ]
144
+ }
145
+ },
146
+ {
147
+ "name": "--sections",
148
+ "summary": "Comma-separated nav section labels (one component each)",
149
+ "value": {
150
+ "name": "a, b"
151
+ }
152
+ },
153
+ {
154
+ "name": "--package-manager",
155
+ "aliases": [
156
+ "--pm"
157
+ ],
158
+ "summary": "Package manager named in the README and next steps",
159
+ "value": {
160
+ "name": "pm",
161
+ "enum": [
162
+ "pnpm",
163
+ "yarn",
164
+ "npm",
165
+ "bun"
166
+ ],
167
+ "defaultDescription": "auto-detect"
168
+ }
169
+ },
170
+ {
171
+ "name": "--yes",
172
+ "aliases": [
173
+ "-y"
174
+ ],
175
+ "summary": "Accept defaults, never prompt"
176
+ }
177
+ ],
178
+ "effects": [
179
+ "read",
180
+ "write"
181
+ ],
182
+ "interactive": {
183
+ "when": "tty",
184
+ "disable": "--yes"
185
+ },
186
+ "examples": [
187
+ {
188
+ "run": "npx cascivo create my-app"
189
+ },
190
+ {
191
+ "run": "npx cascivo create my-app --framework cloudflare --example crud --yes"
192
+ }
193
+ ]
194
+ },
195
+ {
196
+ "name": "init",
197
+ "summary": "Set up cascivo in the current project",
198
+ "description": "Writes cascivo.config.ts and installs the runtime dependencies (@cascivo/core, @cascivo/tokens, @cascivo/themes and the @preact/signals-react peer), plus cascivo as a dev dependency for the config's types.",
199
+ "options": [
200
+ {
201
+ "name": "--theme",
202
+ "summary": "Theme to configure",
203
+ "value": {
204
+ "name": "name",
205
+ "enum": [
206
+ "light",
207
+ "dark",
208
+ "warm",
209
+ "flat",
210
+ "minimal",
211
+ "midnight",
212
+ "pastel",
213
+ "brutalist",
214
+ "corporate",
215
+ "terminal",
216
+ "cyberpunk",
217
+ "arcade"
218
+ ]
219
+ }
220
+ },
221
+ {
222
+ "name": "--package-manager",
223
+ "aliases": [
224
+ "--pm"
225
+ ],
226
+ "summary": "Force a package manager",
227
+ "value": {
228
+ "name": "pm",
229
+ "enum": [
230
+ "pnpm",
231
+ "yarn",
232
+ "npm",
233
+ "bun"
234
+ ],
235
+ "defaultDescription": "auto-detect"
236
+ }
237
+ },
238
+ {
239
+ "name": "--no-install",
240
+ "summary": "Write files only; print the install commands to run yourself",
241
+ "effects": [
242
+ "read",
243
+ "write"
244
+ ]
245
+ },
246
+ {
247
+ "name": "--yes",
248
+ "aliases": [
249
+ "-y"
250
+ ],
251
+ "summary": "Accept defaults, never prompt (implied when stdin is not a TTY)"
252
+ }
253
+ ],
254
+ "effects": [
255
+ "read",
256
+ "write",
257
+ "network",
258
+ "exec"
259
+ ],
260
+ "interactive": {
261
+ "when": "tty",
262
+ "disable": "--yes"
263
+ },
264
+ "examples": [
265
+ {
266
+ "run": "npx cascivo init --theme dark --yes"
267
+ }
268
+ ]
269
+ },
270
+ {
271
+ "name": "add",
272
+ "summary": "Add components or a template to your project",
273
+ "description": "Copies component source (TSX + CSS module) from the registry into your project, resolving component dependencies, and installs the npm packages they need. Also installs templates (@ns/name) and third-party components (owner/repo/name).",
274
+ "arguments": [
275
+ {
276
+ "name": "component",
277
+ "required": true,
278
+ "variadic": true,
279
+ "summary": "A component name, @ns/name, or owner/repo/name"
280
+ }
281
+ ],
282
+ "options": [
283
+ {
284
+ "name": "--dry-run",
285
+ "summary": "Show what would be written without writing",
286
+ "effects": [
287
+ "read",
288
+ "network"
289
+ ]
290
+ },
291
+ {
292
+ "name": "--package-manager",
293
+ "aliases": [
294
+ "--pm"
295
+ ],
296
+ "summary": "Force a package manager",
297
+ "value": {
298
+ "name": "pm",
299
+ "enum": [
300
+ "pnpm",
301
+ "yarn",
302
+ "npm",
303
+ "bun"
304
+ ],
305
+ "defaultDescription": "auto-detect"
306
+ }
307
+ },
308
+ {
309
+ "name": "--no-install",
310
+ "summary": "Don't install npm-distributed entries or deps; print the commands instead",
311
+ "effects": [
312
+ "read",
313
+ "write",
314
+ "network"
315
+ ]
316
+ },
317
+ {
318
+ "name": "--yes",
319
+ "aliases": [
320
+ "-y"
321
+ ],
322
+ "summary": "Skip confirmation prompts"
323
+ }
324
+ ],
325
+ "effects": [
326
+ "read",
327
+ "write",
328
+ "network",
329
+ "exec"
330
+ ],
331
+ "interactive": {
332
+ "when": "tty",
333
+ "disable": "--yes"
334
+ },
335
+ "examples": [
336
+ {
337
+ "run": "npx cascivo add button dialog"
338
+ },
339
+ {
340
+ "run": "npx cascivo add data-table --dry-run"
341
+ }
342
+ ]
343
+ },
344
+ {
345
+ "name": "list",
346
+ "summary": "List components available in the configured registry",
347
+ "options": [
348
+ {
349
+ "name": "--installed",
350
+ "summary": "Only list components already installed in this project"
351
+ }
352
+ ],
353
+ "effects": [
354
+ "read",
355
+ "network"
356
+ ],
357
+ "idempotent": true,
358
+ "examples": [
359
+ {
360
+ "run": "npx cascivo list --installed"
361
+ }
362
+ ]
363
+ },
364
+ {
365
+ "name": "update",
366
+ "summary": "Update installed components to the current registry version",
367
+ "description": "Without a component argument, updates everything in the lockfile.",
368
+ "arguments": [
369
+ {
370
+ "name": "component",
371
+ "summary": "The installed component to update"
372
+ }
373
+ ],
374
+ "options": [
375
+ {
376
+ "name": "--check",
377
+ "summary": "List outdated components without writing",
378
+ "effects": [
379
+ "read",
380
+ "network"
381
+ ]
382
+ },
383
+ {
384
+ "name": "--yes",
385
+ "aliases": [
386
+ "-y"
387
+ ],
388
+ "summary": "Skip confirmation prompts"
389
+ }
390
+ ],
391
+ "effects": [
392
+ "read",
393
+ "write",
394
+ "network"
395
+ ],
396
+ "interactive": {
397
+ "when": "tty",
398
+ "disable": "--yes"
399
+ },
400
+ "examples": [
401
+ {
402
+ "run": "npx cascivo update --check"
403
+ },
404
+ {
405
+ "run": "npx cascivo update button --yes"
406
+ }
407
+ ]
408
+ },
409
+ {
410
+ "name": "search",
411
+ "summary": "Search components across the configured registries",
412
+ "arguments": [
413
+ {
414
+ "name": "query",
415
+ "required": true,
416
+ "variadic": true,
417
+ "summary": "Words to search for"
418
+ }
419
+ ],
420
+ "options": [
421
+ {
422
+ "name": "--registry",
423
+ "summary": "Restrict the search to one registry namespace",
424
+ "value": {
425
+ "name": "@ns"
426
+ }
427
+ }
428
+ ],
429
+ "effects": [
430
+ "read",
431
+ "network"
432
+ ],
433
+ "idempotent": true,
434
+ "examples": [
435
+ {
436
+ "run": "npx cascivo search date picker"
437
+ }
438
+ ]
439
+ },
440
+ {
441
+ "name": "view",
442
+ "summary": "Preview a component or template before installing",
443
+ "description": "Prints its files, dependencies and description without writing anything.",
444
+ "arguments": [
445
+ {
446
+ "name": "spec",
447
+ "required": true,
448
+ "summary": "A bare name, @ns/name, or owner/repo/name"
449
+ }
450
+ ],
451
+ "effects": [
452
+ "read",
453
+ "network"
454
+ ],
455
+ "idempotent": true,
456
+ "examples": [
457
+ {
458
+ "run": "npx cascivo view combobox"
459
+ }
460
+ ]
461
+ },
462
+ {
463
+ "name": "theme",
464
+ "summary": "Install a first-party theme, or build a custom one",
465
+ "subcommandRequired": true,
466
+ "commands": [
467
+ {
468
+ "name": "add",
469
+ "summary": "Install @cascivo/themes and print the import + data-theme wiring",
470
+ "arguments": [
471
+ {
472
+ "name": "name",
473
+ "required": true,
474
+ "summary": "light, dark, warm, flat, minimal, midnight, pastel, brutalist, corporate, terminal, cyberpunk or arcade"
475
+ }
476
+ ],
477
+ "effects": [
478
+ "read",
479
+ "write",
480
+ "network",
481
+ "exec"
482
+ ],
483
+ "examples": [
484
+ {
485
+ "run": "npx cascivo theme add midnight"
486
+ }
487
+ ]
488
+ },
489
+ {
490
+ "name": "create",
491
+ "summary": "Turn a theme-builder config into an owned <name>.theme.css",
492
+ "description": "Get <hash> from https://cascivo.com/create (\"Copy CLI command\").",
493
+ "arguments": [
494
+ {
495
+ "name": "name",
496
+ "required": true,
497
+ "summary": "Theme name"
498
+ }
499
+ ],
500
+ "options": [
501
+ {
502
+ "name": "--from",
503
+ "required": true,
504
+ "summary": "The theme-builder config hash",
505
+ "value": {
506
+ "name": "hash"
507
+ }
508
+ },
509
+ {
510
+ "name": "--out",
511
+ "summary": "Output file path",
512
+ "value": {
513
+ "name": "path",
514
+ "format": "file"
515
+ }
516
+ },
517
+ {
518
+ "name": "--dry-run",
519
+ "summary": "Print the CSS without writing",
520
+ "effects": []
521
+ }
522
+ ],
523
+ "effects": [
524
+ "write"
525
+ ],
526
+ "examples": [
527
+ {
528
+ "run": "npx cascivo theme create brand --from <hash>"
529
+ }
530
+ ]
531
+ }
532
+ ]
533
+ },
534
+ {
535
+ "name": "eject",
536
+ "summary": "Eject specific tokens into a scoped local override file",
537
+ "description": "Restyle a component without forking it.",
538
+ "arguments": [
539
+ {
540
+ "name": "component",
541
+ "required": true,
542
+ "summary": "The component whose tokens to eject"
543
+ }
544
+ ],
545
+ "options": [
546
+ {
547
+ "name": "--tokens",
548
+ "summary": "Comma-separated token names to eject",
549
+ "value": {
550
+ "name": "a,b",
551
+ "defaultDescription": "all"
552
+ }
553
+ },
554
+ {
555
+ "name": "--scope",
556
+ "summary": "CSS selector the overrides are scoped to",
557
+ "value": {
558
+ "name": "sel"
559
+ }
560
+ },
561
+ {
562
+ "name": "--out",
563
+ "summary": "Output file path",
564
+ "value": {
565
+ "name": "file",
566
+ "format": "file"
567
+ }
568
+ },
569
+ {
570
+ "name": "--dry-run",
571
+ "summary": "Print the override file without writing",
572
+ "effects": [
573
+ "read",
574
+ "network"
575
+ ]
576
+ }
577
+ ],
578
+ "effects": [
579
+ "read",
580
+ "write",
581
+ "network"
582
+ ],
583
+ "examples": [
584
+ {
585
+ "run": "npx cascivo eject button --tokens button-radius --scope .checkout"
586
+ }
587
+ ]
588
+ },
589
+ {
590
+ "name": "generate",
591
+ "summary": "Generate TSX from a ViewConfig JSON file",
592
+ "description": "The ViewConfig is what the MCP scaffold_view tool produces. With --out, the written file is formatted with the project's formatter when one is found.",
593
+ "arguments": [
594
+ {
595
+ "name": "config.json",
596
+ "required": true,
597
+ "summary": "The ViewConfig file",
598
+ "value": {
599
+ "format": "file"
600
+ }
601
+ }
602
+ ],
603
+ "options": [
604
+ {
605
+ "name": "--out",
606
+ "summary": "Output file",
607
+ "value": {
608
+ "name": "file",
609
+ "format": "file",
610
+ "defaultDescription": "stdout"
611
+ },
612
+ "effects": [
613
+ "read",
614
+ "write",
615
+ "network",
616
+ "exec"
617
+ ]
618
+ },
619
+ {
620
+ "name": "--components-dir",
621
+ "summary": "Components import base",
622
+ "value": {
623
+ "name": "dir",
624
+ "format": "directory",
625
+ "default": "./src/components/ui"
626
+ }
627
+ }
628
+ ],
629
+ "effects": [
630
+ "read",
631
+ "network"
632
+ ],
633
+ "examples": [
634
+ {
635
+ "run": "npx cascivo generate view.json --out src/Dashboard.tsx"
636
+ }
637
+ ]
638
+ },
639
+ {
640
+ "name": "doctor",
641
+ "summary": "Check components for rule violations",
642
+ "description": "Checks components for cascivo rule violations (banned React hooks, hardcoded strings, missing @cascivo/react exports). In an adopter project it also verifies the runtime dependencies copied source needs are declared in package.json, and compares installed components against the registry (copy-paste drift).",
643
+ "options": [
644
+ {
645
+ "name": "--ci",
646
+ "summary": "Exit non-zero when violations or missing runtime deps are found"
647
+ },
648
+ {
649
+ "name": "--drift",
650
+ "summary": "Only compare installed components against the registry (copy-paste drift)"
651
+ }
652
+ ],
653
+ "effects": [
654
+ "read",
655
+ "network"
656
+ ],
657
+ "idempotent": true,
658
+ "examples": [
659
+ {
660
+ "run": "npx cascivo doctor --ci"
661
+ }
662
+ ]
663
+ },
664
+ {
665
+ "name": "audit",
666
+ "summary": "Audit AI-generated code against the cascivo contract",
667
+ "description": "Finds hard-coded values that should be tokens, invented props, missing required props, and raw strings where i18n is expected.",
668
+ "arguments": [
669
+ {
670
+ "name": "paths",
671
+ "required": true,
672
+ "variadic": true,
673
+ "summary": "Files or directories to audit",
674
+ "value": {
675
+ "format": "path"
676
+ }
677
+ }
678
+ ],
679
+ "options": [
680
+ {
681
+ "name": "--ai",
682
+ "required": true,
683
+ "summary": "Audit against the cascivo contract"
684
+ },
685
+ {
686
+ "name": "--fix",
687
+ "summary": "Rewrite unambiguous CSS literals to their token equivalents",
688
+ "effects": [
689
+ "read",
690
+ "write"
691
+ ]
692
+ },
693
+ {
694
+ "name": "--json",
695
+ "summary": "Machine-readable output"
696
+ },
697
+ {
698
+ "name": "--level",
699
+ "summary": "Minimum finding level to report",
700
+ "value": {
701
+ "name": "name",
702
+ "enum": [
703
+ "error",
704
+ "warn"
705
+ ],
706
+ "default": "error"
707
+ }
708
+ },
709
+ {
710
+ "name": "--contract",
711
+ "summary": "Use this audit-contract.json instead of the bundled one",
712
+ "value": {
713
+ "name": "path",
714
+ "format": "file"
715
+ }
716
+ },
717
+ {
718
+ "name": "--verbose",
719
+ "summary": "Report which contract source was used"
720
+ }
721
+ ],
722
+ "effects": [
723
+ "read"
724
+ ],
725
+ "examples": [
726
+ {
727
+ "run": "npx cascivo audit --ai src/components --json"
728
+ }
729
+ ]
730
+ },
731
+ {
732
+ "name": "mcp",
733
+ "summary": "Configure the cascivo MCP server",
734
+ "subcommandRequired": true,
735
+ "commands": [
736
+ {
737
+ "name": "init",
738
+ "summary": "Add the cascivo MCP server to your agent's project config",
739
+ "description": "Adds `npx -y @cascivo/mcp`. Other servers in the file are kept; an existing cascivo entry is left as it is.",
740
+ "options": [
741
+ {
742
+ "name": "--client",
743
+ "summary": "Which agent config to write: claude (.mcp.json), cursor (.cursor/mcp.json) or vscode (.vscode/mcp.json)",
744
+ "value": {
745
+ "name": "name",
746
+ "enum": [
747
+ "claude",
748
+ "cursor",
749
+ "vscode"
750
+ ],
751
+ "default": "claude"
752
+ }
753
+ },
754
+ {
755
+ "name": "--dry-run",
756
+ "summary": "Print the file instead of writing it",
757
+ "effects": [
758
+ "read"
759
+ ]
760
+ }
761
+ ],
762
+ "effects": [
763
+ "read",
764
+ "write"
765
+ ],
766
+ "idempotent": true,
767
+ "examples": [
768
+ {
769
+ "run": "npx cascivo mcp init"
770
+ },
771
+ {
772
+ "run": "npx cascivo mcp init --client cursor"
773
+ }
774
+ ]
775
+ }
776
+ ]
777
+ },
778
+ {
779
+ "name": "registry",
780
+ "summary": "Build a static registry",
781
+ "subcommandRequired": true,
782
+ "commands": [
783
+ {
784
+ "name": "build",
785
+ "summary": "Build registry.json and file payloads from a registry manifest",
786
+ "description": "The output is ready to host on any static file server.",
787
+ "options": [
788
+ {
789
+ "name": "--in",
790
+ "summary": "The registry manifest",
791
+ "value": {
792
+ "name": "file",
793
+ "format": "file",
794
+ "default": "cascade-registry.json"
795
+ }
796
+ },
797
+ {
798
+ "name": "--out",
799
+ "summary": "Output directory",
800
+ "value": {
801
+ "name": "dir",
802
+ "format": "directory",
803
+ "default": "public/r"
804
+ }
805
+ }
806
+ ],
807
+ "effects": [
808
+ "read",
809
+ "write"
810
+ ],
811
+ "idempotent": true,
812
+ "examples": [
813
+ {
814
+ "run": "npx cascivo registry build --in cascivo-registry.json --out public/r"
815
+ }
816
+ ]
817
+ }
818
+ ]
819
+ },
820
+ {
821
+ "name": "template",
822
+ "summary": "Author marketplace templates",
823
+ "subcommandRequired": true,
824
+ "commands": [
825
+ {
826
+ "name": "init",
827
+ "summary": "Scaffold a new template (source + manifest + registry entry)",
828
+ "arguments": [
829
+ {
830
+ "name": "name",
831
+ "required": true,
832
+ "summary": "Template name"
833
+ }
834
+ ],
835
+ "options": [
836
+ {
837
+ "name": "--category",
838
+ "summary": "Template category (e.g. dashboard)",
839
+ "value": {
840
+ "name": "name",
841
+ "default": "misc"
842
+ }
843
+ },
844
+ {
845
+ "name": "--framework",
846
+ "summary": "Target framework",
847
+ "value": {
848
+ "name": "name",
849
+ "default": "react-vite"
850
+ }
851
+ },
852
+ {
853
+ "name": "--components",
854
+ "summary": "Registry components the template composes",
855
+ "value": {
856
+ "name": "a,b"
857
+ }
858
+ },
859
+ {
860
+ "name": "--repo",
861
+ "summary": "Repository the template will be hosted in",
862
+ "value": {
863
+ "name": "owner/repo"
864
+ }
865
+ }
866
+ ],
867
+ "effects": [
868
+ "read",
869
+ "write"
870
+ ],
871
+ "examples": [
872
+ {
873
+ "run": "npx cascivo template init sales-dashboard --category dashboard --components card,line-chart"
874
+ }
875
+ ]
876
+ }
877
+ ]
878
+ },
879
+ {
880
+ "name": "tokens",
881
+ "summary": "Design-token interchange",
882
+ "subcommandRequired": true,
883
+ "commands": [
884
+ {
885
+ "name": "import",
886
+ "summary": "Import external design tokens as cascivo overrides (not yet implemented)",
887
+ "description": "Reserved for importing W3C design-tokens JSON. This release prints a notice and changes nothing.",
888
+ "stability": "experimental",
889
+ "arguments": [
890
+ {
891
+ "name": "file",
892
+ "required": true,
893
+ "summary": "A W3C design-tokens JSON file",
894
+ "value": {
895
+ "format": "file"
896
+ }
897
+ }
898
+ ],
899
+ "effects": []
900
+ }
901
+ ]
902
+ },
903
+ {
904
+ "name": "email",
905
+ "summary": "Email tooling",
906
+ "subcommandRequired": true,
907
+ "commands": [
908
+ {
909
+ "name": "lint",
910
+ "summary": "Check rendered email HTML for client support and dead links",
911
+ "description": "The same conformance lint @cascivo/email exposes as `lint()`. It lints rendered HTML, not templates. The matrix is fetched from https://www.caniemail.com/api/data.json and cached in the temp directory for a day. Links that go nowhere (`checkLinks()`: empty, `#`, relative, an unreplaced merge tag, or a placeholder domain such as example.com) fail it too. A caveat (partial support, a localhost or http: link) never fails the command.",
912
+ "arguments": [
913
+ {
914
+ "name": "file",
915
+ "required": true,
916
+ "variadic": true,
917
+ "summary": "Rendered .html files, or - for stdin",
918
+ "value": {
919
+ "format": "file"
920
+ }
921
+ }
922
+ ],
923
+ "options": [
924
+ {
925
+ "name": "--data",
926
+ "summary": "Use a local copy of the matrix instead of fetching",
927
+ "value": {
928
+ "name": "file",
929
+ "format": "file"
930
+ },
931
+ "effects": [
932
+ "read"
933
+ ]
934
+ },
935
+ {
936
+ "name": "--refresh",
937
+ "summary": "Re-fetch the matrix even if the cache is fresh"
938
+ },
939
+ {
940
+ "name": "--no-allowlist",
941
+ "summary": "Report findings CASCIVO_ALLOW waives, too"
942
+ },
943
+ {
944
+ "name": "--check-links",
945
+ "summary": "Also request every http(s) URL; one answering 4xx/5xx, or not at all within 10s, fails the command",
946
+ "effects": [
947
+ "network"
948
+ ]
949
+ }
950
+ ],
951
+ "effects": [
952
+ "read",
953
+ "write",
954
+ "network"
955
+ ],
956
+ "exits": {
957
+ "1": {
958
+ "meaning": "a floor client cannot support something, a link cannot work, or the command failed"
959
+ }
960
+ },
961
+ "examples": [
962
+ {
963
+ "run": "npx cascivo email lint dist/emails/*.html"
964
+ },
965
+ {
966
+ "run": "node render.js | npx cascivo email lint -"
967
+ },
968
+ {
969
+ "run": "npx cascivo email lint dist/emails/*.html --check-links"
970
+ }
971
+ ]
972
+ }
973
+ ]
974
+ }
975
+ ]
976
+ }