@synap-core/workspace-templates 0.2.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,343 @@
1
+ # Foundation workspace template
2
+ # A company's STRATEGIC DNA — the outside-in layer every other workspace
3
+ # inherits. The conceptual replacement for the old single `north_star` entity:
4
+ # a north star is not one entity, it's this whole pack (mission, audience,
5
+ # positioning, principles). Pod-visible provider of the `strategy` domain.
6
+
7
+ meta:
8
+ slug: foundation
9
+ name: Foundation
10
+ description: The strategic DNA — mission, audience, positioning, and principles — that every workspace inherits.
11
+ icon: compass
12
+ color: "#4F46E5"
13
+ tags: [strategy, mission, positioning, audience]
14
+ isPublic: true
15
+
16
+ workspace:
17
+ name: Foundation
18
+ description: The company's strategic DNA — mission, vision, audiences, pains, positioning, and operating principles that downstream workspaces inherit.
19
+ proposalId: foundation-v1
20
+ subtype: foundation
21
+ visibility: pod_visible
22
+ capabilities:
23
+ - strategy.foundation
24
+ - strategy.context
25
+ sourceRoles:
26
+ strategy: provider
27
+
28
+ profiles:
29
+ - slug: mission
30
+ displayName: Mission
31
+ icon: target
32
+ color: indigo
33
+ description: "What we serve, what we change, and why now."
34
+ properties:
35
+ - slug: statement
36
+ label: Mission statement
37
+ valueType: string
38
+ inputType: textarea
39
+ constraints: { required: true }
40
+ - slug: time-horizon
41
+ label: Time horizon
42
+ valueType: string
43
+ inputType: text
44
+ placeholder: e.g. 3 years
45
+ - slug: status
46
+ label: Status
47
+ valueType: string
48
+ inputType: select
49
+ enumValues: [draft, active, archived]
50
+ constraints: { defaultValue: active }
51
+
52
+ - slug: vision
53
+ displayName: Vision
54
+ icon: telescope
55
+ color: violet
56
+ description: "The world as it looks when we win."
57
+ properties:
58
+ - slug: statement
59
+ label: Vision statement
60
+ valueType: string
61
+ inputType: textarea
62
+ - slug: status
63
+ label: Status
64
+ valueType: string
65
+ inputType: select
66
+ enumValues: [draft, active, archived]
67
+ constraints: { defaultValue: active }
68
+
69
+ - slug: value
70
+ displayName: Value
71
+ icon: heart-handshake
72
+ color: rose
73
+ description: "A core operating value — how we behave when it's hard."
74
+ properties:
75
+ - slug: principle
76
+ label: Principle
77
+ valueType: string
78
+ inputType: textarea
79
+ - slug: do
80
+ label: We do
81
+ valueType: string
82
+ inputType: textarea
83
+ - slug: dont
84
+ label: We don't
85
+ valueType: string
86
+ inputType: textarea
87
+
88
+ - slug: audience
89
+ displayName: Audience
90
+ icon: users
91
+ color: blue
92
+ description: "An ideal customer profile — who we are built for."
93
+ properties:
94
+ - slug: segment
95
+ label: Segment
96
+ valueType: string
97
+ inputType: text
98
+ - slug: persona
99
+ label: Persona
100
+ valueType: string
101
+ inputType: textarea
102
+ - slug: jobs-to-be-done
103
+ label: Jobs to be done
104
+ valueType: string
105
+ inputType: textarea
106
+ - slug: traits
107
+ label: Traits
108
+ valueType: array
109
+ inputType: text
110
+
111
+ - slug: pain-point
112
+ displayName: Pain Point
113
+ icon: flame
114
+ color: orange
115
+ description: "A specific pain a target audience feels today."
116
+ properties:
117
+ - slug: description
118
+ label: Description
119
+ valueType: string
120
+ inputType: textarea
121
+ - slug: severity
122
+ label: Severity
123
+ valueType: string
124
+ inputType: select
125
+ enumValues: [low, medium, high, critical]
126
+ constraints: { defaultValue: medium }
127
+ - slug: target-audience
128
+ label: Audience
129
+ valueType: entity_id
130
+ targetProfileSlug: audience
131
+ inputType: entity_select
132
+ - slug: evidence
133
+ label: Evidence
134
+ valueType: string
135
+ inputType: textarea
136
+
137
+ - slug: positioning
138
+ displayName: Positioning
139
+ icon: crosshair
140
+ color: cyan
141
+ description: "Market category, who we stand against, and why we win."
142
+ properties:
143
+ - slug: category
144
+ label: Category
145
+ valueType: string
146
+ inputType: text
147
+ - slug: against
148
+ label: Against
149
+ valueType: string
150
+ inputType: textarea
151
+ - slug: because
152
+ label: Because
153
+ valueType: string
154
+ inputType: textarea
155
+
156
+ - slug: narrative
157
+ displayName: Narrative
158
+ icon: book-open
159
+ color: amber
160
+ description: "The origin -> insight -> mission story arc."
161
+ properties:
162
+ - slug: arc
163
+ label: Story arc
164
+ valueType: string
165
+ inputType: textarea
166
+ - slug: status
167
+ label: Status
168
+ valueType: string
169
+ inputType: select
170
+ enumValues: [draft, active, archived]
171
+ constraints: { defaultValue: active }
172
+
173
+ - slug: differentiator
174
+ displayName: Differentiator
175
+ icon: sparkles
176
+ color: green
177
+ description: "One thing only we do, believe, or refuse."
178
+ properties:
179
+ - slug: statement
180
+ label: Statement
181
+ valueType: string
182
+ inputType: textarea
183
+ - slug: proof
184
+ label: Proof
185
+ valueType: string
186
+ inputType: textarea
187
+
188
+ - slug: non-goal
189
+ displayName: Non-Goal
190
+ icon: ban
191
+ color: red
192
+ description: "Things we will deliberately NOT do."
193
+ properties:
194
+ - slug: statement
195
+ label: Statement
196
+ valueType: string
197
+ inputType: textarea
198
+ - slug: reason
199
+ label: Reason
200
+ valueType: string
201
+ inputType: textarea
202
+
203
+ views:
204
+ - name: Mission & Vision
205
+ slug: mission-vision
206
+ type: table
207
+ scopeProfileSlugs: [mission, vision]
208
+ description: The mission and vision that anchor everything downstream.
209
+ defaultView: true
210
+ - name: Audiences
211
+ slug: audiences
212
+ type: table
213
+ scopeProfileSlug: audience
214
+ description: Ideal customer profiles and the jobs they hire us for.
215
+ - name: Pain Points
216
+ slug: pain-points
217
+ type: kanban
218
+ scopeProfileSlug: pain-point
219
+ groupBy: severity
220
+ config:
221
+ groupBy: severity
222
+ cardFields: [description, audience, evidence]
223
+ description: Pains grouped by severity.
224
+ - name: Positioning & Differentiators
225
+ slug: positioning-differentiators
226
+ type: table
227
+ scopeProfileSlug: differentiator
228
+ description: What only we do, and why it matters.
229
+ - name: Strategy Map
230
+ slug: strategy-map
231
+ type: graph
232
+ description: The strategic DNA as a connected graph.
233
+
234
+ # Schema-level relations — give the Strategy Map and the relation picker
235
+ # domain-specific links from day one (not just pod defaults).
236
+ entityLinks:
237
+ - sourceProfileSlug: pain-point
238
+ targetProfileSlug: audience
239
+ type: affects
240
+ label: Affects
241
+ - sourceProfileSlug: positioning
242
+ targetProfileSlug: audience
243
+ type: targets
244
+ label: Targets
245
+ - sourceProfileSlug: differentiator
246
+ targetProfileSlug: positioning
247
+ type: supports
248
+ label: Supports
249
+
250
+ onboarding:
251
+ goal: Capture the strategic DNA so every downstream workspace inherits a real company, not a generic template.
252
+ framing: >
253
+ THE COFOUNDER: Act as a sharp, skeptical co-founder. Pressure-test why-now, why-you, and
254
+ why-this. Refuse fuzzy answers; push for specifics and evidence. Be
255
+ respectful but direct — a vague mission helps no one.
256
+ collect:
257
+ - profileSlug: mission
258
+ what: The one mission that anchors the company — what we serve, what we change, why now.
259
+ cardinality: one
260
+ keyFields: [statement, time-horizon]
261
+ - profileSlug: audience
262
+ what: The ideal customer profiles the company is built for.
263
+ cardinality: few
264
+ keyFields: [segment, jobs-to-be-done]
265
+ - profileSlug: pain-point
266
+ what: Specific, evidenced pains those audiences feel today.
267
+ cardinality: several
268
+ keyFields: [description, severity]
269
+ - profileSlug: positioning
270
+ what: The market category, who we stand against, and why we win.
271
+ cardinality: one
272
+ keyFields: [category, against, because]
273
+ - profileSlug: differentiator
274
+ what: The few things only we do, believe, or refuse.
275
+ cardinality: few
276
+ keyFields: [statement, proof]
277
+ - profileSlug: non-goal
278
+ what: The things we will deliberately NOT do.
279
+ cardinality: few
280
+ keyFields: [statement, reason]
281
+ openingQuestions:
282
+ - "In one sentence — who do you serve and what do you change for them?"
283
+ - "Why now? What shifted in the world that makes this the moment?"
284
+ - "Who is this absolutely NOT for?"
285
+ doneWhen: mission + at least one audience + positioning captured.
286
+
287
+ app:
288
+ kind: stored
289
+ cellKey: entity-detail
290
+
291
+ layout:
292
+ defaultView: Mission & Vision
293
+ defaultApp: null
294
+ pinnedApps: [dashboard, data, intelligence]
295
+ sidebarItems:
296
+ - kind: view
297
+ viewName: Mission & Vision
298
+ label: Mission & Vision
299
+ icon: compass
300
+ - kind: view
301
+ viewName: Audiences
302
+ label: Audiences
303
+ icon: users
304
+ - kind: view
305
+ viewName: Pain Points
306
+ label: Pain Points
307
+ icon: flame
308
+ - kind: view
309
+ viewName: Positioning & Differentiators
310
+ label: Positioning
311
+ icon: crosshair
312
+ - kind: view
313
+ viewName: Strategy Map
314
+ label: Strategy Map
315
+ icon: share-2
316
+ - kind: app
317
+ appId: data
318
+ label: All Data
319
+ icon: database
320
+
321
+ bento:
322
+ viewName: Foundation Command Center
323
+ blocks:
324
+ - kind: view
325
+ viewName: Mission & Vision
326
+ pos: { x: 0, y: 0, w: 8, h: 4 }
327
+ - kind: view
328
+ viewName: Positioning & Differentiators
329
+ pos: { x: 8, y: 0, w: 4, h: 4 }
330
+ - kind: view
331
+ viewName: Audiences
332
+ pos: { x: 0, y: 4, w: 6, h: 4 }
333
+ - kind: view
334
+ viewName: Pain Points
335
+ pos: { x: 6, y: 4, w: 6, h: 4 }
336
+
337
+ seedEntities:
338
+ - profileSlug: mission
339
+ title: Example Mission
340
+ properties:
341
+ statement: "Example — replace this: we help [audience] [change] so they can [outcome], starting now because [why now]."
342
+ time-horizon: 3 years
343
+ status: active
package/src/index.ts ADDED
@@ -0,0 +1,62 @@
1
+ /**
2
+ * @synap-core/workspace-templates
3
+ *
4
+ * Canonical workspace template definitions.
5
+ * ==========================================
6
+ *
7
+ * Usage (browser / backend / CLI):
8
+ *
9
+ * import { getWorkspaceTemplate, listPublicTemplates } from '@synap-core/workspace-templates';
10
+ *
11
+ * const template = getWorkspaceTemplate('brand-library');
12
+ * // template.workspace.name === 'Brand Library'
13
+ * // template.app.kind === 'native'
14
+ * // template.layout.defaultApp === 'brandLibrary'
15
+ *
16
+ * YAML source files live in src/*.yaml — AI-friendly, commentable, mergeable.
17
+ * Run `pnpm build` to regenerate src/templates.ts from YAML.
18
+ */
19
+
20
+ export type {
21
+ WorkspaceYaml,
22
+ TemplateMeta,
23
+ TemplateAppRef,
24
+ TemplateAppKind,
25
+ TemplateProfile,
26
+ TemplateProperty,
27
+ TemplateView,
28
+ TemplateSidebarItem,
29
+ TemplateSidebarSurface,
30
+ TemplateLayoutConfig,
31
+ TemplateBentoBlock,
32
+ TemplateEntityLink,
33
+ TemplateSeedEntity,
34
+ TemplateSuggestedRelation,
35
+ TemplateDisplayTemplate,
36
+ TemplateIntegration,
37
+ TemplateAutomation,
38
+ TemplateExtendsRef,
39
+ TemplateProfileEntityBentoTemplates,
40
+ TemplateDefaultSource,
41
+ TemplateSourceRole,
42
+ TemplateOnboarding,
43
+ TemplateOnboardingCollectTarget,
44
+ TemplatePlaybook,
45
+ TemplatePlaybookParam,
46
+ } from './types.js';
47
+
48
+ export {
49
+ WORKSPACE_TEMPLATES,
50
+ getWorkspaceTemplate,
51
+ listWorkspaceTemplates,
52
+ listPublicTemplates,
53
+ } from './templates.js';
54
+
55
+ export type { WorkspaceTemplateSlug } from './templates.js';
56
+
57
+ export { toWorkspaceDefinition, toPackageDefinition } from './define.js';
58
+ export type {
59
+ WorkspaceDefinitionInput,
60
+ ToDefinitionResult,
61
+ PackageDefinitionOutput,
62
+ } from './define.js';