@yizhuan-cli/cli 0.1.16 → 0.1.17-beta.1
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 +15 -0
- package/package.json +1 -1
- package/resources/yizhuan-cli/SKILL.md +42 -1
- package/resources/yizhuan-cli/manifest.json +4 -4
- package/src/index.js +38 -19
package/README.md
CHANGED
|
@@ -36,6 +36,8 @@ yizhuan config path
|
|
|
36
36
|
yizhuan config show
|
|
37
37
|
yizhuan execute --ability membership
|
|
38
38
|
yizhuan execute --ability works --query "百家号昨天新增了哪些作品"
|
|
39
|
+
yizhuan execute --ability works --params '{"mode":"comments","platform":"douyin","workId":"123456","count":20}'
|
|
40
|
+
yizhuan execute --ability works --params '{"mode":"comments","platform":"douyin","title":"作品标题","count":20}'
|
|
39
41
|
yizhuan execute --ability hot_topics --platform douyin
|
|
40
42
|
yizhuan execute --ability hot_topics --params '{"platform":"douyin"}'
|
|
41
43
|
yizhuan execute --ability accounts --params '{"mode":"public_search","platform":"toutiao","keyword":"张三"}'
|
|
@@ -72,6 +74,9 @@ yizhuan execute --ability hot_topics --params "{\"platform\":\"douyin\"}"
|
|
|
72
74
|
## 支持的典型能力
|
|
73
75
|
|
|
74
76
|
- 作品查询:`yizhuan execute --ability works --query "AI 相关的热门作品有哪些"`
|
|
77
|
+
- 作品评论:`yizhuan execute --ability works --params '{"mode":"comments","platform":"douyin","workId":"123456","count":20}'`
|
|
78
|
+
- 按标题查询评论:`yizhuan execute --ability works --params '{"mode":"comments","platform":"douyin","title":"作品标题"}'`;标题必须唯一匹配,多个候选时 CLI 会要求补充条件。
|
|
79
|
+
- 微信公众号/视频号评论:`yizhuan execute --ability works --params '{"mode":"comments","platform":"weixin","workId":"https://mp.weixin.qq.com/s/文章链接","count":20}'`;这两个平台的 `workId` 使用作品链接。
|
|
75
80
|
- 作者查询:`yizhuan execute --ability accounts --query "查询张三这个作者"`
|
|
76
81
|
- 作者指标筛选:`yizhuan execute --ability author_query --params '{"platform_id":2,"min_follower":500000,"min_total_likes":100000}'`
|
|
77
82
|
- 作者全网搜索:`yizhuan execute --ability accounts --params '{"mode":"public_search","platform":"toutiao","keyword":"张三"}'`
|
|
@@ -82,6 +87,8 @@ yizhuan execute --ability hot_topics --params "{\"platform\":\"douyin\"}"
|
|
|
82
87
|
- 竞品动态筛选:`yizhuan execute --ability radar --params '{"mode":"timeline","timeRange":"7d","platform":"baijiahao","keyword":"AI"}'`
|
|
83
88
|
- 取消关注雷达作者:先查询关注列表拿到 `articleId`,再执行 `yizhuan execute --ability radar --params '{"mode":"unfollow","articleId":"205169870"}'`
|
|
84
89
|
- 会员查询:`yizhuan execute --ability membership --query "我的会员什么时候到期"`
|
|
90
|
+
- 内容提取:`yizhuan execute --ability content_extract --url "https://example.com/article"`
|
|
91
|
+
- 易撰作品内容提取:`yizhuan execute --ability content_extract --params '{"contentId":12345}'`
|
|
85
92
|
|
|
86
93
|
如果你是通过 Codex、Cursor、Claude Code 这类 Agent 使用 CLI,也可以直接用自然语言提问,例如:
|
|
87
94
|
|
|
@@ -90,3 +97,11 @@ yizhuan execute --ability hot_topics --params "{\"platform\":\"douyin\"}"
|
|
|
90
97
|
- `查询 AI 相关的热门文章`
|
|
91
98
|
- `取消关注陈某某先生`
|
|
92
99
|
- `我的会员什么时候到期`
|
|
100
|
+
|
|
101
|
+
纯创作请求(例如“写一篇中秋文章”)由当前 Agent 完成,不调用 `content_extract`;CLI 只提供真实内容素材,不负责生成、改写或发布。
|
|
102
|
+
|
|
103
|
+
## 使用统计
|
|
104
|
+
|
|
105
|
+
仅采集业务调用元数据,不采集问题、关键词、URL、正文或返回内容。
|
|
106
|
+
调用方可设置 `YIZHUAN_TRIGGER=user_initiated` 表示用户当前提问或手动触发(含 AI 代执行),设置 `YIZHUAN_TRIGGER=automated` 表示定时或无人值守任务。
|
|
107
|
+
未设置时归为 `unknown`,不会猜测来源。检测轮询不计活跃。通过 `YIZHUAN_TELEMETRY=0` 可关闭使用埋点。
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: yizhuan-cli
|
|
3
3
|
description: |
|
|
4
|
-
安装、配置并使用易撰 CLI(yizhuan
|
|
4
|
+
安装、配置并使用易撰 CLI(yizhuan 命令)查询真实数据、提取文章/视频/图文内容的全量 Skill;若已安装用户明确指定平台对应的易撰平台 Skill,必须优先使用对应的拆分平台 Skill。业务数据禁止臆造,文章创作由当前 Agent 完成。
|
|
5
5
|
---
|
|
6
6
|
|
|
7
7
|
# 易撰 CLI
|
|
@@ -40,6 +40,9 @@ yizhuan doctor
|
|
|
40
40
|
| 配置状态 | `yizhuan config show` |
|
|
41
41
|
| 作品 | `yizhuan execute --ability works --query "百家号昨天新增了哪些作品"` |
|
|
42
42
|
| 作品检索 | `yizhuan execute --ability works --params '{"mode":"search","keyword":"AI"}'` |
|
|
43
|
+
| 作品评论(明确 ID) | `yizhuan execute --ability works --params '{"mode":"comments","platform":"douyin","workId":"123456","count":20}'` |
|
|
44
|
+
| 作品评论(按标题定位) | `yizhuan execute --ability works --params '{"mode":"comments","platform":"douyin","title":"作品标题"}'` |
|
|
45
|
+
| 微信公众号/视频号评论 | `yizhuan execute --ability works --params '{"mode":"comments","platform":"weixin","workId":"https://mp.weixin.qq.com/s/文章链接","count":20}'` |
|
|
43
46
|
| 指定作者作品 | `yizhuan query --json '{"intent":"works_search","scope":"public","platform":"toutiao","authorName":"大名府名人","timeRange":"3d"}'` |
|
|
44
47
|
| 高级作品筛选 | `yizhuan query --json '{"intent":"works_search","scope":"public","platform":"weibo","categories":["娱乐","情感"],"content_type":"video","min_views":100000,"min_comments":10000,"sort_by":"views","order":"desc"}'` |
|
|
45
48
|
| 作者查询 | `yizhuan execute --ability accounts --query "张三"` |
|
|
@@ -53,10 +56,14 @@ yizhuan doctor
|
|
|
53
56
|
| 会员 | `yizhuan execute --ability membership` |
|
|
54
57
|
| 我的灵感 / 灵感库 / 收藏作品 | `yizhuan execute --ability favorites` |
|
|
55
58
|
| 一键检测 | 将标题和正文写入临时 JSON 文件后执行 `yizhuan execute --ability detection --json-file <file>` |
|
|
59
|
+
| 提取文章/视频/图文 | `yizhuan execute --ability content_extract --params '{"url":"https://..."}'` |
|
|
56
60
|
|
|
57
61
|
## 调用规则
|
|
58
62
|
|
|
59
63
|
- 需要真实易撰数据时必须调用 CLI,不直接猜测结果。
|
|
64
|
+
- 用户只说“写一篇中秋文章”等纯创作请求时,不调用 CLI,由当前 Agent 直接创作。
|
|
65
|
+
- 用户要求提取文章正文、视频口播文字或图文素材时,使用 `content_extract`;来源可以是 `url` 或易撰 `contentId`。
|
|
66
|
+
- 用户要求“根据易撰热门内容创作”时,先调用查询/提取能力获取真实素材,再由当前 Agent 完成创作;CLI 不生成、改写、生成标题或发布内容。
|
|
60
67
|
- 一键检测的原创度检测当前只有百度引擎。展示检测结果时使用 `data.originalScore` 和 `data.originalEngine`;不得把历史兼容字段 `_360`、`sogou`、`zonghe` 展示为检测引擎或额外得分。
|
|
61
68
|
- 一键检测支持 `submit`、`get` 和 `wait` 模式。`wait` 必须按照服务端 `pollAfterSeconds` 轮询;pending、failed、timeout 状态必须如实报告,成功、失败或超时后均清理包含标题和正文的临时 JSON 文件。
|
|
62
69
|
- PowerShell 使用单引号包裹 JSON。终端可能改写引号时,将不含密钥的请求对象写入文件,再使用 `--json-file`。
|
|
@@ -71,6 +78,10 @@ yizhuan doctor
|
|
|
71
78
|
- 关注公开作者时,先用 `author_search` 取得并选定完整作者资料,再调用 `accounts` 的 `mode=follow_public_author`;必须传该结果的 `platform`、`extAuthorId` 和 `nickname`。`nickname` 必须是公开搜索结果中的作者名称,绝不能将 `extAuthorId` 作为名称写入。
|
|
72
79
|
- 公开作者结果中的 `workCount: 0` 可能是上游未返回作品数后的缺省值,不代表作者没有作品;是否有作品必须以 `works_search` 的结果为准。
|
|
73
80
|
- 作品复合筛选优先使用统一协议 `intent=works_search`。平台使用 `platform`,分类使用 `categories`,内容类型使用 `content_type`,最低阅读/播放和评论分别使用 `min_views`、`min_comments`;需要固定顺序时显式传 `sort_by` 和 `order`。不得把作品查询改成作者、雷达或热点查询。
|
|
81
|
+
- 查询作品评论使用 `works` 的 `mode=comments`。有明确平台作品 ID 时传 `platform` + `workId`;只有作品标题时传 `platform` + `title`,CLI 会先检索作品,只有标题唯一匹配且能解析平台作品 ID 才继续查询。多个候选返回 `AMBIGUOUS_WORK`,不得自行猜测。
|
|
82
|
+
- 微信公众号和微信视频号评论通过登录采集机获取,平台分别传 `weixin`/`wxgzh` 和 `wxsph`/`视频号`,`workId` 必须是作品链接;这两个平台暂不支持 `cursor` 和 `parentId`。
|
|
83
|
+
- 作品评论默认返回一页、最多 50 条,未传 `count` 时按 20 条处理。需要继续翻页时,必须将上一页返回的 `data.cursor` 原样传回,依据 `data.hasMore` 停止;不得把评论数 `metrics.commentCount` 当作评论正文,也不得声称结果是“最新”或“热门”。
|
|
84
|
+
- 作品评论返回 `data.items[].text`、`user`、`likeCount`、`replyCount`、`ipLabel`、`createdAt` 等字段。查询评论回复时可额外传 `parentId`。评论发布、删除、点赞不属于本 Skill 能力。
|
|
74
85
|
- 当前 CLI 不支持按单篇作品 URL 或平台侧 `articleId` 精确查询作品详情。用户提供作品链接或文章 ID 时,直接说明该能力暂不支持;不得将完整链接或纯文章 ID 改作 `keyword` 搜索,也不得把这种搜索返回的 `empty` 解读为全网不存在该作品。
|
|
75
86
|
- 作品查询返回后必须逐项核对用户要求的分类、类型和指标阈值;低于阈值或缺少必要指标的项目不得作为符合条件的结果展示,也不得擅自放宽条件。展示总数必须使用返回的 `data.total`,不能把当前页条数当成总数。
|
|
76
87
|
- 作者累计指标筛选使用 `author_query`,不得改成作品指标或擅自降低阈值。必须逐项映射用户给出的所有条件:粉丝使用 `min_follower` / `max_follower`,点赞使用 `min_total_likes` / `max_total_likes`,阅读使用 `min_total_views` / `max_total_views`,关注使用 `min_friends` / `max_friends`,作品数使用 `min_work_count` / `max_work_count`;复合条件不得遗漏任何字段。例如“百家号粉丝大于50万,点赞大于10万”必须同时传 `platform_id:2`、`min_follower:500000` 和 `min_total_likes:100000`。
|
|
@@ -83,3 +94,33 @@ yizhuan doctor
|
|
|
83
94
|
- 取消关注前先查询关注列表,使用匹配项的 `articleId`,不得因结果不符合预期自行取消。
|
|
84
95
|
- `unsupported` 表示当前口径不支持,`empty` 表示没有匹配数据;如实转述,不编造补充结果。
|
|
85
96
|
- CLI 报错时保留脱敏后的错误信息,引导检查 `yizhuan doctor`,不得输出完整 Key。
|
|
97
|
+
|
|
98
|
+
## CLI 调用来源
|
|
99
|
+
|
|
100
|
+
在每次 `execute` 或 `query` 业务调用前,根据本次任务的触发原因设置进程环境变量 `YIZHUAN_TRIGGER`:
|
|
101
|
+
|
|
102
|
+
- `user_initiated`:用户当前提问、手动指令及为完成该请求而执行的分页、后续能力调用。AI 代用户执行仍属于主动使用。
|
|
103
|
+
- `automated`:定时执行、无人值守批处理、后台监控或自动唤醒。用户曾要求建立定时任务,不代表每次定时运行都是主动使用。
|
|
104
|
+
- `unknown`:无法确定触发原因;不得默认标为主动,也不得仅因使用 AI 工具就标为自动。
|
|
105
|
+
|
|
106
|
+
每次按当前触发原因显式覆盖,避免继承上一任务的来源。来源只通过子进程环境传递,不写入业务 JSON、API Key 配置或系统全局环境。调用结束后恢复原环境;一个任务中的分页保持同一来源,CLI 内置检测轮询由 CLI/服务端自动排除,不手工伪造 `polling`。
|
|
107
|
+
|
|
108
|
+
Bash/zsh 的单次主动查询示例(自动任务把值改为 `automated`):
|
|
109
|
+
|
|
110
|
+
```bash
|
|
111
|
+
YIZHUAN_TRIGGER=user_initiated yizhuan query --json-file request.json
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
PowerShell 示例,使用当前任务选择的来源并恢复原值:
|
|
115
|
+
|
|
116
|
+
```powershell
|
|
117
|
+
$cliPreviousTrigger = $env:YIZHUAN_TRIGGER
|
|
118
|
+
try {
|
|
119
|
+
$env:YIZHUAN_TRIGGER = 'user_initiated'
|
|
120
|
+
yizhuan query --json-file request.json
|
|
121
|
+
} finally {
|
|
122
|
+
$env:YIZHUAN_TRIGGER = $cliPreviousTrigger
|
|
123
|
+
}
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
只有元数据参与使用统计,不额外上传用户问题、关键词、链接或正文。尊重用户现有的 `YIZHUAN_TELEMETRY=0` 设置,不启用或覆盖它。安装、配置、doctor、help 和 version 不作为业务使用;来源设置无需额外询问用户。来源标签不是触发新业务调用或定时任务的授权。
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schemaVersion": 1,
|
|
3
3
|
"name": "yizhuan-cli",
|
|
4
|
-
"version": "0.1.
|
|
5
|
-
"compatibleCliVersion": "0.1.
|
|
6
|
-
"source": "npm:@yizhuan-cli/cli@0.1.
|
|
4
|
+
"version": "0.1.17-beta.1",
|
|
5
|
+
"compatibleCliVersion": "0.1.17-beta.1",
|
|
6
|
+
"source": "npm:@yizhuan-cli/cli@0.1.17-beta.1",
|
|
7
7
|
"digestAlgorithm": "sha256",
|
|
8
8
|
"files": [
|
|
9
9
|
{
|
|
10
10
|
"path": "SKILL.md",
|
|
11
|
-
"sha256": "
|
|
11
|
+
"sha256": "f5d8858b7377e3afabc394bf2aab72ffce7b7cee60864d0d97d86549d68fd70b"
|
|
12
12
|
}
|
|
13
13
|
]
|
|
14
14
|
}
|
package/src/index.js
CHANGED
|
@@ -26,7 +26,8 @@ const ABILITIES = new Set([
|
|
|
26
26
|
'work_query',
|
|
27
27
|
'membership_info',
|
|
28
28
|
'favorites_query',
|
|
29
|
-
'detection'
|
|
29
|
+
'detection',
|
|
30
|
+
'content_extract'
|
|
30
31
|
])
|
|
31
32
|
|
|
32
33
|
const PARAM_FLAG_KEYS = [
|
|
@@ -43,7 +44,9 @@ const PARAM_FLAG_KEYS = [
|
|
|
43
44
|
'authorId',
|
|
44
45
|
'extAuthorId',
|
|
45
46
|
'collectionType',
|
|
46
|
-
'metric'
|
|
47
|
+
'metric',
|
|
48
|
+
'url', 'contentType', 'contentId', 'content_id', 'platformCode', 'platform_code',
|
|
49
|
+
'outputFormat', 'output_format', 'includeImages', 'includeTranscriptSegments', 'source'
|
|
47
50
|
]
|
|
48
51
|
|
|
49
52
|
function printHelp() {
|
|
@@ -64,12 +67,15 @@ Usage:
|
|
|
64
67
|
|
|
65
68
|
Examples:
|
|
66
69
|
yizhuan execute --ability works --query "百家号昨天新增了哪些作品"
|
|
70
|
+
yizhuan execute --ability works --params '{"mode":"comments","platform":"douyin","workId":"123456","count":20}'
|
|
71
|
+
yizhuan execute --ability works --params '{"mode":"comments","platform":"douyin","title":"作品标题","count":20}'
|
|
67
72
|
yizhuan execute --ability hot_topics --platform douyin
|
|
68
73
|
yizhuan execute --ability hot_topics --params '{"platform":"douyin"}'
|
|
69
74
|
yizhuan execute --ability accounts --params '{"mode":"public_search","platform":"toutiao","keyword":"张三"}'
|
|
70
75
|
yizhuan execute --ability radar --params '{"mode":"following"}'
|
|
71
76
|
yizhuan execute --ability radar --mode timeline --timeRange 7d
|
|
72
77
|
yizhuan execute --ability detection --json-file detection.json
|
|
78
|
+
yizhuan execute --ability content_extract --url "https://example.com/article"
|
|
73
79
|
yizhuan execute --ability radar --params '{"mode":"unfollow","articleId":"205169870"}'
|
|
74
80
|
|
|
75
81
|
Notes:
|
|
@@ -92,10 +98,13 @@ Abilities:
|
|
|
92
98
|
public_author_search 作者全网搜索,兼容低层能力
|
|
93
99
|
public_work_search 作品全网搜索,兼容低层能力
|
|
94
100
|
detection 一键检测(原创/风险)
|
|
101
|
+
content_extract 提取文章、视频和图文内容
|
|
95
102
|
|
|
96
103
|
Config:
|
|
97
104
|
${CONFIG_PATH}
|
|
98
105
|
可通过环境变量 YIZHUAN_CONFIG_PATH 指定独立配置文件
|
|
106
|
+
YIZHUAN_TRIGGER=user_initiated 标识用户主动请求,automated 标识自动任务;未设置为 unknown
|
|
107
|
+
YIZHUAN_TELEMETRY=0 关闭使用元数据埋点
|
|
99
108
|
`)
|
|
100
109
|
}
|
|
101
110
|
|
|
@@ -220,7 +229,20 @@ function readConfig() {
|
|
|
220
229
|
|
|
221
230
|
return {
|
|
222
231
|
apiBaseUrl: String(config.apiBaseUrl).replace(/\/+$/, ''),
|
|
223
|
-
apiKey: String(config.apiKey)
|
|
232
|
+
apiKey: String(config.apiKey),
|
|
233
|
+
telemetryEnabled: process.env.YIZHUAN_TELEMETRY !== '0'
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
function buildRequestHeaders(config) {
|
|
238
|
+
return {
|
|
239
|
+
authorization: config.apiKey,
|
|
240
|
+
'content-type': 'application/json',
|
|
241
|
+
'x-device-type': 'pc',
|
|
242
|
+
'x-yizhuan-cli-version': readPackageVersion(),
|
|
243
|
+
'x-yizhuan-trigger': ['user_initiated', 'automated'].includes(process.env.YIZHUAN_TRIGGER)
|
|
244
|
+
? process.env.YIZHUAN_TRIGGER : 'unknown',
|
|
245
|
+
'x-yizhuan-telemetry': config.telemetryEnabled ? '1' : '0'
|
|
224
246
|
}
|
|
225
247
|
}
|
|
226
248
|
|
|
@@ -235,7 +257,16 @@ function stripWrappingQuotes(text) {
|
|
|
235
257
|
return value
|
|
236
258
|
}
|
|
237
259
|
|
|
238
|
-
|
|
260
|
+
// Platform work IDs can exceed Number.MAX_SAFE_INTEGER (Douyin aweme IDs are
|
|
261
|
+
// commonly 19 digits). Keep them opaque even when params use loose key=value
|
|
262
|
+
// parsing; JSON input already preserves quoted strings.
|
|
263
|
+
const OPAQUE_ID_KEYS = new Set([
|
|
264
|
+
'extAuthorId',
|
|
265
|
+
'ext_author_id',
|
|
266
|
+
'author_id',
|
|
267
|
+
'workId',
|
|
268
|
+
'work_id'
|
|
269
|
+
])
|
|
239
270
|
|
|
240
271
|
function coerceScalar(value, key) {
|
|
241
272
|
const text = stripWrappingQuotes(value).replace(/\\_/g, '_').trim()
|
|
@@ -435,11 +466,7 @@ async function execute(args) {
|
|
|
435
466
|
const config = readConfig()
|
|
436
467
|
const response = await fetch(`${config.apiBaseUrl}/api/cli.execute`, {
|
|
437
468
|
method: 'POST',
|
|
438
|
-
headers:
|
|
439
|
-
authorization: config.apiKey,
|
|
440
|
-
'content-type': 'application/json',
|
|
441
|
-
'x-device-type': 'pc'
|
|
442
|
-
},
|
|
469
|
+
headers: buildRequestHeaders(config),
|
|
443
470
|
body: JSON.stringify({
|
|
444
471
|
json: {
|
|
445
472
|
ability,
|
|
@@ -471,11 +498,7 @@ async function execute(args) {
|
|
|
471
498
|
if (Date.now() >= deadline) break
|
|
472
499
|
const poll = await fetch(`${config.apiBaseUrl}/api/cli.execute`, {
|
|
473
500
|
method: 'POST',
|
|
474
|
-
headers: {
|
|
475
|
-
authorization: config.apiKey,
|
|
476
|
-
'content-type': 'application/json',
|
|
477
|
-
'x-device-type': 'pc'
|
|
478
|
-
},
|
|
501
|
+
headers: { ...buildRequestHeaders(config), 'x-yizhuan-trigger': 'polling' },
|
|
479
502
|
body: JSON.stringify({
|
|
480
503
|
json: { ability: 'detection', params: { mode: 'get', id: result.data.id } }
|
|
481
504
|
})
|
|
@@ -522,11 +545,7 @@ async function query(args) {
|
|
|
522
545
|
const config = readConfig()
|
|
523
546
|
const response = await fetch(`${config.apiBaseUrl}/api/agent.query`, {
|
|
524
547
|
method: 'POST',
|
|
525
|
-
headers:
|
|
526
|
-
authorization: config.apiKey,
|
|
527
|
-
'content-type': 'application/json',
|
|
528
|
-
'x-device-type': 'pc'
|
|
529
|
-
},
|
|
548
|
+
headers: buildRequestHeaders(config),
|
|
530
549
|
body: JSON.stringify({ json: request })
|
|
531
550
|
})
|
|
532
551
|
const text = await response.text()
|