@synap-core/workspace-templates 0.4.0 → 0.6.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.
@@ -0,0 +1,662 @@
1
+ # Communication workspace template
2
+ # Enterprise-OS reference "Communication" domain (Wave 1).
3
+ # MERGES the Brand Library's brand kinds with the Foundation's narrative kinds:
4
+ # Communication OWNS the brand + narrative ARTIFACTS (identity, voice, rules,
5
+ # positioning, narrative, audience, differentiator) — the on-brand source every
6
+ # downstream domain (Content, Marketing, Social) reads from. It does NOT own
7
+ # company-DNA (mission/vision/values) nor relationship roles (client/partner).
8
+
9
+ meta:
10
+ slug: communication
11
+ name: Communication
12
+ description: "Owns brand identity, voice, and narrative/positioning — the on-brand source of truth every downstream domain (Content, Marketing, Social) reads from so everything ships on-brand and on-message."
13
+ icon: messages-square
14
+ color: "#7C3AED"
15
+ tags: [communication, brand, narrative, voice, positioning]
16
+ isPublic: true
17
+
18
+ workspace:
19
+ name: Communication
20
+ description: "Owns brand identity, voice, and narrative/positioning — the on-brand source of truth every downstream domain reads from."
21
+ subtype: communication
22
+ visibility: pod_visible
23
+ capabilities:
24
+ - brand.library
25
+ - brand.identity
26
+ - brand.voice
27
+ - brand.assets
28
+ - brand.templates
29
+ - brand.components
30
+ - narrative.positioning
31
+ sourceRoles:
32
+ brand: provider
33
+ narrative: provider
34
+
35
+ profiles:
36
+ # ═══════════════════════════════════════════════════════════════════════════
37
+ # BRAND KINDS — verbatim from brand-library.yaml
38
+ # ═══════════════════════════════════════════════════════════════════════════
39
+ - slug: brand-identity
40
+ displayName: Brand Identity
41
+ icon: fingerprint
42
+ color: amber
43
+ description: "Root brand context: positioning, audience, website, voice summary, and generation intent."
44
+ semanticSlug: brand.identity
45
+ properties:
46
+ - slug: brand-type
47
+ label: Brand type
48
+ valueType: string
49
+ inputType: select
50
+ enumValues: [product-digital, product-physical, agency, personal-brand, nonprofit, institutional, universal]
51
+ constraints: { defaultValue: universal }
52
+ - slug: brand-status
53
+ label: Status
54
+ valueType: string
55
+ inputType: select
56
+ enumValues: [draft, active, archived]
57
+ constraints: { defaultValue: active }
58
+ - slug: brand-tagline
59
+ label: Tagline
60
+ valueType: string
61
+ inputType: text
62
+ - slug: brand-website
63
+ label: Website
64
+ valueType: string
65
+ inputType: url
66
+ - slug: brand-industry
67
+ label: Industry
68
+ valueType: string
69
+ inputType: text
70
+ - slug: brand-positioning
71
+ label: Positioning
72
+ valueType: string
73
+ inputType: textarea
74
+ - slug: brand-audience-primary
75
+ label: Primary audience
76
+ valueType: string
77
+ inputType: textarea
78
+ - slug: brand-audience-secondary
79
+ label: Secondary audience
80
+ valueType: string
81
+ inputType: textarea
82
+ - slug: brand-voice-summary
83
+ label: Voice summary
84
+ valueType: string
85
+ inputType: textarea
86
+ - slug: brand-notes
87
+ label: Notes
88
+ valueType: string
89
+ inputType: textarea
90
+
91
+ - slug: brand-color
92
+ displayName: Brand Color
93
+ icon: swatch-book
94
+ color: violet
95
+ description: Approved palette entry with semantic role, usage notes, and print references.
96
+ semanticSlug: brand.color
97
+ properties:
98
+ - slug: color-role
99
+ label: Role
100
+ valueType: string
101
+ inputType: select
102
+ enumValues: [primary, secondary, accent, background, surface, surface-elevated, text, text-muted, border, success, warning, error, info, neutral, campaign, custom]
103
+ constraints: { defaultValue: custom }
104
+ - slug: color-group
105
+ label: Group
106
+ valueType: string
107
+ inputType: select
108
+ enumValues: [core, extended, semantic, neutral, seasonal, campaign]
109
+ constraints: { defaultValue: core }
110
+ - slug: color-hex
111
+ label: Hex
112
+ valueType: string
113
+ inputType: color
114
+ - slug: color-rgb
115
+ label: RGB
116
+ valueType: string
117
+ inputType: text
118
+ - slug: color-cmyk
119
+ label: CMYK
120
+ valueType: string
121
+ inputType: text
122
+ - slug: color-pantone
123
+ label: Pantone
124
+ valueType: string
125
+ inputType: text
126
+ - slug: color-ral
127
+ label: RAL
128
+ valueType: string
129
+ inputType: text
130
+ - slug: color-token-name
131
+ label: Token name
132
+ valueType: string
133
+ inputType: text
134
+ - slug: color-usage
135
+ label: Usage note
136
+ valueType: string
137
+ inputType: textarea
138
+ - slug: color-status
139
+ label: Status
140
+ valueType: string
141
+ inputType: select
142
+ enumValues: [draft, approved, deprecated]
143
+ constraints: { defaultValue: approved }
144
+
145
+ - slug: brand-font
146
+ displayName: Brand Typeface
147
+ icon: type
148
+ color: blue
149
+ description: Typeface with role, family, licensing, import URL, weights, and fallback stack.
150
+ semanticSlug: brand.font
151
+ properties:
152
+ - slug: font-role
153
+ label: Role
154
+ valueType: string
155
+ inputType: select
156
+ enumValues: [heading, body, display, mono, accent, ui, caption]
157
+ constraints: { defaultValue: body }
158
+ - slug: font-family
159
+ label: Family
160
+ valueType: string
161
+ inputType: text
162
+ - slug: font-foundry
163
+ label: Foundry
164
+ valueType: string
165
+ inputType: text
166
+ - slug: font-license
167
+ label: License
168
+ valueType: string
169
+ inputType: select
170
+ enumValues: [open-source, google-fonts, adobe-fonts, licensed, custom, system]
171
+ constraints: { defaultValue: google-fonts }
172
+ - slug: font-weights
173
+ label: Weights
174
+ valueType: string
175
+ inputType: text
176
+ - slug: font-fallback
177
+ label: Fallback stack
178
+ valueType: string
179
+ inputType: text
180
+ - slug: font-url
181
+ label: Import URL
182
+ valueType: string
183
+ inputType: url
184
+ - slug: font-document-id
185
+ label: Font document ID
186
+ valueType: string
187
+ inputType: text
188
+ - slug: font-status
189
+ label: Status
190
+ valueType: string
191
+ inputType: select
192
+ enumValues: [active, draft, deprecated]
193
+ constraints: { defaultValue: active }
194
+
195
+ - slug: brand-asset
196
+ displayName: Brand Asset
197
+ icon: image
198
+ color: green
199
+ description: "Document-backed or URL-backed reusable media: logos, imagery, icons, fonts, video, references, and documents."
200
+ semanticSlug: brand.asset
201
+ properties:
202
+ - slug: asset-kind
203
+ label: Kind
204
+ valueType: string
205
+ inputType: select
206
+ enumValues: [logo, wordmark, symbol, monogram, pattern, texture, icon-set, illustration, photo, video, document, font, 3d-model, print-ready, reference, other]
207
+ - slug: asset-variant
208
+ label: Variant
209
+ valueType: string
210
+ inputType: select
211
+ enumValues: [primary, secondary, horizontal, stacked, mono-dark, mono-light, white, reversed, favicon, social-avatar, og-image, other]
212
+ - slug: asset-status
213
+ label: Status
214
+ valueType: string
215
+ inputType: select
216
+ enumValues: [draft, approved, deprecated]
217
+ constraints: { defaultValue: approved }
218
+ - slug: asset-usage
219
+ label: Usage notes
220
+ valueType: string
221
+ inputType: textarea
222
+ - slug: asset-tags
223
+ label: Tags
224
+ valueType: string
225
+ inputType: text
226
+ - slug: asset-url
227
+ label: External URL
228
+ valueType: string
229
+ inputType: url
230
+ - slug: asset-document-id
231
+ label: Document ID
232
+ valueType: string
233
+ inputType: text
234
+ - slug: asset-file-id
235
+ label: Legacy file ID
236
+ valueType: string
237
+ inputType: text
238
+ - slug: asset-alt-text
239
+ label: Alt text
240
+ valueType: string
241
+ inputType: textarea
242
+
243
+ - slug: brand-reference
244
+ displayName: Brand Reference
245
+ icon: bookmark
246
+ color: teal
247
+ description: Website, competitor, campaign, moodboard, or example used as source context for generation.
248
+ semanticSlug: brand.reference
249
+ properties:
250
+ - slug: reference-kind
251
+ label: Kind
252
+ valueType: string
253
+ inputType: select
254
+ enumValues: [website, competitor, campaign, moodboard, copy-example, design-example, customer-example, other]
255
+ - slug: reference-url
256
+ label: URL
257
+ valueType: string
258
+ inputType: url
259
+ - slug: reference-notes
260
+ label: Notes
261
+ valueType: string
262
+ inputType: textarea
263
+ - slug: reference-status
264
+ label: Status
265
+ valueType: string
266
+ inputType: select
267
+ enumValues: [draft, approved, archived]
268
+ constraints: { defaultValue: approved }
269
+
270
+ - slug: brand-token-set
271
+ displayName: Token Set
272
+ icon: code-2
273
+ color: violet
274
+ description: Generated or curated design tokens for color, typography, spacing, radii, and exported CSS variables.
275
+ semanticSlug: brand.tokens
276
+ properties:
277
+ - slug: token-status
278
+ label: Status
279
+ valueType: string
280
+ inputType: select
281
+ enumValues: [draft, active, archived]
282
+ constraints: { defaultValue: active }
283
+ - slug: token-mode
284
+ label: Mode
285
+ valueType: string
286
+ inputType: select
287
+ enumValues: [base, light, dark, high-contrast, campaign, experimental]
288
+ constraints: { defaultValue: base }
289
+ - slug: token-source-ids
290
+ label: Source IDs
291
+ valueType: string
292
+ inputType: textarea
293
+ - slug: token-json
294
+ label: Tokens JSON
295
+ valueType: string
296
+ inputType: textarea
297
+ - slug: token-css
298
+ label: CSS variables
299
+ valueType: string
300
+ inputType: textarea
301
+ - slug: token-notes
302
+ label: Notes
303
+ valueType: string
304
+ inputType: textarea
305
+
306
+ - slug: brand-voice-guide
307
+ displayName: Voice Guide
308
+ icon: message-circle
309
+ color: orange
310
+ description: "Generated or curated voice guidance by context: traits, tone, vocabulary, and copy examples."
311
+ semanticSlug: brand.voice
312
+ properties:
313
+ - slug: voice-context
314
+ label: Context
315
+ valueType: string
316
+ inputType: select
317
+ enumValues: [general, marketing, product, support, social, legal, editorial, investor]
318
+ constraints: { defaultValue: general }
319
+ - slug: voice-status
320
+ label: Status
321
+ valueType: string
322
+ inputType: select
323
+ enumValues: [draft, approved, deprecated]
324
+ constraints: { defaultValue: approved }
325
+ - slug: voice-personality-traits
326
+ label: Personality
327
+ valueType: string
328
+ inputType: textarea
329
+ - slug: voice-tone-descriptors
330
+ label: Tone
331
+ valueType: string
332
+ inputType: text
333
+ - slug: voice-vocabulary
334
+ label: Vocabulary
335
+ valueType: string
336
+ inputType: textarea
337
+ - slug: voice-example-do
338
+ label: Do
339
+ valueType: string
340
+ inputType: textarea
341
+ - slug: voice-example-dont
342
+ label: Don't
343
+ valueType: string
344
+ inputType: textarea
345
+ - slug: voice-source-ids
346
+ label: Source IDs
347
+ valueType: string
348
+ inputType: textarea
349
+
350
+ - slug: brand-rule
351
+ displayName: Brand Rule
352
+ icon: shield-check
353
+ color: red
354
+ description: Usage constraints, accessibility requirements, do/don't examples, and generation guidance.
355
+ semanticSlug: brand.rule
356
+ properties:
357
+ - slug: rule-kind
358
+ label: Kind
359
+ valueType: string
360
+ inputType: select
361
+ enumValues: [visual, voice, legal, accessibility, sizing, clearance, color-usage, typography-usage, do, dont, generation, other]
362
+ - slug: rule-subject
363
+ label: Subject
364
+ valueType: string
365
+ inputType: select
366
+ enumValues: [logo, color, typography, pattern, asset, voice, general, digital, print, packaging]
367
+ - slug: rule-severity
368
+ label: Severity
369
+ valueType: string
370
+ inputType: select
371
+ enumValues: [guideline, important, mandatory]
372
+ constraints: { defaultValue: important }
373
+ - slug: rule-content
374
+ label: Rule
375
+ valueType: string
376
+ inputType: textarea
377
+ - slug: rule-example
378
+ label: Example
379
+ valueType: string
380
+ inputType: textarea
381
+ - slug: rule-source-ids
382
+ label: Source IDs
383
+ valueType: string
384
+ inputType: textarea
385
+
386
+ - slug: brand-template
387
+ displayName: Brand Template
388
+ icon: layout-template
389
+ color: pink
390
+ description: Reusable output template for artboards, decks, carousels, banners, documents, or generated HTML.
391
+ semanticSlug: brand.template
392
+ properties:
393
+ - slug: template-kind
394
+ label: Kind
395
+ valueType: string
396
+ inputType: select
397
+ enumValues: [artboard, deck, carousel, banner, document, html, social, other]
398
+ - slug: template-status
399
+ label: Status
400
+ valueType: string
401
+ inputType: select
402
+ enumValues: [draft, approved, deprecated]
403
+ constraints: { defaultValue: approved }
404
+ - slug: template-format
405
+ label: Format
406
+ valueType: string
407
+ inputType: select
408
+ enumValues: [tldraw, html, json, markdown, image, mixed]
409
+ - slug: template-config
410
+ label: Config JSON
411
+ valueType: string
412
+ inputType: textarea
413
+ - slug: template-usage
414
+ label: Usage notes
415
+ valueType: string
416
+ inputType: textarea
417
+
418
+ - slug: brand-component
419
+ displayName: Brand Component
420
+ icon: component
421
+ color: green
422
+ description: "Reusable branded UI or content component: hero, CTA, card, quote, banner, section, or HTML snippet."
423
+ semanticSlug: brand.component
424
+ properties:
425
+ - slug: component-kind
426
+ label: Kind
427
+ valueType: string
428
+ inputType: select
429
+ enumValues: [hero, card, cta, quote, banner, section, layout, html, other]
430
+ - slug: component-status
431
+ label: Status
432
+ valueType: string
433
+ inputType: select
434
+ enumValues: [draft, approved, deprecated]
435
+ constraints: { defaultValue: approved }
436
+ - slug: component-html
437
+ label: HTML
438
+ valueType: string
439
+ inputType: textarea
440
+ - slug: component-props
441
+ label: Props JSON
442
+ valueType: string
443
+ inputType: textarea
444
+ - slug: component-usage
445
+ label: Usage notes
446
+ valueType: string
447
+ inputType: textarea
448
+
449
+ # ═══════════════════════════════════════════════════════════════════════════
450
+ # NARRATIVE KINDS — verbatim from foundation.yaml
451
+ # (Communication owns the narrative ARTIFACTS: positioning, story arc,
452
+ # audiences, and differentiators — NOT mission/vision/values.)
453
+ # ═══════════════════════════════════════════════════════════════════════════
454
+ - slug: positioning
455
+ displayName: Positioning
456
+ icon: crosshair
457
+ color: cyan
458
+ description: "Market category, who we stand against, and why we win."
459
+ properties:
460
+ - slug: category
461
+ label: Category
462
+ valueType: string
463
+ inputType: text
464
+ - slug: against
465
+ label: Against
466
+ valueType: string
467
+ inputType: textarea
468
+ - slug: because
469
+ label: Because
470
+ valueType: string
471
+ inputType: textarea
472
+
473
+ - slug: narrative
474
+ displayName: Narrative
475
+ icon: book-open
476
+ color: amber
477
+ description: "The origin -> insight -> mission story arc."
478
+ properties:
479
+ - slug: arc
480
+ label: Story arc
481
+ valueType: string
482
+ inputType: textarea
483
+ - slug: status
484
+ label: Status
485
+ valueType: string
486
+ inputType: select
487
+ enumValues: [draft, active, archived]
488
+ constraints: { defaultValue: active }
489
+
490
+ - slug: audience
491
+ displayName: Audience
492
+ icon: users
493
+ color: blue
494
+ description: "An ideal customer profile — who we are built for."
495
+ properties:
496
+ - slug: segment
497
+ label: Segment
498
+ valueType: string
499
+ inputType: text
500
+ - slug: persona
501
+ label: Persona
502
+ valueType: string
503
+ inputType: textarea
504
+ - slug: jobs-to-be-done
505
+ label: Jobs to be done
506
+ valueType: string
507
+ inputType: textarea
508
+ - slug: traits
509
+ label: Traits
510
+ valueType: array
511
+ inputType: text
512
+
513
+ - slug: differentiator
514
+ displayName: Differentiator
515
+ icon: sparkles
516
+ color: green
517
+ description: "One thing only we do, believe, or refuse."
518
+ properties:
519
+ - slug: statement
520
+ label: Statement
521
+ valueType: string
522
+ inputType: textarea
523
+ - slug: proof
524
+ label: Proof
525
+ valueType: string
526
+ inputType: textarea
527
+
528
+ # CURATED views — not one per profile
529
+ views:
530
+ - name: Brand Identity
531
+ slug: brand-identities
532
+ type: table
533
+ scopeProfileSlug: brand-identity
534
+ description: Root brand context and active identities.
535
+ defaultView: true
536
+ - name: Voice & Rules
537
+ slug: voice-rules
538
+ type: list
539
+ scopeProfileSlug: brand-voice-guide
540
+ description: Voice guides — tone, personality, vocabulary, and do/don't examples per context.
541
+ - name: Assets
542
+ slug: brand-assets
543
+ type: grid
544
+ scopeProfileSlug: brand-asset
545
+ description: Logos, media, documents, and visual references.
546
+ - name: Narrative
547
+ slug: narrative
548
+ type: table
549
+ scopeProfileSlug: positioning
550
+ description: Positioning, audiences, and the differentiators that anchor the message.
551
+
552
+ onboarding:
553
+ goal: >
554
+ Capture the real brand and narrative — the visual + verbal identity, the
555
+ voice rules that keep everything on-brand, the sharp positioning, and who
556
+ it's aimed at — so every downstream domain (Content, Marketing, Social)
557
+ inherits one on-brand, on-message source of truth instead of guessing.
558
+ framing: >
559
+ THE BRAND & COMMS LEAD: Act as the person who owns how this company sounds and
560
+ what story it tells. You are protective of the voice and relentless about the
561
+ narrative. Push for a real, sharp positioning — a category and a wedge, not a
562
+ vague "we help companies with X" — and for documented voice rules (testable
563
+ do/don't pairs), never a pile of adjectives. Translate fuzzy vibes into
564
+ concrete voice guides, rules, and a positioning a stranger could repeat.
565
+ expertise:
566
+ starters:
567
+ - >
568
+ Adjectives don't define a voice — "friendly, bold, human" describes every
569
+ brand and constrains none. Propose voice as a small set of DO / DON'T pairs
570
+ instead ("say 'you', not 'users'"; "short declaratives, never hedged
571
+ qualifiers"). Pairs are testable; adjectives are decoration.
572
+ - >
573
+ Positioning is sharpest as ONE sentence — "the <X> for <who>" or "the only
574
+ <category> that <wedge>". If they give you a vague "we help companies with
575
+ Y", propose a crisp category+wedge framing from what they've told you and
576
+ let them sharpen it — never file the vague version.
577
+ - >
578
+ A voice guide is only real if it survives a sentence test. Take one actual
579
+ line from their site or a competitor's and rewrite it in the proposed voice
580
+ on the spot — if the rewrite looks identical to the original, the voice isn't
581
+ differentiated yet. Push until the two versions are visibly different.
582
+ blindSpots:
583
+ - >
584
+ "Brand = logo" is the classic trap. The logo is the least-used, most-argued
585
+ asset; the voice, the positioning, and the do/don't rules drive 90% of what
586
+ anyone actually ships. If they lead with the logo, redirect to how the brand
587
+ SOUNDS and what story it tells in a paragraph of copy.
588
+ - >
589
+ Rules with no severity are ignored. A pile of equally-weighted "guidelines"
590
+ gives an AI or a teammate nothing to obey — mark each as mandatory,
591
+ important, or guideline so the non-negotiables (forbidden words, contrast,
592
+ clearspace) actually hold under pressure.
593
+ - >
594
+ Positioning that's really a feature list isn't positioning. If "why we win"
595
+ is a bullet list of capabilities, name it — push for the ONE wedge a
596
+ competitor can't easily claim, tied to a specific audience.
597
+ bar: >
598
+ A stranger handed the voice pairs, the positioning sentence, and the audience
599
+ could write a new paragraph that reads unmistakably as THIS brand AND explain
600
+ who it's for and why it wins — every voice rule testable on a real sentence,
601
+ the positioning repeatable in one breath.
602
+ collect:
603
+ - profileSlug: brand-voice-guide
604
+ what: Voice guides — tone, personality traits, vocabulary, and do/don't examples per context.
605
+ cardinality: few
606
+ keyFields: [voice-personality-traits, voice-tone-descriptors, voice-example-do, voice-example-dont]
607
+ - profileSlug: brand-rule
608
+ what: Usage and voice rules (mandatory / important / guideline).
609
+ cardinality: several
610
+ keyFields: [rule-kind, rule-severity, rule-content]
611
+ - profileSlug: positioning
612
+ what: The market category, who we stand against, and why we win.
613
+ cardinality: few
614
+ keyFields: [category, against, because]
615
+ - profileSlug: audience
616
+ what: The ideal audiences the message is aimed at.
617
+ cardinality: several
618
+ keyFields: [segment, jobs-to-be-done]
619
+ openingQuestions:
620
+ - "In three words, how should the brand sound — and what's one thing it must never say?"
621
+ - "Who's the message aimed at — which audience does the brand talk to first?"
622
+ - "In one sentence — what category are you in, and why do you win it?"
623
+ doneWhen: at least one voice guide + one positioning + one audience captured.
624
+
625
+ # App reference — no custom app for communication
626
+ app:
627
+ kind: stored
628
+ cellKey: entity-detail
629
+
630
+ # Layout config for browser sidebar
631
+ layout:
632
+ pinnedApps: [dashboard, data]
633
+ defaultView: Brand Identity
634
+ defaultApp: null
635
+ sidebarItems:
636
+ - kind: view
637
+ viewName: Brand Identity
638
+ label: Brand Identity
639
+ icon: fingerprint
640
+ - kind: view
641
+ viewName: Voice & Rules
642
+ label: Voice & Rules
643
+ icon: message-circle
644
+ - kind: view
645
+ viewName: Assets
646
+ label: Assets
647
+ icon: image
648
+ - kind: view
649
+ viewName: Narrative
650
+ label: Narrative
651
+ icon: crosshair
652
+
653
+ # Bento dashboard
654
+ bento:
655
+ viewName: Brand Identity
656
+ blocks:
657
+ - kind: view
658
+ viewName: Voice & Rules
659
+ pos: { x: 0, y: 0, w: 6, h: 5 }
660
+ - kind: view
661
+ viewName: Narrative
662
+ pos: { x: 6, y: 0, w: 6, h: 5 }