TagSpaces 6.13.9 常用 CLI 命令与工具详解
TagSpaces 官方 CLI @tagspaces/shell(tscmd)4.8.10 六命令(indexer/thumbgen/metacleaner/tag/describe/search)全参数实测详解:tsi/tsft 索引结构、CJK 切词、增量索引陷阱、rename/sidecar 双打标法与排障实录,回显逐行照抄。
TagSpaces 6.13.9 常用 CLI 命令与工具详解
目标:讲清 TagSpaces 官方命令行工具
@tagspaces/shell(可执行命令tscmd,版本 4.8.10)的六个子命令——indexer(索引)、thumbgen(缩略图)、metacleaner(旁车清理)、tag(打标)、describe(描述)、search(检索)——的参数与真实行为,包括索引文件结构、中日韩(CJK)切词、增量索引陷阱与排障实录。全部命令与回显均在本地容器实测照抄。
一、环境信息
- 操作系统:Linux x86_64;工具运行容器:
node:22-slim(Node.js 22) - 工具与版本:
@tagspaces/shell@4.8.10(npm 全局安装,实测npm ls -g回显+-- @tagspaces/shell@4.8.10;tscmd --version回显4.8.10) - 安装方式:
npm install -g @tagspaces/shell(npm 包名),安装后提供可执行命令tscmd - 工作目录:宿主
/opt/data/quzuo/tmp/tagspaces/cliwork(挂载进容器/work,下文命令均以docker exec -w /work tagspaces-6.13.9-tscmd tscmd ...形式执行,等价于在容器内/work下直接敲tscmd ...) - 实验语料(
/work/docs/初始状态):memo.txt(内容plain memo text)note.md(内容:# 项目笔记/Q1 收入增长 20%。)photo.jpg(188 字节的 1×1 JPEG)report[finance 2026 invoice].pdf(内容为文本fake-pdf-content,非真实 PDF——用于演示非法 PDF 的处理)
- 语料说明:
.pdf/.jpg为实验最小样张;后文按实验顺序推进,tag改名、新增todo.md/logo.png、删除 report 等变更均会在对应小节注明
二、工具概览
tscmd --help 实测回显(全文照抄):
████████╗ █████╗ ██████╗ ███████╗██████╗ █████╗ ██████╗███████╗███████╗
██╔══╝██╔══██╗██╔════╝ ██╔════╝██╔══██╗██╔══██╗██╔════╝██╔════╝██╔════╝
██║ ███████║██║ ███╗███████╗██████╔╝███████║██║ █████╗ ███████╗
██║ ██║ ██║╚════██║██╔═══╝ ██╔══██║██║ ██╔══╝ ╚════██║
██║ ██║╚██████╔╝███████║██║ ██║ ██║╚██████╗███████╗███████║
╚═╝ ╚═╝ ╚═╝ ╚═════╝ ╚═════╝╚═╝ ╚═╝ ╚═╝ ╚═════╝╚══════╝╚══════╝
tscmd v4.8.10 — TagSpaces CLI for indexing, thumbnails, tagging & more
Usage: tscmd <command> [options] <dir...>
Commands:
tscmd thumbgen <dirs...> Generate thumbnails for files in one or more
directories
tscmd indexer <dirs...> Create a search index for one or more directories
tscmd metacleaner <dirs...> Remove obsolete sidecar files and thumbnails
tscmd tag <paths...> Add tags to files or folders
tscmd describe <paths...> Set description on files or folders
tscmd search <dir> Search a directory's index for matching files
Options:
-h, --help Show help [boolean]
-v, --version Show version number [boolean]
Quick reference:
thumbgen -p, --pdf Include PDF thumbnails
indexer -f, --fulltext Extract full-text content (MD, HTML, TXT, PDF)
-l, --links Extract links from content (requires --fulltext)
--force Force full re-index (skip incremental)
metacleaner -a, --analyze Dry-run mode (default: true)
tag -t, --tags Tags to add (space-separated)
-m, --method "rename" (default) or "sidecar"
describe -d, --description Description text to set
-f, --file Read description from a file
search -q, --query Query; +tag=AND, -tag=NOT, |tag=OR
-t, --tags Extra AND tags (merged with +tag in -q)
--type File type group (e.g. images, documents)
-s, --search-type fuzzy (default), semistrict, or strict
-n, --max-results Maximum number of results (default: 100)
Run tscmd <command> --help for full details on a specific command.
六个子命令与 TagSpaces 元数据体系的对应关系:
| 命令 | 产物/作用 | 落盘位置 |
|---|---|---|
indexer | 生成目录索引:条目+标签索引、全文分词索引 | .ts/tsi.json、.ts/tsft.jsonl |
thumbgen | 为图片(可用 -p 扩展到 PDF)生成缩略图 | .ts/<文件名>.jpg |
metacleaner | 清理「过时」的旁车/缩略图(默认干跑) | 删除 .ts/ 下被判定过时的文件 |
tag | 打标签:改名法(默认)或旁车法 | 文件名 / .ts/<文件名>.json(文件夹为 .ts/tsm.json) |
describe | 写描述(旁车法) | .ts/<文件名>.json 的 description 字段 |
search | 查询目录索引(全文 + 标签过滤),只读 | 不落盘 |
💡 技术拓展:
tsi.json是「目录里有哪些文件、各自有什么标签/描述」的条目索引;tsft.jsonl是逐行 JSON 的全文分词索引(每行{"p":"文件名","t":"分词结果"})。Web 版浏览器搜索消费的正是这两个文件(索引有效期由位置参数maxIndexAge控制,见本专栏《TagSpaces 6.13.9 配置参数详解》)。
三、前置条件
- Node.js 环境(实测 22)与全局安装:
npm install -g @tagspaces/shell; - 一个待管理的文件目录(本文
/work/docs);目录权限需允许改名(tag改名法会重命名文件)与创建.ts/子目录; - 理解两种打标落盘机制(改名 vs 旁车)——见本专栏《TagSpaces 介绍与选型指南》第二章;
- 无需任何账号/密钥:
tscmd全部命令面向本地文件系统目录,不直接操作 S3(S3 桶里的索引由 Web 版浏览器生成,或把桶同步到本地处理后回传)。
四、各工具详解
4.1 indexer:索引生成
indexer --help 实测回显(横幅与总帮助一致,此处略):
tscmd indexer <dirs...>
Create a search index for one or more directories
Options:
-h, --help Show help [boolean]
-f, --fulltext Extract full-text content from files (MD, HTML, TXT, PDF)
[boolean] [default: false]
-l, --links Extract links from file content (requires --fulltext)
[boolean] [default: false]
--force Force full re-index (skip incremental)
[boolean] [default: false]
-v, --version Show version number [boolean]
实验 1:全量索引(含全文)。 语料为初始 4 个文件:
tscmd indexer docs --fulltext --force
实测回显:
Skipping PDF extraction: report[finance 2026 invoice].pdf (Not a valid PDF file)
✔ Index generated: docs
4 files, 0 folders
259 B total size
2 files with fulltext, 19 tokens
0.0s elapsed
行为解读:非法 PDF 被跳过并给出原因(跳过不报错、不中断);4 个文件全部进 tsi.json,其中 memo.txt 与 note.md 的文本可提取(report.pdf 是假 PDF 无文本、photo.jpg 是图片),故 2 files with fulltext。
产物结构实测——tsi.json(单条条目示例,note.md 携带 description 元数据):
{"name":"note.md","path":"note.md","meta":{"description":"Q1 项目笔记,含收入数据"},"isFile":true,"size":38,"lmdt":1793507733960.9722,"cdt":1793507733960.9722,"uuid":"e23ff212669d46389819d0b6eadebe95","extension":"md"}
tsft.jsonl 全文索引(逐行照抄,可观察 CJK 切词):
{"p":"memo.txt","t":"plain memo text"}
{"p":"note.md","t":"项目 目笔 笔记 项 目 笔 记 q1 收入 入增 增长 收 入 增 长 20。"}
💡 说明:对中文内容
# 项目笔记 Q1 收入增长 20%。,切词输出为二元组(项目/目笔/笔记、收入/入增/增长)与一元单字(项/目/笔/记…)的混合——这是 CJK 文本无需分词器也能命中多字词的实现方式;英文按整词(plain memo text)。
实验 2:增量索引陷阱(重点)。 新增一个文件后不带 --force 再跑:
printf '# 待办
明天验证 TagSpaces 索引增量行为。
' > docs/todo.md
tscmd indexer docs --fulltext
实测回显:
Incremental index: 1 added, 0 modified, 0 deleted, 4 unchanged
Skipping PDF extraction: report[finance 2026 invoice].pdf (Not a valid PDF file)
✔ Index updated: docs
incremental: +1 ~0 -0 =4
5 files, 0 folders
313 B total size
1 files with fulltext, 23 tokens
0.0s elapsed
增量后 tsft.jsonl 实际内容:
{"p":"todo.md","t":"待办 办明 明天 天验 验证 待 办 明 天 验 证 tagspaces 索引 引增 增量 量行 行为 索 引 增 量 行 为"}
⚠️ 陷阱确认:tsi.json 正确更新为 5 个文件(+1 ~0 -0 =4),但 tsft.jsonl 被整体重写为只含本次变更文件(1 files with fulltext)——未变更文件的全文索引全部丢失。此目录内用 search 搜旧文件全文将查不到。
实验 3:--force 修复。
tscmd indexer docs --fulltext --force
实测回显:
Skipping PDF extraction: report[finance 2026 invoice].pdf (Not a valid PDF file)
✔ Index generated: docs
5 files, 0 folders
313 B total size
3 files with fulltext, 42 tokens
0.0s elapsed
tsft.jsonl 恢复为 3 行(memo.txt、note.md、todo.md)。结论:改动目录内容后,凡用到 --fulltext,一律加 --force 全量重建(本例语料毫秒级完成,代价可忽略)。
4.2 thumbgen:缩略图生成
thumbgen --help 实测回显(横幅略):
tscmd thumbgen <dirs...>
Generate thumbnails for files in one or more directories
Options:
-h, --help Show help [boolean]
-p, --pdf Include PDF thumbnails [boolean] [default: false]
-v, --version Show version number [boolean]
实验 4:错误路径(对初始语料直接跑)。
tscmd thumbgen docs
实测回显:
unsupported thumb format:txt
unsupported thumb format:md
unsupported thumb format:pdf
unsupported thumb format:md
Unable to resize docs/photo.jpg due to an error: ya [vips::Error]: unable to call thumbnail_buffer
VipsJpeg: Bogus Huffman table definition
VipsJpeg: Bogus Huffman table definition
VipsJpeg: Bogus Huffman table definition
at rb (/usr/local/lib/node_modules/@tagspaces/shell/node_modules/wasm-vips/lib/vips-node.js:106:466)
...(wasm 调用栈数行,略)
ga: 4463448
}
✔ Thumbnails generated: docs
行为解读:① 不支持缩略图的扩展名逐个打印 unsupported thumb format:<ext> 后跳过;② 4.8.10 内置 wasm-vips 解码图片(栈中可见 wasm-vips 路径),本实验的 1×1 JPEG 样张虽被 file 识别为 JFIF,但编码不合法,vips 抛 VipsJpeg: Bogus Huffman table definition;③ 单个文件失败不影响整体任务,结尾仍打印汇总行。
实验 9:成功路径。 用合法 PNG(base64 解码出的 1×1 PNG)重跑:
echo 'iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9awAAAABJRU5ErkJggg==' | base64 -d > docs/logo.png
tscmd thumbgen docs
ls docs/.ts/ | grep logo
实测回显:
✔ Thumbnails generated: docs
logo.png.jpg
产物命名规则:.ts/<完整文件名>.jpg(logo.png → .ts/logo.png.jpg)。缩略图生成本地完成、无需 sharp 等外部原生依赖(npm ls -g 确认全局仅 @tagspaces/shell 一个包,见 FAQ Q4)。
4.3 tag:打标签(改名法 / 旁车法 / 文件夹)
tag --help 实测回显(横幅略):
tscmd tag <paths...>
Add tags to files or folders
Options:
-h, --help Show help [boolean]
-t, --tags Tags to add [array] [required]
-m, --method Tagging method: "rename" embeds tags in filename, "sidecar"
writes to .ts/*.json
[string] [choices: "rename", "sidecar"] [default: "rename"]
-v, --version Show version number [boolean]
实验 5:改名法(默认)。
tscmd tag docs/memo.txt -t work demo
ls docs/
实测回显:
Renaming file: /work/docs/memo.txt to /work/docs/memo[work demo].txt
✔ Tagged (rename): memo.txt → memo[work demo].txt
memo[work demo].txt
note.md
photo.jpg
report[finance 2026 invoice].pdf
todo.md
标签以空格分隔的多值写进文件名方括号段:memo.txt → memo[work demo].txt(标签段位置由 ExtFilenameTagPlacedAtEnd 约定,默认尾部)。
实验 6:旁车法。
tscmd tag docs/note.md -t project -m sidecar
cat docs/.ts/note.md.json
实测回显:
Creating directory: /work/docs/.ts
✔ Tagged (sidecar): /work/docs/note.md +project
{
"description": "Q1 项目笔记,含收入数据",
"tags": [
{
"title": "project",
"type": "sidecar"
}
]
}
旁车 JSON 的 tags 数组逐个追加 {"title":..., "type":"sidecar"} 条目;description 字段保持不动(Creating directory: 提示在 .ts 已存在时也会打印,无害)。
实验 7:给文件夹打标。
tscmd tag docs -t docs -m sidecar
ls docs/.ts/
实测回显(节选):
✔ Tagged (sidecar): /work/docs +docs
note.md.json
photo.jpg.json
report[finance 2026 invoice].pdf.json
tsft.jsonl
tsi.json
tsm.json ← 新增
文件夹的元数据落在目录自身 .ts/tsm.json(区别于文件的 .ts/<文件名>.json)。
两种打标法对比:
| 维度 | rename(默认) | sidecar |
|---|---|---|
| 落盘位置 | 文件名方括号段 | .ts/<文件名>.json |
| 文件名 | 被修改(变长) | 不变 |
| 适用面 | 本地文件系统 | 本地 + 对象存储(S3 对象无法改名,Web 版配 persistTagsInSidecarFile: true) |
| 肉眼可见性 | 任何文件管理器直接可见 | 需应用或读 JSON |
4.4 describe:写描述
describe --help 实测回显(横幅略):
tscmd describe <paths...>
Set description on files or folders
Options:
-h, --help Show help [boolean]
-d, --description Description text (supports \n for newlines, use "-" to read
from stdin) [string]
-f, --file Read description from a file (e.g., description.md)[string]
-v, --version Show version number [boolean]
实验 8: 对改名后的文件写描述:
tscmd describe 'docs/memo[work demo].txt' -d '工作备忘:验证 describe'
cat 'docs/.ts/memo[work demo].txt.json'
实测回显:
Creating directory: /work/docs/.ts
✔ Description set: /work/docs/memo[work demo].txt
"工作备忘:验证 describe"
{
"description": "工作备忘:验证 describe"
}
描述只走旁车机制(不碰文件名),产物 JSON 仅含 description 键;-f 可从文件读长描述,-d 支持 \n 换行。
4.5 search:索引检索
search --help 实测回显(横幅略):
tscmd search <dir>
Search a directory's index for matching files
Options:
-h, --help Show help [boolean]
-q, --query Query string. Bare words = fulltext. Prefixes: +tag (AND),
-tag (NOT), |tag (OR). e.g. "notes +work -draft |urgent"
[string] [default: ""]
-t, --tags Tags to match (AND logic, merged with +tag from -q)
[array] [default: []]
--type File type group: any, images, documents, notes, audio,
video, archives, bookmarks, ebooks, emails, folders, files,
untagged [string] [default: "any"]
-s, --search-type Search accuracy: fuzzy, semistrict, or strict
[string] [choices: "fuzzy", "semistrict", "strict"] [default: "fuzzy"]
-n, --max-results Maximum number of results [number] [default: 100]
-v, --version Show version number [boolean]
查询语法:裸词=全文检索;+tag=必须含该标签、-tag=排除、|tag=或(多标签时空格分隔)。先重索引让 tsi.json 反映 4.3/4.4 的改名与新文件(tscmd indexer docs --fulltext --force,回显 6 files, 0 folders / 3 files with fulltext, 42 tokens),再逐项实测:
实验 11:全文检索。
tscmd search docs -q memo
实测回显(全文照抄,含内部调试输出):
Searching 6 entries in: /work/docs
PreparingIndex: 0.527ms
fuse query: memo
fuse: 1.584ms
Results found: 1
Results sent: 1
searchtime: 2.464ms
Found 1 result(s):
memo[work demo].txt [work demo] (16 B)
结果行的 [work demo] 即文件名解析出的标签。大小写不敏感——-q MEMO 回显 fuse query: MEMO,结果相同(Found 1 result(s))。CJK 全文:-q 收入 命中 note.md [project] (38 B)(依赖 4.1 的二元切词,搜「收入」可命中「收入增长」)。
实验 12:标签过滤(AND)。 tscmd search docs -q +vacation(photo.jpg 此前已带旁车标签 vacation/berlin)实测回显(节选):
filterByTags results: 1
Results found: 1
Found 1 result(s):
photo.jpg [vacation berlin] (188 B)
-t 参数等价:tscmd search docs -t vacation 回显与上面相同。
实验 13:排除(NOT)。 ⚠️ 直接写 -q -vacation 会踩坑(见下),正确姿势用等号传值:
tscmd search docs --query=-vacation
实测回显(节选):
filterByTags results: 5
Results found: 5
Found 5 result(s):
logo.png (70 B)
memo[work demo].txt [work demo] (16 B)
note.md [project] (38 B)
report[finance 2026 invoice].pdf [finance 2026 invoice] (17 B)
todo.md (54 B)
实验 14:或(OR)。 多个 |tag 用空格分隔:
tscmd search docs -q '|vacation |finance'
实测回显(节选):
filterByTags results: 2
Found 2 result(s):
photo.jpg [vacation berlin] (188 B)
report[finance 2026 invoice].pdf [finance 2026 invoice] (17 B)
实验 15:类型分组。 tscmd search docs --type notes(notes=md/mdown/txt/html,见配置篇 5.7)回显(节选):
Found 3 result(s):
memo[work demo].txt [work demo] (16 B)
note.md [project] (38 B)
todo.md (54 B)
实验 16:模糊 vs 严格。 -q memoo(fuzzy 默认)实测回显(节选):
fuse query: memoo
Found 1 result(s):
memo[work demo].txt [work demo] (16 B)
加 -s strict 后 Found 变为 No results found.——fuzzy 允许近似词,strict 要求精确。
实验 17:结果数上限。 tscmd search docs -q 'e' -n 1 实测回显(节选):
Results found: 6
Results sent: 1
Found 1 result(s):
logo.png (70 B)
(Results found 是命中总数,Results sent/展示数受 -n 截断。)
4.6 metacleaner:旁车与缩略图清理
metacleaner --help 实测回显(横幅略):
tscmd metacleaner <dirs...>
Remove obsolete sidecar files and thumbnails
Options:
-h, --help Show help [boolean]
-a, --analyze Dry-run: list files to remove without deleting them (set to
false to delete) [boolean] [default: true]
-v, --version Show version number [boolean]
实验 18-19:制造孤儿 sidecar 后干跑。 删除 report[finance 2026 invoice].pdf 本体(其旁车 .ts/report[finance 2026 invoice].pdf.json 成为孤儿),默认干跑:
rm 'docs/report[finance 2026 invoice].pdf'
tscmd metacleaner docs
实测回显:
[dry-run] cleaned: docs/.ts/logo.png.jpg
✔ Done cleaning: docs
实验 20:真删(--analyze false)与终态核对。
tscmd metacleaner docs --analyze false
ls docs/.ts/
实测回显:
[delete] cleaned: docs/.ts/logo.png.jpg
✔ Done cleaning: docs
memo[work demo].txt.json
note.md.json
photo.jpg.json
report[finance 2026 invoice].pdf.json
tsft.jsonl
tsi.json
tsm.json
实测结论(4.8.10 真实行为,两项都与直觉相反):
- 孤儿 sidecar 没有被清理——
.ts/report[finance 2026 invoice].pdf.json在真删后依然存在(干跑与真删均未列出它); - 合法缩略图反而被判定为过时——
logo.png本体仍在,其缩略图.ts/logo.png.jpg被标记并删除。
实验 23:可复现性验证。 重新生成缩略图后再干跑,行为一致:
tscmd thumbgen docs # 回显 ✔ Thumbnails generated: docs(logo.png.jpg 重建)
tscmd metacleaner docs # 回显 [dry-run] cleaned: docs/.ts/logo.png.jpg
生产建议:把 metacleaner 当「需人工复核的工具」而非定时清理任务——先干跑审阅清单、再决定是否 --analyze false;孤儿 sidecar 需自行比对 .ts/*.json 与目录实际文件清单处理(或升级版本后复测)。--analyze 默认 true(干跑)是安全设计,真删必须显式传 --analyze false。
五、注意事项
- 索引不会自动更新:
tag/describe/删除文件都不改索引。实测:删除 report 后未重索引时,tscmd search docs -q finance仍命中已不存在的report[finance 2026 invoice].pdf [finance 2026 invoice] (17 B)(回显Found 1 result(s))——检索结果以tsi.json为准,增删改文件后必须重跑indexer --force; - 增量
--fulltext会丢旧全文(4.1 实验 2):tsi.json增量正确、tsft.jsonl被重写为仅含变更文件;凡用全文索引一律--force; -q传-开头的排除标签会被 yargs 截获:-q -vacation中-v被解析成版本号,实测直接打印4.8.10退出;排除/或标签用等号或引号+空格形式传:--query=-vacation、-q '|a |b';|tag是标签维度过滤:filterByTags调试输出表明 OR 走标签过滤而非全文关键词——裸词才全文检索(实验 14 与实验 11 的内部阶段输出不同);- 命令级错误不中断批处理:thumbgen 对坏图打印错误后继续,结尾仍
✔汇总;解析汇总行不能代替逐文件核对(对坏样张要人工确认); - rename 打标会改文件名:依赖原文件名的脚本/硬链接/同步工具会受影响;对象存储场景改用
-m sidecar; metacleaner默认干跑:-a, --analyze默认true,真删须显式--analyze false(见 4.6 的两项反直觉实测)。
六、常见问题
Q1:为什么搜索中文「收入增长」能命中,搜「增长」也命中,但搜英文大小写有区别吗?
大小写无区别:-q memo 与 -q MEMO 结果一致(实验 11 实测,fuse 查询层归一)。中文命中的前提是索引时带 --fulltext 且查询词与切词结果重叠(二元+一元混合切词,见 4.1 的 tsft.jsonl 实例);未建全文索引(或不带 -f)时裸词查询命中不了文件内容。
Q2:增量索引后旧文件的全文搜不到了?
4.1 实验 2 的陷阱:indexer --fulltext(不带 --force)增量更新时 tsft.jsonl 只保留本次变更文件的分词。用 tscmd indexer <dir> --fulltext --force 全量重建即恢复(实验 3 实测 3 files with fulltext)。
Q3:search 的 |tag 为什么搜不到我想要的关键词?
| 前缀作用于标签(OR 过滤),不是全文关键词。全文检索用裸词(-q '关键词'),标签过滤用 +/-/|;组合语义见 --help 示例 "notes +work -draft |urgent"(类型组 + 必含标签 + 排除标签 + 或标签)。
Q4:运行 thumbgen 前需要先安装 sharp 吗?
不需要。官方 README 提及 sharp 的说明对应旧版本;4.8.10 实测内置 wasm-vips(4.2 错误栈可见 node_modules/wasm-vips/...),npm ls -g 全局仅 @tagspaces/shell@4.8.10 一个包时缩略图正常生成。本实验容器无外网,npm install -g sharp 执行无输出且未安装成功,thumbgen 仍工作正常——sharp 可选、非必需。
Q5:metacleaner 为什么删了我的缩略图、却留下孤儿 sidecar?
4.8.10 的实测行为(实验 18-23):孤儿 sidecar 不在其清理范围,而新近生成的缩略图可能被判定为「过时」标记删除,且行为可复现、输出不解释判定原因。因此不要把它当无人值守的定时清理用:先干跑审阅 [dry-run] cleaned: 清单;孤儿 sidecar 按目录清单自行比对删除。此行为与工具名暗示的「Remove obsolete sidecar files」预期有差距,升级版本时建议复测。
Q6:-q -vacation 打印 4.8.10 就退出了,怎么传「排除标签」?
yargs 把 -vacation 的开头 -v 解析成了版本参数(实测回显 4.8.10)。用等号形式:tscmd search docs --query=-vacation;多标签用引号加空格:-q '|vacation |finance'。
七、参考链接
- npm 包主页(@tagspaces/shell):https://www.npmjs.com/package/@tagspaces/shell
- TagSpaces 源码仓库:https://github.com/tagspaces/tagspaces
- 官方文档站(tagging/architecture 行为依据):https://docs.tagspaces.org/
- 本专栏实测系列:《TagSpaces 介绍与选型指南》、《TagSpaces 6.13.9 Docker Compose 部署指南》、《TagSpaces 6.13.9 配置参数详解》