@easysociable/cli 0.1.1 → 0.1.3
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 +29 -18
- package/content-engine/fixtures/golden-run-en/draft.md +13 -0
- package/content-engine/fixtures/golden-run-en/idea.md +26 -0
- package/content-engine/fixtures/golden-run-en/pack-tiktok.json +11 -0
- package/content-engine/scripts/contracts.mjs +183 -0
- package/content-engine/scripts/export-contracts.mjs +76 -0
- package/content-engine/scripts/fixture.test.mjs +24 -0
- package/content-engine/scripts/starter.mjs +55 -0
- package/content-engine/scripts/validate-export.mjs +42 -0
- package/content-engine/scripts/validate-pack.mjs +48 -0
- package/content-engine/scripts/validate-run.mjs +100 -0
- package/content-engine/scripts/validate.test.mjs +101 -0
- package/content-engine/scripts/workbench.mjs +135 -0
- package/content-engine/starter/CLAUDE.md +756 -0
- package/content-engine/starter/accounts/README.md +9 -0
- package/content-engine/starter/accounts/_index.md +31 -0
- package/content-engine/starter/accounts/overrides/README.md +3 -0
- package/content-engine/starter/discovery/README.md +18 -0
- package/content-engine/starter/discovery/_index.md +27 -0
- package/content-engine/starter/discovery/_template.md +41 -0
- package/content-engine/starter/engine.json +19 -0
- package/content-engine/starter/exports/README.md +28 -0
- package/content-engine/starter/inbox/README.md +9 -0
- package/content-engine/starter/inbox/_index.md +24 -0
- package/content-engine/starter/inbox/entries/README.md +3 -0
- package/content-engine/starter/platforms/README.md +19 -0
- package/content-engine/starter/platforms/ig.md +69 -0
- package/content-engine/starter/platforms/instagram.md +5 -0
- package/content-engine/starter/platforms/linkedin.md +72 -0
- package/content-engine/starter/platforms/threads.md +69 -0
- package/content-engine/starter/platforms/tiktok.md +71 -0
- package/content-engine/starter/platforms/x.md +78 -0
- package/content-engine/starter/platforms/xiaohongshu.md +19 -0
- package/content-engine/starter/profiles/_index.md +13 -0
- package/content-engine/starter/profiles/default/README.md +11 -0
- package/content-engine/starter/profiles/default/audience.md +38 -0
- package/content-engine/starter/profiles/default/pillars.md +33 -0
- package/content-engine/starter/profiles/default/voice.md +24 -0
- package/content-engine/starter/published/_index.md +20 -0
- package/content-engine/starter/raw/README.md +4 -0
- package/content-engine/starter/raw/_index.md +12 -0
- package/content-engine/starter/runs/README.md +22 -0
- package/content-engine/starter/runs/_index.md +41 -0
- package/content-engine/starter/runs/_template/brief.md +66 -0
- package/content-engine/starter/runs/_template/draft.md +11 -0
- package/content-engine/starter/runs/_template/editor.md +18 -0
- package/content-engine/starter/runs/_template/feedback.md +15 -0
- package/content-engine/starter/runs/_template/idea.md +27 -0
- package/content-engine/starter/runs/_template/pack.md +47 -0
- package/content-engine/starter/runs/_template/packet.md +25 -0
- package/content-engine/starter/runs/_template/rubric.md +19 -0
- package/content-engine/starter/swipe/_index.md +27 -0
- package/content-engine/starter/swipe/_template.md +34 -0
- package/content-engine/starter/topics/README.md +25 -0
- package/content-engine/starter/topics/WATCHLIST.md +65 -0
- package/content-engine/starter/topics/_index.md +44 -0
- package/content-engine/starter/topics/_template-item.md +90 -0
- package/content-engine/starter/topics/items/README.md +4 -0
- package/content-engine/starter/topics/scoring.md +201 -0
- package/content-engine/starter/topics/watchlists/README.md +10 -0
- package/content-engine/starter/topics/watchlists/_shared.md +14 -0
- package/content-engine/starter/topics/watchlists/default.md +6 -0
- package/content-engine/starter/wiki/README.md +13 -0
- package/content-engine/starter/wiki/atoms/_index.md +23 -0
- package/content-engine/starter/wiki/atoms/_template.md +31 -0
- package/content-engine/starter/wiki/claims/_index.md +26 -0
- package/content-engine/starter/wiki/claims/_template.md +38 -0
- package/content-engine/starter/workbench/README.md +17 -0
- package/content-engine/workbench/build.py +1074 -0
- package/content-engine/workbench/serve.py +53 -0
- package/content-engine/workbench/template.html +2119 -0
- package/dist/easysociable.js +804 -2903
- package/dist/easysociable.js.map +1 -1
- package/package.json +19 -13
- package/skills/ONBOARDING.md +20 -14
- package/skills/easysociable-content/SKILL.md +38 -102
- package/skills/easysociable-slideshow/SKILL.md +24 -16
- package/skills/easysociable-slideshow/references/VAULT.md +13 -11
- package/skills/easysociable-template/SKILL.md +26 -24
- package/skills/easysociable-template/references/CATALOG_METADATA.md +2 -2
- package/skills/easysociable-template/references/DESIGN_V2_1.md +53 -2
- package/skills/easysociable-template/references/GATEWAY.md +7 -2
- package/skills/easysociable-template/references/PLATFORM_SPECS.md +11 -3
- package/skills/easysociable-template/references/THEME_TOKENS.md +1 -1
- package/skills/easysociable-template/references/fixtures/image-reference.design-plan.json +74 -0
- package/skills/easysociable-template/references/fixtures/image-reference.visual-qa.json +28 -0
- package/skills/easysociable-template/scripts/generate-theme-from-hex.mjs +0 -0
- package/skills/easysociable-template/scripts/validate-design-v2.mjs +97 -0
- package/skills/easysociable-template/workflows/ASSET_PLAN.md +2 -1
- package/skills/easysociable-template/workflows/AUTHORING_FROM_BRIEF.md +4 -4
- package/skills/easysociable-template/workflows/AUTHORING_FROM_IMAGE.md +66 -16
- package/skills/easysociable-template/workflows/AUTHORING_STUDIO.md +28 -15
- package/skills/easysociable-template/workflows/DESIGN_BRIEF.md +4 -3
- package/skills/easysociable-template/workflows/MULTI_PLATFORM_FAMILY.md +81 -0
- package/skills/easysociable-template/workflows/PUBLISH_FROM_DRAFT.md +1 -1
- package/skills/easysociable-template/workflows/VISUAL_QA.md +10 -0
- package/skills/easysociable-content/platforms/claude.md +0 -5
- package/skills/easysociable-content/platforms/codex.md +0 -5
- package/skills/easysociable-content/platforms/hermes.md +0 -5
- package/skills/easysociable-content/platforms/openclaw.md +0 -5
- package/skills/easysociable-content/references/CLI.md +0 -27
- package/skills/easysociable-content/references/MCP.md +0 -20
- package/skills/easysociable-content/references/PAGE_PACK.md +0 -6
- package/skills/easysociable-content/references/TROUBLESHOOTING.md +0 -11
- package/skills/easysociable-content/references/VAULT.md +0 -20
- package/skills/easysociable-content/scripts/setup.mjs +0 -156
- package/skills/easysociable-content/scripts/setup.test.mjs +0 -71
- package/skills/easysociable-content/scripts/starter.mjs +0 -53
- package/skills/easysociable-content/workflows/ANALYSIS_AND_COVERAGE.md +0 -8
- package/skills/easysociable-content/workflows/CONTENT_EXPORT.md +0 -19
- package/skills/easysociable-content/workflows/DEVICE_TASKS.md +0 -5
- package/skills/easysociable-content/workflows/EXPERIMENTS.md +0 -6
- package/skills/easysociable-content/workflows/MCP_FIRST.md +0 -10
- package/skills/easysociable-content/workflows/PUBLICATION.md +0 -5
- package/skills/easysociable-content/workflows/TOPIC_DRAFT.md +0 -5
- package/skills/easysociable-content/workflows/WORKING_DRAFT.md +0 -10
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
# Audience — profile `default`
|
|
2
|
+
|
|
3
|
+
**Role:** Who this profile writes for.
|
|
4
|
+
**Not:** Platform craft (`platforms/*.md`).
|
|
5
|
+
|
|
6
|
+
## Cross-platform core
|
|
7
|
+
|
|
8
|
+
### Primary readers
|
|
9
|
+
|
|
10
|
+
1. (fill)
|
|
11
|
+
|
|
12
|
+
### Not for
|
|
13
|
+
|
|
14
|
+
- (fill)
|
|
15
|
+
|
|
16
|
+
### Jobs to be done
|
|
17
|
+
|
|
18
|
+
1. (fill)
|
|
19
|
+
|
|
20
|
+
## Per-platform emphasis
|
|
21
|
+
|
|
22
|
+
Fill the section for **this run’s platform** before drafting. Sibling platforms get their own run.
|
|
23
|
+
|
|
24
|
+
### x
|
|
25
|
+
|
|
26
|
+
- (fill)
|
|
27
|
+
|
|
28
|
+
### linkedin
|
|
29
|
+
|
|
30
|
+
- (fill)
|
|
31
|
+
|
|
32
|
+
### ig
|
|
33
|
+
|
|
34
|
+
- (fill)
|
|
35
|
+
|
|
36
|
+
### tiktok
|
|
37
|
+
|
|
38
|
+
- (fill)
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# Content pillars — profile `default`
|
|
2
|
+
|
|
3
|
+
Agent: map every draft topic to at least one pillar (or user overrides for one post).
|
|
4
|
+
|
|
5
|
+
## Status
|
|
6
|
+
|
|
7
|
+
`active`
|
|
8
|
+
|
|
9
|
+
## Pillars
|
|
10
|
+
|
|
11
|
+
### P1 — (name this pillar)
|
|
12
|
+
|
|
13
|
+
**Job:** (one sentence)
|
|
14
|
+
|
|
15
|
+
Talk about:
|
|
16
|
+
|
|
17
|
+
- (fill)
|
|
18
|
+
|
|
19
|
+
### P2 — (name this pillar)
|
|
20
|
+
|
|
21
|
+
**Job:** (one sentence)
|
|
22
|
+
|
|
23
|
+
Talk about:
|
|
24
|
+
|
|
25
|
+
- (fill)
|
|
26
|
+
|
|
27
|
+
### P3 — (name this pillar)
|
|
28
|
+
|
|
29
|
+
**Job:** (one sentence)
|
|
30
|
+
|
|
31
|
+
Talk about:
|
|
32
|
+
|
|
33
|
+
- (fill)
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# Voice — profile `default`
|
|
2
|
+
|
|
3
|
+
**Role:** Who this profile is + how copy should sound.
|
|
4
|
+
**Not:** Topics (`./pillars.md`), platform craft (`../../platforms/*.md`), or readers (`./audience.md`).
|
|
5
|
+
|
|
6
|
+
## Identity (who is speaking)
|
|
7
|
+
|
|
8
|
+
| Field | Value |
|
|
9
|
+
|-------|--------|
|
|
10
|
+
| **Public handle** | (fill) |
|
|
11
|
+
| **Role** | (fill) |
|
|
12
|
+
| **What I build** | (fill) |
|
|
13
|
+
| **Point of view** | (fill) |
|
|
14
|
+
| **Not claiming** | Invented metrics, customers, quotes, or team size |
|
|
15
|
+
|
|
16
|
+
## Persona
|
|
17
|
+
|
|
18
|
+
- Direct. Concrete nouns. Address the reader as **you**.
|
|
19
|
+
- Do not invent bio facts not listed in Identity.
|
|
20
|
+
|
|
21
|
+
## Do not say
|
|
22
|
+
|
|
23
|
+
- Fake social proof
|
|
24
|
+
- Empty hype (“game-changer”, “unlock your potential”)
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# Published index
|
|
2
|
+
|
|
3
|
+
**Role:** One row per **shipped post** (one platform URL).
|
|
4
|
+
**Also:** use history for swipe / atom (join on `swipe` / `atoms`). Claim **proposition** evidence still lives in the claim file’s Evidence table.
|
|
5
|
+
|
|
6
|
+
Same **topic** may appear across **multiple runs / multiple published rows**. One **run** → usually **one** published row.
|
|
7
|
+
|
|
8
|
+
## How to use
|
|
9
|
+
|
|
10
|
+
- On ship: add a row; update that run’s `runs/_index` → `published`.
|
|
11
|
+
- Then bump `n`/`win`/`loss` on cited index rows (`CLAUDE.md` § Catalog evidence).
|
|
12
|
+
- Swipe/atom: this table **is** the ledger. Claim: also append the claim file Evidence row (`vs claim`).
|
|
13
|
+
- `result`: `win` | `flat` | `loss` | `unknown`.
|
|
14
|
+
|
|
15
|
+
## Catalog
|
|
16
|
+
|
|
17
|
+
| date | platform | url | run | pillar | swipe | atoms | claim | result | notes |
|
|
18
|
+
|------|----------|-----|-----|--------|-------|-------|-------|--------|-------|
|
|
19
|
+
|
|
20
|
+
<!-- Agent: prefer newest on top -->
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
# Raw index
|
|
2
|
+
|
|
3
|
+
Authoritative source materials. Bodies are files in this folder; this table is the registry.
|
|
4
|
+
|
|
5
|
+
| id | date | capture_id | file | type | source_url | one_liner |
|
|
6
|
+
|----|------|------------|------|------|------------|-----------|
|
|
7
|
+
|
|
8
|
+
## Agent rules
|
|
9
|
+
|
|
10
|
+
- Create a raw **file** + this row when capture has URL, multi-step structure, media, or user marks important
|
|
11
|
+
- `capture_id` must match `inbox/_index` id
|
|
12
|
+
- Do not use raw as finished posts
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
# runs/
|
|
2
|
+
|
|
3
|
+
One folder per **platform run** (“一单”). Same Topic, native rewrite for another network → **another folder**, same `topic_id`.
|
|
4
|
+
|
|
5
|
+
| Path | Role |
|
|
6
|
+
|------|------|
|
|
7
|
+
| `_index.md` | Job queue registry (Approach B scan) |
|
|
8
|
+
| `_template/` | Files copied into each new run |
|
|
9
|
+
| `YYYY-MM-DD-short-slug[-platform]/` | One platform draft |
|
|
10
|
+
|
|
11
|
+
**Agent** creates/updates files and `_index`; user works in chat only.
|
|
12
|
+
|
|
13
|
+
See vault root `CLAUDE.md` § Open a run.
|
|
14
|
+
|
|
15
|
+
## Multi-platform
|
|
16
|
+
|
|
17
|
+
- Multi-select on 开一单 → **N runs**, not N sections in one draft.
|
|
18
|
+
- `idea.md`: `primary_platform` = `platforms` = this run only.
|
|
19
|
+
- Before brief/draft: **read** `platforms/<platform>.md` (see `platforms/README.md`).
|
|
20
|
+
- `draft.md`: this platform’s copy only, following that craft file.
|
|
21
|
+
- Pack: `pack.md` (or `pack-<platform>.md`); exports → `exports/<slug>/`.
|
|
22
|
+
- Each ship → one `published/_index` row for that `run_id`.
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
# Runs index (production jobs)
|
|
2
|
+
|
|
3
|
+
One row = one **platform run** (one folder). Same Topic on multiple platforms = **multiple rows** sharing `topic_id` — **not** one folder with many platform variants.
|
|
4
|
+
|
|
5
|
+
Newest on top. Agent updates on open / status change / export / kill.
|
|
6
|
+
|
|
7
|
+
| run_id | path | date | status | account | profile | primary_platform | platforms | topic_id | pillar | one_liner | pack | export | notes |
|
|
8
|
+
| ------ | ---- | ---- | ------ | ------- | ------- | ---------------- | --------- | -------- | ------ | --------- | ---- | ------ | ----- |
|
|
9
|
+
|
|
10
|
+
## Status values
|
|
11
|
+
|
|
12
|
+
| status | Meaning |
|
|
13
|
+
| ------------ | ------------------------------------------------ |
|
|
14
|
+
| `open` | Folder created; brief not done |
|
|
15
|
+
| `brief` | Brief wait / in progress |
|
|
16
|
+
| `draft` | Drafting / editing |
|
|
17
|
+
| `scored` | Rubric done; ship or hold |
|
|
18
|
+
| `ready` | SHIP — copy ready to post (and/or pack ready) |
|
|
19
|
+
| `published` | This platform shipped (or user declared done) |
|
|
20
|
+
| `hold` | Rubric hold / blocked |
|
|
21
|
+
| `killed` | Abandoned |
|
|
22
|
+
| `superseded` | Replaced by another run |
|
|
23
|
+
| `partial` | **Legacy** — do not use for new runs |
|
|
24
|
+
|
|
25
|
+
## Columns
|
|
26
|
+
|
|
27
|
+
| Column | Meaning |
|
|
28
|
+
|--------|---------|
|
|
29
|
+
| `path` | Wikilink to run folder |
|
|
30
|
+
| `primary_platform` | **This** run’s platform (craft + publish target) |
|
|
31
|
+
| `platforms` | Must equal `primary_platform` (single value; index compat) |
|
|
32
|
+
| `pack` | `no` \| `yes` (image pack written for this run) |
|
|
33
|
+
| `export` | `no` \| `yes` (files under `exports/<slug>/`) |
|
|
34
|
+
| `topic_id` | `T-…` or none (siblings share the same id) |
|
|
35
|
+
|
|
36
|
+
## Rules
|
|
37
|
+
|
|
38
|
+
- On **开一单**: **ask platform(s)** if unset; **one folder + one row per platform**; `status=open`.
|
|
39
|
+
- On status change: update this table (source of truth for queue scan).
|
|
40
|
+
- On ship: row in **`published/_index`** + here → `published`.
|
|
41
|
+
- Do not store draft body or image binaries here.
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
---
|
|
2
|
+
status: BRIEF_WAIT
|
|
3
|
+
gate_score: 0
|
|
4
|
+
gate_pass: false
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Brief
|
|
8
|
+
|
|
9
|
+
## Inherited (from Topic T-xxx — do not re-derive; sharpen only)
|
|
10
|
+
|
|
11
|
+
- **context:**
|
|
12
|
+
- **audience:**
|
|
13
|
+
- **conflict:**
|
|
14
|
+
- **insight:**
|
|
15
|
+
|
|
16
|
+
## Claim
|
|
17
|
+
|
|
18
|
+
- **core_thesis:**
|
|
19
|
+
- **supporting_claims:**
|
|
20
|
+
1.
|
|
21
|
+
2.
|
|
22
|
+
3.
|
|
23
|
+
|
|
24
|
+
## Evidence
|
|
25
|
+
|
|
26
|
+
- **sources:**
|
|
27
|
+
- **type:** data | example | case | mechanism | expert | observation
|
|
28
|
+
- **quality:** weak | moderate | strong
|
|
29
|
+
|
|
30
|
+
## Communication
|
|
31
|
+
|
|
32
|
+
- **angle:**
|
|
33
|
+
- **format:**
|
|
34
|
+
- **hook:**
|
|
35
|
+
- **structure:**
|
|
36
|
+
|
|
37
|
+
## Outcome
|
|
38
|
+
|
|
39
|
+
- **belief:**
|
|
40
|
+
- **action:**
|
|
41
|
+
- **emotion:**
|
|
42
|
+
|
|
43
|
+
## Constraints
|
|
44
|
+
|
|
45
|
+
- **must_include:**
|
|
46
|
+
- **must_avoid:**
|
|
47
|
+
|
|
48
|
+
## Selection (required; none allowed)
|
|
49
|
+
|
|
50
|
+
- **swipe:** id | none — why:
|
|
51
|
+
- **atoms:** hook:… | cta:… | proof:… | none — why:
|
|
52
|
+
- **claim:** id | none — why:
|
|
53
|
+
|
|
54
|
+
## Brief quality gate
|
|
55
|
+
|
|
56
|
+
| # | Gate | Score 1–5 | Note |
|
|
57
|
+
|---|------|-----------|------|
|
|
58
|
+
| 1 | Thesis clarity | | |
|
|
59
|
+
| 2 | Evidence strength | | |
|
|
60
|
+
| 3 | Angle originality | | |
|
|
61
|
+
| 4 | Structure coherence | | |
|
|
62
|
+
| 5 | Outcome specificity | | |
|
|
63
|
+
| 6 | Tension preservation | | |
|
|
64
|
+
|
|
65
|
+
**Total:** /30
|
|
66
|
+
**Gate:** PASS (≥24) | REVISE (20–23) | STOP (<20)
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
---
|
|
2
|
+
status: empty
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
# Feedback (after publish)
|
|
6
|
+
|
|
7
|
+
This run is one platform. One URL → one `published/_index` row.
|
|
8
|
+
|
|
9
|
+
## This platform
|
|
10
|
+
|
|
11
|
+
- **url:**
|
|
12
|
+
- **result:** win | flat | loss | unknown
|
|
13
|
+
- **metrics:** (user-provided only)
|
|
14
|
+
- **vs claim:** support | contradict | unclear | n/a
|
|
15
|
+
- **notes:**
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
---
|
|
2
|
+
run_id: RUN-YYYYMMDD-slug
|
|
3
|
+
status: RUN_OPEN
|
|
4
|
+
created: YYYY-MM-DD
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Idea
|
|
8
|
+
|
|
9
|
+
- **one_liner:**
|
|
10
|
+
- **account:** your-handle
|
|
11
|
+
- **profile:** default
|
|
12
|
+
- **pillar:** P1 | P2 | P3
|
|
13
|
+
- **primary_platform:** x
|
|
14
|
+
- **platforms:** x
|
|
15
|
+
<!-- must equal primary_platform (one platform per run) -->
|
|
16
|
+
- **topic_id:** none | T-…
|
|
17
|
+
- **capture_ids:** none | C-…
|
|
18
|
+
- **swipe_id:** none | S1
|
|
19
|
+
- **atoms:** none | hook:A-… cta:A-…
|
|
20
|
+
- **claim_id:** none | C-…
|
|
21
|
+
- **hypothesis:** none | (optional one-off test; prefer claim_id when in catalog)
|
|
22
|
+
|
|
23
|
+
## Platform (this run)
|
|
24
|
+
|
|
25
|
+
| platform | copy | images (pack) | publish status |
|
|
26
|
+
|----------|------|---------------|----------------|
|
|
27
|
+
| x | yes | no | pending |
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
---
|
|
2
|
+
# PagePack — this run is already one platform (image decks only; not pure x text)
|
|
3
|
+
# Prefer filename: pack.md (or pack-<platform>.md)
|
|
4
|
+
# Create when: user wants carousel/slideshow AND rubric SHIP for this run.
|
|
5
|
+
---
|
|
6
|
+
status: unused
|
|
7
|
+
id:
|
|
8
|
+
platform: linkedin
|
|
9
|
+
deck_hint:
|
|
10
|
+
page_count: 0
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
# Pack
|
|
14
|
+
|
|
15
|
+
## Meta
|
|
16
|
+
|
|
17
|
+
- **run_id:**
|
|
18
|
+
- **pillar:**
|
|
19
|
+
- **swipe_id:**
|
|
20
|
+
- **claim_id:**
|
|
21
|
+
- **language:** en
|
|
22
|
+
|
|
23
|
+
## Pages
|
|
24
|
+
|
|
25
|
+
<!-- Each page: role + slots. Text only — no private AST. -->
|
|
26
|
+
|
|
27
|
+
### page 1
|
|
28
|
+
|
|
29
|
+
- **role:** cover
|
|
30
|
+
- **slots:**
|
|
31
|
+
- title:
|
|
32
|
+
- subtitle:
|
|
33
|
+
|
|
34
|
+
### page 2
|
|
35
|
+
|
|
36
|
+
- **role:** body
|
|
37
|
+
- **slots:**
|
|
38
|
+
- heading:
|
|
39
|
+
- body:
|
|
40
|
+
|
|
41
|
+
<!-- …repeat through page_count… -->
|
|
42
|
+
|
|
43
|
+
## Render
|
|
44
|
+
|
|
45
|
+
- **job_id:**
|
|
46
|
+
- **export_path:** exports/<run-slug>/<platform>/
|
|
47
|
+
- **status:** not_requested | queued | done | failed
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
---
|
|
2
|
+
# Writer context packet — keep short (~400–900 tokens of substance)
|
|
3
|
+
# Filled by Agent from pillars slice + platforms rules + one swipe + this brief only
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Packet
|
|
7
|
+
|
|
8
|
+
## Profile / account
|
|
9
|
+
|
|
10
|
+
- account:
|
|
11
|
+
- profile:
|
|
12
|
+
|
|
13
|
+
## Pillar slice
|
|
14
|
+
|
|
15
|
+
## Voice (resolved)
|
|
16
|
+
|
|
17
|
+
## Audience (profile audience — core + this platform)
|
|
18
|
+
|
|
19
|
+
## Craft notes (from platforms/<platform>.md — required; summarize rules used)
|
|
20
|
+
|
|
21
|
+
## Swipe beats (if any)
|
|
22
|
+
|
|
23
|
+
## Brief essentials
|
|
24
|
+
|
|
25
|
+
## Hard bans
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
---
|
|
2
|
+
status: SCORED
|
|
3
|
+
total: 0
|
|
4
|
+
ship: false
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Rubric (max 12, ship if ≥ 8)
|
|
8
|
+
|
|
9
|
+
| # | Criterion | Score 0–2 | Note |
|
|
10
|
+
|---|-----------|-----------|------|
|
|
11
|
+
| 1 | Stop-scroll hook | | |
|
|
12
|
+
| 2 | Concrete (not empty wisdom) | | |
|
|
13
|
+
| 3 | Save / act potential | | |
|
|
14
|
+
| 4 | Platform-native (this run) | | |
|
|
15
|
+
| 5 | Non-slop | | |
|
|
16
|
+
| 6 | Fits pillar | | |
|
|
17
|
+
|
|
18
|
+
**Total:** /12
|
|
19
|
+
**Gate:** SHIP (≥8) | HOLD (<8)
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# Swipe index (structure catalog)
|
|
2
|
+
|
|
3
|
+
**Role:** Full-post beat order. Global library; scope with **`profiles`** + **`platforms`** columns.
|
|
4
|
+
|
|
5
|
+
**Selection:** read this table first → filter platform + profile → drop `dead` → prefer `working` then higher `win/n` → open 0–1 body. **`none` allowed** (declare why).
|
|
6
|
+
|
|
7
|
+
## Status (hit-rate, our posts — not “is this true”)
|
|
8
|
+
|
|
9
|
+
| status | Meaning |
|
|
10
|
+
|--------|---------|
|
|
11
|
+
| `trial` | In catalog; not enough of **our** published uses |
|
|
12
|
+
| `working` | Our reuse is helping; prefer in selection |
|
|
13
|
+
| `dead` | Never auto-select |
|
|
14
|
+
|
|
15
|
+
`n` / `win` / `loss` = our `published.result` cache. `flat` and `unknown` bump `n` only.
|
|
16
|
+
**No Evidence table in swipe files.** Use history = `published/_index` (column `swipe`).
|
|
17
|
+
|
|
18
|
+
## Ingest
|
|
19
|
+
|
|
20
|
+
See `CLAUDE.md` § Library ingest. No silent seed from runs. Unpublished runs never enter.
|
|
21
|
+
|
|
22
|
+
## Catalog
|
|
23
|
+
|
|
24
|
+
| id | file | platforms | profiles | form | beats_or_pages | status | n | win | loss | one_liner | source |
|
|
25
|
+
|----|------|-----------|----------|------|----------------|--------|---|-----|------|-----------|--------|
|
|
26
|
+
|
|
27
|
+
`profiles: *` = available to all profiles.
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: S-NEW
|
|
3
|
+
platforms: [x]
|
|
4
|
+
profiles: ["*"] # profile ids or "*"
|
|
5
|
+
form: short_post # short_post | thread | carousel | slideshow
|
|
6
|
+
beats_or_pages: 0
|
|
7
|
+
status: trial # trial | working | dead
|
|
8
|
+
tags: []
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# Title
|
|
12
|
+
|
|
13
|
+
## When to use
|
|
14
|
+
|
|
15
|
+
- …
|
|
16
|
+
|
|
17
|
+
## When to avoid
|
|
18
|
+
|
|
19
|
+
- …
|
|
20
|
+
|
|
21
|
+
## Beats / pages (structure only — no full copy)
|
|
22
|
+
|
|
23
|
+
1. …
|
|
24
|
+
2. …
|
|
25
|
+
|
|
26
|
+
## Constraints
|
|
27
|
+
|
|
28
|
+
- …
|
|
29
|
+
|
|
30
|
+
## Source
|
|
31
|
+
|
|
32
|
+
- capture / raw links if any
|
|
33
|
+
|
|
34
|
+
<!-- Use history: published/_index column swipe. Do not add ## Evidence here. -->
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# topics/
|
|
2
|
+
|
|
3
|
+
Topic system: **what to produce next**, after an external signal has been understood and converted into an owned opportunity.
|
|
4
|
+
|
|
5
|
+
| Path | Role |
|
|
6
|
+
|------|------|
|
|
7
|
+
| `_index.md` | Queue registry (one row per topic + `item` link + source engagement) |
|
|
8
|
+
| `items/T-*.md` | One file per opportunity (context, audience, conflict, insight, evidence) |
|
|
9
|
+
| `WATCHLIST.md` | Watchlist router (per-profile scheme B) |
|
|
10
|
+
| `watchlists/<profile_id>.md` | Profile-scoped radar |
|
|
11
|
+
| `watchlists/_shared.md` | Shared radar for all profiles |
|
|
12
|
+
| `scoring.md` | Opportunity dimensions and dual gate |
|
|
13
|
+
| `_template-item.md` | Template for new items |
|
|
14
|
+
|
|
15
|
+
Flow:
|
|
16
|
+
|
|
17
|
+
```text
|
|
18
|
+
watchlist → Discovery (Source Digest)
|
|
19
|
+
→ user explicitly promotes
|
|
20
|
+
→ `_index` + `items/T-…` (opportunity 5-dim)
|
|
21
|
+
→ ready only if opp≥7.5 and audience≥6
|
|
22
|
+
→ user opens run → `status=promoted`
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
Cap **5 produce** per promotion session. Watchlist scan itself creates Discovery records, not Topics.
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
# Watchlist (router)
|
|
2
|
+
|
|
3
|
+
**Scheme B:** one radar table **per profile**, not one global table.
|
|
4
|
+
|
|
5
|
+
No X Private List required. Agent updates files under `topics/watchlists/`; user works in chat only.
|
|
6
|
+
|
|
7
|
+
## File map
|
|
8
|
+
|
|
9
|
+
| Path | Role |
|
|
10
|
+
|------|------|
|
|
11
|
+
| `topics/WATCHLIST.md` | **This file** — routing, columns, scan rules |
|
|
12
|
+
| `topics/watchlists/_shared.md` | Shared rows (`*`) — merge into every scan |
|
|
13
|
+
| `topics/watchlists/<profile_id>.md` | Profile-scoped radar (must match `profiles/_index` id) |
|
|
14
|
+
| `topics/watchlists/README.md` | Short folder note |
|
|
15
|
+
|
|
16
|
+
### Profiles with a watchlist file today
|
|
17
|
+
|
|
18
|
+
| profile_id | file |
|
|
19
|
+
|------------|------|
|
|
20
|
+
| default | `watchlists/default.md` |
|
|
21
|
+
|
|
22
|
+
New profile → create `watchlists/<id>.md` (copy empty table header from `_shared.md` or an existing file).
|
|
23
|
+
|
|
24
|
+
## Columns (in each table file)
|
|
25
|
+
|
|
26
|
+
| Column | Meaning |
|
|
27
|
+
|--------|---------|
|
|
28
|
+
| `#` | Id within that file (`#1…` profile-local; `#S-01…` in `_shared`) |
|
|
29
|
+
| **`platform`** | Network of this handle + where Agent scans: `x` \| `tiktok` \| `linkedin` \| `ig` \| `youtube` \| `xhs` \| `threads` \| … |
|
|
30
|
+
| `handle` | Platform-native id without `@` |
|
|
31
|
+
| `niche_tag` | Topic/product tag — not a substitute for `platform` |
|
|
32
|
+
| `why_on_list` | One line |
|
|
33
|
+
| `weight` | 0.5–1.5 |
|
|
34
|
+
| `status` | active / paused / removed |
|
|
35
|
+
|
|
36
|
+
**No `profiles` column in the table** — the **filename** is the profile scope.
|
|
37
|
+
Shared across profiles → put the row in `_shared.md` (same as `*`).
|
|
38
|
+
Same handle needed by two profiles only (not all) → **copy the row into both files** (or later a small group file; avoid until needed).
|
|
39
|
+
|
|
40
|
+
## Resolve profile for scan / add (required)
|
|
41
|
+
|
|
42
|
+
1. User names **profile_id** → use it.
|
|
43
|
+
2. User names **account** handle → resolve via `accounts/_index.md` → `profile_id`.
|
|
44
|
+
3. User names **neither** → **do not default**. List active profiles from `profiles/_index.md` and **ask which profile** (or account).
|
|
45
|
+
4. Load rows = **`watchlists/_shared.md` (active)** ∪ **`watchlists/<profile_id>.md` (active)**.
|
|
46
|
+
5. Filter **`platform`**: user-specified, else default **`x`**; `全部平台` = no platform filter.
|
|
47
|
+
6. Create **Discovery** records first; do not create Topics during the scan. Cap **5** new **`produce`** topics only when the user later promotes. Sort watchlist rows by weight (≥1.3 first).
|
|
48
|
+
7. Wrong network for a row → never (e.g. no X tools on `platform=tiktok`).
|
|
49
|
+
|
|
50
|
+
## Maintenance
|
|
51
|
+
|
|
52
|
+
| User says | Agent does |
|
|
53
|
+
|-----------|------------|
|
|
54
|
+
| 把 @foo 加进 watchlist | Resolve/ask **profile** + **platform**; append row to that profile file (or `_shared` if user says 全 profile / shared) |
|
|
55
|
+
| 去掉 #n / @foo | Edit the correct file; if ambiguous, ask |
|
|
56
|
+
| 新 profile 建雷达 | Create `watchlists/<id>.md` |
|
|
57
|
+
|
|
58
|
+
## Scan rules (also CLAUDE § Discovery)
|
|
59
|
+
|
|
60
|
+
- Create one Discovery per meaningful signal; discard noise before analysis.
|
|
61
|
+
- Watchlist scan creates **Discovery** records first; it does not create Topics directly.
|
|
62
|
+
- Write a Source Digest + source limits only. Do not add our audience, product, ownership, or candidate Topics.
|
|
63
|
+
- Keep source engagement as context on the Discovery file; copy `src_*` to `topics/_index.md` only after promotion.
|
|
64
|
+
- Report `unread / read / saved / promoted / rejected` counts after the batch.
|
|
65
|
+
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
# Topics index (production queue)
|
|
2
|
+
|
|
3
|
+
One row = one topic. Full scorecard in **`item`** file.
|
|
4
|
+
Same topic on multiple platforms = **one topic row**; open **N runs** sharing `topic_id`.
|
|
5
|
+
Statuses live here and in the item—**not** folder names.
|
|
6
|
+
|
|
7
|
+
Newest on top.
|
|
8
|
+
|
|
9
|
+
| id | date | opp | aud | status | purpose | scout | platform | pillar | one_liner | item | source_type | src_url | src_handle | src_likes | src_replies | src_bookmarks | engagement_at | capture_id | run |
|
|
10
|
+
| -- | ---- | --- | --- | ------ | ------- | ----- | -------- | ------ | --------- | ---- | ----------- | ------- | ---------- | --------- | ----------- | ------------- | ------------- | ---------- | --- |
|
|
11
|
+
|
|
12
|
+
## Status values
|
|
13
|
+
|
|
14
|
+
| status | Meaning |
|
|
15
|
+
|--------|---------|
|
|
16
|
+
| `draft` | Created, not fully scored |
|
|
17
|
+
| `scored` | Has scores; not yet triaged |
|
|
18
|
+
| `ready` | opp ≥ 7.5 **and** aud ≥ 6 (dual gate) |
|
|
19
|
+
| `backlog` | opp/aud mid — re-angle, research, or wait |
|
|
20
|
+
| `parked` | opp < 6 or aud < 5 or hard-filter fail |
|
|
21
|
+
| `library` | Scout purpose library (structure later; not produce-ready) |
|
|
22
|
+
| `promoted` | Opened as a run (`run` column set) |
|
|
23
|
+
| `killed` | User rejected |
|
|
24
|
+
|
|
25
|
+
## Columns (key)
|
|
26
|
+
|
|
27
|
+
| Column | Meaning |
|
|
28
|
+
|--------|---------|
|
|
29
|
+
| `opp` | Opportunity score (weighted 5-dim: context/audience/conflict/insight/evidence) |
|
|
30
|
+
| `aud` | Audience dimension score (hard floor ≥ 6 for ready) |
|
|
31
|
+
| `item` | Wikilink to `topics/items/T-….md` |
|
|
32
|
+
| `source_type` | `watchlist` \| `inbox` \| `user` \| `discovery` |
|
|
33
|
+
| `src_*` | **Source post** engagement snapshot — not your publish metrics |
|
|
34
|
+
| `capture_id` | Set only if linked to inbox `C-…` |
|
|
35
|
+
| `run` | One or more `RUN-…` ids after open (comma-separated if multi-platform siblings) |
|
|
36
|
+
|
|
37
|
+
## Rules
|
|
38
|
+
|
|
39
|
+
- Max **5** new **`produce`** topics per promotion session
|
|
40
|
+
- Watchlist scan creates **Discovery** first; Topic only after explicit promotion
|
|
41
|
+
- Scout first; never `ready` on high `src_*` or opp_score alone (need audience ≥ 6 too)
|
|
42
|
+
- Scoring: `topics/scoring.md` (opportunity dimensions)
|
|
43
|
+
- `记一下` + URL: **inbox first**, not topics, unless user also asks to score as topic
|
|
44
|
+
- On 开一单: append all new run ids to `run`
|