@synap-core/workspace-templates 0.7.1 → 0.7.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +266 -8
- package/dist/index.js +2314 -1440
- package/dist/index.js.map +1 -1
- package/package.json +4 -3
- package/src/agent-fleet.yaml +666 -108
- package/src/blockchain-ecosystem.yaml +1 -0
- package/src/brand-library.yaml +127 -12
- package/src/builder.yaml +116 -12
- package/src/business-developer.yaml +110 -18
- package/src/catalog.test.ts +2 -2
- package/src/catalog.ts +13 -3
- package/src/communication.yaml +23 -453
- package/src/composition-graph.test.ts +28 -2
- package/src/concept-guard.test.ts +176 -0
- package/src/concept-guard.ts +219 -0
- package/src/content-os.yaml +103 -10
- package/src/content-studio.yaml +1 -0
- package/src/crm.yaml +1 -0
- package/src/define.ts +8 -8
- package/src/dev-dashboard.yaml +43 -9
- package/src/domains.test.ts +117 -0
- package/src/domains.ts +102 -0
- package/src/ecosystem.yaml +25 -5
- package/src/enterprise-os.yaml +1 -0
- package/src/finance.yaml +46 -5
- package/src/foundation.yaml +13 -1
- package/src/generate.d.mts +15 -0
- package/src/generate.mjs +86 -0
- package/src/grants.yaml +1 -0
- package/src/hr.yaml +61 -8
- package/src/index.ts +40 -0
- package/src/internal-runbook.yaml +36 -5
- package/src/legal.yaml +97 -12
- package/src/life-os.yaml +188 -27
- package/src/marketing.yaml +15 -2
- package/src/meetings-knowledge.yaml +143 -23
- package/src/operations.yaml +347 -0
- package/src/outreach-comms.yaml +11 -3
- package/src/project-management.yaml +840 -111
- package/src/research-base.yaml +516 -0
- package/src/research-decision.yaml +158 -0
- package/src/shared-role-ssot.test.ts +268 -0
- package/src/social.yaml +105 -37
- package/src/templates-freshness.test.ts +55 -0
- package/src/templates.ts +4620 -4278
- package/src/the-arch.yaml +1 -0
- package/src/types.ts +9 -0
- package/src/validate.test.ts +81 -0
- package/src/validate.ts +561 -0
- package/src/personal.yaml +0 -177
package/src/life-os.yaml
CHANGED
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
|
|
7
7
|
meta:
|
|
8
8
|
slug: life-os
|
|
9
|
+
domain: knowledge
|
|
9
10
|
name: Second Brain — Knowledge OS
|
|
10
11
|
description: A sovereign personal knowledge management workspace. Capture everything, connect ideas, build your external brain.
|
|
11
12
|
icon: brain
|
|
@@ -229,7 +230,16 @@ profiles:
|
|
|
229
230
|
label: Relationship
|
|
230
231
|
valueType: string
|
|
231
232
|
inputType: select
|
|
232
|
-
enumValues:
|
|
233
|
+
enumValues:
|
|
234
|
+
[
|
|
235
|
+
mentor,
|
|
236
|
+
colleague,
|
|
237
|
+
friend,
|
|
238
|
+
family,
|
|
239
|
+
acquaintance,
|
|
240
|
+
author,
|
|
241
|
+
collaborator,
|
|
242
|
+
]
|
|
233
243
|
- slug: last-contact
|
|
234
244
|
label: Last Contact
|
|
235
245
|
valueType: date
|
|
@@ -806,12 +816,26 @@ views:
|
|
|
806
816
|
kind: widget
|
|
807
817
|
widgetType: entity-count
|
|
808
818
|
pos: { x: 3, y: 2, w: 3, h: 2 }
|
|
809
|
-
config:
|
|
819
|
+
config:
|
|
820
|
+
{
|
|
821
|
+
profileSlug: note,
|
|
822
|
+
label: In Inbox,
|
|
823
|
+
icon: Inbox,
|
|
824
|
+
filter: { status: inbox },
|
|
825
|
+
color: amber,
|
|
826
|
+
}
|
|
810
827
|
- id: nd-b4
|
|
811
828
|
kind: widget
|
|
812
829
|
widgetType: entity-count
|
|
813
830
|
pos: { x: 6, y: 2, w: 3, h: 2 }
|
|
814
|
-
config:
|
|
831
|
+
config:
|
|
832
|
+
{
|
|
833
|
+
profileSlug: note,
|
|
834
|
+
label: Evergreen,
|
|
835
|
+
icon: Leaf,
|
|
836
|
+
filter: { status: evergreen },
|
|
837
|
+
color: green,
|
|
838
|
+
}
|
|
815
839
|
- id: nd-b5
|
|
816
840
|
kind: widget
|
|
817
841
|
widgetType: entity-count
|
|
@@ -835,32 +859,71 @@ views:
|
|
|
835
859
|
kind: widget
|
|
836
860
|
widgetType: entity-count
|
|
837
861
|
pos: { x: 0, y: 2, w: 3, h: 2 }
|
|
838
|
-
config:
|
|
862
|
+
config:
|
|
863
|
+
{
|
|
864
|
+
profileSlug: book,
|
|
865
|
+
label: Currently Reading,
|
|
866
|
+
icon: BookOpen,
|
|
867
|
+
filter: { status: reading },
|
|
868
|
+
color: blue,
|
|
869
|
+
}
|
|
839
870
|
- id: bd-b3
|
|
840
871
|
kind: widget
|
|
841
872
|
widgetType: entity-count
|
|
842
873
|
pos: { x: 3, y: 2, w: 3, h: 2 }
|
|
843
|
-
config:
|
|
874
|
+
config:
|
|
875
|
+
{
|
|
876
|
+
profileSlug: book,
|
|
877
|
+
label: Books Read,
|
|
878
|
+
icon: CheckCircle,
|
|
879
|
+
filter: { status: completed },
|
|
880
|
+
color: green,
|
|
881
|
+
}
|
|
844
882
|
- id: bd-b4
|
|
845
883
|
kind: widget
|
|
846
884
|
widgetType: entity-count
|
|
847
885
|
pos: { x: 6, y: 2, w: 3, h: 2 }
|
|
848
|
-
config:
|
|
886
|
+
config:
|
|
887
|
+
{
|
|
888
|
+
profileSlug: book,
|
|
889
|
+
label: To Read,
|
|
890
|
+
icon: List,
|
|
891
|
+
filter: { status: want-to-read },
|
|
892
|
+
color: purple,
|
|
893
|
+
}
|
|
849
894
|
- id: bd-b5
|
|
850
895
|
kind: widget
|
|
851
896
|
widgetType: entity-count
|
|
852
897
|
pos: { x: 9, y: 2, w: 3, h: 2 }
|
|
853
|
-
config:
|
|
898
|
+
config:
|
|
899
|
+
{
|
|
900
|
+
profileSlug: highlight,
|
|
901
|
+
label: Total Highlights,
|
|
902
|
+
icon: Highlighter,
|
|
903
|
+
}
|
|
854
904
|
- id: bd-b6
|
|
855
905
|
kind: widget
|
|
856
906
|
widgetType: entity-gallery
|
|
857
907
|
pos: { x: 0, y: 4, w: 8, h: 4 }
|
|
858
|
-
config:
|
|
908
|
+
config:
|
|
909
|
+
{
|
|
910
|
+
profileSlug: book,
|
|
911
|
+
filter: { status: reading },
|
|
912
|
+
coverField: cover-url,
|
|
913
|
+
title: Currently Reading,
|
|
914
|
+
limit: 8,
|
|
915
|
+
}
|
|
859
916
|
- id: bd-b7
|
|
860
917
|
kind: widget
|
|
861
918
|
widgetType: quote-card
|
|
862
919
|
pos: { x: 8, y: 4, w: 4, h: 4 }
|
|
863
|
-
config:
|
|
920
|
+
config:
|
|
921
|
+
{
|
|
922
|
+
profileSlug: quote,
|
|
923
|
+
textField: text,
|
|
924
|
+
authorField: author,
|
|
925
|
+
seed: daily,
|
|
926
|
+
}
|
|
864
927
|
- id: bd-b8
|
|
865
928
|
kind: view
|
|
866
929
|
viewName: Reading List
|
|
@@ -884,12 +947,26 @@ views:
|
|
|
884
947
|
kind: widget
|
|
885
948
|
widgetType: entity-count
|
|
886
949
|
pos: { x: 4, y: 2, w: 4, h: 2 }
|
|
887
|
-
config:
|
|
950
|
+
config:
|
|
951
|
+
{
|
|
952
|
+
profileSlug: concept,
|
|
953
|
+
label: Evergreen,
|
|
954
|
+
icon: Leaf,
|
|
955
|
+
filter: { maturity: evergreen },
|
|
956
|
+
color: green,
|
|
957
|
+
}
|
|
888
958
|
- id: cd-b4
|
|
889
959
|
kind: widget
|
|
890
960
|
widgetType: entity-count
|
|
891
961
|
pos: { x: 8, y: 2, w: 4, h: 2 }
|
|
892
|
-
config:
|
|
962
|
+
config:
|
|
963
|
+
{
|
|
964
|
+
profileSlug: concept,
|
|
965
|
+
label: Seeds,
|
|
966
|
+
icon: Sprout,
|
|
967
|
+
filter: { maturity: seed },
|
|
968
|
+
color: amber,
|
|
969
|
+
}
|
|
893
970
|
- id: cd-b5
|
|
894
971
|
kind: view
|
|
895
972
|
viewName: All Concepts
|
|
@@ -913,12 +990,24 @@ views:
|
|
|
913
990
|
kind: widget
|
|
914
991
|
widgetType: entity-count
|
|
915
992
|
pos: { x: 4, y: 2, w: 4, h: 2 }
|
|
916
|
-
config:
|
|
993
|
+
config:
|
|
994
|
+
{
|
|
995
|
+
profileSlug: person,
|
|
996
|
+
label: Mentors,
|
|
997
|
+
icon: Star,
|
|
998
|
+
filter: { relationship: mentor },
|
|
999
|
+
}
|
|
917
1000
|
- id: pd-b4
|
|
918
1001
|
kind: widget
|
|
919
1002
|
widgetType: entity-count
|
|
920
1003
|
pos: { x: 8, y: 2, w: 4, h: 2 }
|
|
921
|
-
config:
|
|
1004
|
+
config:
|
|
1005
|
+
{
|
|
1006
|
+
profileSlug: person,
|
|
1007
|
+
label: Authors,
|
|
1008
|
+
icon: BookOpen,
|
|
1009
|
+
filter: { relationship: author },
|
|
1010
|
+
}
|
|
922
1011
|
- id: pd-b5
|
|
923
1012
|
kind: view
|
|
924
1013
|
viewName: People Network
|
|
@@ -937,22 +1026,50 @@ views:
|
|
|
937
1026
|
kind: widget
|
|
938
1027
|
widgetType: entity-count
|
|
939
1028
|
pos: { x: 0, y: 2, w: 3, h: 2 }
|
|
940
|
-
config:
|
|
1029
|
+
config:
|
|
1030
|
+
{
|
|
1031
|
+
profileSlug: project,
|
|
1032
|
+
label: Active,
|
|
1033
|
+
icon: Play,
|
|
1034
|
+
filter: { status: active },
|
|
1035
|
+
color: green,
|
|
1036
|
+
}
|
|
941
1037
|
- id: prd-b3
|
|
942
1038
|
kind: widget
|
|
943
1039
|
widgetType: entity-count
|
|
944
1040
|
pos: { x: 3, y: 2, w: 3, h: 2 }
|
|
945
|
-
config:
|
|
1041
|
+
config:
|
|
1042
|
+
{
|
|
1043
|
+
profileSlug: project,
|
|
1044
|
+
label: Planning,
|
|
1045
|
+
icon: Map,
|
|
1046
|
+
filter: { status: planning },
|
|
1047
|
+
color: blue,
|
|
1048
|
+
}
|
|
946
1049
|
- id: prd-b4
|
|
947
1050
|
kind: widget
|
|
948
1051
|
widgetType: entity-count
|
|
949
1052
|
pos: { x: 6, y: 2, w: 3, h: 2 }
|
|
950
|
-
config:
|
|
1053
|
+
config:
|
|
1054
|
+
{
|
|
1055
|
+
profileSlug: project,
|
|
1056
|
+
label: On Hold,
|
|
1057
|
+
icon: PauseCircle,
|
|
1058
|
+
filter: { status: on-hold },
|
|
1059
|
+
color: amber,
|
|
1060
|
+
}
|
|
951
1061
|
- id: prd-b5
|
|
952
1062
|
kind: widget
|
|
953
1063
|
widgetType: entity-count
|
|
954
1064
|
pos: { x: 9, y: 2, w: 3, h: 2 }
|
|
955
|
-
config:
|
|
1065
|
+
config:
|
|
1066
|
+
{
|
|
1067
|
+
profileSlug: project,
|
|
1068
|
+
label: Completed,
|
|
1069
|
+
icon: CheckCircle,
|
|
1070
|
+
filter: { status: completed },
|
|
1071
|
+
color: purple,
|
|
1072
|
+
}
|
|
956
1073
|
- id: prd-b6
|
|
957
1074
|
kind: view
|
|
958
1075
|
viewName: Active Projects
|
|
@@ -971,12 +1088,24 @@ views:
|
|
|
971
1088
|
kind: widget
|
|
972
1089
|
widgetType: quote-card
|
|
973
1090
|
pos: { x: 0, y: 2, w: 6, h: 4 }
|
|
974
|
-
config:
|
|
1091
|
+
config:
|
|
1092
|
+
{
|
|
1093
|
+
profileSlug: quote,
|
|
1094
|
+
textField: text,
|
|
1095
|
+
authorField: author,
|
|
1096
|
+
seed: daily,
|
|
1097
|
+
}
|
|
975
1098
|
- id: qd-b3
|
|
976
1099
|
kind: widget
|
|
977
1100
|
widgetType: entity-list
|
|
978
1101
|
pos: { x: 6, y: 2, w: 6, h: 4 }
|
|
979
|
-
config:
|
|
1102
|
+
config:
|
|
1103
|
+
{
|
|
1104
|
+
profileSlug: quote,
|
|
1105
|
+
title: Latest Quotes,
|
|
1106
|
+
limit: 6,
|
|
1107
|
+
sort: { field: created-at, direction: desc },
|
|
1108
|
+
}
|
|
980
1109
|
- id: qd-b4
|
|
981
1110
|
kind: view
|
|
982
1111
|
viewName: All Quotes
|
|
@@ -995,12 +1124,19 @@ views:
|
|
|
995
1124
|
kind: widget
|
|
996
1125
|
widgetType: entity-count
|
|
997
1126
|
pos: { x: 0, y: 2, w: 6, h: 2 }
|
|
998
|
-
config:
|
|
1127
|
+
config:
|
|
1128
|
+
{
|
|
1129
|
+
profileSlug: area,
|
|
1130
|
+
label: Active Areas,
|
|
1131
|
+
icon: Compass,
|
|
1132
|
+
filter: { status: active },
|
|
1133
|
+
}
|
|
999
1134
|
- id: ad-b3
|
|
1000
1135
|
kind: widget
|
|
1001
1136
|
widgetType: entity-count
|
|
1002
1137
|
pos: { x: 6, y: 2, w: 6, h: 2 }
|
|
1003
|
-
config:
|
|
1138
|
+
config:
|
|
1139
|
+
{ profileSlug: project, label: Total Projects, icon: FolderOpen }
|
|
1004
1140
|
- id: ad-b4
|
|
1005
1141
|
kind: view
|
|
1006
1142
|
viewName: All Areas
|
|
@@ -1128,7 +1264,12 @@ bento:
|
|
|
1128
1264
|
- kind: widget
|
|
1129
1265
|
widgetType: welcome-header
|
|
1130
1266
|
pos: { x: 0, y: 0, w: 12, h: 2 }
|
|
1131
|
-
config:
|
|
1267
|
+
config:
|
|
1268
|
+
{
|
|
1269
|
+
title: "Good morning — Your Second Brain",
|
|
1270
|
+
subtitle: "Everything you know, connected.",
|
|
1271
|
+
showDate: true,
|
|
1272
|
+
}
|
|
1132
1273
|
- kind: widget
|
|
1133
1274
|
widgetType: entity-count
|
|
1134
1275
|
pos: { x: 0, y: 2, w: 3, h: 2 }
|
|
@@ -1167,14 +1308,16 @@ bento:
|
|
|
1167
1308
|
- kind: widget
|
|
1168
1309
|
widgetType: reading-progress
|
|
1169
1310
|
pos: { x: 4, y: 8, w: 4, h: 4 }
|
|
1170
|
-
config:
|
|
1311
|
+
config:
|
|
1312
|
+
{ profileSlug: book, pageField: current-page, totalPagesField: pages }
|
|
1171
1313
|
- kind: view
|
|
1172
1314
|
viewName: Inbox Notes
|
|
1173
1315
|
pos: { x: 8, y: 8, w: 4, h: 4 }
|
|
1174
1316
|
- kind: widget
|
|
1175
1317
|
widgetType: entity-spotlight
|
|
1176
1318
|
pos: { x: 0, y: 12, w: 4, h: 4 }
|
|
1177
|
-
config:
|
|
1319
|
+
config:
|
|
1320
|
+
{ profileSlug: note, seed: daily, layout: detail, color: "#6366F1" }
|
|
1178
1321
|
- kind: widget
|
|
1179
1322
|
widgetType: random-highlight
|
|
1180
1323
|
pos: { x: 4, y: 12, w: 4, h: 4 }
|
|
@@ -1214,7 +1357,13 @@ profileEntityBentoTemplates:
|
|
|
1214
1357
|
kind: widget
|
|
1215
1358
|
widgetType: reading-progress
|
|
1216
1359
|
pos: { x: 8, y: 0, w: 4, h: 3 }
|
|
1217
|
-
config:
|
|
1360
|
+
config:
|
|
1361
|
+
{
|
|
1362
|
+
profileSlug: book,
|
|
1363
|
+
pageField: current-page,
|
|
1364
|
+
totalPagesField: pages,
|
|
1365
|
+
label: Progress,
|
|
1366
|
+
}
|
|
1218
1367
|
- id: book-eb-b3
|
|
1219
1368
|
kind: widget
|
|
1220
1369
|
widgetType: entity-list
|
|
@@ -1302,7 +1451,13 @@ profileEntityBentoTemplates:
|
|
|
1302
1451
|
kind: widget
|
|
1303
1452
|
widgetType: entity-count
|
|
1304
1453
|
pos: { x: 8, y: 0, w: 4, h: 3 }
|
|
1305
|
-
config:
|
|
1454
|
+
config:
|
|
1455
|
+
{
|
|
1456
|
+
profileSlug: project,
|
|
1457
|
+
label: Projects,
|
|
1458
|
+
icon: FolderOpen,
|
|
1459
|
+
color: green,
|
|
1460
|
+
}
|
|
1306
1461
|
- id: area-eb-b3
|
|
1307
1462
|
kind: widget
|
|
1308
1463
|
widgetType: entity-list
|
|
@@ -1319,7 +1474,13 @@ profileEntityBentoTemplates:
|
|
|
1319
1474
|
kind: widget
|
|
1320
1475
|
widgetType: metrics-summary
|
|
1321
1476
|
pos: { x: 8, y: 0, w: 4, h: 3 }
|
|
1322
|
-
config:
|
|
1477
|
+
config:
|
|
1478
|
+
{
|
|
1479
|
+
profileSlug: project,
|
|
1480
|
+
property: progress,
|
|
1481
|
+
aggregation: average,
|
|
1482
|
+
title: Avg Project Progress,
|
|
1483
|
+
}
|
|
1323
1484
|
- id: goal-eb-b3
|
|
1324
1485
|
kind: widget
|
|
1325
1486
|
widgetType: entity-list
|
package/src/marketing.yaml
CHANGED
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
|
|
4
4
|
meta:
|
|
5
5
|
slug: marketing-campaign
|
|
6
|
+
domain: revenue
|
|
6
7
|
name: Marketing Campaigns
|
|
7
8
|
description: "Track leads, manage campaigns, and let AI help run your outreach. Contacts, pipeline, tasks, and AI briefings — all connected."
|
|
8
9
|
icon: megaphone
|
|
@@ -57,7 +58,8 @@ profiles:
|
|
|
57
58
|
label: Channel
|
|
58
59
|
valueType: string
|
|
59
60
|
inputType: select
|
|
60
|
-
enumValues:
|
|
61
|
+
enumValues:
|
|
62
|
+
[email, social, event, content, partnership, paid, organic, other]
|
|
61
63
|
- slug: campaign-goal
|
|
62
64
|
label: Goal
|
|
63
65
|
valueType: string
|
|
@@ -170,7 +172,18 @@ profiles:
|
|
|
170
172
|
label: Source
|
|
171
173
|
valueType: string
|
|
172
174
|
inputType: select
|
|
173
|
-
enumValues:
|
|
175
|
+
enumValues:
|
|
176
|
+
[
|
|
177
|
+
organic,
|
|
178
|
+
referral,
|
|
179
|
+
social,
|
|
180
|
+
email,
|
|
181
|
+
event,
|
|
182
|
+
paid,
|
|
183
|
+
content,
|
|
184
|
+
partnership,
|
|
185
|
+
other,
|
|
186
|
+
]
|
|
174
187
|
- slug: lead-email
|
|
175
188
|
label: Email
|
|
176
189
|
valueType: string
|
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
|
|
7
7
|
meta:
|
|
8
8
|
slug: meetings-knowledge
|
|
9
|
+
domain: knowledge
|
|
9
10
|
name: Meetings & Knowledge
|
|
10
11
|
description: Import and summarize meetings — transcripts become notes, action items become tasks, and attendees become tracked people.
|
|
11
12
|
icon: video
|
|
@@ -25,26 +26,92 @@ workspace:
|
|
|
25
26
|
meetings: provider
|
|
26
27
|
|
|
27
28
|
profiles:
|
|
28
|
-
# ──
|
|
29
|
+
# ── Reused pod-wide kinds ────────────────────────────────────────────────
|
|
30
|
+
# Declared minimally because the workspace-definition validator resolves view
|
|
31
|
+
# scopes and entityLink endpoints ONLY against the slugs declared here — a
|
|
32
|
+
# referenced-but-undeclared slug throws at install time, it does not fall
|
|
33
|
+
# through to the pod-wide kind. Kept light on purpose: these kinds are owned
|
|
34
|
+
# pod-wide (identity + full schema live there), this is just the local grant.
|
|
35
|
+
- slug: person
|
|
36
|
+
displayName: Person
|
|
37
|
+
icon: user
|
|
38
|
+
color: amber
|
|
39
|
+
description: A meeting attendee.
|
|
40
|
+
properties:
|
|
41
|
+
- slug: email
|
|
42
|
+
label: Email
|
|
43
|
+
valueType: string
|
|
44
|
+
inputType: email
|
|
45
|
+
|
|
46
|
+
- slug: task
|
|
47
|
+
displayName: Task
|
|
48
|
+
icon: check-square
|
|
49
|
+
color: blue
|
|
50
|
+
description: An action item that came out of a meeting.
|
|
51
|
+
properties:
|
|
52
|
+
# NOTE: the pod-wide `task` already ships `status` and `dueDate`, and the
|
|
53
|
+
# applier SKIPS properties that already exist — so these are not what makes
|
|
54
|
+
# the kanban work. They are restated only so the SLUG is declarable here
|
|
55
|
+
# (the validator resolves view scopes against this template's `profiles`).
|
|
56
|
+
# The enum mirrors the live pod-wide one exactly; diverging would be
|
|
57
|
+
# misleading since the declaration is skipped and the real lanes win.
|
|
58
|
+
- slug: status
|
|
59
|
+
label: Status
|
|
60
|
+
valueType: string
|
|
61
|
+
inputType: select
|
|
62
|
+
enumValues: [todo, in-progress, done, cancelled]
|
|
63
|
+
constraints: { defaultValue: todo }
|
|
64
|
+
- slug: dueDate
|
|
65
|
+
label: Due
|
|
66
|
+
valueType: date
|
|
67
|
+
inputType: date
|
|
68
|
+
|
|
69
|
+
- slug: note
|
|
70
|
+
displayName: Note
|
|
71
|
+
icon: file-text
|
|
72
|
+
color: violet
|
|
73
|
+
description: A note or summary captured from a meeting.
|
|
74
|
+
properties:
|
|
75
|
+
- slug: content
|
|
76
|
+
label: Content
|
|
77
|
+
valueType: string
|
|
78
|
+
inputType: textarea
|
|
79
|
+
|
|
80
|
+
# ── Event (reused pod-wide kind — the meeting's IDENTITY) ────────────────
|
|
81
|
+
# The pod already seeds `event`, and the live Google Calendar sync writes
|
|
82
|
+
# `entities.type = "event"`. A parallel `meeting` KIND would therefore sit
|
|
83
|
+
# empty beside a synced calendar AND mint a second entity for the same
|
|
84
|
+
# real-world meeting. Identity lives here; the meeting-ness is a role below.
|
|
85
|
+
- slug: event
|
|
86
|
+
displayName: Event
|
|
87
|
+
icon: calendar
|
|
88
|
+
color: sky
|
|
89
|
+
description: A calendar event — the thing a meeting actually is.
|
|
90
|
+
properties:
|
|
91
|
+
- slug: startDate
|
|
92
|
+
label: Start
|
|
93
|
+
valueType: date
|
|
94
|
+
inputType: date
|
|
95
|
+
|
|
96
|
+
# ── Meeting (a ROLE the event plays — NOT a second entity) ───────────────
|
|
97
|
+
# Kind-vs-Facets rule: a role an entity PLAYS is a facet attached to the real
|
|
98
|
+
# thing, never its own kind. Date/attendees/location come from the `event`;
|
|
99
|
+
# only these four are genuinely new. The import playbook ATTACHES this role to
|
|
100
|
+
# the already-synced event rather than creating a duplicate.
|
|
29
101
|
- slug: meeting
|
|
30
102
|
displayName: Meeting
|
|
31
103
|
icon: video
|
|
32
104
|
color: violet
|
|
33
|
-
|
|
105
|
+
scope: shared
|
|
106
|
+
profileKind: role
|
|
107
|
+
applicableKinds: [event]
|
|
108
|
+
description: The meeting hat an event wears — platform, transcript, and what came out of it.
|
|
34
109
|
properties:
|
|
35
|
-
- slug: meetingDate
|
|
36
|
-
label: Date
|
|
37
|
-
valueType: date
|
|
38
|
-
inputType: date
|
|
39
110
|
- slug: platform
|
|
40
111
|
label: Platform
|
|
41
112
|
valueType: string
|
|
42
113
|
inputType: select
|
|
43
114
|
enumValues: [zoom, google-meet, teams, in-person, other]
|
|
44
|
-
- slug: attendees
|
|
45
|
-
label: Attendees
|
|
46
|
-
valueType: array
|
|
47
|
-
inputType: text
|
|
48
115
|
- slug: status
|
|
49
116
|
label: Status
|
|
50
117
|
valueType: string
|
|
@@ -67,13 +134,37 @@ views:
|
|
|
67
134
|
scopeProfileSlug: meeting
|
|
68
135
|
description: Every meeting, its platform, and whether it's been processed.
|
|
69
136
|
config:
|
|
70
|
-
columns: [title,
|
|
137
|
+
columns: [title, startDate, platform, status]
|
|
138
|
+
# The workspace's daily question: which meetings happened but haven't been
|
|
139
|
+
# imported+summarized yet. This is the one action the workspace exists to
|
|
140
|
+
# prompt, so it is the landing view — not the full table.
|
|
141
|
+
- name: Needs Processing
|
|
142
|
+
slug: meetings-unprocessed
|
|
143
|
+
type: list
|
|
144
|
+
scopeProfileSlug: meeting
|
|
145
|
+
description: Meetings that happened but haven't been imported and summarized yet.
|
|
146
|
+
config:
|
|
147
|
+
filterBy: { field: status, operator: is, value: completed }
|
|
71
148
|
defaultView: true
|
|
149
|
+
# Summaries the playbook writes land here — without a view they're invisible.
|
|
150
|
+
- name: Meeting Notes
|
|
151
|
+
slug: meeting-notes
|
|
152
|
+
type: list
|
|
153
|
+
scopeProfileSlug: note
|
|
154
|
+
description: Summaries and notes produced from meetings.
|
|
72
155
|
- name: Meetings Calendar
|
|
73
156
|
slug: meetings-calendar
|
|
74
157
|
type: calendar
|
|
75
158
|
scopeProfileSlug: meeting
|
|
76
159
|
description: Meetings on a calendar, keyed on their date.
|
|
160
|
+
# The date comes from the underlying `event` (startDate), not the meeting
|
|
161
|
+
# role. NOTE the `properties.` prefix is REQUIRED: the calendar resolves
|
|
162
|
+
# dateField with a dotted-path walker against the entity, so a bare
|
|
163
|
+
# `startDate` reads `entity.startDate` (undefined) and only renders at all
|
|
164
|
+
# by falling through the hardcoded dueDate→startDate→startTime chain.
|
|
165
|
+
config:
|
|
166
|
+
dateField: properties.startDate
|
|
167
|
+
colorBy: status
|
|
77
168
|
- name: Action Items
|
|
78
169
|
slug: meeting-action-items
|
|
79
170
|
type: kanban
|
|
@@ -114,7 +205,12 @@ playbooks:
|
|
|
114
205
|
profileSlug: meeting
|
|
115
206
|
params:
|
|
116
207
|
- { name: meeting, type: entity, label: Meeting, required: true }
|
|
117
|
-
- {
|
|
208
|
+
- {
|
|
209
|
+
name: outputTypes,
|
|
210
|
+
type: text,
|
|
211
|
+
label: Outputs,
|
|
212
|
+
defaultValue: "a summary note, action-item tasks, and updated attendee records",
|
|
213
|
+
}
|
|
118
214
|
executor: is-agent
|
|
119
215
|
grants:
|
|
120
216
|
- fireflies_import_last_meeting
|
|
@@ -152,20 +248,41 @@ onboarding:
|
|
|
152
248
|
Recurring meetings (standups, 1:1s) get skipped because they feel
|
|
153
249
|
routine — but their action items are exactly what falls through the
|
|
154
250
|
cracks. Don't let "it's just a standup" excuse skipping capture.
|
|
251
|
+
- >
|
|
252
|
+
"Attendees" as a list of names is not attendee capture — it's a string.
|
|
253
|
+
If the summary says "Sarah will send the deck" and Sarah isn't a tracked
|
|
254
|
+
person linked to that task, the next meeting with Sarah starts from zero
|
|
255
|
+
again. Resolve every attendee to a real person, or say out loud that
|
|
256
|
+
you're choosing not to.
|
|
257
|
+
- >
|
|
258
|
+
A summary nobody re-reads is theatre. The test for a good meeting note is
|
|
259
|
+
whether someone who missed the call could act from it alone — if it needs
|
|
260
|
+
the transcript to make sense, it isn't a summary yet.
|
|
155
261
|
bar: >
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
262
|
+
The PIPE is live, not the rows: transcript source and calendar connected,
|
|
263
|
+
the Import & Summarize playbook run once end-to-end on a real recent
|
|
264
|
+
meeting, and the output inspected together — a note a human would actually
|
|
265
|
+
keep, tasks that are genuinely actionable, and attendees resolved to
|
|
266
|
+
tracked people rather than name strings. If the first import produces vague
|
|
267
|
+
tasks ("follow up"), fix the extraction bar now, not after fifty meetings.
|
|
159
268
|
collect:
|
|
269
|
+
# Deliberately NOT a backfill. The import playbook fills date, summary,
|
|
270
|
+
# attendees and action items — asking the human to type them here would
|
|
271
|
+
# invert the product's whole loop (capture → AI structures it). The only
|
|
272
|
+
# thing the agent can't infer is which meetings deserve the pipe.
|
|
160
273
|
- profileSlug: meeting
|
|
161
|
-
what:
|
|
274
|
+
what: >
|
|
275
|
+
Which recurring meetings are worth importing every time — the standing
|
|
276
|
+
1:1s, the weekly ops call. A watchlist, not a backlog.
|
|
162
277
|
cardinality: few
|
|
163
|
-
keyFields: [
|
|
278
|
+
keyFields: [platform]
|
|
164
279
|
openingQuestions:
|
|
165
|
-
- "
|
|
166
|
-
- "
|
|
167
|
-
- "
|
|
168
|
-
doneWhen:
|
|
280
|
+
- "Name a meeting from last week whose outcome you can't remember. What did that cost you?"
|
|
281
|
+
- "When a meeting produces an action item, where does it go today — and does it survive the week?"
|
|
282
|
+
- "Which recurring meeting would you cancel if you could see its action-item completion rate?"
|
|
283
|
+
doneWhen: >
|
|
284
|
+
Transcript source connected and one real meeting imported end-to-end —
|
|
285
|
+
summary note, at least one action item, and attendees resolved to people.
|
|
169
286
|
|
|
170
287
|
app:
|
|
171
288
|
kind: stored
|
|
@@ -174,7 +291,7 @@ app:
|
|
|
174
291
|
layout:
|
|
175
292
|
defaultView: Meetings
|
|
176
293
|
defaultApp: null
|
|
177
|
-
pinnedApps: [dashboard, data]
|
|
294
|
+
pinnedApps: [dashboard, data, chat]
|
|
178
295
|
sidebarItems:
|
|
179
296
|
- kind: view
|
|
180
297
|
viewName: Meetings
|
|
@@ -194,7 +311,10 @@ layout:
|
|
|
194
311
|
icon: database
|
|
195
312
|
|
|
196
313
|
bento:
|
|
197
|
-
|
|
314
|
+
# Distinct from the "Meetings" table it embeds — the bento is created as its
|
|
315
|
+
# OWN view row, so reusing an embedded view's name puts two identically-named
|
|
316
|
+
# views in the switcher and makes layout.defaultView ambiguous.
|
|
317
|
+
viewName: Meetings Home
|
|
198
318
|
blocks:
|
|
199
319
|
- kind: view
|
|
200
320
|
viewName: Meetings
|