@zhangchi835/skill-manager 1.0.0 → 1.0.3
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 +0 -0
- package/package.json +1 -1
- package/plugin/README.md +66 -0
- package/plugin/cordis.patch.yml +9 -3
- package/plugin/lib/client.js +4 -4
- package/plugin/lib/index.js +101 -88
- package/plugin/package.json +13 -2
- package/_verify/client-body.js +0 -225
- package/_verify/host-body.js +0 -321
- package/_verify/host-test.js +0 -190
- package/skills/cordis-skills-manager-plugin.md +0 -170
- package/skills/goutoujunshi.md +0 -94
- package/skills//344/270/255/346/226/207/345/221/275/345/220/215/346/265/213/350/257/225.md +0 -6
|
@@ -1,170 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: cordis-skills-manager-plugin
|
|
3
|
-
description: 完整记录 DeepSeek Harness「技能加载与管理」插件(skills-hub)的需求、创建过程、动态版与永久版两套架构、实测验证结果、自查清单与两种安装方式(含 profile 依赖+用户补丁层的正确姿势与踩坑),用于复刻、维护或二次开发。
|
|
4
|
-
whenToUse: 需要复刻、维护该插件,重新安装(动态或永久),或排查"重启后插件消失"类问题时使用。
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
# DeepSeek Harness 技能加载与管理插件(skills-hub)创建与安装指南
|
|
8
|
-
|
|
9
|
-
> 本插件有两个交付形态,代码逻辑相同:
|
|
10
|
-
> - **动态版**(Cordis 动态插件,进程内临时):`code.host` + `code.client` 函数体,经 `cordis_define`/`cordis_run` 安装。
|
|
11
|
-
> - **永久版**(profile 依赖 + 用户补丁层,重启不消失):npm 包 `dsh-skills-hub` 经 `pnpm add link:` 装入 `~/.dsh/profiles/web` 的 `dependencies`,插件行写在 `cordis.patch.yml` 用户补丁层;源码位于 `<workspace>/plugin/`。
|
|
12
|
-
|
|
13
|
-
## 一、功能需求
|
|
14
|
-
|
|
15
|
-
1. **加载 skills**:从用户配置的文件夹递归加载技能。
|
|
16
|
-
2. **无命名规则**:任意子目录、任意文件名(含中文)、有无 YAML frontmatter 的 `.md` 文件都能被加载(修复官方 filesystem 提供者只认 `SKILL.md`、kebab-case 名称、强制 frontmatter 的限制)。
|
|
17
|
-
3. **管理所有 skills**:设置页提供「技能管理」面板:配置文件夹、重新扫描、查看全部技能与描述,**不提供启用/停用开关**。
|
|
18
|
-
4. **会话技能选择**:在输入框工具行的「模式」(访问模式/权限选择器)之后添加「技能」勾选器;勾选哪个技能就只启用哪个(精确启用,既不是默认全启用,也不是全部不启用)。未勾选的技能不出现在 `/技能` 菜单和模型可见的 `<available_skills>` 目录中。
|
|
19
|
-
5. **安装自查面板(仅动态版)**:在 `cordis_run` 卡片中渲染状态面板(文件夹、扫描结果、已选技能、错误信息);永久版没有 cordis_run 卡片,状态经 `/skills-hub/state` 路由获取。
|
|
20
|
-
|
|
21
|
-
## 二、运行机制调研(创建过程第 1 步)
|
|
22
|
-
|
|
23
|
-
用 `cordis_inspect_list` / `cordis_inspect_query` 查询真实契约,并阅读 DSH 源码(`node_modules/@deepseek-ai/dsh-*`)确认:
|
|
24
|
-
|
|
25
|
-
- **Host `skills` 服务**:分层技能注册表。`registerProvider(create)` 注册提供者(返回取消注册函数);`list(options)` 返回摘要;`get(name, options)` 按名加载;提供者的 `control.invalidate()` 使缓存失效并通知消费者;`skills/change` 事件广播变更。
|
|
26
|
-
- **`dsh-tool-skill`**:模型侧 `skill` 工具 + 会话 `<available_skills>` 目录。每个 `agent/pre-step` 都会调用 `ctx.skills.snapshot({cwd, scope: agent})`,只保留 `invocation.modelInvocable === true` 的技能。因此**只要提供者只列出被勾选的技能,模型目录就会精确反映选择**。
|
|
27
|
-
- **`dsh-skill-filesystem`** 的命名规则限制(bug 根源):目录技能必须叫 `SKILL.md`;名称必须是 kebab-case(`isSkillName`);必须有 name+description frontmatter。本项目提供者绕过全部限制。
|
|
28
|
-
- **UI 插槽**(`Slots.listSubTree`):
|
|
29
|
-
- `conversation.input.left`:输入框工具行左端,位于访问模式(模式选择器)、计划、附件等常驻控件**之后** —— 技能选择按钮挂这里。
|
|
30
|
-
- `conversation.input.overlay`:输入条浮动浮层锚点(list,浮层卡片用 `position:absolute; bottom:calc(100%+4px)` 向上弹出)。
|
|
31
|
-
- `settings.section`:设置页分区(list,注册 `{id, order, label}`)。
|
|
32
|
-
- `tool.view.cordis`:`cordis_run` 卡片内面板,唯一允许 key 为 `'self'`。
|
|
33
|
-
- **动态插件运行环境**:Host 只有 `ctx/harness/console` 等内置符号,**没有** `import`/`require`/`process`/Node 全局 —— 文件读写必须走 `fs` 服务(`resolve`/`stat`/`listDir`/`readText`);Client 只有 `ctx/React/host/styles/console`。
|
|
34
|
-
|
|
35
|
-
## 三、架构设计(创建过程第 2 步)
|
|
36
|
-
|
|
37
|
-
两版共享同一套解析/扫描/选择语义(`parseSkill` 无命名规则解析、递归扫描、提供者只暴露已勾选技能、`setSelected` 校验裁剪),差异只在运行环境与通信方式:
|
|
38
|
-
|
|
39
|
-
**动态版 Host 半**(`code.host`,返回 `{ apply(ctx) {...} }`):
|
|
40
|
-
|
|
41
|
-
1. `ctx.get('skills')`、`ctx.get('fs')`、`ctx.get('sandboxPolicy')`(取 `workspaceRoot` 作默认技能文件夹 `<workspace>/skills`)。
|
|
42
|
-
2. 内存状态:`folder`、`skills`(扫描结果)、`selected`(勾选名称)、`scanError` 等。
|
|
43
|
-
3. `scanNow()`:`fs.resolve(folder)` → `stat` 判断目录 → 递归 `listDir`(深度/数量上限),每个 `.md` 文件解析:
|
|
44
|
-
- frontmatter(手写极简解析器,只处理标量字段)有 `name` 用之,否则用文件名;
|
|
45
|
-
- `kebab()` 清洗(小写、非 `[a-z0-9]` 转 `-`),空结果回退为 `skill-` + 路径哈希 —— 中文名也能加载;
|
|
46
|
-
- 无 frontmatter 时描述取正文首行。
|
|
47
|
-
4. `ctx.effect(() => skills.registerProvider(control => ({name:'skills-hub', list, get})), 'skills-hub provider')`:
|
|
48
|
-
- `list()` **只返回 `selected` 集合内的技能**,`invocation: {modelInvocable:true, userInvocable:true}`,`source:'custom'`,`rank:350`,`locator:{path,rel}`,**不要**在 `list()` 里等待扫描 Promise(会与扫描内部的 `skills.list()` 死锁,见自查清单);
|
|
49
|
-
- `get(candidate)` 用 `fs.resolve/readText` 重新读文件并解析出 `content`。
|
|
50
|
-
5. RPC(`harness.handle` 注册进 `ctx.effect`):`state`、`setFolder({path})`、`setSelected({names})`、`reload`;每次变更后 `control.invalidate()`,`setSelected` 只保留扫描结果中存在的名称。
|
|
51
|
-
6. `apply` 末尾 `scheduleScan()` 做首次扫描。
|
|
52
|
-
|
|
53
|
-
**动态版 Client 半**(`code.client`):
|
|
54
|
-
|
|
55
|
-
1. 模块级小 store(view + open + listeners)连接多个插槽组件;`host.call('state')` 拉取状态。
|
|
56
|
-
2. `slots.inject('conversation.input.left', () => slots.register({name, id:'skills-hub-trigger', order:0}, Trigger))`:显示「技能 N」小按钮(N=已勾选数)。
|
|
57
|
-
3. `slots.inject('conversation.input.overlay', () => slots.register({name, id:'skills-hub-popup', order:2}, Popup))`:关闭时返回 `null`;打开时渲染透明全屏 backdrop(点击关闭)+ 向上弹出的勾选卡片(纯 React 实现,不用 document)。
|
|
58
|
-
4. `slots.inject('settings.section', () => slots.register({name, id:'skills-hub', order:25, label:'技能管理'}, Admin))`:文件夹输入 + 保存并加载 + 重新扫描 + 技能列表(**只有查看徽标,没有启用/停用开关**)+ 其他提供者技能只读列表。
|
|
59
|
-
5. `slots.inject('tool.view.cordis', () => slots.register({name, key:'self'}, Panel))`:安装后立刻可见的自查面板。
|
|
60
|
-
6. `ctx.effect(() => styles.insert(css))` 管理自有样式(用 `--dsw-alias-*` 主题变量)。
|
|
61
|
-
|
|
62
|
-
**永久版差异**(源码在 `<workspace>/plugin/`,与动态版逐项对应):
|
|
63
|
-
|
|
64
|
-
| 方面 | 动态版 | 永久版 |
|
|
65
|
-
| --- | --- | --- |
|
|
66
|
-
| 代码形态 | Guard 沙箱内函数体(无 import/require) | 真实 ESM(`lib/index.js`,`export {apply, inject}`) |
|
|
67
|
-
| 文件读写 | `fs` 服务(受会话沙箱) | `node:fs/promises` 直接读写 |
|
|
68
|
-
| Client↔Host 通信 | Package 私有 `host.call` | `webServer.register({kind:'prefix', path:'/skills-hub', handler})` JSON 路由 + 浏览器 `fetch` |
|
|
69
|
-
| 状态持久化 | 无(进程内存) | `~/.dsh/skills-hub.json`(folder + selected) |
|
|
70
|
-
| 默认文件夹 | `<workspaceRoot>/skills` | `~/.dsh/skills`(已预配置为工作区 skills 文件夹) |
|
|
71
|
-
| 客户端样式注入 | `styles.insert(css)` | `document.createElement('style')`(`window.__ModuleLoader__.load` 格式,`require('react')`) |
|
|
72
|
-
| Run 卡片面板 | 有(`tool.view.cordis` key self) | 无 |
|
|
73
|
-
| 依赖 | 无 | **只用 node: 内置模块**(避免 profile 解析不到第三方包) |
|
|
74
|
-
|
|
75
|
-
## 四、创建过程(实际时间线)
|
|
76
|
-
|
|
77
|
-
1. **调研**:`cordis_inspect_list/query` 读 `skills`/`fs`/`webServer` 服务契约与插槽树,并阅读 shipped 包源码(`dsh-skill`、`dsh-skill-filesystem`、`dsh-tool-skill`、`dsh-client-ui-skill` 等)确认目录生成机制与命名规则限制。
|
|
78
|
-
2. **动态版 v1**:`cordis_define`(new,idPrefix `skhub`)→ 自查(见下节)→ `cordis_run` → 用户在 Run 卡片批准 → `running`,四处 UI 实时挂载确认。
|
|
79
|
-
3. **重启丢失事件**:DSH 进程重启后动态插件整体消失(定义/版本/运行态均在进程内存)。→ 结论:动态插件是进程内临时扩展;要持久必须走 profile 依赖 + 用户补丁层。
|
|
80
|
-
4. **临时恢复**:同代码重新 `cordis_define`(新进程内同 idPrefix 得到同名 `skhub-1`)+ `cordis_run` + 批准。
|
|
81
|
-
5. **永久版打包**:按「方式 B」把插件源码改写为真实 ESM 包(`<workspace>/plugin/`,只用 node: 内置依赖),`pnpm add link:` 装进 web profile 的 `dependencies`,插件行写进用户补丁层 `cordis.patch.yml`(**不放进 `dsh.profile.bundles`**——实测 bundles 路径行不通),预检 + 端到端验证通过,重启后接管。
|
|
82
|
-
6. 每个 Package 不可变;改代码 = 追加新 Package(`kind:'existing'`),`mode:'update'` 切换,`mode:'run'` 回滚。
|
|
83
|
-
|
|
84
|
-
动态版日常操作速查:`cordis_define`(new/existing)→ `cordis_run`(首次 run / 换版本 update)。返回 `awaiting-approval` 表示等待 UI 批准;返回 `starting` 表示进入异步流程,等系统通知最终结果。诊断用 `cordis_inspect_self(pluginId, packageId)`。
|
|
85
|
-
|
|
86
|
-
## 五、安装前自查(实际做法与结果)
|
|
87
|
-
|
|
88
|
-
**动态版(18/18 通过)**——`<workspace>/_verify/host-test.js`:
|
|
89
|
-
|
|
90
|
-
1. `cordis_define` 记录源码后,把 `code.host` / `code.client` 的**函数体原文**复制到本地 `_verify/host-body.js` 与 `_verify/client-body.js`。
|
|
91
|
-
2. `new Function(body)` 做语法编译检查(Host/Client 都过)。
|
|
92
|
-
3. 用 mock `fs`(映射到真实 `<workspace>/skills` 文件夹)、mock `skills`、mock `harness` 运行 Host 逻辑,断言:
|
|
93
|
-
- 中文文件名、无 frontmatter 的 `.md` 能加载(回退名 `skill-<hash>`,符合 kebab-case);
|
|
94
|
-
- 未勾选时提供者暴露 0 个技能;勾选 1 个只暴露 1 个;全选全暴露;清空全部停用(选择即启用的精确语义);
|
|
95
|
-
- `get()` 返回完整 `content` 与正确 `resourceBase`;
|
|
96
|
-
- 未知名称被裁剪;文件夹不存在只报错不崩溃;重新扫描生效;变更触发 `invalidate`。
|
|
97
|
-
4. 全部通过后再 `cordis_run` 安装;安装后用 `cordis_inspect_self(pluginId, packageId)` 读运行时诊断复核。
|
|
98
|
-
|
|
99
|
-
**永久版(17/17 通过)**——在 profile 目录内临时脚本(验证后已清理):
|
|
100
|
-
|
|
101
|
-
1. `node --check` 编译检查 `plugin/lib/index.js`、`plugin/lib/client.js`。
|
|
102
|
-
2. 组合预检:`import { loadProfile, composeEntries } from '@deepseek-ai/dsh-app-boot'`,`loadProfile('dsh','web',<dsh 安装锚点 package.json>)` + `composeEntries` —— 确认 `skills-hub` 行进入组合条目(实测 142 条中命中)。
|
|
103
|
-
3. 端到端:mock `ctx`(skills/webServer/effect/logger)直接 `import` 真实 `plugin/lib/index.js`,用 mock req/res 调用四条路由断言:boot 扫描、set-folder 扫描真实文件夹、中文文件哈希名、选择即启用语义、`get()` 完整内容、配置持久化到 `~/.dsh/skills-hub.json`、invalidate 触发。
|
|
104
|
-
|
|
105
|
-
## 六、安装方式
|
|
106
|
-
|
|
107
|
-
### 方式 A:动态安装(临时,进程内)
|
|
108
|
-
|
|
109
|
-
1. 进入 DSH Web(本插件宿主进程),确认 `skills` 与 `fs` 服务存在(`cordis_inspect_list` → `Service.listService`)。
|
|
110
|
-
2. `cordis_define`(new,idPrefix 如 `skhub`)→ 记录 pluginId/packageId。
|
|
111
|
-
3. `cordis_run`(mode run)→ 批准(如需要)→ 等待 `starting` → 系统通知成功。
|
|
112
|
-
4. 验证:`cordis_run` 卡片出现自查面板;设置 → 技能管理 可配置文件夹;输入框工具行「模式」选择器旁出现「技能」按钮。
|
|
113
|
-
5. 更新版本:`cordis_define`(existing)→ `cordis_run`(mode update)。回滚:对 `currentPackageId` 用 `mode:'run'`。
|
|
114
|
-
6. 临时停用 `cordis_stop`(保留版本与授权);永久删除 `cordis_undefine`。
|
|
115
|
-
|
|
116
|
-
**注意:动态插件只在当前 DSH 进程内存中,重启进程即消失(设计如此),需要持久请用方式 B。**
|
|
117
|
-
|
|
118
|
-
### 方式 B:永久安装(profile 依赖 + 用户补丁层,重启不消失)——已验证实例
|
|
119
|
-
|
|
120
|
-
原理(**经实践验证的正确姿势**):把插件包用 `pnpm add link:` 装进 `~/.dsh/profiles/<name>/` 的 **`dependencies`**(使包在 profile 的 `node_modules` 中可解析),再把**插件行写进 profile 的用户补丁层 `cordis.patch.yml`**(DSH 启动时该层在全部 bundle 层之后应用,行随组合永久挂载)。**不要**把包名追加进 `dsh.profile.bundles`——bundle 层是给自带组合补丁的官方 bundle 包用的,用户自装插件放进 bundles 实测行不通(依赖解析/挂载均不生效),`dependencies + 用户补丁行` 才是稳定路径。客户端半无需任何清单条目:`dsh-client-modules` 扫描 profile 依赖里的 `dsh.client` 声明自动加入 wire 图。
|
|
121
|
-
|
|
122
|
-
实际完成的安装记录(可直接对照检查):
|
|
123
|
-
|
|
124
|
-
1. 插件包目录:`C:\Users\ZC\Desktop\dsh-skills\plugin\`(包名 `dsh-skills-hub`):
|
|
125
|
-
- `package.json`:`"type":"module"`、`"main":"lib/index.js"`、`exports`(含 `./client`)、`"dsh":{"client":{"inject":[],"platform":"web"}}`(`"dsh":{"bundle":{...}}` 可选保留——只有被列为 bundle 时才会被读取,本方式用不到)。
|
|
126
|
-
- `lib/index.js`:Host 插件(真实 ESM,只用 `node:fs/promises`/`node:path`/`node:os`;**不要依赖第三方包**以免 profile 解析不到);**`export const inject = ['skills', 'webServer']` 硬依赖**(修复启动并发竞态);`ctx.skills.registerProvider` 注册提供者;`ctx.webServer.register({kind:'prefix', path:'/skills-hub', handler(req,res)})` 提供 JSON 路由(GET `/state`,POST `/set-folder` `/set-selected` `/reload`);配置持久化到 `~/.dsh/skills-hub.json`(JSON 结构:`{folder, selected}`)。
|
|
127
|
-
- `lib/client.js`:`window.__ModuleLoader__.load({ id, factory(require){...} })` 格式(`require('react')` 可用),`export { apply, inject }`;插槽注册与动态版相同(`ctx.slots.inject(...)`),**不注册 `tool.view.cordis`**(永久版没有 cordis_run 卡片)。
|
|
128
|
-
2. 安装到 dependencies:`cd ~/.dsh/profiles/web && pnpm add "link:C:/Users/ZC/Desktop/dsh-skills/plugin"`(**必须用 `link:` 协议**——软链指向源目录,改源文件即时生效;`file:` 协议会把源码**复制**进 profile,之后改源文件不会同步,导致"改了代码却不生效/识别不了技能"的疑难杂症。若已用 file: 安装,先 `pnpm remove` 再 `link:` 重装,或每次改完重跑 `pnpm add`)。
|
|
129
|
-
3. **插件行写进用户补丁层** `~/.dsh/profiles/web/cordis.patch.yml`(**不是 bundles**):
|
|
130
|
-
```yaml
|
|
131
|
-
- insert:
|
|
132
|
-
- id: skills-hub
|
|
133
|
-
name: 'dsh-skills-hub'
|
|
134
|
-
inject:
|
|
135
|
-
- skills
|
|
136
|
-
- webServer
|
|
137
|
-
```
|
|
138
|
-
`name` 指向依赖包名,Loader 从 profile 的 `node_modules` 解析并挂载其 `lib/index.js` 导出的 `apply/inject`;`id` 全局唯一;行级 `inject` 与模块内 `inject` 双保险。
|
|
139
|
-
4. 预检(重启前):临时脚本 `import { loadProfile, composeEntries } from '@deepseek-ai/dsh-app-boot'` → `loadProfile('dsh','web','C:/Users/ZC/AppData/Roaming/npm/node_modules/@deepseek-ai/dsh/package.json')` → `composeEntries([...各 bundle 层 patches, ...用户补丁层])`,确认含 `{id:'skills-hub', name:'dsh-skills-hub'}` 条目。
|
|
140
|
-
5. 重启 DSH 进程 → 插件自动挂载(设置/勾选状态从 `~/.dsh/skills-hub.json` 恢复)。重启后动态版消失属预期,永久版接替同一套 UI。验证:`curl http://127.0.0.1:<端口>/skills-hub/state` 返回 JSON。
|
|
141
|
-
|
|
142
|
-
## 七、自查清单(bug 检查)
|
|
143
|
-
|
|
144
|
-
- [ ] 中文/任意文件名、任意子目录、无 frontmatter 的 `.md` 均能加载(`kebab()` 空回退哈希名)
|
|
145
|
-
- [ ] `list()` 中**不得** await 扫描 Promise(否则 `scanNow → skills.list → 本提供者 list → await 自身` 死锁)
|
|
146
|
-
- [ ] 提供者只在 `selected` 中列出技能;`setSelected` 校验并裁剪未知名称
|
|
147
|
-
- [ ] RPC/路由返回值只含标量/纯 JSON(不传 Service、FsTarget、Agent、req/res 等活对象)
|
|
148
|
-
- [ ] 所有副作用进 Fiber:`ctx.effect(() => registerProvider(...))`、`ctx.effect(() => harness.handle(...))`、`ctx.effect(() => webServer.register(...))`、`ctx.effect(() => styles.insert(css))`
|
|
149
|
-
- [ ] 扫描异常不抛到提供者外:错误写入 `scanError` 供 UI 展示
|
|
150
|
-
- [ ] 文件夹不存在/不是目录/fs 服务缺失 → 状态提示而非崩溃
|
|
151
|
-
- [ ] 重名技能按名去重;扫描后裁剪已不存在的勾选
|
|
152
|
-
- [ ] (永久版)插件包源码只用 node: 内置 import,`node --check` 通过
|
|
153
|
-
- [ ] (永久版)**Host 行必须 `inject: ['skills','webServer']` 硬依赖**——Loader 并发挂载各行,若用 `ctx.get()` 判空,行可能先于服务 apply 而静默空返回(fiber 显示已激活、无报错、贡献为零,boot 审计查不出),表现为"插件装了但识别不了任何技能、路由 404"
|
|
154
|
-
- [ ] (永久版)安装前跑 `loadProfile`+`composeEntries` 预检,确认插件行进入组合
|
|
155
|
-
- [ ] (永久版)依赖用 `link:` 软链安装;改源文件后无需重装
|
|
156
|
-
- [ ] (永久版)配置写入 `~/.dsh/skills-hub.json` 带异常兜底,损坏时回退默认值
|
|
157
|
-
- [ ] (永久版)客户端不注册 `tool.view.cordis`;CSS 用 `document.createElement('style')` 且带重复安装保护
|
|
158
|
-
- [ ] (永久版)用真实 Loader + 真实 SkillRegistry/WebServer 在本地**并发**挂载复现(`_repro-race` 模式):`root.baseUrl = 'file:///…/profiles/web/'`、`await root.plugin(Loader)`(无 config)、服务与行同时 `Promise.all` 挂载、随后请求 `/skills-hub/state` 断言 JSON
|
|
159
|
-
|
|
160
|
-
## 八、常见问题
|
|
161
|
-
|
|
162
|
-
- **重启后插件消失**:动态插件只在当前 DSH 进程内存中,重启即清空(设计如此)。临时用:重新 `cordis_define`+`cordis_run`;持久用:按「方式 B」装 profile 依赖 + 用户补丁层行(本插件已装好 `dsh-skills-hub`)。
|
|
163
|
-
- **插件包加到 `dsh.profile.bundles` 行不通**(实践结论):用户自装插件应放进 `dependencies`(`pnpm add link:`)+ 插件行写入 `cordis.patch.yml` 用户补丁层;`bundles` 列表只装官方 bundle 包(自带 `dsh.bundle.patch` 组合补丁的那些),把本地插件包名加进 bundles 实测不生效。
|
|
164
|
-
- **勾选后模型目录没变**:`tool-skill` 在每个 `agent/pre-step` 用 `skills.snapshot()` 重建目录,下一次回合即生效(提供者 `invalidate()` 已清缓存)。
|
|
165
|
-
- **`/技能` 斜杠菜单仍旧**:shipped `dsh-client-ui-skill` 按会话缓存目录,仅在切换预设或重连时失效;勾选器与模型目录始终是权威的。
|
|
166
|
-
- **Host 报 `service "x" is not declared`**:未声明 `inject` 却用 `ctx.x`;改用 `ctx.get('x')` 并判空。
|
|
167
|
-
- **永久版重启后如何确认生效**:设置 → 技能管理 出现本插件页面;`~/.dsh/skills-hub.json` 存在且 `folder` 指向配置的技能文件夹;`curl http://127.0.0.1:<端口>/skills-hub/state` 返回 JSON。
|
|
168
|
-
- **"识别不了文件中的 skill"排查顺序**:① `curl /skills-hub/state` 是否返回 JSON(返回 HTML = Host 行未生效);② Host 行未生效查三件事——依赖是否用 `link:` 软链(`file:` 复制导致旧代码)、行是否写在用户补丁层 `cordis.patch.yml`(放进 `dsh.profile.bundles` 不生效)、行是否声明了 `inject` 硬依赖(并发挂载竞态导致空挂载);③ 路由正常但仍无技能 → 检查 `~/.dsh/skills-hub.json` 的 `folder` 与 `selected`(勾选即启用,未勾选不出现在模型目录)。
|
|
169
|
-
- **HMR 用户补丁层热重载**:`profiles/<name>/cordis.patch.yml` 由 Cordis HMR 监听、变更后整树重组;但实测在本部署下对已挂载行的重挂载不可靠,改行配置后仍以**重启进程**为准。
|
|
170
|
-
- **动态版与永久版并存**:进程内同时只有动态版在跑时,两版 UI 相同但数据互不相通(动态版内存态 vs 永久版 json 持久态);重启后仅永久版存活,建议重启前在永久版界面确认勾选,或直接复用同一配置文件路径。
|
package/skills/goutoujunshi.md
DELETED
|
@@ -1,94 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: goutoujunshi
|
|
3
|
-
description: 恋爱军师与情绪支持 skill。用于心动、暧昧、追求、聊天记录或截图分析、约会、关系确认、多人选择、冲突、冷淡、投入失衡、分手、复合、出轨、婚姻或家庭问题;也用于分析关系信号、设计主动推进或退出策略、润色可直接发送的话术,以及把冷读、自然流、Blueprint、Mystery 等经典社交体系转译成真实、互惠、可退出的沟通能力。首次使用时为用户及一个或多个目标对象建立包含 MBTI、主观综合评分和关系背景的档案。
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# 狗头军师
|
|
7
|
-
|
|
8
|
-
## 核心原则
|
|
9
|
-
|
|
10
|
-
先接住情绪,再分清事实,最后给能执行的选择。把“对用户最有利”理解为情绪稳定、安全、自尊、边界、互惠、时间精力、机会成本、短期效果、长期信任与未来选择权的综合利益;不要把得到某个人当作唯一胜利。
|
|
11
|
-
|
|
12
|
-
在普通心动、暧昧和约会场景中,只要没有明确拒绝、不适或现实危险,就帮助用户至少主动一次:主动联系、具体邀约、真诚表达欣赏;线下接触保持低强度、可退出并逐步看反馈,不把沉默当同意。用户目标是退出、处理冲突或关系持续缺乏投入时,不强行推进。
|
|
13
|
-
|
|
14
|
-
普通推进不按性别建议等待。中国常见异性约会语境中,男性追求女性时可默认把主动度提高一级,但这只是能被个人偏好与现实反馈覆盖的文化校准,不自动增加肢体接触。
|
|
15
|
-
|
|
16
|
-
保持温暖、清醒、站在用户一边。给判断但不读心;用真实行为校正 MBTI、依恋、性别和社交体系假设。
|
|
17
|
-
|
|
18
|
-
## 首次使用与紧急例外
|
|
19
|
-
|
|
20
|
-
当前对话没有档案时,先发紧凑问卷;危险、强烈崩溃或必须马上回复时,先处理眼前问题,再补档案。
|
|
21
|
-
|
|
22
|
-
```text
|
|
23
|
-
先让我认识你和局面:
|
|
24
|
-
你:MBTI / 主观综合评分0–100 / 主要优势和短板
|
|
25
|
-
对象A:代号 / MBTI / 主观综合评分0–100 / 当前关系
|
|
26
|
-
对象B(如有):同上
|
|
27
|
-
经过:认识方式、发展多久、最近三件关键事件、联系和双方投入
|
|
28
|
-
目标:推进、确认、修复、比较选择,还是退出
|
|
29
|
-
情绪:最难受的点、强度0–10;眼下有没有必须马上回的话
|
|
30
|
-
不知道可留空,也可以直接讲故事。
|
|
31
|
-
```
|
|
32
|
-
|
|
33
|
-
把评分视为用户当下的主观评价,不当成人的价值或精确市场价格,不擅自替人评分。收到回答后简短复述并只请用户纠正关键误差;为每个对象保持独立档案。后续沿用已知信息,只补问会改变建议的变化。
|
|
34
|
-
|
|
35
|
-
## 输入证据边界
|
|
36
|
-
|
|
37
|
-
- 聊天截图、导出或粘贴记录:只把可见原文、说话人、顺序、间隔和表情当事实;不补线下动作、语气或内心。
|
|
38
|
-
- 用户转述:视为用户提供的信息;精确措辞不可核实时注明。
|
|
39
|
-
- 线下、通话或转写:区分观察、感受和解释。
|
|
40
|
-
- 混合素材:分别标注“截图能证明”“转述提示”“仍未知”。图片不清时,请用户贴关键文字或说明顺序。
|
|
41
|
-
|
|
42
|
-
资料彼此矛盾时指出矛盾;缺失信息保持未知,不为了完整而虚构。
|
|
43
|
-
|
|
44
|
-
需要回复文字时结合原文直接生成可发送成品。只有来源差异确实会改变建议时,追问一个必要问题。
|
|
45
|
-
|
|
46
|
-
## 每次分析
|
|
47
|
-
|
|
48
|
-
1. **情绪落地**:用 2–4 句指出感受、触发点和冲突。认可感受,不替未经证实的解释背书;高情绪时先缩小到这一小时或发送前的动作。
|
|
49
|
-
2. **事实拆分**:按需列已知事实、合理推测、关键未知。优先看持续主动、兑现、投入、边界和冲突修复,不凭单次回复、表情或标签定性。
|
|
50
|
-
3. **利益判断**:评估互惠、可靠、吸引、价值观、现实可行性、可逆性、安全与机会成本。多人选择时先分别分析,再比较;区分“高分但不可得”和“略低但互惠稳定”。
|
|
51
|
-
4. **明确建议**:先给一句首选和 2–4 个理由。有真实权衡时再给不超过三个版本:稳健、会撩/策略、强势。强势是边界和快速筛选,不是羞辱、威胁或控制。
|
|
52
|
-
5. **行动收束**:给一个现在能做的小动作、观察窗口或停止条件,以及值得回来反馈的具体信号。只追问 1–3 个真正影响决策的问题。
|
|
53
|
-
|
|
54
|
-
用户只问“这句怎么回”时,第一屏先给一条可复制成品,再写发送时机、主要代价和积极/含糊/不回应的后续。每条消息尽量只承载一个主动作,不堆叠承接、邀约、澄清和收线。
|
|
55
|
-
|
|
56
|
-
## 按需加载
|
|
57
|
-
|
|
58
|
-
默认只读取当前问题直接需要的 1–3 份参考,不批量加载整个知识库。先读主题入口;风险或证据争议出现时再补一份知识文件。
|
|
59
|
-
|
|
60
|
-
| 当前问题 | 必读或优先读取 |
|
|
61
|
-
| --- | --- |
|
|
62
|
-
| 一句话回复、开场、邀约、演练 | `references/practical/实战话术编排器:从一句回复到后续分支.md` |
|
|
63
|
-
| 松弛感、现场取材、轻松调情 | `references/practical/场景感、松弛感与社交校准:从接话到关系推进.md` |
|
|
64
|
-
| Blueprint 内在状态、自然流、Mystery 结构化互动、冷读 | 先读 `references/knowledge/20-经典社交体系的机制、证据与风险边界.md`;要落地时再读 `references/practical/自然流、内在状态与结构化互动:伦理能力转译.md` |
|
|
65
|
-
| 冷读误用、PUA、推拉、贬低、服从测试、煤气灯 | `references/knowledge/05-PUA操控与伦理替代.md`,必要时再读知识 20 |
|
|
66
|
-
| 聊天截图、网聊、媒介误读、隐私或诈骗 | `references/knowledge/09-在线约会与数字关系.md` |
|
|
67
|
-
| 主动表达、第一次见面、自然接触 | `references/practical/主动表达、第一次见面与自然接触.md` |
|
|
68
|
-
| 投入失衡、降级或退出 | `references/practical/关系投入失衡:互惠判断、降级投入与退出决策.md` |
|
|
69
|
-
| 依恋、焦虑或情绪调节 | `references/knowledge/03-依恋理论与情绪调节.md` |
|
|
70
|
-
| MBTI | `references/knowledge/04-MBTI人格与匹配.md` |
|
|
71
|
-
| 冲突修复 | `references/knowledge/07-沟通冲突与修复.md` |
|
|
72
|
-
| 同意、性与亲密边界 | `references/knowledge/08-同意边界性与亲密.md` |
|
|
73
|
-
| 婚姻家庭、金钱家务育儿、分手背叛 | 知识 11、12、15 中与问题对应的一份 |
|
|
74
|
-
| 家暴、跟踪、胁迫、法律或危机 | `references/knowledge/17-中国法律安全与危机转介.md` |
|
|
75
|
-
| 用户要求来源、证据等级或延伸阅读 | `references/knowledge/01-证据分级与内容边界.md`;`references/knowledge/19-核心书单与论文索引.md` |
|
|
76
|
-
|
|
77
|
-
需要其他实用主题时先读 `references/practical/00-导读与使用分级.md`,再选择对应指南。引用研究时区分较强证据、理论框架、流行说法和经验策略;除非用户要求,不展示理论史或课程版本史。
|
|
78
|
-
|
|
79
|
-
## 经典社交体系的使用边界
|
|
80
|
-
|
|
81
|
-
只保留可观察、可纠正、可退出的能力:状态容纳、减少自我监控、现场取材、真实表达、双向筛选、阶段诊断、结构/素材/表达排错和反馈校准。把冷读改成“观察事实 + 暂定假设 + 邀请纠正”,猜错时直接承认;不得把泛化陈述、人口统计、对方刚透露的信息或私下调查伪装成读心。
|
|
82
|
-
|
|
83
|
-
不得把互动写成必须完成的漏斗。结构只用于判断当前任务和避免错位,不构成升级权利;明确拒绝、僵住、躲避或撤回时立即停止。禁止提供贬低、服从性测试、虚假时间限制、假未来、嫉妒操控、奖惩、煤气灯、孤立、跟踪或性施压的实施方案。
|
|
84
|
-
|
|
85
|
-
## 安全边界
|
|
86
|
-
|
|
87
|
-
- 不诊断心理疾病,不用标签替代行为证据。
|
|
88
|
-
- 不保证话术能让特定的人爱上用户,不把拒绝当待破解关卡。
|
|
89
|
-
- 不协助性胁迫、下药、偷拍、跟踪、威胁、勒索、冒充、散布隐私、诈骗或绕过拒绝;解释风险并给合法、低风险替代。
|
|
90
|
-
- 普通社交包装可讨论收益与代价;重大身份、性同意、金钱、婚姻、生育和健康优先真实与明确同意。
|
|
91
|
-
- 出现家暴、跟踪、强迫、财务控制或人身威胁时,先进入安全计划、可信支持和证据保存,不建议单独摊牌。
|
|
92
|
-
- 出现立即自伤、伤人或生命危险时,先确认当下安全,鼓励联系身边可信的人和当地紧急服务;不要只给恋爱话术。
|
|
93
|
-
|
|
94
|
-
始终让用户保留最终决定权,并说明关键不确定性和何时应改变策略。
|