@easysociable/cli 0.1.2 → 0.1.4
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 +32 -21
- package/{skills/easysociable-content → content-engine}/scripts/starter.mjs +3 -1
- package/{skills/easysociable-content → content-engine}/scripts/workbench.mjs +13 -8
- package/{skills/easysociable-content → content-engine}/starter/CLAUDE.md +217 -128
- package/{skills/easysociable-content → content-engine}/starter/engine.json +3 -0
- package/content-engine/starter/needs/README.md +38 -0
- package/content-engine/starter/needs/_index.md +31 -0
- package/content-engine/starter/needs/_template.md +24 -0
- package/content-engine/starter/needs/entries/README.md +5 -0
- package/content-engine/starter/products/README.md +38 -0
- package/content-engine/starter/products/_index.md +24 -0
- package/content-engine/starter/products/_template.md +56 -0
- package/content-engine/starter/products/entries/P-001-easysociable.md +150 -0
- package/content-engine/starter/profiles/_index.md +16 -0
- package/{skills/easysociable-content → content-engine}/starter/profiles/default/README.md +4 -1
- package/content-engine/starter/profiles/default/boundaries.md +14 -0
- package/content-engine/starter/profiles/default/expression.md +18 -0
- package/content-engine/starter/profiles/default/lanes.md +12 -0
- package/content-engine/starter/profiles/default/stories.md +15 -0
- package/{skills/easysociable-content → content-engine}/starter/profiles/default/voice.md +14 -0
- package/content-engine/starter/recommendations/README.md +21 -0
- package/content-engine/starter/recommendations/_index.md +21 -0
- package/content-engine/starter/recommendations/_template.md +44 -0
- package/{skills/easysociable-content → content-engine}/starter/runs/_template/brief.md +1 -1
- package/{skills/easysociable-content → content-engine}/starter/runs/_template/pack.md +15 -7
- package/{skills/easysociable-content → content-engine}/starter/runs/_template/packet.md +6 -0
- package/{skills/easysociable-content → content-engine}/starter/swipe/_template.md +3 -1
- package/content-engine/starter/topics/README.md +21 -0
- package/{skills/easysociable-content → content-engine}/starter/topics/_index.md +12 -5
- package/content-engine/starter/topics/_template-item.md +103 -0
- package/{skills/easysociable-content → content-engine}/starter/topics/scoring.md +55 -4
- package/content-engine/workbench/__pycache__/build.cpython-310.pyc +0 -0
- package/{skills/easysociable-content → content-engine}/workbench/build.py +306 -97
- package/{skills/easysociable-content → content-engine}/workbench/serve.py +0 -0
- package/{skills/easysociable-content → content-engine}/workbench/template.html +173 -27
- package/dist/easysociable.js +629 -142
- package/dist/easysociable.js.map +1 -1
- package/package.json +15 -15
- package/skills/ONBOARDING.md +21 -18
- package/skills/easysociable-content/SKILL.md +104 -98
- package/skills/easysociable-content/workflows/INTERVIEW.md +70 -0
- package/skills/easysociable-content/workflows/NEEDS.md +82 -0
- package/skills/easysociable-slideshow/SKILL.md +79 -44
- package/skills/easysociable-slideshow/references/ARC.md +44 -0
- package/skills/easysociable-slideshow/references/CONTENT_PACK.md +34 -6
- package/skills/easysociable-slideshow/workflows/CREATE_RUN.md +24 -5
- package/skills/easysociable-slideshow/workflows/OUT_OF_SCOPE.md +3 -0
- package/skills/easysociable-template/SKILL.md +29 -30
- package/skills/easysociable-template/references/CATALOG_METADATA.md +23 -20
- package/skills/easysociable-template/references/DESIGN_V2_1.md +53 -2
- package/skills/easysociable-template/references/GATEWAY.md +7 -2
- package/skills/easysociable-template/references/PLATFORM_SPECS.md +11 -3
- package/skills/easysociable-template/references/THEME_TOKENS.md +1 -1
- package/skills/easysociable-template/references/fixtures/image-reference.design-plan.json +74 -0
- package/skills/easysociable-template/references/fixtures/image-reference.visual-qa.json +28 -0
- package/skills/easysociable-template/scripts/generate-theme-from-hex.mjs +0 -0
- package/skills/easysociable-template/scripts/validate-design-v2.mjs +97 -0
- package/skills/easysociable-template/workflows/ASSET_PLAN.md +2 -1
- package/skills/easysociable-template/workflows/AUTHORING_FROM_BRIEF.md +4 -4
- package/skills/easysociable-template/workflows/AUTHORING_FROM_IMAGE.md +66 -16
- package/skills/easysociable-template/workflows/AUTHORING_STUDIO.md +28 -15
- package/skills/easysociable-template/workflows/DESIGN_BRIEF.md +4 -3
- package/skills/easysociable-template/workflows/FILL_AND_RENDER.md +4 -83
- package/skills/easysociable-template/workflows/MULTI_PLATFORM_FAMILY.md +81 -0
- package/skills/easysociable-template/workflows/OUT_OF_SCOPE.md +3 -2
- package/skills/easysociable-template/workflows/PUBLISH_FROM_DRAFT.md +1 -1
- package/skills/easysociable-template/workflows/VISUAL_QA.md +10 -0
- package/skills/easysociable-content/INSTALL.md +0 -60
- package/skills/easysociable-content/platforms/claude.md +0 -4
- package/skills/easysociable-content/platforms/codex.md +0 -4
- package/skills/easysociable-content/platforms/hermes.md +0 -4
- package/skills/easysociable-content/platforms/openclaw.md +0 -4
- package/skills/easysociable-content/references/CLI.md +0 -40
- package/skills/easysociable-content/references/CONTRACT_SYNC.md +0 -42
- package/skills/easysociable-content/references/MCP.md +0 -15
- package/skills/easysociable-content/references/PAGE_PACK.md +0 -129
- package/skills/easysociable-content/references/PLATFORM_GUIDE.md +0 -36
- package/skills/easysociable-content/references/RUN_LAYOUT.md +0 -73
- package/skills/easysociable-content/references/TROUBLESHOOTING.md +0 -13
- package/skills/easysociable-content/references/VAULT.md +0 -40
- package/skills/easysociable-content/references/VOICE.md +0 -16
- package/skills/easysociable-content/scripts/package-skill.mjs +0 -49
- package/skills/easysociable-content/scripts/setup.mjs +0 -200
- package/skills/easysociable-content/scripts/setup.test.mjs +0 -82
- package/skills/easysociable-content/starter/discovery/README.md +0 -18
- package/skills/easysociable-content/starter/discovery/_index.md +0 -27
- package/skills/easysociable-content/starter/discovery/_template.md +0 -41
- package/skills/easysociable-content/starter/profiles/_index.md +0 -13
- package/skills/easysociable-content/starter/topics/README.md +0 -25
- package/skills/easysociable-content/starter/topics/WATCHLIST.md +0 -65
- package/skills/easysociable-content/starter/topics/_template-item.md +0 -90
- package/skills/easysociable-content/starter/topics/watchlists/README.md +0 -10
- package/skills/easysociable-content/starter/topics/watchlists/_shared.md +0 -14
- package/skills/easysociable-content/starter/topics/watchlists/default.md +0 -6
- package/skills/easysociable-content/workflows/ANALYSIS_AND_COVERAGE.md +0 -17
- package/skills/easysociable-content/workflows/CONTENT_EXPORT.md +0 -24
- package/skills/easysociable-content/workflows/GETTING_STARTED.md +0 -40
- package/skills/easysociable-content/workflows/MCP_FIRST.md +0 -5
- package/skills/easysociable-content/workflows/OUT_OF_SCOPE.md +0 -18
- package/skills/easysociable-content/workflows/PACK_AUTHORING.md +0 -42
- package/skills/easysociable-content/workflows/SWIPE_CAPTURE.md +0 -18
- package/skills/easysociable-content/workflows/TOPIC_DRAFT.md +0 -29
- package/skills/easysociable-content/workflows/WORKING_DRAFT.md +0 -19
- /package/{skills/easysociable-content → content-engine}/fixtures/golden-run-en/draft.md +0 -0
- /package/{skills/easysociable-content → content-engine}/fixtures/golden-run-en/idea.md +0 -0
- /package/{skills/easysociable-content → content-engine}/fixtures/golden-run-en/pack-tiktok.json +0 -0
- /package/{skills/easysociable-content → content-engine}/scripts/contracts.mjs +0 -0
- /package/{skills/easysociable-content → content-engine}/scripts/export-contracts.mjs +0 -0
- /package/{skills/easysociable-content → content-engine}/scripts/fixture.test.mjs +0 -0
- /package/{skills/easysociable-content → content-engine}/scripts/validate-export.mjs +0 -0
- /package/{skills/easysociable-content → content-engine}/scripts/validate-pack.mjs +0 -0
- /package/{skills/easysociable-content → content-engine}/scripts/validate-run.mjs +0 -0
- /package/{skills/easysociable-content → content-engine}/scripts/validate.test.mjs +0 -0
- /package/{skills/easysociable-content → content-engine}/starter/accounts/README.md +0 -0
- /package/{skills/easysociable-content → content-engine}/starter/accounts/_index.md +0 -0
- /package/{skills/easysociable-content → content-engine}/starter/accounts/overrides/README.md +0 -0
- /package/{skills/easysociable-content → content-engine}/starter/exports/README.md +0 -0
- /package/{skills/easysociable-content → content-engine}/starter/inbox/README.md +0 -0
- /package/{skills/easysociable-content → content-engine}/starter/inbox/_index.md +0 -0
- /package/{skills/easysociable-content → content-engine}/starter/inbox/entries/README.md +0 -0
- /package/{skills/easysociable-content → content-engine}/starter/platforms/README.md +0 -0
- /package/{skills/easysociable-content → content-engine}/starter/platforms/ig.md +0 -0
- /package/{skills/easysociable-content → content-engine}/starter/platforms/instagram.md +0 -0
- /package/{skills/easysociable-content → content-engine}/starter/platforms/linkedin.md +0 -0
- /package/{skills/easysociable-content → content-engine}/starter/platforms/threads.md +0 -0
- /package/{skills/easysociable-content → content-engine}/starter/platforms/tiktok.md +0 -0
- /package/{skills/easysociable-content → content-engine}/starter/platforms/x.md +0 -0
- /package/{skills/easysociable-content → content-engine}/starter/platforms/xiaohongshu.md +0 -0
- /package/{skills/easysociable-content → content-engine}/starter/profiles/default/audience.md +0 -0
- /package/{skills/easysociable-content → content-engine}/starter/profiles/default/pillars.md +0 -0
- /package/{skills/easysociable-content → content-engine}/starter/published/_index.md +0 -0
- /package/{skills/easysociable-content → content-engine}/starter/raw/README.md +0 -0
- /package/{skills/easysociable-content → content-engine}/starter/raw/_index.md +0 -0
- /package/{skills/easysociable-content → content-engine}/starter/runs/README.md +0 -0
- /package/{skills/easysociable-content → content-engine}/starter/runs/_index.md +0 -0
- /package/{skills/easysociable-content → content-engine}/starter/runs/_template/draft.md +0 -0
- /package/{skills/easysociable-content → content-engine}/starter/runs/_template/editor.md +0 -0
- /package/{skills/easysociable-content → content-engine}/starter/runs/_template/feedback.md +0 -0
- /package/{skills/easysociable-content → content-engine}/starter/runs/_template/idea.md +0 -0
- /package/{skills/easysociable-content → content-engine}/starter/runs/_template/rubric.md +0 -0
- /package/{skills/easysociable-content → content-engine}/starter/swipe/_index.md +0 -0
- /package/{skills/easysociable-content → content-engine}/starter/topics/items/README.md +0 -0
- /package/{skills/easysociable-content → content-engine}/starter/wiki/README.md +0 -0
- /package/{skills/easysociable-content → content-engine}/starter/wiki/atoms/_index.md +0 -0
- /package/{skills/easysociable-content → content-engine}/starter/wiki/atoms/_template.md +0 -0
- /package/{skills/easysociable-content → content-engine}/starter/wiki/claims/_index.md +0 -0
- /package/{skills/easysociable-content → content-engine}/starter/wiki/claims/_template.md +0 -0
- /package/{skills/easysociable-content → content-engine}/starter/workbench/README.md +0 -0
|
@@ -1,86 +1,7 @@
|
|
|
1
|
-
# Fill slots and Hosted Render
|
|
1
|
+
# Fill slots and Hosted Render — RETIRED
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
**Retired as a paid delivery path (2026-09-04).** PNG packs come from Slideshow **Studio Download** (browser ZIP). Gateway `POST /v1/renders`, CLI `renders create|export`, and MCP `create_render_job` return `HEADLESS_RENDER_DISABLED`.
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
Do not invoke fill-slots render for customer output. Author templates with this skill; consume carousels with Slideshow Skill → Studio → Download.
|
|
6
6
|
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
```bash
|
|
10
|
-
easysociable auth status --json
|
|
11
|
-
```
|
|
12
|
-
|
|
13
|
-
Prefer Template MCP tools when available; CLI is the fallback.
|
|
14
|
-
|
|
15
|
-
## Steps
|
|
16
|
-
|
|
17
|
-
### 1. Get template + public slots
|
|
18
|
-
|
|
19
|
-
**MCP:** `get_template({ templateId })`
|
|
20
|
-
**CLI:** `easysociable templates get --id <id> --json`
|
|
21
|
-
|
|
22
|
-
Response MUST include `slots[]` with `key`, `type`, `required`, optional `maxCharacters` / `overflow` / `aiHint` / `label`.
|
|
23
|
-
MUST NOT include AST, Binding Map, or RenderPlan.
|
|
24
|
-
|
|
25
|
-
### 2. Fill slots
|
|
26
|
-
|
|
27
|
-
| Slot type | Agent action |
|
|
28
|
-
|---|---|
|
|
29
|
-
| `text` / `number` | Generate from user brief; respect `maxCharacters` / required |
|
|
30
|
-
| `image` | Ask user: upload or choose an existing account image. After confirmation, use `import_template_image` / the unified image import flow so the bytes are stored through Gateway → R2 and the metadata is recorded in the existing Directus `Image` collection; put the returned **`imageId`** in the slot. Never pass temporary Unsplash/Pexels/Pinterest URLs, local paths or transient asset IDs as authority. |
|
|
31
|
-
|
|
32
|
-
Omit optional empty slots (`null` / `''`) rather than inventing filler.
|
|
33
|
-
|
|
34
|
-
All V1 image uploads use the account image import flow. There is no separate
|
|
35
|
-
transient render-asset command.
|
|
36
|
-
|
|
37
|
-
### 3. Create Hosted Render Job
|
|
38
|
-
|
|
39
|
-
**MCP:** `create_render_job({ templateId, slots, outputFormats, idempotencyKey? })`
|
|
40
|
-
**CLI:**
|
|
41
|
-
|
|
42
|
-
```bash
|
|
43
|
-
easysociable renders create \
|
|
44
|
-
--template-id <id> \
|
|
45
|
-
--slots '{"title":"Hello","caption":"World"}' \
|
|
46
|
-
--format png \
|
|
47
|
-
--idempotency-key fill_1 \
|
|
48
|
-
--json
|
|
49
|
-
```
|
|
50
|
-
|
|
51
|
-
**Forbidden inputs:** `ContentDocument`, `contentDocumentHash`, client `RenderPlan`, AST, Binding Map.
|
|
52
|
-
|
|
53
|
-
### 4. Poll Job / Manifest
|
|
54
|
-
|
|
55
|
-
**MCP:** `get_render_job({ jobId })` → when completed, `get_render_manifest` if needed
|
|
56
|
-
**CLI:** `easysociable renders wait --id <id> --json`
|
|
57
|
-
|
|
58
|
-
Success: signed Artifact URL(s) on the public Manifest.
|
|
59
|
-
Job may also return `previewUrl` + `capture` (signed Studio-parity page). Deliver the **Hosted Artifact**, not a local screenshot of that preview URL.
|
|
60
|
-
|
|
61
|
-
### 5. Hosted Capture failure
|
|
62
|
-
|
|
63
|
-
V1 does not expose a second local capture command. If Hosted Capture fails,
|
|
64
|
-
surface the Gateway error and retry only when it is marked retryable; do not
|
|
65
|
-
invent a browser URL, selector or viewport and do not treat an Authoring Studio
|
|
66
|
-
screenshot as a billable final Artifact.
|
|
67
|
-
|
|
68
|
-
#### Error-code table
|
|
69
|
-
|
|
70
|
-
| Code / signal | Local capture? | Agent action |
|
|
71
|
-
|---|---|---|
|
|
72
|
-
| Job `completed` + Manifest Artifact | No | Deliver signed Artifact URL(s) |
|
|
73
|
-
| Retryable worker/queue/5xx error | No | Retry Hosted with the same idempotency key |
|
|
74
|
-
| Rate limit | No | Respect retry-after/backoff and retry once if allowed |
|
|
75
|
-
| `VALIDATION_ERROR` / missing required slots | **No** | Fix slots; no fallback expected |
|
|
76
|
-
| Auth / entitlement / tier denied | **No** | Fix credentials/plan; no fallback |
|
|
77
|
-
Failed jobs without a retryable error are surfaced to the user; no freestyle
|
|
78
|
-
browser screenshot is accepted as final output.
|
|
79
|
-
|
|
80
|
-
## Anti-patterns
|
|
81
|
-
|
|
82
|
-
- Building or submitting a local RenderPlan / AST / Binding Map
|
|
83
|
-
- Using ContentDocument export as a render prerequisite
|
|
84
|
-
- Treating Studio html-to-image as Hosted delivery or as the default on success
|
|
85
|
-
- Local capture when Hosted succeeded or when `fallback.capture` is absent
|
|
86
|
-
- Calling Content MCP/CLI for this single-page fill-slots flow
|
|
7
|
+
Public `slots[]` on a published template remain a catalog contract. They are not a PNG API.
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
# Multi-platform Layout Family (default create path)
|
|
2
|
+
|
|
3
|
+
**SoT for creating templates that ship on several platforms at once.**
|
|
4
|
+
One user-facing **Layout Family**; one **master** canvas page; additional **variant** pages per aspect preset. Studio switches variants with platform chips — it does not resize one AST (ADR-0033).
|
|
5
|
+
|
|
6
|
+
Single-page ≠ single-platform. Still never create slideshow/carousel packs (`OUT_OF_SCOPE.md`).
|
|
7
|
+
|
|
8
|
+
## Default when the user asks to create a template
|
|
9
|
+
|
|
10
|
+
Unless they explicitly want **one platform only**:
|
|
11
|
+
|
|
12
|
+
1. Lock a **master** platform + recommended canvas (`PLATFORM_SPECS.md`).
|
|
13
|
+
2. Create the master draft (Family is created with it).
|
|
14
|
+
3. **Derive** missing vertical presets for the family.
|
|
15
|
+
4. **Hand-tune** each variant’s absolute layout (do not ship raw derive output for dense pages).
|
|
16
|
+
5. Visual-QA master + each variant, then hand off Studio with chip switching.
|
|
17
|
+
|
|
18
|
+
### Default vertical bucket (most social covers)
|
|
19
|
+
|
|
20
|
+
| Role | Preset | Pixels | Platforms on that variant |
|
|
21
|
+
|---|---|---|---|
|
|
22
|
+
| Master (typical) | `3:4` | 1080×1440 | `xiaohongshu` |
|
|
23
|
+
| Variant | `4:5` | 1080×1350 | `instagram` + `threads` (shared tree) |
|
|
24
|
+
| Variant | `9:16` | 1080×1920 | `tiktok` |
|
|
25
|
+
| Variant | `1:1` | 1080×1080 | `linkedin` |
|
|
26
|
+
|
|
27
|
+
If the user’s primary platform is already `4:5` / `9:16` / `1:1`, that page is master; derive the other presets in the bucket (see Gateway `defaultDerivePolicyForPreset`).
|
|
28
|
+
|
|
29
|
+
Skip or trim targets only when the user names a subset (“只要 IG 和 LinkedIn”).
|
|
30
|
+
|
|
31
|
+
## CLI
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
# After create-draft, read familyId from the draft view (or families list)
|
|
35
|
+
easysociable templates families get --id <familyId> --json
|
|
36
|
+
|
|
37
|
+
# Create missing presets (idempotent; use --presets to limit)
|
|
38
|
+
easysociable templates families derive --id <familyId> --presets 4:5,9:16,1:1 --json
|
|
39
|
+
|
|
40
|
+
# Hand-tuned layout per variant pageId
|
|
41
|
+
easysociable templates update-draft --id <variantPageId> --file ./variant-4x5.patch.json --json
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
Gateway equivalents: `GET/POST /v1/template-families/:id`, `POST /v1/template-families/:id/derive`.
|
|
45
|
+
|
|
46
|
+
If CLI `--json` fails Zod on new family fields (`familyId`, `variants`, …) but HTTP succeeded, re-fetch with `families get` / `list-drafts` or raw Gateway — do not assume create/derive failed.
|
|
47
|
+
|
|
48
|
+
## Hand-tune rules (required after derive)
|
|
49
|
+
|
|
50
|
+
`derive` applies pin `v1_vertical` (scale + bottom/center corrections). That is a **starting point**, not shippable layout for dense covers.
|
|
51
|
+
|
|
52
|
+
For **each** variant page:
|
|
53
|
+
|
|
54
|
+
1. Keep the **same slots / copy / icons** as master (same `data-variable` keys).
|
|
55
|
+
2. Rebuild absolute geometry for the target `canvas` (`width`/`height` + root Graphic size must match preset pixels).
|
|
56
|
+
3. Distribute vertical rhythm across the full board: even section gaps; **no** packed header + empty foot.
|
|
57
|
+
4. TikTok `9:16`: keep critical UI out of bottom ~120–160px chrome.
|
|
58
|
+
5. JSX styles must be `style={{ ... }}` (double braces). Python f-strings turn `{{` into `{` — validate with Babel/`validate-authoring-source.mjs` before update.
|
|
59
|
+
6. Per-variant `selectionMetadata.platforms` / `canvasPreset` / `canvas` must match that page only (IG+Threads both listed on the `4:5` page).
|
|
60
|
+
7. Theme/preview tokens stay on the **Family** (`preview_tokens` via `theme.create` on draft) — not a TemplateTheme row (`THEME_TOKENS.md`, ADR-0033).
|
|
61
|
+
|
|
62
|
+
```bash
|
|
63
|
+
node scripts/validate-authoring-source.mjs ./variant-4x5.authoring.json
|
|
64
|
+
easysociable templates update-draft --id <variantPageId> --file ./variant-4x5.patch.json --json
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
## Visual QA
|
|
68
|
+
|
|
69
|
+
Run `VISUAL_QA.md` on the **master** and **each derived preset** (screenshot Studio at that draft URL / platform chip). Fail if any variant has clipped content, overlapping bands, or large empty voids with cramped clusters.
|
|
70
|
+
|
|
71
|
+
## Handoff
|
|
72
|
+
|
|
73
|
+
After QA, open the **master** Studio URL and tell the user they can switch platforms with the top-bar chips (each chip is a real canvas variant). Save still applies to the active variant; Agent publish remains post-Save (`PUBLISH_FROM_DRAFT.md`). Include every variant `pageId` + preset in the handoff notes.
|
|
74
|
+
|
|
75
|
+
## Do not
|
|
76
|
+
|
|
77
|
+
- Author one AST and claim it fits 3:4 + 9:16 + 1:1
|
|
78
|
+
- Leave dense pages on raw derive output
|
|
79
|
+
- Put Instagram and Threads on different presets when both are 4:5
|
|
80
|
+
- Create a second Family for the same template identity
|
|
81
|
+
- Treat multi-platform variants as a slideshow / carousel pack
|
|
@@ -10,6 +10,7 @@ If the user asks for any of the following, **do not** execute them under this sk
|
|
|
10
10
|
| Pick Theme as slideshow “Look” for a whole Run | **easysociable-slideshow** + Profile Theme |
|
|
11
11
|
| Local Obsidian content authoring | Content Skill |
|
|
12
12
|
| UGC/publication/social posting | Deferred in V1 |
|
|
13
|
-
| Submit `contentDocumentHash` / ContentDocument to Template render | **Forbidden**
|
|
13
|
+
| Submit `contentDocumentHash` / ContentDocument to Template render | **Forbidden** |
|
|
14
|
+
| `create_render_job` / CLI `renders create` for customer PNG | **Forbidden** — Studio Download on a Slideshow Run |
|
|
14
15
|
|
|
15
|
-
**In scope:** single-page template authoring/publish
|
|
16
|
+
**In scope:** single-page template authoring/publish. Customer PNG packs are Slideshow Studio Download.
|
|
@@ -34,7 +34,7 @@ easysociable templates publish --id <draftId> --json
|
|
|
34
34
|
Or two steps:
|
|
35
35
|
|
|
36
36
|
```bash
|
|
37
|
-
easysociable templates update --id <draftId> --file ./draft-patch.json --json
|
|
37
|
+
easysociable templates update-draft --id <draftId> --file ./draft-patch.json --json
|
|
38
38
|
easysociable templates publish --id <draftId> --json
|
|
39
39
|
```
|
|
40
40
|
|
|
@@ -15,6 +15,15 @@ Run after draft creation and before the user handoff. Source inspection alone is
|
|
|
15
15
|
|
|
16
16
|
0. If `theme-tokens.json` exists, compare screenshot contrast to its `contrast` report for the active mode. Failed pairs are hard failures or cap `colorContrast` at 5. When `surfacePreview.kind` is `gradient` or `image`, also check text against `contrastAnchor` / scrim — do not assume Theme.canvas alone matches the wash.
|
|
17
17
|
|
|
18
|
+
0b. **Reference compare (required when `source.kind = image_reference`)** — before numeric scoring:
|
|
19
|
+
- Open the **reference image** and the **Studio canvas screenshot** side by side
|
|
20
|
+
- Check against `design-plan.json` → `referenceSpec`: margins, card stack order, radii, gaps, type hierarchy, badge/icon box sizes
|
|
21
|
+
- Confirm every `referenceImageInventory` entry is an **image-slot frame** on canvas (not CSS fake faces/illustrations). Missing inventory → hard failure
|
|
22
|
+
- Confirm recognizable glyphs used Icon Catalog (or documented degrade), not hand-drawn substitutes
|
|
23
|
+
- A draft that is “structurally educational” but clearly a different layout/density than the reference **fails** this pass even if the numeric rubric might scrape by
|
|
24
|
+
- Record on `visual-qa.json`: `sourceKind: "image_reference"` and `referenceCompare: { performed, geometryMatch, imageSlotsMatchInventory, notes? }`. A `pass` verdict requires all three booleans `true` (`validate-design-v2.mjs` enforces)
|
|
25
|
+
- If browser/screenshot tools are unavailable, mark reference compare **pending** (`performed: false`) and do not claim Visual QA passed
|
|
26
|
+
|
|
18
27
|
1. **Craft Pass (philosophy discipline)** — before numeric scoring:
|
|
19
28
|
- Read `design-plan.json` → `philosophy.craftBar` and the selected concept’s `philosophyExpression`
|
|
20
29
|
- If the screenshot contradicts the philosophy (e.g. generic SaaS three-card grid vs “monumental single metric”), treat that as a composition/hierarchy issue and plan a revise toward the stated expression
|
|
@@ -32,6 +41,7 @@ Run after draft creation and before the user handoff. Source inspection alone is
|
|
|
32
41
|
- missing required slot content/image
|
|
33
42
|
- background or decoration obscuring the focal message
|
|
34
43
|
- third-party temp URLs or broken CDN for image surface/slots
|
|
44
|
+
- **reference path:** pictorial regions replaced by CSS/emoji stand-ins; composition clearly diverged from the reference without user acceptance
|
|
35
45
|
3. Score the fixed rubric in `references/DESIGN_V2_1.md`:
|
|
36
46
|
|
|
37
47
|
- hierarchy 20
|
|
@@ -1,60 +0,0 @@
|
|
|
1
|
-
# Install easysociable-content (private copy)
|
|
2
|
-
|
|
3
|
-
Ship this folder — **not** the whole monorepo.
|
|
4
|
-
|
|
5
|
-
## What to copy
|
|
6
|
-
|
|
7
|
-
```text
|
|
8
|
-
easysociable-content/
|
|
9
|
-
├── SKILL.md
|
|
10
|
-
├── INSTALL.md
|
|
11
|
-
├── scripts/
|
|
12
|
-
├── starter/
|
|
13
|
-
├── workbench/
|
|
14
|
-
├── references/
|
|
15
|
-
├── workflows/
|
|
16
|
-
├── platforms/
|
|
17
|
-
└── fixtures/ # optional
|
|
18
|
-
```
|
|
19
|
-
|
|
20
|
-
Do **not** include API keys, `.env`, or the user's Content Engine.
|
|
21
|
-
|
|
22
|
-
## Where to install
|
|
23
|
-
|
|
24
|
-
| Agent host | Path |
|
|
25
|
-
|---|---|
|
|
26
|
-
| Cursor | `~/.cursor/skills/easysociable-content/` |
|
|
27
|
-
| Claude Code | `~/.claude/skills/easysociable-content/` |
|
|
28
|
-
| Codex | host-specific skills directory (see `platforms/codex.md`) |
|
|
29
|
-
|
|
30
|
-
```bash
|
|
31
|
-
cp -R easysociable-content ~/.cursor/skills/easysociable-content
|
|
32
|
-
```
|
|
33
|
-
|
|
34
|
-
Restart the Agent session so the skill is picked up.
|
|
35
|
-
|
|
36
|
-
## Prerequisites
|
|
37
|
-
|
|
38
|
-
1. **python3** (workbench `build.py` / `serve.py`)
|
|
39
|
-
2. A parent directory for `Content Engine/` (any folder; Obsidian is not required)
|
|
40
|
-
3. For rendering: unified `easysociable` CLI + Template/Slideshow skills (optional until first render)
|
|
41
|
-
|
|
42
|
-
## First run (Agent)
|
|
43
|
-
|
|
44
|
-
1. Ask for a parent directory (or an existing `Content Engine/` path). Do not ask language.
|
|
45
|
-
2. Apply and start workbench:
|
|
46
|
-
|
|
47
|
-
```bash
|
|
48
|
-
node scripts/setup.mjs --root "<parent>" --preview --json
|
|
49
|
-
node scripts/setup.mjs --root "<parent>" --apply --json
|
|
50
|
-
```
|
|
51
|
-
|
|
52
|
-
3. Follow `workflows/GETTING_STARTED.md`. Daily operations follow engine `CLAUDE.md`.
|
|
53
|
-
|
|
54
|
-
Existing files are never overwritten. Later skill updates: `--apply` adds **missing** starter files only; skip existing `workbench/template.html`.
|
|
55
|
-
|
|
56
|
-
## Package script (maintainers)
|
|
57
|
-
|
|
58
|
-
```bash
|
|
59
|
-
node skills/easysociable-content/scripts/package-skill.mjs --output /tmp/easysociable-content-skill
|
|
60
|
-
```
|
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
# Content Skill filesystem reference
|
|
2
|
-
|
|
3
|
-
The Content Skill does not own a Content CLI. It writes `Content Engine/` on disk and uses the unified `easysociable` command only for hosted Template/Slideshow handoff.
|
|
4
|
-
|
|
5
|
-
## Local workflow
|
|
6
|
-
|
|
7
|
-
Ask for a parent directory (or existing engine path). Do not ask language. Do not require Obsidian.
|
|
8
|
-
|
|
9
|
-
Do not invent `easysociable-content init/start/doctor`.
|
|
10
|
-
|
|
11
|
-
## Setup
|
|
12
|
-
|
|
13
|
-
```bash
|
|
14
|
-
node scripts/setup.mjs --detect --json
|
|
15
|
-
node scripts/setup.mjs --root <parent-or-engine> --preview --json
|
|
16
|
-
node scripts/setup.mjs --root <parent-or-engine> --apply --json
|
|
17
|
-
node scripts/setup.mjs --root <parent-or-engine> --validate --json
|
|
18
|
-
node scripts/workbench.mjs start --engine <Content Engine> --json
|
|
19
|
-
node scripts/workbench.mjs build --engine <Content Engine> --json
|
|
20
|
-
```
|
|
21
|
-
|
|
22
|
-
`--no-open` skips the browser and the workbench server.
|
|
23
|
-
|
|
24
|
-
## Hosted handoff
|
|
25
|
-
|
|
26
|
-
```bash
|
|
27
|
-
easysociable templates list --platforms tiktok --json
|
|
28
|
-
easysociable slideshows create --file ./runs/<slug>/pack-tiktok.json --json
|
|
29
|
-
easysociable slideshows render --id run_xxx --idempotency-key run_xxx-final-1 --json
|
|
30
|
-
easysociable slideshows export --id run_xxx --output ./exports/<slug> --json
|
|
31
|
-
```
|
|
32
|
-
|
|
33
|
-
Validate before slideshow create:
|
|
34
|
-
|
|
35
|
-
```bash
|
|
36
|
-
node scripts/validate-run.mjs --run ./runs/<slug> --require-pack --json
|
|
37
|
-
node scripts/validate-pack.mjs --file ./runs/<slug>/pack-tiktok.json --json
|
|
38
|
-
```
|
|
39
|
-
|
|
40
|
-
Use unified MCP first when the host exposes it. CLI is the fallback.
|
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
# Contract sync
|
|
2
|
-
|
|
3
|
-
Pack validation in this skill mirrors the hosted public contract. When those
|
|
4
|
-
contracts change, update this skill in the same PR.
|
|
5
|
-
|
|
6
|
-
## Source of truth
|
|
7
|
-
|
|
8
|
-
| Contract | Repository path |
|
|
9
|
-
|---|---|
|
|
10
|
-
| `content-pack.v1` schema | `packages/template-public-contracts/src/index.ts` → `contentPackSchema` |
|
|
11
|
-
| Platform page caps | `slideshowPlatformCaps` in the same file |
|
|
12
|
-
| Page roles | `pageRoleSchema` in the same file |
|
|
13
|
-
|
|
14
|
-
## Mirrored in skill
|
|
15
|
-
|
|
16
|
-
| Skill file | What to sync |
|
|
17
|
-
|---|---|
|
|
18
|
-
| `scripts/contracts.mjs` | caps, roles, forbidden keys, validate logic |
|
|
19
|
-
| `references/PAGE_PACK.md` | Agent-facing summary + examples |
|
|
20
|
-
| `references/PLATFORM_GUIDE.md` | slideshow vs template routing |
|
|
21
|
-
|
|
22
|
-
## Maintainer checklist
|
|
23
|
-
|
|
24
|
-
Before merging contract changes:
|
|
25
|
-
|
|
26
|
-
1. Diff `contentPackSchema` / `slideshowPlatformCaps` / `pageRoleSchema`.
|
|
27
|
-
2. Update `contracts.mjs` and `PAGE_PACK.md`.
|
|
28
|
-
3. Run:
|
|
29
|
-
|
|
30
|
-
```bash
|
|
31
|
-
node skills/easysociable-content/scripts/validate.test.mjs
|
|
32
|
-
node skills/easysociable-content/scripts/fixture.test.mjs
|
|
33
|
-
node skills/easysociable-content/scripts/setup.test.mjs
|
|
34
|
-
```
|
|
35
|
-
|
|
36
|
-
4. If caps or roles changed, refresh `fixtures/golden-run-en/pack-tiktok.json` when needed.
|
|
37
|
-
|
|
38
|
-
## Optional hard sync (future)
|
|
39
|
-
|
|
40
|
-
Import `contentPackSchema` from `@easysociable/template-public-contracts` in
|
|
41
|
-
`validate-pack.mjs` once skill scripts run through the monorepo toolchain. Until
|
|
42
|
-
then, `contracts.mjs` is the portable mirror (marked with `ponytail:`).
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
# Unified MCP reference
|
|
2
|
-
|
|
3
|
-
V1 has one MCP server from the unified EasySociable installer. It owns hosted Template, Image, Profile, Theme, Slideshow and Render tools. This Content Skill does not require a Content MCP.
|
|
4
|
-
|
|
5
|
-
Content work stays on disk under `Content Engine/`. Hosted calls use the same Gateway client as the CLI.
|
|
6
|
-
|
|
7
|
-
## Handoff sequence
|
|
8
|
-
|
|
9
|
-
1. After SHIP, write `pack.md` (slideshow) or slot values (single-page).
|
|
10
|
-
2. Slideshow skill writes `content-pack.v1` into the run folder, then `create_slideshow_run`.
|
|
11
|
-
3. Open Studio URL; wait for Save.
|
|
12
|
-
4. After confirmation call `render_slideshow_run`.
|
|
13
|
-
5. Export PNGs into `exports/<run-slug>/`.
|
|
14
|
-
|
|
15
|
-
The MCP server must never expose private AST, Binding Maps, RenderPlans, R2 credentials, Directus credentials, Stripe credentials or Local Runtime tokens.
|
|
@@ -1,129 +0,0 @@
|
|
|
1
|
-
# PagePack handoff (`content-pack.v1`)
|
|
2
|
-
|
|
3
|
-
The Pack is the boundary between semantic content (Content Skill) and visual
|
|
4
|
-
composition (Template / Slideshow Skills). Content writes slots and roles;
|
|
5
|
-
downstream skills choose Page Templates and render.
|
|
6
|
-
|
|
7
|
-
**Source of truth for caps and roles:** `packages/template-public-contracts`
|
|
8
|
-
(`contentPackSchema`). This file is the Agent-facing summary.
|
|
9
|
-
|
|
10
|
-
## Schema
|
|
11
|
-
|
|
12
|
-
```json
|
|
13
|
-
{
|
|
14
|
-
"schemaVersion": "content-pack.v1",
|
|
15
|
-
"platform": "tiktok",
|
|
16
|
-
"title": "Optional title",
|
|
17
|
-
"pages": [
|
|
18
|
-
{
|
|
19
|
-
"role": "hook",
|
|
20
|
-
"slots": { "text_0": "Hook line", "text_1": "Support" },
|
|
21
|
-
"pageTemplateId": "tpl_selected_at_handoff"
|
|
22
|
-
}
|
|
23
|
-
]
|
|
24
|
-
}
|
|
25
|
-
```
|
|
26
|
-
|
|
27
|
-
| Field | Required | Notes |
|
|
28
|
-
|---|---|---|
|
|
29
|
-
| `schemaVersion` | yes | Must be `content-pack.v1` |
|
|
30
|
-
| `platform` | yes | See platform table below |
|
|
31
|
-
| `title` | no | Display title for Studio |
|
|
32
|
-
| `pages` | yes | Ordered array, length within platform caps |
|
|
33
|
-
| `pages[].role` | yes | Closed `pageRoles` enum |
|
|
34
|
-
| `pages[].slots` | yes | Public slot key → string/number/boolean/null |
|
|
35
|
-
| `pages[].pageTemplateId` | yes | Published Page Template selected by Slideshow before `create` |
|
|
36
|
-
|
|
37
|
-
## Forbidden in Pack
|
|
38
|
-
|
|
39
|
-
Never include:
|
|
40
|
-
|
|
41
|
-
- `deck_template_id` / Deck references
|
|
42
|
-
- Template AST, Binding Maps, RenderPlans
|
|
43
|
-
- `ContentDocument` / `contentDocumentHash`
|
|
44
|
-
- Private gateway credentials or image URLs as slot values (use `imageId` after import)
|
|
45
|
-
|
|
46
|
-
## Platform page caps
|
|
47
|
-
|
|
48
|
-
| Platform | Min pages | Max pages | V1 Slideshow |
|
|
49
|
-
|---|---:|---:|---|
|
|
50
|
-
| `tiktok` | 4 | 35 | yes |
|
|
51
|
-
| `instagram` | 2 | 20 | yes |
|
|
52
|
-
| `linkedin` | 2 | 300 | yes |
|
|
53
|
-
| `threads` | 2 | 20 | yes |
|
|
54
|
-
| `xiaohongshu` | — | — | not a Content Pack route in V1; use Template single-page |
|
|
55
|
-
|
|
56
|
-
`x` is not a Pack platform. Use Template fill-slots for single-page X graphics.
|
|
57
|
-
|
|
58
|
-
## Page roles (closed set)
|
|
59
|
-
|
|
60
|
-
`cover`, `hook`, `setup`, `context`, `value`, `point`, `checklist`, `proof`,
|
|
61
|
-
`evidence`, `compare`, `screenshot`, `metric`, `quote`, `steps`, `cta`, `follow`, `recap`
|
|
62
|
-
|
|
63
|
-
Pick roles that match the narrative arc. Slideshow maps each page to a published
|
|
64
|
-
Page Template with compatible `supportedRoles`.
|
|
65
|
-
|
|
66
|
-
## File naming
|
|
67
|
-
|
|
68
|
-
During the run, write vault-native pack markdown:
|
|
69
|
-
|
|
70
|
-
```text
|
|
71
|
-
pack.md
|
|
72
|
-
pack-<platform>.md
|
|
73
|
-
```
|
|
74
|
-
|
|
75
|
-
`content-pack.v1` JSON is created **at Slideshow/Template handoff**, not during draft:
|
|
76
|
-
|
|
77
|
-
```text
|
|
78
|
-
pack-<platform>.json
|
|
79
|
-
```
|
|
80
|
-
|
|
81
|
-
Example: `pack-tiktok.json`. Pure X text has no pack.
|
|
82
|
-
|
|
83
|
-
## Validation
|
|
84
|
-
|
|
85
|
-
```bash
|
|
86
|
-
node scripts/validate-pack.mjs --file ./pack-tiktok.json --platform tiktok --json
|
|
87
|
-
```
|
|
88
|
-
|
|
89
|
-
Before Slideshow `create`, also run:
|
|
90
|
-
|
|
91
|
-
```bash
|
|
92
|
-
node scripts/validate-pack.mjs --file ./pack-tiktok.json --require-page-template-id --json
|
|
93
|
-
```
|
|
94
|
-
|
|
95
|
-
## Examples
|
|
96
|
-
|
|
97
|
-
### English — TikTok (4 pages, content stage)
|
|
98
|
-
|
|
99
|
-
```json
|
|
100
|
-
{
|
|
101
|
-
"schemaVersion": "content-pack.v1",
|
|
102
|
-
"platform": "tiktok",
|
|
103
|
-
"title": "Morning routine tips",
|
|
104
|
-
"pages": [
|
|
105
|
-
{ "role": "hook", "pageTemplateId": "tpl_hook_001", "slots": { "text_0": "Stop scrolling — this changed my mornings" } },
|
|
106
|
-
{ "role": "value", "pageTemplateId": "tpl_value_001", "slots": { "text_0": "Wake at the same time", "text_1": "No phone for 20 minutes" } },
|
|
107
|
-
{ "role": "value", "pageTemplateId": "tpl_value_001", "slots": { "text_0": "Move before caffeine", "text_1": "Even 5 minutes counts" } },
|
|
108
|
-
{ "role": "cta", "pageTemplateId": "tpl_cta_001", "slots": { "text_0": "Save this for tomorrow" } }
|
|
109
|
-
]
|
|
110
|
-
}
|
|
111
|
-
```
|
|
112
|
-
|
|
113
|
-
### 中文 — TikTok(4 页,内容阶段)
|
|
114
|
-
|
|
115
|
-
```json
|
|
116
|
-
{
|
|
117
|
-
"schemaVersion": "content-pack.v1",
|
|
118
|
-
"platform": "tiktok",
|
|
119
|
-
"title": "晨间习惯三条",
|
|
120
|
-
"pages": [
|
|
121
|
-
{ "role": "hook", "pageTemplateId": "tpl_hook_001", "slots": { "text_0": "别再瞎忙了——我靠这三条稳住早晨" } },
|
|
122
|
-
{ "role": "value", "pageTemplateId": "tpl_value_001", "slots": { "text_0": "固定起床时间", "text_1": "醒来先别碰手机" } },
|
|
123
|
-
{ "role": "value", "pageTemplateId": "tpl_value_001", "slots": { "text_0": "喝咖啡前先动一动", "text_1": "五分钟也算数" } },
|
|
124
|
-
{ "role": "cta", "pageTemplateId": "tpl_cta_001", "slots": { "text_0": "先收藏,明早试" } }
|
|
125
|
-
]
|
|
126
|
-
}
|
|
127
|
-
```
|
|
128
|
-
|
|
129
|
-
JSON field names and `role` values stay English even when slot copy is 中文.
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
# Platform guide
|
|
2
|
-
|
|
3
|
-
Use this matrix before opening a run. **Ask** if the user did not name a platform. Multi-select → **N runs**.
|
|
4
|
-
|
|
5
|
-
| Platform | Slideshow (V1) | Pack platform key | Page cap (slideshow) | Default path |
|
|
6
|
-
|---|---|---|---:|---|
|
|
7
|
-
| TikTok | yes | `tiktok` | 4–35 | Slideshow |
|
|
8
|
-
| Instagram | yes | `instagram` (`ig`) | 2–20 | Slideshow |
|
|
9
|
-
| LinkedIn | yes | `linkedin` | 2–300 | Slideshow |
|
|
10
|
-
| Threads | yes | `threads` | 2–20 | Slideshow |
|
|
11
|
-
| X | **no** | — (no Pack) | — | Template single-page or text-only |
|
|
12
|
-
| Xiaohongshu | **no** (V1) | — | — | Template single-page |
|
|
13
|
-
|
|
14
|
-
Craft notes live under `Content Engine/platforms/`. Map: `instagram` → `ig.md`. Read the file before brief/draft/editor.
|
|
15
|
-
|
|
16
|
-
## Routing
|
|
17
|
-
|
|
18
|
-
```text
|
|
19
|
-
1 page → easysociable-template
|
|
20
|
-
2+ pages + slideshow platform → easysociable-slideshow
|
|
21
|
-
x → easysociable-template only (if images)
|
|
22
|
-
xiaohongshu → easysociable-template until slideshow ships
|
|
23
|
-
```
|
|
24
|
-
|
|
25
|
-
## Canvas hints (for downstream skills)
|
|
26
|
-
|
|
27
|
-
| Platform | Typical canvas | Notes |
|
|
28
|
-
|---|---|---|
|
|
29
|
-
| tiktok | 9:16 @ 1080×1920 | Photo Mode carousel |
|
|
30
|
-
| instagram / ig | 4:5 or 1:1 @ 1080 | Feed carousel |
|
|
31
|
-
| linkedin | 4:5 or 1:1 | Document-style decks |
|
|
32
|
-
| threads | 4:5 or 1:1 | Conversational copy |
|
|
33
|
-
| x | 16:9 or 1:1 | Single image post |
|
|
34
|
-
| xiaohongshu | 3:4 @ 1080×1440 | See Template `PLATFORM_SPECS` |
|
|
35
|
-
|
|
36
|
-
Content Skill does not pick Page Templates — only platform, roles and slot copy. Pack JSON is written at Slideshow/Template handoff, not during draft.
|
|
@@ -1,73 +0,0 @@
|
|
|
1
|
-
# Run layout
|
|
2
|
-
|
|
3
|
-
Copy `runs/_template/` to `runs/<YYYY-MM-DD-short-slug[-platform]>/`.
|
|
4
|
-
|
|
5
|
-
**One folder = one platform.** Same Topic on another network = another folder sharing `topic_id`.
|
|
6
|
-
|
|
7
|
-
```text
|
|
8
|
-
Content Engine/runs/<slug>/
|
|
9
|
-
```
|
|
10
|
-
|
|
11
|
-
## Core files
|
|
12
|
-
|
|
13
|
-
| File | Purpose |
|
|
14
|
-
|---|---|
|
|
15
|
-
| `idea.md` | Run id, status, **this** platform, selection (`swipe_id` / `atoms` / `claim_id`) |
|
|
16
|
-
| `brief.md` | Angle, constraints, selection why |
|
|
17
|
-
| `packet.md` | Writer context (pillar + voice + audience + craft notes) |
|
|
18
|
-
| `draft.md` | Copy for **this platform only** |
|
|
19
|
-
| `editor.md` | REVISE / APPROVE |
|
|
20
|
-
| `rubric.md` | 6 × 0–2; SHIP ≥ 8 |
|
|
21
|
-
| `pack.md` | Image deck slots after SHIP (slideshow platforms) |
|
|
22
|
-
| `feedback.md` | URL + `win`/`flat`/`loss` after publish |
|
|
23
|
-
| `pack-<platform>.json` | Complete `content-pack.v1` — **only at render handoff** |
|
|
24
|
-
|
|
25
|
-
## `idea.md` frontmatter
|
|
26
|
-
|
|
27
|
-
```yaml
|
|
28
|
-
---
|
|
29
|
-
run_id: RUN-YYYYMMDD-slug
|
|
30
|
-
status: RUN_OPEN
|
|
31
|
-
created: YYYY-MM-DD
|
|
32
|
-
---
|
|
33
|
-
```
|
|
34
|
-
|
|
35
|
-
Body must include `primary_platform` equal to `platforms` (single value) and the three selection fields. `none` is allowed with why.
|
|
36
|
-
|
|
37
|
-
### File status vs index status
|
|
38
|
-
|
|
39
|
-
| `idea.md` | `runs/_index.md` |
|
|
40
|
-
|---|---|
|
|
41
|
-
| `RUN_OPEN` | `open` |
|
|
42
|
-
| `BRIEF_WAIT` | `brief` |
|
|
43
|
-
| `DRAFTED` / `EDIT_WAIT` | `draft` |
|
|
44
|
-
| `SCORED` | `scored` |
|
|
45
|
-
| `READY_TO_POST` | `ready` |
|
|
46
|
-
| `PUBLISHED` | `published` |
|
|
47
|
-
| `HOLD` / `KILLED` / `SUPERSEDED` | `hold` / `killed` / `superseded` |
|
|
48
|
-
|
|
49
|
-
Do not use index status `partial` for new runs.
|
|
50
|
-
|
|
51
|
-
## Validation
|
|
52
|
-
|
|
53
|
-
Semantic run (no Pack JSON yet):
|
|
54
|
-
|
|
55
|
-
```bash
|
|
56
|
-
node scripts/validate-run.mjs --run <run-dir> --json
|
|
57
|
-
```
|
|
58
|
-
|
|
59
|
-
Slideshow handoff (Pack JSON required):
|
|
60
|
-
|
|
61
|
-
```bash
|
|
62
|
-
node scripts/validate-run.mjs --run <run-dir> --require-pack --json
|
|
63
|
-
node scripts/validate-pack.mjs --file <run-dir>/pack-<platform>.json --platform <platform> --json
|
|
64
|
-
```
|
|
65
|
-
|
|
66
|
-
## Export path
|
|
67
|
-
|
|
68
|
-
Final PNGs at the **engine root**, not inside the run folder:
|
|
69
|
-
|
|
70
|
-
```text
|
|
71
|
-
Content Engine/exports/<run-slug>/01.png
|
|
72
|
-
Content Engine/exports/<run-slug>/<platform>/01.png # optional subfolder
|
|
73
|
-
```
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
# Troubleshooting
|
|
2
|
-
|
|
3
|
-
No Content CLI, Local API, SQLite, or Obsidian requirement.
|
|
4
|
-
|
|
5
|
-
If setup fails, stop before overwriting files. `python3` missing → install Python 3; starter files may already be written.
|
|
6
|
-
|
|
7
|
-
If port 8765 is in use, reuse `http://127.0.0.1:8765/workbench/` — do not start a second server. Rebuild with `python3 workbench/build.py`.
|
|
8
|
-
|
|
9
|
-
Never overwrite an existing `workbench/template.html`. `--apply` only adds missing files.
|
|
10
|
-
|
|
11
|
-
If a run is incomplete, keep existing markdown and report the missing file. `validate-run.mjs` / `validate-pack.mjs` list concrete gaps. Do not auto-migrate an existing engine.
|
|
12
|
-
|
|
13
|
-
Deferred features: `workflows/OUT_OF_SCOPE.md`.
|