@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.
Files changed (116) hide show
  1. package/README.md +29 -18
  2. package/content-engine/fixtures/golden-run-en/draft.md +13 -0
  3. package/content-engine/fixtures/golden-run-en/idea.md +26 -0
  4. package/content-engine/fixtures/golden-run-en/pack-tiktok.json +11 -0
  5. package/content-engine/scripts/contracts.mjs +183 -0
  6. package/content-engine/scripts/export-contracts.mjs +76 -0
  7. package/content-engine/scripts/fixture.test.mjs +24 -0
  8. package/content-engine/scripts/starter.mjs +55 -0
  9. package/content-engine/scripts/validate-export.mjs +42 -0
  10. package/content-engine/scripts/validate-pack.mjs +48 -0
  11. package/content-engine/scripts/validate-run.mjs +100 -0
  12. package/content-engine/scripts/validate.test.mjs +101 -0
  13. package/content-engine/scripts/workbench.mjs +135 -0
  14. package/content-engine/starter/CLAUDE.md +756 -0
  15. package/content-engine/starter/accounts/README.md +9 -0
  16. package/content-engine/starter/accounts/_index.md +31 -0
  17. package/content-engine/starter/accounts/overrides/README.md +3 -0
  18. package/content-engine/starter/discovery/README.md +18 -0
  19. package/content-engine/starter/discovery/_index.md +27 -0
  20. package/content-engine/starter/discovery/_template.md +41 -0
  21. package/content-engine/starter/engine.json +19 -0
  22. package/content-engine/starter/exports/README.md +28 -0
  23. package/content-engine/starter/inbox/README.md +9 -0
  24. package/content-engine/starter/inbox/_index.md +24 -0
  25. package/content-engine/starter/inbox/entries/README.md +3 -0
  26. package/content-engine/starter/platforms/README.md +19 -0
  27. package/content-engine/starter/platforms/ig.md +69 -0
  28. package/content-engine/starter/platforms/instagram.md +5 -0
  29. package/content-engine/starter/platforms/linkedin.md +72 -0
  30. package/content-engine/starter/platforms/threads.md +69 -0
  31. package/content-engine/starter/platforms/tiktok.md +71 -0
  32. package/content-engine/starter/platforms/x.md +78 -0
  33. package/content-engine/starter/platforms/xiaohongshu.md +19 -0
  34. package/content-engine/starter/profiles/_index.md +13 -0
  35. package/content-engine/starter/profiles/default/README.md +11 -0
  36. package/content-engine/starter/profiles/default/audience.md +38 -0
  37. package/content-engine/starter/profiles/default/pillars.md +33 -0
  38. package/content-engine/starter/profiles/default/voice.md +24 -0
  39. package/content-engine/starter/published/_index.md +20 -0
  40. package/content-engine/starter/raw/README.md +4 -0
  41. package/content-engine/starter/raw/_index.md +12 -0
  42. package/content-engine/starter/runs/README.md +22 -0
  43. package/content-engine/starter/runs/_index.md +41 -0
  44. package/content-engine/starter/runs/_template/brief.md +66 -0
  45. package/content-engine/starter/runs/_template/draft.md +11 -0
  46. package/content-engine/starter/runs/_template/editor.md +18 -0
  47. package/content-engine/starter/runs/_template/feedback.md +15 -0
  48. package/content-engine/starter/runs/_template/idea.md +27 -0
  49. package/content-engine/starter/runs/_template/pack.md +47 -0
  50. package/content-engine/starter/runs/_template/packet.md +25 -0
  51. package/content-engine/starter/runs/_template/rubric.md +19 -0
  52. package/content-engine/starter/swipe/_index.md +27 -0
  53. package/content-engine/starter/swipe/_template.md +34 -0
  54. package/content-engine/starter/topics/README.md +25 -0
  55. package/content-engine/starter/topics/WATCHLIST.md +65 -0
  56. package/content-engine/starter/topics/_index.md +44 -0
  57. package/content-engine/starter/topics/_template-item.md +90 -0
  58. package/content-engine/starter/topics/items/README.md +4 -0
  59. package/content-engine/starter/topics/scoring.md +201 -0
  60. package/content-engine/starter/topics/watchlists/README.md +10 -0
  61. package/content-engine/starter/topics/watchlists/_shared.md +14 -0
  62. package/content-engine/starter/topics/watchlists/default.md +6 -0
  63. package/content-engine/starter/wiki/README.md +13 -0
  64. package/content-engine/starter/wiki/atoms/_index.md +23 -0
  65. package/content-engine/starter/wiki/atoms/_template.md +31 -0
  66. package/content-engine/starter/wiki/claims/_index.md +26 -0
  67. package/content-engine/starter/wiki/claims/_template.md +38 -0
  68. package/content-engine/starter/workbench/README.md +17 -0
  69. package/content-engine/workbench/build.py +1074 -0
  70. package/content-engine/workbench/serve.py +53 -0
  71. package/content-engine/workbench/template.html +2119 -0
  72. package/dist/easysociable.js +804 -2903
  73. package/dist/easysociable.js.map +1 -1
  74. package/package.json +19 -13
  75. package/skills/ONBOARDING.md +20 -14
  76. package/skills/easysociable-content/SKILL.md +38 -102
  77. package/skills/easysociable-slideshow/SKILL.md +24 -16
  78. package/skills/easysociable-slideshow/references/VAULT.md +13 -11
  79. package/skills/easysociable-template/SKILL.md +26 -24
  80. package/skills/easysociable-template/references/CATALOG_METADATA.md +2 -2
  81. package/skills/easysociable-template/references/DESIGN_V2_1.md +53 -2
  82. package/skills/easysociable-template/references/GATEWAY.md +7 -2
  83. package/skills/easysociable-template/references/PLATFORM_SPECS.md +11 -3
  84. package/skills/easysociable-template/references/THEME_TOKENS.md +1 -1
  85. package/skills/easysociable-template/references/fixtures/image-reference.design-plan.json +74 -0
  86. package/skills/easysociable-template/references/fixtures/image-reference.visual-qa.json +28 -0
  87. package/skills/easysociable-template/scripts/generate-theme-from-hex.mjs +0 -0
  88. package/skills/easysociable-template/scripts/validate-design-v2.mjs +97 -0
  89. package/skills/easysociable-template/workflows/ASSET_PLAN.md +2 -1
  90. package/skills/easysociable-template/workflows/AUTHORING_FROM_BRIEF.md +4 -4
  91. package/skills/easysociable-template/workflows/AUTHORING_FROM_IMAGE.md +66 -16
  92. package/skills/easysociable-template/workflows/AUTHORING_STUDIO.md +28 -15
  93. package/skills/easysociable-template/workflows/DESIGN_BRIEF.md +4 -3
  94. package/skills/easysociable-template/workflows/MULTI_PLATFORM_FAMILY.md +81 -0
  95. package/skills/easysociable-template/workflows/PUBLISH_FROM_DRAFT.md +1 -1
  96. package/skills/easysociable-template/workflows/VISUAL_QA.md +10 -0
  97. package/skills/easysociable-content/platforms/claude.md +0 -5
  98. package/skills/easysociable-content/platforms/codex.md +0 -5
  99. package/skills/easysociable-content/platforms/hermes.md +0 -5
  100. package/skills/easysociable-content/platforms/openclaw.md +0 -5
  101. package/skills/easysociable-content/references/CLI.md +0 -27
  102. package/skills/easysociable-content/references/MCP.md +0 -20
  103. package/skills/easysociable-content/references/PAGE_PACK.md +0 -6
  104. package/skills/easysociable-content/references/TROUBLESHOOTING.md +0 -11
  105. package/skills/easysociable-content/references/VAULT.md +0 -20
  106. package/skills/easysociable-content/scripts/setup.mjs +0 -156
  107. package/skills/easysociable-content/scripts/setup.test.mjs +0 -71
  108. package/skills/easysociable-content/scripts/starter.mjs +0 -53
  109. package/skills/easysociable-content/workflows/ANALYSIS_AND_COVERAGE.md +0 -8
  110. package/skills/easysociable-content/workflows/CONTENT_EXPORT.md +0 -19
  111. package/skills/easysociable-content/workflows/DEVICE_TASKS.md +0 -5
  112. package/skills/easysociable-content/workflows/EXPERIMENTS.md +0 -6
  113. package/skills/easysociable-content/workflows/MCP_FIRST.md +0 -10
  114. package/skills/easysociable-content/workflows/PUBLICATION.md +0 -5
  115. package/skills/easysociable-content/workflows/TOPIC_DRAFT.md +0 -5
  116. 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,4 @@
1
+ # raw/
2
+
3
+ Authoritative sources. Registry: **`_index.md`**.
4
+ Bodies: `YYYY-MM-DD-short-slug.md`.
@@ -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,11 @@
1
+ ---
2
+ status: DRAFTED
3
+ ---
4
+
5
+ # Draft
6
+
7
+ Copy for **this run’s platform only**. Re-read `platforms/<platform>.md` before writing. Do not paste sibling-run copy unchanged.
8
+
9
+ ## Post 1
10
+
11
+ ## Post 2 (optional)
@@ -0,0 +1,18 @@
1
+ ---
2
+ status: EDIT_WAIT
3
+ verdict: REVISE | APPROVE
4
+ ---
5
+
6
+ # Editor report
7
+
8
+ ## Must fix
9
+
10
+ 1.
11
+
12
+ ## Optional
13
+
14
+ 1.
15
+
16
+ ## Verdict
17
+
18
+ REVISE | APPROVE
@@ -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`