@easysociable/cli 0.1.2 → 0.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (148) hide show
  1. package/README.md +32 -21
  2. package/{skills/easysociable-content → content-engine}/scripts/starter.mjs +3 -1
  3. package/{skills/easysociable-content → content-engine}/scripts/workbench.mjs +13 -8
  4. package/{skills/easysociable-content → content-engine}/starter/CLAUDE.md +217 -128
  5. package/{skills/easysociable-content → content-engine}/starter/engine.json +3 -0
  6. package/content-engine/starter/needs/README.md +38 -0
  7. package/content-engine/starter/needs/_index.md +31 -0
  8. package/content-engine/starter/needs/_template.md +24 -0
  9. package/content-engine/starter/needs/entries/README.md +5 -0
  10. package/content-engine/starter/products/README.md +38 -0
  11. package/content-engine/starter/products/_index.md +24 -0
  12. package/content-engine/starter/products/_template.md +56 -0
  13. package/content-engine/starter/products/entries/P-001-easysociable.md +150 -0
  14. package/content-engine/starter/profiles/_index.md +16 -0
  15. package/{skills/easysociable-content → content-engine}/starter/profiles/default/README.md +4 -1
  16. package/content-engine/starter/profiles/default/boundaries.md +14 -0
  17. package/content-engine/starter/profiles/default/expression.md +18 -0
  18. package/content-engine/starter/profiles/default/lanes.md +12 -0
  19. package/content-engine/starter/profiles/default/stories.md +15 -0
  20. package/{skills/easysociable-content → content-engine}/starter/profiles/default/voice.md +14 -0
  21. package/content-engine/starter/recommendations/README.md +21 -0
  22. package/content-engine/starter/recommendations/_index.md +21 -0
  23. package/content-engine/starter/recommendations/_template.md +44 -0
  24. package/{skills/easysociable-content → content-engine}/starter/runs/_template/brief.md +1 -1
  25. package/{skills/easysociable-content → content-engine}/starter/runs/_template/pack.md +15 -7
  26. package/{skills/easysociable-content → content-engine}/starter/runs/_template/packet.md +6 -0
  27. package/{skills/easysociable-content → content-engine}/starter/swipe/_template.md +3 -1
  28. package/content-engine/starter/topics/README.md +21 -0
  29. package/{skills/easysociable-content → content-engine}/starter/topics/_index.md +12 -5
  30. package/content-engine/starter/topics/_template-item.md +103 -0
  31. package/{skills/easysociable-content → content-engine}/starter/topics/scoring.md +55 -4
  32. package/content-engine/workbench/__pycache__/build.cpython-310.pyc +0 -0
  33. package/{skills/easysociable-content → content-engine}/workbench/build.py +306 -97
  34. package/{skills/easysociable-content → content-engine}/workbench/serve.py +0 -0
  35. package/{skills/easysociable-content → content-engine}/workbench/template.html +173 -27
  36. package/dist/easysociable.js +629 -142
  37. package/dist/easysociable.js.map +1 -1
  38. package/package.json +15 -15
  39. package/skills/ONBOARDING.md +21 -18
  40. package/skills/easysociable-content/SKILL.md +104 -98
  41. package/skills/easysociable-content/workflows/INTERVIEW.md +70 -0
  42. package/skills/easysociable-content/workflows/NEEDS.md +82 -0
  43. package/skills/easysociable-slideshow/SKILL.md +79 -44
  44. package/skills/easysociable-slideshow/references/ARC.md +44 -0
  45. package/skills/easysociable-slideshow/references/CONTENT_PACK.md +34 -6
  46. package/skills/easysociable-slideshow/workflows/CREATE_RUN.md +24 -5
  47. package/skills/easysociable-slideshow/workflows/OUT_OF_SCOPE.md +3 -0
  48. package/skills/easysociable-template/SKILL.md +29 -30
  49. package/skills/easysociable-template/references/CATALOG_METADATA.md +23 -20
  50. package/skills/easysociable-template/references/DESIGN_V2_1.md +53 -2
  51. package/skills/easysociable-template/references/GATEWAY.md +7 -2
  52. package/skills/easysociable-template/references/PLATFORM_SPECS.md +11 -3
  53. package/skills/easysociable-template/references/THEME_TOKENS.md +1 -1
  54. package/skills/easysociable-template/references/fixtures/image-reference.design-plan.json +74 -0
  55. package/skills/easysociable-template/references/fixtures/image-reference.visual-qa.json +28 -0
  56. package/skills/easysociable-template/scripts/generate-theme-from-hex.mjs +0 -0
  57. package/skills/easysociable-template/scripts/validate-design-v2.mjs +97 -0
  58. package/skills/easysociable-template/workflows/ASSET_PLAN.md +2 -1
  59. package/skills/easysociable-template/workflows/AUTHORING_FROM_BRIEF.md +4 -4
  60. package/skills/easysociable-template/workflows/AUTHORING_FROM_IMAGE.md +66 -16
  61. package/skills/easysociable-template/workflows/AUTHORING_STUDIO.md +28 -15
  62. package/skills/easysociable-template/workflows/DESIGN_BRIEF.md +4 -3
  63. package/skills/easysociable-template/workflows/FILL_AND_RENDER.md +4 -83
  64. package/skills/easysociable-template/workflows/MULTI_PLATFORM_FAMILY.md +81 -0
  65. package/skills/easysociable-template/workflows/OUT_OF_SCOPE.md +3 -2
  66. package/skills/easysociable-template/workflows/PUBLISH_FROM_DRAFT.md +1 -1
  67. package/skills/easysociable-template/workflows/VISUAL_QA.md +10 -0
  68. package/skills/easysociable-content/INSTALL.md +0 -60
  69. package/skills/easysociable-content/platforms/claude.md +0 -4
  70. package/skills/easysociable-content/platforms/codex.md +0 -4
  71. package/skills/easysociable-content/platforms/hermes.md +0 -4
  72. package/skills/easysociable-content/platforms/openclaw.md +0 -4
  73. package/skills/easysociable-content/references/CLI.md +0 -40
  74. package/skills/easysociable-content/references/CONTRACT_SYNC.md +0 -42
  75. package/skills/easysociable-content/references/MCP.md +0 -15
  76. package/skills/easysociable-content/references/PAGE_PACK.md +0 -129
  77. package/skills/easysociable-content/references/PLATFORM_GUIDE.md +0 -36
  78. package/skills/easysociable-content/references/RUN_LAYOUT.md +0 -73
  79. package/skills/easysociable-content/references/TROUBLESHOOTING.md +0 -13
  80. package/skills/easysociable-content/references/VAULT.md +0 -40
  81. package/skills/easysociable-content/references/VOICE.md +0 -16
  82. package/skills/easysociable-content/scripts/package-skill.mjs +0 -49
  83. package/skills/easysociable-content/scripts/setup.mjs +0 -200
  84. package/skills/easysociable-content/scripts/setup.test.mjs +0 -82
  85. package/skills/easysociable-content/starter/discovery/README.md +0 -18
  86. package/skills/easysociable-content/starter/discovery/_index.md +0 -27
  87. package/skills/easysociable-content/starter/discovery/_template.md +0 -41
  88. package/skills/easysociable-content/starter/profiles/_index.md +0 -13
  89. package/skills/easysociable-content/starter/topics/README.md +0 -25
  90. package/skills/easysociable-content/starter/topics/WATCHLIST.md +0 -65
  91. package/skills/easysociable-content/starter/topics/_template-item.md +0 -90
  92. package/skills/easysociable-content/starter/topics/watchlists/README.md +0 -10
  93. package/skills/easysociable-content/starter/topics/watchlists/_shared.md +0 -14
  94. package/skills/easysociable-content/starter/topics/watchlists/default.md +0 -6
  95. package/skills/easysociable-content/workflows/ANALYSIS_AND_COVERAGE.md +0 -17
  96. package/skills/easysociable-content/workflows/CONTENT_EXPORT.md +0 -24
  97. package/skills/easysociable-content/workflows/GETTING_STARTED.md +0 -40
  98. package/skills/easysociable-content/workflows/MCP_FIRST.md +0 -5
  99. package/skills/easysociable-content/workflows/OUT_OF_SCOPE.md +0 -18
  100. package/skills/easysociable-content/workflows/PACK_AUTHORING.md +0 -42
  101. package/skills/easysociable-content/workflows/SWIPE_CAPTURE.md +0 -18
  102. package/skills/easysociable-content/workflows/TOPIC_DRAFT.md +0 -29
  103. package/skills/easysociable-content/workflows/WORKING_DRAFT.md +0 -19
  104. /package/{skills/easysociable-content → content-engine}/fixtures/golden-run-en/draft.md +0 -0
  105. /package/{skills/easysociable-content → content-engine}/fixtures/golden-run-en/idea.md +0 -0
  106. /package/{skills/easysociable-content → content-engine}/fixtures/golden-run-en/pack-tiktok.json +0 -0
  107. /package/{skills/easysociable-content → content-engine}/scripts/contracts.mjs +0 -0
  108. /package/{skills/easysociable-content → content-engine}/scripts/export-contracts.mjs +0 -0
  109. /package/{skills/easysociable-content → content-engine}/scripts/fixture.test.mjs +0 -0
  110. /package/{skills/easysociable-content → content-engine}/scripts/validate-export.mjs +0 -0
  111. /package/{skills/easysociable-content → content-engine}/scripts/validate-pack.mjs +0 -0
  112. /package/{skills/easysociable-content → content-engine}/scripts/validate-run.mjs +0 -0
  113. /package/{skills/easysociable-content → content-engine}/scripts/validate.test.mjs +0 -0
  114. /package/{skills/easysociable-content → content-engine}/starter/accounts/README.md +0 -0
  115. /package/{skills/easysociable-content → content-engine}/starter/accounts/_index.md +0 -0
  116. /package/{skills/easysociable-content → content-engine}/starter/accounts/overrides/README.md +0 -0
  117. /package/{skills/easysociable-content → content-engine}/starter/exports/README.md +0 -0
  118. /package/{skills/easysociable-content → content-engine}/starter/inbox/README.md +0 -0
  119. /package/{skills/easysociable-content → content-engine}/starter/inbox/_index.md +0 -0
  120. /package/{skills/easysociable-content → content-engine}/starter/inbox/entries/README.md +0 -0
  121. /package/{skills/easysociable-content → content-engine}/starter/platforms/README.md +0 -0
  122. /package/{skills/easysociable-content → content-engine}/starter/platforms/ig.md +0 -0
  123. /package/{skills/easysociable-content → content-engine}/starter/platforms/instagram.md +0 -0
  124. /package/{skills/easysociable-content → content-engine}/starter/platforms/linkedin.md +0 -0
  125. /package/{skills/easysociable-content → content-engine}/starter/platforms/threads.md +0 -0
  126. /package/{skills/easysociable-content → content-engine}/starter/platforms/tiktok.md +0 -0
  127. /package/{skills/easysociable-content → content-engine}/starter/platforms/x.md +0 -0
  128. /package/{skills/easysociable-content → content-engine}/starter/platforms/xiaohongshu.md +0 -0
  129. /package/{skills/easysociable-content → content-engine}/starter/profiles/default/audience.md +0 -0
  130. /package/{skills/easysociable-content → content-engine}/starter/profiles/default/pillars.md +0 -0
  131. /package/{skills/easysociable-content → content-engine}/starter/published/_index.md +0 -0
  132. /package/{skills/easysociable-content → content-engine}/starter/raw/README.md +0 -0
  133. /package/{skills/easysociable-content → content-engine}/starter/raw/_index.md +0 -0
  134. /package/{skills/easysociable-content → content-engine}/starter/runs/README.md +0 -0
  135. /package/{skills/easysociable-content → content-engine}/starter/runs/_index.md +0 -0
  136. /package/{skills/easysociable-content → content-engine}/starter/runs/_template/draft.md +0 -0
  137. /package/{skills/easysociable-content → content-engine}/starter/runs/_template/editor.md +0 -0
  138. /package/{skills/easysociable-content → content-engine}/starter/runs/_template/feedback.md +0 -0
  139. /package/{skills/easysociable-content → content-engine}/starter/runs/_template/idea.md +0 -0
  140. /package/{skills/easysociable-content → content-engine}/starter/runs/_template/rubric.md +0 -0
  141. /package/{skills/easysociable-content → content-engine}/starter/swipe/_index.md +0 -0
  142. /package/{skills/easysociable-content → content-engine}/starter/topics/items/README.md +0 -0
  143. /package/{skills/easysociable-content → content-engine}/starter/wiki/README.md +0 -0
  144. /package/{skills/easysociable-content → content-engine}/starter/wiki/atoms/_index.md +0 -0
  145. /package/{skills/easysociable-content → content-engine}/starter/wiki/atoms/_template.md +0 -0
  146. /package/{skills/easysociable-content → content-engine}/starter/wiki/claims/_index.md +0 -0
  147. /package/{skills/easysociable-content → content-engine}/starter/wiki/claims/_template.md +0 -0
  148. /package/{skills/easysociable-content → content-engine}/starter/workbench/README.md +0 -0
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@easysociable/cli",
3
- "version": "0.1.2",
4
- "description": "Agent-first CLI and MCP host for EasySociable Template and Slideshow V1",
3
+ "version": "0.1.4",
4
+ "description": "Agent-first CLI for EasySociable: Content Engine, Template, Slideshow, and MCP",
5
5
  "type": "module",
6
6
  "license": "MIT",
7
7
  "author": "EasySociable",
@@ -33,16 +33,10 @@
33
33
  "bin",
34
34
  "dist",
35
35
  "skills",
36
+ "content-engine",
36
37
  "LICENSE",
37
38
  "README.md"
38
39
  ],
39
- "scripts": {
40
- "typecheck": "tsc --noEmit",
41
- "test": "vitest run",
42
- "build": "tsup",
43
- "prepack": "node scripts/prepack.mjs && pnpm build",
44
- "pack:check": "npm pack --dry-run"
45
- },
46
40
  "publishConfig": {
47
41
  "access": "public",
48
42
  "registry": "https://registry.npmjs.org/"
@@ -51,13 +45,19 @@
51
45
  "commander": "^11.1.0"
52
46
  },
53
47
  "devDependencies": {
54
- "@easysociable/mcp-server": "workspace:*",
55
- "@easysociable/template-gateway-client": "workspace:*",
56
- "@easysociable/tsconfig": "workspace:*",
57
- "@easysociable/vitest-config": "workspace:*",
58
48
  "@types/node": "^22.14.0",
59
49
  "tsup": "^8.0.2",
60
50
  "typescript": "^5.8.3",
61
- "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"
62
62
  }
63
- }
63
+ }
@@ -1,35 +1,38 @@
1
1
  # EasySociable agent-first onboarding
2
2
 
3
- V1 expects Codex or Claude Code to drive setup. The website is not the primary
4
- workspace.
3
+ V1 expects an Agent (Grok Bot, Codex, Claude Code, …) to drive setup. The website is not the primary workspace.
5
4
 
6
- ## User steps (3)
5
+ ## User steps
7
6
 
8
7
  1. **Install CLI**
9
8
 
10
9
  ```bash
11
10
  curl -fsSL https://easysociable.com/install.sh | bash
11
+ # or: npm i -g @easysociable/cli
12
12
  ```
13
13
 
14
- 2. **Install hosted Skills + MCP** (Template + Slideshow by default)
14
+ 2. **Install Skills + MCP** (Template + Slideshow by default; for Codex / Claude Code)
15
15
 
16
16
  ```bash
17
17
  easysociable install --yes
18
18
  ```
19
19
 
20
- 3. **Ask the Agent to create graphics** — account creation is deferred until a
21
- hosted operation requires authentication.
20
+ Default skills:
22
21
 
23
- Optional later:
22
+ - `easysociable-slideshow` — turns a draft into slideshow pages you preview and download in the dashboard
23
+ - `easysociable-template` — creates page templates
24
24
 
25
- ```bash
26
- easysociable install --skills content --yes
27
- ```
25
+ Optional Content Engine skill (pointer only — operations live in `Content Engine/CLAUDE.md`):
26
+
27
+ ```bash
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
31
+ ```
32
+
33
+ On a laptop, use any parent path instead of `/workspace` for `engine init` / `serve`.
28
34
 
29
- Then run the `easysociable-content` setup workflow (Obsidian Vault + Content
30
- Engine). For a private copy to another machine, see
31
- `skills/easysociable-content/INSTALL.md`. Skipping Content does **not** block
32
- single-page or Slideshow renders.
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.
33
36
 
34
37
  ## Lazy auth (Agent script)
35
38
 
@@ -37,8 +40,7 @@ When a Gateway call returns `AUTH_REQUIRED`, `API_KEY_INVALID`, or the CLI says
37
40
  `Run easysociable auth login`, respond with:
38
41
 
39
42
  ```text
40
- EasySociable needs a workspace API key before it can preview or render on the
41
- Gateway.
43
+ EasySociable needs a workspace API key before it can create Brands, images, drafts or Slideshow Runs on the Gateway.
42
44
 
43
45
  1. Open https://my.easysociable.com/auth/signup (or sign in with Google).
44
46
  2. Verify your email if you used password signup (required before API keys).
@@ -54,10 +56,11 @@ idempotency key when applicable.
54
56
  ## What works without auth
55
57
 
56
58
  - `easysociable install` / `update`
59
+ - `easysociable engine init` / `serve` / `build` / `validate`
57
60
  - Reading installed Skill instructions
58
61
  - Public template catalog in the browser (`/templates`)
59
62
 
60
63
  ## What requires auth
61
64
 
62
- - Profiles, Themes, images, drafts, Slideshow Runs
63
- - Hosted preview sessions and final PNG renders (`hosted_render_page` allowance)
65
+ - Brands, Themes, images, drafts, Slideshow Runs
66
+ - Studio preview and Studio Download (Free: 3 Downloads/month)
@@ -1,126 +1,132 @@
1
1
  ---
2
2
  name: easysociable-content
3
3
  description: >
4
- Set up and operate a local Content Engine for EasySociable. English folder
5
- tree only (Content Engine/). One platform = one Run. The Agent writes
6
- markdown; workbench is the observatory UI. Hosted Template/Slideshow work
7
- uses the unified easysociable CLI/MCP. No Obsidian requirement, no content
8
- MCP, no content CLI.
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).
15
+ If no engine exists, run `easysociable engine init`. Then follow
16
+ Content Engine/CLAUDE.md. Render handoff: easysociable-template (1 page) or
17
+ easysociable-slideshow (2+). Never publish or post.
9
18
  ---
10
19
 
11
- # EasySociable Content Skill
12
-
13
- This Skill owns the user's local knowledge base. The Agent writes Markdown
14
- under `Content Engine/`. After writes, rebuild the workbench. Hosted Template
15
- and Slideshow operations stay with the unified `easysociable` CLI/MCP.
16
-
17
- **Operating manual lives in the engine:** `Content Engine/CLAUDE.md`. Follow it
18
- for capture, discovery, topics, 开一单, ingest, ship, and catalog evidence. This
19
- file is setup, routing, and hosted handoff only.
20
-
21
- ## Non-negotiable rules
22
-
23
- 1. English tree only: `Content Engine/`. Do not ask language.
24
- 2. Obsidian is **not** required. Do not detect, install, or open it.
25
- 3. Ask for a parent directory (or an existing `Content Engine/` path). Never create the engine silently in a random folder.
26
- 4. Existing engine files are read-only during setup. Never overwrite user content, especially `workbench/template.html`.
27
- 5. One platform = one Run (one folder). Same Topic, native rewrite for another network → **N runs**, shared `topic_id`.
28
- 6. On **开一单**: **ask platform(s)** if unset. Multi-select → N runs. Do **not** silent-default to `x`.
29
- 7. Before brief / draft / editor / pack: **read** `platforms/<platform>.md` (`instagram` → `ig.md`).
30
- 8. Write selection into `idea.md` (`swipe_id` / `atoms` / `claim_id`). Chat cards are not citations.
31
- 9. Pack JSON (`content-pack.v1`) only at **handoff to render**. Until then the run uses `pack.md` (slideshow platforms after SHIP).
32
- 10. Final PNGs live under `exports/<run-slug>/`, never inside the run folder. V1 output is PNG only.
33
- 11. Do not start a Local API, open SQLite, call a Content MCP, or call private Directus/R2/Stripe endpoints.
34
- 12. Do not create a hosted Brand Profile during setup.
35
-
36
- ## When this skill runs
37
-
38
- 1. Resolve the engine (`--root` parent, or existing `Content Engine/`).
39
- 2. If missing files: `node scripts/setup.mjs --root <path> --apply --json` (never overwrites).
40
- 3. Ensure `workbench/` exists (copy skill `workbench/` files **only if missing**).
41
- 4. `python3` is required. If missing, stop and tell the user.
42
- 5. Run `python3 workbench/build.py`.
43
- 6. If port **8765** is free: start `workbench/serve.py`. If it is already listening, reuse it — do not start a second server.
44
- 7. Open `http://127.0.0.1:8765/workbench/`.
45
- 8. After Agent writes markdown: run `build.py` again (leave serve running).
20
+ # EasySociable Content
46
21
 
47
- ```bash
48
- node scripts/setup.mjs --root <parent-or-engine> --preview --json
49
- node scripts/setup.mjs --root <parent-or-engine> --apply --json
50
- node scripts/workbench.mjs start --engine "<path>/Content Engine" --json
51
- node scripts/workbench.mjs build --engine "<path>/Content Engine" --json
52
- ```
53
-
54
- `--no-open` skips the browser / server start.
55
-
56
- ## Intent routing
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.
57
23
 
58
- Defer the body of each flow to engine `CLAUDE.md`. Use these skill workflows only for setup and hosted handoff.
24
+ ## Product boundary
59
25
 
60
- | User intent | Action |
61
- |---|---|
62
- | First install / missing engine | Setup above → `workflows/GETTING_STARTED.md` |
63
- | capture / 记一下 | Engine `CLAUDE.md` § Capture |
64
- | Watchlist add | Engine `CLAUDE.md` § Topics (watchlist files) |
65
- | 扫 watchlist / 发现内容 | Engine `CLAUDE.md` § Discovery — Source Digest only; no Topics |
66
- | 选题 / score topics | Engine `CLAUDE.md` § Topics — explicit input; Scout→opportunity 5-dim; ready=opp≥7.5 and aud≥6; cap=5 produce |
67
- | 开一单 / open a run | Engine `CLAUDE.md` § Open a run — **ask platforms**; N platforms → N folders |
68
- | 收成 swipe/atom/claim | Engine `CLAUDE.md` § Library ingest |
69
- | Ship + URL + result | Engine `CLAUDE.md` § Published index + Catalog evidence |
70
- | 出图 / pack + render | Engine `CLAUDE.md` § PagePack, then handoff below |
71
- | Platform craft | `Content Engine/platforms/<platform>.md` + `references/PLATFORM_GUIDE.md` |
72
- | Single-page image | Hand off → **easysociable-template** |
73
- | Multi-page slideshow | Hand off → **easysociable-slideshow** (Pack JSON at this step) |
74
- | Export PNGs | `workflows/CONTENT_EXPORT.md` |
75
- | Hosted CLI/MCP | `workflows/MCP_FIRST.md` |
76
- | Out of scope | `workflows/OUT_OF_SCOPE.md` |
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.
77
29
 
78
- ### Single-page vs slideshow
30
+ ## Pipeline (do not collapse stages)
79
31
 
80
32
  ```text
81
- 1 page → easysociable-template
82
- 2+ pages + slideshow platform → easysociable-slideshow
83
- x / xiaohongshu → easysociable-template only
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
84
39
  ```
85
40
 
86
- Slideshow platforms: `tiktok`, `instagram`/`ig`, `linkedin`, `threads`.
87
-
88
- ## Run model
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:
89
65
 
90
66
  ```text
91
- ask platform(s) → N folders
92
- runs/<YYYY-MM-DD-slug[-platform]>/idea.md ← one platform, selection ids
93
- brief.md → packet.md → draft.md → editor.md → rubric.md
94
- pack.md (after SHIP, image decks only)
95
- pack-<platform>.json ← only at Slideshow/Template handoff
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
96
73
  ```
97
74
 
98
- Copy `runs/_template/` for each platform. Update `runs/_index.md` (one row per run).
99
-
100
- Validate before slideshow handoff:
75
+ ## Create / serve / build
101
76
 
102
77
  ```bash
103
- node scripts/validate-run.mjs --run <run-dir> --json
104
- node scripts/validate-run.mjs --run <run-dir> --require-pack --json
78
+ easysociable engine init --root <parent-or-engine> --yes
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
105
83
  ```
106
84
 
107
- ## Handoff
85
+ On a dedicated agent computer (e.g. Grok Bot), prefer `--root /workspace`.
86
+
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.
88
+
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.
108
92
 
109
- **Slideshow (multi-page):**
93
+ ## Operate
110
94
 
111
- 1. Rubric SHIP on this run. Write `pack.md` (slots only).
112
- 2. Hand off to `easysociable-slideshow`. It selects a Page Template per page and writes `pack-<platform>.json`.
113
- 3. User confirms Studio preview.
114
- 4. Final render + export to `{engine}/exports/<run-slug>/`.
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.
99
+
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) |
112
+
113
+ ## Render hard gate
114
+
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)`.
116
+
117
+ On fail: **stay in this skill**. List missing files. Do not call template or slideshow. User must say **强制继续** / **force continue** to proceed.
118
+
119
+ ```bash
120
+ easysociable engine validate --run <run-dir> --require-pack --require-knowledge
121
+ ```
115
122
 
116
- **Template (single-page):**
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`).
117
124
 
118
- 1. Hand off slot values to `easysociable-template` `FILL_AND_RENDER`.
125
+ ## Research (Needs)
119
126
 
120
- Preview does not consume Render Page allowance. Final render does.
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.
121
129
 
122
- ## Reference loading
130
+ ## Out of scope
123
131
 
124
- Always read engine `CLAUDE.md`, `engine.json`, `references/RUN_LAYOUT.md` and
125
- `references/PLATFORM_GUIDE.md`. Load `GETTING_STARTED` on first install,
126
- `PACK_AUTHORING` / `CONTENT_EXPORT` / `MCP_FIRST` only at render handoff.
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.