@synap-core/workspace-templates 0.12.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 +174 -900
- package/dist/index.js +26148 -23931
- 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/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.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 +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/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 +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 +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/task-intents.test.ts +293 -0
- package/src/templates.ts +20851 -21496
- 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 +22 -2
- package/src/validate-onboarding.test.ts +59 -0
- package/src/validate.test.ts +71 -4
- package/src/validate.ts +1335 -7
- package/src/wire-core.ts +231 -0
- package/src/wire.test.ts +159 -0
- package/src/wire.ts +107 -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
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
{
|
|
2
|
+
"apiVersion": "synap/v1",
|
|
3
|
+
"kind": "skill",
|
|
4
|
+
"meta": {
|
|
5
|
+
"slug": "video-direction",
|
|
6
|
+
"name": "Video direction",
|
|
7
|
+
"description": "Directs a short brand, launch or explainer film from brief to approved storyboard before any build: benchmark, story, concept round, treatment, style frames, sound and camera plan. Use when starting any video in the Content space.",
|
|
8
|
+
"tags": ["skill", "content", "video"],
|
|
9
|
+
"isPublic": true
|
|
10
|
+
},
|
|
11
|
+
"spec": {
|
|
12
|
+
"slug": "video-direction",
|
|
13
|
+
"name": "Video direction",
|
|
14
|
+
"kind": "instruction",
|
|
15
|
+
"scope": "pod",
|
|
16
|
+
"description": "Directs a short brand, launch or explainer film from brief to approved storyboard before any build: benchmark, story, concept round, treatment, style frames, sound and camera plan. Use when starting any video in the Content space.",
|
|
17
|
+
"body": "# Video direction\n\nDirect a short brand, launch or explainer film (20–90 s) from brief to delivery **before anything is built**. You are the director, not a tech demo: a film is judged on sound, rhythm, camera and staging, in that order; good-looking frames are the starting point. The build engine is **HyperFrames** (HTML/CSS + one paused GSAP timeline that the renderer seeks frame by frame). The look comes from the `video-style-vocabulary` skill; the checks before anyone watches come from `motion-quality-gates`.\n\n## 1. Take the brief in one message\n\n1. `synap_ask` the Content and Brand spaces first: brand kit (palette, type, logo, voice), past compositions (`content-composition`), approved assets (`content-asset`, `brand-asset`). Reuse before you invent.\n2. Ask the user **once**, in a single message, only what you cannot decide: facts and claims, names/products that must appear, their own material (voice, music, footage, screenshots), language, whether they want to approve a storyboard (default: yes for brand films).\n3. Fill every other gap with defaults and state them: 30–60 s; 1920×1080 at 30 fps (1080×1920 for social vertical); voice and subtitles in the user's language; subtitles burned in and exported as `.srt`; master at −14 LUFS.\n4. Summarise the brief in five lines and start. No second round of questions.\n\n## 2. Benchmark: learn, don't take\n\nPick one or two reference works (ads, title sequences, launch films) that set the bar for **this topic**, not the first famous one. Before imitating, **measure** each reference:\n\n- share of the runtime where the frame is still (holds, locked shots);\n- where the cuts cluster (opening burst? the reveal? the end?);\n- average and spread of shot lengths;\n- motion feel: snappy (fast in, hard stop) or smooth (long ease).\n\nWrite two lists: **learn** (pacing, composition, camera grammar, colour logic, score shape) and **don't take** (characters, designs, shots, melodies, logos, typefaces).\n\n## 3. Story\n\n- **One subject, one goal, one turn.** A person, product or idea wants something; something changes; it ends somewhere other than where it began.\n- **Hook within 3 s.** No slow logo reveal before anything happens.\n- **The ending echoes the opening**: a bookend, a scale reveal, or the same action done right the second time.\n- **One signature move at the emotional peak**: something only motion can do (a card that folds into the next scene, a number that becomes the logo). One, placed where it matters.\n- **Show the cause.** Every reaction on screen has a visible subject that causes it: a cursor clicks, a hand drops the card, a line pushes the chart. Things never just happen.\n- **Cut the extras.** One idea readable at thumbnail size beats three that need explaining.\n\n## 4. Concept round\n\nWrite **three concepts that differ in what the picture IS**, not in palette or font: e.g. (a) the product UI as the stage, (b) a single physical metaphor object, (c) pure kinetic type over sound. Two lines each, then pick one and say why. The first idea that comes to mind is usually the cliché of the format; it may win, but only against two real alternatives.\n\n## 5. Treatment (write it before any composition file)\n\nSave it to the pod as a document linked to the `content-composition`. It contains:\n\n1. **Three candidate structures** (single journey, before/after, countdown, list that turns, problem → tool → result) and the chosen one with its reason.\n2. **Logline** in one sentence, then setup → turn → ending.\n3. **Benchmark**: measured numbers, learn / don't take.\n4. **Shot list**: per shot the framing (wide / medium / close / insert), camera move (push, pull, pan, track, scale, rack), duration, and **why** it is shot that way. A shot without a reason is cut.\n5. **Beat sheet**, second by second, including the planned silences. Frame durations follow the voice, so a 45–60 s film needs written pauses or it collapses to raw VO length.\n6. **Cue map**: tempo, bar grid, and which beat every cut, key action and subtitle lands on.\n7. **Sound table**: per section, ambience bed, foley, music state.\n8. **Subtitle and title design**: brand font, size, position, safe zone, max two lines.\n\n## 6. Rhythm\n\n- **Vary shot lengths widely**: short bursts against long holds. A film at one even pace has failed.\n- **Real stillness**: at least one held frame of 2 s or more where nothing but the subject breathes.\n- **Save hard cuts for bursts**; elsewhere, motion carries the eye.\n- One action, one sound, one cut, but do not cut on every beat. Fast means fewer words per screen, never cutting before people finish reading.\n\n## 7. Camera grammar and carry\n\n- Use at least four different camera moves and real changes of framing. 2D has a camera: push, pull, parallax, scale, rack focus, frames within frames.\n- **The camera never loses the subject.** Every follow, zoom or spotlight is computed from the subject's position, never from hand-typed screen coordinates.\n- **CARRY at every section boundary**: something on screen survives and moves or scales into the next beat (the card becomes the header, the dot becomes the cursor). Swapping whole scenes reads as a slideshow.\n- At key moments the subject fills at least one third of the frame height.\n- **Product UI**: rebuild it in HTML/CSS from screenshots (real copy, brand tokens, fake data). Never use a screen recording: it is blurry when scaled, cannot be retimed, and cannot be carried.\n\n## 8. Prove the look: three style frames\n\nBuild three real frames in HyperFrames (not mock-ups): the opening, a mid-film frame, and the **signature shot**. Capture them with `npx hyperframes snapshot --at <t1>,<t2>,<t3>`. Check them against the brand kit (dark brand stays dark, brand font, AI-yellow only for AI provenance) and against `video-style-vocabulary`.\n\n## 9. Storyboard: the human gate\n\nRender 6–9 key shots tiled on one sheet, each labelled with shot number, framing, duration and the line spoken. Send it with the logline and the one thing you are least sure of. **Stop and wait for approval.** Nothing is animated in full before this gate passes.\n\n## 10. Sound is half the film\n\n- **Three layers**: ambience, foley (every visible action has a sound matched to its material) and music. Duck music under voice by roughly 10 dB.\n- **At least two real silences** before the turn or the peak; the first sound after a silence is one of the most important in the film.\n- **Sound as transition at least twice**: J-cut (next scene's sound arrives early) or L-cut (last scene's sound runs over the cut).\n- Master at **−14 LUFS integrated, true peak ≤ −1 dBTP**.\n- TTS, music and SFX through the HyperFrames `media-use` workflow; save every approved stem to the pod as `content-asset`.\n\n## 11. Common failures\n\n- Subject too small, too far, or jammed against the frame edge.\n- Low contrast, or colour on the same colour; text over a busy area.\n- Subtitles covering the subject or the key action.\n- A reveal or joke too fast to understand.\n- Blank frames inside transitions; a persistent element jumping at a seam.\n- An effect that stops tracking the subject after the camera moves.\n- The template again: the film has the same structure, opening and ending as the workflow's example.\n\n## 12. Build, draft, deliver\n\n1. Pick the HyperFrames workflow that fits: `product-launch-video`, `faceless-explainer`, `motion-graphics`, `pr-to-video`, `music-to-video`, `slideshow`, `general-video`. Math or diagram passages: render a ManimGX clip and place it as media. Generated b-roll or images: fal.ai only, saved as `content-asset`.\n2. Draft at low resolution (`npx hyperframes render --quality draft`); run `motion-quality-gates`; show the preview; render the final (`--quality delivery`) **only after acceptance**.\n3. Deliver: the MP4, a poster still, the `.srt`, the treatment, and a credits list (every third-party font, sound, image with source and licence). Upload all of them to the pod and update the `render-job` record.\n\n## 13. Copyright red lines\n\n- References teach grammar only: never copy characters, shots, melodies, logos or type designs.\n- No third-party brand names, logos, product UI or recognisable melodies in the film unless the user owns them or states they have the right. Otherwise draw fictional stand-ins.\n- Only licence-clean assets (CC0, CC BY, OFL, or user-owned), each listed in the credits.\n\n## Sources\n\nAdapted from lemo-opuscar DIRECTOR.md, AGENTS.md and TECHNIQUE.md (MIT, © 2026 LemoLab). Synap house craft from launch video #1.\n"
|
|
18
|
+
},
|
|
19
|
+
"dependencies": []
|
|
20
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
{
|
|
2
|
+
"apiVersion": "synap/v1",
|
|
3
|
+
"kind": "skill",
|
|
4
|
+
"meta": {
|
|
5
|
+
"slug": "video-style-vocabulary",
|
|
6
|
+
"name": "Video style vocabulary",
|
|
7
|
+
"description": "Pick a visual style for a video from a 43-style catalogue and write a per-film style sheet (grammar, colour roles, camera, native moves, engine) that the HyperFrames build follows. Use before scripting or building any Content OS video.",
|
|
8
|
+
"tags": ["skill", "content", "video"],
|
|
9
|
+
"isPublic": true
|
|
10
|
+
},
|
|
11
|
+
"spec": {
|
|
12
|
+
"slug": "video-style-vocabulary",
|
|
13
|
+
"name": "Video style vocabulary",
|
|
14
|
+
"kind": "instruction",
|
|
15
|
+
"scope": "pod",
|
|
16
|
+
"description": "Pick a visual style for a video from a 43-style catalogue and write a per-film style sheet (grammar, colour roles, camera, native moves, engine) that the HyperFrames build follows. Use before scripting or building any Content OS video.",
|
|
17
|
+
"body": "# Video style vocabulary\n\nPick a style for a video, then write a per-film **style sheet** the HyperFrames build follows. A style is grammar (materials, motion, camera, native moves), never a palette or a story.\n\n## 1. Choose a style\n\n1. `synap_ask` for the brand kit (Brand Library: palette, type, logo, voice) and for earlier films and approved style sheets (`content-composition` records). Reuse a sheet that fits before writing a new one.\n2. Name the content's job, then shortlist 2–3 candidates from the catalogue:\n - **Launch / feature reveal**: dark-keynote, swiss-motion, glass-product, hologram-hud, living-screencast.\n - **Explainer / how-to**: whiteboard, iso-infographic, blueprint, midcentury-toon, one-line.\n - **Data story / report**: dataviz, swiss-motion, iso-infographic, pictogram-motion.\n - **Brand story / founder film**: one-line, urban-sketch, risograph, woodcut, silkscreen-poster.\n - **Social short (≤ 30 s)**: halftone-dossier, microgame, game-show, scifi-toon.\n3. Drop any candidate whose material or motion fights the brand's voice.\n4. **The brand overrides the style's colour and type.** Map the brand palette onto the style's colour *roles* (ground, ink, accent, problem colour) and use the brand fonts for titles and captions. Keep the style's grammar.\n5. Prefer an engine-realistic style (§3). If the best fit needs 3D or plates, say so and cost it before committing.\n6. Show the user the shortlist with a recommendation; record the choice on the composition.\n\n## 2. Catalogue (43 styles)\n\nTags: **[H]** pure HyperFrames · **[H+]** HyperFrames plus a seekable texture/shader pass (canvas 2D or a WebGL fragment pass sampled from timeline time) · **[3D]** needs a seekable three.js layer, or fal.ai-generated plates composited in HyperFrames.\n\n**Hand-drawn & painting**\n- crayon-book [H+] — wax crayon on paper, picture-book — kids, gentle stories.\n- watercolor [H+] — wet washes, blooms, paper grain — nature, travel, science.\n- ink-wash [H+] — black ink, bleed, empty space — poetry, cultural brands.\n- impasto [H+] — thick oil strokes, colour spreading — music, emotional ads.\n- one-line [H] — one unbroken line drawing everything — brand stories, minimal ads.\n- whiteboard [H] — marker drawn live, board as a map — explainers, courses.\n- urban-sketch [H+] — pen line, colour washes follow the subject — cities, lifestyle.\n\n**East Asian traditions**\n- shadow-puppet [H+] — jointed leather puppets on a lit screen — myths, heritage.\n- ukiyoe [H] — woodblock flats, keylines, bokashi gradients — travel, poetry.\n- papercut-red [H] — red window-cut on light — festive greetings, folk tales.\n- paper-lantern [3D] — layered paper cuts lit from behind — festivals, gift brands.\n\n**Print & printmaking**\n- risograph [H+] — 2–3 spot inks, overprint, misregistration — indie brands, zines.\n- halftone-dossier [H] — halftone photos, case-file stamps — humour, social shorts.\n- woodcut [H+] — carved black/white, gouge marks — folk tales, craft brands.\n- engraving [H] — burin line hatching, plate tone — museum, heritage, science.\n- silkscreen-poster [H] — flat opaque inks laid one by one — destinations, events.\n\n**Graphic & type**\n- swiss-motion [H] — grid, black type, one signal colour — identity, events, design.\n- spy-titles [H] — 60s cut shapes, silhouettes, jazz cuts — openers, trailers.\n- art-deco [H] — gold geometry, sunbursts, symmetry — luxury, galas, invitations.\n- blueprint [H+] — white line drawing on Prussian blue — hardware, engineering.\n- stained-glass [H+] — leaded panes lit by moving sun — legends, holiday stories.\n- pictogram-motion [H] — geometric figures on the beat — sports, event openers.\n- ascii-crt [H+] — characters on a phosphor screen — developer tools, sci-fi.\n\n**Information & keynote**\n- dataviz [H] — real data drawn mark by mark, pinned notes — reports, journalism.\n- iso-infographic [H] — flat isometric diorama, Isotype counts — processes, supply chains.\n- dark-keynote [H] — near-black stage, UI as hero, one accent — SaaS launches.\n- living-screencast [H] — one-take product screencast with a live guide — tutorials, onboarding.\n- hologram-hud [H] — wireframe scan, lock boxes, rolling specs — spec walkthroughs.\n\n**Cartoon & anime**\n- rubber-hose [H] — 1930s bouncy limbs, pie eyes — food, retro, kids.\n- cel-anime-80s [H+] — painted cels, neon, film grain — music, nostalgia.\n- scifi-toon [H] — flat sitcom toon, portals — comedy, tech brands.\n- midcentury-toon [H] — 50s flat shapes, classroom-film voice — set-up guides, how-to.\n\n**Games**\n- pixel-rpg [H] — 16-bit sprites, dialogue boxes — recaps, nostalgia.\n- hd-2d [3D] — pixel sprites in a lit diorama — trailers, fantasy.\n- microgame [H+] — 5-second rule-games, faster and faster — onboarding, shorts.\n- game-show [H] — flat stage, beat-locked reveals, scoreboards — timelines, year in review.\n\n**Cinema & eras**\n- silent-film [H+] — grain, iris, intertitles — comedy, retro brands.\n- backrooms [3D] — liminal found footage — mystery, game teasers.\n\n**Materials & 3D** (whole group [3D])\n- brick-toy — plastic bricks, snap builds — toys, product builds.\n- paper-popup — pop-up book pages folding open — story films, kids.\n- tilt-shift — real world as a model — city promos, transport.\n- lowpoly-island — faceted iso island built tile by tile — world building, calm.\n- glass-product — one fictional glass object, strip lights — consumer tech, beauty.\n\nFor [3D] in HyperFrames: render three.js only from the seeked timeline time (no clock, no rAF loop), or generate stills/clips via fal.ai (first/last-frame endpoints for controlled moves) and save each to the pod as a `content-asset`.\n\n## 3. Write the style sheet (one per film)\n\nWrite it into the `content-composition` record. Fill all 11 headings:\n\n1. **Essence & what it is not** — 3–5 traits that make a frame read as the style; the 2–3 neighbouring styles and the line between them.\n2. **Materials & rendering** — surfaces, marks, layers, texture, light; which effects are procedural and world-anchored vs screen-space.\n3. **Colour logic** — roles mapped to brand tokens (§4).\n4. **Type & subtitles** — brand fonts by role, sizes, how captions live in the world; hold ≥ max(1.8 s, speech + 0.6 s); small text contrast ≥ 4.5:1.\n5. **Motion quality** — easing (default long-tail `power3`, no bounce), stepping (ones/twos, boil), weight, how things enter and leave, what never moves.\n6. **Camera grammar** — a table: move | what it expresses | can serve. A vocabulary, not a route. Allowed and forbidden transitions.\n7. **Sound palette** — timbres, foley of the style's matter, ambience, silence, voice character, mix at −14 LUFS with ducking.\n8. **Native moves** — the moves only this medium can do; each with \"fits content like…\" and three examples from *this* film's domain.\n9. **Pitfalls** — mistakes of the medium, each with its fix.\n10. **Engine** — [H], [H+] or [3D]; the layers (DOM, SVG, canvas, shader, three.js, fal plates, ManimGX clips) and how each is seeked.\n11. **Variation space** — three candidate structures, three openings, three endings, all different from any earlier film in this style; pick one of each and say why.\n\n## 4. Colour logic worth keeping\n\n- **One accent, reserved for the product or protagonist** (the call to action, the confirmation, the key number). Two accent-coloured things means one is wrong.\n- **A problem colour exists only while the problem exists.** After the turn it never returns.\n- **Category hues only in motion** (trails, streams), desaturated, never on static UI.\n- **In Synap the AI yellow is reserved for AI provenance** (marking what an agent made). Never use it as the brand accent, a highlight or decoration.\n\n## 5. Rules\n\n- References are **grammar only**: never copy a film's, artist's or brand's name, UI, characters, layouts, fonts, logos or melodies, and never name them in the film.\n- Do not reproduce the upstream demo films (their stories, characters, products or shots); they are examples of range, not templates.\n- A style is a starting grammar, varied per film: change structure, opening, ending and pacing every time.\n- Everything stays deterministic and seekable: GSAP `fromTo` entrances on a paused timeline, seeded randomness, no CSS keyframes, no wall-clock, no infinite repeats.\n- Save the approved sheet to the pod so the next film starts from it.\n\n## Sources\n\nStyle taxonomy, section schema and colour rules adapted from lemo-opuscar `styles/` (STYLE.md template and style index), MIT, © 2026 LemoLab.\n"
|
|
18
|
+
},
|
|
19
|
+
"dependencies": []
|
|
20
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
{
|
|
2
|
+
"apiVersion": "synap/v1",
|
|
3
|
+
"kind": "skill",
|
|
4
|
+
"meta": {
|
|
5
|
+
"slug": "video-toolbox",
|
|
6
|
+
"name": "Video toolbox",
|
|
7
|
+
"description": "Which tool does which video job (create with HyperFrames, edit footage on its transcript, math with ManimGX, generate through fal), where it renders, and which skill to load next. Read before making or editing any video.",
|
|
8
|
+
"tags": ["skill", "content", "video"],
|
|
9
|
+
"isPublic": true
|
|
10
|
+
},
|
|
11
|
+
"spec": {
|
|
12
|
+
"slug": "video-toolbox",
|
|
13
|
+
"name": "Video toolbox",
|
|
14
|
+
"kind": "instruction",
|
|
15
|
+
"scope": "pod",
|
|
16
|
+
"description": "Which tool does which video job (create with HyperFrames, edit footage on its transcript, math with ManimGX, generate through fal), where it renders, and which skill to load next. Read before making or editing any video.",
|
|
17
|
+
"body": "# Video toolbox: which tool for which job\n\nRead this before making, editing or animating ANY video. It tells you which tool does which job, where it runs, and which skill to load next. One tool per job: do not invent a second engine, do not reach for a tool marked \"not this\".\n\n## 1. First question: footage or no footage?\n- **No footage → CREATE.** The video is generated from a script, an idea, a product, data, a PR. Everything on screen is code, so it is deterministic, re-renderable and on-brand. Engine: **HyperFrames**.\n- **Real footage → EDIT.** A face camera, an interview, a screen recording, a podcast. Record → cut on the transcript → dress → render. Load `facecam-edit`.\n- Built pass by pass with the person (Produce Content's Draft): load `edit-loop` too; it holds the slots and answers every engine shares.\n- Both can mix: an edited face-cam cut can carry HyperFrames graphics; a HyperFrames film can carry generated b-roll or ManimGX clips as media layers.\n\n## 2. Job → tool\n| Job | Use | Skill to load next | Not this |\n|---|---|---|---|\n| Launch / promo / explainer / social video from a script | **HyperFrames** (HTML/CSS + one paused GSAP timeline, seeked frame by frame → MP4). Workflows: product-launch-video, faceless-explainer, motion-graphics, pr-to-video, slideshow, music-to-video, general-video | `video-direction` → `video-style-vocabulary` → build → `motion-quality-gates` | Remotion (retired: licence), closed template SaaS, a second film engine |\n| Animation inside a composition | **GSAP** (core + plugins) | — | anime.js (duplicate) |\n| GPU visuals (particles, 3D, shaders) | three.js; PixiJS only after a seekability test | `motion-quality-gates` (determinism) | anything driven by wall-clock or Math.random |\n| Math / equation / graph / algorithm / 3D-concept explainer | **ManimGX** → MP4 clip → placed in HyperFrames | `math-explainer-manimgx` | hand-animating equations in SVG |\n| Static diagram or data chart in a video | HyperFrames chart/diagram blocks, d3 | — | — |\n| Record face camera / screen | **Cap** (CLI + local MCP) | `facecam-edit` | — |\n| Cut footage by its transcript (fillers, false starts, silences) | **HyperFrames**: the cut is clips on the take in the project, shown live in HyperFrames Studio | `facecam-edit` | hosted editors, a cut baked into a file before review |\n| Captions, lower-thirds, overlays, motion graphics on footage | **HyperFrames** embedded-captions / talking-head-recut | `facecam-edit` | burning text into generated clips |\n| B-roll, AI clips, images, textures | **fal.ai** (one generation door: Veo, Kling, Flux… per call) | `collage-broll` (and its 3-gate method for any generated style) | InVideo, ArtCraft, direct vendor SDKs |\n| Voice-over, music, SFX | HyperFrames **media-use** (TTS, music and SFX catalog; local fallbacks) | — | — |\n| Carousel, LinkedIn PDF, image post (not a video) | a **layered composition** saved on the post in the pod; the person finishes it in Content Studio's Layers tab | `carousel-format`, then `edit-loop` | the carousel generator onto a whiteboard board, Open Design |\n| Deck, PDF document, presentation (not a video) | **Open Design** on the person's Mac, our worker the only writer | `open-design-edit`, then `edit-loop` | the deck generator onto a whiteboard board |\n| One long take → several videos | the Content OS process **Work a take**: the person keeps pieces, each cut with ffmpeg into its own new file (the raw take untouched), one video post each | — | overwriting or re-uploading the raw take |\n\n## 3. Reuse before you generate\nThe pod is the asset library. Before creating anything:\n1. **Brand kit:** read the Brand space (palette, type, logo, voice, approved brand-templates). Never invent a palette or font when the brand defines one; the AI colour is reserved for AI provenance.\n2. **Existing assets:** `synap_ask` for compositions, clips, stills, music and voices already approved (kinds `content-composition`, `content-asset`, `brand-asset`, `render-job`). Reuse or derive; regenerate only what does not exist.\n3. **Save back:** every approved output (MP4, stills, storyboard, the HyperFrames project, generated clips, the ManimGX scene file) goes to the pod as a content asset linked to its composition, so the next video starts from it. A finished, reusable setup (brand frame spec, fonts, voice choice) is saved as a HyperFrames recipe.\n\n## 4. Where things run\nHyperFrames and ManimGX are local command-line tools: they render on the machine where the agent runs (the user's computer or the team's Linux devbox). There is no render worker inside the pod today. Flow: build and render locally → check → upload the outputs to the pod. fal.ai runs in the cloud and is billed per call: say the cost class before generating more than a few clips.\n\n## 5. Rules that hold for every video\n- **Deterministic:** anything rendered by HyperFrames is a pure function of time: no wall-clock, no requestAnimationFrame loops, no unseeded randomness, no CSS transitions for motion, entrances via `fromTo`, no infinite repeats. A frame must render the same alone, out of order, on any machine.\n- **One engine per role:** HyperFrames composes the film; ManimGX and fal produce media it places; GSAP animates. Captions and type live in HyperFrames, never baked into a generated clip.\n- **Plan time with the voice:** frame durations follow narration, so write deliberate silences into the script.\n- **Gates before eyes:** `npx hyperframes lint` and `check` clean, contact sheet inspected, both sides of every cut checked, then one human review. Render the final only after approval.\n- **Licences:** Synap is commercial. Never pull code, prompts or text from noncommercial (PolyForm NC), copyleft (AGPL/GPL) or unlicensed sources into a Synap file; run copyleft tools only as separate processes. ManimGX's distributed binary is GPL (bundled x264): use it as a tool, never bake it into a product image without compliance.\n\n## 6. When this table does not fit\nIf a job is not listed, or a tool here cannot do it: say so, propose the closest tool, and record the gap on the pod (Ecosystem space: evaluate a candidate with the \"Evaluate tools as integration candidates\" playbook) instead of improvising a new stack.\n\n## Sources\nSynap decision \"Video toolbox: one tool per job\" (2026-10-13) and the toolbox analysis in the Ecosystem space."
|
|
18
|
+
},
|
|
19
|
+
"dependencies": []
|
|
20
|
+
}
|
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
{
|
|
2
|
+
"source": "packages/workspace-templates/src/*.yaml at app-bases 1d590b166",
|
|
3
|
+
"profiles": [
|
|
4
|
+
{
|
|
5
|
+
"template": "foundation",
|
|
6
|
+
"profile": "client",
|
|
7
|
+
"lifecycle": {
|
|
8
|
+
"property": "clientStatus",
|
|
9
|
+
"options": [
|
|
10
|
+
{
|
|
11
|
+
"key": "prospect",
|
|
12
|
+
"category": "open"
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
"key": "active",
|
|
16
|
+
"category": "active"
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
"key": "paused",
|
|
20
|
+
"category": "paused"
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
"key": "former",
|
|
24
|
+
"category": "done"
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
"key": "churned",
|
|
28
|
+
"category": "lost"
|
|
29
|
+
}
|
|
30
|
+
]
|
|
31
|
+
},
|
|
32
|
+
"property": {
|
|
33
|
+
"slug": "clientStatus",
|
|
34
|
+
"label": "Status",
|
|
35
|
+
"valueType": "string",
|
|
36
|
+
"inputType": "select",
|
|
37
|
+
"enumValues": [
|
|
38
|
+
"prospect",
|
|
39
|
+
"active",
|
|
40
|
+
"paused",
|
|
41
|
+
"former",
|
|
42
|
+
"churned"
|
|
43
|
+
]
|
|
44
|
+
}
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
"template": "brand-library",
|
|
48
|
+
"profile": "brand-color",
|
|
49
|
+
"lifecycle": {
|
|
50
|
+
"property": "color-status",
|
|
51
|
+
"options": [
|
|
52
|
+
{
|
|
53
|
+
"key": "draft",
|
|
54
|
+
"category": "open"
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
"key": "approved",
|
|
58
|
+
"category": "done"
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
"key": "deprecated",
|
|
62
|
+
"category": "lost"
|
|
63
|
+
}
|
|
64
|
+
]
|
|
65
|
+
},
|
|
66
|
+
"property": {
|
|
67
|
+
"slug": "color-status",
|
|
68
|
+
"label": "Status",
|
|
69
|
+
"valueType": "string",
|
|
70
|
+
"inputType": "select",
|
|
71
|
+
"enumValues": [
|
|
72
|
+
"draft",
|
|
73
|
+
"approved",
|
|
74
|
+
"deprecated"
|
|
75
|
+
],
|
|
76
|
+
"constraints": {
|
|
77
|
+
"defaultValue": "approved"
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
},
|
|
81
|
+
{
|
|
82
|
+
"template": "brand-library",
|
|
83
|
+
"profile": "brand-asset",
|
|
84
|
+
"lifecycle": {
|
|
85
|
+
"property": "asset-status",
|
|
86
|
+
"options": [
|
|
87
|
+
{
|
|
88
|
+
"key": "draft",
|
|
89
|
+
"category": "open"
|
|
90
|
+
},
|
|
91
|
+
{
|
|
92
|
+
"key": "approved",
|
|
93
|
+
"category": "done"
|
|
94
|
+
},
|
|
95
|
+
{
|
|
96
|
+
"key": "deprecated",
|
|
97
|
+
"category": "lost",
|
|
98
|
+
"humanOnly": true
|
|
99
|
+
}
|
|
100
|
+
]
|
|
101
|
+
},
|
|
102
|
+
"property": {
|
|
103
|
+
"slug": "asset-status",
|
|
104
|
+
"label": "Status",
|
|
105
|
+
"valueType": "string",
|
|
106
|
+
"inputType": "select",
|
|
107
|
+
"enumValues": [
|
|
108
|
+
"draft",
|
|
109
|
+
"approved",
|
|
110
|
+
"deprecated"
|
|
111
|
+
],
|
|
112
|
+
"constraints": {
|
|
113
|
+
"defaultValue": "draft"
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
},
|
|
117
|
+
{
|
|
118
|
+
"template": "brand-library",
|
|
119
|
+
"profile": "brand-reference",
|
|
120
|
+
"lifecycle": {
|
|
121
|
+
"property": "reference-status",
|
|
122
|
+
"options": [
|
|
123
|
+
{
|
|
124
|
+
"key": "draft",
|
|
125
|
+
"category": "open"
|
|
126
|
+
},
|
|
127
|
+
{
|
|
128
|
+
"key": "studied",
|
|
129
|
+
"category": "active"
|
|
130
|
+
},
|
|
131
|
+
{
|
|
132
|
+
"key": "approved",
|
|
133
|
+
"category": "done"
|
|
134
|
+
},
|
|
135
|
+
{
|
|
136
|
+
"key": "archived",
|
|
137
|
+
"category": "lost"
|
|
138
|
+
}
|
|
139
|
+
]
|
|
140
|
+
},
|
|
141
|
+
"property": {
|
|
142
|
+
"slug": "reference-status",
|
|
143
|
+
"label": "Status",
|
|
144
|
+
"valueType": "string",
|
|
145
|
+
"inputType": "select",
|
|
146
|
+
"enumValues": [
|
|
147
|
+
"draft",
|
|
148
|
+
"studied",
|
|
149
|
+
"approved",
|
|
150
|
+
"archived"
|
|
151
|
+
],
|
|
152
|
+
"constraints": {
|
|
153
|
+
"defaultValue": "draft"
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
},
|
|
157
|
+
{
|
|
158
|
+
"template": "operations",
|
|
159
|
+
"profile": "engagement",
|
|
160
|
+
"lifecycle": {
|
|
161
|
+
"property": "engagement-status",
|
|
162
|
+
"options": [
|
|
163
|
+
{
|
|
164
|
+
"key": "proposed",
|
|
165
|
+
"category": "open"
|
|
166
|
+
},
|
|
167
|
+
{
|
|
168
|
+
"key": "active",
|
|
169
|
+
"category": "active"
|
|
170
|
+
},
|
|
171
|
+
{
|
|
172
|
+
"key": "on-hold",
|
|
173
|
+
"category": "paused",
|
|
174
|
+
"humanOnly": true
|
|
175
|
+
},
|
|
176
|
+
{
|
|
177
|
+
"key": "completed",
|
|
178
|
+
"category": "done"
|
|
179
|
+
},
|
|
180
|
+
{
|
|
181
|
+
"key": "cancelled",
|
|
182
|
+
"category": "lost",
|
|
183
|
+
"humanOnly": true
|
|
184
|
+
}
|
|
185
|
+
]
|
|
186
|
+
},
|
|
187
|
+
"property": {
|
|
188
|
+
"slug": "engagement-status",
|
|
189
|
+
"label": "Status",
|
|
190
|
+
"valueType": "string",
|
|
191
|
+
"inputType": "select",
|
|
192
|
+
"enumValues": [
|
|
193
|
+
"proposed",
|
|
194
|
+
"active",
|
|
195
|
+
"on-hold",
|
|
196
|
+
"completed",
|
|
197
|
+
"cancelled"
|
|
198
|
+
],
|
|
199
|
+
"constraints": {
|
|
200
|
+
"defaultValue": "proposed"
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
]
|
|
205
|
+
}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
# AI Agency — a pack (a `suite` workspace template)
|
|
2
|
+
# =================================================
|
|
3
|
+
# Installs, in order, the domain spaces an agency runs on (each is its own
|
|
4
|
+
# space; one space per domain) and owns no data of its own (`profiles: []`).
|
|
5
|
+
# It carries only the cross-domain processes — intake ("Clarify a capture")
|
|
6
|
+
# and the weekly rhythm ("Weekly review") — which land in its primary domain,
|
|
7
|
+
# Foundation. Every domain process (Win a deal, Deliver a client engagement,
|
|
8
|
+
# Bill a client, Run a campaign, …) lives in its own domain template.
|
|
9
|
+
|
|
10
|
+
meta:
|
|
11
|
+
slug: agency-os
|
|
12
|
+
domain: company
|
|
13
|
+
name: AI Agency
|
|
14
|
+
description: Run an agency with AI doing most of the work — leads and deals, client delivery, billing, campaigns, brand and research — with a person deciding every commitment.
|
|
15
|
+
icon: briefcase
|
|
16
|
+
color: "#0F766E"
|
|
17
|
+
tags: [suite, agency, crm, operations, finance, marketing]
|
|
18
|
+
isPublic: true
|
|
19
|
+
|
|
20
|
+
dependencies:
|
|
21
|
+
- slug: foundation
|
|
22
|
+
kind: workspace
|
|
23
|
+
relation: require
|
|
24
|
+
reason: "Who the agency is, who it serves, its offers, and the pod-wide lead and client roles every other space reuses. Must resolve first; this pack's own processes land here."
|
|
25
|
+
- slug: crm
|
|
26
|
+
kind: workspace
|
|
27
|
+
relation: require
|
|
28
|
+
reason: "Contacts, companies, deals and personal LinkedIn and email outreach — where Win a deal runs."
|
|
29
|
+
- slug: operations
|
|
30
|
+
kind: workspace
|
|
31
|
+
relation: require
|
|
32
|
+
reason: "Client engagements, deliverables and contracts — where won deals are delivered."
|
|
33
|
+
- slug: finance
|
|
34
|
+
kind: workspace
|
|
35
|
+
relation: require
|
|
36
|
+
reason: "Invoices, expenses and the month-end close."
|
|
37
|
+
- slug: marketing-campaign
|
|
38
|
+
kind: workspace
|
|
39
|
+
relation: require
|
|
40
|
+
reason: "Campaigns that bring in leads. Content OS also needs it for its campaign kind."
|
|
41
|
+
- slug: brand-library
|
|
42
|
+
kind: workspace
|
|
43
|
+
relation: require
|
|
44
|
+
reason: "The approved brand every piece of content and every asset is built from. Content OS also needs it."
|
|
45
|
+
- slug: content-os
|
|
46
|
+
kind: workspace
|
|
47
|
+
relation: require
|
|
48
|
+
reason: "The content engine — Produce Content, Repurpose, Newsletter issue."
|
|
49
|
+
- slug: research-base
|
|
50
|
+
kind: workspace
|
|
51
|
+
relation: require
|
|
52
|
+
reason: "Questions, sources and findings — client and market research."
|
|
53
|
+
- slug: research-decision
|
|
54
|
+
kind: workspace
|
|
55
|
+
relation: require
|
|
56
|
+
reason: "Decisions with their options and evidence, composed onto the research space."
|
|
57
|
+
|
|
58
|
+
workspace:
|
|
59
|
+
name: AI Agency
|
|
60
|
+
description: The agency's intake and weekly rhythm, layered onto its Foundation space.
|
|
61
|
+
|
|
62
|
+
profiles: []
|
|
63
|
+
|
|
64
|
+
playbooks:
|
|
65
|
+
- name: Clarify a capture
|
|
66
|
+
description: Turn one thing you captured into what it really is — a task, a lead, a deal, a question, or a note to keep — and file it where it belongs.
|
|
67
|
+
goalTemplate: >-
|
|
68
|
+
Clarify this capture ({note}). Read it and anything it mentions in the
|
|
69
|
+
pod. Decide what it is: something to do (a task with a next action), a
|
|
70
|
+
person or company to follow up (resolve them first — never create a
|
|
71
|
+
second record for someone who exists — then attach the lead role), a
|
|
72
|
+
deal, a question to research, an idea for content (a post at Idea), or
|
|
73
|
+
reference to keep. When it is not obvious, ask the person with your
|
|
74
|
+
recommendation. File it as that kind in the space that owns it, link it
|
|
75
|
+
to the capture, and archive nothing without asking.
|
|
76
|
+
subjectProfile:
|
|
77
|
+
profileSlug: note
|
|
78
|
+
params:
|
|
79
|
+
- { name: note, type: entity, label: Capture, required: true }
|
|
80
|
+
executor: is-agent
|
|
81
|
+
status: active
|
|
82
|
+
expectedOutputs:
|
|
83
|
+
- { kind: task, label: What the capture became, relationToSubject: relates_to }
|
|
84
|
+
|
|
85
|
+
- name: Weekly review
|
|
86
|
+
description: Once a week, empty the inbox, check every open deal, engagement and invoice, and choose next week's priorities with a person.
|
|
87
|
+
goalTemplate: >-
|
|
88
|
+
Run the weekly review. COLLECT: list everything captured this week that
|
|
89
|
+
was never clarified, every question waiting on a person, and every
|
|
90
|
+
session still open. CLARIFY: propose what each unclarified capture is.
|
|
91
|
+
REVIEW: list deals with no next step, engagements with a deliverable past
|
|
92
|
+
due, invoices overdue, campaigns past their end date without a report,
|
|
93
|
+
and expenses waiting for approval — each with the one action that would
|
|
94
|
+
move it. PLAN: ask the person to `choose` next week's three priorities,
|
|
95
|
+
your recommendation first; that answer is the plan. Create a task for
|
|
96
|
+
each priority they choose.
|
|
97
|
+
executor: is-agent
|
|
98
|
+
status: active
|
|
99
|
+
schedule: { cron: "0 16 * * 5", enabled: false, mode: appointment }
|
|
100
|
+
expectedOutputs:
|
|
101
|
+
- { kind: task, label: Next week's priorities, relationToSubject: none }
|
|
102
|
+
stages:
|
|
103
|
+
- key: collect
|
|
104
|
+
name: Collect
|
|
105
|
+
category: started
|
|
106
|
+
goal: List unclarified captures, open questions waiting on a person, and open sessions.
|
|
107
|
+
- key: clarify
|
|
108
|
+
name: Clarify
|
|
109
|
+
category: started
|
|
110
|
+
goal: Propose what each unclarified capture is.
|
|
111
|
+
- key: review
|
|
112
|
+
name: Review
|
|
113
|
+
category: started
|
|
114
|
+
goal: List stuck deals, late deliverables, overdue invoices, unreported campaigns and pending expenses, each with one action.
|
|
115
|
+
criteria:
|
|
116
|
+
- key: review-every-area
|
|
117
|
+
statement: Deals, engagements, invoices, campaigns and expenses were each checked, or the review says the space is not installed.
|
|
118
|
+
check: { kind: judge }
|
|
119
|
+
- key: plan
|
|
120
|
+
name: Plan
|
|
121
|
+
category: completed
|
|
122
|
+
goal: Ask the person to choose next week's three priorities, your recommendation first; create a task for each.
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The `agent-os` skill tells agents which workspace templates to INSTALL. Every
|
|
3
|
+
* template slug its table names must exist in this bundle (the SSOT), or an
|
|
4
|
+
* agent following the skill tries to install something that is gone.
|
|
5
|
+
*
|
|
6
|
+
* Found by R7 (2026-09-27): after dev-dashboard and agent-fleet were retired,
|
|
7
|
+
* both skill copies (synap-backend + synap-cli) still listed them and still
|
|
8
|
+
* recommended "Builder + Dev Dashboard" for a product build.
|
|
9
|
+
*
|
|
10
|
+
* Reads both sibling-repo copies; a copy absent from an isolated checkout is
|
|
11
|
+
* skipped (same convention as validate-flow.drift.test.ts). Scope: the slug
|
|
12
|
+
* column of the markdown table (rows starting "| `slug`"). Not covered: prose
|
|
13
|
+
* and the "→" recommendation lines (they also name non-template slugs such as
|
|
14
|
+
* connectors and skills, so a backtick scan there is noise, measured).
|
|
15
|
+
*
|
|
16
|
+
* KNOWN_NON_TEMPLATE is a ratchet for table rows that are deliberately not
|
|
17
|
+
* template slugs; a stale entry fails.
|
|
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 { WORKSPACE_TEMPLATES } from "./templates.js";
|
|
24
|
+
|
|
25
|
+
const HERE = dirname(fileURLToPath(import.meta.url));
|
|
26
|
+
// src → workspace-templates → packages → synap-app → <repo root>
|
|
27
|
+
const ROOT = join(HERE, "../../../..");
|
|
28
|
+
const COPIES = [
|
|
29
|
+
"synap-backend/skills/agent-os/SKILL.md",
|
|
30
|
+
"synap-cli/skills/agent-os/SKILL.md",
|
|
31
|
+
];
|
|
32
|
+
|
|
33
|
+
// `personal` is the plain workspace TYPE (no template) — pre-existing row.
|
|
34
|
+
const KNOWN_NON_TEMPLATE = new Set(["personal"]);
|
|
35
|
+
|
|
36
|
+
const bundleSlugs = new Set(
|
|
37
|
+
Object.values(WORKSPACE_TEMPLATES).map((t) => t.meta.slug)
|
|
38
|
+
);
|
|
39
|
+
|
|
40
|
+
function namedSlugs(md: string): string[] {
|
|
41
|
+
return [...md.matchAll(/^\| `([a-z0-9-]+)` +\|/gm)].map((m) => m[1]);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
describe("agent-os skill names only bundled templates", () => {
|
|
45
|
+
it("self-check: the scanner sees table rows", () => {
|
|
46
|
+
const sample = "| `crm` | CRM | x |\n| `builder-workspace` | Dev | y |\n";
|
|
47
|
+
expect(namedSlugs(sample)).toEqual(["crm", "builder-workspace"]);
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
for (const rel of COPIES) {
|
|
51
|
+
const abs = join(ROOT, rel);
|
|
52
|
+
it.skipIf(!existsSync(abs))(rel, () => {
|
|
53
|
+
const named = namedSlugs(readFileSync(abs, "utf8"));
|
|
54
|
+
expect(named.length).toBeGreaterThan(8); // non-vacuity
|
|
55
|
+
const unknown = [...new Set(named)].filter(
|
|
56
|
+
(s) => !bundleSlugs.has(s) && !KNOWN_NON_TEMPLATE.has(s)
|
|
57
|
+
);
|
|
58
|
+
expect(unknown, `${rel} names templates the bundle does not ship`).toEqual([]);
|
|
59
|
+
expect(
|
|
60
|
+
[...KNOWN_NON_TEMPLATE].filter((s) => !named.includes(s)),
|
|
61
|
+
"stale KNOWN_NON_TEMPLATE entry"
|
|
62
|
+
).toEqual([]);
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
});
|