zop-cli 0.2.0__py3-none-any.whl

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.
@@ -0,0 +1,96 @@
1
+ Metadata-Version: 2.4
2
+ Name: zop-cli
3
+ Version: 0.2.0
4
+ Summary: High-throughput Zotero CLI focused on batch operations and automation
5
+ Project-URL: Homepage, https://github.com/anomalyco/zop
6
+ Project-URL: Issues, https://github.com/anomalyco/zop/issues
7
+ Author: zop contributors
8
+ License-Expression: MIT
9
+ License-File: LICENSE
10
+ Keywords: batch,bibliography,cli,zotero
11
+ Classifier: Development Status :: 3 - Alpha
12
+ Classifier: Environment :: Console
13
+ Classifier: Intended Audience :: Developers
14
+ Classifier: Intended Audience :: Science/Research
15
+ Classifier: Operating System :: OS Independent
16
+ Classifier: Programming Language :: Python :: 3
17
+ Classifier: Programming Language :: Python :: 3.12
18
+ Classifier: Programming Language :: Python :: 3.13
19
+ Classifier: Topic :: Scientific/Engineering :: Information Analysis
20
+ Classifier: Topic :: Utilities
21
+ Requires-Python: >=3.12
22
+ Requires-Dist: click>=8.1
23
+ Requires-Dist: httpx>=0.27
24
+ Requires-Dist: platformdirs>=4.2
25
+ Requires-Dist: pydantic>=2.7
26
+ Requires-Dist: pypdf>=4.0
27
+ Description-Content-Type: text/markdown
28
+
29
+ # zop
30
+
31
+ 一个面向批量操作和自动化场景的高吞吐 Zotero 命令行工具。
32
+
33
+ ## 安装
34
+
35
+ 从 PyPI 安装(推荐):
36
+
37
+ ```bash
38
+ uv tool install zop-cli
39
+ ```
40
+
41
+ 也可用 pipx:`pipx install zop-cli`,或 pip:`pip install zop-cli`。安装后命令名为 `zop`。
42
+
43
+ 开发安装(可编辑,含开发依赖):
44
+
45
+ ```bash
46
+ uv sync
47
+ ```
48
+
49
+ 贡献与维护流程见 [CONTRIBUTING](CONTRIBUTING.md)。
50
+
51
+ ## 配置
52
+
53
+ 新建 `~/.config/zop/config.toml`:
54
+
55
+ ```toml
56
+ [zotero]
57
+ data_dir = "D:\\Program Data\\zotero"
58
+ library_id = "12345"
59
+ api_key = "your-api-key"
60
+ ```
61
+
62
+ 读取操作走本地 SQLite(`data_dir/zotero.sqlite`),写入操作走 Zotero Web API。
63
+ 读取无需联网,也不需要 API key。
64
+
65
+ ## 用法
66
+
67
+ ```bash
68
+ zop collection list # 列出所有集合
69
+ zop collection list --tree # 以父子树形展示
70
+ zop collection items ABC12345 # 列出某集合下的条目
71
+ zop collection create "新主题" # 创建集合
72
+ zop collection create "子主题" --parent "新主题"
73
+ zop collection delete ABC12345 # 删除集合(级联)
74
+ zop collection reparent ABC12345 --parent "新父级"
75
+ zop collection move KEY1 KEY2 --to TARGET_KEY # 移动条目
76
+ zop collection plan plan.json --dry-run # 校验批量计划
77
+ zop collection plan plan.json --execute # 执行批量计划
78
+ ```
79
+
80
+ ## Agent skill
81
+
82
+ 为 AI 编程助手(Claude Code、Codex、Cursor 等)配套了一个 [agent skill](https://skills.sh),教 agent 如何调用 `zop`、解析 JSON 信封输出、以及批量 plan 的 dry-run → execute 流程:
83
+
84
+ ```bash
85
+ npx skills add kingdomad/zop --skill zop -a claude-code -y
86
+ ```
87
+
88
+ 详见 [`skills/zop/SKILL.md`](skills/zop/SKILL.md)。
89
+
90
+ ## 与 `zot` 的差异
91
+
92
+ - **真正的批量**:创建集合使用 Zotero 的批量 POST(每请求 50 条)
93
+ - **有界并发 PATCH**:移动条目使用并行 PATCH(默认 8 路并发),而非逐条顺序调用
94
+ - **真正的 dry-run**:`zop collection plan --dry-run` 会实际检查名称冲突、父级解析与条目存在性
95
+ - **reparent 支持**:`zop collection reparent` 可用(`zot` 未暴露此能力)
96
+ - **单条失败隔离**:批量移动中某一条失败不会中断整批任务
@@ -0,0 +1,38 @@
1
+ zop/__init__.py,sha256=ns8jmOAnU9Iq8JItUFgkBoNG6VmqXrnD-lcjshShl6s,135
2
+ zop/__main__.py,sha256=8H4Wr1IAx949PM5HK4qik_a0T-UcmMvGpIy6aDGjSEc,94
3
+ zop/_version.py,sha256=7kZd0zWTTxXB7wYISCOS43fXQclUAMLnbp3cPcY-4_M,79
4
+ zop/cli.py,sha256=E282OG6WkDPvCafLoVG1sCW59lsTVXgtfTb3WXqoVKM,2438
5
+ zop/adapters/__init__.py,sha256=Jh5niQ2A9iNYKnUkl67lc29CSgBjmKC--HSmR6KeORY,198
6
+ zop/adapters/sqlite_reader.py,sha256=ihOSCetgJUyIHsUMB2OH80eJkont7yM90WAKSHSA8qw,21855
7
+ zop/adapters/zotero_api.py,sha256=IJiTqH3jTdE8-W4GmakJF9n3sEJXwh8tHB8C-j8NicY,11479
8
+ zop/commands/__init__.py,sha256=iakb6km3pA8C9SQ-aveM1-KKs0GrkHWlNGmzehjTQvo,478
9
+ zop/commands/collection.py,sha256=56lxO5SlTZEAVE6ChT_bv90WC1J6zUxtPGfLl7KyPSA,7012
10
+ zop/commands/export.py,sha256=tQs1cjsvAg82nmrjCuS2_yLOuBzGyl0_CnlyKuRizQY,2181
11
+ zop/commands/item.py,sha256=BbrAYtBjcwT48hLTZFbqFJYCU0Cx7AlbMXvmEMDyVk4,5205
12
+ zop/commands/library.py,sha256=Ik9Qm_LTNrGIK2xyX5C89KeXgaktSeHiHRiokTel3_Y,1816
13
+ zop/commands/note.py,sha256=rnSi8pXoPA9OphwdZLlFy3WVl9bbgu0y37mgYItYgEE,1908
14
+ zop/commands/pdf.py,sha256=DC5SVnn0feJsAb4VqWVjP8Iahl31yuS7vh3_kFNlLuI,1994
15
+ zop/commands/tag.py,sha256=h9D7x3o62DPJiibwUqmafUeO4bvPVTx74tN6yRwapxY,2636
16
+ zop/core/__init__.py,sha256=OKAZRdl4WAecXL2A4OnQ6kbrZfcZG8fML_C8cu0ZWIU,151
17
+ zop/core/concurrency.py,sha256=1JOcuCkdk4UIa_6nytZbDWhHtLiIFt1MLp4qYA2bziM,1005
18
+ zop/core/config.py,sha256=DyStmdne6lEixpFxkSV9VzhfumyMa--9jNbzj9GSvfQ,1774
19
+ zop/core/envelope.py,sha256=XlAxD1gDOMCaCSj0S9We42jiMoIdxTx7cvjELvYexyk,2108
20
+ zop/core/errors.py,sha256=CkMhdRJA6hMwJwXwH3bT80bwWr216_11weQA2SLLp2M,2262
21
+ zop/models/__init__.py,sha256=lxxjtoukCRQBwxXW4dw1C6_o_xecrN3geG6tSuk7lCc,356
22
+ zop/models/collection.py,sha256=9JV4i8xR2EpbkXCtFPLaUqJ-qc3uC71CTHAUMEhIt1g,1154
23
+ zop/models/common.py,sha256=nNpbMzMdaVNJvQgJtqRHbOAw6iyRd-4qAwJ-89Rrp_A,732
24
+ zop/models/envelope.py,sha256=u6Yl0tsRVR52FHxhElUnGAWXdM3JGM8XAKEwWC_sA0Q,1475
25
+ zop/models/item.py,sha256=MvCvDjvavlfcuv3a3Hr9jklJdMBUg2r3BnPVJDQu0pg,934
26
+ zop/services/__init__.py,sha256=6eKoltqrUNGsMG1iRH-Vg4wa5Cu6q6O1TJAmpgpkGug,527
27
+ zop/services/collections.py,sha256=aJ4NbD_QLK6kKfVWsZRGQpoDEpeYWcyQpuJzpfSamoQ,12809
28
+ zop/services/export.py,sha256=hq3tZOrP1j6sluE4zLlGK_9Vt1BAsf1bS4iyTXtLPco,5675
29
+ zop/services/items.py,sha256=9ompwwHYne1gWx10VfEmGOwx-CMC3EO2YT2pocdnL24,5214
30
+ zop/services/library.py,sha256=hkdvv6JrZHfq83OO1c_tX2zY39bNCVw5wYmhFNxey5U,917
31
+ zop/services/notes.py,sha256=SbOfye4AF0kZcfIR4-pVIGDTtuGlSfU213o9MGwUMco,1505
32
+ zop/services/pdf.py,sha256=u6ZCy3pAWOfYCnhcjiDrjI750zJtbKfA1o_w7t6q1LU,4987
33
+ zop/services/tags.py,sha256=01uwx7DmAX5c5RUdzeJrKPhKPDS5oTQDyFRbS8NLpeY,3547
34
+ zop_cli-0.2.0.dist-info/METADATA,sha256=R-fwUrPf7Or0-wbOSCtYuQUocLoEXv06ZOyRIoogtqs,3194
35
+ zop_cli-0.2.0.dist-info/WHEEL,sha256=mffPy8wBnZQn2VnJUU5jE99KsxaSfiyMHV9Yt0aLVxs,87
36
+ zop_cli-0.2.0.dist-info/entry_points.txt,sha256=Un6Yp9BK68-vEImDp8i1KGvRY-VNz7EBgFbGAxsflgg,37
37
+ zop_cli-0.2.0.dist-info/licenses/LICENSE,sha256=XDRzKxl8xWoch1lP0lLXRnrk-7Pmz9MkErHsH82Xipg,1073
38
+ zop_cli-0.2.0.dist-info/RECORD,,
@@ -0,0 +1,4 @@
1
+ Wheel-Version: 1.0
2
+ Generator: hatchling 1.30.1
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
@@ -0,0 +1,2 @@
1
+ [console_scripts]
2
+ zop = zop.cli:main
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 zop contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.