@easysociable/cli 0.1.13 → 0.1.15
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 +28 -0
- package/dist/easysociable.js +52 -201
- package/dist/easysociable.js.map +1 -1
- package/package.json +19 -5
- package/skills/easysociable-content/SKILL.md +38 -85
- package/skills/easysociable-content/workflows/INTERVIEW.md +4 -4
- package/skills/easysociable-content/workflows/NEEDS.md +0 -99
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@easysociable/cli",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.15",
|
|
4
4
|
"description": "Agent-first CLI for EasySociable: Content Engine, Template, Slideshow, and MCP",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
@@ -16,12 +16,26 @@
|
|
|
16
16
|
},
|
|
17
17
|
"keywords": [
|
|
18
18
|
"easysociable",
|
|
19
|
-
"cli",
|
|
20
19
|
"mcp",
|
|
20
|
+
"mcp-server",
|
|
21
|
+
"model-context-protocol",
|
|
22
|
+
"claude",
|
|
23
|
+
"claude-code",
|
|
24
|
+
"cursor",
|
|
25
|
+
"carousel",
|
|
26
|
+
"social-carousel",
|
|
27
|
+
"slideshow",
|
|
28
|
+
"slideshow-generator",
|
|
21
29
|
"social-media",
|
|
30
|
+
"tiktok",
|
|
31
|
+
"linkedin",
|
|
32
|
+
"instagram",
|
|
33
|
+
"threads",
|
|
34
|
+
"xiaohongshu",
|
|
22
35
|
"templates",
|
|
23
|
-
"
|
|
24
|
-
"
|
|
36
|
+
"agent",
|
|
37
|
+
"content-engine",
|
|
38
|
+
"cli"
|
|
25
39
|
],
|
|
26
40
|
"engines": {
|
|
27
41
|
"node": ">=20.0.0"
|
|
@@ -49,8 +63,8 @@
|
|
|
49
63
|
"tsup": "^8.0.2",
|
|
50
64
|
"typescript": "^5.8.3",
|
|
51
65
|
"vitest": "^1.3.1",
|
|
52
|
-
"@easysociable/mcp-server": "0.0.0",
|
|
53
66
|
"@easysociable/tsconfig": "0.0.0",
|
|
67
|
+
"@easysociable/mcp-server": "0.0.0",
|
|
54
68
|
"@easysociable/template-gateway-client": "0.0.0",
|
|
55
69
|
"@easysociable/vitest-config": "0.0.0"
|
|
56
70
|
},
|
|
@@ -1,21 +1,20 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: easysociable-content
|
|
3
3
|
description: >
|
|
4
|
-
Operate the EasySociable Content Engine (
|
|
4
|
+
Operate the EasySociable Content Engine: Knowledge (Karpathy LLM Wiki), hook-led
|
|
5
|
+
Topics, formula-led Runs, profile, brand, media, workbench.
|
|
5
6
|
Triggers: 采访我, 完善人设, interview me, who am I as a creator, 建立 profile
|
|
6
7
|
— follow workflows/INTERVIEW.md (engine CLAUDE.md § Interview wins if present).
|
|
7
|
-
Triggers:
|
|
8
|
-
— follow
|
|
9
|
-
Triggers:
|
|
10
|
-
— follow
|
|
11
|
-
Triggers:
|
|
12
|
-
—
|
|
13
|
-
Triggers: 做成选题, 开一单, 出图
|
|
14
|
-
— follow engine CLAUDE.md (§ Topics / § Open a run / § PagePack: Page Contracts → Media → Template Selection before templates).
|
|
8
|
+
Triggers: 记一下, 存资料, ingest, 问知识库, what do we know about, lint 知识库, 整理知识
|
|
9
|
+
— follow engine CLAUDE.md § Knowledge (Ingest / Query / Lint).
|
|
10
|
+
Triggers: 列出 hooks, 选 hook, 用 H-… 生成选题, 做成选题
|
|
11
|
+
— follow engine CLAUDE.md § Topics (Hook → Formula → Knowledge).
|
|
12
|
+
Triggers: 开一单, 用 T-… 开一单, 出图
|
|
13
|
+
— follow engine CLAUDE.md § Open a run (content straight from the Topic's Formula).
|
|
15
14
|
If no engine exists, copy/clone the Content Engine core (see Create below;
|
|
16
15
|
`easysociable engine init` is optional offline scaffold). Then follow
|
|
17
16
|
Content Engine/CLAUDE.md. Render handoff: easysociable-template (1 page) or
|
|
18
|
-
easysociable-slideshow (2
|
|
17
|
+
easysociable-slideshow (2+, Formula handoff). Never publish or post.
|
|
19
18
|
---
|
|
20
19
|
|
|
21
20
|
# EasySociable Content
|
|
@@ -24,62 +23,33 @@ Entry card for agents. **Do not invent a parallel workflow.** Instance SoT is th
|
|
|
24
23
|
|
|
25
24
|
## Product boundary
|
|
26
25
|
|
|
27
|
-
- Teach a **Content Engine
|
|
28
|
-
- **EasySociable**
|
|
29
|
-
- 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.
|
|
26
|
+
- Teach a **Content Engine**: knowledge you own → a hook-led decision → formula-led content → feedback that updates knowledge.
|
|
27
|
+
- **EasySociable** supplies the **Hooks / Formulas catalog** and the **visual production layer** (Studio). It is not the content brain.
|
|
30
28
|
|
|
31
|
-
##
|
|
29
|
+
## Three loops (do not collapse)
|
|
32
30
|
|
|
33
31
|
```text
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
→ Pillar (what this profile discusses) + Lane (how it publishes)
|
|
38
|
-
→ Topic (decision summary + readable judgment + Score appendix)
|
|
39
|
-
→ Run → Pack → Publish / feedback
|
|
32
|
+
Knowledge raw/ (immutable) → knowledge/pages (agent-maintained wiki) → index.md + log.md
|
|
33
|
+
Topics Hook (H-…) → one of its Formulas (F-…) → angle from knowledge pages → T-…
|
|
34
|
+
Runs Topic's Formula beats → content.md + content-pack.v1 → Studio → feedback
|
|
40
35
|
```
|
|
41
36
|
|
|
42
37
|
| Stage | Owns | Does not |
|
|
43
38
|
|-------|------|----------|
|
|
44
|
-
|
|
|
45
|
-
|
|
|
46
|
-
|
|
|
47
|
-
|
|
|
48
|
-
|
|
|
49
|
-
| Workbench | Read-only observatory | Source of truth (markdown indexes are) |
|
|
39
|
+
| `raw/` | Verbatim sources + URL | Ever get edited after save |
|
|
40
|
+
| `knowledge/pages` | `source` / `concept` / `entity` / `synthesis` pages with `[[links]]` | Viral-post teardowns; facts no raw source supports |
|
|
41
|
+
| Topic `T-` | `hook_id` + `formula_id` + `knowledge_ids` + Beat plan | Exist without a hook and a formula |
|
|
42
|
+
| Run | One platform; one page per formula beat | Re-pick hook/formula; idea → brief → packet → draft → editor → rubric chain |
|
|
43
|
+
| Workbench | Read-only observatory (Knowledge graph, Topics, Runs) | Source of truth (markdown is) |
|
|
50
44
|
|
|
51
45
|
## Hard rules
|
|
52
46
|
|
|
53
|
-
1. **No invented quotes** —
|
|
54
|
-
2. **
|
|
55
|
-
3. **
|
|
56
|
-
4. **
|
|
57
|
-
5.
|
|
58
|
-
6.
|
|
59
|
-
7. **Keep ownership explicit** — `products/` is for offers we own or provide;
|
|
60
|
-
`recommendations/` is for third-party tools and products. A Topic may cite
|
|
61
|
-
`product_ids`, `recommendation_ids`, both, or neither.
|
|
62
|
-
8. **Ask for Topic `generation_mode` before any `produce` write** — present the
|
|
63
|
-
six modes; recommend `demand` when Need-led; do not silently assume.
|
|
64
|
-
Product/recommendation inputs do not prove audience demand.
|
|
65
|
-
9. **Scan stages Hits, not Needs/Topics** — default keyword scan is
|
|
66
|
-
`track=listen` only → `hits/` (`triage`); route to `needs/` or library
|
|
67
|
-
only after confirm. `search` = SEO, `ask` = GEO questions — not default
|
|
68
|
-
social scan. Hits are never Topic inputs.
|
|
69
|
-
10. **Generate keywords from evidence** — propose listen/search/ask candidates
|
|
70
|
-
from Needs/audience in chat; write `keywords.md` only after confirm;
|
|
71
|
-
set `seed_from`. Google volume never gates listen.
|
|
72
|
-
|
|
73
|
-
Topic modes (ask before `produce`; recommend `demand` when Need-led):
|
|
74
|
-
|
|
75
|
-
```text
|
|
76
|
-
demand = Needs + Profile
|
|
77
|
-
demand_to_offer = Needs + Product + Profile
|
|
78
|
-
demand_to_review = Needs + Recommendation + Profile
|
|
79
|
-
review = Recommendation + evidence + Profile
|
|
80
|
-
offer_education = Product + mechanism + Profile
|
|
81
|
-
profile_thesis = Profile + Pillar
|
|
82
|
-
```
|
|
47
|
+
1. **No invented facts or quotes** — slot text and Beat plans come from knowledge pages only; gaps go in **Do not claim**.
|
|
48
|
+
2. **No hook → no topic.** Never invent `H-` / `F-` ids; read them from `easysociable hooks list` / `formulas get`.
|
|
49
|
+
3. **Knowledge is compiled, not re-derived** — ingest updates every touched page, records contradictions instead of overwriting, regenerates `knowledge/index.md`, appends `knowledge/log.md`.
|
|
50
|
+
4. **Runs follow the Formula** — same beat count, order and roles; `layoutFamilyId = look.slides[n] ?? look.layouts[role]`.
|
|
51
|
+
5. **Rebuild workbench** after markdown writes in the engine vault (`python3 workbench/build.py`); after knowledge writes also `python3 scripts/lint-knowledge.py --engine .`.
|
|
52
|
+
6. Hook link for the user: `https://easysociable.com/hooks/<hook_id>`.
|
|
83
53
|
|
|
84
54
|
## Create / serve / build
|
|
85
55
|
|
|
@@ -102,56 +72,39 @@ repo into `<parent>/Content Engine` (never overwrites an existing engine).
|
|
|
102
72
|
```bash
|
|
103
73
|
easysociable engine serve --engine <parent>/Content Engine --no-open
|
|
104
74
|
easysociable engine build --engine <parent>/Content Engine
|
|
105
|
-
# --sync-workbench refreshes workbench files from the public core checkout
|
|
106
75
|
```
|
|
107
76
|
|
|
108
|
-
|
|
109
|
-
`engine init`. Mixed→split vault: see `scripts/migrate-split-vault.py` in the
|
|
110
|
-
public repo.
|
|
111
|
-
|
|
112
|
-
`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.
|
|
113
|
-
|
|
114
|
-
Engine methodology updates: `git pull` on the core (or `--sync-workbench`), not
|
|
115
|
-
CLI republishes.
|
|
77
|
+
`python3` is required for the workbench. Observatory: `http://127.0.0.1:8765/workbench/` — tabs **Knowledge** (graph) / Topics / Runs. If `serve.py` is already up, do not start a second server; rebuild only.
|
|
116
78
|
|
|
117
79
|
## Operate
|
|
118
80
|
|
|
119
81
|
1. Resolve account → profile (engine `CLAUDE.md`).
|
|
120
82
|
2. Route by intent (table below). Prefer engine `CLAUDE.md` sections; use `workflows/*` when that file is newer or the § is missing.
|
|
121
|
-
3. Always return
|
|
83
|
+
3. Always return a short result card in chat.
|
|
122
84
|
4. Rebuild workbench after writes.
|
|
123
85
|
|
|
124
86
|
| Intent | Action |
|
|
125
87
|
|--------|--------|
|
|
126
88
|
| 采访我 / interview me / 完善人设 / 建立 profile | **workflows/INTERVIEW.md** (not a render) |
|
|
127
|
-
|
|
|
128
|
-
|
|
|
129
|
-
|
|
|
130
|
-
|
|
|
131
|
-
|
|
|
132
|
-
|
|
|
133
|
-
|
|
|
134
|
-
|
|
|
135
|
-
| 2+ pages / `media_mode=multi_page_pack` (any platform, incl. X + `pack_hook`) | **easysociable-slideshow** (after hard gate + **ADR-0036 identity chain**: Studio login → API key → `easysociable auth login` → create) |
|
|
136
|
-
| X / xiaohongshu text-only | No render skill — ship copy from the Run |
|
|
89
|
+
| 记一下 / 存资料 / ingest + link or file | Engine **§ Knowledge · Ingest** |
|
|
90
|
+
| 问知识库 / what do we know about X | Engine **§ Knowledge · Query** (offer to file back as `synthesis`) |
|
|
91
|
+
| lint 知识库 / 整理知识 | Engine **§ Knowledge · Lint** |
|
|
92
|
+
| 列出 hooks / 选 hook / 用 H-… 生成选题 | Engine **§ Topics** |
|
|
93
|
+
| 开一单 / 用 T-… 开一单 | Hard gate → engine **§ Open a run** (ask platform; multi → N runs) |
|
|
94
|
+
| 1 page | **easysociable-template** with `Formula: <id>` (after hard gate) |
|
|
95
|
+
| 2+ pages (any platform) | **easysociable-slideshow** *Formula handoff* (after hard gate + **ADR-0036 identity chain**: Studio login → API key → `easysociable auth login` → create) |
|
|
96
|
+
| X / xiaohongshu text-only | No render skill — ship copy from `content.md` |
|
|
137
97
|
|
|
138
98
|
## Render hard gate
|
|
139
99
|
|
|
140
|
-
**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.
|
|
100
|
+
**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. Public handle MAY stay `(fill)`.
|
|
141
101
|
|
|
142
102
|
On fail: **stay in this skill**. List missing files. Do not call template or slideshow. User must say **强制继续** / **force continue** to proceed.
|
|
143
103
|
|
|
144
104
|
```bash
|
|
145
|
-
easysociable engine validate --
|
|
105
|
+
easysociable engine validate --root <engine> --require-knowledge
|
|
146
106
|
```
|
|
147
107
|
|
|
148
|
-
Slideshow packs need an **Arc** line, then **Page Contracts** (no `templateId`), then Media, then Template Selection. Do not default Cover → Point → Steps → Recap → CTA. Page 1 is cover/hook class; later pages are not. Handoff: **easysociable-slideshow** (`references/ARC.md`). Validate with `python3 scripts/validate-pack.py`.
|
|
149
|
-
|
|
150
|
-
## Research (Needs)
|
|
151
|
-
|
|
152
|
-
- Prefer host research tools. On **X**: built-in `x_*` first; fall back to agent-reach / `twitter` only if insufficient.
|
|
153
|
-
- Store **commenter** words when scraping threads. Do not invent `N-` when a platform tool is missing—stop and ask for paste.
|
|
154
|
-
|
|
155
108
|
## Out of scope
|
|
156
109
|
|
|
157
110
|
No social posting, Content MCP, Local API, or SQLite content library.
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
Not a fourth skill. If the engine `CLAUDE.md` already has **§ Interview**, follow that section. Otherwise follow this file.
|
|
4
4
|
|
|
5
|
-
Do **not** ingest
|
|
5
|
+
Do **not** ingest sources into Knowledge here. Do **not** create a slideshow or call template/slideshow.
|
|
6
6
|
|
|
7
7
|
## Triggers
|
|
8
8
|
|
|
@@ -59,9 +59,9 @@ Do **not** ingest needs / quotes here. Do **not** scan the watchlist. Do **not**
|
|
|
59
59
|
|
|
60
60
|
| Level | Condition | Behavior |
|
|
61
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.
|
|
63
|
-
| **First-session goal** | Hard gate **and** Persona has at least one personalized line **and**
|
|
64
|
-
| **Complete seven dimensions** | Identity + Experience (≥2) + Values (≥3) + Persona/Do not say + `stories.md` ≥1 + `boundaries.md` + `expression.md` likes/dislikes ≥3 each
|
|
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. | Refuse 出图 / run 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** `stories.md` may be 0–1 | Open card `profile: partial`. May pick a hook and write Topics. 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 | Open card `profile: complete`. Remaining gaps are draft reminders only — **not** a hard-stop on graphics. |
|
|
65
65
|
|
|
66
66
|
Experience / Values / expression are **not** the hard gate. Missing `stories.md` / `expression.md` = partial. Missing `boundaries.md` file = hard-gate fail.
|
|
67
67
|
|
|
@@ -1,99 +0,0 @@
|
|
|
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
|
-
- 扫关键词 / 用关键词扫需求 / 扫 K-xx(research only — see **Keyword scan** below)
|
|
12
|
-
- capture audience quotes / user needs
|
|
13
|
-
- 调研需求 / 需求落库 / 重新调研并落库
|
|
14
|
-
|
|
15
|
-
## Research axis (easysociable-builder default)
|
|
16
|
-
|
|
17
|
-
Product teaches **Content Engines**; EasySociable is the **visual layer**. When researching or screening needs for this profile:
|
|
18
|
-
|
|
19
|
-
| Layer | Means | Default |
|
|
20
|
-
|-------|--------|---------|
|
|
21
|
-
| **L1** | System / sustainability — what to say, what to publish next, memory, pipeline, consistency | **Prefer** |
|
|
22
|
-
| **L2** | Judgment / review / approval — AI polished but empty; bottleneck moved to human check | **Prefer** |
|
|
23
|
-
| **L3** | Visual / tool friction — Canva, Figma, “looks AI”, brand kit paste | Keep only if user asks; else do not promote as primary |
|
|
24
|
-
|
|
25
|
-
Put `layer=L1|L2|L3` in **`## Our gloss` only** — never in the index `quote` cell.
|
|
26
|
-
|
|
27
|
-
**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.
|
|
28
|
-
|
|
29
|
-
## Rules
|
|
30
|
-
|
|
31
|
-
- Quote cell = **verbatim**. Gloss goes in `## Our gloss`, never in the index `quote` column.
|
|
32
|
-
- Status is only `captured` | `promoted` | `retired`. **Never** `clustered`. Merge is not a new status.
|
|
33
|
-
- 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.
|
|
34
|
-
- Do not mark `promoted` without a `T-` whose `need_ids` contain this `N-`. `topic_ids` non-empty ≡ `promoted`.
|
|
35
|
-
- Never write `N-` into topic `capture_id`.
|
|
36
|
-
- 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.
|
|
37
|
-
- Quotes may include DMs / students. Keep local. Redact PII if used as published copy.
|
|
38
|
-
- After Needs writes: rebuild workbench (`python3 workbench/build.py` or `easysociable engine build`).
|
|
39
|
-
|
|
40
|
-
## Delete vs retire
|
|
41
|
-
|
|
42
|
-
- `retired` = soft discard while the user may still want the row visible.
|
|
43
|
-
- If the user says **删除 / 删掉 retired / 可以直接删了**: **delete** the entry file(s) and remove the index row(s). Do not leave ghost `retired` rows. Rebuild workbench.
|
|
44
|
-
- Do not delete `captured` or `promoted` without an explicit ask.
|
|
45
|
-
|
|
46
|
-
## Keyword generate (from Needs)
|
|
47
|
-
|
|
48
|
-
When user asks to generate keywords from needs: follow engine **§ Keywords · Generate**.
|
|
49
|
-
Prefer `track=listen` seeds from verbatim Needs; propose in chat; write only on confirm with `seed_from=need:N-…`.
|
|
50
|
-
Optional: derive `search` (SEO) or `ask` (GEO question) pairs — not for default social scan.
|
|
51
|
-
|
|
52
|
-
## Keyword / handle scan → Hits → route
|
|
53
|
-
|
|
54
|
-
Load `profiles/<id>/keywords.md` (and/or `handles.md`).
|
|
55
|
-
Default scan: up to **5** rows with **`track=listen` + `status=active`** (or named `K-xx` / `@handle`). Prefer L1/L2 `pain`/`question`.
|
|
56
|
-
|
|
57
|
-
Meaningful hits → write `hits/` (`H-…`, `status=triage`, `keyword_id`, heat when known) + chat cards.
|
|
58
|
-
**Needs / library only after route confirm** (engine **§ Hits**). Author posts are not Needs; comments may be. Structure/foil → library via Capture + ingest approval.
|
|
59
|
-
|
|
60
|
-
On **X**: `x_*` first. Other platforms only with a working host backend; else ask for paste. Hits are never Topic inputs. Do not default-scan `search`/`ask` rows into Hits.
|
|
61
|
-
|
|
62
|
-
## Ingest paths
|
|
63
|
-
|
|
64
|
-
1. Pasted quote — 「记需求:……」 / “capture audience quotes: …”
|
|
65
|
-
2. Comment / DM export or screenshot — extract quotes; one `N-` each; confirm with the user when unsure.
|
|
66
|
-
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.
|
|
67
|
-
4. After a consult — 「刚才那通咨询记需求」.
|
|
68
|
-
5. Keyword / research pass — screen for L1/L2; **confirm** then write `N-` for verbatim hits; update `_index.md` research note briefly.
|
|
69
|
-
|
|
70
|
-
Forbidden: Agent-rewritten sentences as quote; watchlist/keyword viral titles as need; FAQ templates with no original quote; silent batch write from a scan.
|
|
71
|
-
|
|
72
|
-
## Write
|
|
73
|
-
|
|
74
|
-
1. New `needs/entries/N-YYYYMMDD-XX.md` from `needs/_template.md`
|
|
75
|
-
2. New row at the top of `needs/_index.md`
|
|
76
|
-
3. Rebuild workbench
|
|
77
|
-
4. Chat card:
|
|
78
|
-
|
|
79
|
-
```text
|
|
80
|
-
✅ Need N-YYYYMMDD-XX
|
|
81
|
-
【Quote】 …
|
|
82
|
-
【Source】 comment | dm | consult | faq | student | other
|
|
83
|
-
【Layer】 L1 | L2 | L3
|
|
84
|
-
【Frequency】 1
|
|
85
|
-
【Stored】 needs/_index + needs/entries/N-….md
|
|
86
|
-
【Merge】 new | merged into N-… (frequency now k, status still captured)
|
|
87
|
-
```
|
|
88
|
-
|
|
89
|
-
## 扫需求选题
|
|
90
|
-
|
|
91
|
-
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.
|
|
92
|
-
|
|
93
|
-
Then **§ Topics**: Input gate Need ID `N-…`; `source_type=need`; `need_ids` lists the `N-` (never in `capture_id`); default `scout_label=demand`. **Before any `produce` write, ask the user to choose `generation_mode`** (six modes; recommend `demand` when Need-led). Still run hard filters and that mode’s required-input gate.
|
|
94
|
-
|
|
95
|
-
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-.
|
|
96
|
-
|
|
97
|
-
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`.
|
|
98
|
-
|
|
99
|
-
Prefer scanning needs before inbox. Inbox is structure / competitor context.
|