@synap-core/workspace-templates 0.11.0 → 0.23.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 +483 -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 +420 -0
- package/capabilities/telegram-bridge.capability.json +56 -0
- package/capabilities/treg.capability.json +102 -0
- package/capabilities/unipile-linkedin.capability.json +471 -0
- package/capabilities/vercel.capability.json +424 -0
- package/dist/define-CPS0n8BV.d.ts +1331 -0
- package/dist/index.d.ts +189 -900
- package/dist/index.js +24654 -21639
- 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 +41 -27
- package/packs/bookmark-views-pack.json +33 -0
- package/packs/crm-pack.json +76 -0
- package/packs/customer-profile.json +28 -0
- package/packs/deep-research.playbook.json +30 -0
- package/packs/event-views-pack.json +33 -0
- package/packs/habit-profile.json +27 -0
- package/packs/hr-pack.json +54 -0
- package/packs/invoice-profile.json +28 -0
- package/packs/knowledge-base-pack.json +56 -0
- package/packs/meeting-profile.json +29 -0
- package/packs/product-profile.json +30 -0
- package/packs/project-management-pack.json +49 -0
- package/packs/recipe-profile.json +29 -0
- package/packs/task-views-pack.json +39 -0
- 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 +99 -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 +135 -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.template.test.ts +25 -19
- package/src/base.yaml +95 -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 +798 -92
- 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 +598 -0
- package/src/catalog-safety.test.ts +198 -0
- package/src/catalog.template-items.test.ts +75 -0
- package/src/catalog.ts +85 -2
- package/src/civic-france.yaml +102 -0
- 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 +322 -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 +1830 -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 +164 -0
- package/src/crm-one-send-door.template.test.ts +65 -0
- package/src/crm.yaml +1456 -181
- package/src/decisions-wave.template.test.ts +186 -0
- package/src/define.ts +130 -17
- package/src/design-to-implementation.template.test.ts +94 -0
- package/src/dist-freshness.test.ts +97 -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 +130 -28
- 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 +57 -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 +65 -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 +83 -0
- package/src/retired-goal-kinds.test.ts +58 -0
- package/src/role-reference-and-step-domain.test.ts +192 -0
- package/src/seed-obligation.test.ts +176 -0
- package/src/send-message-maps.test.ts +227 -0
- package/src/shared-role-ssot.test.ts +42 -1
- 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/task-intents.test.ts +293 -0
- package/src/templates.ts +21639 -21522
- package/src/types.ts +443 -60
- package/src/unipile-publish-post.test.ts +162 -0
- package/src/validate-flow.drift.test.ts +2 -3
- package/src/validate-flow.ts +32 -2
- package/src/validate-onboarding.test.ts +59 -0
- package/src/validate.test.ts +156 -3
- package/src/validate.ts +1384 -7
- package/src/wire-core.ts +231 -0
- package/src/wire.test.ts +159 -0
- package/src/wire.ts +107 -0
- package/src/__fixtures__/report-automation-flow.json +0 -393
- 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
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* "One take, several videos" (founder decisions D1, D2, D3, 29 Oct), as
|
|
3
|
+
* catalog config, read from the YAML SOURCE so an edit is seen without a
|
|
4
|
+
* rebuild.
|
|
5
|
+
*
|
|
6
|
+
* - D1: a take is a Content OS content-asset of Kind `recording`, holding
|
|
7
|
+
* its facts; its `file-id` is the raw take.
|
|
8
|
+
* - D2: a piece is a NEW video file cut from the take, recorded as the same
|
|
9
|
+
* Kind with `source-take`, `source-start` and `source-end`. The raw take
|
|
10
|
+
* is never overwritten; a re-cut is a new file, the old one kept.
|
|
11
|
+
* - D3: the process "Work a take" transcribes, finds the pieces, asks the
|
|
12
|
+
* person which to keep, cuts the kept ones and makes one post per piece.
|
|
13
|
+
*
|
|
14
|
+
* Content Studio and the other lanes read these exact keys, so they are pinned.
|
|
15
|
+
*/
|
|
16
|
+
import { readFileSync } from "fs";
|
|
17
|
+
import { dirname, join } from "path";
|
|
18
|
+
import { fileURLToPath } from "url";
|
|
19
|
+
import { load } from "js-yaml";
|
|
20
|
+
import { describe, expect, it } from "vitest";
|
|
21
|
+
import type { TemplatePlaybook, WorkspaceYaml } from "./types.js";
|
|
22
|
+
|
|
23
|
+
const source = load(
|
|
24
|
+
readFileSync(join(dirname(fileURLToPath(import.meta.url)), "content-os.yaml"), "utf8"),
|
|
25
|
+
) as WorkspaceYaml;
|
|
26
|
+
const asset = source.profiles.find((p) => p.slug === "content-asset");
|
|
27
|
+
const prop = (slug: string) => asset?.properties.find((d) => d.slug === slug);
|
|
28
|
+
const work = (source.playbooks ?? []).find((p) => p.name === "Work a take") as TemplatePlaybook | undefined;
|
|
29
|
+
const goalOf = (key: string) => (work?.stages?.find((s) => s.key === key)?.goal ?? "").replace(/\s+/g, " ");
|
|
30
|
+
|
|
31
|
+
/** The ONE transcript shape (D6 of 27 Oct), as every process that writes one states it. */
|
|
32
|
+
const TRANSCRIPT_SHAPE = '[{"text","start","end"}]';
|
|
33
|
+
|
|
34
|
+
describe("a take and a piece are content-assets of Kind recording", () => {
|
|
35
|
+
it("adds recording to the asset kinds, keeping every earlier value", () => {
|
|
36
|
+
expect(prop("asset-kind")?.enumValues).toEqual(["image", "video", "audio", "font", "script", "recording", "other"]);
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
it("declares the recording facts with their types", () => {
|
|
40
|
+
for (const slug of ["duration-seconds", "frame-width", "frame-height", "frame-rate", "source-start", "source-end"]) {
|
|
41
|
+
expect({ slug, valueType: prop(slug)?.valueType }).toEqual({ slug, valueType: "number" });
|
|
42
|
+
}
|
|
43
|
+
for (const slug of ["poster-file-id", "take-topic", "take-look", "piece-hook"]) {
|
|
44
|
+
expect({ slug, valueType: prop(slug)?.valueType }).toEqual({ slug, valueType: "string" });
|
|
45
|
+
}
|
|
46
|
+
expect(prop("recorded-at")?.valueType).toBe("date");
|
|
47
|
+
expect(prop("take-kind")?.enumValues).toEqual(["answer", "free"]);
|
|
48
|
+
expect(prop("piece-format")?.enumValues).toEqual(["Short Video", "Long Video"]);
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
it("gives a piece its lineage: the take it was cut from, and its earlier cuts", () => {
|
|
52
|
+
expect(prop("source-take")).toMatchObject({ valueType: "entity_id", targetProfileSlug: "content-asset" });
|
|
53
|
+
expect(prop("earlier-file-ids")?.valueType).toBe("array");
|
|
54
|
+
});
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
describe("Work a take finds the pieces in a take and makes them new files", () => {
|
|
58
|
+
it("is a process on the take, with no status of its own", () => {
|
|
59
|
+
expect(work?.subjectProfile).toEqual({ profileSlug: "content-asset" });
|
|
60
|
+
expect(work?.params).toEqual([{ name: "take", type: "entity", label: "Take", required: true }]);
|
|
61
|
+
expect(work?.executor).toBe("is-agent");
|
|
62
|
+
expect(work?.stages?.map((s) => s.key)).toEqual(["transcribe", "analyse", "keep", "cut", "posts"]);
|
|
63
|
+
for (const stage of work?.stages ?? []) {
|
|
64
|
+
expect({ stage: stage.key, subjectStatus: stage.subjectStatus }).toEqual({ stage: stage.key, subjectStatus: undefined });
|
|
65
|
+
}
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
it("asks the person about each piece on a slot, never through a stage gate or a stage-level slot", () => {
|
|
69
|
+
for (const stage of work?.stages ?? []) {
|
|
70
|
+
expect({ stage: stage.key, gate: stage.gate }).toEqual({ stage: stage.key, gate: undefined });
|
|
71
|
+
}
|
|
72
|
+
const declared = JSON.stringify([...(work?.expectedOutputs ?? []), ...(work?.stages ?? []).flatMap((s) => s.expectedOutputs ?? [])]);
|
|
73
|
+
for (const key of ["keep-piece-", "piece-<n>", "post-<n>"]) expect(declared).not.toContain(key);
|
|
74
|
+
const analyse = goalOf("analyse");
|
|
75
|
+
for (const part of [
|
|
76
|
+
"key keep-piece-<n>; kind decision; owner human; blockedReason decision",
|
|
77
|
+
"ask choose with allowOther, options Keep (recommended when it stands alone and fits its format), Drop, and Adjust",
|
|
78
|
+
"<start>-<end> in seconds",
|
|
79
|
+
]) {
|
|
80
|
+
expect(analyse).toContain(part);
|
|
81
|
+
}
|
|
82
|
+
expect(goalOf("keep")).toContain("a piece the person dropped is never cut");
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
it("transcribes into the ONE transcript shape and writes ONE analysis with a pieces block", () => {
|
|
86
|
+
const transcribe = goalOf("transcribe");
|
|
87
|
+
expect(transcribe).toContain("ONE content-asset, Kind script, whose File ID is the take's file");
|
|
88
|
+
expect(transcribe).toContain(TRANSCRIPT_SHAPE);
|
|
89
|
+
expect(transcribe).toContain("Never transcribe twice, never a separate document");
|
|
90
|
+
expect(goalOf("analyse")).toContain('"## Pieces" heading followed by exactly one ```json fenced block [{"n","start","end","title","hook","format","why"}]');
|
|
91
|
+
expect(work?.stages?.find((s) => s.key === "analyse")?.expectedOutputs).toEqual([
|
|
92
|
+
{ kind: "document", label: "Analysis", relationToSubject: "references" },
|
|
93
|
+
]);
|
|
94
|
+
});
|
|
95
|
+
|
|
96
|
+
it("cuts each kept piece into a NEW file with ffmpeg and never touches the raw take", () => {
|
|
97
|
+
const cut = goalOf("cut");
|
|
98
|
+
for (const part of [
|
|
99
|
+
"Declare its slot as yours first (an outcome, key piece-<n>, kind content-asset, no owner, no ask)",
|
|
100
|
+
"from the raw take into a NEW file",
|
|
101
|
+
"~/synap-work/<this run's session id>/pieces/<n>.mp4",
|
|
102
|
+
"ffmpeg -ss <start> -to <end> -i <raw take>",
|
|
103
|
+
"Kind recording",
|
|
104
|
+
"source-take the take, source-start and source-end",
|
|
105
|
+
"append the old file id to earlier-file-ids; never delete or overwrite a file",
|
|
106
|
+
]) {
|
|
107
|
+
expect(cut).toContain(part);
|
|
108
|
+
}
|
|
109
|
+
// The piece gets its own transcript in the same shape, so Produce Content finds it by its file.
|
|
110
|
+
expect(cut).toContain("its own transcript in the same ONE shape (File ID = the piece's file)");
|
|
111
|
+
expect((work?.goalTemplate ?? "").replace(/\s+/g, " ")).toContain("The raw take is never overwritten");
|
|
112
|
+
});
|
|
113
|
+
|
|
114
|
+
it("makes one video post at Idea per piece and starts nothing unasked", () => {
|
|
115
|
+
const posts = goalOf("posts");
|
|
116
|
+
expect(posts).toContain("Make one video post per cut piece, at Idea");
|
|
117
|
+
expect(posts).toContain("linked to the piece with a references relation");
|
|
118
|
+
expect(posts).toContain("key post-<n>, kind post");
|
|
119
|
+
expect(posts).toContain("Start Produce Content for a post only if the person asks");
|
|
120
|
+
});
|
|
121
|
+
|
|
122
|
+
it("links ideas from the take back to it", () => {
|
|
123
|
+
expect(goalOf("analyse")).toContain("propose each as a post at Idea that quotes the person's sentence and links to the take with a references relation");
|
|
124
|
+
});
|
|
125
|
+
});
|