dsh-loadout 0.11.1 → 0.12.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/CHANGELOG.md CHANGED
@@ -2,6 +2,30 @@
2
2
 
3
3
  「装备栏」是一个 DeepSeek Harness 插件:给每个对话选一套工具(套装),只把用得上的工具投给模型。
4
4
 
5
+ ## 未发布
6
+
7
+ - 修 `kit_list`:返回值里带 `note`,但输出 schema 没有声明它,宿主按 schema 校验,于是这个工具**每次调用都直接失败**(`kit_list returned invalid output: "note" is not a declared property`)。现在 `note` 是合法字段,渲染时也会在套装名后显示备注;`selftest` 新增断言 `kit_list declares every field it returns`,防止返回值与 schema 再次漂移。
8
+ - README 顶部加「同名项目说明」:npm 上的 `dsh-loadout` 是本插件唯一的发行包,GitHub 上另有两个同名的独立项目(`YongjianWan/dsh-loadout`、`JYDW-1/dsh-loadout`)。排查段加「怀疑装到了同名插件」:确认 `repository.url`、以及两个同名包不能共存时的重装步骤。中英文同步。
9
+
10
+ ## 0.12.0
11
+
12
+ 这一版换掉了「选择只活在内存里」这件事——它是之前一连串“默认套装不生效”“切换后重启又变回去”的根因。
13
+
14
+ - **每个对话有自己的绑定**。`loadout.json` 新增 `assignments: { <sessionId>: 套装名 | "@dsh" | null }`,`null` 表示「全部」。对话第一次被看到时写入一次(默认套装 / 父对话分支继承 / 迁移前的旧对话记 `null`),之后只有显式切换才会改它。
15
+ - **改默认只影响新对话**。`kit_set_default` 只写 `defaultKit`,不再动已有对话;设置页也加了同一句话。
16
+ - **迁移**:首次启动把旧 store 升级到 `schema: 2`,先备份成 `loadout.json.v1.bak-<时间戳>`,并给已存在的对话写 `null`(保持它们当时的实际状态),不改变任何人今天看到的工具。
17
+ - **新工具**:`kit_assign(sessionId, kit)`(把某个对话钉到一套工具,`全部` / `内置` / 套装名都收)、`kit_rename(name, title)`(只改显示名,`name` 是绑定的键,保持稳定);`kit_delete` 支持 `dryRun`,返回受影响的对话数;`kit_list` 增加 `binding` 与每套的 `boundCount`。
18
+ - **删除前说清楚**:设置页点删除会先问宿主有多少对话在用这套,确认文案里带上数量;删除后这些对话回到「全部」。
19
+ - **预置套装回来了**,并按用途重写成五套只读预设:`chat` 仅聊天、`coding` 编程用、`research` 查找资料、`plan` 项目梳理、`writing` 写作(每套都带 `send_message` 等协作五件套)。
20
+ - **命名校验**:保留名(全部 / 仅内置 / 默认 / all / builtin / 以及所有预设名)不能用作套装名;长度 1–32,禁止控制字符与 `/ \ : * ? " < > |`。
21
+ - **标题栏更安静**:`全部` 时芯片只显示「装备栏」,`仅内置` / 套装显示各自名字并带蓝点。
22
+ - 测试:`selftest` 新增 12 项 v2 断言(迁移、默认只影响新对话、分支继承、子代理不记录、`kit_assign`、`kit_delete --dryRun`、`kit_rename` 保持 id、保留名拒绝),并让假宿主真正按层拒绝未知工具名。
23
+
24
+ ## 0.11.2
25
+
26
+ - README 的「预置套装」一节改写为**历史记录**的口径:明确它从 0.10.2 起就不在界面里,用户看到的是「全部 / 仅内置 / 我的套装」,而三套数据仍在 `cordis.patch.yml` 里、`/kit 写作|调研|编程` 仍可用;标题也改成「界面不展示,命令仍可用」。中英文同步。
27
+ - 无代码改动:宿主、客户端、`cordis.patch.yml` 与 0.11.1 完全一致。
28
+
5
29
  ## 0.11.1
6
30
 
7
31
  - README 与界面同步:功能表不再把**预置套装**当卖点(0.10.2 起界面已隐藏它),改成介绍**我的套装**——新建、设为默认、复制切换命令、编辑(覆盖保存 / 另存为新套装)、备注、删除;并补上 token 账本一行。
package/README.en.md CHANGED
@@ -4,6 +4,8 @@
4
4
 
5
5
  > **Loadout** is the plugin. A **kit** is one prepared set of tools. Pick one kit per conversation and carry only the tools that conversation needs.
6
6
 
7
+ > **About the name**: `dsh-loadout` on npm is this plugin's only distribution package. Two unrelated GitHub projects share the name — `YongjianWan/dsh-loadout` and `JYDW-1/dsh-loadout` — with different authors and different behaviour. `dsh plugin add dsh-loadout` always installs this plugin; when installing from GitHub, use `JungleYXu/dsh-loadout`.
8
+
7
9
  [中文说明](README.md) · [Changelog](CHANGELOG.md) · MIT
8
10
 
9
11
  DeepSeek Harness exposes every tool to every conversation: the more plugins you install, the longer the tool list each turn has to carry, and the easier it is for the model to reach for the wrong tool. Loadout groups tools into **kits** and keeps only the current kit's tools visible in that conversation.
@@ -63,27 +65,26 @@ node scripts/client-smoke.mjs # browser bundle: menu and settings panel render
63
65
 
64
66
  Settings has no conversation of its own, so it only decides *where new conversations start* — use the header button to change the current one. In the default list, `All` / `Built-in only` and kits are the same kind of card: each can copy its switch command or be set as default. **My kits** starts collapsed and shows only the current default; open it to see the rest. A saved kit can be **edited** on its card: the form opens under that card, and you either overwrite it (conversations already using it switch immediately) or save as a new kit.
65
67
 
66
- ### What the shipped presets contain
67
-
68
- > Since 0.10.2 the UI does **not** show the presets (neither the header menu nor Settings). The three entries still live in `cordis.patch.yml` and `/kit writing` keeps working; they are kept for our own testing until they are clear enough to ship to users. The table documents them for review.
69
-
70
- All three are read-only; an edit becomes a copy of your own. They list **built-in tools only** — plugin tools come in through add-ons or by saving your own kit.
68
+ ### Shipped presets (five, read-only)
69
+ Five read-only presets. Editing one forks it into one of your kits.
71
70
 
72
- | Preset | Built-in tools |
73
- | --- | --- |
74
- | Writing | `read` `write` `edit` `glob` `grep` + collaboration five |
75
- | Research | `web_search` `web_fetch` `read` `glob` `grep` + collaboration five |
76
- | Coding | `pwsh` `read` `write` `edit` `glob` `grep` `todo_write` + collaboration five |
71
+ | Preset | Command id | Built-in tools |
72
+ | --- | --- | --- |
73
+ | Chat only | `chat` | `ask_user_question` `weather` `web_search` `web_fetch` `read` + collaboration five |
74
+ | Coding | `coding` | `pwsh` `read` `write` `edit` `glob` `grep` `todo_write` + collaboration five |
75
+ | Research | `research` | `web_search` `web_fetch` `advanced_search` `research` `platform_search` `read` `write` `glob` `grep` + collaboration five |
76
+ | Planning | `plan` | `ask_user_question` `web_search` `web_fetch` `read` `write` `edit` `glob` `grep` `todo_write` + collaboration five |
77
+ | Writing | `writing` | `read` `write` `edit` `glob` `grep` + collaboration five |
77
78
 
78
79
  "Collaboration five" = `send_message` `list_agents` `interrupt_agent` `subagent` `subagent_fork`. Every preset carries them, otherwise a subagent switched to that preset cannot even report back.
79
80
 
80
81
  ### Tools for the model
81
82
 
82
- `kit_list` (kits and the current selection), `kit_apply` (switch), `kit_create` / `kit_set_tools` / `kit_set_default` / `kit_delete` (manage). These are kept in every kit, so a kit can never lock the model out of switching back.
83
+ `kit_list` (kits, current binding, how many conversations each kit holds), `kit_apply` (switch this conversation), `kit_assign` (pin a specific conversation), `kit_rename` (display name only), `kit_create` / `kit_set_tools` / `kit_set_default` / `kit_delete` (manage; `kit_delete` accepts `dryRun`). These are kept in every kit, so a kit can never lock the model out of switching back.
83
84
 
84
85
  ## Upgrading
85
86
 
86
- - 0.5.x → 0.11.x: same package name (`dsh-loadout`); run `plugin_manager install_bundle` over it. Kits live in `~/.dsh/loadout.json` and are untouched.
87
+ - 0.11.x → 0.12.x: same package name; install over it. The store migrates to `schema: 2` once, with a `loadout.json.v1.bak-<ts>` backup, and every existing conversation is pinned to 全部 so a default change cannot reach back into it.
87
88
  - 0.4.x → 0.11.x: the package was renamed from `dsh-plugin-kits`; remove the old one first:
88
89
 
89
90
  ```text
@@ -126,6 +127,12 @@ The client bundle failed to register its factory, and the boot audit treats any
126
127
  2. Confirm the install is a **link**, not a copy: `preflight` prints `as a link (no copy to drift)`. If it is a copy, delete `node_modules/dsh-loadout` and `install_bundle` again.
127
128
  3. Otherwise `remove_bundle`, reinstall, restart. Do not hand-edit `package.json` / `cordis.patch.yml` inside the profile.
128
129
 
130
+ **Suspect you installed the other plugin with the same name**
131
+
132
+ - Check the profile's `package.json`: is `dsh-loadout` a `link:` / `file:`, or a registry version?
133
+ - Open `node_modules/dsh-loadout/package.json`; `repository.url` should be `github.com/JungleYXu/dsh-loadout`. If it is not, you installed a different project that shares the name.
134
+ - Two same-named packages cannot coexist — both claim the `dsh-loadout` key, and the later install replaces the earlier one. Run `plugin_manager action=remove_bundle target=dsh-loadout`, then reinstall using one of the three sources at the top of this README.
135
+
129
136
  **Installed, but no button / tools unchanged**
130
137
 
131
138
  - Host code loads on app restart; the browser bundle needs at least a page refresh.
package/README.md CHANGED
@@ -6,6 +6,8 @@
6
6
 
7
7
  > 「装备栏」是这个插件本身;「套装」是栏里那几套配好的工具。一个对话选一套装备,只带用得上的工具。
8
8
 
9
+ > **同名项目说明**:npm 上的 `dsh-loadout` 是本插件唯一的发行包。GitHub 上另有两个同名的独立项目(`YongjianWan/dsh-loadout`、`JYDW-1/dsh-loadout`),作者、功能都与本插件不同。用 `dsh plugin add dsh-loadout` 装到的一定是本插件;从 GitHub 安装时请认准 `JungleYXu/dsh-loadout`。
10
+
9
11
  DeepSeek Harness 的工具是全局可见的:插件装得越多,每个对话要背的工具清单越长,模型也越容易挑错工具。装备栏把工具编成**套装**,每个对话只留当前套装里的工具。
10
12
 
11
13
  ## 它做什么
@@ -14,11 +16,12 @@ DeepSeek Harness 的工具是全局可见的:插件装得越多,每个对话
14
16
  | --- | --- |
15
17
  | 三档底座 | `全部`(不裁剪,默认)/ `仅内置`(只留 DSH 自带工具)/ `我的套装` |
16
18
  | 我的套装 | 「新建套装」里勾选内置工具与插件,存成一套带名字的装备。卡片上可以**设为默认**、**复制切换命令**、**编辑**(改完覆盖保存,或另存成新的一套)、**备注**、**删除** |
19
+ | 预置套装 | 只读五套:仅聊天 / 编程用 / 查找资料 / 项目梳理 / 写作;套用即可,改动会另存为你的套装 |
17
20
  | 加挂 | 在底座之上临时加挂插件,不必为一次性组合新建套装 |
18
21
  | 备注 | 每个套装可加 20 字备注,菜单里显示成 `测试1(用于视频制作)` |
19
22
  | token 账本 | 菜单状态行 `省 ~1.9k tokens`,设置页给出「保留 N 个工具 · 约 X tokens · 省多少」的完整账目 |
20
23
  | 刷新 | 菜单右上 `⟳` 重拉工具目录并重套用当前选择 |
21
- | 每对话独立 | 切换只影响当前对话,下一条消息即按新清单组装;新对话用「设置 → 装备栏」的默认套装 |
24
+ | 每对话独立 | 每个对话把自己的选择**存下来**(`loadout.json` 的 `assignments`),重启后照旧;改默认只影响之后新建的对话 |
22
25
 
23
26
  ## 安装
24
27
 
@@ -63,23 +66,38 @@ node scripts/client-smoke.mjs # 浏览器 bundle:菜单与设置页渲染
63
66
 
64
67
  设置页没有自己的对话,所以它只管「新对话从哪套开始」,不切换当前对话——当前对话请在标题栏里切。默认列表里「全部 / 仅内置」和套装是同一种卡片:都能「复制切换命令」或「设为默认」;「我的套装」默认折叠,只显示当前默认的那一个,点开才列出全部。已经保存的套装可以在卡片上「编辑」:改动就在那张卡片下面展开,「覆盖保存」(正在用它的对话立刻按新工具集走)或「另存为新套装」。
65
68
 
66
- ### 预置套装里有什么
67
-
68
- > 0.10.2 起,**界面暂时不展示预置套装**(标题栏菜单和设置页都不出现)。三套数据仍在 `cordis.patch.yml` 里、`/kit 写作` 这类命令也照常可用,保留给自己测试;等它们对用户足够直观再放出来。下面表格记录它们的内容,方便核对。
69
+ ### 预置套装(五套,只读)
69
70
 
70
- 三套都是只读的,改动会另存为你的套装。它们只列**内置工具**,插件工具要靠「加挂」或另存时勾选。
71
+ 五套都是只读的,改动会另存为你的套装。它们只列**内置工具**,插件工具要靠「加挂」或另存时勾选。
71
72
 
72
- | 套装 | 内置工具 |
73
- | --- | --- |
74
- | 写作 | `read` `write` `edit` `glob` `grep` + 协作五件套 |
75
- | 调研 | `web_search` `web_fetch` `read` `glob` `grep` + 协作五件套 |
76
- | 编程 | `pwsh` `read` `write` `edit` `glob` `grep` `todo_write` + 协作五件套 |
73
+ | 套装 | 子命令 id | 内置工具 |
74
+ | --- | --- | --- |
75
+ | 仅聊天 | `chat` | `ask_user_question` `weather` `web_search` `web_fetch` `read` + 协作五件套 |
76
+ | 编程用 | `coding` | `pwsh` `read` `write` `edit` `glob` `grep` `todo_write` + 协作五件套 |
77
+ | 查找资料 | `research` | `web_search` `web_fetch` `advanced_search` `research` `platform_search` `read` `write` `glob` `grep` + 协作五件套 |
78
+ | 项目梳理 | `plan` | `ask_user_question` `web_search` `web_fetch` `read` `write` `edit` `glob` `grep` `todo_write` + 协作五件套 |
79
+ | 写作 | `writing` | `read` `write` `edit` `glob` `grep` + 协作五件套 |
77
80
 
78
81
  「协作五件套」= `send_message` `list_agents` `interrupt_agent` `subagent` `subagent_fork`。每套都带着它们,否则子代理切到这套之后连回话都发不出来。
79
82
 
80
83
  ### 给模型用的工具
81
84
 
82
- `kit_list`(列出套装与当前选择)、`kit_apply`(切到某套)、`kit_create` / `kit_set_tools` / `kit_set_default` / `kit_delete`(增删改)。这些工具在任何套装里都保留,不会把自己锁死。
85
+ `kit_list`(列出套装、当前绑定与该套被多少对话使用)、`kit_apply`(把当前对话切到某套)、`kit_assign`(把指定对话钉到某套)、`kit_rename`(只改显示名)、`kit_create` / `kit_set_tools` / `kit_set_default` / `kit_delete`(增删改,`kit_delete` 支持 `dryRun`)。这些工具在任何套装里都保留,不会把自己锁死。
86
+
87
+ ## 对话的绑定
88
+
89
+ 每个对话有一条持久绑定,写在 `~/.dsh/loadout.json` 的 `assignments` 里:
90
+
91
+ ```json
92
+ { "assignments": { "session-abc": "coding", "session-def": null } }
93
+ ```
94
+
95
+ `null` 就是「全部」。规则:
96
+
97
+ - 对话第一次出现时写入一次:有新默认就记默认,从别的对话分叉出来就继承父对话,升级前就存在的旧对话记 `null`(保持当时的实际状态)。
98
+ - 以后只有显式切换(标题栏、`/kit`、`kit_apply`、`kit_assign`)才改它。
99
+ - 改「新对话默认套装」只影响之后新建的对话,已有对话各自保留。
100
+ - 子代理不记录绑定:它的父对话已经决定了它能看见什么。
83
101
 
84
102
  ## 升级
85
103
 
@@ -107,7 +125,9 @@ node scripts/client-smoke.mjs # 浏览器 bundle:菜单与设置页渲染
107
125
 
108
126
  ## 文件
109
127
 
110
- - 套装数据:`~/.dsh/loadout.json`(旧版 `~/.dsh/plugin-kits.json` 只读一次,随后迁移)。
128
+ - 套装与绑定:`~/.dsh/loadout.json`(`schema: 2`;`kits` 是你的套装,`assignments` 是每个对话的绑定,`defaultKit` 是新对话默认值)。
129
+ - 从 0.11.x 升到 0.12.0 时自动迁移一次,旧文件备份为 `loadout.json.v1.bak-<时间戳>`。
130
+ - 旧版 `~/.dsh/plugin-kits.json` 只读一次,随后迁移。
111
131
  - 卸载:`plugin_manager action=remove_bundle target=dsh-loadout`。
112
132
 
113
133
  ## 已知边界
@@ -127,6 +147,12 @@ node scripts/client-smoke.mjs # 浏览器 bundle:菜单与设置页渲染
127
147
  2. 确认安装的是**链接**不是拷贝:`preflight` 会打印 `as a link (no copy to drift)`;如果是拷贝,删掉 `node_modules/dsh-loadout` 重新 `install_bundle`。
128
148
  3. 仍不行就 `remove_bundle` 后重装并重启,别在 profile 里手工改 `package.json` / `cordis.patch.yml`。
129
149
 
150
+ **怀疑装到了同名插件**
151
+
152
+ - 看 profile 的 `package.json`:`dsh-loadout` 的值是 `link:` / `file:`,还是 registry 版本。
153
+ - 打开 `node_modules/dsh-loadout/package.json`,`repository.url` 应当是 `github.com/JungleYXu/dsh-loadout`。不是,就说明装的是另一个同名项目。
154
+ - 两个同名包不能共存——都占 `dsh-loadout` 这一个 key,后装的会覆盖先装的。先 `plugin_manager action=remove_bundle target=dsh-loadout`,再按本文顶部的三种方式重装。
155
+
130
156
  **装了但界面没有按钮 / 工具没生效**
131
157
 
132
158
  - 宿主代码要重启应用才加载;浏览器 bundle 至少刷新一次。
package/client.js CHANGED
@@ -47,15 +47,12 @@ window.__ModuleLoader__.load({
47
47
  }
48
48
 
49
49
  /**
50
- * Presets (写作 / 调研 / 编程) are held back from this release.
51
- *
52
- * They still ship in `cordis.patch.yml` and `/kit 写作` still works, so they
53
- * stay usable for our own testing — they are simply not rendered in the chip
54
- * or the settings page, because a shipped preset that quietly hides tools is
55
- * easy to mistake for a bug ("where did web_search go?"). Flip this to true
56
- * to bring both lists back.
50
+ * Presets (仅聊天 / 编程用 / 查找资料 / 项目梳理 / 写作) are shown again from
51
+ * 0.12: they are the fastest way to start a conversation of a known kind,
52
+ * and each one now lists what it leaves out instead of silently dropping
53
+ * tools. They stay read-only — editing one forks it into 我的套装.
57
54
  */
58
- const SHOW_PRESETS = false
55
+ const SHOW_PRESETS = true
59
56
 
60
57
  /**
61
58
  * Token counts are estimates (tool-definition bytes ÷ ~3.5 chars per token).
@@ -853,7 +850,9 @@ window.__ModuleLoader__.load({
853
850
  title: '装备栏:当前对话用哪一组工具',
854
851
  },
855
852
  isAll ? null : h('span', { style: styles.dot }),
856
- h('span', null, label === '' ? '装备栏' : label),
853
+ // 全部 is the default and needs no badge: the chip only speaks up when the
854
+ // conversation is restricted, so an unrestricted one reads as 「装备栏」.
855
+ h('span', null, isAll ? '装备栏' : (label === '' ? '装备栏' : label)),
857
856
  h('span', { style: { opacity: 0.5 } }, '▾')),
858
857
  open ? h('div', {
859
858
  style: anchor === null ? styles.panel : {
@@ -1148,6 +1147,8 @@ window.__ModuleLoader__.load({
1148
1147
  h('div', { style: { ...styles.meta, marginTop: 4 } },
1149
1148
  '设置页不绑定具体会话,上面的数字来自最近活跃的那个对话;当前对话请在标题栏「装备栏」里切换。'),
1150
1149
  h('div', { style: styles.sectionTitle, marginTop: 14 }, '新对话默认套装'),
1150
+ h('div', { style: { ...styles.meta, marginBottom: 6 } },
1151
+ '只影响之后新建的对话;已经开着的对话各自保留自己的选择,这里改不到它们。'),
1151
1152
  // 全部 and 仅内置 are choices, not kits, but they read like the kit cards
1152
1153
  // below (copy the switch command / make it the default) so the page has
1153
1154
  // one idiom instead of two.
@@ -1227,7 +1228,20 @@ window.__ModuleLoader__.load({
1227
1228
  onUse: () => copyCommand(kit.name),
1228
1229
  onDefault: () => act({ action: 'default', name: kit.name }),
1229
1230
  onDelete: async () => {
1230
- if (!window.confirm(`删除套装「${kit.name}」?已经用它开的对话保持现状。`)) return
1231
+ // Ask the host how many conversations are pinned to this kit
1232
+ // before asking the user: "3 个对话正在用它" is a decision, and
1233
+ // the count is the only thing that makes the click weighable.
1234
+ let bound = Number(kit.boundCount ?? 0)
1235
+ try {
1236
+ const probe = await request({ action: 'delete', name: kit.name, dryRun: true, sessionId })
1237
+ if (typeof probe?.affectedSessions === 'number') bound = probe.affectedSessions
1238
+ } catch {
1239
+ // The count is a courtesy; a failed probe must not block the delete.
1240
+ }
1241
+ const question = bound > 0
1242
+ ? `删除套装「${kit.name}」?有 ${bound} 个对话正在用它,删除后它们会回到「全部」。`
1243
+ : `删除套装「${kit.name}」?没有对话在用它。`
1244
+ if (!window.confirm(question)) return
1231
1245
  await act({ action: 'delete', name: kit.name })
1232
1246
  },
1233
1247
  onNote: (note) => act({ action: 'update', name: kit.name, note }),
package/cordis.patch.yml CHANGED
@@ -1,11 +1,13 @@
1
1
  # The configuration layer this bundle contributes when a profile lists it.
2
2
  #
3
- # `kits:` here are the shipped *presets* (写作 / 调研 / 编程). They are read-only:
4
- # the settings page lists them under 预设套装, and editing one forks it into a
5
- # user kit under `~/.dsh/loadout.json` instead of mutating the preset.
3
+ # `kits:` here are the shipped *presets* (仅聊天 / 编程用 / 查找资料 / 项目梳理 /
4
+ # 写作). They are read-only: the settings page lists them under 预设套装, and
5
+ # editing one forks it into a user kit under `~/.dsh/loadout.json` instead of
6
+ # mutating the preset.
6
7
  #
7
8
  # User kits are never written back here. They live in `~/.dsh/loadout.json`:
8
- # { "kits": [ { name, title, builtins, plugins } ], "defaultKit": "" }
9
+ # { "schema": 2, "kits": [ { name, title, note, builtins, plugins } ],
10
+ # "defaultKit": "", "assignments": { "<sessionId>": "kit" | "@dsh" | null } }
9
11
  #
10
12
  # `defaultKit: ''` ships neutral: a new conversation starts on 全部 (no tool is
11
13
  # masked) until the user picks a default in 设置 → 装备栏. It may name a preset
@@ -14,8 +16,12 @@
14
16
  # Every preset carries the same five collaboration tools. Without them a
15
17
  # subagent running a preset cannot report back at all: `send_message` is how a
16
18
  # child answers its parent, and the rest are how it asks for one. They are
17
- # orthogonal to the preset's own subject (writing / research / coding), so each
18
- # list repeats them instead of relying on a YAML anchor the loader may not keep.
19
+ # orthogonal to the preset's own subject, so each list repeats them instead of
20
+ # relying on a YAML anchor the loader may not keep.
21
+ #
22
+ # `name` is a stable id (it is what a conversation's binding stores, so renaming
23
+ # it would orphan every conversation); `title` is what the menu shows and may be
24
+ # changed freely. `description` is the one-line summary under the title.
19
25
  #
20
26
  # Override this row from the profile's own cordis.patch.yml to change the
21
27
  # shipped presets; the row id is `loadout`.
@@ -25,26 +31,50 @@
25
31
  config:
26
32
  defaultKit: ''
27
33
  kits:
28
- # 写作 / 调研 / 编程: 内置工具的名字。插件用 `plugins: [id]` 加。
29
- - name: writing
30
- title: 写作
34
+ # 仅聊天:只对话,不碰文件、不跑命令。适合纯问答和让 agent 想清楚再动手。
35
+ - name: chat
36
+ title: 仅聊天
37
+ description: 不读写文件、不执行命令,只做对话与查询。
31
38
  builtins:
39
+ - ask_user_question
40
+ - weather
41
+ - web_search
42
+ - web_fetch
43
+ - read
44
+ - send_message
45
+ - list_agents
46
+ - interrupt_agent
47
+ - subagent
48
+ - subagent_fork
49
+ # 编程用:改代码、跑测试、记 TODO。没有网络检索,避免边改边搜分心。
50
+ - name: coding
51
+ title: 编程用
52
+ description: 改代码、跑命令、跑测试;不含搜索类工具。
53
+ builtins:
54
+ - pwsh
32
55
  - read
33
56
  - write
34
57
  - edit
35
58
  - glob
36
59
  - grep
60
+ - todo_write
37
61
  - send_message
38
62
  - list_agents
39
63
  - interrupt_agent
40
64
  - subagent
41
65
  - subagent_fork
66
+ # 查找资料:多种检索入口 + 落盘笔记,适合调研与写报告。
42
67
  - name: research
43
- title: 调研
68
+ title: 查找资料
69
+ description: 多路检索(网页 / 平台 / 深度研究)并落盘成笔记。
44
70
  builtins:
45
71
  - web_search
46
72
  - web_fetch
73
+ - advanced_search
74
+ - research
75
+ - platform_search
47
76
  - read
77
+ - write
48
78
  - glob
49
79
  - grep
50
80
  - send_message
@@ -52,10 +82,14 @@
52
82
  - interrupt_agent
53
83
  - subagent
54
84
  - subagent_fork
55
- - name: coding
56
- title: 编程
85
+ # 项目梳理:读得多、写得少,先问清楚再整理成文档。
86
+ - name: plan
87
+ title: 项目梳理
88
+ description: 读代码与文档、问清目标,整理成方案或清单。
57
89
  builtins:
58
- - pwsh
90
+ - ask_user_question
91
+ - web_search
92
+ - web_fetch
59
93
  - read
60
94
  - write
61
95
  - edit
@@ -67,3 +101,18 @@
67
101
  - interrupt_agent
68
102
  - subagent
69
103
  - subagent_fork
104
+ # 写作:只动文字类文件,适合长文、润色、翻译。
105
+ - name: writing
106
+ title: 写作
107
+ description: 读写与检索文本,适合长文、润色与翻译。
108
+ builtins:
109
+ - read
110
+ - write
111
+ - edit
112
+ - glob
113
+ - grep
114
+ - send_message
115
+ - list_agents
116
+ - interrupt_agent
117
+ - subagent
118
+ - subagent_fork
package/icon.svg CHANGED
@@ -1,4 +1,4 @@
1
- <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" role="img" aria-label="Tool Kits">
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" role="img" aria-label="Loadout">
2
2
  <rect x="7" y="9" width="50" height="13" rx="4" fill="none" stroke="currentColor" stroke-width="3.5"/>
3
3
  <rect x="7" y="26" width="50" height="13" rx="4" fill="none" stroke="currentColor" stroke-width="3.5" opacity="0.7"/>
4
4
  <rect x="7" y="43" width="32" height="12" rx="4" fill="currentColor" opacity="0.92"/>