@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
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@easysociable/cli",
|
|
3
|
-
"version": "0.1.
|
|
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
|
+
}
|
package/skills/ONBOARDING.md
CHANGED
|
@@ -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. **
|
|
14
|
+
2. **Install Skills + MCP** (Template + Slideshow by default; for Codex / Claude Code)
|
|
15
15
|
|
|
16
16
|
```bash
|
|
17
|
-
easysociable
|
|
18
|
-
easysociable engine serve --engine /workspace/Content Engine --no-open
|
|
17
|
+
easysociable install --yes
|
|
19
18
|
```
|
|
20
19
|
|
|
21
|
-
|
|
20
|
+
Default skills:
|
|
22
21
|
|
|
23
|
-
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
-
-
|
|
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 (
|
|
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
|
|
20
|
+
# EasySociable Content
|
|
11
21
|
|
|
12
|
-
|
|
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
|
-
##
|
|
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
|
-
|
|
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
|
-
|
|
93
|
+
## Operate
|
|
28
94
|
|
|
29
|
-
|
|
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
|
-
|
|
32
|
-
|
|
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
|
|
113
|
+
## Render hard gate
|
|
36
114
|
|
|
37
|
-
|
|
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
|
-
|
|
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
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
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
|
|
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
|
|
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.
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
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
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
8.
|
|
34
|
-
|
|
35
|
-
|
|
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.
|
|
40
|
-
2.
|
|
41
|
-
3.
|
|
42
|
-
4. List
|
|
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
|
-
|
|
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
|
|
85
|
+
easysociable engine validate --run <run-dir> --require-pack --require-knowledge
|
|
52
86
|
```
|
|
53
87
|
|
|
54
|
-
|
|
55
|
-
|
|
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
|
|
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
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
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
|
|
77
|
-
|
|
78
|
-
- If a Run was
|
|
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
|
|
83
|
-
|
|
84
|
-
This Skill
|
|
85
|
-
|
|
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.
|