autocrew 0.1.0
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/HAMLETDEER.md +562 -0
- package/LICENSE +21 -0
- package/README.md +190 -0
- package/README_CN.md +190 -0
- package/adapters/openclaw/index.ts +68 -0
- package/bin/autocrew.mjs +23 -0
- package/bin/autocrew.ts +13 -0
- package/openclaw.plugin.json +36 -0
- package/package.json +74 -0
- package/skills/_writing-style/SKILL.md +68 -0
- package/skills/audience-profiler/SKILL.md +241 -0
- package/skills/content-attribution/SKILL.md +128 -0
- package/skills/content-review/SKILL.md +257 -0
- package/skills/cover-generator/SKILL.md +93 -0
- package/skills/humanizer-zh/SKILL.md +75 -0
- package/skills/intel-digest/SKILL.md +57 -0
- package/skills/intel-pull/SKILL.md +74 -0
- package/skills/manage-pipeline/SKILL.md +63 -0
- package/skills/memory-distill/SKILL.md +89 -0
- package/skills/onboarding/SKILL.md +117 -0
- package/skills/pipeline-status/SKILL.md +51 -0
- package/skills/platform-rewrite/SKILL.md +125 -0
- package/skills/pre-publish/SKILL.md +142 -0
- package/skills/publish-content/SKILL.md +500 -0
- package/skills/remix-content/SKILL.md +77 -0
- package/skills/research/SKILL.md +127 -0
- package/skills/setup/SKILL.md +353 -0
- package/skills/spawn-batch-writer/SKILL.md +66 -0
- package/skills/spawn-planner/SKILL.md +72 -0
- package/skills/spawn-writer/SKILL.md +60 -0
- package/skills/teardown/SKILL.md +144 -0
- package/skills/title-craft/SKILL.md +234 -0
- package/skills/topic-ideas/SKILL.md +105 -0
- package/skills/video-timeline/SKILL.md +117 -0
- package/skills/write-script/SKILL.md +232 -0
- package/skills/xhs-cover-review/SKILL.md +48 -0
- package/src/adapters/browser/browser-cdp.ts +260 -0
- package/src/adapters/browser/browser-relay.ts +236 -0
- package/src/adapters/browser/gateway-client.ts +148 -0
- package/src/adapters/browser/types.ts +36 -0
- package/src/adapters/image/gemini.ts +219 -0
- package/src/adapters/research/tikhub.ts +19 -0
- package/src/cli/banner.ts +18 -0
- package/src/cli/bootstrap.ts +33 -0
- package/src/cli/commands/adapt.ts +28 -0
- package/src/cli/commands/advance.ts +28 -0
- package/src/cli/commands/assets.ts +24 -0
- package/src/cli/commands/audit.ts +18 -0
- package/src/cli/commands/contents.ts +18 -0
- package/src/cli/commands/cover.ts +58 -0
- package/src/cli/commands/events.ts +17 -0
- package/src/cli/commands/humanize.ts +27 -0
- package/src/cli/commands/index.ts +80 -0
- package/src/cli/commands/init.ts +28 -0
- package/src/cli/commands/intel.ts +55 -0
- package/src/cli/commands/learn.ts +34 -0
- package/src/cli/commands/memory.ts +18 -0
- package/src/cli/commands/migrate.ts +24 -0
- package/src/cli/commands/open.ts +21 -0
- package/src/cli/commands/pipelines.ts +18 -0
- package/src/cli/commands/pre-publish.ts +27 -0
- package/src/cli/commands/profile.ts +31 -0
- package/src/cli/commands/research.ts +36 -0
- package/src/cli/commands/restore.ts +28 -0
- package/src/cli/commands/review.ts +61 -0
- package/src/cli/commands/start.ts +28 -0
- package/src/cli/commands/status.ts +14 -0
- package/src/cli/commands/templates.ts +15 -0
- package/src/cli/commands/topics.ts +18 -0
- package/src/cli/commands/trash.ts +28 -0
- package/src/cli/commands/upgrade.ts +48 -0
- package/src/cli/commands/versions.ts +24 -0
- package/src/cli/index.ts +40 -0
- package/src/data/sensitive-words-builtin.json +114 -0
- package/src/data/source-presets.yaml +54 -0
- package/src/e2e.test.ts +596 -0
- package/src/modules/auth/cookie-manager.ts +113 -0
- package/src/modules/cards/template-engine.ts +74 -0
- package/src/modules/cards/templates/comparison-table.ts +71 -0
- package/src/modules/cards/templates/data-chart.ts +76 -0
- package/src/modules/cards/templates/flow-chart.ts +49 -0
- package/src/modules/cards/templates/key-points.ts +59 -0
- package/src/modules/cover/prompt-builder.test.ts +157 -0
- package/src/modules/cover/prompt-builder.ts +212 -0
- package/src/modules/cover/ratio-adapter.test.ts +122 -0
- package/src/modules/cover/ratio-adapter.ts +104 -0
- package/src/modules/filter/sensitive-words.test.ts +72 -0
- package/src/modules/filter/sensitive-words.ts +212 -0
- package/src/modules/humanizer/zh.test.ts +75 -0
- package/src/modules/humanizer/zh.ts +175 -0
- package/src/modules/intel/collector.ts +19 -0
- package/src/modules/intel/collectors/competitor.test.ts +71 -0
- package/src/modules/intel/collectors/competitor.ts +65 -0
- package/src/modules/intel/collectors/rss.test.ts +56 -0
- package/src/modules/intel/collectors/rss.ts +70 -0
- package/src/modules/intel/collectors/trends.test.ts +80 -0
- package/src/modules/intel/collectors/trends.ts +107 -0
- package/src/modules/intel/collectors/web-search.test.ts +85 -0
- package/src/modules/intel/collectors/web-search.ts +81 -0
- package/src/modules/intel/integration.test.ts +203 -0
- package/src/modules/intel/intel-engine.test.ts +103 -0
- package/src/modules/intel/intel-engine.ts +96 -0
- package/src/modules/intel/source-config.test.ts +113 -0
- package/src/modules/intel/source-config.ts +131 -0
- package/src/modules/learnings/diff-tracker.test.ts +144 -0
- package/src/modules/learnings/diff-tracker.ts +189 -0
- package/src/modules/learnings/rule-distiller.ts +141 -0
- package/src/modules/memory/distill.ts +208 -0
- package/src/modules/migrate/legacy-migrate.test.ts +169 -0
- package/src/modules/migrate/legacy-migrate.ts +229 -0
- package/src/modules/pro/api-client.ts +192 -0
- package/src/modules/pro/gate.test.ts +110 -0
- package/src/modules/pro/gate.ts +104 -0
- package/src/modules/profile/creator-profile.test.ts +178 -0
- package/src/modules/profile/creator-profile.ts +248 -0
- package/src/modules/publish/douyin-api.ts +34 -0
- package/src/modules/publish/wechat-mp.ts +320 -0
- package/src/modules/publish/xiaohongshu-api.ts +127 -0
- package/src/modules/research/free-engine.ts +360 -0
- package/src/modules/timeline/markup-generator.ts +63 -0
- package/src/modules/timeline/parser.ts +275 -0
- package/src/modules/workflow/templates.ts +124 -0
- package/src/modules/writing/platform-rewrite.ts +190 -0
- package/src/modules/writing/title-hashtag.ts +385 -0
- package/src/runtime/context.test.ts +97 -0
- package/src/runtime/context.ts +129 -0
- package/src/runtime/events.test.ts +83 -0
- package/src/runtime/events.ts +104 -0
- package/src/runtime/hooks.ts +174 -0
- package/src/runtime/tool-runner.test.ts +204 -0
- package/src/runtime/tool-runner.ts +282 -0
- package/src/runtime/workflow-engine.test.ts +455 -0
- package/src/runtime/workflow-engine.ts +391 -0
- package/src/server/index.ts +409 -0
- package/src/server/start.ts +39 -0
- package/src/storage/local-store.test.ts +304 -0
- package/src/storage/local-store.ts +704 -0
- package/src/storage/pipeline-store.test.ts +363 -0
- package/src/storage/pipeline-store.ts +698 -0
- package/src/tools/asset.ts +96 -0
- package/src/tools/content-save.ts +276 -0
- package/src/tools/cover-review.ts +221 -0
- package/src/tools/humanize.ts +54 -0
- package/src/tools/init.ts +133 -0
- package/src/tools/intel.ts +92 -0
- package/src/tools/memory.ts +76 -0
- package/src/tools/pipeline-ops.ts +109 -0
- package/src/tools/pipeline.ts +168 -0
- package/src/tools/pre-publish.ts +232 -0
- package/src/tools/publish.ts +183 -0
- package/src/tools/registry.ts +198 -0
- package/src/tools/research.ts +304 -0
- package/src/tools/review.ts +305 -0
- package/src/tools/rewrite.ts +165 -0
- package/src/tools/status.ts +30 -0
- package/src/tools/timeline.ts +234 -0
- package/src/tools/topic-create.ts +50 -0
- package/src/types/providers.ts +69 -0
- package/src/types/timeline.test.ts +147 -0
- package/src/types/timeline.ts +83 -0
- package/src/utils/retry.test.ts +97 -0
- package/src/utils/retry.ts +85 -0
- package/templates/AGENTS.md +99 -0
- package/templates/SOUL.md +31 -0
- package/templates/TOOLS.md +76 -0
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: research
|
|
3
|
+
description: |
|
|
4
|
+
Content topic research and competitor analysis. Activate when user asks to find topics, research competitors, analyze trending content, or generate content ideas for Chinese social media (Xiaohongshu, Douyin, WeChat, Bilibili, etc.).
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Research
|
|
8
|
+
|
|
9
|
+
> Executor skill. Now **intel-first**: gathers intelligence from multiple sources, then extracts topics from accumulated intel.
|
|
10
|
+
|
|
11
|
+
## Research Strategy
|
|
12
|
+
|
|
13
|
+
AutoCrew research is now **intel-first, multi-source**:
|
|
14
|
+
|
|
15
|
+
1. **Pull intel** from all configured sources (web search, RSS, trends, competitors)
|
|
16
|
+
2. **Archive to local intel library** (`~/.autocrew/pipeline/intel/`)
|
|
17
|
+
3. **Extract topics** from accumulated intel with scoring and profile matching
|
|
18
|
+
4. **Save to topic pool** (`~/.autocrew/pipeline/topics/`)
|
|
19
|
+
|
|
20
|
+
Two research paths:
|
|
21
|
+
- **情报 → 选题** (default): Pull latest intel, then generate topics from insights
|
|
22
|
+
- **选题 → 情报** (reverse): User has a topic idea, system does deep research to enrich it
|
|
23
|
+
|
|
24
|
+
## Inputs
|
|
25
|
+
|
|
26
|
+
| Parameter | Source | Required | Description |
|
|
27
|
+
|-----------|--------|----------|-------------|
|
|
28
|
+
| topic_count | Message | No | Number of topics to generate (default: 3) |
|
|
29
|
+
| direction | Message | No | Specific topic direction or theme |
|
|
30
|
+
| keyword | Message | No | Specific keyword for focused research |
|
|
31
|
+
| topic | Message | No | Existing topic for reverse deep research |
|
|
32
|
+
|
|
33
|
+
## Steps
|
|
34
|
+
|
|
35
|
+
### Path A: 情报 → 选题 (Intel-First, Default)
|
|
36
|
+
|
|
37
|
+
1. **Onboarding check** — Read `creator-profile.json`. If missing or `industry` is empty, trigger onboarding first.
|
|
38
|
+
|
|
39
|
+
2. **Pull intel** — Call `autocrew_intel` tool to gather from all sources:
|
|
40
|
+
```json
|
|
41
|
+
{ "action": "pull" }
|
|
42
|
+
```
|
|
43
|
+
This runs 4 collectors in parallel:
|
|
44
|
+
- **Web Search**: multi-dimension queries (行业动态, 争议话题, 数据报告, 教程, 趋势)
|
|
45
|
+
- **RSS**: configured feeds from `_sources/rss.yaml`
|
|
46
|
+
- **Trends**: platform hot lists from `_sources/trends.yaml` (国内: 微博/抖音/知乎/B站; 国际: HN/Reddit/Twitter/ProductHunt etc.)
|
|
47
|
+
- **Competitors**: browser-based monitoring from `_sources/accounts.yaml`
|
|
48
|
+
|
|
49
|
+
All results are deduplicated and archived as Markdown files in `~/.autocrew/pipeline/intel/{domain}/`.
|
|
50
|
+
|
|
51
|
+
3. **Review intel** — Call `autocrew_intel` to list recent intel:
|
|
52
|
+
```json
|
|
53
|
+
{ "action": "list" }
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
4. **Generate topics** — Before generating, load `skills/title-craft/SKILL.md` for title methodology. Select 1-2 title types from the 8 types that best match the topic angle.
|
|
57
|
+
|
|
58
|
+
**HARD RULE: Titles MUST be ≤20 Chinese characters. Count every character including punctuation. Titles over 20 chars are REJECTED — rewrite until they fit.** This is a platform constraint (Xiaohongshu hard limit), not a suggestion.
|
|
59
|
+
|
|
60
|
+
For each topic:
|
|
61
|
+
- Title: ≤20 characters, apply title-craft methodology (emotional resonance, precision lens, pattern breaker, etc.)
|
|
62
|
+
- Title type label: which of the 8 types was used
|
|
63
|
+
- Score: heat + differentiation + audience_fit
|
|
64
|
+
- Angles: 2-3 specific entry points
|
|
65
|
+
- Intel refs: which intel items informed this topic
|
|
66
|
+
- Suggested platforms and formats
|
|
67
|
+
|
|
68
|
+
5. **Quality gate** — each topic must pass:
|
|
69
|
+
- [ ] **Title ≤20 chars** (count again before saving — if over, rewrite)
|
|
70
|
+
- [ ] Has a specific, non-obvious angle (not "AI工具推荐" but "AI工具用了3个月,这5个我删了")
|
|
71
|
+
- [ ] References concrete intel data points
|
|
72
|
+
- [ ] Answers "why now" — what makes this timely
|
|
73
|
+
- [ ] Doesn't violate style boundaries (never list)
|
|
74
|
+
- [ ] Title passes the title-craft quality checklist (targeting, emotion, value, curiosity, credibility)
|
|
75
|
+
|
|
76
|
+
6. **Save topics** — Save to pipeline topic pool. Topics are Markdown files with frontmatter scores.
|
|
77
|
+
|
|
78
|
+
7. **Output summary:**
|
|
79
|
+
```
|
|
80
|
+
📥 灵感源采集完成(Web Search: X, RSS: X, 趋势: X, 竞品: X)
|
|
81
|
+
💡 从灵感源中提炼了 {count} 个选题:
|
|
82
|
+
|
|
83
|
+
1. {title_1} (综合分: 83)
|
|
84
|
+
切入角度: {angle}
|
|
85
|
+
2. {title_2} (综合分: 76)
|
|
86
|
+
切入角度: {angle}
|
|
87
|
+
|
|
88
|
+
选一个开始写?或继续调研其他方向。
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
### Path B: 选题 → 情报 (Reverse Deep Research)
|
|
92
|
+
|
|
93
|
+
When user already has a topic idea and wants deeper research:
|
|
94
|
+
|
|
95
|
+
1. Call `autocrew_intel` with targeted keywords from the topic
|
|
96
|
+
2. Use `web_search` for deep-dive queries specific to the topic angle
|
|
97
|
+
3. Save gathered intel to library
|
|
98
|
+
4. Enrich the existing topic file with new references and angles
|
|
99
|
+
|
|
100
|
+
```json
|
|
101
|
+
{ "action": "pull", "keywords": ["Cursor Agent", "Claude Code", "AI编程工具对比"] }
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
### Fallback Modes
|
|
105
|
+
|
|
106
|
+
If intel pull returns no results from configured sources:
|
|
107
|
+
|
|
108
|
+
1. **Browser-first fallback** — Use host-provided CDP capabilities to inspect platform content directly
|
|
109
|
+
2. **Free engine fallback** — Use `autocrew_research` tool's free mode with web search + viral scoring
|
|
110
|
+
3. **Manual fallback** — Generate topics from LLM knowledge, note that no live data was available
|
|
111
|
+
|
|
112
|
+
## Error Handling
|
|
113
|
+
|
|
114
|
+
| Failure | Action |
|
|
115
|
+
|---------|--------|
|
|
116
|
+
| No creator profile | Trigger onboarding |
|
|
117
|
+
| RSS/trends sources not configured | Guide through source setup, continue with web search |
|
|
118
|
+
| Browser session unavailable | Skip competitor collector, use other sources |
|
|
119
|
+
| All sources fail | Fall back to free engine, then LLM knowledge |
|
|
120
|
+
| Topic save fails | Log error, continue saving remaining topics |
|
|
121
|
+
|
|
122
|
+
## Changelog
|
|
123
|
+
|
|
124
|
+
- 2026-03-31: v1 — Initial version. Web search as primary data source.
|
|
125
|
+
- 2026-03-31: v2 — Browser-first research strategy.
|
|
126
|
+
- 2026-04-01: v3 — Added Free mode using free-engine.ts.
|
|
127
|
+
- 2026-04-03: v4 — **Intel-first rewrite.** Multi-source intel engine (web search + RSS + trends + competitors). Intel archived as Markdown. Topics extracted from accumulated intel with scoring. Two paths: intel→topics and topic→intel. Pipeline integration.
|
|
@@ -0,0 +1,353 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: setup
|
|
3
|
+
description: |
|
|
4
|
+
一键完成品牌设置 + 写作风格校准。首次使用运行完整流程,再次运行可查看/微调。
|
|
5
|
+
Trigger: /setup, 设置, 品牌校准, 风格校准, calibrate
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# /setup — 品牌设置 + 风格校准(一键完成)
|
|
9
|
+
|
|
10
|
+
> 合并原 `/calibrate` 和 `style-calibration`。
|
|
11
|
+
> 一次对话完成品牌定位、受众画像、写作风格校准,并立即产出 3 个选题。
|
|
12
|
+
|
|
13
|
+
## Pre-read: 静默上下文加载
|
|
14
|
+
|
|
15
|
+
开始前静默读取(不要告知用户你在读文件):
|
|
16
|
+
|
|
17
|
+
1. `~/.autocrew/STYLE.md` — 已有风格档案
|
|
18
|
+
2. `~/.autocrew/creator-profile.json` — 校准状态和品牌信息
|
|
19
|
+
3. `~/.autocrew/MEMORY.md` — 历史记忆
|
|
20
|
+
|
|
21
|
+
**如果 `styleCalibrated: true`**,展示当前状态并提供选择:
|
|
22
|
+
|
|
23
|
+
```
|
|
24
|
+
检测到你已经有风格档案了。
|
|
25
|
+
|
|
26
|
+
当前风格摘要:[从 STYLE.md 提取 2-3 句核心特征]
|
|
27
|
+
|
|
28
|
+
你想:
|
|
29
|
+
1. 查看完整档案
|
|
30
|
+
2. 微调某个部分(告诉我想调什么)
|
|
31
|
+
3. 从头重新校准
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
**如果是首次使用** → 进入 Phase 0。
|
|
35
|
+
|
|
36
|
+
---
|
|
37
|
+
|
|
38
|
+
## Phase 0: 品牌调研(2-4 轮对话)
|
|
39
|
+
|
|
40
|
+
> 目标:理解品牌定位、受众、风格边界。这是对话,不是问卷。
|
|
41
|
+
|
|
42
|
+
### 开场
|
|
43
|
+
|
|
44
|
+
用 ONE 开放性问题启动,不要一次问多个:
|
|
45
|
+
|
|
46
|
+
```
|
|
47
|
+
欢迎来到 AutoCrew 风格校准!
|
|
48
|
+
|
|
49
|
+
整个过程大概 10-15 分钟,之后 AI 写的内容就会"像你"。
|
|
50
|
+
|
|
51
|
+
先聊聊——你做什么内容?给谁看的?
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
### 对话原则
|
|
55
|
+
|
|
56
|
+
- **每轮最多 1-2 个问题**,对用户回答先给简短洞察再问下一个
|
|
57
|
+
- **顺着用户回答的方向走**,不要跳到预设脚本
|
|
58
|
+
- **不要审讯式连问**,像朋友聊天一样自然
|
|
59
|
+
- **已有信息跳过**(从 MEMORY.md / creator-profile.json 复用)
|
|
60
|
+
|
|
61
|
+
### 4 个维度(必须收集齐)
|
|
62
|
+
|
|
63
|
+
在自然对话中覆盖以下 4 个维度,不需要按顺序问:
|
|
64
|
+
|
|
65
|
+
| 维度 | 为什么重要 | 引导方向 |
|
|
66
|
+
|------|-----------|---------|
|
|
67
|
+
| **定位与目标** | 决定话题选择和专业度 | 行业、变现模式、当前阶段(起步/成长/成熟)、做内容的核心动机 |
|
|
68
|
+
| **内容样本** | 最直接的风格参考 | 最满意的已有内容、喜欢的其他账号、或想要的方向描述 |
|
|
69
|
+
| **受众** | 决定语气和深度 | 一个具体的人,不是抽象人口统计。问"描述一个你最想影响的人" |
|
|
70
|
+
| **风格禁区** | 避免踩雷 | 绝对不想变成什么样、讨厌什么类型的内容、哪些词/风格是禁区 |
|
|
71
|
+
|
|
72
|
+
**Backstop**:在觉得信息足够时,检查这 4 个维度是否都覆盖了。如果有缺失的,自然地补问。
|
|
73
|
+
|
|
74
|
+
---
|
|
75
|
+
|
|
76
|
+
## Phase 0.5: 三个受众人设(1-2 轮对话)
|
|
77
|
+
|
|
78
|
+
> 目标:具象化受众,不是笼统的"25-35 岁白领"。
|
|
79
|
+
|
|
80
|
+
基于 Phase 0 收集的信息,生成 3 个差异化的受众人设:
|
|
81
|
+
|
|
82
|
+
### 人设格式
|
|
83
|
+
|
|
84
|
+
每个人设包含:
|
|
85
|
+
|
|
86
|
+
| 字段 | 说明 |
|
|
87
|
+
|------|------|
|
|
88
|
+
| **名字** | 一个具体的名字(让受众有人格) |
|
|
89
|
+
| **年龄 + 职业** | e.g., 28 岁,互联网产品经理 |
|
|
90
|
+
| **处境描述** | 2-3 句,用场景化语言描述 TA 当下的状态 |
|
|
91
|
+
| **核心焦虑** | TA 最深层的担忧是什么(不是表面的) |
|
|
92
|
+
| **Scroll-stop 触发器** | 什么样的标题/封面会让 TA 停下来 |
|
|
93
|
+
| **内心独白** | TA 刷到你内容时的第一反应(用 TA 的语气) |
|
|
94
|
+
| **标题示例** | 一个会点进去的标题 |
|
|
95
|
+
| **反面标题** | 一个会划走的标题(对比用) |
|
|
96
|
+
|
|
97
|
+
### 3 种人设类型
|
|
98
|
+
|
|
99
|
+
1. **核心受众 (Core)** — 你最主要的粉丝群,内容为他们量身定制
|
|
100
|
+
2. **邻近受众 (Adjacent)** — 不是核心人群但会被吸引,拓展方向
|
|
101
|
+
3. **惊喜受众 (Surprise)** — 意想不到会关注你的人群,增长潜力
|
|
102
|
+
|
|
103
|
+
### 用户选择
|
|
104
|
+
|
|
105
|
+
```
|
|
106
|
+
这是我分析出的 3 个受众画像。
|
|
107
|
+
你觉得哪个最接近你心目中的核心读者?
|
|
108
|
+
可以选一个、合并、或告诉我哪里不准。
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
---
|
|
112
|
+
|
|
113
|
+
## Phase 0.6: 总结确认 + 写入档案(1 轮)
|
|
114
|
+
|
|
115
|
+
> 目标:锁定品牌定位,写入持久化文件。
|
|
116
|
+
|
|
117
|
+
### 总结
|
|
118
|
+
|
|
119
|
+
用 2-3 句话综合品牌定位:
|
|
120
|
+
|
|
121
|
+
```
|
|
122
|
+
总结一下——
|
|
123
|
+
你是 [行业/领域] 的 [角色],核心受众是 [一句话描述]。
|
|
124
|
+
内容风格偏 [方向],不碰 [禁区]。
|
|
125
|
+
|
|
126
|
+
准确吗?有要改的地方吗?
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
用户确认后:
|
|
130
|
+
|
|
131
|
+
### 写入操作
|
|
132
|
+
|
|
133
|
+
1. 调用 `autocrew_init` 确保 `~/.autocrew/` 目录存在
|
|
134
|
+
2. 写入 `~/.autocrew/creator-profile.json`:
|
|
135
|
+
```json
|
|
136
|
+
{
|
|
137
|
+
"industry": "从对话收集",
|
|
138
|
+
"platforms": ["从对话收集"],
|
|
139
|
+
"audiencePersona": {
|
|
140
|
+
"core": { "name": "...", "age": "...", "job": "...", "situation": "...", "coreAnxiety": "...", "scrollStopTriggers": ["..."], "innerVoice": "..." },
|
|
141
|
+
"adjacent": { "..." },
|
|
142
|
+
"surprise": { "..." }
|
|
143
|
+
},
|
|
144
|
+
"styleBoundaries": {
|
|
145
|
+
"never": ["从禁区收集"],
|
|
146
|
+
"always": ["后续从风格分析填充"]
|
|
147
|
+
},
|
|
148
|
+
"contentGoals": ["从对话收集"],
|
|
149
|
+
"stage": "startup|growing|mature"
|
|
150
|
+
}
|
|
151
|
+
```
|
|
152
|
+
3. 调用 `autocrew_memory` 的 `capture_feedback` 记录品牌调研完成
|
|
153
|
+
|
|
154
|
+
---
|
|
155
|
+
|
|
156
|
+
## Phase 1: 自由表达采集(3-4 轮对话)
|
|
157
|
+
|
|
158
|
+
> 目标:让用户自然写东西,从中提取真实的写作风格。不要让用户知道你在分析。
|
|
159
|
+
|
|
160
|
+
### 场景 1:安利式介绍
|
|
161
|
+
|
|
162
|
+
```
|
|
163
|
+
来,用一段话介绍你的账号——
|
|
164
|
+
就像跟朋友安利一样,不用正式,怎么自然怎么来。
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
### 场景 2:行业场景(动态生成)
|
|
168
|
+
|
|
169
|
+
**基于用户的行业/领域动态生成,不要用固定场景。**
|
|
170
|
+
|
|
171
|
+
例子(仅供参考,实际必须根据用户行业生成):
|
|
172
|
+
- 如果是健身领域:"你有个朋友说'我太忙了没时间运动',你怎么回他?"
|
|
173
|
+
- 如果是 AI/科技:"有个人问你'普通人现在学 AI 还来得及吗',你怎么说?"
|
|
174
|
+
- 如果是育儿领域:"有个妈妈跟你吐槽'孩子不爱读书',你怎么回?"
|
|
175
|
+
|
|
176
|
+
### 场景 3(可选)
|
|
177
|
+
|
|
178
|
+
只在前两个场景风格不一致时追加。目的是确认哪个才是用户的真实风格。
|
|
179
|
+
|
|
180
|
+
### 静默分析维度
|
|
181
|
+
|
|
182
|
+
从用户的自然表达中提取(不要告诉用户你在分析这些):
|
|
183
|
+
- **句子长度**:平均多少字?短句多还是长句多?
|
|
184
|
+
- **标点习惯**:感叹号频率、省略号使用、破折号偏好
|
|
185
|
+
- **口语标记**:是否用"嘛""吧""啊""哈"等语气词
|
|
186
|
+
- **节奏感**:是连贯叙述还是跳跃式?有没有突然的短句?
|
|
187
|
+
- **情绪风格**:克制理性 vs 情绪外放?幽默方式是什么?
|
|
188
|
+
- **举例方式**:用数据说话还是用故事说话?
|
|
189
|
+
- **独特表达**:有没有个人口头禅或标志性表达?
|
|
190
|
+
|
|
191
|
+
---
|
|
192
|
+
|
|
193
|
+
## Phase 2: A/B 对比校准(3-4 轮)
|
|
194
|
+
|
|
195
|
+
> 目标:通过对比微调风格。A/B 对比是核心校准机制,不要跳过。
|
|
196
|
+
|
|
197
|
+
### 每轮操作
|
|
198
|
+
|
|
199
|
+
1. 基于 Phase 1 分析结果,生成同一段落的 2 个版本(每个 100-150 字)
|
|
200
|
+
2. **版本 A**:严格按提取的风格特征写
|
|
201
|
+
3. **版本 B**:故意在 2-3 个维度上做偏移(更口语化 / 更正式 / 更短 / emoji 更多等)
|
|
202
|
+
|
|
203
|
+
### 用户反馈
|
|
204
|
+
|
|
205
|
+
```
|
|
206
|
+
A 和 B,哪个更像你?
|
|
207
|
+
|
|
208
|
+
更重要的是——告诉我 WHY。
|
|
209
|
+
是节奏?用词?语气?某个具体的地方?
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
**用户的 WHY 是最高信号**,比选择本身更重要。记录这些反馈用于精调。
|
|
213
|
+
|
|
214
|
+
### 轮次控制
|
|
215
|
+
|
|
216
|
+
- 最多 3 轮 A/B
|
|
217
|
+
- 如果第 1 轮用户就说"A 完全是我",可以缩短到 2 轮验证
|
|
218
|
+
- 如果 3 轮都不满意 → 回到 Phase 1 重新采集样本
|
|
219
|
+
|
|
220
|
+
---
|
|
221
|
+
|
|
222
|
+
## Phase 3: 表达人格生成(1-2 轮)
|
|
223
|
+
|
|
224
|
+
> 目标:生成自然语言的写作人格描述,不是参数表。
|
|
225
|
+
|
|
226
|
+
### 写法
|
|
227
|
+
|
|
228
|
+
用**像朋友描述这个人说话方式**的口吻写,而不是列参数:
|
|
229
|
+
|
|
230
|
+
```
|
|
231
|
+
❌ 不要这样:
|
|
232
|
+
- 语气:随意偏专业
|
|
233
|
+
- 句式:短句为主
|
|
234
|
+
- emoji:中等频率
|
|
235
|
+
|
|
236
|
+
✅ 要这样:
|
|
237
|
+
"她说话像在和你喝咖啡聊天——开头总是抛一个让你想接话的问题,
|
|
238
|
+
然后用自己的故事回答。句子不长,但每句都有嚼劲。
|
|
239
|
+
偶尔甩个 emoji 当标点,但绝不堆砌。
|
|
240
|
+
最后总会留一个开放式的问题,让你忍不住想回复。"
|
|
241
|
+
```
|
|
242
|
+
|
|
243
|
+
### 用户确认
|
|
244
|
+
|
|
245
|
+
```
|
|
246
|
+
这是你的'写作人格'——
|
|
247
|
+
|
|
248
|
+
[自然语言描述]
|
|
249
|
+
|
|
250
|
+
准确吗?有哪里要调整的?
|
|
251
|
+
```
|
|
252
|
+
|
|
253
|
+
### 写入操作
|
|
254
|
+
|
|
255
|
+
用户确认后:
|
|
256
|
+
|
|
257
|
+
1. **写入 `~/.autocrew/STYLE.md`**(控制在 60 行以内,简洁可扫描):
|
|
258
|
+
```markdown
|
|
259
|
+
# Brand Voice Profile
|
|
260
|
+
|
|
261
|
+
## Expression Persona
|
|
262
|
+
[自然语言的写作人格描述,Phase 3 生成的那段话]
|
|
263
|
+
|
|
264
|
+
## Core Tone
|
|
265
|
+
[一句话概括整体调性]
|
|
266
|
+
|
|
267
|
+
## Writing Patterns
|
|
268
|
+
- Opening: [Hook 模式]
|
|
269
|
+
- Emoji: [使用习惯]
|
|
270
|
+
- Paragraph: [段落偏好]
|
|
271
|
+
- Ending: [CTA 模式]
|
|
272
|
+
|
|
273
|
+
## Vocabulary
|
|
274
|
+
- Prefers: [偏好表达]
|
|
275
|
+
- Avoids: [禁忌表达]
|
|
276
|
+
|
|
277
|
+
## Sentence Structure
|
|
278
|
+
[句式特征]
|
|
279
|
+
|
|
280
|
+
## Platform Variations
|
|
281
|
+
- 小红书: [特定调整]
|
|
282
|
+
- 公众号: [特定调整]
|
|
283
|
+
- 抖音: [特定调整]
|
|
284
|
+
|
|
285
|
+
## Creator Persona
|
|
286
|
+
- Type: [创作者类型]
|
|
287
|
+
- Unique Angle: [独特视角]
|
|
288
|
+
- Content Goals: [内容目标]
|
|
289
|
+
|
|
290
|
+
## Audience Persona
|
|
291
|
+
- Core: [核心受众一句话]
|
|
292
|
+
- Adjacent: [邻近受众一句话]
|
|
293
|
+
- Surprise: [惊喜受众一句话]
|
|
294
|
+
```
|
|
295
|
+
|
|
296
|
+
2. **更新 `creator-profile.json`**:
|
|
297
|
+
- `expressionPersona` — Phase 3 生成的自然语言描述
|
|
298
|
+
- `styleCalibrated` — 设为 `true`
|
|
299
|
+
- `writingRules` — 从 Phase 1/2 提取的规则,source 设为 `"calibrated"`
|
|
300
|
+
- `styleBoundaries.always` — 从风格分析提取的必须保持的特征
|
|
301
|
+
|
|
302
|
+
3. **调用 `autocrew_memory` 的 `capture_feedback`** 记录校准完成事件
|
|
303
|
+
|
|
304
|
+
---
|
|
305
|
+
|
|
306
|
+
## Phase 4: 首个交付物 —— 3 个选题
|
|
307
|
+
|
|
308
|
+
> 目标:校准完立刻产出价值,不要让用户空手离开。
|
|
309
|
+
|
|
310
|
+
### 操作
|
|
311
|
+
|
|
312
|
+
1. 基于所有收集的信息(品牌定位、受众画像、写作风格),立即生成 3 个选题
|
|
313
|
+
2. 每个选题包含:
|
|
314
|
+
- **标题**(≤20 字,scroll-stop 测试通过)
|
|
315
|
+
- **角度**(一句话,这个选题的非显然洞察)
|
|
316
|
+
- **为什么这个选题适合你**(关联品牌定位 + 受众痛点)
|
|
317
|
+
3. 调用 `autocrew_topic create` 保存到选题库
|
|
318
|
+
4. 询问用户:
|
|
319
|
+
|
|
320
|
+
```
|
|
321
|
+
这是基于你的品牌定位生成的 3 个选题,已经存到选题库了。
|
|
322
|
+
|
|
323
|
+
想试着写哪个?我可以按你的风格先写个初稿。
|
|
324
|
+
```
|
|
325
|
+
|
|
326
|
+
---
|
|
327
|
+
|
|
328
|
+
## 关键原则
|
|
329
|
+
|
|
330
|
+
1. **对话,不是问卷** — 顺着用户的回答走,不要跳到预设脚本
|
|
331
|
+
2. **A/B 对比是核心校准机制** — 不要跳过 Phase 2
|
|
332
|
+
3. **表达人格用自然语言** — 不是参数表,是像朋友描述你说话方式
|
|
333
|
+
4. **以交付物结尾** — 校准完直接给 3 个选题,不要空手送走用户
|
|
334
|
+
5. **STYLE.md 控制在 60 行以内** — 简洁可扫描
|
|
335
|
+
6. **更新不覆盖** — 微调模式下只改需要改的部分
|
|
336
|
+
|
|
337
|
+
## 工具依赖
|
|
338
|
+
|
|
339
|
+
- `autocrew_init` — 初始化 `~/.autocrew/` 数据目录
|
|
340
|
+
- `autocrew_memory` — 记录校准事件到 MEMORY.md(`capture_feedback` action)
|
|
341
|
+
- `autocrew_topic` — 保存选题到选题库(`create` action)
|
|
342
|
+
- 文件系统读写 — STYLE.md、creator-profile.json、MEMORY.md
|
|
343
|
+
|
|
344
|
+
## 与其他 Skill 的关系
|
|
345
|
+
|
|
346
|
+
- **onboarding** — 会在用户首次使用时 nudge 建议运行 `/setup`
|
|
347
|
+
- **write-script / publish-content** — 自动读取 STYLE.md 应用风格
|
|
348
|
+
- **topic-ideas** — Phase 4 产出的选题与 topic-ideas 共享选题库
|
|
349
|
+
- **audience-profiler** — 可在 `/setup` 后单独深度分析受众
|
|
350
|
+
|
|
351
|
+
## Changelog
|
|
352
|
+
|
|
353
|
+
- 2026-04-02: v1 — 合并 calibrate + style-calibration 为统一 /setup 流程。新增 Phase 0.5 三受众人设、Phase 1 动态场景生成、Phase 3 自然语言表达人格、Phase 4 即时选题交付。
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: spawn-batch-writer
|
|
3
|
+
description: |
|
|
4
|
+
Orchestrate batch content writing from saved topics. Activate when user asks to write multiple posts at once. Trigger: "都写了" / "批量写" / "写30篇" / "把选题都写成文案".
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Spawn Batch Writer
|
|
8
|
+
|
|
9
|
+
> Orchestrator for large writing orders. Iterates through saved topics and writes content for each.
|
|
10
|
+
|
|
11
|
+
## Inputs
|
|
12
|
+
|
|
13
|
+
| Parameter | Source | Required | Description |
|
|
14
|
+
|-----------|--------|----------|-------------|
|
|
15
|
+
| batch_count | User message (e.g. "写10篇") | No | Number of articles to write (default: all saved topics) |
|
|
16
|
+
| direction | User message | No | Theme / business direction filter |
|
|
17
|
+
| platform | User message | No | Target platform for all content |
|
|
18
|
+
|
|
19
|
+
## Steps
|
|
20
|
+
|
|
21
|
+
1. Extract `batch_count`, `direction`, and `platform` from user message.
|
|
22
|
+
- If no count → will write for all unwritten topics.
|
|
23
|
+
- If no platform → will infer per topic or ask user.
|
|
24
|
+
|
|
25
|
+
2. List existing topics using `autocrew_topic` action="list".
|
|
26
|
+
- Filter by direction if specified.
|
|
27
|
+
- Limit to `batch_count` if specified.
|
|
28
|
+
- Skip topics that already have linked content.
|
|
29
|
+
|
|
30
|
+
3. Notify user:
|
|
31
|
+
> 收到,我按 {count} 篇来写。会逐篇推进,每写完一篇会同步进度。
|
|
32
|
+
|
|
33
|
+
4. For each topic in the batch:
|
|
34
|
+
a. Follow the `write-script` skill workflow.
|
|
35
|
+
b. Save using `autocrew_content` tool with `topicId` linked.
|
|
36
|
+
c. Report progress:
|
|
37
|
+
> [{current}/{total}] 写完了「{title}」,已保存为草稿。
|
|
38
|
+
|
|
39
|
+
5. Final summary:
|
|
40
|
+
```
|
|
41
|
+
批量写作完成:
|
|
42
|
+
- 总计:{total} 篇
|
|
43
|
+
- 已保存:{saved} 篇草稿
|
|
44
|
+
- 平台分布:小红书 {xhs_count},抖音 {dy_count},...
|
|
45
|
+
|
|
46
|
+
下一步:用 autocrew_content action=list 查看所有草稿,确认后可以标记为待发布。
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
## Guidelines
|
|
50
|
+
|
|
51
|
+
- Write each piece as a complete, publishable draft — don't rush for quantity.
|
|
52
|
+
- Match tone and format to the target platform.
|
|
53
|
+
- If a topic is too vague to write, skip it and note in the summary.
|
|
54
|
+
- Maintain variety — don't let all posts sound the same.
|
|
55
|
+
|
|
56
|
+
## Error Handling
|
|
57
|
+
|
|
58
|
+
| Failure | Action |
|
|
59
|
+
|---------|--------|
|
|
60
|
+
| No topics saved | Tell user to run research/spawn-planner first. |
|
|
61
|
+
| Write fails for one topic | Log error, continue with next topic. Report in summary. |
|
|
62
|
+
| All writes fail | Stop and report the issue. |
|
|
63
|
+
|
|
64
|
+
## Changelog
|
|
65
|
+
|
|
66
|
+
- 2026-03-31: v1 — Adapted from Qingmo spawn-batch-writer.md. Removed backend batch job API. Executes sequentially inline.
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: spawn-planner
|
|
3
|
+
description: |
|
|
4
|
+
Orchestrate a batch topic research session. Activate when user asks to plan content for a period, create a content calendar, or generate multiple topics at once. Trigger: "帮我找选题" / "调研一下" / "内容规划" / "这周写什么".
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Spawn Planner
|
|
8
|
+
|
|
9
|
+
> Orchestrator skill. Coordinates a research session to generate multiple topics. In OpenClaw, spawns a sub-agent. In Claude Code, executes inline.
|
|
10
|
+
|
|
11
|
+
## Inputs
|
|
12
|
+
|
|
13
|
+
| Parameter | Source | Required | Description |
|
|
14
|
+
|-----------|--------|----------|-------------|
|
|
15
|
+
| topic_count | User message (e.g. "想3个选题") | No | Number of topics requested (default: 3) |
|
|
16
|
+
| direction | User message (e.g. "围绕 AI 方向") | No | Specific topic direction or theme |
|
|
17
|
+
| user_requirements | Any additional constraints from user | No | Extra instructions |
|
|
18
|
+
|
|
19
|
+
## Steps
|
|
20
|
+
|
|
21
|
+
1. Extract inputs from user message.
|
|
22
|
+
- IF user specifies a count (e.g. "想5个") THEN set `topic_count`.
|
|
23
|
+
- IF user specifies a direction THEN set `direction`.
|
|
24
|
+
- ELSE use defaults: `topic_count = 3`, `direction = auto`.
|
|
25
|
+
|
|
26
|
+
2. Notify user immediately:
|
|
27
|
+
> 好,我去调研一下,给你找 {topic_count} 个选题,稍等几分钟。
|
|
28
|
+
|
|
29
|
+
3. Execute the research workflow (load `research` skill logic):
|
|
30
|
+
|
|
31
|
+
a. Read `~/.autocrew/MEMORY.md` for brand context and competitor accounts.
|
|
32
|
+
b. Use `web_search` to gather trending data for the user's industry.
|
|
33
|
+
c. If competitor accounts are known, research their recent content.
|
|
34
|
+
d. Generate `topic_count` topic ideas following the research skill's quality gates.
|
|
35
|
+
|
|
36
|
+
4. Save each topic using `autocrew_topic` tool:
|
|
37
|
+
```json
|
|
38
|
+
{ "action": "create", "title": "...", "description": "...", "tags": [...], "source": "..." }
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
5. Report results to user:
|
|
42
|
+
```
|
|
43
|
+
调研完成,共找到 {count} 个选题:
|
|
44
|
+
|
|
45
|
+
1. {title_1}
|
|
46
|
+
{description_1}
|
|
47
|
+
|
|
48
|
+
2. {title_2}
|
|
49
|
+
{description_2}
|
|
50
|
+
|
|
51
|
+
...
|
|
52
|
+
|
|
53
|
+
要选一个开始写吗?或者我继续调研其他方向。
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
## Guidelines
|
|
57
|
+
|
|
58
|
+
- Aim for a mix: competitor-inspired + trending + evergreen + seasonal
|
|
59
|
+
- Tag topics with priority (high/medium/low) in the tags array
|
|
60
|
+
- Include platform recommendations in each topic description
|
|
61
|
+
- Don't over-plan — match the user's stated capacity
|
|
62
|
+
|
|
63
|
+
## Error Handling
|
|
64
|
+
|
|
65
|
+
| Failure | Action |
|
|
66
|
+
|---------|--------|
|
|
67
|
+
| Web search fails | Use general knowledge. Note in description that no live data was available. |
|
|
68
|
+
| Topic save fails | Log error, continue with remaining topics. Report partial results. |
|
|
69
|
+
|
|
70
|
+
## Changelog
|
|
71
|
+
|
|
72
|
+
- 2026-03-31: v1 — Adapted from Qingmo spawn-planner.md. Removed sessions_spawn dependency. Executes research inline instead of spawning sub-agent.
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: spawn-writer
|
|
3
|
+
description: |
|
|
4
|
+
Orchestrate a single content writing task. Activate when user asks to write one specific piece of content, or picks a topic to write about. Trigger: "写这个" / "帮我写" / "写成文案" / "写一篇".
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Spawn Writer
|
|
8
|
+
|
|
9
|
+
> Orchestrator skill. Determines writing parameters, then executes the write-script workflow.
|
|
10
|
+
|
|
11
|
+
## Inputs
|
|
12
|
+
|
|
13
|
+
| Parameter | Source | Required | Description |
|
|
14
|
+
|-----------|--------|----------|-------------|
|
|
15
|
+
| topic_title | Topic title from context or user message | Yes | Title for the content |
|
|
16
|
+
| topic_description | Topic description from context | No | Additional topic context |
|
|
17
|
+
| topic_id | Topic ID if writing from a saved topic | No | Links content to a topic |
|
|
18
|
+
| platform | User-specified or inferred from context | No | Target platform |
|
|
19
|
+
|
|
20
|
+
## Steps
|
|
21
|
+
|
|
22
|
+
1. Determine writing parameters.
|
|
23
|
+
- IF user references a saved topic → extract topic_id, title, description
|
|
24
|
+
- IF user gives a new topic directly → use that as title/description
|
|
25
|
+
- IF platform not specified → check `~/.autocrew/MEMORY.md` for default platform, or ask user
|
|
26
|
+
|
|
27
|
+
2. **Title generation.** Generate 3-5 title variants using different types from `skills/title-craft/SKILL.md`. Present all variants with type labels for user to choose. Respect platform character limits.
|
|
28
|
+
|
|
29
|
+
3. **Guardrail for scope.**
|
|
30
|
+
Do NOT use this skill for light edits: 改标题, 缩短, 精简, 润色, 生成摘要, 标签建议.
|
|
31
|
+
Those should be handled directly in conversation.
|
|
32
|
+
|
|
33
|
+
3. **Intent confirmation** (for standalone requests without a saved topic):
|
|
34
|
+
Briefly confirm with user:
|
|
35
|
+
> 我来写一篇关于「{topic_title}」的{platform}文案,大概 800-1200 字,{tone}风格。开始?
|
|
36
|
+
|
|
37
|
+
IF user confirms → proceed.
|
|
38
|
+
IF user adjusts → update parameters.
|
|
39
|
+
|
|
40
|
+
4. Execute the write-script workflow:
|
|
41
|
+
- Follow all steps in the `write-script` skill
|
|
42
|
+
- Save the result using `autocrew_content` tool
|
|
43
|
+
- Link to topic_id if available
|
|
44
|
+
|
|
45
|
+
5. Present the draft to user and offer next steps:
|
|
46
|
+
> 草稿写好了,已保存。你可以:
|
|
47
|
+
> 1. 直接用 — 我帮你标记为待发布
|
|
48
|
+
> 2. 改一改 — 告诉我哪里要调整
|
|
49
|
+
> 3. 重写 — 换个角度再来一版
|
|
50
|
+
|
|
51
|
+
## Error Handling
|
|
52
|
+
|
|
53
|
+
| Failure | Action |
|
|
54
|
+
|---------|--------|
|
|
55
|
+
| No topic provided | Ask user what to write about. |
|
|
56
|
+
| Save fails | Show content in chat for user to copy. |
|
|
57
|
+
|
|
58
|
+
## Changelog
|
|
59
|
+
|
|
60
|
+
- 2026-03-31: v1 — Adapted from Qingmo spawn-writer.md. Removed sessions_spawn and backend API dependency. Executes write-script inline.
|