to-cms
Turn a content package into Notion Publisher row(s) with * Publish Status = Not started. You press the Notion button; this skill does not publish.
Language: skill docs English. Conversation may stay Spanish.
Skill dir: $SKILL_DIR = directory containing this SKILL.md.
Hard rules
- Write Notion only. Never call
/webhooks/publish-*, ngrok, Gumroad/Postly/Luma/Composio publish APIs. - Multi by default. One package → one page per Layer group (Products / Social / Events / Music).
- Refuse unclear packages without
cms:frontmatter, producercms:contract, or strong heuristics — tell user to add the contract (seereferences/channel-contract.md). - Live writes need notion-publisher repo env (
NOTION_TOKEN,NOTION_DATABASE_ID→ Publisher).
Inputs
| Input | Role |
|---|---|
Path to .md or folder with package.md |
Content package |
Optional --sources=Gumroad,Postly |
Force Source Tags (override) |
Optional --channels=Reddit |
Force Channels |
Optional --live |
Create Notion pages (default = dry-run resolve only) |
| Calling producer skill | Its cms: block feeds the resolver |
Resolver priority (union for targets)
- User explicit override (
--sources=/ “solo Gumroad”) - Package frontmatter
cms: - Calling producer skill
cms:(frontmatter of that skill) - Heuristics on headings/filenames — see
references/channel-contract.md
Workflow
1. Load
Read the package. Parse YAML frontmatter + # sections. If folder: prefer package.md, keep sibling asset paths for the checklist.
2. Resolve
Run:
node "$SKILL_DIR/scripts/resolve-channels.mjs" --package="<path>"
# optional: --sources=Gumroad,Postly --channels=Reddit --producer-skill="<path/to/SKILL.md>"
Expect JSON: { layers, sources, channels, pages[], missing[], buttons[] }.
If missing blocks minimum (title + at least one Layer + one Source Tag) → stop and ask for contract/fields.
3. Map fields
Map body sections → Publisher props using references/property-map.md (pointer to notion-publisher SSOT). Do not invent stub-channel props.
4. Dry-run vs live
Default (no --live): print resolved pages + missing checklist + which Notion buttons apply. Stop.
--live: from a checkout of notion-publisher (Nucleo-Lab / this vault workspace gumroad-published):
npm run to-cms -- --package="<absolute-path>" [--sources=...] [--channels=...]
Script creates page(s), prints Notion URLs + button list. Still never publishes.
5. Done output
Always return:
- Notion page URL(s) (or dry-run payload)
- Checklist of missing recommended fields
- Buttons to press (
Publish in Gumroad,Publish in Social,Publish in Composio, …) - Explicit: “publish = Notion button;
/to-cmsdoes not publish”
Companions
references/channel-contract.md— producer + packagecms:schemareferences/property-map.md— where the Notion prop SSOT livesscripts/resolve-channels.mjs— deterministic resolver + fixture checkfixtures/sample-package.md— Products+Social multi sample
Adoption (producer skills)
Any vault skill that emits Publisher-bound packages must declare a cms: block (frontmatter or ## CMS channels). Document only in this slice — no mass-edit of all F100K skills.