@cratis/cast 0.0.1 → 0.2.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 (117) hide show
  1. package/README.md +13 -1
  2. package/badges/RegistryMember.ts +18 -0
  3. package/badges/ResolvedTier.ts +17 -0
  4. package/badges/Tier.ts +14 -0
  5. package/badges/TierSource.ts +14 -0
  6. package/badges/badgeSvg.ts +137 -0
  7. package/badges/constants.ts +17 -0
  8. package/badges/cratisMark.ts +15 -0
  9. package/badges/index.ts +12 -0
  10. package/badges/registry.ts +68 -0
  11. package/badges/resolveTier.ts +24 -0
  12. package/cast-json.schema.json +1496 -0
  13. package/cast.schema.json +1113 -0
  14. package/config/CastConfig.ts +17 -0
  15. package/config/CastConfigError.ts +10 -0
  16. package/config/LiveStat.ts +17 -0
  17. package/config/ResolvedSection.ts +13 -0
  18. package/config/SectionId.ts +21 -0
  19. package/config/ThemeMode.ts +9 -0
  20. package/config/calendar.ts +34 -0
  21. package/config/castSchema.ts +263 -0
  22. package/config/index.ts +12 -0
  23. package/config/parseCast.ts +58 -0
  24. package/config/resolveSections.ts +48 -0
  25. package/github/GitHubSnapshot.ts +66 -0
  26. package/github/fetchGitHub.ts +235 -0
  27. package/github/gitHubSnapshotSchema.ts +58 -0
  28. package/github/parse.ts +63 -0
  29. package/index.ts +88 -0
  30. package/integration/CastData.ts +20 -0
  31. package/integration/CastOptions.ts +17 -0
  32. package/integration/Snapshot.ts +12 -0
  33. package/integration/loadRegistry.ts +37 -0
  34. package/integration/resolveData.ts +138 -0
  35. package/integration/snapshotFile.ts +23 -0
  36. package/integration/virtualModule.ts +43 -0
  37. package/machine/castJson.ts +77 -0
  38. package/machine/castJsonSchema.ts +35 -0
  39. package/machine/index.ts +6 -0
  40. package/machine/llmsText.ts +69 -0
  41. package/machine/ogImageSvg.ts +79 -0
  42. package/machine/profileFromCastJson.ts +214 -0
  43. package/machine/resumeJson.ts +87 -0
  44. package/package.json +80 -8
  45. package/registry/members.yaml +16 -0
  46. package/routes/404.astro +42 -0
  47. package/routes/apple-touch-icon.png.ts +17 -0
  48. package/routes/badge-card.svg.ts +13 -0
  49. package/routes/badge.svg.ts +11 -0
  50. package/routes/cast.json.ts +17 -0
  51. package/routes/cv.astro +9 -0
  52. package/routes/favicon.svg.ts +16 -0
  53. package/routes/index.astro +9 -0
  54. package/routes/llms.txt.ts +10 -0
  55. package/routes/og.png.ts +23 -0
  56. package/routes/resume.json.ts +13 -0
  57. package/routes/robots.txt.ts +10 -0
  58. package/site/components/Activity.astro +196 -0
  59. package/site/components/Agentic.astro +144 -0
  60. package/site/components/CareerReplay.astro +415 -0
  61. package/site/components/CastBadge.astro +132 -0
  62. package/site/components/CommandPalette.astro +122 -0
  63. package/site/components/Contact.astro +166 -0
  64. package/site/components/Cratis.astro +235 -0
  65. package/site/components/CratisMark.astro +18 -0
  66. package/site/components/EventModel.astro +265 -0
  67. package/site/components/Footer.astro +33 -0
  68. package/site/components/Hero.astro +211 -0
  69. package/site/components/Inline.astro +45 -0
  70. package/site/components/Monogram.astro +28 -0
  71. package/site/components/Nav.astro +127 -0
  72. package/site/components/Now.astro +116 -0
  73. package/site/components/Projects.astro +185 -0
  74. package/site/components/PullRequestFeed.astro +88 -0
  75. package/site/components/SectionHeader.astro +30 -0
  76. package/site/components/Skills.astro +44 -0
  77. package/site/components/Stats.astro +106 -0
  78. package/site/components/Talks.astro +76 -0
  79. package/site/components/Terminal.astro +164 -0
  80. package/site/components/Writing.astro +128 -0
  81. package/site/data.ts +11 -0
  82. package/site/layouts/Base.astro +156 -0
  83. package/site/lib/accent.ts +52 -0
  84. package/site/lib/blog.ts +58 -0
  85. package/site/lib/career.ts +148 -0
  86. package/site/lib/clipboard.ts +12 -0
  87. package/site/lib/contributions.ts +63 -0
  88. package/site/lib/github.ts +72 -0
  89. package/site/lib/inline.ts +79 -0
  90. package/site/lib/lifecycle.ts +44 -0
  91. package/site/lib/motion.ts +43 -0
  92. package/site/lib/nav.ts +49 -0
  93. package/site/lib/reltime.ts +33 -0
  94. package/site/lib/safeJson.ts +15 -0
  95. package/site/lib/sections.ts +41 -0
  96. package/site/lib/theme.ts +28 -0
  97. package/site/pages/CvPage.astro +379 -0
  98. package/site/pages/ProfilePage.astro +78 -0
  99. package/site/profile/CastHost.ts +32 -0
  100. package/site/profile/CastView.ts +96 -0
  101. package/site/profile/assertRenderable.ts +151 -0
  102. package/site/profile/clientCast.ts +117 -0
  103. package/site/profile/index.ts +8 -0
  104. package/site/scripts/ambient.ts +93 -0
  105. package/site/scripts/event-board.ts +403 -0
  106. package/site/scripts/event-model.ts +155 -0
  107. package/site/scripts/heatmap.ts +94 -0
  108. package/site/scripts/live.ts +155 -0
  109. package/site/scripts/palette.ts +313 -0
  110. package/site/scripts/replay.ts +252 -0
  111. package/site/scripts/terminal.ts +559 -0
  112. package/site/styles/global.css +508 -0
  113. package/virtual.d.ts +15 -0
  114. package/writing/WritingSnapshot.ts +20 -0
  115. package/writing/fetchWriting.ts +69 -0
  116. package/writing/parse.ts +72 -0
  117. package/writing/writingSnapshotSchema.ts +27 -0
@@ -0,0 +1,1113 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "type": "object",
4
+ "properties": {
5
+ "$schema": {
6
+ "type": "string"
7
+ },
8
+ "site": {
9
+ "type": "object",
10
+ "properties": {
11
+ "url": {
12
+ "type": "string",
13
+ "format": "uri",
14
+ "description": "Public URL of the site, for example https://ada.dev."
15
+ },
16
+ "description": {
17
+ "description": "Meta description; defaults to the tagline and intro.",
18
+ "type": "string"
19
+ },
20
+ "source": {
21
+ "description": "Source repository, linked in the footer.",
22
+ "type": "string",
23
+ "format": "uri"
24
+ },
25
+ "language": {
26
+ "default": "en",
27
+ "type": "string"
28
+ }
29
+ },
30
+ "required": [
31
+ "url"
32
+ ]
33
+ },
34
+ "person": {
35
+ "type": "object",
36
+ "properties": {
37
+ "name": {
38
+ "type": "string",
39
+ "minLength": 1,
40
+ "description": "Display name, for example \"Ada Lovelace\"."
41
+ },
42
+ "fullName": {
43
+ "description": "Full legal name when it differs from the display name.",
44
+ "type": "string"
45
+ },
46
+ "handle": {
47
+ "type": "string",
48
+ "pattern": "^[A-Za-z0-9](?:[A-Za-z0-9]|-(?=[A-Za-z0-9])){0,38}$",
49
+ "description": "Your GitHub login: your one Cast identity. Tier, badge, /cast.json and the verification page all use it."
50
+ },
51
+ "title": {
52
+ "type": "string",
53
+ "minLength": 1,
54
+ "description": "Role line under your name."
55
+ },
56
+ "titleShort": {
57
+ "description": "Shorter role line for small screens.",
58
+ "type": "string"
59
+ },
60
+ "location": {
61
+ "type": "string"
62
+ },
63
+ "country": {
64
+ "description": "ISO 3166 two-letter country code, used in structured data.",
65
+ "type": "string",
66
+ "minLength": 2,
67
+ "maxLength": 2
68
+ },
69
+ "email": {
70
+ "type": "string",
71
+ "format": "email",
72
+ "pattern": "^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"
73
+ },
74
+ "photo": {
75
+ "description": "Portrait: a path relative to cast.yaml (for example ./avatar.jpeg) or an https URL.",
76
+ "type": "string"
77
+ },
78
+ "links": {
79
+ "default": {},
80
+ "description": "Profile links by name: github, linkedin, mastodon, bluesky, website or anything else.",
81
+ "type": "object",
82
+ "propertyNames": {
83
+ "type": "string"
84
+ },
85
+ "additionalProperties": {
86
+ "type": "string",
87
+ "format": "uri"
88
+ }
89
+ },
90
+ "tagline": {
91
+ "type": "string",
92
+ "minLength": 1,
93
+ "description": "The hero headline. Wrap the words to accent in *asterisks*."
94
+ },
95
+ "intro": {
96
+ "type": "string",
97
+ "minLength": 1,
98
+ "description": "One paragraph under the headline."
99
+ },
100
+ "about": {
101
+ "default": [],
102
+ "type": "array",
103
+ "items": {
104
+ "type": "string",
105
+ "minLength": 1
106
+ }
107
+ },
108
+ "interests": {
109
+ "default": [],
110
+ "type": "array",
111
+ "items": {
112
+ "type": "string"
113
+ }
114
+ },
115
+ "languages": {
116
+ "default": [],
117
+ "type": "array",
118
+ "items": {
119
+ "type": "string"
120
+ }
121
+ }
122
+ },
123
+ "required": [
124
+ "name",
125
+ "handle",
126
+ "title",
127
+ "tagline",
128
+ "intro"
129
+ ]
130
+ },
131
+ "now": {
132
+ "default": {},
133
+ "description": "The \"now\" read model: ordered key/value rows. YYYY-MM values are shown as months.",
134
+ "type": "object",
135
+ "propertyNames": {
136
+ "type": "string"
137
+ },
138
+ "additionalProperties": {
139
+ "anyOf": [
140
+ {
141
+ "type": "string"
142
+ },
143
+ {
144
+ "type": "array",
145
+ "items": {
146
+ "type": "string"
147
+ }
148
+ }
149
+ ]
150
+ }
151
+ },
152
+ "stats": {
153
+ "default": [],
154
+ "type": "array",
155
+ "items": {
156
+ "type": "object",
157
+ "properties": {
158
+ "value": {
159
+ "type": "number"
160
+ },
161
+ "prefix": {
162
+ "default": "",
163
+ "type": "string"
164
+ },
165
+ "suffix": {
166
+ "default": "",
167
+ "type": "string"
168
+ },
169
+ "label": {
170
+ "type": "string",
171
+ "minLength": 1
172
+ },
173
+ "live": {
174
+ "description": "Replace the value with a build-time number.",
175
+ "type": "string",
176
+ "enum": [
177
+ "contributionsLastYear",
178
+ "mergedPullRequests",
179
+ "rankOneRepositories",
180
+ "clientLanguages"
181
+ ]
182
+ },
183
+ "plain": {
184
+ "default": false,
185
+ "description": "Show the value without counting up or thousands separators.",
186
+ "type": "boolean"
187
+ }
188
+ },
189
+ "required": [
190
+ "value",
191
+ "label"
192
+ ]
193
+ }
194
+ },
195
+ "career": {
196
+ "default": {
197
+ "events": []
198
+ },
199
+ "type": "object",
200
+ "properties": {
201
+ "events": {
202
+ "default": [],
203
+ "type": "array",
204
+ "items": {
205
+ "type": "object",
206
+ "properties": {
207
+ "seq": {
208
+ "description": "Stream position. Assigned in file order when omitted.",
209
+ "type": "integer",
210
+ "exclusiveMinimum": 0,
211
+ "maximum": 9007199254740991
212
+ },
213
+ "date": {
214
+ "type": "string",
215
+ "pattern": "^\\d{4}(-\\d{2})?$"
216
+ },
217
+ "endDate": {
218
+ "description": "End of an engagement that does not set a role.",
219
+ "type": "string",
220
+ "pattern": "^\\d{4}(-\\d{2})?$"
221
+ },
222
+ "type": {
223
+ "type": "string",
224
+ "pattern": "^[A-Z][A-Za-z]+$",
225
+ "description": "Past-tense event name."
226
+ },
227
+ "title": {
228
+ "type": "string",
229
+ "minLength": 1
230
+ },
231
+ "org": {
232
+ "type": "string"
233
+ },
234
+ "orgUrl": {
235
+ "type": "string",
236
+ "format": "uri"
237
+ },
238
+ "location": {
239
+ "type": "string"
240
+ },
241
+ "summary": {
242
+ "type": "string",
243
+ "minLength": 1
244
+ },
245
+ "skills": {
246
+ "type": "array",
247
+ "items": {
248
+ "type": "string"
249
+ }
250
+ },
251
+ "role": {
252
+ "description": "Sets the current role in the projection.",
253
+ "type": "string"
254
+ },
255
+ "endsRole": {
256
+ "description": "Organization whose open role this event ends.",
257
+ "type": "string"
258
+ }
259
+ },
260
+ "required": [
261
+ "date",
262
+ "type",
263
+ "title",
264
+ "summary"
265
+ ]
266
+ }
267
+ }
268
+ }
269
+ },
270
+ "cratis": {
271
+ "type": "object",
272
+ "properties": {
273
+ "title": {
274
+ "default": "What I lead at Cratis.",
275
+ "type": "string"
276
+ },
277
+ "label": {
278
+ "default": "Cratis",
279
+ "type": "string"
280
+ },
281
+ "pitch": {
282
+ "type": "string",
283
+ "minLength": 1
284
+ },
285
+ "role": {
286
+ "type": "string",
287
+ "minLength": 1,
288
+ "description": "What you do at Cratis, in your own words."
289
+ },
290
+ "links": {
291
+ "default": {
292
+ "cratis.io": "https://cratis.io",
293
+ "github.com/Cratis": "https://github.com/Cratis"
294
+ },
295
+ "type": "object",
296
+ "propertyNames": {
297
+ "type": "string"
298
+ },
299
+ "additionalProperties": {
300
+ "type": "string",
301
+ "format": "uri"
302
+ }
303
+ },
304
+ "pipeline": {
305
+ "default": [],
306
+ "description": "Repository names shown as the model-to-running-app pipeline, left to right.",
307
+ "type": "array",
308
+ "items": {
309
+ "type": "string"
310
+ }
311
+ },
312
+ "clientLanguages": {
313
+ "default": [],
314
+ "type": "array",
315
+ "items": {
316
+ "type": "string"
317
+ }
318
+ },
319
+ "repos": {
320
+ "default": [],
321
+ "type": "array",
322
+ "items": {
323
+ "type": "object",
324
+ "properties": {
325
+ "name": {
326
+ "type": "string",
327
+ "minLength": 1,
328
+ "description": "Repository name in the Cratis organization."
329
+ },
330
+ "url": {
331
+ "description": "Omit for repositories that are not public; they are then never fetched.",
332
+ "type": "string",
333
+ "format": "uri"
334
+ },
335
+ "kind": {
336
+ "type": "string",
337
+ "minLength": 1
338
+ },
339
+ "group": {
340
+ "default": "tooling",
341
+ "type": "string",
342
+ "enum": [
343
+ "pipeline",
344
+ "tooling",
345
+ "client"
346
+ ]
347
+ },
348
+ "step": {
349
+ "type": "string"
350
+ },
351
+ "note": {
352
+ "type": "string"
353
+ },
354
+ "role": {
355
+ "description": "Fallback role text; replaced by the live rank when GitHub data is available.",
356
+ "type": "string"
357
+ },
358
+ "rank": {
359
+ "default": 0,
360
+ "type": "integer",
361
+ "minimum": 0,
362
+ "maximum": 9007199254740991
363
+ },
364
+ "founded": {
365
+ "default": false,
366
+ "type": "boolean"
367
+ },
368
+ "commits": {
369
+ "default": 0,
370
+ "type": "integer",
371
+ "minimum": 0,
372
+ "maximum": 9007199254740991
373
+ },
374
+ "prs": {
375
+ "default": 0,
376
+ "type": "integer",
377
+ "minimum": 0,
378
+ "maximum": 9007199254740991
379
+ },
380
+ "desc": {
381
+ "type": "string",
382
+ "minLength": 1
383
+ }
384
+ },
385
+ "required": [
386
+ "name",
387
+ "kind",
388
+ "desc"
389
+ ]
390
+ }
391
+ },
392
+ "highlights": {
393
+ "default": [],
394
+ "type": "array",
395
+ "items": {
396
+ "type": "string"
397
+ }
398
+ }
399
+ },
400
+ "required": [
401
+ "role"
402
+ ]
403
+ },
404
+ "projects": {
405
+ "default": [],
406
+ "type": "array",
407
+ "items": {
408
+ "type": "object",
409
+ "properties": {
410
+ "name": {
411
+ "type": "string",
412
+ "minLength": 1
413
+ },
414
+ "url": {
415
+ "type": "string",
416
+ "format": "uri"
417
+ },
418
+ "pitch": {
419
+ "type": "string",
420
+ "minLength": 1
421
+ },
422
+ "features": {
423
+ "default": [],
424
+ "type": "array",
425
+ "items": {
426
+ "type": "string"
427
+ }
428
+ },
429
+ "stack": {
430
+ "default": [],
431
+ "type": "array",
432
+ "items": {
433
+ "type": "string"
434
+ }
435
+ },
436
+ "install": {
437
+ "description": "Install command with a copy button.",
438
+ "type": "string"
439
+ },
440
+ "version": {
441
+ "description": "Fallback version; replaced by the latest GitHub release when tracked.",
442
+ "type": "string"
443
+ },
444
+ "category": {
445
+ "default": "project",
446
+ "type": "string"
447
+ },
448
+ "featured": {
449
+ "default": false,
450
+ "description": "Show the card at double width.",
451
+ "type": "boolean"
452
+ }
453
+ },
454
+ "required": [
455
+ "name",
456
+ "url",
457
+ "pitch"
458
+ ]
459
+ }
460
+ },
461
+ "projectCategories": {
462
+ "default": [],
463
+ "type": "array",
464
+ "items": {
465
+ "type": "object",
466
+ "properties": {
467
+ "id": {
468
+ "type": "string",
469
+ "minLength": 1
470
+ },
471
+ "label": {
472
+ "type": "string",
473
+ "minLength": 1
474
+ },
475
+ "filter": {
476
+ "description": "Filter chip label; defaults to label.",
477
+ "type": "string"
478
+ }
479
+ },
480
+ "required": [
481
+ "id",
482
+ "label"
483
+ ]
484
+ }
485
+ },
486
+ "talks": {
487
+ "default": [],
488
+ "type": "array",
489
+ "items": {
490
+ "type": "object",
491
+ "properties": {
492
+ "title": {
493
+ "type": "string",
494
+ "minLength": 1
495
+ },
496
+ "lang": {
497
+ "default": "en",
498
+ "description": "BCP 47 language of the talk, for example \"en\" or \"no\".",
499
+ "type": "string"
500
+ },
501
+ "host": {
502
+ "type": "string",
503
+ "minLength": 1
504
+ },
505
+ "with": {
506
+ "type": "string"
507
+ },
508
+ "date": {
509
+ "type": "string",
510
+ "pattern": "^\\d{4}(-\\d{2}(-\\d{2})?)?$"
511
+ },
512
+ "url": {
513
+ "type": "string",
514
+ "format": "uri"
515
+ },
516
+ "summary": {
517
+ "type": "string",
518
+ "minLength": 1
519
+ }
520
+ },
521
+ "required": [
522
+ "title",
523
+ "host",
524
+ "date",
525
+ "summary"
526
+ ]
527
+ }
528
+ },
529
+ "community": {
530
+ "default": [],
531
+ "type": "array",
532
+ "items": {
533
+ "type": "object",
534
+ "properties": {
535
+ "title": {
536
+ "type": "string",
537
+ "minLength": 1
538
+ },
539
+ "detail": {
540
+ "default": "",
541
+ "type": "string"
542
+ },
543
+ "date": {
544
+ "type": "string",
545
+ "pattern": "^\\d{4}(-\\d{2}(-\\d{2})?)?$"
546
+ }
547
+ },
548
+ "required": [
549
+ "title",
550
+ "date"
551
+ ]
552
+ }
553
+ },
554
+ "writing": {
555
+ "default": {
556
+ "sources": [],
557
+ "themes": []
558
+ },
559
+ "type": "object",
560
+ "properties": {
561
+ "sources": {
562
+ "default": [],
563
+ "type": "array",
564
+ "items": {
565
+ "anyOf": [
566
+ {
567
+ "type": "object",
568
+ "properties": {
569
+ "rss": {
570
+ "type": "string",
571
+ "format": "uri",
572
+ "description": "RSS or Atom feed URL."
573
+ },
574
+ "author": {
575
+ "description": "Only include entries by this author name.",
576
+ "type": "string"
577
+ }
578
+ },
579
+ "required": [
580
+ "rss"
581
+ ]
582
+ },
583
+ {
584
+ "type": "object",
585
+ "properties": {
586
+ "starlightBlogAuthor": {
587
+ "type": "string",
588
+ "format": "uri",
589
+ "description": "Author page of a Starlight Blog site, for example https://blog.cratis.io/authors/your-name/."
590
+ }
591
+ },
592
+ "required": [
593
+ "starlightBlogAuthor"
594
+ ]
595
+ }
596
+ ]
597
+ }
598
+ },
599
+ "themes": {
600
+ "default": [],
601
+ "description": "Filter chips, each a set of post tags.",
602
+ "type": "array",
603
+ "items": {
604
+ "type": "object",
605
+ "properties": {
606
+ "id": {
607
+ "type": "string",
608
+ "pattern": "^[a-z0-9-]+$"
609
+ },
610
+ "label": {
611
+ "type": "string",
612
+ "minLength": 1
613
+ },
614
+ "tags": {
615
+ "minItems": 1,
616
+ "type": "array",
617
+ "items": {
618
+ "type": "string"
619
+ }
620
+ }
621
+ },
622
+ "required": [
623
+ "id",
624
+ "label",
625
+ "tags"
626
+ ]
627
+ }
628
+ },
629
+ "agenticTheme": {
630
+ "description": "Theme id whose posts the agentic section lists.",
631
+ "type": "string"
632
+ }
633
+ }
634
+ },
635
+ "agentic": {
636
+ "type": "object",
637
+ "properties": {
638
+ "title": {
639
+ "default": "I build the harness.",
640
+ "type": "string"
641
+ },
642
+ "pitch": {
643
+ "type": "string",
644
+ "minLength": 1
645
+ },
646
+ "label": {
647
+ "default": "Agentic engineering",
648
+ "type": "string"
649
+ },
650
+ "workflowLabel": {
651
+ "default": "every change in my setup",
652
+ "type": "string"
653
+ },
654
+ "workflow": {
655
+ "default": [],
656
+ "type": "array",
657
+ "items": {
658
+ "type": "object",
659
+ "properties": {
660
+ "step": {
661
+ "type": "string",
662
+ "minLength": 1
663
+ },
664
+ "event": {
665
+ "type": "string",
666
+ "pattern": "^[A-Z][A-Za-z]+$"
667
+ },
668
+ "who": {
669
+ "type": "string",
670
+ "minLength": 1
671
+ },
672
+ "text": {
673
+ "type": "string",
674
+ "minLength": 1
675
+ },
676
+ "loop": {
677
+ "description": "A loop-back note shown on the step, for example \"blocker → Implement\".",
678
+ "type": "string"
679
+ }
680
+ },
681
+ "required": [
682
+ "step",
683
+ "event",
684
+ "who",
685
+ "text"
686
+ ]
687
+ }
688
+ },
689
+ "items": {
690
+ "default": [],
691
+ "type": "array",
692
+ "items": {
693
+ "type": "object",
694
+ "properties": {
695
+ "name": {
696
+ "type": "string",
697
+ "minLength": 1
698
+ },
699
+ "url": {
700
+ "type": "string",
701
+ "format": "uri"
702
+ },
703
+ "kind": {
704
+ "type": "string",
705
+ "minLength": 1
706
+ },
707
+ "text": {
708
+ "type": "string",
709
+ "minLength": 1
710
+ },
711
+ "list": {
712
+ "type": "array",
713
+ "items": {
714
+ "type": "string"
715
+ }
716
+ },
717
+ "listLabel": {
718
+ "type": "string"
719
+ }
720
+ },
721
+ "required": [
722
+ "name",
723
+ "kind",
724
+ "text"
725
+ ]
726
+ }
727
+ }
728
+ },
729
+ "required": [
730
+ "pitch"
731
+ ]
732
+ },
733
+ "eventModel": {
734
+ "type": "object",
735
+ "properties": {
736
+ "title": {
737
+ "default": "Start with the *event model.*",
738
+ "type": "string"
739
+ },
740
+ "label": {
741
+ "default": "How I think",
742
+ "type": "string"
743
+ },
744
+ "intro": {
745
+ "description": "Paragraph under the title. Defaults to a short explanation of the board.",
746
+ "type": "string",
747
+ "minLength": 1
748
+ },
749
+ "summary": {
750
+ "description": "Line under the board before a card is selected.",
751
+ "type": "string"
752
+ },
753
+ "name": {
754
+ "type": "string",
755
+ "minLength": 1
756
+ },
757
+ "repo": {
758
+ "type": "string",
759
+ "format": "uri"
760
+ },
761
+ "sourceRoot": {
762
+ "default": "",
763
+ "type": "string"
764
+ },
765
+ "branch": {
766
+ "default": "main",
767
+ "type": "string"
768
+ },
769
+ "columns": {
770
+ "type": "integer",
771
+ "exclusiveMinimum": 0,
772
+ "maximum": 9007199254740991
773
+ },
774
+ "lanes": {
775
+ "minItems": 1,
776
+ "type": "array",
777
+ "items": {
778
+ "type": "object",
779
+ "properties": {
780
+ "id": {
781
+ "type": "string",
782
+ "minLength": 1
783
+ },
784
+ "label": {
785
+ "type": "string",
786
+ "minLength": 1
787
+ }
788
+ },
789
+ "required": [
790
+ "id",
791
+ "label"
792
+ ]
793
+ }
794
+ },
795
+ "cards": {
796
+ "minItems": 1,
797
+ "type": "array",
798
+ "items": {
799
+ "type": "object",
800
+ "properties": {
801
+ "id": {
802
+ "type": "string",
803
+ "minLength": 1
804
+ },
805
+ "kind": {
806
+ "type": "string",
807
+ "enum": [
808
+ "ui",
809
+ "command",
810
+ "event",
811
+ "view"
812
+ ]
813
+ },
814
+ "name": {
815
+ "type": "string",
816
+ "minLength": 1
817
+ },
818
+ "lane": {
819
+ "type": "string",
820
+ "minLength": 1
821
+ },
822
+ "col": {
823
+ "type": "integer",
824
+ "minimum": 0,
825
+ "maximum": 9007199254740991
826
+ },
827
+ "source": {
828
+ "type": "string",
829
+ "minLength": 1
830
+ },
831
+ "note": {
832
+ "type": "string",
833
+ "minLength": 1
834
+ }
835
+ },
836
+ "required": [
837
+ "id",
838
+ "kind",
839
+ "name",
840
+ "lane",
841
+ "col",
842
+ "source",
843
+ "note"
844
+ ]
845
+ }
846
+ },
847
+ "edges": {
848
+ "default": [],
849
+ "type": "array",
850
+ "items": {
851
+ "type": "array",
852
+ "prefixItems": [
853
+ {
854
+ "type": "string"
855
+ },
856
+ {
857
+ "type": "string"
858
+ }
859
+ ],
860
+ "items": false,
861
+ "minItems": 2,
862
+ "maxItems": 2
863
+ }
864
+ },
865
+ "steps": {
866
+ "default": [],
867
+ "type": "array",
868
+ "items": {
869
+ "type": "object",
870
+ "properties": {
871
+ "title": {
872
+ "type": "string",
873
+ "minLength": 1
874
+ },
875
+ "text": {
876
+ "type": "string",
877
+ "minLength": 1
878
+ },
879
+ "cards": {
880
+ "type": "array",
881
+ "items": {
882
+ "type": "string"
883
+ }
884
+ }
885
+ },
886
+ "required": [
887
+ "title",
888
+ "text",
889
+ "cards"
890
+ ]
891
+ }
892
+ }
893
+ },
894
+ "required": [
895
+ "name",
896
+ "repo",
897
+ "columns",
898
+ "lanes",
899
+ "cards"
900
+ ]
901
+ },
902
+ "skills": {
903
+ "default": {},
904
+ "type": "object",
905
+ "propertyNames": {
906
+ "type": "string"
907
+ },
908
+ "additionalProperties": {
909
+ "type": "array",
910
+ "items": {
911
+ "type": "string"
912
+ }
913
+ }
914
+ },
915
+ "education": {
916
+ "default": [],
917
+ "type": "array",
918
+ "items": {
919
+ "type": "object",
920
+ "properties": {
921
+ "degree": {
922
+ "type": "string",
923
+ "minLength": 1
924
+ },
925
+ "school": {
926
+ "type": "string",
927
+ "minLength": 1
928
+ },
929
+ "from": {
930
+ "type": "string",
931
+ "minLength": 1
932
+ },
933
+ "to": {
934
+ "type": "string"
935
+ }
936
+ },
937
+ "required": [
938
+ "degree",
939
+ "school",
940
+ "from"
941
+ ]
942
+ }
943
+ },
944
+ "certifications": {
945
+ "default": [],
946
+ "type": "array",
947
+ "items": {
948
+ "type": "object",
949
+ "properties": {
950
+ "title": {
951
+ "type": "string",
952
+ "minLength": 1
953
+ },
954
+ "issuer": {
955
+ "type": "string",
956
+ "minLength": 1
957
+ },
958
+ "year": {
959
+ "type": "string",
960
+ "minLength": 1
961
+ },
962
+ "url": {
963
+ "type": "string",
964
+ "format": "uri"
965
+ }
966
+ },
967
+ "required": [
968
+ "title",
969
+ "issuer",
970
+ "year"
971
+ ]
972
+ }
973
+ },
974
+ "github": {
975
+ "default": {
976
+ "orgs": [
977
+ "Cratis"
978
+ ],
979
+ "releases": [],
980
+ "stars": []
981
+ },
982
+ "type": "object",
983
+ "properties": {
984
+ "login": {
985
+ "description": "Must equal person.handle (case-insensitive) when given; your GitHub login is your one identity.",
986
+ "type": "string"
987
+ },
988
+ "orgs": {
989
+ "default": [
990
+ "Cratis"
991
+ ],
992
+ "description": "Organizations whose merged public pull requests are counted. The first one feeds the live pull request feed.",
993
+ "type": "array",
994
+ "items": {
995
+ "type": "string"
996
+ }
997
+ },
998
+ "releases": {
999
+ "default": [],
1000
+ "description": "owner/name repositories whose latest release versions your projects.",
1001
+ "type": "array",
1002
+ "items": {
1003
+ "type": "string",
1004
+ "pattern": "^[\\w.-]+\\/[\\w.-]+$"
1005
+ }
1006
+ },
1007
+ "stars": {
1008
+ "default": [],
1009
+ "description": "owner/name repositories whose star count is shown.",
1010
+ "type": "array",
1011
+ "items": {
1012
+ "type": "string",
1013
+ "pattern": "^[\\w.-]+\\/[\\w.-]+$"
1014
+ }
1015
+ }
1016
+ }
1017
+ },
1018
+ "theme": {
1019
+ "default": {
1020
+ "accent": "#8b5cf6",
1021
+ "mode": "dark"
1022
+ },
1023
+ "type": "object",
1024
+ "properties": {
1025
+ "accent": {
1026
+ "default": "#8b5cf6",
1027
+ "description": "Your accent color. Defaults to Cratis violet.",
1028
+ "type": "string",
1029
+ "pattern": "^#[0-9a-fA-F]{6}$"
1030
+ },
1031
+ "mode": {
1032
+ "default": "dark",
1033
+ "type": "string",
1034
+ "enum": [
1035
+ "dark",
1036
+ "light",
1037
+ "system"
1038
+ ]
1039
+ }
1040
+ }
1041
+ },
1042
+ "sections": {
1043
+ "description": "Section order. Listed sections render in this order; omitted ones are hidden. Omit the key to show every section that has data.",
1044
+ "type": "array",
1045
+ "items": {
1046
+ "anyOf": [
1047
+ {
1048
+ "type": "string",
1049
+ "enum": [
1050
+ "hero",
1051
+ "now",
1052
+ "stats",
1053
+ "career",
1054
+ "model",
1055
+ "cratis",
1056
+ "activity",
1057
+ "agentic",
1058
+ "projects",
1059
+ "writing",
1060
+ "talks",
1061
+ "skills",
1062
+ "contact"
1063
+ ]
1064
+ },
1065
+ {
1066
+ "type": "object",
1067
+ "properties": {
1068
+ "id": {
1069
+ "type": "string",
1070
+ "enum": [
1071
+ "hero",
1072
+ "now",
1073
+ "stats",
1074
+ "career",
1075
+ "model",
1076
+ "cratis",
1077
+ "activity",
1078
+ "agentic",
1079
+ "projects",
1080
+ "writing",
1081
+ "talks",
1082
+ "skills",
1083
+ "contact"
1084
+ ]
1085
+ },
1086
+ "title": {
1087
+ "type": "string"
1088
+ },
1089
+ "label": {
1090
+ "type": "string"
1091
+ },
1092
+ "intro": {
1093
+ "type": "string",
1094
+ "minLength": 1
1095
+ }
1096
+ },
1097
+ "required": [
1098
+ "id"
1099
+ ]
1100
+ }
1101
+ ]
1102
+ }
1103
+ }
1104
+ },
1105
+ "required": [
1106
+ "site",
1107
+ "person"
1108
+ ],
1109
+ "additionalProperties": false,
1110
+ "$id": "https://unpkg.com/@cratis/cast/cast.schema.json",
1111
+ "title": "Cratis Cast: cast.yaml",
1112
+ "description": "One file that becomes a verified, event-sourced profile site. See https://github.com/Cratis/Cast/blob/main/Documentation/cast-yaml.md"
1113
+ }