@getnote/cli 1.5.0 → 1.5.2

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 CHANGED
@@ -10,13 +10,21 @@
10
10
 
11
11
  ### 让本地 AI 自动完成安装(推荐)
12
12
 
13
- 适用于 Codex、Claude Code 和 Cursor:
13
+ 适用于 WorkBuddy、Codex、Claude Code 和 Cursor:
14
14
 
15
15
  ```bash
16
16
  npx -y @getnote/cli@latest setup
17
17
  ```
18
18
 
19
- 这条命令会安装 CLI、识别本机支持的平台、安装五个原子 Skill,并引导完成一次得到大脑授权。安装后运行:
19
+ 这条命令会把 CLI 安装到稳定的全局路径、识别本机支持的平台、安装五个原子 Skill,并引导完成一次得到大脑授权。检测到 WorkBuddy 时,会把 Skills 安装到 `~/.workbuddy/skills/`;安装完成后需要完全退出并重新打开 WorkBuddy。
20
+
21
+ 如果只想安装到 WorkBuddy,可明确指定:
22
+
23
+ ```bash
24
+ npx -y @getnote/cli@latest setup --target workbuddy
25
+ ```
26
+
27
+ 安装后运行:
20
28
 
21
29
  ```bash
22
30
  getnote doctor -o json
@@ -379,6 +387,9 @@ $ getnote search "工作日志" --limit 7 -o json
379
387
 
380
388
  | 日期 | 版本 | 新能力 | 适合怎么用 |
381
389
  |------|------|--------|------------|
390
+ | 2026-08-14 | **v1.5.2** | 1. 补齐团队知识库、订阅知识库与文件夹操作的执行边界<br>2. 明确目录、资源及笔记 ID 的结构化结果字段,避免 AI 猜字段<br>3. 搜索结果按字符串 `note_id` 去重,不把同一笔记的多个命中片段重复展示<br>4. 完善“这条笔记”、录音分享与权限失败的安全处理 | 提升 CLI 内置 Skills 在知识库整理、搜索和笔记管理场景中的理解与执行准确度;本次不改变既有 CLI 命令和授权凭证 |
391
+ | 2026-08-13 | **v1.5.1** | 1. 修复通过 `npx setup` 安装后命令指向临时 npm 缓存的问题<br>2. 同时提供稳定的 `getnote` / `gnote` 双命令<br>3. 自动把五个领域 Skill 安装到 WorkBuddy<br>4. 重复安装保留已有授权凭证 | 在 WorkBuddy、Codex、Claude Code 或 Cursor 中重复执行同一条安装命令即可修复或升级,不需要重新授权 |
392
+ | 2026-08-13 | **v1.5.0** | 1. 支持浏览、创建、移动和删除知识库目录<br>2. 笔记可直接加入指定目录,支持已有团队知识库 `TEAMSPACE` 的成员读取与管理员维护<br>3. 支持订阅抖音博主并读取博主内容<br>4. 新增录音原文、链接原文、附件、时间线、快捷笔记和会议待办等一级命令<br>5. 完善结构化结果、错误原因、短命令、`doctor` 和升级检查 | 让人和 AI 用同一套命令完成知识库整理、资料归档和深层笔记读取;失败时能识别原因,不再猜参数或把未完成任务当成成功 |
382
393
  | 2026-08-11 | **v1.4.0** | 1. Skill 2.0 稳定执行契约<br>2. 所有子命令完整 `-h` / `--help`<br>3. `getnote update --check` 与升级引导<br>4. `--content-file` / `--stdin` 安全保存长文本 | 让独立 Skill 和 CLI 内置原子 Skills 共用同一套真实命令,降低 AI 猜参数和长内容转义失败的概率 |
383
394
  | 2026-04-23 | **v1.1.1** | 1. 笔记内链<br>2. 保存分享链接自动变笔记 | 1. 用内链串联每天的工作日志和项目笔记,实践时间日志法<br>2. 收到别人发来的分享链接直接存入笔记 |
384
395
  | 2026-04-16 | **v1.1.0** | 1. `getnote note share`:生成分享链接<br>2. `getnote kb live-follow`:订阅得到直播 | 1. 把笔记一键分享给朋友<br>2. 在知识库里订阅得到直播课,直播结束后 AI 摘要自动入库 |
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@getnote/cli",
3
- "version": "1.5.0",
3
+ "version": "1.5.2",
4
4
  "description": "CLI tool for 得到大脑(Get笔记) — manage notes and knowledge bases from the terminal",
5
5
  "keywords": [
6
6
  "getnote",
@@ -75,9 +75,6 @@ async function main() {
75
75
  fs.chmodSync(binaryPath, 0o755);
76
76
  console.log(`getnote installed at ${binaryPath}`);
77
77
 
78
- // `getnote` is linked directly to the downloaded binary. The compact
79
- // `gnote` alias is provided by package.json and uses bin/getnote.js.
80
- createSymlink(binaryPath, binaryName);
81
78
  } catch (err) {
82
79
  console.error('Failed to install getnote:', err.message);
83
80
  process.exit(1);
@@ -87,23 +84,3 @@ async function main() {
87
84
  }
88
85
 
89
86
  main();
90
-
91
- // Create a symlink in the npm global bin directory after download.
92
- // npm only creates the symlink at install time when the file already exists;
93
- // since we download the binary in postinstall, we need to do it ourselves.
94
- function createSymlink(binaryPath, binaryName) {
95
- try {
96
- const npmPrefix = execSync('npm prefix -g', { encoding: 'utf8' }).trim();
97
- const globalBin = path.join(npmPrefix, 'bin');
98
- const symlinkPath = path.join(globalBin, binaryName);
99
-
100
- if (fs.existsSync(globalBin)) {
101
- try { fs.unlinkSync(symlinkPath); } catch (_) {}
102
- fs.symlinkSync(binaryPath, symlinkPath);
103
- console.log(`Symlink created: ${symlinkPath} -> ${binaryPath}`);
104
- }
105
- } catch (err) {
106
- // Non-fatal: user can run the binary directly or add it to PATH manually
107
- console.warn(`Could not create symlink (you may need to add ${path.dirname(binaryPath)} to PATH): ${err.message}`);
108
- }
109
- }
@@ -14,7 +14,7 @@ description: 查看和管理得到大脑的默认知识库、书籍、客户档
14
14
  | 意图 | 命令入口 |
15
15
  |---|---|
16
16
  | 自有/可管理知识库 | `getnote kbs` |
17
- | 订阅知识库 | `getnote kbs-sub` |
17
+ | 我订阅的知识库 | `getnote kbs-sub` |
18
18
  | 知识库笔记 | `getnote kb <topic_id>` |
19
19
  | 新建个人知识库 | `getnote kb create` |
20
20
  | 加入笔记 | `getnote kb add` |
@@ -35,15 +35,16 @@ description: 查看和管理得到大脑的默认知识库、书籍、客户档
35
35
 
36
36
  ## 选择知识库和权限
37
37
 
38
- 1. 先执行 `getnote kbs -o json`,保留全部真实 Scope:`DEFAULT`、`BOOKSPACE`、`CUSTOMER`、`TEAMSPACE`,不能只返回默认知识库。
39
- 2. 按名称和 `scope` 匹配;同名或用户意图不明确时让用户选择,不猜 `topic_id`。
40
- 3. 订阅知识库通常只读。团队知识库(`TEAMSPACE`)成员可以读取;只有接口返回具备维护权限的拥有者或管理员才能创建目录、加入笔记或订阅内容。
41
- 4. 普通成员写入失败时明确说明权限不足,不尝试绕过。当前不代替用户新建团队知识库。
38
+ 1. 用户问“我管理的/我的知识库”时执行 `getnote kbs -o json`;问“所有能访问的知识库”时还要执行 `getnote kbs-sub -o json`,分别标明自有/可管理与已订阅,按各自 `has_more` 翻完页,不能混成同一种权限。
39
+ 2. `getnote kbs` 必须保留接口实际返回的全部 Scope,例如 `DEFAULT`、`BOOKSPACE`、`CUSTOMER`、`TEAMSPACE`,不能只返回默认知识库,也不能虚构未返回的 Scope。
40
+ 3. 按名称和 `scope` 匹配;同名或用户意图不明确时让用户选择,不猜 `topic_id`。目标名称既可能是知识库也可能是文件夹时,先问清楚。
41
+ 4. 订阅知识库通常只读。若列表结果明确返回角色或可写标记,按真实字段判断;当前 CLI 契约未保证权限字段时,不得声称已经预检为 owner/admin,可在用户明确授权后尝试写入,并忠实处理权限失败。
42
+ 5. 普通成员写入失败时明确说明权限不足,不尝试绕过。当前不代替用户新建团队知识库。
42
43
 
43
44
  ## 文件夹和归档流程
44
45
 
45
46
  1. 用户要求放入文件夹时,用 `gnote kb dir <topic_id> -o json` 读取根目录或指定目录。
46
- 2. 已有文件夹使用返回的真实 `directory_id`;缺失时先询问是否创建,再用 `mkdir`。
47
+ 2. 已有文件夹使用 `data.directories[].id` 返回的真实目录 ID;浏览指定目录时把该值传给 `--directory-id`。缺失时先询问是否创建,再用 `mkdir`。
47
48
  3. `getnote kb add` 同时传真实 `topic_id`、字符串 `note_id` 和 CLI 帮助中规定的目录参数。
48
49
  4. 每批最多 20 条。移出笔记和删除目录必须先确认;删除目录还必须由 CLI/服务校验为空。
49
50
  5. 移动或重命名时只改变用户指定项,未指定的名称或父目录保持不变。
@@ -64,7 +65,7 @@ description: 查看和管理得到大脑的默认知识库、书籍、客户档
64
65
  | `getnote kb create <name> -o json` | `success=true`、`data?` | 仅创建个人知识库;不得在没有返回 ID 时虚构 `topic_id`。 |
65
66
  | `getnote kb add <topic_id> <note_id…> -o json` | `success=true`、`data?` | 最多 20 条;需要确认最终目录归属时重新读取目录。 |
66
67
  | `getnote kb remove <topic_id> <note_id…> --yes -o json` | `success=true`、`data?` | 最多 20 条;先确认,再说明已从该知识库移出。 |
67
- | `gnote kb dir <topic_id> -o json` | `success=true`、`data.current_directory?`、`directories[].id/name`、`resources[]`、`total` | 只使用返回的 `directory_id`;旧环境回退 `getnote kb directories`。 |
68
+ | `gnote kb dir <topic_id> -o json` | `success=true`、`data.current_directory?`、`directories[].id/name`、`resources[].id/directory_id/note_id?/name/type/status`、`total` | 目录主键读取 `directories[].id`;资源归属读取 `resources[].directory_id`,笔记资源用 `resources[].note_id` 验证;旧环境回退 `getnote kb directories`。 |
68
69
  | `gnote kb mkdir <topic_id> --name <name> -o json` | `success=true`、`data?` | 也兼容位置参数 `<name>`;二者不可同时使用。若需给出新目录 ID 或层级,随后重新读取目录。 |
69
70
  | `gnote kb mvdir <topic_id> <directory_id> … -o json` | `success=true`、`data?` | 只确认用户指定的改名/移动;需要最终名称或父级时重新读取目录。 |
70
71
  | `gnote kb rmdir <topic_id> <directory_id> --yes -o json` | `success=true`、`data?` | 只删除空目录;说明已删除前必须拿到业务成功。 |
@@ -82,6 +83,7 @@ description: 查看和管理得到大脑的默认知识库、书籍、客户档
82
83
 
83
84
  - `kbs`、`kbs-sub`、`kb`、`dir`、博主和直播的空列表都是成功结果:如实说“目前没有”,不要自动创建知识库、目录或订阅。
84
85
  - `kb create`、`kb add`、`mkdir`、`mvdir` 等写操作的 `data` 可能因服务版本不同而不提供完整对象。只在 `success=true` 时确认动作已提交;若要向用户返回新目录 ID、最终层级或笔记归属,必须紧接着重新读取 `gnote kb dir` 或 `getnote kb <topic_id>`,不能猜字段。
85
- - `kb add` 即使请求成功,也不能把“已发起加入”说成“已进入某个目录”;只有重新读取后出现对应 `note_id` / `directory_id` 才能展示最终归属。
86
+ - `kb add` 即使请求成功,也不能把“已发起加入”说成“已进入某个目录”;只有重新读取后在 `resources[]` 的同一项出现对应字符串 `note_id` 和 `directory_id`,才能展示最终归属。
86
87
  - `kb remove`、`rmdir` 前必须有用户明确确认并带 `--yes`;若 `reason=knowledge_directory_not_empty`,明确提示“目录非空,请先移出内容或删除子目录”,不要原请求重试。其它失败也应说明真实原因和下一步,绝不宣称已删除。
87
88
  - 用户给的团队知识库不在 `getnote kbs` 返回中时,先说明当前账号没有访问权限;不能把个人知识库同名项替代成团队知识库。
89
+ - “这条笔记”只能复用当前会话中已经由 CLI 返回并验证过的字符串 `note_id`。没有可靠上下文时先请用户提供笔记 ID;不能从不受支持的私有链接、标题或雪花 ID 数值转换中猜测。
@@ -71,7 +71,7 @@ description: 使用得到大脑保存文字、链接、图片和长笔记,查
71
71
  ## 查询和深层读取
72
72
 
73
73
  1. “最近、列表、有哪些”使用 `getnote notes`;“找、搜、关于某主题”交给搜索 Skill。
74
- 2. 用户给出 ID 或私有笔记链接时读取详情;雪花 ID 全程按字符串原样传递。
74
+ 2. 用户给出 ID 时直接读取详情;雪花 ID 全程按字符串原样传递。“这条笔记”只复用当前会话中已经由 CLI 返回并验证过的字符串 ID。当前 CLI 若不能直接接收某种私有链接,就先请用户提供 ID,不能自行截取、猜测或转成数字。
75
75
  3. 列表先展示标题、字符串 ID 和真实 `note_url`,用户选择后再读取全文。
76
76
  4. 不确定笔记类型时先读 `getnote note <id> -o json`:
77
77
  - 链接/文字原文:`original`;
@@ -87,7 +87,8 @@ description: 使用得到大脑保存文字、链接、图片和长笔记,查
87
87
  1. 先读取目标笔记和当前版本,确认用户指向的对象。
88
88
  2. 追加或前置内容必须使用 CLI 当前帮助中对应的增量语义,不用覆盖模拟追加。
89
89
  3. 覆盖正文、替换全部标签、删除和公开分享必须先确认;确认后才使用 `--yes`。
90
- 4. 用户未要求公开时只返回私有 `note_url`,不自动生成分享链接。
90
+ 4. 分享录音类笔记时,确认话术必须说明公开链接是否包含音频;用户不希望公开音频时使用 CLI 帮助中的 `--exclude-audio`。不能替用户默认决定音频公开范围。
91
+ 5. 用户未要求公开时只返回私有 `note_url`,不自动生成分享链接。
91
92
 
92
93
  ## 每条命令的结果与回复格式
93
94
 
@@ -19,6 +19,7 @@ description: 在得到大脑的全部笔记或指定知识库中按自然语言
19
19
  2. 用户指定知识库名称时,先执行 `getnote kbs -o json`,用返回的真实 `topic_id` 和 `scope` 匹配;同名、多个团队知识库或意图不明确时必须让用户选择。
20
20
  3. 已确认知识库后执行 `getnote search <query> --kb <topic_id> --limit <1-10> -o json`。
21
21
  4. 只从返回值读取标题、摘要、字符串 `note_id` 和真实 `note_url`。没有 `note_id/note_url` 的非笔记结果可以展示内容,但不能伪造“打开笔记”链接。
22
+ 5. 同一篇笔记可能因命中多个片段出现多次。面向用户列“几篇笔记”时必须按字符串 `note_id` 去重;若去重后不足用户要求的数量,可在上限 10 内增大 `--limit` 重搜,仍不足时如实返回实际数量。
22
23
 
23
24
  ## 命令结果与用户呈现
24
25