@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.
Files changed (148) hide show
  1. package/README.md +32 -21
  2. package/{skills/easysociable-content → content-engine}/scripts/starter.mjs +3 -1
  3. package/{skills/easysociable-content → content-engine}/scripts/workbench.mjs +13 -8
  4. package/{skills/easysociable-content → content-engine}/starter/CLAUDE.md +217 -128
  5. package/{skills/easysociable-content → content-engine}/starter/engine.json +3 -0
  6. package/content-engine/starter/needs/README.md +38 -0
  7. package/content-engine/starter/needs/_index.md +31 -0
  8. package/content-engine/starter/needs/_template.md +24 -0
  9. package/content-engine/starter/needs/entries/README.md +5 -0
  10. package/content-engine/starter/products/README.md +38 -0
  11. package/content-engine/starter/products/_index.md +24 -0
  12. package/content-engine/starter/products/_template.md +56 -0
  13. package/content-engine/starter/products/entries/P-001-easysociable.md +150 -0
  14. package/content-engine/starter/profiles/_index.md +16 -0
  15. package/{skills/easysociable-content → content-engine}/starter/profiles/default/README.md +4 -1
  16. package/content-engine/starter/profiles/default/boundaries.md +14 -0
  17. package/content-engine/starter/profiles/default/expression.md +18 -0
  18. package/content-engine/starter/profiles/default/lanes.md +12 -0
  19. package/content-engine/starter/profiles/default/stories.md +15 -0
  20. package/{skills/easysociable-content → content-engine}/starter/profiles/default/voice.md +14 -0
  21. package/content-engine/starter/recommendations/README.md +21 -0
  22. package/content-engine/starter/recommendations/_index.md +21 -0
  23. package/content-engine/starter/recommendations/_template.md +44 -0
  24. package/{skills/easysociable-content → content-engine}/starter/runs/_template/brief.md +1 -1
  25. package/{skills/easysociable-content → content-engine}/starter/runs/_template/pack.md +15 -7
  26. package/{skills/easysociable-content → content-engine}/starter/runs/_template/packet.md +6 -0
  27. package/{skills/easysociable-content → content-engine}/starter/swipe/_template.md +3 -1
  28. package/content-engine/starter/topics/README.md +21 -0
  29. package/{skills/easysociable-content → content-engine}/starter/topics/_index.md +12 -5
  30. package/content-engine/starter/topics/_template-item.md +103 -0
  31. package/{skills/easysociable-content → content-engine}/starter/topics/scoring.md +55 -4
  32. package/content-engine/workbench/__pycache__/build.cpython-310.pyc +0 -0
  33. package/{skills/easysociable-content → content-engine}/workbench/build.py +306 -97
  34. package/{skills/easysociable-content → content-engine}/workbench/serve.py +0 -0
  35. package/{skills/easysociable-content → content-engine}/workbench/template.html +173 -27
  36. package/dist/easysociable.js +629 -142
  37. package/dist/easysociable.js.map +1 -1
  38. package/package.json +15 -15
  39. package/skills/ONBOARDING.md +21 -18
  40. package/skills/easysociable-content/SKILL.md +104 -98
  41. package/skills/easysociable-content/workflows/INTERVIEW.md +70 -0
  42. package/skills/easysociable-content/workflows/NEEDS.md +82 -0
  43. package/skills/easysociable-slideshow/SKILL.md +79 -44
  44. package/skills/easysociable-slideshow/references/ARC.md +44 -0
  45. package/skills/easysociable-slideshow/references/CONTENT_PACK.md +34 -6
  46. package/skills/easysociable-slideshow/workflows/CREATE_RUN.md +24 -5
  47. package/skills/easysociable-slideshow/workflows/OUT_OF_SCOPE.md +3 -0
  48. package/skills/easysociable-template/SKILL.md +29 -30
  49. package/skills/easysociable-template/references/CATALOG_METADATA.md +23 -20
  50. package/skills/easysociable-template/references/DESIGN_V2_1.md +53 -2
  51. package/skills/easysociable-template/references/GATEWAY.md +7 -2
  52. package/skills/easysociable-template/references/PLATFORM_SPECS.md +11 -3
  53. package/skills/easysociable-template/references/THEME_TOKENS.md +1 -1
  54. package/skills/easysociable-template/references/fixtures/image-reference.design-plan.json +74 -0
  55. package/skills/easysociable-template/references/fixtures/image-reference.visual-qa.json +28 -0
  56. package/skills/easysociable-template/scripts/generate-theme-from-hex.mjs +0 -0
  57. package/skills/easysociable-template/scripts/validate-design-v2.mjs +97 -0
  58. package/skills/easysociable-template/workflows/ASSET_PLAN.md +2 -1
  59. package/skills/easysociable-template/workflows/AUTHORING_FROM_BRIEF.md +4 -4
  60. package/skills/easysociable-template/workflows/AUTHORING_FROM_IMAGE.md +66 -16
  61. package/skills/easysociable-template/workflows/AUTHORING_STUDIO.md +28 -15
  62. package/skills/easysociable-template/workflows/DESIGN_BRIEF.md +4 -3
  63. package/skills/easysociable-template/workflows/FILL_AND_RENDER.md +4 -83
  64. package/skills/easysociable-template/workflows/MULTI_PLATFORM_FAMILY.md +81 -0
  65. package/skills/easysociable-template/workflows/OUT_OF_SCOPE.md +3 -2
  66. package/skills/easysociable-template/workflows/PUBLISH_FROM_DRAFT.md +1 -1
  67. package/skills/easysociable-template/workflows/VISUAL_QA.md +10 -0
  68. package/skills/easysociable-content/INSTALL.md +0 -60
  69. package/skills/easysociable-content/platforms/claude.md +0 -4
  70. package/skills/easysociable-content/platforms/codex.md +0 -4
  71. package/skills/easysociable-content/platforms/hermes.md +0 -4
  72. package/skills/easysociable-content/platforms/openclaw.md +0 -4
  73. package/skills/easysociable-content/references/CLI.md +0 -40
  74. package/skills/easysociable-content/references/CONTRACT_SYNC.md +0 -42
  75. package/skills/easysociable-content/references/MCP.md +0 -15
  76. package/skills/easysociable-content/references/PAGE_PACK.md +0 -129
  77. package/skills/easysociable-content/references/PLATFORM_GUIDE.md +0 -36
  78. package/skills/easysociable-content/references/RUN_LAYOUT.md +0 -73
  79. package/skills/easysociable-content/references/TROUBLESHOOTING.md +0 -13
  80. package/skills/easysociable-content/references/VAULT.md +0 -40
  81. package/skills/easysociable-content/references/VOICE.md +0 -16
  82. package/skills/easysociable-content/scripts/package-skill.mjs +0 -49
  83. package/skills/easysociable-content/scripts/setup.mjs +0 -200
  84. package/skills/easysociable-content/scripts/setup.test.mjs +0 -82
  85. package/skills/easysociable-content/starter/discovery/README.md +0 -18
  86. package/skills/easysociable-content/starter/discovery/_index.md +0 -27
  87. package/skills/easysociable-content/starter/discovery/_template.md +0 -41
  88. package/skills/easysociable-content/starter/profiles/_index.md +0 -13
  89. package/skills/easysociable-content/starter/topics/README.md +0 -25
  90. package/skills/easysociable-content/starter/topics/WATCHLIST.md +0 -65
  91. package/skills/easysociable-content/starter/topics/_template-item.md +0 -90
  92. package/skills/easysociable-content/starter/topics/watchlists/README.md +0 -10
  93. package/skills/easysociable-content/starter/topics/watchlists/_shared.md +0 -14
  94. package/skills/easysociable-content/starter/topics/watchlists/default.md +0 -6
  95. package/skills/easysociable-content/workflows/ANALYSIS_AND_COVERAGE.md +0 -17
  96. package/skills/easysociable-content/workflows/CONTENT_EXPORT.md +0 -24
  97. package/skills/easysociable-content/workflows/GETTING_STARTED.md +0 -40
  98. package/skills/easysociable-content/workflows/MCP_FIRST.md +0 -5
  99. package/skills/easysociable-content/workflows/OUT_OF_SCOPE.md +0 -18
  100. package/skills/easysociable-content/workflows/PACK_AUTHORING.md +0 -42
  101. package/skills/easysociable-content/workflows/SWIPE_CAPTURE.md +0 -18
  102. package/skills/easysociable-content/workflows/TOPIC_DRAFT.md +0 -29
  103. package/skills/easysociable-content/workflows/WORKING_DRAFT.md +0 -19
  104. /package/{skills/easysociable-content → content-engine}/fixtures/golden-run-en/draft.md +0 -0
  105. /package/{skills/easysociable-content → content-engine}/fixtures/golden-run-en/idea.md +0 -0
  106. /package/{skills/easysociable-content → content-engine}/fixtures/golden-run-en/pack-tiktok.json +0 -0
  107. /package/{skills/easysociable-content → content-engine}/scripts/contracts.mjs +0 -0
  108. /package/{skills/easysociable-content → content-engine}/scripts/export-contracts.mjs +0 -0
  109. /package/{skills/easysociable-content → content-engine}/scripts/fixture.test.mjs +0 -0
  110. /package/{skills/easysociable-content → content-engine}/scripts/validate-export.mjs +0 -0
  111. /package/{skills/easysociable-content → content-engine}/scripts/validate-pack.mjs +0 -0
  112. /package/{skills/easysociable-content → content-engine}/scripts/validate-run.mjs +0 -0
  113. /package/{skills/easysociable-content → content-engine}/scripts/validate.test.mjs +0 -0
  114. /package/{skills/easysociable-content → content-engine}/starter/accounts/README.md +0 -0
  115. /package/{skills/easysociable-content → content-engine}/starter/accounts/_index.md +0 -0
  116. /package/{skills/easysociable-content → content-engine}/starter/accounts/overrides/README.md +0 -0
  117. /package/{skills/easysociable-content → content-engine}/starter/exports/README.md +0 -0
  118. /package/{skills/easysociable-content → content-engine}/starter/inbox/README.md +0 -0
  119. /package/{skills/easysociable-content → content-engine}/starter/inbox/_index.md +0 -0
  120. /package/{skills/easysociable-content → content-engine}/starter/inbox/entries/README.md +0 -0
  121. /package/{skills/easysociable-content → content-engine}/starter/platforms/README.md +0 -0
  122. /package/{skills/easysociable-content → content-engine}/starter/platforms/ig.md +0 -0
  123. /package/{skills/easysociable-content → content-engine}/starter/platforms/instagram.md +0 -0
  124. /package/{skills/easysociable-content → content-engine}/starter/platforms/linkedin.md +0 -0
  125. /package/{skills/easysociable-content → content-engine}/starter/platforms/threads.md +0 -0
  126. /package/{skills/easysociable-content → content-engine}/starter/platforms/tiktok.md +0 -0
  127. /package/{skills/easysociable-content → content-engine}/starter/platforms/x.md +0 -0
  128. /package/{skills/easysociable-content → content-engine}/starter/platforms/xiaohongshu.md +0 -0
  129. /package/{skills/easysociable-content → content-engine}/starter/profiles/default/audience.md +0 -0
  130. /package/{skills/easysociable-content → content-engine}/starter/profiles/default/pillars.md +0 -0
  131. /package/{skills/easysociable-content → content-engine}/starter/published/_index.md +0 -0
  132. /package/{skills/easysociable-content → content-engine}/starter/raw/README.md +0 -0
  133. /package/{skills/easysociable-content → content-engine}/starter/raw/_index.md +0 -0
  134. /package/{skills/easysociable-content → content-engine}/starter/runs/README.md +0 -0
  135. /package/{skills/easysociable-content → content-engine}/starter/runs/_index.md +0 -0
  136. /package/{skills/easysociable-content → content-engine}/starter/runs/_template/draft.md +0 -0
  137. /package/{skills/easysociable-content → content-engine}/starter/runs/_template/editor.md +0 -0
  138. /package/{skills/easysociable-content → content-engine}/starter/runs/_template/feedback.md +0 -0
  139. /package/{skills/easysociable-content → content-engine}/starter/runs/_template/idea.md +0 -0
  140. /package/{skills/easysociable-content → content-engine}/starter/runs/_template/rubric.md +0 -0
  141. /package/{skills/easysociable-content → content-engine}/starter/swipe/_index.md +0 -0
  142. /package/{skills/easysociable-content → content-engine}/starter/topics/items/README.md +0 -0
  143. /package/{skills/easysociable-content → content-engine}/starter/wiki/README.md +0 -0
  144. /package/{skills/easysociable-content → content-engine}/starter/wiki/atoms/_index.md +0 -0
  145. /package/{skills/easysociable-content → content-engine}/starter/wiki/atoms/_template.md +0 -0
  146. /package/{skills/easysociable-content → content-engine}/starter/wiki/claims/_index.md +0 -0
  147. /package/{skills/easysociable-content → content-engine}/starter/wiki/claims/_template.md +0 -0
  148. /package/{skills/easysociable-content → content-engine}/starter/workbench/README.md +0 -0
@@ -1,86 +1,7 @@
1
- # Fill slots and Hosted Render (published template)
1
+ # Fill slots and Hosted Render — RETIRED
2
2
 
3
- Primary **Agent use** of a published single-page template: read the public slot table, fill values, submit a Hosted Render Job, poll for Artifact / Manifest.
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
- This path belongs to **Template Skill** (ADR-0021 / AC-25~26). Do **not** hand off to Content Skill for single-page fill-slots out图.
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
- ## Preconditions
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** — use fill-slots (`FILL_AND_RENDER.md`) |
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 **and** fill-slots Hosted Render of one published PageTemplate (`get_template` → slots → `create_render_job`).
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,4 +0,0 @@
1
- # Claude Desktop
2
-
3
- - Install the unified EasySociable Skill bundle. Content is filesystem-first under `Content Engine/`; hosted Template/Slideshow calls use the unified `easysociable` CLI/MCP.
4
- - Prefer the Skill frontmatter in each `SKILL.md`.
@@ -1,4 +0,0 @@
1
- # Codex
2
-
3
- - Install `skills/easysociable-content` under the host skill directory for local content workflows.
4
- - Install the unified EasySociable Skill bundle; hosted preview/render uses the unified `easysociable` CLI/MCP.
@@ -1,4 +0,0 @@
1
- # Hermes overrides
2
-
3
- - Point Hermes skill loader at this directory.
4
- - Prefer explicit `Content Engine/` paths in multiprocess environments.
@@ -1,4 +0,0 @@
1
- # OpenClaw overrides
2
-
3
- - Register the unified `easysociable` CLI/MCP entry.
4
- - Keep API Keys and session material out of tool logs. Gateway authentication is owned by the unified client.
@@ -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`.