{"_id":"@bestblogs/cli","_rev":"3-ee6a2b35908cc33c4d6698ea80b201a0","name":"@bestblogs/cli","dist-tags":{"latest":"2.0.8"},"versions":{"0.1.0":{"name":"@bestblogs/cli","version":"0.1.0","keywords":["bestblogs","cli","agent","openapi","reading","ai"],"author":{"name":"Gino","email":"hi@bestblogs.dev"},"license":"MIT","_id":"@bestblogs/cli@0.1.0","maintainers":[{"name":"ginobefun","email":"ginobefun@gmail.com"}],"homepage":"https://bestblogs.dev","bugs":{"url":"https://github.com/ginobefun/bestblogs-monorepo/issues"},"bin":{"bbcli":"dist/bestblogs.js","bestblogs":"dist/bestblogs.js"},"dist":{"shasum":"80f279f921e0c58f578790bc34dc389c329760f0","tarball":"https://registry.npmjs.org/@bestblogs/cli/-/cli-0.1.0.tgz","fileCount":4,"integrity":"sha512-NUuDKhLAVcFr0Tm4SZcpZ4ZexHIFKuLdTJNibFNb8MrOMEk7pX1fBu5YvvNG1L8SxvJVGaG8pqCgO/1/lop/IQ==","signatures":[{"sig":"MEQCIAbmM6JCW4uhQi1Lq7qFunBTusBVMkqNFx7ScttudNmOAiBuoLO4YDoVZUuafrW7dqx9xG4miapICu0VmpwBpKmLgw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":62432},"type":"module","engines":{"node":">=20"},"gitHead":"f00a3a6cfd107592dbcbe16518413daa677a9d63","scripts":{"dev":"tsx src/bin/bestblogs.ts","lint":"tsc --noEmit","test":"vitest run","build":"tsup src/bin/bestblogs.ts --format esm --target node20 --clean --no-splitting --shims","typecheck":"tsc --noEmit"},"_npmUser":{"name":"ginobefun","email":"ginobefun@gmail.com"},"repository":{"url":"git+https://github.com/ginobefun/bestblogs-monorepo.git","type":"git","directory":"bestblogs-cli"},"_npmVersion":"11.12.1","description":"BestBlogs command-line interface — agent-friendly reading workflow (intake → discover → read → capture) backed by the /openapi/v2/* contract.","directories":{},"_nodeVersion":"22.19.0","dependencies":{"ora":"^8.1.0","zod":"^3.23.8","conf":"^13.0.1","chalk":"^5.3.0","ofetch":"^1.3.4","prompts":"^2.4.2","commander":"^12.1.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.1","tsup":"^8.3.0","vitest":"^2.1.3","typescript":"^5.6.3","@types/node":"^22.7.5","@types/prompts":"^2.4.9"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.1.0_1776589790262_0.239817776012907","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@bestblogs/cli","version":"0.1.1","keywords":["bestblogs","cli","agent","openapi","reading","ai"],"author":{"name":"Gino","email":"hi@bestblogs.dev"},"license":"MIT","_id":"@bestblogs/cli@0.1.1","maintainers":[{"name":"ginobefun","email":"ginobefun@gmail.com"}],"homepage":"https://bestblogs.dev","bugs":{"url":"https://github.com/ginobefun/bestblogs-monorepo/issues"},"bin":{"bbcli":"dist/bestblogs.js","bestblogs":"dist/bestblogs.js"},"dist":{"shasum":"15c364e0a55f14fc7642e88c3b845fb0f95f9266","tarball":"https://registry.npmjs.org/@bestblogs/cli/-/cli-0.1.1.tgz","fileCount":4,"integrity":"sha512-i4qLjRSU7BQzgVTSH1sFn0rxbpCywHEMcV3sNIYE1DmK923tmxUL4CUtk5Fu4dS4dgKVEYi8jXV7Q03Iz9O83w==","signatures":[{"sig":"MEYCIQDv2WhutoLY6QkjrFO+taOfO4/Wlzv5GwW1zH9lxrA/VAIhAOD9EXFMhbny5ulk/HwGsaeSKPVGpCb8h08sOeDbEtOQ","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":66049},"engines":{"node":">=20"},"gitHead":"526fe74de9761e6ec4e45bb1c6a3a9d3a9d92c1b","scripts":{"dev":"tsx src/bin/bestblogs.ts","lint":"tsc --noEmit","test":"vitest run","build":"tsup","typecheck":"tsc --noEmit"},"_npmUser":{"name":"ginobefun","email":"ginobefun@gmail.com"},"repository":{"url":"git+https://github.com/ginobefun/bestblogs-monorepo.git","type":"git","directory":"bestblogs-cli"},"_npmVersion":"10.9.0","description":"BestBlogs command-line interface — agent-friendly reading workflow (intake → discover → read → capture) backed by the /openapi/v2/* contract.","directories":{},"_nodeVersion":"22.12.0","dependencies":{"ora":"^8.1.0","zod":"^3.23.8","conf":"^13.0.1","chalk":"^5.3.0","ofetch":"^1.3.4","prompts":"^2.4.2","commander":"^12.1.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.1","tsup":"^8.3.0","vitest":"^2.1.3","typescript":"^5.6.3","@types/node":"^22.7.5","@types/prompts":"^2.4.9"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.1.1_1776590070354_0.6766518082095385","host":"s3://npm-registry-packages-npm-production"}},"2.0.8":{"name":"@bestblogs/cli","version":"2.0.8","description":"BestBlogs command-line interface — agent-friendly reading workflow (intake → discover → read → capture) backed by the /openapi/v2/* contract.","bin":{"bestblogs":"dist/bestblogs.js","bbcli":"dist/bestblogs.js"},"engines":{"node":">=20"},"scripts":{"build":"tsup","dev":"tsx src/bin/bestblogs.ts","test":"vitest run","lint":"tsc --noEmit","typecheck":"tsc --noEmit"},"dependencies":{"commander":"^12.1.0","zod":"^3.23.8","ofetch":"^1.3.4","conf":"^13.0.1","chalk":"^5.3.0","ora":"^8.1.0","prompts":"^2.4.2"},"devDependencies":{"@types/node":"^22.7.5","@types/prompts":"^2.4.9","tsup":"^8.3.0","tsx":"^4.19.1","typescript":"^5.6.3","vitest":"^2.1.3"},"keywords":["bestblogs","cli","agent","openapi","reading","ai"],"publishConfig":{"access":"public"},"author":{"name":"Gino","email":"hi@bestblogs.dev"},"license":"MIT","homepage":"https://bestblogs.dev","repository":{"type":"git","url":"git+https://github.com/ginobefun/bestblogs-monorepo.git","directory":"bestblogs-cli"},"gitHead":"38d2621a802c07bda205e682faa203064ae05e49","_id":"@bestblogs/cli@2.0.8","bugs":{"url":"https://github.com/ginobefun/bestblogs-monorepo/issues"},"_nodeVersion":"22.19.0","_npmVersion":"11.12.1","dist":{"integrity":"sha512-/FsE94b4FCDXatJsFTGbFWpXGZhPSLFhHSFshPAosQk45pgrUYXaqTwr4/ubgqe8oCdgzg40toKYbN0hnJVLYQ==","shasum":"eb92c334c6c61ef5ddc31a2b925c93b3d4a899ae","tarball":"https://registry.npmjs.org/@bestblogs/cli/-/cli-2.0.8.tgz","fileCount":4,"unpackedSize":69721,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQC/6ny6eJDyu6i4nTqPIeDNQUBrO1KcQ7lM3oxvbTR8lgIgTwFLkRLQtwrYZagfMIWPTlo4ZdYOE9xwLnpSsSWtU+s="}]},"_npmUser":{"name":"ginobefun","email":"ginobefun@gmail.com"},"directories":{},"maintainers":[{"name":"ginobefun","email":"ginobefun@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/cli_2.0.8_1776663056968_0.21364157400564698"},"_hasShrinkwrap":false}},"time":{"created":"2026-04-19T09:09:50.204Z","modified":"2026-04-20T05:30:57.225Z","0.1.0":"2026-04-19T09:09:50.399Z","0.1.1":"2026-04-19T09:14:30.499Z","2.0.8":"2026-04-20T05:30:57.101Z"},"bugs":{"url":"https://github.com/ginobefun/bestblogs-monorepo/issues"},"author":{"name":"Gino","email":"hi@bestblogs.dev"},"license":"MIT","homepage":"https://bestblogs.dev","keywords":["bestblogs","cli","agent","openapi","reading","ai"],"repository":{"type":"git","url":"git+https://github.com/ginobefun/bestblogs-monorepo.git","directory":"bestblogs-cli"},"description":"BestBlogs command-line interface — agent-friendly reading workflow (intake → discover → read → capture) backed by the /openapi/v2/* contract.","maintainers":[{"name":"ginobefun","email":"ginobefun@gmail.com"}],"readme":"# @bestblogs/cli\n\nBestBlogs 命令行界面 — agent-friendly 阅读工作流（intake → discover → read → capture）。\n\n构建在 BestBlogs OpenAPI v2 之上，所有命令都有 `--json` 模式，便于被智能体（Claude Code、Cursor、OpenClaw 等）或 shell 管道消费。\n\n## 安装\n\n```bash\nnpm install -g @bestblogs/cli\n# 或免安装试用\nnpx @bestblogs/cli --help\n```\n\n装好后同时提供两个命令别名：\n\n- `bestblogs ...`（主命令）\n- `bbcli ...`（短别名，与 [GitHub Issue #108](https://github.com/ginobefun/bestblogs-monorepo/issues/108) 提案的命名对齐）\n\n## 三分钟上手\n\n```bash\n# 1. 登录（首次使用）— 打开 https://bestblogs.dev/settings/api-keys 复制 API Key 粘贴回来\nbestblogs auth login\n\n# 2. 冷启动设置（交互式，挑 3-8 个兴趣主题）\nbestblogs intake setup\n\n# 3. 看今天值得读什么\nbestblogs discover today --limit 20\n\n# 4. 挑一条深读（会自动回传已读行为）\nbestblogs read deep <resourceId>\n\n# 5. 收藏、加笔记\nbestblogs capture bookmark add <resourceId> --note \"值得反复读\"\nbestblogs capture highlight add -r <resourceId> -t \"精彩段落原文\" -n \"我的思考\"\n\n# 6. 回看\nbestblogs capture notes list\nbestblogs capture history list\n```\n\n## 命令速查\n\n| 命令 | 说明 |\n|---|---|\n| `bestblogs auth login / status / logout` | API Key 登录与切换环境 |\n| `bestblogs intake setup` | 引导完成 onboarding（兴趣标签 → 推荐源 → 完成） |\n| `bestblogs intake show` | 查看当前画像 |\n| `bestblogs discover today` | 今天最值得读的内容（Pro → my_brief, 非 Pro → public_brief，带回退链） |\n| `bestblogs discover for-you` | 个性化推荐流（Pro only） |\n| `bestblogs discover following` | 关注源内容流 |\n| `bestblogs discover search \"<q>\"` | 关键词搜索 |\n| `bestblogs discover trending [--period week]` | 热趋内容 |\n| `bestblogs discover newsletters [id]` | 浏览 / 查看周刊 |\n| `bestblogs read deep <id>` | 本地深读：meta + markdown + 自动回传 read |\n| `bestblogs capture bookmark add/list/update/remove` | 收藏 CRUD（add 幂等） |\n| `bestblogs capture highlight add/update/remove` | 划线 / 笔记 CRUD |\n| `bestblogs capture highlights` | 列出划线（`entryType=highlight`） |\n| `bestblogs capture notes` | 列出笔记（`entryType=note`，note 非空） |\n| `bestblogs capture history list/remove/clear` | 阅读历史 |\n| `bestblogs explain profile` | 画像摘要 |\n| `bestblogs explain sources --days 7` | 近 7 天关注源对早报的贡献 |\n| `bestblogs explain score <id>` | 资源评分摘要 |\n\n## 解释字段（Agent Native）\n\n`discover today / for-you / following`、`briefs/today / briefs/public/today` 返回的每条候选都带 4 个**解释字段**：\n\n| 字段 | 含义 |\n|---|---|\n| `candidateSource` | `my_brief` / `public_brief` / `for_you` / `following` / `public_brief_fallback` |\n| `selectionReason` | 一句话自然语言（≤50 字），如 \"匹配兴趣: AI Coding\" |\n| `fallbackApplied` | 是否走了降级回退路径 |\n| `personalized` | 是否经过个性化处理 |\n\nSkills / Agents 据此回答 \"这些内容从哪里来、为什么出现在这里\"。CLI 的 pretty 模式会以彩色徽标展示来源，JSON 模式原样透传。\n\n## 配置\n\n配置存在 `~/.bestblogs/config.json`（由 [`conf`](https://github.com/sindresorhus/conf) 管理），包含：\n\n```json\n{\n  \"baseUrl\": \"https://api.bestblogs.dev\",\n  \"apiKey\": \"bbk_xxx\",\n  \"outputFormat\": \"pretty\"\n}\n```\n\n环境变量覆盖优先级更高：\n\n- `BESTBLOGS_API_KEY`\n- `BESTBLOGS_BASE_URL`\n- `BESTBLOGS_OUTPUT=pretty|json`\n\n## 错误契约\n\n所有命令在失败时：\n\n- **pretty**：stderr 输出 `✗ CODE [httpStatus] 中文提示`\n- **`--json`**：stderr 输出 `{success:false,error:{code,httpStatus,message,retryable}}`\n- **退出码**：`1` 通用、`2` 认证、`3` 权限、`4` not-found、`5` 限流、`6` 5xx\n\n## 管道与自动化\n\n所有命令支持 `--json`，可以直接喂给脚本：\n\n```bash\n# 拿到今天的候选 id 列表\nbestblogs discover today --json | jq -r '.data.candidates[].resourceId'\n\n# 批量收藏\nbestblogs discover today --limit 5 --json \\\n  | jq -r '.data.candidates[].resourceId' \\\n  | xargs -I {} bestblogs capture bookmark add {}\n\n# 深读并把 Markdown 喂给 llm（示例用 anthropic CLI）\nbestblogs read deep <id> --markdown-only | anthropic \"summarize in 5 bullets\"\n```\n\n## 给 Agent 用\n\n参考 `bestblogs-skills/` 下的 `SKILL.md` 文件。每个 skill 通过 shell out 到本 CLI 实现原语封装，Agent 直接消费 CLI 的 `--json` 输出即可。\n\n## 开发\n\n```bash\nnpm install\nnpm run dev -- discover today --help    # ts-node dev 模式\nnpm run build                            # 产 dist/bestblogs.js\nnpm run typecheck                        # tsc --noEmit\n```\n\n## License\n\nMIT\n","readmeFilename":"README.md"}