watcha-cli 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/package.json ADDED
@@ -0,0 +1,66 @@
1
+ {
2
+ "name": "watcha-cli",
3
+ "version": "0.1.0",
4
+ "description": "观猹 (watcha.cn) 命令行客户端:搜产品、读猹评、AI 搜索、Markdown 发布、产品方自助;人和 AI agent 共用,非 TTY 默认 JSON,随包附带 Agent Skill",
5
+ "keywords": [
6
+ "watcha",
7
+ "观猹",
8
+ "猹评",
9
+ "cli",
10
+ "command-line",
11
+ "ai-agent",
12
+ "agent-skills",
13
+ "claude-code",
14
+ "codex",
15
+ "ai-products",
16
+ "reviews",
17
+ "community",
18
+ "markdown",
19
+ "prosemirror"
20
+ ],
21
+ "homepage": "https://watcha.cn",
22
+ "bugs": {
23
+ "email": "support@watcha.cn"
24
+ },
25
+ "author": "观猹 (https://watcha.cn)",
26
+ "license": "SEE LICENSE IN LICENSE",
27
+ "type": "module",
28
+ "bin": {
29
+ "watcha": "./bin/watcha.js"
30
+ },
31
+ "files": [
32
+ "bin",
33
+ "dist/index.js",
34
+ "skills",
35
+ "README.md",
36
+ "LICENSE",
37
+ "THIRD-PARTY-NOTICES.txt"
38
+ ],
39
+ "engines": {
40
+ "node": ">=22"
41
+ },
42
+ "publishConfig": {
43
+ "access": "public"
44
+ },
45
+ "scripts": {
46
+ "build": "node scripts/build.mjs",
47
+ "dev": "tsx src/index.ts",
48
+ "typecheck": "tsc -p tsconfig.json --noEmit",
49
+ "test": "vitest run",
50
+ "test:contract": "WATCHA_CONTRACT_TEST=1 vitest run test/contract",
51
+ "prepack": "pnpm build"
52
+ },
53
+ "devDependencies": {
54
+ "@types/mdast": "^4.0.4",
55
+ "@types/node": "^26.2.0",
56
+ "commander": "^15.0.0",
57
+ "esbuild": "^0.28.2",
58
+ "mdast-util-from-markdown": "^2.0.3",
59
+ "tsx": "^4.23.12",
60
+ "typescript": "^7.0.2",
61
+ "vitest": "^4.1.11"
62
+ },
63
+ "optionalDependencies": {
64
+ "@napi-rs/keyring": "^1.3.0"
65
+ }
66
+ }
@@ -0,0 +1,118 @@
1
+ ---
2
+ name: watcha
3
+ description: 用 watcha CLI 逛观猹(watcha.cn,中文 AI 产品评价社区):搜产品/猹评/帖子、AI 搜索问口碑、看榜单与活动、点赞收藏关注,以及在用户审阅确认后用 Markdown 发帖/发猹评/回复/投反馈、给自己的产品生成徽章与口碑统计。触发词:观猹、watcha、猹评、猹馆、AI 产品口碑、这个 AI 工具评价怎么样。Use when the user mentions watcha.cn / 观猹, asks what Chinese users think of an AI product, wants community reviews or reputation data for an AI tool, or wants to search or post on the Watcha community.
4
+ license: SEE LICENSE IN LICENSE
5
+ compatibility: Requires the watcha CLI on PATH (npm i -g watcha-cli, Node >= 22) and network access to watcha.cn
6
+ metadata:
7
+ help: "watcha --help"
8
+ schema: "watcha schema --json"
9
+ allowed-tools: Bash(watcha *)
10
+ ---
11
+
12
+ # watcha CLI
13
+
14
+ 观猹是一个中文 AI 产品评价社区:用户给 AI 产品写「猹评」(带推荐/不推荐表态的评价,只有通过晋级考试的「观猹员」能发),在「猹馆」发帖讨论,产品库叫「图鉴」。`watcha` 是它的命令行客户端,**非 TTY 下默认输出 JSON**,专为 agent 调用设计。
15
+
16
+ ## 先读这两条
17
+
18
+ ```bash
19
+ watcha schema --json # 全部命令、参数、全局选项、输出契约、退出码、环境变量,一次读完;requires_yes 标出哪些是写操作
20
+ watcha auth status # 有没有登录、能不能发猹评(这条以退出码 0 报告状态,是否登录看 data.logged_in)
21
+ ```
22
+
23
+ ## 输出契约(判成功只看这个)
24
+
25
+ - 成功:stdout `{"ok":true,"data":...,"meta"?:{...}}`,退出码 0
26
+ - 失败:stderr `{"ok":false,"error":{"type","code"?,"status"?,"message","hint"?,"details"?}}`,退出码非 0。拼错命令名、缺参数、裸跑分组命令(如 `watcha product`)同样是这个信封、退出码 3
27
+ - **不要用 data 里的任何字段判断成败**(唯一例外是 `auth status` 的 `data.logged_in`);`error.hint` 里写了下一步该做什么,照做即可
28
+ - 退出码:0 成功 · 1 通用 · 2 未登录 · 3 参数/内容不合法 · 4 需要确认 · 5 限流 · 6 需要去网页过验证码 · 7 网络 · 8 无权限 · 9 不存在
29
+ - `--dry-run`:写命令不发请求,stdout 是 `{"ok":true,"data":{"dry_run":true,"request":{method,url,headers,body}}}`(Authorization 已脱敏)。注意未登录时会先拿到退出码 2,`--dry-run` 不能绕过登录
30
+ - 列表命令:`--limit 1-100`、`--skip N` 或 `--page N`;翻页只看 `meta.has_more`(多数端点不给 `total`,有才出现;末页刚好满页时可能多翻一次空页)。`--format ndjson` 一行一条
31
+ - 只在 json / ndjson 下有 JSON 信封;`--format pretty|table` 是给人看的,错误也是人话文本。非 TTY 默认就是 json,不要手动切 pretty
32
+ - 进度提示全部走 stderr,stdout 只有数据
33
+
34
+ ## 登录
35
+
36
+ 读操作(搜索、产品、猹评、帖子、榜单、活动、用户主页)**不需要登录**。AI 搜索、互动、发布需要。
37
+
38
+ ```bash
39
+ watcha auth login # 默认:微信小程序码,终端显示或弹出图片,用户用手机微信扫
40
+ watcha auth login --sms --phone 138xxxx # 短信验证码(交互式输码;非交互要同时带 --code)
41
+ watcha auth login --refresh-token <jwt> # 导入浏览器登录态:watcha.cn → DevTools → Local Storage → watcha.refreshToken
42
+ WATCHA_REFRESH_TOKEN=<jwt> watcha ... # CI/agent:环境变量,不落盘
43
+ watcha auth logout # 释放登录槽位
44
+ ```
45
+
46
+ 登录是给人做的动作:agent 遇到退出码 2 时,把 `error.hint` 原样告诉用户,让用户自己完成登录,不要替用户猜验证码。**观猹每个账号最多 5 个登录态(Web/App/CLI 共用,按最久未用踢出)**,不要反复登录。遇到退出码 6(验证码)同样交给用户去浏览器处理。
47
+
48
+ ## 常见任务
49
+
50
+ ```bash
51
+ # 找产品 / 看口碑
52
+ watcha search "做 PPT 的 AI" # 混排搜索:产品/猹评/帖子/用户
53
+ watcha search "AI 搜索" --domain product --score-gte 8 --order-by score:desc
54
+ watcha product show claude-code # 详情(id 或 slug 都行)
55
+ watcha product reviews claude-code --limit 20 # 猹评,带 👍/👎 表态
56
+ watcha product posts claude-code # 相关帖子
57
+ watcha review show 27222 && watcha review replies 27222 --all
58
+
59
+ # 让观猹的 AI 基于社区内容回答(需登录,每分钟 2 次,一次约 1-2 分钟)
60
+ watcha ask "Claude Code 和 Codex 哪个更适合写 Swift" --json # 结束后一次性给 content/tool_calls
61
+ watcha ask "..." --format ndjson # 逐帧
62
+ watcha ask --resume <sessionId> "x" # 续传/回放
63
+ # 被 Claude Code / Codex / Cursor / OpenClaw 等 agent 调用且请求已被服务端接受时,ask 会把实时视图开到用户终端的新窗口
64
+ # (成功返回里 viewer.opened 为 true;流中途出错时在 error.details 里)。请告诉用户"回答正在新窗口里实时显示";
65
+ # 不要为了让用户看到过程而改用 ndjson 刷屏。30 秒内只会自动开一次窗,CI 里不开;用户不想弹窗就加 --no-watch
66
+
67
+ # 逛
68
+ watcha post list --limit 20 / watcha post show 13431 / watcha post floors 13431
69
+ watcha topic hot / watcha topic posts 44
70
+ watcha rank week_product_hot_reviewed --top 10 # 榜单 key 用 watcha rank 列出
71
+ watcha activity list --city 杭州 / watcha activity show <slug>
72
+ watcha user show 10094883 / watcha user reviews 10094883
73
+ watcha feed --limit 10
74
+
75
+ # 轻互动(需登录;立即生效、对方可见,--undo 是另一次写操作而不是撤销)
76
+ watcha like review 27222 --yes / watcha like post 13431 --undo --yes
77
+ watcha favorite post 13431 --yes / watcha follow 10094883 --yes / watcha react post 13431 🎉 --yes
78
+ ```
79
+
80
+ 点赞、收藏、关注、表情、投票、订阅、标记全部已读都是写操作:**只在用户明确要求时做,做之前说一句要做什么**。非交互环境不带 `--yes` 会返回退出码 4;不要替用户「顺手」点赞或关注。
81
+
82
+ ## 发布(必须先给用户看,再加 --yes)
83
+
84
+ ```bash
85
+ watcha draft preview --md post.md # 本地转换 + 校验,零请求:看标题宽度、正文宽度、图片、问题清单
86
+ watcha post create --md post.md --yes [--topic 44,53] [--product claude-code] [--image a.png b.png]
87
+ watcha review create --product claude-code --vote good --md review.md --yes
88
+ watcha reply review 27222 --text "同感,尤其是…" --yes
89
+ watcha reply post 13431 --parent 5678 --md reply.md --yes
90
+ watcha feedback "描述问题或建议" --type bug --yes # 投到观猹站内反馈(type: bug | feature | content | other)
91
+ ```
92
+
93
+ 规则(CLI 内置,不要试图绕过):
94
+
95
+ - 写操作没带 `--yes` 时返回退出码 4 `confirmation_required`。**agent 的正确流程是:先 `draft preview`,把标题和正文摘要展示给用户,用户明确同意后再在原命令末尾加 `--yes`**。不要在用户没看过内容时自行加 `--yes`
96
+ - 只做用户要求的那一条。CLI 没有批量/循环发布命令,60 秒内第 3 条会被本地拦下(后端限 2 条/分钟,超限会触发运营告警)
97
+ - 发猹评需要观猹员资格(`auth status` 的 `can_create_review`);没有就告诉用户去 watcha.cn/exam 考试或用邀请码,**不要**改发帖子绕过
98
+ - 正文是 Markdown(CommonMark,`~~删除线~~` 不会解析):支持标题、列表、引用、代码块、加粗/斜体/行内代码/链接、图片,标题里的图片会拆成独立的图;帖子首行 `# 标题` 自动当标题(≤32 个汉字宽度,半角算 0.5);猹评正文 ≥15 个汉字宽度;Markdown 里的本地图片和外链图片都会自动上传到观猹的对象存储
99
+ - 发布后 CLI 会回查状态:`status 2` 表示被 AI 审核折叠(别人看不到),把原因告诉用户;`status 0` 是审核中
100
+ - 如果内容主要由 AI 生成,加 `--ai-assisted` 在文末追加披露行;是否加由用户决定
101
+
102
+ ## 产品方(自己的产品)
103
+
104
+ ```bash
105
+ watcha product mine # 我提交的 / 我是成员的产品
106
+ watcha product badge claude-code --theme dark # 可贴 GitHub README 的徽章 Markdown(--as html|url)
107
+ watcha product stats claude-code --weeks 12 # 口碑统计:推荐比、按周趋势、最近猹评
108
+ watcha product launch claude-code --title "v1.2" --md changelog.md --yes
109
+ watcha product update claude-code --slogan "..." --yes
110
+ ```
111
+
112
+ ## 其他
113
+
114
+ - `watcha api GET /products --query limit=3`:没有对应命令时直接调 `/api/v2` 端点;路径不对时 4xx 的 `error.message` 会说明,先用 GET 试探,不要用它绕过发布护栏
115
+ - `--dry-run`:写操作只打印将发送的请求(形状见上面的输出契约)
116
+ - 在 Codex 里遇到退出码 7「沙箱已禁用网络访问」:Codex 默认断网,把 `error.hint` 里的放开方式告诉用户,不要反复重试
117
+ - `--profile <name>` / `WATCHA_PROFILE`:多账号。**除非用户明确要求,不要切换或删除 profile**
118
+ - 榜单、活动、话题等字段由后端决定,CLI 原样透传 `data`;pretty 模式只是人类可读摘要