@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.
Files changed (59) hide show
  1. package/README.md +13 -10
  2. package/content-engine/scripts/starter.mjs +3 -1
  3. package/content-engine/scripts/workbench.mjs +13 -8
  4. package/content-engine/starter/CLAUDE.md +217 -128
  5. package/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 +6 -3
  15. package/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/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/content-engine/starter/runs/_template/brief.md +1 -1
  25. package/content-engine/starter/runs/_template/pack.md +15 -7
  26. package/content-engine/starter/runs/_template/packet.md +6 -0
  27. package/content-engine/starter/swipe/_template.md +3 -1
  28. package/content-engine/starter/topics/README.md +4 -8
  29. package/content-engine/starter/topics/_index.md +12 -5
  30. package/content-engine/starter/topics/_template-item.md +64 -51
  31. package/content-engine/starter/topics/scoring.md +55 -4
  32. package/content-engine/workbench/__pycache__/build.cpython-310.pyc +0 -0
  33. package/content-engine/workbench/build.py +306 -97
  34. package/content-engine/workbench/serve.py +0 -0
  35. package/content-engine/workbench/template.html +173 -27
  36. package/dist/easysociable.js +191 -133
  37. package/dist/easysociable.js.map +1 -1
  38. package/package.json +13 -14
  39. package/skills/ONBOARDING.md +14 -15
  40. package/skills/easysociable-content/SKILL.md +100 -19
  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 -45
  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 +13 -16
  49. package/skills/easysociable-template/references/CATALOG_METADATA.md +21 -18
  50. package/skills/easysociable-template/scripts/generate-theme-from-hex.mjs +0 -0
  51. package/skills/easysociable-template/workflows/FILL_AND_RENDER.md +4 -83
  52. package/skills/easysociable-template/workflows/OUT_OF_SCOPE.md +3 -2
  53. package/content-engine/starter/discovery/README.md +0 -18
  54. package/content-engine/starter/discovery/_index.md +0 -27
  55. package/content-engine/starter/discovery/_template.md +0 -41
  56. package/content-engine/starter/topics/WATCHLIST.md +0 -65
  57. package/content-engine/starter/topics/watchlists/README.md +0 -10
  58. package/content-engine/starter/topics/watchlists/_shared.md +0 -14
  59. package/content-engine/starter/topics/watchlists/default.md +0 -6
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@easysociable/cli",
3
- "version": "0.1.3",
3
+ "version": "0.1.4",
4
4
  "description": "Agent-first CLI for EasySociable: Content Engine, Template, Slideshow, and MCP",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -37,13 +37,6 @@
37
37
  "LICENSE",
38
38
  "README.md"
39
39
  ],
40
- "scripts": {
41
- "typecheck": "tsc --noEmit",
42
- "test": "vitest run",
43
- "build": "tsup",
44
- "prepack": "node scripts/prepack.mjs && pnpm build",
45
- "pack:check": "npm pack --dry-run"
46
- },
47
40
  "publishConfig": {
48
41
  "access": "public",
49
42
  "registry": "https://registry.npmjs.org/"
@@ -52,13 +45,19 @@
52
45
  "commander": "^11.1.0"
53
46
  },
54
47
  "devDependencies": {
55
- "@easysociable/mcp-server": "workspace:*",
56
- "@easysociable/template-gateway-client": "workspace:*",
57
- "@easysociable/tsconfig": "workspace:*",
58
- "@easysociable/vitest-config": "workspace:*",
59
48
  "@types/node": "^22.14.0",
60
49
  "tsup": "^8.0.2",
61
50
  "typescript": "^5.8.3",
62
- "vitest": "^1.3.1"
51
+ "vitest": "^1.3.1",
52
+ "@easysociable/mcp-server": "0.0.0",
53
+ "@easysociable/tsconfig": "0.0.0",
54
+ "@easysociable/template-gateway-client": "0.0.0",
55
+ "@easysociable/vitest-config": "0.0.0"
56
+ },
57
+ "scripts": {
58
+ "typecheck": "tsc --noEmit",
59
+ "test": "vitest run",
60
+ "build": "tsup",
61
+ "pack:check": "npm pack --dry-run"
63
62
  }
64
- }
63
+ }
@@ -11,28 +11,28 @@ V1 expects an Agent (Grok Bot, Codex, Claude Code, …) to drive setup. The webs
11
11
  # or: npm i -g @easysociable/cli
12
12
  ```
13
13
 
14
- 2. **Create the Content Engine** (markdown + workbench)
14
+ 2. **Install Skills + MCP** (Template + Slideshow by default; for Codex / Claude Code)
15
15
 
16
16
  ```bash
17
- easysociable engine init --root /workspace --yes
18
- easysociable engine serve --engine /workspace/Content Engine --no-open
17
+ easysociable install --yes
19
18
  ```
20
19
 
21
- On a laptop, use any parent path instead of `/workspace`.
20
+ Default skills:
22
21
 
23
- 3. **Install hosted Skills + MCP** (Template + Slideshow by default; for Codex / Claude Code)
24
-
25
- ```bash
26
- easysociable install --yes
27
- ```
22
+ - `easysociable-slideshow` — turns a draft into slideshow pages you preview and download in the dashboard
23
+ - `easysociable-template` — creates page templates
28
24
 
29
- Optional pointer skill (discovery only — operations live in `Content Engine/CLAUDE.md`):
25
+ Optional Content Engine skill (pointer only — operations live in `Content Engine/CLAUDE.md`):
30
26
 
31
27
  ```bash
32
- easysociable install --skills content --yes
28
+ easysociable install --skills content,template,slideshow --yes
29
+ easysociable engine init --root /workspace --yes
30
+ easysociable engine serve --engine /workspace/Content Engine --no-open
33
31
  ```
34
32
 
35
- 4. **Ask the Agent to create graphics** — account creation is deferred until a hosted operation requires authentication.
33
+ On a laptop, use any parent path instead of `/workspace` for `engine init` / `serve`.
34
+
35
+ 3. **Ask the Agent to create graphics** — account creation is deferred until a hosted operation requires authentication. If you installed the content skill: interview and write the profile first, then capture audience quotes into `needs/` (at least 3, aim for 5); do not create a slideshow yet.
36
36
 
37
37
  ## Lazy auth (Agent script)
38
38
 
@@ -40,8 +40,7 @@ When a Gateway call returns `AUTH_REQUIRED`, `API_KEY_INVALID`, or the CLI says
40
40
  `Run easysociable auth login`, respond with:
41
41
 
42
42
  ```text
43
- EasySociable needs a workspace API key before it can preview or render on the
44
- Gateway.
43
+ EasySociable needs a workspace API key before it can create Brands, images, drafts or Slideshow Runs on the Gateway.
45
44
 
46
45
  1. Open https://my.easysociable.com/auth/signup (or sign in with Google).
47
46
  2. Verify your email if you used password signup (required before API keys).
@@ -64,4 +63,4 @@ idempotency key when applicable.
64
63
  ## What requires auth
65
64
 
66
65
  - Brands, Themes, images, drafts, Slideshow Runs
67
- - Hosted preview sessions and final PNG renders (`hosted_render_page` allowance)
66
+ - Studio preview and Studio Download (Free: 3 Downloads/month)
@@ -1,51 +1,132 @@
1
1
  ---
2
2
  name: easysociable-content
3
3
  description: >
4
- Operate the EasySociable Content Engine (capture, discovery, topics, runs).
4
+ Operate the EasySociable Content Engine (profile, needs, products, recommendations, topics, runs, workbench).
5
+ Triggers: 采访我, 完善人设, interview me, who am I as a creator, 建立 profile
6
+ — follow workflows/INTERVIEW.md (engine CLAUDE.md § Interview wins if present).
7
+ Triggers: 记需求, 扫需求选题, capture audience quotes, user needs, 调研需求, 需求落库
8
+ — follow workflows/NEEDS.md (engine CLAUDE.md § Needs wins if present).
9
+ Triggers: 更新产品, 产品库, product facts, product pricing, product offer
10
+ — follow the engine CLAUDE.md § Products and edit `products/`.
11
+ Triggers: 推荐产品, 评测工具, compare tools, review an AI product
12
+ — edit `recommendations/`; do not treat third-party subjects as owned Products.
13
+ Triggers: 做成选题, 开一单, 出图
14
+ — follow engine CLAUDE.md (§ Topics / § Open a run / § PagePack).
5
15
  If no engine exists, run `easysociable engine init`. Then follow
6
16
  Content Engine/CLAUDE.md. Render handoff: easysociable-template (1 page) or
7
17
  easysociable-slideshow (2+). Never publish or post.
8
18
  ---
9
19
 
10
- # EasySociable Content (pointer)
20
+ # EasySociable Content
11
21
 
12
- This skill is an entry card only. **Do not invent a parallel workflow.**
22
+ Entry card for agents. **Do not invent a parallel workflow.** Instance SoT is that engine’s `Content Engine/CLAUDE.md`. Workflows here fill gaps or win when newer than the matching § in CLAUDE.md.
13
23
 
14
- ## Create the engine
24
+ ## Product boundary
25
+
26
+ - Teach a **Content Engine** (signal → decision → draft → review → reusable learning).
27
+ - **EasySociable** is the **visual production layer** inside that engine — not the content brain, not the whole system.
28
+ - For `easysociable-builder` needs research, prefer **L1 system / L2 judgment-review** pains (sustainable publishing) over **L3 visual-tool** friction, unless the user asks for L3.
29
+
30
+ ## Pipeline (do not collapse stages)
31
+
32
+ ```text
33
+ Profile / Audience
34
+ → Needs (verbatim audience quotes)
35
+ → optional Product (owned offer facts) or Recommendation (third-party review subject)
36
+ → Pillar (what this profile discusses) + Lane (how it publishes)
37
+ → Topic (decision summary + readable judgment + Score appendix)
38
+ → Run → Pack → Publish / feedback
39
+ ```
40
+
41
+ | Stage | Owns | Does not |
42
+ |-------|------|----------|
43
+ | Needs `N-` | Verbatim reader/operator quotes | Watchlist hooks, Agent rewrites |
44
+ | Products `P-` | Owned offer facts, pricing, boundaries | Audience demand or third-party reviews |
45
+ | Recommendations `R-` | Third-party subject, evidence, limits, disclosure | Owned product claims |
46
+ | Pillars / lanes | Durable subject / publishing mode | A replacement for Needs or evidence |
47
+ | Topic `T-` | Human judgment card + opp gate | Being auto-created from heat |
48
+ | Workbench | Read-only observatory | Source of truth (markdown indexes are) |
49
+
50
+ ## Hard rules
51
+
52
+ 1. **No invented quotes** — Needs quote cell = verbatim only. Gloss is separate (`layer=L1|L2|L3` allowed in gloss).
53
+ 2. **Heat ≠ topic** — External source metrics never make `ready`.
54
+ 3. **Never invent `N-` from a product, vendor claim, or headline.** Match captured needs only.
55
+ 4. **Topic decision card first** — start with 结论 / 状态原因 / 适合谁 / 核心判断 / 下一步, then explain the problem, current belief, angle, timing, expected belief change, evidence gap, and recommended form. Keep scores and IDs in the appendix. Chat output is the readable decision card, not a score walkthrough.
56
+ 5. **`N-` never in `capture_id`** — needs go in `need_ids` only.
57
+ 6. **Rebuild workbench** after markdown writes in the engine vault.
58
+ 7. **Keep ownership explicit** — `products/` is for offers we own or provide;
59
+ `recommendations/` is for third-party tools and products. A Topic may cite
60
+ `product_ids`, `recommendation_ids`, both, or neither.
61
+ 8. **Use the smallest honest Topic mode** — demand-led is the default;
62
+ product/recommendation inputs do not prove audience demand.
63
+
64
+ Topic modes:
65
+
66
+ ```text
67
+ demand = Needs + Profile
68
+ demand_to_offer = Needs + Product + Profile
69
+ demand_to_review = Needs + Recommendation + Profile
70
+ review = Recommendation + evidence + Profile
71
+ offer_education = Product + mechanism + Profile
72
+ profile_thesis = Profile + Pillar
73
+ ```
74
+
75
+ ## Create / serve / build
15
76
 
16
77
  ```bash
17
78
  easysociable engine init --root <parent-or-engine> --yes
18
79
  easysociable engine serve --engine <parent>/Content Engine --no-open
80
+ easysociable engine build --engine <parent>/Content Engine
81
+ # or, inside the vault:
82
+ python3 workbench/build.py
19
83
  ```
20
84
 
21
85
  On a dedicated agent computer (e.g. Grok Bot), prefer `--root /workspace`.
22
86
 
23
- Existing files are never overwritten. `python3` is required for the workbench.
87
+ Existing files are never overwritten. `python3` is required for the workbench. Observatory: `http://127.0.0.1:8765/workbench/` — top tabs include **需求库 / Needs**. If `serve.py` is already up, do not start a second server; rebuild only.
24
88
 
25
- ## Operate
89
+ `engine init` adds missing `products/` and `recommendations/` starter files to
90
+ older vaults without overwriting user files. It does not invent recommendation
91
+ entries or migrate existing product notes.
26
92
 
27
- Read and follow `Content Engine/CLAUDE.md` (and `engine.json`, `platforms/<platform>.md`).
93
+ ## Operate
28
94
 
29
- Rebuild the observatory after markdown writes:
95
+ 1. Resolve account → profile (engine `CLAUDE.md`).
96
+ 2. Route by intent (table below). Prefer engine `CLAUDE.md` sections; use `workflows/*` when that file is newer or the § is missing.
97
+ 3. Always return the structured chat card the section defines.
98
+ 4. Rebuild workbench after writes.
30
99
 
31
- ```bash
32
- easysociable engine build --engine <Content Engine>
33
- ```
100
+ | Intent | Action |
101
+ |--------|--------|
102
+ | 采访我 / interview me / 完善人设 / 建立 profile | **workflows/INTERVIEW.md** (not a render) |
103
+ | 记需求 / 用户原话 / capture audience quotes / 调研需求 / 需求落库 | **workflows/NEEDS.md** (not a render) |
104
+ | 更新产品 / 产品库 / product facts | Engine **§ Products** — update owned offer facts and dated pricing |
105
+ | 推荐产品 / 评测工具 / compare or review | `recommendations/` — collect evidence and disclosure before Topic |
106
+ | 扫需求选题 | **NEEDS.md** then Topics from `needs/` `status=captured` |
107
+ | 做成选题 / 生成 topic | engine **§ Topics** — explicit input |
108
+ | 开一单 / 用 T-… 开一单 | engine **§ Open a run** (ask platform; multi → N runs) |
109
+ | 1 page image | **easysociable-template** (after hard gate) |
110
+ | 2+ pages on tiktok / instagram / linkedin / threads | **easysociable-slideshow** (after hard gate) |
111
+ | x / xiaohongshu images | **easysociable-template** only (after hard gate) |
34
112
 
35
- ## Render handoff
113
+ ## Render hard gate
36
114
 
37
- | Intent | Hand off |
38
- |--------|----------|
39
- | 1 page image | **easysociable-template** |
40
- | 2+ pages on tiktok / instagram / linkedin / threads | **easysociable-slideshow** |
41
- | x / xiaohongshu images | **easysociable-template** only |
115
+ **Before any template/slideshow call:** Identity in `profiles/<active>/voice.md` — Role / What I build / Point of view — no `(fill)` and non-empty; `boundaries.md` exists with Not covering and Never claim both non-empty. If `needs/` exists, `needs/_index.md` ≥ **3** `N-` rows; if `needs/` is absent, skip that count. Public handle MAY stay `(fill)`.
42
116
 
43
- Validate a run before slideshow create:
117
+ On fail: **stay in this skill**. List missing files. Do not call template or slideshow. User must say **强制继续** / **force continue** to proceed.
44
118
 
45
119
  ```bash
46
- easysociable engine validate --run <run-dir> --require-pack
120
+ easysociable engine validate --run <run-dir> --require-pack --require-knowledge
47
121
  ```
48
122
 
123
+ Slideshow packs need an **Arc** line first. Do not default Cover → Point → Steps → Recap → CTA. Page 1 is not automatically `cover`. Handoff: **easysociable-slideshow** (`references/ARC.md`).
124
+
125
+ ## Research (Needs)
126
+
127
+ - Prefer host research tools. On **X**: built-in `x_*` first; fall back to agent-reach / `twitter` only if insufficient.
128
+ - Store **commenter** words when scraping threads. Do not invent `N-` when a platform tool is missing—stop and ask for paste.
129
+
49
130
  ## Out of scope
50
131
 
51
132
  No social posting, Content MCP, Local API, or SQLite content library.
@@ -0,0 +1,70 @@
1
+ # Interview (creator profile)
2
+
3
+ Not a fourth skill. If the engine `CLAUDE.md` already has **§ Interview**, follow that section. Otherwise follow this file.
4
+
5
+ Do **not** ingest needs / quotes here. Do **not** scan the watchlist. Do **not** create a slideshow or call template/slideshow.
6
+
7
+ ## Triggers
8
+
9
+ - 采访我
10
+ - 完善人设
11
+ - interview me
12
+ - who am I as a creator
13
+ - 建立 profile
14
+
15
+ ## Rules
16
+
17
+ - Ask **one dimension at a time**. Persist that dimension **before** asking the next. Do not batch seven dimensions to the end.
18
+ - Resume by reading files. Skip Public handle `(fill)` (done unless the user wants a handle). Continue from the first gated empty Identity cell (Role / What I build / Point of view) or the next unfinished dimension. Do not re-ask filled Identity rows.
19
+ - Existing `voice.md` with Identity filled but no `## Experience` / `## Values`: **append those headings at the end**. Do not rewrite filled Identity rows.
20
+ - Missing `boundaries.md`: write the empty starter (headings only), then interview. **Never invent boundaries.**
21
+ - Missing `stories.md` / `expression.md`: create the starter file, mark `profile: partial`, continue.
22
+ - `audience.md` / `pillars.md` in this workflow are **drafts only** (hypothesis). Do not invent a full ICP.
23
+ - Never invent bio facts, stories, or values that the user did not say.
24
+
25
+ ## Dimensions → files (8–12 questions)
26
+
27
+ | # | Dimension | Questions | Persist immediately to |
28
+ |---|-----------|-----------|------------------------|
29
+ | 1 | Identity (2) | 你对外是谁、做什么?你希望别人记住的那句 point of view 是什么? | `voice.md` `## Identity` — Role / What I build / Point of view. Public handle MAY stay `(fill)`. |
30
+ | 2 | Experience (1–2) | 文案可以引用的 2–3 件事实(年份、角色、做过的事)。没有的就写「not claiming」。 | `voice.md` `## Experience` (append heading if missing) |
31
+ | 3 | Style (1–2) | 想听起来像谁;最讨厌的 AI 腔 / 营销腔。 | `voice.md` `## Persona` + `## Do not say` |
32
+ | 4 | Values (1) | 你一定会说 / 一定不说的主张。 Repeatable topics → `pillars.md` names later, not a copy of this table. | `voice.md` `## Values` (append heading if missing) |
33
+ | 5 | Boundaries (1) | 哪些话题、人群、承诺碰不得。 | `profiles/<id>/boundaries.md`. If the file is missing, write empty starter first, then fill. Never invent. |
34
+ | 6 | Expression (1) | 举三个你喜欢的表达、三个你看到就烦的。 | `profiles/<id>/expression.md` |
35
+ | 7 | Stories (1, skippable) | 一则你常讲、且愿意公开的故事(情境 → 选择 → 教训)。 | `profiles/<id>/stories.md` |
36
+ | 8 | Audience draft (1) | 你以为在写给谁? Mark `status: hypothesis`. | `audience.md` Primary readers |
37
+
38
+ ## Persist card (after each dimension)
39
+
40
+ ```text
41
+ ✅ Profile · Identity
42
+ 【File】 profiles/default/voice.md
43
+ 【Wrote】 Role … · POV …
44
+ 【Missing】 Experience, Values, stories.md
45
+ 【Next】 经历(2–3 条可引用事实)
46
+ ```
47
+
48
+ ### Example — boundaries file missing
49
+
50
+ ```text
51
+ ✅ Profile · Boundaries
52
+ 【File】 profiles/default/boundaries.md
53
+ 【Wrote】 empty starter (## Not covering / ## Never claim). Did not invent boundaries.
54
+ 【Missing】 Not covering, Never claim
55
+ 【Next】 边界(哪些话题、人群、承诺碰不得)
56
+ ```
57
+
58
+ ## Completion (single table — do not invent other numbers)
59
+
60
+ | Level | Condition | Behavior |
61
+ |-------|-----------|----------|
62
+ | **Hard gate** (refuse slideshow handoff / `create_run`) | Identity **only** Role / What I build / Point of view have no `(fill)` and are non-empty (Public handle and Not claiming MAY stay `(fill)` / starter copy) **and** `boundaries.md` exists with Not covering **and** Never claim both non-empty. If `needs/` exists, also `needs/_index.md` ≥ 3 `N-` rows; if `needs/` is absent, skip that count. | Refuse 出图 / PagePack handoff / `slideshows create`. List missing files. User must say **强制继续** / **force continue** to proceed. |
63
+ | **First-session goal** | Hard gate **and** Persona has at least one personalized line **and** needs **target 5** (under 5 still passes the hard gate) **and** `stories.md` may be 0–1 | Open card `profile: partial`. May 扫需求选题. Still no graphics unless forced. |
64
+ | **Complete seven dimensions** | Identity + Experience (≥2) + Values (≥3) + Persona/Do not say + `stories.md` ≥1 + `boundaries.md` + `expression.md` likes/dislikes ≥3 each + needs ≥5 | Open card `profile: complete`. Remaining gaps are draft reminders only — **not** a hard-stop on graphics. |
65
+
66
+ Experience / Values / expression are **not** the hard gate. Missing `stories.md` / `expression.md` = partial. Missing `boundaries.md` file = hard-gate fail.
67
+
68
+ ## Open card
69
+
70
+ After the session (or on resume): `profile: partial | complete` from the table above.
@@ -0,0 +1,82 @@
1
+ # Needs (audience quotes)
2
+
3
+ Not a fourth skill. If the engine `CLAUDE.md` already has **§ Needs**, follow that section **unless this file is newer** — then this file wins for Needs-only rules.
4
+
5
+ Do **not** invent quotes. Do **not** scan the watchlist to mint needs. Do **not** create a slideshow.
6
+
7
+ ## Triggers
8
+
9
+ - 记需求 / 用户原话 / 评论导出
10
+ - 扫需求选题
11
+ - capture audience quotes / user needs
12
+ - 调研需求 / 需求落库 / 重新调研并落库
13
+
14
+ ## Research axis (easysociable-builder default)
15
+
16
+ Product teaches **Content Engines**; EasySociable is the **visual layer**. When researching or screening needs for this profile:
17
+
18
+ | Layer | Means | Default |
19
+ |-------|--------|---------|
20
+ | **L1** | System / sustainability — what to say, what to publish next, memory, pipeline, consistency | **Prefer** |
21
+ | **L2** | Judgment / review / approval — AI polished but empty; bottleneck moved to human check | **Prefer** |
22
+ | **L3** | Visual / tool friction — Canva, Figma, “looks AI”, brand kit paste | Keep only if user asks; else do not promote as primary |
23
+
24
+ Put `layer=L1|L2|L3` in **`## Our gloss` only** — never in the index `quote` cell.
25
+
26
+ **Reject:** course/toolkit CTAs, product demos dressed as pains, watchlist viral titles as quotes, Agent-paraphrased “quotes”, wrong-ICP “idk what to post” with no system angle.
27
+
28
+ ## Rules
29
+
30
+ - Quote cell = **verbatim**. Gloss goes in `## Our gloss`, never in the index `quote` column.
31
+ - Status is only `captured` | `promoted` | `retired`. **Never** `clustered`. Merge is not a new status.
32
+ - Synonym merge: propose, wait for user yes, then keep the surviving `N-` as `captured`, `frequency += 1`, append a sighting. Retire a mistaken duplicate and note it on the surviving sighting. No hosted clustering.
33
+ - Do not mark `promoted` without a `T-` whose `need_ids` contain this `N-`. `topic_ids` non-empty ≡ `promoted`.
34
+ - Never write `N-` into topic `capture_id`.
35
+ - Hard gate (graphics): once `needs/` exists, `needs/_index.md` needs ≥ **3** `N-` rows. First-session **target** is **5** (under 5 still passes the hard gate). Do not invent quotes to hit the number.
36
+ - Quotes may include DMs / students. Keep local. Redact PII if used as published copy.
37
+ - After Needs writes: rebuild workbench (`python3 workbench/build.py` or `easysociable engine build`).
38
+
39
+ ## Delete vs retire
40
+
41
+ - `retired` = soft discard while the user may still want the row visible.
42
+ - If the user says **删除 / 删掉 retired / 可以直接删了**: **delete** the entry file(s) and remove the index row(s). Do not leave ghost `retired` rows. Rebuild workbench.
43
+ - Do not delete `captured` or `promoted` without an explicit ask.
44
+
45
+ ## Ingest paths
46
+
47
+ 1. Pasted quote — 「记需求:……」 / “capture audience quotes: …”
48
+ 2. Comment / DM export or screenshot — extract quotes; one `N-` each; confirm with the user when unsure.
49
+ 3. URL / thread — fetch with host research tools; store the **commenter's** words, not the author's hook. On **X**: `x_*` first, then agent-reach if needed.
50
+ 4. After a consult — 「刚才那通咨询记需求」.
51
+ 5. Research pass — screen for L1/L2; write `N-` only for verbatim hits; update `_index.md` research note briefly.
52
+
53
+ Forbidden: Agent-rewritten sentences as quote; watchlist viral titles as need; FAQ templates with no original quote.
54
+
55
+ ## Write
56
+
57
+ 1. New `needs/entries/N-YYYYMMDD-XX.md` from `needs/_template.md`
58
+ 2. New row at the top of `needs/_index.md`
59
+ 3. Rebuild workbench
60
+ 4. Chat card:
61
+
62
+ ```text
63
+ ✅ Need N-YYYYMMDD-XX
64
+ 【Quote】 …
65
+ 【Source】 comment | dm | consult | faq | student | other
66
+ 【Layer】 L1 | L2 | L3
67
+ 【Frequency】 1
68
+ 【Stored】 needs/_index + needs/entries/N-….md
69
+ 【Merge】 new | merged into N-… (frequency now k, status still captured)
70
+ ```
71
+
72
+ ## 扫需求选题
73
+
74
+ Input set: `needs/_index.md` rows with `status=captured` (`topic_ids` empty). Max **5** `produce`. Prefer L1/L2 glosses for this profile unless the user asks otherwise.
75
+
76
+ Then **§ Topics**: Input gate Need ID `N-…`; `source_type=need`; `need_ids` lists the `N-` (never in `capture_id`); default `scout_label=demand`. Still run hard filters.
77
+
78
+ When `produce` creates a `T-` from an `N-`: update `needs/_index.md` + the entry to `status=promoted` and `topic_ids` containing that `T-`. Discard / library: leave `captured` or `retired` — do not mark `promoted` without a T-.
79
+
80
+ Audience exception (first activation): `source_type=need` **and** `need_ids` non-empty → matching at least one need gloss counts as one strong audience check; do **not** require a full ICP from `audience.md` / `pillars.md`. `ready` still needs `opp_score ≥ 7.5` **and** `audience ≥ 6`.
81
+
82
+ Prefer scanning needs before inbox. Inbox is structure / competitor context.
@@ -2,84 +2,118 @@
2
2
  name: easysociable-slideshow
3
3
  description: >
4
4
  Create, list, update and review durable multi-page Slideshow Runs for
5
- EasySociable from a local Obsidian Content Pack. Use the unified
6
- `easysociable` CLI or MCP, open Studio for preview, and perform final PNG
7
- rendering only after confirmation. Runs remain in the owner dashboard until
8
- archive/trash. There is no Slideshow Template product, UGC publishing,
9
- social posting or separate Slideshow CLI/MCP in V1.
5
+ EasySociable from a local Content Pack. Name the argument (arc) first, then
6
+ pick a Page Template per page by platform, canvas, slotSummary and density —
7
+ never default Cover→Point→Steps→Recap→CTA. Page 1 must be a cover or hook
8
+ class template; those templates must not appear on later pages. Use the
9
+ unified `easysociable` CLI or MCP, open Studio to preview and edit, then
10
+ ask the user to click Download for a PNG ZIP. CLI/MCP must not call
11
+ render/export or create_render_job for final pixels. Runs remain in the
12
+ owner dashboard until archive or hard delete.
10
13
  ---
11
14
 
12
15
  # EasySociable Slideshow Skill
13
16
 
14
- A Slideshow Run is a temporary composition of explicit single-page Templates.
17
+ A Slideshow Run is a composition of explicit single-page Templates.
15
18
  It is not a reusable Carousel/Deck Template and it is not a public post.
19
+ Page order is the argument of **this pack**, not a catalog recipe.
16
20
 
17
21
  ## Rules
18
22
 
19
- 1. Read a local `content-pack.v1` from the Obsidian Content Engine.
23
+ 1. Read a local `content-pack.v1` from the Content Engine.
20
24
  2. Use the unified `easysociable` CLI or the unified MCP server. All hosted
21
25
  calls go through Gateway; never call Directus, R2, Stripe or private services.
22
- 3. The Agent must choose a Profile, one Theme and an explicit Page Template for
23
- every page. The server never silently chooses or replaces a Page Template.
24
- 4. A Run has 1–20 pages, one supported platform (`tiktok`, `instagram`,
25
- `linkedin` or `threads`) and one Profile/Theme across all pages.
26
- 5. Topology is fixed after creation: no add, copy, delete, reorder or template
26
+ 3. Choose a Brand (or Profile/Theme) and an explicit Page Template for every
27
+ page. The server never silently chooses or replaces a Page Template.
28
+ Select by **platform + canvas + slotSummary + density**. `role` is a weak
29
+ retrieval tag, not sequence position.
30
+ 4. **Cover / hook placement (hard):** a template is cover/hook class when
31
+ `supportedRoles` includes `cover` or `hook`. `pages[0]` must use one.
32
+ Cover/hook class templates must not appear on any later page. Later pages
33
+ use metric / quote / compare / value / steps / cta / etc. Do not put a
34
+ Point or metric-only template on page 1 to “open with a number” — pick a
35
+ cover or hook template whose slots fit the opening copy.
36
+ 5. A Run has up to 8 pages on Free and 20 on paid, one supported platform
37
+ (`tiktok`, `instagram`, `linkedin` or `threads`) and one Brand across pages.
38
+ 6. Topology is fixed after creation: no add, copy, delete, reorder or template
27
39
  switch. Page-instance slot/layout/type/style/decoration edits remain allowed
28
40
  in Studio.
29
- 6. Studio is preview-only. It has no final download, publish, unpublish, UGC,
30
- SEO/GEO or social-posting action.
31
- 7. Before creating a new Run for an existing content intent, list/find prior Runs
32
- by `contentSlug` and update the same Run when possible.
33
- 8. Preview is free but rate/concurrency limited. Final rendering is PNG-only,
34
- uses one atomic reservation for all pages and charges only when every page
35
- succeeds.
41
+ 7. Final pixels leave the product only from **Studio Download** (browser PNG
42
+ ZIP). Do not call `slideshows render`, `slideshows export`, `renders create`
43
+ or MCP `render_slideshow_run` / `create_render_job`. Those return
44
+ `HEADLESS_RENDER_DISABLED`.
45
+ 8. Before creating a new Run, list/find prior Runs by `contentSlug`. **Update**
46
+ the same Run only when page count, pageTemplateIds, and intended sequence
47
+ still match. A different arc or template set is a **new Run** — never PATCH
48
+ new copy into a locked Cover-Point-Steps-Recap-CTA skeleton.
49
+ 8b. **Knowledge hard gate (every create, not only the first Run):** before
50
+ `create_run` / `slideshows create`, read Identity (Role / What I build /
51
+ Point of view — no `(fill)`, non-empty) and `boundaries.md` (Not covering
52
+ and Never claim non-empty), or run
53
+ `easysociable engine validate --run <run-dir> --require-knowledge`.
54
+ If `needs/` exists, `needs/_index.md` ≥ 3 `N-` rows; if `needs/` is absent, skip that count. Fail → hand back to
55
+ **easysociable-content** / refuse create; list missing files. Do not add
56
+ Gateway or MCP params. User must say **强制继续** / **force continue**
57
+ to call Gateway.
58
+ 9. Preview is free. Free Download is 3 successful ZIPs per month and one
59
+ platform. Paid Download is unmetered.
60
+ 10. **Forbidden default:** do not assemble Cover → Point → Steps → Recap → CTA
61
+ because those are P0 family names. Name the arc first
62
+ (`references/ARC.md`). Page count follows the argument, not the catalog.
63
+ Rule 4 still applies: page 1 is cover/hook class, not “whatever family
64
+ is named Cover”.
36
65
 
37
66
  ## Workflow
38
67
 
39
- 1. Validate the Pack and platform/page count.
40
- 2. Resolve or create the user's Profile/Theme through the unified CLI/MCP.
41
- 3. Select a compatible published Page Template for every page.
42
- 4. List existing Runs when the Pack has a stable content slug:
68
+ 1. Write one arc line (`references/ARC.md`). Do not skip this for a five-family fill-in.
69
+ 2. Validate the Pack and platform/page count.
70
+ 3. Resolve or create the user's Brand through the unified CLI/MCP.
71
+ 4. List the published catalog. `pages[0]` must be cover/hook class
72
+ (`supportedRoles` includes `cover` or `hook`). Remaining pages: platform +
73
+ canvas + slot counts + density — not `beat name == family name`. Never
74
+ place a cover/hook class template after page 1.
75
+ 5. List existing Runs when the Pack has a stable content slug:
43
76
 
44
77
  ```bash
45
78
  easysociable slideshows list --content-slug my-post --json
46
79
  ```
47
80
 
48
- 5. Create or update:
81
+ 6. **Hard gate, then** create (new arc/templates) or update (same topology,
82
+ slot copy only). Check files or:
49
83
 
50
84
  ```bash
51
- easysociable slideshows create --file ./pack.json --json
85
+ easysociable engine validate --run <run-dir> --require-pack --require-knowledge
52
86
  ```
53
87
 
54
- 6. Open the returned `studioUrl` and inspect every page.
55
- 7. Save Studio edits and wait for the saved revision.
56
- 8. After explicit confirmation, call:
88
+ Fail → refuse; return to **easysociable-content**. **强制继续** / **force continue**
89
+ is the only override (conversational — not a CLI flag). Then:
57
90
 
58
91
  ```bash
59
- easysociable slideshows render --id run_xxx --idempotency-key run_xxx-final-1 --json
60
- easysociable slideshows export --id run_xxx --output ./exports/run_xxx/tiktok --json
92
+ easysociable slideshows create --file ./pack.json --json
61
93
  ```
62
94
 
63
- Hosted finals use one Run capture session + one Imagine deck screenshot
64
- (single browser load, N page PNGs). Require Studio Save (`layout.studioJson`
65
- + `themeSnapshot`) before render. Single-page Template jobs still use
66
- `renders create|wait|export`.
67
-
68
- 8. Verify checksums and the reconstruction `manifest.json` in the Obsidian
69
- Run export. The export is the local final deliverable; cloud artifacts expire
70
- after 24 hours while the Run remains listed for the owner.
95
+ 7. Open the returned `studioUrl` and inspect every page.
96
+ 8. Save Studio edits and wait for the saved revision.
97
+ 9. After explicit user confirmation, tell them to click **Download** in Studio.
98
+ Do not render or export from CLI/MCP.
71
99
 
72
100
  ## Failure handling
73
101
 
102
+ - If the knowledge hard gate fails, do not create the Run. Hand back to
103
+ easysociable-content and list missing files unless the user said
104
+ **强制继续** / **force continue**.
105
+ - If page 1 is not cover/hook class, or a later page uses a cover/hook
106
+ class template, stop and rebuild the Pack. Do not create the Run.
74
107
  - If a page template, slot or image is invalid, return the structured Gateway
75
108
  error to the Agent; do not substitute another template.
76
- - If any final page fails, there is no partial final set and no page charge.
77
- - Retry the same final request with the same idempotency key to reuse the Job.
78
- - If a Run was trashed, create a new Run from the Pack.
109
+ - If Download is exhausted (`USAGE_LIMIT_REACHED`) or past due, tell the user
110
+ to upgrade or update billing.
111
+ - If a Run was deleted, or Gateway returns `RUN_TOPOLOGY_LOCKED` because the
112
+ pack changed sequence/templates, create a new Run from the Pack.
79
113
 
80
114
  ## Handoff boundary
81
115
 
82
- The Content Engine (`CLAUDE.md` + `easysociable engine …`) owns semantic copy
83
- and Pack creation. The Template Skill owns single-page authoring and fill-slots.
84
- This Skill only composes explicit page instances and coordinates preview/final
85
- render.
116
+ The Content Engine owns semantic copy, Pack creation, and the arc.
117
+ The Template Skill owns single-page authoring and publish.
118
+ This Skill composes explicit page instances and opens Studio for review/Download.
119
+ It does not own a product-level story recipe.
@@ -0,0 +1,44 @@
1
+ # Arc (argument, then pages)
2
+
3
+ A Slideshow Run is an argument that only works if the viewer turns the page.
4
+ Page order is a property of **this piece of content**, not of the catalog.
5
+
6
+ Do **not** invent a product-level `arc` field, Deck SKU, or
7
+ `pageSequence: [cover, point, steps, recap, cta]`.
8
+
9
+ ## Forbidden default
10
+
11
+ Never default a Pack to Cover → Point → Steps → Recap → CTA
12
+ because those are P0 family names. That sequence is one possible recipe, not
13
+ the product shape. Page count follows the argument (TikTok often 4–8), not
14
+ the number of P0 families.
15
+
16
+ ## Before pages
17
+
18
+ Write one arc line, then map each beat to slots.
19
+
20
+ **Page 1 is cover/hook class.** A template is cover/hook class when
21
+ `supportedRoles` includes `cover` or `hook`. That class belongs only on
22
+ `pages[0]`. Opening copy may still be a cost, quote, or compare *line* —
23
+ fill a cover or hook template whose `slotSummary` fits. Do not open with a
24
+ metric/point/quote template.
25
+
26
+ Later pages pick by slot shape (metric, quote, compare, value, steps, cta).
27
+
28
+ ## Recipes (swipe formulas, not system enums)
29
+
30
+ Pick one, or name a new one-liner. Do not expand this into an official catalog.
31
+
32
+ | Recipe | Beats |
33
+ |---|---|
34
+ | cost-mechanism | cost → mechanism → method → close → action |
35
+ | listicle | hook + N items + CTA |
36
+ | mistakes | hook + errors + fix + CTA |
37
+ | claim-proof | claim → evidence → implication → CTA |
38
+ | compare | old way / new way / why / CTA |
39
+
40
+ ## After create
41
+
42
+ Topology is locked. Wrong arc or wrong templates → **new Run**.
43
+ Do not PATCH copy into a locked Cover-Point-Steps-Recap-CTA skeleton.
44
+ `contentSlug` finds prior drafts; it does not keep a bad sequence alive.