@synap-core/workspace-templates 0.12.0 → 0.24.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.
- package/README.md +509 -0
- package/automations/bookmark-enrichment.automation.json +321 -0
- package/automations/github-pr-events.automation.json +505 -0
- package/automations/mail-feed.automation.json +86 -0
- package/automations/ship-a-change-checks-green.automation.json +106 -0
- package/automations/ship-a-change-checks-red.automation.json +106 -0
- package/automations/ship-a-change-deployed.automation.json +56 -0
- package/automations/ship-a-change-pr-merged.automation.json +110 -0
- package/automations/ship-a-change-pr-opened.automation.json +104 -0
- package/automations/url-bookmark-capture.automation.json +132 -0
- package/capabilities/agency-skills.capability.json +157 -0
- package/capabilities/apify.capability.json +265 -0
- package/capabilities/apollo.capability.json +120 -0
- package/capabilities/arch-backend.capability.json +97 -0
- package/capabilities/arch-client-intelligence.capability.json +401 -0
- package/capabilities/backblaze-b2.capability.json +205 -0
- package/capabilities/cal-com.capability.json +266 -0
- package/capabilities/canva.capability.json +274 -0
- package/capabilities/claude-code-routines.capability.json +172 -0
- package/capabilities/claude-managed-agents.capability.json +215 -0
- package/capabilities/client-comms-report.capability.json +246 -0
- package/capabilities/content-idea-to-production.capability.json +29 -0
- package/capabilities/datagouv.capability.json +315 -0
- package/capabilities/discord-bot.capability.json +157 -0
- package/capabilities/dropbox.capability.json +281 -0
- package/capabilities/exa.capability.json +109 -0
- package/capabilities/fal-ai.capability.json +83 -0
- package/capabilities/fal-media-lab.capability.json +158 -0
- package/capabilities/fireflies.capability.json +191 -0
- package/capabilities/freellmapi.capability.json +114 -0
- package/capabilities/generic-apikey.capability.json +92 -0
- package/capabilities/github-merge.capability.json +99 -0
- package/capabilities/github-read.capability.json +325 -0
- package/capabilities/governance-tighten-recommender.capability.json +81 -0
- package/capabilities/jev.capability.json +226 -0
- package/capabilities/lead-conversion-enrollment.capability.json +246 -0
- package/capabilities/mail-feed.capability.json +277 -0
- package/capabilities/mailgun.capability.json +52 -0
- package/capabilities/nango-google.capability.json +639 -0
- package/capabilities/notion.capability.json +417 -0
- package/capabilities/omniroute.capability.json +137 -0
- package/capabilities/posthog-analytics.capability.json +258 -0
- package/capabilities/postiz.capability.json +467 -0
- package/capabilities/proactive-digest.capability.json +190 -0
- package/capabilities/proton.capability.json +288 -0
- package/capabilities/replicate-rvm.capability.json +97 -0
- package/capabilities/research-methods.capability.json +57 -0
- package/capabilities/shopify.capability.json +395 -0
- package/capabilities/slack.capability.json +369 -0
- package/capabilities/stripe.capability.json +1496 -0
- package/capabilities/telegram-bridge.capability.json +56 -0
- package/capabilities/treg.capability.json +102 -0
- package/capabilities/unipile-linkedin.capability.json +494 -0
- package/capabilities/vercel.capability.json +424 -0
- package/dist/define-DqoItRiR.d.ts +1370 -0
- package/dist/index.d.ts +174 -900
- package/dist/index.js +26447 -24075
- package/dist/index.js.map +1 -1
- package/dist/wire.d.ts +222 -0
- package/dist/wire.js +77 -0
- package/dist/wire.js.map +1 -0
- package/package.json +27 -4
- package/retired.yaml +136 -0
- package/skills/app-factory-build-slice/SKILL.md +70 -0
- package/skills/app-factory-build-slice.catalog.json +17 -0
- package/skills/app-factory-design-canvas/SKILL.md +96 -0
- package/skills/app-factory-design-canvas.catalog.json +17 -0
- package/skills/app-factory-design-review/SKILL.md +105 -0
- package/skills/app-factory-design-review.catalog.json +18 -0
- package/skills/app-factory-research/SKILL.md +123 -0
- package/skills/app-factory-research.catalog.json +17 -0
- package/skills/bookmark-enrichment/SKILL.md +40 -0
- package/skills/carousel-format/carousel-format.skill.json +18 -0
- package/skills/collage-broll/collage-broll.skill.json +20 -0
- package/skills/content-taste/content-taste.skill.json +18 -0
- package/skills/creative-director/creative-director.skill.json +18 -0
- package/skills/design-critique/SKILL.md +138 -0
- package/skills/design-critique.catalog.json +12 -0
- package/skills/designing-with-real-components/SKILL.md +140 -0
- package/skills/designing-with-real-components.catalog.json +12 -0
- package/skills/edit-loop/edit-loop.skill.json +25 -0
- package/skills/facecam-edit/facecam-edit.skill.json +24 -0
- package/skills/mapping-the-server/SKILL.md +54 -0
- package/skills/math-explainer-manimgx/math-explainer-manimgx.skill.json +20 -0
- package/skills/motion-quality-gates/motion-quality-gates.skill.json +20 -0
- package/skills/open-design-edit/open-design-edit.skill.json +24 -0
- package/skills/reading-client-progress/SKILL.md +65 -0
- package/skills/routing-to-channels/SKILL.md +54 -0
- package/skills/stellar-scf-grants-advisor/ASSOCIATE-CHEATSHEET.md +133 -0
- package/skills/stellar-scf-grants-advisor/ASSOCIATE-ONBOARDING-GUIDE.md +761 -0
- package/skills/stellar-scf-grants-advisor/CLIENT-FAQ.md +181 -0
- package/skills/stellar-scf-grants-advisor/PARTNER-HANDOVER.md +130 -0
- package/skills/stellar-scf-grants-advisor/SKILL.md +102 -0
- package/skills/stellar-scf-grants-advisor/examples/README.md +43 -0
- package/skills/stellar-scf-grants-advisor/examples/chat-summary-templates.md +158 -0
- package/skills/stellar-scf-grants-advisor/examples/corpus-comparable-rows.md +136 -0
- package/skills/stellar-scf-grants-advisor/examples/q10-team-rewrites.md +109 -0
- package/skills/stellar-scf-grants-advisor/examples/q2-description-rewrites.md +88 -0
- package/skills/stellar-scf-grants-advisor/examples/q6-integration-rewrites.md +107 -0
- package/skills/stellar-scf-grants-advisor/examples/tranche-structures.md +176 -0
- package/skills/stellar-scf-grants-advisor/reference/01-methodology.md +96 -0
- package/skills/stellar-scf-grants-advisor/reference/02-scoring-framework.md +199 -0
- package/skills/stellar-scf-grants-advisor/reference/03-rejection-patterns.md +241 -0
- package/skills/stellar-scf-grants-advisor/reference/04-winner-patterns.md +120 -0
- package/skills/stellar-scf-grants-advisor/reference/05-comeback-patterns.md +92 -0
- package/skills/stellar-scf-grants-advisor/reference/06-budget-benchmarks.md +125 -0
- package/skills/stellar-scf-grants-advisor/reference/07-integration-list.md +147 -0
- package/skills/stellar-scf-grants-advisor/reference/08-abstract-fields.md +258 -0
- package/skills/stellar-scf-grants-advisor/reference/09-build-fields.md +259 -0
- package/skills/stellar-scf-grants-advisor/reference/10-corpus-winners.md +135 -0
- package/skills/stellar-scf-grants-advisor/reference/11-corpus-rejects.md +267 -0
- package/skills/stellar-scf-grants-advisor/reference/12-client-communication.md +131 -0
- package/skills/stellar-scf-grants-advisor/reference/13-excel-output-spec.md +199 -0
- package/skills/stellar-scf-grants-advisor/reference/14-worked-examples.md +160 -0
- package/skills/stellar-scf-grants-advisor/templates/abstract-review-builder.py +253 -0
- package/skills/stellar-scf-grants-advisor/templates/build-review-builder.py +213 -0
- package/skills/video-direction/video-direction.skill.json +20 -0
- package/skills/video-style-vocabulary/video-style-vocabulary.skill.json +20 -0
- package/skills/video-toolbox/video-toolbox.skill.json +20 -0
- package/src/__fixtures__/lifecycle-presets.flat-before.json +205 -0
- package/src/agency-os.yaml +122 -0
- package/src/agent-os-skill-slugs.test.ts +65 -0
- package/src/apify-social-reader.test.ts +317 -0
- package/src/base.yaml +85 -39
- package/src/blockchain-ecosystem.yaml +1 -0
- package/src/brand-library.yaml +525 -14
- package/src/builder-dev-fold.template.test.ts +113 -0
- package/src/builder.yaml +779 -91
- package/src/business-model-catalog-description.test.ts +47 -0
- package/src/business-model-grp.template.test.ts +214 -0
- package/src/business-model.yaml +296 -49
- package/src/catalog-safety.test.ts +198 -0
- package/src/catalog.template-items.test.ts +75 -0
- package/src/catalog.ts +66 -2
- package/src/concept-guard.test.ts +28 -8
- package/src/concept-guard.ts +2 -2
- package/src/content-creation.template.test.ts +52 -0
- package/src/content-creation.yaml +192 -0
- package/src/content-os.edit-loop.template.test.ts +210 -0
- package/src/content-os.publish-due-posts.template.test.ts +261 -0
- package/src/content-os.template.test.ts +349 -0
- package/src/content-os.video-takes.template.test.ts +338 -0
- package/src/content-os.work-a-take.template.test.ts +125 -0
- package/src/content-os.yaml +1873 -39
- package/src/content-studio-retired.template.test.ts +82 -0
- package/src/corpus-flow-validity.test.ts +4 -5
- package/src/crm-absorbs-outreach.template.test.ts +117 -0
- package/src/crm-build-plan.template.test.ts +128 -0
- package/src/crm-lists.template.test.ts +96 -0
- package/src/crm-messages-cadence.template.test.ts +246 -0
- package/src/crm-one-send-door.template.test.ts +65 -0
- package/src/crm.yaml +1563 -181
- package/src/decisions-wave.template.test.ts +186 -0
- package/src/define.ts +146 -17
- package/src/design-to-implementation.template.test.ts +94 -0
- package/src/domain-template-type.test.ts +75 -0
- package/src/ecosystem.yaml +27 -66
- package/src/enterprise-os.yaml +10 -134
- package/src/facecam-edit.audio-studio.test.ts +188 -0
- package/src/fal-generate-image.test.ts +200 -0
- package/src/fal-media-lab-pod-files.test.ts +180 -0
- package/src/finance.yaml +254 -1
- package/src/foundation.yaml +78 -38
- package/src/frame-host-modules.d.mts +6 -0
- package/src/frame-host-modules.mjs +58 -0
- package/src/generate.mjs +9 -3
- package/src/github-merge.test.ts +210 -0
- package/src/grants.yaml +46 -17
- package/src/hr.yaml +39 -6
- package/src/index.ts +36 -1
- package/src/intent.test.ts +161 -0
- package/src/internal-runbook.yaml +19 -1
- package/src/jev.test.ts +356 -0
- package/src/legal.yaml +33 -1
- package/src/life-os.yaml +51 -240
- package/src/lifecycle-coverage.test.ts +124 -0
- package/src/lifecycle-declarations.test.ts +252 -0
- package/src/lifecycle-presets.test.ts +468 -0
- package/src/lifecycle-presets.ts +494 -0
- package/src/lifecycle-stuck.test.ts +46 -0
- package/src/lifecycle-waits.parity.test.ts +319 -0
- package/src/marketing.yaml +108 -4
- package/src/meetings-knowledge.yaml +18 -0
- package/src/networking.yaml +23 -2
- package/src/operations.yaml +304 -4
- package/src/pipeline-views.template.test.ts +88 -0
- package/src/playbook-goal-placeholders.test.ts +57 -0
- package/src/postiz-contract.test.ts +134 -0
- package/src/presentation-declarations.test.ts +174 -0
- package/src/process-contract.validate.test.ts +352 -0
- package/src/project-management.yaml +39 -740
- package/src/publish-body.d.mts +29 -0
- package/src/publish-body.mjs +74 -0
- package/src/publish-body.test.ts +74 -0
- package/src/publish-official-lib.test.ts +176 -0
- package/src/replicate-rvm.test.ts +504 -0
- package/src/research-base.yaml +119 -20
- package/src/research-decision.yaml +60 -3
- package/src/reserved-profile-slugs.test.ts +81 -0
- package/src/retired-goal-kinds.test.ts +52 -0
- package/src/role-reference-and-step-domain.test.ts +192 -0
- package/src/seed-obligation.test.ts +1 -6
- package/src/send-message-maps.test.ts +227 -0
- package/src/shared-role-ssot.test.ts +40 -2
- package/src/ship-a-change.template.test.ts +177 -0
- package/src/skills.test.ts +170 -0
- package/src/social.yaml +85 -27
- package/src/space-packages.freshness.test.ts +97 -0
- package/src/space-packages.generated.ts +40 -0
- package/src/space-packages.test.ts +125 -0
- package/src/space-packages.ts +73 -0
- package/src/start.test.ts +188 -0
- package/src/stripe-capability.test.ts +192 -0
- package/src/task-intents.test.ts +293 -0
- package/src/template-documents.test.ts +158 -0
- package/src/templates.ts +20907 -21464
- package/src/types.ts +475 -61
- package/src/unipile-linkedin-find-profile.test.ts +183 -0
- package/src/unipile-publish-post.test.ts +162 -0
- package/src/validate-flow.drift.test.ts +2 -3
- package/src/validate-flow.ts +22 -2
- package/src/validate-onboarding.test.ts +59 -0
- package/src/validate.test.ts +71 -4
- package/src/validate.ts +1416 -7
- package/src/wire-core.ts +231 -0
- package/src/wire.test.ts +159 -0
- package/src/wire.ts +107 -0
- package/views/bookmark-views-pack.view.json +39 -0
- package/views/event-views-pack.view.json +45 -0
- package/views/task-views-pack.view.json +53 -0
- package/src/agent-fleet.yaml +0 -1645
- package/src/business-developer.template.test.ts +0 -351
- package/src/business-developer.yaml +0 -860
- package/src/content-studio.yaml +0 -361
- package/src/dev-dashboard.yaml +0 -990
- package/src/outreach-comms.yaml +0 -486
- package/src/the-arch.yaml +0 -201
package/src/life-os.yaml
CHANGED
|
@@ -13,6 +13,9 @@ meta:
|
|
|
13
13
|
color: "#8B5CF6"
|
|
14
14
|
tags: [pkm, second-brain, knowledge, reading, life-os, notes]
|
|
15
15
|
isPublic: true
|
|
16
|
+
# A LIBRARY: it produces nothing a home counts (homes).
|
|
17
|
+
intent:
|
|
18
|
+
label: Knowledge
|
|
16
19
|
|
|
17
20
|
workspace:
|
|
18
21
|
name: Second Brain — Knowledge OS
|
|
@@ -145,6 +148,12 @@ profiles:
|
|
|
145
148
|
color: "#F59E0B"
|
|
146
149
|
description: Your reading library — track books, progress and insights.
|
|
147
150
|
scope: WORKSPACE
|
|
151
|
+
# How it renders (entity rendering, decision 8): @synap-core/types/presentation.
|
|
152
|
+
presentation:
|
|
153
|
+
family: record
|
|
154
|
+
media:
|
|
155
|
+
source: { property: cover-url }
|
|
156
|
+
kind: image
|
|
148
157
|
properties:
|
|
149
158
|
- slug: title
|
|
150
159
|
label: Title
|
|
@@ -213,6 +222,12 @@ profiles:
|
|
|
213
222
|
# system row and these life-os props land as this workspace's OVERLAY.
|
|
214
223
|
# (Was `scope: WORKSPACE`, which contradicted the pod-wide model.)
|
|
215
224
|
entityScope: pod
|
|
225
|
+
# How it renders (entity rendering, decision 8): @synap-core/types/presentation.
|
|
226
|
+
presentation:
|
|
227
|
+
family: record
|
|
228
|
+
media:
|
|
229
|
+
source: { property: avatar-url }
|
|
230
|
+
kind: image
|
|
216
231
|
properties:
|
|
217
232
|
- slug: name
|
|
218
233
|
label: Name
|
|
@@ -258,41 +273,6 @@ profiles:
|
|
|
258
273
|
valueType: string
|
|
259
274
|
inputType: url
|
|
260
275
|
|
|
261
|
-
- slug: project
|
|
262
|
-
displayName: Project
|
|
263
|
-
icon: FolderOpen
|
|
264
|
-
color: "#F97316"
|
|
265
|
-
description: Bounded efforts with a defined outcome and timeline.
|
|
266
|
-
scope: WORKSPACE
|
|
267
|
-
properties:
|
|
268
|
-
- slug: title
|
|
269
|
-
label: Title
|
|
270
|
-
valueType: string
|
|
271
|
-
inputType: text
|
|
272
|
-
required: true
|
|
273
|
-
- slug: status
|
|
274
|
-
label: Status
|
|
275
|
-
valueType: string
|
|
276
|
-
inputType: select
|
|
277
|
-
enumValues: [idea, planning, active, on-hold, completed, archived]
|
|
278
|
-
- slug: outcome
|
|
279
|
-
label: Outcome
|
|
280
|
-
valueType: string
|
|
281
|
-
inputType: textarea
|
|
282
|
-
- slug: due-date
|
|
283
|
-
label: Due Date
|
|
284
|
-
valueType: date
|
|
285
|
-
inputType: date
|
|
286
|
-
- slug: progress
|
|
287
|
-
label: Progress
|
|
288
|
-
valueType: number
|
|
289
|
-
inputType: number
|
|
290
|
-
constraints: { min: 0, max: 100 }
|
|
291
|
-
- slug: area
|
|
292
|
-
label: Area
|
|
293
|
-
valueType: string
|
|
294
|
-
inputType: text
|
|
295
|
-
|
|
296
276
|
- slug: area
|
|
297
277
|
displayName: Area
|
|
298
278
|
icon: Compass
|
|
@@ -325,6 +305,11 @@ profiles:
|
|
|
325
305
|
color: "#10B981"
|
|
326
306
|
description: Web articles and blog posts worth saving and processing.
|
|
327
307
|
scope: WORKSPACE
|
|
308
|
+
# How it renders (entity rendering, decision 8): @synap-core/types/presentation.
|
|
309
|
+
presentation:
|
|
310
|
+
family: link
|
|
311
|
+
media:
|
|
312
|
+
source: { property: url }
|
|
328
313
|
properties:
|
|
329
314
|
- slug: title
|
|
330
315
|
label: Title
|
|
@@ -362,6 +347,11 @@ profiles:
|
|
|
362
347
|
color: "#3B82F6"
|
|
363
348
|
description: Quick links to valuable resources and pages.
|
|
364
349
|
scope: WORKSPACE
|
|
350
|
+
# How it renders (entity rendering, decision 8): @synap-core/types/presentation.
|
|
351
|
+
presentation:
|
|
352
|
+
family: link
|
|
353
|
+
media:
|
|
354
|
+
source: { property: url }
|
|
365
355
|
properties:
|
|
366
356
|
- slug: title
|
|
367
357
|
label: Title
|
|
@@ -392,6 +382,14 @@ profiles:
|
|
|
392
382
|
color: "#EF4444"
|
|
393
383
|
description: Raw sparks and early-stage thinking.
|
|
394
384
|
scope: WORKSPACE
|
|
385
|
+
# The ONE lifecycle (work model L1): every option's category.
|
|
386
|
+
lifecycle:
|
|
387
|
+
property: status
|
|
388
|
+
options:
|
|
389
|
+
- { key: raw, category: open }
|
|
390
|
+
- { key: exploring, category: active }
|
|
391
|
+
- { key: validated, category: done }
|
|
392
|
+
- { key: shelved, category: paused }
|
|
395
393
|
properties:
|
|
396
394
|
- slug: title
|
|
397
395
|
label: Title
|
|
@@ -416,47 +414,17 @@ profiles:
|
|
|
416
414
|
inputType: number
|
|
417
415
|
constraints: { min: 1, max: 5 }
|
|
418
416
|
|
|
419
|
-
- slug: goal
|
|
420
|
-
displayName: Goal
|
|
421
|
-
icon: Target
|
|
422
|
-
color: "#14B8A6"
|
|
423
|
-
description: Intentions with a target state and measurable progress.
|
|
424
|
-
scope: WORKSPACE
|
|
425
|
-
properties:
|
|
426
|
-
- slug: title
|
|
427
|
-
label: Title
|
|
428
|
-
valueType: string
|
|
429
|
-
inputType: text
|
|
430
|
-
required: true
|
|
431
|
-
- slug: description
|
|
432
|
-
label: Description
|
|
433
|
-
valueType: string
|
|
434
|
-
inputType: textarea
|
|
435
|
-
- slug: status
|
|
436
|
-
label: Status
|
|
437
|
-
valueType: string
|
|
438
|
-
inputType: select
|
|
439
|
-
enumValues: [active, achieved, abandoned]
|
|
440
|
-
- slug: target-date
|
|
441
|
-
label: Target Date
|
|
442
|
-
valueType: date
|
|
443
|
-
inputType: date
|
|
444
|
-
- slug: progress
|
|
445
|
-
label: Progress
|
|
446
|
-
valueType: number
|
|
447
|
-
inputType: number
|
|
448
|
-
constraints: { min: 0, max: 100 }
|
|
449
|
-
- slug: area
|
|
450
|
-
label: Area
|
|
451
|
-
valueType: string
|
|
452
|
-
inputType: text
|
|
453
|
-
|
|
454
417
|
- slug: video
|
|
455
418
|
displayName: Video
|
|
456
419
|
icon: Video
|
|
457
420
|
color: "#8B5CF6"
|
|
458
421
|
description: Video content from YouTube, courses, and other platforms.
|
|
459
422
|
scope: WORKSPACE
|
|
423
|
+
# How it renders (entity rendering, decision 8): @synap-core/types/presentation.
|
|
424
|
+
presentation:
|
|
425
|
+
family: link
|
|
426
|
+
media:
|
|
427
|
+
source: { property: url }
|
|
460
428
|
properties:
|
|
461
429
|
- slug: title
|
|
462
430
|
label: Title
|
|
@@ -490,6 +458,11 @@ profiles:
|
|
|
490
458
|
color: "#EC4899"
|
|
491
459
|
description: Episodes and shows worth listening to or already consumed.
|
|
492
460
|
scope: WORKSPACE
|
|
461
|
+
# How it renders (entity rendering, decision 8): @synap-core/types/presentation.
|
|
462
|
+
presentation:
|
|
463
|
+
family: link
|
|
464
|
+
media:
|
|
465
|
+
source: { property: url }
|
|
493
466
|
properties:
|
|
494
467
|
- slug: title
|
|
495
468
|
label: Title
|
|
@@ -609,6 +582,11 @@ profiles:
|
|
|
609
582
|
color: "#6366F1"
|
|
610
583
|
description: Educational courses you're taking or have completed.
|
|
611
584
|
scope: WORKSPACE
|
|
585
|
+
# How it renders (entity rendering, decision 8): @synap-core/types/presentation.
|
|
586
|
+
presentation:
|
|
587
|
+
family: link
|
|
588
|
+
media:
|
|
589
|
+
source: { property: url }
|
|
612
590
|
properties:
|
|
613
591
|
- slug: title
|
|
614
592
|
label: Title
|
|
@@ -779,14 +757,6 @@ views:
|
|
|
779
757
|
- name: People Network
|
|
780
758
|
type: table
|
|
781
759
|
scopeProfileSlug: person
|
|
782
|
-
- name: Active Projects
|
|
783
|
-
type: kanban
|
|
784
|
-
scopeProfileSlug: project
|
|
785
|
-
config:
|
|
786
|
-
groupByField: status
|
|
787
|
-
- name: All Projects
|
|
788
|
-
type: table
|
|
789
|
-
scopeProfileSlug: project
|
|
790
760
|
- name: All Areas
|
|
791
761
|
type: table
|
|
792
762
|
scopeProfileSlug: area
|
|
@@ -809,9 +779,6 @@ views:
|
|
|
809
779
|
scopeProfileSlug: idea
|
|
810
780
|
config:
|
|
811
781
|
groupByField: status
|
|
812
|
-
- name: All Goals
|
|
813
|
-
type: table
|
|
814
|
-
scopeProfileSlug: goal
|
|
815
782
|
- name: Notes Dashboard
|
|
816
783
|
type: bento
|
|
817
784
|
scopeProfileSlug: note
|
|
@@ -1027,68 +994,6 @@ views:
|
|
|
1027
994
|
kind: view
|
|
1028
995
|
viewName: People Network
|
|
1029
996
|
pos: { x: 0, y: 4, w: 12, h: 6 }
|
|
1030
|
-
- name: Projects Dashboard
|
|
1031
|
-
type: bento
|
|
1032
|
-
scopeProfileSlug: project
|
|
1033
|
-
config:
|
|
1034
|
-
blocks:
|
|
1035
|
-
- id: prd-b1
|
|
1036
|
-
kind: widget
|
|
1037
|
-
widgetType: welcome-header
|
|
1038
|
-
pos: { x: 0, y: 0, w: 12, h: 2 }
|
|
1039
|
-
config: { title: Projects, subtitle: Your active initiatives }
|
|
1040
|
-
- id: prd-b2
|
|
1041
|
-
kind: widget
|
|
1042
|
-
widgetType: entity-count
|
|
1043
|
-
pos: { x: 0, y: 2, w: 3, h: 2 }
|
|
1044
|
-
config:
|
|
1045
|
-
{
|
|
1046
|
-
profileSlug: project,
|
|
1047
|
-
label: Active,
|
|
1048
|
-
icon: Play,
|
|
1049
|
-
filter: { status: active },
|
|
1050
|
-
color: green,
|
|
1051
|
-
}
|
|
1052
|
-
- id: prd-b3
|
|
1053
|
-
kind: widget
|
|
1054
|
-
widgetType: entity-count
|
|
1055
|
-
pos: { x: 3, y: 2, w: 3, h: 2 }
|
|
1056
|
-
config:
|
|
1057
|
-
{
|
|
1058
|
-
profileSlug: project,
|
|
1059
|
-
label: Planning,
|
|
1060
|
-
icon: Map,
|
|
1061
|
-
filter: { status: planning },
|
|
1062
|
-
color: blue,
|
|
1063
|
-
}
|
|
1064
|
-
- id: prd-b4
|
|
1065
|
-
kind: widget
|
|
1066
|
-
widgetType: entity-count
|
|
1067
|
-
pos: { x: 6, y: 2, w: 3, h: 2 }
|
|
1068
|
-
config:
|
|
1069
|
-
{
|
|
1070
|
-
profileSlug: project,
|
|
1071
|
-
label: On Hold,
|
|
1072
|
-
icon: PauseCircle,
|
|
1073
|
-
filter: { status: on-hold },
|
|
1074
|
-
color: amber,
|
|
1075
|
-
}
|
|
1076
|
-
- id: prd-b5
|
|
1077
|
-
kind: widget
|
|
1078
|
-
widgetType: entity-count
|
|
1079
|
-
pos: { x: 9, y: 2, w: 3, h: 2 }
|
|
1080
|
-
config:
|
|
1081
|
-
{
|
|
1082
|
-
profileSlug: project,
|
|
1083
|
-
label: Completed,
|
|
1084
|
-
icon: CheckCircle,
|
|
1085
|
-
filter: { status: completed },
|
|
1086
|
-
color: purple,
|
|
1087
|
-
}
|
|
1088
|
-
- id: prd-b6
|
|
1089
|
-
kind: view
|
|
1090
|
-
viewName: Active Projects
|
|
1091
|
-
pos: { x: 0, y: 4, w: 12, h: 6 }
|
|
1092
997
|
- name: Quotes Dashboard
|
|
1093
998
|
type: bento
|
|
1094
999
|
scopeProfileSlug: quote
|
|
@@ -1146,12 +1051,6 @@ views:
|
|
|
1146
1051
|
icon: Compass,
|
|
1147
1052
|
filter: { status: active },
|
|
1148
1053
|
}
|
|
1149
|
-
- id: ad-b3
|
|
1150
|
-
kind: widget
|
|
1151
|
-
widgetType: entity-count
|
|
1152
|
-
pos: { x: 6, y: 2, w: 6, h: 2 }
|
|
1153
|
-
config:
|
|
1154
|
-
{ profileSlug: project, label: Total Projects, icon: FolderOpen }
|
|
1155
1054
|
- id: ad-b4
|
|
1156
1055
|
kind: view
|
|
1157
1056
|
viewName: All Areas
|
|
@@ -1206,10 +1105,6 @@ layout:
|
|
|
1206
1105
|
profileSlug: person
|
|
1207
1106
|
label: People
|
|
1208
1107
|
icon: Users
|
|
1209
|
-
- kind: profile
|
|
1210
|
-
profileSlug: project
|
|
1211
|
-
label: Projects
|
|
1212
|
-
icon: FolderOpen
|
|
1213
1108
|
- kind: profile
|
|
1214
1109
|
profileSlug: area
|
|
1215
1110
|
label: Areas
|
|
@@ -1232,10 +1127,6 @@ entityLinks:
|
|
|
1232
1127
|
targetProfileSlug: book
|
|
1233
1128
|
type: references
|
|
1234
1129
|
label: References
|
|
1235
|
-
- sourceProfileSlug: note
|
|
1236
|
-
targetProfileSlug: project
|
|
1237
|
-
type: feeds-into
|
|
1238
|
-
label: Feeds into
|
|
1239
1130
|
- sourceProfileSlug: highlight
|
|
1240
1131
|
targetProfileSlug: book
|
|
1241
1132
|
type: from
|
|
@@ -1252,18 +1143,6 @@ entityLinks:
|
|
|
1252
1143
|
targetProfileSlug: person
|
|
1253
1144
|
type: written-by
|
|
1254
1145
|
label: Written by
|
|
1255
|
-
- sourceProfileSlug: idea
|
|
1256
|
-
targetProfileSlug: project
|
|
1257
|
-
type: feeds-into
|
|
1258
|
-
label: Feeds into
|
|
1259
|
-
- sourceProfileSlug: project
|
|
1260
|
-
targetProfileSlug: area
|
|
1261
|
-
type: belongs-to
|
|
1262
|
-
label: Belongs to
|
|
1263
|
-
- sourceProfileSlug: goal
|
|
1264
|
-
targetProfileSlug: area
|
|
1265
|
-
type: in-area
|
|
1266
|
-
label: In area
|
|
1267
1146
|
- sourceProfileSlug: concept
|
|
1268
1147
|
targetProfileSlug: concept
|
|
1269
1148
|
type: related-to
|
|
@@ -1318,7 +1197,6 @@ bento:
|
|
|
1318
1197
|
- { label: Add Book, icon: BookOpen, profileSlug: book }
|
|
1319
1198
|
- { label: Capture Idea, icon: Zap, profileSlug: idea }
|
|
1320
1199
|
- { label: Concepts, icon: Lightbulb, profileSlug: concept }
|
|
1321
|
-
- { label: Projects, icon: FolderOpen, profileSlug: project }
|
|
1322
1200
|
- { label: People, icon: Users, profileSlug: person }
|
|
1323
1201
|
- kind: widget
|
|
1324
1202
|
widgetType: calendar
|
|
@@ -1437,28 +1315,6 @@ profileEntityBentoTemplates:
|
|
|
1437
1315
|
widgetType: entity-list
|
|
1438
1316
|
pos: { x: 6, y: 3, w: 6, h: 4 }
|
|
1439
1317
|
config: { profileSlug: article, title: Articles by, limit: 8 }
|
|
1440
|
-
project:
|
|
1441
|
-
blocks:
|
|
1442
|
-
- id: project-eb-b1
|
|
1443
|
-
kind: widget
|
|
1444
|
-
widgetType: entity-spotlight
|
|
1445
|
-
pos: { x: 0, y: 0, w: 8, h: 3 }
|
|
1446
|
-
config: { seed: pinned, layout: detail }
|
|
1447
|
-
- id: project-eb-b2
|
|
1448
|
-
kind: widget
|
|
1449
|
-
widgetType: entity-count
|
|
1450
|
-
pos: { x: 8, y: 0, w: 4, h: 3 }
|
|
1451
|
-
config: { profileSlug: idea, label: Ideas, icon: Zap }
|
|
1452
|
-
- id: project-eb-b3
|
|
1453
|
-
kind: widget
|
|
1454
|
-
widgetType: entity-list
|
|
1455
|
-
pos: { x: 0, y: 3, w: 6, h: 4 }
|
|
1456
|
-
config: { profileSlug: note, title: Project Notes, limit: 8 }
|
|
1457
|
-
- id: project-eb-b4
|
|
1458
|
-
kind: widget
|
|
1459
|
-
widgetType: entity-list
|
|
1460
|
-
pos: { x: 6, y: 3, w: 6, h: 4 }
|
|
1461
|
-
config: { profileSlug: idea, title: Ideas, limit: 8 }
|
|
1462
1318
|
area:
|
|
1463
1319
|
blocks:
|
|
1464
1320
|
- id: area-eb-b1
|
|
@@ -1466,50 +1322,11 @@ profileEntityBentoTemplates:
|
|
|
1466
1322
|
widgetType: entity-spotlight
|
|
1467
1323
|
pos: { x: 0, y: 0, w: 8, h: 3 }
|
|
1468
1324
|
config: { seed: pinned, layout: detail }
|
|
1469
|
-
- id: area-eb-b2
|
|
1470
|
-
kind: widget
|
|
1471
|
-
widgetType: entity-count
|
|
1472
|
-
pos: { x: 8, y: 0, w: 4, h: 3 }
|
|
1473
|
-
config:
|
|
1474
|
-
{
|
|
1475
|
-
profileSlug: project,
|
|
1476
|
-
label: Projects,
|
|
1477
|
-
icon: FolderOpen,
|
|
1478
|
-
color: green,
|
|
1479
|
-
}
|
|
1480
|
-
- id: area-eb-b3
|
|
1481
|
-
kind: widget
|
|
1482
|
-
widgetType: entity-list
|
|
1483
|
-
pos: { x: 0, y: 3, w: 12, h: 4 }
|
|
1484
|
-
config: { profileSlug: project, title: Projects, limit: 10 }
|
|
1485
|
-
goal:
|
|
1486
|
-
blocks:
|
|
1487
|
-
- id: goal-eb-b1
|
|
1488
|
-
kind: widget
|
|
1489
|
-
widgetType: entity-spotlight
|
|
1490
|
-
pos: { x: 0, y: 0, w: 8, h: 3 }
|
|
1491
|
-
config: { seed: pinned, layout: detail }
|
|
1492
|
-
- id: goal-eb-b2
|
|
1493
|
-
kind: widget
|
|
1494
|
-
widgetType: metrics-summary
|
|
1495
|
-
pos: { x: 8, y: 0, w: 4, h: 3 }
|
|
1496
|
-
config:
|
|
1497
|
-
{
|
|
1498
|
-
profileSlug: project,
|
|
1499
|
-
property: progress,
|
|
1500
|
-
aggregation: average,
|
|
1501
|
-
title: Avg Project Progress,
|
|
1502
|
-
}
|
|
1503
|
-
- id: goal-eb-b3
|
|
1504
|
-
kind: widget
|
|
1505
|
-
widgetType: entity-list
|
|
1506
|
-
pos: { x: 0, y: 3, w: 12, h: 4 }
|
|
1507
|
-
config: { profileSlug: project, title: Related Projects, limit: 8 }
|
|
1508
1325
|
|
|
1509
1326
|
# Per-workspace adaptive onboarding context (from synap-backend life-os.package.json)
|
|
1510
1327
|
onboarding:
|
|
1511
1328
|
goal: Capture the shape of the user's life — their areas of focus, current goals, active projects, key people, and what they're reading or learning — so the second brain starts grounded in who they actually are.
|
|
1512
|
-
framing: Act as a thoughtful personal-knowledge coach. Gently tease out the domains they care about, what they're working toward, what's in motion, who matters to them, and what they're consuming. Translate that into areas,
|
|
1329
|
+
framing: Act as a thoughtful personal-knowledge coach. Gently tease out the domains they care about, what they're working toward, what's in motion, who matters to them, and what they're consuming. Translate that into areas, projects, people, and books. Goals are the pod's own goals (tracks), not an entity kind in this space; start each as a track (a goal) and file its notes into its project. Projects are the pod's own projects, not an entity kind; create each through the project door and file its notes into it.
|
|
1513
1330
|
expertise:
|
|
1514
1331
|
starters:
|
|
1515
1332
|
- >
|
|
@@ -1550,22 +1367,16 @@ onboarding:
|
|
|
1550
1367
|
a next action, and a review habit named so the system gets revisited, not just fed.
|
|
1551
1368
|
collect:
|
|
1552
1369
|
- profileSlug: area
|
|
1370
|
+
min: 1
|
|
1553
1371
|
what: The ongoing areas of life / responsibility they want to keep standards in
|
|
1554
1372
|
cardinality: few
|
|
1555
1373
|
keyFields: [title, description, standard]
|
|
1556
|
-
- profileSlug: goal
|
|
1557
|
-
what: The goals they're currently working toward
|
|
1558
|
-
cardinality: few
|
|
1559
|
-
keyFields: [title, target-date, area, progress]
|
|
1560
|
-
- profileSlug: project
|
|
1561
|
-
what: The active projects in motion (the concrete efforts that advance their goals)
|
|
1562
|
-
cardinality: few
|
|
1563
|
-
keyFields: [title, status]
|
|
1564
1374
|
- profileSlug: person
|
|
1565
1375
|
what: The key people in their world
|
|
1566
1376
|
cardinality: several
|
|
1567
1377
|
keyFields: [name, relationship, company]
|
|
1568
1378
|
- profileSlug: book
|
|
1379
|
+
min: 1
|
|
1569
1380
|
what: What they're currently reading or learning from
|
|
1570
1381
|
cardinality: few
|
|
1571
1382
|
keyFields: [title, author, status]
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Lifecycle coverage — kinds with a lifecycle should have a process that moves it.
|
|
3
|
+
*
|
|
4
|
+
* A kind with a lifecycle select (`post-status`, `deal-stage`, …) is a process
|
|
5
|
+
* waiting to be declared: the engine can bind a playbook's stages to it
|
|
6
|
+
* (`subjectProfile.statusProperty` + `stages[].subjectStatus`), but only if a
|
|
7
|
+
* playbook binds the kind at all. This file holds two guards.
|
|
8
|
+
*
|
|
9
|
+
* (1) RATCHET. Count the kinds across the WHOLE corpus that have a lifecycle and
|
|
10
|
+
* that NO playbook binds through `subjectProfile`. It may only go DOWN:
|
|
11
|
+
* `count <= BASELINE`. Lower BASELINE when you bind a kind; never raise it to
|
|
12
|
+
* bank a new unbound lifecycle kind — bind it, or don't give it a lifecycle.
|
|
13
|
+
*
|
|
14
|
+
* "Has a lifecycle" = a `select` property whose slug contains "status" or
|
|
15
|
+
* "stage", CASE-INSENSITIVE. EXCLUDED: agent/runtime machine state, which
|
|
16
|
+
* the system writes and no person or process moves through —
|
|
17
|
+
* `agent_status`, `runStatus`, `lastRunStatus`, `run_status`, `job-status`
|
|
18
|
+
* (RUNTIME_STATUS below). Kind identity is the profile slug, deduplicated
|
|
19
|
+
* across templates (a shared kind re-declared in two templates counts once).
|
|
20
|
+
*
|
|
21
|
+
* (2) COVERAGE. For every playbook whose stages bind the lifecycle (it declares
|
|
22
|
+
* `subjectProfile.statusProperty` AND at least one stage `subjectStatus`),
|
|
23
|
+
* every enum value of that property must be some stage's `subjectStatus` or
|
|
24
|
+
* listed in `humanOnlyStatuses`. A value in neither is a state the process
|
|
25
|
+
* silently cannot reach or leave.
|
|
26
|
+
*
|
|
27
|
+
* NOT covered: a playbook that declares `statusProperty` only to READ the
|
|
28
|
+
* lifecycle (an activator, e.g. Content OS "Repurpose" fires on Published
|
|
29
|
+
* and creates NEW posts) and binds no stage. It owns no status, so asking it
|
|
30
|
+
* to cover the enum would force it to list every value as human-only.
|
|
31
|
+
*
|
|
32
|
+
* The functions + BASELINE live in scripts/catalog-lib.mjs (validateCatalog
|
|
33
|
+
* enforces them at publish). Both scans derive their set by globbing `src/*.yaml` (readYamlTemplates);
|
|
34
|
+
* nothing is hand-listed. Negative controls (run 2026-10-08): baseline 94 →
|
|
35
|
+
* red "expected 95 to be less than or equal to 94"; removing "Archived" from
|
|
36
|
+
* Produce Content's humanOnlyStatuses → red, naming `post-status = Archived`.
|
|
37
|
+
*/
|
|
38
|
+
|
|
39
|
+
import { describe, expect, it } from "vitest";
|
|
40
|
+
import { readYamlTemplates } from "./generate.mjs";
|
|
41
|
+
import type { WorkspaceYaml } from "./types.js";
|
|
42
|
+
// The rule lives in the ONE catalog lib (validateCatalog runs it on every
|
|
43
|
+
// publish); this file pins it against the real corpus.
|
|
44
|
+
import {
|
|
45
|
+
LIFECYCLE_BASELINE as BASELINE,
|
|
46
|
+
LIFECYCLE_PATTERNS,
|
|
47
|
+
boundKinds,
|
|
48
|
+
lifecycleKinds,
|
|
49
|
+
unboundLifecycleKinds,
|
|
50
|
+
uncoveredStatuses,
|
|
51
|
+
} from "../scripts/catalog-lib.mjs";
|
|
52
|
+
|
|
53
|
+
const { RUNTIME_STATUS, LIFECYCLE } = LIFECYCLE_PATTERNS;
|
|
54
|
+
|
|
55
|
+
const corpus = readYamlTemplates().map((t) => t.data as WorkspaceYaml);
|
|
56
|
+
|
|
57
|
+
describe("lifecycle coverage — ratchet", () => {
|
|
58
|
+
it("non-vacuity: the scan sees the corpus and a literal lifecycle kind", () => {
|
|
59
|
+
expect(corpus.length).toBeGreaterThanOrEqual(25);
|
|
60
|
+
const kinds = lifecycleKinds(corpus);
|
|
61
|
+
expect(kinds.size).toBeGreaterThanOrEqual(80);
|
|
62
|
+
expect(kinds.get("post")?.has("post-status")).toBe(true);
|
|
63
|
+
// Case-insensitive: a camelCase lifecycle field is seen.
|
|
64
|
+
expect(LIFECYCLE.test("dealStage")).toBe(true);
|
|
65
|
+
// The runtime exclusion sees what it excludes, and only that.
|
|
66
|
+
for (const s of ["agent_status", "runStatus", "lastRunStatus", "run_status", "job-status"])
|
|
67
|
+
expect(RUNTIME_STATUS.test(s)).toBe(true);
|
|
68
|
+
expect(RUNTIME_STATUS.test("post-status")).toBe(false);
|
|
69
|
+
expect(boundKinds(corpus).has("post")).toBe(true);
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
it(`unbound lifecycle kinds never grow past the baseline (${BASELINE})`, () => {
|
|
73
|
+
const unbound = unboundLifecycleKinds(corpus);
|
|
74
|
+
expect(unbound.length, unbound.join(", ")).toBeLessThanOrEqual(BASELINE);
|
|
75
|
+
});
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
describe("lifecycle coverage — every status of a stage-bound lifecycle is owned", () => {
|
|
79
|
+
it("non-vacuity: at least two playbooks bind stages to a lifecycle", () => {
|
|
80
|
+
const binders = corpus.flatMap((t) =>
|
|
81
|
+
(t.playbooks ?? []).filter(
|
|
82
|
+
(pb) => pb.subjectProfile?.statusProperty && (pb.stages ?? []).some((s) => s.subjectStatus)
|
|
83
|
+
)
|
|
84
|
+
);
|
|
85
|
+
expect(binders.length).toBeGreaterThanOrEqual(2);
|
|
86
|
+
});
|
|
87
|
+
|
|
88
|
+
it("self-check: an un-owned status is reported", () => {
|
|
89
|
+
const clone = structuredClone(corpus);
|
|
90
|
+
const produce = clone
|
|
91
|
+
.find((t) => t.meta.slug === "content-os")!
|
|
92
|
+
.playbooks!.find((p) => p.name === "Produce Content")!;
|
|
93
|
+
produce.humanOnlyStatuses = ["Idea"];
|
|
94
|
+
expect(uncoveredStatuses(clone)).toContain("content-os › Produce Content: post-status = Archived");
|
|
95
|
+
});
|
|
96
|
+
|
|
97
|
+
it("every enum value is a stage's subjectStatus or a humanOnlyStatus", () => {
|
|
98
|
+
expect(uncoveredStatuses(corpus)).toEqual([]);
|
|
99
|
+
});
|
|
100
|
+
});
|
|
101
|
+
|
|
102
|
+
// ONE LIFECYCLE PER KIND OR ROLE (work model, founder rule 2026-10-11). A
|
|
103
|
+
// second lifecycle select on the same kind is two truths about where the thing
|
|
104
|
+
// stands (deal once carried `dealStage` AND `commercialStage`; the lead role
|
|
105
|
+
// `leadStage` AND an overlay `lifecycleStage`). RATCHET on the EXCESS — the sum
|
|
106
|
+
// over kinds of (lifecycle-named selects − 1) — so re-adding a second stage to a
|
|
107
|
+
// kind that is already counted still turns this red. It counts by NAME, so side
|
|
108
|
+
// statuses (`handoffStatus`, `commissionStatus`) are counted too: that is the
|
|
109
|
+
// limit of a name scan, and why this is a ratchet, not a zero assertion.
|
|
110
|
+
// Lower EXCESS_BASELINE when you fold one; never raise it.
|
|
111
|
+
const EXCESS_BASELINE = 9;
|
|
112
|
+
describe("one lifecycle per kind or role — ratchet", () => {
|
|
113
|
+
it(`excess lifecycle-named selects never grow past ${EXCESS_BASELINE}`, () => {
|
|
114
|
+
const kinds = lifecycleKinds(corpus);
|
|
115
|
+
const multi = [...kinds].filter(([, set]) => set.size > 1);
|
|
116
|
+
const excess = multi.reduce((n, [, set]) => n + set.size - 1, 0);
|
|
117
|
+
expect(kinds.get("deal")?.has("commercialStage")).toBe(true); // non-vacuity
|
|
118
|
+
expect(kinds.get("deal")?.has("dealStage"), "deal's retired dealStage is back").toBe(false);
|
|
119
|
+
expect(kinds.get("lead")?.has("lifecycleStage"), "lead's retired lifecycleStage is back").toBe(false);
|
|
120
|
+
expect(excess, multi.map(([k, s]) => `${k}: ${[...s].join(",")}`).join("; ")).toBeLessThanOrEqual(
|
|
121
|
+
EXCESS_BASELINE
|
|
122
|
+
);
|
|
123
|
+
});
|
|
124
|
+
});
|