@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.
Files changed (237) hide show
  1. package/README.md +509 -0
  2. package/automations/bookmark-enrichment.automation.json +321 -0
  3. package/automations/github-pr-events.automation.json +505 -0
  4. package/automations/mail-feed.automation.json +86 -0
  5. package/automations/ship-a-change-checks-green.automation.json +106 -0
  6. package/automations/ship-a-change-checks-red.automation.json +106 -0
  7. package/automations/ship-a-change-deployed.automation.json +56 -0
  8. package/automations/ship-a-change-pr-merged.automation.json +110 -0
  9. package/automations/ship-a-change-pr-opened.automation.json +104 -0
  10. package/automations/url-bookmark-capture.automation.json +132 -0
  11. package/capabilities/agency-skills.capability.json +157 -0
  12. package/capabilities/apify.capability.json +265 -0
  13. package/capabilities/apollo.capability.json +120 -0
  14. package/capabilities/arch-backend.capability.json +97 -0
  15. package/capabilities/arch-client-intelligence.capability.json +401 -0
  16. package/capabilities/backblaze-b2.capability.json +205 -0
  17. package/capabilities/cal-com.capability.json +266 -0
  18. package/capabilities/canva.capability.json +274 -0
  19. package/capabilities/claude-code-routines.capability.json +172 -0
  20. package/capabilities/claude-managed-agents.capability.json +215 -0
  21. package/capabilities/client-comms-report.capability.json +246 -0
  22. package/capabilities/content-idea-to-production.capability.json +29 -0
  23. package/capabilities/datagouv.capability.json +315 -0
  24. package/capabilities/discord-bot.capability.json +157 -0
  25. package/capabilities/dropbox.capability.json +281 -0
  26. package/capabilities/exa.capability.json +109 -0
  27. package/capabilities/fal-ai.capability.json +83 -0
  28. package/capabilities/fal-media-lab.capability.json +158 -0
  29. package/capabilities/fireflies.capability.json +191 -0
  30. package/capabilities/freellmapi.capability.json +114 -0
  31. package/capabilities/generic-apikey.capability.json +92 -0
  32. package/capabilities/github-merge.capability.json +99 -0
  33. package/capabilities/github-read.capability.json +325 -0
  34. package/capabilities/governance-tighten-recommender.capability.json +81 -0
  35. package/capabilities/jev.capability.json +226 -0
  36. package/capabilities/lead-conversion-enrollment.capability.json +246 -0
  37. package/capabilities/mail-feed.capability.json +277 -0
  38. package/capabilities/mailgun.capability.json +52 -0
  39. package/capabilities/nango-google.capability.json +639 -0
  40. package/capabilities/notion.capability.json +417 -0
  41. package/capabilities/omniroute.capability.json +137 -0
  42. package/capabilities/posthog-analytics.capability.json +258 -0
  43. package/capabilities/postiz.capability.json +467 -0
  44. package/capabilities/proactive-digest.capability.json +190 -0
  45. package/capabilities/proton.capability.json +288 -0
  46. package/capabilities/replicate-rvm.capability.json +97 -0
  47. package/capabilities/research-methods.capability.json +57 -0
  48. package/capabilities/shopify.capability.json +395 -0
  49. package/capabilities/slack.capability.json +369 -0
  50. package/capabilities/stripe.capability.json +1496 -0
  51. package/capabilities/telegram-bridge.capability.json +56 -0
  52. package/capabilities/treg.capability.json +102 -0
  53. package/capabilities/unipile-linkedin.capability.json +494 -0
  54. package/capabilities/vercel.capability.json +424 -0
  55. package/dist/define-DqoItRiR.d.ts +1370 -0
  56. package/dist/index.d.ts +174 -900
  57. package/dist/index.js +26447 -24075
  58. package/dist/index.js.map +1 -1
  59. package/dist/wire.d.ts +222 -0
  60. package/dist/wire.js +77 -0
  61. package/dist/wire.js.map +1 -0
  62. package/package.json +27 -4
  63. package/retired.yaml +136 -0
  64. package/skills/app-factory-build-slice/SKILL.md +70 -0
  65. package/skills/app-factory-build-slice.catalog.json +17 -0
  66. package/skills/app-factory-design-canvas/SKILL.md +96 -0
  67. package/skills/app-factory-design-canvas.catalog.json +17 -0
  68. package/skills/app-factory-design-review/SKILL.md +105 -0
  69. package/skills/app-factory-design-review.catalog.json +18 -0
  70. package/skills/app-factory-research/SKILL.md +123 -0
  71. package/skills/app-factory-research.catalog.json +17 -0
  72. package/skills/bookmark-enrichment/SKILL.md +40 -0
  73. package/skills/carousel-format/carousel-format.skill.json +18 -0
  74. package/skills/collage-broll/collage-broll.skill.json +20 -0
  75. package/skills/content-taste/content-taste.skill.json +18 -0
  76. package/skills/creative-director/creative-director.skill.json +18 -0
  77. package/skills/design-critique/SKILL.md +138 -0
  78. package/skills/design-critique.catalog.json +12 -0
  79. package/skills/designing-with-real-components/SKILL.md +140 -0
  80. package/skills/designing-with-real-components.catalog.json +12 -0
  81. package/skills/edit-loop/edit-loop.skill.json +25 -0
  82. package/skills/facecam-edit/facecam-edit.skill.json +24 -0
  83. package/skills/mapping-the-server/SKILL.md +54 -0
  84. package/skills/math-explainer-manimgx/math-explainer-manimgx.skill.json +20 -0
  85. package/skills/motion-quality-gates/motion-quality-gates.skill.json +20 -0
  86. package/skills/open-design-edit/open-design-edit.skill.json +24 -0
  87. package/skills/reading-client-progress/SKILL.md +65 -0
  88. package/skills/routing-to-channels/SKILL.md +54 -0
  89. package/skills/stellar-scf-grants-advisor/ASSOCIATE-CHEATSHEET.md +133 -0
  90. package/skills/stellar-scf-grants-advisor/ASSOCIATE-ONBOARDING-GUIDE.md +761 -0
  91. package/skills/stellar-scf-grants-advisor/CLIENT-FAQ.md +181 -0
  92. package/skills/stellar-scf-grants-advisor/PARTNER-HANDOVER.md +130 -0
  93. package/skills/stellar-scf-grants-advisor/SKILL.md +102 -0
  94. package/skills/stellar-scf-grants-advisor/examples/README.md +43 -0
  95. package/skills/stellar-scf-grants-advisor/examples/chat-summary-templates.md +158 -0
  96. package/skills/stellar-scf-grants-advisor/examples/corpus-comparable-rows.md +136 -0
  97. package/skills/stellar-scf-grants-advisor/examples/q10-team-rewrites.md +109 -0
  98. package/skills/stellar-scf-grants-advisor/examples/q2-description-rewrites.md +88 -0
  99. package/skills/stellar-scf-grants-advisor/examples/q6-integration-rewrites.md +107 -0
  100. package/skills/stellar-scf-grants-advisor/examples/tranche-structures.md +176 -0
  101. package/skills/stellar-scf-grants-advisor/reference/01-methodology.md +96 -0
  102. package/skills/stellar-scf-grants-advisor/reference/02-scoring-framework.md +199 -0
  103. package/skills/stellar-scf-grants-advisor/reference/03-rejection-patterns.md +241 -0
  104. package/skills/stellar-scf-grants-advisor/reference/04-winner-patterns.md +120 -0
  105. package/skills/stellar-scf-grants-advisor/reference/05-comeback-patterns.md +92 -0
  106. package/skills/stellar-scf-grants-advisor/reference/06-budget-benchmarks.md +125 -0
  107. package/skills/stellar-scf-grants-advisor/reference/07-integration-list.md +147 -0
  108. package/skills/stellar-scf-grants-advisor/reference/08-abstract-fields.md +258 -0
  109. package/skills/stellar-scf-grants-advisor/reference/09-build-fields.md +259 -0
  110. package/skills/stellar-scf-grants-advisor/reference/10-corpus-winners.md +135 -0
  111. package/skills/stellar-scf-grants-advisor/reference/11-corpus-rejects.md +267 -0
  112. package/skills/stellar-scf-grants-advisor/reference/12-client-communication.md +131 -0
  113. package/skills/stellar-scf-grants-advisor/reference/13-excel-output-spec.md +199 -0
  114. package/skills/stellar-scf-grants-advisor/reference/14-worked-examples.md +160 -0
  115. package/skills/stellar-scf-grants-advisor/templates/abstract-review-builder.py +253 -0
  116. package/skills/stellar-scf-grants-advisor/templates/build-review-builder.py +213 -0
  117. package/skills/video-direction/video-direction.skill.json +20 -0
  118. package/skills/video-style-vocabulary/video-style-vocabulary.skill.json +20 -0
  119. package/skills/video-toolbox/video-toolbox.skill.json +20 -0
  120. package/src/__fixtures__/lifecycle-presets.flat-before.json +205 -0
  121. package/src/agency-os.yaml +122 -0
  122. package/src/agent-os-skill-slugs.test.ts +65 -0
  123. package/src/apify-social-reader.test.ts +317 -0
  124. package/src/base.yaml +85 -39
  125. package/src/blockchain-ecosystem.yaml +1 -0
  126. package/src/brand-library.yaml +525 -14
  127. package/src/builder-dev-fold.template.test.ts +113 -0
  128. package/src/builder.yaml +779 -91
  129. package/src/business-model-catalog-description.test.ts +47 -0
  130. package/src/business-model-grp.template.test.ts +214 -0
  131. package/src/business-model.yaml +296 -49
  132. package/src/catalog-safety.test.ts +198 -0
  133. package/src/catalog.template-items.test.ts +75 -0
  134. package/src/catalog.ts +66 -2
  135. package/src/concept-guard.test.ts +28 -8
  136. package/src/concept-guard.ts +2 -2
  137. package/src/content-creation.template.test.ts +52 -0
  138. package/src/content-creation.yaml +192 -0
  139. package/src/content-os.edit-loop.template.test.ts +210 -0
  140. package/src/content-os.publish-due-posts.template.test.ts +261 -0
  141. package/src/content-os.template.test.ts +349 -0
  142. package/src/content-os.video-takes.template.test.ts +338 -0
  143. package/src/content-os.work-a-take.template.test.ts +125 -0
  144. package/src/content-os.yaml +1873 -39
  145. package/src/content-studio-retired.template.test.ts +82 -0
  146. package/src/corpus-flow-validity.test.ts +4 -5
  147. package/src/crm-absorbs-outreach.template.test.ts +117 -0
  148. package/src/crm-build-plan.template.test.ts +128 -0
  149. package/src/crm-lists.template.test.ts +96 -0
  150. package/src/crm-messages-cadence.template.test.ts +246 -0
  151. package/src/crm-one-send-door.template.test.ts +65 -0
  152. package/src/crm.yaml +1563 -181
  153. package/src/decisions-wave.template.test.ts +186 -0
  154. package/src/define.ts +146 -17
  155. package/src/design-to-implementation.template.test.ts +94 -0
  156. package/src/domain-template-type.test.ts +75 -0
  157. package/src/ecosystem.yaml +27 -66
  158. package/src/enterprise-os.yaml +10 -134
  159. package/src/facecam-edit.audio-studio.test.ts +188 -0
  160. package/src/fal-generate-image.test.ts +200 -0
  161. package/src/fal-media-lab-pod-files.test.ts +180 -0
  162. package/src/finance.yaml +254 -1
  163. package/src/foundation.yaml +78 -38
  164. package/src/frame-host-modules.d.mts +6 -0
  165. package/src/frame-host-modules.mjs +58 -0
  166. package/src/generate.mjs +9 -3
  167. package/src/github-merge.test.ts +210 -0
  168. package/src/grants.yaml +46 -17
  169. package/src/hr.yaml +39 -6
  170. package/src/index.ts +36 -1
  171. package/src/intent.test.ts +161 -0
  172. package/src/internal-runbook.yaml +19 -1
  173. package/src/jev.test.ts +356 -0
  174. package/src/legal.yaml +33 -1
  175. package/src/life-os.yaml +51 -240
  176. package/src/lifecycle-coverage.test.ts +124 -0
  177. package/src/lifecycle-declarations.test.ts +252 -0
  178. package/src/lifecycle-presets.test.ts +468 -0
  179. package/src/lifecycle-presets.ts +494 -0
  180. package/src/lifecycle-stuck.test.ts +46 -0
  181. package/src/lifecycle-waits.parity.test.ts +319 -0
  182. package/src/marketing.yaml +108 -4
  183. package/src/meetings-knowledge.yaml +18 -0
  184. package/src/networking.yaml +23 -2
  185. package/src/operations.yaml +304 -4
  186. package/src/pipeline-views.template.test.ts +88 -0
  187. package/src/playbook-goal-placeholders.test.ts +57 -0
  188. package/src/postiz-contract.test.ts +134 -0
  189. package/src/presentation-declarations.test.ts +174 -0
  190. package/src/process-contract.validate.test.ts +352 -0
  191. package/src/project-management.yaml +39 -740
  192. package/src/publish-body.d.mts +29 -0
  193. package/src/publish-body.mjs +74 -0
  194. package/src/publish-body.test.ts +74 -0
  195. package/src/publish-official-lib.test.ts +176 -0
  196. package/src/replicate-rvm.test.ts +504 -0
  197. package/src/research-base.yaml +119 -20
  198. package/src/research-decision.yaml +60 -3
  199. package/src/reserved-profile-slugs.test.ts +81 -0
  200. package/src/retired-goal-kinds.test.ts +52 -0
  201. package/src/role-reference-and-step-domain.test.ts +192 -0
  202. package/src/seed-obligation.test.ts +1 -6
  203. package/src/send-message-maps.test.ts +227 -0
  204. package/src/shared-role-ssot.test.ts +40 -2
  205. package/src/ship-a-change.template.test.ts +177 -0
  206. package/src/skills.test.ts +170 -0
  207. package/src/social.yaml +85 -27
  208. package/src/space-packages.freshness.test.ts +97 -0
  209. package/src/space-packages.generated.ts +40 -0
  210. package/src/space-packages.test.ts +125 -0
  211. package/src/space-packages.ts +73 -0
  212. package/src/start.test.ts +188 -0
  213. package/src/stripe-capability.test.ts +192 -0
  214. package/src/task-intents.test.ts +293 -0
  215. package/src/template-documents.test.ts +158 -0
  216. package/src/templates.ts +20907 -21464
  217. package/src/types.ts +475 -61
  218. package/src/unipile-linkedin-find-profile.test.ts +183 -0
  219. package/src/unipile-publish-post.test.ts +162 -0
  220. package/src/validate-flow.drift.test.ts +2 -3
  221. package/src/validate-flow.ts +22 -2
  222. package/src/validate-onboarding.test.ts +59 -0
  223. package/src/validate.test.ts +71 -4
  224. package/src/validate.ts +1416 -7
  225. package/src/wire-core.ts +231 -0
  226. package/src/wire.test.ts +159 -0
  227. package/src/wire.ts +107 -0
  228. package/views/bookmark-views-pack.view.json +39 -0
  229. package/views/event-views-pack.view.json +45 -0
  230. package/views/task-views-pack.view.json +53 -0
  231. package/src/agent-fleet.yaml +0 -1645
  232. package/src/business-developer.template.test.ts +0 -351
  233. package/src/business-developer.yaml +0 -860
  234. package/src/content-studio.yaml +0 -361
  235. package/src/dev-dashboard.yaml +0 -990
  236. package/src/outreach-comms.yaml +0 -486
  237. package/src/the-arch.yaml +0 -201
@@ -0,0 +1,158 @@
1
+ /**
2
+ * Templates carry documents (`documents[]` + sidebar items
3
+ * `{kind: "document", documentSlug}`, plan 9ad4b2fc §5 lane 12). The pod
4
+ * installs them with the views (synap-backend `utils/template-documents.ts`);
5
+ * this file pins the authoring half:
6
+ *
7
+ * (1) the catalog schema accepts `documents[]` and refuses an unknown key in one;
8
+ * (2) both converters carry the documents verbatim, and a template WITHOUT
9
+ * documents compiles to a definition with no `documents` key (so every
10
+ * shipped template's body and content hash stay what they were);
11
+ * (3) `validateTemplate` refuses a bad slug, a duplicate slug, a missing
12
+ * title, an unknown scope, and a document sidebar item naming a document
13
+ * neither the template nor a base it COMPOSES onto declares (a `require`
14
+ * base keeps its own space, so its documents are not reachable);
15
+ * (4) no shipped template declares documents while the control plane's
16
+ * publish door cannot carry them (it strips `documents` and refuses a
17
+ * `kind: "document"` sidebar item): the set is derived from `src/*.yaml`.
18
+ */
19
+ import { existsSync, readFileSync } from "node:fs";
20
+ import { dirname, join } from "node:path";
21
+ import { fileURLToPath } from "node:url";
22
+ import { describe, expect, it } from "vitest";
23
+ import { workspaceSpecSchema } from "../schema/workspace.ts";
24
+ import { toPackageDefinition, toWorkspaceDefinition } from "./define.ts";
25
+ import { readYamlTemplates } from "./generate.mjs";
26
+ import type { WorkspaceYaml } from "./types.ts";
27
+ import { validateTemplate } from "./validate.ts";
28
+
29
+ const base = (overrides: Partial<WorkspaceYaml> = {}): WorkspaceYaml =>
30
+ ({
31
+ meta: {
32
+ slug: "docs-demo",
33
+ name: "Docs demo",
34
+ description: "d",
35
+ icon: "x",
36
+ color: "violet",
37
+ },
38
+ workspace: { name: "Docs demo", description: "d" },
39
+ profiles: [{ slug: "gadget", displayName: "Gadget", properties: [] }],
40
+ ...overrides,
41
+ }) as WorkspaceYaml;
42
+
43
+ const DOCS = [
44
+ {
45
+ slug: "space-home",
46
+ title: "Space home",
47
+ content: 'Welcome.\n\n::synap-cell{cellKey="lens-section"}',
48
+ scope: "space" as const,
49
+ },
50
+ { slug: "notes", title: "Notes", content: "" },
51
+ ];
52
+
53
+ const withDocs = base({
54
+ documents: DOCS,
55
+ layout: {
56
+ sidebarItems: [{ kind: "document", documentSlug: "space-home", label: "Home" }],
57
+ },
58
+ });
59
+
60
+ const rules = (tpl: WorkspaceYaml, opts = {}) =>
61
+ validateTemplate(tpl, opts).errors.map((e) => e.rule);
62
+
63
+ describe("templates carry documents", () => {
64
+ it("(1) the catalog schema accepts documents[] and refuses an unknown key in one", () => {
65
+ const { meta: _meta, ...spec } = withDocs;
66
+ expect(workspaceSpecSchema.safeParse(spec).success).toBe(true);
67
+ const bad = { ...spec, documents: [{ ...DOCS[1], body: "typo" }] };
68
+ expect(workspaceSpecSchema.safeParse(bad).success).toBe(false);
69
+ });
70
+
71
+ it("(2) both converters carry the documents; a template without any emits no key", () => {
72
+ expect(toPackageDefinition(withDocs).documents).toEqual(DOCS);
73
+ expect(toWorkspaceDefinition(withDocs).definition.documents).toEqual(DOCS);
74
+ expect(toPackageDefinition(withDocs).layoutConfig?.sidebarItems).toEqual([
75
+ { kind: "document", documentSlug: "space-home", label: "Home" },
76
+ ]);
77
+ expect("documents" in toPackageDefinition(base())).toBe(false);
78
+ expect("documents" in toWorkspaceDefinition(base()).definition).toBe(false);
79
+ });
80
+
81
+ it("(3a) a clean template with documents validates", () => {
82
+ const r = validateTemplate(withDocs, {});
83
+ expect(r, JSON.stringify(r.errors)).toEqual({ ok: true, errors: [] });
84
+ });
85
+
86
+ it("(3b) each document rule fires", () => {
87
+ expect(rules(base({ documents: [{ ...DOCS[1], slug: "Not Kebab" }] }))).toContain(
88
+ "document-slug-invalid"
89
+ );
90
+ expect(rules(base({ documents: [DOCS[1], { ...DOCS[1], title: "Again" }] }))).toContain(
91
+ "document-slug-duplicate"
92
+ );
93
+ expect(rules(base({ documents: [{ ...DOCS[1], title: " " }] }))).toContain(
94
+ "document-title-required"
95
+ );
96
+ expect(
97
+ rules(base({ documents: [{ ...DOCS[1], scope: "project" as never }] }))
98
+ ).toContain("document-scope-unknown");
99
+ expect(
100
+ rules(
101
+ base({
102
+ documents: DOCS,
103
+ layout: { sidebarItems: [{ kind: "document", documentSlug: "missing" }] },
104
+ })
105
+ )
106
+ ).toContain("sidebar-document-unknown");
107
+ expect(
108
+ rules(base({ layout: { sidebarItems: [{ kind: "document" }] } }))
109
+ ).toContain("sidebar-document-unknown");
110
+ });
111
+
112
+ it("(3c) an overlay may name a document of a base it composes onto, not of one it requires", () => {
113
+ const baseTpl = base({ documents: DOCS });
114
+ const overlay = (relation: "compose" | "require") =>
115
+ base({
116
+ meta: { ...base().meta, slug: "docs-overlay" },
117
+ dependencies: [{ slug: "docs-demo", relation }],
118
+ layout: { sidebarItems: [{ kind: "document", documentSlug: "notes" }] },
119
+ });
120
+ const resolveDep = (slug: string) => (slug === "docs-demo" ? baseTpl : undefined);
121
+ expect(rules(overlay("compose"), { resolveDep })).not.toContain(
122
+ "sidebar-document-unknown"
123
+ );
124
+ expect(rules(overlay("require"), { resolveDep })).toContain(
125
+ "sidebar-document-unknown"
126
+ );
127
+ });
128
+
129
+ it("(4) no shipped template declares documents while the CP publish door cannot carry them", () => {
130
+ const yamls = readYamlTemplates() as Array<{ file: string; data: WorkspaceYaml }>;
131
+ expect(yamls.length).toBeGreaterThanOrEqual(25);
132
+ const declaring = yamls
133
+ .filter(
134
+ ({ data }) =>
135
+ (data.documents?.length ?? 0) > 0 ||
136
+ (data.layout?.sidebarItems ?? []).some((i) => i.kind === "document")
137
+ )
138
+ .map(({ file }) => file);
139
+ if (declaring.length === 0) return;
140
+ // A template uses them: the CP's packageDefinitionSchema must slot both.
141
+ const here = dirname(fileURLToPath(import.meta.url));
142
+ const cpPackages = join(here, "../../../../synap-control-plane-api/src/routes/packages.ts");
143
+ expect(existsSync(cpPackages), `${declaring.join(", ")} declare documents; ${cpPackages} is needed to check the CP carries them`).toBe(true);
144
+ const src = readFileSync(cpPackages, "utf8");
145
+ const start = src.indexOf("export const packageDefinitionSchema = z.object(");
146
+ expect(start).toBeGreaterThan(-1);
147
+ const body = src.slice(start, src.indexOf("\n});", start));
148
+ expect(body, `${declaring.join(", ")} declare documents, which the CP publish door strips`).toMatch(/\n documents:/);
149
+ // The sidebar ITEM's kind enum is the one listing "profile" (the nested
150
+ // `surface` enum already lists "document"; it is not the item's kind).
151
+ const itemKinds = [...body.matchAll(/kind: z\.enum\(\[([^\]]*)\]\)/g)]
152
+ .map((m) => m[1]!)
153
+ .filter((list) => list.includes('"profile"'));
154
+ expect(itemKinds.length, "the CP sidebar item kind enum was not found").toBeGreaterThan(0);
155
+ for (const list of itemKinds)
156
+ expect(list, `${declaring.join(", ")} name a document sidebar item, which the CP publish door refuses`).toContain('"document"');
157
+ });
158
+ });