wxpub-cli 0.2.0 → 0.3.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 +9 -1
- package/dist/commands/install.d.ts +12 -0
- package/dist/commands/install.js +43 -0
- package/dist/commands/install.js.map +1 -0
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -1
- package/package.json +4 -2
- package/skill/claude/SKILL.md +50 -0
package/README.md
CHANGED
|
@@ -7,11 +7,13 @@
|
|
|
7
7
|
## 安装
|
|
8
8
|
|
|
9
9
|
```bash
|
|
10
|
-
npm install -g wxpub-cli@0.
|
|
10
|
+
npm install -g wxpub-cli@0.2.0
|
|
11
11
|
```
|
|
12
12
|
|
|
13
13
|
装好后两个命令等价可用:`wxpub`(短,日常用)和 `wxpub-cli`(与包名一致)。文档以 `wxpub` 示例。
|
|
14
14
|
|
|
15
|
+
再跑一次 `wxpub install`,把 **wxpub skill** 装进 Claude Code(`~/.claude/skills/wxpub/`)——之后在任何会话里说"把这篇文章发到丹心",agent 就会自动走 `tone 拉调性 → 写作 → illustrate 配图 → publish 投递` 全链路,无需教它命令。
|
|
16
|
+
|
|
15
17
|
> 旧包 `wxpub@0.1.0` 已更名,请改用 `wxpub-cli`(命令 `wxpub` 保持不变)。
|
|
16
18
|
|
|
17
19
|
要求 Node.js >= 20。
|
|
@@ -125,10 +127,16 @@ npm install
|
|
|
125
127
|
npm run lint # ESLint 9 (flat config)
|
|
126
128
|
npm run typecheck # tsc --noEmit
|
|
127
129
|
npm test # vitest(wire 契约测试)
|
|
130
|
+
npm run eval # agent evals(真 agent 回归 SKILL.md 行为,~$0.2/次)
|
|
128
131
|
npm run build # 产出 dist/
|
|
129
132
|
node dist/index.js --help
|
|
130
133
|
```
|
|
131
134
|
|
|
135
|
+
### agent evals
|
|
136
|
+
|
|
137
|
+
`evals/` 用 `claude -p` 无头模式做 **skill 行为回归**:把 SKILL.md + 场景指令喂给干净 agent,对它的"将执行的命令 + 说明"按规则评分(ordered 顺序 / must_match / must_not_match)。改 SKILL.md 或 CLI 行为后跑 `npm run eval`,红灯 = 说明书没教好。首跑即抓到真问题:场景歧义(转发现成稿要不要拉调性)促成了铁律 1 的措辞收紧。
|
|
138
|
+
|
|
132
139
|
## 路线图
|
|
133
140
|
|
|
141
|
+
- ✅ v0.3:`wxpub install` 分发 Agent Skill(遵循 [Agent Skills 开放规范](https://agentskills.io/specification)),Claude Code 自动发现发文工作流;`npm run eval` agent evals 持续回归 skill 行为(vercel 式)
|
|
134
142
|
- ✅ v0.2:`wxpub tone` 拉账号调性(写文前注入 agent 上下文);`wxpub illustrate` AI 生成文中插图(依赖服务端 `/api/mp/account-tone` 与 `/api/mp/ai-image`)
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/** 源 SKILL.md(随 npm 包分发的 skill/claude/SKILL.md)。 */
|
|
2
|
+
export declare function skillSourcePath(): string;
|
|
3
|
+
/**
|
|
4
|
+
* 把 SKILL.md 复制到目标 skill 目录(~/.claude/skills/wxpub/),幂等覆盖。
|
|
5
|
+
* 返回写入的文件路径。目标目录可注入,测试用。
|
|
6
|
+
*/
|
|
7
|
+
export declare function copySkillTo(targetDir: string): string;
|
|
8
|
+
export interface InstallOptions {
|
|
9
|
+
json: boolean;
|
|
10
|
+
}
|
|
11
|
+
/** wxpub install:把 skill 装进 Claude Code(~/.claude/skills/wxpub/)。 */
|
|
12
|
+
export declare function runInstall(options: InstallOptions): void;
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { copyFileSync, mkdirSync, readFileSync } from "node:fs";
|
|
2
|
+
import { dirname, join } from "node:path";
|
|
3
|
+
import { fileURLToPath } from "node:url";
|
|
4
|
+
import { homedir } from "node:os";
|
|
5
|
+
/** 包根目录(dist/commands/install.js 的上两级)。 */
|
|
6
|
+
function packageRoot() {
|
|
7
|
+
return dirname(dirname(dirname(fileURLToPath(import.meta.url))));
|
|
8
|
+
}
|
|
9
|
+
/** 源 SKILL.md(随 npm 包分发的 skill/claude/SKILL.md)。 */
|
|
10
|
+
export function skillSourcePath() {
|
|
11
|
+
return join(packageRoot(), "skill", "claude", "SKILL.md");
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* 把 SKILL.md 复制到目标 skill 目录(~/.claude/skills/wxpub/),幂等覆盖。
|
|
15
|
+
* 返回写入的文件路径。目标目录可注入,测试用。
|
|
16
|
+
*/
|
|
17
|
+
export function copySkillTo(targetDir) {
|
|
18
|
+
const src = skillSourcePath();
|
|
19
|
+
const content = readFileSync(src, "utf8");
|
|
20
|
+
// 规范自检:name 必须与目录名一致(agentskills.io spec)
|
|
21
|
+
const match = content.match(/^name:\s*(\S+)/m);
|
|
22
|
+
const name = match?.[1];
|
|
23
|
+
if (!name) {
|
|
24
|
+
throw new Error("SKILL.md 缺少 frontmatter name 字段(Agent Skills 规范必需)");
|
|
25
|
+
}
|
|
26
|
+
const dest = join(targetDir, name, "SKILL.md");
|
|
27
|
+
mkdirSync(join(targetDir, name), { recursive: true });
|
|
28
|
+
copyFileSync(src, dest);
|
|
29
|
+
return dest;
|
|
30
|
+
}
|
|
31
|
+
/** wxpub install:把 skill 装进 Claude Code(~/.claude/skills/wxpub/)。 */
|
|
32
|
+
export function runInstall(options) {
|
|
33
|
+
const targetRoot = join(homedir(), ".claude", "skills");
|
|
34
|
+
const dest = copySkillTo(targetRoot);
|
|
35
|
+
if (options.json) {
|
|
36
|
+
console.log(JSON.stringify({ installed: true, skill: dest }));
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
console.log(`✓ skill 已安装:${dest}`);
|
|
40
|
+
console.log(" 新会话生效(Claude Code 启动时发现个人技能)");
|
|
41
|
+
console.log(" 现在可以直接说「把这篇文章发到丹心」——agent 会走 tone→写→illustrate→publish 链路");
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=install.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install.js","sourceRoot":"","sources":["../../src/commands/install.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAChE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAElC,2CAA2C;AAC3C,SAAS,WAAW;IAClB,OAAO,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AACnE,CAAC;AAED,oDAAoD;AACpD,MAAM,UAAU,eAAe;IAC7B,OAAO,IAAI,CAAC,WAAW,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC;AAC5D,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,SAAiB;IAC3C,MAAM,GAAG,GAAG,eAAe,EAAE,CAAC;IAC9B,MAAM,OAAO,GAAG,YAAY,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IAC1C,0CAA0C;IAC1C,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;IAC/C,MAAM,IAAI,GAAG,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;IACxB,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;IACxE,CAAC;IACD,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC;IAC/C,SAAS,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACtD,YAAY,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IACxB,OAAO,IAAI,CAAC;AACd,CAAC;AAMD,qEAAqE;AACrE,MAAM,UAAU,UAAU,CAAC,OAAuB;IAChD,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;IACxD,MAAM,IAAI,GAAG,WAAW,CAAC,UAAU,CAAC,CAAC;IACrC,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACjB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QAC9D,OAAO;IACT,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,EAAE,CAAC,CAAC;IACnC,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC;IAC9C,OAAO,CAAC,GAAG,CAAC,6DAA6D,CAAC,CAAC;AAC7E,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -4,6 +4,7 @@ import { Command } from "commander";
|
|
|
4
4
|
import { WxpubApiError } from "./client.js";
|
|
5
5
|
import { runImage } from "./commands/image.js";
|
|
6
6
|
import { runIllustrate } from "./commands/illustrate.js";
|
|
7
|
+
import { runInstall } from "./commands/install.js";
|
|
7
8
|
import { runLogin } from "./commands/login.js";
|
|
8
9
|
import { runMaterials } from "./commands/materials.js";
|
|
9
10
|
import { runMe } from "./commands/me.js";
|
|
@@ -33,6 +34,12 @@ program
|
|
|
33
34
|
.action(async () => {
|
|
34
35
|
await runMe({ json: program.opts().json });
|
|
35
36
|
});
|
|
37
|
+
program
|
|
38
|
+
.command("install")
|
|
39
|
+
.description("把 wxpub skill 装进 Claude Code(~/.claude/skills/,agent 学会发文工作流)")
|
|
40
|
+
.action(() => {
|
|
41
|
+
runInstall({ json: program.opts().json });
|
|
42
|
+
});
|
|
36
43
|
program
|
|
37
44
|
.command("publish")
|
|
38
45
|
.description("投递 markdown 文章到公众号草稿箱")
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "wxpub-cli",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.1",
|
|
4
4
|
"description": "WeChat Official Account publishing CLI — markdown 直投公众号草稿箱(wechat-publish-service 客户端,API-Key 通道)",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
},
|
|
10
10
|
"files": [
|
|
11
11
|
"dist",
|
|
12
|
+
"skill",
|
|
12
13
|
"README.md",
|
|
13
14
|
"LICENSE"
|
|
14
15
|
],
|
|
@@ -23,7 +24,8 @@
|
|
|
23
24
|
"format:check": "prettier --check .",
|
|
24
25
|
"typecheck": "tsc --noEmit",
|
|
25
26
|
"test": "vitest run",
|
|
26
|
-
"prepublishOnly": "npm run lint && npm run typecheck && npm test && npm run build"
|
|
27
|
+
"prepublishOnly": "npm run lint && npm run typecheck && npm test && npm run build",
|
|
28
|
+
"eval": "node evals/run.mjs"
|
|
27
29
|
},
|
|
28
30
|
"keywords": [
|
|
29
31
|
"wechat",
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: wxpub
|
|
3
|
+
description: "公众号发文 CLI(wechat-publish-service 客户端)。当用户想把文章/markdown 发到微信公众号(草稿箱)、投稿到公众号、发到丹心/明灯/AI浪、按某号的调性写公众号文章、给公众号文章配图/生成插图、查公众号素材时使用。标准工作流:wxpub tone 拉调性 → 按调性写作 → wxpub illustrate 配图 → wxpub publish 投递草稿箱。只在用户明确要发文/投稿时调用;普通写作讨论不触发。"
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# wxpub — 公众号发文
|
|
7
|
+
|
|
8
|
+
`wxpub` 把 markdown 文章投到指定公众号的**草稿箱**(不群发;群发永远由用户在公众号后台人工完成)。渲染、主题、调性、AI 生图都在服务端,CLI 只做投递。
|
|
9
|
+
|
|
10
|
+
前置:`wxpub me` 检查登录态;未登录 → 让用户自己跑 `wxpub login`(设备流,浏览器批准)或提供 API Key。
|
|
11
|
+
|
|
12
|
+
## 快速决策(要做什么 → 跑哪条)
|
|
13
|
+
|
|
14
|
+
| 场景 | 命令 |
|
|
15
|
+
| -------------------------- | ----------------------------------------------------- |
|
|
16
|
+
| 给公众号写文章(先拉调性) | `wxpub --json tone -a <账号>` |
|
|
17
|
+
| 投递文章到草稿箱 | `wxpub --json publish -a <账号> -f <md文件>` |
|
|
18
|
+
| 给文章生成配图 | `wxpub --json illustrate -a <账号> -f <md文件>` |
|
|
19
|
+
| 上传本地图片做插图 | `wxpub --json image -a <账号> -f <图片>` |
|
|
20
|
+
| 查账号默认主题 / 素材 | `wxpub theme -a <账号>` / `wxpub materials -a <账号>` |
|
|
21
|
+
|
|
22
|
+
账号 key:`danxin`(码骨丹心,后端技术)/ `mingdeng`(明灯,生活指南)/ `ailang`(AI浪,科技解读)。
|
|
23
|
+
|
|
24
|
+
## 标准工作流(写文全链路)
|
|
25
|
+
|
|
26
|
+
1. `wxpub --json tone -a <账号>` —— 取 persona(主笔人设)+ style_rules(结构规则)+ 字数区间,**注入写作上下文后再动笔**;`tone:null` 表示该号未绑定,按用户口述要求写
|
|
27
|
+
2. 按调性写 markdown,存成文件(标题写进首个 `# 一级标题`,publish 会自动取)
|
|
28
|
+
3. 需要插图时 `wxpub --json illustrate -a <账号> -f 文章.md`,把返回的 `markdown` 字段(``)插到正文合适位置
|
|
29
|
+
4. `wxpub --json publish -a <账号> -f 文章.md` 投递,取 `media_id` 复命,并提醒用户:**已入草稿箱,群发请到公众号后台人工确认**
|
|
30
|
+
|
|
31
|
+
## ⚠️ 铁律(必守)
|
|
32
|
+
|
|
33
|
+
1. **写文前先拉调性**——要动笔写(而非原样转发现成稿)就必须先 `tone`,除非用户明说"不用管调性"。调性就是该号的人设,跳过=成稿风格不符。
|
|
34
|
+
2. **别改主题**:publish 永远不传 theme,账号在服务端配置的默认主题(丹心红/明灯绿/AI浪蓝)自动生效。
|
|
35
|
+
3. **illustrate 是同步长任务**(10-60 秒出图+上传),命令退出即完成——不要轮询、不要并行跑多个、失败读 message 决定是否换 prompt 重试一次。
|
|
36
|
+
4. **重复投递返回 `duplicate:true` 不是失败**——内容没变被幂等去重,草稿箱还是原来那篇。要强制新建草稿才加 `--force`(须用户明确要求)。
|
|
37
|
+
5. **成功判据看 `media_id`**:`{"ok":true,"media_id":"..."}` 才算投递成功;`ok:false` 或报错时把错误信息原样呈现给用户,不要自行猜测重试。
|
|
38
|
+
6. **只落草稿箱,绝不群发**——发完必须告知用户"请到公众号后台确认群发",不能宣称"已发布"。
|
|
39
|
+
7. 写长文(>2000 字)时给 digest(分享摘要,≤54 字);笔名用 `--author` 仅在用户明确指定时传。
|
|
40
|
+
|
|
41
|
+
## 回执判读(--json 输出)
|
|
42
|
+
|
|
43
|
+
| 命令 | 字段 | 含义 |
|
|
44
|
+
| ---------- | -------------------------------------------- | -------------------------------------------- |
|
|
45
|
+
| publish | `ok` / `media_id` / `duplicate` | 成功 / 草稿素材 id(复命凭证)/ 是否幂等去重 |
|
|
46
|
+
| tone | `tone` / `tone.persona` / `tone.style_rules` | null=未绑定 / 人设 / 结构规则 |
|
|
47
|
+
| illustrate | `url` / `markdown` / `media_id` | mmbiz 图址 / 现成插图片段 / 素材 id |
|
|
48
|
+
| image | `media_id` / `url` | 永久素材 id / 内嵌用图址 |
|
|
49
|
+
|
|
50
|
+
失败输出形如 `✗ 服务端返回 <code>:<人话原因>`——照原因行动(401=让用户重新 login;429=配额,明日恢复;5xx=稍后再试)。
|