@easysociable/cli 0.1.3 → 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 +13 -10
- package/content-engine/scripts/starter.mjs +3 -1
- package/content-engine/scripts/workbench.mjs +13 -8
- package/content-engine/starter/CLAUDE.md +217 -128
- package/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 +6 -3
- package/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/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/content-engine/starter/runs/_template/brief.md +1 -1
- package/content-engine/starter/runs/_template/pack.md +15 -7
- package/content-engine/starter/runs/_template/packet.md +6 -0
- package/content-engine/starter/swipe/_template.md +3 -1
- package/content-engine/starter/topics/README.md +4 -8
- package/content-engine/starter/topics/_index.md +12 -5
- package/content-engine/starter/topics/_template-item.md +64 -51
- package/content-engine/starter/topics/scoring.md +55 -4
- package/content-engine/workbench/__pycache__/build.cpython-310.pyc +0 -0
- package/content-engine/workbench/build.py +306 -97
- package/content-engine/workbench/serve.py +0 -0
- package/content-engine/workbench/template.html +173 -27
- package/dist/easysociable.js +191 -133
- package/dist/easysociable.js.map +1 -1
- package/package.json +13 -14
- package/skills/ONBOARDING.md +14 -15
- package/skills/easysociable-content/SKILL.md +100 -19
- 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 -45
- 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 +13 -16
- package/skills/easysociable-template/references/CATALOG_METADATA.md +21 -18
- package/skills/easysociable-template/scripts/generate-theme-from-hex.mjs +0 -0
- package/skills/easysociable-template/workflows/FILL_AND_RENDER.md +4 -83
- package/skills/easysociable-template/workflows/OUT_OF_SCOPE.md +3 -2
- package/content-engine/starter/discovery/README.md +0 -18
- package/content-engine/starter/discovery/_index.md +0 -27
- package/content-engine/starter/discovery/_template.md +0 -41
- package/content-engine/starter/topics/WATCHLIST.md +0 -65
- package/content-engine/starter/topics/watchlists/README.md +0 -10
- package/content-engine/starter/topics/watchlists/_shared.md +0 -14
- package/content-engine/starter/topics/watchlists/default.md +0 -6
|
@@ -1,5 +1,36 @@
|
|
|
1
1
|
# ContentPack v1
|
|
2
2
|
|
|
3
|
+
Page `role` is a **weak retrieval tag** (layout-ish), not sequence position.
|
|
4
|
+
`pageTemplateId` is the explicit published single-page template chosen by the
|
|
5
|
+
Agent. `slots` are public values only. Do not add a `deck_template_id`,
|
|
6
|
+
`bindingMap`, AST, ContentDocument, or product `arc` / `pageSequence`.
|
|
7
|
+
|
|
8
|
+
The Gateway validates each `role` against the closed enum and that slots exist.
|
|
9
|
+
It does not require Cover → Point → Steps → Recap → CTA.
|
|
10
|
+
|
|
11
|
+
This skill **does** require page 1 to be cover/hook class (`supportedRoles`
|
|
12
|
+
includes `cover` or `hook`) and forbids that class on later pages.
|
|
13
|
+
|
|
14
|
+
## Example: cost → mechanism (TikTok)
|
|
15
|
+
|
|
16
|
+
Opening beat is cost; page 1 is still a hook-class template.
|
|
17
|
+
|
|
18
|
+
```json
|
|
19
|
+
{
|
|
20
|
+
"schemaVersion": "content-pack.v1",
|
|
21
|
+
"platform": "tiktok",
|
|
22
|
+
"title": "Stop briefing a blank canvas",
|
|
23
|
+
"pages": [
|
|
24
|
+
{ "role": "hook", "pageTemplateId": "tpl_hook_001", "slots": { "text_0": "You finish the copy. Then you start over.", "text_1": "The design file kept none of the argument." } },
|
|
25
|
+
{ "role": "point", "pageTemplateId": "tpl_stack_001", "slots": { "text_0": "Roles, Brand, Layouts persist" } },
|
|
26
|
+
{ "role": "steps", "pageTemplateId": "tpl_stair_001", "slots": { "text_0": "Use them in that order" } },
|
|
27
|
+
{ "role": "cta", "pageTemplateId": "tpl_close_001", "slots": { "text_0": "Don't brief a blank canvas" } }
|
|
28
|
+
]
|
|
29
|
+
}
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
## Example: hook → value → cta
|
|
33
|
+
|
|
3
34
|
```json
|
|
4
35
|
{
|
|
5
36
|
"schemaVersion": "content-pack.v1",
|
|
@@ -13,12 +44,9 @@
|
|
|
13
44
|
}
|
|
14
45
|
```
|
|
15
46
|
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
The Gateway validates that each selected template supports the page role and
|
|
21
|
-
belongs to the account-visible catalog. It never silently replaces a selection.
|
|
47
|
+
Pick templates by **platform + canvas + slotSummary + density**, not by matching
|
|
48
|
+
the beat name to a family named Cover / Point / Steps / Recap / CTA. Page 1
|
|
49
|
+
must still be cover/hook class.
|
|
22
50
|
|
|
23
51
|
The renderer accepts any supported page count within the platform cap. A newly
|
|
24
52
|
published Page Template can be selected in a new Run without creating a
|
|
@@ -1,7 +1,26 @@
|
|
|
1
1
|
# Create Run
|
|
2
2
|
|
|
3
|
-
1.
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
4
|
|
7
|
-
|
|
3
|
+
1. Write one arc line (`references/ARC.md`). Forbidden default:
|
|
4
|
+
Cover → Point → Steps → Recap → CTA.
|
|
5
|
+
2. Build `content-pack.v1` from that argument. Page count follows the beats
|
|
6
|
+
(TikTok often 4–8), not the number of P0 families.
|
|
7
|
+
3. Check platform hardMin/hardMax.
|
|
8
|
+
4. List published Page Templates. `pages[0]` must be cover/hook class
|
|
9
|
+
(`supportedRoles` includes `cover` or `hook`). Do not use that class on
|
|
10
|
+
later pages. Remaining pages: platform + canvas + `slotSummary` + density.
|
|
11
|
+
`role` is a weak tag.
|
|
12
|
+
5. If `contentSlug` already has a Run: update only when topology matches
|
|
13
|
+
(same page count and `pageTemplateId`s). Otherwise create a new Run.
|
|
14
|
+
6. **Before** `create_run` / `slideshows create` (every create, not only the
|
|
15
|
+
first Run): check the knowledge hard gate — Identity Role / What I build /
|
|
16
|
+
Point of view have no `(fill)` and are non-empty; `boundaries.md` exists
|
|
17
|
+
with Not covering and Never claim non-empty; if `needs/` exists, ≥3 `N-`
|
|
18
|
+
rows, else skip. Read the files or run
|
|
19
|
+
`easysociable engine validate --run <run-dir> --require-knowledge`.
|
|
20
|
+
Fail → hand back to **easysociable-content** / refuse create; list missing
|
|
21
|
+
files. User must say **强制继续** / **force continue** to call Gateway.
|
|
22
|
+
No new Gateway or MCP params.
|
|
23
|
+
7. Call `create_run` / `slideshows create` through Gateway.
|
|
24
|
+
8. Save `runId`, `studioUrl`, and `status=draft`.
|
|
25
|
+
9. Do not call a Deck API, create a carousel template, or send a product
|
|
26
|
+
`pageSequence` / `arc` field.
|
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
# Out of scope
|
|
2
2
|
|
|
3
3
|
- DeckTemplate creation, `list_decks`, `CREATE_DECK`, or `BIND_P0_DECKS`.
|
|
4
|
+
- Product-level `arc` / Deck `pageSequence` SKUs (ADR-0026). Structure stays in the Content Pack.
|
|
5
|
+
- Defaulting every Run to Cover → Point → Steps → Recap → CTA.
|
|
6
|
+
- Cover/hook class templates on page 2+ (they belong on `pages[0]` only).
|
|
4
7
|
- ContentDocument as a render input (ADR-0021).
|
|
5
8
|
- Client-side RenderPlan or AST compilation.
|
|
6
9
|
- Full cross-platform Page Template coverage and ad-placement variants.
|
|
@@ -2,18 +2,15 @@
|
|
|
2
2
|
name: easysociable-template
|
|
3
3
|
description: >
|
|
4
4
|
Create single-page social image templates for EasySociable via the unified
|
|
5
|
-
Template MCP or `easysociable` CLI
|
|
6
|
-
(get_template → slots → create_render_job). Default create path is a Layout Family:
|
|
5
|
+
Template MCP or `easysociable` CLI. Default create path is a Layout Family:
|
|
7
6
|
one master canvas plus derived multi-platform variants (e.g. XHS 3:4, IG/Threads 4:5,
|
|
8
7
|
TikTok 9:16, LinkedIn 1:1) with hand-tuned layouts per preset. Use when the user wants
|
|
9
|
-
to author a page template from a reference image or text brief
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
slideshow composition, ContentDocument as render input, local content library, or
|
|
16
|
-
carousel packs.
|
|
8
|
+
to author a page template from a reference image or text brief, write a shared visual
|
|
9
|
+
design philosophy, explore layout concepts, co-create Theme/preview tokens, pull icons
|
|
10
|
+
via search_icons/get_icon, open Authoring Studio, or publish. Do not use for
|
|
11
|
+
fill-slots hosted PNG jobs (`create_render_job` is retired), multi-slide slideshow
|
|
12
|
+
composition, ContentDocument as render input, or carousel packs. Customer PNG packs
|
|
13
|
+
come from Slideshow Studio Download.
|
|
17
14
|
---
|
|
18
15
|
|
|
19
16
|
# EasySociable Template Skill
|
|
@@ -22,12 +19,12 @@ The public entry points are the unified `easysociable` CLI and one unified MCP
|
|
|
22
19
|
server. Do not install or invoke `easysociable-template`, `easysociable-slideshow`,
|
|
23
20
|
`easysociable-content`, or a separate Content/Slideshow MCP in V1.
|
|
24
21
|
|
|
25
|
-
**This skill owns
|
|
22
|
+
**This skill owns template authoring:**
|
|
26
23
|
|
|
27
24
|
1. **Author** templates as a **Layout Family** (master + multi-platform variants) → Studio + Publish (`workflows/MULTI_PLATFORM_FAMILY.md`).
|
|
28
|
-
2.
|
|
25
|
+
2. Fill-slots Hosted Render (`create_render_job`) is **retired** as a paid delivery path. Customer PNG packs come from Slideshow Studio Download.
|
|
29
26
|
|
|
30
|
-
It is a template factory
|
|
27
|
+
It is a template factory. It is **not** a multi-slide slideshow compositor and it is **not** a PNG API.
|
|
31
28
|
|
|
32
29
|
Every published page must carry **P0 catalog metadata** so Agents can filter and fill templates (`references/CATALOG_METADATA.md`).
|
|
33
30
|
|
|
@@ -51,7 +48,7 @@ Out of scope (hand off):
|
|
|
51
48
|
9. Layout model is **absolute positioning** on a **flat canvas tree** (see prior authoring rules / `AUTHORING_SOURCE.md`).
|
|
52
49
|
10. **Runtime layout CSS:** put exact geometry in JSX inline `style={{...}}`. Never depend on Tailwind arbitrary-value classes for geometry.
|
|
53
50
|
11. Run `scripts/validate-authoring-source.mjs` before every create/update.
|
|
54
|
-
12. `supportedRoles` uses closed **pageRoles
|
|
51
|
+
12. `supportedRoles` uses closed **pageRoles** as a **weak retrieval tag**, not sequence position. Family `name` describes **layout** (Poster / Stack / Count / Stair / Close), not a narrative beat. `platforms` is a multi-select array.
|
|
55
52
|
13. Canvas sizes must follow `references/PLATFORM_SPECS.md`.
|
|
56
53
|
14. **Text-only V2.1 authoring:** `DESIGN_BRIEF` → Philosophy → Concepts → assets/surface → author → Visual QA.
|
|
57
54
|
15. **Visual QA** before Studio handoff when authoring. For `image_reference`, QA **must** side-by-side compare Studio canvas to the reference (`VISUAL_QA.md` § Reference compare).
|
|
@@ -59,8 +56,8 @@ Out of scope (hand off):
|
|
|
59
56
|
16b. **Reference image → template (hard):** follow `workflows/AUTHORING_FROM_IMAGE.md` as SoT. **Read the reference with a vision tool**, write `referenceSpec` + `referenceImageInventory` into `design-plan.json`, and place pictorial regions as **`image` slots** (empty frames matching the boxes). `validate-design-v2.mjs` rejects `image_reference` plans missing those fields or using `css_svg` stand-ins for inventoried pictures. Do not mood-board a different layout.
|
|
60
57
|
17. Preserve `draftId`, `templateId`, `themeId`, `jobId`, `authoringStudioUrl`, and `previewUrl` across steps.
|
|
61
58
|
18. **Theme / Surface confirmation gates** unchanged for authoring (see `PALETTE_REVIEW`, `SURFACE_REVIEW`).
|
|
62
|
-
19. **
|
|
63
|
-
20. **
|
|
59
|
+
19. **Consumption is Slideshow Studio Download**, not fill-slots Hosted Render. `create_render_job` / CLI `renders create` return `HEADLESS_RENDER_DISABLED`. See `workflows/FILL_AND_RENDER.md`.
|
|
60
|
+
20. **Do not** treat Hosted Capture or local html-to-image as the Agent primary PNG path.
|
|
64
61
|
21. **Icons (hard rule — no shortcuts):**
|
|
65
62
|
- Any **recognizable icon** (arrows, chevrons, checkmarks, social glyphs, UI symbols, “next page” cues, etc.) **MUST** use Gateway Icon Catalog:
|
|
66
63
|
`search_icons` / CLI `icons search` → show ≤8 candidates → **user confirm** (or explicit “你定 / 用第 N 个”) → `get_icon` / CLI `icons get --idempotency-key …` → embed returned **`canonicalSvg`** and record **`iconAssetId`** / `iconId` on the decoration node.
|
|
@@ -5,9 +5,10 @@ Private AST/bindings stay server-side; this document is the **public selection c
|
|
|
5
5
|
|
|
6
6
|
## Design choices (locked)
|
|
7
7
|
|
|
8
|
-
1. **One closed `pageRoles` set** (stored as `supportedRoles`) —
|
|
8
|
+
1. **One closed `pageRoles` set** (stored as `supportedRoles`) — a **retrieval tag for layout kind**, not page position and not a story recipe. `cover` means poster-like slots, not “must be page 1”. Do not add a parallel `arc` / `pageSequence` taxonomy (ADR-0026).
|
|
9
9
|
2. **`platforms` is a multi-select array**. Include `generic` when the page fits any platform at that aspect.
|
|
10
10
|
3. **P0 fields are required to Publish.** P1 should be filled when known; P2 optional.
|
|
11
|
+
4. **Family `name` describes layout**, not a narrative beat. Prefer Poster / Stack / Count / Stair / Close (plus platform). Do not name families Cover / Point / Steps / Recap / CTA — choosers will glue those five names into one default pack.
|
|
11
12
|
|
|
12
13
|
Max **1–2** `supportedRoles` per page (primary + optional secondary).
|
|
13
14
|
|
|
@@ -33,25 +34,25 @@ Always also store exact `canvas: { width, height }`. Use `16:9` for X **1200×67
|
|
|
33
34
|
|
|
34
35
|
### Page roles (`supportedRoles` / pageRoles) — pick 1–2
|
|
35
36
|
|
|
36
|
-
| Role |
|
|
37
|
+
| Role | Layout kind (not sequence position) |
|
|
37
38
|
|---|---|
|
|
38
|
-
| `cover` |
|
|
39
|
-
| `hook` | Scroll-stop
|
|
40
|
-
| `setup` |
|
|
41
|
-
| `context` | Background / context |
|
|
42
|
-
| `value` | Single takeaway
|
|
39
|
+
| `cover` | Poster / first-frame-capable layout — may open a run, need not |
|
|
40
|
+
| `hook` | Scroll-stop / short-copy layout |
|
|
41
|
+
| `setup` | Problem-framing layout |
|
|
42
|
+
| `context` | Background / context layout |
|
|
43
|
+
| `value` | Single takeaway layout |
|
|
43
44
|
| `point` | One sharp point (lighter than value) |
|
|
44
45
|
| `checklist` | Fixed N text lines (no list binding type) |
|
|
45
|
-
| `proof` | Proof / credibility |
|
|
46
|
+
| `proof` | Proof / credibility layout |
|
|
46
47
|
| `evidence` | Evidence artifacts (data, case) |
|
|
47
|
-
| `compare` | Before/after or A/B
|
|
48
|
+
| `compare` | Before/after or A/B layout — valid as page 1 |
|
|
48
49
|
| `screenshot` | App/web UI screenshot frame |
|
|
49
|
-
| `metric` | Big number / KPI
|
|
50
|
-
| `quote` | Pull quote / testimonial |
|
|
51
|
-
| `steps` | Fixed-step howto |
|
|
52
|
-
| `cta` | Call to action |
|
|
53
|
-
| `follow` | Follow / profile CTA |
|
|
54
|
-
| `recap` | Summary / closing
|
|
50
|
+
| `metric` | Big number / KPI — valid as page 1 |
|
|
51
|
+
| `quote` | Pull quote / testimonial — valid as page 1 |
|
|
52
|
+
| `steps` | Fixed-step howto layout |
|
|
53
|
+
| `cta` | Call to action layout |
|
|
54
|
+
| `follow` | Follow / profile CTA layout |
|
|
55
|
+
| `recap` | Summary / closing layout |
|
|
55
56
|
|
|
56
57
|
Legacy-compatible: `cover`, `setup`, `value`, `proof`, `cta` remain valid.
|
|
57
58
|
|
|
@@ -98,7 +99,7 @@ hero | screenshot | avatar | product
|
|
|
98
99
|
|
|
99
100
|
| Field | Type | Notes |
|
|
100
101
|
|---|---|---|
|
|
101
|
-
| `name` | string | Human title |
|
|
102
|
+
| `name` | string | Human title — **layout**, not beat (e.g. `P0 Poster TikTok`, not `P0 Cover TikTok`) |
|
|
102
103
|
| `shortDescription` | string | One sentence for chooser UI |
|
|
103
104
|
| `platforms` | `Platform[]` | Multi-select; use `generic` when truly cross-platform |
|
|
104
105
|
| `canvasPreset` | preset enum | Plus exact `canvas` pixels |
|
|
@@ -189,7 +190,7 @@ Agent must produce a `selection-metadata.json` (or equivalent fields on the draf
|
|
|
189
190
|
|
|
190
191
|
```json
|
|
191
192
|
{
|
|
192
|
-
"name": "XHS
|
|
193
|
+
"name": "XHS Count 3:4",
|
|
193
194
|
"shortDescription": "大数字涨粉庆祝页,可选头像",
|
|
194
195
|
"platforms": ["xiaohongshu", "generic"],
|
|
195
196
|
"canvasPreset": "3:4",
|
|
@@ -207,7 +208,7 @@ Agent must produce a `selection-metadata.json` (or equivalent fields on the draf
|
|
|
207
208
|
"visualStyle": "swiss",
|
|
208
209
|
"bestFor": ["涨粉节点", "数据庆祝封面"],
|
|
209
210
|
"notFor": ["长清单干货", "多步教程"],
|
|
210
|
-
"selectionHints": "Prefer when
|
|
211
|
+
"selectionHints": "Prefer when slotSummary has one number + short text (KPI / cost hook), any page index.",
|
|
211
212
|
"locale": "zh-CN"
|
|
212
213
|
}
|
|
213
214
|
```
|
|
@@ -219,3 +220,5 @@ Agent must produce a `selection-metadata.json` (or equivalent fields on the draf
|
|
|
219
220
|
- Checklist without `fixedItemCount`
|
|
220
221
|
- `requiresImage: true` but `imageRoles` empty
|
|
221
222
|
- Platforms empty or inventing values outside the enum
|
|
223
|
+
- Naming a family Cover / Point / Steps / Recap / CTA so choosers assemble that sequence
|
|
224
|
+
- Treating `supportedRoles` as “this page must appear at this beat in every Run”
|
|
File without changes
|
|
@@ -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.
|
|
@@ -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.
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
# Discovery
|
|
2
|
-
|
|
3
|
-
Discovery is the intermediate layer between watchlist signals and Topics.
|
|
4
|
-
|
|
5
|
-
```text
|
|
6
|
-
watchlist → discovery → (explicit promote) → topic → brief
|
|
7
|
-
```
|
|
8
|
-
|
|
9
|
-
It makes the source understandable before deciding whether the idea belongs to us.
|
|
10
|
-
|
|
11
|
-
- `Source Digest` is a short natural-language note: what happened, the author's argument, support, native language, and limits.
|
|
12
|
-
- `Source limits` records what the source does not establish.
|
|
13
|
-
- `Decision` stores only workflow status and next action.
|
|
14
|
-
- A source with high engagement can still remain `saved` or `rejected`.
|
|
15
|
-
|
|
16
|
-
Do not add our audience, product, thesis, ownership, or candidate Topics to a Discovery.
|
|
17
|
-
Do not use 5C as the default Discovery reading format.
|
|
18
|
-
Discovery does not generate publish-ready copy.
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
# Discovery index
|
|
2
|
-
|
|
3
|
-
One row = one analyzed external signal from a watchlist scan. Discovery is not a topic queue.
|
|
4
|
-
|
|
5
|
-
Newest on top.
|
|
6
|
-
|
|
7
|
-
| id | date | profile | platform | source_handle | source_url | source_claim | source_role | status | next_action | topic_ids | file |
|
|
8
|
-
|----|------|---------|----------|---------------|------------|--------------|-------------|--------|-------------|-----------|------|
|
|
9
|
-
| -- | ---- | ------- | -------- | ------------- | ---------- | ------------ | ----------- | ------ | ----------- | --------- | ---- |
|
|
10
|
-
|
|
11
|
-
## Status values
|
|
12
|
-
|
|
13
|
-
| status | Meaning |
|
|
14
|
-
|--------|---------|
|
|
15
|
-
| `unread` | Signal captured; digest not read |
|
|
16
|
-
| `read` | Source Digest completed |
|
|
17
|
-
| `saved` | Useful reference; no Topic decision yet |
|
|
18
|
-
| `promoted` | User explicitly promoted it to Topic |
|
|
19
|
-
| `rejected` | Not relevant, provable, or ownable |
|
|
20
|
-
|
|
21
|
-
## Rules
|
|
22
|
-
|
|
23
|
-
- Watchlist heat is source context, not our evidence.
|
|
24
|
-
- New Discovery records contain only Source Digest, source limits, and workflow state.
|
|
25
|
-
- Do not create a Topic during watchlist scanning; Topic creation requires explicit promotion.
|
|
26
|
-
- Do not store our audience, product, ownership, or candidate opportunities inside Discovery.
|
|
27
|
-
- 5C belongs to Topic evaluation and is never the default Discovery reading surface.
|
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
id: D-YYYYMMDD-XX
|
|
3
|
-
date: YYYY-MM-DD
|
|
4
|
-
status: read
|
|
5
|
-
profile: default
|
|
6
|
-
platform: x
|
|
7
|
-
source_role: demand | ally | foil | mechanism
|
|
8
|
-
---
|
|
9
|
-
|
|
10
|
-
# Discovery
|
|
11
|
-
|
|
12
|
-
One sentence describing the external signal in the source's terms. Do not turn it into our topic here.
|
|
13
|
-
|
|
14
|
-
## Source
|
|
15
|
-
|
|
16
|
-
- **handle:**
|
|
17
|
-
- **url:**
|
|
18
|
-
- **captured_at:**
|
|
19
|
-
- **engagement snapshot:** likes / replies / bookmarks / views @ time
|
|
20
|
-
- **why on watchlist:**
|
|
21
|
-
|
|
22
|
-
## Source Digest
|
|
23
|
-
|
|
24
|
-
### In one sentence
|
|
25
|
-
|
|
26
|
-
### What happened
|
|
27
|
-
|
|
28
|
-
### What the author is arguing
|
|
29
|
-
|
|
30
|
-
### How the author supports it
|
|
31
|
-
|
|
32
|
-
### The author's own language
|
|
33
|
-
|
|
34
|
-
### Source limits
|
|
35
|
-
|
|
36
|
-
What the source does not establish. Keep this short.
|
|
37
|
-
|
|
38
|
-
## Decision
|
|
39
|
-
|
|
40
|
-
- **status:** unread | read | saved | promoted | rejected
|
|
41
|
-
- **next_action:** none | revisit | promote_to_topic
|
|
@@ -1,65 +0,0 @@
|
|
|
1
|
-
# Watchlist (router)
|
|
2
|
-
|
|
3
|
-
**Scheme B:** one radar table **per profile**, not one global table.
|
|
4
|
-
|
|
5
|
-
No X Private List required. Agent updates files under `topics/watchlists/`; user works in chat only.
|
|
6
|
-
|
|
7
|
-
## File map
|
|
8
|
-
|
|
9
|
-
| Path | Role |
|
|
10
|
-
|------|------|
|
|
11
|
-
| `topics/WATCHLIST.md` | **This file** — routing, columns, scan rules |
|
|
12
|
-
| `topics/watchlists/_shared.md` | Shared rows (`*`) — merge into every scan |
|
|
13
|
-
| `topics/watchlists/<profile_id>.md` | Profile-scoped radar (must match `profiles/_index` id) |
|
|
14
|
-
| `topics/watchlists/README.md` | Short folder note |
|
|
15
|
-
|
|
16
|
-
### Profiles with a watchlist file today
|
|
17
|
-
|
|
18
|
-
| profile_id | file |
|
|
19
|
-
|------------|------|
|
|
20
|
-
| default | `watchlists/default.md` |
|
|
21
|
-
|
|
22
|
-
New profile → create `watchlists/<id>.md` (copy empty table header from `_shared.md` or an existing file).
|
|
23
|
-
|
|
24
|
-
## Columns (in each table file)
|
|
25
|
-
|
|
26
|
-
| Column | Meaning |
|
|
27
|
-
|--------|---------|
|
|
28
|
-
| `#` | Id within that file (`#1…` profile-local; `#S-01…` in `_shared`) |
|
|
29
|
-
| **`platform`** | Network of this handle + where Agent scans: `x` \| `tiktok` \| `linkedin` \| `ig` \| `youtube` \| `xhs` \| `threads` \| … |
|
|
30
|
-
| `handle` | Platform-native id without `@` |
|
|
31
|
-
| `niche_tag` | Topic/product tag — not a substitute for `platform` |
|
|
32
|
-
| `why_on_list` | One line |
|
|
33
|
-
| `weight` | 0.5–1.5 |
|
|
34
|
-
| `status` | active / paused / removed |
|
|
35
|
-
|
|
36
|
-
**No `profiles` column in the table** — the **filename** is the profile scope.
|
|
37
|
-
Shared across profiles → put the row in `_shared.md` (same as `*`).
|
|
38
|
-
Same handle needed by two profiles only (not all) → **copy the row into both files** (or later a small group file; avoid until needed).
|
|
39
|
-
|
|
40
|
-
## Resolve profile for scan / add (required)
|
|
41
|
-
|
|
42
|
-
1. User names **profile_id** → use it.
|
|
43
|
-
2. User names **account** handle → resolve via `accounts/_index.md` → `profile_id`.
|
|
44
|
-
3. User names **neither** → **do not default**. List active profiles from `profiles/_index.md` and **ask which profile** (or account).
|
|
45
|
-
4. Load rows = **`watchlists/_shared.md` (active)** ∪ **`watchlists/<profile_id>.md` (active)**.
|
|
46
|
-
5. Filter **`platform`**: user-specified, else default **`x`**; `全部平台` = no platform filter.
|
|
47
|
-
6. Create **Discovery** records first; do not create Topics during the scan. Cap **5** new **`produce`** topics only when the user later promotes. Sort watchlist rows by weight (≥1.3 first).
|
|
48
|
-
7. Wrong network for a row → never (e.g. no X tools on `platform=tiktok`).
|
|
49
|
-
|
|
50
|
-
## Maintenance
|
|
51
|
-
|
|
52
|
-
| User says | Agent does |
|
|
53
|
-
|-----------|------------|
|
|
54
|
-
| 把 @foo 加进 watchlist | Resolve/ask **profile** + **platform**; append row to that profile file (or `_shared` if user says 全 profile / shared) |
|
|
55
|
-
| 去掉 #n / @foo | Edit the correct file; if ambiguous, ask |
|
|
56
|
-
| 新 profile 建雷达 | Create `watchlists/<id>.md` |
|
|
57
|
-
|
|
58
|
-
## Scan rules (also CLAUDE § Discovery)
|
|
59
|
-
|
|
60
|
-
- Create one Discovery per meaningful signal; discard noise before analysis.
|
|
61
|
-
- Watchlist scan creates **Discovery** records first; it does not create Topics directly.
|
|
62
|
-
- Write a Source Digest + source limits only. Do not add our audience, product, ownership, or candidate Topics.
|
|
63
|
-
- Keep source engagement as context on the Discovery file; copy `src_*` to `topics/_index.md` only after promotion.
|
|
64
|
-
- Report `unread / read / saved / promoted / rejected` counts after the batch.
|
|
65
|
-
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
# topics/watchlists/
|
|
2
|
-
|
|
3
|
-
**One file per profile** + optional shared table.
|
|
4
|
-
|
|
5
|
-
| Path | Scope |
|
|
6
|
-
|------|--------|
|
|
7
|
-
| `_shared.md` | All profiles (`*`) — merged on every scan |
|
|
8
|
-
| `<profile_id>.md` | Only that profile (e.g. `easysociable-builder.md`) |
|
|
9
|
-
|
|
10
|
-
Registry / scan rules: `../WATCHLIST.md`.
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
# Watchlist — shared (`*`)
|
|
2
|
-
|
|
3
|
-
Rows here apply to **every** profile when scanning (merge with `topics/watchlists/<profile_id>.md`).
|
|
4
|
-
|
|
5
|
-
Use only for handles that are truly cross-positioning. Prefer putting niche-specific radars in the profile file.
|
|
6
|
-
|
|
7
|
-
| # | platform | handle | niche_tag | why_on_list | weight | status |
|
|
8
|
-
|---|----------|--------|-----------|-------------|--------|--------|
|
|
9
|
-
|
|
10
|
-
*(empty — add rows only when a handle should appear for all profiles)*
|
|
11
|
-
|
|
12
|
-
## Id note
|
|
13
|
-
|
|
14
|
-
Use `#S-01`, `#S-02`, … so shared ids do not collide with profile-local `#1…`.
|