@morehao/dsh-skills-console 0.3.8 → 0.4.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/README.md CHANGED
@@ -6,57 +6,55 @@
6
6
  [![check](https://github.com/morehao/dsh-skills-console/actions/workflows/check.yml/badge.svg)](https://github.com/morehao/dsh-skills-console/actions/workflows/check.yml)
7
7
  [![license](https://img.shields.io/npm/l/@morehao/dsh-skills-console.svg)](LICENSE)
8
8
 
9
- DSH(DeepSeek Harness)的**技能控制台**:装、更新、删除、接入其他 Agent、随时启停,外加一份订阅清单。
9
+ DSH(DeepSeek Harness)的技能控制台:**装、更新、删除、启停、导出到其他 Agent,外加一份订阅清单**。
10
10
 
11
- 它不搬技能。技能真身由插件内的 **native installer** 写进 `~/.agents/skills`,并维护 v3 lock;本插件只在 DSH 这一侧做控制台:决定**哪些技能、对谁、在哪一层可见**,并把每次改动做成可回滚的事务。安装、更新、删除都由 native installer 完成,不依赖 `skills` CLI 或系统 git。
11
+ 它把本机技能收进一张清单:有哪些、从哪来、谁能用、是不是最新。要用的打开,不用的关掉;别的 Agent 需要,一键建链过去——技能本体始终只有一份。
12
12
 
13
13
  ## 为什么需要它
14
14
 
15
- - **两份目录,一个真身**:技能装在 `~/.agents/skills`;DSH 默认同时扫描 `~/.dsh/skills`(rank 400)和 `~/.agents/skills`(rank 500)。插件负责在 DSH 侧建软链,不复制文件、不产生第二份真相。
16
- - **一份技能,多个 Agent**:Claude Code / Cursor / Codex … 各自只认自己的 `skills` 目录。勾一次,分别建链,之后装新技能也能按偏好自动接入。
17
- - **装完不是结束**:上游仓库一直在动。插件按 commit 比对,先给出「会影响哪些技能」的计划,再让你决定更新。
18
- - **停用 ≠ 删掉**:关掉 DSH 侧链接,文件和其他 Agent 的接入原样保留;注意 canonical 本身仍在 DSH 的扫描根里,彻底隐藏需要 provider 覆盖层(尚未实现)。
19
- - **删错还能救**:删除前先快照进回收站(保留 7 天),更新失败自动回滚上一版。
15
+ - **一个地方管所有技能**:装好的和本机已有的技能都在同一张清单里,来源、版本、接入的 Agent、更新时间一眼看清,不用去翻目录。
16
+ - **按需启停,省上下文**:暂时用不上的技能一键停用,DSH 的模型调用与 `/` 手动调用立刻看不到它,再打开就恢复;磁盘上的技能、导出关系、其他 Agent 都不受影响。
17
+ - **一份技能,多个 Agent**:多数 Agent(OpenCode、Cursor、Gemini CLI 等)直接读共享技能目录,装好即用;只认自己目录的(如 Claude Code)在面板里勾一下就能建链过去。
18
+ - **装完不是结束**:上游仓库一直在动,控制台会检查新提交,先告诉你「会影响哪些技能」,再由你决定更不更新。
19
+ - **删错还能救**:删除先进回收站保留 7 天;更新失败自动回滚上一版。
20
20
 
21
21
  ## 功能
22
22
 
23
23
  | 能力 | 说明 |
24
24
  | --- | --- |
25
- | 清单 | canonical 扫描 + v3 lock 对账 + DSH 实际可见性对账;canonical 里已有的技能首次读取自动纳入追踪,不必逐个「接管」 |
26
- | 安装 | 填 `owner/repo`(可只装其中几个技能),native installer 下载 codeload tarball → 安全解压 → 本地计算 tree SHA → 原子落盘 canonical + v3 lock;来自订阅快照时核对哈希,不一致会提示 |
27
- | 更新 | GitHub Trees 检测上游新 commit → 计划(commit 区间 + 影响范围 + 防抖 token)→ 应用前备份,失败自动回滚上一版 |
28
- | 删除 | 先体检(真实目录 / 外部链接直接中止)→ 快照进回收站 → installer 删 lock 条目与真身(lock 写失败从回收站恢复)→ 只清本插件建的链接与记账 |
29
- | 接入 | 软链四态判定(`managed` / `managed-external` / `foreign-link` / `real`),**绝不覆盖**别人创建的东西;只列本机已安装目录,已删的 Agent 自动从列表消失 |
30
- | 启停 | `mode: on/off` 只摘或重建 DSH 侧链接,不动 `SKILL.md`,其他 Agent 的链接也不受影响;canonical 仍在 rank 500 扫描范围,彻底隐藏待 provider 覆盖层 |
31
- | 作用范围 | 全局 `~/.dsh/skills`,或仅指定项目;项目可直接勾选 DSH 已登记的工作区,也可手动选目录 |
32
- | 查看 | 已安装技能可以只读打开:抽屉速览或整页深读,正文渲染 / 原文切换,文件树与单文件预览,信息 tab 汇总来源、哈希、接入与更新时间 |
33
- | 订阅 | 关注 `owner/repo`(可指定 ref / 子目录;ref 缺省时跟随仓库默认分支,`master` 仓库也能用),只记快照、不装技能;上游读不到快照时直接报错,不会留下空订阅 |
25
+ | 清单 | 汇总本机技能,来源、版本、可见状态、已接入的 Agent 一处看全;共享目录里已有的技能第一次打开就自动纳入管理 |
26
+ | 安装 | 填 `owner/repo` 或 GitHub URL,先检测仓库里有哪些技能、各自做什么;可以全装,也可以只挑几个 |
27
+ | 更新 | 检查上游新提交,列出 commit 区间和受影响的技能,确认后一键更新;本地改过的技能会先要求确认 |
28
+ | 删除 | 删除前体检(不碰别人建的东西),再快照进回收站(保留 7 天) |
29
+ | 启停 | 一键开关;停用后 DSH 的模型调用与 `/` 手动调用都看不到它,其他 Agent 与磁盘文件不受影响 |
30
+ | 导出 | 只给「只读自己目录」的 Agent 建链,默认不导出;直接读共享目录的 Agent 不出现在列表里 |
31
+ | 查看 | 只读打开技能正文与文件:渲染 / 原文切换、目录树、单文件预览,外加来源、哈希与接入信息 |
32
+ | 订阅 | 关注 `owner/repo` 的上游变化,只记快照、不下载技能;ref / 子目录可选,不填 ref 时跟随默认分支 |
33
+ | 作用范围 | 管 user 级共享技能;暂不支持按项目启停。项目或用户目录里有同名副本时,副本仍优先可见 |
34
34
 
35
35
  ## 界面
36
36
 
37
- - **两个入口**:默认在「设置 → 技能控制台」;页头 ⚙ 里可切到左侧栏独立面板,切换立即生效。
38
- - **一页两 tab**:已安装 / 订阅。页头右侧是「自动接入」(多选 Agent)与「添加技能 / 添加订阅」。
39
- - **每行五个动作**:开关(启停)、查看、更新、接入设置、删除;窄面板下隐藏「查看」,技能名本身仍是入口。状态标签覆盖最新 / 可更新 / 本地已改 / 上游已移除 / 软链断裂 / 无上游等。
40
- - **窄面板不跳版**:页头按内容自然换行——放得下时动作组在标题行右侧,放不下(约 630px 以下,如设置页)就整组换到下一行并靠右,插件名始终完整;列表按面板自身宽度在 860px 处切两列;滚动只发生在列表区(页头、工具栏、筛选条固定不动),滚动条出现/消失、切 tab、窗口微调都不会让整页翻面。
37
+ - **两个入口**:默认在 DSH 设置页的「技能控制台」分区;页头 ⚙ 里打开「侧边栏入口」,左侧栏就会出现独立面板,切换立即生效。
38
+ - **一页两 tab**:已安装 / 订阅。页头右侧是「新安装时自动导出」与「添加技能 / 添加订阅」。
39
+ - **每行五个动作**:开关(启停)、查看、更新、导出设置、删除;窄面板下隐藏「查看」,技能名本身仍是入口。状态标签覆盖最新 / 可更新 / 本地已改 / 上游已移除 / 软链断裂 / 无上游等。
40
+ - **窄面板不跳版**:动作组按面板宽度自然换行,插件名始终完整;列表按宽度切两列;滚动只发生在列表区,切 tab、调整窗口都不会让整页翻面。
41
41
  - **Agent 多了不挤**:每行最多展示 3 个,其余折成 `+n`,悬浮或聚焦即可看全。
42
42
  - **找得到**:支持按名称 / 来源 / Agent 搜索,按「可更新 / 待检查 / 已停用」筛选,平铺或按 Agent 分组。
43
- - **待检查 vs 无上游**:「待检查」只表示*这次*没拿到上游结论(限流、网络、仓库 404 等);再次点「检查更新」时,如果上次没有结论、上游又只回了 304,会无视 ETag 完整重读一次树,不会把「待检查」永久粘住。没有可用订阅来源的技能标「无上游」——它们无法参与更新检查,不计入待检查。
43
+ - **待检查 vs 无上游**:「待检查」只表示这次没拿到上游结论(限流、网络、仓库 404 等),下次检查会重试;没有可用来源的技能标「无上游」,不参与更新检查。
44
44
 
45
45
  ## 查看技能内容
46
46
 
47
47
  管理途中想知道「这个技能写了什么、值不值得留」,点技能名或行内「查看」即可:
48
48
 
49
- - **抽屉速览**:列表不动,右侧滑出 700px 只读抽屉;Esc / 点遮罩 / × 关闭,关闭后回到原来的筛选与滚动位置。
50
- - **整页深读**:抽屉底部「在整页打开」切到整页阅读(720px 正文 + 左侧目录),顶部返回条回列表。
49
+ - **抽屉速览**:列表不动,右侧滑出只读抽屉;Esc / 点遮罩 / × 关闭,关闭后回到原来的筛选与滚动位置。
50
+ - **整页深读**:抽屉底部「在整页打开」切到整页阅读(正文 + 左侧目录),顶部返回条回列表。
51
51
  - **三个 tab**:正文(渲染 / 原文切换,原文保留 frontmatter)、文件(目录树 + 单文件预览;`.md` 默认渲染、可切原文,其他文本直接出源码)、信息(来源、ref、commit、skillPath、内容哈希、安装 / 更新时间、接入 Agent、启停、本地改动)。
52
- - **只读**:没有任何输入框和保存按钮。更新 / 接入设置按 `writable` 与 `readOnly` 复用现有规则;`state.json` 损坏时仍可查看,管理动作禁用。
53
- - **限制**:按内容判断能否预览,能解码成 UTF-8 的源码类文件(`.md` / `.html` / `.jsx` / `.css` / `.sh` / 无扩展名脚本…)都直接显示源码;单文件上限 256 KB(超出截断并提示);真正的二进制(图片、音视频、压缩包等)显示「暂不支持预览」+ 文件名与大小,不请求本地文件当图片渲染。
54
-
55
- 接口与错误码见 [docs/skill-viewer.md](docs/skill-viewer.md)。
52
+ - **只读**:没有输入框和保存按钮。更新 / 导出设置按可写状态决定是否可用;状态文件损坏时仍可查看,管理动作禁用。
53
+ - **能预览什么**:能按 UTF-8 解码的文本文件(`.md` / `.html` / `.jsx` / `.css` / `.sh` / 无扩展名脚本…)直接显示源码;单文件上限 256 KB(超出截断并提示);图片、音视频、压缩包等二进制显示「暂不支持预览」和文件名 / 大小。
56
54
 
57
55
  ## 安装
58
56
 
59
- 插件只带 `tar@7.5.22`(native installer 解压),**不需要用户预装 Node / npm / npx / git**。首次装插件需要联网拉取依赖。
57
+ 插件自带下载与解压能力,**不需要预装 Node / npm / npx / git**;首次安装需要联网拉取依赖。
60
58
 
61
59
  在 Harness 里装本地 link:
62
60
 
@@ -72,60 +70,52 @@ plugin_manager install_bundle(target = <本仓库绝对路径>)
72
70
  name: '@morehao/dsh-skills-console'
73
71
  ```
74
72
 
75
- 客户端 half 只注册 `platform: web`,面板出现在 DSH Web 的设置页 / 侧栏。本地 `link:` 开发时,先在仓库跑一次 `npm install`(装上 `tar`),否则 native installer 的解压依赖层不会命中。
73
+ 面板出现在 DSH Web 的设置页 / 侧栏。
76
74
 
77
75
  ## 快速上手
78
76
 
79
- 1. **添加技能**:点右上角「添加技能」,填 `owner/repo` 或 GitHub URL,点「检测技能」;仓库里有多个技能时勾选要装的(支持多选,默认全选,列表带每个技能的说明),只有一个会默认勾上。检测不到时可以直接手填技能名,留空则装仓库内全部。
80
- 2. **接到别的 Agent**:点行内「接入设置」,勾选目标 Agent;需要限定项目时改选「仅以下项目」并勾工作区。之后新装技能默认接哪些 Agent,用它旁边的「自动接入」设定。
77
+ 1. **添加技能**:点右上角「添加技能」,填 `owner/repo` 或 GitHub URL,点「检测技能」;仓库里有多个技能时勾选要装的(支持多选,默认全选,列表带每个技能的说明),只有一个会默认勾上。检测不到时可以手填技能名,留空则装仓库内全部。
78
+ 2. **导出到别的 Agent**:只有「只读自己目录」的 Agent 才需要这一步(例如 Claude Code)。点行内「导出设置」勾选目标 Agent;本来就读共享目录的 Agent 不在列表里。之后新装技能默认导出到哪里,用页头「新安装时自动导出」设定(默认一个都不勾)。
81
79
  3. **检查更新**:点列表头上的刷新图标;有更新的行会亮起「更新」,也可以一次「全部更新」。本地改过的技能会先要求确认。
82
- 4. **临时停用**:关掉行内开关,摘掉 DSH 侧链接;文件和其他 Agent 的接入都还在,再打开就恢复。canonical 本身仍在 DSH 的扫描根里,所以这并不等于真正隐藏(见「可靠性」里的已知限制)。
80
+ 4. **临时停用**:关掉行内开关,只影响 DSH 侧;DSH 的模型与 `/` 调用立刻看不到它,技能文件、导出关系与其他 Agent 都还在,再打开就恢复。项目或用户目录里另有同名副本时,副本仍优先可见,行内会点名。
83
81
 
84
- ## 可靠性
82
+ ## 安全与可靠性
85
83
 
86
- - **canonical 与 v3 lock 的写入口**:安装、更新、删除由 native installer 统一处理(下载/解压/发现/tree SHA/原子 promote/lock 事务);插件其他模块只读。限流兜底的 codeload 扫描只在 `os.tmpdir()` 里解压,结果绝不落进 canonical 或 lock。
87
- - **只动自己的东西**:只处理本插件创建的 `managed` 链接,以及已记账的 `managed-external`;`real` 目录和 `foreign-link` 永不改写,删除前体检直接中止。
88
- - **启停不改正文**:`mode` 只增删 DSH 侧链接,避免本地修改被下一次安装/更新覆盖。
89
- - **已知限制:停用 ≠ 不可见**:`mode: off` 只摘 `~/.dsh/skills`(rank 400)的链;canonical 所在的 `~/.agents/skills` 仍是 DSH rank 500 的扫描根,模型可能照旧读到该技能。彻底隐藏需要 provider 覆盖层,尚未实现。
90
- - **可回滚**:删除进回收站(7 天);更新前快照到 `backups/`,失败自动还原(接口另提供手动回滚)。
91
- - **状态坏了就只读**:`state.json` 是坏 JSON 或版本未知时,插件降级为只读并让写接口返回 409,不猜结构、不自动修复。
92
- - **不做任意路径**:请求里的目标一律走注册表反查,软链目标恒为 canonical 下同名目录。
84
+ - **只动自己的东西**:只维护本插件创建的链接;删除前先体检,要删的链接已被换成真实目录或外来链就中止,别人的同名链接不碰也不删。
85
+ - **启停不改文件**:停用只写插件状态,技能本体与导出链一个字节都不动——本地修改不会被下次更新覆盖,更新也不用跟你的编辑抢文件。
86
+ - **可回滚**:删除进回收站(7 天);更新前自动备份,失败还原上一版,需要时也能手动回滚。
87
+ - **状态坏了就只读**:状态文件损坏或版本不认识时,插件降级只读、管理动作禁用,不猜结构、不自动修复。
88
+ - **不接收任意路径**:请求里的目标一律走注册表反查,导出链只会指向共享目录下的同名技能。
89
+ - **大仓库也能更新**:带设计素材的大仓库(压缩包 50MB+)不会被大小上限卡住。
90
+ - **「仅手动」不算丢技能**:技能自己声明只在 `/` 手动调用时,行内标「仅手动」并给出原因,不会被当成异常。
91
+ - **同名副本会点名**:项目或用户目录里另有同名技能时,界面直接指出「模型看到的是另一份」,不假装可见的就是共享目录那一份。
92
+ - **限流有兜底**:公开仓库匿名可用;GitHub 配额打满时会自动换通道继续检查,也可以设置 `GITHUB_TOKEN`,把配额从 60 次/小时提到 5000 次/小时——私有仓库安装也靠它。
93
93
 
94
94
  ## 数据与配置
95
95
 
96
- | 项 | 路径 | 归属 |
97
- | --- | --- | --- |
98
- | canonical 真身 | `~/.agents/skills` | native installer(安装/删除/更新) |
99
- | v3 lock | `~/.agents/.skill-lock.json`(设了 `XDG_STATE_HOME` 时为 `$XDG_STATE_HOME/skills/.skill-lock.json`) | native installer(安装/更新/删除) |
100
- | DSH 全局根 | `~/.dsh/skills` | 本插件写软链 |
101
- | 插件状态 | `$DSH_HOME/skills-console/state.json` | 本插件(`DSH_SKILLS_CONSOLE_HOME` 可覆盖) |
102
- | 备份 / 回收站 | `$DSH_HOME/skills-console/{backups,trash}` | 本插件 |
103
- | 事件日志 | `$DSH_HOME/skills-console/dsh-skills-console.log` | 本插件(JSONL,1MB 滚动) |
104
-
105
- ### 环境变量
106
-
107
- | 变量 | 默认 | 作用 |
108
- | --- | --- | --- |
109
- | `DSH_SKILLS_CONSOLE_HOME` | `$DSH_HOME/skills-console` | 状态、备份、回收站与事件日志的根 |
110
- | `GITHUB_TOKEN` / `GH_TOKEN` | 无 | 只读环境变量;带上后 REST 配额从匿名 60 次/小时提到 5000 次/小时,私有仓库安装也靠它 |
111
- | `XDG_STATE_HOME` | 未设置 | 设置后 lock 移到 `$XDG_STATE_HOME/skills/.skill-lock.json`,插件跟随读取 |
112
-
113
- 关于 GitHub 配额:**匿名 REST 是 60 次/小时,按出口 IP 共享**(公司、校园网出口常被同网段的人一起打满),打满后探测与更新会收到 403。本插件先走 REST;403/429 时改用 **Atom commit feed** 取 commit,再用 **codeload tarball** 在临时目录解压、扫描并本地计算 tree SHA,不占 REST 配额、也不需要 git。兜底也失败时,错误文案会给出恢复时间,并提示设置 `GITHUB_TOKEN`(5000 次/小时)。
114
-
115
- > Atom/codeload 兜底只在 `os.tmpdir()` 里解压,用完即删;结果不会落进 canonical 或 lock。
96
+ | 项 | 位置 |
97
+ | --- | --- |
98
+ | 技能本体 | `~/.agents/skills`(DSH 与多数 Agent 共用的技能目录) |
99
+ | 插件状态 | `$DSH_HOME/skills-console/state.json`(`DSH_SKILLS_CONSOLE_HOME` 可换根目录) |
100
+ | 备份 / 回收站 | `$DSH_HOME/skills-console/{backups,trash}` |
101
+ | 事件日志 | `$DSH_HOME/skills-console/dsh-skills-console.log`(JSONL,1MB 滚动) |
116
102
 
103
+ 技能本体留在共享目录,导出只是建链,不搬文件。
117
104
 
118
105
  ## 开发与发布
119
106
 
120
- 源码结构、测试策略与调试手段见 [docs/development.md](docs/development.md)(含本地 `link:` 验证与回退步骤);发布流程与排障清单见 [docs/publishing.md](docs/publishing.md)。在本仓工作的 AI agent 请先读 [AGENTS.md](AGENTS.md)。
107
+ 源码结构、测试策略与本地 `link:` 验证见 [docs/development.md](docs/development.md);可见性、数据落点与实现边界见 [docs/internals.md](docs/internals.md);发布流程与排障清单见 [docs/publishing.md](docs/publishing.md)。在本仓工作的 AI agent 请先读 [AGENTS.md](AGENTS.md)。
121
108
 
122
109
  ## 边界(明确不做)
123
110
 
124
- - 不做技能市场 / 搜索,不接管 CLI 已有的 Agent 分发,不给 CLI 打补丁。
125
- - 不编辑技能正文(`add` 会整份重建,本地改写必然被覆盖)。
126
- - 不做技能正文编辑与图片 / 二进制预览;查看器只读,更新会整份覆盖正文。
127
- - 不做文件级差异预览:只给 commit 区间与受影响技能;要看具体行,终端跑 `git diff <from>..<to> -- <skillDir>`。
111
+ - 不做技能市场 / 搜索,也不接管或改写其他工具自己的 Agent 分发。
112
+ - 不编辑技能正文:查看器只读,更新会整份覆盖。
113
+ - 不做文件级差异预览:只给 commit 区间与受影响技能;要看具体行,在终端跑 `git diff <from>..<to> -- <skillDir>`。
114
+ - 不做图片 / 二进制预览。
128
115
  - 不做跨机器同步,不落盘任何 token。
116
+ - 不做全机隐身:启停只对 DSH 生效,直接读共享目录的其他 Agent 仍会看到技能。
117
+ - 不支持项目级启停:项目里的同名技能仍按 DSH 的优先级可见。
118
+ - 不接管宿主 preset 层与其他插件自带的技能源;诊断里会把它们标成盲区,而不是假装支持。
129
119
 
130
120
  ## 许可
131
121