@synap-core/workspace-templates 0.6.0 → 0.6.1

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.
@@ -199,235 +199,6 @@ profiles:
199
199
  valueType: string
200
200
  inputType: textarea
201
201
 
202
- # --- Creator-ops kinds absorbed from Content OS (merge) ---
203
- - slug: post
204
- displayName: Post
205
- icon: file-edit
206
- color: "#6366F1"
207
- description: "Your atomic content unit. One idea, multiple platform formats — tracked from spark to publication."
208
- scope: WORKSPACE
209
- properties:
210
- - slug: post-status
211
- label: Status
212
- valueType: string
213
- inputType: select
214
- enumValues: ["Idea", "Briefed", "In Draft", "Review", "Scheduled", "Published", "Archived"]
215
- - slug: post-format
216
- label: Format
217
- valueType: string
218
- inputType: select
219
- enumValues: ["Article", "Thread", "Short Video", "Long Video", "Carousel", "Image Post", "Story", "Newsletter Section", "Podcast Episode", "Other"]
220
- - slug: post-platform
221
- label: Platform
222
- valueType: string
223
- inputType: select
224
- enumValues: ["LinkedIn", "Instagram", "TikTok", "YouTube", "Twitter / X", "Threads", "Bluesky", "Newsletter", "Podcast", "Blog", "Other"]
225
- - slug: post-pillar
226
- label: Pillar
227
- valueType: entity_id
228
- - slug: post-campaign
229
- label: Campaign
230
- valueType: entity_id
231
- - slug: post-sponsor
232
- label: Sponsor
233
- valueType: entity_id
234
- - slug: publish-date
235
- label: Publish Date
236
- valueType: date
237
- - slug: post-hook
238
- label: "Hook / Headline"
239
- valueType: string
240
- inputType: text
241
- placeholder: "Opening line or headline that stops the scroll"
242
- - slug: post-cta
243
- label: CTA
244
- valueType: string
245
- inputType: text
246
- placeholder: "What should the audience do?"
247
- - slug: post-tags
248
- label: Tags
249
- valueType: array
250
- - slug: engagement-score
251
- label: Engagement Score
252
- valueType: number
253
- inputType: number
254
- placeholder: "Numeric performance metric (likes + comments + shares)"
255
- - slug: post-reach
256
- label: "Reach / Views"
257
- valueType: number
258
- inputType: number
259
- - slug: repurposed-from
260
- label: Repurposed From
261
- valueType: string
262
- inputType: text
263
- placeholder: "Source post or content this was adapted from"
264
- - slug: post-url
265
- label: Published URL
266
- valueType: string
267
- inputType: text
268
- placeholder: "https://..."
269
- constraints: { format: url }
270
-
271
- - slug: pillar
272
- displayName: Pillar
273
- icon: columns
274
- color: "#8B5CF6"
275
- description: "A recurring content theme — the lens through which your audience knows you. The organizing principle of your brand."
276
- scope: WORKSPACE
277
- properties:
278
- - slug: pillar-status
279
- label: Status
280
- valueType: string
281
- inputType: select
282
- enumValues: ["Active", "Developing", "Paused", "Retired"]
283
- - slug: pillar-audience
284
- label: Audience Segment
285
- valueType: string
286
- inputType: text
287
- placeholder: "Who does this pillar speak to?"
288
- - slug: pillar-goal
289
- label: Audience Goal
290
- valueType: string
291
- inputType: text
292
- placeholder: "What should the audience think, feel, or do after consuming this pillar?"
293
- - slug: pillar-formats
294
- label: Primary Formats
295
- valueType: string
296
- inputType: select
297
- enumValues: ["Articles + Threads", "Short Video", "Long Video", "Newsletter", "Podcast", "Carousel", "Mixed"]
298
- - slug: post-count-pillar
299
- label: Total Posts Published
300
- valueType: number
301
- inputType: number
302
- - slug: avg-engagement
303
- label: Avg Engagement Score
304
- valueType: number
305
- inputType: number
306
- - slug: top-post
307
- label: Top Performing Post
308
- valueType: string
309
- inputType: text
310
- placeholder: "Title of best performing post in this pillar"
311
- - slug: posting-frequency
312
- label: Target Frequency
313
- valueType: string
314
- inputType: select
315
- enumValues: ["Daily", "3x / week", "2x / week", "Weekly", "Bi-weekly", "Monthly", "Ad hoc"]
316
- - slug: pillar-tags
317
- label: Tags
318
- valueType: array
319
-
320
- - slug: platform
321
- displayName: Platform
322
- icon: share-2
323
- color: "#06B6D4"
324
- description: "A social account, newsletter publication, or podcast channel. Each platform has its own audience metrics and publishing rhythm."
325
- scope: WORKSPACE
326
- properties:
327
- - slug: platform-type
328
- label: Type
329
- valueType: string
330
- inputType: select
331
- enumValues: ["LinkedIn", "Instagram", "TikTok", "YouTube", "Twitter / X", "Threads", "Bluesky", "Newsletter", "Podcast", "Blog / Website", "Other"]
332
- - slug: platform-status
333
- label: Status
334
- valueType: string
335
- inputType: select
336
- enumValues: ["Active", "Building", "Maintenance Mode", "Inactive"]
337
- - slug: platform-url
338
- label: Profile URL
339
- valueType: string
340
- inputType: text
341
- placeholder: "https://..."
342
- constraints: { format: url }
343
- - slug: follower-count
344
- label: "Follower / Subscriber Count"
345
- valueType: number
346
- inputType: number
347
- - slug: follower-target
348
- label: Target Count
349
- valueType: number
350
- inputType: number
351
- - slug: avg-engagement-rate
352
- label: "Avg Engagement Rate (%)"
353
- valueType: number
354
- inputType: number
355
- - slug: platform-posting-freq
356
- label: Posting Frequency
357
- valueType: string
358
- inputType: select
359
- enumValues: ["Daily", "3x / week", "2x / week", "Weekly", "Bi-weekly", "Monthly", "As Needed"]
360
- - slug: last-post-date
361
- label: Last Post Date
362
- valueType: date
363
- - slug: platform-notes
364
- label: Notes
365
- valueType: string
366
- inputType: text
367
- placeholder: "What works here? Tone, format, best times..."
368
- - slug: platform-tags
369
- label: Tags
370
- valueType: array
371
-
372
- - slug: newsletter
373
- displayName: Newsletter
374
- icon: mail
375
- color: "#10B981"
376
- description: "A newsletter issue — your direct channel to an owned audience. No algorithm, no platform fee, no intermediary."
377
- scope: WORKSPACE
378
- properties:
379
- - slug: newsletter-status
380
- label: Status
381
- valueType: string
382
- inputType: select
383
- enumValues: ["Idea", "Drafting", "Editing", "Scheduled", "Sent", "Archived"]
384
- - slug: newsletter-series
385
- label: Series
386
- valueType: string
387
- inputType: text
388
- placeholder: "Which newsletter series is this issue part of?"
389
- - slug: issue-number
390
- label: Issue Number
391
- valueType: number
392
- inputType: number
393
- - slug: subject-line
394
- label: Subject Line
395
- valueType: string
396
- inputType: text
397
- placeholder: "The subject line — your most important copy"
398
- - slug: preview-text
399
- label: Preview Text
400
- valueType: string
401
- inputType: text
402
- placeholder: "45-character preview shown in inbox (after subject)"
403
- - slug: send-date
404
- label: Send Date
405
- valueType: date
406
- - slug: subscriber-count
407
- label: Subscriber Count at Send
408
- valueType: number
409
- inputType: number
410
- - slug: open-rate
411
- label: "Open Rate (%)"
412
- valueType: number
413
- inputType: number
414
- - slug: click-rate
415
- label: "Click Rate (%)"
416
- valueType: number
417
- inputType: number
418
- - slug: newsletter-sponsor
419
- label: Sponsor
420
- valueType: entity_id
421
- - slug: newsletter-campaign
422
- label: Campaign
423
- valueType: entity_id
424
- - slug: newsletter-pillar
425
- label: Primary Pillar
426
- valueType: entity_id
427
- - slug: newsletter-tags
428
- label: Tags
429
- valueType: array
430
-
431
202
  views:
432
203
  - name: Pipelines
433
204
  slug: content-pipelines
@@ -454,29 +225,6 @@ views:
454
225
  type: grid
455
226
  scopeProfileSlug: content-template
456
227
  description: Reusable video templates.
457
- # --- Curated views for absorbed creator-ops kinds ---
458
- - name: Posts
459
- slug: content-posts
460
- type: kanban
461
- scopeProfileSlug: post
462
- groupBy: post-status
463
- description: Content posts by status.
464
- - name: Pillars
465
- slug: content-pillars
466
- type: list
467
- scopeProfileSlug: pillar
468
- description: Content pillars — the recurring themes.
469
- - name: Platforms
470
- slug: content-platforms
471
- type: table
472
- scopeProfileSlug: platform
473
- description: Channels and their audience metrics.
474
- - name: Newsletters
475
- slug: content-newsletters
476
- type: kanban
477
- scopeProfileSlug: newsletter
478
- groupBy: newsletter-status
479
- description: Newsletter issues by status.
480
228
 
481
229
  # App reference
482
230
  app:
@@ -521,22 +269,6 @@ layout:
521
269
  viewName: Templates
522
270
  label: Templates
523
271
  icon: layout-template
524
- - kind: view
525
- viewName: Posts
526
- label: Posts
527
- icon: file-edit
528
- - kind: view
529
- viewName: Pillars
530
- label: Pillars
531
- icon: columns
532
- - kind: view
533
- viewName: Platforms
534
- label: Platforms
535
- icon: share-2
536
- - kind: view
537
- viewName: Newsletters
538
- label: Newsletters
539
- icon: mail
540
272
 
541
273
  entityLinks:
542
274
  - sourceProfileSlug: content-composition
package/src/crm.yaml CHANGED
@@ -202,6 +202,202 @@ profiles:
202
202
  - ready
203
203
  - handed_off
204
204
 
205
+ # ═══════════════════════════════════════════════════════════════════════════
206
+ # ECOSYSTEM ROLES — shared pod-wide role vocabulary (SSOT is foundation.yaml).
207
+ #
208
+ # These `scope: shared`, `profileKind: role` profiles are ONE pod-wide row each,
209
+ # defined ONCE in foundation.yaml. The CRM re-declares them so the apply engine
210
+ # (create-workspace-from-definition.ts) resolves each slug to the existing
211
+ # pod-wide profile and GRANTS this workspace access to it (SHARED profiles are
212
+ # grant-gated — a workspace only sees a shared role if it references the slug).
213
+ # Without these references the CRM workspace could attach `client`/`lead`/…
214
+ # facets that entities.list could never surface, so every row fell through to
215
+ # the "Idle" relationship status (crmData.ts getRelationshipStatus).
216
+ #
217
+ # Bodies match foundation VERBATIM (row-level icon/color/displayName/description
218
+ # + every property definition): two templates declaring the same shared slug
219
+ # with DIVERGENT bodies fight over one pod-wide row (base drift). The
220
+ # template-shared-role-ssot tripwire enforces this — do NOT diverge here.
221
+ # ═══════════════════════════════════════════════════════════════════════════
222
+
223
+ # ── Client (active commercial relationship) ───────────────────────────────
224
+ - slug: client
225
+ displayName: Client
226
+ icon: briefcase
227
+ color: emerald
228
+ description: An active commercial relationship — created when a deal is won.
229
+ scope: shared
230
+ profileKind: role
231
+ applicableKinds:
232
+ - company
233
+ - person
234
+ properties:
235
+ - slug: clientStatus
236
+ label: Status
237
+ valueType: string
238
+ inputType: select
239
+ enumValues:
240
+ - prospect
241
+ - active
242
+ - paused
243
+ - former
244
+ - churned
245
+ - slug: accountManager
246
+ label: Account Manager
247
+ valueType: string
248
+ inputType: text
249
+ - slug: engagementStartDate
250
+ label: Engagement Start
251
+ valueType: date
252
+ inputType: date
253
+ - slug: satisfactionScore
254
+ label: Satisfaction
255
+ valueType: number
256
+ inputType: number
257
+ - slug: lifetimeValue
258
+ label: Lifetime Value
259
+ valueType: number
260
+ inputType: number
261
+ - slug: notes
262
+ label: Notes
263
+ valueType: string
264
+ inputType: textarea
265
+ - slug: contractValue
266
+ label: Contract Value
267
+ valueType: number
268
+ inputType: number
269
+ - slug: renewalDate
270
+ label: Renewal Date
271
+ valueType: date
272
+ inputType: date
273
+ - slug: healthScore
274
+ label: Health
275
+ valueType: string
276
+ inputType: select
277
+ enumValues:
278
+ - healthy
279
+ - at_risk
280
+ - critical
281
+
282
+ # ── Partner (referral source + co-delivery collaborator) ──────────────────
283
+ - slug: partner
284
+ displayName: Partner
285
+ icon: handshake
286
+ color: teal
287
+ description: A partner relationship — both a referral source and a co-delivery collaborator, distinguished by partner type.
288
+ scope: shared
289
+ profileKind: role
290
+ applicableKinds:
291
+ - company
292
+ - person
293
+ properties:
294
+ - slug: partnerStatus
295
+ label: Status
296
+ valueType: string
297
+ inputType: select
298
+ enumValues:
299
+ - prospect
300
+ - active
301
+ - paused
302
+ - churned
303
+ - slug: partnerType
304
+ label: Partner Type
305
+ valueType: string
306
+ inputType: select
307
+ enumValues:
308
+ - referral
309
+ - co-delivery
310
+ - both
311
+ - slug: accountManager
312
+ label: Account Manager
313
+ valueType: string
314
+ inputType: text
315
+ - slug: engagementStartDate
316
+ label: Engagement Start
317
+ valueType: date
318
+ inputType: date
319
+ - slug: satisfactionScore
320
+ label: Satisfaction
321
+ valueType: number
322
+ inputType: number
323
+ - slug: lifetimeValue
324
+ label: Lifetime Value
325
+ valueType: number
326
+ inputType: number
327
+ - slug: notes
328
+ label: Notes
329
+ valueType: string
330
+ inputType: textarea
331
+ - slug: contractValue
332
+ label: Contract Value
333
+ valueType: number
334
+ inputType: number
335
+ - slug: renewalDate
336
+ label: Renewal Date
337
+ valueType: date
338
+ inputType: date
339
+ - slug: healthScore
340
+ label: Health
341
+ valueType: string
342
+ inputType: select
343
+ enumValues:
344
+ - healthy
345
+ - at_risk
346
+ - critical
347
+
348
+ # ── Lead (early-pipeline prospect, pre-client) ─────────────────────────────
349
+ - slug: lead
350
+ displayName: Lead
351
+ icon: user-plus
352
+ color: yellow
353
+ description: An early-pipeline prospect — not yet a client, being qualified or nurtured.
354
+ scope: shared
355
+ profileKind: role
356
+ applicableKinds:
357
+ - company
358
+ - person
359
+ properties:
360
+ - slug: leadStage
361
+ label: Stage
362
+ valueType: string
363
+ inputType: select
364
+ enumValues:
365
+ - prospect
366
+ - qualified
367
+ - nurturing
368
+ - converted
369
+ - lost
370
+ constraints: { defaultValue: prospect }
371
+ - slug: notes
372
+ label: Notes
373
+ valueType: string
374
+ inputType: textarea
375
+
376
+ # ── Churned (formerly-active relationship that ended) ──────────────────────
377
+ - slug: churned
378
+ displayName: Churned
379
+ icon: user-x
380
+ color: gray
381
+ description: A relationship (client, partner, or otherwise) that was active and has since ended.
382
+ scope: shared
383
+ profileKind: role
384
+ applicableKinds:
385
+ - company
386
+ - person
387
+ properties:
388
+ - slug: churnedDate
389
+ label: Churned Date
390
+ valueType: date
391
+ inputType: date
392
+ - slug: churnReason
393
+ label: Reason
394
+ valueType: string
395
+ inputType: textarea
396
+ - slug: notes
397
+ label: Notes
398
+ valueType: string
399
+ inputType: textarea
400
+
205
401
  entityLinks:
206
402
  - sourceProfileSlug: person
207
403
  targetProfileSlug: deal