ultimate-brain 0.0.0-stage → 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 (83) hide show
  1. package/.agents/skills/README.md +3 -0
  2. package/.agents/skills/brain-apply/SKILL.md +80 -0
  3. package/.agents/skills/brain-connect-notion/SKILL.md +55 -0
  4. package/.agents/skills/brain-howto/SKILL.md +36 -0
  5. package/.agents/skills/brain-howto/references/guide.md +176 -0
  6. package/.agents/skills/brain-ingest/SKILL.md +105 -0
  7. package/.agents/skills/brain-ingest/references/cli-inputs.md +129 -0
  8. package/.agents/skills/brain-ingest/references/example-batch.json +165 -0
  9. package/.agents/skills/brain-ingest/references/extraction.md +118 -0
  10. package/.agents/skills/brain-ingest/references/notion.md +65 -0
  11. package/.agents/skills/brain-ingest/references/sources.md +70 -0
  12. package/.agents/skills/brain-notion-change/SKILL.md +57 -0
  13. package/.agents/skills/brain-query/SKILL.md +62 -0
  14. package/.agents/skills/brain-sync/SKILL.md +66 -0
  15. package/.agents/skills/brain-sync/references/formats.md +53 -0
  16. package/LICENSE +21 -0
  17. package/README.md +40 -2
  18. package/bin/brain.js +5 -0
  19. package/dist/cli.js +83 -0
  20. package/dist/commands/apply.js +34 -0
  21. package/dist/commands/config.js +96 -0
  22. package/dist/commands/id.js +32 -0
  23. package/dist/commands/index.js +58 -0
  24. package/dist/commands/init.js +233 -0
  25. package/dist/commands/link.js +285 -0
  26. package/dist/commands/lint.js +47 -0
  27. package/dist/commands/log.js +48 -0
  28. package/dist/commands/note.js +36 -0
  29. package/dist/commands/proposal.js +57 -0
  30. package/dist/commands/query.js +38 -0
  31. package/dist/commands/status.js +98 -0
  32. package/dist/commands/sync.js +53 -0
  33. package/dist/commands/upgrade.js +143 -0
  34. package/dist/commands/views.js +111 -0
  35. package/dist/lib/apply.js +524 -0
  36. package/dist/lib/args.js +63 -0
  37. package/dist/lib/brain-path.js +91 -0
  38. package/dist/lib/brain.js +36 -0
  39. package/dist/lib/command.js +61 -0
  40. package/dist/lib/errors.js +33 -0
  41. package/dist/lib/frontmatter.js +171 -0
  42. package/dist/lib/fs-safe.js +140 -0
  43. package/dist/lib/ids.js +51 -0
  44. package/dist/lib/index-builder.js +216 -0
  45. package/dist/lib/input.js +45 -0
  46. package/dist/lib/lint.js +340 -0
  47. package/dist/lib/log.js +44 -0
  48. package/dist/lib/note-new.js +121 -0
  49. package/dist/lib/notes.js +95 -0
  50. package/dist/lib/paths.js +59 -0
  51. package/dist/lib/proposals.js +229 -0
  52. package/dist/lib/query.js +163 -0
  53. package/dist/lib/schemas.js +51 -0
  54. package/dist/lib/skills.js +60 -0
  55. package/dist/lib/sync.js +760 -0
  56. package/dist/lib/time.js +21 -0
  57. package/dist/lib/views.js +139 -0
  58. package/dist/lib/warnings.js +9 -0
  59. package/dist/lib/workspace.js +183 -0
  60. package/package.json +45 -4
  61. package/spec/schemas/brain.schema.json +200 -0
  62. package/spec/schemas/note.schema.json +1102 -0
  63. package/spec/schemas/proposal.schema.json +559 -0
  64. package/templates/README.md +44 -0
  65. package/templates/brain/AGENTS.md +55 -0
  66. package/templates/brain/CLAUDE.md +1 -0
  67. package/templates/brain/_proposals/.gitkeep +0 -0
  68. package/templates/brain/archive/goals/.gitkeep +0 -0
  69. package/templates/brain/archive/projects/.gitkeep +0 -0
  70. package/templates/brain/areas/.gitkeep +0 -0
  71. package/templates/brain/brain.json +35 -0
  72. package/templates/brain/gitignore +6 -0
  73. package/templates/brain/goals/.gitkeep +0 -0
  74. package/templates/brain/index.md +3 -0
  75. package/templates/brain/knowledge/concepts/.gitkeep +0 -0
  76. package/templates/brain/knowledge/decisions/.gitkeep +0 -0
  77. package/templates/brain/knowledge/meetings/.gitkeep +0 -0
  78. package/templates/brain/knowledge/orgs/.gitkeep +0 -0
  79. package/templates/brain/knowledge/people/.gitkeep +0 -0
  80. package/templates/brain/knowledge/questions/.gitkeep +0 -0
  81. package/templates/brain/memories/.gitkeep +0 -0
  82. package/templates/brain/projects/.gitkeep +0 -0
  83. package/templates/brain/sources/notion/.gitkeep +0 -0
@@ -0,0 +1,1102 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://ultimate-brain.dev/schemas/v1/note.schema.json",
4
+ "title": "Brain note frontmatter (v1)",
5
+ "description": "Frontmatter of every Markdown note in a user's brain, except proposals (proposal.schema.json). See spec/schema.md.",
6
+ "type": "object",
7
+ "required": [
8
+ "id",
9
+ "type",
10
+ "title",
11
+ "created",
12
+ "updated"
13
+ ],
14
+ "properties": {
15
+ "id": {
16
+ "$ref": "#/$defs/id"
17
+ },
18
+ "type": {
19
+ "enum": [
20
+ "area",
21
+ "goal",
22
+ "project",
23
+ "person",
24
+ "org",
25
+ "meeting",
26
+ "decision",
27
+ "question",
28
+ "concept",
29
+ "source",
30
+ "view",
31
+ "memory"
32
+ ]
33
+ },
34
+ "title": {
35
+ "type": "string",
36
+ "minLength": 1,
37
+ "maxLength": 120
38
+ },
39
+ "created": {
40
+ "$ref": "#/$defs/date"
41
+ },
42
+ "updated": {
43
+ "$ref": "#/$defs/date"
44
+ }
45
+ },
46
+ "allOf": [
47
+ {
48
+ "if": {
49
+ "properties": {
50
+ "type": {
51
+ "const": "area"
52
+ }
53
+ }
54
+ },
55
+ "then": {
56
+ "$ref": "#/$defs/area"
57
+ }
58
+ },
59
+ {
60
+ "if": {
61
+ "properties": {
62
+ "type": {
63
+ "const": "goal"
64
+ }
65
+ }
66
+ },
67
+ "then": {
68
+ "$ref": "#/$defs/goal"
69
+ }
70
+ },
71
+ {
72
+ "if": {
73
+ "properties": {
74
+ "type": {
75
+ "const": "project"
76
+ }
77
+ }
78
+ },
79
+ "then": {
80
+ "$ref": "#/$defs/project"
81
+ }
82
+ },
83
+ {
84
+ "if": {
85
+ "properties": {
86
+ "type": {
87
+ "const": "person"
88
+ }
89
+ }
90
+ },
91
+ "then": {
92
+ "$ref": "#/$defs/person"
93
+ }
94
+ },
95
+ {
96
+ "if": {
97
+ "properties": {
98
+ "type": {
99
+ "const": "org"
100
+ }
101
+ }
102
+ },
103
+ "then": {
104
+ "$ref": "#/$defs/org"
105
+ }
106
+ },
107
+ {
108
+ "if": {
109
+ "properties": {
110
+ "type": {
111
+ "const": "meeting"
112
+ }
113
+ }
114
+ },
115
+ "then": {
116
+ "$ref": "#/$defs/meeting"
117
+ }
118
+ },
119
+ {
120
+ "if": {
121
+ "properties": {
122
+ "type": {
123
+ "const": "decision"
124
+ }
125
+ }
126
+ },
127
+ "then": {
128
+ "$ref": "#/$defs/decision"
129
+ }
130
+ },
131
+ {
132
+ "if": {
133
+ "properties": {
134
+ "type": {
135
+ "const": "question"
136
+ }
137
+ }
138
+ },
139
+ "then": {
140
+ "$ref": "#/$defs/question"
141
+ }
142
+ },
143
+ {
144
+ "if": {
145
+ "properties": {
146
+ "type": {
147
+ "const": "concept"
148
+ }
149
+ }
150
+ },
151
+ "then": {
152
+ "$ref": "#/$defs/concept"
153
+ }
154
+ },
155
+ {
156
+ "if": {
157
+ "properties": {
158
+ "type": {
159
+ "const": "source"
160
+ }
161
+ }
162
+ },
163
+ "then": {
164
+ "$ref": "#/$defs/source"
165
+ }
166
+ },
167
+ {
168
+ "if": {
169
+ "properties": {
170
+ "type": {
171
+ "const": "view"
172
+ }
173
+ }
174
+ },
175
+ "then": {
176
+ "$ref": "#/$defs/view"
177
+ }
178
+ },
179
+ {
180
+ "if": {
181
+ "properties": {
182
+ "type": {
183
+ "const": "memory"
184
+ }
185
+ }
186
+ },
187
+ "then": {
188
+ "$ref": "#/$defs/memory"
189
+ }
190
+ }
191
+ ],
192
+ "$defs": {
193
+ "idChars": {
194
+ "type": "string",
195
+ "pattern": "^[0-9abcdefghjkmnpqrstvwxyz]{8}$"
196
+ },
197
+ "id": {
198
+ "type": "string",
199
+ "pattern": "^(area|gol|prj|per|org|mtg|dec|que|con|src|mem|prp|vw)-[0-9abcdefghjkmnpqrstvwxyz]{8}$"
200
+ },
201
+ "areaId": {
202
+ "type": "string",
203
+ "pattern": "^area-[0-9abcdefghjkmnpqrstvwxyz]{8}$"
204
+ },
205
+ "goalId": {
206
+ "type": "string",
207
+ "pattern": "^gol-[0-9abcdefghjkmnpqrstvwxyz]{8}$"
208
+ },
209
+ "projectId": {
210
+ "type": "string",
211
+ "pattern": "^prj-[0-9abcdefghjkmnpqrstvwxyz]{8}$"
212
+ },
213
+ "personId": {
214
+ "type": "string",
215
+ "pattern": "^per-[0-9abcdefghjkmnpqrstvwxyz]{8}$"
216
+ },
217
+ "orgId": {
218
+ "type": "string",
219
+ "pattern": "^org-[0-9abcdefghjkmnpqrstvwxyz]{8}$"
220
+ },
221
+ "meetingId": {
222
+ "type": "string",
223
+ "pattern": "^mtg-[0-9abcdefghjkmnpqrstvwxyz]{8}$"
224
+ },
225
+ "decisionId": {
226
+ "type": "string",
227
+ "pattern": "^dec-[0-9abcdefghjkmnpqrstvwxyz]{8}$"
228
+ },
229
+ "questionId": {
230
+ "type": "string",
231
+ "pattern": "^que-[0-9abcdefghjkmnpqrstvwxyz]{8}$"
232
+ },
233
+ "sourceId": {
234
+ "type": "string",
235
+ "pattern": "^src-[0-9abcdefghjkmnpqrstvwxyz]{8}$"
236
+ },
237
+ "date": {
238
+ "type": "string",
239
+ "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
240
+ },
241
+ "month": {
242
+ "type": "string",
243
+ "pattern": "^\\d{4}-\\d{2}$"
244
+ },
245
+ "dateOrMonth": {
246
+ "type": "string",
247
+ "pattern": "^\\d{4}-\\d{2}(-\\d{2})?$"
248
+ },
249
+ "timestamp": {
250
+ "type": "string",
251
+ "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?Z$"
252
+ },
253
+ "sourceKey": {
254
+ "type": "string",
255
+ "anyOf": [
256
+ {
257
+ "pattern": "^notion:[0-9a-f-]{32,36}$"
258
+ },
259
+ {
260
+ "pattern": "^url:https://\\S+$"
261
+ },
262
+ {
263
+ "pattern": "^file:sha256:[0-9a-f]{64}$"
264
+ },
265
+ {
266
+ "pattern": "^agent:[a-z0-9-]+/\\S+$"
267
+ },
268
+ {
269
+ "pattern": "^notion-edit$"
270
+ },
271
+ {
272
+ "pattern": "^(area|gol|prj|per|org|mtg|dec|que|con|src|mem)-[0-9abcdefghjkmnpqrstvwxyz]{8}$"
273
+ }
274
+ ]
275
+ },
276
+ "lifecycle": {
277
+ "enum": [
278
+ "draft",
279
+ "reviewed",
280
+ "disputed",
281
+ "archived"
282
+ ]
283
+ },
284
+ "assessment": {
285
+ "enum": [
286
+ "accepted",
287
+ "provisional",
288
+ "contested",
289
+ "superseded"
290
+ ]
291
+ },
292
+ "notionPageId": {
293
+ "type": "string",
294
+ "pattern": "^[0-9a-f]{8}-?[0-9a-f]{4}-?[0-9a-f]{4}-?[0-9a-f]{4}-?[0-9a-f]{12}$"
295
+ },
296
+ "factValue": {
297
+ "type": [
298
+ "string",
299
+ "number"
300
+ ]
301
+ },
302
+ "relation": {
303
+ "type": "object",
304
+ "required": [
305
+ "type",
306
+ "target"
307
+ ],
308
+ "additionalProperties": false,
309
+ "properties": {
310
+ "type": {
311
+ "enum": [
312
+ "supersedes",
313
+ "superseded_by",
314
+ "about",
315
+ "depends_on",
316
+ "contradicts",
317
+ "derived_from",
318
+ "related_to"
319
+ ]
320
+ },
321
+ "target": {
322
+ "$ref": "#/$defs/id"
323
+ }
324
+ }
325
+ },
326
+ "timelineEntry": {
327
+ "type": "object",
328
+ "required": [
329
+ "field",
330
+ "value",
331
+ "from",
332
+ "learned",
333
+ "source",
334
+ "assessment"
335
+ ],
336
+ "additionalProperties": false,
337
+ "properties": {
338
+ "field": {
339
+ "type": "string",
340
+ "pattern": "^[a-z][a-z0-9_]*$"
341
+ },
342
+ "value": {
343
+ "$ref": "#/$defs/factValue"
344
+ },
345
+ "from": {
346
+ "$ref": "#/$defs/dateOrMonth"
347
+ },
348
+ "until": {
349
+ "$ref": "#/$defs/dateOrMonth"
350
+ },
351
+ "learned": {
352
+ "$ref": "#/$defs/date"
353
+ },
354
+ "source": {
355
+ "$ref": "#/$defs/sourceKey"
356
+ },
357
+ "assessment": {
358
+ "$ref": "#/$defs/assessment"
359
+ },
360
+ "note": {
361
+ "type": "string"
362
+ }
363
+ }
364
+ },
365
+ "notionFieldsBase": {
366
+ "type": "object",
367
+ "required": [
368
+ "as_of"
369
+ ],
370
+ "properties": {
371
+ "as_of": {
372
+ "$ref": "#/$defs/timestamp"
373
+ }
374
+ }
375
+ },
376
+ "knowledge": {
377
+ "type": "object",
378
+ "required": [
379
+ "summary",
380
+ "lifecycle"
381
+ ],
382
+ "properties": {
383
+ "summary": {
384
+ "type": "string",
385
+ "minLength": 1,
386
+ "maxLength": 400
387
+ },
388
+ "lifecycle": {
389
+ "$ref": "#/$defs/lifecycle"
390
+ },
391
+ "aliases": {
392
+ "type": "array",
393
+ "items": {
394
+ "type": "string",
395
+ "minLength": 1
396
+ }
397
+ },
398
+ "tags": {
399
+ "type": "array",
400
+ "items": {
401
+ "type": "string",
402
+ "pattern": "^[a-z0-9]+(-[a-z0-9]+)*$"
403
+ }
404
+ },
405
+ "area": {
406
+ "$ref": "#/$defs/areaId"
407
+ },
408
+ "projects": {
409
+ "type": "array",
410
+ "items": {
411
+ "$ref": "#/$defs/projectId"
412
+ }
413
+ },
414
+ "sources": {
415
+ "type": "array",
416
+ "items": {
417
+ "$ref": "#/$defs/sourceKey"
418
+ }
419
+ },
420
+ "relations": {
421
+ "type": "array",
422
+ "items": {
423
+ "$ref": "#/$defs/relation"
424
+ }
425
+ },
426
+ "facts": {
427
+ "type": "object",
428
+ "propertyNames": {
429
+ "pattern": "^[a-z][a-z0-9_]*$"
430
+ },
431
+ "additionalProperties": {
432
+ "$ref": "#/$defs/factValue"
433
+ }
434
+ },
435
+ "timeline": {
436
+ "type": "array",
437
+ "items": {
438
+ "$ref": "#/$defs/timelineEntry"
439
+ }
440
+ },
441
+ "notion": {
442
+ "$ref": "#/$defs/notionPageId"
443
+ },
444
+ "last_synced": {
445
+ "$ref": "#/$defs/timestamp"
446
+ },
447
+ "notion_fields": {
448
+ "$ref": "#/$defs/notionFieldsBase"
449
+ },
450
+ "notion_published": {
451
+ "description": "Notion property name → value last published or imported (spec/cli.md §5.14).",
452
+ "type": "object"
453
+ }
454
+ }
455
+ },
456
+ "area": {
457
+ "allOf": [
458
+ {
459
+ "$ref": "#/$defs/knowledge"
460
+ }
461
+ ],
462
+ "properties": {
463
+ "notion_fields": {
464
+ "properties": {
465
+ "type": {
466
+ "enum": [
467
+ "Business",
468
+ "Personal"
469
+ ]
470
+ },
471
+ "archived": {
472
+ "type": "boolean"
473
+ }
474
+ }
475
+ }
476
+ }
477
+ },
478
+ "goal": {
479
+ "allOf": [
480
+ {
481
+ "$ref": "#/$defs/knowledge"
482
+ }
483
+ ],
484
+ "required": [
485
+ "why",
486
+ "area"
487
+ ],
488
+ "properties": {
489
+ "why": {
490
+ "type": "string",
491
+ "minLength": 1,
492
+ "maxLength": 300
493
+ },
494
+ "facts": {
495
+ "properties": {
496
+ "deadline": {
497
+ "$ref": "#/$defs/dateOrMonth"
498
+ }
499
+ }
500
+ },
501
+ "notion_fields": {
502
+ "properties": {
503
+ "status": {
504
+ "enum": [
505
+ "Not Started",
506
+ "Active",
507
+ "Achieved",
508
+ "Dropped"
509
+ ]
510
+ },
511
+ "progress": {
512
+ "type": "number",
513
+ "minimum": 0,
514
+ "maximum": 1
515
+ },
516
+ "archived": {
517
+ "type": "boolean"
518
+ },
519
+ "key_results": {
520
+ "type": "array",
521
+ "items": {
522
+ "type": "object",
523
+ "required": [
524
+ "name",
525
+ "kind"
526
+ ],
527
+ "properties": {
528
+ "name": {
529
+ "type": "string"
530
+ },
531
+ "kind": {
532
+ "enum": [
533
+ "Number",
534
+ "Milestone"
535
+ ]
536
+ },
537
+ "start": {
538
+ "type": "number"
539
+ },
540
+ "current": {
541
+ "type": "number"
542
+ },
543
+ "target": {
544
+ "type": "number"
545
+ },
546
+ "unit": {
547
+ "type": "string"
548
+ },
549
+ "done": {
550
+ "type": "boolean"
551
+ },
552
+ "due": {
553
+ "$ref": "#/$defs/date"
554
+ }
555
+ }
556
+ }
557
+ }
558
+ }
559
+ }
560
+ }
561
+ },
562
+ "project": {
563
+ "allOf": [
564
+ {
565
+ "$ref": "#/$defs/knowledge"
566
+ }
567
+ ],
568
+ "required": [
569
+ "area"
570
+ ],
571
+ "properties": {
572
+ "goal": {
573
+ "$ref": "#/$defs/goalId"
574
+ },
575
+ "client": {
576
+ "$ref": "#/$defs/orgId"
577
+ },
578
+ "people": {
579
+ "type": "array",
580
+ "items": {
581
+ "$ref": "#/$defs/personId"
582
+ }
583
+ },
584
+ "notion_fields": {
585
+ "properties": {
586
+ "status": {
587
+ "enum": [
588
+ "Planned",
589
+ "Active",
590
+ "On Hold",
591
+ "Done"
592
+ ]
593
+ },
594
+ "priority": {
595
+ "enum": [
596
+ "High",
597
+ "Medium",
598
+ "Low"
599
+ ]
600
+ },
601
+ "dates": {
602
+ "type": "object",
603
+ "properties": {
604
+ "start": {
605
+ "$ref": "#/$defs/date"
606
+ },
607
+ "end": {
608
+ "$ref": "#/$defs/date"
609
+ }
610
+ }
611
+ },
612
+ "archived": {
613
+ "type": "boolean"
614
+ }
615
+ }
616
+ }
617
+ }
618
+ },
619
+ "person": {
620
+ "allOf": [
621
+ {
622
+ "$ref": "#/$defs/knowledge"
623
+ }
624
+ ],
625
+ "properties": {
626
+ "org": {
627
+ "$ref": "#/$defs/orgId"
628
+ },
629
+ "notion_fields": {
630
+ "properties": {
631
+ "email": {
632
+ "type": "string"
633
+ }
634
+ }
635
+ }
636
+ }
637
+ },
638
+ "org": {
639
+ "allOf": [
640
+ {
641
+ "$ref": "#/$defs/knowledge"
642
+ }
643
+ ],
644
+ "properties": {
645
+ "notion_fields": {
646
+ "properties": {
647
+ "relationship": {
648
+ "enum": [
649
+ "Client",
650
+ "Prospect",
651
+ "Partner",
652
+ "Supplier",
653
+ "Other"
654
+ ]
655
+ },
656
+ "website": {
657
+ "type": "string"
658
+ }
659
+ }
660
+ }
661
+ }
662
+ },
663
+ "meeting": {
664
+ "allOf": [
665
+ {
666
+ "$ref": "#/$defs/knowledge"
667
+ }
668
+ ],
669
+ "required": [
670
+ "date",
671
+ "attendees",
672
+ "source"
673
+ ],
674
+ "properties": {
675
+ "date": {
676
+ "$ref": "#/$defs/date"
677
+ },
678
+ "attendees": {
679
+ "type": "array",
680
+ "items": {
681
+ "$ref": "#/$defs/personId"
682
+ }
683
+ },
684
+ "source": {
685
+ "$ref": "#/$defs/sourceId"
686
+ },
687
+ "decisions": {
688
+ "type": "array",
689
+ "items": {
690
+ "$ref": "#/$defs/decisionId"
691
+ }
692
+ },
693
+ "questions": {
694
+ "type": "array",
695
+ "items": {
696
+ "$ref": "#/$defs/questionId"
697
+ }
698
+ },
699
+ "tasks": {
700
+ "type": "array",
701
+ "items": {
702
+ "$ref": "#/$defs/notionPageId"
703
+ }
704
+ }
705
+ }
706
+ },
707
+ "decision": {
708
+ "allOf": [
709
+ {
710
+ "$ref": "#/$defs/knowledge"
711
+ }
712
+ ],
713
+ "required": [
714
+ "date",
715
+ "assessment"
716
+ ],
717
+ "properties": {
718
+ "date": {
719
+ "$ref": "#/$defs/date"
720
+ },
721
+ "assessment": {
722
+ "$ref": "#/$defs/assessment"
723
+ },
724
+ "decided_in": {
725
+ "$ref": "#/$defs/meetingId"
726
+ },
727
+ "deciders": {
728
+ "type": "array",
729
+ "items": {
730
+ "$ref": "#/$defs/personId"
731
+ }
732
+ },
733
+ "valid_from": {
734
+ "$ref": "#/$defs/date"
735
+ },
736
+ "valid_until": {
737
+ "$ref": "#/$defs/date"
738
+ }
739
+ },
740
+ "if": {
741
+ "properties": {
742
+ "assessment": {
743
+ "const": "superseded"
744
+ }
745
+ },
746
+ "required": [
747
+ "assessment"
748
+ ]
749
+ },
750
+ "then": {
751
+ "required": [
752
+ "valid_until"
753
+ ]
754
+ }
755
+ },
756
+ "question": {
757
+ "allOf": [
758
+ {
759
+ "$ref": "#/$defs/knowledge"
760
+ }
761
+ ],
762
+ "required": [
763
+ "kind"
764
+ ],
765
+ "properties": {
766
+ "kind": {
767
+ "enum": [
768
+ "question",
769
+ "risk"
770
+ ]
771
+ },
772
+ "raised_in": {
773
+ "$ref": "#/$defs/meetingId"
774
+ },
775
+ "answer": {
776
+ "type": "string"
777
+ },
778
+ "notion_fields": {
779
+ "properties": {
780
+ "status": {
781
+ "enum": [
782
+ "Open",
783
+ "Answered",
784
+ "Dropped"
785
+ ]
786
+ }
787
+ }
788
+ }
789
+ }
790
+ },
791
+ "concept": {
792
+ "allOf": [
793
+ {
794
+ "$ref": "#/$defs/knowledge"
795
+ }
796
+ ]
797
+ },
798
+ "source": {
799
+ "required": [
800
+ "source_key",
801
+ "content_hash",
802
+ "captured"
803
+ ],
804
+ "properties": {
805
+ "source_key": {
806
+ "$ref": "#/$defs/sourceKey"
807
+ },
808
+ "content_hash": {
809
+ "type": "string",
810
+ "pattern": "^sha256:[0-9a-f]{64}$"
811
+ },
812
+ "captured": {
813
+ "$ref": "#/$defs/timestamp"
814
+ },
815
+ "origin_edited": {
816
+ "$ref": "#/$defs/timestamp"
817
+ },
818
+ "kind": {
819
+ "enum": [
820
+ "minutes",
821
+ "document",
822
+ "email",
823
+ "chat",
824
+ "note",
825
+ "capture"
826
+ ]
827
+ },
828
+ "file_name": {
829
+ "type": "string",
830
+ "minLength": 1,
831
+ "pattern": "^[^/\\\\]+$"
832
+ },
833
+ "converter": {
834
+ "type": "string",
835
+ "minLength": 1
836
+ }
837
+ },
838
+ "not": {
839
+ "anyOf": [
840
+ {
841
+ "required": [
842
+ "lifecycle"
843
+ ]
844
+ },
845
+ {
846
+ "required": [
847
+ "facts"
848
+ ]
849
+ },
850
+ {
851
+ "required": [
852
+ "timeline"
853
+ ]
854
+ }
855
+ ]
856
+ },
857
+ "allOf": [
858
+ {
859
+ "if": {
860
+ "required": [
861
+ "source_key"
862
+ ],
863
+ "properties": {
864
+ "source_key": {
865
+ "pattern": "^file:"
866
+ }
867
+ }
868
+ },
869
+ "then": {
870
+ "required": [
871
+ "kind",
872
+ "file_name",
873
+ "converter"
874
+ ]
875
+ }
876
+ }
877
+ ]
878
+ },
879
+ "view": {
880
+ "required": [
881
+ "view_kind",
882
+ "project",
883
+ "generated_from",
884
+ "generated_at"
885
+ ],
886
+ "properties": {
887
+ "view_kind": {
888
+ "enum": [
889
+ "brief",
890
+ "decision_log"
891
+ ]
892
+ },
893
+ "project": {
894
+ "$ref": "#/$defs/projectId"
895
+ },
896
+ "generated_from": {
897
+ "type": "array",
898
+ "items": {
899
+ "$ref": "#/$defs/id"
900
+ }
901
+ },
902
+ "generated_at": {
903
+ "$ref": "#/$defs/timestamp"
904
+ }
905
+ },
906
+ "not": {
907
+ "anyOf": [
908
+ {
909
+ "required": [
910
+ "lifecycle"
911
+ ]
912
+ },
913
+ {
914
+ "required": [
915
+ "facts"
916
+ ]
917
+ },
918
+ {
919
+ "required": [
920
+ "timeline"
921
+ ]
922
+ }
923
+ ]
924
+ }
925
+ },
926
+ "memory": {
927
+ "required": [
928
+ "scope",
929
+ "confidence",
930
+ "origin"
931
+ ],
932
+ "properties": {
933
+ "scope": {
934
+ "enum": [
935
+ "general",
936
+ "area",
937
+ "project",
938
+ "stack"
939
+ ]
940
+ },
941
+ "areas": {
942
+ "type": "array",
943
+ "items": {
944
+ "$ref": "#/$defs/areaId"
945
+ }
946
+ },
947
+ "stacks": {
948
+ "type": "array",
949
+ "items": {
950
+ "type": "string",
951
+ "pattern": "^[a-z0-9]+(-[a-z0-9]+)*$"
952
+ }
953
+ },
954
+ "confidence": {
955
+ "enum": [
956
+ "verified",
957
+ "inferred",
958
+ "unverified"
959
+ ]
960
+ },
961
+ "origin": {
962
+ "type": "string",
963
+ "minLength": 1
964
+ }
965
+ },
966
+ "allOf": [
967
+ {
968
+ "$ref": "#/$defs/knowledge"
969
+ },
970
+ {
971
+ "if": {
972
+ "properties": {
973
+ "scope": {
974
+ "const": "general"
975
+ }
976
+ }
977
+ },
978
+ "then": {
979
+ "not": {
980
+ "anyOf": [
981
+ {
982
+ "required": [
983
+ "areas"
984
+ ]
985
+ },
986
+ {
987
+ "required": [
988
+ "projects"
989
+ ]
990
+ },
991
+ {
992
+ "required": [
993
+ "stacks"
994
+ ]
995
+ }
996
+ ]
997
+ }
998
+ }
999
+ },
1000
+ {
1001
+ "if": {
1002
+ "properties": {
1003
+ "scope": {
1004
+ "const": "area"
1005
+ }
1006
+ }
1007
+ },
1008
+ "then": {
1009
+ "required": [
1010
+ "areas"
1011
+ ],
1012
+ "properties": {
1013
+ "areas": {
1014
+ "minItems": 1
1015
+ }
1016
+ },
1017
+ "not": {
1018
+ "anyOf": [
1019
+ {
1020
+ "required": [
1021
+ "projects"
1022
+ ]
1023
+ },
1024
+ {
1025
+ "required": [
1026
+ "stacks"
1027
+ ]
1028
+ }
1029
+ ]
1030
+ }
1031
+ }
1032
+ },
1033
+ {
1034
+ "if": {
1035
+ "properties": {
1036
+ "scope": {
1037
+ "const": "project"
1038
+ }
1039
+ }
1040
+ },
1041
+ "then": {
1042
+ "required": [
1043
+ "projects"
1044
+ ],
1045
+ "properties": {
1046
+ "projects": {
1047
+ "minItems": 1
1048
+ }
1049
+ },
1050
+ "not": {
1051
+ "anyOf": [
1052
+ {
1053
+ "required": [
1054
+ "areas"
1055
+ ]
1056
+ },
1057
+ {
1058
+ "required": [
1059
+ "stacks"
1060
+ ]
1061
+ }
1062
+ ]
1063
+ }
1064
+ }
1065
+ },
1066
+ {
1067
+ "if": {
1068
+ "properties": {
1069
+ "scope": {
1070
+ "const": "stack"
1071
+ }
1072
+ }
1073
+ },
1074
+ "then": {
1075
+ "required": [
1076
+ "stacks"
1077
+ ],
1078
+ "properties": {
1079
+ "stacks": {
1080
+ "minItems": 1
1081
+ }
1082
+ },
1083
+ "not": {
1084
+ "anyOf": [
1085
+ {
1086
+ "required": [
1087
+ "areas"
1088
+ ]
1089
+ },
1090
+ {
1091
+ "required": [
1092
+ "projects"
1093
+ ]
1094
+ }
1095
+ ]
1096
+ }
1097
+ }
1098
+ }
1099
+ ]
1100
+ }
1101
+ }
1102
+ }