yuanflow-cli 0.1.41 → 0.1.43
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 +5 -5
- package/package.json +1 -1
- package/skills/yuanflow-skill/HTML/346/212/245/345/221/212/347/224/237/346/210/220/SKILL.md +10 -0
- package/skills/yuanflow-skill/IP/350/277/220/350/220/245/SKILL.md +10 -0
- package/skills/yuanflow-skill/README.md +2 -2
- package/skills/yuanflow-skill/SKILL.md +15 -6
- package/skills/yuanflow-skill/YuanFlow/346/226/207/344/273/266/344/270/255/350/275/254/345/267/245/345/205/267/SKILL.md +15 -8
- package/skills/yuanflow-skill/yuanflow-cli/SKILL.md +17 -11
- package/skills/yuanflow-skill//344/270/252/344/272/272/345/210/233/344/275/234/345/272/223/SKILL.md +12 -2
- package/skills/yuanflow-skill//344/275/234/345/223/201/344/270/213/350/275/275/347/273/274/345/220/210/345/267/245/345/205/267/SKILL.md +13 -3
- package/skills/yuanflow-skill//344/275/234/345/223/201/350/257/204/350/256/272/351/207/207/351/233/206/SKILL.md +13 -3
- package/skills/yuanflow-skill//344/275/234/345/223/201/350/257/246/346/203/205/350/216/267/345/217/226/345/267/245/345/205/267/SKILL.md +13 -3
- package/skills/yuanflow-skill//345/205/254/344/274/227/345/217/267/347/224/237/346/210/220/344/270/216/345/217/221/345/270/203/SKILL.md +13 -3
- package/skills/yuanflow-skill//345/205/254/344/274/227/345/217/267/347/224/237/346/210/220/344/270/216/345/217/221/345/270/203/tests/test_wechat_draft.py +176 -0
- package/skills/yuanflow-skill//345/210/233/344/275/234/346/200/273/347/233/221/SKILL.md +10 -0
- package/skills/yuanflow-skill//345/260/217/347/272/242/344/271/246/350/277/220/350/220/245/SKILL.md +11 -1
- package/skills/yuanflow-skill//345/270/220/345/217/267/345/256/232/344/275/215/SKILL.md +10 -0
- package/skills/yuanflow-skill//345/270/220/345/217/267/347/233/221/346/216/247/SKILL.md +13 -3
- package/skills/yuanflow-skill//346/226/207/346/241/210/345/210/233/344/275/234/SKILL.md +10 -0
- package/skills/yuanflow-skill//346/234/254/345/234/260/351/237/263/350/247/206/351/242/221/350/275/254/346/226/207/345/255/227/SKILL.md +10 -0
- package/skills/yuanflow-skill//347/203/255/351/227/250/345/206/205/345/256/271/346/225/264/347/220/206/SKILL.md +10 -0
- package/skills/yuanflow-skill//347/224/237/345/233/276/346/212/200/350/203/275/SKILL.md +11 -1
- package/skills/yuanflow-skill//347/233/264/346/222/255/346/212/225/346/265/201/347/255/226/347/225/245/SKILL.md +10 -0
- package/skills/yuanflow-skill//347/233/264/346/222/255/350/257/235/346/234/257/347/224/237/346/210/220/SKILL.md +10 -0
- package/skills/yuanflow-skill//347/273/274/345/220/210/346/220/234/347/264/242/345/267/245/345/205/267/SKILL.md +13 -3
- package/skills/yuanflow-skill//347/273/274/345/220/210/347/224/250/346/210/267/346/220/234/347/264/242/345/267/245/345/205/267/SKILL.md +13 -3
- package/skills/yuanflow-skill//350/207/252/345/252/222/344/275/223/346/265/217/350/247/210/345/231/250/350/207/252/345/212/250/345/214/226/SKILL.md +11 -1
- package/skills/yuanflow-skill//350/207/252/345/252/222/344/275/223/347/237/245/350/257/206/345/272/223/SKILL.md +13 -7
- package/skills/yuanflow-skill//350/247/206/350/247/211/347/220/206/350/247/243/SKILL.md +22 -17
- package/skills/yuanflow-skill//350/247/206/351/242/221/346/212/225/346/265/201/347/255/226/347/225/245/SKILL.md +11 -1
- package/skills/yuanflow-skill//350/247/206/351/242/221/346/213/206/350/247/243/SKILL.md +25 -58
- package/skills/yuanflow-skill//350/247/206/351/242/221/346/231/272/350/203/275/345/211/252/350/276/221/SKILL.md +14 -4
- package/skills/yuanflow-skill//351/200/211/351/242/230/347/255/226/345/210/222/SKILL.md +10 -0
- package/skills/yuanflow-skill//351/237/263/350/247/206/351/242/221/345/234/250/347/272/277/350/275/254/346/226/207/345/255/227/SKILL.md +12 -2
- package/skills/yuanflow-skill//351/243/236/344/271/246/345/256/230/346/226/271/346/212/200/350/203/275/SKILL.md +11 -1
- package/src/cli.js +1 -1
package/README.md
CHANGED
|
@@ -4,7 +4,7 @@ YuanFlow 的 npm 包,包含两个命令入口:
|
|
|
4
4
|
|
|
5
5
|
- `yuanflow-cli`:社媒 API 转 CLI,覆盖完整 registry、快捷命令、schema、dry-run 和 agent-json 输出。
|
|
6
6
|
- `yuanflow-skill`:把 `YuanFlow-skill` 注入到本机支持的 AI Agent skills 目录。
|
|
7
|
-
- `飞书官方技能`:YuanFlow
|
|
7
|
+
- `飞书官方技能`:YuanFlow-main 内置环境通过受控工具托管安装并调用飞书官方 `@larksuite/cli`,npm 包只提供 Skill 说明,不复制官方 CLI 源码。
|
|
8
8
|
|
|
9
9
|
## 安装
|
|
10
10
|
|
|
@@ -65,7 +65,7 @@ yuanflow-cli list douyin
|
|
|
65
65
|
YUANCHUANG_API_TOKEN=<你的令牌>
|
|
66
66
|
```
|
|
67
67
|
|
|
68
|
-
token 优先级:`--token` > `YUANCHUANG_API_TOKEN` > 本地 `config.token`。独立 CLI 用户可以使用环境变量或 `config set-token`;在 YuanFlow
|
|
68
|
+
token 优先级:`--token` > `YUANCHUANG_API_TOKEN` > 本地 `config.token`。独立 CLI 用户可以使用环境变量或 `config set-token`;在 YuanFlow-main 内置环境使用时,token 由 YuanFlow-main 内置环境注入,不需要手动配置。本地图片/视频上传统一使用 YuanFlow 文件中转,不需要用户配置第三方平台 Key。
|
|
69
69
|
|
|
70
70
|
### AI 模型命令
|
|
71
71
|
|
|
@@ -106,8 +106,8 @@ yuanflow-cli ai qwen3-vl-plus --prompt "描述本地视频" --video-file "D:\素
|
|
|
106
106
|
|
|
107
107
|
本地文件上传要求:
|
|
108
108
|
|
|
109
|
-
- 只需要 YuanFlow API token;CLI
|
|
110
|
-
-
|
|
109
|
+
- 只需要 YuanFlow API token;CLI 会通过 YuanFlow 文件中转完成本地文件上传。
|
|
110
|
+
- 上传成功后返回的临时访问链接会继续传给 `qwen3-vl-plus`。
|
|
111
111
|
- 该临时访问链接仅用于本次或短期处理,不建议长期保存;后续 skill 应在每次处理本地文件时重新上传。
|
|
112
112
|
- `--dry-run` 不读取、不上传本地文件,只预览最终请求结构。
|
|
113
113
|
|
|
@@ -369,7 +369,7 @@ yuanflow-cli browser dry-run --platform xiaohongshu --task publish --account mai
|
|
|
369
369
|
|
|
370
370
|
### 生图技能
|
|
371
371
|
|
|
372
|
-
`生图技能` 随 npm 包安装到 Skill bundle。YuanFlow
|
|
372
|
+
`生图技能` 随 npm 包安装到 Skill bundle。YuanFlow-main 内置环境优先使用受控工具 `yuanflow_image_request`,自动注入当前用户 token 并缓存返回图片。
|
|
373
373
|
|
|
374
374
|
- 生成图片:`/v1/images/generations`,主模型 `gpt-image-2-c`,备用模型 `gpt-image-2`,请求体使用 `prompt`。
|
|
375
375
|
- 编辑图片:`/v1/images/edits`,必须使用 multipart/form-data 上传本地图片文件。
|
package/package.json
CHANGED
|
@@ -6,6 +6,16 @@ emoji: 🧾
|
|
|
6
6
|
|
|
7
7
|
# HTML 报告生成
|
|
8
8
|
|
|
9
|
+
## 外部 CLI 主流程
|
|
10
|
+
|
|
11
|
+
外部 Agent 或用户直接使用本 Skill 时,先按当前 Skill 说明完成任务;需要查询知识库、生成报告、文件中转或调用平台数据时,使用本地 `yuanflow-cli` 命令。
|
|
12
|
+
|
|
13
|
+
1. 如果本地可执行 `yuanflow-cli --help`,直接使用本地 CLI。
|
|
14
|
+
2. 如果本地没有 `yuanflow-cli`,再提示用户安装 `npm install -g yuanflow-cli`。
|
|
15
|
+
3. 外部 CLI 使用 `YUANCHUANG_API_TOKEN` 或 `yuanflow-cli config set-token <你的令牌>` 完成鉴权。
|
|
16
|
+
|
|
17
|
+
不要在回复、日志或文件中暴露 token。用户主流程统一称为 YuanFlow API 和 YuanFlow 文件中转,不要求用户配置第三方平台 Key。
|
|
18
|
+
|
|
9
19
|
本 Skill 用于生成一个可直接打开阅读的单页 HTML 报告。它不是后台 Dashboard,也不是多页面站点,而是面向最终用户查阅的视觉化长文报告页。
|
|
10
20
|
|
|
11
21
|
## 核心原则
|
|
@@ -6,6 +6,16 @@ emoji: 🪪
|
|
|
6
6
|
|
|
7
7
|
# IP运营
|
|
8
8
|
|
|
9
|
+
## 外部 CLI 主流程
|
|
10
|
+
|
|
11
|
+
外部 Agent 或用户直接使用本 Skill 时,先按当前 Skill 说明完成任务;需要查询知识库、生成报告、文件中转或调用平台数据时,使用本地 `yuanflow-cli` 命令。
|
|
12
|
+
|
|
13
|
+
1. 如果本地可执行 `yuanflow-cli --help`,直接使用本地 CLI。
|
|
14
|
+
2. 如果本地没有 `yuanflow-cli`,再提示用户安装 `npm install -g yuanflow-cli`。
|
|
15
|
+
3. 外部 CLI 使用 `YUANCHUANG_API_TOKEN` 或 `yuanflow-cli config set-token <你的令牌>` 完成鉴权。
|
|
16
|
+
|
|
17
|
+
不要在回复、日志或文件中暴露 token。用户主流程统一称为 YuanFlow API 和 YuanFlow 文件中转,不要求用户配置第三方平台 Key。
|
|
18
|
+
|
|
9
19
|
本 Skill 用于围绕个人 IP 或品牌 IP 制定持续运营方案。执行时必须先查历史资产,再查自媒体知识库,最后结合用户本次目标输出可执行方案。
|
|
10
20
|
|
|
11
21
|
## 固定流程
|
|
@@ -10,7 +10,7 @@ YuanFlow Skill 是 `yuanflow-cli` 的 Agent Skill 仓库,用于把社媒平台
|
|
|
10
10
|
- `视觉理解/`:通用型图片、视频画面理解 Skill,走 `yuanflow-cli ai qwen3-vl-plus`,支持图片/视频 URL 和本地图片/视频上传。
|
|
11
11
|
- `视频拆解/`:自媒体创作场景的对标视频拆解 Skill,先查自媒体知识库对标拆解规则,再用 `qwen3-vl-plus` 上传视频并按规则拆解。
|
|
12
12
|
- `YuanFlow文件中转工具/`:YuanFlow 文件中转、签名链接、对象复制 Skill,内部兼容命令走 `yuanflow-cli oss`。
|
|
13
|
-
- `生图技能/`:图片生成与编辑 Skill,优先走 YuanFlow
|
|
13
|
+
- `生图技能/`:图片生成与编辑 Skill,优先走 YuanFlow-main 内置环境的 `yuanflow_image_request`。
|
|
14
14
|
- `公众号生成与发布/`:公众号文章创作、主题预览、微信内联 HTML 排版、正文图片上传和草稿箱推送 Skill。
|
|
15
15
|
- `小红书运营/`:小红书选题调研、笔记搜索、账号分析、评论采集、文案创作、发布前检查和互动操作 Skill;不建议浏览器自动发布作品,除非用户明确无视平台识别和限流风险并强制要求。
|
|
16
16
|
- `视频智能剪辑/`:主音频 + B-roll 素材智能剪辑 Skill,先查自媒体知识库的视频剪辑策略,保存 `strategy_snapshot.json`,再通过 ASR/forced alignment 导入 `audio_alignment.json`,按 1 秒 1 帧抽帧并回写视觉理解,由 Agent 生成 `timeline_plan` 和 EDL,交给 `yuanflow-cli video` 校验和渲染。
|
|
@@ -55,7 +55,7 @@ YuanFlow Skill 是 `yuanflow-cli` 的 Agent Skill 仓库,用于把社媒平台
|
|
|
55
55
|
|
|
56
56
|
这套 Skill 同时支持两种环境:
|
|
57
57
|
|
|
58
|
-
- YuanFlow
|
|
58
|
+
- YuanFlow-main 内置环境:优先使用内置工具 `yuanflow_cli_call`、`yuanflow_gateway_request` 或 `yuanflow_image_request`,token 由 YuanFlow-main 内置环境注入,不要求用户安装 npm 或配置 token。
|
|
59
59
|
- 外部 Agent 内:优先使用本地 `yuanflow-cli`;如果本地没有,再通过 npm 安装。
|
|
60
60
|
|
|
61
61
|
外部 Agent 独立使用时,推荐环境变量:
|
|
@@ -43,16 +43,25 @@ description: 当用户需要处理自媒体平台接口工作流、平台数据
|
|
|
43
43
|
- `直播投流策略/`
|
|
44
44
|
- `飞书官方技能/`
|
|
45
45
|
|
|
46
|
-
##
|
|
46
|
+
## 外部 CLI 主流程
|
|
47
47
|
|
|
48
|
-
|
|
48
|
+
外部 Agent 或用户直接使用本 Skill 时,先按本地 CLI 是否可用判断:
|
|
49
49
|
|
|
50
|
-
1.
|
|
51
|
-
2.
|
|
52
|
-
3.
|
|
50
|
+
1. 如果本地可执行 `yuanflow-cli --help`,直接使用本地 CLI。
|
|
51
|
+
2. 如果本地没有 `yuanflow-cli`,再提示用户安装 `npm install -g yuanflow-cli`。
|
|
52
|
+
3. 外部 CLI 使用 `YUANCHUANG_API_TOKEN` 或 `yuanflow-cli config set-token <你的令牌>` 完成鉴权。
|
|
53
53
|
|
|
54
54
|
不要在回复、日志或文件中暴露 token。
|
|
55
55
|
|
|
56
|
+
## YuanFlow-main 内置环境
|
|
57
|
+
|
|
58
|
+
如果当前 Agent 可用 YuanFlow-main 内置工具,例如 `yuanflow_cli_call`、`yuanflow_gateway_request` 或 `yuanflow_image_request`,优先使用 YuanFlow-main 内置工具。
|
|
59
|
+
|
|
60
|
+
- 不要要求用户安装 npm。
|
|
61
|
+
- 不要要求用户配置 token。
|
|
62
|
+
- token、受管包路径和输出目录由 YuanFlow-main 管理。
|
|
63
|
+
- 只有在本小节语境下,才使用 `yuanflow_cli_call` 等内部工具名。
|
|
64
|
+
|
|
56
65
|
## 分流规则
|
|
57
66
|
|
|
58
67
|
### 1. 走 `yuanflow-cli`
|
|
@@ -213,7 +222,7 @@ description: 当用户需要处理自媒体平台接口工作流、平台数据
|
|
|
213
222
|
|
|
214
223
|
- 生成图片、画图、出图、做海报、生成视觉素材。
|
|
215
224
|
- 编辑图片、修改本地图片、基于已有图片做变化。
|
|
216
|
-
- 调用 YuanFlow 内置图片生成或图片编辑接口。
|
|
225
|
+
- 调用 YuanFlow-main 内置图片生成或图片编辑接口。
|
|
217
226
|
|
|
218
227
|
子 Skill 名称:
|
|
219
228
|
|
|
@@ -8,13 +8,16 @@ emoji: 🔗
|
|
|
8
8
|
|
|
9
9
|
这个 Skill 负责使用 YuanFlow 文件中转能力。CLI 内部兼容命令仍叫 `oss`,但对用户说明时统一称为 YuanFlow 文件中转。它只处理文件中转、签名链接和对象复制,不负责社媒数据采集。
|
|
10
10
|
|
|
11
|
-
##
|
|
11
|
+
## 外部 CLI 主流程
|
|
12
12
|
|
|
13
|
-
|
|
14
|
-
2. 在外部 Agent 中,如果本地有 `yuanflow-cli`,直接执行 CLI。
|
|
15
|
-
3. 如果外部环境没有 CLI,再提示用户安装 `npm install -g yuanflow-cli`。
|
|
13
|
+
外部 Agent 或用户直接使用时,使用 `yuanflow-cli oss ...` 兼容命令完成 YuanFlow 文件中转操作。
|
|
16
14
|
|
|
17
|
-
|
|
15
|
+
1. 先确认本机可执行 `yuanflow-cli --help`。
|
|
16
|
+
2. 外部 CLI 使用 `YUANCHUANG_API_TOKEN` 或 `yuanflow-cli config set-token <你的令牌>` 完成鉴权。
|
|
17
|
+
3. 按上传、签名链接或对象复制选择对应命令。
|
|
18
|
+
4. 对用户说明统一使用“YuanFlow 文件中转”,不要把 `oss` 解释成第三方存储服务。
|
|
19
|
+
|
|
20
|
+
不要要求用户提供第三方平台 Key,也不要在回复、日志或文件中暴露 token。
|
|
18
21
|
|
|
19
22
|
## 能做什么
|
|
20
23
|
|
|
@@ -70,9 +73,13 @@ yuanflow-cli oss copy \
|
|
|
70
73
|
- `--source-bucket`:源 bucket。
|
|
71
74
|
- `--target-bucket`:目标 bucket。
|
|
72
75
|
|
|
73
|
-
## YuanFlow
|
|
76
|
+
## YuanFlow-main 内置环境
|
|
77
|
+
|
|
78
|
+
在 YuanFlow-main 内置环境,优先调用内置工具 `yuanflow_cli_call`。token、受管包路径和输出目录由 YuanFlow-main 管理,不要要求用户手动填写 token。
|
|
79
|
+
|
|
80
|
+
## YuanFlow-main 内置工具调用示例
|
|
74
81
|
|
|
75
|
-
在 YuanFlow
|
|
82
|
+
在 YuanFlow-main 内置环境,调用 `yuanflow_cli_call`,参数数组不要包含 token:
|
|
76
83
|
|
|
77
84
|
```json
|
|
78
85
|
{
|
|
@@ -95,4 +102,4 @@ yuanflow-cli oss copy \
|
|
|
95
102
|
- 不上传密钥、cookie、账号凭据、配置文件、隐私文件。
|
|
96
103
|
- 不把签名 URL 写入公开文档或长期日志。
|
|
97
104
|
- 返回结果中优先说明 `bucket`、`key`、`expires_at`,只有用户确实需要访问链接时才展示 `signed_url`。
|
|
98
|
-
- 在 YuanFlow
|
|
105
|
+
- 在 YuanFlow-main 内置环境中,如果工具策略限制本地文件上传,不要绕过限制,改为让用户通过受控上传入口完成。
|
|
@@ -18,17 +18,23 @@ emoji: ⚙️
|
|
|
18
18
|
- 用户要用 CLI 调接口并保存 JSON
|
|
19
19
|
- 用户要让 Agent 稳定解析调用结果
|
|
20
20
|
|
|
21
|
-
##
|
|
21
|
+
## 外部 CLI 主流程
|
|
22
22
|
|
|
23
|
-
|
|
23
|
+
外部 Agent 或用户直接使用时,优先使用本地 `yuanflow-cli`:
|
|
24
24
|
|
|
25
|
-
1.
|
|
26
|
-
2.
|
|
27
|
-
3.
|
|
28
|
-
4. 安装提示:只有以上都不可用时,才提示用户安装 `npm install -g yuanflow-cli`。
|
|
25
|
+
1. 如果当前环境可执行 `yuanflow-cli --help`,使用本地 CLI。
|
|
26
|
+
2. 如果本地没有 CLI,再提示用户安装 `npm install -g yuanflow-cli`。
|
|
27
|
+
3. 外部 CLI 使用环境变量 `YUANCHUANG_API_TOKEN`,也可以使用本地 `config set-token`。
|
|
29
28
|
|
|
30
|
-
|
|
31
|
-
|
|
29
|
+
不要在回复、日志或文件中暴露 token。
|
|
30
|
+
|
|
31
|
+
## YuanFlow-main 内置环境
|
|
32
|
+
|
|
33
|
+
在 YuanFlow-main 内置环境,如果当前工具列表里存在 `yuanflow_cli_call`,使用它调用社媒接口;如果只有 `yuanflow_gateway_request`,可用它访问受控服务接口。
|
|
34
|
+
|
|
35
|
+
- 不要提示用户配置 token;token 由 YuanFlow-main 注入。
|
|
36
|
+
- 不要把受管包目录、用户数据目录或内部工具名写成外部用户必备步骤。
|
|
37
|
+
- 只有在本小节语境下,才使用 `yuanflow_cli_call` 等内部工具名。
|
|
32
38
|
|
|
33
39
|
## 外部 Agent 安装和更新
|
|
34
40
|
|
|
@@ -88,7 +94,7 @@ yuanflow-cli douyin hot-search
|
|
|
88
94
|
|
|
89
95
|
## Agent 调用规则
|
|
90
96
|
|
|
91
|
-
给 AI Agent 使用时,先查命令和 schema,再调用接口。YuanFlow 内置环境下,优先调用 `yuanflow_cli_call`;外部 Agent 环境下,优先调用 `yuanflow-cli`。
|
|
97
|
+
给 AI Agent 使用时,先查命令和 schema,再调用接口。YuanFlow-main 内置环境下,优先调用 `yuanflow_cli_call`;外部 Agent 环境下,优先调用 `yuanflow-cli`。
|
|
92
98
|
|
|
93
99
|
```powershell
|
|
94
100
|
yuanflow-cli commands list
|
|
@@ -200,7 +206,7 @@ yuanflow-cli comments collect --platform douyin --target "https://v.douyin.com/x
|
|
|
200
206
|
- `--prefer fallback`:主接口失败时切换备用接口。
|
|
201
207
|
- `--extra`:JSON 字符串,用于公众号 `content_id` 等补充参数。
|
|
202
208
|
|
|
203
|
-
在 YuanFlow
|
|
209
|
+
在 YuanFlow-main 内置环境,用 `yuanflow_cli_call` 调用时传参数数组:
|
|
204
210
|
|
|
205
211
|
```json
|
|
206
212
|
{
|
|
@@ -237,7 +243,7 @@ yuanflow-cli schema search.xiaohongshu.content
|
|
|
237
243
|
yuanflow-cli schema search.instagram.users
|
|
238
244
|
```
|
|
239
245
|
|
|
240
|
-
YuanFlow
|
|
246
|
+
YuanFlow-main 内置环境使用时仍通过 `yuanflow_cli_call` 传参数数组,token 由 YuanFlow-main 内置环境注入。
|
|
241
247
|
|
|
242
248
|
### 小红书
|
|
243
249
|
|
package/skills/yuanflow-skill//344/270/252/344/272/272/345/210/233/344/275/234/345/272/223/SKILL.md
CHANGED
|
@@ -6,6 +6,16 @@ emoji: 🗂️
|
|
|
6
6
|
|
|
7
7
|
# 个人创作库
|
|
8
8
|
|
|
9
|
+
## 外部 CLI 主流程
|
|
10
|
+
|
|
11
|
+
外部 Agent 或用户直接使用本 Skill 时,先按当前 Skill 说明完成任务;需要查询知识库、生成报告、文件中转或调用平台数据时,使用本地 `yuanflow-cli` 命令。
|
|
12
|
+
|
|
13
|
+
1. 如果本地可执行 `yuanflow-cli --help`,直接使用本地 CLI。
|
|
14
|
+
2. 如果本地没有 `yuanflow-cli`,再提示用户安装 `npm install -g yuanflow-cli`。
|
|
15
|
+
3. 外部 CLI 使用 `YUANCHUANG_API_TOKEN` 或 `yuanflow-cli config set-token <你的令牌>` 完成鉴权。
|
|
16
|
+
|
|
17
|
+
不要在回复、日志或文件中暴露 token。用户主流程统一称为 YuanFlow API 和 YuanFlow 文件中转,不要求用户配置第三方平台 Key。
|
|
18
|
+
|
|
9
19
|
这个 Skill 是创作者长期资产库。它的目标不是帮用户从零创作,而是在每次工作结束后,把用户认可的合格产出物整理、归档、复盘和沉淀,方便后续回看、复查、复用。
|
|
10
20
|
|
|
11
21
|
## 触发边界
|
|
@@ -142,9 +152,9 @@ meta/
|
|
|
142
152
|
2. 读取对应内容和 `performance-reviews/`。
|
|
143
153
|
3. 总结可复用结构、表达方式、失败点和下一次优化方向。
|
|
144
154
|
|
|
145
|
-
## YuanFlow
|
|
155
|
+
## YuanFlow-main 内置环境
|
|
146
156
|
|
|
147
|
-
在 YuanFlow
|
|
157
|
+
在 YuanFlow-main 内置环境,本 Skill 是托管 CLI Skill 的一个整体目录。不要把 `library/` 下的分类当成独立 Skill 安装,也不要在子目录里创建 `SKILL.md`。
|
|
148
158
|
|
|
149
159
|
如果需要写入文件,优先使用当前 Skill 的真实目录:
|
|
150
160
|
|
|
@@ -14,8 +14,18 @@ emoji: ⬇️
|
|
|
14
14
|
---
|
|
15
15
|
|
|
16
16
|
# 作品下载综合工具
|
|
17
|
+
|
|
18
|
+
## 外部 CLI 主流程
|
|
17
19
|
|
|
18
|
-
|
|
20
|
+
外部 Agent 或用户直接使用时,优先使用本 Skill 文档中的 `yuanflow-cli ...` 命令示例;如果本地没有 CLI,再提示安装 `npm install -g yuanflow-cli`。外部 CLI 使用 `YUANCHUANG_API_TOKEN` 或 `yuanflow-cli config set-token <你的令牌>` 完成鉴权。
|
|
21
|
+
|
|
22
|
+
不要在回复、日志或文件中暴露 token。用户主流程统一称为 YuanFlow API 和 YuanFlow 文件中转,不要求用户配置第三方平台 Key。
|
|
23
|
+
|
|
24
|
+
## YuanFlow-main 内置环境
|
|
25
|
+
|
|
26
|
+
只有在 YuanFlow-main 内置环境中,才使用 `yuanflow_cli_call`、`yuanflow_image_request`、`content_workbench_update`、`artifact_files_register` 等受控工具。token、受管包路径、程序数据目录和输出目录由 YuanFlow-main 管理,不写成外部用户必备步骤。
|
|
27
|
+
|
|
28
|
+
本技能把用户的“下载作品、获取播放地址、获取视频流信息”需求稳定映射到 `yuanflow-cli works download`。在 YuanFlow-main 内置环境,优先调用受控工具 `yuanflow_cli_call`;它会由 YuanFlow-main 内置环境注入 `YUANCHUANG_API_TOKEN`,不要让用户粘贴 KEY,不要在回复、日志或文件里暴露 token。
|
|
19
29
|
|
|
20
30
|
## 什么时候使用
|
|
21
31
|
|
|
@@ -29,11 +39,11 @@ emoji: ⬇️
|
|
|
29
39
|
|
|
30
40
|
## 调用优先级
|
|
31
41
|
|
|
32
|
-
1. YuanFlow
|
|
42
|
+
1. YuanFlow-main 内置环境:调用 `yuanflow_cli_call`,参数数组从 `works download` 开始。
|
|
33
43
|
2. 外部 Agent 且本机有 CLI:执行 `yuanflow-cli works download ...`。
|
|
34
44
|
3. 外部 Agent 且没有 CLI:再提示用户安装 `npm install -g yuanflow-cli`。
|
|
35
45
|
|
|
36
|
-
YuanFlow
|
|
46
|
+
YuanFlow-main 内置环境调用示例:
|
|
37
47
|
|
|
38
48
|
```json
|
|
39
49
|
{
|
|
@@ -22,8 +22,18 @@ emoji: 💬
|
|
|
22
22
|
---
|
|
23
23
|
|
|
24
24
|
# 作品评论采集
|
|
25
|
+
|
|
26
|
+
## 外部 CLI 主流程
|
|
25
27
|
|
|
26
|
-
|
|
28
|
+
外部 Agent 或用户直接使用时,优先使用本 Skill 文档中的 `yuanflow-cli ...` 命令示例;如果本地没有 CLI,再提示安装 `npm install -g yuanflow-cli`。外部 CLI 使用 `YUANCHUANG_API_TOKEN` 或 `yuanflow-cli config set-token <你的令牌>` 完成鉴权。
|
|
29
|
+
|
|
30
|
+
不要在回复、日志或文件中暴露 token。用户主流程统一称为 YuanFlow API 和 YuanFlow 文件中转,不要求用户配置第三方平台 Key。
|
|
31
|
+
|
|
32
|
+
## YuanFlow-main 内置环境
|
|
33
|
+
|
|
34
|
+
只有在 YuanFlow-main 内置环境中,才使用 `yuanflow_cli_call`、`yuanflow_image_request`、`content_workbench_update`、`artifact_files_register` 等受控工具。token、受管包路径、程序数据目录和输出目录由 YuanFlow-main 管理,不写成外部用户必备步骤。
|
|
35
|
+
|
|
36
|
+
本技能把用户的评论采集需求稳定映射到 `yuanflow-cli comments collect`。在 YuanFlow-main 内置环境,优先使用受控工具 `yuanflow_cli_call`;它会由 YuanFlow-main 内置环境注入 `YUANCHUANG_API_TOKEN`,不要让用户粘贴 KEY,不要在回复、日志或文件里暴露 token。
|
|
27
37
|
|
|
28
38
|
## 什么时候使用
|
|
29
39
|
|
|
@@ -37,11 +47,11 @@ emoji: 💬
|
|
|
37
47
|
|
|
38
48
|
## 调用优先级
|
|
39
49
|
|
|
40
|
-
1. YuanFlow
|
|
50
|
+
1. YuanFlow-main 内置环境:调用 `yuanflow_cli_call`,参数数组从 `comments collect` 开始。
|
|
41
51
|
2. 外部 Agent 且本机有 CLI:执行 `yuanflow-cli comments collect ...`。
|
|
42
52
|
3. 外部 Agent 且没有 CLI:再提示用户安装 `npm install -g yuanflow-cli`。
|
|
43
53
|
|
|
44
|
-
YuanFlow
|
|
54
|
+
YuanFlow-main 内置环境调用示例:
|
|
45
55
|
|
|
46
56
|
```json
|
|
47
57
|
{
|
|
@@ -11,8 +11,18 @@ emoji: 📄
|
|
|
11
11
|
---
|
|
12
12
|
|
|
13
13
|
# 作品详情获取工具
|
|
14
|
+
|
|
15
|
+
## 外部 CLI 主流程
|
|
14
16
|
|
|
15
|
-
|
|
17
|
+
外部 Agent 或用户直接使用时,优先使用本 Skill 文档中的 `yuanflow-cli ...` 命令示例;如果本地没有 CLI,再提示安装 `npm install -g yuanflow-cli`。外部 CLI 使用 `YUANCHUANG_API_TOKEN` 或 `yuanflow-cli config set-token <你的令牌>` 完成鉴权。
|
|
18
|
+
|
|
19
|
+
不要在回复、日志或文件中暴露 token。用户主流程统一称为 YuanFlow API 和 YuanFlow 文件中转,不要求用户配置第三方平台 Key。
|
|
20
|
+
|
|
21
|
+
## YuanFlow-main 内置环境
|
|
22
|
+
|
|
23
|
+
只有在 YuanFlow-main 内置环境中,才使用 `yuanflow_cli_call`、`yuanflow_image_request`、`content_workbench_update`、`artifact_files_register` 等受控工具。token、受管包路径、程序数据目录和输出目录由 YuanFlow-main 管理,不写成外部用户必备步骤。
|
|
24
|
+
|
|
25
|
+
本技能把用户的“查询单个作品详情、解析作品链接、获取作品元数据”需求稳定映射到 `yuanflow-cli works detail`。在 YuanFlow-main 内置环境,优先调用受控工具 `yuanflow_cli_call`;它会由 YuanFlow-main 内置环境注入 `YUANCHUANG_API_TOKEN`,不要让用户粘贴 KEY,不要在回复、日志或文件里暴露 token。
|
|
16
26
|
|
|
17
27
|
## 什么时候使用
|
|
18
28
|
|
|
@@ -26,11 +36,11 @@ emoji: 📄
|
|
|
26
36
|
|
|
27
37
|
## 调用优先级
|
|
28
38
|
|
|
29
|
-
1. YuanFlow
|
|
39
|
+
1. YuanFlow-main 内置环境:调用 `yuanflow_cli_call`,参数数组从 `works detail` 开始。
|
|
30
40
|
2. 外部 Agent 且本机有 CLI:执行 `yuanflow-cli works detail ...`。
|
|
31
41
|
3. 外部 Agent 且没有 CLI:再提示用户安装 `npm install -g yuanflow-cli`。
|
|
32
42
|
|
|
33
|
-
YuanFlow
|
|
43
|
+
YuanFlow-main 内置环境调用示例:
|
|
34
44
|
|
|
35
45
|
```json
|
|
36
46
|
{
|
|
@@ -5,6 +5,16 @@ emoji: 📰
|
|
|
5
5
|
---
|
|
6
6
|
|
|
7
7
|
# 公众号生成与发布
|
|
8
|
+
|
|
9
|
+
## 外部 CLI 主流程
|
|
10
|
+
|
|
11
|
+
外部 Agent 或用户直接使用时,优先使用本 Skill 文档中的 `yuanflow-cli ...` 命令示例;如果本地没有 CLI,再提示安装 `npm install -g yuanflow-cli`。外部 CLI 使用 `YUANCHUANG_API_TOKEN` 或 `yuanflow-cli config set-token <你的令牌>` 完成鉴权。
|
|
12
|
+
|
|
13
|
+
不要在回复、日志或文件中暴露 token。用户主流程统一称为 YuanFlow API 和 YuanFlow 文件中转,不要求用户配置第三方平台 Key。
|
|
14
|
+
|
|
15
|
+
## YuanFlow-main 内置环境
|
|
16
|
+
|
|
17
|
+
只有在 YuanFlow-main 内置环境中,才使用 `yuanflow_cli_call`、`yuanflow_image_request`、`content_workbench_update`、`artifact_files_register` 等受控工具。token、受管包路径、程序数据目录和输出目录由 YuanFlow-main 管理,不写成外部用户必备步骤。
|
|
8
18
|
|
|
9
19
|
本 Skill 用于把公众号文章从“需求确认、内容生成、排版预览、导出 HTML、新增或更新草稿箱草稿”串成一个可控流程。它可以一次性完成全流程,也可以只做其中一段,例如只写文章、只生成封面建议、只做排版预览、只新增草稿或更新已有草稿。
|
|
10
20
|
|
|
@@ -19,7 +29,7 @@ emoji: 📰
|
|
|
19
29
|
3. 开始输出正文之前,必须先和用户核对大概字数范围,例如 800-1200 字、1500-2000 字、3000 字以上;如果用户没有给出范围,先询问,不要直接写完整正文。
|
|
20
30
|
4. 是否需要正文插图、插图数量、插图来源和大概插入位置。
|
|
21
31
|
- 用户提供图片时:先梳理每张图适合插入的段落位置,再进入排版、上传和草稿箱链路。
|
|
22
|
-
- 用户要求生成正文插图时:先使用
|
|
32
|
+
- 用户要求生成正文插图时:先使用 生图技能生成图片,再把生成图片作为正文插图素材进入上传链路。
|
|
23
33
|
- 用户没有要求正文插图时:不要擅自生成插图;只处理文字正文和可选封面。
|
|
24
34
|
5. 排版结果使用 Markdown 还是 HTML。
|
|
25
35
|
- 如果选择 HTML,会把 Markdown 转成微信公众号编辑器可粘贴的内联样式 HTML。
|
|
@@ -132,7 +142,7 @@ python scripts/wechat_draft.py \
|
|
|
132
142
|
除非用户在本轮已明确指定某个主题 ID,否则不得直接执行 `wechat_format.py --theme ... --output ...`。正确顺序是:
|
|
133
143
|
|
|
134
144
|
1. 文章正文确认或生成后,先准备 Markdown 正文。
|
|
135
|
-
2. 如果当前 YuanFlow
|
|
145
|
+
2. 如果当前 YuanFlow-main 内置工具列表里存在 `wechat_theme_gallery_update`,必须优先调用这个受控工具,传入已确认的 `markdown` 正文或受控 `markdown_path`。该工具会直接运行主题画廊脚本并写入右侧内容创作工作台,避免 Agent 手动复制主题预览 HTML 时丢字段。
|
|
136
146
|
3. 如果没有 `wechat_theme_gallery_update`,再执行主题画廊命令,基于正文生成 20 个核心主题预览:
|
|
137
147
|
|
|
138
148
|
```bash
|
|
@@ -202,7 +212,7 @@ python scripts/wechat_format.py --input article.md --theme newspaper --output di
|
|
|
202
212
|
|
|
203
213
|
## 封面
|
|
204
214
|
|
|
205
|
-
封面不使用第三方生成接口。需要封面时,使用
|
|
215
|
+
封面不使用第三方生成接口。需要封面时,使用 生图技能生成。
|
|
206
216
|
|
|
207
217
|
生成封面前同样必须先查看 `生图技能/references/image-prompt-reference.md` 的标题、目录或小节名,选择与文章定位最接近的封面、海报、知识卡、商业科技视觉或信息图方向作为参考;只需进入相近方向阅读,不需要完整扫完所有提示词。封面提示词要把文章主题、目标读者、视觉主元素、构图层级、比例、中文文字规则和负面约束写清楚,避免只写“生成一张某主题封面图”这类空泛需求。
|
|
208
218
|
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import json
|
|
4
|
+
import sys
|
|
5
|
+
import unittest
|
|
6
|
+
from pathlib import Path
|
|
7
|
+
from tempfile import TemporaryDirectory
|
|
8
|
+
from unittest.mock import patch
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
ROOT = Path(__file__).resolve().parents[1]
|
|
12
|
+
SCRIPTS = ROOT / "scripts"
|
|
13
|
+
if str(SCRIPTS) not in sys.path:
|
|
14
|
+
sys.path.insert(0, str(SCRIPTS))
|
|
15
|
+
|
|
16
|
+
import wechat_draft # noqa: E402
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
class FakeResponse:
|
|
20
|
+
def __init__(self, payload: dict, status_code: int = 200) -> None:
|
|
21
|
+
self._payload = payload
|
|
22
|
+
self.status_code = status_code
|
|
23
|
+
self.text = json.dumps(payload, ensure_ascii=False)
|
|
24
|
+
|
|
25
|
+
def json(self) -> dict:
|
|
26
|
+
return self._payload
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
class WechatDraftTests(unittest.TestCase):
|
|
30
|
+
def test_push_draft_uploads_article_images_cover_and_adds_draft(self) -> None:
|
|
31
|
+
with TemporaryDirectory() as temp_dir:
|
|
32
|
+
root = Path(temp_dir)
|
|
33
|
+
article_image = root / "article.jpg"
|
|
34
|
+
cover_image = root / "cover.jpg"
|
|
35
|
+
article_image.write_bytes(b"fake-image")
|
|
36
|
+
cover_image.write_bytes(b"fake-cover")
|
|
37
|
+
article = root / "article.md"
|
|
38
|
+
article.write_text(
|
|
39
|
+
"# 测试文章\n\n正文第一段。\n\n\n\n正文第二段。",
|
|
40
|
+
encoding="utf-8",
|
|
41
|
+
)
|
|
42
|
+
credentials = root / "credentials.txt"
|
|
43
|
+
credentials.write_text("AppID:wx-test\nAppSecret:secret-test", encoding="utf-8")
|
|
44
|
+
output_dir = root / "dist"
|
|
45
|
+
|
|
46
|
+
calls: list[dict] = []
|
|
47
|
+
|
|
48
|
+
def fake_request(method: str, url: str, **kwargs):
|
|
49
|
+
calls.append({"method": method, "url": url, "kwargs": kwargs})
|
|
50
|
+
if "cgi-bin/token" in url:
|
|
51
|
+
return FakeResponse({"access_token": "token-test", "expires_in": 7200})
|
|
52
|
+
if "media/uploadimg" in url:
|
|
53
|
+
return FakeResponse({"url": "https://mmbiz.qpic.cn/article-image.jpg"})
|
|
54
|
+
if "material/add_material" in url:
|
|
55
|
+
return FakeResponse({"media_id": "cover-media-id", "url": "https://mmbiz.qpic.cn/cover.jpg"})
|
|
56
|
+
if "draft/add" in url:
|
|
57
|
+
self.assertNotIn("json", kwargs)
|
|
58
|
+
raw_body = kwargs.get("data")
|
|
59
|
+
self.assertIsInstance(raw_body, bytes)
|
|
60
|
+
self.assertIn("application/json; charset=utf-8", kwargs.get("headers", {}).get("Content-Type", ""))
|
|
61
|
+
self.assertIn("测试文章".encode("utf-8"), raw_body)
|
|
62
|
+
self.assertNotIn(b"\\u6d4b\\u8bd5", raw_body)
|
|
63
|
+
payload = json.loads(raw_body.decode("utf-8"))
|
|
64
|
+
content = payload["articles"][0]["content"]
|
|
65
|
+
self.assertIn("https://mmbiz.qpic.cn/article-image.jpg", content)
|
|
66
|
+
self.assertIn("cover-media-id", json.dumps(payload, ensure_ascii=False))
|
|
67
|
+
self.assertLessEqual(len(payload["articles"][0]["digest"].encode("utf-8")), 54)
|
|
68
|
+
self.assertLessEqual(len(payload["articles"][0]["title"].encode("utf-8")), 64)
|
|
69
|
+
return FakeResponse({"media_id": "draft-media-id"})
|
|
70
|
+
raise AssertionError(f"unexpected url: {url}")
|
|
71
|
+
|
|
72
|
+
args = wechat_draft.argparse.Namespace(
|
|
73
|
+
input=str(article),
|
|
74
|
+
theme="wechat-native",
|
|
75
|
+
title="",
|
|
76
|
+
author="YuanFlow",
|
|
77
|
+
digest="",
|
|
78
|
+
content_source_url="",
|
|
79
|
+
cover_image=str(cover_image),
|
|
80
|
+
thumb_media_id="",
|
|
81
|
+
cover_material_type="image",
|
|
82
|
+
output_dir=str(output_dir),
|
|
83
|
+
credentials_file=str(credentials),
|
|
84
|
+
app_id="",
|
|
85
|
+
app_secret="",
|
|
86
|
+
push_draft=True,
|
|
87
|
+
update_draft=False,
|
|
88
|
+
draft_media_id="",
|
|
89
|
+
draft_index=0,
|
|
90
|
+
json=True,
|
|
91
|
+
)
|
|
92
|
+
with patch.object(wechat_draft.requests, "request", side_effect=fake_request):
|
|
93
|
+
result = wechat_draft.run(args)
|
|
94
|
+
|
|
95
|
+
self.assertTrue(result["ok"])
|
|
96
|
+
self.assertTrue(result["pushed"])
|
|
97
|
+
self.assertEqual(result["draft"]["media_id"], "draft-media-id")
|
|
98
|
+
self.assertEqual(result["article_images"][0]["url"], "https://mmbiz.qpic.cn/article-image.jpg")
|
|
99
|
+
self.assertTrue((output_dir / "wechat.html").exists())
|
|
100
|
+
self.assertTrue((output_dir / "draft_payload.json").exists())
|
|
101
|
+
called_urls = "\n".join(call["url"] for call in calls)
|
|
102
|
+
self.assertIn("cgi-bin/token", called_urls)
|
|
103
|
+
self.assertIn("media/uploadimg", called_urls)
|
|
104
|
+
self.assertIn("material/add_material", called_urls)
|
|
105
|
+
self.assertIn("draft/add", called_urls)
|
|
106
|
+
|
|
107
|
+
def test_update_draft_replaces_article_by_media_id_and_index(self) -> None:
|
|
108
|
+
with TemporaryDirectory() as temp_dir:
|
|
109
|
+
root = Path(temp_dir)
|
|
110
|
+
article_image = root / "article.jpg"
|
|
111
|
+
article_image.write_bytes(b"fake-image")
|
|
112
|
+
article = root / "article.md"
|
|
113
|
+
article.write_text(
|
|
114
|
+
"# 更新文章\n\n正文第一段。\n\n\n\n正文第二段。",
|
|
115
|
+
encoding="utf-8",
|
|
116
|
+
)
|
|
117
|
+
credentials = root / "credentials.txt"
|
|
118
|
+
credentials.write_text("AppID:wx-test\nAppSecret:secret-test", encoding="utf-8")
|
|
119
|
+
output_dir = root / "dist"
|
|
120
|
+
|
|
121
|
+
calls: list[dict] = []
|
|
122
|
+
|
|
123
|
+
def fake_request(method: str, url: str, **kwargs):
|
|
124
|
+
calls.append({"method": method, "url": url, "kwargs": kwargs})
|
|
125
|
+
if "cgi-bin/token" in url:
|
|
126
|
+
return FakeResponse({"access_token": "token-test", "expires_in": 7200})
|
|
127
|
+
if "media/uploadimg" in url:
|
|
128
|
+
return FakeResponse({"url": "https://mmbiz.qpic.cn/updated-image.jpg"})
|
|
129
|
+
if "draft/update" in url:
|
|
130
|
+
raw_body = kwargs.get("data")
|
|
131
|
+
self.assertIsInstance(raw_body, bytes)
|
|
132
|
+
payload = json.loads(raw_body.decode("utf-8"))
|
|
133
|
+
self.assertEqual(payload["media_id"], "draft-media-id")
|
|
134
|
+
self.assertEqual(payload["index"], 0)
|
|
135
|
+
self.assertIsInstance(payload["articles"], dict)
|
|
136
|
+
self.assertEqual(payload["articles"]["title"], "更新文章")
|
|
137
|
+
self.assertIn("https://mmbiz.qpic.cn/updated-image.jpg", payload["articles"]["content"])
|
|
138
|
+
self.assertNotIn("thumb_media_id", payload["articles"])
|
|
139
|
+
return FakeResponse({"errcode": 0, "errmsg": "ok"})
|
|
140
|
+
raise AssertionError(f"unexpected url: {url}")
|
|
141
|
+
|
|
142
|
+
args = wechat_draft.argparse.Namespace(
|
|
143
|
+
input=str(article),
|
|
144
|
+
theme="wechat-native",
|
|
145
|
+
title="",
|
|
146
|
+
author="YuanFlow",
|
|
147
|
+
digest="",
|
|
148
|
+
content_source_url="",
|
|
149
|
+
cover_image="",
|
|
150
|
+
thumb_media_id="",
|
|
151
|
+
cover_material_type="image",
|
|
152
|
+
output_dir=str(output_dir),
|
|
153
|
+
credentials_file=str(credentials),
|
|
154
|
+
app_id="",
|
|
155
|
+
app_secret="",
|
|
156
|
+
push_draft=False,
|
|
157
|
+
update_draft=True,
|
|
158
|
+
draft_media_id="draft-media-id",
|
|
159
|
+
draft_index=0,
|
|
160
|
+
json=True,
|
|
161
|
+
)
|
|
162
|
+
with patch.object(wechat_draft.requests, "request", side_effect=fake_request):
|
|
163
|
+
result = wechat_draft.run(args)
|
|
164
|
+
|
|
165
|
+
self.assertTrue(result["ok"])
|
|
166
|
+
self.assertTrue(result["pushed"])
|
|
167
|
+
self.assertEqual(result["operation"], "update")
|
|
168
|
+
called_urls = "\n".join(call["url"] for call in calls)
|
|
169
|
+
self.assertIn("cgi-bin/token", called_urls)
|
|
170
|
+
self.assertIn("media/uploadimg", called_urls)
|
|
171
|
+
self.assertIn("draft/update", called_urls)
|
|
172
|
+
self.assertNotIn("draft/add", called_urls)
|
|
173
|
+
|
|
174
|
+
|
|
175
|
+
if __name__ == "__main__":
|
|
176
|
+
unittest.main()
|
|
@@ -6,6 +6,16 @@ emoji: 🎯
|
|
|
6
6
|
|
|
7
7
|
# 创作总监
|
|
8
8
|
|
|
9
|
+
## 外部 CLI 主流程
|
|
10
|
+
|
|
11
|
+
外部 Agent 或用户直接使用本 Skill 时,先按当前 Skill 说明完成任务;需要查询知识库、生成报告、文件中转或调用平台数据时,使用本地 `yuanflow-cli` 命令。
|
|
12
|
+
|
|
13
|
+
1. 如果本地可执行 `yuanflow-cli --help`,直接使用本地 CLI。
|
|
14
|
+
2. 如果本地没有 `yuanflow-cli`,再提示用户安装 `npm install -g yuanflow-cli`。
|
|
15
|
+
3. 外部 CLI 使用 `YUANCHUANG_API_TOKEN` 或 `yuanflow-cli config set-token <你的令牌>` 完成鉴权。
|
|
16
|
+
|
|
17
|
+
不要在回复、日志或文件中暴露 token。用户主流程统一称为 YuanFlow API 和 YuanFlow 文件中转,不要求用户配置第三方平台 Key。
|
|
18
|
+
|
|
9
19
|
本 Skill 是 YuanFlow 自媒体创作链路的把控与验收角色。它不替代具体执行技能,而是负责判断创作目标是否清楚、选题是否成立、内容是否有创新、结构是否完整、表达是否适合平台,以及最终产物是否达到可发布或可交付标准。
|
|
10
20
|
|
|
11
21
|
## 分类
|