@synap-core/workspace-templates 0.5.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.
@@ -0,0 +1,478 @@
1
+ # Ecosystem workspace template
2
+ # The BASE market-graph domain: the players you operate around (partners,
3
+ # competitors, companies, people), the segments and trends that matter, and —
4
+ # the net-new value — the TYPED RELATIONSHIPS between actors (who partners with,
5
+ # competes with, invested in, integrates with whom).
6
+ # Merges + supersedes the old Radar template (carries its market-segment, trend,
7
+ # inspiration kinds, its competitor role, and its graph "Radar Map" view forward).
8
+
9
+ meta:
10
+ slug: ecosystem
11
+ name: Ecosystem
12
+ description: Map the market you operate in — the partners, competitors, and players, the segments and trends, and the relationships between them.
13
+ icon: radar
14
+ color: "#0EA5E9"
15
+ tags: [ecosystem, market, partners, competitors, graph]
16
+ isPublic: true
17
+
18
+ # SSOT ordering guarantee — this template REFERENCES foundation's pod-wide
19
+ # shared `partner` role. The apply engine seeds a shared profile's pod-wide BASE
20
+ # property body from whichever template creates it FIRST, and adds a REUSING
21
+ # template's extra props as workspace OVERLAYS. Requiring foundation makes the
22
+ # resolver install it first (deps-first), so the base is always foundation's
23
+ # SSOT body and never this template's. `require`, not `compose`: foundation is a
24
+ # real workspace, not an overlay. (`competitor` is owned HERE — not foundation's.)
25
+ dependencies:
26
+ - slug: foundation
27
+ kind: workspace
28
+ relation: require
29
+ reason: "Provides the pod-wide partner role vocabulary this workspace reuses."
30
+
31
+ workspace:
32
+ name: Ecosystem
33
+ description: Map the market you operate in — the partners, competitors, and players, the segments and trends, and the relationships between them.
34
+ subtype: ecosystem
35
+ visibility: pod_visible
36
+ capabilities:
37
+ - ecosystem.actors
38
+ - ecosystem.graph
39
+ - ecosystem.segments
40
+ sourceRoles:
41
+ ecosystem: provider
42
+
43
+ profiles:
44
+ # ── Actors ────────────────────────────────────────────────────────────────
45
+ # The pod-wide person and company kinds — declared minimally here so facets
46
+ # (competitor/partner) and actor↔actor relations resolve. Kept light on
47
+ # purpose: this is the base agnostic identity, not a full CRM record.
48
+ - slug: person
49
+ displayName: Person
50
+ icon: user
51
+ color: amber
52
+ description: A person in the ecosystem — a founder, operator, or contact.
53
+ properties:
54
+ - slug: email
55
+ label: Email
56
+ valueType: string
57
+ inputType: email
58
+ - slug: notes
59
+ label: Notes
60
+ valueType: string
61
+ inputType: textarea
62
+
63
+ - slug: company
64
+ displayName: Company
65
+ icon: building-2
66
+ color: "#10B981"
67
+ description: A company in the ecosystem — a player you operate around.
68
+ properties:
69
+ - slug: website
70
+ label: Website
71
+ valueType: string
72
+ inputType: url
73
+ - slug: industry
74
+ label: Industry
75
+ valueType: string
76
+ inputType: text
77
+ - slug: notes
78
+ label: Notes
79
+ valueType: string
80
+ inputType: textarea
81
+
82
+ # ── Market structure (carried verbatim from Radar) ──────────────────────────
83
+ - slug: market-segment
84
+ displayName: Market Segment
85
+ icon: pie-chart
86
+ color: blue
87
+ description: A slice of the market with its own size, maturity, and dynamics.
88
+ properties:
89
+ - slug: description
90
+ label: Description
91
+ valueType: string
92
+ inputType: textarea
93
+ - slug: tam
94
+ label: TAM
95
+ valueType: string
96
+ inputType: text
97
+ - slug: sam
98
+ label: SAM
99
+ valueType: string
100
+ inputType: text
101
+ - slug: som
102
+ label: SOM
103
+ valueType: string
104
+ inputType: text
105
+ - slug: ocean
106
+ label: Ocean
107
+ valueType: string
108
+ inputType: select
109
+ enumValues: [blue, red]
110
+ - slug: maturity
111
+ label: Maturity
112
+ valueType: string
113
+ inputType: select
114
+ enumValues: [emerging, growing, mature, declining]
115
+
116
+ - slug: trend
117
+ displayName: Trend
118
+ icon: trending-up
119
+ color: violet
120
+ description: A directional shift in the market, tech, or behavior worth tracking.
121
+ properties:
122
+ - slug: description
123
+ label: Description
124
+ valueType: string
125
+ inputType: textarea
126
+ - slug: direction
127
+ label: Direction
128
+ valueType: string
129
+ inputType: select
130
+ enumValues: [rising, steady, fading]
131
+ - slug: sources
132
+ label: Sources
133
+ valueType: array
134
+ inputType: text
135
+ - slug: relevance
136
+ label: Relevance
137
+ valueType: string
138
+ inputType: select
139
+ enumValues: [low, medium, high]
140
+ constraints: { defaultValue: medium }
141
+
142
+ - slug: inspiration
143
+ displayName: Inspiration
144
+ icon: sparkles
145
+ color: amber
146
+ description: A brand, founder, product, or campaign worth learning from.
147
+ properties:
148
+ - slug: kind
149
+ label: Kind
150
+ valueType: string
151
+ inputType: select
152
+ enumValues: [brand, founder, product, campaign]
153
+ - slug: why
154
+ label: Why
155
+ valueType: string
156
+ inputType: textarea
157
+ - slug: url
158
+ label: URL
159
+ valueType: string
160
+ inputType: url
161
+
162
+ # ── Market event (NEW) ──────────────────────────────────────────────────────
163
+ - slug: ecosystem-event
164
+ displayName: Ecosystem Event
165
+ icon: zap
166
+ color: orange
167
+ description: A notable market event — a raise, partnership, launch, acquisition, or listing.
168
+ properties:
169
+ - slug: event-type
170
+ label: Type
171
+ valueType: string
172
+ inputType: select
173
+ enumValues: [raise, partnership, launch, acquisition, listing, conference, other]
174
+ - slug: event-date
175
+ label: Date
176
+ valueType: date
177
+ inputType: date
178
+ - slug: event-actor
179
+ label: Actor
180
+ valueType: entity_id
181
+ targetProfileSlug: company
182
+ inputType: entity_select
183
+ - slug: event-summary
184
+ label: Summary
185
+ valueType: string
186
+ inputType: textarea
187
+ - slug: event-url
188
+ label: URL
189
+ valueType: string
190
+ inputType: url
191
+ - slug: event-impact
192
+ label: Impact
193
+ valueType: string
194
+ inputType: select
195
+ enumValues: [low, medium, high]
196
+
197
+ # ── Actor roles (facets — the generic hats an actor plays) ──────────────────
198
+ # Competitor: carried verbatim from Radar.
199
+ - slug: competitor
200
+ displayName: Competitor
201
+ icon: crosshair
202
+ color: red
203
+ description: A rival or alternative a buyer would compare you to.
204
+ # Shared like the other actor roles (partner/client/sponsor): defined once,
205
+ # pod-wide, so any workspace that needs the hat reuses THIS row + a grant
206
+ # rather than forking a workspace-scoped twin.
207
+ scope: shared
208
+ profileKind: role
209
+ applicableKinds:
210
+ - company
211
+ properties:
212
+ - slug: positioning
213
+ label: Positioning
214
+ valueType: string
215
+ inputType: textarea
216
+ - slug: strengths
217
+ label: Strengths
218
+ valueType: string
219
+ inputType: textarea
220
+ - slug: weaknesses
221
+ label: Weaknesses
222
+ valueType: string
223
+ inputType: textarea
224
+ - slug: pricing
225
+ label: Pricing
226
+ valueType: string
227
+ inputType: text
228
+ - slug: url
229
+ label: URL
230
+ valueType: string
231
+ inputType: url
232
+ - slug: status
233
+ label: Status
234
+ valueType: string
235
+ inputType: select
236
+ enumValues: [watching, active-threat, adjacent, archived]
237
+ constraints: { defaultValue: watching }
238
+
239
+ # Partner (shared ecosystem role — SSOT is foundation.yaml) ─────────────────
240
+ # `scope: shared` dedups to the ONE pod-wide `partner` profile seeded by
241
+ # foundation; provisioning grants THIS workspace access to it (SHARED profiles
242
+ # are grant-gated, so the reference is required). Shapes match foundation
243
+ # verbatim, so no property drift.
244
+ - slug: partner
245
+ displayName: Partner
246
+ icon: handshake
247
+ color: teal
248
+ description: A partner relationship — both a referral source and a co-delivery collaborator, distinguished by partner type.
249
+ scope: shared
250
+ profileKind: role
251
+ applicableKinds:
252
+ - company
253
+ - person
254
+ properties:
255
+ - slug: partnerStatus
256
+ label: Status
257
+ valueType: string
258
+ inputType: select
259
+ enumValues:
260
+ - prospect
261
+ - active
262
+ - paused
263
+ - churned
264
+ - slug: partnerType
265
+ label: Partner Type
266
+ valueType: string
267
+ inputType: select
268
+ enumValues:
269
+ - referral
270
+ - co-delivery
271
+ - both
272
+ - slug: accountManager
273
+ label: Account Manager
274
+ valueType: string
275
+ inputType: text
276
+ - slug: engagementStartDate
277
+ label: Engagement Start
278
+ valueType: date
279
+ inputType: date
280
+ - slug: satisfactionScore
281
+ label: Satisfaction
282
+ valueType: number
283
+ inputType: number
284
+ - slug: lifetimeValue
285
+ label: Lifetime Value
286
+ valueType: number
287
+ inputType: number
288
+ - slug: notes
289
+ label: Notes
290
+ valueType: string
291
+ inputType: textarea
292
+ - slug: contractValue
293
+ label: Contract Value
294
+ valueType: number
295
+ inputType: number
296
+ - slug: renewalDate
297
+ label: Renewal Date
298
+ valueType: date
299
+ inputType: date
300
+ - slug: healthScore
301
+ label: Health
302
+ valueType: string
303
+ inputType: select
304
+ enumValues:
305
+ - healthy
306
+ - at_risk
307
+ - critical
308
+
309
+ views:
310
+ - name: Ecosystem Map
311
+ slug: ecosystem-map
312
+ type: graph
313
+ scopeProfileSlugs: [company, market-segment, trend, ecosystem-event]
314
+ description: The market landscape as a connected map — actors, segments, trends, and events, with the edges between them.
315
+ defaultView: true
316
+ - name: Segments
317
+ slug: segments
318
+ type: table
319
+ scopeProfileSlug: market-segment
320
+ description: Market slices with rough size, ocean, and maturity.
321
+ config:
322
+ columns: [title, ocean, tam, maturity]
323
+ - name: Trends
324
+ slug: trends
325
+ type: table
326
+ scopeProfileSlug: trend
327
+ description: Directional shifts to track, by relevance.
328
+ config:
329
+ columns: [title, direction, relevance, description]
330
+ - name: Events
331
+ slug: events
332
+ type: table
333
+ scopeProfileSlug: ecosystem-event
334
+ description: Notable market events — raises, partnerships, launches, and more.
335
+ config:
336
+ columns: [title, event-type, event-date, event-impact]
337
+
338
+ # Schema-level relations — the market GRAPH. This is the net-new value: actor↔actor
339
+ # edges are first-class (source and target can both be `company`), so the Ecosystem
340
+ # Map and relation picker carry domain-specific links from day one.
341
+ entityLinks:
342
+ - sourceProfileSlug: company
343
+ targetProfileSlug: company
344
+ type: partners_with
345
+ label: Partners with
346
+ - sourceProfileSlug: company
347
+ targetProfileSlug: company
348
+ type: competes_with
349
+ label: Competes with
350
+ - sourceProfileSlug: company
351
+ targetProfileSlug: company
352
+ type: invested_in
353
+ label: Invested in
354
+ - sourceProfileSlug: company
355
+ targetProfileSlug: company
356
+ type: integrates_with
357
+ label: Integrates with
358
+ - sourceProfileSlug: competitor
359
+ targetProfileSlug: market-segment
360
+ type: competes_in
361
+ label: Competes in
362
+ - sourceProfileSlug: trend
363
+ targetProfileSlug: market-segment
364
+ type: shapes
365
+ label: Shapes
366
+ - sourceProfileSlug: ecosystem-event
367
+ targetProfileSlug: company
368
+ type: involves
369
+ label: Involves
370
+
371
+ onboarding:
372
+ goal: >
373
+ Map the real ecosystem — the key players (companies and people), who partners
374
+ and competes with whom, and the segments and trends that matter — so strategy
375
+ is grounded in the actual market, not a vague "the market".
376
+ framing: |
377
+ THE ECOSYSTEM LEAD: Act as a sharp ecosystem lead who maps the market
378
+ landscape AND the relationships inside it. Push for REAL named players — not
379
+ "the incumbents", but the actual companies — and for the concrete edges
380
+ between them: who partners with whom, who competes, who invested in whom.
381
+ A map with no edges is just a list; the value is in the relationships.
382
+ expertise:
383
+ starters:
384
+ - >
385
+ Name the actors, then draw the edges. A list of logos tells strategy
386
+ nothing; the market is a GRAPH. For every company you log, propose at least
387
+ one real relationship — partners_with, competes_with, invested_in,
388
+ integrates_with — because the edges are where the leverage and the threats
389
+ live.
390
+ - >
391
+ Map the CATEGORY, not just named rivals. Buyers compare across tiers:
392
+ direct competitors, adjacent tools that solve the same job differently, and
393
+ the status quo ("a spreadsheet", "do nothing"). Attach the competitor role
394
+ to real companies and place each one in the segment it competes in.
395
+ - >
396
+ Separate players from structure. Companies and people are the ACTORS;
397
+ segments and trends are the STRUCTURE they move within. Anchor each trend to
398
+ a direction and a "so what for us", and each segment to a rough size and
399
+ ocean — an untimed "AI is big" tells strategy nothing.
400
+ blindSpots:
401
+ - >
402
+ "We have no competitors" is a red flag, not a moat — it usually means the
403
+ category is undefined or the buyer's real alternative (a manual workaround)
404
+ hasn't been named. Push to name what a buyer does TODAY instead of buying.
405
+ - >
406
+ Founders over-watch the loud incumbent and miss the fast-moving insurgent
407
+ one tier down, and they log companies with no relationships at all. Surface
408
+ the insurgents, and force at least one real edge per key player.
409
+ - >
410
+ A trend or event with no stance is just a headline. Every trend needs a
411
+ direction (rising/steady/fading) and a "so what"; every logged event needs
412
+ an actor and an impact. Force the meaning, not just the mention.
413
+ bar: >
414
+ The map reads like a real ecosystem: named companies placed in their segments,
415
+ real edges between them (who partners, competes, invested), and each trend
416
+ carrying a direction and a "so what" — so a strategist can see the alliances,
417
+ the threats, and the open lane, not just a pile of logos.
418
+ collect:
419
+ - profileSlug: company
420
+ what: The real companies in your ecosystem — the players you operate around.
421
+ cardinality: several
422
+ keyFields: [industry, website]
423
+ - profileSlug: market-segment
424
+ what: The market slices you play in, with rough size and ocean.
425
+ cardinality: few
426
+ keyFields: [ocean, tam]
427
+ - profileSlug: trend
428
+ what: Directional shifts in tech, market, or behavior that affect you.
429
+ cardinality: few
430
+ keyFields: [direction, relevance]
431
+ openingQuestions:
432
+ - "Who are the key players in your space — the 3-5 companies that matter most?"
433
+ - "How do they relate — who partners with, competes with, or invested in whom?"
434
+ - "Which market segment matters most right now, and what trend is reshaping it?"
435
+ doneWhen: A few companies captured, with at least one relationship edge between them, plus one market segment.
436
+
437
+ app:
438
+ kind: stored
439
+ cellKey: entity-detail
440
+
441
+ layout:
442
+ defaultView: Ecosystem Map
443
+ defaultApp: null
444
+ pinnedApps: [dashboard, data]
445
+ sidebarItems:
446
+ - kind: view
447
+ viewName: Ecosystem Map
448
+ label: Ecosystem Map
449
+ icon: radar
450
+ - kind: view
451
+ viewName: Segments
452
+ label: Segments
453
+ icon: pie-chart
454
+ - kind: view
455
+ viewName: Trends
456
+ label: Trends
457
+ icon: trending-up
458
+ - kind: view
459
+ viewName: Events
460
+ label: Events
461
+ icon: zap
462
+ - kind: app
463
+ appId: data
464
+ label: Data
465
+ icon: database
466
+
467
+ bento:
468
+ viewName: Ecosystem Map
469
+ blocks:
470
+ - kind: view
471
+ viewName: Ecosystem Map
472
+ pos: { x: 0, y: 0, w: 8, h: 6 }
473
+ - kind: view
474
+ viewName: Segments
475
+ pos: { x: 8, y: 0, w: 4, h: 3 }
476
+ - kind: view
477
+ viewName: Trends
478
+ pos: { x: 8, y: 3, w: 4, h: 3 }
@@ -0,0 +1,183 @@
1
+ # Enterprise OS — the public operating system suite
2
+ # ==================================================
3
+ # A SUITE template: it stands up a whole company's public operating core in one
4
+ # install by REQUIRING its constituent workspaces (deps-first), then adds a thin
5
+ # "command tower" home of its own — a place to track the company's objectives
6
+ # across the lenses it just installed.
7
+ #
8
+ # What it composes (all public, all bundled):
9
+ # • foundation — strategic DNA (mission, audience, positioning, principles)
10
+ # • ecosystem — the market graph (partners, competitors, segments, trends)
11
+ # • operations — how the company runs (the operational lens)
12
+ # • crm — the pipeline (contacts, leads, clients, deals)
13
+ #
14
+ # It uses `require` (not `compose`): each constituent is a REAL workspace, not an
15
+ # overlay. Deps-first resolution installs foundation first (the SSOT role
16
+ # vocabulary provider), so every downstream lens reuses foundation's pod-wide
17
+ # roles rather than forking twins. Installing Enterprise OS a second time is
18
+ # idempotent — the resolver reuses existing constituent workspaces by slug.
19
+
20
+ meta:
21
+ slug: enterprise-os
22
+ name: Enterprise OS
23
+ description: Stand up a company's public operating core in one install — strategy, market, operations, and pipeline — plus a command tower to track objectives across them.
24
+ icon: layout-dashboard
25
+ color: "#4F46E5"
26
+ tags: [suite, enterprise, os, foundation, crm, operations, ecosystem]
27
+ isPublic: true
28
+
29
+ # Deps-first: foundation is the pod-wide role-vocabulary provider, so it must
30
+ # resolve before ecosystem/operations/crm reuse its shared roles. `require` (not
31
+ # `compose`): each is a standalone workspace, not an additive overlay.
32
+ dependencies:
33
+ - slug: foundation
34
+ kind: workspace
35
+ relation: require
36
+ reason: "Strategic DNA + the pod-wide role vocabulary (partner/client/lead) every other lens reuses. Must resolve first."
37
+ - slug: ecosystem
38
+ kind: workspace
39
+ relation: require
40
+ reason: "The market graph — the players, segments, and trends the company operates around."
41
+ - slug: operations
42
+ kind: workspace
43
+ relation: require
44
+ reason: "How the company runs — the operational lens."
45
+ - slug: crm
46
+ kind: workspace
47
+ relation: require
48
+ reason: "The pipeline — contacts, leads, clients, and deals."
49
+
50
+ workspace:
51
+ name: Enterprise OS
52
+ description: The command tower for the company operating system — track strategic objectives across the strategy, market, operations, and pipeline lenses this suite installs.
53
+ subtype: enterprise-os
54
+ visibility: pod_visible
55
+ sourceRoles:
56
+ strategy: consumer
57
+
58
+ profiles:
59
+ # The one native profile the command tower owns: a strategic objective the
60
+ # company is driving across the lenses this suite installs. Deliberately light
61
+ # — the depth lives in the constituent workspaces; this is the cross-cutting
62
+ # scoreboard that ties them together.
63
+ - slug: objective
64
+ displayName: Objective
65
+ icon: target
66
+ color: "#4F46E5"
67
+ description: A company objective the operating system is driving toward — the cross-cutting outcome the lenses serve.
68
+ properties:
69
+ - slug: outcome
70
+ label: Outcome
71
+ valueType: string
72
+ inputType: textarea
73
+ - slug: status
74
+ label: Status
75
+ valueType: string
76
+ inputType: select
77
+ enumValues: [on-track, at-risk, off-track, achieved]
78
+ constraints: { defaultValue: on-track }
79
+ - slug: horizon
80
+ label: Horizon
81
+ valueType: string
82
+ inputType: select
83
+ enumValues: [now, next, later]
84
+ constraints: { defaultValue: now }
85
+ - slug: owner
86
+ label: Owner
87
+ valueType: string
88
+ inputType: text
89
+ - slug: targetDate
90
+ label: Target Date
91
+ valueType: date
92
+ inputType: date
93
+
94
+ views:
95
+ - name: Objectives
96
+ slug: objectives
97
+ type: table
98
+ scopeProfileSlug: objective
99
+ description: The company's strategic objectives across every lens, by horizon and status.
100
+ defaultView: true
101
+ config:
102
+ columns: [title, status, horizon, owner, targetDate]
103
+ - name: Objective Board
104
+ slug: objective-board
105
+ type: kanban
106
+ scopeProfileSlug: objective
107
+ description: Objectives grouped by status — a running scoreboard for the operating system.
108
+ config:
109
+ groupBy: status
110
+
111
+ onboarding:
112
+ goal: >
113
+ Stand up the company's operating core and name the handful of strategic
114
+ objectives it is driving — so strategy, market, operations, and pipeline are
115
+ all in place and pointed at the same outcomes from day one.
116
+ framing: |
117
+ THE CHIEF OF STAFF: Act as a sharp chief of staff standing up the company OS.
118
+ The four lenses (foundation, ecosystem, operations, CRM) are already
119
+ installed — your job is to name the 3-5 objectives that cut across them, so
120
+ the operating system has a scoreboard, not just structure.
121
+ expertise:
122
+ starters:
123
+ - >
124
+ Name few, real objectives. An operating system with 20 objectives has
125
+ none; force the 3-5 that actually decide the year, each with an owner and
126
+ a horizon (now / next / later).
127
+ - >
128
+ Tie each objective to a lens. A good objective names where it lives —
129
+ pipeline growth (CRM), a market move (ecosystem), an operational fix
130
+ (operations), or a positioning shift (foundation) — so the scoreboard
131
+ maps to the structure underneath it.
132
+ blindSpots:
133
+ - >
134
+ Objectives with no owner and no date are wishes. Every one needs a single
135
+ owner and a target date, or it will not move.
136
+ - >
137
+ "Grow the business" is not an objective — it is a category. Push for the
138
+ specific outcome that would make this quarter a win.
139
+ bar: >
140
+ A short, honest scoreboard: 3-5 objectives, each owned, dated, placed on a
141
+ horizon, and tied to the lens that serves it — sitting on top of a fully
142
+ installed operating core.
143
+ collect:
144
+ - profileSlug: objective
145
+ what: The 3-5 strategic objectives the company is driving this horizon.
146
+ cardinality: few
147
+ keyFields: [status, horizon, owner]
148
+ openingQuestions:
149
+ - "What are the 3-5 objectives that will decide this year for the company?"
150
+ - "Who owns each one, and is it a now, next, or later horizon?"
151
+ doneWhen: A few objectives captured, each with an owner and a horizon.
152
+
153
+ app:
154
+ kind: stored
155
+ cellKey: entity-detail
156
+
157
+ layout:
158
+ defaultView: Objectives
159
+ defaultApp: null
160
+ pinnedApps: [dashboard, data]
161
+ sidebarItems:
162
+ - kind: view
163
+ viewName: Objectives
164
+ label: Objectives
165
+ icon: target
166
+ - kind: view
167
+ viewName: Objective Board
168
+ label: Board
169
+ icon: kanban-square
170
+ - kind: app
171
+ appId: data
172
+ label: Data
173
+ icon: database
174
+
175
+ bento:
176
+ viewName: Objectives
177
+ blocks:
178
+ - kind: view
179
+ viewName: Objectives
180
+ pos: { x: 0, y: 0, w: 8, h: 4 }
181
+ - kind: view
182
+ viewName: Objective Board
183
+ pos: { x: 8, y: 0, w: 4, h: 4 }